source: palm/trunk/UTIL/check_pegrid.f90 @ 1046

Last change on this file since 1046 was 1046, checked in by maronga, 11 years ago

put scripts and utilities under GPL

  • Property svn:keywords set to Id
File size: 5.3 KB
Line 
1 PROGRAM check_pegrid
2
3!--------------------------------------------------------------------------------!
4! This file is part of PALM.
5!
6! PALM is free software: you can redistribute it and/or modify it under the terms
7! of the GNU General Public License as published by the Free Software Foundation,
8! either version 3 of the License, or (at your option) any later version.
9!
10! PALM is distributed in the hope that it will be useful, but WITHOUT ANY
11! WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12! A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
13!
14! You should have received a copy of the GNU General Public License along with
15! PALM. If not, see <http://www.gnu.org/licenses/>.
16!
17! Copyright 1997-2012  Leibniz University Hannover
18!--------------------------------------------------------------------------------!
19!
20! Current revisions:
21! -----------------
22! code put under GPL (PALM 3.9)
23!
24! Former revisions:
25! -----------------
26! $Id: check_pegrid.f90 1046 2012-11-09 14:38:45Z maronga $
27!
28!
29! Description:
30! -------------
31! Ueberpruefung der Konsistenz von Prozessortopologie und gewaehlten Feldgrenzen
32!-------------------------------------------------------------------------------!
33
34    IMPLICIT NONE
35
36    CHARACTER (LEN=1) ::  char = ''
37    INTEGER ::  i, j, k, maximum_grid_level, mg_levels_x, mg_levels_y,        &
38                mg_levels_z, numprocs, numproc_sqr, nx, nxanz, ny, nyanz, nz, &
39                pdims(2)
40
41!
42!-- Prozessoranzahl abfragen
43    PRINT*, '*** Anzahl der verfuegbaren PE''s:'
44    READ (*,*)  numprocs
45
46!
47!-- Prozessortopologie bestimmen
48    numproc_sqr = SQRT( REAL( numprocs ) )
49    pdims(1)    = MAX( numproc_sqr , 1 )
50    DO  WHILE ( MOD( numprocs , pdims(1) ) /= 0 )
51       pdims(1) = pdims(1) - 1
52    ENDDO
53    pdims(2) = numprocs / pdims(1)
54
55!
56!-- Prozessortopologie ausgeben
57    PRINT*, ' '
58    PRINT*, '*** berechnetes Prozessorgitter: (',pdims(1),',',pdims(2),')'
59
60!
61!-- Evtl. Uebersteuerung der Prozessortopologie durch den Benutzer
62    PRINT*, ' '
63    PRINT*, '*** soll dieses Prozessorgitter benutzt werden? (y/n/<return>=y)'
64    READ (*,'(A1)')  char
65    IF ( char /= 'y'  .AND.  char /= 'Y'  .AND.  char /= '' )  THEN
66       DO
67          PRINT*, ' '
68          PRINT*, '*** Bitte Prozessoranzahl in x- und y-Richtung angeben:'
69          READ (*,*)  pdims(1), pdims(2)
70          IF ( pdims(1)*pdims(2) == numprocs )  EXIT
71          PRINT*, '+++ berechnete Prozessoranzahl (', pdims(1)*pdims(2), &
72                  ') stimmt nicht mit vorgegebener Anzahl'
73          PRINT*, '    (', numprocs, ') ueberein!'
74       ENDDO
75    ENDIF
76
77!
78!-- Gitterpunktanzahl abfragen
79    PRINT*, ' '
80    PRINT*, ' '
81    PRINT*, '*** bitte nx, ny und nz angeben:'
82    READ (*,*)  nx, ny, nz
83
84!
85!-- Pruefung, ob sich Gitterpunkte in x-Richtung glatt aufteilen lassen
86    IF ( MOD( nx+1 , pdims(1) ) /= 0 )  THEN
87       PRINT*,'+++ x-Richtung:  Gitterpunktanzahl (',nx+1,') ist kein ganz-'
88       PRINT*,'                 zahliges Vielfaches der Prozessoranzahl (',&
89                                &pdims(1),')'
90       STOP
91    ELSE
92       nxanz  = ( nx + 1 ) / pdims(1)
93    ENDIF
94
95!
96!-- Pruefung, ob sich Gitterpunkte in y-Richtung glatt aufteilen lassen
97    IF ( MOD( ny+1 , pdims(2) ) /= 0 )  THEN
98       PRINT*,'+++ y-Richtung:  Gitterpunktanzahl (',ny+1,') ist kein ganz-'
99       PRINT*,'                 zahliges Vielfaches der Prozessoranzahl (',&
100                                &pdims(2),')'
101       STOP
102    ELSE
103       nyanz  = ( ny + 1 ) / pdims(2)
104    ENDIF
105
106    PRINT*, ''
107    PRINT*, '*** Anzahl der Gitterpunkte in x- und y-Richtung je PE: (', &
108            nxanz,',',nyanz,')'
109
110!
111!-- Pruefen der Gitterpunktanzahl bzgl. Transposition
112    IF ( MOD( nz , pdims(1) ) /= 0 )  THEN
113       PRINT*,'+++ Transposition z --> x:'
114       PRINT*,'    nz=',nz,' ist kein ganzzahliges Vielfaches von pdims(1)=', &
115              &pdims(1)
116       PRINT*, ''
117       STOP
118    ENDIF
119    IF ( MOD( nx+1 , pdims(2) ) /= 0 )  THEN
120       PRINT*,'+++ Transposition x --> y:'
121       PRINT*,'    nx+1=',nx+1,' ist kein ganzzahliges Vielfaches von ',&
122              &'pdims(2)=',pdims(2)
123       PRINT*, ''
124       STOP
125    ENDIF
126    IF ( MOD( ny+1 , pdims(1) ) /= 0 )  THEN
127       PRINT*,'+++ Transposition y --> z:'
128       PRINT*,'    ny+1=',ny+1,' ist kein ganzzahliges Vielfaches von ',&
129              &'pdims(1)=',pdims(1)
130       PRINT*, ''
131       STOP
132    ENDIF
133
134!
135!-- Moegliche Anzahl von Gitterniveaus im Falle der Benutzung des
136!-- Mehrgitterverfahrens berechnen und die Gitterpunktanzahl des groebsten
137!-- Gitters ausgeben
138    mg_levels_x = 1
139    mg_levels_y = 1
140    mg_levels_z = 1
141
142    i = nxanz
143    DO WHILE ( MOD( i, 2 ) == 0  .AND.  i /= 2 )
144       i = i / 2
145       mg_levels_x = mg_levels_x + 1
146    ENDDO
147
148    j = nyanz
149    DO WHILE ( MOD( j, 2 ) == 0  .AND.  j /= 2 )
150       j = j / 2
151       mg_levels_y = mg_levels_y + 1
152    ENDDO
153
154    k = nz
155    DO WHILE ( MOD( k, 2 ) == 0  .AND.  k /= 2 )
156       k = k / 2
157       mg_levels_z = mg_levels_z + 1
158    ENDDO
159
160    maximum_grid_level = MIN( mg_levels_x, mg_levels_y, mg_levels_z )
161    i = nxanz / 2**(maximum_grid_level-1) 
162    j = nyanz / 2**(maximum_grid_level-1)
163    k = nz    / 2**(maximum_grid_level-1)
164
165    PRINT*, '    Anzahl der moeglichen Gitterniveaus: ', maximum_grid_level
166    PRINT*, '    Anz. Gitterpunkte auf groebstem Gitter (x,y,z): (', i, ',', &
167                 j,',',k,')'
168    PRINT*, ''
169
170 END PROGRAM check_pegrid
Note: See TracBrowser for help on using the repository browser.