Autor |
MATLAB pobranie danych z wyników ABAQUSA |
Goral
Użytkownik
Postów: 21
Data rejestracji: 19.03.13 |
Dodane dnia 04/06/2013 21:53 |
|
|
Witam. Szukam od jakiegos czasu rozwiazania problemu pobrania wynikow z ABAQUSA do MATLAB.
Jest mi to potrzebne do zrobienia skryptu, ktory bedzie szukal np. materialu, dla ktorego ugiecie w pkt. modelu bedzie wynosilo zalozona wartosc.
Nie wiem czy to dobra droga. Udalo mi sie utworzyc skrypt, ktory wyrzuca wyniki z ABAQUSA do pliku rpt, jednak nie potrafie ich wczytaj do MATLABA.
Przykladowa zawartosc pliku rpt
X XYData-1
0. 0.
3.6E+03 -26.1364E-09
X XYData-2
0. 0.
3.6E+03 -1.44053E-06
Prosze o pomoc w rozwiazaniu problemu. |
|
Autor |
RE: MATLAB pobranie danych z wyników ABAQUSA |
Goral
Użytkownik
Postów: 21
Data rejestracji: 19.03.13 |
Dodane dnia 04/07/2013 11:56 |
|
|
Uadlo mi sie znalesc, cos takiego:
import sys
import os
from odbAccess import *
from textRepr import *
from abaqusConstants import *
import odbAccess
odb=openOdb(path='Job.odb')
n='Monit'
first_node=odb.rootAssembly.nodeSets['Probka-1.Monit']
displacementfield=odb.steps['Step-1'].frames[1].fieldOutputs['U']
disp1=displacementfield.getSubset(region=first_node)
dispvalues1=disp1.values
disp1file=open('disp1.txt','a')
disp1file.write(str("NODE=")+str(v.nodeLabel)+"\n")
disp1file.writelines('COORDINATES'\n')
disp1file.writelines('%s\n' % (node.coordinates))
Niestety nie rozumiem tego zapisu. Chcialbym tak go zmodyfikowac, aby wczytac do MATLABA wyniki przemieszczenia U2 z setu, ktory wczesniej utworzylem.
|
|
Autor |
RE: MATLAB pobranie danych z wyników ABAQUSA |
Tomekk
Użytkownik
Postów: 242
Miejscowość: Norge
Data rejestracji: 01.10.09 |
Dodane dnia 04/07/2013 13:31 |
|
|
Ale to jest skrypt do abaqusa. Aby wciągnąć coś to matlaba, musisz zmusić do tego matlaba, a nie abaqusa...
Matlab na pewno jest w stanie operować na plikach tekstowych, poszukaj w jego dokumentacji.
pozdr
Tomek
-----------------------------
człowiekiem jestem ...
Edytowane przez Tomekk dnia 04/07/2013 13:32 |
|
Autor |
RE: MATLAB pobranie danych z wyników ABAQUSA |
Goral
Użytkownik
Postów: 21
Data rejestracji: 19.03.13 |
Dodane dnia 04/08/2013 20:03 |
|
|
Dziekuje Tomek, dzieki Tobie udalo mi sie, zrobic to co chcialem.
Pozostaje tylko jeszcze jeden problem, zawieszania sie MATLABA.
Sytuacja wyglada nastepujaco.
Po uruchomieniu ABAQUSA tym poleceniem
eval(['! abaqus j=',name,' inp=Job int'])
Zawiesza mi sie MATLAB, przy czym we folderze wykonywane, sa kolejne, dalsze polecenia i uzyskuje koncowe wyniki. Nie byloby to zle, jakby nie to, ze za kazdym razem musze wylaczac MATLABA z processow systemu i na nowo wlaczac, oraz nie uzyskuje wyswietlania krokow na ekranie.
Problem prawdopodobnie wynika z zawieszania sie ABAQUSA na pliku Simulink Model, ktory zostaje utworzony i znika po wylaczeniu MATLABA. Mysle, ze najprostrzym rozwiazaniem, byloby poropstu wymuszenie zamkniecia ABAQUSA, po wykonaniu obliczen. Niemoge jednak znalesc takiego polecenia. Prosze, wiec o pomoc. |
|
Autor |
RE: MATLAB pobranie danych z wyników ABAQUSA |
Tomekk
Użytkownik
Postów: 242
Miejscowość: Norge
Data rejestracji: 01.10.09 |
Dodane dnia 04/09/2013 21:00 |
|
|
Spróbuj odpalić abaqusa z parametrem "interactive", przy uruchamianiu z basha pomaga :)
On po prostu będzie listował wszystko co robi, a nie od razu zamykał "sesje" (nie wiem jak to nazwać).
A i jeszcze tak, sam solver możesz odpalić po prostu z komendy:
abaqus job=NAZWA
za NAZWA podajesz nazwę pliku inp, bez rozszerzenia, output będzie miał tą samą nazwę,
możesz dodać do tego
abaqus job=NAZWA cpus=X
gdzie X to liczba rdzeni, ale bez HT, HT po prostu nie zdziała (znaczy zajmie wątki, ale nie przyśpieszy obliczeń) w abaqusie i ani intel ani goście z Simuli nie wiedzą o co camon. I na końcu możesz jeszcze dorzucić wspomniane interactive, już bez parametrów.
abaqus job=NAZWA cpus=X interactive
daj znać jak poszło
pozdr
Tomek
-----------------------------
człowiekiem jestem ...
Edytowane przez Tomekk dnia 04/09/2013 21:05 |
|
Autor |
RE: MATLAB pobranie danych z wyników ABAQUSA |
Goral
Użytkownik
Postów: 21
Data rejestracji: 19.03.13 |
Dodane dnia 04/10/2013 10:18 |
|
|
Niestety, nie pomoglo. No chyba, ze cos zle zrobilem.
Wydaje mi sie, ze mój zapis:
eval(['! abaqus j=',name,' inp=Job int'])
a Twój Tomekk:
eval([abaqus job=NAZWA cpus=X interactive)])
to w sumie to samo.
j = job i int = interactive
Koncowy rezultat, jest taki sam. Command okno w MATLABIe mi sie wiesza. Dobrze, ze obliczenia, dalej wykonuje w tle i uzyskuje wyniki.
Na kolegi komputerze wszytko dziala. Nie mam niestety pojecia, co moze byc przyczyna.
|
|
Autor |
RE: MATLAB pobranie danych z wyników ABAQUSA |
Goral
Użytkownik
Postów: 21
Data rejestracji: 19.03.13 |
Dodane dnia 04/13/2013 15:25 |
|
|
Ok. Udalo mi sie rozwiazac, moj problem. Okazluje sie, ze wersja MATLAB'a 2012b, prawdopodonie nie lubi sie z moim sprzetem. Po zainstalowaniu starszej wersji 2011b, wszytko dziala jak nalezy.
Teraz przeszedlem do dalszych prac. Szukam rozwiazania do zaladowania zmiennych z matlaba do pliku pythona. wyglada to nastepujaco:
MATLAB:
eval(['!abaqus cae noGUI=abaqusMacros2.py -- 8000)])
Plik Python:
import sys
modul_spr = float(sys.argv[-1])
... dalsza czesc.
Tak mi wszystko dziala, chce jednak zamiast "8000" wprowadzic zmienna... i tutaj mam problem.
Rozwiazanie ponizej niestety nie dziala.
modul = 8000;
eval(['!abaqus cae noGUI=abaqusMacros2.py --' modul)])
Prosze o pomoc.
|
|
Autor |
RE: MATLAB pobranie danych z wyników ABAQUSA |
Tomekk
Użytkownik
Postów: 242
Miejscowość: Norge
Data rejestracji: 01.10.09 |
Dodane dnia 04/13/2013 17:18 |
|
|
eval(['!abaqus cae noGUI=abaqusMacros2.py --' modul)])
Może wrzuć to w pętle w matlabie? Tak aby pętla przygotowywała komendę jako tekst i odpalała po kolei to co tam potrzebujesz?
Wiem, noga ze mnie jak przychodzi do skryptowania...
pozdr
Tomek
-----------------------------
człowiekiem jestem ... |
|
Autor |
RE: MATLAB pobranie danych z wyników ABAQUSA |
Goral
Użytkownik
Postów: 21
Data rejestracji: 19.03.13 |
Dodane dnia 04/13/2013 20:45 |
|
|
Juz wszysko dziala i mniej wiecej wszystko rozumiem.
eval(['!abaqus cae noGUI=abaqusMacros2.py --x' modul)])
w miejscu x musi byc spacja, oraz modul musi byc zmienna tekstowa. Uzyskalem to poprzez:
modul = num2str(modul)
|
|
Autor |
RE: MATLAB pobranie danych z wyników ABAQUSA |
Goral
Użytkownik
Postów: 21
Data rejestracji: 19.03.13 |
Dodane dnia 04/13/2013 20:59 |
|
|
Aktualnie zostala mi jeszcze jedna kwestia do rozwiazania. Jest nia odczytanie wynikow z analizy ABAQUS'a. Potrafie odczytac wyniki z pliku tekstowego, wiaze sie to jednak z dodatkowymi krokami do wykonania w skrypcie. Wiaze sie to z wydluzeniem czasu obliczen, a na czasie mi zalezy, poniewaz bede skrypt wykonywal "tysiace" razy.
Wiem, ze da sie to zrobic poprzez bezposrednie odczytanie wynikow z pliku .odb (o co pytalem wczesniej).
Udalo mi sie dojsc do tego:
MATLAB:
eval(['! abaqus cae noGui=readodb.py -- speciment1.odb '])
Plik Python
import sys
from odbAccess import *
odbpath = sys.argv[-1]
odb = openOdb(path=odbpath)
nSet = odb.rootAssembly.instances['Probka-1'].nodeSets['Monit']
frame = odb.steps['Step-1'].frames[-1]
disp = step1frame.fieldOutputs['U']
u = disp.values;
MATLAB wyrzuca blad:
KeyError: Probka-1
File "readodb.py", line 9, in <module>
nSet = odb.rootAssembly.instances['Probka-1'].nodeSets['Monit']
Abaqus Error: cae exited with an error.
Parametry Probka-1 oraz Monit odczytalem z pliku inp
Prosze o pomoc.
|
|
Autor |
RE: MATLAB pobranie danych z wyników ABAQUSA |
Goral
Użytkownik
Postów: 21
Data rejestracji: 19.03.13 |
Dodane dnia 04/14/2013 20:12 |
|
|
Poprawka:
MATLAB:
eval(['! abaqus python readodb.py -- speciment1.odb ']) |
|
Autor |
RE: MATLAB pobranie danych z wyników ABAQUSA |
Goral
Użytkownik
Postów: 21
Data rejestracji: 19.03.13 |
Dodane dnia 04/15/2013 09:21 |
|
|
Udalo mi sie wykonac, prawie to czego szukam.
MATLAB:
eval(['! abaqus python odbread.py speciment.odb displ.out'])
Python:
import sys
from odbAccess import *
from abaqusConstants import *
from odbMaterial import *
from odbSection import *
odbpath=sys.argv[1]
outpath=sys.argv[2]
out = open(outpath,'w+')
odb = openOdb(path=odbpath)
step1 = odb.steps['Step-1']
frame = step1.frames[-1]
disps = frame.fieldOutputs['U']
fieldValues = disps.values
for v1 in fieldValues:
print >> out, '%5d, %11.4e' % (v1.nodeLabel, v1.data[1], )
print >> out
W pliku displ.out otrzymuje wartosci U2 dla calego modelu. Natomiast chcialbym, aby byly to wartosci U2 tylko z jednego setu. Ma do tego sluzyc polecenie:
nSet = odb.rootAssembly.instances['Probka-1'].nodeSets['Monit']
Jednak po jego wprowadzeniu do skryptu pythona, otrzymuje blad. Prawdopodobnie, zle sa przezemnie definiowane same nazwy instance ['Probka-1'] i setu['Monit']. Sa one odczytane z pliku inp, na podstawie ktorego wykonalem obliczenia i otrzymalem plik do odczytu odb.
Prosze o pomoc w rozwiazaniu problemu. |
|
Autor |
RE: MATLAB pobranie danych z wyników ABAQUSA |
Goral
Użytkownik
Postów: 21
Data rejestracji: 19.03.13 |
Dodane dnia 04/15/2013 23:06 |
|
|
Ok. Udalo mi sie rozwiazac problem.
nSet = odb.rootAssembly.instances['PROBKA-1'].nodeSets['MONIT']
Wystarczylo wpisac nazwy wielkimi literami :)
Zamykam temat |
|
Autor |
RE: MATLAB pobranie danych z wyników ABAQUSA |
Tomekk
Użytkownik
Postów: 242
Miejscowość: Norge
Data rejestracji: 01.10.09 |
Dodane dnia 04/16/2013 17:49 |
|
|
Ciągi tekstu powinny być identyczne, szczególnie w przypadku pythona. Więc szukałeś innej zmiennej, niż Ci się wydawało...
pozdr
Tomek
-----------------------------
człowiekiem jestem ... |
|