Benoetige Hilfe mit Code fuer Marc Mentat

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
DerHauke
User
Beiträge: 4
Registriert: Freitag 4. April 2008, 10:01

Hi,

ich habe eine Platte in Marc entworfen und appliziere einen Top Load.
Nun moechte ich die Werte fuer Displacement Y haben fuer die Nodes auf dem oberen surface und in einer Liste ausgeben.
Ich habe erst vor kurzem mit Python und Marc begonnen also bitte nicht zereissen, wenn vllt gravierende Fehler im Code bestehen ;)
Es erfolgt keine Ausgabe (bis auf mein Test-"Hallo").


Mein Code sieht folgendermassen aus.

f

Code: Alles auswählen

rom py_mentat import *


def check_tol(f1, f2, tol):
    if f1 == f2:
      return 1
    if f1 + tol < f2:
      if f1 - tol > f2:
        return 1
    return 0

def main():
	
	py_send("*post_close")
	py_send("*post_open plate_model_job1.t16")
	py_send("*post_next")
	py_send("*post_value Displacement Y")
	py_send("*post_numerics")
	
	print "Hallo"
	
	n = py_get_int("nnodes()")			#get all nodes
	print n
	nodes_list = []
	for i in range(1,n+1):				#for-loop to get the nodes at the top surface
		str = "node_y(%d)" % i
        	f = py_get_float(str)
        	if check_tol(f, 10, .001):
        		nodes_list.append[i]
	values = []	
	
	print nodes_list				#list for the displacements in y-direction
	
	for i in range(0,len(nodes_list)):
		str = "node_id(%i)" % nodes_list[i]
		n_id = py_get_int(str)
		dis_y = "displace_y(%f)" % n_id		#get displacement
		f= py_get_float(dis_y)
		values[i] = f				#create list with all the values 
	
	print values	

	
	
	for i in range(0,len(values)):
		str = "%i %f" % (nodes_list[i], values[i])
		print str
	
	return		
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Oha ... das ist ja nen sehr spezielles Problem! (Wußte bis eben per google nicht, was das für nen Tool ist :-D )

Mal generell: Läuft da nen Server vpn diesem MARC-Dings? Das "send" vermittelt das irgend wie ... wenn ja, muss man zu dem sicherlich erst ein connect aufbauen würd ich mal tippen!

Wird denn ein Fehler ausgegeben? Wenn nein, muss dein Programm irgend wo hängen, denn zumindest die leeren Listen sollten ausgegeben werden!

Code: Alles auswählen

>>> a=[]
>>> print a
[]
>>>
Wenn da wirklich nichts erscheint, muss das Tool ja irgend wo hängen oder eben mit einem Fehler beendet werden.

Mal was grundsätzliches: Hat denn schon mal das kleinste anzunehmende Programm funktioniert, mit welchem man mit dem MARC-Dings zusammen arbeiten kann? Wenn nein, fange mal damit an und stelle Dein Problem zurück! Erst mal in kleinen Häppchen antesten, wie die Kommunikation damit so funzt!
BlackJack

Wenn nach dem "Hallo" nicht einmal das ``print`` in Zeile 23 etwas ausgibt, dann muss es wohl ein Problem mit dem Marc/Mentat sein. Also mit dem Aufruf in der Zeile davor.

Da ich das Programm nicht kenne, nur ein paar allgemeine Anmerkungen zum Quelltext.

Zeile 27 sieht falsch eingerückt aus. Das Programm sollte so gar nicht kompilieren.

Die Funktion `check_tol()` lässt sich mit `abs()` wesentlich kompakter schreiben:

Code: Alles auswählen

def check_tolerance(value_a, value_b, tolerance):
    return abs(value_a - value_b) < tolerance
Wenn nicht wirklich eine Liste mit Zahlen benötigt wird, ist `xrange()` speicherschonender als `range()`.

`str` ist der Name einer eingebauten Funktion und den sollte man nicht an andere Objekte binden. Das stiftet nur Verwirrung und führt zu Problemen, wenn man dann doch mal die Funktion benötigt.

Du gehst IMHO auch ein bisschen in zu kleinen Schritten vor. Es ist zwar unübersichtlich alles in "Monsterausdrücke" zu quetschen, aber jeden kleinen Zwischenschritt an einen Namen zu binden ist auch nicht so gut. Ersatz für die erste ``for``-Schleife (ungetestet):

Code: Alles auswählen

    all_nodes = (py_get_float('node_y(%d)' % (i + 1)) for i in xrange(n))
    nodes = [f for f in all_nodes if check_tolerance(f, 10, 0.001)]

In der zweiten und dritten ``for``-Schleife finden sich dann Formulierungen die nicht "pythonisch" sind. Wenn man über die Elemente von Objekten wie Listen iterieren möchte, dann macht man das in aller Regel ohne einen Index. Man kann in Python direkt über die Listen iterieren.

Die zweite Schleife enthält einen Fehler, weil am Ende versucht wird `values` etwas zuzuweisen, wobei `values` aber eine leere Liste ist, also gar keine Elemente enthält, die man per Index ansprechen könnte. Ausserdem kommt es mir etwas komisch vor, dass die Elemente von `nodes_list` in der ersten Schleife als Fliesskommazahlen behandelt werden und hier jetzt plötzlich als numerische IDs verwendet werden!? Auch dieser Block liesse sich mit weniger temporären Namen schreiben.

Code: Alles auswählen

    values = [py_get_float('displace_y(%f)' % (py_get_int('node_id(%i)' % i)))
              for i in nodes]
Bei der letzten Schleife kann man mit `zip()` arbeiten um den Index `i` los zu werden, oder überlegen die Daten gleich als Tupel in *einer* Liste zu verwalten, oder eventuell auch ein Dictionary zu verwenden.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

*einerwerf*

Und du hast eine Varible ``str`` genannt, was arg ungünstig ist, weil ``str`` schon vorbelegt ist.
Rechenknecht
User
Beiträge: 2
Registriert: Sonntag 13. April 2008, 20:25

@all
Die unglückliche Bezeichnung "str" kommt aus den Beispielen aus dem Hanbuch von Mentat. MARC Mentat ist ein Finite Elemente Program von MSC-Software

@DerHauke
Du kannst diese Problem auch direkt in Mentat ohne Programierung lösen. In Mentat alle Knoten wählen und dann mittels History Plot die Werte ansammeln. Anschließend die gewünschten Kurven definieren (Increment,displacemnt y) und mittels save als Tabelle rausschreiben. Wenn Du unter Windows arbeitest, kannst Du die Tabelle auch direkt in den Zwischenspeicher kopieren und dann in einen Editor deiner Wahl einfügen.

Gruß vom Rechenknecht
Antworten