Výpočtové systémy - MSC.Marc - Python

Skriptování v MSC.Marc pomocí programovacího jazyka Python

Obsahem této stránky je úvod do tvorby modelů pomocí programovacího jazyka Python. Pro pochopení obsahu stránky je vhodná znalost vytváření modelů pomocí proc souborů (více zde) a základní znalosti programování v jazyce Python. Python je dynamický objektově orientovaný skriptovací jazyk, který je vyvíjený jako open source projekt (více na www.python.org).

Při instalaci programu MSC.Marc se nainstaluje plnohodnotná verze programu Python 2.5, který lze spustit v interaktivním režimu pomocí souboru run_python.bat. Pro práci s programem MSC.Marc využívá Python moduly py_post a py_mentat, které je nutné importovat. Nejdůležitější příkazy těchto modulů budou uvedeny dále v textu. Lze je také najít v dokumentu Python_manual.pdf přístupného z nabídky nápovědy programu MSC.Marc. Přehled některých důležitých adresářů z hlediska programu Python je uveden v tabulce 1.
Tabulka 1: Některé důležité adresáře pro interakci s programem Python.
Relativní cesta k adresáři Popis
..\MSC.Software\Marc\2010\mentat2010\python Adresář instalace programu Python
..\MSC.Software\Marc\2010\mentat2010\bin\run_python.bat Spuštění interaktivního režimu programu Python
..\MSC.Software\Marc\2010\mentat2010\shlib\win32\ Adresář s moduly py_post a py_mentat
..\MSC.Software\Marc\2010\mentat2010\examples\python\tutorial\ Adresář s dokumentem Python_manual.pdf a s názornými příklady

Práce s modulem py_mentat

Při práci s modulem py_mentat je nutné spuštění aplikace Marc Mentat a nastavení parametrů komunikace programů MSC.Marc a Python pomocí základního menu (animace 1). Nejdůležitějším parametrem je číslo portu na kterém budou programy komunikovat.

Uvodni obrazek je kdo ví proč fuč, ale animace by tu měla být, stačí kliknout!

Animace 1: Menu pro inerakci s programem Python.


V programu Python se komunikace s Marc Mentat inicializuje pomocí funkce py_connect. Vlastní tvorba modelu pomocí programu Python je obdobná postupům při vytváření proc souborů. Jednotlivé příkazy Marc Mentat (řádky proc souboru) se posílají pomocí funkce py_send. Oproti klasickým proc souborům však lze požít funkce py_get_int (py_get_string, ...) k získání hodnot z databáze modelu a na jejich základě pak rozhodnout o další tvorbě modelu. Další možností je použití funkce py_ms_int (py_get_data, py_ms_string, ...) k získání hodnot zadaných v jednotlivých menu Marc Mentat. Přehled funkcí modulu py_mentat je v tabulce 2.
Tabulka 2: Příkazy modulu py_mentat.
Název funkce Popis funkce Příklad
py_connect(String hostname, Integer nPort) hostname - IP adresa nebo DNS název hostitelského počítače ("" = lokální počítač); nPort - hostitelská port. Naváže spojení s Marc Mentat na hostitelském počítači. py_connect(”127.0.0.1”, 40007)
py_disconnect() Přeruší spojení s Marc Mentat. py_disconnect()
py_send(String command) command - příkaz pro Marc Mentat. Pošle příkaz do Marc Mentat. py_send("*add_nodes 1 1 1")
py_prompt(String name) name - Řetězec k vytištění. Vytiskne řetězec do příkazové řádky py_prompt("Evaluating Mesh")
py_echo() flag - 1/0 = on/off (defalut on). Výpisy příkazů na příkazovou řádku v Marc Mentat py_echo(int flag)
Float py_get_data(String name) name - řetězec reprezentující požadovanou hodnotu. Vrací číselnou hodnotu definovan0ho parametru. py_get_data("geometry:cont_radius")
Float py_get_float(String name) name - výraz k vyhodnocení. Vyhodnotí výraz a vrátí číselnou hodnotu py_get_float("node_x(0)")
podobně: Integer py_get_int(String name); String py_get_string(String name);
Float py_ms_double(String name, Integer index) name - jméno položky v databázi, index - index položky v databázi. Vrací položku z databáze. py_ms_double("lcase_time_step",0)
podobně: py_ms_int; py_ms_string; py_ms_bool; py_ms_state



Pro získání hodnot s databáze pomocí příkazu py_get_int (a jeho variant) lze použít databázové funkce. Úplný seznam těchto funkcí je uveden v souboru python_manual.pdf (tabulka 1). Několik důležitých je uvedeno v tabulce 3. Při procházení databází je nutnost rozlišovat mezi indexem ntity v databázi a id ntity, které se mohou lišit (například vlivem použití funkce *sweep_all). Pro přečíslování id bodů vzhledem k aktuálnímu pořadí v databázi lze použít funkci *renumber_all.
Tabulka 3: Databázové funkce.
Funkce Popis
filename() Vrací název souboru modelu.
point_id(ARG1) Id bodu v databázi na pozici ARG1
max_point_id() Vrací nejvyšší hodnotu id bodu v databázi (nejnovější bod)
point_x(arg1) Globální souřadnice x bodu arg1
npoints() Počet bodů v databázi.
npoints()
ncurves()
nsolids()
nnodes()
nelements()
ncbodys()
napplys()
...
Počet ntit v databázi.
ncurve_points(arg1) Počet bodů křivky arg1.
curve_length(arg1) Délka křivky arg1.
element_mass(arg1) Hmotnost elementu arg1. Pokud arg1 = -1 vrací hmotnost všech elementů.
element_orient(arg1) Vrací jméno vlastnosti orientace elementu arg1.
mnoho, mnoho dalších v souboru python_manual.pdf (tabulka 1)

Práci s modulem py_mentat, zadávání příkazů a výstupy databázových funkcí si lze vyzkoušet přímo v interaktivním režimu programu Python (animace 2).

Uvodni obrazek je kdo ví proč fuč, ale animace by tu měla být, stačí kliknout!

Animace 2: Použití modulu py_mentat v interaktivním režimu programu Python.


Další možností je spuštění celých skriptů programu Python stisknutím tlačítka RUN z nabídky menu Python. Pro demonstraci tvorby jednoduchého modelu pomocí skriptu python je uvažován následující problém.

Uvažujme kruhovou ocelovou desku s obdélníkovým otvorem uprostřed, která je zatížena konstantním tlakem a po obvodu je pevně upnuta. Volitelné parametry modelu jsou velikost poloměru kruhu r a délka hrany obdélníku a (obrázek 1). Dále je kladen důraz na kvalitu sítě a proto dalším požadavkem je minimální hodnota zkřivení elementů (distortion treshold).

Obrázek 1

Obrázek 1: Ocelový plech pro parametrické modelování pomocí programu Python.


Vzhledem k symetrii úlohy je modelována pouze čtvrtina desky. Geometrie modelu je vytvořena pomocí okrajových křivek, z nichž je vytvořena síť modelu funkcí automesh (*af_planar_quadmesh) pro různé velikosti elementu (a/20 až a/2 s krokem a/20). Je vybrána nejlepší síť vzhledem k hodnotě zkřivení elementů a jsou přidány vlastnosti materiálu, typy prvků, okrajové podmínky, tak aby byl model připraven k výpočtu.

Kód programu Python lze stáhnout (nejlépe do pracovního adresáře) zde. Kód pak lze spustit v menu Python pomocí tlačítka RUN a výběrem souboru.

Funkce modulu py_mentat lze použít také pro vyhodnocení výsledků (postprocessing). Opět pracujeme podobně jako při vytváření proc souborů. Příkladem je kód pro získání hodnoty maximálního posunutí ve směru z, který je ke stažení zde. Kód musí být uložen v adresáři se souborem výsledků deska_job_deska.t16 a lze ho spustit pomocí tlačítka RUN z nabídky menu python.

Práce s modulem py_post

Dalším modulem, který můžeme použít pro vyhodnocení výsledků je modul py_post. Při použití tohoto modulu se pracuje přímo se souborem výsledků *.t16, není tedy třeba spouštět aplikaci Marc Mentat. Práce s modulem py_post je odlišná od práce s modulem py_mentat a od postupu při vytváření proc souborů. Po importu modulu se vytvoří objekt reprezentující daný soubor výsledků (pomocí funkce py_open) a k potřebným hodnotám se přistupuje pomocí funkcí a atributů tohoto objektu. Několik základních atributů a funkcí modulu py_post je v tabulce 4, kompletní seznam je uveden v dokumentu python_manual.pdf (tabulka 1).
Tabulka 4: Databázové funkce.
Atribut, Funkce Popis
increment Aktuální inkrement
plasticenergy Celkové plastická deformační energie
frequency Frekvence (pro modální analýzu)
mass Celková hmotnost
volume Celkový objem
PyPost post_open(String filename) Vrací objekt reprezentují soubor výsledků filename
close() Zavře soubor výsledků
moveto(Integer i) Přesune se na inkrement i
Integer increments() Vrací celkový počet inkrementů
extrapolation(String type) Nastavuje metodu extrapolace výsledků z integračních bodů do uzlů; type: linar - lineární ext.; translate - posun do uzlů; average - průměr přes uzly elementu
Integer nodes() Vrací celkový počet uzlů
PyNode node(int nnode) Vrací objekt uzlu nnode s atributy souřadnic x, y, z a id
Integer node_scalars() Vrací počet veličin vypočtených v uzlech
String node_scalar_label(Integer index) Vrací jméno veličiny s indexem index
Float node_scalar(Integer index, Integer scalar) Vrací hodnotu veličiny s indexem scalar uzlu s indexem index
mnoho, mnoho dalších v souboru python_manual.pdf (tabulka 1)

Kód programu Python pro vyhodnocení problému pomocí modulu py_post lze stáhnout (nejlépe do pracovního adresáře) zde.
Západočeská univerzita v Plzni | Fakulta aplikovaných věd | Katedra mechaniky