source: LMDZ5/branches/IPSLCM6.0.8/libf/phylmd/dyn1d/1DUTILS.h @ 5215

Last change on this file since 5215 was 2720, checked in by Laurent Fairhead, 8 years ago

Merged trunk changes r2664:2719 into testing branch

File size: 173.2 KB
Line 
1#include "conf_gcm.F90"
2
3!
4! $Id: conf_unicol.F 1279 2010-08-04 17:20:56Z lahellec $
5!
6!
7!
8      SUBROUTINE conf_unicol
9!
10#ifdef CPP_IOIPSL
11      use IOIPSL
12#else
13! if not using IOIPSL, we still need to use (a local version of) getin
14      use ioipsl_getincom
15#endif
16      USE print_control_mod, ONLY: lunout
17      IMPLICIT NONE
18!-----------------------------------------------------------------------
19!     Auteurs :   A. Lahellec  .
20!
21!   Declarations :
22!   --------------
23
24#include "compar1d.h"
25#include "flux_arp.h"
26#include "tsoilnudge.h"
27#include "fcg_gcssold.h"
28#include "fcg_racmo.h"
29!
30!
31!   local:
32!   ------
33
34!      CHARACTER ch1*72,ch2*72,ch3*72,ch4*12
35     
36!
37!  -------------------------------------------------------------------
38!
39!      .........    Initilisation parametres du lmdz1D      ..........
40!
41!---------------------------------------------------------------------
42!   initialisations:
43!   ----------------
44
45!Config  Key  = lunout
46!Config  Desc = unite de fichier pour les impressions
47!Config  Def  = 6
48!Config  Help = unite de fichier pour les impressions
49!Config         (defaut sortie standard = 6)
50      lunout=6
51!      CALL getin('lunout', lunout)
52      IF (lunout /= 5 .and. lunout /= 6) THEN
53        OPEN(lunout,FILE='lmdz.out')
54      ENDIF
55
56!Config  Key  = prt_level
57!Config  Desc = niveau d'impressions de debogage
58!Config  Def  = 0
59!Config  Help = Niveau d'impression pour le debogage
60!Config         (0 = minimum d'impression)
61!      prt_level = 0
62!      CALL getin('prt_level',prt_level)
63
64!-----------------------------------------------------------------------
65!  Parametres de controle du run:
66!-----------------------------------------------------------------------
67
68!Config  Key  = restart
69!Config  Desc = on repart des startphy et start1dyn
70!Config  Def  = false
71!Config  Help = les fichiers restart doivent etre renomme en start
72       restart =.false.
73       CALL getin('restart',restart)
74
75!Config  Key  = forcing_type
76!Config  Desc = defines the way the SCM is forced:
77!Config  Def  = 0
78!!Config  Help = 0 ==> forcing_les = .true.
79!             initial profiles from file prof.inp.001
80!             no forcing by LS convergence ; 
81!             surface temperature imposed ;
82!             radiative cooling may be imposed (iflag_radia=0 in physiq.def)
83!         = 1 ==> forcing_radconv = .true.
84!             idem forcing_type = 0, but the imposed radiative cooling
85!             is set to 0 (hence, if iflag_radia=0 in physiq.def, 
86!             then there is no radiative cooling at all)
87!         = 2 ==> forcing_toga = .true.
88!             initial profiles from TOGA-COARE IFA files
89!             LS convergence and SST imposed from TOGA-COARE IFA files
90!         = 3 ==> forcing_GCM2SCM = .true.
91!             initial profiles from the GCM output
92!             LS convergence imposed from the GCM output
93!         = 4 ==> forcing_twpi = .true.
94!             initial profiles from TWPICE nc files
95!             LS convergence and SST imposed from TWPICE nc files
96!         = 5 ==> forcing_rico = .true.
97!             initial profiles from RICO idealized
98!             LS convergence imposed from  RICO (cst) 
99!         = 6 ==> forcing_amma = .true.
100!         = 10 ==> forcing_case = .true.
101!             initial profiles from case.nc file
102!         = 40 ==> forcing_GCSSold = .true.
103!             initial profile from GCSS file
104!             LS convergence imposed from GCSS file
105!         = 50 ==> forcing_fire = .true.
106!         = 59 ==> forcing_sandu = .true.
107!             initial profiles from sanduref file: see prof.inp.001
108!             SST varying with time and divergence constante: see ifa_sanduref.txt file
109!             Radiation has to be computed interactively
110!         = 60 ==> forcing_astex = .true.
111!             initial profiles from file: see prof.inp.001 
112!             SST,divergence,ug,vg,ufa,vfa varying with time : see ifa_astex.txt file
113!             Radiation has to be computed interactively
114!         = 61 ==> forcing_armcu = .true.
115!             initial profiles from file: see prof.inp.001 
116!             sensible and latent heat flux imposed: see ifa_arm_cu_1.txt
117!             large scale advective forcing & radiative tendencies applied below 1000m: see ifa_arm_cu_2.txt
118!             use geostrophic wind ug=10m/s vg=0m/s. Duration of the case 53100s
119!             Radiation to be switched off
120!         > 100 ==> forcing_case = .true. or forcing_case2 = .true.
121!             initial profiles from case.nc file
122!
123       forcing_type = 0
124       CALL getin('forcing_type',forcing_type)
125         imp_fcg_gcssold   = .false.
126         ts_fcg_gcssold    = .false. 
127         Tp_fcg_gcssold    = .false. 
128         Tp_ini_gcssold    = .false. 
129         xTurb_fcg_gcssold = .false. 
130        IF (forcing_type .eq.40) THEN
131          CALL getin('imp_fcg',imp_fcg_gcssold)
132          CALL getin('ts_fcg',ts_fcg_gcssold)
133          CALL getin('tp_fcg',Tp_fcg_gcssold)
134          CALL getin('tp_ini',Tp_ini_gcssold)
135          CALL getin('turb_fcg',xTurb_fcg_gcssold)
136        ENDIF
137
138!Parametres de forcage
139!Config  Key  = tend_t
140!Config  Desc = forcage ou non par advection de T
141!Config  Def  = false
142!Config  Help = forcage ou non par advection de T
143       tend_t =0
144       CALL getin('tend_t',tend_t)
145
146!Config  Key  = tend_q
147!Config  Desc = forcage ou non par advection de q
148!Config  Def  = false
149!Config  Help = forcage ou non par advection de q
150       tend_q =0
151       CALL getin('tend_q',tend_q)
152
153!Config  Key  = tend_u
154!Config  Desc = forcage ou non par advection de u
155!Config  Def  = false
156!Config  Help = forcage ou non par advection de u
157       tend_u =0
158       CALL getin('tend_u',tend_u)
159
160!Config  Key  = tend_v
161!Config  Desc = forcage ou non par advection de v
162!Config  Def  = false
163!Config  Help = forcage ou non par advection de v
164       tend_v =0
165       CALL getin('tend_v',tend_v)
166
167!Config  Key  = tend_w
168!Config  Desc = forcage ou non par vitesse verticale
169!Config  Def  = false
170!Config  Help = forcage ou non par vitesse verticale
171       tend_w =0
172       CALL getin('tend_w',tend_w)
173
174!Config  Key  = tend_rayo
175!Config  Desc = forcage ou non par dtrad
176!Config  Def  = false
177!Config  Help = forcage ou non par dtrad
178       tend_rayo =0
179       CALL getin('tend_rayo',tend_rayo)
180
181
182!Config  Key  = nudge_t
183!Config  Desc = constante de nudging de T
184!Config  Def  = false
185!Config  Help = constante de nudging de T
186       nudge_t =0.
187       CALL getin('nudge_t',nudge_t)
188
189!Config  Key  = nudge_q
190!Config  Desc = constante de nudging de q
191!Config  Def  = false
192!Config  Help = constante de nudging de q
193       nudge_q =0.
194       CALL getin('nudge_q',nudge_q)
195
196!Config  Key  = nudge_u
197!Config  Desc = constante de nudging de u
198!Config  Def  = false
199!Config  Help = constante de nudging de u
200       nudge_u =0.
201       CALL getin('nudge_u',nudge_u)
202
203!Config  Key  = nudge_v
204!Config  Desc = constante de nudging de v
205!Config  Def  = false
206!Config  Help = constante de nudging de v
207       nudge_v =0.
208       CALL getin('nudge_v',nudge_v)
209
210!Config  Key  = nudge_w
211!Config  Desc = constante de nudging de w
212!Config  Def  = false
213!Config  Help = constante de nudging de w
214       nudge_w =0.
215       CALL getin('nudge_w',nudge_w)
216
217
218!Config  Key  = iflag_nudge
219!Config  Desc = atmospheric nudging ttype (decimal code)
220!Config  Def  = 0
221!Config  Help = 0 ==> no nudging
222!  If digit number n of iflag_nudge is set, then nudging of type n is on
223!  If digit number n of iflag_nudge is not set, then nudging of type n is off
224!   (digits are numbered from the right)
225       iflag_nudge = 0
226       CALL getin('iflag_nudge',iflag_nudge)
227
228!Config  Key  = ok_flux_surf
229!Config  Desc = forcage ou non par les flux de surface
230!Config  Def  = false
231!Config  Help = forcage ou non par les flux de surface
232       ok_flux_surf =.false.
233       CALL getin('ok_flux_surf',ok_flux_surf)
234
235!Config  Key  = ok_prescr_ust
236!Config  Desc = ustar impose ou non
237!Config  Def  = false
238!Config  Help = ustar impose ou non
239       ok_prescr_ust = .false.
240       CALL getin('ok_prescr_ust',ok_prescr_ust)
241
242!Config  Key  = ok_old_disvert
243!Config  Desc = utilisation de l ancien programme disvert0 (dans 1DUTILS.h)
244!Config  Def  = false
245!Config  Help = utilisation de l ancien programme disvert0 (dans 1DUTILS.h)
246       ok_old_disvert = .FALSE.
247       CALL getin('ok_old_disvert',ok_old_disvert)
248
249!Config  Key  = time_ini
250!Config  Desc = meaningless in this  case
251!Config  Def  = 0.
252!Config  Help = 
253       tsurf = 0.
254       CALL getin('time_ini',time_ini)
255
256!Config  Key  = rlat et rlon
257!Config  Desc = latitude et longitude
258!Config  Def  = 0.0  0.0
259!Config  Help = fixe la position de la colonne
260       xlat = 0.
261       xlon = 0.
262       CALL getin('rlat',xlat)
263       CALL getin('rlon',xlon)
264
265!Config  Key  = airephy
266!Config  Desc = Grid cell area
267!Config  Def  = 1.e11
268!Config  Help = 
269       airefi = 1.e11
270       CALL getin('airephy',airefi)
271
272!Config  Key  = nat_surf
273!Config  Desc = surface type
274!Config  Def  = 0 (ocean)
275!Config  Help = 0=ocean,1=land,2=glacier,3=banquise
276       nat_surf = 0.
277       CALL getin('nat_surf',nat_surf)
278
279!Config  Key  = tsurf
280!Config  Desc = surface temperature
281!Config  Def  = 290.
282!Config  Help = not used if type_ts_forcing=1 in lmdz1d.F
283       tsurf = 290.
284       CALL getin('tsurf',tsurf)
285
286!Config  Key  = psurf
287!Config  Desc = surface pressure
288!Config  Def  = 102400.
289!Config  Help = 
290       psurf = 102400.
291       CALL getin('psurf',psurf)
292
293!Config  Key  = zsurf
294!Config  Desc = surface altitude
295!Config  Def  = 0.
296!Config  Help = 
297       zsurf = 0.
298       CALL getin('zsurf',zsurf)
299
300!Config  Key  = rugos
301!Config  Desc = coefficient de frottement
302!Config  Def  = 0.0001
303!Config  Help = calcul du Cdrag
304       rugos = 0.0001
305       CALL getin('rugos',rugos)
306
307!Config  Key  = rugosh
308!Config  Desc = coefficient de frottement
309!Config  Def  = rugos
310!Config  Help = calcul du Cdrag
311       rugosh = rugos
312       CALL getin('rugosh',rugosh)
313
314
315
316!Config  Key  = snowmass
317!Config  Desc = mass de neige de la surface en kg/m2
318!Config  Def  = 0.0000
319!Config  Help = snowmass
320       snowmass = 0.0000
321       CALL getin('snowmass',snowmass)
322
323!Config  Key  = wtsurf et wqsurf
324!Config  Desc = ???
325!Config  Def  = 0.0 0.0
326!Config  Help = 
327       wtsurf = 0.0
328       wqsurf = 0.0
329       CALL getin('wtsurf',wtsurf)
330       CALL getin('wqsurf',wqsurf)
331
332!Config  Key  = albedo
333!Config  Desc = albedo
334!Config  Def  = 0.09
335!Config  Help = 
336       albedo = 0.09
337       CALL getin('albedo',albedo)
338
339!Config  Key  = agesno
340!Config  Desc = age de la neige
341!Config  Def  = 30.0
342!Config  Help = 
343       xagesno = 30.0
344       CALL getin('agesno',xagesno)
345
346!Config  Key  = restart_runoff
347!Config  Desc = age de la neige
348!Config  Def  = 30.0
349!Config  Help = 
350       restart_runoff = 0.0
351       CALL getin('restart_runoff',restart_runoff)
352
353!Config  Key  = qsolinp
354!Config  Desc = initial bucket water content (kg/m2) when land (5std)
355!Config  Def  = 30.0
356!Config  Help = 
357       qsolinp = 1.
358       CALL getin('qsolinp',qsolinp)
359
360!Config  Key  = zpicinp
361!Config  Desc = denivellation orographie
362!Config  Def  = 0.
363!Config  Help =  input brise
364       zpicinp = 0.
365       CALL getin('zpicinp',zpicinp)
366!Config key = nudge_tsoil
367!Config  Desc = activation of soil temperature nudging
368!Config  Def  = .FALSE.
369!Config  Help = ...
370
371       nudge_tsoil=.FALSE.
372       CALL getin('nudge_tsoil',nudge_tsoil)
373
374!Config key = isoil_nudge
375!Config  Desc = level number where soil temperature is nudged
376!Config  Def  = 3
377!Config  Help = ...
378
379       isoil_nudge=3
380       CALL getin('isoil_nudge',isoil_nudge)
381
382!Config key = Tsoil_nudge
383!Config  Desc = target temperature for tsoil(isoil_nudge)
384!Config  Def  = 300.
385!Config  Help = ...
386
387       Tsoil_nudge=300.
388       CALL getin('Tsoil_nudge',Tsoil_nudge)
389
390!Config key = tau_soil_nudge
391!Config  Desc = nudging relaxation time for tsoil
392!Config  Def  = 3600.
393!Config  Help = ...
394
395       tau_soil_nudge=3600.
396       CALL getin('tau_soil_nudge',tau_soil_nudge)
397
398!----------------------------------------------------------
399! Param??tres de for??age pour les forcages communs:
400! Pour les forcages communs: ces entiers valent 0 ou 1
401! tadv= advection tempe, tadvv= adv tempe verticale, tadvh= adv tempe horizontale
402! qadv= advection q, qadvv= adv q verticale, qadvh= adv q horizontale
403! trad= 0 (rayonnement actif) ou 1 (prescrit par tend_rad) ou adv (prescir et contenu dans les tadv)
404! forcages en omega, w, vent geostrophique ou ustar
405! Parametres de nudging en u,v,t,q valent 0 ou 1 ou le temps de nudging
406!----------------------------------------------------------
407
408!Config  Key  = tadv
409!Config  Desc = forcage ou non par advection totale de T
410!Config  Def  = false
411!Config  Help = forcage ou non par advection totale de T
412       tadv =0
413       CALL getin('tadv',tadv)
414
415!Config  Key  = tadvv
416!Config  Desc = forcage ou non par advection verticale de T
417!Config  Def  = false
418!Config  Help = forcage ou non par advection verticale de T
419       tadvv =0
420       CALL getin('tadvv',tadvv)
421
422!Config  Key  = tadvh
423!Config  Desc = forcage ou non par advection horizontale de T
424!Config  Def  = false
425!Config  Help = forcage ou non par advection horizontale de T
426       tadvh =0
427       CALL getin('tadvh',tadvh)
428
429!Config  Key  = thadv
430!Config  Desc = forcage ou non par advection totale de Theta
431!Config  Def  = false
432!Config  Help = forcage ou non par advection totale de Theta
433       thadv =0
434       CALL getin('thadv',thadv)
435
436!Config  Key  = thadvv
437!Config  Desc = forcage ou non par advection verticale de Theta
438!Config  Def  = false
439!Config  Help = forcage ou non par advection verticale de Theta
440       thadvv =0
441       CALL getin('thadvv',thadvv)
442
443!Config  Key  = thadvh
444!Config  Desc = forcage ou non par advection horizontale de Theta
445!Config  Def  = false
446!Config  Help = forcage ou non par advection horizontale de Theta
447       thadvh =0
448       CALL getin('thadvh',thadvh)
449
450!Config  Key  = qadv
451!Config  Desc = forcage ou non par advection totale de Q
452!Config  Def  = false
453!Config  Help = forcage ou non par advection totale de Q
454       qadv =0
455       CALL getin('qadv',qadv)
456
457!Config  Key  = qadvv
458!Config  Desc = forcage ou non par advection verticale de Q
459!Config  Def  = false
460!Config  Help = forcage ou non par advection verticale de Q
461       qadvv =0
462       CALL getin('qadvv',qadvv)
463
464!Config  Key  = qadvh
465!Config  Desc = forcage ou non par advection horizontale de Q
466!Config  Def  = false
467!Config  Help = forcage ou non par advection horizontale de Q
468       qadvh =0
469       CALL getin('qadvh',qadvh)
470
471!Config  Key  = trad
472!Config  Desc = forcage ou non par tendance radiative
473!Config  Def  = false
474!Config  Help = forcage ou non par tendance radiative
475       trad =0
476       CALL getin('trad',trad)
477
478!Config  Key  = forc_omega
479!Config  Desc = forcage ou non par omega
480!Config  Def  = false
481!Config  Help = forcage ou non par omega
482       forc_omega =0
483       CALL getin('forc_omega',forc_omega)
484
485!Config  Key  = forc_w
486!Config  Desc = forcage ou non par w
487!Config  Def  = false
488!Config  Help = forcage ou non par w
489       forc_w =0
490       CALL getin('forc_w',forc_w)
491
492!Config  Key  = forc_geo
493!Config  Desc = forcage ou non par geo
494!Config  Def  = false
495!Config  Help = forcage ou non par geo
496       forc_geo =0
497       CALL getin('forc_geo',forc_geo)
498
499! Meme chose que ok_precr_ust
500!Config  Key  = forc_ustar
501!Config  Desc = forcage ou non par ustar
502!Config  Def  = false
503!Config  Help = forcage ou non par ustar
504       forc_ustar =0
505       CALL getin('forc_ustar',forc_ustar)
506       IF (forc_ustar .EQ. 1) ok_prescr_ust=.true.
507
508!Config  Key  = nudging_u
509!Config  Desc = forcage ou non par nudging sur u
510!Config  Def  = false
511!Config  Help = forcage ou non par nudging sur u
512       nudging_u =0
513       CALL getin('nudging_u',nudging_u)
514
515!Config  Key  = nudging_v
516!Config  Desc = forcage ou non par nudging sur v
517!Config  Def  = false
518!Config  Help = forcage ou non par nudging sur v
519       nudging_v =0
520       CALL getin('nudging_v',nudging_v)
521
522!Config  Key  = nudging_w
523!Config  Desc = forcage ou non par nudging sur w
524!Config  Def  = false
525!Config  Help = forcage ou non par nudging sur w
526       nudging_w =0
527       CALL getin('nudging_w',nudging_w)
528
529!Config  Key  = nudging_q
530!Config  Desc = forcage ou non par nudging sur q
531!Config  Def  = false
532!Config  Help = forcage ou non par nudging sur q
533       nudging_q =0
534       CALL getin('nudging_q',nudging_q)
535
536!Config  Key  = nudging_t
537!Config  Desc = forcage ou non par nudging sur t
538!Config  Def  = false
539!Config  Help = forcage ou non par nudging sur t
540       nudging_t =0
541       CALL getin('nudging_t',nudging_t)
542
543
544
545      write(lunout,*)' +++++++++++++++++++++++++++++++++++++++'
546      write(lunout,*)' Configuration des parametres du gcm1D: '
547      write(lunout,*)' +++++++++++++++++++++++++++++++++++++++'
548      write(lunout,*)' restart = ', restart
549      write(lunout,*)' forcing_type = ', forcing_type
550      write(lunout,*)' time_ini = ', time_ini
551      write(lunout,*)' rlat = ', xlat
552      write(lunout,*)' rlon = ', xlon
553      write(lunout,*)' airephy = ', airefi
554      write(lunout,*)' nat_surf = ', nat_surf
555      write(lunout,*)' tsurf = ', tsurf
556      write(lunout,*)' psurf = ', psurf
557      write(lunout,*)' zsurf = ', zsurf
558      write(lunout,*)' rugos = ', rugos
559      write(lunout,*)' snowmass=', snowmass
560      write(lunout,*)' wtsurf = ', wtsurf
561      write(lunout,*)' wqsurf = ', wqsurf
562      write(lunout,*)' albedo = ', albedo
563      write(lunout,*)' xagesno = ', xagesno
564      write(lunout,*)' restart_runoff = ', restart_runoff
565      write(lunout,*)' qsolinp = ', qsolinp
566      write(lunout,*)' zpicinp = ', zpicinp
567      write(lunout,*)' nudge_tsoil = ', nudge_tsoil
568      write(lunout,*)' isoil_nudge = ', isoil_nudge
569      write(lunout,*)' Tsoil_nudge = ', Tsoil_nudge
570      write(lunout,*)' tau_soil_nudge = ', tau_soil_nudge
571      write(lunout,*)' tadv =      ', tadv
572      write(lunout,*)' tadvv =     ', tadvv
573      write(lunout,*)' tadvh =     ', tadvh
574      write(lunout,*)' thadv =     ', thadv
575      write(lunout,*)' thadvv =    ', thadvv
576      write(lunout,*)' thadvh =    ', thadvh
577      write(lunout,*)' qadv =      ', qadv
578      write(lunout,*)' qadvv =     ', qadvv
579      write(lunout,*)' qadvh =     ', qadvh
580      write(lunout,*)' trad =      ', trad
581      write(lunout,*)' forc_omega = ', forc_omega
582      write(lunout,*)' forc_w     = ', forc_w
583      write(lunout,*)' forc_geo   = ', forc_geo
584      write(lunout,*)' forc_ustar = ', forc_ustar
585      write(lunout,*)' nudging_u  = ', nudging_u
586      write(lunout,*)' nudging_v  = ', nudging_v
587      write(lunout,*)' nudging_t  = ', nudging_t
588      write(lunout,*)' nudging_q  = ', nudging_q
589      IF (forcing_type .eq.40) THEN
590        write(lunout,*) '--- Forcing type GCSS Old --- with:'
591        write(lunout,*)'imp_fcg',imp_fcg_gcssold
592        write(lunout,*)'ts_fcg',ts_fcg_gcssold
593        write(lunout,*)'tp_fcg',Tp_fcg_gcssold
594        write(lunout,*)'tp_ini',Tp_ini_gcssold
595        write(lunout,*)'xturb_fcg',xTurb_fcg_gcssold
596      ENDIF
597
598      write(lunout,*)' +++++++++++++++++++++++++++++++++++++++'
599      write(lunout,*)
600!
601      RETURN
602      END
603!
604! $Id: dyn1deta0.F 1279 2010/07/30 A Lahellec$
605!
606!
607      SUBROUTINE dyn1deta0(fichnom,plev,play,phi,phis,presnivs,                 &
608     &                          ucov,vcov,temp,q,omega2)
609      USE dimphy
610      USE mod_grid_phy_lmdz
611      USE mod_phys_lmdz_para
612      USE iophy
613      USE phys_state_var_mod
614      USE iostart
615      USE write_field_phy
616      USE infotrac
617      use control_mod
618      USE comconst_mod, ONLY: im, jm, lllm
619      USE logic_mod, ONLY: fxyhypb, ysinus
620      USE temps_mod, ONLY: annee_ref, day_ini, day_ref, itau_dyn
621
622      IMPLICIT NONE
623!=======================================================
624! Ecriture du fichier de redemarrage sous format NetCDF
625!=======================================================
626!   Declarations:
627!   -------------
628      include "dimensions.h"
629!!#include "control.h"
630      include "netcdf.inc"
631
632!   Arguments:
633!   ----------
634      CHARACTER*(*) fichnom
635!Al1 plev tronque pour .nc mais plev(klev+1):=0
636      real :: plev(klon,klev+1),play (klon,klev),phi(klon,klev)
637      real :: presnivs(klon,klev)
638      real :: ucov(klon,klev),vcov(klon,klev),temp(klon,klev)
639      real :: q(klon,klev,nqtot),omega2(klon,klev)
640!      real :: ug(klev),vg(klev),fcoriolis
641      real :: phis(klon) 
642
643!   Variables locales pour NetCDF:
644!   ------------------------------
645      INTEGER iq
646      INTEGER length
647      PARAMETER (length = 100)
648      REAL tab_cntrl(length) ! tableau des parametres du run
649      character*4 nmq(nqtot)
650      character*12 modname
651      character*80 abort_message
652      LOGICAL found
653
654      modname = 'dyn1deta0 : '
655      nmq(1)="vap"
656      nmq(2)="cond"
657      do iq=3,nqtot
658        write(nmq(iq),'("tra",i1)') iq-2
659      enddo
660      print*,'in dyn1deta0 ',fichnom,klon,klev,nqtot
661      CALL open_startphy(fichnom)
662      print*,'after open startphy ',fichnom,nmq
663
664!
665! Lecture des parametres de controle:
666!
667      CALL get_var("controle",tab_cntrl)
668       
669
670      im         = tab_cntrl(1)
671      jm         = tab_cntrl(2)
672      lllm       = tab_cntrl(3)
673      day_ref    = tab_cntrl(4)
674      annee_ref  = tab_cntrl(5)
675!      rad        = tab_cntrl(6)
676!      omeg       = tab_cntrl(7)
677!      g          = tab_cntrl(8)
678!      cpp        = tab_cntrl(9)
679!      kappa      = tab_cntrl(10)
680!      daysec     = tab_cntrl(11)
681!      dtvr       = tab_cntrl(12)
682!      etot0      = tab_cntrl(13)
683!      ptot0      = tab_cntrl(14)
684!      ztot0      = tab_cntrl(15)
685!      stot0      = tab_cntrl(16)
686!      ang0       = tab_cntrl(17)
687!      pa         = tab_cntrl(18)
688!      preff      = tab_cntrl(19)
689!
690!      clon       = tab_cntrl(20)
691!      clat       = tab_cntrl(21)
692!      grossismx  = tab_cntrl(22)
693!      grossismy  = tab_cntrl(23)
694!
695      IF ( tab_cntrl(24).EQ.1. )  THEN
696        fxyhypb  =.true.
697!        dzoomx   = tab_cntrl(25)
698!        dzoomy   = tab_cntrl(26)
699!        taux     = tab_cntrl(28)
700!        tauy     = tab_cntrl(29)
701      ELSE
702        fxyhypb = .false.
703        ysinus  = .false.
704        IF( tab_cntrl(27).EQ.1. ) ysinus =.true. 
705      ENDIF
706
707      day_ini = tab_cntrl(30)
708      itau_dyn = tab_cntrl(31)
709!   .................................................................
710!
711!
712!      PRINT*,'rad,omeg,g,cpp,kappa',rad,omeg,g,cpp,kappa
713!Al1
714       Print*,'day_ref,annee_ref,day_ini,itau_dyn',                         &
715     &              day_ref,annee_ref,day_ini,itau_dyn
716
717!  Lecture des champs
718!
719      CALL get_field("play",play,found)
720      IF (.NOT. found) PRINT*, modname//'Le champ <Play> est absent'
721      CALL get_field("phi",phi,found)
722      IF (.NOT. found) PRINT*, modname//'Le champ <Phi> est absent'
723      CALL get_field("phis",phis,found)
724      IF (.NOT. found) PRINT*, modname//'Le champ <Phis> est absent'
725      CALL get_field("presnivs",presnivs,found)
726      IF (.NOT. found) PRINT*, modname//'Le champ <Presnivs> est absent'
727      CALL get_field("ucov",ucov,found)
728      IF (.NOT. found) PRINT*, modname//'Le champ <ucov> est absent'
729      CALL get_field("vcov",vcov,found)
730      IF (.NOT. found) PRINT*, modname//'Le champ <vcov> est absent'
731      CALL get_field("temp",temp,found)
732      IF (.NOT. found) PRINT*, modname//'Le champ <temp> est absent'
733      CALL get_field("omega2",omega2,found)
734      IF (.NOT. found) PRINT*, modname//'Le champ <omega2> est absent'
735      plev(1,klev+1)=0.
736      CALL get_field("plev",plev(:,1:klev),found)
737      IF (.NOT. found) PRINT*, modname//'Le champ <Plev> est absent'
738
739      Do iq=1,nqtot
740        CALL get_field("q"//nmq(iq),q(:,:,iq),found)
741        IF (.NOT.found)PRINT*, modname//'Le champ <q'//nmq//'> est absent'
742      EndDo
743
744      CALL close_startphy
745      print*,' close startphy',fichnom,play(1,1),play(1,klev),temp(1,klev)
746!
747      RETURN
748      END
749!
750! $Id: dyn1dredem.F 1279 2010/07/29 A Lahellec$
751!
752!
753      SUBROUTINE dyn1dredem(fichnom,plev,play,phi,phis,presnivs,           &
754     &                          ucov,vcov,temp,q,omega2)
755      USE dimphy
756      USE mod_grid_phy_lmdz
757      USE mod_phys_lmdz_para
758      USE phys_state_var_mod
759      USE iostart
760      USE infotrac
761      use control_mod
762      USE comconst_mod, ONLY: cpp, daysec, dtvr, g, kappa, omeg, rad
763      USE logic_mod, ONLY: fxyhypb, ysinus
764      USE temps_mod, ONLY: annee_ref,day_end,day_ref,itau_dyn,itaufin
765
766      IMPLICIT NONE
767!=======================================================
768! Ecriture du fichier de redemarrage sous format NetCDF
769!=======================================================
770!   Declarations:
771!   -------------
772      include "dimensions.h"
773!!#include "control.h"
774      include "netcdf.inc"
775
776!   Arguments:
777!   ----------
778      CHARACTER*(*) fichnom
779!Al1 plev tronque pour .nc mais plev(klev+1):=0
780      real :: plev(klon,klev),play (klon,klev),phi(klon,klev)
781      real :: presnivs(klon,klev)
782      real :: ucov(klon,klev),vcov(klon,klev),temp(klon,klev)
783      real :: q(klon,klev,nqtot)
784      real :: omega2(klon,klev),rho(klon,klev+1)
785!      real :: ug(klev),vg(klev),fcoriolis
786      real :: phis(klon) 
787
788!   Variables locales pour NetCDF:
789!   ------------------------------
790      INTEGER nid
791      INTEGER ierr
792      INTEGER iq,l
793      INTEGER length
794      PARAMETER (length = 100)
795      REAL tab_cntrl(length) ! tableau des parametres du run
796      character*4 nmq(nqtot)
797      character*20 modname
798      character*80 abort_message
799!
800      INTEGER nb
801      SAVE nb
802      DATA nb / 0 /
803
804      CALL open_restartphy(fichnom)
805      print*,'redm1 ',fichnom,klon,klev,nqtot
806      nmq(1)="vap"
807      nmq(2)="cond"
808      nmq(3)="tra1"
809      nmq(4)="tra2"
810
811      modname = 'dyn1dredem'
812      ierr = NF_OPEN(fichnom, NF_WRITE, nid)
813      IF (ierr .NE. NF_NOERR) THEN
814         abort_message="Pb. d ouverture "//fichnom
815         CALL abort_gcm('Modele 1D',abort_message,1)
816      ENDIF
817
818      DO l=1,length
819       tab_cntrl(l) = 0.
820      ENDDO
821       tab_cntrl(1)  = FLOAT(iim)
822       tab_cntrl(2)  = FLOAT(jjm)
823       tab_cntrl(3)  = FLOAT(llm)
824       tab_cntrl(4)  = FLOAT(day_ref)
825       tab_cntrl(5)  = FLOAT(annee_ref)
826       tab_cntrl(6)  = rad
827       tab_cntrl(7)  = omeg
828       tab_cntrl(8)  = g
829       tab_cntrl(9)  = cpp
830       tab_cntrl(10) = kappa
831       tab_cntrl(11) = daysec
832       tab_cntrl(12) = dtvr
833!       tab_cntrl(13) = etot0
834!       tab_cntrl(14) = ptot0
835!       tab_cntrl(15) = ztot0
836!       tab_cntrl(16) = stot0
837!       tab_cntrl(17) = ang0
838!       tab_cntrl(18) = pa
839!       tab_cntrl(19) = preff
840!
841!    .....    parametres  pour le zoom      ......   
842
843!       tab_cntrl(20)  = clon
844!       tab_cntrl(21)  = clat
845!       tab_cntrl(22)  = grossismx
846!       tab_cntrl(23)  = grossismy
847!
848      IF ( fxyhypb )   THEN
849       tab_cntrl(24) = 1.
850!       tab_cntrl(25) = dzoomx
851!       tab_cntrl(26) = dzoomy
852       tab_cntrl(27) = 0.
853!       tab_cntrl(28) = taux
854!       tab_cntrl(29) = tauy
855      ELSE
856       tab_cntrl(24) = 0.
857!       tab_cntrl(25) = dzoomx
858!       tab_cntrl(26) = dzoomy
859       tab_cntrl(27) = 0.
860       tab_cntrl(28) = 0.
861       tab_cntrl(29) = 0.
862       IF( ysinus )  tab_cntrl(27) = 1.
863      ENDIF
864!Al1 iday_end -> day_end
865       tab_cntrl(30) = FLOAT(day_end)
866       tab_cntrl(31) = FLOAT(itau_dyn + itaufin)
867!
868      CALL put_var("controle","Param. de controle Dyn1D",tab_cntrl)
869!
870
871!  Ecriture/extension de la coordonnee temps
872
873      nb = nb + 1
874
875!  Ecriture des champs
876!
877      CALL put_field("plev","p interfaces sauf la nulle",plev)
878      CALL put_field("play","",play)
879      CALL put_field("phi","geopotentielle",phi)
880      CALL put_field("phis","geopotentiell de surface",phis)
881      CALL put_field("presnivs","",presnivs)
882      CALL put_field("ucov","",ucov)
883      CALL put_field("vcov","",vcov)
884      CALL put_field("temp","",temp)
885      CALL put_field("omega2","",omega2)
886
887      Do iq=1,nqtot
888        CALL put_field("q"//nmq(iq),"eau vap ou condens et traceurs",           &
889     &                                                      q(:,:,iq))
890      EndDo
891      CALL close_restartphy
892
893!
894      RETURN
895      END
896      SUBROUTINE gr_fi_dyn(nfield,ngrid,im,jm,pfi,pdyn)
897      IMPLICIT NONE
898!=======================================================================
899!   passage d'un champ de la grille scalaire a la grille physique
900!=======================================================================
901 
902!-----------------------------------------------------------------------
903!   declarations:
904!   -------------
905 
906      INTEGER im,jm,ngrid,nfield
907      REAL pdyn(im,jm,nfield)
908      REAL pfi(ngrid,nfield)
909 
910      INTEGER i,j,ifield,ig
911 
912!-----------------------------------------------------------------------
913!   calcul:
914!   -------
915 
916      DO ifield=1,nfield
917!   traitement des poles
918         DO i=1,im
919            pdyn(i,1,ifield)=pfi(1,ifield)
920            pdyn(i,jm,ifield)=pfi(ngrid,ifield)
921         ENDDO
922 
923!   traitement des point normaux
924         DO j=2,jm-1
925            ig=2+(j-2)*(im-1)
926            CALL SCOPY(im-1,pfi(ig,ifield),1,pdyn(1,j,ifield),1)
927            pdyn(im,j,ifield)=pdyn(1,j,ifield)
928         ENDDO
929      ENDDO
930 
931      RETURN
932      END
933 
934 
935
936      SUBROUTINE abort_gcm(modname, message, ierr)
937 
938      USE IOIPSL
939!
940! Stops the simulation cleanly, closing files and printing various
941! comments
942!
943!  Input: modname = name of calling program
944!         message = stuff to print
945!         ierr    = severity of situation ( = 0 normal )
946 
947      character(len=*) modname
948      integer ierr
949      character(len=*) message
950 
951      write(*,*) 'in abort_gcm'
952      call histclo
953!     call histclo(2)
954!     call histclo(3)
955!     call histclo(4)
956!     call histclo(5)
957      write(*,*) 'out of histclo'
958      write(*,*) 'Stopping in ', modname
959      write(*,*) 'Reason = ',message
960      call getin_dump
961!
962      if (ierr .eq. 0) then
963        write(*,*) 'Everything is cool'
964      else
965        write(*,*) 'Houston, we have a problem ', ierr
966      endif
967      STOP
968      END
969      REAL FUNCTION fq_sat(kelvin, millibar)
970!
971      IMPLICIT none
972!======================================================================
973! Autheur(s): Z.X. Li (LMD/CNRS)
974! Objet: calculer la vapeur d'eau saturante (formule Centre Euro.)
975!======================================================================
976! Arguments:
977! kelvin---input-R: temperature en Kelvin
978! millibar--input-R: pression en mb
979!
980! fq_sat----output-R: vapeur d'eau saturante en kg/kg
981!======================================================================
982!
983      REAL kelvin, millibar
984!
985      REAL r2es
986      PARAMETER (r2es=611.14 *18.0153/28.9644)
987!
988      REAL r3les, r3ies, r3es
989      PARAMETER (R3LES=17.269)
990      PARAMETER (R3IES=21.875)
991!
992      REAL r4les, r4ies, r4es
993      PARAMETER (R4LES=35.86)
994      PARAMETER (R4IES=7.66)
995!
996      REAL rtt
997      PARAMETER (rtt=273.16)
998!
999      REAL retv
1000      PARAMETER (retv=28.9644/18.0153 - 1.0)
1001!
1002      REAL zqsat
1003      REAL temp, pres
1004!     ------------------------------------------------------------------
1005!
1006!
1007      temp = kelvin
1008      pres = millibar * 100.0
1009!      write(*,*)'kelvin,millibar=',kelvin,millibar
1010!      write(*,*)'temp,pres=',temp,pres
1011!
1012      IF (temp .LE. rtt) THEN
1013         r3es = r3ies
1014         r4es = r4ies
1015      ELSE
1016         r3es = r3les
1017         r4es = r4les
1018      ENDIF
1019!
1020      zqsat=r2es/pres * EXP ( r3es*(temp-rtt) / (temp-r4es) )
1021      zqsat=MIN(0.5,ZQSAT)
1022      zqsat=zqsat/(1.-retv  *zqsat)
1023!
1024      fq_sat = zqsat
1025!
1026      RETURN
1027      END
1028 
1029      SUBROUTINE gr_dyn_fi(nfield,im,jm,ngrid,pdyn,pfi)
1030      IMPLICIT NONE
1031!=======================================================================
1032!   passage d'un champ de la grille scalaire a la grille physique
1033!=======================================================================
1034 
1035!-----------------------------------------------------------------------
1036!   declarations:
1037!   -------------
1038 
1039      INTEGER im,jm,ngrid,nfield
1040      REAL pdyn(im,jm,nfield)
1041      REAL pfi(ngrid,nfield)
1042 
1043      INTEGER j,ifield,ig
1044 
1045!-----------------------------------------------------------------------
1046!   calcul:
1047!   -------
1048 
1049      IF(ngrid.NE.2+(jm-2)*(im-1).AND.ngrid.NE.1)                          &
1050     &    STOP 'probleme de dim'
1051!   traitement des poles
1052      CALL SCOPY(nfield,pdyn,im*jm,pfi,ngrid)
1053      CALL SCOPY(nfield,pdyn(1,jm,1),im*jm,pfi(ngrid,1),ngrid)
1054 
1055!   traitement des point normaux
1056      DO ifield=1,nfield
1057         DO j=2,jm-1
1058            ig=2+(j-2)*(im-1)
1059            CALL SCOPY(im-1,pdyn(1,j,ifield),1,pfi(ig,ifield),1)
1060         ENDDO
1061      ENDDO
1062 
1063      RETURN
1064      END
1065 
1066      SUBROUTINE disvert0(pa,preff,ap,bp,dpres,presnivs,nivsigs,nivsig)
1067 
1068!    Ancienne version disvert dont on a modifie nom pour utiliser
1069!    le disvert de dyn3d (qui permet d'utiliser grille avec ab,bp imposes)
1070!    (MPL 18092012)
1071!
1072!    Auteur :  P. Le Van .
1073!
1074      IMPLICIT NONE
1075 
1076      include "dimensions.h"
1077      include "paramet.h"
1078!
1079!=======================================================================
1080!
1081!
1082!    s = sigma ** kappa   :  coordonnee  verticale
1083!    dsig(l)            : epaisseur de la couche l ds la coord.  s
1084!    sig(l)             : sigma a l'interface des couches l et l-1
1085!    ds(l)              : distance entre les couches l et l-1 en coord.s
1086!
1087!=======================================================================
1088!
1089      REAL pa,preff
1090      REAL ap(llmp1),bp(llmp1),dpres(llm),nivsigs(llm),nivsig(llmp1)
1091      REAL presnivs(llm)
1092!
1093!   declarations:
1094!   -------------
1095!
1096      REAL sig(llm+1),dsig(llm)
1097!
1098      INTEGER l
1099      REAL snorm
1100      REAL alpha,beta,gama,delta,deltaz,h
1101      INTEGER np,ierr
1102      REAL pi,x
1103 
1104!-----------------------------------------------------------------------
1105!
1106      pi=2.*ASIN(1.)
1107 
1108      OPEN(99,file='sigma.def',status='old',form='formatted',                   &
1109     &   iostat=ierr)
1110 
1111!-----------------------------------------------------------------------
1112!   cas 1 on lit les options dans sigma.def:
1113!   ----------------------------------------
1114 
1115      IF (ierr.eq.0) THEN
1116 
1117      print*,'WARNING!!! on lit les options dans sigma.def'
1118      READ(99,*) deltaz
1119      READ(99,*) h
1120      READ(99,*) beta
1121      READ(99,*) gama
1122      READ(99,*) delta
1123      READ(99,*) np
1124      CLOSE(99)
1125      alpha=deltaz/(llm*h)
1126!
1127 
1128       DO 1  l = 1, llm
1129       dsig(l) = (alpha+(1.-alpha)*exp(-beta*(llm-l)))*                    &
1130     &          ( (tanh(gama*l)/tanh(gama*llm))**np +                      &
1131     &            (1.-l/FLOAT(llm))*delta )
1132   1   CONTINUE
1133 
1134       sig(1)=1.
1135       DO 101 l=1,llm-1
1136          sig(l+1)=sig(l)*(1.-dsig(l))/(1.+dsig(l))
1137101    CONTINUE
1138       sig(llm+1)=0.
1139 
1140       DO 2  l = 1, llm
1141       dsig(l) = sig(l)-sig(l+1)
1142   2   CONTINUE
1143!
1144 
1145      ELSE
1146!-----------------------------------------------------------------------
1147!   cas 2 ancienne discretisation (LMD5...):
1148!   ----------------------------------------
1149 
1150      PRINT*,'WARNING!!! Ancienne discretisation verticale'
1151 
1152      h=7.
1153      snorm  = 0.
1154      DO l = 1, llm
1155         x = 2.*asin(1.) * (FLOAT(l)-0.5) / float(llm+1)
1156         dsig(l) = 1.0 + 7.0 * SIN(x)**2
1157         snorm = snorm + dsig(l)
1158      ENDDO
1159      snorm = 1./snorm
1160      DO l = 1, llm
1161         dsig(l) = dsig(l)*snorm
1162      ENDDO
1163      sig(llm+1) = 0.
1164      DO l = llm, 1, -1
1165         sig(l) = sig(l+1) + dsig(l)
1166      ENDDO
1167 
1168      ENDIF
1169 
1170 
1171      DO l=1,llm
1172        nivsigs(l) = FLOAT(l)
1173      ENDDO
1174 
1175      DO l=1,llmp1
1176        nivsig(l)= FLOAT(l)
1177      ENDDO
1178 
1179!
1180!    ....  Calculs  de ap(l) et de bp(l)  ....
1181!    .........................................
1182!
1183!
1184!   .....  pa et preff sont lus  sur les fichiers start par lectba  .....
1185!
1186 
1187      bp(llmp1) =   0.
1188 
1189      DO l = 1, llm
1190!c
1191!cc    ap(l) = 0.
1192!cc    bp(l) = sig(l)
1193 
1194      bp(l) = EXP( 1. -1./( sig(l)*sig(l)) )
1195      ap(l) = pa * ( sig(l) - bp(l) )
1196!
1197      ENDDO
1198      ap(llmp1) = pa * ( sig(llmp1) - bp(llmp1) )
1199 
1200      PRINT *,' BP '
1201      PRINT *,  bp
1202      PRINT *,' AP '
1203      PRINT *,  ap
1204 
1205      DO l = 1, llm
1206       dpres(l) = bp(l) - bp(l+1)
1207       presnivs(l) = 0.5 *( ap(l)+bp(l)*preff + ap(l+1)+bp(l+1)*preff )
1208      ENDDO
1209 
1210      PRINT *,' PRESNIVS '
1211      PRINT *,presnivs
1212 
1213      RETURN
1214      END
1215
1216!======================================================================
1217       SUBROUTINE read_tsurf1d(knon,sst_out)
1218
1219! This subroutine specifies the surface temperature to be used in 1D simulations
1220
1221      USE dimphy, ONLY : klon
1222
1223      INTEGER, INTENT(IN)                  :: knon     ! nomber of points on compressed grid
1224      REAL, DIMENSION(klon), INTENT(OUT)   :: sst_out  ! tsurf used to force the single-column model
1225
1226       INTEGER :: i
1227! COMMON defined in lmdz1d.F:
1228       real ts_cur
1229       common /sst_forcing/ts_cur
1230
1231       DO i = 1, knon
1232        sst_out(i) = ts_cur
1233       ENDDO
1234
1235      END SUBROUTINE read_tsurf1d
1236
1237!===============================================================
1238      subroutine advect_vert(llm,w,dt,q,plev)
1239!===============================================================
1240!   Schema amont pour l'advection verticale en 1D
1241!   w est la vitesse verticale dp/dt en Pa/s
1242!   Traitement en volumes finis
1243!   d / dt ( zm q ) = delta_z ( omega q )
1244!   d / dt ( zm ) = delta_z ( omega )
1245!   avec zm = delta_z ( p )
1246!   si * designe la valeur au pas de temps t+dt
1247!   zm*(l) q*(l) - zm(l) q(l) = w(l+1) q(l+1) - w(l) q(l)
1248!   zm*(l) -zm(l) = w(l+1) - w(l)
1249!   avec w=omega * dt
1250!---------------------------------------------------------------
1251      implicit none
1252! arguments
1253      integer llm
1254      real w(llm+1),q(llm),plev(llm+1),dt
1255
1256! local
1257      integer l
1258      real zwq(llm+1),zm(llm+1),zw(llm+1)
1259      real qold
1260
1261!---------------------------------------------------------------
1262
1263      do l=1,llm
1264         zw(l)=dt*w(l)
1265         zm(l)=plev(l)-plev(l+1)
1266         zwq(l)=q(l)*zw(l)
1267      enddo
1268      zwq(llm+1)=0.
1269      zw(llm+1)=0.
1270 
1271      do l=1,llm
1272         qold=q(l)
1273         q(l)=(q(l)*zm(l)+zwq(l+1)-zwq(l))/(zm(l)+zw(l+1)-zw(l))
1274         print*,'ADV Q ',zm(l),zw(l),zwq(l),qold,q(l)
1275      enddo
1276
1277 
1278      return
1279      end
1280
1281!===============================================================
1282
1283
1284       SUBROUTINE advect_va(llm,omega,d_t_va,d_q_va,d_u_va,d_v_va,              &
1285     &                q,temp,u,v,play)
1286!itlmd
1287!----------------------------------------------------------------------
1288!   Calcul de l'advection verticale (ascendance et subsidence) de
1289!   temperature et d'humidite. Hypothese : ce qui rentre de l'exterieur
1290!   a les memes caracteristiques que l'air de la colonne 1D (WTG) ou
1291!   sans WTG rajouter une advection horizontale
1292!---------------------------------------------------------------------- 
1293        implicit none
1294#include "YOMCST.h"
1295!        argument
1296        integer llm
1297        real  omega(llm+1),d_t_va(llm), d_q_va(llm,3)
1298        real  d_u_va(llm), d_v_va(llm)
1299        real  q(llm,3),temp(llm)
1300        real  u(llm),v(llm)
1301        real  play(llm)
1302! interne
1303        integer l
1304        real alpha,omgdown,omgup
1305
1306      do l= 1,llm
1307       if(l.eq.1) then
1308!si omgup pour la couche 1, alors tendance nulle
1309        omgdown=max(omega(2),0.0)
1310        alpha = rkappa*temp(l)*(1.+q(l,1)*rv/rd)/(play(l)*(1.+q(l,1)))
1311        d_t_va(l)= alpha*(omgdown)-omgdown*(temp(l)-temp(l+1))             &
1312     &       /(play(l)-play(l+1))
1313
1314        d_q_va(l,:)= -omgdown*(q(l,:)-q(l+1,:))/(play(l)-play(l+1))             
1315
1316        d_u_va(l)= -omgdown*(u(l)-u(l+1))/(play(l)-play(l+1))             
1317        d_v_va(l)= -omgdown*(v(l)-v(l+1))/(play(l)-play(l+1))             
1318
1319       
1320       elseif(l.eq.llm) then
1321        omgup=min(omega(l),0.0)
1322        alpha = rkappa*temp(l)*(1.+q(l,1)*rv/rd)/(play(l)*(1.+q(l,1)))
1323        d_t_va(l)= alpha*(omgup)-                                          &
1324
1325!bug?     &              omgup*(temp(l-1)-temp(l))/(play(l-1)-plev(l))
1326     &              omgup*(temp(l-1)-temp(l))/(play(l-1)-play(l))
1327        d_q_va(l,:)= -omgup*(q(l-1,:)-q(l,:))/(play(l-1)-play(l))
1328        d_u_va(l)= -omgup*(u(l-1)-u(l))/(play(l-1)-play(l))
1329        d_v_va(l)= -omgup*(v(l-1)-v(l))/(play(l-1)-play(l))
1330       
1331       else
1332        omgup=min(omega(l),0.0)
1333        omgdown=max(omega(l+1),0.0)
1334        alpha = rkappa*temp(l)*(1.+q(l,1)*rv/rd)/(play(l)*(1.+q(l,1)))
1335        d_t_va(l)= alpha*(omgup+omgdown)-omgdown*(temp(l)-temp(l+1))       &
1336     &              /(play(l)-play(l+1))-                                  &
1337!bug?     &              omgup*(temp(l-1)-temp(l))/(play(l-1)-plev(l))
1338     &              omgup*(temp(l-1)-temp(l))/(play(l-1)-play(l))
1339!      print*, '  ??? '
1340
1341        d_q_va(l,:)= -omgdown*(q(l,:)-q(l+1,:))                            &
1342     &              /(play(l)-play(l+1))-                                  &
1343     &              omgup*(q(l-1,:)-q(l,:))/(play(l-1)-play(l)) 
1344        d_u_va(l)= -omgdown*(u(l)-u(l+1))                                  &
1345     &              /(play(l)-play(l+1))-                                  &
1346     &              omgup*(u(l-1)-u(l))/(play(l-1)-play(l)) 
1347        d_v_va(l)= -omgdown*(v(l)-v(l+1))                                  &
1348     &              /(play(l)-play(l+1))-                                  &
1349     &              omgup*(v(l-1)-v(l))/(play(l-1)-play(l))
1350       
1351      endif
1352         
1353      enddo
1354!fin itlmd
1355        return
1356        end
1357!       SUBROUTINE lstendH(llm,omega,d_t_va,d_q_va,d_u_va,d_v_va,
1358       SUBROUTINE lstendH(llm,nqtot,omega,d_t_va,d_q_va,                        &
1359     &                q,temp,u,v,play)
1360!itlmd
1361!----------------------------------------------------------------------
1362!   Calcul de l'advection verticale (ascendance et subsidence) de
1363!   temperature et d'humidite. Hypothese : ce qui rentre de l'exterieur
1364!   a les memes caracteristiques que l'air de la colonne 1D (WTG) ou
1365!   sans WTG rajouter une advection horizontale
1366!---------------------------------------------------------------------- 
1367        implicit none
1368#include "YOMCST.h"
1369!        argument
1370        integer llm,nqtot
1371        real  omega(llm+1),d_t_va(llm), d_q_va(llm,nqtot)
1372!        real  d_u_va(llm), d_v_va(llm)
1373        real  q(llm,nqtot),temp(llm)
1374        real  u(llm),v(llm)
1375        real  play(llm)
1376        real cor(llm)
1377!        real dph(llm),dudp(llm),dvdp(llm),dqdp(llm),dtdp(llm)
1378        real dph(llm),dqdp(llm),dtdp(llm)
1379! interne
1380        integer k
1381        real omdn,omup
1382
1383!        dudp=0.
1384!        dvdp=0.
1385        dqdp=0.
1386        dtdp=0.
1387!        d_u_va=0.
1388!        d_v_va=0.
1389
1390      cor(:) = rkappa*temp*(1.+q(:,1)*rv/rd)/(play*(1.+q(:,1)))
1391
1392
1393      do k=2,llm-1
1394
1395       dph  (k-1) = (play()- play(k-1  ))
1396!       dudp (k-1) = (u   ()- u   (k-1  ))/dph(k-1)
1397!       dvdp (k-1) = (v   ()- v   (k-1  ))/dph(k-1)
1398       dqdp (k-1) = (q   (k,1)- q   (k-1,1))/dph(k-1)
1399       dtdp (k-1) = (temp()- temp(k-1  ))/dph(k-1)
1400
1401      enddo
1402
1403!      dudp (  llm  ) = dudp ( llm-1 )
1404!      dvdp (  llm  ) = dvdp ( llm-1 )
1405      dqdp (  llm  ) = dqdp ( llm-1 )
1406      dtdp (  llm  ) = dtdp ( llm-1 )
1407
1408      do k=2,llm-1
1409      omdn=max(0.0,omega(k+1))
1410      omup=min(0.0,omega( k ))
1411
1412!      d_u_va(k)  = -omdn*dudp(k)-omup*dudp(k-1)
1413!      d_v_va(k)  = -omdn*dvdp(k)-omup*dvdp(k-1)
1414      d_q_va(k,1)= -omdn*dqdp(k)-omup*dqdp(k-1)
1415      d_t_va(k)  = -omdn*dtdp(k)-omup*dtdp(k-1)+(omup+omdn)*cor(k)
1416      enddo
1417
1418      omdn=max(0.0,omega( 2 ))
1419      omup=min(0.0,omega(llm))
1420!      d_u_va( 1 )   = -omdn*dudp( 1 )
1421!      d_u_va(llm)   = -omup*dudp(llm)
1422!      d_v_va( 1 )   = -omdn*dvdp( 1 )
1423!      d_v_va(llm)   = -omup*dvdp(llm)
1424      d_q_va( 1 ,1) = -omdn*dqdp( 1 )
1425      d_q_va(llm,1) = -omup*dqdp(llm)
1426      d_t_va( 1 )   = -omdn*dtdp( 1 )+omdn*cor( 1 )
1427      d_t_va(llm)   = -omup*dtdp(llm)!+omup*cor(llm)
1428
1429!      if(abs(rlat(1))>10.) then
1430!     Calculate the tendency due agestrophic motions
1431!      du_age = fcoriolis*(v-vg)
1432!      dv_age = fcoriolis*(ug-u)
1433!      endif
1434
1435!       call writefield_phy('d_t_va',d_t_va,llm)
1436
1437          return
1438         end
1439
1440!======================================================================
1441      SUBROUTINE read_togacoare(fich_toga,nlev_toga,nt_toga                     &
1442     &             ,ts_toga,plev_toga,t_toga,q_toga,u_toga,v_toga,w_toga        &
1443     &             ,ht_toga,vt_toga,hq_toga,vq_toga)
1444      implicit none
1445
1446!-------------------------------------------------------------------------
1447! Read TOGA-COARE forcing data
1448!-------------------------------------------------------------------------
1449
1450      integer nlev_toga,nt_toga
1451      real ts_toga(nt_toga),plev_toga(nlev_toga,nt_toga)
1452      real t_toga(nlev_toga,nt_toga),q_toga(nlev_toga,nt_toga)
1453      real u_toga(nlev_toga,nt_toga),v_toga(nlev_toga,nt_toga)
1454      real w_toga(nlev_toga,nt_toga)
1455      real ht_toga(nlev_toga,nt_toga),vt_toga(nlev_toga,nt_toga)
1456      real hq_toga(nlev_toga,nt_toga),vq_toga(nlev_toga,nt_toga)
1457      character*80 fich_toga
1458
1459      integer k,ip
1460      real bid
1461
1462      integer iy,im,id,ih
1463     
1464       real plev_min
1465
1466       plev_min = 55.  ! pas de tendance de vap. d eau au-dessus de 55 hPa
1467
1468      open(21,file=trim(fich_toga),form='formatted')
1469      read(21,'(a)') 
1470      do ip = 1, nt_toga
1471      read(21,'(a)') 
1472      read(21,'(a)') 
1473      read(21,223) iy, im, id, ih, bid, ts_toga(ip), bid,bid,bid,bid
1474      read(21,'(a)') 
1475      read(21,'(a)') 
1476
1477       do k = 1, nlev_toga
1478         read(21,230) plev_toga(k,ip), t_toga(k,ip), q_toga(k,ip)          &
1479     &       ,u_toga(k,ip), v_toga(k,ip), w_toga(k,ip)                     &
1480     &       ,ht_toga(k,ip), vt_toga(k,ip), hq_toga(k,ip), vq_toga(k,ip)
1481
1482! conversion in SI units:
1483         t_toga(k,ip)=t_toga(k,ip)+273.15     ! K
1484         q_toga(k,ip)=q_toga(k,ip)*0.001      ! kg/kg
1485         w_toga(k,ip)=w_toga(k,ip)*100./3600. ! Pa/s
1486! no water vapour tendency above 55 hPa
1487         if (plev_toga(k,ip) .lt. plev_min) then
1488          q_toga(k,ip) = 0.
1489          hq_toga(k,ip) = 0.
1490          vq_toga(k,ip) =0.
1491         endif
1492       enddo
1493
1494         ts_toga(ip)=ts_toga(ip)+273.15       ! K
1495       enddo
1496       close(21)
1497
1498  223 format(4i3,6f8.2)
1499  230 format(6f9.3,4e11.3)
1500
1501          return
1502          end
1503
1504!-------------------------------------------------------------------------
1505      SUBROUTINE read_sandu(fich_sandu,nlev_sandu,nt_sandu,ts_sandu)
1506      implicit none
1507
1508!-------------------------------------------------------------------------
1509! Read I.SANDU case forcing data
1510!-------------------------------------------------------------------------
1511
1512      integer nlev_sandu,nt_sandu
1513      real ts_sandu(nt_sandu)
1514      character*80 fich_sandu
1515
1516      integer ip
1517      integer iy,im,id,ih
1518
1519      real plev_min
1520
1521      print*,'nlev_sandu',nlev_sandu
1522      plev_min = 55000.  ! pas de tendance de vap. d eau au-dessus de 55 hPa
1523
1524      open(21,file=trim(fich_sandu),form='formatted')
1525      read(21,'(a)')
1526      do ip = 1, nt_sandu
1527      read(21,'(a)')
1528      read(21,'(a)')
1529      read(21,223) iy, im, id, ih, ts_sandu(ip)
1530      print *,'ts=',iy,im,id,ih,ip,ts_sandu(ip)
1531      enddo
1532      close(21)
1533
1534  223 format(4i3,f8.2)
1535
1536          return
1537          end
1538
1539!=====================================================================
1540!-------------------------------------------------------------------------
1541      SUBROUTINE read_astex(fich_astex,nlev_astex,nt_astex,div_astex,      &
1542     & ts_astex,ug_astex,vg_astex,ufa_astex,vfa_astex)
1543      implicit none
1544
1545!-------------------------------------------------------------------------
1546! Read Astex case forcing data
1547!-------------------------------------------------------------------------
1548
1549      integer nlev_astex,nt_astex
1550      real div_astex(nt_astex),ts_astex(nt_astex),ug_astex(nt_astex)
1551      real vg_astex(nt_astex),ufa_astex(nt_astex),vfa_astex(nt_astex)
1552      character*80 fich_astex
1553
1554      integer ip
1555      integer iy,im,id,ih
1556
1557       real plev_min
1558
1559      print*,'nlev_astex',nlev_astex
1560       plev_min = 55000.  ! pas de tendance de vap. d eau au-dessus de 55 hPa
1561
1562      open(21,file=trim(fich_astex),form='formatted')
1563      read(21,'(a)')
1564      read(21,'(a)')
1565      do ip = 1, nt_astex
1566      read(21,'(a)')
1567      read(21,'(a)')
1568      read(21,223) iy, im, id, ih, div_astex(ip),ts_astex(ip),             &
1569     &ug_astex(ip),vg_astex(ip),ufa_astex(ip),vfa_astex(ip)
1570      ts_astex(ip)=ts_astex(ip)+273.15
1571      print *,'ts=',iy,im,id,ih,ip,div_astex(ip),ts_astex(ip),             &
1572     &ug_astex(ip),vg_astex(ip),ufa_astex(ip),vg_astex(ip)
1573      enddo
1574      close(21)
1575
1576  223 format(4i3,e13.2,f7.2,f7.3,f7.2,f7.3,f7.2)
1577
1578          return
1579          end
1580!=====================================================================
1581      subroutine read_twpice(fich_twpice,nlevel,ntime                       &
1582     &     ,T_srf,plev,T,q,u,v,omega                                       &
1583     &     ,T_adv_h,T_adv_v,q_adv_h,q_adv_v)
1584
1585!program reading forcings of the TWP-ICE experiment
1586
1587!      use netcdf
1588
1589      implicit none
1590
1591#include "netcdf.inc"
1592
1593      integer ntime,nlevel
1594      integer l,k
1595      character*80 :: fich_twpice
1596      real*8 time(ntime)
1597      real*8 lat, lon, alt, phis
1598      real*8 lev(nlevel)
1599      real*8 plev(nlevel,ntime)
1600
1601      real*8 T(nlevel,ntime)
1602      real*8 q(nlevel,ntime),u(nlevel,ntime)
1603      real*8 v(nlevel,ntime)
1604      real*8 omega(nlevel,ntime), div(nlevel,ntime)
1605      real*8 T_adv_h(nlevel,ntime)
1606      real*8 T_adv_v(nlevel,ntime), q_adv_h(nlevel,ntime)
1607      real*8 q_adv_v(nlevel,ntime)
1608      real*8 s(nlevel,ntime), s_adv_h(nlevel,ntime)
1609      real*8 s_adv_v(nlevel,ntime)
1610      real*8 p_srf_aver(ntime), p_srf_center(ntime)
1611      real*8 T_srf(ntime)
1612
1613      integer nid, ierr
1614      integer nbvar3d
1615      parameter(nbvar3d=20)
1616      integer var3didin(nbvar3d)
1617
1618      ierr = NF_OPEN(fich_twpice,NF_NOWRITE,nid)
1619      if (ierr.NE.NF_NOERR) then
1620         write(*,*) 'ERROR: Pb opening forcings cdf file '
1621         write(*,*) NF_STRERROR(ierr)
1622         stop ""
1623      endif
1624
1625      ierr=NF_INQ_VARID(nid,"lat",var3didin(1))
1626         if(ierr/=NF_NOERR) then
1627           write(*,*) NF_STRERROR(ierr)
1628           stop 'lat'
1629         endif
1630     
1631       ierr=NF_INQ_VARID(nid,"lon",var3didin(2))
1632         if(ierr/=NF_NOERR) then
1633           write(*,*) NF_STRERROR(ierr)
1634           stop 'lon'
1635         endif
1636
1637       ierr=NF_INQ_VARID(nid,"alt",var3didin(3))
1638         if(ierr/=NF_NOERR) then
1639           write(*,*) NF_STRERROR(ierr)
1640           stop 'alt'
1641         endif
1642
1643      ierr=NF_INQ_VARID(nid,"phis",var3didin(4))
1644         if(ierr/=NF_NOERR) then
1645           write(*,*) NF_STRERROR(ierr)
1646           stop 'phis'
1647         endif
1648
1649      ierr=NF_INQ_VARID(nid,"T",var3didin(5))
1650         if(ierr/=NF_NOERR) then
1651           write(*,*) NF_STRERROR(ierr)
1652           stop 'T'
1653         endif
1654
1655      ierr=NF_INQ_VARID(nid,"q",var3didin(6))
1656         if(ierr/=NF_NOERR) then
1657           write(*,*) NF_STRERROR(ierr)
1658           stop 'q'
1659         endif
1660
1661      ierr=NF_INQ_VARID(nid,"u",var3didin(7))
1662         if(ierr/=NF_NOERR) then
1663           write(*,*) NF_STRERROR(ierr)
1664           stop 'u'
1665         endif
1666
1667      ierr=NF_INQ_VARID(nid,"v",var3didin(8))
1668         if(ierr/=NF_NOERR) then
1669           write(*,*) NF_STRERROR(ierr)
1670           stop 'v'
1671         endif
1672
1673      ierr=NF_INQ_VARID(nid,"omega",var3didin(9))
1674         if(ierr/=NF_NOERR) then
1675           write(*,*) NF_STRERROR(ierr)
1676           stop 'omega'
1677         endif
1678
1679      ierr=NF_INQ_VARID(nid,"div",var3didin(10))
1680         if(ierr/=NF_NOERR) then
1681           write(*,*) NF_STRERROR(ierr)
1682           stop 'div'
1683         endif
1684
1685      ierr=NF_INQ_VARID(nid,"T_adv_h",var3didin(11))
1686         if(ierr/=NF_NOERR) then
1687           write(*,*) NF_STRERROR(ierr)
1688           stop 'T_adv_h'
1689         endif
1690
1691      ierr=NF_INQ_VARID(nid,"T_adv_v",var3didin(12))
1692         if(ierr/=NF_NOERR) then
1693           write(*,*) NF_STRERROR(ierr)
1694           stop 'T_adv_v'
1695         endif
1696
1697      ierr=NF_INQ_VARID(nid,"q_adv_h",var3didin(13))
1698         if(ierr/=NF_NOERR) then
1699           write(*,*) NF_STRERROR(ierr)
1700           stop 'q_adv_h'
1701         endif
1702
1703      ierr=NF_INQ_VARID(nid,"q_adv_v",var3didin(14))
1704         if(ierr/=NF_NOERR) then
1705           write(*,*) NF_STRERROR(ierr)
1706           stop 'q_adv_v'
1707         endif
1708
1709      ierr=NF_INQ_VARID(nid,"s",var3didin(15))
1710         if(ierr/=NF_NOERR) then
1711           write(*,*) NF_STRERROR(ierr)
1712           stop 's'
1713         endif
1714
1715      ierr=NF_INQ_VARID(nid,"s_adv_h",var3didin(16))
1716         if(ierr/=NF_NOERR) then
1717           write(*,*) NF_STRERROR(ierr)
1718           stop 's_adv_h'
1719         endif
1720   
1721      ierr=NF_INQ_VARID(nid,"s_adv_v",var3didin(17))
1722         if(ierr/=NF_NOERR) then
1723           write(*,*) NF_STRERROR(ierr)
1724           stop 's_adv_v'
1725         endif
1726
1727      ierr=NF_INQ_VARID(nid,"p_srf_aver",var3didin(18))
1728         if(ierr/=NF_NOERR) then
1729           write(*,*) NF_STRERROR(ierr)
1730           stop 'p_srf_aver'
1731         endif
1732
1733      ierr=NF_INQ_VARID(nid,"p_srf_center",var3didin(19))
1734         if(ierr/=NF_NOERR) then
1735           write(*,*) NF_STRERROR(ierr)
1736           stop 'p_srf_center'
1737         endif
1738
1739      ierr=NF_INQ_VARID(nid,"T_srf",var3didin(20))
1740         if(ierr/=NF_NOERR) then
1741           write(*,*) NF_STRERROR(ierr)
1742           stop 'T_srf'
1743         endif
1744
1745!dimensions lecture
1746      call catchaxis(nid,ntime,nlevel,time,lev,ierr)
1747
1748!pressure
1749       do l=1,ntime
1750       do k=1,nlevel
1751          plev(k,l)=lev(k)
1752       enddo
1753       enddo
1754         
1755#ifdef NC_DOUBLE
1756         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(1),lat)
1757#else
1758         ierr = NF_GET_VAR_REAL(nid,var3didin(1),lat)
1759#endif
1760         if(ierr/=NF_NOERR) then
1761            write(*,*) NF_STRERROR(ierr)
1762            stop "getvarup"
1763         endif
1764!         write(*,*)'lecture lat ok',lat
1765
1766#ifdef NC_DOUBLE
1767         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(2),lon)
1768#else
1769         ierr = NF_GET_VAR_REAL(nid,var3didin(2),lon)
1770#endif
1771         if(ierr/=NF_NOERR) then
1772            write(*,*) NF_STRERROR(ierr)
1773            stop "getvarup"
1774         endif
1775!         write(*,*)'lecture lon ok',lon
1776 
1777#ifdef NC_DOUBLE
1778         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(3),alt)
1779#else
1780         ierr = NF_GET_VAR_REAL(nid,var3didin(3),alt)
1781#endif
1782         if(ierr/=NF_NOERR) then
1783            write(*,*) NF_STRERROR(ierr)
1784            stop "getvarup"
1785         endif
1786!          write(*,*)'lecture alt ok',alt
1787 
1788#ifdef NC_DOUBLE
1789         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(4),phis)
1790#else
1791         ierr = NF_GET_VAR_REAL(nid,var3didin(4),phis)
1792#endif
1793         if(ierr/=NF_NOERR) then
1794            write(*,*) NF_STRERROR(ierr)
1795            stop "getvarup"
1796         endif
1797!          write(*,*)'lecture phis ok',phis
1798         
1799#ifdef NC_DOUBLE
1800         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(5),T)
1801#else
1802         ierr = NF_GET_VAR_REAL(nid,var3didin(5),T)
1803#endif
1804         if(ierr/=NF_NOERR) then
1805            write(*,*) NF_STRERROR(ierr)
1806            stop "getvarup"
1807         endif
1808!         write(*,*)'lecture T ok'
1809
1810#ifdef NC_DOUBLE
1811         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(6),q)
1812#else
1813         ierr = NF_GET_VAR_REAL(nid,var3didin(6),q)
1814#endif
1815         if(ierr/=NF_NOERR) then
1816            write(*,*) NF_STRERROR(ierr)
1817            stop "getvarup"
1818         endif
1819!         write(*,*)'lecture q ok'
1820!q in kg/kg
1821       do l=1,ntime
1822       do k=1,nlevel
1823          q(k,l)=q(k,l)/1000.
1824       enddo
1825       enddo
1826#ifdef NC_DOUBLE
1827         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(7),u)
1828#else
1829         ierr = NF_GET_VAR_REAL(nid,var3didin(7),u)
1830#endif
1831         if(ierr/=NF_NOERR) then
1832            write(*,*) NF_STRERROR(ierr)
1833            stop "getvarup"
1834         endif
1835!         write(*,*)'lecture u ok'
1836
1837#ifdef NC_DOUBLE
1838         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(8),v)
1839#else
1840         ierr = NF_GET_VAR_REAL(nid,var3didin(8),v)
1841#endif
1842         if(ierr/=NF_NOERR) then
1843            write(*,*) NF_STRERROR(ierr)
1844            stop "getvarup"
1845         endif
1846!         write(*,*)'lecture v ok'
1847
1848#ifdef NC_DOUBLE
1849         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(9),omega)
1850#else
1851         ierr = NF_GET_VAR_REAL(nid,var3didin(9),omega)
1852#endif
1853         if(ierr/=NF_NOERR) then
1854            write(*,*) NF_STRERROR(ierr)
1855            stop "getvarup"
1856         endif
1857!         write(*,*)'lecture omega ok'
1858!omega in mb/hour
1859       do l=1,ntime
1860       do k=1,nlevel
1861          omega(k,l)=omega(k,l)*100./3600.
1862       enddo
1863       enddo
1864
1865#ifdef NC_DOUBLE
1866         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(10),div)
1867#else
1868         ierr = NF_GET_VAR_REAL(nid,var3didin(10),div)
1869#endif
1870         if(ierr/=NF_NOERR) then
1871            write(*,*) NF_STRERROR(ierr)
1872            stop "getvarup"
1873         endif
1874!         write(*,*)'lecture div ok'
1875
1876#ifdef NC_DOUBLE
1877         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(11),T_adv_h)
1878#else
1879         ierr = NF_GET_VAR_REAL(nid,var3didin(11),T_adv_h)
1880#endif
1881         if(ierr/=NF_NOERR) then
1882            write(*,*) NF_STRERROR(ierr)
1883            stop "getvarup"
1884         endif
1885!         write(*,*)'lecture T_adv_h ok'
1886!T adv in K/s
1887       do l=1,ntime
1888       do k=1,nlevel
1889          T_adv_h(k,l)=T_adv_h(k,l)/3600.
1890       enddo
1891       enddo
1892
1893
1894#ifdef NC_DOUBLE
1895         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(12),T_adv_v)
1896#else
1897         ierr = NF_GET_VAR_REAL(nid,var3didin(12),T_adv_v)
1898#endif
1899         if(ierr/=NF_NOERR) then
1900            write(*,*) NF_STRERROR(ierr)
1901            stop "getvarup"
1902         endif
1903!         write(*,*)'lecture T_adv_v ok'
1904!T adv in K/s
1905       do l=1,ntime
1906       do k=1,nlevel
1907          T_adv_v(k,l)=T_adv_v(k,l)/3600.
1908       enddo
1909       enddo
1910
1911#ifdef NC_DOUBLE
1912         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(13),q_adv_h)
1913#else
1914         ierr = NF_GET_VAR_REAL(nid,var3didin(13),q_adv_h)
1915#endif
1916         if(ierr/=NF_NOERR) then
1917            write(*,*) NF_STRERROR(ierr)
1918            stop "getvarup"
1919         endif
1920!         write(*,*)'lecture q_adv_h ok'
1921!q adv in kg/kg/s
1922       do l=1,ntime
1923       do k=1,nlevel
1924          q_adv_h(k,l)=q_adv_h(k,l)/1000./3600.
1925       enddo
1926       enddo
1927
1928
1929#ifdef NC_DOUBLE
1930         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(14),q_adv_v)
1931#else
1932         ierr = NF_GET_VAR_REAL(nid,var3didin(14),q_adv_v)
1933#endif
1934         if(ierr/=NF_NOERR) then
1935            write(*,*) NF_STRERROR(ierr)
1936            stop "getvarup"
1937         endif
1938!         write(*,*)'lecture q_adv_v ok'
1939!q adv in kg/kg/s
1940       do l=1,ntime
1941       do k=1,nlevel
1942          q_adv_v(k,l)=q_adv_v(k,l)/1000./3600.
1943       enddo
1944       enddo
1945
1946
1947#ifdef NC_DOUBLE
1948         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(15),s)
1949#else
1950         ierr = NF_GET_VAR_REAL(nid,var3didin(15),s)
1951#endif
1952         if(ierr/=NF_NOERR) then
1953            write(*,*) NF_STRERROR(ierr)
1954            stop "getvarup"
1955         endif
1956
1957#ifdef NC_DOUBLE
1958         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(16),s_adv_h)
1959#else
1960         ierr = NF_GET_VAR_REAL(nid,var3didin(16),s_adv_h)
1961#endif
1962         if(ierr/=NF_NOERR) then
1963            write(*,*) NF_STRERROR(ierr)
1964            stop "getvarup"
1965         endif
1966
1967#ifdef NC_DOUBLE
1968         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(17),s_adv_v)
1969#else
1970         ierr = NF_GET_VAR_REAL(nid,var3didin(17),s_adv_v)
1971#endif
1972         if(ierr/=NF_NOERR) then
1973            write(*,*) NF_STRERROR(ierr)
1974            stop "getvarup"
1975         endif
1976
1977#ifdef NC_DOUBLE
1978         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(18),p_srf_aver)
1979#else
1980         ierr = NF_GET_VAR_REAL(nid,var3didin(18),p_srf_aver)
1981#endif
1982         if(ierr/=NF_NOERR) then
1983            write(*,*) NF_STRERROR(ierr)
1984            stop "getvarup"
1985         endif
1986
1987#ifdef NC_DOUBLE
1988         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(19),p_srf_center)
1989#else
1990         ierr = NF_GET_VAR_REAL(nid,var3didin(19),p_srf_center)
1991#endif
1992         if(ierr/=NF_NOERR) then
1993            write(*,*) NF_STRERROR(ierr)
1994            stop "getvarup"
1995         endif
1996
1997#ifdef NC_DOUBLE
1998         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(20),T_srf)
1999#else
2000         ierr = NF_GET_VAR_REAL(nid,var3didin(20),T_srf)
2001#endif
2002         if(ierr/=NF_NOERR) then
2003            write(*,*) NF_STRERROR(ierr)
2004            stop "getvarup"
2005         endif
2006!         write(*,*)'lecture T_srf ok', T_srf
2007
2008         return 
2009         end subroutine read_twpice
2010!=====================================================================
2011         subroutine catchaxis(nid,ttm,llm,time,lev,ierr)
2012
2013!         use netcdf
2014
2015         implicit none
2016#include "netcdf.inc"
2017         integer nid,ttm,llm
2018         real*8 time(ttm)
2019         real*8 lev(llm)
2020         integer ierr
2021
2022         integer timevar,levvar
2023         integer timelen,levlen
2024         integer timedimin,levdimin
2025
2026! Control & lecture on dimensions
2027! ===============================
2028         ierr=NF_INQ_DIMID(nid,"time",timedimin)
2029         ierr=NF_INQ_VARID(nid,"time",timevar)
2030         if (ierr.NE.NF_NOERR) then
2031            write(*,*) 'ERROR: Field <time> is missing'
2032            stop "" 
2033         endif
2034         ierr=NF_INQ_DIMLEN(nid,timedimin,timelen)
2035
2036         ierr=NF_INQ_DIMID(nid,"lev",levdimin)
2037         ierr=NF_INQ_VARID(nid,"lev",levvar)
2038         if (ierr.NE.NF_NOERR) then
2039             write(*,*) 'ERROR: Field <lev> is lacking'
2040             stop "" 
2041         endif
2042         ierr=NF_INQ_DIMLEN(nid,levdimin,levlen)
2043
2044         if((timelen/=ttm).or.(levlen/=llm)) then
2045            write(*,*) 'ERROR: Not the good lenght for axis'
2046            write(*,*) 'longitude: ',timelen,ttm+1
2047            write(*,*) 'latitude: ',levlen,llm
2048            stop "" 
2049         endif
2050
2051!#ifdef NC_DOUBLE
2052         ierr = NF_GET_VAR_DOUBLE(nid,timevar,time)
2053         ierr = NF_GET_VAR_DOUBLE(nid,levvar,lev)
2054!#else
2055!        ierr = NF_GET_VAR_REAL(nid,timevar,time)
2056!        ierr = NF_GET_VAR_REAL(nid,levvar,lev)
2057!#endif
2058
2059       return
2060       end
2061!=====================================================================
2062
2063       SUBROUTINE interp_sandu_vertical(play,nlev_sandu,plev_prof          &
2064     &         ,t_prof,thl_prof,q_prof,u_prof,v_prof,w_prof                &
2065     &         ,omega_prof,o3mmr_prof                                      &
2066     &         ,t_mod,thl_mod,q_mod,u_mod,v_mod,w_mod                      &
2067     &         ,omega_mod,o3mmr_mod,mxcalc)
2068
2069       implicit none
2070
2071#include "dimensions.h"
2072
2073!-------------------------------------------------------------------------
2074! Vertical interpolation of SANDUREF forcing data onto model levels
2075!-------------------------------------------------------------------------
2076
2077       integer nlevmax
2078       parameter (nlevmax=41)
2079       integer nlev_sandu,mxcalc
2080!       real play(llm), plev_prof(nlevmax)
2081!       real t_prof(nlevmax),q_prof(nlevmax)
2082!       real u_prof(nlevmax),v_prof(nlevmax), w_prof(nlevmax)
2083!       real ht_prof(nlevmax),vt_prof(nlevmax)
2084!       real hq_prof(nlevmax),vq_prof(nlevmax)
2085
2086       real play(llm), plev_prof(nlev_sandu)
2087       real t_prof(nlev_sandu),thl_prof(nlev_sandu),q_prof(nlev_sandu)
2088       real u_prof(nlev_sandu),v_prof(nlev_sandu), w_prof(nlev_sandu)
2089       real omega_prof(nlev_sandu),o3mmr_prof(nlev_sandu)
2090
2091       real t_mod(llm),thl_mod(llm),q_mod(llm)
2092       real u_mod(llm),v_mod(llm), w_mod(llm)
2093       real omega_mod(llm),o3mmr_mod(llm)
2094
2095       integer l,k,k1,k2
2096       real frac,frac1,frac2,fact
2097
2098       do l = 1, llm
2099
2100        if (play(l).ge.plev_prof(nlev_sandu)) then
2101
2102        mxcalc=l
2103         k1=0
2104         k2=0
2105
2106         if (play(l).le.plev_prof(1)) then
2107
2108         do k = 1, nlev_sandu-1
2109          if (play(l).le.plev_prof(k).and. play(l).gt.plev_prof(k+1)) then
2110            k1=k
2111            k2=k+1
2112          endif
2113         enddo
2114
2115         if (k1.eq.0 .or. k2.eq.0) then
2116          write(*,*) 'PB! k1, k2 = ',k1,k2
2117          write(*,*) 'l,play(l) = ',l,play(l)/100
2118         do k = 1, nlev_sandu-1
2119          write(*,*) 'k,plev_prof(k) = ',k,plev_prof(k)/100
2120         enddo
2121         endif
2122
2123         frac = (plev_prof(k2)-play(l))/(plev_prof(k2)-plev_prof(k1))
2124         t_mod(l)= t_prof(k2) - frac*(t_prof(k2)-t_prof(k1))
2125         thl_mod(l)= thl_prof(k2) - frac*(thl_prof(k2)-thl_prof(k1))
2126         q_mod(l)= q_prof(k2) - frac*(q_prof(k2)-q_prof(k1))
2127         u_mod(l)= u_prof(k2) - frac*(u_prof(k2)-u_prof(k1))
2128         v_mod(l)= v_prof(k2) - frac*(v_prof(k2)-v_prof(k1))
2129         w_mod(l)= w_prof(k2) - frac*(w_prof(k2)-w_prof(k1))
2130         omega_mod(l)=omega_prof(k2)-frac*(omega_prof(k2)-omega_prof(k1))
2131         o3mmr_mod(l)=o3mmr_prof(k2)-frac*(o3mmr_prof(k2)-o3mmr_prof(k1))
2132
2133         else !play>plev_prof(1)
2134
2135         k1=1
2136         k2=2
2137         frac1 = (play(l)-plev_prof(k2))/(plev_prof(k1)-plev_prof(k2))
2138         frac2 = (play(l)-plev_prof(k1))/(plev_prof(k1)-plev_prof(k2))
2139         t_mod(l)= frac1*t_prof(k1) - frac2*t_prof(k2)
2140         thl_mod(l)= frac1*thl_prof(k1) - frac2*thl_prof(k2)
2141         q_mod(l)= frac1*q_prof(k1) - frac2*q_prof(k2)
2142         u_mod(l)= frac1*u_prof(k1) - frac2*u_prof(k2)
2143         v_mod(l)= frac1*v_prof(k1) - frac2*v_prof(k2)
2144         w_mod(l)= frac1*w_prof(k1) - frac2*w_prof(k2)
2145         omega_mod(l)= frac1*omega_prof(k1) - frac2*omega_prof(k2)
2146         o3mmr_mod(l)= frac1*o3mmr_prof(k1) - frac2*o3mmr_prof(k2)
2147
2148         endif ! play.le.plev_prof(1)
2149
2150        else ! above max altitude of forcing file
2151
2152!jyg
2153         fact=20.*(plev_prof(nlev_sandu)-play(l))/plev_prof(nlev_sandu) !jyg
2154         fact = max(fact,0.)                                           !jyg
2155         fact = exp(-fact)                                             !jyg
2156         t_mod(l)= t_prof(nlev_sandu)                                   !jyg
2157         thl_mod(l)= thl_prof(nlev_sandu)                                   !jyg
2158         q_mod(l)= q_prof(nlev_sandu)*fact                              !jyg
2159         u_mod(l)= u_prof(nlev_sandu)*fact                              !jyg
2160         v_mod(l)= v_prof(nlev_sandu)*fact                              !jyg
2161         w_mod(l)= w_prof(nlev_sandu)*fact                              !jyg
2162         omega_mod(l)= omega_prof(nlev_sandu)*fact                      !jyg
2163         o3mmr_mod(l)= o3mmr_prof(nlev_sandu)*fact                      !jyg
2164
2165        endif ! play
2166
2167       enddo ! l
2168
2169       do l = 1,llm
2170!      print *,'t_mod(l),thl_mod(l),q_mod(l),u_mod(l),v_mod(l) ',
2171!    $        l,t_mod(l),thl_mod(l),q_mod(l),u_mod(l),v_mod(l)
2172       enddo
2173
2174          return
2175          end
2176!=====================================================================
2177       SUBROUTINE interp_astex_vertical(play,nlev_astex,plev_prof          &
2178     &         ,t_prof,thl_prof,qv_prof,ql_prof,qt_prof,u_prof,v_prof      &
2179     &         ,w_prof,tke_prof,o3mmr_prof                                 &
2180     &         ,t_mod,thl_mod,qv_mod,ql_mod,qt_mod,u_mod,v_mod,w_mod       &
2181     &         ,tke_mod,o3mmr_mod,mxcalc)
2182
2183       implicit none
2184
2185#include "dimensions.h"
2186
2187!-------------------------------------------------------------------------
2188! Vertical interpolation of Astex forcing data onto model levels
2189!-------------------------------------------------------------------------
2190
2191       integer nlevmax
2192       parameter (nlevmax=41)
2193       integer nlev_astex,mxcalc
2194!       real play(llm), plev_prof(nlevmax)
2195!       real t_prof(nlevmax),qv_prof(nlevmax)
2196!       real u_prof(nlevmax),v_prof(nlevmax), w_prof(nlevmax)
2197!       real ht_prof(nlevmax),vt_prof(nlevmax)
2198!       real hq_prof(nlevmax),vq_prof(nlevmax)
2199
2200       real play(llm), plev_prof(nlev_astex)
2201       real t_prof(nlev_astex),thl_prof(nlev_astex),qv_prof(nlev_astex)
2202       real u_prof(nlev_astex),v_prof(nlev_astex), w_prof(nlev_astex)
2203       real o3mmr_prof(nlev_astex),ql_prof(nlev_astex)
2204       real qt_prof(nlev_astex),tke_prof(nlev_astex)
2205
2206       real t_mod(llm),thl_mod(llm),qv_mod(llm)
2207       real u_mod(llm),v_mod(llm), w_mod(llm),tke_mod(llm)
2208       real o3mmr_mod(llm),ql_mod(llm),qt_mod(llm)
2209
2210       integer l,k,k1,k2
2211       real frac,frac1,frac2,fact
2212
2213       do l = 1, llm
2214
2215        if (play(l).ge.plev_prof(nlev_astex)) then
2216
2217        mxcalc=l
2218         k1=0
2219         k2=0
2220
2221         if (play(l).le.plev_prof(1)) then
2222
2223         do k = 1, nlev_astex-1
2224          if (play(l).le.plev_prof(k).and. play(l).gt.plev_prof(k+1)) then
2225            k1=k
2226            k2=k+1
2227          endif
2228         enddo
2229
2230         if (k1.eq.0 .or. k2.eq.0) then
2231          write(*,*) 'PB! k1, k2 = ',k1,k2
2232          write(*,*) 'l,play(l) = ',l,play(l)/100
2233         do k = 1, nlev_astex-1
2234          write(*,*) 'k,plev_prof(k) = ',k,plev_prof(k)/100
2235         enddo
2236         endif
2237
2238         frac = (plev_prof(k2)-play(l))/(plev_prof(k2)-plev_prof(k1))
2239         t_mod(l)= t_prof(k2) - frac*(t_prof(k2)-t_prof(k1))
2240         thl_mod(l)= thl_prof(k2) - frac*(thl_prof(k2)-thl_prof(k1))
2241         qv_mod(l)= qv_prof(k2) - frac*(qv_prof(k2)-qv_prof(k1))
2242         ql_mod(l)= ql_prof(k2) - frac*(ql_prof(k2)-ql_prof(k1))
2243         qt_mod(l)= qt_prof(k2) - frac*(qt_prof(k2)-qt_prof(k1))
2244         u_mod(l)= u_prof(k2) - frac*(u_prof(k2)-u_prof(k1))
2245         v_mod(l)= v_prof(k2) - frac*(v_prof(k2)-v_prof(k1))
2246         w_mod(l)= w_prof(k2) - frac*(w_prof(k2)-w_prof(k1))
2247         tke_mod(l)= tke_prof(k2) - frac*(tke_prof(k2)-tke_prof(k1))
2248         o3mmr_mod(l)=o3mmr_prof(k2)-frac*(o3mmr_prof(k2)-o3mmr_prof(k1))
2249
2250         else !play>plev_prof(1)
2251
2252         k1=1
2253         k2=2
2254         frac1 = (play(l)-plev_prof(k2))/(plev_prof(k1)-plev_prof(k2))
2255         frac2 = (play(l)-plev_prof(k1))/(plev_prof(k1)-plev_prof(k2))
2256         t_mod(l)= frac1*t_prof(k1) - frac2*t_prof(k2)
2257         thl_mod(l)= frac1*thl_prof(k1) - frac2*thl_prof(k2)
2258         qv_mod(l)= frac1*qv_prof(k1) - frac2*qv_prof(k2)
2259         ql_mod(l)= frac1*ql_prof(k1) - frac2*ql_prof(k2)
2260         qt_mod(l)= frac1*qt_prof(k1) - frac2*qt_prof(k2)
2261         u_mod(l)= frac1*u_prof(k1) - frac2*u_prof(k2)
2262         v_mod(l)= frac1*v_prof(k1) - frac2*v_prof(k2)
2263         w_mod(l)= frac1*w_prof(k1) - frac2*w_prof(k2)
2264         tke_mod(l)= frac1*tke_prof(k1) - frac2*tke_prof(k2)
2265         o3mmr_mod(l)= frac1*o3mmr_prof(k1) - frac2*o3mmr_prof(k2)
2266
2267         endif ! play.le.plev_prof(1)
2268
2269        else ! above max altitude of forcing file
2270
2271!jyg
2272         fact=20.*(plev_prof(nlev_astex)-play(l))/plev_prof(nlev_astex) !jyg
2273         fact = max(fact,0.)                                           !jyg
2274         fact = exp(-fact)                                             !jyg
2275         t_mod(l)= t_prof(nlev_astex)                                   !jyg
2276         thl_mod(l)= thl_prof(nlev_astex)                                   !jyg
2277         qv_mod(l)= qv_prof(nlev_astex)*fact                              !jyg
2278         ql_mod(l)= ql_prof(nlev_astex)*fact                              !jyg
2279         qt_mod(l)= qt_prof(nlev_astex)*fact                              !jyg
2280         u_mod(l)= u_prof(nlev_astex)*fact                              !jyg
2281         v_mod(l)= v_prof(nlev_astex)*fact                              !jyg
2282         w_mod(l)= w_prof(nlev_astex)*fact                              !jyg
2283         tke_mod(l)= tke_prof(nlev_astex)*fact                              !jyg
2284         o3mmr_mod(l)= o3mmr_prof(nlev_astex)*fact                      !jyg
2285
2286        endif ! play
2287
2288       enddo ! l
2289
2290       do l = 1,llm
2291!      print *,'t_mod(l),thl_mod(l),qv_mod(l),u_mod(l),v_mod(l) ',
2292!    $        l,t_mod(l),thl_mod(l),qv_mod(l),u_mod(l),v_mod(l)
2293       enddo
2294
2295          return
2296          end
2297
2298!======================================================================
2299      SUBROUTINE read_rico(fich_rico,nlev_rico,ps_rico,play                &
2300     &             ,ts_rico,t_rico,q_rico,u_rico,v_rico,w_rico             &
2301     &             ,dth_dyn,dqh_dyn)
2302      implicit none
2303
2304!-------------------------------------------------------------------------
2305! Read RICO forcing data
2306!-------------------------------------------------------------------------
2307#include "dimensions.h"
2308
2309
2310      integer nlev_rico
2311      real ts_rico,ps_rico
2312      real t_rico(llm),q_rico(llm)
2313      real u_rico(llm),v_rico(llm)
2314      real w_rico(llm)
2315      real dth_dyn(llm)
2316      real dqh_dyn(llm)
2317     
2318
2319      real play(llm),zlay(llm)
2320     
2321
2322      real prico(nlev_rico),zrico(nlev_rico)
2323
2324      character*80 fich_rico
2325
2326      integer k,l
2327
2328     
2329      print*,fich_rico
2330      open(21,file=trim(fich_rico),form='formatted')
2331        do k=1,llm
2332      zlay(k)=0.
2333         enddo
2334     
2335        read(21,*) ps_rico,ts_rico
2336        prico(1)=ps_rico
2337        zrico(1)=0.0
2338      do l=2,nlev_rico
2339        read(21,*) k,prico(l),zrico(l)
2340      enddo
2341       close(21)
2342
2343      do k=1,llm
2344        do l=1,80
2345          if(prico(l)>play(k)) then
2346              if(play(k)>prico(l+1)) then
2347                zlay(k)=zrico(l)+(play(k)-prico(l)) *                      &
2348     &              (zrico(l+1)-zrico(l))/(prico(l+1)-prico(l))
2349              else 
2350                zlay(k)=zrico(l)+(play(k)-prico(80))*                      &
2351     &              (zrico(81)-zrico(80))/(prico(81)-prico(80))
2352              endif
2353          endif
2354        enddo
2355        print*,k,zlay(k)
2356        ! U
2357        if(0 < zlay(k) .and. zlay(k) < 4000) then
2358          u_rico(k)=-9.9 + (-1.9 + 9.9)*zlay(k)/4000
2359        elseif(4000 < zlay(k) .and. zlay(k) < 12000) then
2360       u_rico(k)=  -1.9 + (30.0 + 1.9) /                                   &
2361     &          (12000 - 4000) * (zlay(k) - 4000)
2362        elseif(12000 < zlay(k) .and. zlay(k) < 13000) then
2363          u_rico(k)=30.0
2364        elseif(13000 < zlay(k) .and. zlay(k) < 20000) then
2365          u_rico(k)=30.0 - (30.0) /                                        &
2366     & (20000 - 13000) * (zlay(k) - 13000)
2367        else
2368          u_rico(k)=0.0
2369        endif
2370
2371!Q_v
2372        if(0 < zlay(k) .and. zlay(k) < 740) then
2373          q_rico(k)=16.0 + (13.8 - 16.0) / (740) * zlay(k)
2374        elseif(740 < zlay(k) .and. zlay(k) < 3260) then
2375          q_rico(k)=13.8 + (2.4 - 13.8) /                                   &
2376     &          (3260 - 740) * (zlay(k) - 740)
2377        elseif(3260 < zlay(k) .and. zlay(k) < 4000) then
2378          q_rico(k)=2.4 + (1.8 - 2.4) /                                    &
2379     &               (4000 - 3260) * (zlay(k) - 3260)
2380        elseif(4000 < zlay(k) .and. zlay(k) < 9000) then
2381          q_rico(k)=1.8 + (0 - 1.8) /                                      &
2382     &             (9000 - 4000) * (zlay(k) - 4000)
2383        else
2384          q_rico(k)=0.0
2385        endif
2386
2387!T
2388        if(0 < zlay(k) .and. zlay(k) < 740) then
2389          t_rico(k)=299.2 + (292.0 - 299.2) / (740) * zlay(k)
2390        elseif(740 < zlay(k) .and. zlay(k) < 4000) then
2391          t_rico(k)=292.0 + (278.0 - 292.0) /                              &                       
2392     &       (4000 - 740) * (zlay(k) - 740)
2393        elseif(4000 < zlay(k) .and. zlay(k) < 15000) then
2394          t_rico(k)=278.0 + (203.0 - 278.0) /                              &
2395     &       (15000 - 4000) * (zlay(k) - 4000)
2396        elseif(15000 < zlay(k) .and. zlay(k) < 17500) then
2397          t_rico(k)=203.0 + (194.0 - 203.0) /                              & 
2398     &       (17500 - 15000)* (zlay(k) - 15000)
2399        elseif(17500 < zlay(k) .and. zlay(k) < 20000) then
2400          t_rico(k)=194.0 + (206.0 - 194.0) /                              &
2401     &       (20000 - 17500)* (zlay(k) - 17500)
2402        elseif(20000 < zlay(k) .and. zlay(k) < 60000) then
2403          t_rico(k)=206.0 + (270.0 - 206.0) /                              & 
2404     &        (60000 - 20000)* (zlay(k) - 20000)
2405        endif
2406
2407! W
2408        if(0 < zlay(k) .and. zlay(k) < 2260 ) then
2409          w_rico(k)=- (0.005/2260) * zlay(k)
2410        elseif(2260 < zlay(k) .and. zlay(k) < 4000 ) then
2411          w_rico(k)=- 0.005
2412        elseif(4000 < zlay(k) .and. zlay(k) < 5000 ) then
2413       w_rico(k)=- 0.005 + (0.005/ (5000 - 4000)) * (zlay(k) - 4000)
2414        else
2415          w_rico(k)=0.0
2416        endif
2417
2418! dThrz+dTsw0+dTlw0
2419        if(0 < zlay(k) .and. zlay(k) < 4000) then
2420          dth_dyn(k)=- 2.51 / 86400 + (-2.18 + 2.51 )/                     &
2421     &               (86400*4000) * zlay(k)
2422        elseif(4000 < zlay(k) .and. zlay(k) < 5000) then
2423          dth_dyn(k)=- 2.18 / 86400 + ( 2.18 ) /                           &
2424     &           (86400*(5000 - 4000)) * (zlay(k) - 4000)
2425        else
2426          dth_dyn(k)=0.0
2427        endif
2428! dQhrz
2429        if(0 < zlay(k) .and. zlay(k) < 3000) then
2430          dqh_dyn(k)=-1.0 / 86400 + (0.345 + 1.0)/                         &
2431     &                    (86400*3000) * (zlay(k))
2432        elseif(3000 < zlay(k) .and. zlay(k) < 4000) then
2433          dqh_dyn(k)=0.345 / 86400
2434        elseif(4000 < zlay(k) .and. zlay(k) < 5000) then
2435          dqh_dyn(k)=0.345 / 86400 +                                       &
2436     &   (-0.345)/(86400 * (5000 - 4000)) * (zlay(k)-4000)
2437        else
2438          dqh_dyn(k)=0.0
2439        endif
2440
2441!?        if(play(k)>6e4) then
2442!?          ratqs0(1,k)=ratqsbas*(plev(1)-play(k))/(plev(1)-6e4)
2443!?        elseif((play(k)>3e4).and.(play(k)<6e4)) then
2444!?          ratqs0(1,k)=ratqsbas+(ratqshaut-ratqsbas)&
2445!?                          *(6e4-play(k))/(6e4-3e4)
2446!?        else
2447!?          ratqs0(1,k)=ratqshaut
2448!?        endif
2449
2450      enddo
2451
2452      do k=1,llm
2453      q_rico(k)=q_rico(k)/1e3 
2454      dqh_dyn(k)=dqh_dyn(k)/1e3
2455      v_rico(k)=-3.8
2456      enddo
2457
2458          return
2459          end
2460
2461!======================================================================
2462        SUBROUTINE interp_sandu_time(day,day1,annee_ref                    &
2463     &             ,year_ini_sandu,day_ini_sandu,nt_sandu,dt_sandu         &
2464     &             ,nlev_sandu,ts_sandu,ts_prof)
2465        implicit none
2466
2467!---------------------------------------------------------------------------------------
2468! Time interpolation of a 2D field to the timestep corresponding to day
2469!
2470! day: current julian day (e.g. 717538.2)
2471! day1: first day of the simulation
2472! nt_sandu: total nb of data in the forcing (e.g. 13 for Sanduref)
2473! dt_sandu: total time interval (in sec) between 2 forcing data (e.g. 6h for Sanduref)
2474!---------------------------------------------------------------------------------------
2475! inputs:
2476        integer annee_ref
2477        integer nt_sandu,nlev_sandu
2478        integer year_ini_sandu
2479        real day, day1,day_ini_sandu,dt_sandu
2480        real ts_sandu(nt_sandu)
2481! outputs:
2482        real ts_prof
2483! local:
2484        integer it_sandu1, it_sandu2
2485        real timeit,time_sandu1,time_sandu2,frac
2486! Check that initial day of the simulation consistent with SANDU period:
2487       if (annee_ref.ne.2006 ) then
2488        print*,'Pour SANDUREF, annee_ref doit etre 2006 '
2489        print*,'Changer annee_ref dans run.def'
2490        stop
2491       endif
2492!      if (annee_ref.eq.2006 .and. day1.lt.day_ini_sandu) then
2493!       print*,'SANDUREF debute le 15 Juillet 2006 (jour julien=196)'
2494!       print*,'Changer dayref dans run.def'
2495!       stop
2496!      endif
2497
2498! Determine timestep relative to the 1st day of TOGA-COARE:
2499!       timeit=(day-day1)*86400.
2500!       if (annee_ref.eq.1992) then
2501!        timeit=(day-day_ini_sandu)*86400.
2502!       else
2503!        timeit=(day+61.-1.)*86400. ! 61 days between Nov01 and Dec31 1992
2504!       endif
2505      timeit=(day-day_ini_sandu)*86400
2506
2507! Determine the closest observation times:
2508       it_sandu1=INT(timeit/dt_sandu)+1
2509       it_sandu2=it_sandu1 + 1
2510       time_sandu1=(it_sandu1-1)*dt_sandu
2511       time_sandu2=(it_sandu2-1)*dt_sandu
2512       print *,'timeit day day_ini_sandu',timeit,day,day_ini_sandu
2513       print *,'it_sandu1,it_sandu2,time_sandu1,time_sandu2',              &
2514     &          it_sandu1,it_sandu2,time_sandu1,time_sandu2
2515
2516       if (it_sandu1 .ge. nt_sandu) then
2517        write(*,*) 'PB-stop: day, it_sandu1, it_sandu2, timeit: '          &
2518     &        ,day,it_sandu1,it_sandu2,timeit/86400.
2519        stop
2520       endif
2521
2522! time interpolation:
2523       frac=(time_sandu2-timeit)/(time_sandu2-time_sandu1)
2524       frac=max(frac,0.0)
2525
2526       ts_prof = ts_sandu(it_sandu2)                                       &
2527     &          -frac*(ts_sandu(it_sandu2)-ts_sandu(it_sandu1))
2528
2529         print*,                                                           &
2530     &'day,annee_ref,day_ini_sandu,timeit,it_sandu1,it_sandu2,SST:',       &
2531     &day,annee_ref,day_ini_sandu,timeit/86400.,it_sandu1,                  &
2532     &it_sandu2,ts_prof
2533
2534        return
2535        END
2536!=====================================================================
2537!-------------------------------------------------------------------------
2538      SUBROUTINE read_armcu(fich_armcu,nlev_armcu,nt_armcu,                &
2539     & sens,flat,adv_theta,rad_theta,adv_qt)
2540      implicit none
2541
2542!-------------------------------------------------------------------------
2543! Read ARM_CU case forcing data
2544!-------------------------------------------------------------------------
2545
2546      integer nlev_armcu,nt_armcu
2547      real sens(nt_armcu),flat(nt_armcu)
2548      real adv_theta(nt_armcu),rad_theta(nt_armcu),adv_qt(nt_armcu)
2549      character*80 fich_armcu
2550
2551      integer ip
2552
2553      integer iy,im,id,ih,in
2554
2555      print*,'nlev_armcu',nlev_armcu
2556
2557      open(21,file=trim(fich_armcu),form='formatted')
2558      read(21,'(a)')
2559      do ip = 1, nt_armcu
2560      read(21,'(a)')
2561      read(21,'(a)')
2562      read(21,223) iy, im, id, ih, in, sens(ip),flat(ip),                  &
2563     &             adv_theta(ip),rad_theta(ip),adv_qt(ip)
2564      print *,'forcages=',iy,im,id,ih,in, sens(ip),flat(ip),               &
2565     &             adv_theta(ip),rad_theta(ip),adv_qt(ip)
2566      enddo
2567      close(21)
2568
2569  223 format(5i3,5f8.3)
2570
2571          return
2572          end
2573
2574!=====================================================================
2575       SUBROUTINE interp_toga_vertical(play,nlev_toga,plev_prof            &
2576     &         ,t_prof,q_prof,u_prof,v_prof,w_prof                         &
2577     &         ,ht_prof,vt_prof,hq_prof,vq_prof                            &
2578     &         ,t_mod,q_mod,u_mod,v_mod,w_mod                              &
2579     &         ,ht_mod,vt_mod,hq_mod,vq_mod,mxcalc)
2580 
2581       implicit none
2582 
2583#include "dimensions.h"
2584
2585!-------------------------------------------------------------------------
2586! Vertical interpolation of TOGA-COARE forcing data onto model levels
2587!-------------------------------------------------------------------------
2588 
2589       integer nlevmax
2590       parameter (nlevmax=41)
2591       integer nlev_toga,mxcalc
2592!       real play(llm), plev_prof(nlevmax) 
2593!       real t_prof(nlevmax),q_prof(nlevmax)
2594!       real u_prof(nlevmax),v_prof(nlevmax), w_prof(nlevmax)
2595!       real ht_prof(nlevmax),vt_prof(nlevmax)
2596!       real hq_prof(nlevmax),vq_prof(nlevmax)
2597 
2598       real play(llm), plev_prof(nlev_toga) 
2599       real t_prof(nlev_toga),q_prof(nlev_toga)
2600       real u_prof(nlev_toga),v_prof(nlev_toga), w_prof(nlev_toga)
2601       real ht_prof(nlev_toga),vt_prof(nlev_toga)
2602       real hq_prof(nlev_toga),vq_prof(nlev_toga)
2603 
2604       real t_mod(llm),q_mod(llm)
2605       real u_mod(llm),v_mod(llm), w_mod(llm)
2606       real ht_mod(llm),vt_mod(llm)
2607       real hq_mod(llm),vq_mod(llm)
2608 
2609       integer l,k,k1,k2
2610       real frac,frac1,frac2,fact
2611 
2612       do l = 1, llm
2613
2614        if (play(l).ge.plev_prof(nlev_toga)) then
2615 
2616        mxcalc=l
2617         k1=0
2618         k2=0
2619
2620         if (play(l).le.plev_prof(1)) then
2621
2622         do k = 1, nlev_toga-1
2623          if (play(l).le.plev_prof(k).and. play(l).gt.plev_prof(k+1)) then
2624            k1=k
2625            k2=k+1
2626          endif
2627         enddo
2628
2629         if (k1.eq.0 .or. k2.eq.0) then
2630          write(*,*) 'PB! k1, k2 = ',k1,k2
2631          write(*,*) 'l,play(l) = ',l,play(l)/100
2632         do k = 1, nlev_toga-1
2633          write(*,*) 'k,plev_prof(k) = ',k,plev_prof(k)/100
2634         enddo
2635         endif
2636
2637         frac = (plev_prof(k2)-play(l))/(plev_prof(k2)-plev_prof(k1))
2638         t_mod(l)= t_prof(k2) - frac*(t_prof(k2)-t_prof(k1))
2639         q_mod(l)= q_prof(k2) - frac*(q_prof(k2)-q_prof(k1))
2640         u_mod(l)= u_prof(k2) - frac*(u_prof(k2)-u_prof(k1))
2641         v_mod(l)= v_prof(k2) - frac*(v_prof(k2)-v_prof(k1))
2642         w_mod(l)= w_prof(k2) - frac*(w_prof(k2)-w_prof(k1))
2643         ht_mod(l)= ht_prof(k2) - frac*(ht_prof(k2)-ht_prof(k1))
2644         vt_mod(l)= vt_prof(k2) - frac*(vt_prof(k2)-vt_prof(k1))
2645         hq_mod(l)= hq_prof(k2) - frac*(hq_prof(k2)-hq_prof(k1))
2646         vq_mod(l)= vq_prof(k2) - frac*(vq_prof(k2)-vq_prof(k1))
2647     
2648         else !play>plev_prof(1)
2649
2650         k1=1
2651         k2=2
2652         frac1 = (play(l)-plev_prof(k2))/(plev_prof(k1)-plev_prof(k2))
2653         frac2 = (play(l)-plev_prof(k1))/(plev_prof(k1)-plev_prof(k2))
2654         t_mod(l)= frac1*t_prof(k1) - frac2*t_prof(k2)
2655         q_mod(l)= frac1*q_prof(k1) - frac2*q_prof(k2)
2656         u_mod(l)= frac1*u_prof(k1) - frac2*u_prof(k2)
2657         v_mod(l)= frac1*v_prof(k1) - frac2*v_prof(k2)
2658         w_mod(l)= frac1*w_prof(k1) - frac2*w_prof(k2)
2659         ht_mod(l)= frac1*ht_prof(k1) - frac2*ht_prof(k2)
2660         vt_mod(l)= frac1*vt_prof(k1) - frac2*vt_prof(k2)
2661         hq_mod(l)= frac1*hq_prof(k1) - frac2*hq_prof(k2)
2662         vq_mod(l)= frac1*vq_prof(k1) - frac2*vq_prof(k2)
2663
2664         endif ! play.le.plev_prof(1)
2665
2666        else ! above max altitude of forcing file
2667 
2668!jyg
2669         fact=20.*(plev_prof(nlev_toga)-play(l))/plev_prof(nlev_toga) !jyg
2670         fact = max(fact,0.)                                           !jyg
2671         fact = exp(-fact)                                             !jyg
2672         t_mod(l)= t_prof(nlev_toga)                                   !jyg
2673         q_mod(l)= q_prof(nlev_toga)*fact                              !jyg
2674         u_mod(l)= u_prof(nlev_toga)*fact                              !jyg
2675         v_mod(l)= v_prof(nlev_toga)*fact                              !jyg
2676         w_mod(l)= 0.0                                                 !jyg
2677         ht_mod(l)= ht_prof(nlev_toga)                                 !jyg
2678         vt_mod(l)= vt_prof(nlev_toga)                                 !jyg
2679         hq_mod(l)= hq_prof(nlev_toga)*fact                            !jyg
2680         vq_mod(l)= vq_prof(nlev_toga)*fact                            !jyg
2681 
2682        endif ! play
2683 
2684       enddo ! l
2685
2686!       do l = 1,llm
2687!       print *,'t_mod(l),q_mod(l),ht_mod(l),hq_mod(l) ',
2688!     $        l,t_mod(l),q_mod(l),ht_mod(l),hq_mod(l)
2689!       enddo
2690 
2691          return
2692          end
2693 
2694!=====================================================================
2695       SUBROUTINE interp_case_vertical(play,nlev_cas,plev_prof_cas            &
2696     &         ,t_prof_cas,q_prof_cas,u_prof_cas,v_prof_cas,ug_prof_cas,vg_prof_cas,vitw_prof_cas                         &
2697     &         ,du_prof_cas,hu_prof_cas,vu_prof_cas,dv_prof_cas,hv_prof_cas,vv_prof_cas           &
2698     &         ,dt_prof_cas,ht_prof_cas,vt_prof_cas,dtrad_prof_cas,dq_prof_cas,hq_prof_cas,vq_prof_cas                            &
2699     &         ,t_mod_cas,q_mod_cas,u_mod_cas,v_mod_cas,ug_mod_cas,vg_mod_cas,w_mod_cas                              &
2700     &         ,du_mod_cas,hu_mod_cas,vu_mod_cas,dv_mod_cas,hv_mod_cas,vv_mod_cas               &
2701     &         ,dt_mod_cas,ht_mod_cas,vt_mod_cas,dtrad_mod_cas,dq_mod_cas,hq_mod_cas,vq_mod_cas,mxcalc)
2702 
2703       implicit none
2704 
2705#include "dimensions.h"
2706
2707!-------------------------------------------------------------------------
2708! Vertical interpolation of TOGA-COARE forcing data onto mod_casel levels
2709!-------------------------------------------------------------------------
2710 
2711       integer nlevmax
2712       parameter (nlevmax=41)
2713       integer nlev_cas,mxcalc
2714!       real play(llm), plev_prof(nlevmax) 
2715!       real t_prof(nlevmax),q_prof(nlevmax)
2716!       real u_prof(nlevmax),v_prof(nlevmax), w_prof(nlevmax)
2717!       real ht_prof(nlevmax),vt_prof(nlevmax)
2718!       real hq_prof(nlevmax),vq_prof(nlevmax)
2719 
2720       real play(llm), plev_prof_cas(nlev_cas) 
2721       real t_prof_cas(nlev_cas),q_prof_cas(nlev_cas)
2722       real u_prof_cas(nlev_cas),v_prof_cas(nlev_cas)
2723       real ug_prof_cas(nlev_cas),vg_prof_cas(nlev_cas), vitw_prof_cas(nlev_cas)
2724       real du_prof_cas(nlev_cas),hu_prof_cas(nlev_cas),vu_prof_cas(nlev_cas)
2725       real dv_prof_cas(nlev_cas),hv_prof_cas(nlev_cas),vv_prof_cas(nlev_cas)
2726       real dt_prof_cas(nlev_cas),ht_prof_cas(nlev_cas),vt_prof_cas(nlev_cas),dtrad_prof_cas(nlev_cas)
2727       real dq_prof_cas(nlev_cas),hq_prof_cas(nlev_cas),vq_prof_cas(nlev_cas)
2728 
2729       real t_mod_cas(llm),q_mod_cas(llm)
2730       real u_mod_cas(llm),v_mod_cas(llm)
2731       real ug_mod_cas(llm),vg_mod_cas(llm), w_mod_cas(llm)
2732       real du_mod_cas(llm),hu_mod_cas(llm),vu_mod_cas(llm)
2733       real dv_mod_cas(llm),hv_mod_cas(llm),vv_mod_cas(llm)
2734       real dt_mod_cas(llm),ht_mod_cas(llm),vt_mod_cas(llm),dtrad_mod_cas(llm)
2735       real dq_mod_cas(llm),hq_mod_cas(llm),vq_mod_cas(llm)
2736 
2737       integer l,k,k1,k2
2738       real frac,frac1,frac2,fact
2739 
2740       do l = 1, llm
2741
2742        if (play(l).ge.plev_prof_cas(nlev_cas)) then
2743 
2744        mxcalc=l
2745         k1=0
2746         k2=0
2747
2748         if (play(l).le.plev_prof_cas(1)) then
2749
2750         do k = 1, nlev_cas-1
2751          if (play(l).le.plev_prof_cas(k).and. play(l).gt.plev_prof_cas(k+1)) then
2752            k1=k
2753            k2=k+1
2754          endif
2755         enddo
2756
2757         if (k1.eq.0 .or. k2.eq.0) then
2758          write(*,*) 'PB! k1, k2 = ',k1,k2
2759          write(*,*) 'l,play(l) = ',l,play(l)/100
2760         do k = 1, nlev_cas-1
2761          write(*,*) 'k,plev_prof_cas(k) = ',k,plev_prof_cas(k)/100
2762         enddo
2763         endif
2764
2765         frac = (plev_prof_cas(k2)-play(l))/(plev_prof_cas(k2)-plev_prof_cas(k1))
2766         t_mod_cas(l)= t_prof_cas(k2) - frac*(t_prof_cas(k2)-t_prof_cas(k1))
2767         q_mod_cas(l)= q_prof_cas(k2) - frac*(q_prof_cas(k2)-q_prof_cas(k1))
2768         u_mod_cas(l)= u_prof_cas(k2) - frac*(u_prof_cas(k2)-u_prof_cas(k1))
2769         v_mod_cas(l)= v_prof_cas(k2) - frac*(v_prof_cas(k2)-v_prof_cas(k1))
2770         ug_mod_cas(l)= ug_prof_cas(k2) - frac*(ug_prof_cas(k2)-ug_prof_cas(k1))
2771         vg_mod_cas(l)= vg_prof_cas(k2) - frac*(vg_prof_cas(k2)-vg_prof_cas(k1))
2772         w_mod_cas(l)= vitw_prof_cas(k2) - frac*(vitw_prof_cas(k2)-vitw_prof_cas(k1))
2773         du_mod_cas(l)= du_prof_cas(k2) - frac*(du_prof_cas(k2)-du_prof_cas(k1))
2774         hu_mod_cas(l)= hu_prof_cas(k2) - frac*(hu_prof_cas(k2)-hu_prof_cas(k1))
2775         vu_mod_cas(l)= vu_prof_cas(k2) - frac*(vu_prof_cas(k2)-vu_prof_cas(k1))
2776         dv_mod_cas(l)= dv_prof_cas(k2) - frac*(dv_prof_cas(k2)-dv_prof_cas(k1))
2777         hv_mod_cas(l)= hv_prof_cas(k2) - frac*(hv_prof_cas(k2)-hv_prof_cas(k1))
2778         vv_mod_cas(l)= vv_prof_cas(k2) - frac*(vv_prof_cas(k2)-vv_prof_cas(k1))
2779         dt_mod_cas(l)= dt_prof_cas(k2) - frac*(dt_prof_cas(k2)-dt_prof_cas(k1))
2780         ht_mod_cas(l)= ht_prof_cas(k2) - frac*(ht_prof_cas(k2)-ht_prof_cas(k1))
2781         vt_mod_cas(l)= vt_prof_cas(k2) - frac*(vt_prof_cas(k2)-vt_prof_cas(k1))
2782         dq_mod_cas(l)= dq_prof_cas(k2) - frac*(dq_prof_cas(k2)-dq_prof_cas(k1))
2783         hq_mod_cas(l)= hq_prof_cas(k2) - frac*(hq_prof_cas(k2)-hq_prof_cas(k1))
2784         vq_mod_cas(l)= vq_prof_cas(k2) - frac*(vq_prof_cas(k2)-vq_prof_cas(k1))
2785     
2786         else !play>plev_prof_cas(1)
2787
2788         k1=1
2789         k2=2
2790         frac1 = (play(l)-plev_prof_cas(k2))/(plev_prof_cas(k1)-plev_prof_cas(k2))
2791         frac2 = (play(l)-plev_prof_cas(k1))/(plev_prof_cas(k1)-plev_prof_cas(k2))
2792         t_mod_cas(l)= frac1*t_prof_cas(k1) - frac2*t_prof_cas(k2)
2793         q_mod_cas(l)= frac1*q_prof_cas(k1) - frac2*q_prof_cas(k2)
2794         u_mod_cas(l)= frac1*u_prof_cas(k1) - frac2*u_prof_cas(k2)
2795         v_mod_cas(l)= frac1*v_prof_cas(k1) - frac2*v_prof_cas(k2)
2796         ug_mod_cas(l)= frac1*ug_prof_cas(k1) - frac2*ug_prof_cas(k2)
2797         vg_mod_cas(l)= frac1*vg_prof_cas(k1) - frac2*vg_prof_cas(k2)
2798         w_mod_cas(l)= frac1*vitw_prof_cas(k1) - frac2*vitw_prof_cas(k2)
2799         du_mod_cas(l)= frac1*du_prof_cas(k1) - frac2*du_prof_cas(k2)
2800         hu_mod_cas(l)= frac1*hu_prof_cas(k1) - frac2*hu_prof_cas(k2)
2801         vu_mod_cas(l)= frac1*vu_prof_cas(k1) - frac2*vu_prof_cas(k2)
2802         dv_mod_cas(l)= frac1*dv_prof_cas(k1) - frac2*dv_prof_cas(k2)
2803         hv_mod_cas(l)= frac1*hv_prof_cas(k1) - frac2*hv_prof_cas(k2)
2804         vv_mod_cas(l)= frac1*vv_prof_cas(k1) - frac2*vv_prof_cas(k2)
2805         dt_mod_cas(l)= frac1*dt_prof_cas(k1) - frac2*dt_prof_cas(k2)
2806         ht_mod_cas(l)= frac1*ht_prof_cas(k1) - frac2*ht_prof_cas(k2)
2807         vt_mod_cas(l)= frac1*vt_prof_cas(k1) - frac2*vt_prof_cas(k2)
2808         dq_mod_cas(l)= frac1*dq_prof_cas(k1) - frac2*dq_prof_cas(k2)
2809         hq_mod_cas(l)= frac1*hq_prof_cas(k1) - frac2*hq_prof_cas(k2)
2810         vq_mod_cas(l)= frac1*vq_prof_cas(k1) - frac2*vq_prof_cas(k2)
2811
2812         endif ! play.le.plev_prof_cas(1)
2813
2814        else ! above max altitude of forcing file
2815 
2816!jyg
2817         fact=20.*(plev_prof_cas(nlev_cas)-play(l))/plev_prof_cas(nlev_cas) !jyg
2818         fact = max(fact,0.)                                           !jyg
2819         fact = exp(-fact)                                             !jyg
2820         t_mod_cas(l)= t_prof_cas(nlev_cas)                                   !jyg
2821         q_mod_cas(l)= q_prof_cas(nlev_cas)*fact                              !jyg
2822         u_mod_cas(l)= u_prof_cas(nlev_cas)*fact                              !jyg
2823         v_mod_cas(l)= v_prof_cas(nlev_cas)*fact                              !jyg
2824         ug_mod_cas(l)= ug_prof_cas(nlev_cas)*fact                              !jyg
2825         vg_mod_cas(l)= vg_prof_cas(nlev_cas)*fact                              !jyg
2826         w_mod_cas(l)= 0.0                                                 !jyg
2827         du_mod_cas(l)= du_prof_cas(nlev_cas)*fact
2828         hu_mod_cas(l)= hu_prof_cas(nlev_cas)*fact                            !jyg
2829         vu_mod_cas(l)= vu_prof_cas(nlev_cas)*fact                            !jyg
2830         dv_mod_cas(l)= dv_prof_cas(nlev_cas)*fact
2831         hv_mod_cas(l)= hv_prof_cas(nlev_cas)*fact                            !jyg
2832         vv_mod_cas(l)= vv_prof_cas(nlev_cas)*fact                            !jyg
2833         dt_mod_cas(l)= dt_prof_cas(nlev_cas) 
2834         ht_mod_cas(l)= ht_prof_cas(nlev_cas)                                 !jyg
2835         vt_mod_cas(l)= vt_prof_cas(nlev_cas)                                 !jyg
2836         dq_mod_cas(l)= dq_prof_cas(nlev_cas)*fact
2837         hq_mod_cas(l)= hq_prof_cas(nlev_cas)*fact                            !jyg
2838         vq_mod_cas(l)= vq_prof_cas(nlev_cas)*fact                            !jyg
2839 
2840        endif ! play
2841 
2842       enddo ! l
2843
2844!       do l = 1,llm
2845!       print *,'t_mod_cas(l),q_mod_cas(l),ht_mod_cas(l),hq_mod_cas(l) ',
2846!     $        l,t_mod_cas(l),q_mod_cas(l),ht_mod_cas(l),hq_mod_cas(l)
2847!       enddo
2848 
2849          return
2850          end
2851!***************************************************************************** 
2852!=====================================================================
2853       SUBROUTINE interp_dice_vertical(play,nlev_dice,nt_dice,plev_prof   &
2854     &         ,th_prof,qv_prof,u_prof,v_prof,o3_prof                     &
2855     &         ,ht_prof,hq_prof,hu_prof,hv_prof,w_prof,omega_prof         &
2856     &         ,th_mod,qv_mod,u_mod,v_mod,o3_mod                          &
2857     &         ,ht_mod,hq_mod,hu_mod,hv_mod,w_mod,omega_mod,mxcalc)
2858 
2859       implicit none
2860 
2861#include "dimensions.h"
2862
2863!-------------------------------------------------------------------------
2864! Vertical interpolation of Dice forcing data onto model levels
2865!-------------------------------------------------------------------------
2866 
2867       integer nlevmax
2868       parameter (nlevmax=41)
2869       integer nlev_dice,mxcalc,nt_dice
2870 
2871       real play(llm), plev_prof(nlev_dice) 
2872       real th_prof(nlev_dice),qv_prof(nlev_dice)
2873       real u_prof(nlev_dice),v_prof(nlev_dice) 
2874       real o3_prof(nlev_dice)
2875       real ht_prof(nlev_dice),hq_prof(nlev_dice)
2876       real hu_prof(nlev_dice),hv_prof(nlev_dice)
2877       real w_prof(nlev_dice),omega_prof(nlev_dice)
2878 
2879       real th_mod(llm),qv_mod(llm)
2880       real u_mod(llm),v_mod(llm), o3_mod(llm)
2881       real ht_mod(llm),hq_mod(llm)
2882       real hu_mod(llm),hv_mod(llm),w_mod(llm),omega_mod(llm)
2883 
2884       integer l,k,k1,k2,kp
2885       real aa,frac,frac1,frac2,fact
2886 
2887       do l = 1, llm
2888
2889        if (play(l).ge.plev_prof(nlev_dice)) then
2890 
2891        mxcalc=l
2892         k1=0
2893         k2=0
2894
2895         if (play(l).le.plev_prof(1)) then
2896
2897         do k = 1, nlev_dice-1
2898          if (play(l).le.plev_prof(k) .and. play(l).gt.plev_prof(k+1)) then
2899            k1=k
2900            k2=k+1
2901          endif
2902         enddo
2903
2904         if (k1.eq.0 .or. k2.eq.0) then
2905          write(*,*) 'PB! k1, k2 = ',k1,k2
2906          write(*,*) 'l,play(l) = ',l,play(l)/100
2907         do k = 1, nlev_dice-1
2908          write(*,*) 'k,plev_prof(k) = ',k,plev_prof(k)/100
2909         enddo
2910         endif
2911
2912         frac = (plev_prof(k2)-play(l))/(plev_prof(k2)-plev_prof(k1))
2913         th_mod(l)= th_prof(k2) - frac*(th_prof(k2)-th_prof(k1))
2914         qv_mod(l)= qv_prof(k2) - frac*(qv_prof(k2)-qv_prof(k1))
2915         u_mod(l)= u_prof(k2) - frac*(u_prof(k2)-u_prof(k1))
2916         v_mod(l)= v_prof(k2) - frac*(v_prof(k2)-v_prof(k1))
2917         o3_mod(l)= o3_prof(k2) - frac*(o3_prof(k2)-o3_prof(k1))
2918         ht_mod(l)= ht_prof(k2) - frac*(ht_prof(k2)-ht_prof(k1))
2919         hq_mod(l)= hq_prof(k2) - frac*(hq_prof(k2)-hq_prof(k1))
2920         hu_mod(l)= hu_prof(k2) - frac*(hu_prof(k2)-hu_prof(k1))
2921         hv_mod(l)= hv_prof(k2) - frac*(hv_prof(k2)-hv_prof(k1))
2922         w_mod(l)= w_prof(k2) - frac*(w_prof(k2)-w_prof(k1))
2923         omega_mod(l)= omega_prof(k2) - frac*(omega_prof(k2)-omega_prof(k1))
2924     
2925         else !play>plev_prof(1)
2926
2927         k1=1
2928         k2=2
2929         frac1 = (play(l)-plev_prof(k2))/(plev_prof(k1)-plev_prof(k2))
2930         frac2 = (play(l)-plev_prof(k1))/(plev_prof(k1)-plev_prof(k2))
2931         th_mod(l)= frac1*th_prof(k1) - frac2*th_prof(k2)
2932         qv_mod(l)= frac1*qv_prof(k1) - frac2*qv_prof(k2)
2933         u_mod(l)= frac1*u_prof(k1) - frac2*u_prof(k2)
2934         v_mod(l)= frac1*v_prof(k1) - frac2*v_prof(k2)
2935         o3_mod(l)= frac1*o3_prof(k1) - frac2*o3_prof(k2)
2936         ht_mod(l)= frac1*ht_prof(k1) - frac2*ht_prof(k2)
2937         hq_mod(l)= frac1*hq_prof(k1) - frac2*hq_prof(k2)
2938         hu_mod(l)= frac1*hu_prof(k1) - frac2*hu_prof(k2)
2939         hv_mod(l)= frac1*hv_prof(k1) - frac2*hv_prof(k2)
2940         w_mod(l)= frac1*w_prof(k1) - frac2*w_prof(k2)
2941         omega_mod(l)= frac1*omega_prof(k1) - frac2*omega_prof(k2)
2942
2943         endif ! play.le.plev_prof(1)
2944
2945        else ! above max altitude of forcing file
2946 
2947!jyg
2948         fact=20.*(plev_prof(nlev_dice)-play(l))/plev_prof(nlev_dice) !jyg
2949         fact = max(fact,0.)                                           !jyg
2950         fact = exp(-fact)                                             !jyg
2951         th_mod(l)= th_prof(nlev_dice)                                 !jyg
2952         qv_mod(l)= qv_prof(nlev_dice)*fact                            !jyg
2953         u_mod(l)= u_prof(nlev_dice)*fact                              !jyg
2954         v_mod(l)= v_prof(nlev_dice)*fact                              !jyg
2955         o3_mod(l)= o3_prof(nlev_dice)*fact                            !jyg
2956         ht_mod(l)= ht_prof(nlev_dice)                                 !jyg
2957         hq_mod(l)= hq_prof(nlev_dice)*fact                            !jyg
2958         hu_mod(l)= hu_prof(nlev_dice)                                 !jyg
2959         hv_mod(l)= hv_prof(nlev_dice)                                 !jyg
2960         w_mod(l)= 0.                                                  !jyg
2961         omega_mod(l)= 0.                                              !jyg
2962 
2963        endif ! play
2964 
2965       enddo ! l
2966
2967!       do l = 1,llm
2968!       print *,'t_mod(l),q_mod(l),ht_mod(l),hq_mod(l) ',
2969!     $        l,t_mod(l),q_mod(l),ht_mod(l),hq_mod(l)
2970!       enddo
2971 
2972          return
2973          end
2974
2975!======================================================================
2976        SUBROUTINE interp_astex_time(day,day1,annee_ref                    &
2977     &             ,year_ini_astex,day_ini_astex,nt_astex,dt_astex         &
2978     &             ,nlev_astex,div_astex,ts_astex,ug_astex,vg_astex        &
2979     &             ,ufa_astex,vfa_astex,div_prof,ts_prof,ug_prof,vg_prof   &
2980     &             ,ufa_prof,vfa_prof)
2981        implicit none
2982
2983!---------------------------------------------------------------------------------------
2984! Time interpolation of a 2D field to the timestep corresponding to day
2985!
2986! day: current julian day (e.g. 717538.2)
2987! day1: first day of the simulation
2988! nt_astex: total nb of data in the forcing (e.g. 41 for Astex)
2989! dt_astex: total time interval (in sec) between 2 forcing data (e.g. 1h for Astex)
2990!---------------------------------------------------------------------------------------
2991
2992! inputs:
2993        integer annee_ref
2994        integer nt_astex,nlev_astex
2995        integer year_ini_astex
2996        real day, day1,day_ini_astex,dt_astex
2997        real div_astex(nt_astex),ts_astex(nt_astex),ug_astex(nt_astex)
2998        real vg_astex(nt_astex),ufa_astex(nt_astex),vfa_astex(nt_astex)
2999! outputs:
3000        real div_prof,ts_prof,ug_prof,vg_prof,ufa_prof,vfa_prof
3001! local:
3002        integer it_astex1, it_astex2
3003        real timeit,time_astex1,time_astex2,frac
3004
3005! Check that initial day of the simulation consistent with ASTEX period:
3006       if (annee_ref.ne.1992 ) then
3007        print*,'Pour Astex, annee_ref doit etre 1992 '
3008        print*,'Changer annee_ref dans run.def'
3009        stop
3010       endif
3011       if (annee_ref.eq.1992 .and. day1.lt.day_ini_astex) then
3012        print*,'Astex debute le 13 Juin 1992 (jour julien=165)'
3013        print*,'Changer dayref dans run.def'
3014        stop
3015       endif
3016
3017! Determine timestep relative to the 1st day of TOGA-COARE:
3018!       timeit=(day-day1)*86400.
3019!       if (annee_ref.eq.1992) then
3020!        timeit=(day-day_ini_astex)*86400.
3021!       else
3022!        timeit=(day+2.-1.)*86400. ! 2 days between Jun13 and Jun15 1992
3023!       endif
3024      timeit=(day-day_ini_astex)*86400
3025
3026! Determine the closest observation times:
3027       it_astex1=INT(timeit/dt_astex)+1
3028       it_astex2=it_astex1 + 1
3029       time_astex1=(it_astex1-1)*dt_astex
3030       time_astex2=(it_astex2-1)*dt_astex
3031       print *,'timeit day day_ini_astex',timeit,day,day_ini_astex
3032       print *,'it_astex1,it_astex2,time_astex1,time_astex2',              &
3033     &          it_astex1,it_astex2,time_astex1,time_astex2
3034
3035       if (it_astex1 .ge. nt_astex) then
3036        write(*,*) 'PB-stop: day, it_astex1, it_astex2, timeit: '          &
3037     &        ,day,it_astex1,it_astex2,timeit/86400.
3038        stop
3039       endif
3040
3041! time interpolation:
3042       frac=(time_astex2-timeit)/(time_astex2-time_astex1)
3043       frac=max(frac,0.0)
3044
3045       div_prof = div_astex(it_astex2)                                     &
3046     &          -frac*(div_astex(it_astex2)-div_astex(it_astex1))
3047       ts_prof = ts_astex(it_astex2)                                        &
3048     &          -frac*(ts_astex(it_astex2)-ts_astex(it_astex1))
3049       ug_prof = ug_astex(it_astex2)                                       &
3050     &          -frac*(ug_astex(it_astex2)-ug_astex(it_astex1))
3051       vg_prof = vg_astex(it_astex2)                                       &
3052     &          -frac*(vg_astex(it_astex2)-vg_astex(it_astex1))
3053       ufa_prof = ufa_astex(it_astex2)                                     &
3054     &          -frac*(ufa_astex(it_astex2)-ufa_astex(it_astex1))
3055       vfa_prof = vfa_astex(it_astex2)                                     &
3056     &          -frac*(vfa_astex(it_astex2)-vfa_astex(it_astex1))
3057
3058         print*,                                                           &
3059     &'day,annee_ref,day_ini_astex,timeit,it_astex1,it_astex2,SST:',       &
3060     &day,annee_ref,day_ini_astex,timeit/86400.,it_astex1,                 &
3061     &it_astex2,div_prof,ts_prof,ug_prof,vg_prof,ufa_prof,vfa_prof
3062
3063        return
3064        END
3065
3066!======================================================================
3067        SUBROUTINE interp_toga_time(day,day1,annee_ref                     &
3068     &             ,year_ini_toga,day_ini_toga,nt_toga,dt_toga,nlev_toga   &
3069     &             ,ts_toga,plev_toga,t_toga,q_toga,u_toga,v_toga,w_toga   &
3070     &             ,ht_toga,vt_toga,hq_toga,vq_toga                        &
3071     &             ,ts_prof,plev_prof,t_prof,q_prof,u_prof,v_prof,w_prof   &
3072     &             ,ht_prof,vt_prof,hq_prof,vq_prof)
3073        implicit none
3074
3075!---------------------------------------------------------------------------------------
3076! Time interpolation of a 2D field to the timestep corresponding to day
3077!
3078! day: current julian day (e.g. 717538.2)
3079! day1: first day of the simulation
3080! nt_toga: total nb of data in the forcing (e.g. 480 for TOGA-COARE)
3081! dt_toga: total time interval (in sec) between 2 forcing data (e.g. 6h for TOGA-COARE)
3082!---------------------------------------------------------------------------------------
3083
3084#include "compar1d.h"
3085
3086! inputs:
3087        integer annee_ref
3088        integer nt_toga,nlev_toga
3089        integer year_ini_toga
3090        real day, day1,day_ini_toga,dt_toga
3091        real ts_toga(nt_toga)
3092        real plev_toga(nlev_toga,nt_toga),t_toga(nlev_toga,nt_toga)
3093        real q_toga(nlev_toga,nt_toga),u_toga(nlev_toga,nt_toga)
3094        real v_toga(nlev_toga,nt_toga),w_toga(nlev_toga,nt_toga)
3095        real ht_toga(nlev_toga,nt_toga),vt_toga(nlev_toga,nt_toga)
3096        real hq_toga(nlev_toga,nt_toga),vq_toga(nlev_toga,nt_toga)
3097! outputs:
3098        real ts_prof
3099        real plev_prof(nlev_toga),t_prof(nlev_toga)
3100        real q_prof(nlev_toga),u_prof(nlev_toga)
3101        real v_prof(nlev_toga),w_prof(nlev_toga)
3102        real ht_prof(nlev_toga),vt_prof(nlev_toga)
3103        real hq_prof(nlev_toga),vq_prof(nlev_toga)
3104! local:
3105        integer it_toga1, it_toga2,k
3106        real timeit,time_toga1,time_toga2,frac
3107
3108
3109        if (forcing_type.eq.2) then
3110! Check that initial day of the simulation consistent with TOGA-COARE period:
3111       if (annee_ref.ne.1992 .and. annee_ref.ne.1993) then
3112        print*,'Pour TOGA-COARE, annee_ref doit etre 1992 ou 1993'
3113        print*,'Changer annee_ref dans run.def'
3114        stop
3115       endif
3116       if (annee_ref.eq.1992 .and. day1.lt.day_ini_toga) then
3117        print*,'TOGA-COARE a debute le 1er Nov 1992 (jour julien=306)'
3118        print*,'Changer dayref dans run.def'
3119        stop
3120       endif
3121       if (annee_ref.eq.1993 .and. day1.gt.day_ini_toga+119) then
3122        print*,'TOGA-COARE a fini le 28 Feb 1993 (jour julien=59)'
3123        print*,'Changer dayref ou nday dans run.def'
3124        stop
3125       endif
3126
3127       else if (forcing_type.eq.4) then
3128
3129! Check that initial day of the simulation consistent with TWP-ICE period:
3130       if (annee_ref.ne.2006) then
3131        print*,'Pour TWP-ICE, annee_ref doit etre 2006'
3132        print*,'Changer annee_ref dans run.def'
3133        stop
3134       endif
3135       if (annee_ref.eq.2006 .and. day1.lt.day_ini_toga) then
3136        print*,'TWP-ICE a debute le 17 Jan 2006 (jour julien=17)'
3137        print*,'Changer dayref dans run.def'
3138        stop
3139       endif
3140       if (annee_ref.eq.2006 .and. day1.gt.day_ini_toga+26) then
3141        print*,'TWP-ICE a fini le 12 Feb 2006 (jour julien=43)'
3142        print*,'Changer dayref ou nday dans run.def'
3143        stop
3144       endif
3145
3146       endif
3147
3148! Determine timestep relative to the 1st day of TOGA-COARE:
3149!       timeit=(day-day1)*86400.
3150!       if (annee_ref.eq.1992) then
3151!        timeit=(day-day_ini_toga)*86400.
3152!       else
3153!        timeit=(day+61.-1.)*86400. ! 61 days between Nov01 and Dec31 1992
3154!       endif
3155      timeit=(day-day_ini_toga)*86400
3156
3157! Determine the closest observation times:
3158       it_toga1=INT(timeit/dt_toga)+1
3159       it_toga2=it_toga1 + 1
3160       time_toga1=(it_toga1-1)*dt_toga
3161       time_toga2=(it_toga2-1)*dt_toga
3162
3163       if (it_toga1 .ge. nt_toga) then
3164        write(*,*) 'PB-stop: day, it_toga1, it_toga2, timeit: '            &
3165     &        ,day,it_toga1,it_toga2,timeit/86400.
3166        stop
3167       endif
3168
3169! time interpolation:
3170       frac=(time_toga2-timeit)/(time_toga2-time_toga1)
3171       frac=max(frac,0.0)
3172
3173       ts_prof = ts_toga(it_toga2)                                         &
3174     &          -frac*(ts_toga(it_toga2)-ts_toga(it_toga1))
3175
3176!        print*,
3177!     :'day,annee_ref,day_ini_toga,timeit,it_toga1,it_toga2,SST:',
3178!     :day,annee_ref,day_ini_toga,timeit/86400.,it_toga1,it_toga2,ts_prof
3179
3180       do k=1,nlev_toga
3181        plev_prof(k) = 100.*(plev_toga(k,it_toga2)                         &
3182     &          -frac*(plev_toga(k,it_toga2)-plev_toga(k,it_toga1)))
3183        t_prof(k) = t_toga(k,it_toga2)                                     &
3184     &          -frac*(t_toga(k,it_toga2)-t_toga(k,it_toga1))
3185        q_prof(k) = q_toga(k,it_toga2)                                     &
3186     &          -frac*(q_toga(k,it_toga2)-q_toga(k,it_toga1))
3187        u_prof(k) = u_toga(k,it_toga2)                                     &
3188     &          -frac*(u_toga(k,it_toga2)-u_toga(k,it_toga1))
3189        v_prof(k) = v_toga(k,it_toga2)                                     &
3190     &          -frac*(v_toga(k,it_toga2)-v_toga(k,it_toga1))
3191        w_prof(k) = w_toga(k,it_toga2)                                     &
3192     &          -frac*(w_toga(k,it_toga2)-w_toga(k,it_toga1))
3193        ht_prof(k) = ht_toga(k,it_toga2)                                   &
3194     &          -frac*(ht_toga(k,it_toga2)-ht_toga(k,it_toga1))
3195        vt_prof(k) = vt_toga(k,it_toga2)                                   &
3196     &          -frac*(vt_toga(k,it_toga2)-vt_toga(k,it_toga1))
3197        hq_prof(k) = hq_toga(k,it_toga2)                                   &
3198     &          -frac*(hq_toga(k,it_toga2)-hq_toga(k,it_toga1))
3199        vq_prof(k) = vq_toga(k,it_toga2)                                   &
3200     &          -frac*(vq_toga(k,it_toga2)-vq_toga(k,it_toga1))
3201        enddo
3202
3203        return
3204        END
3205
3206!======================================================================
3207        SUBROUTINE interp_dice_time(day,day1,annee_ref                    &
3208     &             ,year_ini_dice,day_ini_dice,nt_dice,dt_dice            &
3209     &             ,nlev_dice,shf_dice,lhf_dice,lwup_dice,swup_dice       &
3210     &             ,tg_dice,ustar_dice,psurf_dice,ug_dice,vg_dice         &
3211     &             ,ht_dice,hq_dice,hu_dice,hv_dice,w_dice,omega_dice     &
3212     &             ,shf_prof,lhf_prof,lwup_prof,swup_prof,tg_prof         &
3213     &             ,ustar_prof,psurf_prof,ug_prof,vg_prof                 &
3214     &             ,ht_prof,hq_prof,hu_prof,hv_prof,w_prof,omega_prof)
3215        implicit none
3216
3217!---------------------------------------------------------------------------------------
3218! Time interpolation of a 2D field to the timestep corresponding to day
3219!
3220! day: current julian day (e.g. 717538.2)
3221! day1: first day of the simulation
3222! nt_dice: total nb of data in the forcing (e.g. 145 for Dice)
3223! dt_dice: total time interval (in sec) between 2 forcing data (e.g. 30min. for Dice)
3224!---------------------------------------------------------------------------------------
3225
3226#include "compar1d.h"
3227
3228! inputs:
3229        integer annee_ref
3230        integer nt_dice,nlev_dice
3231        integer year_ini_dice
3232        real day, day1,day_ini_dice,dt_dice
3233        real shf_dice(nt_dice),lhf_dice(nt_dice),lwup_dice(nt_dice)
3234        real swup_dice(nt_dice),tg_dice(nt_dice),ustar_dice(nt_dice)
3235        real psurf_dice(nt_dice),ug_dice(nt_dice),vg_dice(nt_dice)
3236        real ht_dice(nlev_dice,nt_dice),hq_dice(nlev_dice,nt_dice)
3237        real hu_dice(nlev_dice,nt_dice),hv_dice(nlev_dice,nt_dice)
3238        real w_dice(nlev_dice,nt_dice),omega_dice(nlev_dice,nt_dice)
3239! outputs:
3240        real tg_prof,shf_prof,lhf_prof,lwup_prof,swup_prof
3241        real ustar_prof,psurf_prof,ug_prof,vg_prof
3242        real ht_prof(nlev_dice),hq_prof(nlev_dice)
3243        real hu_prof(nlev_dice),hv_prof(nlev_dice)
3244        real w_prof(nlev_dice),omega_prof(nlev_dice)
3245! local:
3246        integer it_dice1, it_dice2,k
3247        real timeit,time_dice1,time_dice2,frac
3248
3249
3250        if (forcing_type.eq.7) then
3251! Check that initial day of the simulation consistent with Dice period:
3252       print *,'annee_ref=',annee_ref
3253       print *,'day1=',day1
3254       print *,'day_ini_dice=',day_ini_dice
3255       if (annee_ref.ne.1999) then
3256        print*,'Pour Dice, annee_ref doit etre 1999'
3257        print*,'Changer annee_ref dans run.def'
3258        stop
3259       endif
3260       if (annee_ref.eq.1999 .and. day1.gt.day_ini_dice) then
3261        print*,'Dice a debute le 23 Oct 1999 (jour julien=296)'
3262        print*,'Changer dayref dans run.def',day1,day_ini_dice
3263        stop
3264       endif
3265       if (annee_ref.eq.1999 .and. day1.gt.day_ini_dice+2) then
3266        print*,'Dice a fini le 25 Oct 1999 (jour julien=298)'
3267        print*,'Changer dayref ou nday dans run.def',day1,day_ini_dice
3268        stop
3269       endif
3270
3271       endif
3272
3273! Determine timestep relative to the 1st day of TOGA-COARE:
3274!       timeit=(day-day1)*86400.
3275!       if (annee_ref.eq.1992) then
3276!        timeit=(day-day_ini_dice)*86400.
3277!       else
3278!        timeit=(day+61.-1.)*86400. ! 61 days between Nov01 and Dec31 1992
3279!       endif
3280      timeit=(day-day_ini_dice)*86400
3281
3282! Determine the closest observation times:
3283       it_dice1=INT(timeit/dt_dice)+1
3284       it_dice2=it_dice1 + 1
3285       time_dice1=(it_dice1-1)*dt_dice
3286       time_dice2=(it_dice2-1)*dt_dice
3287
3288       if (it_dice1 .ge. nt_dice) then
3289        write(*,*) 'PB-stop: day, it_dice1, it_dice2, timeit: ',day,it_dice1,it_dice2,timeit/86400.
3290        stop
3291       endif
3292
3293! time interpolation:
3294       frac=(time_dice2-timeit)/(time_dice2-time_dice1)
3295       frac=max(frac,0.0)
3296
3297       shf_prof = shf_dice(it_dice2)-frac*(shf_dice(it_dice2)-shf_dice(it_dice1))
3298       lhf_prof = lhf_dice(it_dice2)-frac*(lhf_dice(it_dice2)-lhf_dice(it_dice1))
3299       lwup_prof = lwup_dice(it_dice2)-frac*(lwup_dice(it_dice2)-lwup_dice(it_dice1))
3300       swup_prof = swup_dice(it_dice2)-frac*(swup_dice(it_dice2)-swup_dice(it_dice1))
3301       tg_prof = tg_dice(it_dice2)-frac*(tg_dice(it_dice2)-tg_dice(it_dice1))
3302       ustar_prof = ustar_dice(it_dice2)-frac*(ustar_dice(it_dice2)-ustar_dice(it_dice1))
3303       psurf_prof = psurf_dice(it_dice2)-frac*(psurf_dice(it_dice2)-psurf_dice(it_dice1))
3304       ug_prof = ug_dice(it_dice2)-frac*(ug_dice(it_dice2)-ug_dice(it_dice1))
3305       vg_prof = vg_dice(it_dice2)-frac*(vg_dice(it_dice2)-vg_dice(it_dice1))
3306
3307!        print*,
3308!     :'day,annee_ref,day_ini_dice,timeit,it_dice1,it_dice2,SST:',
3309!     :day,annee_ref,day_ini_dice,timeit/86400.,it_dice1,it_dice2,ts_prof
3310
3311       do k=1,nlev_dice
3312        ht_prof(k) = ht_dice(k,it_dice2)-frac*(ht_dice(k,it_dice2)-ht_dice(k,it_dice1))
3313        hq_prof(k) = hq_dice(k,it_dice2)-frac*(hq_dice(k,it_dice2)-hq_dice(k,it_dice1))
3314        hu_prof(k) = hu_dice(k,it_dice2)-frac*(hu_dice(k,it_dice2)-hu_dice(k,it_dice1))
3315        hv_prof(k) = hv_dice(k,it_dice2)-frac*(hv_dice(k,it_dice2)-hv_dice(k,it_dice1))
3316        w_prof(k) = w_dice(k,it_dice2)-frac*(w_dice(k,it_dice2)-w_dice(k,it_dice1))
3317        omega_prof(k) = omega_dice(k,it_dice2)-frac*(omega_dice(k,it_dice2)-omega_dice(k,it_dice1))
3318        enddo
3319
3320        return
3321        END
3322
3323!======================================================================
3324        SUBROUTINE interp_gabls4_time(day,day1,annee_ref                              &
3325     &             ,year_ini_gabls4,day_ini_gabls4,nt_gabls4,dt_gabls4,nlev_gabls4    &
3326     &             ,ug_gabls4,vg_gabls4,ht_gabls4,hq_gabls4,tg_gabls4                          &
3327     &             ,ug_prof,vg_prof,ht_prof,hq_prof,tg_prof)
3328        implicit none
3329
3330!---------------------------------------------------------------------------------------
3331! Time interpolation of a 2D field to the timestep corresponding to day
3332!
3333! day: current julian day
3334! day1: first day of the simulation
3335! nt_gabls4: total nb of data in the forcing (e.g. 37 for gabls4)
3336! dt_gabls4: total time interval (in sec) between 2 forcing data (e.g. 60min. for gabls4)
3337!---------------------------------------------------------------------------------------
3338
3339#include "compar1d.h"
3340
3341! inputs:
3342        integer annee_ref
3343        integer nt_gabls4,nlev_gabls4
3344        integer year_ini_gabls4
3345        real day, day1,day_ini_gabls4,dt_gabls4
3346        real ug_gabls4(nlev_gabls4,nt_gabls4),vg_gabls4(nlev_gabls4,nt_gabls4)
3347        real ht_gabls4(nlev_gabls4,nt_gabls4),hq_gabls4(nlev_gabls4,nt_gabls4)
3348        real tg_gabls4(nt_gabls4), tg_prof
3349! outputs:
3350        real ug_prof(nlev_gabls4),vg_prof(nlev_gabls4)
3351        real ht_prof(nlev_gabls4),hq_prof(nlev_gabls4)
3352! local:
3353        integer it_gabls41, it_gabls42,k
3354        real timeit,time_gabls41,time_gabls42,frac
3355
3356
3357
3358! Check that initial day of the simulation consistent with gabls4 period:
3359       if (forcing_type.eq.8 ) then
3360       print *,'annee_ref=',annee_ref
3361       print *,'day1=',day1
3362       print *,'day_ini_gabls4=',day_ini_gabls4
3363       if (annee_ref.ne.2009) then
3364        print*,'Pour gabls4, annee_ref doit etre 2009'
3365        print*,'Changer annee_ref dans run.def'
3366        stop
3367       endif
3368       if (annee_ref.eq.2009 .and. day1.gt.day_ini_gabls4) then
3369        print*,'gabls4 a debute le 11 dec 2009 (jour julien=345)'
3370        print*,'Changer dayref dans run.def',day1,day_ini_gabls4
3371        stop
3372       endif
3373       if (annee_ref.eq.2009 .and. day1.gt.day_ini_gabls4+2) then
3374        print*,'gabls4 a fini le 12 dec 2009 (jour julien=346)'
3375        print*,'Changer dayref ou nday dans run.def',day1,day_ini_gabls4
3376        stop
3377       endif
3378       endif
3379
3380      timeit=(day-day_ini_gabls4)*86400
3381       print *,'day,day_ini_gabls4=',day,day_ini_gabls4
3382       print *,'nt_gabls4,dt,timeit=',nt_gabls4,dt_gabls4,timeit
3383
3384! Determine the closest observation times:
3385       it_gabls41=INT(timeit/dt_gabls4)+1
3386       it_gabls42=it_gabls41 + 1
3387       time_gabls41=(it_gabls41-1)*dt_gabls4
3388       time_gabls42=(it_gabls42-1)*dt_gabls4
3389
3390       if (it_gabls41 .ge. nt_gabls4) then
3391        write(*,*) 'PB-stop: day, it_gabls41, it_gabls42, timeit: ',day,it_gabls41,it_gabls42,timeit/86400.
3392        stop
3393       endif
3394
3395! time interpolation:
3396       frac=(time_gabls42-timeit)/(time_gabls42-time_gabls41)
3397       frac=max(frac,0.0)
3398
3399
3400       do k=1,nlev_gabls4
3401        ug_prof(k) = ug_gabls4(k,it_gabls42)-frac*(ug_gabls4(k,it_gabls42)-ug_gabls4(k,it_gabls41))
3402        vg_prof(k) = vg_gabls4(k,it_gabls42)-frac*(vg_gabls4(k,it_gabls42)-vg_gabls4(k,it_gabls41))
3403        ht_prof(k) = ht_gabls4(k,it_gabls42)-frac*(ht_gabls4(k,it_gabls42)-ht_gabls4(k,it_gabls41))
3404        hq_prof(k) = hq_gabls4(k,it_gabls42)-frac*(hq_gabls4(k,it_gabls42)-hq_gabls4(k,it_gabls41))
3405        enddo
3406        tg_prof=tg_gabls4(it_gabls42)-frac*(tg_gabls4(it_gabls42)-tg_gabls4(it_gabls41))
3407        return
3408        END
3409
3410!======================================================================
3411        SUBROUTINE interp_armcu_time(day,day1,annee_ref                    &
3412     &             ,year_ini_armcu,day_ini_armcu,nt_armcu,dt_armcu         &
3413     &             ,nlev_armcu,fs_armcu,fl_armcu,at_armcu,rt_armcu         &
3414     &             ,aqt_armcu,fs_prof,fl_prof,at_prof,rt_prof,aqt_prof)
3415        implicit none
3416
3417!---------------------------------------------------------------------------------------
3418! Time interpolation of a 2D field to the timestep corresponding to day
3419!
3420! day: current julian day (e.g. 717538.2)
3421! day1: first day of the simulation
3422! nt_armcu: total nb of data in the forcing (e.g. 31 for armcu)
3423! dt_armcu: total time interval (in sec) between 2 forcing data (e.g. 1/2h for armcu)
3424! fs= sensible flux
3425! fl= latent flux
3426! at,rt,aqt= advective and radiative tendencies
3427!---------------------------------------------------------------------------------------
3428
3429! inputs:
3430        integer annee_ref
3431        integer nt_armcu,nlev_armcu
3432        integer year_ini_armcu
3433        real day, day1,day_ini_armcu,dt_armcu
3434        real fs_armcu(nt_armcu),fl_armcu(nt_armcu),at_armcu(nt_armcu)
3435        real rt_armcu(nt_armcu),aqt_armcu(nt_armcu)
3436! outputs:
3437        real fs_prof,fl_prof,at_prof,rt_prof,aqt_prof
3438! local:
3439        integer it_armcu1, it_armcu2,k
3440        real timeit,time_armcu1,time_armcu2,frac
3441
3442! Check that initial day of the simulation consistent with ARMCU period:
3443       if (annee_ref.ne.1997 ) then
3444        print*,'Pour ARMCU, annee_ref doit etre 1997 '
3445        print*,'Changer annee_ref dans run.def'
3446        stop
3447       endif
3448
3449      timeit=(day-day_ini_armcu)*86400
3450
3451! Determine the closest observation times:
3452       it_armcu1=INT(timeit/dt_armcu)+1
3453       it_armcu2=it_armcu1 + 1
3454       time_armcu1=(it_armcu1-1)*dt_armcu
3455       time_armcu2=(it_armcu2-1)*dt_armcu
3456       print *,'timeit day day_ini_armcu',timeit,day,day_ini_armcu
3457       print *,'it_armcu1,it_armcu2,time_armcu1,time_armcu2',              &
3458     &          it_armcu1,it_armcu2,time_armcu1,time_armcu2
3459
3460       if (it_armcu1 .ge. nt_armcu) then
3461        write(*,*) 'PB-stop: day, it_armcu1, it_armcu2, timeit: '          &
3462     &        ,day,it_armcu1,it_armcu2,timeit/86400.
3463        stop
3464       endif
3465
3466! time interpolation:
3467       frac=(time_armcu2-timeit)/(time_armcu2-time_armcu1)
3468       frac=max(frac,0.0)
3469
3470       fs_prof = fs_armcu(it_armcu2)                                       &
3471     &          -frac*(fs_armcu(it_armcu2)-fs_armcu(it_armcu1))
3472       fl_prof = fl_armcu(it_armcu2)                                       &
3473     &          -frac*(fl_armcu(it_armcu2)-fl_armcu(it_armcu1))
3474       at_prof = at_armcu(it_armcu2)                                       &
3475     &          -frac*(at_armcu(it_armcu2)-at_armcu(it_armcu1))
3476       rt_prof = rt_armcu(it_armcu2)                                       &
3477     &          -frac*(rt_armcu(it_armcu2)-rt_armcu(it_armcu1))
3478       aqt_prof = aqt_armcu(it_armcu2)                                       &
3479     &          -frac*(aqt_armcu(it_armcu2)-aqt_armcu(it_armcu1))
3480
3481         print*,                                                           &
3482     &'day,annee_ref,day_ini_armcu,timeit,it_armcu1,it_armcu2,SST:',       &
3483     &day,annee_ref,day_ini_armcu,timeit/86400.,it_armcu1,                 &
3484     &it_armcu2,fs_prof,fl_prof,at_prof,rt_prof,aqt_prof
3485
3486        return
3487        END
3488
3489!=====================================================================
3490      subroutine readprofiles(nlev_max,kmax,ntrac,height,                  &
3491     &           thlprof,qtprof,uprof,                                     &
3492     &           vprof,e12prof,ugprof,vgprof,                              &
3493     &           wfls,dqtdxls,dqtdyls,dqtdtls,                             &
3494     &           thlpcar,tracer,nt1,nt2)
3495      implicit none
3496
3497        integer nlev_max,kmax,kmax2,ntrac
3498        logical :: llesread = .true.
3499
3500        real height(nlev_max),thlprof(nlev_max),qtprof(nlev_max),          &
3501     &       uprof(nlev_max),vprof(nlev_max),e12prof(nlev_max),            &
3502     &       ugprof(nlev_max),vgprof(nlev_max),wfls(nlev_max),             &
3503     &       dqtdxls(nlev_max),dqtdyls(nlev_max),dqtdtls(nlev_max),        &
3504     &           thlpcar(nlev_max),tracer(nlev_max,ntrac)
3505
3506        real height1(nlev_max)
3507
3508        integer, parameter :: ilesfile=1
3509        integer :: ierr,k,itrac,nt1,nt2
3510
3511        if(.not.(llesread)) return
3512
3513       open (ilesfile,file='prof.inp.001',status='old',iostat=ierr)
3514        if (ierr /= 0) stop 'ERROR:Prof.inp does not exist'
3515        read (ilesfile,*) kmax
3516        do k=1,kmax
3517          read (ilesfile,*) height1(k),thlprof(k),qtprof (k),               &
3518     &                      uprof (k),vprof  (k),e12prof(k)
3519        enddo
3520        close(ilesfile)
3521
3522       open(ilesfile,file='lscale.inp.001',status='old',iostat=ierr)
3523        if (ierr /= 0) stop 'ERROR:Lscale.inp does not exist'
3524        read (ilesfile,*) kmax2
3525        if (kmax .ne. kmax2) then
3526          print *, 'fichiers prof.inp et lscale.inp incompatibles :'
3527          print *, 'nbre de niveaux : ',kmax,' et ',kmax2
3528          stop 'lecture profiles'
3529        endif
3530        do k=1,kmax
3531          read (ilesfile,*) height(k),ugprof(k),vgprof(k),wfls(k),         &
3532     &                      dqtdxls(k),dqtdyls(k),dqtdtls(k),thlpcar(k)
3533        end do
3534        do k=1,kmax
3535          if (height(k) .ne. height1(k)) then
3536            print *, 'fichiers prof.inp et lscale.inp incompatibles :'
3537            print *, 'les niveaux different : ',k,height1(k), height(k)
3538            stop
3539          endif
3540        end do
3541        close(ilesfile)
3542
3543       open(ilesfile,file='trac.inp.001',status='old',iostat=ierr)
3544        if (ierr /= 0) then
3545            print*,'WARNING : trac.inp does not exist'
3546        else
3547        read (ilesfile,*) kmax2,nt1,nt2
3548        if (nt2>ntrac) then
3549          stop'Augmenter le nombre de traceurs dans traceur.def'
3550        endif
3551        if (kmax .ne. kmax2) then
3552          print *, 'fichiers prof.inp et lscale.inp incompatibles :'
3553          print *, 'nbre de niveaux : ',kmax,' et ',kmax2
3554          stop 'lecture profiles'
3555        endif
3556        do k=1,kmax
3557          read (ilesfile,*) height(k),(tracer(k,itrac),itrac=nt1,nt2)
3558        end do
3559        close(ilesfile)
3560        endif
3561
3562        return
3563        end
3564!======================================================================
3565      subroutine readprofile_sandu(nlev_max,kmax,height,pprof,tprof,       &
3566     &       thlprof,qprof,uprof,vprof,wprof,omega,o3mmr)
3567!======================================================================
3568      implicit none
3569
3570        integer nlev_max,kmax
3571        logical :: llesread = .true.
3572
3573        real height(nlev_max),pprof(nlev_max),tprof(nlev_max)
3574        real thlprof(nlev_max)
3575        real qprof(nlev_max),uprof(nlev_max),vprof(nlev_max)
3576        real wprof(nlev_max),omega(nlev_max),o3mmr(nlev_max)
3577
3578        integer, parameter :: ilesfile=1
3579        integer :: k,ierr
3580
3581        if(.not.(llesread)) return
3582
3583       open (ilesfile,file='prof.inp.001',status='old',iostat=ierr)
3584        if (ierr /= 0) stop 'ERROR:Prof.inp does not exist'
3585        read (ilesfile,*) kmax
3586        do k=1,kmax
3587          read (ilesfile,*) height(k),pprof(k),  tprof(k),thlprof(k),      &
3588     &                      qprof (k),uprof(k),  vprof(k),  wprof(k),      &
3589     &                      omega (k),o3mmr(k)
3590        enddo
3591        close(ilesfile)
3592
3593        return
3594        end
3595
3596!======================================================================
3597      subroutine readprofile_astex(nlev_max,kmax,height,pprof,tprof,       &
3598     &    thlprof,qvprof,qlprof,qtprof,uprof,vprof,wprof,tkeprof,o3mmr)
3599!======================================================================
3600      implicit none
3601
3602        integer nlev_max,kmax
3603        logical :: llesread = .true.
3604
3605        real height(nlev_max),pprof(nlev_max),tprof(nlev_max),             &
3606     &  thlprof(nlev_max),qlprof(nlev_max),qtprof(nlev_max),               &
3607     &  qvprof(nlev_max),uprof(nlev_max),vprof(nlev_max),                  &
3608     &  wprof(nlev_max),tkeprof(nlev_max),o3mmr(nlev_max)
3609
3610        integer, parameter :: ilesfile=1
3611        integer :: ierr,k
3612
3613        if(.not.(llesread)) return
3614
3615       open (ilesfile,file='prof.inp.001',status='old',iostat=ierr)
3616        if (ierr /= 0) stop 'ERROR:Prof.inp does not exist'
3617        read (ilesfile,*) kmax
3618        do k=1,kmax
3619          read (ilesfile,*) height(k),pprof(k),  tprof(k),thlprof(k),      &
3620     &                qvprof (k),qlprof (k),qtprof (k),                    &
3621     &                uprof(k),  vprof(k),  wprof(k),tkeprof(k),o3mmr(k)
3622        enddo
3623        close(ilesfile)
3624
3625        return
3626        end
3627
3628
3629
3630!======================================================================
3631      subroutine readprofile_armcu(nlev_max,kmax,height,pprof,uprof,       &
3632     &       vprof,thetaprof,tprof,qvprof,rvprof,aprof,bprof)
3633!======================================================================
3634      implicit none
3635
3636        integer nlev_max,kmax
3637        logical :: llesread = .true.
3638
3639        real height(nlev_max),pprof(nlev_max),tprof(nlev_max)
3640        real thetaprof(nlev_max),rvprof(nlev_max)
3641        real qvprof(nlev_max),uprof(nlev_max),vprof(nlev_max)
3642        real aprof(nlev_max+1),bprof(nlev_max+1)
3643
3644        integer, parameter :: ilesfile=1
3645        integer, parameter :: ifile=2
3646        integer :: ierr,jtot,k
3647
3648        if(.not.(llesread)) return
3649
3650! Read profiles at full levels
3651       IF(nlev_max.EQ.19) THEN
3652       open (ilesfile,file='prof.inp.19',status='old',iostat=ierr)
3653       print *,'On ouvre prof.inp.19'
3654       ELSE
3655       open (ilesfile,file='prof.inp.40',status='old',iostat=ierr)
3656       print *,'On ouvre prof.inp.40'
3657       ENDIF
3658        if (ierr /= 0) stop 'ERROR:Prof.inp does not exist'
3659        read (ilesfile,*) kmax
3660        do k=1,kmax
3661          read (ilesfile,*) height(k)    ,pprof(k),  uprof(k), vprof(k),   &
3662     &                      thetaprof(k) ,tprof(k), qvprof(k),rvprof(k)
3663        enddo
3664        close(ilesfile)
3665
3666! Vertical coordinates half levels for eta-coordinates (plev = alpha + beta * psurf) 
3667       IF(nlev_max.EQ.19) THEN
3668       open (ifile,file='proh.inp.19',status='old',iostat=ierr)
3669       print *,'On ouvre proh.inp.19'
3670       if (ierr /= 0) stop 'ERROR:Proh.inp.19 does not exist'
3671       ELSE
3672       open (ifile,file='proh.inp.40',status='old',iostat=ierr)
3673       print *,'On ouvre proh.inp.40'
3674       if (ierr /= 0) stop 'ERROR:Proh.inp.40 does not exist'
3675       ENDIF
3676        read (ifile,*) kmax
3677        do k=1,kmax
3678          read (ifile,*) jtot,aprof(k),bprof(k)
3679        enddo
3680        close(ifile)
3681
3682        return
3683        end
3684
3685!=====================================================================
3686      subroutine read_fire(fich_fire,nlevel,ntime                          &
3687     &     ,zz,thl,qt,u,v,tke                                              &
3688     &     ,ug,vg,wls,dqtdx,dqtdy,dqtdt,thl_rad)
3689
3690!program reading forcings of the FIRE case study
3691
3692
3693      implicit none
3694
3695#include "netcdf.inc"
3696
3697      integer ntime,nlevel
3698      character*80 :: fich_fire
3699      real*8 zz(nlevel)
3700
3701      real*8 thl(nlevel)
3702      real*8 qt(nlevel),u(nlevel)
3703      real*8 v(nlevel),tke(nlevel)
3704      real*8 ug(nlevel,ntime),vg(nlevel,ntime),wls(nlevel,ntime)
3705      real*8 dqtdx(nlevel,ntime),dqtdy(nlevel,ntime)
3706      real*8 dqtdt(nlevel,ntime),thl_rad(nlevel,ntime)
3707
3708      integer nid, ierr
3709      integer nbvar3d
3710      parameter(nbvar3d=30)
3711      integer var3didin(nbvar3d)
3712
3713      ierr = NF_OPEN(fich_fire,NF_NOWRITE,nid)
3714      if (ierr.NE.NF_NOERR) then
3715         write(*,*) 'ERROR: Pb opening forcings nc file '
3716         write(*,*) NF_STRERROR(ierr)
3717         stop ""
3718      endif
3719
3720
3721       ierr=NF_INQ_VARID(nid,"zz",var3didin(1)) 
3722         if(ierr/=NF_NOERR) then
3723           write(*,*) NF_STRERROR(ierr)
3724           stop 'lev'
3725         endif
3726
3727
3728      ierr=NF_INQ_VARID(nid,"thetal",var3didin(2))
3729         if(ierr/=NF_NOERR) then
3730           write(*,*) NF_STRERROR(ierr)
3731           stop 'temp'
3732         endif
3733
3734      ierr=NF_INQ_VARID(nid,"qt",var3didin(3))
3735         if(ierr/=NF_NOERR) then
3736           write(*,*) NF_STRERROR(ierr)
3737           stop 'qv'
3738         endif
3739
3740      ierr=NF_INQ_VARID(nid,"u",var3didin(4))
3741         if(ierr/=NF_NOERR) then
3742           write(*,*) NF_STRERROR(ierr)
3743           stop 'u'
3744         endif
3745
3746      ierr=NF_INQ_VARID(nid,"v",var3didin(5))
3747         if(ierr/=NF_NOERR) then
3748           write(*,*) NF_STRERROR(ierr)
3749           stop 'v'
3750         endif
3751
3752      ierr=NF_INQ_VARID(nid,"tke",var3didin(6))
3753         if(ierr/=NF_NOERR) then
3754           write(*,*) NF_STRERROR(ierr)
3755           stop 'tke'
3756         endif
3757
3758      ierr=NF_INQ_VARID(nid,"ugeo",var3didin(7))
3759         if(ierr/=NF_NOERR) then
3760           write(*,*) NF_STRERROR(ierr)
3761           stop 'ug'
3762         endif
3763
3764      ierr=NF_INQ_VARID(nid,"vgeo",var3didin(8))
3765         if(ierr/=NF_NOERR) then
3766           write(*,*) NF_STRERROR(ierr)
3767           stop 'vg'
3768         endif
3769     
3770      ierr=NF_INQ_VARID(nid,"wls",var3didin(9))
3771         if(ierr/=NF_NOERR) then
3772           write(*,*) NF_STRERROR(ierr)
3773           stop 'wls'
3774         endif
3775
3776      ierr=NF_INQ_VARID(nid,"dqtdx",var3didin(10))
3777         if(ierr/=NF_NOERR) then
3778           write(*,*) NF_STRERROR(ierr)
3779           stop 'dqtdx'
3780         endif
3781
3782      ierr=NF_INQ_VARID(nid,"dqtdy",var3didin(11))
3783         if(ierr/=NF_NOERR) then
3784           write(*,*) NF_STRERROR(ierr)
3785           stop 'dqtdy'
3786      endif
3787
3788      ierr=NF_INQ_VARID(nid,"dqtdt",var3didin(12))
3789         if(ierr/=NF_NOERR) then
3790           write(*,*) NF_STRERROR(ierr)
3791           stop 'dqtdt'
3792      endif
3793
3794      ierr=NF_INQ_VARID(nid,"thl_rad",var3didin(13))
3795         if(ierr/=NF_NOERR) then
3796           write(*,*) NF_STRERROR(ierr)
3797           stop 'thl_rad'
3798      endif
3799!dimensions lecture
3800!      call catchaxis(nid,ntime,nlevel,time,z,ierr)
3801 
3802#ifdef NC_DOUBLE
3803         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(1),zz)
3804#else
3805         ierr = NF_GET_VAR_REAL(nid,var3didin(1),zz)
3806#endif
3807         if(ierr/=NF_NOERR) then
3808            write(*,*) NF_STRERROR(ierr)
3809            stop "getvarup"
3810         endif
3811!          write(*,*)'lecture z ok',zz
3812
3813#ifdef NC_DOUBLE
3814         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(2),thl)
3815#else
3816         ierr = NF_GET_VAR_REAL(nid,var3didin(2),thl)
3817#endif
3818         if(ierr/=NF_NOERR) then
3819            write(*,*) NF_STRERROR(ierr)
3820            stop "getvarup"
3821         endif
3822!          write(*,*)'lecture thl ok',thl
3823
3824#ifdef NC_DOUBLE
3825         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(3),qt)
3826#else
3827         ierr = NF_GET_VAR_REAL(nid,var3didin(3),qt)
3828#endif
3829         if(ierr/=NF_NOERR) then
3830            write(*,*) NF_STRERROR(ierr)
3831            stop "getvarup"
3832         endif
3833!          write(*,*)'lecture qt ok',qt
3834 
3835#ifdef NC_DOUBLE
3836         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(4),u)
3837#else
3838         ierr = NF_GET_VAR_REAL(nid,var3didin(4),u)
3839#endif
3840         if(ierr/=NF_NOERR) then
3841            write(*,*) NF_STRERROR(ierr)
3842            stop "getvarup"
3843         endif
3844!          write(*,*)'lecture u ok',u
3845
3846#ifdef NC_DOUBLE
3847         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(5),v)
3848#else
3849         ierr = NF_GET_VAR_REAL(nid,var3didin(5),v)
3850#endif
3851         if(ierr/=NF_NOERR) then
3852            write(*,*) NF_STRERROR(ierr)
3853            stop "getvarup"
3854         endif
3855!          write(*,*)'lecture v ok',v
3856
3857#ifdef NC_DOUBLE
3858         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(6),tke)
3859#else
3860         ierr = NF_GET_VAR_REAL(nid,var3didin(6),tke)
3861#endif
3862         if(ierr/=NF_NOERR) then
3863            write(*,*) NF_STRERROR(ierr)
3864            stop "getvarup"
3865         endif
3866!          write(*,*)'lecture tke ok',tke
3867
3868#ifdef NC_DOUBLE
3869         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(7),ug)
3870#else
3871         ierr = NF_GET_VAR_REAL(nid,var3didin(7),ug)
3872#endif
3873         if(ierr/=NF_NOERR) then
3874            write(*,*) NF_STRERROR(ierr)
3875            stop "getvarup"
3876         endif
3877!          write(*,*)'lecture ug ok',ug
3878
3879#ifdef NC_DOUBLE
3880         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(8),vg)
3881#else
3882         ierr = NF_GET_VAR_REAL(nid,var3didin(8),vg)
3883#endif
3884         if(ierr/=NF_NOERR) then
3885            write(*,*) NF_STRERROR(ierr)
3886            stop "getvarup"
3887         endif
3888!          write(*,*)'lecture vg ok',vg
3889
3890#ifdef NC_DOUBLE
3891         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(9),wls)
3892#else
3893         ierr = NF_GET_VAR_REAL(nid,var3didin(9),wls)
3894#endif
3895         if(ierr/=NF_NOERR) then
3896            write(*,*) NF_STRERROR(ierr)
3897            stop "getvarup"
3898         endif
3899!          write(*,*)'lecture wls ok',wls
3900
3901#ifdef NC_DOUBLE
3902         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(10),dqtdx)
3903#else
3904         ierr = NF_GET_VAR_REAL(nid,var3didin(10),dqtdx)
3905#endif
3906         if(ierr/=NF_NOERR) then
3907            write(*,*) NF_STRERROR(ierr)
3908            stop "getvarup"
3909         endif
3910!          write(*,*)'lecture dqtdx ok',dqtdx
3911
3912#ifdef NC_DOUBLE
3913         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(11),dqtdy)
3914#else
3915         ierr = NF_GET_VAR_REAL(nid,var3didin(11),dqtdy)
3916#endif
3917         if(ierr/=NF_NOERR) then
3918            write(*,*) NF_STRERROR(ierr)
3919            stop "getvarup"
3920         endif
3921!          write(*,*)'lecture dqtdy ok',dqtdy
3922
3923#ifdef NC_DOUBLE
3924         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(12),dqtdt)
3925#else
3926         ierr = NF_GET_VAR_REAL(nid,var3didin(12),dqtdt)
3927#endif
3928         if(ierr/=NF_NOERR) then
3929            write(*,*) NF_STRERROR(ierr)
3930            stop "getvarup"
3931         endif
3932!          write(*,*)'lecture dqtdt ok',dqtdt
3933
3934#ifdef NC_DOUBLE
3935         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(13),thl_rad)
3936#else
3937         ierr = NF_GET_VAR_REAL(nid,var3didin(13),thl_rad)
3938#endif
3939         if(ierr/=NF_NOERR) then
3940            write(*,*) NF_STRERROR(ierr)
3941            stop "getvarup"
3942         endif
3943!          write(*,*)'lecture thl_rad ok',thl_rad
3944
3945         return 
3946         end subroutine read_fire
3947!=====================================================================
3948      subroutine read_dice(fich_dice,nlevel,ntime                         &
3949     &     ,zz,pres,t,qv,u,v,o3                                          &
3950     &     ,shf,lhf,lwup,swup,tg,ustar,psurf,ug,vg                        &
3951     &     ,hadvt,hadvq,hadvu,hadvv,w,omega)
3952
3953!program reading initial profils and forcings of the Dice case study
3954
3955
3956      implicit none
3957
3958#include "netcdf.inc"
3959#include "YOMCST.h"
3960
3961      integer ntime,nlevel
3962      integer l,k
3963      character*80 :: fich_dice
3964      real*8 time(ntime)
3965      real*8 zz(nlevel)
3966
3967      real*8 th(nlevel),pres(nlevel),t(nlevel)
3968      real*8 qv(nlevel),u(nlevel),v(nlevel),o3(nlevel)
3969      real*8 shf(ntime),lhf(ntime),lwup(ntime),swup(ntime),tg(ntime)
3970      real*8 ustar(ntime),psurf(ntime),ug(ntime),vg(ntime)
3971      real*8 hadvt(nlevel,ntime),hadvq(nlevel,ntime),hadvu(nlevel,ntime)
3972      real*8 hadvv(nlevel,ntime),w(nlevel,ntime),omega(nlevel,ntime)
3973      real*8 pzero
3974
3975      integer nid, ierr
3976      integer nbvar3d
3977      parameter(nbvar3d=30)
3978      integer var3didin(nbvar3d)
3979
3980      pzero=100000.
3981      ierr = NF_OPEN(fich_dice,NF_NOWRITE,nid)
3982      if (ierr.NE.NF_NOERR) then
3983         write(*,*) 'ERROR: Pb opening forcings nc file '
3984         write(*,*) NF_STRERROR(ierr)
3985         stop ""
3986      endif
3987
3988
3989       ierr=NF_INQ_VARID(nid,"height",var3didin(1)) 
3990         if(ierr/=NF_NOERR) then
3991           write(*,*) NF_STRERROR(ierr)
3992           stop 'height'
3993         endif
3994
3995       ierr=NF_INQ_VARID(nid,"pf",var3didin(11)) 
3996         if(ierr/=NF_NOERR) then
3997           write(*,*) NF_STRERROR(ierr)
3998           stop 'pf'
3999         endif
4000
4001      ierr=NF_INQ_VARID(nid,"theta",var3didin(12))
4002         if(ierr/=NF_NOERR) then
4003           write(*,*) NF_STRERROR(ierr)
4004           stop 'theta'
4005         endif
4006
4007      ierr=NF_INQ_VARID(nid,"qv",var3didin(13))
4008         if(ierr/=NF_NOERR) then
4009           write(*,*) NF_STRERROR(ierr)
4010           stop 'qv'
4011         endif
4012
4013      ierr=NF_INQ_VARID(nid,"u",var3didin(14))
4014         if(ierr/=NF_NOERR) then
4015           write(*,*) NF_STRERROR(ierr)
4016           stop 'u'
4017         endif
4018
4019      ierr=NF_INQ_VARID(nid,"v",var3didin(15))
4020         if(ierr/=NF_NOERR) then
4021           write(*,*) NF_STRERROR(ierr)
4022           stop 'v'
4023         endif
4024
4025      ierr=NF_INQ_VARID(nid,"o3mmr",var3didin(16))
4026         if(ierr/=NF_NOERR) then
4027           write(*,*) NF_STRERROR(ierr)
4028           stop 'o3'
4029         endif
4030
4031      ierr=NF_INQ_VARID(nid,"shf",var3didin(2))
4032         if(ierr/=NF_NOERR) then
4033           write(*,*) NF_STRERROR(ierr)
4034           stop 'shf'
4035         endif
4036
4037      ierr=NF_INQ_VARID(nid,"lhf",var3didin(3))
4038         if(ierr/=NF_NOERR) then
4039           write(*,*) NF_STRERROR(ierr)
4040           stop 'lhf'
4041         endif
4042     
4043      ierr=NF_INQ_VARID(nid,"lwup",var3didin(4))
4044         if(ierr/=NF_NOERR) then
4045           write(*,*) NF_STRERROR(ierr)
4046           stop 'lwup'
4047         endif
4048
4049      ierr=NF_INQ_VARID(nid,"swup",var3didin(5))
4050         if(ierr/=NF_NOERR) then
4051           write(*,*) NF_STRERROR(ierr)
4052           stop 'dqtdx'
4053         endif
4054
4055      ierr=NF_INQ_VARID(nid,"Tg",var3didin(6))
4056         if(ierr/=NF_NOERR) then
4057           write(*,*) NF_STRERROR(ierr)
4058           stop 'Tg'
4059      endif
4060
4061      ierr=NF_INQ_VARID(nid,"ustar",var3didin(7))
4062         if(ierr/=NF_NOERR) then
4063           write(*,*) NF_STRERROR(ierr)
4064           stop 'ustar'
4065      endif
4066
4067      ierr=NF_INQ_VARID(nid,"psurf",var3didin(8))
4068         if(ierr/=NF_NOERR) then
4069           write(*,*) NF_STRERROR(ierr)
4070           stop 'psurf'
4071      endif
4072
4073      ierr=NF_INQ_VARID(nid,"Ug",var3didin(9))
4074         if(ierr/=NF_NOERR) then
4075           write(*,*) NF_STRERROR(ierr)
4076           stop 'Ug'
4077      endif
4078
4079      ierr=NF_INQ_VARID(nid,"Vg",var3didin(10))
4080         if(ierr/=NF_NOERR) then
4081           write(*,*) NF_STRERROR(ierr)
4082           stop 'Vg'
4083      endif
4084
4085      ierr=NF_INQ_VARID(nid,"hadvT",var3didin(17))
4086         if(ierr/=NF_NOERR) then
4087           write(*,*) NF_STRERROR(ierr)
4088           stop 'hadvT'
4089      endif
4090
4091      ierr=NF_INQ_VARID(nid,"hadvq",var3didin(18))
4092         if(ierr/=NF_NOERR) then
4093           write(*,*) NF_STRERROR(ierr)
4094           stop 'hadvq'
4095      endif
4096
4097      ierr=NF_INQ_VARID(nid,"hadvu",var3didin(19))
4098         if(ierr/=NF_NOERR) then
4099           write(*,*) NF_STRERROR(ierr)
4100           stop 'hadvu'
4101      endif
4102
4103      ierr=NF_INQ_VARID(nid,"hadvv",var3didin(20))
4104         if(ierr/=NF_NOERR) then
4105           write(*,*) NF_STRERROR(ierr)
4106           stop 'hadvv'
4107      endif
4108
4109      ierr=NF_INQ_VARID(nid,"w",var3didin(21))
4110         if(ierr/=NF_NOERR) then
4111           write(*,*) NF_STRERROR(ierr)
4112           stop 'w'
4113      endif
4114
4115      ierr=NF_INQ_VARID(nid,"omega",var3didin(22))
4116         if(ierr/=NF_NOERR) then
4117           write(*,*) NF_STRERROR(ierr)
4118           stop 'omega'
4119      endif
4120!dimensions lecture
4121!      call catchaxis(nid,ntime,nlevel,time,z,ierr)
4122 
4123#ifdef NC_DOUBLE
4124         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(1),zz)
4125#else
4126         ierr = NF_GET_VAR_REAL(nid,var3didin(1),zz)
4127#endif
4128         if(ierr/=NF_NOERR) then
4129            write(*,*) NF_STRERROR(ierr)
4130            stop "getvarup"
4131         endif
4132!          write(*,*)'lecture zz ok',zz
4133 
4134#ifdef NC_DOUBLE
4135         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(11),pres)
4136#else
4137         ierr = NF_GET_VAR_REAL(nid,var3didin(11),pres)
4138#endif
4139         if(ierr/=NF_NOERR) then
4140            write(*,*) NF_STRERROR(ierr)
4141            stop "getvarup"
4142         endif
4143!          write(*,*)'lecture pres ok',pres
4144
4145#ifdef NC_DOUBLE
4146         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(12),th)
4147#else
4148         ierr = NF_GET_VAR_REAL(nid,var3didin(12),th)
4149#endif
4150         if(ierr/=NF_NOERR) then
4151            write(*,*) NF_STRERROR(ierr)
4152            stop "getvarup"
4153         endif
4154!          write(*,*)'lecture th ok',th
4155           do k=1,nlevel
4156             t(k)=th(k)*(pres(k)/pzero)**rkappa
4157           enddo
4158
4159#ifdef NC_DOUBLE
4160         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(13),qv)
4161#else
4162         ierr = NF_GET_VAR_REAL(nid,var3didin(13),qv)
4163#endif
4164         if(ierr/=NF_NOERR) then
4165            write(*,*) NF_STRERROR(ierr)
4166            stop "getvarup"
4167         endif
4168!          write(*,*)'lecture qv ok',qv
4169 
4170#ifdef NC_DOUBLE
4171         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(14),u)
4172#else
4173         ierr = NF_GET_VAR_REAL(nid,var3didin(14),u)
4174#endif
4175         if(ierr/=NF_NOERR) then
4176            write(*,*) NF_STRERROR(ierr)
4177            stop "getvarup"
4178         endif
4179!          write(*,*)'lecture u ok',u
4180
4181#ifdef NC_DOUBLE
4182         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(15),v)
4183#else
4184         ierr = NF_GET_VAR_REAL(nid,var3didin(15),v)
4185#endif
4186         if(ierr/=NF_NOERR) then
4187            write(*,*) NF_STRERROR(ierr)
4188            stop "getvarup"
4189         endif
4190!          write(*,*)'lecture v ok',v
4191
4192#ifdef NC_DOUBLE
4193         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(16),o3)
4194#else
4195         ierr = NF_GET_VAR_REAL(nid,var3didin(16),o3)
4196#endif
4197         if(ierr/=NF_NOERR) then
4198            write(*,*) NF_STRERROR(ierr)
4199            stop "getvarup"
4200         endif
4201!          write(*,*)'lecture o3 ok',o3
4202
4203#ifdef NC_DOUBLE
4204         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(2),shf)
4205#else
4206         ierr = NF_GET_VAR_REAL(nid,var3didin(2),shf)
4207#endif
4208         if(ierr/=NF_NOERR) then
4209            write(*,*) NF_STRERROR(ierr)
4210            stop "getvarup"
4211         endif
4212!          write(*,*)'lecture shf ok',shf
4213
4214#ifdef NC_DOUBLE
4215         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(3),lhf)
4216#else
4217         ierr = NF_GET_VAR_REAL(nid,var3didin(3),lhf)
4218#endif
4219         if(ierr/=NF_NOERR) then
4220            write(*,*) NF_STRERROR(ierr)
4221            stop "getvarup"
4222         endif
4223!          write(*,*)'lecture lhf ok',lhf
4224
4225#ifdef NC_DOUBLE
4226         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(4),lwup)
4227#else
4228         ierr = NF_GET_VAR_REAL(nid,var3didin(4),lwup)
4229#endif
4230         if(ierr/=NF_NOERR) then
4231            write(*,*) NF_STRERROR(ierr)
4232            stop "getvarup"
4233         endif
4234!          write(*,*)'lecture lwup ok',lwup
4235
4236#ifdef NC_DOUBLE
4237         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(5),swup)
4238#else
4239         ierr = NF_GET_VAR_REAL(nid,var3didin(5),swup)
4240#endif
4241         if(ierr/=NF_NOERR) then
4242            write(*,*) NF_STRERROR(ierr)
4243            stop "getvarup"
4244         endif
4245!          write(*,*)'lecture swup ok',swup
4246
4247#ifdef NC_DOUBLE
4248         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(6),tg)
4249#else
4250         ierr = NF_GET_VAR_REAL(nid,var3didin(6),tg)
4251#endif
4252         if(ierr/=NF_NOERR) then
4253            write(*,*) NF_STRERROR(ierr)
4254            stop "getvarup"
4255         endif
4256!          write(*,*)'lecture tg ok',tg
4257
4258#ifdef NC_DOUBLE
4259         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(7),ustar)
4260#else
4261         ierr = NF_GET_VAR_REAL(nid,var3didin(7),ustar)
4262#endif
4263         if(ierr/=NF_NOERR) then
4264            write(*,*) NF_STRERROR(ierr)
4265            stop "getvarup"
4266         endif
4267!          write(*,*)'lecture ustar ok',ustar
4268
4269#ifdef NC_DOUBLE
4270         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(8),psurf)
4271#else
4272         ierr = NF_GET_VAR_REAL(nid,var3didin(8),psurf)
4273#endif
4274         if(ierr/=NF_NOERR) then
4275            write(*,*) NF_STRERROR(ierr)
4276            stop "getvarup"
4277         endif
4278!          write(*,*)'lecture psurf ok',psurf
4279
4280#ifdef NC_DOUBLE
4281         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(9),ug)
4282#else
4283         ierr = NF_GET_VAR_REAL(nid,var3didin(9),ug)
4284#endif
4285         if(ierr/=NF_NOERR) then
4286            write(*,*) NF_STRERROR(ierr)
4287            stop "getvarup"
4288         endif
4289!          write(*,*)'lecture ug ok',ug
4290
4291#ifdef NC_DOUBLE
4292         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(10),vg)
4293#else
4294         ierr = NF_GET_VAR_REAL(nid,var3didin(10),vg)
4295#endif
4296         if(ierr/=NF_NOERR) then
4297            write(*,*) NF_STRERROR(ierr)
4298            stop "getvarup"
4299         endif
4300!          write(*,*)'lecture vg ok',vg
4301
4302#ifdef NC_DOUBLE
4303         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(17),hadvt)
4304#else
4305         ierr = NF_GET_VAR_REAL(nid,var3didin(17),hadvt)
4306#endif
4307         if(ierr/=NF_NOERR) then
4308            write(*,*) NF_STRERROR(ierr)
4309            stop "getvarup"
4310         endif
4311!          write(*,*)'lecture hadvt ok',hadvt
4312
4313#ifdef NC_DOUBLE
4314         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(18),hadvq)
4315#else
4316         ierr = NF_GET_VAR_REAL(nid,var3didin(18),hadvq)
4317#endif
4318         if(ierr/=NF_NOERR) then
4319            write(*,*) NF_STRERROR(ierr)
4320            stop "getvarup"
4321         endif
4322!          write(*,*)'lecture hadvq ok',hadvq
4323
4324#ifdef NC_DOUBLE
4325         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(19),hadvu)
4326#else
4327         ierr = NF_GET_VAR_REAL(nid,var3didin(19),hadvu)
4328#endif
4329         if(ierr/=NF_NOERR) then
4330            write(*,*) NF_STRERROR(ierr)
4331            stop "getvarup"
4332         endif
4333!          write(*,*)'lecture hadvu ok',hadvu
4334
4335#ifdef NC_DOUBLE
4336         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(20),hadvv)
4337#else
4338         ierr = NF_GET_VAR_REAL(nid,var3didin(20),hadvv)
4339#endif
4340         if(ierr/=NF_NOERR) then
4341            write(*,*) NF_STRERROR(ierr)
4342            stop "getvarup"
4343         endif
4344!          write(*,*)'lecture hadvv ok',hadvv
4345
4346#ifdef NC_DOUBLE
4347         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(21),w)
4348#else
4349         ierr = NF_GET_VAR_REAL(nid,var3didin(21),w)
4350#endif
4351         if(ierr/=NF_NOERR) then
4352            write(*,*) NF_STRERROR(ierr)
4353            stop "getvarup"
4354         endif
4355!          write(*,*)'lecture w ok',w
4356
4357#ifdef NC_DOUBLE
4358         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(22),omega)
4359#else
4360         ierr = NF_GET_VAR_REAL(nid,var3didin(22),omega)
4361#endif
4362         if(ierr/=NF_NOERR) then
4363            write(*,*) NF_STRERROR(ierr)
4364            stop "getvarup"
4365         endif
4366!          write(*,*)'lecture omega ok',omega
4367
4368         return 
4369         end subroutine read_dice
4370!=====================================================================
4371      subroutine read_gabls4(fich_gabls4,nlevel,ntime,nsol                    &
4372     &     ,zz,depth_sn,ug,vg,pf,th,t,qv,u,v,hadvt,hadvq,tg,tsnow,snow_dens)
4373
4374!program reading initial profils and forcings of the Gabls4 case study
4375
4376
4377      implicit none
4378
4379#include "netcdf.inc"
4380
4381      integer ntime,nlevel,nsol
4382      integer l,k
4383      character*80 :: fich_gabls4
4384      real*8 time(ntime)
4385
4386!  ATTENTION: visiblement quand on lit gabls4_driver.nc on recupere les donnees
4387! dans un ordre inverse par rapport a la convention LMDZ
4388! ==> il faut tout inverser  (MPL 20141024)
4389! les variables indexees "_i" sont celles qui sont lues dans gabls4_driver.nc
4390      real*8 zz_i(nlevel),th_i(nlevel),pf_i(nlevel),t_i(nlevel)
4391      real*8 qv_i(nlevel),u_i(nlevel),v_i(nlevel),ug_i(nlevel,ntime),vg_i(nlevel,ntime)
4392      real*8 hadvt_i(nlevel,ntime),hadvq_i(nlevel,ntime)
4393
4394      real*8 zz(nlevel),th(nlevel),pf(nlevel),t(nlevel)
4395      real*8 qv(nlevel),u(nlevel),v(nlevel),ug(nlevel,ntime),vg(nlevel,ntime)
4396      real*8 hadvt(nlevel,ntime),hadvq(nlevel,ntime)
4397
4398      real*8 depth_sn(nsol),tsnow(nsol),snow_dens(nsol)
4399      real*8 tg(ntime)
4400      integer nid, ierr
4401      integer nbvar3d
4402      parameter(nbvar3d=30)
4403      integer var3didin(nbvar3d)
4404
4405      ierr = NF_OPEN(fich_gabls4,NF_NOWRITE,nid)
4406      if (ierr.NE.NF_NOERR) then
4407         write(*,*) 'ERROR: Pb opening forcings nc file '
4408         write(*,*) NF_STRERROR(ierr)
4409         stop ""
4410      endif
4411
4412
4413       ierr=NF_INQ_VARID(nid,"height",var3didin(1)) 
4414         if(ierr/=NF_NOERR) then
4415           write(*,*) NF_STRERROR(ierr)
4416           stop 'height'
4417         endif
4418
4419      ierr=NF_INQ_VARID(nid,"depth_sn",var3didin(2))
4420         if(ierr/=NF_NOERR) then
4421           write(*,*) NF_STRERROR(ierr)
4422           stop 'depth_sn'
4423      endif
4424
4425      ierr=NF_INQ_VARID(nid,"Ug",var3didin(3))
4426         if(ierr/=NF_NOERR) then
4427           write(*,*) NF_STRERROR(ierr)
4428           stop 'Ug'
4429      endif
4430
4431      ierr=NF_INQ_VARID(nid,"Vg",var3didin(4))
4432         if(ierr/=NF_NOERR) then
4433           write(*,*) NF_STRERROR(ierr)
4434           stop 'Vg'
4435      endif
4436       ierr=NF_INQ_VARID(nid,"pf",var3didin(5)) 
4437         if(ierr/=NF_NOERR) then
4438           write(*,*) NF_STRERROR(ierr)
4439           stop 'pf'
4440         endif
4441
4442      ierr=NF_INQ_VARID(nid,"theta",var3didin(6))
4443         if(ierr/=NF_NOERR) then
4444           write(*,*) NF_STRERROR(ierr)
4445           stop 'theta'
4446         endif
4447
4448      ierr=NF_INQ_VARID(nid,"tempe",var3didin(7))
4449         if(ierr/=NF_NOERR) then
4450           write(*,*) NF_STRERROR(ierr)
4451           stop 'tempe'
4452         endif
4453
4454      ierr=NF_INQ_VARID(nid,"qv",var3didin(8))
4455         if(ierr/=NF_NOERR) then
4456           write(*,*) NF_STRERROR(ierr)
4457           stop 'qv'
4458         endif
4459
4460      ierr=NF_INQ_VARID(nid,"u",var3didin(9))
4461         if(ierr/=NF_NOERR) then
4462           write(*,*) NF_STRERROR(ierr)
4463           stop 'u'
4464         endif
4465
4466      ierr=NF_INQ_VARID(nid,"v",var3didin(10))
4467         if(ierr/=NF_NOERR) then
4468           write(*,*) NF_STRERROR(ierr)
4469           stop 'v'
4470         endif
4471
4472      ierr=NF_INQ_VARID(nid,"hadvT",var3didin(11))
4473         if(ierr/=NF_NOERR) then
4474           write(*,*) NF_STRERROR(ierr)
4475           stop 'hadvt'
4476         endif
4477
4478      ierr=NF_INQ_VARID(nid,"hadvQ",var3didin(12))
4479         if(ierr/=NF_NOERR) then
4480           write(*,*) NF_STRERROR(ierr)
4481           stop 'hadvq'
4482      endif
4483
4484      ierr=NF_INQ_VARID(nid,"Tsnow",var3didin(14))
4485         if(ierr/=NF_NOERR) then
4486           write(*,*) NF_STRERROR(ierr)
4487           stop 'tsnow'
4488      endif
4489
4490      ierr=NF_INQ_VARID(nid,"snow_density",var3didin(15))
4491         if(ierr/=NF_NOERR) then
4492           write(*,*) NF_STRERROR(ierr)
4493           stop 'snow_density'
4494      endif
4495
4496      ierr=NF_INQ_VARID(nid,"Tg",var3didin(16))
4497         if(ierr/=NF_NOERR) then
4498           write(*,*) NF_STRERROR(ierr)
4499           stop 'Tg'
4500      endif
4501
4502
4503!dimensions lecture
4504!      call catchaxis(nid,ntime,nlevel,time,z,ierr)
4505 
4506#ifdef NC_DOUBLE
4507         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(1),zz_i)
4508#else
4509         ierr = NF_GET_VAR_REAL(nid,var3didin(1),zz_i)
4510#endif
4511         if(ierr/=NF_NOERR) then
4512            write(*,*) NF_STRERROR(ierr)
4513            stop "getvarup"
4514         endif
4515 
4516#ifdef NC_DOUBLE
4517         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(2),depth_sn)
4518#else
4519         ierr = NF_GET_VAR_REAL(nid,var3didin(2),depth_sn)
4520#endif
4521         if(ierr/=NF_NOERR) then
4522            write(*,*) NF_STRERROR(ierr)
4523            stop "getvarup"
4524         endif
4525 
4526#ifdef NC_DOUBLE
4527         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(3),ug_i)
4528#else
4529         ierr = NF_GET_VAR_REAL(nid,var3didin(3),ug_i)
4530#endif
4531         if(ierr/=NF_NOERR) then
4532            write(*,*) NF_STRERROR(ierr)
4533            stop "getvarup"
4534         endif
4535 
4536#ifdef NC_DOUBLE
4537         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(4),vg_i)
4538#else
4539         ierr = NF_GET_VAR_REAL(nid,var3didin(4),vg_i)
4540#endif
4541         if(ierr/=NF_NOERR) then
4542            write(*,*) NF_STRERROR(ierr)
4543            stop "getvarup"
4544         endif
4545 
4546#ifdef NC_DOUBLE
4547         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(5),pf_i)
4548#else
4549         ierr = NF_GET_VAR_REAL(nid,var3didin(5),pf_i)
4550#endif
4551         if(ierr/=NF_NOERR) then
4552            write(*,*) NF_STRERROR(ierr)
4553            stop "getvarup"
4554         endif
4555
4556#ifdef NC_DOUBLE
4557         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(6),th_i)
4558#else
4559         ierr = NF_GET_VAR_REAL(nid,var3didin(6),th_i)
4560#endif
4561         if(ierr/=NF_NOERR) then
4562            write(*,*) NF_STRERROR(ierr)
4563            stop "getvarup"
4564         endif
4565
4566#ifdef NC_DOUBLE
4567         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(7),t_i)
4568#else
4569         ierr = NF_GET_VAR_REAL(nid,var3didin(7),t_i)
4570#endif
4571         if(ierr/=NF_NOERR) then
4572            write(*,*) NF_STRERROR(ierr)
4573            stop "getvarup"
4574         endif
4575
4576#ifdef NC_DOUBLE
4577         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(8),qv_i)
4578#else
4579         ierr = NF_GET_VAR_REAL(nid,var3didin(8),qv_i)
4580#endif
4581         if(ierr/=NF_NOERR) then
4582            write(*,*) NF_STRERROR(ierr)
4583            stop "getvarup"
4584         endif
4585 
4586#ifdef NC_DOUBLE
4587         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(9),u_i)
4588#else
4589         ierr = NF_GET_VAR_REAL(nid,var3didin(9),u_i)
4590#endif
4591         if(ierr/=NF_NOERR) then
4592            write(*,*) NF_STRERROR(ierr)
4593            stop "getvarup"
4594         endif
4595 
4596#ifdef NC_DOUBLE
4597         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(10),v_i)
4598#else
4599         ierr = NF_GET_VAR_REAL(nid,var3didin(10),v_i)
4600#endif
4601         if(ierr/=NF_NOERR) then
4602            write(*,*) NF_STRERROR(ierr)
4603            stop "getvarup"
4604         endif
4605 
4606#ifdef NC_DOUBLE
4607         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(11),hadvt_i)
4608#else
4609         ierr = NF_GET_VAR_REAL(nid,var3didin(11),hadvt_i)
4610#endif
4611         if(ierr/=NF_NOERR) then
4612            write(*,*) NF_STRERROR(ierr)
4613            stop "getvarup"
4614         endif
4615 
4616#ifdef NC_DOUBLE
4617         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(12),hadvq_i)
4618#else
4619         ierr = NF_GET_VAR_REAL(nid,var3didin(12),hadvq_i)
4620#endif
4621         if(ierr/=NF_NOERR) then
4622            write(*,*) NF_STRERROR(ierr)
4623            stop "getvarup"
4624         endif
4625 
4626#ifdef NC_DOUBLE
4627         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(14),tsnow)
4628#else
4629         ierr = NF_GET_VAR_REAL(nid,var3didin(14),tsnow)
4630#endif
4631         if(ierr/=NF_NOERR) then
4632            write(*,*) NF_STRERROR(ierr)
4633            stop "getvarup"
4634         endif
4635 
4636#ifdef NC_DOUBLE
4637         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(15),snow_dens)
4638#else
4639         ierr = NF_GET_VAR_REAL(nid,var3didin(15),snow_dens)
4640#endif
4641         if(ierr/=NF_NOERR) then
4642            write(*,*) NF_STRERROR(ierr)
4643            stop "getvarup"
4644         endif
4645
4646#ifdef NC_DOUBLE
4647         ierr = NF_GET_VAR_DOUBLE(nid,var3didin(16),tg)
4648#else
4649         ierr = NF_GET_VAR_REAL(nid,var3didin(16),tg)
4650#endif
4651         if(ierr/=NF_NOERR) then
4652            write(*,*) NF_STRERROR(ierr)
4653            stop "getvarup"
4654         endif
4655
4656! On remet les variables lues dans le bon ordre des niveaux (MPL 20141024)
4657         do k=1,nlevel
4658           zz(k)=zz_i(nlevel+1-k)
4659           ug(k,:)=ug_i(nlevel+1-k,:)
4660           vg(k,:)=vg_i(nlevel+1-k,:)
4661           pf(k)=pf_i(nlevel+1-k)
4662           print *,'pf=',pf(k)
4663           th(k)=th_i(nlevel+1-k)
4664           t(k)=t_i(nlevel+1-k)
4665           qv(k)=qv_i(nlevel+1-k)
4666           u(k)=u_i(nlevel+1-k)
4667           v(k)=v_i(nlevel+1-k)
4668           hadvt(k,:)=hadvt_i(nlevel+1-k,:)
4669           hadvq(k,:)=hadvq_i(nlevel+1-k,:)
4670         enddo
4671         return 
4672 end subroutine read_gabls4
4673!=====================================================================
4674
4675!     Reads CIRC input files     
4676
4677      SUBROUTINE read_circ(nlev_circ,cf,lwp,iwp,reliq,reice,t,z,p,pm,h2o,o3,sza)
4678     
4679      parameter (ncm_1=49180)
4680#include "YOMCST.h"
4681
4682      real albsfc(ncm_1), albsfc_w(ncm_1)
4683      real cf(nlev_circ), icefra(nlev_circ), deice(nlev_circ), &
4684           reliq(nlev_circ), reice(nlev_circ), lwp(nlev_circ), iwp(nlev_circ)
4685      real t(nlev_circ+1), z(nlev_circ+1), dz(nlev_circ), p(nlev_circ+1)
4686      real aer_beta(nlev_circ), waer(nlev_circ), gaer(nlev_circ)
4687      real pm(nlev_circ), tm(nlev_circ), h2o(nlev_circ), o3(nlev_circ)
4688      real co2(nlev_circ), n2o(nlev_circ), co(nlev_circ), ch4(nlev_circ), &
4689           o2(nlev_circ), ccl4(nlev_circ), f11(nlev_circ), f12(nlev_circ)
4690!     za= zenital angle
4691!     sza= cosinus angle zenital
4692      real wavn(ncm_1), ssf(ncm_1),za,sza
4693      integer nlev
4694
4695
4696!     Open the files
4697
4698      open (11, file='Tsfc_sza_nlev_case.txt', status='old')
4699      open (12, file='level_input_case.txt', status='old')
4700      open (13, file='layer_input_case.txt', status='old')
4701      open (14, file='aerosol_input_case.txt', status='old')
4702      open (15, file='cloud_input_case.txt', status='old')
4703      open (16, file='sfcalbedo_input_case.txt', status='old')
4704     
4705!     Read scalar information
4706      do iskip=1,5
4707         read (11, *)
4708      enddo
4709      read (11, '(i8)') nlev
4710      read (11, '(f10.2)') tsfc
4711      read (11, '(f10.2)') za
4712      read (11, '(f10.4)') sw_dn_toa
4713      sza=cos(za/180.*RPI)
4714      print *,'nlev,tsfc,sza,sw_dn_toa,RPI',nlev,tsfc,sza,sw_dn_toa,RPI
4715      close(11)
4716
4717!     Read level information
4718      read (12, *)
4719      do il=1,nlev
4720         read (12, 302) ilev, z(il), p(il), t(il)
4721         z(il)=z(il)*1000.    ! z donne en km
4722         p(il)=p(il)*100.     ! p donne en mb
4723      enddo
4724302   format (i8, f8.3, 2f9.2)
4725      close(12)
4726
4727!     Read layer information (midpoint values)
4728      do iskip=1,3
4729         read (13, *)
4730      enddo
4731      do il=1,nlev-1
4732         read (13, 303) ilev,pm(il),tm(il),h2o(il),co2(il),o3(il), &
4733                        n2o(il),co(il),ch4(il),o2(il),ccl4(il), &
4734                        f11(il),f12(il)
4735         pm(il)=pm(il)*100.
4736      enddo
4737303   format (i8, 2f9.2, 10(2x,e13.7))     
4738      close(13)
4739     
4740!     Read aerosol layer information
4741      do iskip=1,3
4742         read (14, *)
4743      enddo
4744      read (14, '(f10.2)') aer_alpha
4745      read (14, *)
4746      read (14, *)
4747      do il=1,nlev-1
4748         read (14, 304) ilev, aer_beta(il), waer(il), gaer(il)
4749      enddo
4750304   format (i8, f9.5, 2f8.3)
4751      close(14)
4752     
4753!     Read cloud information
4754      do iskip=1,3
4755         read (15, *)
4756      enddo
4757      do il=1,nlev-1
4758         read (15, 305) ilev, cf(il), lwp(il), iwp(il), reliq(il), reice(il)
4759         lwp(il)=lwp(il)/1000.          ! lwp donne en g/kg
4760         iwp(il)=iwp(il)/1000.          ! iwp donne en g/kg
4761         reliq(il)=reliq(il)/1000000.   ! reliq donne en microns
4762         reice(il)=reice(il)/1000000.   ! reice donne en microns
4763      enddo
4764305   format (i8, f8.3, 4f9.2)
4765      close(15)
4766
4767!     Read surface albedo (weighted & unweighted) and spectral solar irradiance
4768      do iskip=1,6
4769         read (16, *)
4770      enddo
4771      do icm_1=1,ncm_1
4772         read (16, 306) wavn(icm_1), albsfc(icm_1), albsfc_w(icm_1), ssf(icm_1)
4773      enddo
4774306   format(f10.1, 2f12.5, f14.8)
4775      close(16)
4776 
4777      return 
4778      end subroutine read_circ
4779!=====================================================================
4780!     Reads RTMIP input files     
4781
4782      SUBROUTINE read_rtmip(nlev_rtmip,play,plev,t,h2o,o3)
4783     
4784#include "YOMCST.h"
4785
4786      real t(nlev_rtmip), pt(nlev_rtmip),pb(nlev_rtmip),h2o(nlev_rtmip), o3(nlev_rtmip)
4787      real temp(nlev_rtmip), play(nlev_rtmip),ovap(nlev_rtmip), oz(nlev_rtmip),plev(nlev_rtmip+1)
4788      integer nlev
4789
4790
4791!     Open the files
4792
4793      open (11, file='low_resolution_profile.txt', status='old')
4794     
4795!     Read level information
4796      read (11, *)
4797      do il=1,nlev_rtmip
4798         read (11, 302) pt(il), pb(il), t(il),h2o(il),o3(il)
4799      enddo
4800      do il=1,nlev_rtmip
4801         play(il)=pt(nlev_rtmip-il+1)*100.     ! p donne en mb
4802         temp(il)=t(nlev_rtmip-il+1)
4803         ovap(il)=h2o(nlev_rtmip-il+1)
4804         oz(il)=o3(nlev_rtmip-il+1)
4805      enddo
4806      do il=1,39
4807         plev(il)=play(il)+(play(il+1)-play(il))/2.
4808         print *,'il p t ovap oz=',il,plev(il),temp(il),ovap(il),oz(il)
4809      enddo
4810      plev(41)=101300.
4811302   format (e16.10,3x,e16.10,3x,e16.10,3x,e12.6,3x,e12.6)
4812      close(12)
4813 
4814      return 
4815      end subroutine read_rtmip
4816!=====================================================================
4817
4818!  Subroutines for nudging
4819
4820      Subroutine Nudge_RHT_init (paprs,pplay,t,q,t_targ,rh_targ)
4821! ========================================================
4822  USE dimphy
4823
4824  implicit none
4825
4826! ========================================================
4827      REAL paprs(klon,klevp1)
4828      REAL pplay(klon,klev)
4829!
4830!      Variables d'etat
4831      REAL t(klon,klev)
4832      REAL q(klon,klev)
4833!
4834!   Profiles cible
4835      REAL t_targ(klon,klev)
4836      REAL rh_targ(klon,klev)
4837!
4838   INTEGER k,i
4839   REAL zx_qs
4840
4841! Declaration des constantes et des fonctions thermodynamiques
4842!
4843include "YOMCST.h"
4844include "YOETHF.h"
4845!
4846!  ----------------------------------------
4847!  Statement functions
4848include "FCTTRE.h"
4849!  ----------------------------------------
4850!
4851        DO k = 1,klev
4852         DO i = 1,klon
4853           t_targ(i,k) = t(i,k)
4854           IF (t(i,k).LT.RTT) THEN
4855              zx_qs = qsats(t(i,k))/(pplay(i,k))
4856           ELSE
4857              zx_qs = qsatl(t(i,k))/(pplay(i,k))
4858           ENDIF
4859           rh_targ(i,k) = q(i,k)/zx_qs
4860         ENDDO
4861        ENDDO
4862      print *, 't_targ',t_targ
4863      print *, 'rh_targ',rh_targ
4864!
4865!
4866      RETURN
4867      END
4868
4869      Subroutine Nudge_UV_init (paprs,pplay,u,v,u_targ,v_targ)
4870! ========================================================
4871  USE dimphy
4872
4873  implicit none
4874
4875! ========================================================
4876      REAL paprs(klon,klevp1)
4877      REAL pplay(klon,klev)
4878!
4879!      Variables d'etat
4880      REAL u(klon,klev)
4881      REAL v(klon,klev)
4882!
4883!   Profiles cible
4884      REAL u_targ(klon,klev)
4885      REAL v_targ(klon,klev)
4886!
4887   INTEGER k,i
4888!
4889        DO k = 1,klev
4890         DO i = 1,klon
4891           u_targ(i,k) = u(i,k)
4892           v_targ(i,k) = v(i,k)
4893         ENDDO
4894        ENDDO
4895      print *, 'u_targ',u_targ
4896      print *, 'v_targ',v_targ
4897!
4898!
4899      RETURN
4900      END
4901
4902      Subroutine Nudge_RHT (dtime,paprs,pplay,t_targ,rh_targ,t,q,          &
4903     &                      d_t,d_q)
4904! ========================================================
4905  USE dimphy
4906
4907  implicit none
4908
4909! ========================================================
4910      REAL dtime
4911      REAL paprs(klon,klevp1)
4912      REAL pplay(klon,klev)
4913!
4914!      Variables d'etat
4915      REAL t(klon,klev)
4916      REAL q(klon,klev)
4917!
4918! Tendances
4919      REAL d_t(klon,klev)
4920      REAL d_q(klon,klev)
4921!
4922!   Profiles cible
4923      REAL t_targ(klon,klev)
4924      REAL rh_targ(klon,klev)
4925!
4926!   Temps de relaxation
4927      REAL tau
4928!c      DATA tau /3600./
4929!!      DATA tau /5400./
4930      DATA tau /1800./
4931!
4932   INTEGER k,i
4933   REAL zx_qs, rh, tnew, d_rh, rhnew
4934
4935! Declaration des constantes et des fonctions thermodynamiques
4936!
4937include "YOMCST.h"
4938include "YOETHF.h"
4939!
4940!  ----------------------------------------
4941!  Statement functions
4942include "FCTTRE.h"
4943!  ----------------------------------------
4944!
4945        print *,'dtime, tau ',dtime,tau
4946        print *, 't_targ',t_targ
4947        print *, 'rh_targ',rh_targ
4948        print *,'temp ',t
4949        print *,'hum ',q
4950!
4951        DO k = 1,klev
4952         DO i = 1,klon
4953           IF (paprs(i,1)-pplay(i,k) .GT. 10000.) THEN
4954            IF (t(i,k).LT.RTT) THEN
4955               zx_qs = qsats(t(i,k))/(pplay(i,k))
4956            ELSE
4957               zx_qs = qsatl(t(i,k))/(pplay(i,k))
4958            ENDIF
4959            rh = q(i,k)/zx_qs
4960!
4961            d_t(i,k) = d_t(i,k) + 1./tau*(t_targ(i,k)-t(i,k))
4962            d_rh = 1./tau*(rh_targ(i,k)-rh)
4963!
4964            tnew = t(i,k)+d_t(i,k)*dtime
4965!jyg<
4966!   Formule pour q :
4967!                         d_q = (1/tau) [rh_targ*qsat(T_new) - q] 
4968!
4969!  Cette formule remplace d_q = (1/tau) [rh_targ - rh] qsat(T_new)
4970!   qui n'etait pas correcte.
4971!
4972            IF (tnew.LT.RTT) THEN
4973               zx_qs = qsats(tnew)/(pplay(i,k))
4974            ELSE
4975               zx_qs = qsatl(tnew)/(pplay(i,k))
4976            ENDIF
4977!!            d_q(i,k) = d_q(i,k) + d_rh*zx_qs
4978            d_q(i,k) = d_q(i,k) + (1./tau)*(rh_targ(i,k)*zx_qs - q(i,k))
4979            rhnew = (q(i,k)+d_q(i,k)*dtime)/zx_qs
4980!
4981            print *,' k,d_t,rh,d_rh,rhnew,d_q ',    &
4982                      k,d_t(i,k),rh,d_rh,rhnew,d_q(i,k)
4983           ENDIF
4984!
4985         ENDDO
4986        ENDDO
4987!
4988      RETURN
4989      END
4990
4991      Subroutine Nudge_UV (dtime,paprs,pplay,u_targ,v_targ,u,v,          &
4992     &                      d_u,d_v)
4993! ========================================================
4994  USE dimphy
4995
4996  implicit none
4997
4998! ========================================================
4999      REAL dtime
5000      REAL paprs(klon,klevp1)
5001      REAL pplay(klon,klev)
5002!
5003!      Variables d'etat
5004      REAL u(klon,klev)
5005      REAL v(klon,klev)
5006!
5007! Tendances
5008      REAL d_u(klon,klev)
5009      REAL d_v(klon,klev)
5010!
5011!   Profiles cible
5012      REAL u_targ(klon,klev)
5013      REAL v_targ(klon,klev)
5014!
5015!   Temps de relaxation
5016      REAL tau
5017!c      DATA tau /3600./
5018      DATA tau /5400./
5019!
5020   INTEGER k,i
5021
5022!
5023        print *,'dtime, tau ',dtime,tau
5024        print *, 'u_targ',u_targ
5025        print *, 'v_targ',v_targ
5026        print *,'zonal velocity ',u
5027        print *,'meridional velocity ',v
5028        DO k = 1,klev
5029         DO i = 1,klon
5030           IF (paprs(i,1)-pplay(i,k) .GT. 10000.) THEN
5031!
5032            d_u(i,k) = d_u(i,k) + 1./tau*(u_targ(i,k)-u(i,k))
5033            d_v(i,k) = d_v(i,k) + 1./tau*(v_targ(i,k)-v(i,k))
5034!
5035            print *,' k,u,d_u,v,d_v ',    &
5036                      k,u(i,k),d_u(i,k),v(i,k),d_v(i,k)
5037           ENDIF
5038!
5039         ENDDO
5040        ENDDO
5041!
5042      RETURN
5043      END
5044
5045!=====================================================================
5046       SUBROUTINE interp2_case_vertical(play,nlev_cas,plev_prof_cas                                    &
5047     &         ,t_prof_cas,th_prof_cas,thv_prof_cas,thl_prof_cas                                       &
5048     &         ,qv_prof_cas,ql_prof_cas,qi_prof_cas,u_prof_cas,v_prof_cas                              &
5049     &         ,ug_prof_cas,vg_prof_cas,vitw_prof_cas,omega_prof_cas                                   &
5050     &         ,du_prof_cas,hu_prof_cas,vu_prof_cas,dv_prof_cas,hv_prof_cas,vv_prof_cas                &
5051     &         ,dt_prof_cas,ht_prof_cas,vt_prof_cas,dtrad_prof_cas,dq_prof_cas,hq_prof_cas,vq_prof_cas &
5052     &         ,dth_prof_cas,hth_prof_cas,vth_prof_cas                                                 &
5053!
5054     &         ,t_mod_cas,theta_mod_cas,thv_mod_cas,thl_mod_cas                                        &
5055     &         ,qv_mod_cas,ql_mod_cas,qi_mod_cas,u_mod_cas,v_mod_cas                                   &
5056     &         ,ug_mod_cas,vg_mod_cas,w_mod_cas,omega_mod_cas                                          &
5057     &         ,du_mod_cas,hu_mod_cas,vu_mod_cas,dv_mod_cas,hv_mod_cas,vv_mod_cas                      &
5058     &         ,dt_mod_cas,ht_mod_cas,vt_mod_cas,dtrad_mod_cas,dq_mod_cas,hq_mod_cas,vq_mod_cas        &
5059     &         ,dth_mod_cas,hth_mod_cas,vth_mod_cas,mxcalc)
5060 
5061       implicit none
5062 
5063#include "dimensions.h"
5064
5065!-------------------------------------------------------------------------
5066! Vertical interpolation of generic case forcing data onto mod_casel levels
5067!-------------------------------------------------------------------------
5068 
5069       integer nlevmax
5070       parameter (nlevmax=41)
5071       integer nlev_cas,mxcalc
5072!       real play(llm), plev_prof(nlevmax) 
5073!       real t_prof(nlevmax),q_prof(nlevmax)
5074!       real u_prof(nlevmax),v_prof(nlevmax), w_prof(nlevmax)
5075!       real ht_prof(nlevmax),vt_prof(nlevmax)
5076!       real hq_prof(nlevmax),vq_prof(nlevmax)
5077 
5078       real play(llm), plev_prof_cas(nlev_cas) 
5079       real t_prof_cas(nlev_cas),th_prof_cas(nlev_cas),thv_prof_cas(nlev_cas),thl_prof_cas(nlev_cas)
5080       real qv_prof_cas(nlev_cas),ql_prof_cas(nlev_cas),qi_prof_cas(nlev_cas)
5081       real u_prof_cas(nlev_cas),v_prof_cas(nlev_cas)
5082       real ug_prof_cas(nlev_cas),vg_prof_cas(nlev_cas), vitw_prof_cas(nlev_cas),omega_prof_cas(nlev_cas)
5083       real du_prof_cas(nlev_cas),hu_prof_cas(nlev_cas),vu_prof_cas(nlev_cas)
5084       real dv_prof_cas(nlev_cas),hv_prof_cas(nlev_cas),vv_prof_cas(nlev_cas)
5085       real dt_prof_cas(nlev_cas),ht_prof_cas(nlev_cas),vt_prof_cas(nlev_cas),dtrad_prof_cas(nlev_cas)
5086       real dth_prof_cas(nlev_cas),hth_prof_cas(nlev_cas),vth_prof_cas(nlev_cas)
5087       real dq_prof_cas(nlev_cas),hq_prof_cas(nlev_cas),vq_prof_cas(nlev_cas)
5088 
5089       real t_mod_cas(llm),theta_mod_cas(llm),thv_mod_cas(llm),thl_mod_cas(llm)
5090       real qv_mod_cas(llm),ql_mod_cas(llm),qi_mod_cas(llm)
5091       real u_mod_cas(llm),v_mod_cas(llm)
5092       real ug_mod_cas(llm),vg_mod_cas(llm), w_mod_cas(llm),omega_mod_cas(llm)
5093       real du_mod_cas(llm),hu_mod_cas(llm),vu_mod_cas(llm)
5094       real dv_mod_cas(llm),hv_mod_cas(llm),vv_mod_cas(llm)
5095       real dt_mod_cas(llm),ht_mod_cas(llm),vt_mod_cas(llm),dtrad_mod_cas(llm)
5096       real dth_mod_cas(llm),hth_mod_cas(llm),vth_mod_cas(llm)
5097       real dq_mod_cas(llm),hq_mod_cas(llm),vq_mod_cas(llm)
5098 
5099       integer l,k,k1,k2
5100       real frac,frac1,frac2,fact
5101 
5102       do l = 1, llm
5103       print *,'debut interp2, play=',l,play(l)
5104       enddo
5105!      do l = 1, nlev_cas
5106!      print *,'debut interp2, plev_prof_cas=',l,play(l),plev_prof_cas(l)
5107!      enddo
5108
5109       do l = 1, llm
5110
5111        if (play(l).ge.plev_prof_cas(nlev_cas)) then
5112 
5113        mxcalc=l
5114        print *,'debut interp2, mxcalc=',mxcalc
5115         k1=0
5116         k2=0
5117
5118         if (play(l).le.plev_prof_cas(1)) then
5119
5120         do k = 1, nlev_cas-1
5121          if (play(l).le.plev_prof_cas(k).and. play(l).gt.plev_prof_cas(k+1)) then
5122            k1=k
5123            k2=k+1
5124          endif
5125         enddo
5126
5127         if (k1.eq.0 .or. k2.eq.0) then
5128          write(*,*) 'PB! k1, k2 = ',k1,k2
5129          write(*,*) 'l,play(l) = ',l,play(l)/100
5130         do k = 1, nlev_cas-1
5131          write(*,*) 'k,plev_prof_cas(k) = ',k,plev_prof_cas(k)/100
5132         enddo
5133         endif
5134
5135         frac = (plev_prof_cas(k2)-play(l))/(plev_prof_cas(k2)-plev_prof_cas(k1))
5136         t_mod_cas(l)= t_prof_cas(k2) - frac*(t_prof_cas(k2)-t_prof_cas(k1))
5137         theta_mod_cas(l)= th_prof_cas(k2) - frac*(th_prof_cas(k2)-th_prof_cas(k1))
5138         thv_mod_cas(l)= thv_prof_cas(k2) - frac*(thv_prof_cas(k2)-thv_prof_cas(k1))
5139         thl_mod_cas(l)= thl_prof_cas(k2) - frac*(thl_prof_cas(k2)-thl_prof_cas(k1))
5140         qv_mod_cas(l)= qv_prof_cas(k2) - frac*(qv_prof_cas(k2)-qv_prof_cas(k1))
5141         ql_mod_cas(l)= ql_prof_cas(k2) - frac*(ql_prof_cas(k2)-ql_prof_cas(k1))
5142         qi_mod_cas(l)= qi_prof_cas(k2) - frac*(qi_prof_cas(k2)-qi_prof_cas(k1))
5143         u_mod_cas(l)= u_prof_cas(k2) - frac*(u_prof_cas(k2)-u_prof_cas(k1))
5144         v_mod_cas(l)= v_prof_cas(k2) - frac*(v_prof_cas(k2)-v_prof_cas(k1))
5145         ug_mod_cas(l)= ug_prof_cas(k2) - frac*(ug_prof_cas(k2)-ug_prof_cas(k1))
5146         vg_mod_cas(l)= vg_prof_cas(k2) - frac*(vg_prof_cas(k2)-vg_prof_cas(k1))
5147         w_mod_cas(l)= vitw_prof_cas(k2) - frac*(vitw_prof_cas(k2)-vitw_prof_cas(k1))
5148         omega_mod_cas(l)= omega_prof_cas(k2) - frac*(omega_prof_cas(k2)-omega_prof_cas(k1))
5149         du_mod_cas(l)= du_prof_cas(k2) - frac*(du_prof_cas(k2)-du_prof_cas(k1))
5150         hu_mod_cas(l)= hu_prof_cas(k2) - frac*(hu_prof_cas(k2)-hu_prof_cas(k1))
5151         vu_mod_cas(l)= vu_prof_cas(k2) - frac*(vu_prof_cas(k2)-vu_prof_cas(k1))
5152         dv_mod_cas(l)= dv_prof_cas(k2) - frac*(dv_prof_cas(k2)-dv_prof_cas(k1))
5153         hv_mod_cas(l)= hv_prof_cas(k2) - frac*(hv_prof_cas(k2)-hv_prof_cas(k1))
5154         vv_mod_cas(l)= vv_prof_cas(k2) - frac*(vv_prof_cas(k2)-vv_prof_cas(k1))
5155         dt_mod_cas(l)= dt_prof_cas(k2) - frac*(dt_prof_cas(k2)-dt_prof_cas(k1))
5156         ht_mod_cas(l)= ht_prof_cas(k2) - frac*(ht_prof_cas(k2)-ht_prof_cas(k1))
5157         vt_mod_cas(l)= vt_prof_cas(k2) - frac*(vt_prof_cas(k2)-vt_prof_cas(k1))
5158         dth_mod_cas(l)= dth_prof_cas(k2) - frac*(dth_prof_cas(k2)-dth_prof_cas(k1))
5159         hth_mod_cas(l)= hth_prof_cas(k2) - frac*(hth_prof_cas(k2)-hth_prof_cas(k1))
5160         vth_mod_cas(l)= vth_prof_cas(k2) - frac*(vth_prof_cas(k2)-vth_prof_cas(k1))
5161         dq_mod_cas(l)= dq_prof_cas(k2) - frac*(dq_prof_cas(k2)-dq_prof_cas(k1))
5162         hq_mod_cas(l)= hq_prof_cas(k2) - frac*(hq_prof_cas(k2)-hq_prof_cas(k1))
5163         vq_mod_cas(l)= vq_prof_cas(k2) - frac*(vq_prof_cas(k2)-vq_prof_cas(k1))
5164     
5165         else !play>plev_prof_cas(1)
5166
5167         k1=1
5168         k2=2
5169         print *,'interp2_vert, k1,k2=',plev_prof_cas(k1),plev_prof_cas(k2)
5170         frac1 = (play(l)-plev_prof_cas(k2))/(plev_prof_cas(k1)-plev_prof_cas(k2))
5171         frac2 = (play(l)-plev_prof_cas(k1))/(plev_prof_cas(k1)-plev_prof_cas(k2))
5172         t_mod_cas(l)= frac1*t_prof_cas(k1) - frac2*t_prof_cas(k2)
5173         theta_mod_cas(l)= frac1*th_prof_cas(k1) - frac2*th_prof_cas(k2)
5174         thv_mod_cas(l)= frac1*thv_prof_cas(k1) - frac2*thv_prof_cas(k2)
5175         thl_mod_cas(l)= frac1*thl_prof_cas(k1) - frac2*thl_prof_cas(k2)
5176         qv_mod_cas(l)= frac1*qv_prof_cas(k1) - frac2*qv_prof_cas(k2)
5177         ql_mod_cas(l)= frac1*ql_prof_cas(k1) - frac2*ql_prof_cas(k2)
5178         qi_mod_cas(l)= frac1*qi_prof_cas(k1) - frac2*qi_prof_cas(k2)
5179         u_mod_cas(l)= frac1*u_prof_cas(k1) - frac2*u_prof_cas(k2)
5180         v_mod_cas(l)= frac1*v_prof_cas(k1) - frac2*v_prof_cas(k2)
5181         ug_mod_cas(l)= frac1*ug_prof_cas(k1) - frac2*ug_prof_cas(k2)
5182         vg_mod_cas(l)= frac1*vg_prof_cas(k1) - frac2*vg_prof_cas(k2)
5183         w_mod_cas(l)= frac1*vitw_prof_cas(k1) - frac2*vitw_prof_cas(k2)
5184         omega_mod_cas(l)= frac1*omega_prof_cas(k1) - frac2*omega_prof_cas(k2)
5185         du_mod_cas(l)= frac1*du_prof_cas(k1) - frac2*du_prof_cas(k2)
5186         hu_mod_cas(l)= frac1*hu_prof_cas(k1) - frac2*hu_prof_cas(k2)
5187         vu_mod_cas(l)= frac1*vu_prof_cas(k1) - frac2*vu_prof_cas(k2)
5188         dv_mod_cas(l)= frac1*dv_prof_cas(k1) - frac2*dv_prof_cas(k2)
5189         hv_mod_cas(l)= frac1*hv_prof_cas(k1) - frac2*hv_prof_cas(k2)
5190         vv_mod_cas(l)= frac1*vv_prof_cas(k1) - frac2*vv_prof_cas(k2)
5191         dt_mod_cas(l)= frac1*dt_prof_cas(k1) - frac2*dt_prof_cas(k2)
5192         ht_mod_cas(l)= frac1*ht_prof_cas(k1) - frac2*ht_prof_cas(k2)
5193         vt_mod_cas(l)= frac1*vt_prof_cas(k1) - frac2*vt_prof_cas(k2)
5194         dth_mod_cas(l)= frac1*dth_prof_cas(k1) - frac2*dth_prof_cas(k2)
5195         hth_mod_cas(l)= frac1*hth_prof_cas(k1) - frac2*hth_prof_cas(k2)
5196         vth_mod_cas(l)= frac1*vth_prof_cas(k1) - frac2*vth_prof_cas(k2)
5197         dq_mod_cas(l)= frac1*dq_prof_cas(k1) - frac2*dq_prof_cas(k2)
5198         hq_mod_cas(l)= frac1*hq_prof_cas(k1) - frac2*hq_prof_cas(k2)
5199         vq_mod_cas(l)= frac1*vq_prof_cas(k1) - frac2*vq_prof_cas(k2)
5200
5201         endif ! play.le.plev_prof_cas(1)
5202
5203        else ! above max altitude of forcing file
5204 
5205!jyg
5206         fact=20.*(plev_prof_cas(nlev_cas)-play(l))/plev_prof_cas(nlev_cas) !jyg
5207         fact = max(fact,0.)                                           !jyg
5208         fact = exp(-fact)                                             !jyg
5209         t_mod_cas(l)= t_prof_cas(nlev_cas)                            !jyg
5210         theta_mod_cas(l)= th_prof_cas(nlev_cas)                       !jyg
5211         thv_mod_cas(l)= thv_prof_cas(nlev_cas)                        !jyg
5212         thl_mod_cas(l)= thl_prof_cas(nlev_cas)                        !jyg
5213         qv_mod_cas(l)= qv_prof_cas(nlev_cas)*fact                     !jyg
5214         ql_mod_cas(l)= ql_prof_cas(nlev_cas)*fact                     !jyg
5215         qi_mod_cas(l)= qi_prof_cas(nlev_cas)*fact                     !jyg
5216         u_mod_cas(l)= u_prof_cas(nlev_cas)*fact                       !jyg
5217         v_mod_cas(l)= v_prof_cas(nlev_cas)*fact                       !jyg
5218         ug_mod_cas(l)= ug_prof_cas(nlev_cas)*fact                     !jyg
5219         vg_mod_cas(l)= vg_prof_cas(nlev_cas)*fact                     !jyg
5220         w_mod_cas(l)= 0.0                                             !jyg
5221         du_mod_cas(l)= du_prof_cas(nlev_cas)*fact
5222         hu_mod_cas(l)= hu_prof_cas(nlev_cas)*fact                     !jyg
5223         vu_mod_cas(l)= vu_prof_cas(nlev_cas)*fact                     !jyg
5224         dv_mod_cas(l)= dv_prof_cas(nlev_cas)*fact
5225         hv_mod_cas(l)= hv_prof_cas(nlev_cas)*fact                     !jyg
5226         vv_mod_cas(l)= vv_prof_cas(nlev_cas)*fact                     !jyg
5227         dt_mod_cas(l)= dt_prof_cas(nlev_cas) 
5228         ht_mod_cas(l)= ht_prof_cas(nlev_cas)                          !jyg
5229         vt_mod_cas(l)= vt_prof_cas(nlev_cas)                          !jyg
5230         dth_mod_cas(l)= dth_prof_cas(nlev_cas) 
5231         hth_mod_cas(l)= hth_prof_cas(nlev_cas)                        !jyg
5232         vth_mod_cas(l)= vth_prof_cas(nlev_cas)                        !jyg
5233         dq_mod_cas(l)= dq_prof_cas(nlev_cas)*fact
5234         hq_mod_cas(l)= hq_prof_cas(nlev_cas)*fact                     !jyg
5235         vq_mod_cas(l)= vq_prof_cas(nlev_cas)*fact                     !jyg
5236 
5237        endif ! play
5238 
5239       enddo ! l
5240
5241!       do l = 1,llm
5242!       print *,'t_mod_cas(l),q_mod_cas(l),ht_mod_cas(l),hq_mod_cas(l) ',
5243!     $        l,t_mod_cas(l),q_mod_cas(l),ht_mod_cas(l),hq_mod_cas(l)
5244!       enddo
5245 
5246          return
5247          end
5248!***************************************************************************** 
5249
5250
Note: See TracBrowser for help on using the repository browser.