The TELEMAC-MASCARET system  trunk
gredelpts_autop.f
Go to the documentation of this file.
1 ! ***********************
2  PROGRAM gredelpts_autop
3 ! ***********************
4 !
5 !
6 !***********************************************************************
7 ! PARALLEL V6P2 21/08/2010
8 !***********************************************************************
9 !
10 !brief MERGES THE RESULTS OF A PARALLEL COMPUTATION (COUPLING
11 !+ WITH DELWAQ) TO WRITE A SINGLE FILE IN DELWAQ FORMAT.
12 !
13 !history JAJ
14 !+ 2001/2
15 !+
16 !+ SLIGHTLY CHANGED TO DEAL WITH:
17 !
18 !history HW, BAW-HAMBURG
19 !+ 20/02/2003
20 !+
21 !+ IMPROVED READING OF DATASETS
22 !
23 !history JAJ
24 !+ 14/03/2003
25 !+
26 !+ ADDED EXIT CODES
27 !
28 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
29 !+ 13/07/2010
30 !+ V6P0
31 !+ Translation of French comments within the FORTRAN sources into
32 !+ English comments
33 !
34 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
35 !+ 21/08/2010
36 !+ V6P0
37 !+ Creation of DOXYGEN tags for automated documentation and
38 !+ cross-referencing of the FORTRAN sources
39 !
40 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
41 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
42 !
44  IMPLICIT NONE
45 !
46  CHARACTER(LEN=30) GEO
47 !
48  INTEGER IPID,ERR,FU
49  INTEGER NELEM,ECKEN,NDUM,I,J,NBV1,NBV2,PARAM(10)
50  INTEGER NPLAN,NPOIN2,NPOIN2LOC,NPLANLOC
51  INTEGER NPROC,NRESU,NPOINMAX
52  INTEGER I_S, I_SP, I_LEN
53  INTEGER IT
54 !
55  INTEGER, DIMENSION(:) , ALLOCATABLE :: NPOIN,VERIF
56  INTEGER, DIMENSION(:,:), ALLOCATABLE :: KNOLG
57 !
58 !
59  REAL , DIMENSION(:) , ALLOCATABLE :: GLOBAL_VALUE
60  REAL , DIMENSION(:) , ALLOCATABLE :: LOCAL_VALUE
61 !
62  LOGICAL IS,ENDE
63 !
64  CHARACTER(LEN=30) RES
65  CHARACTER(LEN=50) RESPAR
66  CHARACTER(LEN=11) EXTENS
67  EXTERNAL extens
68  INTRINSIC maxval
69 !
70 !-------------------------------------------------------------------------
71 !
72  li=5
73  lu=6
74  lng=2
75 !HW
76 !JAJ INTRODUCE YOURSELF WITH THE RELEASE DATE
77 !
78  WRITE(lu,*) 'I AM GREDELPTS, COUSIN OF GRETEL FROM BAW HAMBURG'
79  WRITE(lu,*)
80 !
81 ! READS FILENAMES AND THE NUMBER OF PROCESSORS / PARTITIONS
82 !
83  WRITE (lu, advance='NO',
84  & fmt='(/,'' GLOBAL GEOMETRY FILE: '')')
85 ! REWIND(LI)
86  READ(li,*) geo
87  WRITE(lu,*) geo
88 !
89  WRITE (lu, advance='NO', fmt='(/,'' RESULT FILE: '')')
90  READ(li,*) res
91  WRITE(lu,*) res
92 !
93  WRITE (lu,advance='NO',fmt='(/,'' NUMBER OF PROCESSORS: '')')
94  READ (li,*) nproc
95  WRITE(lu,*) nproc
96 !
97  INQUIRE (file=geo,exist=is)
98  IF (.NOT.is) THEN
99  WRITE (lu,*) 'FILE DOES NOT EXIST: ', geo
100  CALL plante(1)
101  stop
102  END IF
103 !
104  i_s = len(res)
105  i_sp = i_s + 1
106  DO i=1,i_s
107  IF(res(i_sp-i:i_sp-i) .NE. ' ') EXIT
108  ENDDO
109  i_len=i_sp - i
110 !
111 ! GEOMETRY FILE, READ UNTIL 10 PARAMETERS:
112 !
113  OPEN(2,file=geo,form='UNFORMATTED',status='OLD',err=990)
114  READ(2,err=990)
115  READ(2,err=990) nbv1,nbv2
116  DO i=1,nbv1+nbv2
117  READ(2,err=990)
118  ENDDO ! I
119  GO TO 992
120 990 WRITE(lu,*) 'ERROR WHEN OPENING OR READING FILE: ',geo
121  CALL plante(1)
122  stop
123 992 CONTINUE
124 ! READS THE 10 PARAMETERS AND THE DATE
125  READ(2) (param(i),i=1,10)
126  IF(param(10).EQ.1) READ(2) (param(i),i=1,6)
127 !
128 ! RESULTS FILE:
129 !
130  OPEN(3,file=res,form='UNFORMATTED',err=991)
131  GO TO 993
132 991 WRITE(lu,*) 'ERROR WHEN OPENING FILE: ',res
133  CALL plante(1)
134  stop
135 993 CONTINUE
136 !
137 ! 1) READS THE BEGINNING OF THE FIRST RESULTS FILE
138 !
139 !CC RESPAR=RES // EXTENS(2**IDIMS-1,0)
140 !
141  respar=res(1:i_len) // extens(nproc-1,0)
142 !
143  INQUIRE (file=respar,exist=is)
144  IF (.NOT.is) THEN
145  WRITE (lu,*) 'FILE DOES NOT EXIST: ', respar
146  WRITE (lu,*) 'CHECK THE NUMBER OF PROCESSORS'
147  WRITE (lu,*) 'AND THE RESULT FILE CORE NAME'
148  CALL plante(1)
149  stop
150  END IF
151 !
152  OPEN(4,file=respar,form='UNFORMATTED',err=994)
153  GO TO 995
154 994 WRITE(lu,*) 'ERROR WHEN OPENING FILE: ',respar
155  CALL plante(1)
156  stop
157 995 CONTINUE
158 !
159  READ(4) npoin2
160  READ(4) nplan
161  IF(nplan.EQ.1) nplan = 0
162 !
163  CLOSE(4)
164 !
165 ! 5 : 4 PARAMETERS
166 !
167  READ(2) nelem,npoin2,ecken,ndum
168  WRITE(lu,*) '4 PARAMETERS IN GEOMETRY FILE'
169  WRITE(lu,*) 'NELEM=', nelem
170  WRITE(lu,*) 'NPOIN2=', npoin2
171  WRITE(lu,*) 'ECKEN=', ecken
172  WRITE(lu,*) 'NDUM=', ndum
173 !
174 ! DYNAMICALLY ALLOCATES THE ARRAYS
175 !
176  ALLOCATE(npoin(nproc),stat=err)
177  CALL check_allocate(err, 'NPOIN')
178  IF(nplan.EQ.0) THEN
179  ALLOCATE(verif(npoin2) ,stat=err)
180  ELSE
181  ALLOCATE(verif(npoin2*nplan) ,stat=err)
182  ENDIF
183  CALL check_allocate(err, 'VERIF')
184 ! GLOBAL_VALUES, STORES THE WHOLE DATASET (NBV1-VALUES)
185  IF(nplan.EQ.0) THEN
186  ALLOCATE(global_value(npoin2) ,stat=err)
187  ELSE
188  ALLOCATE(global_value(npoin2*nplan) ,stat=err)
189  ENDIF
190  CALL check_allocate(err, 'GLOBAL_VALUE')
191 !
192 ! END OF ALLOCATION ...
193 !
194 !------------------------------------------------------------------------------
195 !
196 ! OPENS FILES AND READS/SKIPS HEADERS -> NPOIN(NPROC), NPOINMAX
197 !
198  DO ipid = 0,nproc-1
199  fu = ipid +10
200  respar=res(1:i_len) // extens(nproc-1,ipid)
201  OPEN (fu,file=respar,form='UNFORMATTED',err=998)
202  GO TO 999
203 998 WRITE(lu,*) 'ERROR WHEN OPENING FILE: ',respar,
204  & ' USING FILE UNIT: ', fu
205  CALL plante(1)
206  stop
207 999 rewind(fu)
208  READ(fu) npoin(ipid+1)
209  READ(fu) nplanloc
210  END DO
211 !
212  npoinmax = maxval(npoin)
213 ! ARRAY FOR LOCAL-GLOBAL NUMBERS, 2D-FIELD
214  IF(nplan.EQ.0) THEN
215  ALLOCATE (knolg(npoinmax,nproc),stat=err)
216  ELSE
217  ALLOCATE (knolg(npoinmax/nplan,nproc),stat=err)
218  ENDIF
219  CALL check_allocate(err, 'KNOLG')
220 ! LOCAL_VALUES, STORES THE WHOLE DATASET (NBV1-VALUES)
221  ALLOCATE(local_value(npoinmax),stat=err)
222  CALL check_allocate(err, 'LOCAL_VALUE')
223 !
224 ! READS KNOLG(NPOIN,NPROC)
225 !
226  DO ipid = 0,nproc-1
227  fu = ipid +10
228  IF(nplan.EQ.0) THEN
229  READ(fu) (knolg(i,ipid+1),i=1,npoin(ipid+1))
230  ELSE
231  READ(fu) (knolg(i,ipid+1),i=1,npoin(ipid+1)/nplan)
232  ENDIF
233  END DO
234 !
235 ! READS DATASETS
236 !
237  nresu = 0
238 !
239 2000 nresu = nresu + 1
240 !
241  IF(nplan.EQ.0) THEN
242  DO i=1,npoin2
243  verif(i)=0
244  ENDDO
245  ELSE
246  DO i=1,npoin2*nplan
247  verif(i)=0
248  ENDDO
249  ENDIF
250 !
251  WRITE(lu,*)'TRY TO READ DATASET NO.',nresu
252 !
253  DO ipid = 0,nproc-1
254  fu = ipid +10
256  & (local_value,npoinmax,npoin(ipid+1),it,fu,ende)
257  IF (ende) GOTO 3000
258 ! STORES EACH DATASET
259  IF(nplan.EQ.0) THEN
260  DO i=1,npoin(ipid+1)
261  global_value(knolg(i,ipid+1)) = local_value(i)
262  verif(knolg(i,ipid+1)) = 1
263  END DO
264  ELSE
265  npoin2loc = npoin(ipid+1)/nplan
266  DO i=1,npoin2loc
267  DO j=1,nplan
268  global_value(knolg(i,ipid+1) + npoin2 *(j-1)) =
269  & local_value( i + npoin2loc*(j-1))
270  verif(knolg(i,ipid+1) + npoin2 *(j-1)) = 1
271  END DO
272  END DO
273  ENDIF
274  END DO
275 ! WRITES GLOBAL DATASET
276  WRITE(lu,*)'WRITING DATASET NO.',nresu,' TIME =',it
277 !
278  IF(nplan.EQ.0) THEN
279  WRITE(3) it, (global_value(i),i=1,npoin2)
280  ELSE
281  WRITE(3) it, (global_value(i),i=1,npoin2*nplan)
282  ENDIF
283 ! CHECKS ...
284  IF(nplan.EQ.0) THEN
285  DO i=1,npoin2
286  IF(verif(i).EQ.0) THEN
287  WRITE(lu,*) 'ERROR, POINT I=',i,' FALSE FOR NRESU=',nresu
288  ENDIF
289  END DO
290  ELSE
291  DO i=1,npoin2*nplan
292  IF(verif(i).EQ.0) THEN
293  WRITE(lu,*) 'ERROR, POINT I=',i,' FALSE FOR NRESU=',nresu
294  ENDIF
295  END DO
296  ENDIF
297 !
298  GO TO 2000
299 !
300 3000 WRITE(lu,*) 'END OF PROGRAM, ',nresu-1,' DATASETS FOUND'
301 !
302  CLOSE(2)
303  CLOSE(3)
304 !
305  DO ipid = 0,nproc-1
306  fu = ipid +10
307  CLOSE (fu)
308  END DO
309 !
310  stop 0
311  END PROGRAM gredelpts_autop
program gredelpts_autop
subroutine gredelpts_read_dataset(LOCAL_VALUE, NPOINMAX, NPOIN, IT, FU, ENDE)