source: palm/trunk/UTIL/compare_palm_logs.f90 @ 920

Last change on this file since 920 was 480, checked in by raasch, 12 years ago

compare_palm_logs is now part of compiled utilities; slight change of using compare_palm_logs

File size: 10.2 KB
Line 
1 PROGRAM compare_palm_logs
2
3!------------------------------------------------------------------------------!
4! Actual revisions:
5! -----------------
6! name of data-directories are read from input
7!
8! Former revisions:
9! -----------------
10!
11! Description:
12! ------------
13! This routine compares the log files from two different PALM runs.
14!
15! This routine must be compiled with:
16! decalpha:
17!    f95 -cpp -fast -r8
18! IBM-Regatta:
19!    xlf95 -qsuffix=cpp=f90 -qrealsize=8 -q64 -qmaxmem=-1 -Q -O3
20! IMUK:
21!    ifort compare...f90 -o compare...x
22!    -cpp -axW -r8 -nbs -Vaxlib
23! NEC-SX6:
24!    sxf90 compare...f90 -o compare...x
25!    -C hopt -Wf '-A idbl4'
26!------------------------------------------------------------------------------!
27
28    IMPLICIT NONE
29
30!
31!-- Local variables
32    CHARACTER (LEN=5) ::  id_char
33    CHARACTER (LEN=80), DIMENSION(2)  ::  directory, log_message
34    CHARACTER (LEN=100), DIMENSION(2) ::  filename
35
36    INTEGER ::  count=0, i, id, i1(2), i2(2), j, j1(2), j2(2), k, k1(2), k2(2), &
37                n_err, n_files(2)
38
39    LOGICAL ::  found
40
41    REAL    ::  simtime(2)
42
43    INTEGER, DIMENSION(:,:),   ALLOCATABLE ::  array_2d_i_1, array_2d_i_2
44
45    REAL, DIMENSION(:,:),   ALLOCATABLE ::  array_2d_1, array_2d_2
46    REAL, DIMENSION(:,:,:), ALLOCATABLE ::  array_1, array_2
47
48
49!
50!-- Read the two data-directories to be compared
51    PRINT*, '*** please enter name of first data-directory:'
52    READ ( *, * )  directory(1)
53    directory(1) = TRIM( directory(1) ) // '/'
54
55    PRINT*, '*** please enter name of second data-directory:'
56    READ ( *, * )  directory(2)
57    directory(2) = TRIM( directory(2) ) // '/'
58
59!
60!-- Check, if file from PE0 exists on directory 1. Stop, if it does not exist.
61    n_files(1) = 0
62
63    WRITE (id_char,'(''_'',I4.4)')  n_files(1)
64    INQUIRE ( FILE=TRIM( directory(1) )//id_char, EXIST=found )
65!
66!-- Find out the number of files (equal to the number of PEs which
67!-- have been used in PALM) and open them
68    DO  WHILE ( found )
69
70       OPEN ( n_files(1)+100, FILE=TRIM( directory(1) )//id_char, &
71              FORM='UNFORMATTED' )
72       n_files(1) = n_files(1) + 1
73       WRITE (id_char,'(''_'',I4.4)')  n_files(1)
74       INQUIRE ( FILE=TRIM( directory(1) )//id_char, EXIST=found )
75
76    ENDDO
77
78    IF ( n_files(1) == 0 )  THEN
79       PRINT*, '+++ no file _0000 in directory "', TRIM( directory(1) ), '"'
80       STOP
81    ELSE
82       PRINT*, '*** directory "', TRIM( directory(1) ), '": ', n_files(1), &
83               ' files found'
84    ENDIF
85
86!
87!-- Same for the second directory
88    n_files(2) = 0
89
90    WRITE (id_char,'(''_'',I4.4)')  n_files(2)
91    INQUIRE ( FILE=TRIM( directory(2) )//id_char, EXIST=found )
92
93    DO  WHILE ( found )
94
95       OPEN ( n_files(2)+200, FILE=TRIM( directory(2) )//id_char, &
96              FORM='UNFORMATTED' )
97       n_files(2) = n_files(2) + 1
98       WRITE (id_char,'(''_'',I4.4)')  n_files(2)
99       INQUIRE ( FILE=TRIM( directory(2) )//id_char, EXIST=found )
100
101    ENDDO
102
103!
104!-- Number of files must be identical
105    IF ( n_files(1) /= n_files(2) )  THEN
106       PRINT*, '+++ file number mismatch'
107       PRINT*, '    ', TRIM( directory(1) ), ': ', n_files(1), ' files'
108       PRINT*, '    ', TRIM( directory(2) ), ': ', n_files(2), ' files'
109       STOP
110    ENDIF
111
112!
113!-- Compare the data file by file
114    DO  id = 0, n_files(1)-1
115
116       count = 0
117
118       WRITE (filename(1),'(A,''_'',I4.4)')  TRIM( directory(1) ), id
119       WRITE (filename(2),'(A,''_'',I4.4)')  TRIM( directory(2) ), id
120
121       PRINT*, '*** comparing files "', TRIM( filename(1) ),'" "', &
122               TRIM( filename(2) ), '"'
123       DO
124          PRINT*,' '
125          READ ( id+100, END=100 )  log_message(1)
126          PRINT*,'    --- ', TRIM( log_message(1) )
127          READ ( id+200, END=900 )  log_message(2)
128
129          IF ( TRIM( log_message(1) ) /= TRIM( log_message(2) ) )  THEN
130             PRINT*,'    +++ log message on file 2 does not match:'
131             PRINT*,'        ', TRIM( log_message(2) )
132          ENDIF
133
134          count = count + 1
135          IF ( log_message(1)(1:2) == '3d' )  THEN
136             PRINT*,'    *** reading 3d array'
137             READ ( id+100, END=901 )  simtime(1), i1(1), i2(1), j1(1), j2(1), &
138                                       k1(1), k2(1)
139             PRINT*,'        time=', simtime(1)
140             PRINT*,'        array size=(',i1(1),':',i2(1), &
141                                       ',',j1(1),':',j2(1),',',k1(1),':',k2(1),')'
142             READ ( id+200, END=902 )  simtime(2), i1(2), i2(2), j1(2), j2(2), &
143                                       k1(2), k2(2)
144             IF ( simtime(1) /= simtime(2) .OR. i1(1) /= i1(2) .OR. &
145                  i2(1) /= i2(2) .OR. j1(1) /= j1(2) .OR. j2(1) /= j2(2) .OR. &
146                  k1(1) /= k1(2) .OR. k2(1) /= k2(2) )  THEN
147                PRINT*,'    +++ time/indices on file 2 does not match:'
148                PRINT*,'        time=', simtime(2)
149                PRINT*,'        array size=(',i1(2),':', &
150                                i2(2), ',',j1(2),':',j2(2),',',k1(2),':',k2(2),')'
151                STOP
152             ENDIF
153
154             ALLOCATE( array_1(i1(1):i2(1),j1(1):j2(1),k1(1):k2(1)), &
155                       array_2(i1(2):i2(2),j1(2):j2(2),k1(2):k2(2)) )
156
157             READ ( id+100, END=903 )  array_1
158             READ ( id+200, END=904 )  array_2
159
160             n_err = 0
161loop:        DO  k = k1(1), k2(1)
162loop1:           DO  j = j1(1), j2(1)
163                   DO  i = i1(1), i2(1)
164                      IF ( array_1(i,j,k) /= array_2(i,j,k) )  THEN
165                         PRINT*,'+++ data mismatch on element (',i,',',j,',',k,')'
166                         PRINT*,'    array_1: ', array_1(i,j,k)
167                         PRINT*,'    array_2: ', array_2(i,j,k)
168                         n_err = n_err + 1
169                         IF ( n_err > 5 )  EXIT loop
170                      ENDIF
171                   ENDDO
172                ENDDO loop1
173             ENDDO loop
174
175             DEALLOCATE( array_1, array_2 )
176
177          ELSEIF ( log_message(1)(1:2) == '2d' )  THEN
178             PRINT*,'    *** reading 2d array'
179             READ ( id+100, END=901 )  simtime(1), i1(1), i2(1), j1(1), j2(1)
180             PRINT*,'        time=', simtime(1)
181             PRINT*,'        array size=(',i1(1),':',i2(1), &
182                                       ',',j1(1),':',j2(1),')'
183             READ ( id+200, END=902 )  simtime(2), i1(2), i2(2), j1(2), j2(2)
184             IF ( simtime(1) /= simtime(2) .OR. i1(1) /= i1(2) .OR. &
185                  i2(1) /= i2(2) .OR. j1(1) /= j1(2) .OR. j2(1) /= j2(2) )  THEN
186                PRINT*,'    +++ time/indices on file 2 does not match:'
187                PRINT*,'        time=', simtime(2)
188                PRINT*,'        array size=(',i1(2),':', &
189                                i2(2), ',',j1(2),':',j2(2),')'
190             ENDIF
191
192             ALLOCATE( array_2d_1(i1(1):i2(1),j1(1):j2(1)), &
193                       array_2d_2(i1(2):i2(2),j1(2):j2(2)) )
194
195             READ ( id+100, END=903 )  array_2d_1
196             READ ( id+200, END=904 )  array_2d_2
197
198             IF ( i1(1) /= i1(2) )  i1(1) = i1(2)
199             IF ( i2(1) /= i2(2) )  i2(1) = i2(2)
200             IF ( j1(1) /= j1(2) )  j1(1) = j1(2)
201             IF ( j2(1) /= j2(2) )  j2(1) = j2(2)
202
203             n_err = 0
204loop2:       DO  j = j1(1), j2(1)
205                DO  i = i1(1), i2(1)
206                   IF ( array_2d_1(i,j) /= array_2d_2(i,j) )  THEN
207                      PRINT*,'+++ data mismatch on element (',i,',',j,')'
208                      PRINT*,'    array_1: ', array_2d_1(i,j)
209                      PRINT*,'    array_2: ', array_2d_2(i,j)
210                      n_err = n_err + 1
211                      IF ( n_err > 5 )  EXIT loop2
212                   ENDIF
213                ENDDO
214             ENDDO loop2
215
216             DEALLOCATE( array_2d_1, array_2d_2 )
217
218          ELSE
219             PRINT*,'    *** reading 2d int array'
220             READ ( id+100, END=901 )  simtime(1), i1(1), i2(1), j1(1), j2(1)
221             PRINT*,'        time=', simtime(1)
222             PRINT*,'        array size=(',i1(1),':',i2(1), &
223                                       ',',j1(1),':',j2(1),')'
224             READ ( id+200, END=902 )  simtime(2), i1(2), i2(2), j1(2), j2(2)
225             IF ( simtime(1) /= simtime(2) .OR. i1(1) /= i1(2) .OR. &
226                  i2(1) /= i2(2) .OR. j1(1) /= j1(2) .OR. j2(1) /= j2(2) )  THEN
227                PRINT*,'    +++ time/indices on file 2 does not match:'
228                PRINT*,'        time=', simtime(2)
229                PRINT*,'        array size=(',i1(2),':', &
230                                i2(2), ',',j1(2),':',j2(2),')'
231             ENDIF
232
233             ALLOCATE( array_2d_i_1(i1(1):i2(1),j1(1):j2(1)), &
234                       array_2d_i_2(i1(2):i2(2),j1(2):j2(2)) )
235
236             READ ( id+100, END=903 )  array_2d_i_1
237             READ ( id+200, END=904 )  array_2d_i_2
238
239             IF ( i1(1) /= i1(2) )  i1(1) = i1(2)
240             IF ( i2(1) /= i2(2) )  i2(1) = i2(2)
241             IF ( j1(1) /= j1(2) )  j1(1) = j1(2)
242             IF ( j2(1) /= j2(2) )  j2(1) = j2(2)
243
244             n_err = 0
245loop3:       DO  j = j1(1), j2(1)
246                DO  i = i1(1), i2(1)
247                   IF ( array_2d_i_1(i,j) /= array_2d_i_2(i,j) )  THEN
248                      PRINT*,'+++ data mismatch on element (',i,',',j,')'
249                      PRINT*,'    array_1: ', array_2d_i_1(i,j)
250                      PRINT*,'    array_2: ', array_2d_i_2(i,j)
251                      n_err = n_err + 1
252                      IF ( n_err > 5 )  EXIT loop3
253                   ENDIF
254                ENDDO
255             ENDDO loop3
256
257             DEALLOCATE( array_2d_i_1, array_2d_i_2 )
258
259          ENDIF
260
261!          IF ( count > 8 )  STOP
262       ENDDO
263
264100    PRINT*, '*** end of data on file "', TRIM( filename(1) ), '"'
265       PRINT*, '*** files seem to be identical'
266       PRINT*, ' '
267    ENDDO
268
269    STOP
270
271900 PRINT*,'+++ unexpected end on file "', TRIM( filename(2) ), '"'
272    STOP
273901 PRINT*,'+++ unexpected end on file "', TRIM( filename(1) ), '"'
274    PRINT*,'    while reading indices'
275    STOP
276902 PRINT*,'+++ unexpected end on file "', TRIM( filename(2) ), '"'
277    PRINT*,'    while reading indices'
278    STOP
279903 PRINT*,'+++ unexpected end on file "', TRIM( filename(1) ), '"'
280    PRINT*,'    while reading array data'
281    STOP
282904 PRINT*,'+++ unexpected end on file "', TRIM( filename(2) ), '"'
283    PRINT*,'    while reading array data'
284    STOP
285
286 END PROGRAM compare_palm_logs
287
288
289
Note: See TracBrowser for help on using the repository browser.