Fortran

Liebe/-r Experte/-in,

ich habe ein Problem mit einem Code den ich benutze und hätte gern Hilfe (ich bin selbst nicht Programmierer).

Als ich kürzlich die Anzahl meiner FE-Elemente erhöhen musste, bekam ich eine ‚access violation‘ Fehlermeldung und soweit ich herausbekommen habe hängt das wohl mit der memory zusammen, die nicht mehr ausreicht. 32 vs. 64 bit und compiler sind andere Verdächtige, soweit ich das als relativer Laie verstehe.

Meine Frage zielt auch darauf:

Wie wird i.A. die allocation von memory (wieviel wird wann benutzt) in FORTRAN codes festgelegt?
Kann man diese ‚selbst‘ einstellen oder wird das vom System festgelegt/bestimmt/limitiert?
Welche Möglichkeit habe ich meine memory (ich vermute RAM? ist hier zuständig) erhöhen?

Das Programm läuft auf einem 32-bit PC mit 2 GB RAM.

Vielen Dank im Voraus.

Christian

Tag Christian,

‚access violation‘ ist so eine Art Klassiker und geschieht oft, wenn Arraygrenzen überschritten werden, denn die kontrolliert FORTRAN nicht. Das würde also zu Deiner Elementenerhöhung passen. Ist die denn überhaupt vorgesehen?

Memory allocation habe ich noch nie in FORTRAN IV oder FORTRAN 90 Code gesehen - und wenn geht das nur über System-Routinen, hat mit der Sprache also nichts zu tun. Vielleicht lässt sich dem Programm aber beim Aufruf per Parameter eine bestimmte Memorygröße zuweisen. Dadurch wird allderings Dein Fehler nicht behoben, denn Arraylängen werden im Code festgelegt.

Gruß

Jörg

Tag Jörg,

ja ein Klassiker, genau.

„Vorgesehen“ im eigentlichen Sinne war es nicht. Ich weiss der Erschaffer hat das Programm geschrieben um seine Sachen zu berechnen (

Wenn das Programm mit den Daten nicht ins Memory passen, wird der Computer „lahm“, weil er zu „swappen“ beginnt, eine ‚access violation‘ wird dadurch das aber in keinster Weise hervorgerufen. Die passiert nur, wenn die Programmlogik nicht stimmt. Wenn die also nur maximal 1499 Elemente vorsieht, knallt’s beim 1500sten.
Du müsstest also die Arrays vergrößern, d.h. ohne Quellcode und Neu-Kompilieren kommst Du nicht weiter.
Es sei denn, Du siehst eine Möglichkeit, die Daten in zwei Hälften zu verarbeiten und aus den beiden Teilergebnissen das gewünschte Endergebnis zu berechnen.

Wenn das Programm mit den Daten nicht ins Memory passt, wird der Computer „lahm“, weil er zu „swappen“ beginnt, eine ‚access violation‘ wird dadurch aber in keinster Weise hervorgerufen. Die passiert nur, wenn die Programmlogik nicht stimmt. Wenn die also nur maximal 1499 Elemente vorsieht, knallt’s beim 1500sten.
Du müsstest also die Arrays vergrößern, d.h. ohne Quellcode und Neu-Kompilieren kommst Du nicht weiter.
Es sei denn, Du siehst eine Möglichkeit, die Daten in zwei Hälften zu verarbeiten und aus den beiden Teilergebnissen das gewünschte Endergebnis zu berechnen.

Ja die array-grössen hatte ich schon im auge. ich habe vollen zugang zum quellcode - das ist kein problem. eine datenteilung ist nicht machbar aus verschiedenen gründen.

leider weiss ich nicht genau, wie ich herausfinde wo und wie die arrays genau definiert sind bzw. wie das in quellcode genau aussieht. gitb es da eine typische struktur an der ich genau erkennen kann wo die arrays sind…?

danke

christian

Die Array-Deklarationen befinden sich immer am Kopf des Codes, also vor der eigentlichen Ablauflogik.
Bei impliziten Datentypen lässt sich DIMENSION verwenden, ansonsten der Datentyp, z.B. INTEGER(…) oder REAL(…).

ich weiss ich bin sauspaet dran und ich vermute Du hast Dein Problem schon geloest.

Wenn nicht, sag nochmal Bescheid (aber ich denke nicht dass es am pysikalischen RAM des PCs liegt sondern am Fortran programm bzw. der benutzten Speicherplaetze…)

Gruss

hallo roland,

besser spaet als nie, eh?

danke fuer das hilfsangebot - leider habe ich mein problem noch nicht loesen koennen :frowning:( mittlerweile habe ich aber herausgefunden, dass es wohl mit heap oder stack allocation zu tun hat (bin eher nutzer als programmierer und deshalb nicht wirklich bewandert), da es auf einer SGI mit unix ohne probleme laeuft, ich aber auf einem PC arbeite…

sollte dich das nicht abgeschreckt haben dann kann ich gern mehr details liefern.

schoenen gruss nach RSA!

christian

Meine Fortran kenntnisse sind zwar schon etwas veraltet, aber ich denke ich liege da richtig mit meiner Vermuting. Und zwar genau aus dem Grunde, dass auf SGI UNix laeuft und in Dos/Windows nicht.
Je nach hardware ordnet Fortran den Speicherplaetzen (Worten) fuer Zahlen bestimmte Laengen (oder Genauigkeit) zu. Auf „groesserer“ hardware (oder bestimmten Betriebssystemen) ist die Wortlaenge sagenwir mal 32 bit, waehrend auf anderen ist sie nur 16 bit oder 24 bit (nur als beispiel) dadurch wird auch die hoechste verwaltbare zahl festgelegt. Das erklaert, warum es auf einer maschine laeuft, af einer anderen kann es zu problemen fuehren, dann naemlich, wenn irgendwann mal so eine hohe Zahl entsteht.
Es gibt zwei Abhilfen:
rauszufinden (mit einem debugger - die sollten heutzutage auf einem Stand sein, wo auch weniger erfahrene damit umgehen koennen) um welche variable im programm es sich handelt. Diese dann im Programm als DOUBLEPRECISION (check die Schreibweise, bin mir da nicht mehr sicher) definieren. Oder den Compiler eine Anweisung geben, dass er alle Zahlen beim compilieren automatisch als DOUBLEPRECISION anlegen soll - das sollte mit einem flag beim starten des compilers gehen (vielleicht gibt’s da aber heute auch schon wieder komfortablere Wege).

Das ist erstmal alles.

Melde Dich wieder

Gruss

(by the way: aus Windhoek / Namibia - nicht RSA)

hallo roland,

sorry, natuerlich namibia!

mittlerweile habe ich ‚erfahren‘ das die doubleprecision nummer wohl den kern des problems trifft. leider funktioniert das zuweisen mit dem compiler selbst nicht, da bei der access violation der debugger nicht ‚anspringt‘. kann man das nicht irgendwie mit den STACK oder HEAP befehlt grundsätzlich festlegen (oder ist das wieder ein anderes paar schuhe?)

schoenen gruss

christian

Ich muss jetzt ehrlich zugeben, dass ich da langsam am Ende bin mit meinem Latein - aehhhh Fortran.

Ich habe folgende Seiten gegooglet, wovon die ersten beiden:

http://jblevins.org/computing/fortran/segfault

http://forums.sun.com/thread.jspa?threadID=5384618

Dir vielleicht weiterhelfen bezueglich heap and stack;
die anderen beiden:

http://software.intel.com/en-us/forums/showthread.ph…

http://software.intel.com/en-us/articles/intel-fortr…

denke ich sind nicht so hilfreich.

Hoffe, Du kommst klar mit dem englisch!?

Noch 'ne ganze dummer frage: hast du eigentlich den Quellcode fuer das programm oder nur lauffaehige versionen? Wenn ersteres, dann koennte ich mir den quellcode mal ansehen (solltest du ihn rausgeben wollen), wenn ich mal viel zeit habe…

In einer der webseiten, findest du info, wie man den speicher den der PC dem programm zuordnen soll, erhoehen kann. Aber vielleicht liegt es am Ende wirklich an deinem PC-arbeitsspeicher: ich meine, finite elemente methoden koennen einen enormen Speicherplatz beanspruchen…

Sorry, dass ich Dir hier nicht mehr viel weiter helfen kann. Solltest Du letztlich die Loesung finden, waer ich dankebar fuer die info, was geholfen hat.

Gruss
Roland

hallo roland,

danke fuer dir info - englisch ist gar kein problem:smile: ich werde mir die sachen mal ansehen…

ja, den quellcode habe ich und ich schicke ihn dir gern, wenn du dir das antuen willst:smile: was ich natuerlich sehr appreciaten wuerde!

momentan bin ich noch nicht dahintergekommen wo genau ich den speicherplatz festlege ABER ich bin mir fast sicher dass diese das problem ist - nicht genug speicher zugewiesen. ich habe auch eine quellcodeversion die fuer MPI umgebaut wird und obwohl ich das natuerlich nicht 1=1 uebernehmen kann ist dort vielleicht die loesung mehr oder weniger schon drin?

sag bescheid dann schick ich dir den quellecode

gruss und danke!

christian