POISSON - zweidimensionale Potentialprobleme in FORTRAN

Das Programm POISSON dient zur Bestimmung des elektrostatischen Potentials bei vorgegebener Ladungsverteilung in zwei Dimensionen. Es basiert auf dem SOR-Verfahren (''Simultaneous Over-Relaxation''), das z.B. in den ''Numerical Recipes in C'' von Press, Flannery, Teukolsky und Vetterling beschrieben ist. Die dort beschriebene SOR-Routine wird - leicht abgewandelt - in POISSON benutzt.

Das Hauptprogramm steht in main.f, es arbeitet in folgender Weise:

Zunächst wird mit GETSRC die Größe der Ladungs-Matrix und die Ladungsverteilung selbst bestimmt. Zur Kontrolle und zur Weiterverwendung bei der späteren bildlichen Darstellung (''Visualisierung'') wird sie mit WRITEQ in ein File ausgegeben. Da die verwendete SOR-Routine wesentlich allgemeinere Gleichungen (nämlich beliebige elliptische partielle Differentialgleichungen) lösen kann, werden zunächst in der Routine POISSN die allgemeinen Koeffizienten speziell für die Poisson-Gleichung gesetzt. Mit UINIT wird eine willkührliche Anfangslösung (hier: Potential
U == 0) als Startwert für die Iterationen vorgegeben. Außerdem benötigt die SOR-Routine noch den Spektralradius RJAC, einen Parameter, der von der speziellen Form der Gleichung abhängt und der für die Poisson-Gleichung mit der Funktion SPECR bestimmt wird. Schließlich wird das SOR-Verfahren durchgeführt und die Lösung mit WRITEU ausgegeben.

Version 1.1
Änderungen:

Meßergebnisse:


time(-no): 469 .6s
time(-O0): 339 .8s
time(-O1): 242 .0s
time(-O2): 214 .9s
CXpa:


  CPU Time .CPU Time Times .Routine    
  (less children) .(plus children) Called .Name    
-O1: 233 .170 84 .9% 233 .170 84 .9% 1 sor
  0 .967 0 .4% 23 .761 8 .6% 1 writeu
  0 .798 0 .3% 17 .731 6 .5% 1 writeq
    .    .    .    .     
-O2: 198 .702 82 .7% 198 .702 82 .7% 1 sor
  0 .954 0 .4% 23 .338 9 .7% 1 writeu
  0 .790 0 .3% 18 .091 7 .5% 1 writeq
Optimierungsbericht für SOR:


Line Iter. Reordering Optimizing$/$Special Exec.
Num. Var. Transformation Transformation Mode
34 J FULL VECTOR Inter Reduction  
35 L Scalar    
         
48 J Scalar    
49 L 72% VECTOR Reduction  
         
43 IT Scalar Peel  
48 J Scalar    
49 L 72% VECTOR Reduction  
         
Line Iter. Analysis    
Num. Var.      
34 J Interchanged to innermost    
49 L Assign to U recurrence on 55    
43 IT Loop or inner loop has exit    
49 L Assign to U recurrence on 55    
         
Line Col. Test Analysis  
Num. Num. Transformation    
62 17 TEST REMOVED Peeled first iteration of loop on 43  
Analyse:

Bemerkungen:

Version 1.2
Änderungen:

Meßergebnisse:


time(-O2): 86 .4s
CXpa:


  CPU Time .CPU Time Times .Routine    
  (less children) .(plus children) Called .Name    
  73 .161 63 .9% 73 .161 63 .9% 1 sor
  1 .026 0 .9% 23 .356 20 .4% 1 writeu
  0 .790 0 .7% 17 .877 15 .6% 1 writeq
Analyse:

Bemerkungen:

Version 1.3
Änderungen:

Meßergebnisse:


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


  CPU Time .CPU Time Times .Routine    
  (less children) .(plus children) Called .Name    
  47 .953 66 .9% 47 .953 66 .9% 1 sor
  1 .132 1 .6% 23 .741 33 .1% 1 writeu
Analyse:

Bemerkungen:

Version 1.4
Änderungen:

Meßergebnisse:


time(-O2): 51 .3s
CXpa:


  CPU Time .CPU Time Times .Routine    
  (less children) .(plus children) Called .Name    
  48 .284 81 .3% 48 .284 81 .3% 1 sor
  0 .460 0 .8% 11 .059 18 .6% 1 writeu
Analyse:

Bemerkungen:

Version 1.5
Änderungen:

Meßergebnisse:


time(-O2): 38 .4s
CXpa:


  CPU Time .CPU Time Times .Routine    
  (less children) .(plus children) Called .Name    
  28 .210 70 .8% 28 .210 70 .8% 1 sor
  0 .377 0 .9% 11 .612 29 .1% 1 writeu
Analyse:

Bemerkungen:

Version 1.6
Änderungen:

Meßergebnisse:


time(-O2): 28 .0s
Analyse:

Bemerkungen:

Version 1.7
Änderungen:

Meßergebnisse:


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


  CPU Time .CPU Time Times .Routine    
  (less children) .(plus children) Called .Name    
  13 .833 55 .4% 13 .833 55 .4% 1 sor
  0 .379 1 .5% 11 .132 44 .6% 1 writeu
Analyse:

Bemerkungen:

Version 1.8
Änderungen:

Meßergebnisse:


time(-O2): 13 .8s
CXpa:


  CPU Time .CPU Time Times .Routine    
  (less children) .(plus children) Called .Name    
  13 .057 92 .4% 13 .057 92 .4% 1 sor
  0 .331 2 .3% 1 .065 7 .5% 1 writeu
Analyse:

Bemerkungen:

Version 1.9
Änderungen:

Meßergebnisse:


Zeit : 13 .8s
SOR : 13 .4s
WRITEU     : 0 .3s


zum Vergleich analoge Messung mit Version 1.7:

Zeit : 16 .7s
SOR : 13 .6s
WRITEU     : 3 .1s
Analyse:

Bemerkungen:

Parallelisierung
Änderungen:

Meßergebnisse:


time(-O3): 8 .9s real  19 .8s user  0 .2s system
CXpa:


Parallel Region Performance Analysis     . 
For sor.f:sor     . 
      . 
Line Num Exec Cpu Time Wall Clock Time .Process Virtual .CPU/PVT . 
Num   Time   .    . 
34 1 0 .002797 0 .001849 0 .001756 1 .59282
48 296 0 .023810 0 .039057 0 .021411 1 .11205
48 260184 20 .956636 84 .758220 19 .041363 1 .10058
Analyse:

Bemerkungen:

Zusammenfassung der Optimierungen:


Version time(-O2)/s Änderungen  
1.1 214 .9 Ausgangsversion
1.2 86 .4 Compiler-Direktive in sor.f eingefügt
1.3 54 .7 Schleifen in sor vereinfacht, writeq gestrichen
1.4 51 .3 Ausgabe durch implizite DO-Liste in writeu.f
1.5 38 .4 sor in xsor geändert
1.6 28 .0 Arraygröße von 300 auf 321 gesetzt
1.7 16 .7 Koeffizientenmatrizen in sor durch Konstanten ersetzt
1.8 13 .8 Ausgabe in writeu.f binär


Zum Vergleich: Zeiten der verschiedenen Versionen auf einer HP9000/720:

Version Optionen Zeit  
1.1 -A   1399 .3s
  -A +O3 666 .6s
1.2    
1.3 -A +O3 650 .4s
1.4    
1.5 -A +O3 469 .6s
1.6 -A +O3 464 .0s
1.7 -A +O3 167 .5s
1.8 -A +O3 165 .5s

previous    contents     next

Peter Junglas 18.10.1993