source: LMDZ4/trunk/libf/phylmd/physiq.F @ 776

Last change on this file since 776 was 776, checked in by Laurent Fairhead, 17 years ago

Suite du merge entre la version et la HEAD: quelques modifications
de Yann sur le

LF

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 117.1 KB
Line 
1!
2! $Header$
3!
4c
5c#define IO_DEBUG
6
7      SUBROUTINE physiq (nlon,nlev,nqmax,
8     .            debut,lafin,rjourvrai,gmtime,pdtphys,
9     .            paprs,pplay,pphi,pphis,presnivs,clesphy0,
10     .            u,v,t,qx,
11     .            omega,
12#ifdef INCA
13     .            flxmass_w,
14#endif
15     .            d_u, d_v, d_t, d_qx, d_ps
16     .            , dudyn
17     .            , PVteta)
18
19      USE ioipsl
20      USE comgeomphy
21      USE write_field_phy
22      USE dimphy
23      USE mod_grid_phy_lmdz
24      USE mod_phys_lmdz_para
25      USE iophy
26      USE misc_mod, mydebug=>debug
27      USE vampir
28      IMPLICIT none
29c======================================================================
30c
31c Auteur(s) Z.X. Li (LMD/CNRS) date: 19930818
32c
33c Objet: Moniteur general de la physique du modele
34cAA      Modifications quant aux traceurs :
35cAA                  -  uniformisation des parametrisations ds phytrac
36cAA                  -  stockage des moyennes des champs necessaires
37cAA                     en mode traceur off-line
38c======================================================================
39c   CLEFS CPP POUR LES IO
40c   =====================
41c#define histhf
42c#define histday
43#define histmth
44c#define histins
45c#define histmthNMC
46c#define histISCCP
47c======================================================================
48c    modif   ( P. Le Van ,  12/10/98 )
49c
50c  Arguments:
51c
52c nlon----input-I-nombre de points horizontaux
53c nlev----input-I-nombre de couches verticales
54c nqmax---input-I-nombre de traceurs (y compris vapeur d'eau) = 1
55c debut---input-L-variable logique indiquant le premier passage
56c lafin---input-L-variable logique indiquant le dernier passage
57c rjour---input-R-numero du jour de l'experience
58c gmtime--input-R-temps universel dans la journee (0 a 86400 s)
59c pdtphys-input-R-pas d'integration pour la physique (seconde)
60c paprs---input-R-pression pour chaque inter-couche (en Pa)
61c pplay---input-R-pression pour le mileu de chaque couche (en Pa)
62c pphi----input-R-geopotentiel de chaque couche (g z) (reference sol)
63c pphis---input-R-geopotentiel du sol
64c presnivs-input_R_pressions approximat. des milieux couches ( en PA)
65c u-------input-R-vitesse dans la direction X (de O a E) en m/s
66c v-------input-R-vitesse Y (de S a N) en m/s
67c t-------input-R-temperature (K)
68c qx------input-R-humidite specifique (kg/kg) et d'autres traceurs
69c d_t_dyn-input-R-tendance dynamique pour "t" (K/s)
70c d_q_dyn-input-R-tendance dynamique pour "q" (kg/kg/s)
71c omega---input-R-vitesse verticale en Pa/s
72cIM comgeomphy.h BEG
73c cuphy----input-R-resolution des mailles en x (m)
74c cvphy----input-R-resolution des mailles en y (m)
75cIM comgeomphy.h END
76c d_u-----output-R-tendance physique de "u" (m/s/s)
77c d_v-----output-R-tendance physique de "v" (m/s/s)
78c d_t-----output-R-tendance physique de "t" (K/s)
79c d_qx----output-R-tendance physique de "qx" (kg/kg/s)
80c d_ps----output-R-tendance physique de la pression au sol
81cIM
82c PVteta--output-R-vorticite potentielle a des thetas constantes
83c======================================================================
84#include "dimensions.h"
85      integer jjmp1
86      parameter (jjmp1=jjm+1-1/jjm)
87      integer iip1
88      parameter (iip1=iim+1)
89cym#include "dimphy.h"
90#include "regdim.h"
91#include "indicesol.h"
92#include "dimsoil.h"
93#include "clesphys.h"
94#include "control.h"
95#include "logic.h"
96#include "temps.h"
97cym#include "comgeomphy.h"
98#include "advtrac.h"
99#include "iniprint.h"
100#include "thermcell.h"
101c======================================================================
102      LOGICAL ok_cvl  ! pour activer le nouveau driver pour convection KE
103      PARAMETER (ok_cvl=.TRUE.)
104      LOGICAL ok_gust ! pour activer l'effet des gust sur flux surface
105      PARAMETER (ok_gust=.FALSE.)
106c======================================================================
107      LOGICAL check ! Verifier la conservation du modele en eau
108      PARAMETER (check=.FALSE.)
109      LOGICAL ok_stratus ! Ajouter artificiellement les stratus
110      PARAMETER (ok_stratus=.FALSE.)
111c======================================================================
112c Parametres lies au coupleur OASIS:
113#include "oasis.h"
114      INTEGER,SAVE :: npas, nexca
115c$OMP THREADPRIVATE(npas, nexca)
116      logical rnpb
117#ifdef INCA
118      parameter(rnpb=.false.)
119#else
120      parameter(rnpb=.true.)
121#endif
122c      ocean = type de modele ocean a utiliser: force, slab, couple
123      character*6 ocean
124      SAVE ocean
125c$OMP THREADPRIVATE(ocean)
126c      parameter (ocean = 'force ')
127c     parameter (ocean = 'couple')
128      logical ok_ocean
129      SAVE ok_ocean
130c$OMP THREADPRIVATE(ok_ocean)
131c
132cIM "slab" ocean
133      REAL tslab(klon)    !Temperature du slab-ocean
134      REAL seaice(klon)   !glace de mer (kg/m2)
135      REAL fluxo(klon)    !flux turbulents ocean-glace de mer
136      REAL fluxg(klon)    !flux turbulents ocean-atmosphere
137      REAL amn, amx
138c======================================================================
139c Clef controlant l'activation du cycle diurne:
140ccc      LOGICAL cycle_diurne
141ccc      PARAMETER (cycle_diurne=.FALSE.)
142c======================================================================
143c Modele thermique du sol, a activer pour le cycle diurne:
144ccc      LOGICAL soil_model
145ccc      PARAMETER (soil_model=.FALSE.)
146      logical ok_veget
147      save ok_veget
148c$OMP THREADPRIVATE(ok_veget)
149c     parameter (ok_veget = .true.)
150c      parameter (ok_veget = .false.)
151c======================================================================
152c Dans les versions precedentes, l'eau liquide nuageuse utilisee dans
153c le calcul du rayonnement est celle apres la precipitation des nuages.
154c Si cette cle new_oliq est activee, ce sera une valeur moyenne entre
155c la condensation et la precipitation. Cette cle augmente les impacts
156c radiatifs des nuages.
157ccc      LOGICAL new_oliq
158ccc      PARAMETER (new_oliq=.FALSE.)
159c======================================================================
160c Clefs controlant deux parametrisations de l'orographie:
161cc      LOGICAL ok_orodr
162ccc      PARAMETER (ok_orodr=.FALSE.)
163ccc      LOGICAL ok_orolf
164ccc      PARAMETER (ok_orolf=.FALSE.)
165c======================================================================
166      LOGICAL ok_journe ! sortir le fichier journalier
167      save ok_journe
168c$OMP THREADPRIVATE(ok_journe)
169c      PARAMETER (ok_journe=.true.)
170c
171      LOGICAL ok_mensuel ! sortir le fichier mensuel
172      save ok_mensuel
173c$OMP THREADPRIVATE(ok_mensuel)
174c      PARAMETER (ok_mensuel=.true.)
175c
176      LOGICAL ok_instan ! sortir le fichier instantane
177      save ok_instan
178c$OMP THREADPRIVATE(ok_instan)
179c      PARAMETER (ok_instan=.true.)
180c
181      LOGICAL ok_region ! sortir le fichier regional
182      PARAMETER (ok_region=.FALSE.)
183c======================================================================
184c     pour phsystoke avec thermiques
185      REAL fm_therm(klon,klev+1)
186      REAL entr_therm(klon,klev)
187      real,allocatable,save :: q2(:,:,:)
188c$OMP THREADPRIVATE(q2)
189cym      save q2
190c======================================================================
191c
192      INTEGER ivap          ! indice de traceurs pour vapeur d'eau
193      PARAMETER (ivap=1)
194      INTEGER iliq          ! indice de traceurs pour eau liquide
195      PARAMETER (iliq=2)
196
197c
198c
199c Variables argument:
200c
201      INTEGER nlon
202      INTEGER nlev
203      INTEGER nqmax
204      REAL rjourvrai
205      REAL gmtime
206      REAL pdtphys
207      LOGICAL debut, lafin
208      REAL paprs(klon,klev+1)
209      REAL pplay(klon,klev)
210      REAL pphi(klon,klev)
211      REAL pphis(klon)
212      REAL presnivs(klev)
213      REAL znivsig(klev)
214      REAL zsurf(nbsrf)
215      INTEGER kinv
216      real pir
217
218      REAL u(klon,klev)
219      REAL v(klon,klev)
220      REAL t(klon,klev)
221      REAL qx(klon,klev,nqmax)
222
223      REAL,allocatable,save :: t_ancien(:,:), q_ancien(:,:)
224c$OMP THREADPRIVATE(t_ancien, q_ancien)
225cym      SAVE t_ancien, q_ancien
226      LOGICAL ancien_ok
227      SAVE ancien_ok
228c$OMP THREADPRIVATE(ancien_ok)
229      REAL d_t_dyn(klon,klev)
230      REAL d_q_dyn(klon,klev)
231
232      REAL omega(klon,klev)
233
234#ifdef INCA
235      REAL flxmass_w(klon,klev)
236#endif
237      REAL d_u(klon,klev)
238      REAL d_v(klon,klev)
239      REAL d_t(klon,klev)
240      REAL d_qx(klon,klev,nqmax)
241      REAL d_ps(klon)
242      real da(klon,klev),phi(klon,klev,klev),mp(klon,klev)
243c
244cIM Amip2 PV a theta constante
245c
246      INTEGER nbteta
247      PARAMETER(nbteta=3)
248      CHARACTER*3 ctetaSTD(nbteta)
249      DATA ctetaSTD/'350','380','405'/
250      SAVE ctetaSTD
251c$OMP THREADPRIVATE(ctetaSTD)
252      REAL rtetaSTD(nbteta)
253      DATA rtetaSTD/350., 380., 405./
254      SAVE rtetaSTD
255c$OMP THREADPRIVATE(rtetaSTD)     
256c
257      REAL PVteta(klon,nbteta)
258      REAL zx_tmp_3dte(iim,jjmp1,nbteta)
259c
260cMI Amip2 PV a theta constante
261
262cym      INTEGER klevp1, klevm1
263cym      PARAMETER(klevp1=klev+1,klevm1=klev-1)
264cym#include "raddim.h"
265c
266
267      REAL,allocatable,save :: swdn0(:,:), swdn(:,:)
268      REAL,allocatable,save :: swup0(:,:), swup(:,:)
269c$OMP THREADPRIVATE(swdn0 , swdn, swup0, swup)
270cym      SAVE swdn0 , swdn, swup0, swup
271c
272      REAL,allocatable,save :: SWdn200clr(:), SWdn200(:)
273      REAL,allocatable,save :: SWup200clr(:), SWup200(:)
274c$OMP THREADPRIVATE(SWdn200clr, SWdn200, SWup200clr, SWup200)
275cym      SAVE SWdn200clr, SWdn200, SWup200clr, SWup200
276c
277      REAL,allocatable,save :: lwdn0(:,:), lwdn(:,:)
278      REAL,allocatable,save :: lwup0(:,:), lwup(:,:)
279c$OMP THREADPRIVATE(lwdn0 , lwdn, lwup0, lwup)
280cym      SAVE lwdn0 , lwdn, lwup0, lwup
281c
282      REAL,allocatable,save :: LWdn200clr(:), LWdn200(:)
283      REAL,allocatable,save :: LWup200clr(:), LWup200(:)
284c$OMP THREADPRIVATE(LWdn200clr, LWdn200, LWup200clr, LWup200)
285cym      SAVE LWdn200clr, LWdn200, LWup200clr, LWup200
286c
287      REAL,allocatable,save :: LWdnTOA(:), LWdnTOAclr(:)
288c$OMP THREADPRIVATE(LWdnTOA, LWdnTOAclr)
289cym      SAVE LWdnTOA, LWdnTOAclr
290c
291cIM Amip2
292c variables a une pression donnee
293c
294      integer nlevSTD
295      PARAMETER(nlevSTD=17)
296      real rlevSTD(nlevSTD)
297      DATA rlevSTD/100000., 92500., 85000., 70000.,
298     .60000., 50000., 40000., 30000., 25000., 20000.,
299     .15000., 10000., 7000., 5000., 3000., 2000., 1000./
300      SAVE rlevstd
301c$OMP THREADPRIVATE(rlevSTD)
302      CHARACTER*4 clevSTD(nlevSTD)
303      DATA clevSTD/'1000','925 ','850 ','700 ','600 ',
304     .'500 ','400 ','300 ','250 ','200 ','150 ','100 ',
305     .'70  ','50  ','30  ','20  ','10  '/
306      SAVE clevSTD
307c$OMP THREADPRIVATE(clevSTD)
308c
309      CHARACTER*3 bb2
310      CHARACTER*2 bb3
311c
312      real tlevSTD(klon,nlevSTD), qlevSTD(klon,nlevSTD)
313      real rhlevSTD(klon,nlevSTD), philevSTD(klon,nlevSTD)
314      real ulevSTD(klon,nlevSTD), vlevSTD(klon,nlevSTD)
315      real wlevSTD(klon,nlevSTD)
316c
317c nout : niveau de output des variables a une pression donnee
318      INTEGER nout
319      PARAMETER(nout=3) !nout=1 : day; =2 : mth; =3 : NMC
320c
321      REAL,SAVE,ALLOCATABLE :: tsumSTD(:,:,:)
322      REAL,SAVE,ALLOCATABLE :: usumSTD(:,:,:), vsumSTD(:,:,:)
323      REAL,SAVE,ALLOCATABLE :: wsumSTD(:,:,:), phisumSTD(:,:,:)
324      REAL,SAVE,ALLOCATABLE :: qsumSTD(:,:,:), rhsumSTD(:,:,:)
325c
326cym      SAVE tsumSTD, usumSTD, vsumSTD, wsumSTD, phisumSTD,
327cym     .     qsumSTD, rhsumSTD
328c$OMP THREADPRIVATE(tsumSTD, usumSTD, vsumSTD, wsumSTD, phisumSTD)
329c$OMP THREADPRIVATE(qsumSTD, rhsumSTD)
330c
331      logical oknondef(klon,nlevSTD,nout)
332      real,SAVE,ALLOCATABLE :: tnondef(:,:,:)
333c$OMP THREADPRIVATE(tnondef)
334cym      save tnondef
335c
336c les produits uvSTD, vqSTD, .., T2STD sont calcules
337c a partir des valeurs instantannees toutes les 6 h
338c qui sont moyennees sur le mois
339c
340      real uvSTD(klon,nlevSTD)
341      real vqSTD(klon,nlevSTD)
342      real vTSTD(klon,nlevSTD)
343      real wqSTD(klon,nlevSTD)
344c
345      real,save,allocatable :: uvsumSTD(:,:,:)
346      real,save,allocatable :: vqsumSTD(:,:,:)
347      real,save,allocatable :: vTsumSTD(:,:,:)
348      real,save,allocatable :: wqsumSTD(:,:,:)
349c
350      real vphiSTD(klon,nlevSTD)
351      real wTSTD(klon,nlevSTD)
352      real u2STD(klon,nlevSTD)
353      real v2STD(klon,nlevSTD)
354      real T2STD(klon,nlevSTD)
355c
356      real,save,allocatable :: vphisumSTD(:,:,:)
357      real,save,allocatable :: wTsumSTD(:,:,:)
358      real,save,allocatable :: u2sumSTD(:,:,:)
359      real,save,allocatable :: v2sumSTD(:,:,:)
360      real,save,allocatable :: T2sumSTD(:,:,:)
361c
362cym      SAVE uvsumSTD, vqsumSTD, vTsumSTD, wqsumSTD
363cym      SAVE vphisumSTD, wTsumSTD, u2sumSTD, v2sumSTD, T2sumSTD
364c$OMP THREADPRIVATE(uvsumSTD, vqsumSTD, vTsumSTD, wqsumSTD)
365c$OMP THREADPRIVATE(vphisumSTD, wTsumSTD, u2sumSTD, v2sumSTD, T2sumSTD)
366
367cMI Amip2
368c
369#include "radepsi.h"
370#include "radopt.h"
371c
372c
373c prw: precipitable water
374      real prw(klon)
375
376      REAL convliq(klon,klev)  ! eau liquide nuageuse convective
377      REAL convfra(klon,klev)  ! fraction nuageuse convective
378
379      REAL cldl_c(klon),cldm_c(klon),cldh_c(klon) !nuages bas, moyen et haut
380      REAL cldt_c(klon),cldq_c(klon) !nuage total, eau liquide integree
381      REAL cldl_s(klon),cldm_s(klon),cldh_s(klon) !nuages bas, moyen et haut
382      REAL cldt_s(klon),cldq_s(klon) !nuage total, eau liquide integree
383
384      INTEGER linv, kp1
385c flwp, fiwp = Liquid Water Path & Ice Water Path (kg/m2)
386c flwc, fiwc = Liquid Water Content & Ice Water Content (kg/kg)
387      REAL flwp(klon), fiwp(klon)
388      REAL flwc(klon,klev), fiwc(klon,klev)
389      REAL flwp_c(klon), fiwp_c(klon)
390      REAL flwc_c(klon,klev), fiwc_c(klon,klev)
391      REAL flwp_s(klon), fiwp_s(klon)
392      REAL flwc_s(klon,klev), fiwc_s(klon,klev)
393
394cIM ISCCP simulator v3.4
395c dans clesphys.h top_height, overlap
396cv3.4
397      INTEGER debug, debugcol
398cym      INTEGER npoints
399cym      PARAMETER(npoints=klon)
400c
401      INTEGER sunlit(klon) !sunlit=1 if day; sunlit=0 if night
402      INTEGER nregISCtot
403      PARAMETER(nregISCtot=1)
404c
405c imin_debut, nbpti, jmin_debut, nbptj : parametres pour sorties sur 1 region rectangulaire
406c y compris pour 1 point
407c imin_debut : indice minimum de i; nbpti : nombre de points en direction i (longitude)
408c jmin_debut : indice minimum de j; nbptj : nombre de points en direction j (latitude)
409      INTEGER imin_debut, nbpti
410      INTEGER jmin_debut, nbptj
411cIM parametres ISCCP BEG
412      INTEGER nbapp_isccp,isccppas
413      INTEGER n, napisccp
414c     PARAMETER(napisccp=3)
415      PARAMETER(napisccp=1)
416      INTEGER ifreq_isccp(napisccp), freqin_pdt(napisccp)
417      DATA ifreq_isccp/3/
418      SAVE ifreq_isccp
419c$OMP THREADPRIVATE(ifreq_isccp)
420      CHARACTER*5 typinout(napisccp)
421      DATA typinout/'i3od'/
422      SAVE typinout
423c$OMP THREADPRIVATE(typinout)
424cIM verif boxptop BEG
425      CHARACTER*1 verticaxe(napisccp)
426      DATA verticaxe/'1'/
427      SAVE verticaxe
428c$OMP THREADPRIVATE(verticaxe)
429cIM verif boxptop END
430      INTEGER nvlev(napisccp)
431c     INTEGER nvlev
432      REAL t1, aa
433      REAL seed_re(klon,napisccp)
434      INTEGER,ALLOCATABLE,SAVE :: seed_old(:,:)
435cym      SAVE seed_old
436c$OMP THREADPRIVATE(seed_old)
437cym !!!! A voir plus tard
438cym      INTEGER iphy(iim,jjmp1)
439cIM parametres ISCCP END
440c
441c ncol = nb. de sous-colonnes pour chaque maille du GCM
442c ncolmx = No. max. de sous-colonnes pour chaque maille du GCM
443c      INTEGER ncol(napisccp), ncolmx, seed(klon,napisccp)
444      INTEGER,SAVE :: ncol(napisccp)
445      INTEGER ncolmx, seed(klon,napisccp)
446      REAL nbsunlit(nregISCtot,klon,napisccp)  !nbsunlit : moyenne de sunlit
447      PARAMETER(ncolmx=350)
448c
449cIM verif boxptop BEG
450      REAL vertlev(ncolmx,napisccp)
451cIM verif boxptop END
452c
453      REAL,SAVE :: tautab_omp(0:255),tautab(0:255)
454      INTEGER,SAVE :: invtau_omp(-20:45000),invtau(-20:45000)
455c$OMP THREADPRIVATE(tautab,invtau)
456      REAL emsfc_lw
457      PARAMETER(emsfc_lw=0.99)
458c     REAL    ran0                      ! type for random number fuction
459c
460      REAL cldtot(klon,klev)
461c variables de haut en bas pour le simulateur ISCCP
462      REAL dtau_s(klon,klev) !tau nuages startiformes
463      REAL dtau_c(klon,klev) !tau nuages convectifs
464      REAL dem_s(klon,klev)  !emissivite nuages startiformes
465      REAL dem_c(klon,klev)  !emissivite nuages convectifs
466c
467c variables de haut en bas pour le simulateur ISCCP
468      REAL pfull(klon,klev)
469      REAL phalf(klon,klev+1)
470      REAL qv(klon,klev)
471      REAL cc(klon,klev)
472      REAL conv(klon,klev)
473      REAL dtau_sH2B(klon,klev)
474      REAL dtau_cH2B(klon,klev)
475      REAL at(klon,klev)
476      REAL dem_sH2B(klon,klev)
477      REAL dem_cH2B(klon,klev)
478c
479      INTEGER kmax, lmax, lmax3
480      PARAMETER(kmax=8, lmax=8, lmax3=3)
481      INTEGER kmaxm1, lmaxm1
482      PARAMETER(kmaxm1=kmax-1, lmaxm1=lmax-1)
483      INTEGER iimx7, jjmx7, jjmp1x7
484      PARAMETER(iimx7=iim*kmaxm1, jjmx7=jjm*lmaxm1,
485     .jjmp1x7=jjmp1*lmaxm1)
486c
487c output from ISCCP simulator
488      REAL fq_isccp(klon,kmaxm1,lmaxm1,napisccp)
489      REAL fq_is_true(klon,kmaxm1,lmaxm1,napisccp)
490      REAL totalcldarea(klon,napisccp)
491      REAL meanptop(klon,napisccp)
492      REAL meantaucld(klon,napisccp)
493      REAL boxtau(klon,ncolmx,napisccp)
494      REAL boxptop(klon,ncolmx,napisccp)
495      REAL zx_tmp_fi3d_bx(klon,ncolmx)
496      REAL zx_tmp_3d_bx(iim,jjmp1,ncolmx)
497c
498      REAL cld_fi3d(klon,lmax3)
499      REAL cld_3d(iim,jjmp1,lmax3)
500c
501      INTEGER iw, iwmax
502      REAL wmin, pas_w
503c     PARAMETER(wmin=-100.,pas_w=10.,iwmax=30)
504cIM 051005     PARAMETER(wmin=-200.,pas_w=10.,iwmax=40)
505      PARAMETER(wmin=-100.,pas_w=10.,iwmax=20)
506      REAL o500(klon)
507c
508cIM: nbregdyn = nbre regions pour calculs statistiques sur output du ISCCP
509cIM: dynamiques 
510      INTEGER nreg, nbregdyn
511      PARAMETER(nbregdyn=5)
512
513      INTEGER linv
514      INTEGER,ALLOCATABLE,SAVE :: pct_ocean(:,:)
515c$OMP THREADPRIVATE(pct_ocean)
516cym      SAVE pct_ocean
517 
518c sorties ISCCP
519
520      integer nid_isccp
521      save nid_isccp       
522c$OMP THREADPRIVATE(nid_isccp)
523
524c     data ok_isccp,ecrit_isccp/.true.,0.125/     
525c     data ok_isccp,ecrit_isccp/.true.,1./     
526cIM 190504     data ok_isccp/.true./     
527cIM 190504 #else
528cIM 190504     data ok_isccp/.false./
529cIM 190504 #endif
530
531      REAL zx_tau(kmaxm1), zx_pc(lmaxm1), zx_o500(iwmax)
532      DATA zx_tau/0.0, 0.3, 1.3, 3.6, 9.4, 23., 60./
533      SAVE zx_tau
534cIM bad 151205     DATA zx_pc/50., 180., 310., 440., 560., 680., 800./
535      DATA zx_pc/180., 310., 440., 560., 680., 800., 1000./
536      SAVE zx_pc
537c$OMP THREADPRIVATE(zx_tau,zx_pc)
538c cldtopres pression au sommet des nuages
539      REAL cldtopres(lmaxm1), cldtopres3(lmax3)
540      DATA cldtopres/180., 310., 440., 560., 680., 800., 1000./
541      DATA cldtopres3/440., 680., 1000./
542      SAVE cldtopres,cldtopres3
543c$OMP THREADPRIVATE(cldtopres,cldtopres3)
544cIM 051005 BEG
545      REAL tmp_his1_3d(iwmax,kmaxm1,lmaxm1,nbregdyn,napisccp)
546      REAL tmp_his2_3d(iwmax,kmaxm1,lmaxm1,nbregdyn,napisccp)
547      REAL tmp_his3_3d(iwmax,kmaxm1,lmaxm1,nbregdyn,napisccp)
548      INTEGER komega, nhoriRD
549
550c taulev: numero du niveau de tau dans les sorties ISCCP
551      CHARACTER *4 taulev(kmaxm1)
552c     DATA taulev/'tau1','tau2','tau3','tau4','tau5','tau6','tau7'/
553      DATA taulev/'tau0','tau1','tau2','tau3','tau4','tau5','tau6'/
554      CHARACTER *3 pclev(lmaxm1)
555      DATA pclev/'pc1','pc2','pc3','pc4','pc5','pc6','pc7'/
556      SAVE taulev,pclev
557c$OMP THREADPRIVATE(taulev,pclev)
558c
559c cnameisccp
560      CHARACTER *27 cnameisccp(lmaxm1,kmaxm1)
561cIM bad 151205     DATA cnameisccp/'pc< 50hPa, tau< 0.3',
562      DATA cnameisccp/'pc= 50-180hPa, tau< 0.3',
563     .                'pc= 180-310hPa, tau< 0.3',
564     .                'pc= 310-440hPa, tau< 0.3',
565     .                'pc= 440-560hPa, tau< 0.3',
566     .                'pc= 560-680hPa, tau< 0.3',
567     .                'pc= 680-800hPa, tau< 0.3',
568     .                'pc= 800-1000hPa, tau< 0.3',
569     .                'pc= 50-180hPa, tau= 0.3-1.3',
570     .                'pc= 180-310hPa, tau= 0.3-1.3',
571     .                'pc= 310-440hPa, tau= 0.3-1.3',
572     .                'pc= 440-560hPa, tau= 0.3-1.3',
573     .                'pc= 560-680hPa, tau= 0.3-1.3',
574     .                'pc= 680-800hPa, tau= 0.3-1.3',
575     .                'pc= 800-1000hPa, tau= 0.3-1.3',
576     .                'pc= 50-180hPa, tau= 1.3-3.6',
577     .                'pc= 180-310hPa, tau= 1.3-3.6',
578     .                'pc= 310-440hPa, tau= 1.3-3.6',
579     .                'pc= 440-560hPa, tau= 1.3-3.6',
580     .                'pc= 560-680hPa, tau= 1.3-3.6',
581     .                'pc= 680-800hPa, tau= 1.3-3.6',
582     .                'pc= 800-1000hPa, tau= 1.3-3.6',
583     .                'pc= 50-180hPa, tau= 3.6-9.4',
584     .                'pc= 180-310hPa, tau= 3.6-9.4',
585     .                'pc= 310-440hPa, tau= 3.6-9.4',
586     .                'pc= 440-560hPa, tau= 3.6-9.4',
587     .                'pc= 560-680hPa, tau= 3.6-9.4',
588     .                'pc= 680-800hPa, tau= 3.6-9.4',
589     .                'pc= 800-1000hPa, tau= 3.6-9.4',
590     .                'pc= 50-180hPa, tau= 9.4-23',
591     .                'pc= 180-310hPa, tau= 9.4-23',
592     .                'pc= 310-440hPa, tau= 9.4-23',
593     .                'pc= 440-560hPa, tau= 9.4-23',
594     .                'pc= 560-680hPa, tau= 9.4-23',
595     .                'pc= 680-800hPa, tau= 9.4-23',
596     .                'pc= 800-1000hPa, tau= 9.4-23',
597     .                'pc= 50-180hPa, tau= 23-60',
598     .                'pc= 180-310hPa, tau= 23-60',
599     .                'pc= 310-440hPa, tau= 23-60',
600     .                'pc= 440-560hPa, tau= 23-60',
601     .                'pc= 560-680hPa, tau= 23-60',
602     .                'pc= 680-800hPa, tau= 23-60',
603     .                'pc= 800-1000hPa, tau= 23-60',
604     .                'pc= 50-180hPa, tau> 60.',
605     .                'pc= 180-310hPa, tau> 60.',
606     .                'pc= 310-440hPa, tau> 60.',
607     .                'pc= 440-560hPa, tau> 60.',
608     .                'pc= 560-680hPa, tau> 60.',
609     .                'pc= 680-800hPa, tau> 60.',
610     .                'pc= 800-1000hPa, tau> 60.'/
611       SAVE cnameisccp
612c$OMP THREADPRIVATE(cnameisccp)
613c
614c     REAL zx_lonx7(iimx7), zx_latx7(jjmp1x7)
615c     INTEGER nhorix7
616cIM: region='3d' <==> sorties en global
617      CHARACTER*3 region
618      PARAMETER(region='3d')
619c
620cIM ISCCP simulator v3.4
621c
622      logical ok_hf
623c
624      integer nid_hf, nid_hf3d
625      save ok_hf, nid_hf, nid_hf3d
626c$OMP THREADPRIVATE(ok_hf, nid_hf, nid_hf3d)
627c  QUESTION : noms de variables ?
628
629#ifdef histhf
630      data ok_hf/.true./
631#else
632      data ok_hf/.false./
633#endif
634      INTEGER        longcles
635      PARAMETER    ( longcles = 20 )
636      REAL clesphy0( longcles      )
637c
638c Variables quasi-arguments
639c
640      REAL xjour
641      SAVE xjour
642c$OMP THREADPRIVATE(xjour)
643c
644c
645c Variables propres a la physique
646c
647      REAL dtime
648      SAVE dtime                  ! pas temporel de la physique
649c$OMP THREADPRIVATE(dtime)
650c
651      INTEGER radpas
652      SAVE radpas                 ! frequence d'appel rayonnement
653c$OMP THREADPRIVATE(radpas)
654c
655      REAL,allocatable,save :: radsol(:)
656c$OMP THREADPRIVATE(radsol)
657cym      SAVE radsol               ! bilan radiatif au sol calcule par code radiatif
658c
659      REAL,allocatable,save :: rlat(:)
660c$OMP THREADPRIVATE(rlat)
661cym      SAVE rlat                   ! latitude pour chaque point
662c
663      REAL,allocatable,save :: rlon(:)
664c$OMP THREADPRIVATE(rlon)
665cym      SAVE rlon                   ! longitude pour chaque point
666
667      REAL,SAVE,ALLOCATABLE :: rlonPOS(:)
668c$OMP THREADPRIVATE(rlonPOS)   
669cym      SAVE rlonPOS                ! longitudes > 0. pour chaque point
670c
671cc      INTEGER iflag_con
672cc      SAVE iflag_con              ! indicateur de la convection
673c
674      INTEGER itap
675      SAVE itap                   ! compteur pour la physique
676c$OMP THREADPRIVATE(itap)
677c
678      REAL co2_ppm_etat0
679c
680      REAL solaire_etat0
681c
682      real slp(klon) ! sea level pressure
683
684      REAL,allocatable,save :: ftsol(:,:)
685c$OMP THREADPRIVATE(ftsol)
686cym      SAVE ftsol                  ! temperature du sol
687
688cIM
689      REAL,SAVE,ALLOCATABLE :: newsst(:) !temperature de l'ocean
690c$OMP THREADPRIVATE(newsst)
691cym     SAVE newsst
692c
693      REAL,allocatable,save :: ftsoil(:,:,:)
694c$OMP THREADPRIVATE(ftsoil)
695cym      SAVE ftsoil                 ! temperature dans le sol
696c
697      REAL,allocatable,save :: fevap(:,:)
698c$OMP THREADPRIVATE(fevap)
699cym      SAVE fevap                 ! evaporation
700      REAL,allocatable,save :: fluxlat(:,:)
701c$OMP THREADPRIVATE(fluxlat)
702cym      SAVE fluxlat
703c
704      REAL,allocatable,save :: deltat(:)
705c$OMP THREADPRIVATE(deltat)
706cym      SAVE deltat                 ! ecart avec la SST de reference
707c
708      REAL,allocatable,save :: fqsurf(:,:)
709c$OMP THREADPRIVATE(fqsurf)
710cym      SAVE fqsurf                 ! humidite de l'air au contact de la surface
711c
712      REAL,allocatable,save :: qsol(:)
713c$OMP THREADPRIVATE(qsol)
714cym      SAVE qsol                  ! hauteur d'eau dans le sol
715c
716      REAL,allocatable,save :: fsnow(:,:)
717c$OMP THREADPRIVATE(fsnow)
718cym      SAVE fsnow                  ! epaisseur neigeuse
719c
720      REAL,allocatable,save :: falbe(:,:)
721c$OMP THREADPRIVATE(falbe)
722cym      SAVE falbe                  ! albedo par type de surface
723      REAL,allocatable,save :: falblw(:,:)
724c$OMP THREADPRIVATE(falblw)     
725cym      SAVE falblw                 ! albedo par type de surface
726
727c
728c
729c  Parametres de l'Orographie a l'Echelle Sous-Maille (OESM):
730c
731      REAL,allocatable,save :: zmea(:)
732c$OMP THREADPRIVATE(zmea)
733cym      SAVE zmea                   ! orographie moyenne
734c
735      REAL,allocatable,save :: zstd(:)
736c$OMP THREADPRIVATE(zstd)
737cym      SAVE zstd                   ! deviation standard de l'OESM
738c
739      REAL,allocatable,save :: zsig(:)
740c$OMP THREADPRIVATE(zsig)
741cym      SAVE zsig                   ! pente de l'OESM
742c
743      REAL,allocatable,save :: zgam(:)
744c$OMP THREADPRIVATE(zgam)
745cym      save zgam                   ! anisotropie de l'OESM
746c
747      REAL,allocatable,save :: zthe(:)
748c$OMP THREADPRIVATE(zthe)     
749cym      SAVE zthe                   ! orientation de l'OESM
750c
751      REAL,allocatable,save :: zpic(:)
752c$OMP THREADPRIVATE(zpic)
753cym      SAVE zpic                   ! Maximum de l'OESM
754c
755      REAL,allocatable,save :: zval(:)
756c$OMP THREADPRIVATE(zval)
757cym      SAVE zval                   ! Minimum de l'OESM
758c
759      REAL,allocatable,save :: rugoro(:)
760c$OMP THREADPRIVATE(rugoro)
761cym      SAVE rugoro                 ! longueur de rugosite de l'OESM
762c
763cIM 141004     REAL zulow(klon),zvlow(klon),zustr(klon), zvstr(klon)
764      REAL zulow(klon),zvlow(klon)
765c
766      REAL,allocatable,save :: zuthe(:),zvthe(:)
767c$OMP THREADPRIVATE(zuthe,zvthe)
768cym      SAVE zuthe
769cym      SAVE zvthe
770      INTEGER igwd,idx(klon),itest(klon)
771c
772      REAL,allocatable,save :: agesno(:,:)
773c$OMP THREADPRIVATE(agesno)
774cym      SAVE agesno                 ! age de la neige
775c
776      REAL,allocatable,save :: alb_neig(:)
777c$OMP THREADPRIVATE(alb_neig)
778cym      SAVE alb_neig               ! albedo de la neige
779c
780      REAL,allocatable,save :: run_off_lic_0(:)
781c$OMP THREADPRIVATE(run_off_lic_0)
782cym      SAVE run_off_lic_0
783cKE43
784c Variables liees a la convection de K. Emanuel (sb):
785c
786      REAL,allocatable,save :: ema_workcbmf(:)   ! cloud base mass flux
787c$OMP THREADPRIVATE(ema_workcbmf)
788cym      SAVE ema_workcbmf
789
790      REAL,allocatable,save :: ema_cbmf(:)       ! cloud base mass flux
791c$OMP THREADPRIVATE(ema_cbmf)
792cym      SAVE ema_cbmf
793
794      REAL,allocatable,save :: ema_pcb(:)        ! cloud base pressure
795c$OMP THREADPRIVATE(ema_pcb)
796cym      SAVE ema_pcb
797
798      REAL,allocatable,save :: ema_pct(:)        ! cloud top pressure
799c$OMP THREADPRIVATE(ema_pct)
800cym      SAVE ema_pct
801
802      REAL bas, top             ! cloud base and top levels
803      SAVE bas
804      SAVE top
805c$OMP THREADPRIVATE(bas, top)
806
807      REAL,allocatable,save :: Ma(:,:)        ! undilute upward mass flux
808c$OMP THREADPRIVATE(Ma)
809cym      SAVE Ma
810      REAL,allocatable,save :: qcondc(:,:)    ! in-cld water content from convect
811c$OMP THREADPRIVATE(qcondc)
812cym      SAVE qcondc
813      REAL,allocatable,save :: ema_work1(:, :), ema_work2(:, :)
814c$OMP THREADPRIVATE(ema_work1,ema_work2)
815cym      SAVE ema_work1, ema_work2
816      REAL wdn(klon), tdn(klon), qdn(klon)
817
818      REAL,allocatable,save :: wd(:) ! sb
819c$OMP THREADPRIVATE(wd)
820cym      SAVE wd       ! sb
821
822c Variables locales pour la couche limite (al1):
823c
824cAl1      REAL pblh(klon)           ! Hauteur de couche limite
825cAl1      SAVE pblh
826c34EK
827c
828c Variables locales:
829c
830      REAL cdragh(klon) ! drag coefficient pour T and Q
831      REAL cdragm(klon) ! drag coefficient pour vent
832cAA
833cAA  Pour phytrac
834cAA
835      REAL ycoefh(klon,klev)    ! coef d'echange pour phytrac
836      REAL yu1(klon)            ! vents dans la premiere couche U
837      REAL yv1(klon)            ! vents dans la premiere couche V
838      REAL,SAVE,ALLOCATABLE :: ffonte(:,:)    !Flux thermique utilise pour fondre la neige
839c$OMP THREADPRIVATE(ffonte)
840      REAL,SAVE,ALLOCATABLE :: fqcalving(:,:) !Flux d'eau "perdu" par la surface
841c$OMP THREADPRIVATE(fqcalving)
842      REAL,SAVE,ALLOCATABLE :: fqfonte(:,:)  !Quantite d'eau de fonte des glaciers
843c$OMP THREADPRIVATE(fqfonte)
844c                               !et necessaire pour limiter la
845c                               !hauteur de neige, en kg/m2/s
846      REAL zxffonte(klon), zxfqcalving(klon),zxfqfonte(klon)
847
848c@$$      LOGICAL offline           ! Controle du stockage ds "physique"
849c@$$      PARAMETER (offline=.false.)
850c@$$      INTEGER physid
851      REAL,allocatable,save :: pfrac_impa(:,:)! Produits des coefs lessivage impaction
852c$OMP THREADPRIVATE(pfrac_impa)
853cym      save pfrac_impa
854      REAL,allocatable,save :: pfrac_nucl(:,:)! Produits des coefs lessivage nucleation
855c$OMP THREADPRIVATE(pfrac_nucl)
856cym      save pfrac_nucl
857      REAL,allocatable,save :: pfrac_1nucl(:,:)! Produits des coefs lessi nucl (alpha = 1)
858c$OMP THREADPRIVATE(pfrac_1nucl)
859cym      save pfrac_1nucl
860      REAL frac_impa(klon,klev) ! fractions d'aerosols lessivees (impaction)
861      REAL frac_nucl(klon,klev) ! idem (nucleation)
862#ifdef INCA
863      INTEGER       :: iii
864      REAL          :: calday
865#endif
866
867cAA
868      REAL,allocatable,save :: rain_fall(:) ! pluie
869c$OMP THREADPRIVATE(rain_fall)
870      REAL,allocatable,save :: snow_fall(:) ! neige
871c$OMP THREADPRIVATE(snow_fall)
872cym      save snow_fall, rain_fall
873
874cIM cf FH pour Tiedtke 080604
875      REAL rain_tiedtke(klon),snow_tiedtke(klon)
876c
877
878      REAL,allocatable,save :: total_rain(:), nday_rain(:)
879c$OMP THREADPRIVATE(total_rain,nday_rain)
880cym      save total_rain, nday_rain
881cIM 050204 END
882      REAL evap(klon), devap(klon) ! evaporation et sa derivee
883      REAL sens(klon), dsens(klon) ! chaleur sensible et sa derivee
884      REAL,allocatable,save :: dlw(:)    ! derivee infra rouge
885c$OMP THREADPRIVATE(dlw)
886cym
887cym      SAVE dlw
888cym
889      REAL bils(klon) ! bilan de chaleur au sol
890      REAL wfbilo(klon,nbsrf) ! bilan d'eau, pour chaque
891C                             ! type de sous-surface et pondere par la fraction
892      REAL wfbils(klon,nbsrf) ! bilan de chaleur au sol, pour chaque
893C                             ! type de sous-surface et pondere par la fraction
894      REAL,allocatable,save :: fder(:) ! Derive de flux (sensible et latente)
895c$OMP THREADPRIVATE(fder)
896cym      save fder
897      REAL ve(klon) ! integr. verticale du transport meri. de l'energie
898      REAL vq(klon) ! integr. verticale du transport meri. de l'eau
899      REAL ue(klon) ! integr. verticale du transport zonal de l'energie
900      REAL uq(klon) ! integr. verticale du transport zonal de l'eau
901c
902      REAL,allocatable,save :: frugs(:,:) ! longueur de rugosite
903c$OMP THREADPRIVATE(frugs)
904cym      save frugs
905      REAL zxrugs(klon) ! longueur de rugosite
906c
907c Conditions aux limites
908c
909      INTEGER julien
910c
911      INTEGER lmt_pas
912      SAVE lmt_pas                ! frequence de mise a jour
913c$OMP THREADPRIVATE(lmt_pas)
914      REAL,allocatable,save :: pctsrf(:,:)
915c$OMP THREADPRIVATE(pctsrf)
916cIM
917      REAL pctsrf_new(klon,nbsrf) !pourcentage surfaces issus d'ORCHIDEE
918
919cym      REAL paire_ter(klon)        !surfaces terre
920      REAL,allocatable,save ::  paire_ter(:)        !surfaces terre
921c$OMP THREADPRIVATE(paire_ter)
922   
923cIM
924cym      SAVE pctsrf                 ! sous-fraction du sol
925      REAL,allocatable,save :: albsol(:)
926c$OMP THREADPRIVATE(albsol)
927cym      SAVE albsol                 ! albedo du sol total
928      REAL,allocatable,save :: albsollw(:)
929c$OMP THREADPRIVATE(albsollw)     
930cym      SAVE albsollw                 ! albedo du sol total
931
932      REAL,allocatable,save :: wo(:,:)
933c$OMP THREADPRIVATE(wo)
934cym     SAVE wo                     ! ozone
935
936cIM sorties
937      REAL un_jour
938      PARAMETER(un_jour=86400.)
939c======================================================================
940c
941c Declaration des procedures appelees
942c
943      EXTERNAL angle     ! calculer angle zenithal du soleil
944      EXTERNAL alboc     ! calculer l'albedo sur ocean
945      EXTERNAL ajsec     ! ajustement sec
946      EXTERNAL clmain    ! couche limite
947      EXTERNAL conlmd    ! convection (schema LMD)
948cKE43
949      EXTERNAL conema3  ! convect4.3
950      EXTERNAL fisrtilp  ! schema de condensation a grande echelle (pluie)
951cAA
952      EXTERNAL fisrtilp_tr ! schema de condensation a grande echelle (pluie)
953c                          ! stockage des coefficients necessaires au
954c                          ! lessivage OFF-LINE et ON-LINE
955      EXTERNAL hgardfou  ! verifier les temperatures
956      EXTERNAL nuage     ! calculer les proprietes radiatives
957      EXTERNAL o3cm      ! initialiser l'ozone
958      EXTERNAL orbite    ! calculer l'orbite terrestre
959      EXTERNAL ozonecm   ! prescrire l'ozone
960      EXTERNAL phyetat0  ! lire l'etat initial de la physique
961      EXTERNAL phyredem  ! ecrire l'etat de redemarrage de la physique
962      EXTERNAL radlwsw   ! rayonnements solaire et infrarouge
963      EXTERNAL suphec    ! initialiser certaines constantes
964      EXTERNAL transp    ! transport total de l'eau et de l'energie
965      EXTERNAL ecribina  ! ecrire le fichier binaire global
966      EXTERNAL ecribins  ! ecrire le fichier binaire global
967      EXTERNAL ecrirega  ! ecrire le fichier binaire regional
968      EXTERNAL ecriregs  ! ecrire le fichier binaire regional
969cIM
970      EXTERNAL haut2bas  !variables de haut en bas
971      INTEGER lnblnk1
972      EXTERNAL lnblnk1   !enleve les blancs a la fin d'une variable de type
973                         !caracter
974      EXTERNAL ini_undefSTD  !initialise a 0 une variable a 1 niveau de pression
975      EXTERNAL undefSTD      !somme les valeurs definies d'1 var a 1 niveau de pression
976c     EXTERNAL moy_undefSTD  !moyenne d'1 var a 1 niveau de pression
977c     EXTERNAL moyglo_aire   !moyenne globale d'1 var ponderee par l'aire de la maille (moyglo_pondaire)
978c                            !par la masse/airetot (moyglo_pondaima) et la vraie masse (moyglo_pondmass)
979c
980c Variables locales
981c
982      real,allocatable,save :: clwcon(:,:),rnebcon(:,:)
983c$OMP THREADPRIVATE(clwcon,rnebcon)
984      real,allocatable,save :: clwcon0(:,:),rnebcon0(:,:)
985cym      save rnebcon, clwcon
986c$OMP THREADPRIVATE(clwcon0,rnebcon0)
987      REAL rhcl(klon,klev)    ! humiditi relative ciel clair
988      REAL dialiq(klon,klev)  ! eau liquide nuageuse
989      REAL diafra(klon,klev)  ! fraction nuageuse
990      REAL cldliq(klon,klev)  ! eau liquide nuageuse
991      REAL cldfra(klon,klev)  ! fraction nuageuse
992      REAL cldtau(klon,klev)  ! epaisseur optique
993      REAL cldemi(klon,klev)  ! emissivite infrarouge
994c
995CXXX PB
996      REAL fluxq(klon,klev, nbsrf)   ! flux turbulent d'humidite
997      REAL fluxt(klon,klev, nbsrf)   ! flux turbulent de chaleur
998      REAL fluxu(klon,klev, nbsrf)   ! flux turbulent de vitesse u
999      REAL fluxv(klon,klev, nbsrf)   ! flux turbulent de vitesse v
1000c
1001      REAL zxfluxt(klon, klev)
1002      REAL zxfluxq(klon, klev)
1003      REAL zxfluxu(klon, klev)
1004      REAL zxfluxv(klon, klev)
1005CXXX
1006      REAL,allocatable,save :: heat(:,:)    ! chauffage solaire
1007c$OMP THREADPRIVATE(heat)
1008      REAL,allocatable,save :: heat0(:,:)   ! chauffage solaire ciel clair
1009c$OMP THREADPRIVATE(heat0)
1010      REAL,allocatable,save :: cool(:,:)    ! refroidissement infrarouge
1011c$OMP THREADPRIVATE(cool)
1012      REAL,allocatable,save :: cool0(:,:)   ! refroidissement infrarouge ciel clair
1013c$OMP THREADPRIVATE(cool0)
1014      REAL,allocatable,save :: topsw(:), toplw(:), solsw(:), sollw(:)
1015c$OMP THREADPRIVATE(topsw,toplw,solsw,sollw)
1016      real,allocatable,save :: sollwdown(:)    ! downward LW flux at surface
1017c$OMP THREADPRIVATE(sollwdown)
1018cIM BEG
1019      real,allocatable,save :: sollwdownclr(:)    ! downward CS LW flux at surface
1020c$OMP THREADPRIVATE(sollwdownclr)
1021      real,allocatable,save :: toplwdown(:)       ! downward CS LW flux at TOA
1022c$OMP THREADPRIVATE(toplwdown)
1023      real,allocatable,save :: toplwdownclr(:)    ! downward CS LW flux at TOA
1024c$OMP THREADPRIVATE(toplwdownclr)
1025cIM END
1026      REAL,allocatable,save :: topsw0(:),toplw0(:),solsw0(:),sollw0(:)
1027c$OMP THREADPRIVATE( topsw0,toplw0,solsw0,sollw0)
1028      REAL,allocatable,save :: albpla(:)
1029c$OMP THREADPRIVATE(albpla)
1030      REAL fsollw(klon, nbsrf)   ! bilan flux IR pour chaque sous surface
1031      REAL fsolsw(klon, nbsrf)   ! flux solaire absorb. pour chaque sous surface
1032c Le rayonnement n'est pas calcule tous les pas, il faut donc
1033c                      sauvegarder les sorties du rayonnement
1034cym      SAVE  heat,cool,albpla,topsw,toplw,solsw,sollw,sollwdown
1035cym      SAVE  sollwdownclr, toplwdown, toplwdownclr
1036cym      SAVE  topsw0,toplw0,solsw0,sollw0, heat0, cool0
1037c
1038      INTEGER itaprad
1039      SAVE itaprad
1040c$OMP THREADPRIVATE(itaprad)
1041c
1042      REAL conv_q(klon,klev) ! convergence de l'humidite (kg/kg/s)
1043      REAL conv_t(klon,klev) ! convergence de la temperature(K/s)
1044c
1045      REAL cldl(klon),cldm(klon),cldh(klon) !nuages bas, moyen et haut
1046      REAL cldt(klon),cldq(klon) !nuage total, eau liquide integree
1047c
1048      REAL zxtsol(klon), zxqsurf(klon), zxsnow(klon), zxfluxlat(klon)
1049c
1050      REAL dist, rmu0(klon), fract(klon)
1051      REAL zdtime, zlongi
1052c
1053      CHARACTER*2 str2
1054      CHARACTER*2 iqn
1055c
1056      REAL qcheck
1057      REAL z_avant(klon), z_apres(klon), z_factor(klon)
1058      LOGICAL zx_ajustq
1059c
1060      REAL za, zb
1061      REAL zx_t, zx_qs, zdelta, zcor, zfra, zlvdcp, zlsdcp
1062      real zqsat(klon,klev)
1063      INTEGER i, k, iq, ig, j, nsrf, ll, l, iiq
1064      REAL t_coup
1065      PARAMETER (t_coup=234.0)
1066c
1067      REAL zphi(klon,klev)
1068cym A voir plus tard !!
1069cym      REAL zx_relief(iim,jjmp1)
1070cym      REAL zx_aire(iim,jjmp1)
1071c
1072cIM cf. AM Variables locales pour la CLA (hbtm2)
1073c
1074      REAL,SAVE,ALLOCATABLE :: pblh(:, :)           ! Hauteur de couche limite
1075c$OMP THREADPRIVATE(pblh)
1076      REAL,SAVE,ALLOCATABLE :: plcl(:, :)           ! Niveau de condensation de la CLA
1077c$OMP THREADPRIVATE(plcl)
1078      REAL,SAVE,ALLOCATABLE :: capCL(:, :)          ! CAPE de couche limite
1079c$OMP THREADPRIVATE(capCL)
1080      REAL,SAVE,ALLOCATABLE :: oliqCL(:, :)          ! eau_liqu integree de couche limite
1081c$OMP THREADPRIVATE(oliqCL)
1082      REAL,SAVE,ALLOCATABLE :: cteiCL(:, :)          ! cloud top instab. crit. couche limite
1083c$OMP THREADPRIVATE(cteiCL)
1084      REAL,SAVE,ALLOCATABLE :: pblt(:, :)          ! T a la Hauteur de couche limite
1085c$OMP THREADPRIVATE(pblt)
1086      REAL,SAVE,ALLOCATABLE :: therm(:, :)
1087c$OMP THREADPRIVATE(therm)
1088      REAL,SAVE,ALLOCATABLE :: trmb1(:, :)          ! deep_cape
1089c$OMP THREADPRIVATE(trmb1)
1090      REAL,SAVE,ALLOCATABLE :: trmb2(:, :)          ! inhibition
1091c$OMP THREADPRIVATE(trmb2)
1092      REAL,SAVE,ALLOCATABLE :: trmb3(:, :)          ! Point Omega
1093c$OMP THREADPRIVATE(trmb3)
1094c Grdeurs de sorties
1095      REAL s_pblh(klon), s_lcl(klon), s_capCL(klon)
1096      REAL s_oliqCL(klon), s_cteiCL(klon), s_pblt(klon)
1097      REAL s_therm(klon), s_trmb1(klon), s_trmb2(klon)
1098      REAL s_trmb3(klon)
1099cKE43
1100c Variables locales pour la convection de K. Emanuel (sb):
1101c
1102      REAL upwd(klon,klev)      ! saturated updraft mass flux
1103      REAL dnwd(klon,klev)      ! saturated downdraft mass flux
1104      REAL dnwd0(klon,klev)     ! unsaturated downdraft mass flux
1105      REAL tvp(klon,klev)       ! virtual temp of lifted parcel
1106      REAL,allocatable,save :: cape(:)           ! CAPE
1107c$OMP THREADPRIVATE(cape)
1108cym      SAVE cape
1109      CHARACTER*40 capemaxcels  !max(CAPE)
1110
1111      REAL,allocatable,save :: pbase(:)          ! cloud base pressure
1112c$OMP THREADPRIVATE(pbase)
1113cym      SAVE pbase
1114      REAL,allocatable,save :: bbase(:)          ! cloud base buoyancy
1115c$OMP THREADPRIVATE(bbase)
1116cym      SAVE bbase
1117      REAL rflag(klon)          ! flag fonctionnement de convect
1118      INTEGER iflagctrl(klon)          ! flag fonctionnement de convect
1119c -- convect43:
1120      INTEGER ntra              ! nb traceurs pour convect4.3
1121      REAL pori_con(klon)    ! pressure at the origin level of lifted parcel
1122      REAL plcl_con(klon),dtma_con(klon),dtlcl_con(klon)
1123      REAL dtvpdt1(klon,klev), dtvpdq1(klon,klev)
1124      REAL dplcldt(klon), dplcldr(klon)
1125c?     .     condm_con(klon,klev),conda_con(klon,klev),
1126c?     .     mr_con(klon,klev),ep_con(klon,klev)
1127c?     .    ,sadiab(klon,klev),wadiab(klon,klev)
1128c --
1129c34EK
1130c
1131c Variables du changement
1132c
1133c con: convection
1134c lsc: condensation a grande echelle (Large-Scale-Condensation)
1135c ajs: ajustement sec
1136c eva: evaporation de l'eau liquide nuageuse
1137c vdf: couche limite (Vertical DiFfusion)
1138      REAL d_t_con(klon,klev),d_q_con(klon,klev)
1139      REAL,SAVE,ALLOCATABLE :: d_u_con(:,:),d_v_con(:,:)
1140c$OMP THREADPRIVATE(d_u_con,d_v_con)
1141      REAL d_t_lsc(klon,klev),d_q_lsc(klon,klev),d_ql_lsc(klon,klev)
1142      REAL d_t_ajs(klon,klev), d_q_ajs(klon,klev)
1143      REAL d_u_ajs(klon,klev), d_v_ajs(klon,klev)
1144      REAL d_t_eva(klon,klev),d_q_eva(klon,klev)
1145      REAL d_t_oli(klon,klev) !tendances dues a oro et lif
1146      REAL rneb(klon,klev)
1147c
1148*********************************************************
1149*     declarations
1150      real,save,allocatable :: zqasc(:,:)
1151c$OMP THREADPRIVATE(zqasc)
1152cym      save zqasc
1153     
1154*********************************************************
1155cIM 081204 END
1156c
1157      REAL pmfu(klon,klev), pmfd(klon,klev)
1158      REAL pen_u(klon,klev), pen_d(klon,klev)
1159      REAL pde_u(klon,klev), pde_d(klon,klev)
1160      INTEGER kcbot(klon), kctop(klon), kdtop(klon)
1161      REAL pmflxr(klon,klev+1), pmflxs(klon,klev+1)
1162      REAL prfl(klon,klev+1), psfl(klon,klev+1)
1163c
1164      INTEGER,allocatable,save :: ibas_con(:), itop_con(:)
1165c$OMP THREADPRIVATE(ibas_con,itop_con)
1166cym
1167cym      SAVE ibas_con,itop_con
1168cym
1169      REAL,SAVE,ALLOCATABLE :: rain_con(:)
1170c$OMP THREADPRIVATE(rain_con)
1171      REAL rain_lsc(klon)
1172      REAL,SAVE,ALLOCATABLE :: snow_con(:)
1173c$OMP THREADPRIVATE(snow_con)
1174      REAL snow_lsc(klon)
1175      REAL d_ts(klon,nbsrf)
1176c
1177      REAL d_u_vdf(klon,klev), d_v_vdf(klon,klev)
1178      REAL d_t_vdf(klon,klev), d_q_vdf(klon,klev)
1179c
1180      REAL d_u_oro(klon,klev), d_v_oro(klon,klev)
1181      REAL d_t_oro(klon,klev)
1182      REAL d_u_lif(klon,klev), d_v_lif(klon,klev)
1183      REAL d_t_lif(klon,klev)
1184      REAL d_u_oli(klon,klev), d_v_oli(klon,klev) !tendances dues a oro et lif
1185
1186      REAL,allocatable,save :: ratqs(:,:)
1187c$OMP THREADPRIVATE(ratqs)
1188      REAL ratqss(klon,klev),ratqsc(klon,klev)
1189      real ratqsbas,ratqshaut
1190cym      save ratqsbas,ratqshaut, ratqs
1191      save ratqsbas,ratqshaut
1192c$OMP THREADPRIVATE(ratqsbas,ratqshaut)
1193      real zpt_conv(klon,klev)
1194
1195c Parametres lies au nouveau schema de nuages (SB, PDF)
1196      real fact_cldcon
1197      real facttemps
1198      logical ok_newmicro
1199      save ok_newmicro
1200c$OMP THREADPRIVATE(ok_newmicro)
1201      save fact_cldcon,facttemps
1202c$OMP THREADPRIVATE(fact_cldcon,facttemps)
1203      real facteur
1204
1205      integer iflag_cldcon
1206      save iflag_cldcon
1207c$OMP THREADPRIVATE(iflag_cldcon)
1208      logical ptconv(klon,klev)
1209cIM cf. AM 081204 BEG
1210      logical ptconvth(klon,klev)
1211cIM cf. AM 081204 END
1212c
1213c Variables liees a l'ecriture de la bande histoire physique
1214c
1215c======================================================================
1216c
1217cIM cf. AM 081204 BEG
1218c   declarations pour sortir sur une sous-region
1219      integer imin_ins,imax_ins,jmin_ins,jmax_ins
1220      save imin_ins,imax_ins,jmin_ins,jmax_ins
1221c$OMP THREADPRIVATE(imin_ins,imax_ins,jmin_ins,jmax_ins)
1222c      real lonmin_ins,lonmax_ins,latmin_ins
1223c     s  ,latmax_ins
1224c     data lonmin_ins,lonmax_ins,latmin_ins
1225c    s  ,latmax_ins/
1226c valeurs initiales     s   -5.,20.,41.,55./   
1227c    s   100.,130.,-20.,20./
1228c    s   -180.,180.,-90.,90./
1229c======================================================================
1230cIM cf. AM 081204 END
1231
1232c
1233      integer itau_w   ! pas de temps ecriture = itap + itau_phy
1234c
1235c
1236c Variables locales pour effectuer les appels en serie
1237c
1238      REAL t_seri(klon,klev), q_seri(klon,klev)
1239      REAL ql_seri(klon,klev),qs_seri(klon,klev)
1240      REAL u_seri(klon,klev), v_seri(klon,klev)
1241c
1242      REAL tr_seri(klon,klev,nbtr)
1243      REAL d_tr(klon,klev,nbtr)
1244
1245      REAL zx_rh(klon,klev)
1246cIM RH a 2m (la surface)
1247      REAL rh2m(klon), qsat2m(klon)
1248      REAL zx_rh2m(klon,nbsrf), zx_qsat2m(klon,nbsrf)
1249      REAL zx_qs1(klon,nbsrf), zx_t1(klon,nbsrf), zdelta1(klon,nbsrf)
1250      REAL zcor1(klon,nbsrf)
1251      REAL tpot(klon), tpote(klon)
1252      REAL Lheat
1253
1254      INTEGER        length
1255      PARAMETER    ( length = 100 )
1256      REAL tabcntr0( length       )
1257c
1258
1259      INTEGER ndex2d(iim*jjmp1),ndex3d(iim*jjmp1*klev)
1260cIM
1261      INTEGER ndex2d1(iwmax)
1262c
1263cIM AMIP2 BEG
1264      REAL moyglo, mountor
1265cIM 141004 BEG
1266      REAL zustrdr(klon), zvstrdr(klon)
1267      REAL zustrli(klon), zvstrli(klon)
1268      REAL zustrph(klon), zvstrph(klon)
1269      REAL aam, torsfc
1270cIM 141004 END
1271cIM 190504 BEG
1272      INTEGER ij, imp1jmp1
1273      PARAMETER(imp1jmp1=(iim+1)*jjmp1)
1274cym A voir plus tard
1275      REAL zx_tmp(imp1jmp1), airedyn(iim+1,jjmp1)
1276      REAL padyn(iim+1,jjmp1,klev+1)
1277      REAL dudyn(iim+1,jjmp1,klev)
1278      REAL rlatdyn(iim+1,jjmp1)
1279cIM 190504 END
1280      LOGICAL ok_msk
1281      REAL msk(klon)
1282cIM
1283      REAL airetot, pi
1284cym A voir plus tard
1285cym      REAL zm_wo(jjmp1, klev)
1286cIM AMIP2 END
1287c
1288      REAL zx_tmp_fi2d(klon)      ! variable temporaire grille physique
1289      REAL zx_tmp_fi3d(klon,klev) ! variable temporaire pour champs 3D
1290c#ifdef histmthNMC
1291cym   A voir plus tard !!!!
1292cym      REAL zx_tmp_NC(iim,jjmp1,nlevSTD)
1293      REAL zx_tmp_fiNC(klon,nlevSTD)
1294c#endif
1295      REAL*8 zx_tmp2_fi3d(klon,klev) ! variable temporaire pour champs 3D
1296      REAL zx_tmp_2d(iim,jjmp1), zx_tmp_3d(iim,jjmp1,klev)
1297      REAL zx_lon(iim,jjmp1), zx_lat(iim,jjmp1)
1298c
1299      INTEGER nid_day, nid_mth, nid_ins, nid_nmc, nid_day_seri
1300      INTEGER nid_ctesGCM
1301      SAVE nid_day, nid_mth, nid_ins, nid_nmc, nid_day_seri
1302      SAVE nid_ctesGCM
1303c$OMP THREADPRIVATE(nid_day, nid_mth, nid_ins, nid_nmc)
1304c$OMP THREADPRIVATE(nid_day_seri,nid_ctesGCM)
1305c
1306cIM 280405 BEG
1307      INTEGER nid_bilKPins, nid_bilKPave
1308      SAVE nid_bilKPins, nid_bilKPave
1309c$OMP THREADPRIVATE(nid_bilKPins, nid_bilKPave)
1310c
1311      REAL ve_lay(klon,klev) ! transport meri. de l'energie a chaque niveau vert.
1312      REAL vq_lay(klon,klev) ! transport meri. de l'eau a chaque niveau vert.
1313      REAL ue_lay(klon,klev) ! transport zonal de l'energie a chaque niveau vert.
1314      REAL uq_lay(klon,klev) ! transport zonal de l'eau a chaque niveau vert.
1315c
1316cIM 280405 END
1317c
1318      INTEGER nhori, nvert, nvert1, nvert3
1319      REAL zsto, zsto1, zsto2
1320      REAL zstophy, zstorad, zstohf, zstoday, zstomth, zout
1321      REAL zcals(napisccp), zcalh(napisccp), zoutj(napisccp)
1322      REAL zout_isccp(napisccp)
1323      SAVE zcals, zcalh, zoutj, zout_isccp
1324c$OMP THREADPRIVATE(zcals, zcalh, zoutj, zout_isccp)
1325
1326      real zjulian
1327      save zjulian
1328c$OMP THREADPRIVATE(zjulian)
1329
1330      character*20 modname
1331      character*80 abort_message
1332      logical ok_sync
1333      real date0
1334      integer idayref
1335
1336C essai writephys
1337      integer fid_day, fid_mth, fid_ins
1338      parameter (fid_ins = 1, fid_day = 2, fid_mth = 3)
1339      integer prof2d_on, prof3d_on, prof2d_av, prof3d_av
1340      parameter (prof2d_on = 1, prof3d_on = 2,
1341     .           prof2d_av = 3, prof3d_av = 4)
1342      character*30 nom_fichier
1343      character*10 varname
1344      character*40 vartitle
1345      character*20 varunits
1346C     Variables liees au bilan d'energie et d'enthalpi
1347      REAL ztsol(klon)
1348      REAL      h_vcol_tot, h_dair_tot, h_qw_tot, h_ql_tot
1349     $        , h_qs_tot, qw_tot, ql_tot, qs_tot , ec_tot
1350      SAVE      h_vcol_tot, h_dair_tot, h_qw_tot, h_ql_tot
1351     $        , h_qs_tot, qw_tot, ql_tot, qs_tot , ec_tot
1352c$OMP THREADPRIVATE(h_vcol_tot, h_dair_tot, h_qw_tot, h_ql_tot,
1353c$OMP+              h_qs_tot, qw_tot, ql_tot, qs_tot , ec_tot)
1354      REAL      d_h_vcol, d_h_dair, d_qt, d_qw, d_ql, d_qs, d_ec
1355      REAL      d_h_vcol_phy
1356      REAL      fs_bound, fq_bound
1357      SAVE      d_h_vcol_phy
1358c$OMP THREADPRIVATE(d_h_vcol_phy)
1359      REAL      zero_v(klon)
1360      CHARACTER*15 ztit
1361      INTEGER   ip_ebil  ! PRINT level for energy conserv. diag.
1362      SAVE      ip_ebil
1363      DATA      ip_ebil/0/
1364c$OMP THREADPRIVATE(ip_ebil)
1365      INTEGER   if_ebil ! level for energy conserv. dignostics
1366      SAVE      if_ebil
1367c$OMP THREADPRIVATE(if_ebil)
1368c+jld ec_conser
1369      REAL d_t_ec(klon,klev)    ! tendance du a la conersion Ec -> E thermique
1370      REAL ZRCPD
1371c-jld ec_conser
1372cIM: t2m, q2m, u10m, v10m et t2mincels, t2maxcels
1373      REAL,SAVE,ALLOCATABLE :: t2m(:,:), q2m(:,:)   !temperature, humidite a 2m
1374c$OMP THREADPRIVATE(t2m,q2m)
1375      REAL,SAVE,ALLOCATABLE :: u10m(:,:), v10m(:,:) !vents a 10m
1376c$OMP THREADPRIVATE(u10m,v10m)
1377      REAL zt2m(klon), zq2m(klon)             !temp., hum. 2m moyenne s/ 1 maille
1378      REAL zu10m(klon), zv10m(klon)           !vents a 10m moyennes s/1 maille
1379      CHARACTER*40 t2mincels, t2maxcels       !t2m min., t2m max
1380      CHARACTER*40 tinst, tave, typeval
1381cjq   Aerosol effects (Johannes Quaas, 27/11/2003)
1382      REAL sulfate(klon, klev) ! SO4 aerosol concentration [ug/m3]
1383      REAL,allocatable,save :: sulfate_pi(:,:) ! SO4 aerosol concentration [ug/m3] (pre-industrial value)
1384c$OMP THREADPRIVATE(sulfate_pi)
1385cym      SAVE sulfate_pi
1386
1387      REAL cldtaupi(klon,klev)  ! Cloud optical thickness for pre-industrial (pi) aerosols
1388
1389      REAL re(klon, klev)       ! Cloud droplet effective radius
1390      REAL fl(klon, klev)  ! denominator of re
1391
1392      REAL re_top(klon), fl_top(klon) ! CDR at top of liquid water clouds
1393
1394      ! Aerosol optical properties
1395      REAL,SAVE,ALLOCATABLE :: tau_ae(:,:,:), piz_ae(:,:,:)
1396c$OMP THREADPRIVATE(tau_ae,piz_ae)
1397      REAL,SAVE,ALLOCATABLE :: cg_ae(:,:,:)
1398c$OMP THREADPRIVATE(cg_ae)
1399
1400      REAL,SAVE,ALLOCATABLE :: topswad(:), solswad(:) ! Aerosol direct effect.
1401c$OMP THREADPRIVATE(topswad,solswad)
1402      ! ok_ade=T -ADE=topswad-topsw
1403
1404      REAL,SAVE,ALLOCATABLE :: topswai(:), solswai(:) ! Aerosol indirect effect.
1405c$OMP THREADPRIVATE(topswai,solswai)
1406      ! ok_aie=T ->
1407      !        ok_ade=T -AIE=topswai-topswad
1408      !        ok_ade=F -AIE=topswai-topsw
1409
1410      REAL aerindex(klon)       ! POLDER aerosol index
1411     
1412      ! Parameters
1413      LOGICAL ok_ade, ok_aie    ! Apply aerosol (in)direct effects or not
1414      REAL bl95_b0, bl95_b1   ! Parameter in Boucher and Lohmann (1995)
1415cym
1416      SAVE ok_ade, ok_aie, bl95_b0, bl95_b1
1417c$OMP THREADPRIVATE(ok_ade, ok_aie, bl95_b0, bl95_b1)
1418
1419c
1420c Declaration des constantes et des fonctions thermodynamiques
1421c
1422      REAL Field_tmp(klon_glo,klevp1)
1423      LOGICAL,SAVE :: first=.true.
1424c$OMP THREADPRIVATE(first)
1425#include "YOMCST.h"
1426#include "YOETHF.h"
1427#include "FCTTRE.h"
1428cIM 100106 BEG : pouvoir sortir les ctes de la physique
1429#include "conema3.h"
1430#include "fisrtilp.h"
1431#include "nuage.h"
1432#include "compbl.h"
1433cIM 100106 END : pouvoir sortir les ctes de la physique
1434c
1435c======================================================================
1436
1437cym => necessaire pour iflag_con != 2   
1438      pmfd(:,:) = 0.
1439      pen_u(:,:) = 0.
1440      pen_d(:,:) = 0.
1441      pde_d(:,:) = 0.
1442      pde_u(:,:) = 0.
1443      aam=0.
1444      torsfc=0.
1445cym => pour le couple ocean => revoir dans clmain/intersurf
1446      fluxg(:)=0.
1447      fluxo(:)=0.     
1448
1449      if (first) then
1450     
1451      allocate( t_ancien(klon,klev), q_ancien(klon,klev))
1452      allocate( q2(klon,klev+1,nbsrf))
1453      allocate( swdn0(klon,klevp1), swdn(klon,klevp1))
1454      allocate( swup0(klon,klevp1), swup(klon,klevp1))
1455      allocate( SWdn200clr(klon), SWdn200(klon))
1456      allocate( SWup200clr(klon), SWup200(klon))
1457      allocate( lwdn0(klon,klevp1), lwdn(klon,klevp1))
1458      allocate( lwup0(klon,klevp1), lwup(klon,klevp1))
1459      allocate( LWdn200clr(klon), LWdn200(klon))
1460      allocate( LWup200clr(klon), LWup200(klon))
1461      allocate( LWdnTOA(klon), LWdnTOAclr(klon))
1462      allocate( radsol(klon))
1463      allocate( rlat(klon))
1464      allocate( rlon(klon))
1465      allocate( ftsol(klon,nbsrf))
1466      allocate( ftsoil(klon,nsoilmx,nbsrf))
1467      allocate( fevap(klon,nbsrf))
1468      allocate( fluxlat(klon,nbsrf))
1469      allocate( deltat(klon))
1470      allocate( fqsurf(klon,nbsrf))
1471      allocate( qsol(klon))
1472      allocate( fsnow(klon,nbsrf))
1473      allocate( falbe(klon,nbsrf))
1474      allocate( falblw(klon,nbsrf))
1475      allocate( zmea(klon))
1476      allocate( zstd(klon))
1477      allocate( zsig(klon))
1478      allocate( zgam(klon))
1479      allocate( zthe(klon))
1480      allocate( zpic(klon))
1481      allocate( zval(klon))
1482      allocate( rugoro(klon))
1483      allocate( zuthe(klon),zvthe(klon))
1484      allocate( agesno(klon,nbsrf))
1485      allocate( alb_neig(klon))
1486      allocate( run_off_lic_0(klon))
1487      allocate( ema_workcbmf(klon))   
1488      allocate( ema_cbmf(klon))
1489      allocate( ema_pcb(klon))
1490      allocate( ema_pct(klon)) 
1491      allocate( Ma(klon,klev) )
1492      allocate( qcondc(klon,klev)) 
1493      allocate( ema_work1(klon, klev), ema_work2(klon, klev))
1494      allocate( wd(klon) )
1495      allocate( pfrac_impa(klon,klev))
1496      allocate( pfrac_nucl(klon,klev))
1497      allocate( pfrac_1nucl(klon,klev))
1498      allocate( rain_fall(klon) )
1499      allocate( snow_fall(klon) )
1500      allocate( total_rain(klon), nday_rain(klon))
1501      allocate( dlw(klon)   )
1502      allocate( fder(klon) )
1503      allocate( frugs(klon,nbsrf) )
1504      allocate( pctsrf(klon,nbsrf))
1505      allocate( albsol(klon))
1506      allocate( albsollw(klon))
1507      allocate( wo(klon,klev))
1508      allocate( clwcon(klon,klev),rnebcon(klon,klev))
1509      allocate( heat(klon,klev)    )
1510      allocate( heat0(klon,klev)  )
1511      allocate( cool(klon,klev)    )
1512      allocate( cool0(klon,klev)   )
1513      allocate( topsw(klon), toplw(klon), solsw(klon), sollw(klon))
1514      allocate( sollwdown(klon)    )
1515      allocate( sollwdownclr(klon)  )
1516      allocate( toplwdown(klon)      )
1517      allocate( toplwdownclr(klon)   )
1518      allocate( topsw0(klon), toplw0(klon), solsw0(klon), sollw0(klon))
1519      allocate( albpla(klon))
1520      allocate( cape(klon)   )       
1521      allocate( pbase(klon)   )     
1522      allocate( bbase(klon)    )     
1523      allocate( ibas_con(klon), itop_con(klon))
1524      allocate( ratqs(klon,klev))
1525      allocate( sulfate_pi(klon, klev))
1526      allocate( paire_ter(klon))
1527      allocate(tsumSTD(klon,nlevSTD,nout))
1528      allocate(usumSTD(klon,nlevSTD,nout))
1529      allocate(vsumSTD(klon,nlevSTD,nout))
1530      allocate(wsumSTD(klon,nlevSTD,nout))
1531      allocate(phisumSTD(klon,nlevSTD,nout))
1532      allocate(qsumSTD(klon,nlevSTD,nout))
1533      allocate(rhsumSTD(klon,nlevSTD,nout))
1534      allocate(uvsumSTD(klon,nlevSTD,nout))
1535      allocate(vqsumSTD(klon,nlevSTD,nout))
1536      allocate(vTsumSTD(klon,nlevSTD,nout))
1537      allocate(wqsumSTD(klon,nlevSTD,nout))
1538      allocate( vphisumSTD(klon,nlevSTD,nout))
1539      allocate( wTsumSTD(klon,nlevSTD,nout))
1540      allocate( u2sumSTD(klon,nlevSTD,nout))
1541      allocate( v2sumSTD(klon,nlevSTD,nout))
1542      allocate( T2sumSTD(klon,nlevSTD,nout))
1543      allocate( seed_old(klon,napisccp))
1544      allocate( pct_ocean(klon,nbregdyn))
1545      allocate( rlonPOS(klon))
1546      allocate( newsst(klon))
1547      allocate( zqasc(klon,klev))
1548      allocate( therm(klon, nbsrf))
1549      allocate( rain_con(klon))
1550      allocate( pblt(klon, nbsrf))
1551      allocate( t2m(klon,nbsrf), q2m(klon,nbsrf) ) 
1552      allocate( u10m(klon,nbsrf), v10m(klon,nbsrf))
1553      allocate( topswad(klon), solswad(klon))
1554      allocate( topswai(klon), solswai(klon) )
1555      allocate( ffonte(klon,nbsrf))
1556      allocate( fqcalving(klon,nbsrf))
1557      allocate( fqfonte(klon,nbsrf))
1558      allocate( pblh(klon, nbsrf))
1559      allocate( plcl(klon, nbsrf)) 
1560      allocate( capCL(klon, nbsrf))   
1561      allocate( oliqCL(klon, nbsrf))       
1562      allocate( cteiCL(klon, nbsrf))       
1563      allocate( trmb1(klon, nbsrf))   
1564      allocate( trmb2(klon, nbsrf))     
1565      allocate( trmb3(klon, nbsrf))
1566      allocate( clwcon0(klon,klev),rnebcon0(klon,klev))
1567      allocate( tau_ae(klon,klev,2), piz_ae(klon,klev,2))
1568      allocate( cg_ae(klon,klev,2))
1569      allocate( snow_con(klon))
1570      allocate( tnondef(klon,nlevSTD,nout))
1571      allocate( d_u_con(klon,klev),d_v_con(klon,klev))           
1572     
1573     
1574        paire_ter(:)=0.   
1575        clwcon(:,:)=0.
1576        rnebcon(:,:)=0.
1577        ratqs(:,:)=0.
1578        run_off_lic_0(:)=0.
1579        sollw(:)=0.
1580        ema_work1(:,:)=0.
1581        ema_work2(:,:)=0.
1582cym Attention pbase pas initialise dans concvl !!!!
1583        pbase(:)=0
1584       
1585        first=.false.
1586      endif
1587
1588                 
1589       modname = 'physiq'
1590cIM
1591      IF (ip_ebil_phy.ge.1) THEN
1592        DO i=1,klon
1593          zero_v(i)=0.
1594        END DO
1595      END IF
1596      ok_sync=.TRUE.
1597      IF (nqmax .LT. 2) THEN
1598         abort_message = 'eaux vapeur et liquide sont indispensables'
1599         CALL abort_gcm (modname,abort_message,1)
1600      ENDIF
1601      IF (debut) THEN
1602         CALL suphec ! initialiser constantes et parametres phys.
1603      ENDIF
1604
1605
1606c======================================================================
1607      xjour = rjourvrai
1608c
1609c Si c'est le debut, il faut initialiser plusieurs choses
1610c          ********
1611c
1612       IF (debut) THEN
1613C
1614!rv
1615         u10m(:,:)=0.
1616         v10m(:,:)=0.
1617         t2m(:,:)=0.
1618         q2m(:,:)=0.
1619         ffonte(:,:)=0.
1620         fqcalving(:,:)=0.
1621         fqfonte(:,:)=0.
1622         piz_ae(:,:,:)=0.
1623         tau_ae(:,:,:)=0.
1624         cg_ae(:,:,:)=0.
1625         rain_con(:)=0.
1626         snow_con(:)=0.
1627         bl95_b0=0.
1628         bl95_b1=0.
1629         topswai(:)=0.
1630         topswad(:)=0.
1631         solswai(:)=0.
1632         solswad(:)=0.
1633!rv
1634! anne
1635         d_u_con(:,:) = 0.0
1636         d_v_con(:,:) = 0.0
1637         rnebcon0(:,:) = 0.0
1638         clwcon0(:,:) = 0.0
1639         rnebcon(:,:) = 0.0
1640         clwcon(:,:) = 0.0
1641         paire_ter(:) = 0.0
1642c        nhistoW(:,:,:,:) = 0.0
1643c        histoW(:,:,:,:) = 0.0
1644! fin anne
1645! Anne 12/09/2005
1646
1647         pblh(:,:)   =0.        ! Hauteur de couche limite
1648         plcl(:,:)   =0.        ! Niveau de condensation de la CLA
1649         capCL(:,:)  =0.        ! CAPE de couche limite
1650         oliqCL(:,:) =0.        ! eau_liqu integree de couche limite
1651         cteiCL(:,:) =0.        ! cloud top instab. crit. couche limite
1652         pblt(:,:)   =0.        ! T a la Hauteur de couche limite
1653         therm(:,:)  =0.
1654         trmb1(:,:)  =0.        ! deep_cape
1655         trmb2(:,:)  =0.        ! inhibition
1656         trmb3(:,:)  =0.        ! Point Omega
1657! fin Anne
1658
1659cym
1660         wfbils(:,:)=0
1661cym     
1662cIM     
1663         IF (ip_ebil_phy.ge.1) d_h_vcol_phy=0.
1664c
1665c appel a la lecture du run.def physique
1666c
1667         call conf_phys(ocean, ok_veget, ok_journe, ok_mensuel,
1668     .                  ok_instan, fact_cldcon, facttemps,ok_newmicro,
1669cIM  .                  iflag_cldcon,ratqsbas,ratqshaut, if_ebil,
1670     .                  iflag_cldcon,ratqsbas,ratqshaut,
1671     .                  ok_ade, ok_aie,
1672     .                  bl95_b0, bl95_b1,
1673     .                  iflag_thermals,nsplit_thermals)
1674
1675c
1676c
1677c Initialiser les compteurs:
1678c
1679
1680         frugs = 0.
1681         itap    = 0
1682         itaprad = 0
1683         CALL phyetat0 ("startphy.nc",dtime,co2_ppm_etat0,solaire_etat0,
1684     .       rlat,rlon,pctsrf, ftsol,ftsoil,
1685cIM "slab" ocean
1686     .       ocean, tslab,seaice,
1687     .       fqsurf,qsol,fsnow,
1688cIM 220306  .       falbe, falblw, fevap, rain_fall,snow_fall,solsw, sollwdown,
1689     .       falbe, falblw, fevap, rain_fall,snow_fall,solsw, sollw,
1690     .       dlw,radsol,frugs,agesno,clesphy0,
1691     .       zmea,zstd,zsig,zgam,zthe,zpic,zval,rugoro,tabcntr0,
1692     .       t_ancien, q_ancien, ancien_ok, rnebcon, ratqs,clwcon,
1693     .       run_off_lic_0)
1694
1695       DO i=1,klon
1696         IF ( abs( pctsrf(i, is_ter) + pctsrf(i, is_lic) +
1697     $       pctsrf(i, is_oce) + pctsrf(i, is_sic)  - 1.) .GT. EPSFRA)
1698     $       THEN
1699             WRITE(*,*) 'physiq : pb sous surface au point ', i,
1700     $           pctsrf(i, 1 : nbsrf)
1701         ENDIF
1702      ENDDO
1703 
1704c   ATTENTION : il faudra a terme relire q2 dans l'etat initial
1705         q2(:,:,:)=1.e-8
1706c
1707         radpas = NINT( 86400./dtime/nbapp_rad)
1708c
1709C on remet le calendrier a zero
1710c
1711         IF (raz_date .eq. 1) THEN
1712           itau_phy = 0
1713         ENDIF
1714
1715cIM cf. AM 081204 BEG
1716         PRINT*,'cycle_diurne3 =',cycle_diurne
1717cIM cf. AM 081204 END
1718c
1719         IF(ocean.NE.'force ') THEN
1720          ok_ocean=.TRUE.
1721         ENDIF
1722c
1723         CALL printflag( tabcntr0,radpas,ok_ocean,ok_oasis ,ok_journe,
1724     ,                    ok_instan, ok_region )
1725c
1726         IF (ABS(dtime-pdtphys).GT.0.001) THEN
1727            WRITE(lunout,*) 'Pas physique n est pas correct',dtime,
1728     .                        pdtphys
1729            abort_message='Pas physique n est pas correct '
1730            call abort_gcm(modname,abort_message,1)
1731         ENDIF
1732         IF (nlon .NE. klon) THEN
1733            WRITE(lunout,*)'nlon et klon ne sont pas coherents', nlon,
1734     .                      klon
1735            abort_message='nlon et klon ne sont pas coherents'
1736            call abort_gcm(modname,abort_message,1)
1737         ENDIF
1738         IF (nlev .NE. klev) THEN
1739            WRITE(lunout,*)'nlev et klev ne sont pas coherents', nlev,
1740     .                       klev
1741            abort_message='nlev et klev ne sont pas coherents'
1742            call abort_gcm(modname,abort_message,1)
1743         ENDIF
1744c
1745         IF (dtime*FLOAT(radpas).GT.21600..AND.cycle_diurne) THEN
1746           WRITE(lunout,*)'Nbre d appels au rayonnement insuffisant'
1747           WRITE(lunout,*)"Au minimum 4 appels par jour si cycle diurne"
1748           abort_message='Nbre d appels au rayonnement insuffisant'
1749           call abort_gcm(modname,abort_message,1)
1750         ENDIF
1751         WRITE(lunout,*)"Clef pour la convection, iflag_con=", iflag_con
1752         WRITE(lunout,*)"Clef pour le driver de la convection, ok_cvl=",
1753     .                   ok_cvl
1754c
1755cKE43
1756c Initialisation pour la convection de K.E. (sb):
1757         IF (iflag_con.GE.3) THEN
1758
1759         WRITE(lunout,*)"*** Convection de Kerry Emanuel 4.3  "
1760         WRITE(lunout,*)
1761     .      "On va utiliser le melange convectif des traceurs qui"
1762         WRITE(lunout,*)"est calcule dans convect4.3"
1763         WRITE(lunout,*)" !!! penser aux logical flags de phytrac"
1764
1765          DO i = 1, klon
1766           ema_cbmf(i) = 0.
1767           ema_pcb(i)  = 0.
1768           ema_pct(i)  = 0.
1769           ema_workcbmf(i) = 0.
1770          ENDDO
1771cIM15/11/02 rajout initialisation ibas_con,itop_con cf. SB =>BEG
1772          DO i = 1, klon
1773           ibas_con(i) = 1
1774           itop_con(i) = 1
1775          ENDDO
1776cIM15/11/02 rajout initialisation ibas_con,itop_con cf. SB =>END
1777
1778         ENDIF
1779
1780c34EK
1781         IF (ok_orodr) THEN
1782         DO i=1,klon
1783         rugoro(i) = MAX(1.0e-05, zstd(i)*zsig(i)/2.0)
1784         ENDDO
1785         CALL SUGWD(klon,klev,paprs,pplay)
1786         DO i=1,klon
1787         zuthe(i)=0.
1788         zvthe(i)=0.
1789         if(zstd(i).gt.10.)then
1790           zuthe(i)=(1.-zgam(i))*cos(zthe(i))
1791           zvthe(i)=(1.-zgam(i))*sin(zthe(i))
1792         endif
1793         ENDDO
1794         ENDIF
1795c
1796c
1797         lmt_pas = NINT(86400./dtime * 1.0)   ! tous les jours
1798         WRITE(lunout,*)'La frequence de lecture surface est de ',
1799     .                   lmt_pas
1800c
1801cIM200505        ecrit_mth = NINT(86400./dtime *ecritphy)  ! tous les ecritphy jours
1802c        IF (ok_mensuel) THEN
1803c        WRITE(lunout,*)'La frequence de sortie mensuelle est de ',
1804c    .                   ecrit_mth
1805c        ENDIF
1806c        ecrit_day = NINT(86400./dtime *1.0)  ! tous les jours
1807c        IF (ok_journe) THEN
1808c        WRITE(lunout,*)'La frequence de sortie journaliere est de ',
1809c    .                   ecrit_day
1810c        ENDIF
1811cIM 130904 BEG
1812cIM 080205      ecrit_hf = 86400./dtime *0.25  ! toutes les 6h
1813cIM 170305     
1814c        ecrit_hf = 86400./dtime/12.  ! toutes les 2h
1815cIM 230305     
1816cIM200505        ecrit_hf = 86400./dtime *0.25  ! toutes les 6h
1817c
1818cIM200505        ecrit_hf2mth = ecrit_day/ecrit_hf*30
1819c
1820cIM200505        IF (ok_journe) THEN
1821cIM200505        WRITE(lunout,*)'La frequence de sortie hf est de ',
1822cIM200505    .                   ecrit_hf
1823cIM200505        ENDIF
1824cIM 130904 END
1825ccc         ecrit_ins = NINT(86400./dtime *0.5)  ! 2 fois par jour
1826ccc         ecrit_ins = NINT(86400./dtime *0.25)  ! 4 fois par jour
1827c        ecrit_ins = NINT(86400./dtime/48.)  ! a chaque pas de temps ==> PB. dans time_counter pour 1mois
1828c        ecrit_ins = NINT(86400./dtime/12.)  ! toutes les deux heures
1829cIM200505        ecrit_ins = NINT(86400./dtime/8.)  ! toutes les trois heures
1830cIM200505        IF (ok_instan) THEN
1831cIM200505        WRITE(lunout,*)'La frequence de sortie instant. est de ',
1832cIM200505    .                   ecrit_ins
1833cIM200505        ENDIF
1834cIM200505        ecrit_reg = NINT(86400./dtime *0.25)  ! 4 fois par jour
1835cIM200505        IF (ok_region) THEN
1836cIM200505        WRITE(lunout,*)'La frequence de sortie region est de ',
1837cIM200505    .                   ecrit_reg
1838cIM200505        ENDIF
1839cIM 030306 BEG
1840cIM ecrit_hf2mth = nombre de pas de temps de calcul de hf par mois apres lequel on ecrit
1841cIM : ne pas modifier ecrit_hf2mth
1842c
1843         ecrit_hf2mth = 30*1/ecrit_hf
1844c ecrit_ins en secondes, chaque pas de temps de la physique
1845         ecrit_ins = dtime
1846cIM on passe les frequences de jours en secondes : ecrit_ins, ecrit_hf, ecrit_day, ecrit_mth, ecrit_tra, ecrit_reg
1847         ecrit_hf = ecrit_hf * un_jour
1848         ecrit_day = ecrit_day * un_jour
1849         ecrit_mth = ecrit_mth * un_jour
1850         ecrit_reg = ecrit_reg * un_jour
1851         ecrit_tra = ecrit_tra * un_jour
1852cIM 030306 END
1853c
1854c Initialiser le couplage si necessaire
1855c
1856      npas = 0
1857      nexca = 0
1858      if (ocean == 'couple') then
1859        npas = itaufin/ iphysiq
1860        nexca = 86400 / dtime
1861        write(lunout,*)' ##### Ocean couple #####'
1862        write(lunout,*)' Valeurs des pas de temps'
1863        write(lunout,*)' npas = ', npas
1864        write(lunout,*)' nexca = ', nexca
1865      endif       
1866c
1867      capemaxcels = 't_max(X)'
1868      t2mincels = 't_min(X)'
1869      t2maxcels = 't_max(X)'
1870      tinst = 'inst(X)'
1871      tave = 'ave(X)'
1872cIM cf. AM 081204 BEG
1873      write(lunout,*)'AVANT HIST IFLAG_CON=',iflag_con
1874cIM cf. AM 081204 END
1875c
1876c=============================================================
1877c   Initialisation des sorties
1878c=============================================================
1879
1880#ifdef CPP_IOIPSL
1881
1882#ifdef histhf
1883#include "ini_histhf.h"
1884#endif
1885
1886#ifdef histday
1887#include "ini_histday.h"
1888cIM rajout diagnostiques bilan KP pour analyse MJO par Jun-Ichi Yano
1889c#include "ini_bilKP_ins.h"
1890c#include "ini_bilKP_ave.h"
1891#endif
1892
1893#ifdef histmth
1894#include "ini_histmth.h"
1895#endif
1896
1897#ifdef histins
1898#include "ini_histins.h"
1899#endif
1900
1901#ifdef histISCCP
1902#include "ini_histISCCP.h"
1903#endif
1904
1905#ifdef histmthNMC
1906#include "ini_histmthNMC.h"
1907#endif
1908
1909c#include "ini_histday_seri.h"
1910#include "ini_histday_seri.h"
1911
1912#include "ini_paramLMDZ_phy.h"
1913
1914#endif
1915
1916cXXXPB Positionner date0 pour initialisation de ORCHIDEE
1917      date0 = zjulian
1918C      date0 = day_ini
1919      WRITE(*,*) 'physiq date0 : ',date0
1920c
1921c
1922c
1923c Prescrire l'ozone dans l'atmosphere
1924c
1925c
1926cc         DO i = 1, klon
1927cc         DO k = 1, klev
1928cc            CALL o3cm (paprs(i,k)/100.,paprs(i,k+1)/100., wo(i,k),20)
1929cc         ENDDO
1930cc         ENDDO
1931c
1932#ifdef INCA
1933           call VTe(VTphysiq)
1934           call VTb(VTinca)
1935           iii = MOD(NINT(xjour),360)
1936           calday = FLOAT(iii) + gmtime
1937           WRITE(lunout,*) 'initial time ', xjour, calday
1938#ifdef INCAINFO
1939           WRITE(lunout,*) 'Appel CHEMINI ...'
1940#endif
1941           CALL chemini(
1942     $                   rg,
1943     $                   ra,
1944     $                   airephy,
1945     $                   rlat,
1946     $                   rlon,
1947     $                   presnivs,
1948     $                   calday,
1949     $                   klon,
1950     $                   nqmax,
1951     $                   pdtphys,
1952     $                   annee_ref,
1953     $                   day_ini)
1954#ifdef INCAINFO
1955           WRITE(lunout,*) 'OK.'
1956#endif
1957      call VTe(VTinca)
1958      call VTb(VTphysiq)
1959#endif
1960c
1961      ENDIF
1962c
1963c   ****************     Fin  de   IF ( debut  )   ***************
1964c
1965c
1966c Mettre a zero des variables de sortie (pour securite)
1967c
1968      DO i = 1, klon
1969         d_ps(i) = 0.0
1970      ENDDO
1971      DO k = 1, klev
1972      DO i = 1, klon
1973         d_t(i,k) = 0.0
1974         d_u(i,k) = 0.0
1975         d_v(i,k) = 0.0
1976      ENDDO
1977      ENDDO
1978      DO iq = 1, nqmax
1979      DO k = 1, klev
1980      DO i = 1, klon
1981         d_qx(i,k,iq) = 0.0
1982      ENDDO
1983      ENDDO
1984      ENDDO
1985      da(:,:)=0.
1986      mp(:,:)=0.
1987      phi(:,:,:)=0.
1988c
1989c Ne pas affecter les valeurs entrees de u, v, h, et q
1990c
1991      DO k = 1, klev
1992      DO i = 1, klon
1993         t_seri(i,k)  = t(i,k)
1994         u_seri(i,k)  = u(i,k)
1995         v_seri(i,k)  = v(i,k)
1996         q_seri(i,k)  = qx(i,k,ivap)
1997         ql_seri(i,k) = qx(i,k,iliq)
1998         qs_seri(i,k) = 0.
1999      ENDDO
2000      ENDDO
2001      IF (nqmax.GE.3) THEN
2002      DO iq = 3, nqmax
2003      DO  k = 1, klev
2004      DO  i = 1, klon
2005         tr_seri(i,k,iq-2) = qx(i,k,iq)
2006      ENDDO
2007      ENDDO
2008      ENDDO
2009      ELSE
2010      DO k = 1, klev
2011      DO i = 1, klon
2012         tr_seri(i,k,1) = 0.0
2013      ENDDO
2014      ENDDO
2015      ENDIF
2016C
2017      DO i = 1, klon
2018        ztsol(i) = 0.
2019      ENDDO
2020      DO nsrf = 1, nbsrf
2021        DO i = 1, klon
2022          ztsol(i) = ztsol(i) + ftsol(i,nsrf)*pctsrf(i,nsrf)
2023        ENDDO
2024      ENDDO
2025cIM
2026      IF (ip_ebil_phy.ge.1) THEN
2027        ztit='after dynamic'
2028        CALL diagetpq(airephy,ztit,ip_ebil_phy,1,1,dtime
2029     e      , t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,paprs,pplay
2030     s      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
2031C     Comme les tendances de la physique sont ajoute dans la dynamique,
2032C     on devrait avoir que la variation d'entalpie par la dynamique
2033C     est egale a la variation de la physique au pas de temps precedent.
2034C     Donc la somme de ces 2 variations devrait etre nulle.
2035        call diagphy(airephy,ztit,ip_ebil_phy
2036     e      , zero_v, zero_v, zero_v, zero_v, zero_v
2037     e      , zero_v, zero_v, zero_v, ztsol
2038     e      , d_h_vcol+d_h_vcol_phy, d_qt, 0.
2039     s      , fs_bound, fq_bound )
2040      END IF
2041
2042c Diagnostiquer la tendance dynamique
2043c
2044      IF (ancien_ok) THEN
2045         DO k = 1, klev
2046         DO i = 1, klon
2047            d_t_dyn(i,k) = (t_seri(i,k)-t_ancien(i,k))/dtime
2048            d_q_dyn(i,k) = (q_seri(i,k)-q_ancien(i,k))/dtime
2049         ENDDO
2050         ENDDO
2051      ELSE
2052         DO k = 1, klev
2053         DO i = 1, klon
2054            d_t_dyn(i,k) = 0.0
2055            d_q_dyn(i,k) = 0.0
2056         ENDDO
2057         ENDDO
2058         ancien_ok = .TRUE.
2059      ENDIF
2060c
2061c Ajouter le geopotentiel du sol:
2062c
2063      DO k = 1, klev
2064      DO i = 1, klon
2065         zphi(i,k) = pphi(i,k) + pphis(i)
2066      ENDDO
2067      ENDDO
2068c
2069c Verifier les temperatures
2070c
2071cIM BEG
2072      IF (check) THEN
2073       amn=MIN(ftsol(1,is_ter),1000.)
2074       amx=MAX(ftsol(1,is_ter),-1000.)
2075       DO i=2, klon
2076        amn=MIN(ftsol(i,is_ter),amn)
2077        amx=MAX(ftsol(i,is_ter),amx)
2078       ENDDO
2079c
2080       PRINT*,' debut avant hgardfou min max ftsol',itap,amn,amx
2081      ENDIF !(check) THEN
2082cIM END
2083c
2084      CALL hgardfou(t_seri,ftsol,'debutphy')
2085c
2086cIM BEG
2087      IF (check) THEN
2088       amn=MIN(ftsol(1,is_ter),1000.)
2089       amx=MAX(ftsol(1,is_ter),-1000.)
2090       DO i=2, klon
2091        amn=MIN(ftsol(i,is_ter),amn)
2092        amx=MAX(ftsol(i,is_ter),amx)
2093       ENDDO
2094c
2095       PRINT*,' debut apres hgardfou min max ftsol',itap,amn,amx
2096      ENDIF !(check) THEN
2097cIM END
2098c
2099c Incrementer le compteur de la physique
2100c
2101      itap   = itap + 1
2102      julien = MOD(NINT(xjour),360)
2103      if (julien .eq. 0) julien = 360
2104c
2105c Mettre en action les conditions aux limites (albedo, sst, etc.).
2106c Prescrire l'ozone et calculer l'albedo sur l'ocean.
2107c
2108      IF (MOD(itap-1,lmt_pas) .EQ. 0) THEN
2109         WRITE(lunout,*)' PHYS cond  julien ',julien
2110         CALL ozonecm( FLOAT(julien), rlat, paprs, wo)
2111      ENDIF
2112c
2113c Re-evaporer l'eau liquide nuageuse
2114c
2115      DO k = 1, klev  ! re-evaporation de l'eau liquide nuageuse
2116      DO i = 1, klon
2117         zlvdcp=RLVTT/RCPD/(1.0+RVTMP2*q_seri(i,k))
2118c        zlsdcp=RLSTT/RCPD/(1.0+RVTMP2*q_seri(i,k))
2119         zlsdcp=RLVTT/RCPD/(1.0+RVTMP2*q_seri(i,k))
2120         zdelta = MAX(0.,SIGN(1.,RTT-t_seri(i,k)))
2121         zb = MAX(0.0,ql_seri(i,k))
2122         za = - MAX(0.0,ql_seri(i,k))
2123     .                  * (zlvdcp*(1.-zdelta)+zlsdcp*zdelta)
2124         t_seri(i,k) = t_seri(i,k) + za
2125         q_seri(i,k) = q_seri(i,k) + zb
2126         ql_seri(i,k) = 0.0
2127         d_t_eva(i,k) = za
2128         d_q_eva(i,k) = zb
2129      ENDDO
2130      ENDDO
2131cIM
2132      IF (ip_ebil_phy.ge.2) THEN
2133        ztit='after reevap'
2134        CALL diagetpq(airephy,ztit,ip_ebil_phy,2,1,dtime
2135     e      , t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,paprs,pplay
2136     s      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
2137         call diagphy(airephy,ztit,ip_ebil_phy
2138     e      , zero_v, zero_v, zero_v, zero_v, zero_v
2139     e      , zero_v, zero_v, zero_v, ztsol
2140     e      , d_h_vcol, d_qt, d_ec
2141     s      , fs_bound, fq_bound )
2142C
2143      END IF
2144C
2145c
2146c Appeler la diffusion verticale (programme de couche limite)
2147c
2148      DO i = 1, klon
2149c       if (.not. ok_veget) then
2150c          frugs(i,is_ter) = SQRT(frugs(i,is_ter)**2+rugoro(i)**2)
2151c       endif
2152c         frugs(i,is_lic) = rugoro(i)
2153c         frugs(i,is_oce) = rugmer(i)
2154c         frugs(i,is_sic) = 0.001
2155         zxrugs(i) = 0.0
2156      ENDDO
2157      DO nsrf = 1, nbsrf
2158      DO i = 1, klon
2159c         frugs(i,nsrf) = MAX(frugs(i,nsrf),0.001)
2160        frugs(i,nsrf) = MAX(frugs(i,nsrf),0.000015)
2161      ENDDO
2162      ENDDO
2163      DO nsrf = 1, nbsrf
2164      DO i = 1, klon
2165            zxrugs(i) = zxrugs(i) + frugs(i,nsrf)*pctsrf(i,nsrf)
2166      ENDDO
2167      ENDDO
2168c
2169C calculs necessaires au calcul de l'albedo dans l'interface
2170c
2171      CALL orbite(FLOAT(julien),zlongi,dist)
2172      IF (cycle_diurne) THEN
2173        zdtime=dtime*FLOAT(radpas) ! pas de temps du rayonnement (s)
2174        CALL zenang(zlongi,gmtime,zdtime,rlat,rlon,rmu0,fract)
2175      ELSE
2176        rmu0 = -999.999
2177      ENDIF
2178c
2179C     Calcul de l'abedo moyen par maille
2180      albsol(:)=0.
2181      albsollw(:)=0.
2182      DO nsrf = 1, nbsrf
2183      DO i = 1, klon
2184         albsol(i) = albsol(i) + falbe(i,nsrf) * pctsrf(i,nsrf)
2185         albsollw(i) = albsollw(i) + falblw(i,nsrf) * pctsrf(i,nsrf)
2186      ENDDO
2187      ENDDO
2188C
2189C     Repartition sous maille des flux LW et SW
2190C Modif OM+PASB+JLD
2191C Repartition du longwave par sous-surface linearisee
2192Cn
2193
2194       DO nsrf = 1, nbsrf
2195       DO i = 1, klon
2196c@$$        fsollw(i,nsrf) = sollwdown(i) - RSIGMA*ftsol(i,nsrf)**4
2197c@$$        fsollw(i,nsrf) = sollw(i)
2198         fsollw(i,nsrf) = sollw(i)
2199     $      + 4.0*RSIGMA*ztsol(i)**3 * (ztsol(i)-ftsol(i,nsrf))
2200         fsolsw(i,nsrf) = solsw(i)*(1.-falbe(i,nsrf))/(1.-albsol(i))
2201       ENDDO
2202       ENDDO
2203     
2204cYM   !!!!!!!!!!!!!!!!!!!!!!!!!!!!
2205cYM         Attention verrue
2206cYM    ---> A supprimer plus tard       
2207cYM         pour etre integre dans
2208cYM         ORCHIDEE       
2209      DO i = 1, klon
2210        sollwdown(i)=sollw(i)+RSIGMA*ztsol(i)**4
2211      ENDDO
2212cYM  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!     
2213     
2214      fder = dlw
2215
2216      if (mydebug) then
2217        call writefield_phy('u_seri',u_seri,llm)
2218        call writefield_phy('v_seri',v_seri,llm)
2219        call writefield_phy('t_seri',t_seri,llm)
2220        call writefield_phy('q_seri',q_seri,llm)
2221      endif
2222 
2223      IF (check) THEN
2224       amn=MIN(tslab(1),1000.)
2225       amx=MAX(tslab(1),-1000.)
2226       DO i=2, klon
2227        amn=MIN(tslab(i),amn)
2228        amx=MAX(tslab(i),amx)
2229       ENDDO
2230c
2231       PRINT*,' debut avant clqh min max tslab',amn,amx
2232      ENDIF !(check) THEN
2233c
2234      CALL clmain(dtime,itap,date0,pctsrf,pctsrf_new,
2235     e            t_seri,q_seri,u_seri,v_seri,
2236     e            julien, rmu0, co2_ppm,
2237     e            ok_veget, ocean, npas, nexca, ftsol,
2238     $            soil_model,cdmmax, cdhmax,
2239     $            ksta, ksta_ter, ok_kzmin, ftsoil, qsol,
2240cIM BAD    $            paprs,pplay,radsol, fsnow,fqsurf,fevap,falbe,falblw,
2241     $            paprs,pplay, fsnow,fqsurf,fevap,falbe,falblw,
2242     $            fluxlat,
2243     e            rain_fall, snow_fall,
2244     e            fsolsw, fsollw, sollwdown, fder,
2245     e            rlon, rlat, cuphy, cvphy, frugs,
2246     e            debut, lafin, agesno,rugoro ,
2247     s            d_t_vdf,d_q_vdf,d_u_vdf,d_v_vdf,d_ts,
2248     s            fluxt,fluxq,fluxu,fluxv,cdragh,cdragm,
2249     s            q2,
2250     s            dsens, devap,
2251     s            ycoefh,yu1,yv1, t2m, q2m, u10m, v10m,
2252     s            pblh,capCL,oliqCL,cteiCL,pblT,
2253     s            therm,trmb1,trmb2,trmb3,plcl,
2254     s            fqcalving, fqfonte,ffonte, run_off_lic_0,
2255cIM "slab" ocean
2256     s            fluxo, fluxg, tslab, seaice)
2257c
2258CXXX PB
2259CXXX Incrementation des flux
2260CXXX
2261
2262      zxfluxt=0.
2263      zxfluxq=0.
2264      zxfluxu=0.
2265      zxfluxv=0.
2266      DO nsrf = 1, nbsrf
2267        DO k = 1, klev
2268          DO i = 1, klon
2269            zxfluxt(i,k) = zxfluxt(i,k) +
2270     $          fluxt(i,k,nsrf) * pctsrf( i, nsrf)
2271            zxfluxq(i,k) = zxfluxq(i,k) +
2272     $          fluxq(i,k,nsrf) * pctsrf( i, nsrf)
2273            zxfluxu(i,k) = zxfluxu(i,k) +
2274     $          fluxu(i,k,nsrf) * pctsrf( i, nsrf)
2275            zxfluxv(i,k) = zxfluxv(i,k) +
2276     $          fluxv(i,k,nsrf) * pctsrf( i, nsrf)
2277          END DO
2278        END DO
2279      END DO
2280      DO i = 1, klon
2281         sens(i) = - zxfluxt(i,1) ! flux de chaleur sensible au sol
2282c         evap(i) = - fluxq(i,1) ! flux d'evaporation au sol
2283         evap(i) = - zxfluxq(i,1) ! flux d'evaporation au sol
2284         fder(i) = dlw(i) + dsens(i) + devap(i)
2285      ENDDO
2286
2287
2288      DO k = 1, klev
2289      DO i = 1, klon
2290         t_seri(i,k) = t_seri(i,k) + d_t_vdf(i,k)
2291         q_seri(i,k) = q_seri(i,k) + d_q_vdf(i,k)
2292         u_seri(i,k) = u_seri(i,k) + d_u_vdf(i,k)
2293         v_seri(i,k) = v_seri(i,k) + d_v_vdf(i,k)
2294      ENDDO
2295      ENDDO
2296
2297      if (mydebug) then
2298        call writefield_phy('u_seri',u_seri,llm)
2299        call writefield_phy('v_seri',v_seri,llm)
2300        call writefield_phy('t_seri',t_seri,llm)
2301        call writefield_phy('q_seri',q_seri,llm)
2302      endif
2303
2304
2305cIM
2306      IF (ip_ebil_phy.ge.2) THEN
2307        ztit='after clmain'
2308        CALL diagetpq(airephy,ztit,ip_ebil_phy,2,2,dtime
2309     e      , t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,paprs,pplay
2310     s      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
2311         call diagphy(airephy,ztit,ip_ebil_phy
2312     e      , zero_v, zero_v, zero_v, zero_v, sens
2313     e      , evap  , zero_v, zero_v, ztsol
2314     e      , d_h_vcol, d_qt, d_ec
2315     s      , fs_bound, fq_bound )
2316      END IF
2317C
2318c
2319c Incrementer la temperature du sol
2320c
2321      DO i = 1, klon
2322         zxtsol(i) = 0.0
2323         zxfluxlat(i) = 0.0
2324c
2325         zt2m(i) = 0.0
2326         zq2m(i) = 0.0
2327         zu10m(i) = 0.0
2328         zv10m(i) = 0.0
2329cIM cf JLD ??
2330         zxffonte(i) = 0.0
2331         zxfqcalving(i) = 0.0
2332         zxfqfonte(i) = 0.0
2333cIM cf. AM 081204 BEG
2334c
2335         s_pblh(i) = 0.0
2336         s_lcl(i) = 0.0
2337         s_capCL(i) = 0.0
2338         s_oliqCL(i) = 0.0
2339         s_cteiCL(i) = 0.0
2340         s_pblT(i) = 0.0
2341         s_therm(i) = 0.0
2342         s_trmb1(i) = 0.0
2343         s_trmb2(i) = 0.0
2344         s_trmb3(i) = 0.0
2345c
2346         IF ( abs( pctsrf(i, is_ter) + pctsrf(i, is_lic) +
2347     $       pctsrf(i, is_oce) + pctsrf(i, is_sic)  - 1.) .GT. EPSFRA)
2348     $       THEN
2349             WRITE(*,*) 'physiq : pb sous surface au point ', i,
2350     $           pctsrf(i, 1 : nbsrf)
2351         ENDIF
2352      ENDDO
2353      DO nsrf = 1, nbsrf
2354        DO i = 1, klon
2355c        IF (pctsrf(i,nsrf) .GE. EPSFRA) THEN
2356            ftsol(i,nsrf) = ftsol(i,nsrf) + d_ts(i,nsrf)
2357cIM cf. JLD
2358            wfbils(i,nsrf) = ( fsolsw(i,nsrf) + fsollw(i,nsrf)
2359     $         + fluxt(i,1,nsrf) + fluxlat(i,nsrf) ) * pctsrf(i,nsrf)
2360cIM
2361            wfbilo(i,nsrf) = ( fevap(i,nsrf) -
2362     $      (rain_fall(i) + snow_fall(i)) ) * pctsrf(i,nsrf)
2363            zxtsol(i) = zxtsol(i) + ftsol(i,nsrf)*pctsrf(i,nsrf)
2364            zxfluxlat(i) = zxfluxlat(i) + fluxlat(i,nsrf)*pctsrf(i,nsrf)
2365cccIM
2366            zt2m(i) = zt2m(i) + t2m(i,nsrf)*pctsrf(i,nsrf)
2367            zq2m(i) = zq2m(i) + q2m(i,nsrf)*pctsrf(i,nsrf)
2368            zu10m(i) = zu10m(i) + u10m(i,nsrf)*pctsrf(i,nsrf)
2369            zv10m(i) = zv10m(i) + v10m(i,nsrf)*pctsrf(i,nsrf)
2370cIM cf JLD ??
2371            zxffonte(i) = zxffonte(i) + ffonte(i,nsrf)*pctsrf(i,nsrf)
2372            zxfqcalving(i) = zxfqcalving(i) +
2373     .                      fqcalving(i,nsrf)*pctsrf(i,nsrf)
2374            zxfqfonte(i) = zxfqfonte(i) +
2375     .                      fqfonte(i,nsrf)*pctsrf(i,nsrf)
2376cIM cf. AM 081204 BEG
2377            s_pblh(i) = s_pblh(i) + pblh(i,nsrf)*pctsrf(i,nsrf)
2378            s_lcl(i) = s_lcl(i) + plcl(i,nsrf)*pctsrf(i,nsrf)
2379            s_capCL(i) = s_capCL(i) + capCL(i,nsrf) *pctsrf(i,nsrf)
2380            s_oliqCL(i) = s_oliqCL(i) + oliqCL(i,nsrf) *pctsrf(i,nsrf)
2381            s_cteiCL(i) = s_cteiCL(i) + cteiCL(i,nsrf) *pctsrf(i,nsrf)
2382            s_pblT(i) = s_pblT(i) + pblT(i,nsrf) *pctsrf(i,nsrf)
2383            s_therm(i) = s_therm(i) + therm(i,nsrf) *pctsrf(i,nsrf)
2384            s_trmb1(i) = s_trmb1(i) + trmb1(i,nsrf) *pctsrf(i,nsrf)
2385            s_trmb2(i) = s_trmb2(i) + trmb2(i,nsrf) *pctsrf(i,nsrf)
2386            s_trmb3(i) = s_trmb3(i) + trmb3(i,nsrf) *pctsrf(i,nsrf)
2387c        ENDIF
2388        ENDDO
2389      ENDDO
2390
2391      IF (check) THEN
2392       amn=MIN(ftsol(1,is_ter),1000.)
2393       amx=MAX(ftsol(1,is_ter),-1000.)
2394       DO i=2, klon
2395        amn=MIN(ftsol(i,is_ter),amn)
2396        amx=MAX(ftsol(i,is_ter),amx)
2397       ENDDO
2398c
2399       PRINT*,' debut apres d_ts min max ftsol',itap,amn,amx
2400      ENDIF !(check) THEN
2401c
2402c Si une sous-fraction n'existe pas, elle prend la temp. moyenne
2403c
2404      DO nsrf = 1, nbsrf
2405        DO i = 1, klon
2406          IF (pctsrf(i,nsrf) .LT. epsfra.OR.t2m(i,nsrf).EQ.0.) THEN
2407           ftsol(i,nsrf) = zxtsol(i)
2408           t2m(i,nsrf) = zt2m(i)
2409           q2m(i,nsrf) = zq2m(i)
2410           u10m(i,nsrf) = zu10m(i)
2411           v10m(i,nsrf) = zv10m(i)
2412           ffonte(i,nsrf) = zxffonte(i)
2413           fqcalving(i,nsrf) = zxfqcalving(i)
2414           fqfonte(i,nsrf) = zxfqfonte(i)
2415           pblh(i,nsrf)=s_pblh(i)
2416           plcl(i,nsrf)=s_lcl(i)
2417           capCL(i,nsrf)=s_capCL(i)
2418           oliqCL(i,nsrf)=s_oliqCL(i)
2419           cteiCL(i,nsrf)=s_cteiCL(i)
2420           pblT(i,nsrf)=s_pblT(i)
2421           therm(i,nsrf)=s_therm(i)
2422           trmb1(i,nsrf)=s_trmb1(i)
2423           trmb2(i,nsrf)=s_trmb2(i)
2424           trmb3(i,nsrf)=s_trmb3(i)
2425          ENDIF
2426        ENDDO
2427      ENDDO
2428c
2429c Calculer la derive du flux infrarouge
2430c
2431cXXX      DO nsrf = 1, nbsrf
2432      DO i = 1, klon
2433cXXX        IF (pctsrf(i,nsrf) .GE. EPSFRA) THEN
2434            dlw(i) = - 4.0*RSIGMA*zxtsol(i)**3
2435cXXX     .          *(ftsol(i,nsrf)-zxtsol(i))
2436cXXX     .          *pctsrf(i,nsrf)
2437cXXX        ENDIF
2438cXXX      ENDDO
2439      ENDDO
2440c
2441c Appeler la convection (au choix)
2442c
2443      DO k = 1, klev
2444      DO i = 1, klon
2445         conv_q(i,k) = d_q_dyn(i,k)
2446     .               + d_q_vdf(i,k)/dtime
2447         conv_t(i,k) = d_t_dyn(i,k)
2448     .               + d_t_vdf(i,k)/dtime
2449      ENDDO
2450      ENDDO
2451      IF (check) THEN
2452         za = qcheck(klon,klev,paprs,q_seri,ql_seri,airephy)
2453         WRITE(lunout,*) "avantcon=", za
2454      ENDIF
2455      zx_ajustq = .FALSE.
2456      IF (iflag_con.EQ.2) zx_ajustq=.TRUE.
2457      IF (zx_ajustq) THEN
2458         DO i = 1, klon
2459            z_avant(i) = 0.0
2460         ENDDO
2461         DO k = 1, klev
2462         DO i = 1, klon
2463            z_avant(i) = z_avant(i) + (q_seri(i,k)+ql_seri(i,k))
2464     .                        *(paprs(i,k)-paprs(i,k+1))/RG
2465         ENDDO
2466         ENDDO
2467      ENDIF
2468      IF (iflag_con.EQ.1) THEN
2469          stop'reactiver le call conlmd dans physiq.F'
2470c     CALL conlmd (dtime, paprs, pplay, t_seri, q_seri, conv_q,
2471c    .             d_t_con, d_q_con,
2472c    .             rain_con, snow_con, ibas_con, itop_con)
2473      ELSE IF (iflag_con.EQ.2) THEN
2474      CALL conflx(dtime, paprs, pplay, t_seri, q_seri,
2475     e            conv_t, conv_q, zxfluxq(1,1), omega,
2476     s            d_t_con, d_q_con, rain_con, snow_con,
2477     s            pmfu, pmfd, pen_u, pde_u, pen_d, pde_d,
2478     s            kcbot, kctop, kdtop, pmflxr, pmflxs)
2479      WHERE (rain_con < 0.) rain_con = 0.
2480      WHERE (snow_con < 0.) snow_con = 0.
2481      DO i = 1, klon
2482         ibas_con(i) = klev+1 - kcbot(i)
2483         itop_con(i) = klev+1 - kctop(i)
2484      ENDDO
2485      ELSE IF (iflag_con.GE.3) THEN
2486c nb of tracers for the KE convection:
2487c MAF la partie traceurs est faite dans phytrac
2488c on met ntra=1 pour limiter les appels mais on peut
2489c supprimer les calculs / ftra.
2490              ntra = 1
2491c sb, oct02:
2492c Schema de convection modularise et vectorise:
2493c (driver commun aux versions 3 et 4)
2494c
2495          IF (ok_cvl) THEN ! new driver for convectL
2496
2497          CALL concvl (iflag_con,
2498     .        dtime,paprs,pplay,t_seri,q_seri,
2499     .        u_seri,v_seri,tr_seri,ntra,
2500     .        ema_work1,ema_work2,
2501     .        d_t_con,d_q_con,d_u_con,d_v_con,d_tr,
2502     .        rain_con, snow_con, ibas_con, itop_con,
2503     .        upwd,dnwd,dnwd0,
2504     .        Ma,cape,tvp,iflagctrl,
2505     .        pbase,bbase,dtvpdt1,dtvpdq1,dplcldt,dplcldr,qcondc,wd,
2506     .        pmflxr,pmflxs,
2507     .        da,phi,mp)
2508
2509cIM cf. FH
2510              clwcon0=qcondc
2511              pmfu(:,:)=upwd(:,:)+dnwd(:,:)
2512
2513          ELSE ! ok_cvl
2514c MAF conema3 ne contient pas les traceurs
2515          CALL conema3 (dtime,
2516     .        paprs,pplay,t_seri,q_seri,
2517     .        u_seri,v_seri,tr_seri,ntra,
2518     .        ema_work1,ema_work2,
2519     .        d_t_con,d_q_con,d_u_con,d_v_con,d_tr,
2520     .        rain_con, snow_con, ibas_con, itop_con,
2521     .        upwd,dnwd,dnwd0,bas,top,
2522     .        Ma,cape,tvp,rflag,
2523     .        pbase
2524     .        ,bbase,dtvpdt1,dtvpdq1,dplcldt,dplcldr
2525     .        ,clwcon0)
2526
2527          ENDIF ! ok_cvl
2528
2529c
2530c Correction precip
2531          rain_con = rain_con * cvl_corr
2532          snow_con = snow_con * cvl_corr
2533c
2534
2535           IF (.NOT. ok_gust) THEN
2536           do i = 1, klon
2537            wd(i)=0.0
2538           enddo
2539           ENDIF
2540
2541c =================================================================== c
2542c Calcul des proprietes des nuages convectifs
2543c
2544      DO k = 1, klev
2545      DO i = 1, klon
2546         zx_t = t_seri(i,k)
2547         IF (thermcep) THEN
2548            zdelta = MAX(0.,SIGN(1.,rtt-zx_t))
2549            zx_qs  = r2es * FOEEW(zx_t,zdelta)/pplay(i,k)
2550            zx_qs  = MIN(0.5,zx_qs)
2551            zcor   = 1./(1.-retv*zx_qs)
2552            zx_qs  = zx_qs*zcor
2553         ELSE
2554           IF (zx_t.LT.t_coup) THEN
2555              zx_qs = qsats(zx_t)/pplay(i,k)
2556           ELSE
2557              zx_qs = qsatl(zx_t)/pplay(i,k)
2558           ENDIF
2559         ENDIF
2560         zqsat(i,k)=zx_qs
2561      ENDDO
2562      ENDDO
2563
2564c   calcul des proprietes des nuages convectifs
2565             clwcon0(:,:)=fact_cldcon*clwcon0(:,:)
2566             call clouds_gno
2567     s       (klon,klev,q_seri,zqsat,clwcon0,ptconv,ratqsc,rnebcon0)
2568
2569c =================================================================== c
2570
2571          DO i = 1, klon
2572            ema_pcb(i)  = pbase(i)
2573          ENDDO
2574          DO i = 1, klon
2575            ema_pct(i)  = paprs(i,itop_con(i))
2576          ENDDO
2577          DO i = 1, klon
2578            ema_cbmf(i) = ema_workcbmf(i)
2579          ENDDO     
2580      ELSE
2581          WRITE(lunout,*) "iflag_con non-prevu", iflag_con
2582          CALL abort
2583      ENDIF
2584
2585c     CALL homogene(paprs, q_seri, d_q_con, u_seri,v_seri,
2586c    .              d_u_con, d_v_con)
2587
2588      DO k = 1, klev
2589        DO i = 1, klon
2590         t_seri(i,k) = t_seri(i,k) + d_t_con(i,k)
2591         q_seri(i,k) = q_seri(i,k) + d_q_con(i,k)
2592         u_seri(i,k) = u_seri(i,k) + d_u_con(i,k)
2593         v_seri(i,k) = v_seri(i,k) + d_v_con(i,k)
2594        ENDDO
2595      ENDDO
2596
2597      if (mydebug) then
2598        call writefield_phy('u_seri',u_seri,llm)
2599        call writefield_phy('v_seri',v_seri,llm)
2600        call writefield_phy('t_seri',t_seri,llm)
2601        call writefield_phy('q_seri',q_seri,llm)
2602      endif
2603
2604cIM
2605      IF (ip_ebil_phy.ge.2) THEN
2606        ztit='after convect'
2607        CALL diagetpq(airephy,ztit,ip_ebil_phy,2,2,dtime
2608     e      , t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,paprs,pplay
2609     s      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
2610         call diagphy(airephy,ztit,ip_ebil_phy
2611     e      , zero_v, zero_v, zero_v, zero_v, zero_v
2612     e      , zero_v, rain_con, snow_con, ztsol
2613     e      , d_h_vcol, d_qt, d_ec
2614     s      , fs_bound, fq_bound )
2615      END IF
2616C
2617      IF (check) THEN
2618          za = qcheck(klon,klev,paprs,q_seri,ql_seri,airephy)
2619          WRITE(lunout,*)"aprescon=", za
2620          zx_t = 0.0
2621          za = 0.0
2622          DO i = 1, klon
2623            za = za + airephy(i)/FLOAT(klon)
2624            zx_t = zx_t + (rain_con(i)+
2625     .                   snow_con(i))*airephy(i)/FLOAT(klon)
2626          ENDDO
2627          zx_t = zx_t/za*dtime
2628          WRITE(lunout,*)"Precip=", zx_t
2629      ENDIF
2630      IF (zx_ajustq) THEN
2631          DO i = 1, klon
2632            z_apres(i) = 0.0
2633          ENDDO
2634          DO k = 1, klev
2635            DO i = 1, klon
2636              z_apres(i) = z_apres(i) + (q_seri(i,k)+ql_seri(i,k))
2637     .            *(paprs(i,k)-paprs(i,k+1))/RG
2638            ENDDO
2639          ENDDO
2640          DO i = 1, klon
2641            z_factor(i) = (z_avant(i)-(rain_con(i)+snow_con(i))*dtime)
2642     .          /z_apres(i)
2643          ENDDO
2644          DO k = 1, klev
2645            DO i = 1, klon
2646              IF (z_factor(i).GT.(1.0+1.0E-08) .OR.
2647     .            z_factor(i).LT.(1.0-1.0E-08)) THEN
2648                  q_seri(i,k) = q_seri(i,k) * z_factor(i)
2649              ENDIF
2650            ENDDO
2651          ENDDO
2652      ENDIF
2653      zx_ajustq=.FALSE.
2654c
2655c===================================================================
2656c Convection seche (thermiques ou ajustement)
2657c===================================================================
2658c
2659      d_t_ajs(:,:)=0.
2660      d_u_ajs(:,:)=0.
2661      d_v_ajs(:,:)=0.
2662      d_q_ajs(:,:)=0.
2663      fm_therm(:,:)=0.
2664      entr_therm(:,:)=0.
2665c
2666      IF(prt_level>9)WRITE(lunout,*)
2667     .    'AVANT LA CONVECTION SECHE , iflag_thermals='
2668     s   ,iflag_thermals,'   nsplit_thermals=',nsplit_thermals
2669      if(iflag_thermals.lt.0) then
2670c  Rien
2671c  ====
2672         IF(prt_level>9)WRITE(lunout,*)'pas de convection'
2673      else if(iflag_thermals.eq.0) then
2674
2675c  Ajustement sec
2676c  ==============
2677         IF(prt_level>9)WRITE(lunout,*)'ajsec'
2678         CALL ajsec(paprs, pplay, t_seri,q_seri, d_t_ajs, d_q_ajs)
2679         t_seri(:,:) = t_seri(:,:) + d_t_ajs(:,:)
2680         q_seri(:,:) = q_seri(:,:) + d_q_ajs(:,:)
2681      else
2682c  Thermiques
2683c  ==========
2684         IF(prt_level>9)WRITE(lunout,*)'JUSTE AVANT , iflag_thermals='
2685     s   ,iflag_thermals,'   nsplit_thermals=',nsplit_thermals
2686         call calltherm(pdtphys
2687     s      ,pplay,paprs,pphi
2688     s      ,u_seri,v_seri,t_seri,q_seri
2689     s      ,d_u_ajs,d_v_ajs,d_t_ajs,d_q_ajs
2690     s      ,fm_therm,entr_therm)
2691      endif
2692c
2693c===================================================================
2694cIM
2695      IF (ip_ebil_phy.ge.2) THEN
2696        ztit='after dry_adjust'
2697        CALL diagetpq(airephy,ztit,ip_ebil_phy,2,2,dtime
2698     e      , t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,paprs,pplay
2699     s      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
2700      END IF
2701
2702
2703c-------------------------------------------------------------------------
2704c  Caclul des ratqs
2705c-------------------------------------------------------------------------
2706
2707c      print*,'calcul des ratqs'
2708c   ratqs convectifs a l'ancienne en fonction de q(z=0)-q / q
2709c   ----------------
2710c   on ecrase le tableau ratqsc calcule par clouds_gno
2711      if (iflag_cldcon.eq.1) then
2712         do k=1,klev
2713         do i=1,klon
2714            if(ptconv(i,k)) then
2715              ratqsc(i,k)=ratqsbas
2716     s        +fact_cldcon*(q_seri(i,1)-q_seri(i,k))/q_seri(i,k)
2717            else
2718               ratqsc(i,k)=0.
2719            endif
2720         enddo
2721         enddo
2722      endif
2723
2724c   ratqs stables
2725c   -------------
2726      do k=1,klev
2727cIM RAJOUT boucle do=i
2728       do i=1, klon
2729cIM         ratqss(:,k)=ratqsbas+(ratqshaut-ratqsbas)*
2730cIM     s   min((paprs(:,1)-pplay(:,k))/(paprs(:,1)-30000.),1.)
2731         ratqss(i,k)=ratqsbas+(ratqshaut-ratqsbas)*
2732     s   min((paprs(i,1)-pplay(i,k))/(paprs(i,1)-30000.),1.)
2733cIM      print*,' IMratqs STABLE i, k',i,k,ratqss(i,k)
2734       enddo
2735      enddo
2736
2737
2738c  ratqs final
2739c  -----------
2740      if (iflag_cldcon.eq.1 .or.iflag_cldcon.eq.2) then
2741c   les ratqs sont une conbinaison de ratqss et ratqsc
2742c   ratqs final
2743c   1e4 (en gros 3 heures), en dur pour le moment, est le temps de
2744c   relaxation des ratqs
2745c         facttemps=exp(-pdtphys/1.e4)
2746         facteur=exp(-pdtphys*facttemps)
2747         ratqs(:,:)=max(ratqs(:,:)*facteur,ratqss(:,:))
2748         ratqs(:,:)=max(ratqs(:,:),ratqsc(:,:))
2749c         print*,'calcul des ratqs fini'
2750      else
2751c   on ne prend que le ratqs stable pour fisrtilp
2752         ratqs(:,:)=ratqss(:,:)
2753      endif
2754
2755
2756c
2757c Appeler le processus de condensation a grande echelle
2758c et le processus de precipitation
2759c-------------------------------------------------------------------------
2760      CALL fisrtilp(dtime,paprs,pplay,
2761     .           t_seri, q_seri,ptconv,ratqs,
2762     .           d_t_lsc, d_q_lsc, d_ql_lsc, rneb, cldliq,
2763     .           rain_lsc, snow_lsc,
2764     .           pfrac_impa, pfrac_nucl, pfrac_1nucl,
2765     .           frac_impa, frac_nucl,
2766     .           prfl, psfl, rhcl)
2767
2768      WHERE (rain_lsc < 0) rain_lsc = 0.
2769      WHERE (snow_lsc < 0) snow_lsc = 0.
2770      DO k = 1, klev
2771      DO i = 1, klon
2772         t_seri(i,k) = t_seri(i,k) + d_t_lsc(i,k)
2773         q_seri(i,k) = q_seri(i,k) + d_q_lsc(i,k)
2774         ql_seri(i,k) = ql_seri(i,k) + d_ql_lsc(i,k)
2775         cldfra(i,k) = rneb(i,k)
2776         IF (.NOT.new_oliq) cldliq(i,k) = ql_seri(i,k)
2777      ENDDO
2778      ENDDO
2779      IF (check) THEN
2780         za = qcheck(klon,klev,paprs,q_seri,ql_seri,airephy)
2781         WRITE(lunout,*)"apresilp=", za
2782         zx_t = 0.0
2783         za = 0.0
2784         DO i = 1, klon
2785            za = za + airephy(i)/FLOAT(klon)
2786            zx_t = zx_t + (rain_lsc(i)
2787     .                  + snow_lsc(i))*airephy(i)/FLOAT(klon)
2788        ENDDO
2789         zx_t = zx_t/za*dtime
2790         WRITE(lunout,*)"Precip=", zx_t
2791      ENDIF
2792cIM
2793      IF (ip_ebil_phy.ge.2) THEN
2794        ztit='after fisrt'
2795        CALL diagetpq(airephy,ztit,ip_ebil_phy,2,2,dtime
2796     e      , t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,paprs,pplay
2797     s      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
2798        call diagphy(airephy,ztit,ip_ebil_phy
2799     e      , zero_v, zero_v, zero_v, zero_v, zero_v
2800     e      , zero_v, rain_lsc, snow_lsc, ztsol
2801     e      , d_h_vcol, d_qt, d_ec
2802     s      , fs_bound, fq_bound )
2803      END IF
2804
2805      if (mydebug) then
2806        call writefield_phy('u_seri',u_seri,llm)
2807        call writefield_phy('v_seri',v_seri,llm)
2808        call writefield_phy('t_seri',t_seri,llm)
2809        call writefield_phy('q_seri',q_seri,llm)
2810      endif
2811
2812c
2813c-------------------------------------------------------------------
2814c  PRESCRIPTION DES NUAGES POUR LE RAYONNEMENT
2815c-------------------------------------------------------------------
2816
2817c 1. NUAGES CONVECTIFS
2818c
2819cIM cf FH
2820c     IF (iflag_cldcon.eq.-1) THEN ! seulement pour Tiedtke
2821       IF (iflag_cldcon.le.-1) THEN ! seulement pour Tiedtke
2822       snow_tiedtke=0.
2823c     print*,'avant calcul de la pseudo precip '
2824c     print*,'iflag_cldcon',iflag_cldcon
2825       if (iflag_cldcon.eq.-1) then
2826          rain_tiedtke=rain_con
2827       else
2828c       print*,'calcul de la pseudo precip '
2829          rain_tiedtke=0.
2830c         print*,'calcul de la pseudo precip 0'
2831          do k=1,klev
2832          do i=1,klon
2833             if (d_q_con(i,k).lt.0.) then
2834                rain_tiedtke(i)=rain_tiedtke(i)-d_q_con(i,k)/pdtphys
2835     s         *(paprs(i,k)-paprs(i,k+1))/rg
2836             endif
2837          enddo
2838          enddo
2839       endif
2840c
2841c     call dump2d(iim,jjm,rain_tiedtke(2:klon-1),'PSEUDO PRECIP ')
2842c
2843
2844c Nuages diagnostiques pour Tiedtke
2845      CALL diagcld1(paprs,pplay,
2846cIM cf FH  .             rain_con,snow_con,ibas_con,itop_con,
2847     .             rain_tiedtke,snow_tiedtke,ibas_con,itop_con,
2848     .             diafra,dialiq)
2849      DO k = 1, klev
2850      DO i = 1, klon
2851      IF (diafra(i,k).GT.cldfra(i,k)) THEN
2852         cldliq(i,k) = dialiq(i,k)
2853         cldfra(i,k) = diafra(i,k)
2854      ENDIF
2855      ENDDO
2856      ENDDO
2857
2858      ELSE IF (iflag_cldcon.eq.3) THEN
2859c  On prend pour les nuages convectifs le max du calcul de la
2860c  convection et du calcul du pas de temps precedent diminue d'un facteur
2861c  facttemps
2862c      facttemps=pdtphys/1.e4
2863      facteur = pdtphys *facttemps
2864      do k=1,klev
2865         do i=1,klon
2866            rnebcon(i,k)=rnebcon(i,k)*facteur
2867            if (rnebcon0(i,k)*clwcon0(i,k).gt.rnebcon(i,k)*clwcon(i,k))
2868     s      then
2869                rnebcon(i,k)=rnebcon0(i,k)
2870                clwcon(i,k)=clwcon0(i,k)
2871            endif
2872         enddo
2873      enddo
2874
2875c
2876cjq - introduce the aerosol direct and first indirect radiative forcings
2877cjq - Johannes Quaas, 27/11/2003 (quaas@lmd.jussieu.fr)
2878      IF (ok_ade.OR.ok_aie) THEN
2879         ! Get sulfate aerosol distribution
2880         CALL readsulfate(rjourvrai, debut, sulfate)
2881         CALL readsulfate_preind(rjourvrai, debut, sulfate_pi)
2882
2883         ! Calculate aerosol optical properties (Olivier Boucher)
2884         CALL aeropt(pplay, paprs, t_seri, sulfate, rhcl,
2885     .        tau_ae, piz_ae, cg_ae, aerindex)
2886cym
2887      ELSE
2888        tau_ae(:,:,:)=0.0
2889        piz_ae(:,:,:)=0.0
2890        cg_ae(:,:,:)=0.0
2891cym     
2892      ENDIF
2893
2894c
2895cIM calcul nuages par le simulateur ISCCP
2896c
2897      IF (ok_isccp) THEN
2898#include "calcul_simulISCCP.h"
2899      ENDIF !ok_isccp
2900
2901c   On prend la somme des fractions nuageuses et des contenus en eau
2902      cldfra(:,:)=min(max(cldfra(:,:),rnebcon(:,:)),1.)
2903      cldliq(:,:)=cldliq(:,:)+rnebcon(:,:)*clwcon(:,:)
2904
2905      ENDIF
2906
2907c
2908c 2. NUAGES STARTIFORMES
2909c
2910      IF (ok_stratus) THEN
2911      CALL diagcld2(paprs,pplay,t_seri,q_seri, diafra,dialiq)
2912      DO k = 1, klev
2913      DO i = 1, klon
2914      IF (diafra(i,k).GT.cldfra(i,k)) THEN
2915         cldliq(i,k) = dialiq(i,k)
2916         cldfra(i,k) = diafra(i,k)
2917      ENDIF
2918      ENDDO
2919      ENDDO
2920      ENDIF
2921c
2922c Precipitation totale
2923c
2924      DO i = 1, klon
2925         rain_fall(i) = rain_con(i) + rain_lsc(i)
2926         snow_fall(i) = snow_con(i) + snow_lsc(i)
2927      ENDDO
2928cIM
2929      IF (ip_ebil_phy.ge.2) THEN
2930        ztit="after diagcld"
2931        CALL diagetpq(airephy,ztit,ip_ebil_phy,2,2,dtime
2932     e      , t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,paprs,pplay
2933     s      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
2934      END IF
2935c
2936c Calculer l'humidite relative pour diagnostique
2937c
2938      DO k = 1, klev
2939      DO i = 1, klon
2940         zx_t = t_seri(i,k)
2941         IF (thermcep) THEN
2942            zdelta = MAX(0.,SIGN(1.,rtt-zx_t))
2943            zx_qs  = r2es * FOEEW(zx_t,zdelta)/pplay(i,k)
2944            zx_qs  = MIN(0.5,zx_qs)
2945            zcor   = 1./(1.-retv*zx_qs)
2946            zx_qs  = zx_qs*zcor
2947         ELSE
2948           IF (zx_t.LT.t_coup) THEN
2949              zx_qs = qsats(zx_t)/pplay(i,k)
2950           ELSE
2951              zx_qs = qsatl(zx_t)/pplay(i,k)
2952           ENDIF
2953         ENDIF
2954         zx_rh(i,k) = q_seri(i,k)/zx_qs
2955         zqsat(i,k)=zx_qs
2956      ENDDO
2957      ENDDO
2958c
2959cIM Calculer l'humidite relative a 2m (rh2m) pour diagnostique
2960cIM ajout dependance type surface
2961      DO i = 1, klon
2962       rh2m(i)=0.
2963       qsat2m(i)=0.
2964      DO nsrf=1, nbsrf
2965         zx_t1(i,nsrf) = t2m(i,nsrf)
2966         IF (thermcep) THEN
2967            zdelta1(i,nsrf) = MAX(0.,SIGN(1.,rtt-zx_t1(i,nsrf)))
2968            zx_qs1(i,nsrf)  = r2es *
2969     $      FOEEW(zx_t1(i,nsrf),zdelta1(i,nsrf))/paprs(i,1)
2970            zx_qs1(i,nsrf)  = MIN(0.5,zx_qs1(i,nsrf))
2971            zcor1(i,nsrf)   = 1./(1.-retv*zx_qs1(i,nsrf))
2972            zx_qs1(i,nsrf)  = zx_qs1(i,nsrf)*zcor1(i,nsrf)
2973         ELSE
2974c
2975           IF (zx_t.LT.RTT) THEN
2976              zx_qs = qsats(zx_t)/paprs(i,1)
2977           ELSE
2978              zx_qs = qsatl(zx_t)/paprs(i,1)
2979           ENDIF
2980         ENDIF
2981       zx_rh2m(i,nsrf) = q2m(i,nsrf)/zx_qs1(i,nsrf)
2982       zx_qsat2m(i,nsrf)=zx_qs1(i,nsrf)
2983       rh2m(i) = rh2m(i)+zx_rh2m(i,nsrf)*pctsrf(i,nsrf)
2984       qsat2m(i)=qsat2m(i)+zx_qsat2m(i,nsrf)*pctsrf(i,nsrf)
2985      ENDDO !nsrf
2986      ENDDO
2987c
2988cIM Calcul temp.potentielle a 2m (tpot) et temp. potentielle
2989c   equivalente a 2m (tpote) pour diagnostique
2990c
2991      DO i = 1, klon
2992       tpot(i)=zt2m(i)*(100000./paprs(i,1))**RKAPPA
2993       IF (thermcep) THEN
2994        IF(zt2m(i).LT.RTT) then
2995         Lheat=RLSTT
2996        ELSE
2997         Lheat=RLVTT
2998        ENDIF
2999       ELSE
3000        IF (zt2m(i).LT.RTT) THEN
3001         Lheat=RLSTT
3002        ELSE
3003         Lheat=RLVTT
3004        ENDIF
3005       ENDIF
3006       tpote(i) = tpot(i)*     
3007     . EXP((Lheat *qsat2m(i))/(RCPD*zt2m(i)))
3008      ENDDO
3009
3010
3011#ifdef INCA
3012      call VTe(VTphysiq)
3013      call VTb(VTinca)
3014           calday = FLOAT(julien) + gmtime
3015
3016#ifdef INCA_AER
3017      call AEROSOL_METEO_CALC(calday,pdtphys,pplay,paprs,t,pmflxr,pmflxs
3018     &   ,prfl,psfl,pctsrf,airephy,xjour,rlat,rlon,u10m,v10m)
3019#endif
3020
3021#ifdef INCAINFO
3022           WRITE(lunout,*)'Appel CHEMHOOK_BEGIN ...'
3023#endif
3024
3025           CALL chemhook_begin (calday,
3026#if defined(INCA) && !defined(INCA_CH4) && !defined(INCA_NMHC) && !defined(INCA_AER)
3027     $                          julien,
3028     $                          gmtime,
3029#endif
3030     $                          pctsrf(1,1),
3031     $                          rlat,
3032     $                          rlon,
3033     $                          airephy,
3034     $                          paprs,
3035     $                          pplay,
3036     $                          ycoefh,
3037     $                          pphi,
3038     $                          t_seri,
3039     $                          u,
3040     $                          v,
3041     $                          wo,
3042     $                          q_seri,
3043     $                          zxtsol,
3044     $                          zxsnow,
3045     $                          solsw,
3046     $                          albsol,
3047     $                          rain_fall,
3048     $                          snow_fall,
3049     $                          itop_con,
3050     $                          ibas_con,
3051     $                          cldfra,
3052     $                          iim,
3053     $                          jjm,
3054#ifdef INCA_AER
3055     $                          tr_seri,
3056     $                          ftsol,
3057     $                          paprs,
3058     $                          cdragh,
3059     $                          cdragm,
3060     $                          pctsrf,
3061     $                          pdtphys,
3062     $                          itap)
3063#else
3064     $                          tr_seri)     
3065#endif       
3066
3067
3068#ifdef INCAINFO
3069           WRITE(lunout,*)'OK.'
3070#endif
3071      call VTe(VTinca)
3072      call VTb(VTphysiq)
3073#endif
3074c     
3075c Calculer les parametres optiques des nuages et quelques
3076c parametres pour diagnostiques:
3077c
3078      if (ok_newmicro) then
3079      CALL newmicro (paprs, pplay,ok_newmicro,
3080     .            t_seri, cldliq, cldfra, cldtau, cldemi,
3081     .            cldh, cldl, cldm, cldt, cldq,
3082     .            flwp, fiwp, flwc, fiwc,
3083     e            ok_aie,
3084     e            sulfate, sulfate_pi,
3085     e            bl95_b0, bl95_b1,
3086     s            cldtaupi, re, fl)
3087      else
3088      CALL nuage (paprs, pplay,
3089     .            t_seri, cldliq, cldfra, cldtau, cldemi,
3090     .            cldh, cldl, cldm, cldt, cldq,
3091     e            ok_aie,
3092     e            sulfate, sulfate_pi,
3093     e            bl95_b0, bl95_b1,
3094     s            cldtaupi, re, fl)
3095     
3096      endif
3097c
3098c Appeler le rayonnement mais calculer tout d'abord l'albedo du sol.
3099c
3100      IF (MOD(itaprad,radpas).EQ.0) THEN
3101      DO i = 1, klon
3102         albsol(i) = falbe(i,is_oce) * pctsrf(i,is_oce)
3103     .             + falbe(i,is_lic) * pctsrf(i,is_lic)
3104     .             + falbe(i,is_ter) * pctsrf(i,is_ter)
3105     .             + falbe(i,is_sic) * pctsrf(i,is_sic)
3106         albsollw(i) = falblw(i,is_oce) * pctsrf(i,is_oce)
3107     .               + falblw(i,is_lic) * pctsrf(i,is_lic)
3108     .               + falblw(i,is_ter) * pctsrf(i,is_ter)
3109     .               + falblw(i,is_sic) * pctsrf(i,is_sic)
3110      ENDDO
3111
3112      if (mydebug) then
3113        call writefield_phy('u_seri',u_seri,llm)
3114        call writefield_phy('v_seri',v_seri,llm)
3115        call writefield_phy('t_seri',t_seri,llm)
3116        call writefield_phy('q_seri',q_seri,llm)
3117      endif
3118     
3119      CALL radlwsw ! nouveau rayonnement (compatible Arpege-IFS)
3120     e            (dist, rmu0, fract,
3121     e             paprs, pplay,zxtsol,albsol, albsollw, t_seri,q_seri,
3122     e             wo,
3123     e             cldfra, cldemi, cldtau,
3124     s             heat,heat0,cool,cool0,radsol,albpla,
3125     s             topsw,toplw,solsw,sollw,
3126     s             sollwdown,
3127     s             topsw0,toplw0,solsw0,sollw0,
3128     s             lwdn0, lwdn, lwup0, lwup,
3129     s             swdn0, swdn, swup0, swup,
3130     e             ok_ade, ok_aie, ! new for aerosol radiative effects
3131     e             tau_ae, piz_ae, cg_ae, ! ="=
3132     s             topswad, solswad, ! ="=
3133     e             cldtaupi, ! ="=
3134     s             topswai, solswai) ! ="=
3135      itaprad = 0
3136      ENDIF
3137      itaprad = itaprad + 1
3138c
3139c Ajouter la tendance des rayonnements (tous les pas)
3140c
3141      DO k = 1, klev
3142      DO i = 1, klon
3143         t_seri(i,k) = t_seri(i,k)
3144     .               + (heat(i,k)-cool(i,k)) * dtime/86400.
3145      ENDDO
3146      ENDDO
3147c
3148      if (mydebug) then
3149        call writefield_phy('u_seri',u_seri,llm)
3150        call writefield_phy('v_seri',v_seri,llm)
3151        call writefield_phy('t_seri',t_seri,llm)
3152        call writefield_phy('q_seri',q_seri,llm)
3153      endif
3154 
3155cIM
3156      IF (ip_ebil_phy.ge.2) THEN
3157        ztit='after rad'
3158        CALL diagetpq(airephy,ztit,ip_ebil_phy,2,2,dtime
3159     e      , t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,paprs,pplay
3160     s      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
3161        call diagphy(airephy,ztit,ip_ebil_phy
3162     e      , topsw, toplw, solsw, sollw, zero_v
3163     e      , zero_v, zero_v, zero_v, ztsol
3164     e      , d_h_vcol, d_qt, d_ec
3165     s      , fs_bound, fq_bound )
3166      END IF
3167c
3168c
3169c Calculer l'hydrologie de la surface
3170c
3171c      CALL hydrol(dtime,pctsrf,rain_fall, snow_fall, zxevap,
3172c     .            agesno, ftsol,fqsurf,fsnow, ruis)
3173c
3174      DO i = 1, klon
3175         zxqsurf(i) = 0.0
3176         zxsnow(i) = 0.0
3177      ENDDO
3178      DO nsrf = 1, nbsrf
3179      DO i = 1, klon
3180         zxqsurf(i) = zxqsurf(i) + fqsurf(i,nsrf)*pctsrf(i,nsrf)
3181         zxsnow(i) = zxsnow(i) + fsnow(i,nsrf)*pctsrf(i,nsrf)
3182      ENDDO
3183      ENDDO
3184c
3185c Si une sous-fraction n'existe pas, elle prend la valeur moyenne
3186c
3187cXXX      DO nsrf = 1, nbsrf
3188cXXX      DO i = 1, klon
3189cXXX         IF (pctsrf(i,nsrf).LT.epsfra) THEN
3190cXXX            fqsurf(i,nsrf) = zxqsurf(i)
3191cXXX            fsnow(i,nsrf) = zxsnow(i)
3192cXXX         ENDIF
3193cXXX      ENDDO
3194cXXX      ENDDO
3195c
3196c Calculer le bilan du sol et la derive de temperature (couplage)
3197c
3198      DO i = 1, klon
3199c         bils(i) = radsol(i) - sens(i) - evap(i)*RLVTT
3200c a la demande de JLD
3201         bils(i) = radsol(i) - sens(i) + zxfluxlat(i)
3202      ENDDO
3203c
3204cmoddeblott(jan95)
3205c Appeler le programme de parametrisation de l'orographie
3206c a l'echelle sous-maille:
3207c
3208      IF (ok_orodr) THEN
3209c
3210c  selection des points pour lesquels le shema est actif:
3211        igwd=0
3212        DO i=1,klon
3213        itest(i)=0
3214c        IF ((zstd(i).gt.10.0)) THEN
3215        IF (((zpic(i)-zmea(i)).GT.100.).AND.(zstd(i).GT.10.0)) THEN
3216          itest(i)=1
3217          igwd=igwd+1
3218          idx(igwd)=i
3219        ENDIF
3220        ENDDO
3221c        igwdim=MAX(1,igwd)
3222c
3223        CALL drag_noro(klon,klev,dtime,paprs,pplay,
3224     e                   zmea,zstd, zsig, zgam, zthe,zpic,zval,
3225     e                   igwd,idx,itest,
3226     e                   t_seri, u_seri, v_seri,
3227cIM 141004    s                   zulow, zvlow, zustr, zvstr,
3228     s                   zulow, zvlow, zustrdr, zvstrdr,
3229     s                   d_t_oro, d_u_oro, d_v_oro)
3230c
3231c  ajout des tendances
3232        DO k = 1, klev
3233        DO i = 1, klon
3234           t_seri(i,k) = t_seri(i,k) + d_t_oro(i,k)
3235           u_seri(i,k) = u_seri(i,k) + d_u_oro(i,k)
3236           v_seri(i,k) = v_seri(i,k) + d_v_oro(i,k)
3237        ENDDO
3238        ENDDO
3239c
3240      ENDIF ! fin de test sur ok_orodr
3241c
3242      if (mydebug) then
3243        call writefield_phy('u_seri',u_seri,llm)
3244        call writefield_phy('v_seri',v_seri,llm)
3245        call writefield_phy('t_seri',t_seri,llm)
3246        call writefield_phy('q_seri',q_seri,llm)
3247      endif
3248     
3249      IF (ok_orolf) THEN
3250c
3251c  selection des points pour lesquels le shema est actif:
3252        igwd=0
3253        DO i=1,klon
3254        itest(i)=0
3255        IF ((zpic(i)-zmea(i)).GT.100.) THEN
3256          itest(i)=1
3257          igwd=igwd+1
3258          idx(igwd)=i
3259        ENDIF
3260        ENDDO
3261c        igwdim=MAX(1,igwd)
3262c
3263        CALL lift_noro(klon,klev,dtime,paprs,pplay,
3264     e                   rlat,zmea,zstd,zpic,
3265     e                   itest,
3266     e                   t_seri, u_seri, v_seri,
3267     s                   zulow, zvlow, zustrli, zvstrli,
3268     s                   d_t_lif, d_u_lif, d_v_lif)
3269c
3270c  ajout des tendances
3271        DO k = 1, klev
3272        DO i = 1, klon
3273           t_seri(i,k) = t_seri(i,k) + d_t_lif(i,k)
3274           u_seri(i,k) = u_seri(i,k) + d_u_lif(i,k)
3275           v_seri(i,k) = v_seri(i,k) + d_v_lif(i,k)
3276        ENDDO
3277        ENDDO
3278c
3279      ENDIF ! fin de test sur ok_orolf
3280c
3281cIM cf. FLott BEG
3282C STRESS NECESSAIRES: TOUTE LA PHYSIQUE
3283
3284      if (mydebug) then
3285        call writefield_phy('u_seri',u_seri,llm)
3286        call writefield_phy('v_seri',v_seri,llm)
3287        call writefield_phy('t_seri',t_seri,llm)
3288        call writefield_phy('q_seri',q_seri,llm)
3289      endif
3290
3291      DO i = 1, klon
3292        zustrph(i)=0.
3293        zvstrph(i)=0.
3294      ENDDO
3295      DO k = 1, klev
3296      DO i = 1, klon
3297       zustrph(i)=zustrph(i)+(u_seri(i,k)-u(i,k))/dtime*
3298     c            (paprs(i,k)-paprs(i,k+1))/rg
3299       zvstrph(i)=zvstrph(i)+(v_seri(i,k)-v(i,k))/dtime*
3300     c            (paprs(i,k)-paprs(i,k+1))/rg
3301      ENDDO
3302      ENDDO
3303c
3304cIM calcul composantes axiales du moment angulaire et couple des montagnes
3305c
3306      IF (is_sequential) THEN
3307     
3308        CALL aaam_bud (27,klon,klev,rjourvrai,gmtime,
3309     C                 ra,rg,romega,
3310     C                 rlat,rlon,pphis,
3311     C                 zustrdr,zustrli,zustrph,
3312     C                 zvstrdr,zvstrli,zvstrph,
3313     C                 paprs,u,v,
3314     C                 aam, torsfc)
3315       ENDIF
3316cIM cf. FLott END
3317cIM
3318      IF (ip_ebil_phy.ge.2) THEN
3319        ztit='after orography'
3320        CALL diagetpq(airephy,ztit,ip_ebil_phy,2,2,dtime
3321     e      , t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,paprs,pplay
3322     s      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
3323      END IF
3324c
3325c
3326cAA
3327cAA Installation de l'interface online-offline pour traceurs
3328cAA
3329c====================================================================
3330c   Calcul  des tendances traceurs
3331c====================================================================
3332C
3333      call phytrac (     rnpb,
3334     I                   itap,
3335     I                   julien,
3336     I                   gmtime,
3337     I                   debut,
3338     I                   lafin,
3339     I                   nqmax-2,
3340     I                   nlon,
3341     I                   nlev,
3342     I                   dtime,
3343     I                   u,
3344     I                   v,
3345     I                   t,
3346     I                   paprs,
3347     I                   pplay,
3348     I                   pmfu,
3349     I                   pmfd,
3350     I                   pen_u,
3351     I                   pde_u,
3352     I                   pen_d,
3353     I                   pde_d,
3354     I                   ycoefh,
3355     I                   fm_therm,
3356     I                   entr_therm,
3357     I                   yu1,
3358     I                   yv1,
3359     I                   ftsol,
3360     I                   pctsrf,
3361     I                   rlat,
3362     I                   frac_impa,
3363     I                   frac_nucl,
3364     I                   rlon,
3365     I                   presnivs,
3366     I                   pphis,
3367     I                   pphi,
3368     I                   albsol,
3369     I                   qx(1,1,1),
3370     I                   rhcl,
3371     I                   cldfra,
3372     I                   rneb,
3373     I                   diafra,
3374     I                   cldliq,
3375     I                   itop_con,
3376     I                   ibas_con,
3377     I                   pmflxr,
3378     I                   pmflxs,
3379     I                   prfl,
3380     I                   psfl,
3381     I                   da,
3382     I                   phi,
3383     I                   mp,
3384     I                   upwd,
3385     I                   dnwd,
3386#ifdef INCA
3387     I                   flxmass_w,
3388#endif
3389     O                   tr_seri)
3390
3391      IF (offline) THEN
3392
3393         print*,'Attention on met a 0 les thermiques pour phystoke'
3394         call phystokenc (
3395     I                   nlon,nlev,pdtphys,rlon,rlat,
3396     I                   t,pmfu, pmfd, pen_u, pde_u, pen_d, pde_d,
3397     I                   fm_therm,entr_therm,
3398     I                   ycoefh,yu1,yv1,ftsol,pctsrf,
3399     I                   frac_impa, frac_nucl,
3400     I                   pphis,airephy,dtime,itap)
3401
3402
3403      ENDIF
3404
3405c
3406c Calculer le transport de l'eau et de l'energie (diagnostique)
3407c
3408      CALL transp (paprs,zxtsol,
3409     e                   t_seri, q_seri, u_seri, v_seri, zphi,
3410     s                   ve, vq, ue, uq)
3411c
3412cIM global posePB BEG
3413      IF(1.EQ.0) THEN
3414c
3415      CALL transp_lay (paprs,zxtsol,
3416     e                   t_seri, q_seri, u_seri, v_seri, zphi,
3417     s                   ve_lay, vq_lay, ue_lay, uq_lay)
3418c
3419      ENDIF !(1.EQ.0) THEN
3420cIM global posePB END
3421c Accumuler les variables a stocker dans les fichiers histoire:
3422c
3423c+jld ec_conser
3424      DO k = 1, klev
3425      DO i = 1, klon
3426        ZRCPD = RCPD*(1.0+RVTMP2*q_seri(i,k))
3427        d_t_ec(i,k)=0.5/ZRCPD
3428     $      *(u(i,k)**2+v(i,k)**2-u_seri(i,k)**2-v_seri(i,k)**2)
3429        t_seri(i,k)=t_seri(i,k)+d_t_ec(i,k)
3430        d_t_ec(i,k) = d_t_ec(i,k)/dtime
3431       END DO
3432      END DO
3433c-jld ec_conser
3434cIM
3435      IF (ip_ebil_phy.ge.1) THEN
3436        ztit='after physic'
3437        CALL diagetpq(airephy,ztit,ip_ebil_phy,1,1,dtime
3438     e      , t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,paprs,pplay
3439     s      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
3440C     Comme les tendances de la physique sont ajoute dans la dynamique,
3441C     on devrait avoir que la variation d'entalpie par la dynamique
3442C     est egale a la variation de la physique au pas de temps precedent.
3443C     Donc la somme de ces 2 variations devrait etre nulle.
3444        call diagphy(airephy,ztit,ip_ebil_phy
3445     e      , topsw, toplw, solsw, sollw, sens
3446     e      , evap, rain_fall, snow_fall, ztsol
3447     e      , d_h_vcol, d_qt, d_ec
3448     s      , fs_bound, fq_bound )
3449C
3450      d_h_vcol_phy=d_h_vcol
3451C
3452      END IF
3453C
3454c=======================================================================
3455c   SORTIES
3456c=======================================================================
3457
3458cIM Interpolation sur les niveaux de pression du NMC
3459c   -------------------------------------------------
3460c
3461#include "calcul_STDlev.h"
3462c
3463c slp sea level pressure
3464      slp(:) = paprs(:,1)*exp(pphis(:)/(RD*t_seri(:,1)))
3465c
3466ccc prw = eau precipitable
3467      DO i = 1, klon
3468       prw(i) = 0.
3469       DO k = 1, klev
3470        prw(i) = prw(i) +
3471     .           q_seri(i,k)*(paprs(i,k)-paprs(i,k+1))/RG
3472       ENDDO
3473      ENDDO
3474c
3475cIM initialisation + calculs divers diag AMIP2
3476c
3477#include "calcul_divers.h"
3478c
3479#ifdef INCA
3480      call VTe(VTphysiq)
3481      call VTb(VTinca)
3482#ifdef INCAINFO
3483           WRITE(lunout,*)'Appel CHEMHOOK_END ...'
3484#endif
3485           CALL chemhook_end (calday,
3486     $                        dtime,
3487     $                        pplay,
3488     $                        t_seri,
3489     $                        tr_seri,
3490     $                        nbtr,
3491     $                        paprs,
3492     $                        q_seri,
3493     $                        annee_ref,
3494     $                        day_ini,
3495     $                        airephy,     
3496#ifdef INCA_AER
3497     $                        xjour,
3498     $                        pphi,
3499     $                        pphis,
3500     $                        zx_rh)
3501#else
3502     $                        xjour)
3503#endif
3504#ifdef INCAINFO
3505           WRITE(lunout,*)'OK.'
3506#endif
3507      call VTe(VTinca)
3508      call VTb(VTphysiq)
3509#endif
3510
3511c=============================================================
3512c
3513c Convertir les incrementations en tendances
3514c
3515      if (mydebug) then
3516        call writefield_phy('u_seri',u_seri,llm)
3517        call writefield_phy('v_seri',v_seri,llm)
3518        call writefield_phy('t_seri',t_seri,llm)
3519        call writefield_phy('q_seri',q_seri,llm)
3520      endif
3521
3522      DO k = 1, klev
3523      DO i = 1, klon
3524         d_u(i,k) = ( u_seri(i,k) - u(i,k) ) / dtime
3525         d_v(i,k) = ( v_seri(i,k) - v(i,k) ) / dtime
3526         d_t(i,k) = ( t_seri(i,k)-t(i,k) ) / dtime
3527         d_qx(i,k,ivap) = ( q_seri(i,k) - qx(i,k,ivap) ) / dtime
3528         d_qx(i,k,iliq) = ( ql_seri(i,k) - qx(i,k,iliq) ) / dtime
3529      ENDDO
3530      ENDDO
3531c
3532      IF (nqmax.GE.3) THEN
3533      DO iq = 3, nqmax
3534      DO  k = 1, klev
3535      DO  i = 1, klon
3536         d_qx(i,k,iq) = ( tr_seri(i,k,iq-2) - qx(i,k,iq) ) / dtime
3537      ENDDO
3538      ENDDO
3539      ENDDO
3540      ENDIF
3541c
3542cIM rajout diagnostiques bilan KP pour analyse MJO par Jun-Ichi Yano
3543cIM global posePB#include "write_bilKP_ins.h"
3544cIM global posePB#include "write_bilKP_ave.h"
3545c
3546c Sauvegarder les valeurs de t et q a la fin de la physique:
3547c
3548      DO k = 1, klev
3549      DO i = 1, klon
3550         t_ancien(i,k) = t_seri(i,k)
3551         q_ancien(i,k) = q_seri(i,k)
3552      ENDDO
3553      ENDDO
3554c
3555c 22.03.04 BEG
3556c=============================================================
3557c   Ecriture des sorties
3558c=============================================================
3559#ifdef CPP_IOIPSL
3560
3561#ifdef histhf
3562#include "write_histhf.h"
3563#endif
3564
3565#ifdef histday
3566#include "write_histday.h"
3567#endif
3568
3569#ifdef histmth
3570#include "write_histmth.h"
3571#endif
3572
3573#ifdef histins
3574#include "write_histins.h"
3575#endif
3576
3577#ifdef histISCCP
3578#include "write_histISCCP.h"
3579#endif
3580
3581#ifdef histmthNMC
3582#include "write_histmthNMC.h"
3583#endif
3584
3585#include "write_histday_seri.h"
3586
3587#include "write_paramLMDZ_phy.h"
3588
3589#endif
3590
3591c 22.03.04 END
3592c
3593c====================================================================
3594c Si c'est la fin, il faut conserver l'etat de redemarrage
3595c====================================================================
3596c
3597      IF (lafin) THEN
3598         itau_phy = itau_phy + itap
3599ccc         IF (ok_oasis) CALL quitcpl
3600         CALL phyredem ("restartphy.nc",dtime,radpas,
3601     .      rlat, rlon, pctsrf, ftsol, ftsoil,
3602cIM "slab" ocean
3603     .      tslab, seaice,
3604     .      fqsurf, qsol,
3605     .      fsnow, falbe,falblw, fevap, rain_fall, snow_fall,
3606cIM  .      solsw, sollwdown,dlw,
3607     .      solsw, sollw,dlw,
3608     .      radsol,frugs,agesno,
3609     .      zmea,zstd,zsig,zgam,zthe,zpic,zval,rugoro,
3610     .      t_ancien, q_ancien, rnebcon, ratqs, clwcon,run_off_lic_0)
3611      ENDIF
3612     
3613
3614      RETURN
3615      END
3616      FUNCTION qcheck(klon,klev,paprs,q,ql,aire)
3617      IMPLICIT none
3618c
3619c Calculer et imprimer l'eau totale. A utiliser pour verifier
3620c la conservation de l'eau
3621c
3622#include "YOMCST.h"
3623      INTEGER klon,klev
3624      REAL paprs(klon,klev+1), q(klon,klev), ql(klon,klev)
3625      REAL aire(klon)
3626      REAL qtotal, zx, qcheck
3627      INTEGER i, k
3628c
3629      zx = 0.0
3630      DO i = 1, klon
3631         zx = zx + aire(i)
3632      ENDDO
3633      qtotal = 0.0
3634      DO k = 1, klev
3635      DO i = 1, klon
3636         qtotal = qtotal + (q(i,k)+ql(i,k)) * aire(i)
3637     .                     *(paprs(i,k)-paprs(i,k+1))/RG
3638      ENDDO
3639      ENDDO
3640c
3641      qcheck = qtotal/zx
3642c
3643      RETURN
3644      END
3645      SUBROUTINE gr_fi_ecrit(nfield,nlon,iim,jjmp1,fi,ecrit)
3646      IMPLICIT none
3647c
3648c Tranformer une variable de la grille physique a
3649c la grille d'ecriture
3650c
3651      INTEGER nfield,nlon,iim,jjmp1, jjm
3652      REAL fi(nlon,nfield), ecrit(iim*jjmp1,nfield)
3653c
3654      INTEGER i, n, ig
3655c
3656      jjm = jjmp1 - 1
3657      DO n = 1, nfield
3658         DO i=1,iim
3659            ecrit(i,n) = fi(1,n)
3660            ecrit(i+jjm*iim,n) = fi(nlon,n)
3661         ENDDO
3662         DO ig = 1, nlon - 2
3663           ecrit(iim+ig,n) = fi(1+ig,n)
3664         ENDDO
3665      ENDDO
3666      RETURN
3667      END
Note: See TracBrowser for help on using the repository browser.