The TELEMAC-MASCARET system  trunk
meteo_telemac.f
Go to the documentation of this file.
1 ! ********************
2  MODULE meteo_telemac
3 ! ********************
4 !
5 !***********************************************************************
6 ! BIEF V8P2
7 !***********************************************************************
8 !
9 !brief Module containing all subroutines to deal with atmospheric
10 !+ exchange, whether its dynamics (wind, pressure, etc.) or its
11 !+ thermal budget (air temperature, solar radiation, cloud, etc.)
12 !
13 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
14 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
15 !
16  USE bief
18  IMPLICIT NONE
19 !
20  PRIVATE
28 !
29 !=======================================================================
30 !
31 ! 1) METEOROLOGICAL DRIVERS
32 !
33 ! NOTE: A METEOROLOGICAL VARIBALE (SAY TAIR) IS ASSOCIATED WITH
34 ! A DOUBLE PRECISION CONSTANT (CST_TAIR, TAKEN FROM THE STEERING
35 ! FILE, OR THE DICO DEFAULT) AND A LOGICAL, INC_TAIR, WHETHER THE
36 ! VARIABLE WAS FOUND IN ANY OF THE METEO FILES (ASCII OR BINARY)
37 !
38 !-----------------------------------------------------------------------
39 
40 ! TAIR: AIR TEMPERATURE
41 ! > Measured in degrees oC
42 !
43  TYPE(bief_obj), TARGET :: tair
44  DOUBLE PRECISION :: cst_tair
45  LOGICAL :: inc_tair
46 !
47 ! TDEW: DEWPOINT TEMPERATURE
48 ! > Measured in degrees oC
49 !
50 ! The dewpoint temperature is the temperature at which the air can
51 ! no longer "hold" all of the water vapor which is mixed with it,
52 ! and some of the water vapor must condense into liquid water.
53 ! The dew point is always lower than (or equal to) the air
54 ! temperature.
55 ! If the air temperature cools to the dew point, or if the dew point
56 ! rises to equal the air temperature, then dew, fog or clouds begin
57 ! to form. At this point where the dew point temperature equals the
58 ! air temperature, the relative humidity is 100%.
59 !
60  TYPE(bief_obj), TARGET :: tdew
61  DOUBLE PRECISION :: cst_tdew
62  LOGICAL :: inc_tdew
63 !
64 ! CLDC: CLOUD COVER
65 ! > Measured in tenth
66 !
67 ! Clouds produce significant changes in the evolution of the other
68 ! meteorological components (the duration of the sun shine, solar
69 ! radiation, temperature, air humidity, atmospheric precipitation,
70 ! water drops or ice crystals etc.), through their size and
71 ! form, life duration and their constitution.
72 ! Cloud cover estimated percentages:
73 ! - 0%: No clouds
74 ! - 1-10%: Clear
75 ! - 11-25%: Isolated
76 ! - 26-50%: Scattered
77 ! - 51-90%: Broken
78 ! - 0>90%: Overcast
79 ! Cloud cover can also be referred to as nebulosity, or the
80 ! ambiguous nature of clouds, or cloud-like-ness, and therefore is
81 ! directly related to the humidity. The more significant the
82 ! extension and the vertical thickness of the clouds, the higher
83 ! the value of the nebulosity will be.
84 !
85  TYPE(bief_obj), TARGET :: cldc
86  DOUBLE PRECISION :: cst_cldc
87  LOGICAL :: inc_cldc
88 !
89 ! VISBI: VISIBILITY
90 ! > Measured in meters
91 !
92 ! Visibility is a measure of the distance at which an object or
93 ! light can be clearly discerned. Note that in the dark,
94 ! meteorological visibility is still the same as in daylight for
95 ! the same air.
96 !
97  TYPE(bief_obj), TARGET :: visbi
98  DOUBLE PRECISION :: cst_visbi
99  LOGICAL :: inc_visbi
100 !
101 ! RAINFALL: RAIN
102 ! > Measured in meters
103  TYPE(bief_obj), TARGET :: rainfall
104  DOUBLE PRECISION :: cst_rainfall
105  LOGICAL :: inc_rainfall
106 !
107 ! SNOW: SNOW
108 ! > Measured in meters
109  TYPE(bief_obj), TARGET :: snow
110  DOUBLE PRECISION :: cst_snow
111  LOGICAL :: inc_snow
112 !
113 ! ALPHSD: SUN SET ANGLE
114 ! > Measured in degrees, 180 degrees for the horizontal
115  DOUBLE PRECISION alphsd
116 !
117 ! ALPHRD: SUN RISE ANGLE
118 ! > Measured in degrees, 0 degrees for the horizontal
119  DOUBLE PRECISION alphrd
120 !
121 !
122 ! WINDX,WINDY : WIND
123 ! > Measured in m/s at WINDZ above the water surface
124 ! or WINDS,WINDD : WIND
125 ! > Measured in m/s and degree angle clockwise from north
126 !
127  TYPE(bief_obj), TARGET :: windx,windy
128  DOUBLE PRECISION :: cst_windx,cst_windy
129  LOGICAL :: inc_windx,inc_windy
130  TYPE(bief_obj), TARGET :: winds,windd
131  DOUBLE PRECISION :: cst_winds,cst_windd
132  LOGICAL :: inc_winds,inc_windd
133 !
134 ! WINDZ
135 ! > Heigh above the water surface at which the wind is measured
136  DOUBLE PRECISION :: windz
137 !
138 !
139  TYPE(bief_obj), TARGET :: patmos
140  DOUBLE PRECISION :: cst_patmos
141  LOGICAL :: inc_patmos
142 !
143 ! PVAP: SATURATED VAPOR PRESSURE
144 ! > Measured in hPa
145  TYPE(bief_obj), TARGET :: pvap
146  DOUBLE PRECISION :: cst_pvap
147  LOGICAL :: inc_pvap
148 !
149 ! RAY3: SOLAR RADIATION
150 ! > Measured in W/m^2
151  TYPE(bief_obj), TARGET :: ray3
152  DOUBLE PRECISION :: cst_ray3
153  LOGICAL :: inc_ray3
154 !
155 ! MODELZ
156 ! > Elevation of the model domain relative to mean sea levels
157  DOUBLE PRECISION :: modelz
158 !
159 ! HREL: RELAVITE HUMIDITY
160 ! > Measured in %
161  TYPE(bief_obj), TARGET :: hrel
162  DOUBLE PRECISION :: cst_hrel
163  LOGICAL :: inc_hrel
164 !
165 !
166 !=======================================================================
167 !
168 ! 2) METEOROLOGICAL CONSTANTS
169 !
170 !-----------------------------------------------------------------------
171 !
172 !
173 !
174 !=======================================================================
175 !
176 ! 3) METEOROLOGICAL FILE INPUTS
177 !
178 !-----------------------------------------------------------------------
179 !
180 ! ONLY TWO METEOROLOGY FILES FOR NOW - A:ASCII AND B:BINARY
181 ! TO RECORD TEMPORAL AND SPATIAL VARIATIONS
182 !
183 ! TYPE BIEF_FILE
184 ! INTEGER LU : LOGICAL UNIT TO OPEN THE FILE
185 ! CHARACTER(LEN=PATH_LEN) NAME : NAME OF FILE
186 ! CHARACTER(LEN=6) TELNAME : NAME OF FILE IN TEMPORARY DIRECTORY
187 ! CHARACTER(LEN=8) FMT : FORMAT (SERAFIN, MED, ETC.)
188 ! CHARACTER(LEN=9) ACTION : READ, WRITE OR READWRITE
189 ! CHARACTER(LEN=3) BINASC : ASC FOR ASCII OR BIN FOR BINARY
190 ! CHARACTER(LEN=12) TYPE : KIND OF FILE
191 ! TYPE BIEF_FILE
192 !
193  TYPE(bief_file) :: meteo_files(2)
194 !
195 ! READING THE FILES IN FULL ONLY ONCE
196  LOGICAL :: meteo_deja(2)
197 !
198 !-----------------------------------------------------------------------
199 !
200 ! COMMON TO BOTH ASCII AND BINARY FILES
201 !
202 ! MAXIMUM NUMBER OF VALUE ON EACH LINE (VARIABLES FOR EACH POINT)
203  INTEGER, PARAMETER :: meteo_maxvalue = 210
204  CHARACTER(LEN=16), TARGET :: meteo_choix(2,meteo_maxvalue)
205  CHARACTER(LEN=16), TARGET :: meteo_units(2,meteo_maxvalue)
206 !
207 !-----------------------------------------------------------------------
208 !
209 ! SPECIFICS FOR THE ASCII FILE
210 !
211 ! INTERPOLATION IN TIME AND IN SPACE FOR MULTIPLE VALUES
212  INTEGER :: ntimea,nvaluea,npoina
213  INTEGER :: itimea1,itimea2
214  DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::
216  DOUBLE PRECISION, DIMENSION(:,:), ALLOCATABLE ::
218  DOUBLE PRECISION dummy
219 !
220 ! MAXIMUM NUMBER OF CHARACTERS PER LIGNE (MAY BE CHANGED)
221  INTEGER, PARAMETER :: sizelign = 30000
222 !
223 !-----------------------------------------------------------------------
224 !
225 ! SPECIFICS FOR THE BINARY FILE
226 !
227 ! INTERPOLATION IN TIME AND IN SPACE FOR MULTIPLE VALUES
228  INTEGER :: ntimeb,nvalueb,npoinb
229  INTEGER :: itimeb1,itimeb2
230  DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::
232  DOUBLE PRECISION, DIMENSION(:,:), ALLOCATABLE ::
234 !
235 !
236 !=======================================================================
237 !
238 ! 4) WORTH SAVING
239 !
240  INTEGER, DIMENSION(6) :: meteo_ref_date
241  DOUBLE PRECISION meteo_offset,tel_offset2
242 !
243 !
244 !-----------------------------------------------------------------------
245  SAVE
246 !
247 !=======================================================================
248 !
249 ! 5) METEOROLOGICAL SUBROUTINES
250 !
251  CONTAINS
252 !
253 !=======================================================================
254 !
255 ! **********************
256  SUBROUTINE point_meteo
257 ! **********************
258 !
259  &( files,atmfilea,atmfileb,mesh,ielmt,avent,aatmos,awater_quality,
260  & aice)
261 !
262 !***********************************************************************
263 ! BIEF V8P2
264 !***********************************************************************
265 !
266 !brief Memory allocation of structures, aliases, blocks...
267 !
268 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
269 !| ATMFILEA |-->| LOGICAL UNIT OF THE ASCII ATMOSPHERIC FILE
270 !| ATMFILEB |-->| LOGICAL UNIT OF THE BINARY ATMOSPHERIC FILE
271 !| ATMOS |-->| YES IF ATMOSPHERIC PRESSURE TAKEN INTO ACCOUNT
272 !| FILES |-->| BIEF_FILES STRUCTURES OF ALL FILES
273 !| ICE |-->| YES IF ICE IS TAKEN INTO ACCOUNT
274 !| IELMT |-->| NUMBER OF ELEMENTS
275 !| MESH |-->| MESH STRUCTURE
276 !| VENT |-->| YES IF WIND TAKEN INTO ACCOUNT
277 !| WATER_QUALITY |-->| YES IF COUPLED WITH WATER QUALITY
278 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
279 !
280  IMPLICIT NONE
281 !
282  TYPE(bief_file), INTENT(IN) :: FILES(*)
283  INTEGER, INTENT(IN) :: ATMFILEA,ATMFILEB
284  INTEGER, INTENT(IN) :: IELMT
285  TYPE(bief_mesh), INTENT(IN) :: MESH
286  LOGICAL, INTENT(IN), OPTIONAL :: AVENT,AATMOS,AWATER_QUALITY,AICE
287 !
288  LOGICAL VENT,ATMOS,WATER_QUALITY,ICE
289 !
290  INTEGER I,J
291 !
292  CHARACTER(LEN=16), ALLOCATABLE :: CHOIX(:)
293 !
294 !-----------------------------------------------------------------------
295 !
296 ! DEFAULT VALUES OF PARAMETERS WHEN THEY ARE NOT GIVEN
297 !
298  water_quality=.false.
299  IF(PRESENT(awater_quality)) water_quality=awater_quality
300  vent=.false.
301  IF(PRESENT(avent)) vent=avent
302  atmos=.false.
303  IF(PRESENT(aatmos)) atmos=aatmos
304  ice=.false.
305  IF(PRESENT(aice)) ice=aice
306 !
307 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
308 !
309 ! GATHER THE SKELETON OF THE METEO THERMIC FILES
310 !
311 ! A: ASCII FILE
312  meteo_deja(1) = .false.
313  npoina = 0
314  IF( files(atmfilea)%NAME(1:1).NE.' ' ) THEN
315  CALL init_fic_ascii( files,atmfilea )
316  meteo_deja(1) = .true.
317  ENDIF
318 !
319 ! B: BINARY FILE
320  meteo_deja(2) = .false.
321  npoinb = 0
322  IF( files(atmfileb)%NAME(1:1).NE.' ' ) THEN
323  CALL init_fic_binary( files,atmfileb )
324  meteo_deja(2) = .true.
325  ENDIF
326 !
327 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
328 !
329 ! ALLOCATE MEMORY
330 !
331 ! WORKING ARRAY
332 !
333  IF(ice) THEN
334  CALL bief_allvec(1,tdew ,'TDEW ',ielmt,1,1,mesh)
335  CALL bief_allvec(1,visbi ,'VISBI ',ielmt,1,1,mesh)
336  CALL bief_allvec(1,snow ,'SNOW ',ielmt,1,1,mesh)
337  ELSE
338  CALL bief_allvec(1,tdew ,'TDEW ', 0,1,0,mesh)
339  CALL bief_allvec(1,visbi ,'VISBI ', 0,1,0,mesh)
340  CALL bief_allvec(1,snow ,'SNOW ', 0,1,0,mesh)
341  ENDIF
342 !
343 ! METEOROLOGY
344 !
345  IF(water_quality.OR.ice) THEN
346  CALL bief_allvec(1,tair ,'TAIR ',ielmt,1,1,mesh)
347  CALL bief_allvec(1,rainfall ,'RAINFA',ielmt,1,1,mesh)
348  CALL bief_allvec(1,ray3 ,'RAY3 ',ielmt,1,1,mesh)
349  CALL bief_allvec(1,cldc ,'CLDC ',ielmt,1,1,mesh)
350  CALL bief_allvec(1,pvap ,'PVAP ',ielmt,1,1,mesh)
351  CALL bief_allvec(1,hrel ,'HREL ',ielmt,1,1,mesh)
352  ELSE
353  CALL bief_allvec(1,tair ,'TAIR ', 0,1,0,mesh)
354  CALL bief_allvec(1,rainfall ,'RAINFA', 0,1,0,mesh)
355  CALL bief_allvec(1,ray3 ,'RAY3 ', 0,1,0,mesh)
356  CALL bief_allvec(1,cldc ,'CLDC ', 0,1,0,mesh)
357  CALL bief_allvec(1,pvap ,'PVAP ', 0,1,0,mesh)
358  CALL bief_allvec(1,hrel ,'HREL ', 0,1,0,mesh)
359  ENDIF
360  CALL os('X=C ', x=tair, c=cst_tair )
361  inc_tair = .false.
362  CALL os('X=C ', x=rainfall, c=cst_rainfall )
363  inc_rainfall = .false.
364  CALL os('X=C ', x=ray3, c=cst_ray3 )
365  inc_ray3 = .false.
366  CALL os('X=C ', x=cldc, c=cst_cldc )
367  inc_cldc = .false.
368  CALL os('X=C ', x=pvap, c=cst_pvap )
369  inc_pvap = .false.
370  CALL os('X=C ', x=hrel, c=cst_hrel )
371  inc_hrel = .false.
372 !
373  CALL os('X=C ', x=tdew, c=cst_tdew )
374  inc_tdew = .false.
375 !
376  IF(vent.OR.water_quality.OR.ice) THEN
377  CALL bief_allvec(1,windx,'WINDX ',ielmt,1,1,mesh)
378  CALL bief_allvec(1,windy,'WINDY ',ielmt,1,1,mesh)
379  CALL bief_allvec(1,winds,'WINDS ',ielmt,1,1,mesh)
380  CALL bief_allvec(1,windd,'WINDD ',ielmt,1,1,mesh)
381  ELSE
382  CALL bief_allvec(1,windx,'WINDX ', 0,1,0,mesh)
383  CALL bief_allvec(1,windy,'WINDY ', 0,1,0,mesh)
384  CALL bief_allvec(1,winds,'WINDS ', 0,1,0,mesh)
385  CALL bief_allvec(1,windd,'WINDD ', 0,1,0,mesh)
386  ENDIF
387  CALL os('X=C ', x=windx, c=cst_windx )
388  CALL os('X=C ', x=windy, c=cst_windy )
389  inc_windx = .false.
390  inc_windy = .false.
391 ! ONLY WINDS AND WINDD ARE CONVERTED INOT WINDX AND WINDY
392  CALL os('X=C ', x=winds, c=cst_winds )
393  CALL os('X=C ', x=windd, c=cst_windd )
394  inc_winds = .false.
395  inc_windd = .false.
396 !
397  CALL os('X=C ', x=visbi, c=cst_visbi )
398  inc_visbi = .false.
399 !
400  CALL os('X=C ', x=snow, c=cst_snow )
401  inc_snow = .false.
402 !
403  IF(atmos.OR.water_quality.OR.ice) THEN
404  CALL bief_allvec(1,patmos,'PATMOS',ielmt,1,1,mesh)
405  ELSE
406  CALL bief_allvec(1,patmos,'PATMOS', 0,1,0,mesh)
407  ENDIF
408  CALL os('X=C ', x=patmos, c=cst_patmos )
409  inc_patmos = .false.
410 !
411 ! 1: ASCII FILE
412 ! 2: BINARY FILE
413 !
414  ALLOCATE(choix(meteo_maxvalue))
415  DO i = 1,2
416  IF( meteo_deja(i) ) THEN
418 !
419  j = find_name( 'TAIR', choix, meteo_maxvalue )
420  inc_tair = inc_tair .OR. ( j.NE.0 )
421 !
422  j = find_name( 'TDEW', choix, meteo_maxvalue )
423  inc_tdew = inc_tdew .OR. ( j.NE.0 )
424 !
425  j = find_name( 'WINDX', choix, meteo_maxvalue )
426  inc_windx = inc_windx .OR. ( j.NE.0 )
427  j = find_name( 'WINDY', choix, meteo_maxvalue )
428  inc_windy = inc_windy .AND. ( j.NE.0 )
429  j = find_name( 'WINDS', choix, meteo_maxvalue )
430  inc_winds = inc_winds .OR. ( j.NE.0 )
431  j = find_name( 'WINDD', choix, meteo_maxvalue )
432  inc_windd = inc_windd .OR. ( j.NE.0 )
433 !
434  j = find_name( 'CLDC', choix, meteo_maxvalue )
435  inc_cldc = inc_cldc .OR. ( j.NE.0 )
436 !
437  j = find_name( 'VISBI', choix, meteo_maxvalue )
438  inc_visbi = inc_visbi .OR. ( j.NE.0 )
439 !
440  j = find_name( 'RAINI', choix, meteo_maxvalue )
441  & + find_name( 'RAINC', choix, meteo_maxvalue )
442  inc_rainfall = inc_rainfall .OR. ( j.NE.0 )
443 !
444  j = find_name( 'SNOW', choix, meteo_maxvalue )
445  inc_snow = inc_snow .OR. ( j.NE.0 )
446 !
447  j = find_name( 'PATM', choix, meteo_maxvalue )
448  inc_patmos = inc_patmos .OR. ( j.NE.0 )
449 !
450  j = find_name( 'PVAP', choix, meteo_maxvalue )
451  inc_pvap = inc_pvap .OR. ( j.NE.0 )
452 !
453  j = find_name( 'HREL', choix, meteo_maxvalue )
454  inc_hrel = inc_hrel .OR. ( j.NE.0 )
455 !
456  j = find_name( 'RAY3', choix, meteo_maxvalue )
457  inc_ray3 = inc_ray3 .OR. ( j.NE.0 )
458 !
459  ENDIF
460  ENDDO
461  DEALLOCATE(choix)
462 
463 !
464 !-----------------------------------------------------------------------
465 !
466  RETURN
467  END SUBROUTINE
468 !
469 !=======================================================================
470 !
471 ! ************************
472  SUBROUTINE dealloc_meteo
473 ! ************************
474 !
475 !***********************************************************************
476 ! BIEF V8P2
477 !***********************************************************************
478 !
479 !brief Memory de-allocation of structures, aliases, blocks...
480 !
481 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
482 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
483 !
484  IMPLICIT NONE
485 !
486 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
487 !
488 ! DE-ALLOCATE FILE RELATED VARIABLES (SEE INIT_FIC_*)
489 !
490 ! A: ASCII FILE
491  IF( ALLOCATED(timea) ) DEALLOCATE(timea)
492  IF( ALLOCATED(xpoina) ) DEALLOCATE(xpoina)
493  IF( ALLOCATED(ypoina) ) DEALLOCATE(ypoina)
494  IF( ALLOCATED(valuea1) ) DEALLOCATE(valuea1)
495  IF( ALLOCATED(valuea2) ) DEALLOCATE(valuea2)
496 !
497 ! B: BINARY FILE
498  IF( ALLOCATED(timeb) ) DEALLOCATE(timeb)
499  IF( ALLOCATED(xpoinb) ) DEALLOCATE(xpoinb)
500  IF( ALLOCATED(ypoinb) ) DEALLOCATE(ypoinb)
501  IF( ALLOCATED(valueb0) ) DEALLOCATE(valueb0)
502  IF( ALLOCATED(valueb1) ) DEALLOCATE(valueb1)
503  IF( ALLOCATED(valueb2) ) DEALLOCATE(valueb2)
504 !
505 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
506 !
507 ! DE-ALLOCATE METEOROLOGICAL OBJECTS (SEE POINT_METEO)
508 !
509  CALL bief_deallobj(tair)
510  CALL bief_deallobj(tdew)
511  CALL bief_deallobj(windx)
512  CALL bief_deallobj(windy)
513  CALL bief_deallobj(winds)
514  CALL bief_deallobj(windd)
515  CALL bief_deallobj(cldc)
516  CALL bief_deallobj(visbi)
517  CALL bief_deallobj(rainfall)
518  CALL bief_deallobj(snow)
519  CALL bief_deallobj(pvap)
520  CALL bief_deallobj(ray3)
521  CALL bief_deallobj(patmos)
522  CALL bief_deallobj(hrel)
523 !
524 !-----------------------------------------------------------------------
525 !
526  RETURN
527  END SUBROUTINE
528 !
529 !=======================================================================
530 !
531 ! *********************
532  SUBROUTINE sync_meteo
533 ! *********************
534 !
535  &( when )
536 !
537 !***********************************************************************
538 ! BIEF V8P2
539 !***********************************************************************
540 !
541 !brief Synchronise the ASCII and the BINARY file for spatial and
542 ! temporal interpolation
543 !
544 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
545 !| WHEN |-->| CURRENT TIME
546 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
547 !
548  IMPLICIT NONE
549 !
550  DOUBLE PRECISION, INTENT(IN) :: WHEN
551 !
552  INTEGER :: IPOIN
553  DOUBLE PRECISION :: DTR
554 !
555 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
556 !
557 ! SYNCHRONISE BOTH THE ASCII AND THE BINARY FILES
558 !
559 ! A: ASCII FILE
560  IF( meteo_deja(1) ) CALL sync_fic_ascii( when )
561 !
562 ! B: BINARY FILE
563  IF( meteo_deja(2) ) CALL sync_fic_binary( when )
564 !
565 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
566 !
567  dtr = atan(1.d0) / 45.d0
568 !
569 ! UPDATE METEOROLOGICAL VARIABLES
570 !
571 ! TAIR: AIR TEMPERATURE
572  CALL os('X=C ', x=tair, c=cst_tair )
573  IF( inc_tair ) THEN
574  CALL interp_meteo(when,'TAIR',tair%R,tair%DIM1)
575  ENDIF
576 !
577 ! TDEW: DEWPOINT TEMPERATURE
578  CALL os('X=C ', x=tdew, c=cst_tdew )
579  IF( inc_tdew ) THEN
580  CALL interp_meteo(when,'TDEW',tdew%R,tdew%DIM1)
581  ENDIF
582 !
583 ! CLDC: CLOUD COVER
584  CALL os('X=C ', x=cldc, c=cst_cldc )
585  IF( inc_cldc ) THEN
586  CALL interp_meteo(when,'CLDC',cldc%R,cldc%DIM1)
587  ENDIF
588 !
589 ! VISBI: VISIBILITY
590  CALL os('X=C ', x=visbi, c=cst_visbi )
591  IF( inc_visbi ) THEN
592  CALL interp_meteo(when,'VISBI',visbi%R,visbi%DIM1)
593  ENDIF
594 !
595 ! RAINFALL: RAIN
596  CALL os('X=C ', x=rainfall, c=cst_rainfall )
597  IF( inc_rainfall ) THEN
598  CALL interp_meteo(when,'RAINI',rainfall%R,rainfall%DIM1)
599  CALL interp_meteo(when,'RAINC',rainfall%R,rainfall%DIM1)
600  ENDIF
601 !
602 ! SNOW: SNOW
603  CALL os('X=C ', x=snow, c=cst_snow )
604  IF( inc_snow ) THEN
605  CALL interp_meteo(when,'SNOW',snow%R,snow%DIM1)
606  ENDIF
607 !
608 ! WINDX,WINDY, OR WINDS,WINDD : WIND
609  CALL os('X=C ', x=windx, c=cst_windx )
610  IF( inc_windx ) THEN
611  CALL interp_meteo(when,'WINDX',windx%R,windx%DIM1)
612  ENDIF
613  CALL os('X=C ', x=windy, c=cst_windy )
614  IF( inc_windy ) THEN
615  CALL interp_meteo(when,'WINDY',windy%R,windy%DIM1)
616  ENDIF
617  CALL os('X=C ', x=winds, c=cst_winds )
618  IF( inc_winds ) THEN
619  CALL interp_meteo(when,'WINDS',winds%R,winds%DIM1)
620  ENDIF
621  CALL os('X=C ', x=windd, c=cst_windd )
622  IF( inc_windd ) THEN
623  CALL interp_meteo(when,'WINDD',windd%R,windd%DIM1)
624  ENDIF
625  IF( ( inc_winds.AND.inc_windd ).AND.
626  & .NOT.( inc_windx.AND.inc_windy ) ) THEN
627  CALL interp_windxy(when,windx%R,windy%R,windd%DIM1)
628  DO ipoin = 1,winds%DIM1
629  winds%R(ipoin) = sqrt(windy%R(ipoin)**2+windy%R(ipoin)**2)
630  ENDDO
631  ELSEIF( ( inc_winds.OR.inc_windd ).AND.
632  & .NOT.( inc_windx.AND.inc_windy ) ) THEN
633  DO ipoin = 1,windx%DIM1
634  windx%R(ipoin) = - winds%R(ipoin)*sin( windd%R(ipoin)*dtr )
635  windy%R(ipoin) = - winds%R(ipoin)*cos( windd%R(ipoin)*dtr )
636  ENDDO
637  ENDIF
638 !
639 ! ATMOSPHERIC PRESSURE
640  CALL os('X=C ', x=patmos, c=cst_patmos )
641  IF( inc_patmos ) THEN
642  CALL interp_meteo(when,'PATM',patmos%R,patmos%DIM1)
643  ENDIF
644 !
645 ! PVAP: PVAP
646  CALL os('X=C ', x=pvap, c=cst_pvap )
647  IF( inc_pvap ) THEN
648  CALL interp_meteo(when,'PVAP',pvap%R,pvap%DIM1)
649  ENDIF
650 !
651 ! HREL: HREL
652  CALL os('X=C ', x=hrel, c=cst_hrel )
653  IF( inc_hrel ) THEN
654  CALL interp_meteo(when,'HREL',hrel%R,hrel%DIM1)
655  ENDIF
656 !
657 ! RAY3: RAY3
658  CALL os('X=C ', x=ray3, c=cst_ray3 )
659  IF( inc_ray3 ) THEN
660  CALL interp_meteo(when,'RAY3',ray3%R,ray3%DIM1)
661  ENDIF
662 !
663 !-----------------------------------------------------------------------
664 !
665  RETURN
666  END SUBROUTINE
667 !
668 !=======================================================================
669 !
670 ! ***********************
671  SUBROUTINE interp_meteo
672 ! ***********************
673 !
674  &( when,what,valeurs,npoin )
675 !
676 !***********************************************************************
677 ! BIEF V8P2
678 !***********************************************************************
679 !
680 !brief Spatial and temporal interpolation of variables from either
681 !+ the ASCII or the BINARY file
682 !
683 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
684 !| NPOIN |-->| NUMBER OF NODES
685 !| VALEURS |<->| VALUES CONTAINED IN THE VARIABLE
686 !| WHAT |-->| VARIABLE TO CONSIDER
687 !| WHEN |-->| CURRENT TIME
688 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
689 !
690  IMPLICIT NONE
691 !
692  INTEGER, INTENT(IN) :: NPOIN
693  CHARACTER(LEN=*), INTENT(IN) :: WHAT
694  DOUBLE PRECISION, INTENT(IN) :: WHEN
695  DOUBLE PRECISION, INTENT(INOUT) :: VALEURS(npoin)
696 !
697  INTEGER J,IPOIN
698  DOUBLE PRECISION ALPHA,DELTA
699  DOUBLE PRECISION X1,Y1,Z1,X2,Y2,Z2,X3,Y3,Z3,NX,NY,NZ,MX,MY
700  CHARACTER(LEN=16), ALLOCATABLE :: CHOIX(:)
701 !
702 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
703 !
704 ! A: ASCII FILE
705  ALLOCATE(choix(meteo_maxvalue))
706  IF( meteo_deja(1) ) THEN
708  j = find_name( what, choix, meteo_maxvalue )
709  IF( j.NE.0 .AND. what.NE.'RAINC') THEN
710 ! ______________________________________________________________
711 ! TEMPORAL INTERPOLATION
712  delta = ( timea(itimea2)-timea(itimea1) )
713  alpha = ( when+tel_offset2-timea(itimea1) )/delta
714 ! ______________________________________________________________
715 ! SPATIAL INTERPOLATION - NO INTERPOLATION
716  IF( npoina.EQ.1 ) THEN
717  DO ipoin = 1,npoin
718  valeurs(ipoin) =
719  & ( 1.d0-alpha )*valuea1(j,1) + alpha*valuea2(j,1)
720 ! INTERPOLATION LIKE IN OLD INTERPMETEO
721 ! & VALUEA1(J,1) + (VALUEA2(J,1)-VALUEA1(J,1))*ALPHA
722  ENDDO
723 ! ______________________________________________________________
724 ! SPATIAL INTERPOLATION - TWO POINTS
725  ELSEIF( npoina.EQ.2 ) THEN
726 ! THE PROJECTION OF THE POINT TO THE LINE WILL GIVE YOU THE Z
727  x1 = xpoina(1)
728  y1 = ypoina(1)
729  x2 = xpoina(2)
730  y2 = ypoina(2)
731 ! BEFORE
732  z1 = valuea1(j,1)
733  z2 = valuea1(j,2)
734  z3 = 0.d0
735  IF( abs(x2-x1).GT.abs(y2-y1) ) THEN
736  z3 = ( z2-z1 )/( x2-x1 )
737  DO ipoin = 1,npoin
738  valeurs(ipoin) =
739  & ( 1.d0-alpha )*( z1+z3*(xpoina(ipoin)-x1) )
740  ENDDO
741  ELSEIF( abs(y2-y1).GT.abs(x2-x1) ) THEN
742  z3 = ( z2-z1 )/( y2-y1 )
743  DO ipoin = 1,npoin
744  valeurs(ipoin) =
745  & ( 1.d0-alpha )*( z1+z3*(ypoina(ipoin)-y1) )
746  ENDDO
747  ELSE
748  DO ipoin = 1,npoin
749  valeurs(ipoin) = ( 1.d0-alpha )*( z1 )
750  ENDDO
751  ENDIF
752 ! AFTER
753  z1 = valuea2(j,1)
754  z2 = valuea2(j,2)
755  z3 = 0.d0
756  IF( abs(x2-x1).GT.abs(y2-y1) ) THEN
757  z3 = ( z2-z1 )/( x2-x1 )
758  DO ipoin = 1,npoin
759  valeurs(ipoin) = valeurs(ipoin)
760  & + alpha*( z1+z3*(xpoina(ipoin)-x1) )
761  ENDDO
762  ELSEIF( abs(y2-y1).GT.abs(x2-x1) ) THEN
763  z3 = ( z2-z1 )/( y2-y1 )
764  DO ipoin = 1,npoin
765  valeurs(ipoin) = valeurs(ipoin)
766  & + alpha*( z1+z3*(ypoina(ipoin)-y1) )
767  ENDDO
768  ELSE
769  DO ipoin = 1,npoin
770  valeurs(ipoin) = valeurs(ipoin) + alpha*( z1 )
771  ENDDO
772  ENDIF
773 ! ______________________________________________________________
774 ! SPATIAL INTERPOLATION - THREE POINTS
775  ELSEIF( npoina.EQ.3 ) THEN
776 ! THE NORMAL VECTOR AND THE FIRST POINT DEFINE THE PLAN
777  x1 = xpoina(1)
778  y1 = ypoina(1)
779  x2 = xpoina(2)
780  y2 = ypoina(2)
781  x3 = xpoina(3)
782  y3 = ypoina(3)
783 ! BEFORE
784  z1 = valuea1(j,1)
785  z2 = valuea1(j,2)
786  z3 = valuea1(j,3)
787  nx = ( y2-y1 )*( z3-z1 ) - ( z2-z1 )*( y3-y1 )
788  ny = ( z2-z1 )*( x3-x1 ) - ( x2-x1 )*( z3-z1 )
789  nz = ( x2-x1 )*( y3-y1 ) - ( y2-y1 )*( x3-x1 )
790  DO ipoin = 1,npoin
791  mx = ( xpoina(ipoin)-x1 )*nx
792  my = ( ypoina(ipoin)-y1 )*ny
793  valeurs(ipoin) = ( 1.d0-alpha )*( z1-(mx+my)/nz )
794  ENDDO
795 ! AFTER
796  z1 = valuea2(j,1)
797  z2 = valuea2(j,2)
798  z3 = valuea2(j,3)
799  nx = ( y2-y1 )*( z3-z1 ) - ( z2-z1 )*( y3-y1 )
800  ny = ( z2-z1 )*( x3-x1 ) - ( x2-x1 )*( z3-z1 )
801  nz = ( x2-x1 )*( y3-y1 ) - ( y2-y1 )*( x3-x1 )
802  DO ipoin = 1,npoin
803  mx = ( xpoina(ipoin)-x1 )*nx
804  my = ( ypoina(ipoin)-y1 )*ny
805  valeurs(ipoin) = valeurs(ipoin) + alpha*( z1-(mx+my)/nz )
806  ENDDO
807  ENDIF
808 ! ________________________________________________________________
809  ELSEIF( j.NE.0 .AND. what.EQ.'RAINC') THEN
810 ! ______________________________________________________________
811 ! TEMPORAL INTERPOLATION
812  delta = ( timea(itimea2)-timea(itimea1) )
813 ! ______________________________________________________________
814 ! SPATIAL INTERPOLATION - NO INTERPOLATION
815  IF( npoina.EQ.1 ) THEN
816  DO ipoin = 1,npoin
817  valeurs(ipoin) = valuea2(j,1)/delta
818  ENDDO
819 ! ______________________________________________________________
820 ! SPATIAL INTERPOLATION - TWO POINTS
821  ELSEIF( npoina.EQ.2 ) THEN
822 ! THE PROJECTION OF THE POINT TO THE LINE WILL GIVE YOU THE Z
823  x1 = xpoina(1)
824  y1 = ypoina(1)
825  x2 = xpoina(2)
826  y2 = ypoina(2)
827 ! AFTER
828  z1 = valuea2(j,1)
829  z2 = valuea2(j,2)
830  z3 = 0.d0
831  IF( abs(x2-x1).GT.abs(y2-y1) ) THEN
832  z3 = ( z2-z1 )/( x2-x1 )
833  DO ipoin = 1,npoin
834  valeurs(ipoin) = ( z1+z3*(xpoina(ipoin)-x1) ) / delta
835  ENDDO
836  ELSEIF( abs(y2-y1).GT.abs(x2-x1) ) THEN
837  z3 = ( z2-z1 )/( y2-y1 )
838  DO ipoin = 1,npoin
839  valeurs(ipoin) = ( z1+z3*(ypoina(ipoin)-y1) ) / delta
840  ENDDO
841  ELSE
842  DO ipoin = 1,npoin
843  valeurs(ipoin) = z1 / delta
844  ENDDO
845  ENDIF
846 ! ______________________________________________________________
847 ! SPATIAL INTERPOLATION - THREE POINTS
848  ELSEIF( npoina.EQ.3 ) THEN
849 ! THE NORMAL VECTOR AND THE FIRST POINT DEFINE THE PLAN
850  x1 = xpoina(1)
851  y1 = ypoina(1)
852  x2 = xpoina(2)
853  y2 = ypoina(2)
854  x3 = xpoina(3)
855  y3 = ypoina(3)
856 ! AFTER
857  z1 = valuea2(j,1)
858  z2 = valuea2(j,2)
859  z3 = valuea2(j,3)
860  nx = ( y2-y1 )*( z3-z1 ) - ( z2-z1 )*( y3-y1 )
861  ny = ( z2-z1 )*( x3-x1 ) - ( x2-x1 )*( z3-z1 )
862  nz = ( x2-x1 )*( y3-y1 ) - ( y2-y1 )*( x3-x1 )
863  DO ipoin = 1,npoin
864  mx = ( xpoina(ipoin)-x1 )*nx
865  my = ( ypoina(ipoin)-y1 )*ny
866  valeurs(ipoin) = ( z1-(mx+my)/nz ) / delta
867  ENDDO
868  ENDIF
869 ! ________________________________________________________________
870  ENDIF
871  ENDIF
872 !
873 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
874 !
875 ! B: BINARY FILE
876  IF( meteo_deja(2) ) THEN
878  j = find_name( what, choix, meteo_maxvalue )
879  IF( j.NE.0 .AND. what.NE.'RAINC') THEN
880 ! ______________________________________________________________
881 ! TEMPORAL INTERPOLATION
882  delta = ( timeb(itimeb2)-timeb(itimeb1) )
883  alpha = ( when+tel_offset2-timeb(itimeb1) )/delta
884 ! ______________________________________________________________
885 ! SPATIAL INTERPOLATION - NO INTERPOLATION
886  DO ipoin = 1,npoin
887  valeurs(ipoin) =
888  & ( 1.d0-alpha )*valueb1(j,ipoin) + alpha*valueb2(j,ipoin)
889  ENDDO
890 !
891  ELSEIF( j.NE.0 .AND. what.EQ.'RAINC') THEN
892 ! ______________________________________________________________
893 ! TEMPORAL INTERPOLATION
894  delta = ( timeb(itimeb2)-timeb(itimeb1) )
895 ! ______________________________________________________________
896 ! SPATIAL INTERPOLATION - NO INTERPOLATION
897  DO ipoin = 1,npoin
898  valeurs(ipoin) = valueb2(j,ipoin) / delta
899  ENDDO
900 !
901  ENDIF
902  ENDIF
903  DEALLOCATE(choix)
904 !
905 !-----------------------------------------------------------------------
906 !
907  RETURN
908  END SUBROUTINE
909 !
910 !=======================================================================
911 !
912 ! ************************
913  SUBROUTINE interp_windxy
914 ! ************************
915 !
916  &( when,vitx,vity,npoin )
917 !
918 !***********************************************************************
919 ! BIEF V8P2
920 !***********************************************************************
921 !
922 !brief Spatial and temporal interpolation of X and Y wind components
923 !+ from either the ASCII or the BINARY file + magnitude+direction
924 !+ of velocity
925 !
926 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
927 !| NPOIN |-->| NUMBER OF NODES
928 !| VITX |<->| VALUES CONTAINED IN THE VARIABLE X WIND COMPONENT
929 !| VITY |<->| VALUES CONTAINED IN THE VARIABLE Y WIND COMPONENT
930 !| WHAT |-->| VARIABLE TO CONSIDER
931 !| WHEN |-->| CURRENT TIME
932 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
933 !
934  IMPLICIT NONE
935 !
936  INTEGER, INTENT(IN) :: NPOIN
937  DOUBLE PRECISION, INTENT(IN) :: WHEN
938  DOUBLE PRECISION, INTENT(INOUT) :: VITX(npoin),VITY(npoin)
939 !
940  INTEGER J1,J2,IPOIN
941  DOUBLE PRECISION DTR,TMPX1(3),TMPY1(3),TMPX2(3),TMPY2(3)
942  DOUBLE PRECISION ALPHA,DELTA
943  DOUBLE PRECISION X1,Y1,Z1,X2,Y2,Z2,X3,Y3,Z3,NX,NY,NZ,MX,MY
944  CHARACTER(LEN=16), ALLOCATABLE :: CHOIX(:)
945 !
946 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
947 !
948  dtr = atan(1.d0)/45.d0
949 !
950 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
951 !
952 ! A: ASCII FILE
953  ALLOCATE(choix(meteo_maxvalue))
954  IF( meteo_deja(1) ) THEN
956  j1 = find_name( 'WINDS', choix, meteo_maxvalue )
957  j2 = find_name( 'WINDD', choix, meteo_maxvalue )
958  IF( j1.NE.0 .AND. j2.NE.0) THEN
959 ! ______________________________________________________________
960 ! TEMPORAL INTERPOLATION
961  delta = ( timea(itimea2)-timea(itimea1) )
962  alpha = ( when+tel_offset2-timea(itimea1) )/delta
963 ! ______________________________________________________________
964 ! SPATIAL INTERPOLATION - NO INTERPOLATION
965  IF( npoina.EQ.1 ) THEN
966  tmpx1(1) = -valuea1(j1,1)*sin(valuea1(j2,1)*dtr)
967  tmpy1(1) = -valuea1(j1,1)*cos(valuea1(j2,1)*dtr)
968  tmpx2(1) = -valuea2(j1,1)*sin(valuea2(j2,1)*dtr)
969  tmpy2(1) = -valuea2(j1,1)*cos(valuea2(j2,1)*dtr)
970  DO ipoin = 1,npoin
971  vitx(ipoin) = ( 1.d0-alpha )*tmpx1(1) + alpha*tmpx2(1)
972  vity(ipoin) = ( 1.d0-alpha )*tmpy1(1) + alpha*tmpy2(1)
973 ! INTERPOLATION LIKE IN OLD INTERPMETEO
974 ! VITX(IPOIN) = TMPX1(1) + (TMPX2(1)-TMPX1(1)) *ALPHA
975 ! VITY(IPOIN) = TMPY1(1) + (TMPY2(1)-TMPY1(1)) *ALPHA
976  ENDDO
977 ! ______________________________________________________________
978 ! SPATIAL INTERPOLATION - TWO POINTS
979  ELSEIF( npoina.EQ.2 ) THEN
980 ! THE PROJECTION OF THE POINT TO THE LINE WILL GIVE YOU THE Z
981  x1 = xpoina(1)
982  y1 = ypoina(1)
983  x2 = xpoina(2)
984  y2 = ypoina(2)
985 ! X WIND VELOCITY COMPONENT
986 ! BEFORE
987  z1 = -valuea1(j1,1)*sin(valuea1(j2,1)*dtr)
988  z2 = -valuea1(j1,2)*sin(valuea1(j2,2)*dtr)
989  z3 = 0.d0
990  IF( abs(x2-x1).GT.abs(y2-y1) ) THEN
991  z3 = ( z2-z1 )/( x2-x1 )
992  DO ipoin = 1,npoin
993  vitx(ipoin) =
994  & ( 1.d0-alpha )*( z1+z3*(xpoina(ipoin)-x1) )
995  ENDDO
996  ELSEIF( abs(y2-y1).GT.abs(x2-x1) ) THEN
997  z3 = ( z2-z1 )/( y2-y1 )
998  DO ipoin = 1,npoin
999  vitx(ipoin) =
1000  & ( 1.d0-alpha )*( z1+z3*(ypoina(ipoin)-y1) )
1001  ENDDO
1002  ELSE
1003  DO ipoin = 1,npoin
1004  vitx(ipoin) = ( 1.d0-alpha )*( z1 )
1005  ENDDO
1006  ENDIF
1007 ! AFTER
1008  z1 = -valuea2(j1,1)*sin(valuea2(j2,1)*dtr)
1009  z2 = -valuea2(j1,2)*sin(valuea2(j2,2)*dtr)
1010  z3 = 0.d0
1011  IF( abs(x2-x1).GT.abs(y2-y1) ) THEN
1012  z3 = ( z2-z1 )/( x2-x1 )
1013  DO ipoin = 1,npoin
1014  vitx(ipoin) = vitx(ipoin)
1015  & + alpha*( z1+z3*(xpoina(ipoin)-x1) )
1016  ENDDO
1017  ELSEIF( abs(y2-y1).GT.abs(x2-x1) ) THEN
1018  z3 = ( z2-z1 )/( y2-y1 )
1019  DO ipoin = 1,npoin
1020  vitx(ipoin) = vitx(ipoin)
1021  & + alpha*( z1+z3*(ypoina(ipoin)-y1) )
1022  ENDDO
1023  ELSE
1024  DO ipoin = 1,npoin
1025  vitx(ipoin) = vitx(ipoin) + alpha*( z1 )
1026  ENDDO
1027  ENDIF
1028 ! Y WIND VELOCITY COMPONENT
1029 ! BEFORE
1030  z1 = -valuea1(j1,1)*cos(valuea1(j2,1)*dtr)
1031  z2 = -valuea1(j1,2)*cos(valuea1(j2,2)*dtr)
1032  z3 = 0.d0
1033  IF( abs(x2-x1).GT.abs(y2-y1) ) THEN
1034  z3 = ( z2-z1 )/( x2-x1 )
1035  DO ipoin = 1,npoin
1036  vity(ipoin) =
1037  & ( 1.d0-alpha )*( z1+z3*(xpoina(ipoin)-x1) )
1038  ENDDO
1039  ELSEIF( abs(y2-y1).GT.abs(x2-x1) ) THEN
1040  z3 = ( z2-z1 )/( y2-y1 )
1041  DO ipoin = 1,npoin
1042  vity(ipoin) =
1043  & ( 1.d0-alpha )*( z1+z3*(ypoina(ipoin)-y1) )
1044  ENDDO
1045  ELSE
1046  DO ipoin = 1,npoin
1047  vity(ipoin) = ( 1.d0-alpha )*( z1 )
1048  ENDDO
1049  ENDIF
1050 ! AFTER
1051  z1 = -valuea2(j1,1)*cos(valuea2(j2,1)*dtr)
1052  z2 = -valuea2(j1,2)*cos(valuea2(j2,2)*dtr)
1053  z3 = 0.d0
1054  IF( abs(x2-x1).GT.abs(y2-y1) ) THEN
1055  z3 = ( z2-z1 )/( x2-x1 )
1056  DO ipoin = 1,npoin
1057  vity(ipoin) = vity(ipoin)
1058  & + alpha*( z1+z3*(xpoina(ipoin)-x1) )
1059  ENDDO
1060  ELSEIF( abs(y2-y1).GT.abs(x2-x1) ) THEN
1061  z3 = ( z2-z1 )/( y2-y1 )
1062  DO ipoin = 1,npoin
1063  vity(ipoin) = vity(ipoin)
1064  & + alpha*( z1+z3*(ypoina(ipoin)-y1) )
1065  ENDDO
1066  ELSE
1067  DO ipoin = 1,npoin
1068  vity(ipoin) = vity(ipoin) + alpha*( z1 )
1069  ENDDO
1070  ENDIF
1071 ! ______________________________________________________________
1072 ! SPATIAL INTERPOLATION - THREE POINTS
1073  ELSEIF( npoina.EQ.3 ) THEN
1074 ! THE NORMAL VECTOR AND THE FIRST POINT DEFINE THE PLAN
1075  x1 = xpoina(1)
1076  y1 = ypoina(1)
1077  x2 = xpoina(2)
1078  y2 = ypoina(2)
1079  x3 = xpoina(3)
1080  y3 = ypoina(3)
1081 ! X WIND VELOCITY COMPONENT
1082 ! BEFORE
1083  z1 = -valuea1(j1,1)*sin(valuea1(j2,1)*dtr)
1084  z2 = -valuea1(j1,2)*sin(valuea1(j2,2)*dtr)
1085  z3 = -valuea1(j1,3)*sin(valuea1(j2,3)*dtr)
1086  nx = ( y2-y1 )*( z3-z1 ) - ( z2-z1 )*( y3-y1 )
1087  ny = ( z2-z1 )*( x3-x1 ) - ( x2-x1 )*( z3-z1 )
1088  nz = ( x2-x1 )*( y3-y1 ) - ( y2-y1 )*( x3-x1 )
1089  DO ipoin = 1,npoin
1090  mx = ( xpoina(ipoin)-x1 )*nx
1091  my = ( ypoina(ipoin)-y1 )*ny
1092  vitx(ipoin) = ( 1.d0-alpha )*( z1-(mx+my)/nz )
1093  ENDDO
1094 ! AFTER
1095  z1 = -valuea2(j1,1)*sin(valuea2(j2,1)*dtr)
1096  z2 = -valuea2(j1,2)*sin(valuea2(j2,2)*dtr)
1097  z3 = -valuea2(j1,3)*sin(valuea2(j2,3)*dtr)
1098  nx = ( y2-y1 )*( z3-z1 ) - ( z2-z1 )*( y3-y1 )
1099  ny = ( z2-z1 )*( x3-x1 ) - ( x2-x1 )*( z3-z1 )
1100  nz = ( x2-x1 )*( y3-y1 ) - ( y2-y1 )*( x3-x1 )
1101  DO ipoin = 1,npoin
1102  mx = ( xpoina(ipoin)-x1 )*nx
1103  my = ( ypoina(ipoin)-y1 )*ny
1104  vitx(ipoin) = vitx(ipoin) + alpha*( z1-(mx+my)/nz )
1105  ENDDO
1106 ! Y WIND VELOCITY COMPONENT
1107 ! BEFORE
1108  z1 = -valuea1(j1,1)*cos(valuea1(j2,1)*dtr)
1109  z2 = -valuea1(j1,2)*cos(valuea1(j2,2)*dtr)
1110  z3 = -valuea1(j1,3)*cos(valuea1(j2,3)*dtr)
1111  nx = ( y2-y1 )*( z3-z1 ) - ( z2-z1 )*( y3-y1 )
1112  ny = ( z2-z1 )*( x3-x1 ) - ( x2-x1 )*( z3-z1 )
1113  nz = ( x2-x1 )*( y3-y1 ) - ( y2-y1 )*( x3-x1 )
1114  DO ipoin = 1,npoin
1115  mx = ( xpoina(ipoin)-x1 )*nx
1116  my = ( ypoina(ipoin)-y1 )*ny
1117  vity(ipoin) = ( 1.d0-alpha )*( z1-(mx+my)/nz )
1118  ENDDO
1119 ! AFTER
1120  z1 = -valuea2(j1,1)*cos(valuea2(j2,1)*dtr)
1121  z2 = -valuea2(j1,2)*cos(valuea2(j2,2)*dtr)
1122  z3 = -valuea2(j1,3)*cos(valuea2(j2,3)*dtr)
1123  nx = ( y2-y1 )*( z3-z1 ) - ( z2-z1 )*( y3-y1 )
1124  ny = ( z2-z1 )*( x3-x1 ) - ( x2-x1 )*( z3-z1 )
1125  nz = ( x2-x1 )*( y3-y1 ) - ( y2-y1 )*( x3-x1 )
1126  DO ipoin = 1,npoin
1127  mx = ( xpoina(ipoin)-x1 )*nx
1128  my = ( ypoina(ipoin)-y1 )*ny
1129  vity(ipoin) = vity(ipoin) + alpha*( z1-(mx+my)/nz )
1130  ENDDO
1131  ENDIF
1132 ! ________________________________________________________________
1133  ENDIF
1134  ENDIF
1135 !
1136 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1137 !
1138 ! B: BINARY FILE
1139  IF( meteo_deja(2) ) THEN
1140  choix(1:meteo_maxvalue) = meteo_choix(2,1:meteo_maxvalue)
1141  j1 = find_name( 'WINDS', choix, meteo_maxvalue )
1142  j2 = find_name( 'WINDD', choix, meteo_maxvalue )
1143  IF( j1.NE.0 .AND. j2.NE.0) THEN
1144 ! ______________________________________________________________
1145 ! TEMPORAL INTERPOLATION
1146  delta = ( timeb(itimeb2)-timeb(itimeb1) )
1147  alpha = ( when+tel_offset2-timeb(itimeb1) )/delta
1148 ! ______________________________________________________________
1149 ! SPATIAL INTERPOLATION - NO INTERPOLATION
1150  DO ipoin = 1,npoin
1151  tmpx1(1) = -valueb1(j1,ipoin)*sin(valueb1(j2,ipoin)*dtr)
1152  tmpy1(1) = -valueb1(j1,ipoin)*cos(valueb1(j2,ipoin)*dtr)
1153  tmpx2(1) = -valueb2(j1,ipoin)*sin(valueb2(j2,ipoin)*dtr)
1154  tmpy2(1) = -valueb2(j1,ipoin)*cos(valueb2(j2,ipoin)*dtr)
1155  vitx(ipoin) = ( 1.d0-alpha )*tmpx1(1) + alpha*tmpx2(1)
1156  vity(ipoin) = ( 1.d0-alpha )*tmpy1(1) + alpha*tmpy2(1)
1157  ENDDO
1158 !
1159  ENDIF
1160  ENDIF
1161  DEALLOCATE(choix)
1162 !
1163 !-----------------------------------------------------------------------
1164 !
1165  RETURN
1166  END SUBROUTINE
1167 !
1168 !=======================================================================
1169 !
1170 ! **************************
1171  INTEGER FUNCTION find_name
1172 ! **************************
1173 !
1174  &( name,choix,maxvalue )
1175 !
1176 !***********************************************************************
1177 ! BIEF V8P2
1178 !***********************************************************************
1179 !
1180 !brief Search for NAME in a list of CHOIX (variables found in the
1181 !+ METEO files). Return 0 if not found, the index in CHOIX
1182 !+ otherwise.
1183 !
1184 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1185 !| CHOIX |-->| LIST OF VARIABLES PRESENT IN THE METEO FILE
1186 !| MAXVALUE |-->| MAXIMUM SIZE OF THE LIST CHOIX
1187 !| NAME |-->| MNEMO OF THE VARIABLE
1188 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1189 !
1190  IMPLICIT NONE
1191 !
1192  CHARACTER(LEN=*), INTENT(IN) :: NAME
1193  INTEGER, INTENT(IN) :: MAXVALUE
1194  CHARACTER(LEN=*), INTENT(IN) :: CHOIX(maxvalue)
1195 !
1196  INTEGER :: I
1197 !
1198 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1199 !
1200 ! DEFAULT IF NOT FOUND
1201  find_name = 0
1202 ! LOOP THROUGH
1203  DO i = 1,maxvalue
1204  IF( inclus( choix(i), name ) ) find_name = i
1205  ENDDO
1206 !
1207 !-----------------------------------------------------------------------
1208 !
1209  RETURN
1210  END FUNCTION
1211 !
1212 !=======================================================================
1213 !
1214 ! **************************
1215  SUBROUTINE init_fic_binary
1216 ! **************************
1217 !
1218  &( files,atmfileb )
1219 !
1220 !***********************************************************************
1221 ! BIEF V8P2
1222 !***********************************************************************
1223 !
1224 !brief Scan the ASCII file and prepare skeleton for future calls
1225 !
1226 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1227 !| ATMFILEA |-->| LOGICAL UNIT OF ASCII FILE FOR METEO
1228 !| FILES |-->| ARRAYS OF ALL FILES
1229 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1230 !
1231  USE interface_hermes
1232  IMPLICIT NONE
1233 !
1234  TYPE(bief_file), INTENT(IN) :: FILES(*)
1235  INTEGER, INTENT(IN) :: ATMFILEB
1236 !
1237  INTEGER :: I,J, NFIC, IERR
1238  CHARACTER(LEN=8) :: NFMT
1239 !
1240  CHARACTER(LEN=16), POINTER :: CHOIX(:)
1241  CHARACTER(LEN=16), POINTER :: UNITS(:)
1242 !
1243 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1244 !
1245 ! SETTING LOCAL ASCII FILE
1246  meteo_files(2)%LU = files(atmfileb)%LU
1247  meteo_files(2)%NAME = files(atmfileb)%NAME
1248  meteo_files(2)%TELNAME = files(atmfileb)%TELNAME
1249  meteo_files(2)%FMT = files(atmfileb)%FMT
1250  meteo_files(2)%ACTION = files(atmfileb)%ACTION
1251  meteo_files(2)%BINASC = files(atmfileb)%BINASC
1252  meteo_files(2)%TYPE = files(atmfileb)%TYPE
1253 !
1254 ! SIMPLIFYING NOTATIONS
1255  nfmt = meteo_files(2)%FMT
1256  nfic = meteo_files(2)%LU
1257  units => meteo_units(2,1:meteo_maxvalue)
1258  choix => meteo_choix(2,1:meteo_maxvalue)
1259 !
1260 !
1261 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1262 !
1263 ! SCAN THE SKELETON
1264 !
1265 ! __________________________________________________________________
1266 ! GET THE NUMBER OF POINTS IN THE METEO FILE
1267  CALL get_mesh_npoin(nfmt,nfic,triangle_elt_type,npoinb,ierr)
1268  CALL check_call
1269  & (ierr,"METEO,INIT_FIC_BINARY: GET_MESH_NPOIN")
1270 !
1271 ! __________________________________________________________________
1272 ! FIND OUT WHAT VARIABLES ARE GIVEN IN THE FILE
1273 !
1274  CALL get_data_nvar(nfmt,nfic,nvalueb,ierr)
1275  CALL check_call
1276  & (ierr, 'METEO,INIT_FIC_BINARY:GET_DATA_NVAR')
1277 !
1278  CALL get_data_var_list(nfmt,nfic,nvalueb,choix,units,ierr)
1279  CALL check_call
1280  & (ierr, 'METEO,INIT_FIC_BINARY:GET_DATA_VAR_LIST')
1281 !
1282 ! __________________________________________________________________
1283 ! GET THE TIME PROFILE FOR FUTURE INTERPOLATION
1284  CALL get_data_ntimestep(nfmt,nfic,ntimeb,ierr)
1285  CALL check_call
1286  & (ierr,'METEO,INIT_FIC_BINARY:GET_DATA_NTIMESTEP')
1287 !
1288  ALLOCATE(timeb(ntimeb))
1289  DO i = 1,ntimeb
1290  CALL get_data_time(nfmt,nfic,i,timeb(i),ierr)
1291  CALL check_call
1292  & (ierr,'METEO,INIT_FIC_BINARY:GET_DATA_TIME:I')
1293  timeb(i) = timeb(i) + meteo_offset
1294  ENDDO
1295 !
1296 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1297 !
1298 ! PREPARE FOR NEXT ACCESS TO THE FILE
1299 !
1301  ALLOCATE(valueb0(npoinb))
1302 ! __________________________________________________________________
1303 ! READ ONE TIME FRAME AT LEAST
1304  itimeb1 = 1
1305  itimeb2 = 1
1306  DO i = 1,nvalueb
1307  CALL get_data_value
1308  & (nfmt,nfic,itimeb1,choix(i),valueb0,npoinb,ierr)
1309  CALL check_call
1310  & (ierr,'METEO,INIT_FIC_BINARY:GET_DATA_VALUE:CHOIX')
1311  DO j = 1,npoinb
1312  valueb1(i,j) = valueb0(j)
1313  valueb2(i,j) = valueb0(j)
1314  ENDDO
1315  ENDDO
1316 ! __________________________________________________________________
1317 ! READ A SECOND TIME FRAME IF THERE
1318  IF( ntimeb.GT.1 )THEN
1319  itimeb2 = 1
1320  DO i = 1,nvalueb
1321  CALL get_data_value
1322  & (nfmt,nfic,itimeb2,choix(i),valueb0,npoinb,ierr)
1323  CALL check_call
1324  & (ierr,'METEO,INIT_FIC_BINARY:GET_DATA_VALUE:CHOIX')
1325  DO j = 1,npoinb
1326  valueb2(i,j) = valueb0(j)
1327  ENDDO
1328  ENDDO
1329  ENDIF
1330 !
1331 !-----------------------------------------------------------------------
1332 !
1333  RETURN
1334  END SUBROUTINE
1335 !
1336 !=======================================================================
1337 !
1338 ! *************************
1339  SUBROUTINE init_fic_ascii
1340 ! *************************
1341 !
1342  &( files,atmfilea )
1343 !
1344 !***********************************************************************
1345 ! BIEF V8P2
1346 !***********************************************************************
1347 !
1348 !brief Scan the ASCII file and prepare skeleton for future calls
1349 !
1350 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1351 !| ATMFILEA |-->| LOGICAL UNIT OF ASCII FILE FOR METEO
1352 !| FILES |-->| ARRAYS OF ALL FILES
1353 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1354 !
1355  IMPLICIT NONE
1356 !
1357  TYPE(bief_file), INTENT(IN) :: FILES(*)
1358  INTEGER, INTENT(IN) :: ATMFILEA
1359 !
1360  INTEGER :: I,J,K, NFIC, IDEB,IFIN, NPOINX,NPOINY
1361  CHARACTER(LEN=SIZELIGN) :: LIGNE
1362  DOUBLE PRECISION :: X1,X2,X3, Y1,Y2,Y3
1363 !
1364  CHARACTER(LEN=16), POINTER :: CHOIX(:)
1365 !
1366 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1367 !
1368 ! SETTING LOCAL ASCII FILE
1369  meteo_deja(1) = .false.
1370  meteo_files(1)%LU = files(atmfilea)%LU
1371  meteo_files(1)%NAME = files(atmfilea)%NAME
1372  meteo_files(1)%TELNAME = files(atmfilea)%TELNAME
1373  meteo_files(1)%FMT = files(atmfilea)%FMT
1374  meteo_files(1)%ACTION = files(atmfilea)%ACTION
1375  meteo_files(1)%BINASC = files(atmfilea)%BINASC
1376  meteo_files(1)%TYPE = files(atmfilea)%TYPE
1377 !
1378 ! SIMPLIFYING NOTATIONS
1379  nfic = meteo_files(1)%LU
1380  choix => meteo_choix(1,1:meteo_maxvalue)
1381 !
1382 ! DEFAULT NUMBER OF LOCATIONS
1383  npoinx = 1
1384  npoiny = 1
1385  x1 = 0.d0
1386  y1 = 0.d0
1387 !
1388  meteo_ref_date(1) = 0
1389  meteo_ref_date(2) = 0
1390  meteo_ref_date(3) = 0
1391  meteo_ref_date(4) = 0
1392  meteo_ref_date(5) = 0
1393  meteo_ref_date(6) = 0
1394 !
1395 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1396 !
1397 ! READ THE FILE ONE TIME IN FULL TO SIZE UP ITS CONTENT
1398 ! ( TODO: REPLACE GOTO STATEMENTS BY WHILE STATEMENT )
1399  rewind(nfic)
1400 !
1401 ! READS THE HEADLINE OF THE DATA FILE
1402 !
1403 ! JUMPING TWO LINES OF COMMENTS
1404  READ(nfic,fmt='(A)',err=103) ligne
1405  IF(ligne(1:8).EQ.'#REFDATE') THEN
1406  CALL read_ref_date(ligne, meteo_ref_date)
1407  ELSE
1408  backspace(nfic)
1409  ENDIF
1410 ! __________________________________________________________________
1411 ! SKIP COMMENTS
1412 !
1413  101 READ(nfic,fmt='(A)',err=103) ligne
1414  GOTO 102
1415 !
1416  103 CONTINUE
1417  WRITE(lu,*) 'ERROR WHILE READING THE ASCII FILE'
1418  WRITE(lu,*) 'USED FOR THE METEO (THERMAL PROCESSES)'
1419  WRITE(lu,*) 'PROBABLY A PROBLEM OF FORMAT'
1420  WRITE(lu,*) 'ANY WINDOWS CARRIAGE RETURNS ON UNIX OR LINUX'
1421  WRITE(lu,*) 'GUILTY LINE:'
1422  WRITE(lu,*) ligne
1423  CALL plante(1)
1424  stop
1425 !
1426  102 CONTINUE
1427 ! IF( LIGNE(1:36).EQ.'#SPECIAL ASCII ATMOSPHERIC DATA FILE' ) THEN
1428 ! WRITE(LU,*) 'SPECIAL ASCII ATMOSPHERIC DATA FILE'
1429 ! WRITE(LU,*) 'TREATMENT TO IMPLEMENTED BY THE USER'
1430 ! RETURN
1431 ! ENDIF
1432 !
1433  IF( ligne(1:1).EQ.':' ) THEN
1434 ! DEFINING X-LOCATIONS IF MORE THAN ONE (UP TO THREE)
1435  IF( inclus(ligne,':X') )THEN
1436  ideb = 2
1437  151 IF( ideb.GE.sizelign ) GOTO 152
1438  ideb = ideb + 1
1439  IF( (ligne(ideb:ideb).NE.' ') .AND.
1440  & ligne(ideb:ideb).NE.char(9) ) GOTO 151
1441 ! THE REST OF THE LINE SHOULD HAVE AT MOST THREE VALUES
1442  READ(ligne(ideb:sizelign),*,err=152) x1,x2
1443  npoinx = npoinx + 1
1444  READ(ligne(ideb:sizelign),*,err=152) x1,x2,x3
1445  npoinx = npoinx + 1
1446  152 CONTINUE
1447 ! DEFINING Y-LOCATIONS IF MORE THAN ONE (UP TO THREE)
1448  ELSEIF( inclus(ligne,':Y') )THEN
1449  ideb = 2
1450  153 IF( ideb.GE.sizelign ) GOTO 154
1451  ideb = ideb + 1
1452  IF( (ligne(ideb:ideb).NE.' ') .AND.
1453  & ligne(ideb:ideb).NE.char(9) ) GOTO 153
1454 ! THE REST OF THE LINE SHOULD HAVE AT MOST THREE VALUES
1455  READ(ligne(ideb:sizelign),*,err=154) y1,y2
1456  npoiny = npoiny + 1
1457  READ(ligne(ideb:sizelign),*,err=154) y1,y2,y3
1458  npoiny = npoiny + 1
1459  154 CONTINUE
1460  ENDIF
1461  ENDIF
1462  IF( ligne(1:1).EQ.'#' .OR.
1463  & ligne(1:1).EQ.'!' .OR.
1464  & ligne(1:1).EQ.':' ) GOTO 101
1465 !
1466  IF(any(meteo_ref_date.NE.0)) THEN
1467  IF(tel_offset.LE.1.d-16) THEN
1468  WRITE(lu,*) 'REFERENCE DATE IN ASCII ATMOSPHERIC DATA FILE'
1469  WRITE(lu,*) 'MISSING ORIGINAL DATE OF TIME IN '//
1470  & 'STEERING FILE'
1471  CALL plante(1)
1472  stop
1473  ENDIF
1475  & meteo_ref_date(4:6))
1477  WRITE(lu,*) 'USING REFERENCE DATE FOR METEO:'
1478  WRITE(lu,666) meteo_ref_date
1479 666 FORMAT(5x,1i4,'-',1i0.2,'-',1i0.2,' ',
1480  & 1i0.2,':',1i0.2,':',1i0.2)
1481  ELSE
1482  tel_offset2 = 0.d0
1483  meteo_offset = 0.d0
1484  ENDIF
1485 !
1486 ! __________________________________________________________________
1487 ! FINALISING LOCATIONS
1488 !
1489  IF( npoinx.NE.npoiny )THEN
1490  WRITE(lu,*) 'NUMBER OF LOCATIONS X AND Y LOCATIONS READ'
1491  WRITE(lu,*) 'IN THE ASCII FILE USED FOR THE METEO (THERMAL'
1492  WRITE(lu,*) 'PROCESSES) DIFFERENT.'
1493  ENDIF
1494  npoina = npoinx
1495  ALLOCATE( xpoina(npoina),ypoina(npoina) )
1496  IF( npoina.GE.1 ) THEN
1497  xpoina(1) = x1
1498  ypoina(1) = y1
1499  ENDIF
1500  IF( npoina.GE.2 ) THEN
1501  xpoina(2) = x2
1502  ypoina(2) = y2
1503  ENDIF
1504  IF( npoina.EQ.3 ) THEN
1505  xpoina(3) = x3
1506  ypoina(3) = y3
1507  ENDIF
1508 ! __________________________________________________________________
1509 ! FIND OUT WHAT AND HOW MANY VALUES ARE GIVEN IN THE FILE
1510 !
1511  nvaluea = -1
1512  ifin = 1
1513  104 ideb = ifin
1514 !
1515 ! IDENTIFY FIRST CHARACTER OF NAME
1516  105 IF((ligne(ideb:ideb).EQ.' '.OR.ligne(ideb:ideb).EQ.char(9))
1517  & .AND.ideb.LT.sizelign) THEN
1518  ideb = ideb + 1
1519  GOTO 105
1520  ENDIF
1521 ! IDENTIFY LAST CHARACTER OF NAME ( TODO: USE A WHILE STATEMENT )
1522  ifin = ideb
1523  106 IF( ligne(ifin:ifin).NE.' '.AND.ligne(ifin:ifin).NE.char(9)
1524  & .AND.ifin.LT.sizelign) THEN
1525  ifin = ifin + 1
1526  GOTO 106
1527  ENDIF
1528 !
1529  IF( ideb.EQ.ifin ) GOTO 140 ! IDEB .EQ. IFIN .EQ. SIZELIGN
1530 !
1531  nvaluea = nvaluea + 1
1532  IF( nvaluea.EQ.0 ) THEN
1533 ! SPECIAL CASE FOR TIME
1534  IF(ligne(ideb:ifin-1).NE.'T') THEN
1535  WRITE(lu,*) 'THE FIRST VARIABLE MUST BE TIME T IN THE'
1536  WRITE(lu,*) 'ASCII FILE USED FOR THE METEO (THERMAL'
1537  WRITE(lu,*) 'PROCESSES). OTHER POSSIBLE CAUSE:'
1538  WRITE(lu,*) 'THERE ARE TABS IN THE FILE'
1539  WRITE(lu,*) 'CHANGE TABS INTO SPACES'
1540  CALL plante(1)
1541  stop
1542  ENDIF
1543  ELSEIF( nvaluea.LE.meteo_maxvalue ) THEN
1544  choix(nvaluea) = ' '
1545  choix(nvaluea)(1:ifin-ideb+1) = ligne(ideb:ifin-1)
1546  ELSE
1547  WRITE(lu,*) 'INCREASE MAXVALUE FOR READ_FIC_ASCII'
1548  CALL plante(1)
1549  stop
1550  ENDIF
1551  IF(ifin.LT.sizelign) GO TO 104
1552 !
1553  IF( int(nvaluea/npoina)*npoina .EQ. nvaluea )THEN
1554  nvaluea = int(nvaluea/npoina)
1555  ELSE
1556  WRITE(lu,*) 'NUMBER OF LOCATIONS AND TOTAL NUMBER OF VALUES'
1557  WRITE(lu,*) 'FOUND IN THE ASCCI FILE FOR METEO (THERMAL'
1558  WRITE(lu,*) 'PROCESSES) ARE INCOMPATIBLE.'
1559  WRITE(lu,*) 'ONE VALUE PER VARIABLE SHOULD BE THERE FOR EACH'
1560  WRITE(lu,*) 'LOCATION.'
1561  CALL plante(1)
1562  stop
1563  ENDIF
1564 ! __________________________________________________________________
1565 ! SKIP THE LINE WITH UNITS AS WELL AS COMMENTS
1566  140 READ(nfic,fmt='(A)',err=103) ligne
1567  IF( ligne(1:1).EQ.'#' .OR.
1568  & ligne(1:1).EQ.'!' .OR.
1569  & ligne(1:1).EQ.':' ) GOTO 140
1570 ! __________________________________________________________________
1571 ! COUNT LINES OF DATA
1572  ntimea = 0
1573  201 READ(nfic,*,end=202,err=203) ligne
1574  IF( ligne(1:1).NE.'#' .AND.
1575  & ligne(1:1).NE.'!' .AND.
1576  & ligne(1:1).NE.':' ) ntimea = ntimea + 1
1577  GOTO 201
1578 !
1579  203 CONTINUE
1580  WRITE(lu,*) 'ERROR READING THE ASCII FILE USED FOR THE METEO'
1581  WRITE(lu,*) '(THERMAL PROCESSES) AT LINE: ',ntimea
1582  WRITE(lu,*) '(COMMENTS EXCLUDED)'
1583  CALL plante(1)
1584  stop
1585 !
1586  202 CONTINUE
1587  IF( ntimea.LE.1 ) THEN
1588  WRITE(lu,*) 'TWO TIME STEP AT LEAST SHOULD BE PRESENT IN'
1589  WRITE(lu,*) 'THE ASCII FILE USED FOR THE METEO (THERMAL'
1590  WRITE(lu,*) 'PROCESSES)'
1591  CALL plante(1)
1592  stop
1593  ENDIF
1594 !
1595 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1596 !
1597 ! READ THE FILE A SECOND TIME IN FULL TO KEEP ITS SCKELETON
1598 ! ( TODO: REPLACE GOTO STATEMENTS BY WHILE STATEMENT )
1599  rewind(nfic)
1600 ! __________________________________________________________________
1601 ! ALLOCATE TIME SCKELETON IN MEMORY
1602  ALLOCATE(timea(ntimea))
1604 ! __________________________________________________________________
1605 ! SKIP COMMENTS AND FIRST TWO MANDATORY LINES
1606  111 READ(nfic,fmt='(A)') ligne
1607  IF( ligne(1:1).EQ.'#' .OR.
1608  & ligne(1:1).EQ.'!' .OR.
1609  & ligne(1:1).EQ.':' ) GOTO 111
1610  112 READ(nfic,fmt='(A)') ligne
1611  IF( ligne(1:1).EQ.'#' .OR.
1612  & ligne(1:1).EQ.'!' .OR.
1613  & ligne(1:1).EQ.':' ) GOTO 112
1614 ! __________________________________________________________________
1615 ! SAVE ALL TIMES FOR TEMPORAL INTERPOLATION
1616  DO i = 1,ntimea
1617  113 READ(nfic,fmt='(A)') ligne
1618  IF( ligne(1:1).EQ.'#' .OR.
1619  & ligne(1:1).EQ.'!' .OR.
1620  & ligne(1:1).EQ.':' ) GOTO 113
1621  READ(ligne,*) timea(i),((valuea1(j,k),j=1,nvaluea),k=1,npoina)
1622  timea(i) = timea(i) + meteo_offset
1623  ENDDO
1624 !
1625  IF(meteo_offset.LE.1.d-16) THEN
1626  tel_offset2 = 0.d0
1627  ELSE
1629  ENDIF
1630 !
1631 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1632 !
1633 ! REWIND AND PREPARE FOR NEXT ACCESS TO THE FILE
1634  rewind(nfic)
1635 ! __________________________________________________________________
1636 ! SKIP COMMENTS AND FIRST TWO MANDATORY LINES
1637  121 READ(nfic,fmt='(A)') ligne
1638  IF( ligne(1:1).EQ.'#' .OR.
1639  & ligne(1:1).EQ.'!' .OR.
1640  & ligne(1:1).EQ.':' ) GOTO 121
1641  122 READ(nfic,fmt='(A)') ligne
1642  IF( ligne(1:1).EQ.'#' .OR.
1643  & ligne(1:1).EQ.'!' .OR.
1644  & ligne(1:1).EQ.':' ) GOTO 122
1645 ! __________________________________________________________________
1646 ! INITIAL TIMES AND VALUES TO THE FIRST TWO LINES
1647  itimea1 = 1
1648  123 READ(nfic,fmt='(A)') ligne
1649  IF( ligne(1:1).EQ.'#' .OR.
1650  & ligne(1:1).EQ.'!' .OR.
1651  & ligne(1:1).EQ.':' ) GOTO 123
1652  READ(ligne,*) dummy, ! TIMEA(ITIMEA1), ALREADY STORED + SHIFTED
1653  & ((valuea1(j,k),j=1,nvaluea),k=1,npoina)
1654  itimea2 = 2
1655  124 READ(nfic,fmt='(A)') ligne
1656  IF( ligne(1:1).EQ.'#' .OR.
1657  & ligne(1:1).EQ.'!' .OR.
1658  & ligne(1:1).EQ.':' ) GOTO 124
1659  READ(ligne,*) dummy, ! TIMEA(ITIMEA2), ALREADY STORED + SHIFTED
1660  & ((valuea2(j,k),j=1,nvaluea),k=1,npoina)
1661 !
1662 !-----------------------------------------------------------------------
1663 !
1664  RETURN
1665  END SUBROUTINE
1666 !
1667 !=======================================================================
1668 !
1669 ! **************************
1670  SUBROUTINE sync_fic_binary
1671 ! **************************
1672 !
1673  &( when )
1674 !
1675 !***********************************************************************
1676 ! BIEF V8P2
1677 !***********************************************************************
1678 !
1679 !brief Synchronise the BINARY file for spatial and temporal
1680 ! interpolation
1681 !
1682 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1683 !| WHEN |-->| CURRENT TIME
1684 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1685 !
1686  IMPLICIT NONE
1687 !
1688  DOUBLE PRECISION, INTENT(IN) :: WHEN
1689 !
1690  INTEGER :: I,J, IERR, NFIC
1691  CHARACTER(LEN=8) :: NFMT
1692 !
1693  CHARACTER(LEN=16), POINTER :: CHOIX(:)
1694 !
1695 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1696 !
1697 ! SIMPLIFYING NOTATIONS
1698  nfmt = meteo_files(2)%FMT
1699  nfic = meteo_files(2)%LU
1700  choix => meteo_choix(2,1:meteo_maxvalue)
1701 !
1702 !
1703 ! INTERPOLATE IN TIME FOR ONE PARTICULAR VARIABLE
1704 ! __________________________________________________________________
1705 ! TOO EARLY
1706  IF( when+tel_offset2.LT.timeb(1) ) THEN
1707  WRITE(lu,*) 'THE TIME REQUESTED IS TOO EARLY COMPARED TO'
1708  WRITE(lu,*) 'THE PROFIL OF BINARY FILE USED FOR THE METEO'
1709  WRITE(lu,*) '(THERMAL PROCESSES)'
1710  CALL plante(1)
1711  stop
1712 ! __________________________________________________________________
1713 ! TOO LATE
1714  ELSEIF( when+tel_offset2.GT.timeb(ntimeb) ) THEN
1715  WRITE(lu,*) 'THE TIME REQUESTED IS TOO LATE COMPARED TO'
1716  WRITE(lu,*) 'THE PROFIL OF BINARY FILE USED FOR THE METEO'
1717  WRITE(lu,*) '(THERMAL PROCESSES)'
1718  CALL plante(1)
1719  stop
1720  ENDIF
1721 ! __________________________________________________________________
1722 ! FIND WHEN
1723  IF( when+tel_offset2.GT.timeb(itimeb2) )THEN
1724  132 itimeb1 = itimeb2
1725  DO i = 1,nvalueb
1726  DO j = 1,npoinb
1727  valueb1(i,j) = valueb2(i,j)
1728  ENDDO
1729  ENDDO
1730  itimeb2 = itimeb2 + 1
1731  DO i = 1,nvalueb
1732  CALL get_data_value
1733  & (nfmt,nfic,itimeb2,choix(i),valueb0,npoinb,ierr)
1734  CALL check_call
1735  & (ierr,'METEO,INIT_FIC_BINARY:GET_DATA_VALUE:CHOIX')
1736  DO j = 1,npoinb
1737  valueb2(i,j) = valueb0(j)
1738  ENDDO
1739  ENDDO
1740  IF( when+tel_offset2.GT.timeb(itimeb2) ) GOTO 132
1741 !
1742  ENDIF
1743 !
1744 !-----------------------------------------------------------------------
1745 !
1746  RETURN
1747  END SUBROUTINE
1748 !
1749 !=======================================================================
1750 !
1751 ! *************************
1752  SUBROUTINE sync_fic_ascii
1753 ! *************************
1754 !
1755  &( when )
1756 !
1757 !***********************************************************************
1758 ! BIEF V8P2
1759 !***********************************************************************
1760 !
1761 !brief Synchronise the ASCII file for spatial and temporal
1762 ! interpolation
1763 !
1764 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1765 !| WHEN |-->| CURRENT TIME
1766 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1767 !
1768  IMPLICIT NONE
1769 !
1770  DOUBLE PRECISION, INTENT(IN) :: WHEN
1771 !
1772  INTEGER :: J,K, NFIC
1773  CHARACTER(LEN=SIZELIGN) :: LIGNE
1774 !
1775 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1776 !
1777 ! SIMPLIFYING NOTATIONS
1778  nfic = meteo_files(1)%LU
1779 !
1780 !
1781 ! INTERPOLATE IN TIME FOR ONE PARTICULAR VARIABLE
1782 ! __________________________________________________________________
1783 ! TOO EARLY
1784  IF( when+tel_offset2.LT.timea(1) ) THEN
1785  WRITE(lu,*) 'THE TIME REQUESTED IS TOO EARLY COMPARED TO'
1786  WRITE(lu,*) 'THE PROFIL OF ASCII FILE USED FOR THE METEO'
1787  WRITE(lu,*) '(THERMAL PROCESSES)'
1788  CALL plante(1)
1789  stop
1790 ! __________________________________________________________________
1791 ! TOO LATE
1792  ELSEIF( when+tel_offset2.GT.timea(ntimea) ) THEN
1793  WRITE(lu,*) 'THE TIME REQUESTED IS TOO LATE COMPARED TO'
1794  WRITE(lu,*) 'THE PROFIL OF ASCII FILE USED FOR THE METEO'
1795  WRITE(lu,*) '(THERMAL PROCESSES)'
1796  CALL plante(1)
1797  stop
1798  ENDIF
1799 ! __________________________________________________________________
1800 ! FIND WHEN
1801  IF( when+tel_offset2.GE.timea(itimea2) )THEN
1802 !
1803  132 itimea1 = itimea2
1804  DO j = 1,nvaluea
1805  DO k = 1,npoina
1806  valuea1(j,k) = valuea2(j,k)
1807  ENDDO
1808  ENDDO
1809  itimea2 = itimea2 + 1
1810  133 READ(nfic,fmt='(A)') ligne
1811  IF( ligne(1:1).EQ.'#' .OR.
1812  & ligne(1:1).EQ.'!' .OR.
1813  & ligne(1:1).EQ.':' ) GOTO 133
1814  READ(ligne,*) dummy, ! TIMEA(ITIMEA2), ALREADY STORED + SHIFTED
1815  & ((valuea2(j,k),j=1,nvaluea),k=1,npoina)
1816  IF( when+tel_offset2.GE.timea(itimea2) ) GOTO 132
1817 !
1818  ENDIF
1819 !
1820 !-----------------------------------------------------------------------
1821 !
1822  RETURN
1823  END SUBROUTINE
1824 !
1825 !=======================================================================
1826 !
1827 !
1828 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1829 !
1830  END MODULE meteo_telemac
logical inc_windx
subroutine, public dealloc_meteo
subroutine get_mesh_npoin(FFORMAT, FID, TYP_ELEM, NPOIN, IERR)
Definition: get_mesh_npoin.f:7
type(bief_obj), target snow
character(len=16), dimension(2, meteo_maxvalue), target meteo_units
double precision, dimension(:), allocatable timeb
double precision, dimension(:), allocatable xpoina
type(bief_obj), target, public windy
double precision, dimension(:), allocatable valueb0
logical inc_ray3
subroutine get_data_nvar(FFORMAT, FID, NVAR, IERR)
Definition: get_data_nvar.f:7
logical inc_snow
type(bief_obj), target, public tair
Definition: meteo_telemac.f:44
type(bief_obj), target, public hrel
subroutine get_data_var_list(FFORMAT, FID, NVAR, VARLIST, UNITLIST, IERR)
double precision, public cst_ray3
double precision, public cst_windy
type(bief_file), dimension(2) meteo_files
logical inc_patmos
logical inc_tair
Definition: meteo_telemac.f:46
logical inc_hrel
subroutine, public point_meteo(FILES, ATMFILEA, ATMFILEB, MESH, IELMT, AVENT, AATMOS, AWATER_QUALITY, AICE)
subroutine interp_windxy(WHEN, VITX, VITY, NPOIN)
logical inc_tdew
Definition: meteo_telemac.f:63
subroutine bief_deallobj(OBJ)
Definition: bief_deallobj.f:7
integer, parameter triangle_elt_type
subroutine bief_allvec(NAT, VEC, NOM, IELM, DIM2, STATUT, MESH)
Definition: bief_allvec.f:7
double precision, dimension(:), allocatable ypoinb
type(bief_obj), target, public rainfall
integer function find_name(NAME, CHOIX, MAXVALUE)
double precision, public cst_pvap
double precision, dimension(:), allocatable ypoina
integer, parameter meteo_maxvalue
subroutine init_fic_binary(FILES, ATMFILEB)
double precision, dimension(:,:), allocatable valueb1
integer, parameter sizelign
type(bief_obj), target, public windx
subroutine get_data_value(FFORMAT, FID, RECORD, VAR_NAME, RES_VALUE, N, IERR)
Definition: get_data_value.f:7
double precision, public cst_tair
Definition: meteo_telemac.f:45
character(len=16), dimension(2, meteo_maxvalue), target meteo_choix
type(bief_obj), target, public pvap
double precision, dimension(:,:), allocatable valueb2
double precision, public cst_patmos
double precision, dimension(:,:), allocatable valuea1
double precision cst_snow
integer, dimension(6), public meteo_ref_date
subroutine sync_fic_ascii(WHEN)
double precision, public cst_windx
subroutine sync_fic_binary(WHEN)
type(bief_obj), target, public winds
double precision, public alphsd
double precision, dimension(:), allocatable xpoinb
double precision, public meteo_offset
double precision tel_offset2
logical function inclus(C1, C2)
Definition: inclus.f:7
double precision, public cst_cldc
Definition: meteo_telemac.f:87
subroutine interp_meteo(WHEN, WHAT, VALEURS, NPOIN)
logical inc_visbi
type(bief_obj), target, public tdew
Definition: meteo_telemac.f:61
logical inc_rainfall
logical inc_winds
double precision, public cst_tdew
Definition: meteo_telemac.f:62
double precision, dimension(:), allocatable timea
logical inc_windd
double precision, public cst_visbi
Definition: meteo_telemac.f:99
double precision tel_offset
double precision, public cst_windd
type(bief_obj), target, public windd
subroutine, public sync_meteo(WHEN)
double precision function date_mjd2sec(DATE, TIME)
Definition: date_mjd2sec.f:7
double precision, public alphrd
double precision, public cst_winds
subroutine os(OP, X, Y, Z, C, IOPT, INFINI, ZERO)
Definition: os.f:7
type(bief_obj), target, public ray3
logical inc_cldc
Definition: meteo_telemac.f:88
logical inc_windy
type(bief_obj), target, public patmos
double precision, public cst_rainfall
double precision, public modelz
double precision, public cst_hrel
logical, dimension(2) meteo_deja
logical inc_pvap
subroutine init_fic_ascii(FILES, ATMFILEA)
subroutine get_data_time(FFORMAT, FID, RECORD, TIME, IERR)
Definition: get_data_time.f:7
type(bief_obj), target, public cldc
Definition: meteo_telemac.f:86
type(bief_obj), target, public visbi
Definition: meteo_telemac.f:98
double precision, dimension(:,:), allocatable valuea2
subroutine get_data_ntimestep(FFORMAT, FID, NTIMESTEP, IERR)
double precision, public windz
double precision dummy
Definition: bief.f:3