WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Abaqus Input File einlesen

 

Michael Sams
Forum-Anfänger

Forum-Anfänger



Beiträge: 24
Anmeldedatum: 18.05.08
Wohnort: ---
Version: R2008a
     Beitrag Verfasst am: 25.08.2011, 22:31     Titel:
  Antworten mit Zitat      
Hi,
ich habe ein Abaqus Input file mit folgendem Syntax:

*Heading
*Preprint, echo=NO, model=YES, history=NO, contact=NO
*PART, name=Braid
*Node
1,-5.8023702054,-6.7,0.303999962
2,-13.448003,6.542625,0.3032380524
3,-13.357143,6.38525,0.3009289383
4,-13.266282,6.227875,0.2969987206
5,-13.175422,6.0705,0.2913102631
6,-13.084561,5.913125,0.2836358233
...
*XXX
...

Ich möchte nun die Node Koordinaten zwischen "*Node" und "*XXX" auslesen und mit 3 oder 4 Nachkommastellen importieren.

Ich habe es mit Textscan probiert...aber irgendwie komme ich nicht weiter!?

lg Michael
_________________

-------------------------
Best Regards
Michael Sams
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.08.2011, 23:53     Titel:
  Antworten mit Zitat      
Hallo,

dann poste doch mal deinen bisherigen Ansatz und was daran nicht klappt.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
Gesplittet: 26.08.2011, 10:09 Uhr von denny
Von Beitrag Daten importieren | Formatierung des Text-Files aus dem Forum Programmierung
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 26.08.2011, 10:12     Titel:
  Antworten mit Zitat      
Hallo Michael,

Bitte fange neues Thema an, wenn deine Frage nichts mit Threadopener zu tun hat. Danke!
Private Nachricht senden Benutzer-Profile anzeigen
 
Michael Sams
Themenstarter

Forum-Anfänger

Forum-Anfänger



Beiträge: 24
Anmeldedatum: 18.05.08
Wohnort: ---
Version: R2008a
     Beitrag Verfasst am: 26.08.2011, 20:47     Titel:
  Antworten mit Zitat      
Hi,

sorry fürs weiterschreiben im Thread!

Also ich öffne mein Abaqus Input File und Suche dann einmal die Zeile "*Node"...nach dieser beginnen meine Knotenpunkte mit Koordinaten. Diese laufe ich durch bis zum nächsten Keyword "*???" und schreibe diese Zeilenweise in den Cell-Array. Nun ist mein Code sehr langsam (ca. 120000 Zeilen im Input File), das Format der Koordinaten passt mir auch nicht recht (ich möchte nur 2 oder 3 Nachkommastellen) und ich möchte noch die gesamten Daten in einer Matrix oder zumindest in einzelenen Vektoren stehen haben.

Code:
node_area = 0;
C_line = 1;
tline = fgetl(fid);
while(node_area<2)
    if (tline == -1) % end of file
        break;
    elseif (node_area == 0 && ~strcmp(tline, '*Node'))
        tline = fgetl(fid);
    elseif (strcmp(tline, '*Node'))
        node_area = node_area + 1;
        tline = fgetl(fid);
    elseif (node_area == 1 && ~strncmp(tline, '*', 1))  
            C{1}(C_line,:) = textscan(tline, '%d %f %f %f', 'delimiter', ',');
            C_line = C_line + 1;
            tline = fgetl(fid);
    elseif (node_area == 1 && strncmp(tline, '*', 1))
        node_area = 2;
        break;
    end
end
fclose(fid);


Das Format müsste doch über textscan einstellbar sein?! Und es wäre echt toll wenn vll. jemand noch ein paar Optimierungsvorschläge bezüglich Performance für mich hätte! Laughing
Und den Output von textscan als Cell-Array...gibt es da vll. auch eine schönere Lösung?!

Danke schonmal in voraus!
Lg Michael
_________________

-------------------------
Best Regards
Michael Sams
Private Nachricht senden Benutzer-Profile anzeigen
 
mc_f

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.08.2011, 08:56     Titel: Abaqus .inp einlesen
  Antworten mit Zitat      
Hallo,

ich habe das schon einmal gemacht und mit Hilfe von "regexp" folgendermaßen gelöst.


Code:

nodes = 1038218; %Anzahl der Knoten
x = zeros(nodes,1);
y = zeros(nodes,1);
z = zeros(nodes,1);

fid_in = fopen(Name.inp','r'); %Öffnen der Datei zum lesen
i = 1; %Laufvariable für Vektor zum speichern der Variablen
ii = 1; %Zeile Datei
iline = fgetl(fid_in);
string1 = 0;
string2 = 0;
m={};
while iline ~= -1
    %Name des Parts
    find_part = findstr(iline, 'name=test_part');
    if ~isempty(find_part)
          string1 = 1;
          iline = fgetl(fid_in);
    end
   
    find_node = findstr(iline, '*Node');
    if ~isempty(find_part)
          string2 = 1;
          iline = fgetl(fid_in);
    end
   
    if string1 == 1 && string2 == 1
       
        %Abbruchbedingung
        find_element = findstr(iline, '*Element');
        if ~isempty(find_element)
            break;
        end
       
        try
            [m]=regexp(iline,'([-]?)([0-9]+)([.])([0-9]*)','match');
            if ~isempty(m)
                x(i,1) = str2double(m{1,1});
                y(i,1) = str2double(m{1,2});
                z(i,1) = str2double(m{1,3});
            end
            i = i+1;
        catch
            fprintf(2,'Error\n');
            break;
        end
   
    end
    iline = fgetl(fid_in);
end
fclose(fid_in);
 


Hoffe, dass dir das weiterhilft. Müsstest es halt noch für deien Fall entsprechend anpassen, also Knotenanzahl, Part-Name etc.

Viele Grüße

F
 
Michael Sams
Themenstarter

Forum-Anfänger

Forum-Anfänger



Beiträge: 24
Anmeldedatum: 18.05.08
Wohnort: ---
Version: R2008a
     Beitrag Verfasst am: 30.08.2011, 23:07     Titel:
  Antworten mit Zitat      
Hi Leute,

also ich hab es jetzt folgendermaßen gelöst:
Im ersten Schritt schreibe ich mir die Anzahl der Nodes raus und in der zweiten Schleife, lese ich einfach mit sscanf die NODES mit Koordinaten! So geht es relativ flott (ca. 8 sec bei über 100k Knoten)...und ich bin zufrieden! Wink @F: danke für den Tipp, dass man die Knotenanzahl wissen sollte...sonst wäre ich jetzt noch bei einer Rechenzeit von über 1 Min!

Code:
% file-import - Abaqus *.inp file
fid = fopen(inp_file, 'r');
if (fid<0)
    warndlg('File broken or not available!',...
        'File ERROR');
end

% Read Input file and count node-number (N_NODES)
node_area = 0;
N_NODES=0;
tline = fgetl(fid);
while(node_area<2)
    if (tline == -1) % end of file
        break;
    elseif (node_area == 0 && ~strcmp(tline, '*Node'))
        tline = fgetl(fid);
    elseif (strcmp(tline, '*Node'))
        node_area = node_area + 1;
        tline = fgetl(fid);
    elseif (node_area == 1 && ~strncmp(tline, '*', 1))
        N_NODES = N_NODES + 1;
        tline = fgetl(fid);
    elseif (node_area == 1 && strncmp(tline, '*', 1))
        node_area = 2;
        break;
    end
end
frewind(fid);

% Read Input file and write NODES incl. coordinates
NODES_N = zeros(N_NODES,1);
NODES_X = zeros(N_NODES,1);
NODES_Y = zeros(N_NODES,1);
NODES_Z = zeros(N_NODES,1);
node_area = 0;
C_line = 1;
tline = fgetl(fid);
while(node_area<2)
    if (tline == -1) % end of file
        break;
    elseif (node_area == 0 && ~strcmp(tline, '*Node'))
        tline = fgetl(fid);
    elseif (strcmp(tline, '*Node'))
        node_area = node_area + 1;
        tline = fgetl(fid);
    elseif (node_area == 1 && ~strncmp(tline, '*', 1))
        C = sscanf(tline, '%d,%f,%f,%f');
        NODES_N(C_line,1) = C(1);
        NODES_X(C_line,1) = C(2);
        NODES_Y(C_line,1) = C(3);
        NODES_Z(C_line,1) = C(4);
        C_line = C_line + 1;
        tline = fgetl(fid);
    elseif (node_area == 1 && strncmp(tline, '*', 1))
        node_area = 2;
        break;
    end
end
fclose(fid);


LG Michael
_________________

-------------------------
Best Regards
Michael Sams
Private Nachricht senden Benutzer-Profile anzeigen
 
boy

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.01.2012, 14:03     Titel:
  Antworten mit Zitat      
hallo,

ich habe ein ähnliches problem... ich habe auch ein abaqus input file. allerdings möchte ich nur einen wert auslesen, mit einem referenzwert den ich habe vergleichen und dann optimieren. das bekomme ich auch noch so einigermaßen hin. nun meine frage, kann ich denn den optimierten wert wieder in das input file schreiben, damit ich den optimierten wert weiterverwenden kann? oder muss ich mir dann ein neues input file generieren?

ich wäre dankbar, wenn mir jemand weiterhelfen könnte!

grüße
 
Michael Sams
Themenstarter

Forum-Anfänger

Forum-Anfänger



Beiträge: 24
Anmeldedatum: 18.05.08
Wohnort: ---
Version: R2008a
     Beitrag Verfasst am: 15.01.2012, 11:07     Titel:
  Antworten mit Zitat      
Hi,

also ich habe es so gelöst, dass ich das Abaqus-File Zeile für Zeile durchlaufe und die unveränderten Zeilen in ein neues File schreibe - bis zum gewünschten Punkt; dort meinen Wert einfüge und dann weiter kopiere bis zum Schluss!

Ob es in Matlab eine Möglichkeit gibt, punktuell ein File zu verändern? ...ich bin mir nicht 100%-ig sicher, aber ich glaube nicht!

lg Michael
_________________

-------------------------
Best Regards
Michael Sams
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.