The TELEMAC-MASCARET system  trunk
ecrspe.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE ecrspe
3 ! *****************
4 !
5  &( f , ndire , nf , npoin2, lt , auxil ,
6  & noleo , nleo , debres, date , time , knolg , mesh)
7 !
8 !***********************************************************************
9 ! TOMAWAC V6P3 15/06/2011
10 !***********************************************************************
11 !
12 !brief WRITES OUT THE DIRECTIONAL VARIANCE SPECTRUM
13 !+ AT SELECTED NODES.
14 !+ (SERAPHIN BINARY FORMAT).
15 !
16 !history OPTIMER
17 !+ 28/08/2000
18 !+ V5P0
19 !+ CREATED
20 !
21 !history
22 !+ 07/06/2001
23 !+ V5P2
24 !+
25 !
26 !history M. BENOIT
27 !+ 13/07/2004
28 !+ V5P5
29 !+ CORRECTED A BUG IN THE DECLARATION OF IPOBO WHEN PASSED
30 !
31 !history
32 !+
33 !+ V6P0
34 !+
35 !
36 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
37 !+ 13/07/2010
38 !+ V6P0
39 !+ Translation of French comments within the FORTRAN sources into
40 !+ English comments
41 !
42 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
43 !+ 21/08/2010
44 !+ V6P0
45 !+ Creation of DOXYGEN tags for automated documentation and
46 !+ cross-referencing of the FORTRAN sources
47 !
48 !history G.MATTAROLO (EDF - LNHE)
49 !+ 15/06/2011
50 !+ V6P1
51 !+ Translation of French names of the variables in argument
52 !
53 !history A. LAUGEL & J-M HERVOUET (EDF - LNHE)
54 !+ 22/11/2012
55 !+ V6P3
56 !+ Parallelism treated with files.
57 !
58 !history E. GAGNAIRE-RENOU (EDF - LNHE)
59 !+ 12/03/2013
60 !+ V6P3
61 !+ Print out the 1D frequential spectrum at (same) selected nodes.
62 !+ Scopgene format.
63 !
64 !history Y AUDOUIN (LNHE)
65 !+ 25/05/2015
66 !+ V7P0
67 !+ Modification to comply with the hermes module
68 !
69 !history A JOLY (LNHE)
70 !+ 16/02/2017
71 !+ V7P3
72 !+ In some instances, PROXIM could find a node in only one processor
73 !+ domain (and therefore NOLEO), but MESH%ELTCAR was in another.
74 !+ This case is now taken into account.
75 !
76 !history J,RIEHME (ADJOINTWARE)
77 !+ November 2016
78 !+ V7P2
79 !+ Replaced EXTERNAL statements to parallel functions / subroutines
80 !+ by the INTERFACE_PARALLEL
81 !
82 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
83 !| AUXIL |<->| DIRECTIONAL SPECTRUM WORK TABLE
84 !| DATE |-->| START DATE
85 !| DEBRES |-->| LOGICAL INDICATING THE FIRST TIME STEP TO PRINT
86 !| F |-->| VARIANCE DENSITY DIRECTIONAL SPECTRUM
87 !| ISLEO |-->| ARRAY OF LOGICAL
88 !| KNOLG |-->| ARRAY LINKING LOCAL TO GLOBAL INDEXES IN PARALL
89 !| NF |-->| NUMBER OF FREQUENCIES
90 !| NK |-->| DUMMY VARIABLE
91 !| NLEO |-->| NUMBER OF SPECTRUM PRINTOUT POINTS
92 !| NOLEO |-->| INDEX ARRAY OF SPECTRUM PRINTOUT POINTS
93 !| NDIRE |-->| NUMBER OF DIRECTIONS
94 !| NPOIN2 |-->| NUMBER OF POINTS IN 2D MESH
95 !| TIME |-->| START TIME
96 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
97 !
98  USE bief
99 !
100  USE interface_hermes
102  & titcas, at, luspe, namspe, luleo, fmtleo, namleo
103 !
105  USE interface_parallel, ONLY : p_max,p_sum
106  IMPLICIT NONE
107 !
108 !
109 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
110 !
111  INTEGER, INTENT(IN) :: NPOIN2,NLEO,NF,NDIRE, LT
112  INTEGER, INTENT(IN) :: KNOLG(*), NOLEO(nleo)
113  INTEGER, INTENT(IN) :: DATE(3),TIME(3)
114  DOUBLE PRECISION, INTENT(INOUT) :: AUXIL(ndire,nf)
115  DOUBLE PRECISION, INTENT(IN) :: F(npoin2,ndire,nf)
116  LOGICAL, INTENT(IN) :: DEBRES
117  TYPE(bief_mesh), INTENT(INOUT) :: MESH
118 !
119 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
120 !
121  INTEGER ISTAT , II , JF , K , II_ALL
122  INTEGER KAMP1 , KAMP2 , KAMP3 , KAMP4 , KAMP5 , KAMP6 , ILEO
123  INTEGER IBID(1), NELEM, NPSPE
124  CHARACTER(LEN=72) C
125  CHARACTER(LEN=32) TEXTE(nleo)
126  CHARACTER(LEN=6) NUM
127  CHARACTER(LEN=5) CC
128  CHARACTER(LEN=1) C1,C2,C3,C4,C5,C6
129  INTEGER NUM1, NUM2, NUM3, NUM4, NUM5
130  TYPE(bief_mesh) MESHF
131  LOGICAL SORLEO(nleo)
132  DOUBLE PRECISION DTETAR
133  REAL W(1)
134  CHARACTER(LEN=11) EXTENS
135  EXTERNAL extens
136  INTEGER :: ID
137 !
138  DOUBLE PRECISION, ALLOCATABLE :: F_INTF(:,:)
139 !
140 !-----------------------------------------------------------------------
141 !
142  dtetar=deupi/dble(ndire)
143  npspe=nf*ndire
144  nelem=(nf-1)*ndire
145 ! SORLEO = .FALSE.
146  DO ileo=1,nleo
147  kamp1=noleo(ileo)
148  IF(ncsize.GT.1) THEN
149  IF(kamp1.GT.0) kamp1=knolg(noleo(ileo))
150  kamp1=p_max(kamp1)
151  ENDIF
152  kamp2=mod(kamp1,100000)
153  kamp3=mod(kamp2,10000)
154  kamp4=mod(kamp3,1000)
155  kamp5=mod(kamp4,100)
156  kamp6=mod(kamp5,10)
157  c1=char(48+kamp1/100000)
158  c2=char(48+kamp2/10000)
159  c3=char(48+kamp3/1000)
160  c4=char(48+kamp4/100)
161  c5=char(48+kamp5/10)
162  c6=char(48+kamp6)
163  num=c1//c2//c3//c4//c5//c6
164  ! Number of frequence
165  num1=ileo
166  num2=mod(num1,10000)
167  num3=mod(num2,1000)
168  num4=mod(num3,100)
169  num5=mod(num4,10)
170  c1=char(48+num1/10000)
171  c2=char(48+num2/1000)
172  c3=char(48+num3/100)
173  c4=char(48+num4/10)
174  c5=char(48+num5)
175  cc=c1//c2//c3//c4//c5
176  texte(ileo)='F'//cc//'PT2D'//num//'UNITE SI '
177  sorleo(ileo) = .true.
178  ENDDO
179 !
180 ! FOR THE FIRST PRINTED TIME STEP, WRITES OUT THE HEADER TO THE FILE
181 !
182  ALLOCATE(f_intf(nleo,nf))
183  IF(debres) THEN
184 !
185 ! IN PARALLEL ONLY PROCESSOR 0 CREATES THE FILE
186 !
187  IF(ipid.EQ.0) THEN
188 !
189 ! CREATES MESHF, MESH ASSOCIATED WITH DISCRETISATION
190 ! IN FREQUENCY AND DIRECTION
191 !
192  ALLOCATE(meshf%TYPELM)
193  ALLOCATE(meshf%NELEM)
194  ALLOCATE(meshf%NPOIN)
195  ALLOCATE(meshf%IKLE)
196  ALLOCATE(meshf%IKLE%I(4*nelem))
197  ALLOCATE(meshf%X)
198  ALLOCATE(meshf%Y)
199  ALLOCATE(meshf%NPTFR)
200  ALLOCATE(meshf%NBOR)
201  ALLOCATE(meshf%NBOR%I(2*ndire))
202  ALLOCATE(meshf%DIM1)
203  ALLOCATE(meshf%KNOLG)
204  ALLOCATE(meshf%KNOLG%I(ndire*nf))
205  ALLOCATE(meshf%X_ORIG)
206  ALLOCATE(meshf%Y_ORIG)
207 !
208 !
209  meshf%NAME = 'MESH'
210  meshf%TYPELM = quadrangle_elt_type !TRIANGLE 2D MESH
211  meshf%NELEM = nelem
212  meshf%NPOIN = npspe
213  meshf%DIM1 = 2
214  meshf%X_ORIG = 0
215  meshf%Y_ORIG = 0
216  ii=0
217  DO jf=1,nf-1
218  DO k=1,ndire
219  ii=ii+1
220  meshf%IKLE%I(ii)=mod(ii,ndire)+1+(jf-1)*ndire
221  ENDDO
222  ENDDO
223  DO ii=1,nelem
224  meshf%IKLE%I(ii+nelem)=ii
225  meshf%IKLE%I(ii+2*nelem)=ii+ndire
226  meshf%IKLE%I(ii+3*nelem)=meshf%IKLE%I(ii)+ndire
227  ENDDO
228 !
229 ! WRITES OUT THE ARRAYS X AND Y
230 !
231  ALLOCATE(meshf%X%R(ndire*nf))
232  ALLOCATE(meshf%Y%R(ndire*nf))
233  meshf%NPTFR = 2*ndire
234  DO jf=1,nf
235  DO ii=1,ndire
236  meshf%X%R(ii+ndire*(jf-1))=freq(jf)*sin(teta(ii))
237  meshf%Y%R(ii+ndire*(jf-1))=freq(jf)*cos(teta(ii))
238  ENDDO
239  ENDDO
240  meshf%NBOR%I=0
241  DO ii = 1,ndire
242  meshf%NBOR%I(ii) = ii
243  ENDDO
244  DO ii = ndire+1,2*ndire
245  meshf%NBOR%I(ii)=ndire+1+npspe-ii
246  ENDDO
247  meshf%KNOLG%I = 0
248  ALLOCATE(meshf%NDS(0:81,7))
249  meshf%TYPELM = quadrangle_elt_type
250  meshf%NDS(meshf%TYPELM+1,3) = 4
251 
252 !
253 ! CREATES DATA FILE USING A GIVEN FILE FORMAT : FORMAT_RES.
254 ! THE DATA ARE CREATED IN THE FILE: NRES, AND IS
255 ! CHARACTERISED BY A TITLE AND NAME OF OUTPUT VARIABLES
256 ! CONTAINED IN THE FILE.
257 !
258  IF (namleo(1:1).NE.' ') THEN
259  CALL write_header(fmtleo, ! RESULTS FILE FORMAT
260  & luleo, ! LU FOR RESULTS FILE
261  & titcas, ! TITLE
262  & nleo, ! MAX NUMBER OF OUTPUT VARIABLES
263  & texte, ! NAMES OF OUTPUT VARIABLES
264  & sorleo) ! PRINT TO FILE OR NOT
265 
266 !
267 ! WRITES THE MESH IN THE OUTPUT FILE
268 !
269  CALL write_mesh(fmtleo, ! RESULTS FILE FORMAT
270  & luleo, ! LU FOR RESULTS FILE
271  & meshf,
272  & 1, ! NUMBER OF PLANES
273  & date, ! START DATE
274  & time, ! START TIME
275  & stra31,stra32, !
276  & .false., 0) ! PARALL, NPTIR
277  ENDIF
278 !
279  IF(namspe(1:1).NE.' ') THEN
280  WRITE(luspe,'(A1,A72)') '/', titcas
281  WRITE(luspe,'(I3)') nleo
282  DO ileo=1,nleo
283  WRITE(luspe,'(A32)') texte(ileo)
284  ENDDO
285  WRITE(luspe,'(A19)') '0 0 0 0 0 0 0 0 0 0'
286  ENDIF
287  DEALLOCATE(meshf%TYPELM)
288  DEALLOCATE(meshf%NELEM)
289  DEALLOCATE(meshf%NPOIN)
290  DEALLOCATE(meshf%IKLE%I)
291  DEALLOCATE(meshf%IKLE)
292  DEALLOCATE(meshf%X%R)
293  DEALLOCATE(meshf%X)
294  DEALLOCATE(meshf%Y%R)
295  DEALLOCATE(meshf%Y)
296  DEALLOCATE(meshf%NPTFR)
297  DEALLOCATE(meshf%NBOR%I)
298  DEALLOCATE(meshf%NBOR)
299  DEALLOCATE(meshf%DIM1)
300  DEALLOCATE(meshf%KNOLG%I)
301  DEALLOCATE(meshf%KNOLG)
302  DEALLOCATE(meshf%NDS)
303 !
304  ENDIF
305 
306  ENDIF
307 !
308 ! RECORDS THE CURRENT TIME STEP
309 !
310  IF (namspe(1:1).NE.' ') THEN
311  IF(ipid.EQ.0) THEN
312  WRITE(luspe,1008) at
313  ENDIF
314  ENDIF
315 1008 FORMAT('TIME = ',f13.5)
316 !
317  IF(ncsize.GT.1) THEN
318  CALL get_free_id(id)
319 !
320 ! 1) EVERY PROCESSOR WRITES ITS OWN POINTS
321 ! MESH%ELTCAR IS USED AS FOR THE CHARACTERISTICS
322 !
323  DO ileo=1,nleo
324  ii=noleo(ileo)
325  ii_all=p_sum(ii)
326  IF(ii.GT.0) THEN
327  IF((mesh%ELTCAR%I(ii).NE.0).OR.
328  & (ii.EQ.ii_all)) THEN
329  DO jf=1,nf
330  DO k=1,ndire
331  auxil(k,jf)=f(ii,k,jf)
332  ENDDO
333  ENDDO
334  OPEN(id,file=extens(nleo,ileo),
335  & form='UNFORMATTED',status='NEW')
336  CALL ecri2(auxil,ibid,c,npspe,'R8',id,'STD',istat)
337  CLOSE(id)
338  ENDIF
339  ENDIF
340  ENDDO
341 !
342 ! WAITING COMPLETION OF THE WORK BY ALL PROCESSORS
343 !
344  CALL p_sync
345 !
346 ! 2) PROCESSOR 0 READS ALL FILES AND MERGES IN THE FINAL FILE
347 !
348  IF(ipid.EQ.0) THEN
349  IF (namleo(1:1).NE.' ') THEN
350  DO ileo=1,nleo
351  OPEN(id,file=extens(nleo,ileo),
352  & form='UNFORMATTED',status='OLD')
353  CALL lit(auxil,w,ibid,c,npspe,'R8',id,'STD',istat)
354  CALL add_data(fmtleo,luleo,texte(ileo),at,lt,ileo.EQ.1,
355  & auxil,npspe,istat)
356  CALL check_call(istat,'ECRSPE:ADD_DATA')
357  CLOSE(id,status='DELETE')
358  DO jf=1,nf
359  f_intf(ileo,jf)=0.d0
360  DO k=1,ndire
361  f_intf(ileo,jf)=f_intf(ileo,jf)+auxil(k,jf)*dtetar
362  ENDDO
363  ENDDO
364  ENDDO
365  ENDIF
366  IF (namspe(1:1).NE.' ') THEN
367  DO jf=1,nf
368  WRITE(luspe,'(100(E10.4,2X))') freq(jf),
369  & (f_intf(ileo,jf),ileo=1,nleo)
370  ENDDO
371  ENDIF
372  ENDIF
373  ELSE
374  IF (namleo(1:1).NE.' ') THEN
375  DO ileo=1,nleo
376  ii=noleo(ileo)
377  DO jf=1,nf
378  DO k=1,ndire
379  auxil(k,jf)=f(ii,k,jf)
380  ENDDO
381  ENDDO
382  CALL add_data(fmtleo,luleo,texte(ileo),at,lt,ileo.EQ.1,
383  & auxil,npspe,istat)
384  CALL check_call(istat,'ECRSPE:ADD_DATA')
385  ENDDO
386  ENDIF
387  IF (namspe(1:1).NE.' ') THEN
388  DO ileo=1,nleo
389  ii=noleo(ileo)
390  DO jf=1,nf
391  f_intf(ileo,jf)=0.d0
392  DO k=1,ndire
393  f_intf(ileo,jf)=f_intf(ileo,jf)+f(ii,k,jf)*dtetar
394  ENDDO
395  IF(abs(f_intf(ileo,jf)).LT.1.d-90) f_intf(ileo,jf)=0.d0
396  ENDDO
397  ENDDO
398  DO jf=1,nf
399  WRITE(luspe,'(100(E10.4,2X))') freq(jf),
400  & (f_intf(ileo,jf),ileo=1,nleo)
401  ENDDO
402  ENDIF
403 !
404  ENDIF
405 !
406 !-----------------------------------------------------------------------
407 !
408  DEALLOCATE(f_intf)
409  RETURN
410  END
subroutine write_mesh(FFORMAT, NFILE, MESH, NPLAN, DATE, TIME, T1, T2, PARALL, NPTIR, NGEO, GEOFORMAT, LATLONG)
Definition: write_mesh.f:8
subroutine add_data(FFORMAT, FILE_ID, VAR_NAME, TIME, RECORD, FIRST_VAR, VAR_VALUE, N, IERR)
Definition: add_data.f:8
double precision, dimension(:), pointer freq
subroutine ecri2(X, I, C, NVAL, TYPE, CANAL, STD, ISTAT)
Definition: ecri2.f:7
type(bief_obj), target stra31
double precision, dimension(:), pointer teta
type(bief_obj), target stra32
subroutine lit(X, W, I, C, NVAL, TYPE, CANAL, STD2, ISTAT)
Definition: lit.F:7
subroutine write_header(FFORMAT, NRES, TITLE, NVAR, NOMVAR, OUTVAR)
Definition: write_header.f:7
integer, parameter quadrangle_elt_type
subroutine ecrspe(F, NDIRE, NF, NPOIN2, LT, AUXIL, NOLEO, NLEO, DEBRES, DATE, TIME, KNOLG, MESH)
Definition: ecrspe.f:8
subroutine p_sync
Definition: p_sync.F:4
Definition: bief.f:3