The TELEMAC-MASCARET system  trunk
noudon.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE noudon
3 ! *****************
4 !
5  & (f1,name1,mode1, f2,name2,mode2,f3,name3,mode3,
6  & npoin,ndon,fformat,at,tv1,tv2,
7  & f11,f12,f21,f22,f31,f32,indic,chdon,nvar,texte,
8  & trouve,unitime,phastime)
9 !
10 !***********************************************************************
11 ! TOMAWAC V6P3 21/06/2011
12 !***********************************************************************
13 !
14 ! brief COMPUTES THE CURRENT / WIND VELOCITY
15 ! + FOR THE CURRENT TIME STEP AND ON THE COMPUTATION MESH.
16 ! +
17 ! + (INSPIRED FROM SUBROUTINE FOND IN TELEMAC2D)
18 !
19 ! history N.DURAND (HRW), S.E.BOURBAN (HRW)
20 ! + 13/07/2010
21 ! + V6P0
22 ! + Translation of French comments within the FORTRAN sources into
23 ! + English comments
24 !
25 ! history N.DURAND (HRW), S.E.BOURBAN (HRW)
26 ! + 21/08/2010
27 ! + V6P0
28 ! + Creation of DOXYGEN tags for automated documentation and
29 ! + cross-referencing of the FORTRAN sources
30 !
31 ! history G.MATTAROLO (EDF - LNHE)
32 ! + 20/06/2011
33 ! + V6P1
34 ! + Translation of French names of the variables in argument
35 !
36 ! history J-M HERVOUET (EDF - LNHE)
37 ! + 16/11/2012
38 ! + V6P3
39 ! + Only SELAFIN format with same mesh kept. Arguments removed.
40 !
41 ! history E. GAGNAIRE-RENOU & J-M HERVOUET (EDF - LNHE)
42 ! + 16/05/2013
43 ! + V6P3
44 ! + In the case where a new record is not read, array TROUVE must be
45 ! + however built.
46 !
47 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
48 ! | AT |-->| COMPUTATION TIME
49 ! | FFORMAT |-->| DATA FILE FORMAT
50 ! | CHDON |-->| NAME OF THE VARIABLE READ FROM THE DATA FILE
51 ! | F1 |<--| FIRST VARIABLE TO READ
52 ! | F2 |<--| SECOND VARIABLE TO READ
53 ! | F3 |<--| THIRD VARIABLE TO READ
54 ! | F11 |<->| DATA VALUES AT TIME TV1 IN THE DATA FILE FOR F1
55 ! | F12 |<->| DATA VALUES AT TIME TV2 IN THE DATA FILE FOR F1
56 ! | F21 |<->| DATA VALUES AT TIME TV1 IN THE DATA FILE FOR F2
57 ! | F22 |<->| DATA VALUES AT TIME TV2 IN THE DATA FILE FOR F2
58 ! | F31 |<->| DATA VALUES AT TIME TV1 IN THE DATA FILE FOR F3
59 ! | F32 |<->| DATA VALUES AT TIME TV2 IN THE DATA FILE FOR F3
60 ! | INDIC |-->| FILE FORMAT
61 ! | MODE1 |-->| MODE: 0= DO NOT READ
62 ! | | | 1= READ IF PRESENT
63 ! | MODE2 |-->| LIKE MODE1 FOR SECOND VARIABLE
64 ! | MODE3 |-->| LIKE MODE1 FOR THIRD VARIABLE
65 ! | NAME1 |-->| NAME OF FIRST VARIABLE
66 ! | NAME2 |-->| NAME OF SECOND VARIABLE
67 ! | NAME3 |-->| NAME OF THIRD VARIABLE
68 ! | NDON |-->| LOGICAL UNIT NUMBER OF THA DATA FILE
69 ! | NPOIN |-->| NUMBER OF POINTS IN 2D MESH
70 ! | NVAR |-->| NUMBER OF VARIABLES TO BE READ
71 ! | PHASTIME |-->| TIME SHIFT IN FILE
72 ! | TV1 |<->| TIME T1 IN THE DATA FILE
73 ! | TV2 |<->| TIME T2 IN THE DATA FILE
74 ! | UNITIME |-->| UNIT OF TIME IN FILE
75 ! | X |-->| ABSCISSAE OF POINTS IN THE MESH
76 ! | Y |-->| ORDINATES OF POINTS IN THE MESH
77 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
78 !
79  USE bief
80  USE declarations_tomawac,ONLY: debug
81  USE interface_tomawac, ex_noudon => noudon
84  IMPLICIT NONE
85 !
86 !
87 ! +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
88 !
89  INTEGER, INTENT(IN) :: NDON,NPOIN,INDIC
90  INTEGER, INTENT(INOUT) :: NVAR
91  INTEGER, INTENT(IN) :: MODE1,MODE2,MODE3
92  DOUBLE PRECISION, INTENT(INOUT) :: F1(npoin),F2(npoin),F3(npoin)
93  DOUBLE PRECISION, INTENT(INOUT) :: F11(npoin),F21(npoin)
94  DOUBLE PRECISION, INTENT(INOUT) :: F12(npoin),F22(npoin)
95  DOUBLE PRECISION, INTENT(INOUT) :: F31(npoin),F32(npoin)
96  DOUBLE PRECISION, INTENT(IN) :: AT,UNITIME,PHASTIME
97  DOUBLE PRECISION, INTENT(INOUT) :: TV1,TV2
98  CHARACTER(LEN=8), INTENT(IN) :: FFORMAT
99  CHARACTER(LEN=7), INTENT(IN) :: CHDON
100  CHARACTER(LEN=32),INTENT(IN) :: NAME1,NAME2,NAME3
101  CHARACTER(LEN=32),INTENT(IN) :: TEXTE(30)
102  LOGICAL, INTENT(INOUT) :: TROUVE(3)
103 !
104 ! +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
105 !
106  INTEGER I,J,MODE(3)
107  DOUBLE PRECISION COEF
108  CHARACTER(LEN=32) NAME(3),FULL_NAME(3)
109  CHARACTER(LEN=16), ALLOCATABLE :: VAR_NAME(:), VAR_UNIT(:)
110  CHARACTER(LEN=32) COMPONENT
111  LOGICAL :: COUUT=.false., venut=.false., marut=.false.
112  INTEGER :: RECORD1,RECORD2
113  DOUBLE PRECISION :: TIME1,TIME2
114  INTEGER :: IERR
115 !
116 !-----------------------------------------------------------------------
117 !
118  mode(1)=mode1
119  mode(2)=mode2
120  mode(3)=mode3
121  name(1)=name1
122  name(2)=name2
123  name(3)=name3
124  DO j=1,3
125  trouve(j)=.false.
126  ENDDO
127 !
128 !-----------------------------------------------------------------------
129 !
130  IF(at.GT.tv2) THEN
131 !
132  IF(debug.GT.0) THEN
133  WRITE(lu,*) ' NOUDON : READING A NEW RECORD'
134  ENDIF
135 !
136  IF(indic.EQ.3) THEN
137 !
138 ! ------------------------------------------------------------------
139 ! READS A SELAFIN FILE OF TYPE: TELEMAC
140 ! ------------------------------------------------------------------
141 !
142 !
143 ! The test is useless as fields have already been checked for the initial value
144 !
145  CALL get_data_nvar(fformat,ndon,nvar,ierr)
146  CALL check_call(ierr,'NOUDON:GET_DATA_NVAR')
147 !
148  ALLOCATE(var_name(nvar),stat=ierr)
149  CALL check_allocate(ierr,'NOUDON:VAR_NAME')
150  ALLOCATE(var_unit(nvar),stat=ierr)
151  CALL check_allocate(ierr,'NOUDON:VAR_UNIT')
152  CALL get_data_var_list(fformat,ndon,nvar,var_name,var_unit,ierr)
153  CALL check_call(ierr,'NOUDON:GET_DATA_VAR_LIST')
154  DO i=1,nvar
155  component(1:16) = var_name(i)
156  component(17:32) = var_unit(i)
157 ! CHECK IF THE VARIABLE ARE IN THE FILE
158  DO j=1,3
159  IF((component.EQ.name(j)).AND.
160  & mode(j).GT.0) THEN
161  trouve(j) = .true.
162  full_name(j) = name(j)
163  ENDIF
164  ENDDO
165  ENDDO
166  DEALLOCATE(var_name)
167  DEALLOCATE(var_unit)
168 !
169 ! Look for the two record before and after at for the interpolation
170  record1 = 0
171  record2 = 1
172  CALL get_data_time(fformat,ndon,record1,time1,ierr)
173  CALL check_call(ierr,'NOUDON:GET_DATA_TIME')
174  tv1=(time1-phastime)*unitime
175  DO
176  CALL get_data_time(fformat,ndon,record2,time2,ierr)
177  CALL check_call(ierr,'NOUDON:GET_DATA_TIME')
178  tv2=(time2-phastime)*unitime
179  IF(tv2.LT.at) THEN
180  IF(debug.GT.0) THEN
181  WRITE(lu,*) ' NOUDON: JUMP OF 1 DATA RECORD'
182  ENDIF
183  record1 = record2
184  record2 = record2 + 1
185  tv1 = tv2
186  ELSE
187  EXIT
188  ENDIF
189  ENDDO
190 ! Check if all the variables are found for record1
191  DO j=1,3
192  IF(mode(j).EQ.2.AND..NOT.trouve(j)) THEN
193  WRITE(lu,*) 'NOUDON: VARIABLE ',name1,' NOT FOUND'
194  WRITE(lu,*) trim(name(j)(1:16))
195  CALL plante(1)
196  stop
197  ELSEIF(mode(j).GT.0.AND.trouve(j)) THEN
198  IF(debug.GT.0) THEN
199  WRITE(lu,*) 'VARIABLE ',j,' READ (',
200  & trim(name(j)(1:16)),') AT TIME ',tv1
201  ENDIF
202 ! Read the data for varialbe j on record1
203  IF(j.EQ.1) THEN
204  CALL get_data_value(fformat,ndon,record1,
205  & full_name(j),f11,npoin,ierr)
206  ELSEIF(j.EQ.2) THEN
207  CALL get_data_value(fformat,ndon,record1,
208  & full_name(j),f21,npoin,ierr)
209  ELSEIF(j.EQ.3) THEN
210  CALL get_data_value(fformat,ndon,record1,
211  & full_name(j),f31,npoin,ierr)
212  ENDIF
213  ENDIF
214  ENDDO
215 ! Read the variables
216 !
217 ! Check if all the variables are found for record2
218  DO j=1,3
219  IF(mode(j).EQ.2.AND..NOT.trouve(j)) THEN
220  WRITE(lu,*) 'NOUDON: VARIABLE ',name1,' NOT FOUND'
221  WRITE(lu,*) name(j)
222  CALL plante(1)
223  stop
224  ELSEIF(mode(j).GT.0.AND.trouve(j)) THEN
225  IF(debug.GT.0) THEN
226  WRITE(lu,*) 'VARIABLE ',j,' READ (',
227  & trim(name(j)(1:16)),') AT TIME ',tv2
228  ENDIF
229 ! Read the data for varialbe j on record2
230  IF(j.EQ.1) THEN
231  CALL get_data_value(fformat,ndon,record2,
232  & full_name(j),f12,npoin,ierr)
233  ELSEIF(j.EQ.2) THEN
234  CALL get_data_value(fformat,ndon,record2,
235  & full_name(j),f22,npoin,ierr)
236  ELSEIF(j.EQ.3) THEN
237  CALL get_data_value(fformat,ndon,record2,
238  & full_name(j),f32,npoin,ierr)
239  ENDIF
240  ENDIF
241  ENDDO
242 !
243  ELSEIF (indic.EQ.4) THEN
244 !
245 ! ---------------------------------------------------------------------
246 ! READS A USER-DEFINED FILE FORMAT
247 ! ---------------------------------------------------------------------
248 !
249  IF(chdon(1:1).EQ.'C') THEN
250  trouve(1)=.true.
251  trouve(2)=.true.
252  couut=.true.
253  CALL couuti(ndon,fformat)
254  ELSEIF(chdon(1:1).EQ.'V'.OR.chdon(1:1).EQ.'W') THEN
255  trouve(1)=.true.
256  trouve(2)=.true.
257  venut=.true.
258  CALL venuti(ndon,fformat)
259  ELSEIF(chdon(1:1).EQ.'H') THEN
260  trouve(3)=.true.
261  marut=.true.
262  CALL maruti(ndon,fformat)
263  ENDIF
264 !
265  ELSE
266 !
267  WRITE(lu,*) '************************************************'
268  WRITE(lu,*)'NOUDON : UNKNOWN INDICATOR OF FORMAT : ',indic
269  WRITE(lu,*) '************************************************'
270  CALL plante(1)
271  ENDIF
272 !
273  ELSE
274 !
275  trouve(1)=.false.
276  trouve(2)=.false.
277  trouve(3)=.false.
278  DO i =1,nvar
279  DO j=1,3
280  IF((texte(i).EQ.name(j)).AND.
281  & mode(j).GT.0) THEN
282  trouve(j)=.true.
283  ENDIF
284  ENDDO
285  ENDDO
286  IF(couut.OR.venut) THEN
287  trouve(1)=.true.
288  trouve(2)=.true.
289  ENDIF
290  IF(marut) trouve(3)=.true.
291 !
292  ENDIF
293 !
294 ! --------------------------------------------------------------
295 ! INTERPOLATES
296 ! --------------------------------------------------------------
297 !
298  IF (abs(tv1-tv2).GT.1.d-30) THEN
299  coef=(at-tv1)/(tv2-tv1)
300  ELSE
301  coef=0
302  ENDIF
303 !
304  IF(trouve(1)) THEN
305  DO i=1,npoin
306  f1(i)=(f12(i)-f11(i))*coef+f11(i)
307  ENDDO
308  ENDIF
309 !
310  IF(trouve(2)) THEN
311  DO i=1,npoin
312  f2(i)=(f22(i)-f21(i))*coef+f21(i)
313  ENDDO
314  ENDIF
315 !
316  IF(trouve(3)) THEN
317  DO i=1,npoin
318  f3(i)=(f32(i)-f31(i))*coef+f31(i)
319  ENDDO
320  ENDIF
321 !
322 !-----------------------------------------------------------------------
323 !
324  RETURN
325 !
326 ! IF FAILED TO READ THE FILE ...
327 !
328  WRITE(lu,*)'*********************************************'
329  WRITE(lu,*)' ERROR WHILE READING DATA FILE '
330  WRITE(lu,*)' OR UNEXPECTED END OF FILE '
331  WRITE(lu,*)'*********************************************'
332  CALL plante(1)
333  stop
334 !
335 !-----------------------------------------------------------------------
336 !
337  RETURN
338  END
subroutine maruti(NMAR, FMTMAR)
Definition: maruti.f:7
subroutine get_data_nvar(FFORMAT, FID, NVAR, IERR)
Definition: get_data_nvar.f:7
subroutine get_data_var_list(FFORMAT, FID, NVAR, VARLIST, UNITLIST, IERR)
subroutine venuti(NVEN, FMTVEN)
Definition: venuti.f:7
subroutine get_data_value(FFORMAT, FID, RECORD, VAR_NAME, RES_VALUE, N, IERR)
Definition: get_data_value.f:7
subroutine noudon(F1, NAME1, MODE1, F2, NAME2, MODE2, F3, NAME3, MODE3, NPOIN, NDON, FFORMAT, AT, TV1, TV2, F11, F12, F21, F22, F31, F32, INDIC, CHDON, NVAR, TEXTE, TROUVE, UNITIME, PHASTIME)
Definition: noudon.f:10
subroutine couuti(NCOU, FMTCOU)
Definition: couuti.f:7
subroutine get_data_time(FFORMAT, FID, RECORD, TIME, IERR)
Definition: get_data_time.f:7
Definition: bief.f:3