ego.c


In diesem Modul befindet sich der Anfang von EGO, sowohl für die sequentielle als auch für die parallele Version. Unterschiede diesbezüglich werden durch #if-statements gemacht.

main(...) 
               --> PCI_start(...) 
               --> controller(...) 
               --> node(...) 
               --> PCI_exit(...) 

Der absolute Anfang von EGO. Im Wesentlichen wird die Commandline des EGO-Aufrufs untersucht. Wenn keine Argumente vorhanden sind, dann wird als default Dateiname der Kontrolfilename ctl.lis gesetzt. Wenn zwei Argumente vorhanden sind, dann wird das erste Argument als Kontrolfile und das zweite Argument als das Restart-Kommando angesehen. Das Restart-Kommando wird dann gegebenenfalls in pex(...) verwendet. Üblicherweise ist das Restart-Kommando ein Shell-Script, das EGO neu startet, wenn noch nicht alle Integrationsschritte durchgeführt worden sind.

Bei der parallelen Version wird durch PCI_start(...) untersucht, ob man der Masterknoten oder einer Slavekonten ist. Wenn man der Masterknoten ist, dann wird durch controller(...) der weitere Ablauf des Masterknotens bestimmt; für einen Slaveknoten wird der weitere Programmablauf durch die Funktion node(...) bestimmt. Beachte, dass es in EGO für die parallele PVM Version keine node(...)-Funktion gibt, sondern die Aufgaben der Slaveknoten durch ein eigenes executable namens "node" ausgeführt werden. Der Start dieses node-exectubales geschieht aber an anderer Stelle, nämlich in der Funktion PCI_master_setup(...).

Bei der sequentielle Version wird nur controller(...) aufgerufen.


main(...) --> 
             controller(...)  
                                      --> loader(...) 
                                      --> seq_master(...) 
                                      --> master(...) 

In dieser Funktion wird die Startmessage von EGO ausgegeben und die Signalverwertung set_signal_procs(...) von EGO definiert. Durch die Funktion get_terminate_flag(...) kann dann an jeder beliebigen Stelle im Programm abgefragt werden, ob EGO ein Signal empfangen und wie darauf zu reagieren ist. DONT_STOP heisst dabei, dass EGO weitermachen soll, da kein Signal empfangen wurde. AFTER_STEP heisst, dass EGO nach Vollendung des nächsten Integrationsschittes beenden soll. AFTER_FILE heisst, dass EGO nach Schreiben des nächsten Restart-files beenden soll. Durch die Funktion set_terminate_flag(...) kann auch durch EGO selbst die Terminierung veranlasst werden, z.B. wenn bei der Minimierung entsprechend gesetzte Kriterien erfüllt sind.

Durch die Funktion loader(...) wird dann die ganze Initialisierung von EGO in die Wege geleitet. Die Hauptaufgaben dabei sind das Einlesen des Kontrolfiles, der anderen lis-files, das Clustering und die Verteilung der Daten an die einzelnen Knoten.

Die eigentliche Simulation wird dann in der Funktion seq_master(...) bei der sequentiellen Version bzw. in der Funktion master(...) bei der parallelen Version gestartet.


pex(...)
            --> close_output_file(...)
            --> PCI_exit(...)

Diese Funktion veranlasst alle Aufräumarbeiten beim Beenden von EGO. Dies geschieht insbesondere immer dann, wenn EGO unerwartet, also vor Ablauf der vorgegeben Anzahl von Integrationsschritten abbrechen muss. Wichtigste Aufgabe dabei ist das ordnungsgemässe schliessen aller geöffneten Dateien, da sonst Daten verloren gehen können. Bei der parallelen Version wird durch PCI_exit(...) zusätzlich auch noch die parallele Umgebung ordnungsgemäss terminiert. Wenn als Übergabeparameter nicht -1 übergeben wurde, ist dies das Signal, dass EGO durch ein eventuell vorgegebenes Restart-Kommando neu gestartet werden soll. Das Restart-Kommando kann z.B. ein shell-script sein. Natürlich muss das shell-script nicht unbedingt EGO restarten, sondern kann auch etwas anderes machen.