The TELEMAC-MASCARET system  trunk
merge_data.f
Go to the documentation of this file.
1 ! *********************
2  SUBROUTINE merge_data
3 ! *********************
4  &(npoin_res, nvar_res, ntimestep_res, nproc, resformat, nres,
5  & typ_elem, textelu, res, ndim, nplan_res, npoin_geo, method)
6 !
7 !
8 !***********************************************************************
9 ! PARALLEL V6P2 21/08/2010
10 !***********************************************************************
11 !
12 !brief MERGES THE RESULTS OF A PARALLEL COMPUTATION
13 !+ TO WRITE A SINGLE FILE IN A GIVEN FORMAT.
14 !
15 !
16 !history Y. Audouin
17 !+ 02/09/2014
18 !+
19 !+ Creation of the file
20 !+ This version of gretel now handles multiple format and has a better
21 !+ memory organisation
22 !+ It also uses the hermes module for I/O
23 !
24 !
25 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
33 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
34 !
37 !
38  IMPLICIT NONE
39 !
40 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
41 !
42  INTEGER, INTENT(IN) :: NPOIN_RES, NPOIN_GEO, NVAR_RES
43  INTEGER, INTENT(IN) :: NPLAN_RES, NTIMESTEP_RES, NPROC
44  CHARACTER(LEN=8), INTENT(INOUT) :: RESFORMAT
45  INTEGER, INTENT(IN) :: NRES, NDIM
46  INTEGER, INTENT(IN) :: TYP_ELEM
47  CHARACTER(LEN=32), INTENT(IN) :: TEXTELU(nvar_res)
48  CHARACTER(LEN=PATH_LEN), INTENT(IN) :: RES
49  INTEGER, INTENT(IN) :: METHOD
50 !
51 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
52 !
53  INTEGER :: I, J, IERR, IVAR
54  INTEGER :: ITIME, IPID
55  INTEGER NRESPAR
56  INTEGER NPOIN_PAR
57  INTEGER, DIMENSION(:), ALLOCATABLE :: KNOLG
58  DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE :: TMP
59  DOUBLE PRECISION AT
60  CHARACTER(LEN=16) :: VARNAME
61  DOUBLE PRECISION, DIMENSION(:,:), ALLOCATABLE :: RESDATA
62  DOUBLE PRECISION, DIMENSION(:,:,:), ALLOCATABLE :: RESDATA2
63  DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE :: TIMES
64  CHARACTER(LEN=PATH_LEN) :: RESPAR
65  CHARACTER(LEN=11) EXTENS
66  EXTERNAL extens
67 
68  IF(method.EQ.1) THEN
69  ALLOCATE(resdata(npoin_res,nvar_res),stat=ierr)
70  CALL check_allocate(ierr,'GRETEL:RESDATE')
71  ! LOOP ON ALL THE PARTITIONNED FILES
72  DO itime=0,ntimestep_res-1
73  DO ipid = 0, nproc-1
74 !
75  respar = trim(res) // extens(nproc-1,ipid)
76  CALL open_mesh(resformat,respar,nrespar,'READ ',ierr)
77  CALL check_call(ierr,"GRETEL:OPEN_MESH:RESPAR2")
78 !
79  CALL get_mesh_npoin(resformat,nrespar,typ_elem,
80  & npoin_par,ierr)
81  CALL check_call(ierr,"GRETEL:GET_MESH_NPOIN:RESPAR")
82 !
83  ALLOCATE(knolg(npoin_par),stat=ierr)
84  CALL check_allocate(ierr,'GRETEL:KNOLG')
85  ALLOCATE(tmp(npoin_par),stat=ierr)
86  CALL check_allocate(ierr,'GRETEL:TMP')
87  ! GET THE TIME OF THE TIMSTEP
88  IF(ipid.EQ.0) THEN
89  CALL get_data_time(resformat,nrespar,itime,at,ierr)
90  CALL check_call(ierr,'GRETEL:GET_DATA_TIME:RESPAR')
91  ENDIF
92 !
93  CALL get_mesh_l2g_numbering(resformat,nrespar,knolg,
94  & npoin_par,ierr)
95  CALL check_call(ierr,'GRETEL:GET_MESH_L2G_NUMBERING:RESPAR')
96 !
97  ! LOOP ON ALL THE VARIABLE FOR THE TIMESTEP ITIME
98  DO ivar=1,nvar_res
99  varname = textelu(ivar)(1:16)
100  CALL get_data_value(resformat,nrespar,itime,
101  & varname,tmp,
102  & npoin_par,ierr)
103  CALL check_call(ierr,'GRETEL:GET_DATA_VALUE')
104  IF(ndim.EQ.2) THEN
105  ! 2D
106  DO i=1,npoin_par
107  resdata(knolg(i),ivar) = tmp(i)
108  ENDDO
109  ELSE
110  ! 3D
111  DO i=1,npoin_par/nplan_res
112  DO j=1,nplan_res
113  resdata(knolg(i) + (j-1)*npoin_geo, ivar) =
114  & tmp(i + (j-1)*npoin_par/nplan_res)
115  ENDDO
116  ENDDO
117  ENDIF
118  ENDDO ! IVAR
119  CALL close_mesh(resformat,nrespar,ierr)
120  CALL check_call(ierr,'GRETEL:CLOSEMESH:RESPAR')
121  DEALLOCATE(tmp)
122  DEALLOCATE(knolg)
123  ENDDO ! IPID
124  ! WRITING TIME STEP
125  WRITE(lu,*)'WRITING DATASET NO.',itime,' TIME =',REAL(at)
126  !
127  DO i=1,nvar_res
128  CALL add_data(resformat,nres,textelu(i),at,itime,i.EQ.1,
129  & resdata(:,i),npoin_res,ierr)
130  CALL check_call(ierr,'GRETEL:ADD_DATA:RES')
131  ENDDO
132 
133  ENDDO ! ITIME
134  DEALLOCATE(resdata)
135  ELSEIF (method.EQ.2) THEN
136  ALLOCATE(resdata2(npoin_res,nvar_res,ntimestep_res),stat=ierr)
137  CALL check_allocate(ierr,'GRETEL:RESDATA2')
138  ALLOCATE(times(ntimestep_res),stat=ierr)
139  CALL check_allocate(ierr,'GRETEL:times')
140  ! LOOP ON ALL THE PARTITIONNED FILES
141  DO ipid = 0, nproc-1
142 !
143  respar = trim(res) // extens(nproc-1,ipid)
144  CALL open_mesh(resformat,respar,nrespar,'READ ',ierr)
145  CALL check_call(ierr,"GRETEL:OPEN_MESH:RESPAR2")
146 !
147  CALL get_mesh_npoin(resformat,nrespar,typ_elem,
148  & npoin_par,ierr)
149  CALL check_call(ierr,"GRETEL:GET_MESH_NPOIN:RESPAR")
150 !
151  ALLOCATE(knolg(npoin_par),stat=ierr)
152  CALL check_allocate(ierr,'GRETEL:KNOLG')
153  ALLOCATE(tmp(npoin_par),stat=ierr)
154  CALL check_allocate(ierr,'GRETEL:TMP')
155  ! GET THE TIME OF THE TIMSTEP
156 !
157  CALL get_mesh_l2g_numbering(resformat,nrespar,knolg,
158  & npoin_par,ierr)
159  CALL check_call(ierr,'GRETEL:GET_MESH_L2G_NUMBERING:RESPAR')
160 !
161  DO itime=0,ntimestep_res-1
162  ! LOOP ON ALL THE VARIABLE FOR THE TIMESTEP ITIME
163  IF(ipid.EQ.0) THEN
164  CALL get_data_time(resformat,nrespar,itime,
165  & times(itime+1),ierr)
166  CALL check_call(ierr,'GRETEL:GET_DATA_TIME:RESPAR')
167  ENDIF
168  DO ivar=1,nvar_res
169  varname = textelu(ivar)(1:16)
170  CALL get_data_value(resformat,nrespar,itime,
171  & varname,tmp,
172  & npoin_par,ierr)
173  CALL check_call(ierr,'GRETEL:GET_DATA_VALUE')
174  IF(ndim.EQ.2) THEN
175  ! 2D
176  DO i=1,npoin_par
177  resdata2(knolg(i),ivar,itime+1) = tmp(i)
178  ENDDO
179  ELSE
180  ! 3D
181  DO i=1,npoin_par/nplan_res
182  DO j=1,nplan_res
183  resdata2(knolg(i) + (j-1)*npoin_geo, ivar, itime+1)=
184  & tmp(i + (j-1)*npoin_par/nplan_res)
185  ENDDO
186  ENDDO
187  ENDIF
188  ENDDO ! IVAR
189  ENDDO ! ITIME
190  CALL close_mesh(resformat,nrespar,ierr)
191  CALL check_call(ierr,'GRETEL:CLOSEMESH:RESPAR')
192  DEALLOCATE(tmp)
193  DEALLOCATE(knolg)
194  ENDDO ! IPID
195  ! Writting results
196  DO itime=0,ntimestep_res-1
197  ! WRITING TIME STEP
198  WRITE(lu,*) 'WRITING DATASET NO.',itime,' TIME =',
199  & REAL(times(itime+1))
200  !
201  DO i=1,nvar_res
202  CALL add_data(resformat,nres,textelu(i),times(itime+1),
203  & itime,i.EQ.1,
204  & resdata2(:,i,itime+1),npoin_res,ierr)
205  CALL check_call(ierr,'GRETEL:ADD_DATA:RES')
206  ENDDO
207  ENDDO
208 
209  DEALLOCATE(resdata2)
210  DEALLOCATE(times)
211  ELSE
212  WRITE(lu,*) 'UNKOWN METHOD:',method
213  CALL plante(1)
214  ENDIF
215  END SUBROUTINE merge_data
subroutine get_mesh_npoin(FFORMAT, FID, TYP_ELEM, NPOIN, IERR)
Definition: get_mesh_npoin.f:7
subroutine add_data(FFORMAT, FILE_ID, VAR_NAME, TIME, RECORD, FIRST_VAR, VAR_VALUE, N, IERR)
Definition: add_data.f:8
subroutine close_mesh(FFORMAT, FILE_ID, IERR, MESH_NUMBER)
Definition: close_mesh.f:7
subroutine get_data_value(FFORMAT, FID, RECORD, VAR_NAME, RES_VALUE, N, IERR)
Definition: get_data_value.f:7
subroutine open_mesh(FFORMAT, FILE_NAME, FILE_ID, OPENMODE, IERR, MESH_NUMBER)
Definition: open_mesh.f:7
subroutine get_data_time(FFORMAT, FID, RECORD, TIME, IERR)
Definition: get_data_time.f:7
subroutine get_mesh_l2g_numbering(FFORMAT, FID, KNOLG, NPOIN, IERR)
subroutine merge_data(NPOIN_RES, NVAR_RES, NTIMESTEP_RES, NPROC, RESFORMAT, NRES, TYP_ELEM, TEXTELU, RES, NDIM, NPLAN_RES, NPOIN_GEO, METHOD)
Definition: merge_data.f:7