NKOERPER - Bahnkurven von Massepunkten unter Gravitationskraft in C

Das Programm NKOERPER löst die Bewegungsgleichungen von Teilchen, die sich unter dem Einfluß der wechselseitigen Gravitationskräfte bewegen. Es benutzt dazu ein Runge-Kutta-Verfahren mit Adaption der Schrittweite. Die entsprechenden Routinen runge_kutta und integriere sind Adaptionen von Programmen aus dem Buch ''Theoretische Physik mit dem Personal Computer'' von Schmid, Spitz und Lösch.

Das Hauptprogramm main ist folgendermaßen aufgebaut:

Mit io_init werden alle Eingabe-Parameter wie Zahl der Teilchen, ihre Massen, Anfangsorte und -geschwindigkeiten eingelesen und über den globalen IO-Block zurückgegeben.19 Die Routine dvector besorgt den Speicherplatz für Orts- und Geschwindigkeits-Vektoren, die dann auf die Anfangsbedingungen gesetzt werden. Nach diesen Vorbereitungen startet die Rechnung: Mit integriere werden Ort und Geschwindigkeit der Teilchen für den gegenwärtigen Zeitpunkt bestimmt und mit write_vector ausgegeben. set_vector setzt die Vektoren für die nächste Iteration und die Zeit wird um einen Schritt erhöht. Nach der Rechnung werden noch mit io_close abschließende Arbeiten erledigt (Files geschloßen).

''integriere'' implementiert die Schrittweiten-Anpassung und ruft für die eigentliche Integration die Routine runge_kutta auf, die allgemeine Systeme von Differentialgleichungen erster Ordnung lösen kann. Das hier benötigte spezielle System

         [xdot]a  =  [v]a                               (a: Teilchenindex)
         [vdot]a  =  sum (b!=a) [m]b /([r]ab ** 3)  *  ([x]b - [x]a)
wird durch ''kepler_dgl'' definiert.

Version 2.1
Änderungen:

Meßergebnisse:


time(-no): 438 .2s
time(-O0): 364 .9s
time(-O1): 314 .7s
time(-O2): 331 .7s
CXpa(-O1):


  CPU Time .CPU Time Times .Routine    
  (less children) .(plus children) Called .Name    
  306 .987 56 .0% 546 .519 99 .7% 3924 kepler_dgl
  239 .526 43 .7% 539 .526 43 .7% 39632727 mthd_pown
  1 .307 0 .2% 547 .845 99 .9% 981 runge_kutta
Analyse:

Bemerkungen:

Version 2.2
Änderungen:

Meßergebnisse:


time(-O1): 168 .2s
time(-O2): 179 .3s
CXpa(-O1):


  CPU Time .CPU Time Times .Routine    
  (less children) .(plus children) Called .Name    
  166 .538 99 .0% 166 .546 99 .0% 3924 kepler_dgl
Analyse:

Bemerkungen:

Version 2.3
Änderungen:

Meßergebnisse:


time(-O1): 128 .3s
time(-O2): 142 .2s
CXpa:


  CPU Time .CPU Time Times .Routine    
  (less children) .(plus children) Called .Name    
  126 .037 98 .7% 126 .082 98 .7% 3924 kepler_dgl (-O1)
  140 .455 98 .9% 140 .463 98 .9% 3924 kepler_dgl (-O2)
Optimierungsbericht für kepler_dgl:


Line Iter. Reordering Optimizing / Special Exec.
Num. Var. Transformation Transformation Mode
7 a Scalar    
72 b Scalar    
77 i FULL VECTOR Reduction  
         
87 a Scalar    
89 b Scalar    
         
96 a Scalar    
98 i Scalar    
103 b Scalar    
         
Line Iter. Analysis    
Num. Var.      
70 a Inner loop has varying trip count    
72 b Unable to distribute    
87 a Inner loop has varying trip count    
89 b Insufficient vector code    
96 a Unable to distribute    
98 i Unable to distribute    
103 b Insufficient vector code    
Analyse:

Bemerkungen:

Version 2.4
Änderungen:

Meßergebnisse:


time(-O1): 122 .2s
time(-O2): 120 .9s
CXpa:


  CPU Time .CPU Time Times .Routine    
  (less children) .(plus children) Called .Name    
  120 .066 98 .7% 120 .074 98 .7% 3924 kepler_dgl (-O1)
  119 .051 98 .7% 119 .059 98 .7% 3924 kepler_dgl (-O2)
Analyse:

Bemerkungen:

Version 2.5
Änderungen:

Meßergebnisse:


time(-O1): 101 .6s
time(-O2): 107 .7s
Optimierungsbericht für kepler_dgl:


Line Iter. Reordering Optimizing / Special Exec.
Num. Var. Transformation Transformation Mode
71 a Scalar    
73 b Scalar    
77 i FULL VECTOR Reduction  
         
87 a Scalar    
89 b Scalar    
         
96 a FULL VECTOR    
         
103 i Scalar    
         
109 a Scalar    
111 i Scalar    
114 b Scalar    
         
Line Iter. Analysis    
Num. Var.      
71 a Inner loop has varying trip count    
73 b Unable to distribute    
87 a Inner loop has varying trip count    
89 b Insufficient vector code    
103 i Insufficient vector code    
109 a Unable to distribute    
111 i Unable to distribute    
114 b Insufficient vector code    


Loop Performance Analysis  
For kepler_dgl.c:kepler_dgl  
   
Line Times Iteration Count  
Number Exec. Min Max Avg Total CPU Time  
71 3924 101 101 101 109 .110868
73 392400 1 100 50 108 .079641
77 19816200 2 2 2 44 .060601
87 3924 101 101 101 10 .615843
89 392400 1 100 50 9 .681291
96 3924 101 101 101 0 .019290
103 3924 202 202 202 0 .223310
109 3924 101 101 101 61 .225854
111 396324 2 2 2 60 .099856
114 792648 101 101 101 57 .622604
Analyse:

Bemerkungen:

Version 2.6
Änderungen:

Meßergebnisse:


time(-O1): 100 .5s
time(-O2): 88 .4s
Optimierungsbericht für kepler_dgl:


Line Iter. Reordering Optimizing / Special Exec.
Num. Var. Transformation Transformation Mode
74 a Scalar    
76 b FULL VECTOR    
         
82 a Scalar    
84 i Scalar    
86 b Scalar    
         
93 a Scalar    
95 b Scalar    
         
103 a Scalar    
105 b Scalar    
         
112 a FULL VECTOR    
         
120 i Scalar    
         
126 a Scalar    
128 i Scalar    
131 b Scalar    


Analyse:

Bemerkungen:

Version 2.7
Änderungen:

Meßergebnisse:


time(-O2): 65 .4s
Optimierungsbericht für kepler_dgl:


Line Iter. Reordering Optimizing / Special Exec.
Num. Var. Transformation Transformation Mode
74 a Scalar    
76 b FULL VECTOR    
         
82 a Scalar    
84 i Scalar    
87 b FULL VECTOR    
         
94 a Scalar    
97 b FULL VECTOR    
         
105 a Scalar    
108 b FULL VECTOR    
         
115 a FULL VECTOR    
         
124 i FULL VECTOR    
         
130 a Scalar    
132 i Scalar    
135 b Scalar    


Analyse:

Bemerkungen:

Version 2.8
Änderungen:

Meßergebnisse:


time(-O1): 93 .8s
time(-O2): 22 .3s
CXpa:


  CPU Time .CPU Time Times .Routine    
  (less children) .(plus children) Called .Name    
  20 .708 93 .0% 20 .723 93 .0% 3924 kepler_dgl
Analyse:

Bemerkungen:

Version 3.1
Änderungen:

Meßergebnisse:


time(-O2): 2 .7s
CXpa:


  CPU Time .CPU Time Times .Routine    
  (less children) .(plus children) Called .Name    
  2 .435 92 .7% 2 .437 92 .8% 495 kepler_dgl
Analyse:

Bemerkungen:

Version 3.2
Änderungen:

Meßergebnisse:


time(-O2): 0 .9s
CXpa:


  CPU Time .CPU Time Times .Routine    
  (less children) .(plus children) Called .Name    
  0 .787 79 .8% 0 .788 79 .9% 142 kepler_dgl
Analyse:

Bemerkungen:

Zusammenfaßung der Optimierungen:


Version time(-O2)/s Änderungen  
2.1 331 .7 Ausgangsversion
2.2 179 .3 pow-Funktion in kepler_dgl durch sqrt ersetzt
2.3 142 .2 Symmetrie, Vereinfachung der Schleifen in kepler_dgl
2.4 120 .9 Schleifenstruktur in kepler_dgl weiter vereinfacht
2.5 107 .7 Typ dmatrix und Makro INDEX eingeführt
2.6 88 .4 Vereinfachung der Schleifenstruktur in Z.71-84
2.7 65 .4 no_recurrence-Direktiven
2.8 22 .3 Vereinfachung der Schleifen in Z.130-135, Direktive
3.1 2 .7 integriere durch NAG-Routine D02BAF ersetzt
3.2 0 .9 NAG-Routine D02CAF statt D02BAF


previous    contents     next

Peter Junglas 18.10.1993