source: lmdz_wrf/branches/LMDZ_WRFmeas/WRFV3/lmdz/physiq.F90 @ 64

Last change on this file since 64 was 64, checked in by lfita, 10 years ago

Arrenging right variable definition

File size: 169.2 KB
Line 
1! $Id: physiq.F 1795 2013-07-18 08:20:28Z emillour $
2!c#define IO_DEBUG
3
4      SUBROUTINE physiq (nlon,nlev,                                                  &
5       &            debut,lafin,jD_cur, jH_cur,pdtphys,                              &
6       &            paprs,pplay,pphi,pphis,presnivs,clesphy0,                        &
7       &            u,v,t,qx,                                                        &
8       &            flxmass_w,                                                       &
9       &            d_u, d_v, d_t, d_qx, d_ps                                        &
10       &            , dudyn                                                          &
11       &            , PVteta)
12
13      USE ioipsl, only: histbeg, histvert, histdef, histend, histsync,               &
14       &     histwrite, ju2ymds, ymds2ju, ioget_year_len
15      USE comgeomphy
16      USE phys_cal_mod
17      USE write_field_phy
18      USE dimphy
19      USE infotrac
20      USE mod_grid_phy_lmdz
21      USE mod_phys_lmdz_para
22      USE iophy
23      USE misc_mod, mydebug=>debug
24      USE vampir
25!L. Fita, LMD. November 2013
26!      USE pbl_surface_mod, ONLY : pbl_surface
27!      USE pbl_surface_mod, ONLY : pbl_surface, pbl_surface_init
28      USE pbl_surface_mod
29      USE change_srf_frac_mod
30      USE surface_data,     ONLY : type_ocean, ok_veget
31      USE phys_local_var_mod ! Variables internes non sauvegardees de la physique
32      USE phys_state_var_mod ! Variables sauvegardees de la physique
33      USE phys_output_var_mod ! Variables pour les ecritures des sorties
34      USE fonte_neige_mod, ONLY  : fonte_neige_get_vars, fonte_neige_init
35      USE phys_output_mod
36      USE phys_output_ctrlout_mod
37      USE iophy
38      use open_climoz_m, only: open_climoz ! ozone climatology from a file
39      use regr_pr_av_m, only: regr_pr_av
40      use netcdf95, only: nf95_close
41!IM for NMC files
42!c     use netcdf, only: nf90_fill_real
43      use netcdf
44      use mod_phys_lmdz_mpi_data, only: is_mpi_root
45      USE aero_mod
46      use ozonecm_m, only: ozonecm ! ozone of J.-F. Royer
47      use conf_phys_m, only: conf_phys
48      use radlwsw_m, only: radlwsw
49      USE control_mod
50#ifdef REPROBUS
51      USE CHEM_REP, ONLY : Init_chem_rep_xjour
52#endif
53      USE indice_sol_mod
54
55!IM stations CFMIP
56      USE CFMIP_point_locations
57
58!L. Fita. July 2013
59      USE orografi
60      USE orografi_strato_mod
61      USE diagphy_mod
62!      USE orbite_mod, ONLY : angle
63      USE phyaqua_mod, ONLY: zenang_an
64      USE nuage_mod, ONLY : diagcld1
65
66! L. Fita, LMD. November 2013.
67!!      USE wrf_lmdz_mod
68!!      USE module_lmdz_variables, ONLY: neige_initialize, limit_initialize
69!!      USE physiq_limit_variables_mod
70!!      USE physiq_limit_variables_mod
71      USE lmdz_wrf_variables_mod
72! L. Fita, LMD. January 2014
73!   Defining with SAVE statement all that variables that should appear in the output
74      USE output_lmdz_NOmodule
75
76      IMPLICIT none
77!>======================================================================
78!!
79!! Auteur(s) Z.X. Li (LMD/CNRS) date: 19930818
80!!
81!! Objet: Moniteur general de la physique du modele
82!!AA      Modifications quant aux traceurs :
83!!AA                  -  uniformisation des parametrisations ds phytrac
84!!AA                  -  stockage des moyennes des champs necessaires
85!!AA                     en mode traceur off-line
86!!======================================================================
87!!   CLEFS CPP POUR LES IO
88!!   =====================
89#define histNMC
90!c#define histISCCP
91!!======================================================================
92!!    modif   ( P. Le Van ,  12/10/98 )
93!!
94!!  Arguments:
95!!
96!! nlon----input-I-nombre de points horizontaux
97!! nlev----input-I-nombre de couches verticales, doit etre egale a klev
98!! debut---input-L-variable logique indiquant le premier passage
99!! lafin---input-L-variable logique indiquant le dernier passage
100!! jD_cur       -R-jour courant a l'appel de la physique (jour julien)
101!! jH_cur       -R-heure courante a l'appel de la physique (jour julien)
102!! pdtphys-input-R-pas d'integration pour la physique (seconde)
103!! paprs---input-R-pression pour chaque inter-couche (en Pa)
104!! pplay---input-R-pression pour le mileu de chaque couche (en Pa)
105!! pphi----input-R-geopotentiel de chaque couche (g z) (reference sol)
106!! pphis---input-R-geopotentiel du sol
107!! presnivs-input_R_pressions approximat. des milieux couches ( en PA)
108!! u-------input-R-vitesse dans la direction X (de O a E) en m/s
109!! v-------input-R-vitesse Y (de S a N) en m/s
110!! t-------input-R-temperature (K)
111!! qx------input-R-humidite specifique (kg/kg) et d'autres traceurs
112!! d_t_dyn-input-R-tendance dynamique pour "t" (K/s)
113!! d_q_dyn-input-R-tendance dynamique pour "q" (kg/kg/s)
114!! flxmass_w -input-R- flux de masse verticale
115!! d_u-----output-R-tendance physique de "u" (m/s/s)
116!! d_v-----output-R-tendance physique de "v" (m/s/s)
117!! d_t-----output-R-tendance physique de "t" (K/s)
118!! d_qx----output-R-tendance physique de "qx" (kg/kg/s)
119!! d_ps----output-R-tendance physique de la pression au sol
120!!IM
121!! PVteta--output-R-vorticite potentielle a des thetas constantes
122!!======================================================================
123#include "dimensions.h"
124      integer jjmp1
125      parameter (jjmp1=jjm+1-1/jjm)
126      integer iip1
127      parameter (iip1=iim+1)
128
129#include "regdim.h"
130#include "dimsoil.h"
131#include "clesphys.h"
132#include "temps.h"
133#include "iniprint.h"
134#include "thermcell.h"
135!c======================================================================
136      LOGICAL ok_cvl  ! pour activer le nouveau driver pour convection KE
137      PARAMETER (ok_cvl=.TRUE.)
138      LOGICAL ok_gust ! pour activer l'effet des gust sur flux surface
139      PARAMETER (ok_gust=.FALSE.)
140      integer iflag_radia     ! active ou non le rayonnement (MPL)
141      save iflag_radia
142!$OMP THREADPRIVATE(iflag_radia)
143!c======================================================================
144      LOGICAL check ! Verifier la conservation du modele en eau
145      PARAMETER (check=.FALSE.)
146      LOGICAL ok_stratus ! Ajouter artificiellement les stratus
147      PARAMETER (ok_stratus=.FALSE.)
148!c======================================================================
149      REAL amn, amx
150      INTEGER igout
151!c======================================================================
152!c Clef controlant l'activation du cycle diurne:
153!ccc      LOGICAL cycle_diurne
154!ccc      PARAMETER (cycle_diurne=.FALSE.)
155!c======================================================================
156!c Modele thermique du sol, a activer pour le cycle diurne:
157!ccc      LOGICAL soil_model
158!ccc      PARAMETER (soil_model=.FALSE.)
159!c======================================================================
160!c Dans les versions precedentes, l'eau liquide nuageuse utilisee dans
161!c le calcul du rayonnement est celle apres la precipitation des nuages.
162!c Si cette cle new_oliq est activee, ce sera une valeur moyenne entre
163!c la condensation et la precipitation. Cette cle augmente les impacts
164!c radiatifs des nuages.
165!ccc      LOGICAL new_oliq
166!ccc      PARAMETER (new_oliq=.FALSE.)
167!c======================================================================
168!c Clefs controlant deux parametrisations de l'orographie:
169!cc      LOGICAL ok_orodr
170!ccc      PARAMETER (ok_orodr=.FALSE.)
171!ccc      LOGICAL ok_orolf
172!ccc      PARAMETER (ok_orolf=.FALSE.)
173!c======================================================================
174      LOGICAL ok_journe ! sortir le fichier journalier
175      save ok_journe
176!$OMP THREADPRIVATE(ok_journe)
177!c
178      LOGICAL ok_mensuel ! sortir le fichier mensuel
179      save ok_mensuel
180!$OMP THREADPRIVATE(ok_mensuel)
181!c
182      LOGICAL ok_instan ! sortir le fichier instantane
183      save ok_instan
184!$OMP THREADPRIVATE(ok_instan)
185!c
186      LOGICAL ok_LES ! sortir le fichier LES
187      save ok_LES                           
188!$OMP THREADPRIVATE(ok_LES)                 
189!c
190      LOGICAL callstats ! sortir le fichier stats
191      save callstats                           
192!$OMP THREADPRIVATE(callstats)                 
193!c
194      LOGICAL ok_region ! sortir le fichier regional
195      PARAMETER (ok_region=.FALSE.)
196!c======================================================================
197! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
198!      real weak_inversion(klon),dthmin(klon)
199      real seuil_inversion
200      save seuil_inversion
201!$OMP THREADPRIVATE(seuil_inversion)
202      integer iflag_ratqs
203      save iflag_ratqs
204!$OMP THREADPRIVATE(iflag_ratqs)
205      real facteur
206
207      REAL zz,znum,zden
208      REAL wmax_th(klon)
209! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
210!      REAL zmax_th(klon)
211      REAL tau_overturning_th(klon)
212
213! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
214!      integer lmax_th(klon)
215      integer limbas(klon)
216      real ratqscth(klon,klev)
217      real ratqsdiff(klon,klev)
218      real zqsatth(klon,klev)
219
220!c======================================================================
221!c
222      INTEGER ivap          ! indice de traceurs pour vapeur d'eau
223      PARAMETER (ivap=1)
224      INTEGER iliq          ! indice de traceurs pour eau liquide
225      PARAMETER (iliq=2)
226
227!c
228!c
229!c Variables argument:
230!c
231      INTEGER nlon
232      INTEGER nlev
233      REAL, intent(in):: jD_cur, jH_cur
234
235      REAL pdtphys
236      LOGICAL debut, lafin
237      REAL paprs(klon,klev+1)
238      REAL pplay(klon,klev)
239      REAL pphi(klon,klev)
240      REAL pphis(klon)
241      REAL presnivs(klev)
242      REAL znivsig(klev)
243      real pir
244
245      REAL u(klon,klev)
246      REAL v(klon,klev)
247! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
248!      REAL t(klon,klev),theta(klon,klev),thetal(klon,klev)
249      REAL t(klon,klev),thetal(klon,klev)
250
251!c thetal: ligne suivante a decommenter si vous avez les fichiers     MPL 20130625
252!c fth_fonctions.F90 et parkind1.F90
253!c sinon thetal=theta
254!c     REAL fth_thetae,fth_thetav,fth_thetal
255      REAL qx(klon,klev,nqtot)
256      REAL flxmass_w(klon,klev)
257! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
258!      REAL omega(klon,klev) ! vitesse verticale en Pa/s
259      REAL d_u(klon,klev)
260      REAL d_v(klon,klev)
261      REAL d_t(klon,klev)
262      REAL d_qx(klon,klev,nqtot)
263      REAL d_ps(klon)
264! Variables pour le transport convectif
265      real da(klon,klev),phi(klon,klev,klev),mp(klon,klev)
266! Variables pour le lessivage convectif
267! RomP >>>
268      real phi2(klon,klev,klev)
269      real d1a(klon,klev),dam(klon,klev)
270      real ev(klon,klev),ep(klon,klev)
271      real clw(klon,klev),elij(klon,klev,klev)
272      real epmlmMm(klon,klev,klev),eplaMm(klon,klev)
273! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
274!      real wdtrainA(klon,klev),wdtrainM(klon,klev)
275
276! RomP <<<
277!IM definition dynamique o_trac dans phys_output_open
278!      type(ctrl_out) :: o_trac(nqtot)
279!c
280!IM Amip2 PV a theta constante
281!c
282      INTEGER nbteta
283      PARAMETER(nbteta=3)
284      CHARACTER*3 ctetaSTD(nbteta)
285      DATA ctetaSTD/'350','380','405'/
286      SAVE ctetaSTD
287!$OMP THREADPRIVATE(ctetaSTD)
288      REAL rtetaSTD(nbteta)
289      DATA rtetaSTD/350., 380., 405./
290      SAVE rtetaSTD
291!$OMP THREADPRIVATE(rtetaSTD)     
292!c
293      REAL PVteta(klon,nbteta)
294      REAL zx_tmp_3dte(iim,jjmp1,nbteta)
295!c
296!MI Amip2 PV a theta constante
297
298!cym      INTEGER klevp1, klevm1
299!cym      PARAMETER(klevp1=klev+1,klevm1=klev-1)
300!cym#include "raddim.h"
301!c
302!c
303!IM Amip2
304!c variables a une pression donnee
305!c
306#include "declare_STDlev.h"
307!c
308      CHARACTER*4 bb2
309      CHARACTER*2 bb3
310!c
311#include "radopt.h"
312!c
313!c
314!c prw: precipitable water
315! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
316!      real prw(klon)
317
318      REAL convliq(klon,klev)  ! eau liquide nuageuse convective
319      REAL convfra(klon,klev)  ! fraction nuageuse convective
320
321      REAL cldl_c(klon),cldm_c(klon),cldh_c(klon) !nuages bas, moyen et haut
322      REAL cldt_c(klon),cldq_c(klon) !nuage total, eau liquide integree
323      REAL cldl_s(klon),cldm_s(klon),cldh_s(klon) !nuages bas, moyen et haut
324      REAL cldt_s(klon),cldq_s(klon) !nuage total, eau liquide integree
325
326      INTEGER linv, kp1
327!c flwp, fiwp = Liquid Water Path & Ice Water Path (kg/m2)
328!c flwc, fiwc = Liquid Water Content & Ice Water Content (kg/kg)
329! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
330!      REAL flwp(klon), fiwp(klon)
331!      REAL flwc(klon,klev), fiwc(klon,klev)
332      REAL flwp_c(klon), fiwp_c(klon)
333      REAL flwc_c(klon,klev), fiwc_c(klon,klev)
334      REAL flwp_s(klon), fiwp_s(klon)
335      REAL flwc_s(klon,klev), fiwc_s(klon,klev)
336
337! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
338!      REAL evap_pot(klon,nbsrf)
339
340!IM ISCCP simulator v3.4
341!c dans clesphys.h top_height, overlap
342!cv3.4
343      INTEGER debug, debugcol
344!cym      INTEGER npoints
345!cym      PARAMETER(npoints=klon)
346!c
347      INTEGER sunlit(klon) !sunlit=1 if day; sunlit=0 if night
348      INTEGER nregISCtot
349      PARAMETER(nregISCtot=1)
350!c
351!c imin_debut, nbpti, jmin_debut, nbptj : parametres pour sorties sur 1 region rectangulaire
352!c y compris pour 1 point
353!c imin_debut : indice minimum de i; nbpti : nombre de points en direction i (longitude)
354!c jmin_debut : indice minimum de j; nbptj : nombre de points en direction j (latitude)
355      INTEGER imin_debut, nbpti
356      INTEGER jmin_debut, nbptj
357!IM parametres ISCCP BEG
358      INTEGER nbapp_isccp
359!     INTEGER nbapp_isccp,isccppas
360!     PARAMETER(isccppas=6) !appel du simulateurs tous les 6pas de temps de la physique
361!                           !i.e. toutes les 3 heures
362      INTEGER n
363      INTEGER ifreq_isccp(napisccp), freqin_pdt(napisccp)
364      DATA ifreq_isccp/3/
365      SAVE ifreq_isccp
366!$OMP THREADPRIVATE(ifreq_isccp)
367      CHARACTER*5 typinout(napisccp)
368      DATA typinout/'i3od'/
369      SAVE typinout
370!$OMP THREADPRIVATE(typinout)
371!IM verif boxptop BEG
372      CHARACTER*1 verticaxe(napisccp)
373      DATA verticaxe/'1'/
374      SAVE verticaxe
375!$OMP THREADPRIVATE(verticaxe)
376!IM verif boxptop END
377      INTEGER nvlev(napisccp)
378!c     INTEGER nvlev
379      REAL t1, aa
380      REAL seed_re(klon,napisccp)
381!cym !!!! A voir plus tard
382!cym      INTEGER iphy(iim,jjmp1)
383!IM parametres ISCCP END
384!c
385!c ncol = nb. de sous-colonnes pour chaque maille du GCM
386!c ncolmx = No. max. de sous-colonnes pour chaque maille du GCM
387!c      INTEGER ncol(napisccp), ncolmx, seed(klon,napisccp)
388      INTEGER,SAVE :: ncol(napisccp)
389!$OMP THREADPRIVATE(ncol)
390      INTEGER ncolmx, seed(klon,napisccp)
391      REAL nbsunlit(nregISCtot,klon,napisccp)  !nbsunlit : moyenne de sunlit
392!c     PARAMETER(ncolmx=1500)
393      PARAMETER(ncolmx=300)
394!c
395!IM verif boxptop BEG
396      REAL vertlev(ncolmx,napisccp)
397!IM verif boxptop END
398!c
399      REAL,SAVE :: tautab_omp(0:255),tautab(0:255)
400      INTEGER,SAVE :: invtau_omp(-20:45000),invtau(-20:45000)
401!$OMP THREADPRIVATE(tautab,invtau)
402      REAL emsfc_lw
403      PARAMETER(emsfc_lw=0.99)
404!c     REAL    ran0                      ! type for random number fuction
405!c
406      REAL cldtot(klon,klev)
407!c variables de haut en bas pour le simulateur ISCCP
408      REAL dtau_s(klon,klev) !tau nuages startiformes
409      REAL dtau_c(klon,klev) !tau nuages convectifs
410      REAL dem_s(klon,klev)  !emissivite nuages startiformes
411      REAL dem_c(klon,klev)  !emissivite nuages convectifs
412!c
413!c variables de haut en bas pour le simulateur ISCCP
414      REAL pfull(klon,klev)
415      REAL phalf(klon,klev+1)
416      REAL qv(klon,klev)
417      REAL cc(klon,klev)
418      REAL conv(klon,klev)
419      REAL dtau_sH2B(klon,klev)
420      REAL dtau_cH2B(klon,klev)
421      REAL at(klon,klev)
422      REAL dem_sH2B(klon,klev)
423      REAL dem_cH2B(klon,klev)
424!c
425      INTEGER kmax, lmax, lmax3
426      PARAMETER(kmax=8, lmax=8, lmax3=3)
427      INTEGER kmaxm1, lmaxm1
428      PARAMETER(kmaxm1=kmax-1, lmaxm1=lmax-1)
429      INTEGER iimx7, jjmx7, jjmp1x7
430      PARAMETER(iimx7=iim*kmaxm1, jjmx7=jjm*lmaxm1,                                  &
431       &jjmp1x7=jjmp1*lmaxm1)
432!c
433!c output from ISCCP simulator
434      REAL fq_isccp(klon,kmaxm1,lmaxm1,napisccp)
435      REAL fq_is_true(klon,kmaxm1,lmaxm1,napisccp)
436      REAL totalcldarea(klon,napisccp)
437      REAL meanptop(klon,napisccp)
438      REAL meantaucld(klon,napisccp)
439      REAL boxtau(klon,ncolmx,napisccp)
440      REAL boxptop(klon,ncolmx,napisccp)
441      REAL zx_tmp_fi3d_bx(klon,ncolmx)
442      REAL zx_tmp_3d_bx(iim,jjmp1,ncolmx)
443!c
444      REAL cld_fi3d(klon,lmax3)
445      REAL cld_3d(iim,jjmp1,lmax3)
446!c
447      INTEGER iw, iwmax
448      REAL wmin, pas_w
449!c     PARAMETER(wmin=-100.,pas_w=10.,iwmax=30)
450!IM 051005     PARAMETER(wmin=-200.,pas_w=10.,iwmax=40)
451      PARAMETER(wmin=-100.,pas_w=10.,iwmax=20)
452      REAL o500(klon)
453!c
454
455!c sorties ISCCP
456
457      integer nid_isccp
458      save nid_isccp       
459!$OMP THREADPRIVATE(nid_isccp)
460
461      REAL zx_tau(kmaxm1), zx_pc(lmaxm1), zx_o500(iwmax)
462      DATA zx_tau/0.0, 0.3, 1.3, 3.6, 9.4, 23., 60./
463      SAVE zx_tau
464      DATA zx_pc/180., 310., 440., 560., 680., 800., 1000./
465      SAVE zx_pc
466!$OMP THREADPRIVATE(zx_tau,zx_pc)
467!c cldtopres pression au sommet des nuages
468      REAL cldtopres(lmaxm1), cldtopres3(lmax3)
469      DATA cldtopres/180., 310., 440., 560., 680., 800., 1000./
470      DATA cldtopres3/440., 680., 1000./
471      SAVE cldtopres,cldtopres3
472!$OMP THREADPRIVATE(cldtopres,cldtopres3)
473!IM 051005 BEG
474      INTEGER komega, nhoriRD
475
476!c taulev: numero du niveau de tau dans les sorties ISCCP
477      CHARACTER *4 taulev(kmaxm1)
478!c     DATA taulev/'tau1','tau2','tau3','tau4','tau5','tau6','tau7'/
479      DATA taulev/'tau0','tau1','tau2','tau3','tau4','tau5','tau6'/
480      CHARACTER *3 pclev(lmaxm1)
481      DATA pclev/'pc1','pc2','pc3','pc4','pc5','pc6','pc7'/
482      SAVE taulev,pclev
483!$OMP THREADPRIVATE(taulev,pclev)
484!c
485!c cnameisccp
486      CHARACTER *29 cnameisccp(lmaxm1,kmaxm1)
487!IM bad 151205     DATA cnameisccp/'pc< 50hPa, tau< 0.3',
488      DATA cnameisccp/'pc= 50-180hPa, tau< 0.3',                                     &
489       &                'pc= 180-310hPa, tau< 0.3',                                  &
490       &                'pc= 310-440hPa, tau< 0.3',                                  &
491       &                'pc= 440-560hPa, tau< 0.3',                                  &
492       &                'pc= 560-680hPa, tau< 0.3',                                  &
493       &                'pc= 680-800hPa, tau< 0.3',                                  &
494       &                'pc= 800-1000hPa, tau< 0.3',                                 &
495       &                'pc= 50-180hPa, tau= 0.3-1.3',                               &
496       &                'pc= 180-310hPa, tau= 0.3-1.3',                              &
497       &                'pc= 310-440hPa, tau= 0.3-1.3',                              &
498       &                'pc= 440-560hPa, tau= 0.3-1.3',                              &
499       &                'pc= 560-680hPa, tau= 0.3-1.3',                              &
500       &                'pc= 680-800hPa, tau= 0.3-1.3',                              &
501       &                'pc= 800-1000hPa, tau= 0.3-1.3',                             &
502       &                'pc= 50-180hPa, tau= 1.3-3.6',                               &
503       &                'pc= 180-310hPa, tau= 1.3-3.6',                              &
504       &                'pc= 310-440hPa, tau= 1.3-3.6',                              &
505       &                'pc= 440-560hPa, tau= 1.3-3.6',                              &
506       &                'pc= 560-680hPa, tau= 1.3-3.6',                              &
507       &                'pc= 680-800hPa, tau= 1.3-3.6',                              &
508       &                'pc= 800-1000hPa, tau= 1.3-3.6',                             &
509       &                'pc= 50-180hPa, tau= 3.6-9.4',                               &
510       &                'pc= 180-310hPa, tau= 3.6-9.4',                              &
511       &                'pc= 310-440hPa, tau= 3.6-9.4',                              &
512       &                'pc= 440-560hPa, tau= 3.6-9.4',                              &
513       &                'pc= 560-680hPa, tau= 3.6-9.4',                              &
514       &                'pc= 680-800hPa, tau= 3.6-9.4',                              &
515       &                'pc= 800-1000hPa, tau= 3.6-9.4',                             &
516       &                'pc= 50-180hPa, tau= 9.4-23',                                &
517       &                'pc= 180-310hPa, tau= 9.4-23',                               &
518       &                'pc= 310-440hPa, tau= 9.4-23',                               &
519       &                'pc= 440-560hPa, tau= 9.4-23',                               &
520       &                'pc= 560-680hPa, tau= 9.4-23',                               &
521       &                'pc= 680-800hPa, tau= 9.4-23',                               &
522       &                'pc= 800-1000hPa, tau= 9.4-23',                              &
523       &                'pc= 50-180hPa, tau= 23-60',                                 &
524       &                'pc= 180-310hPa, tau= 23-60',                                &
525       &                'pc= 310-440hPa, tau= 23-60',                                &
526       &                'pc= 440-560hPa, tau= 23-60',                                &
527       &                'pc= 560-680hPa, tau= 23-60',                                &
528       &                'pc= 680-800hPa, tau= 23-60',                                &
529       &                'pc= 800-1000hPa, tau= 23-60',                               &
530       &                'pc= 50-180hPa, tau> 60.',                                   &
531       &                'pc= 180-310hPa, tau> 60.',                                  &
532       &                'pc= 310-440hPa, tau> 60.',                                  &
533       &                'pc= 440-560hPa, tau> 60.',                                  &
534       &                'pc= 560-680hPa, tau> 60.',                                  &
535       &                'pc= 680-800hPa, tau> 60.',                                  &
536       &                'pc= 800-1000hPa, tau> 60.'/
537       SAVE cnameisccp
538!$OMP THREADPRIVATE(cnameisccp)
539!c
540!c     REAL zx_lonx7(iimx7), zx_latx7(jjmp1x7)
541!c     INTEGER nhorix7
542!IM: region='3d' <==> sorties en global
543      CHARACTER*3 region
544      PARAMETER(region='3d')
545!c
546!IM ISCCP simulator v3.4
547!c
548      logical ok_hf
549!c
550      integer nid_hf, nid_hf3d
551      save ok_hf, nid_hf, nid_hf3d
552!$OMP THREADPRIVATE(ok_hf, nid_hf, nid_hf3d)
553!c  QUESTION : noms de variables ?
554
555      INTEGER        longcles
556      PARAMETER    ( longcles = 20 )
557      REAL clesphy0( longcles      )
558!c
559!c Variables propres a la physique
560      INTEGER itap
561      SAVE itap                   ! compteur pour la physique
562!$OMP THREADPRIVATE(itap)
563!c
564! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
565!      real slp(klon) ! sea level pressure
566!c
567! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
568!      REAL fevap(klon,nbsrf)
569!      REAL fluxlat(klon,nbsrf)
570!c
571! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
572!      REAL qsol(klon)
573      REAL,save ::  solarlong0
574!$OMP THREADPRIVATE(solarlong0)
575
576!c
577!c  Parametres de l'Orographie a l'Echelle Sous-Maille (OESM):
578!c
579!IM 141004     REAL zulow(klon),zvlow(klon),zustr(klon), zvstr(klon)
580      REAL zulow(klon),zvlow(klon)
581!c
582      INTEGER igwd,idx(klon),itest(klon)
583!c
584! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
585!      REAL agesno(klon,nbsrf)
586
587!c
588!c      REAL,allocatable,save :: run_off_lic_0(:)
589!cc$OMP THREADPRIVATE(run_off_lic_0)
590!cym      SAVE run_off_lic_0
591!cKE43
592!c Variables liees a la convection de K. Emanuel (sb):
593!c
594      REAL bas, top             ! cloud base and top levels
595      SAVE bas
596      SAVE top
597!$OMP THREADPRIVATE(bas, top)
598
599      REAL wdn(klon), tdn(klon), qdn(klon)
600!c
601!c=================================================================================================
602!cCR04.12.07: on ajoute les nouvelles variables du nouveau schema de convection avec poches froides
603!c Variables li\'ees \`a la poche froide (jyg)
604
605      REAL mip(klon,klev)  ! mass flux shed by the adiab ascent at each level
606! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
607!      REAL Vprecip(klon,klev+1)   ! precipitation vertical profile
608!c
609      REAL wape_prescr, fip_prescr
610      INTEGER it_wape_prescr
611      SAVE wape_prescr, fip_prescr, it_wape_prescr
612!$OMP THREADPRIVATE(wape_prescr, fip_prescr, it_wape_prescr)
613!c
614!c variables supplementaires de concvl
615      REAL Tconv(klon,klev)
616      REAL ment(klon,klev,klev),sij(klon,klev,klev)
617      REAL dd_t(klon,klev),dd_q(klon,klev)
618
619      real, save :: alp_bl_prescr=0.
620      real, save :: ale_bl_prescr=0.
621
622      real, save :: ale_max=1000.
623      real, save :: alp_max=2.
624
625      real, save :: wake_s_min_lsp=0.1
626
627!$OMP THREADPRIVATE(alp_bl_prescr,ale_bl_prescr)
628!$OMP THREADPRIVATE(ale_max,alp_max)
629!$OMP THREADPRIVATE(wake_s_min_lsp)
630
631! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
632!      real ale_wake(klon)
633!      real alp_wake(klon)
634
635      real ok_wk_lsp(klon)
636
637!cRC
638!c Variables li\'ees \`a la poche froide (jyg et rr)
639!c Version diagnostique pour l'instant : pas de r\'etroaction sur la convection
640
641      REAL t_wake(klon,klev),q_wake(klon,klev) ! wake pour la convection
642
643      REAL wake_dth(klon,klev)        ! wake : temp pot difference
644
645      REAL wake_d_deltat_gw(klon,klev)! wake : delta T tendency due to Gravity Wave (/s)
646      REAL wake_omgbdth(klon,klev)    ! Wake : flux of Delta_Theta transported by LS omega
647      REAL wake_dp_omgb(klon,klev)    ! Wake : vertical gradient of large scale omega
648      REAL wake_dtKE(klon,klev)       ! Wake : differential heating (wake - unpertubed) CONV
649      REAL wake_dqKE(klon,klev)       ! Wake : differential moistening (wake - unpertubed) CONV
650      REAL wake_dtPBL(klon,klev)      ! Wake : differential heating (wake - unpertubed) PBL
651      REAL wake_dqPBL(klon,klev)      ! Wake : differential moistening (wake - unpertubed) PBL
652! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
653!      REAL wake_omg(klon,klev)        ! Wake : velocity difference (wake - unpertubed)
654      REAL wake_ddeltat(klon,klev),wake_ddeltaq(klon,klev)
655      REAL wake_dp_deltomg(klon,klev) ! Wake : gradient vertical de wake_omg
656      REAL wake_spread(klon,klev)     ! spreading term in wake_delt
657!c
658!cpourquoi y'a pas de save??
659! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
660!      REAL wake_h(klon)               ! Wake : hauteur de la poche froide
661!c
662      INTEGER wake_k(klon)            ! Wake sommet
663!c
664      REAL t_undi(klon,klev)               ! temperature moyenne dans la zone non perturbee
665      REAL q_undi(klon,klev)               ! humidite moyenne dans la zone non perturbee
666!c
667!cjyg
668!ccc      REAL wake_pe(klon)              ! Wake potential energy - WAPE
669
670      REAL wake_gfl(klon)             ! Gust Front Length
671      REAL wake_dens(klon)
672!c
673!c
674      REAL dt_dwn(klon,klev)
675      REAL dq_dwn(klon,klev)
676      REAL wdt_PBL(klon,klev)
677      REAL udt_PBL(klon,klev)
678      REAL wdq_PBL(klon,klev)
679      REAL udq_PBL(klon,klev)
680      REAL M_dwn(klon,klev)
681      REAL M_up(klon,klev)
682      REAL dt_a(klon,klev)
683      REAL dq_a(klon,klev)
684      REAL, SAVE :: alp_offset
685!$OMP THREADPRIVATE(alp_offset)
686
687!c
688!cRR:fin declarations poches froides
689!c=======================================================================================================
690
691      REAL zw2(klon,klev+1)
692
693! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
694!      REAL fraca(klon,klev+1)       
695      REAL ztv(klon,klev),ztva(klon,klev)
696      REAL zpspsk(klon,klev)
697      REAL ztla(klon,klev),zqla(klon,klev)
698      REAL zthl(klon,klev)
699
700!ccc nrlmd le 10/04/2012
701
702!c--------Stochastic Boundary Layer Triggering: ALE_BL--------
703!c---Propri\'et\'es du thermiques au LCL
704      real zlcl_th(klon)                                     ! Altitude du LCL calcul\'e continument (pcon dans thermcell_main.F90)
705      real fraca0(klon)                                      ! Fraction des thermiques au LCL
706      real w0(klon)                                          ! Vitesse des thermiques au LCL
707      real w_conv(klon)                                      ! Vitesse verticale de grande \'echelle au LCL
708      real tke0(klon,klev+1)                                 ! TKE au début du pas de temps
709      real therm_tke_max0(klon)                              ! TKE dans les thermiques au LCL
710      real env_tke_max0(klon)                                ! TKE dans l'environnement au LCL
711
712!c---Spectre de thermiques de type 2 au LCL
713      real n2(klon),s2(klon)
714      real ale_bl_stat(klon)
715
716!c---D\'eclenchement stochastique
717      integer :: tau_trig(klon)
718      real proba_notrig(klon)
719      real random_notrig(klon)
720
721!c--------Statistical Boundary Layer Closure: ALP_BL--------
722!c---Profils de TKE dans et hors du thermique
723      real pbl_tke_input(klon,klev+1,nbsrf)
724      real therm_tke_max(klon,klev)                          ! Profil de TKE dans les thermiques
725      real env_tke_max(klon,klev)                            ! Profil de TKE dans l'environnement
726
727!c---Fermeture statistique
728      real alp_bl_det(klon)                                     ! ALP d\'terministe du thermique unique
729      real alp_bl_fluct_m(klon)                                 ! ALP li\'ee aux fluctuations de flux de masse sous-nuageux
730      real alp_bl_fluct_tke(klon)                               ! ALP li\'ee aux fluctuations d'\'energie cin\'etique sous-nuageuse
731      real alp_bl_conv(klon)                                    ! ALP li\'ee \`a grande \'echelle
732      real alp_bl_stat(klon)                                    ! ALP totale
733
734!ccc fin nrlmd le 10/04/2012
735
736!c Variables locales pour la couche limite (al1):
737!c
738!cAl1      REAL pblh(klon)           ! Hauteur de couche limite
739!cAl1      SAVE pblh
740!c34EK
741!c
742!c Variables locales:
743!c
744! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
745!      REAL cdragh(klon) ! drag coefficient pour T and Q
746!      REAL cdragm(klon) ! drag coefficient pour vent
747!cAA
748!cAA  Pour phytrac
749      REAL u1(klon)             ! vents dans la premiere couche U
750      REAL v1(klon)             ! vents dans la premiere couche V
751
752! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule\n
753!      REAL zxffonte(klon), zxfqcalving(klon),zxfqfonte(klon)
754
755!@$$      LOGICAL offline           ! Controle du stockage ds "physique"
756!@$$      PARAMETER (offline=.false.)
757!@$$      INTEGER physid
758      REAL frac_impa(klon,klev) ! fractions d'aerosols lessivees (impaction)
759      REAL frac_nucl(klon,klev) ! idem (nucleation)
760! RomP >>>
761      REAL beta_prec_fisrt(klon,klev) ! taux de conv de l'eau cond (fisrt)
762! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
763!      REAL beta_prec(klon,klev)       ! taux de conv de l'eau cond (utilise)
764! RomP <<<
765      INTEGER       :: iii
766      REAL          :: calday
767
768!IM cf FH pour Tiedtke 080604
769      REAL rain_tiedtke(klon),snow_tiedtke(klon)
770!c
771!IM 050204 END
772! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
773!      REAL evap(klon), devap(klon) ! evaporation et sa derivee
774      REAL devap(klon) ! evaporation et sa derivee
775
776! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
777!      REAL sens(klon), dsens(klon) ! chaleur sensible et sa derivee
778      REAL dsens(klon) ! chaleur sensible et sa derivee
779
780! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
781!      REAL bils(klon) ! bilan de chaleur au sol
782!      REAL wfbilo(klon,nbsrf) ! bilan d'eau, pour chaque
783!C                             ! type de sous-surface et pondere par la fraction
784!      REAL wfbils(klon,nbsrf) ! bilan de chaleur au sol, pour chaque
785!C                             ! type de sous-surface et pondere par la fraction
786      REAL slab_wfbils(klon)  ! bilan de chaleur au sol pour le cas de slab, sur les points d'ocean
787
788! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
789!      REAL fder(klon)         
790!      REAL ve(klon) ! integr. verticale du transport meri. de l'energie
791!      REAL vq(klon) ! integr. verticale du transport meri. de l'eau
792!      REAL ue(klon) ! integr. verticale du transport zonal de l'energie
793!      REAL uq(klon) ! integr. verticale du transport zonal de l'eau
794!c
795
796! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
797!      REAL frugs(klon,nbsrf)
798!      REAL zxrugs(klon) ! longueur de rugosite
799!c
800!c Conditions aux limites
801!c
802!
803      REAL :: day_since_equinox
804! Date de l'equinoxe de printemps
805      INTEGER, parameter :: mth_eq=3, day_eq=21
806      REAL :: jD_eq
807
808      LOGICAL, parameter :: new_orbit = .true.
809
810!c
811      INTEGER lmt_pas
812      SAVE lmt_pas                ! frequence de mise a jour
813!$OMP THREADPRIVATE(lmt_pas)
814! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
815!      real zmasse(klon, llm),exner(klon, llm)
816      real exner(klon, llm)
817!C     (column-density of mass of air in a cell, in kg m-2)
818      real, parameter:: dobson_u = 2.1415e-05 ! Dobson unit, in kg m-2
819
820!IM sorties
821      REAL un_jour
822      PARAMETER(un_jour=86400.)
823!c======================================================================
824!c
825!c Declaration des procedures appelees
826!c
827      EXTERNAL angle     ! calculer angle zenithal du soleil
828      EXTERNAL alboc     ! calculer l'albedo sur ocean
829      EXTERNAL ajsec     ! ajustement sec
830      EXTERNAL conlmd    ! convection (schema LMD)
831!cKE43
832      EXTERNAL conema3  ! convect4.3
833      EXTERNAL fisrtilp  ! schema de condensation a grande echelle (pluie)
834!cAA
835      EXTERNAL fisrtilp_tr ! schema de condensation a grande echelle (pluie)
836!c                          ! stockage des coefficients necessaires au
837!c                          ! lessivage OFF-LINE et ON-LINE
838      EXTERNAL hgardfou  ! verifier les temperatures
839      EXTERNAL nuage     ! calculer les proprietes radiatives
840!CC      EXTERNAL o3cm      ! initialiser l'ozone
841      EXTERNAL orbite    ! calculer l'orbite terrestre
842      EXTERNAL phyetat0  ! lire l'etat initial de la physique
843      EXTERNAL phyredem  ! ecrire l'etat de redemarrage de la physique
844      EXTERNAL suphel    ! initialiser certaines constantes
845      EXTERNAL transp    ! transport total de l'eau et de l'energie
846      EXTERNAL ecribina  ! ecrire le fichier binaire global
847      EXTERNAL ecribins  ! ecrire le fichier binaire global
848      EXTERNAL ecrirega  ! ecrire le fichier binaire regional
849      EXTERNAL ecriregs  ! ecrire le fichier binaire regional
850!IM
851      EXTERNAL haut2bas  !variables de haut en bas
852      EXTERNAL ini_undefSTD  !initialise a 0 une variable a 1 niveau de pression
853      EXTERNAL undefSTD      !somme les valeurs definies d'1 var a 1 niveau de pression
854!c     EXTERNAL moy_undefSTD  !moyenne d'1 var a 1 niveau de pression
855!c     EXTERNAL moyglo_aire   !moyenne globale d'1 var ponderee par l'aire de la maille (moyglo_pondaire)
856!c                            !par la masse/airetot (moyglo_pondaima) et la vraie masse (moyglo_pondmass)
857!c
858!c Variables locales
859!c
860      REAL rhcl(klon,klev)    ! humiditi relative ciel clair
861      REAL dialiq(klon,klev)  ! eau liquide nuageuse
862      REAL diafra(klon,klev)  ! fraction nuageuse
863      REAL cldliq(klon,klev)  ! eau liquide nuageuse
864! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
865!      REAL cldfra(klon,klev)  ! fraction nuageuse
866!      REAL cldtau(klon,klev)  ! epaisseur optique
867!      REAL cldemi(klon,klev)  ! emissivite infrarouge
868!c
869!CXXX PB
870! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
871      REAL fluxq(klon,klev, nbsrf)   ! flux turbulent d'humidite
872!      REAL fluxt(klon,klev, nbsrf)   ! flux turbulent de chaleur
873!      REAL fluxu(klon,klev, nbsrf)   ! flux turbulent de vitesse u
874!      REAL fluxv(klon,klev, nbsrf)   ! flux turbulent de vitesse v
875!c
876      REAL zxfluxt(klon, klev)
877      REAL zxfluxq(klon, klev)
878      REAL zxfluxu(klon, klev)
879      REAL zxfluxv(klon, klev)
880!CXXX
881!c
882! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
883!      REAL fsollw(klon, nbsrf)   ! bilan flux IR pour chaque sous surface
884!      REAL fsolsw(klon, nbsrf)   ! flux solaire absorb. pour chaque sous surface
885!c Le rayonnement n'est pas calcule tous les pas, il faut donc
886!c                      sauvegarder les sorties du rayonnement
887!cym      SAVE  heat,cool,albpla,topsw,toplw,solsw,sollw,sollwdown
888!cym      SAVE  sollwdownclr, toplwdown, toplwdownclr
889!cym      SAVE  topsw0,toplw0,solsw0,sollw0, heat0, cool0
890!c
891      INTEGER itaprad
892      SAVE itaprad
893!$OMP THREADPRIVATE(itaprad)
894!c
895      REAL conv_q(klon,klev) ! convergence de l'humidite (kg/kg/s)
896      REAL conv_t(klon,klev) ! convergence de la temperature(K/s)
897!c
898! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
899!      REAL cldl(klon),cldm(klon),cldh(klon) !nuages bas, moyen et haut
900!      REAL cldt(klon),cldq(klon) !nuage total, eau liquide integree
901!c
902!      REAL zxtsol(klon), zxqsurf(klon), zxsnow(klon), zxfluxlat(klon)
903      REAL zxsnow_dummy(klon)
904!c
905      REAL dist, rmu0(klon), fract(klon)
906      REAL zdtime, zlongi
907!c
908      CHARACTER*2 str2
909      CHARACTER*2 iqn
910!c
911      REAL qcheck
912      REAL z_avant(klon), z_apres(klon), z_factor(klon)
913      LOGICAL zx_ajustq
914!c
915      REAL za, zb
916      REAL zx_t, zx_qs, zdelta, zcor, zfra, zlvdcp, zlsdcp
917      real zqsat(klon,klev)
918      INTEGER i, k, iq, ig, j, nsrf, ll, l, iiq, iff
919      REAL t_coup
920      PARAMETER (t_coup=234.0)
921!c
922! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
923!      REAL zphi(klon,klev)
924!cym A voir plus tard !!
925!cym      REAL zx_relief(iim,jjmp1)
926!cym      REAL zx_aire(iim,jjmp1)
927!c
928!c Grandeurs de sorties
929! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
930!      REAL s_pblh(klon), s_lcl(klon), s_capCL(klon)
931!      REAL s_oliqCL(klon), s_cteiCL(klon), s_pblt(klon)
932!      REAL s_therm(klon), s_trmb1(klon), s_trmb2(klon)
933      REAL s_capCL(klon)
934      REAL s_oliqCL(klon), s_cteiCL(klon)
935      REAL s_trmb1(klon), s_trmb2(klon)
936      REAL s_trmb3(klon)
937!cKE43
938!c Variables locales pour la convection de K. Emanuel (sb):
939!c
940! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
941!      REAL upwd(klon,klev)      ! saturated updraft mass flux
942!      REAL dnwd(klon,klev)      ! saturated downdraft mass flux
943!      REAL dnwd0(klon,klev)     ! unsaturated downdraft mass flux
944      REAL tvp(klon,klev)       ! virtual temp of lifted parcel
945!      REAL plcl(klon)           ! Lifting Condensation Level
946!      REAL plfc(klon)           ! Level of Free Convection
947!      REAL wbeff(klon)          ! saturated updraft velocity at LFC
948      CHARACTER*40 capemaxcels  !max(CAPE)
949
950      REAL rflag(klon)          ! flag fonctionnement de convect
951      INTEGER iflagctrl(klon)          ! flag fonctionnement de convect
952
953!c -- convect43:
954      INTEGER ntra              ! nb traceurs pour convect4.3
955      REAL pori_con(klon)    ! pressure at the origin level of lifted parcel
956      REAL dtma_con(klon),dtlcl_con(klon)
957      REAL dtvpdt1(klon,klev), dtvpdq1(klon,klev)
958      REAL dplcldt(klon), dplcldr(klon)
959!c?     .     condm_con(klon,klev),conda_con(klon,klev),
960!c?     .     mr_con(klon,klev),ep_con(klon,klev)
961!c?     .    ,sadiab(klon,klev),wadiab(klon,klev)
962!c --
963!c34EK
964!c
965!c Variables du changement
966!c
967!c con: convection
968!c lsc: condensation a grande echelle (Large-Scale-Condensation)
969!c ajs: ajustement sec
970!c eva: evaporation de l'eau liquide nuageuse
971!c vdf: couche limite (Vertical DiFfusion)
972! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
973!      REAL rneb(klon,klev)
974
975! tendance nulles
976      REAL du0(klon,klev),dv0(klon,klev),dq0(klon,klev),dql0(klon,klev)
977
978!c
979!*********************************************************
980!*     declarations
981     
982!*********************************************************
983!IM 081204 END
984!c
985! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
986!      REAL pmfu(klon,klev), pmfd(klon,klev)
987      REAL pen_u(klon,klev), pen_d(klon,klev)
988      REAL pde_u(klon,klev), pde_d(klon,klev)
989      INTEGER kcbot(klon), kctop(klon), kdtop(klon)
990! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
991!      REAL pmflxr(klon,klev+1), pmflxs(klon,klev+1)
992!      REAL prfl(klon,klev+1), psfl(klon,klev+1)
993!c
994! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
995!      REAL rain_lsc(klon)
996!      REAL snow_lsc(klon)
997!c
998      REAL ratqsc(klon,klev)
999      real ratqsbas,ratqshaut,tau_ratqs
1000      save ratqsbas,ratqshaut,tau_ratqs
1001!$OMP THREADPRIVATE(ratqsbas,ratqshaut,tau_ratqs)
1002      real zpt_conv(klon,klev)
1003
1004!c Parametres lies au nouveau schema de nuages (SB, PDF)
1005      real fact_cldcon
1006      real facttemps
1007      logical ok_newmicro
1008      save ok_newmicro
1009! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
1010!      real ref_liq(klon,klev), ref_ice(klon,klev)
1011
1012!$OMP THREADPRIVATE(ok_newmicro)
1013      save fact_cldcon,facttemps
1014!$OMP THREADPRIVATE(fact_cldcon,facttemps)
1015
1016      integer iflag_cldcon
1017      save iflag_cldcon
1018!$OMP THREADPRIVATE(iflag_cldcon)
1019! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
1020!      logical ptconv(klon,klev)
1021!IM cf. AM 081204 BEG
1022      logical ptconvth(klon,klev)
1023!IM cf. AM 081204 END
1024!c
1025!c Variables liees a l'ecriture de la bande histoire physique
1026!c
1027!c======================================================================
1028!c
1029!IM cf. AM 081204 BEG
1030!c   declarations pour sortir sur une sous-region
1031      integer imin_ins,imax_ins,jmin_ins,jmax_ins
1032      save imin_ins,imax_ins,jmin_ins,jmax_ins
1033!$OMP THREADPRIVATE(imin_ins,imax_ins,jmin_ins,jmax_ins)
1034!c      real lonmin_ins,lonmax_ins,latmin_ins
1035!c     s  ,latmax_ins
1036!c     data lonmin_ins,lonmax_ins,latmin_ins
1037!c    s  ,latmax_ins/
1038!c valeurs initiales     s   -5.,20.,41.,55./   
1039!c    s   100.,130.,-20.,20./
1040!c    s   -180.,180.,-90.,90./
1041!c======================================================================
1042!IM cf. AM 081204 END
1043
1044!c
1045      integer itau_w   ! pas de temps ecriture = itap + itau_phy
1046!c
1047!c
1048!c Variables locales pour effectuer les appels en serie
1049!c
1050! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule\n
1051!      REAL zx_rh(klon,klev)
1052!IM RH a 2m (la surface)
1053! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
1054!      REAL rh2m(klon), qsat2m(klon)
1055!      REAL tpot(klon), tpote(klon)
1056      REAL Lheat
1057
1058      INTEGER        length
1059      PARAMETER    ( length = 100 )
1060      REAL tabcntr0( length       )
1061!c
1062      INTEGER ndex2d(iim*jjmp1),ndex3d(iim*jjmp1*klev)
1063!IM
1064      INTEGER ndex2d1(iwmax)
1065!c
1066!IM AMIP2 BEG
1067      REAL moyglo, mountor
1068!IM 141004 BEG
1069      REAL zustrdr(klon), zvstrdr(klon)
1070      REAL zustrli(klon), zvstrli(klon)
1071      REAL zustrph(klon), zvstrph(klon)
1072      REAL zustrhi(klon), zvstrhi(klon)
1073      REAL aam, torsfc
1074!IM 141004 END
1075!IM 190504 BEG
1076      INTEGER ij, imp1jmp1
1077      PARAMETER(imp1jmp1=(iim+1)*jjmp1)
1078!cym A voir plus tard
1079      REAL zx_tmp(imp1jmp1), airedyn(iim+1,jjmp1)
1080      REAL padyn(iim+1,jjmp1,klev+1)
1081      REAL dudyn(iim+1,jjmp1,klev)
1082      REAL rlatdyn(iim+1,jjmp1)
1083!IM 190504 END
1084      LOGICAL ok_msk
1085      REAL msk(klon)
1086!IM
1087      REAL airetot, pi
1088!cym A voir plus tard
1089!cym      REAL zm_wo(jjmp1, klev)
1090!IM AMIP2 END
1091!c
1092      REAL zx_tmp_fi2d(klon)      ! variable temporaire grille physique
1093      REAL zx_tmp_fi3d(klon,klev) ! variable temporaire pour champs 3D
1094      REAL zx_tmp_fi3d1(klon,klev+1) !variable temporaire pour champs 3D (kelvp1)
1095      REAL(KIND=8) zx_tmp2_fi3d(klon,klev) ! variable temporaire pour champs 3D
1096      REAL zx_tmp_2d(iim,jjmp1), zx_tmp_3d(iim,jjmp1,klev)
1097      REAL zx_lon(iim,jjmp1), zx_lat(iim,jjmp1)
1098!c
1099      INTEGER nid_day, nid_mth, nid_ins, nid_mthnmc, nid_daynmc
1100      INTEGER nid_hfnmc, nid_day_seri, nid_ctesGCM
1101      SAVE nid_day, nid_mth, nid_ins, nid_mthnmc, nid_daynmc
1102      SAVE nid_hfnmc, nid_day_seri, nid_ctesGCM
1103!$OMP THREADPRIVATE(nid_day, nid_mth, nid_ins)
1104!$OMP THREADPRIVATE(nid_mthnmc, nid_daynmc, nid_hfnmc)
1105!$OMP THREADPRIVATE(nid_day_seri,nid_ctesGCM)
1106!c
1107!IM 280405 BEG
1108      INTEGER nid_bilKPins, nid_bilKPave
1109      SAVE nid_bilKPins, nid_bilKPave
1110!$OMP THREADPRIVATE(nid_bilKPins, nid_bilKPave)
1111!c
1112      REAL ve_lay(klon,klev) ! transport meri. de l'energie a chaque niveau vert.
1113      REAL vq_lay(klon,klev) ! transport meri. de l'eau a chaque niveau vert.
1114      REAL ue_lay(klon,klev) ! transport zonal de l'energie a chaque niveau vert.
1115      REAL uq_lay(klon,klev) ! transport zonal de l'eau a chaque niveau vert.
1116!c
1117      INTEGER nhori, nvert, nvert1, nvert3
1118      REAL zsto, zsto1, zsto2
1119      REAL zstophy, zstorad, zstohf, zstoday, zstomth, zout
1120      REAL zcals(napisccp), zcalh(napisccp), zoutj(napisccp)
1121      REAL zout_isccp(napisccp)
1122      SAVE zcals, zcalh, zoutj, zout_isccp
1123!$OMP THREADPRIVATE(zcals, zcalh, zoutj, zout_isccp)
1124
1125      real zjulian
1126      save zjulian
1127!$OMP THREADPRIVATE(zjulian)
1128
1129      character*20 modname
1130      character*80 abort_message
1131      logical ok_sync
1132      real date0
1133      integer idayref
1134
1135!C essai writephys
1136      integer fid_day, fid_mth, fid_ins
1137      parameter (fid_ins = 1, fid_day = 2, fid_mth = 3)
1138      integer prof2d_on, prof3d_on, prof2d_av, prof3d_av
1139      parameter (prof2d_on = 1, prof3d_on = 2,                                       &
1140       &           prof2d_av = 3, prof3d_av = 4)
1141      character*30 nom_fichier
1142      character*40 varname
1143      character*40 vartitle
1144      character*20 varunits
1145!C     Variables liees au bilan d'energie et d'enthalpi
1146      REAL ztsol(klon)
1147      REAL      h_vcol_tot, h_dair_tot, h_qw_tot, h_ql_tot                           &
1148       &        , h_qs_tot, qw_tot, ql_tot, qs_tot , ec_tot
1149      SAVE      h_vcol_tot, h_dair_tot, h_qw_tot, h_ql_tot                           &
1150       &        , h_qs_tot, qw_tot, ql_tot, qs_tot , ec_tot
1151!$OMP THREADPRIVATE(h_vcol_tot, h_dair_tot, h_qw_tot, h_ql_tot,
1152!$OMP+              h_qs_tot, qw_tot, ql_tot, qs_tot , ec_tot)
1153      REAL      d_h_vcol, d_h_dair, d_qt, d_qw, d_ql, d_qs, d_ec
1154      REAL      d_h_vcol_phy
1155      REAL      fs_bound, fq_bound
1156      SAVE      d_h_vcol_phy
1157!$OMP THREADPRIVATE(d_h_vcol_phy)
1158      REAL      zero_v(klon)
1159      CHARACTER*15 ztit
1160      INTEGER   ip_ebil  ! PRINT level for energy conserv. diag.
1161      SAVE      ip_ebil
1162      DATA      ip_ebil/0/
1163!$OMP THREADPRIVATE(ip_ebil)
1164      INTEGER   if_ebil ! level for energy conserv. dignostics
1165      SAVE      if_ebil
1166!$OMP THREADPRIVATE(if_ebil)
1167!c+jld ec_conser
1168      REAL ZRCPD
1169!c-jld ec_conser
1170! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
1171!      REAL t2m(klon,nbsrf)  ! temperature a 2m
1172      REAL q2m(klon,nbsrf)  ! humidite a 2m
1173
1174!IM: t2m, q2m, ustar, u10m, v10m et t2mincels, t2maxcels
1175! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
1176!      REAL zt2m(klon), zq2m(klon)             !temp., hum. 2m moyenne s/ 1 maille
1177!      REAL zustar(klon),zu10m(klon), zv10m(klon)  ! u* et vents a 10m moyennes s/1 maille
1178      CHARACTER*40 t2mincels, t2maxcels       !t2m min., t2m max
1179      CHARACTER*40 tinst, tave, typeval
1180      REAL cldtaupi(klon,klev)  ! Cloud optical thickness for pre-industrial (pi) aerosols
1181
1182! L. Fita, LMD. January 2014. Defined in output_lmdz_NOmodule
1183!      REAL re(klon, klev)       ! Cloud droplet effective radius
1184!      REAL fl(klon, klev)  ! denominator of re
1185
1186      REAL re_top(klon), fl_top(klon) ! CDR at top of liquid water clouds
1187
1188      ! Aerosol optical properties
1189      CHARACTER*4, DIMENSION(naero_grp) :: rfname
1190      REAL, DIMENSION(klon)          :: aerindex     ! POLDER aerosol index
1191      REAL, DIMENSION(klon,klev)     :: mass_solu_aero    ! total mass concentration for all soluble aerosols[ug/m3]
1192      REAL, DIMENSION(klon,klev)     :: mass_solu_aero_pi ! - " - (pre-industrial value)
1193      INTEGER :: naero ! aerosol species
1194
1195      ! Parameters
1196      LOGICAL ok_ade, ok_aie    ! Apply aerosol (in)direct effects or not
1197      LOGICAL ok_cdnc          ! ok cloud droplet number concentration (O. Boucher 01-2013)
1198      REAL bl95_b0, bl95_b1   ! Parameter in Boucher and Lohmann (1995)
1199      SAVE ok_ade, ok_aie, ok_cdnc, bl95_b0, bl95_b1
1200!$OMP THREADPRIVATE(ok_ade, ok_aie, ok_cdnc, bl95_b0, bl95_b1)
1201      LOGICAL, SAVE :: aerosol_couple ! true  : calcul des aerosols dans INCA
1202                                      ! false : lecture des aerosol dans un fichier
1203!$OMP THREADPRIVATE(aerosol_couple)   
1204      INTEGER, SAVE :: flag_aerosol
1205!$OMP THREADPRIVATE(flag_aerosol)
1206      LOGICAL, SAVE :: new_aod
1207!$OMP THREADPRIVATE(new_aod)
1208!c
1209!c--STRAT AEROSOL
1210      LOGICAL, SAVE :: flag_aerosol_strat
1211!$OMP THREADPRIVATE(flag_aerosol_strat)
1212!cc-fin STRAT AEROSOL
1213!c
1214!c Declaration des constantes et des fonctions thermodynamiques
1215!c
1216      LOGICAL,SAVE :: first=.true.
1217!$OMP THREADPRIVATE(first)
1218
1219      integer iunit
1220
1221      integer, save::  read_climoz ! read ozone climatology
1222!C     (let it keep the default OpenMP shared attribute)
1223!C     Allowed values are 0, 1 and 2
1224!C     0: do not read an ozone climatology
1225!C     1: read a single ozone climatology that will be used day and night
1226!C     2: read two ozone climatologies, the average day and night
1227!C     climatology and the daylight climatology
1228
1229      integer, save:: ncid_climoz ! NetCDF file containing ozone climatologies
1230!C     (let it keep the default OpenMP shared attribute)
1231
1232      real, pointer, save:: press_climoz(:)
1233!C     (let it keep the default OpenMP shared attribute)
1234!     edges of pressure intervals for ozone climatologies, in Pa, in strictly
1235!     ascending order
1236
1237      integer, save:: co3i = 0
1238!     time index in NetCDF file of current ozone fields
1239!$OMP THREADPRIVATE(co3i)
1240
1241      integer ro3i
1242!     required time index in NetCDF file for the ozone fields, between 1
1243!     and 360
1244
1245      INTEGER ierr
1246#include "YOMCST.h"
1247#include "YOETHF.h"
1248#include "FCTTRE.h"
1249!IM 100106 BEG : pouvoir sortir les ctes de la physique
1250#include "conema3.h"
1251#include "fisrtilp.h"
1252#include "nuage.h"
1253#include "compbl.h"
1254!IM 100106 END : pouvoir sortir les ctes de la physique
1255!c
1256!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1257!c Declarations pour Simulateur COSP
1258!c============================================================
1259      real :: mr_ozone(klon,klev)
1260
1261!IM sorties fichier 1D paramLMDZ_phy.nc
1262      REAL :: zx_tmp_0d(1,1)
1263      INTEGER, PARAMETER :: np=1
1264      REAL,dimension(klon_glo)        :: rlat_glo
1265      REAL,dimension(klon_glo)        :: rlon_glo
1266      REAL gbils(1), gevap(1), gevapt(1), glat(1), gnet0(1), gnet(1)
1267      REAL grain(1), gtsol(1), gt2m(1), gprw(1)
1268
1269!IM stations CFMIP
1270      INTEGER, SAVE :: nCFMIP
1271!$OMP THREADPRIVATE(nCFMIP)
1272      INTEGER, PARAMETER :: npCFMIP=120
1273      INTEGER, ALLOCATABLE, SAVE :: tabCFMIP(:)
1274      REAL, ALLOCATABLE, SAVE :: lonCFMIP(:), latCFMIP(:)
1275!$OMP THREADPRIVATE(tabCFMIP, lonCFMIP, latCFMIP)
1276      INTEGER, ALLOCATABLE, SAVE :: tabijGCM(:)
1277      REAL, ALLOCATABLE, SAVE :: lonGCM(:), latGCM(:)
1278!$OMP THREADPRIVATE(tabijGCM, lonGCM, latGCM)
1279      INTEGER, ALLOCATABLE, SAVE :: iGCM(:), jGCM(:)
1280!$OMP THREADPRIVATE(iGCM, jGCM)
1281      logical, dimension(nfiles)            :: phys_out_filestations
1282      logical, parameter :: lNMC=.FALSE.
1283
1284!IM betaCRF
1285      REAL, SAVE :: pfree, beta_pbl, beta_free
1286!$OMP THREADPRIVATE(pfree, beta_pbl, beta_free)
1287      REAL, SAVE :: lon1_beta,  lon2_beta, lat1_beta, lat2_beta
1288!$OMP THREADPRIVATE(lon1_beta,  lon2_beta, lat1_beta, lat2_beta)
1289      LOGICAL, SAVE :: mskocean_beta
1290!$OMP THREADPRIVATE(mskocean_beta)
1291      REAL, dimension(klon, klev) :: beta         ! facteur sur cldtaurad et cldemirad pour evaluer les retros liees aux CRF
1292      REAL, dimension(klon, klev) :: cldtaurad    ! epaisseur optique pour radlwsw pour tester "CRF off"
1293      REAL, dimension(klon, klev) :: cldtaupirad  ! epaisseur optique pour radlwsw pour tester "CRF off"
1294      REAL, dimension(klon, klev) :: cldemirad    ! emissivite pour radlwsw pour tester "CRF off"
1295      REAL, dimension(klon, klev) :: cldfrarad    ! fraction nuageuse
1296
1297      INTEGER :: nbtr_tmp ! Number of tracer inside concvl
1298      REAL, dimension(klon,klev) :: sh_in ! Specific humidity entering in phytrac
1299      integer iostat
1300
1301! Lluis
1302      INTEGER                                            :: llp
1303      CHARACTER(LEN=50)                                  :: lvarname, lfname
1304      REAL                                               :: largest
1305
1306      llp = 734
1307      lfunc = 'physiq'
1308      largest = 10.e5
1309
1310!c======================================================================
1311! Gestion calendrier : mise a jour du module phys_cal_mod
1312!
1313      CALL phys_cal_update(jD_cur,jH_cur)
1314      PRINT *,'  Lluis physiq: jD_cur: ',jD_cur, ' jH_cur: ',jH_cur, &
1315        ' days_elapsed: ',days_elapsed
1316
1317!c======================================================================
1318! Ecriture eventuelle d'un profil verticale en entree de la physique.
1319! Utilise notamment en 1D mais peut etre active egalement en 3D
1320! en imposant la valeur de igout.
1321!c======================================================================
1322
1323      if (prt_level.ge.1) then
1324! Lluis
1325!          igout=klon/2+1/klon
1326          igout=llp
1327         write(lunout,*) 'DEBUT DE PHYSIQ !!!!!!!!!!!!!!!!!!!!'
1328         write(lunout,*)                                                             &
1329       & 'nlon,klev,nqtot,debut,lafin, jD_cur, jH_cur,pdtphys'
1330         write(lunout,*)                                                             &
1331       &  nlon,klev,nqtot,debut,lafin, jD_cur, jH_cur,pdtphys
1332
1333         write(lunout,*) 'paprs, play, phi, u, v, t'
1334         do k=1,klev
1335            write(lunout,*) paprs(igout,k),pplay(igout,k),pphi(igout,k),             &
1336       &   u(igout,k),v(igout,k),t(igout,k)
1337         enddo
1338         write(lunout,*) 'ovap (g/kg),  oliq (g/kg)'
1339         do k=1,klev
1340            write(lunout,*) qx(igout,k,1)*1000,qx(igout,k,2)*1000.
1341         enddo
1342      endif
1343
1344!c======================================================================
1345
1346!cym => necessaire pour iflag_con != 2   
1347      pmfd(:,:) = 0.
1348      pen_u(:,:) = 0.
1349      pen_d(:,:) = 0.
1350      pde_d(:,:) = 0.
1351      pde_u(:,:) = 0.
1352      aam=0.
1353
1354      torsfc=0.
1355
1356      forall (k=1: llm) zmasse(:, k) = (paprs(:, k)-paprs(:, k+1)) / rg
1357
1358      if (first) then
1359     
1360!cCR:nvelles variables convection/poches froides
1361     
1362      print*, '================================================='
1363      print*, 'Allocation des variables locales et sauvegardees'
1364
1365      call phys_local_var_init
1366
1367!c
1368      pasphys=pdtphys
1369!c     appel a la lecture du run.def physique
1370      call conf_phys(ok_journe, ok_mensuel,                                          &
1371       &     ok_instan, ok_hf,                                                       &
1372       &     ok_LES,                                                                 &
1373       &     callstats,                                                              &
1374       &     solarlong0,seuil_inversion,                                             &
1375       &     fact_cldcon, facttemps,ok_newmicro,iflag_radia,                         &
1376       &     iflag_cldcon,iflag_ratqs,ratqsbas,ratqshaut,tau_ratqs,                  &
1377       &     ok_ade, ok_aie, ok_cdnc, aerosol_couple,                                &
1378       &     flag_aerosol, flag_aerosol_strat, new_aod,                              &
1379       &     bl95_b0, bl95_b1,                                                       &
1380!c     nv flags pour la convection et les poches froides                             &
1381       &     read_climoz,                                                            &
1382       &     alp_offset)
1383
1384
1385!!      call phys_state_var_init(read_climoz)
1386      call phys_output_var_init
1387
1388
1389!L. Fita, LMD. November 2013
1390! Initializing
1391! Variables have been already initialilzed from the WRF variables.
1392!   Using on purpose subroutines from physiq_limit_variables_mod
1393!!      CALL neige_initialize()
1394!!      CALL limit_initialize()
1395!!      CALL vars_limit_init(klon)
1396
1397! L. Fita, LMD January 2014. Initializing output variables
1398      CALL init_ovars_lmdz_NOmodule(klon,klev,nbsrf)
1399
1400! Allocating restart variables
1401!      ALLOCATE(qsol(klon))
1402!      ALLOCATE(fder(klon))
1403!      ALLOCATE(snow(klon, nbsrf))
1404!      ALLOCATE(qsurf(klon, nbsrf))
1405!      ALLOCATE(evap(klon, nbsrf))
1406!      ALLOCATE(rugos(klon, nbsrf))
1407!      ALLOCATE(agesno(klon, nbsrf))
1408!      ALLOCATE(ftsoil(klon, nsoilmx, nbsrf))
1409!!      ALLOCATE(restart_runoff(klon))
1410
1411!      CALL pbl_surface_init(qsol_rst, fder_rst, snow_rst, qsurf_rst, evap_rst,       &
1412!        rugos_rst, agesno_rst, ftsoil_rst)
1413!      CALL fonte_neige_init(restart_runoff)
1414!      qsol=qsol_rst
1415
1416      print*, '================================================='
1417!c
1418          dnwd0=0.0
1419          ftd=0.0
1420          fqd=0.0
1421          cin=0.
1422!cym Attention pbase pas initialise dans concvl !!!!
1423          pbase=0
1424!IM 180608
1425
1426        itau_con=0
1427        first=.false.
1428
1429      endif  ! first
1430
1431       modname = 'physiq'
1432!IM
1433      IF (ip_ebil_phy.ge.1) THEN
1434        DO i=1,klon
1435          zero_v(i)=0.
1436        END DO
1437      END IF
1438      ok_sync=.TRUE.
1439
1440      IF (debut) THEN
1441         CALL suphel ! initialiser constantes et parametres phys.
1442      ENDIF
1443
1444      if(prt_level.ge.1) print*,'CONVERGENCE PHYSIQUE THERM 1 '
1445
1446
1447!c======================================================================
1448! Gestion calendrier : mise a jour du module phys_cal_mod
1449!
1450!c     CALL phys_cal_update(jD_cur,jH_cur)
1451
1452!c
1453!c Si c'est le debut, il faut initialiser plusieurs choses
1454!c          ********
1455!c
1456
1457       IF (debut) THEN
1458!rv
1459!cCRinitialisation de wght_th et lalim_conv pour la definition de la couche alimentation
1460!cde la convection a partir des caracteristiques du thermique
1461         wght_th(:,:)=1.
1462         lalim_conv(:)=1
1463!cRC
1464         ustar(:,:)=0.
1465         u10m(:,:)=0.
1466         v10m(:,:)=0.
1467         rain_con(:)=0.
1468         snow_con(:)=0.
1469         topswai(:)=0.
1470         topswad(:)=0.
1471         solswai(:)=0.
1472         solswad(:)=0.
1473
1474         wmax_th(:)=0.
1475         tau_overturning_th(:)=0.
1476
1477         IF (type_trac == 'inca') THEN
1478            ! jg : initialisation jusqu'au ces variables sont dans restart
1479            ccm(:,:,:) = 0.
1480            tau_aero(:,:,:,:) = 0.
1481            piz_aero(:,:,:,:) = 0.
1482            cg_aero(:,:,:,:) = 0.
1483         END IF
1484
1485         rnebcon0(:,:) = 0.0
1486         clwcon0(:,:) = 0.0
1487         rnebcon(:,:) = 0.0
1488         clwcon(:,:) = 0.0
1489
1490!IM     
1491         IF (ip_ebil_phy.ge.1) d_h_vcol_phy=0.
1492!c
1493      print*,'iflag_coupl,iflag_clos,iflag_wake',                                    &
1494       &   iflag_coupl,iflag_clos,iflag_wake
1495      print*,'CYCLE_DIURNE', cycle_diurne
1496!c
1497      IF (iflag_con.EQ.2.AND.iflag_cldcon.GT.-1) THEN
1498         abort_message = 'Tiedtke needs iflag_cldcon=-2 or -1'
1499         CALL abort_gcm (modname,abort_message,1)
1500      ENDIF
1501!c
1502      IF(ok_isccp.AND.iflag_con.LE.2) THEN
1503         abort_message = 'ISCCP-like outputs may be available for KE                 &
1504       &(iflag_con >= 3); for Tiedtke (iflag_con=-2) put ok_isccp=n'
1505         CALL abort_gcm (modname,abort_message,1)
1506      ENDIF
1507!c
1508!c Initialiser les compteurs:
1509!c
1510         itap    = 0
1511         itaprad = 0
1512
1513!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1514!! Un petit travail \`a faire ici.
1515!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1516
1517         if (iflag_pbl>1) then
1518             PRINT*, "Using method MELLOR&YAMADA"
1519         endif
1520
1521!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1522! FH 2008/05/02 changement lie a la lecture de nbapp_rad dans phylmd plutot que
1523! dyn3d
1524! Attention : la version precedente n'etait pas tres propre.
1525! Il se peut qu'il faille prendre une valeur differente de nbapp_rad
1526! pour obtenir le meme resultat.
1527         dtime=pdtphys
1528         radpas = NINT( 86400./dtime/nbapp_rad)
1529!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1530
1531         CALL phyetat0 ("startphy.nc",clesphy0,tabcntr0)
1532
1533         IF (klon_glo==1) THEN
1534         coefh=0. ; coefm=0. ; pbl_tke=0.
1535         coefh(:,2,:)=1.e-2 ; coefm(:,2,:)=1.e-2 ; pbl_tke(:,2,:)=1.e-2
1536         PRINT*,'FH WARNING : lignes a supprimer'
1537         ENDIF
1538!IM begin
1539          print*,'physiq: clwcon rnebcon ratqs',clwcon(1,1),rnebcon(1,1)             &
1540       &,ratqs(1,1)
1541!IM end
1542
1543
1544
1545!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1546!c
1547!C on remet le calendrier a zero
1548!c
1549         IF (raz_date .eq. 1) THEN
1550           itau_phy = 0
1551         ENDIF
1552
1553!IM cf. AM 081204 BEG
1554         PRINT*,'cycle_diurne3 =',cycle_diurne
1555!IM cf. AM 081204 END
1556!c
1557         CALL printflag( tabcntr0,radpas,ok_journe,                                  &
1558       &                    ok_instan, ok_region )
1559!c
1560         IF (ABS(dtime-pdtphys).GT.0.001) THEN
1561            WRITE(lunout,*) 'Pas physique n est pas correct',dtime,                  &
1562       &                        pdtphys
1563            abort_message='Pas physique n est pas correct '
1564!           call abort_gcm(modname,abort_message,1)
1565            dtime=pdtphys
1566         ENDIF
1567         IF (nlon .NE. klon) THEN
1568            WRITE(lunout,*)'nlon et klon ne sont pas coherents', nlon,               &
1569       &                      klon
1570            abort_message='nlon et klon ne sont pas coherents'
1571            call abort_gcm(modname,abort_message,1)
1572         ENDIF
1573         IF (nlev .NE. klev) THEN
1574            WRITE(lunout,*)'nlev et klev ne sont pas coherents', nlev,               &
1575       &                       klev
1576            abort_message='nlev et klev ne sont pas coherents'
1577            call abort_gcm(modname,abort_message,1)
1578         ENDIF
1579!c
1580         IF (dtime*REAL(radpas).GT.21600..AND.cycle_diurne) THEN
1581           WRITE(lunout,*)'Nbre d appels au rayonnement insuffisant'
1582           WRITE(lunout,*)"Au minimum 4 appels par jour si cycle diurne"
1583           abort_message='Nbre d appels au rayonnement insuffisant'
1584           call abort_gcm(modname,abort_message,1)
1585         ENDIF
1586         WRITE(lunout,*)"Clef pour la convection, iflag_con=", iflag_con
1587         WRITE(lunout,*)"Clef pour le driver de la convection, ok_cvl=",             &
1588       &                   ok_cvl
1589!c
1590!cKE43
1591!c Initialisation pour la convection de K.E. (sb):
1592         IF (iflag_con.GE.3) THEN
1593
1594         WRITE(lunout,*)"*** Convection de Kerry Emanuel 4.3  "
1595         WRITE(lunout,*)                                                             &
1596       &      "On va utiliser le melange convectif des traceurs qui"
1597         WRITE(lunout,*)"est calcule dans convect4.3"
1598         WRITE(lunout,*)" !!! penser aux logical flags de phytrac"
1599
1600          DO i = 1, klon
1601           ema_cbmf(i) = 0.
1602           ema_pcb(i)  = 0.
1603           ema_pct(i)  = 0.
1604!c          ema_workcbmf(i) = 0.
1605          ENDDO
1606!IM15/11/02 rajout initialisation ibas_con,itop_con cf. SB =>BEG
1607          DO i = 1, klon
1608           ibas_con(i) = 1
1609           itop_con(i) = 1
1610          ENDDO
1611!IM15/11/02 rajout initialisation ibas_con,itop_con cf. SB =>END
1612!c===============================================================================
1613!cCR:04.12.07: initialisations poches froides
1614!c Controle de ALE et ALP pour la fermeture convective (jyg)
1615          if (iflag_wake>=1) then
1616            CALL ini_wake(0.,0.,it_wape_prescr,wape_prescr,fip_prescr                &
1617       &                  ,alp_bl_prescr, ale_bl_prescr)
1618!c 11/09/06 rajout initialisation ALE et ALP du wake et PBL(YU)
1619!c        print*,'apres ini_wake iflag_cldcon=', iflag_cldcon
1620          endif
1621
1622        do i = 1,klon
1623         Ale_bl(i)=0.
1624         Alp_bl(i)=0.
1625        enddo
1626
1627!c================================================================================
1628!IM stations CFMIP
1629      nCFMIP=npCFMIP
1630      OPEN(98,file='npCFMIP_param.data',status='old',                                &
1631       &          form='formatted',iostat=iostat)
1632            if (iostat == 0) then
1633      READ(98,*,end=998) nCFMIP
1634998   CONTINUE
1635      CLOSE(98)
1636      CONTINUE
1637      IF(nCFMIP.GT.npCFMIP) THEN
1638       print*,'nCFMIP > npCFMIP : augmenter npCFMIP et recompiler'
1639       CALL abort
1640      else
1641       print*,'physiq npCFMIP=',npCFMIP,'nCFMIP=',nCFMIP
1642      ENDIF
1643
1644!c
1645      ALLOCATE(tabCFMIP(nCFMIP))
1646      ALLOCATE(lonCFMIP(nCFMIP), latCFMIP(nCFMIP))
1647      ALLOCATE(tabijGCM(nCFMIP))
1648      ALLOCATE(lonGCM(nCFMIP), latGCM(nCFMIP))
1649      ALLOCATE(iGCM(nCFMIP), jGCM(nCFMIP))
1650!c
1651!c lecture des nCFMIP stations CFMIP, de leur numero
1652!c et des coordonnees geographiques lonCFMIP, latCFMIP
1653!c
1654         CALL read_CFMIP_point_locations(nCFMIP, tabCFMIP,                           &
1655       &lonCFMIP, latCFMIP)
1656!c
1657!c identification des
1658!c 1) coordonnees lonGCM, latGCM des points CFMIP dans la grille de LMDZ
1659!c 2) indices points tabijGCM de la grille physique 1d sur klon points
1660!c 3) indices iGCM, jGCM de la grille physique 2d
1661!c
1662         CALL LMDZ_CFMIP_point_locations(nCFMIP, lonCFMIP, latCFMIP,                 &
1663       &tabijGCM, lonGCM, latGCM, iGCM, jGCM)
1664!c
1665            else
1666               ALLOCATE(tabijGCM(0))
1667               ALLOCATE(lonGCM(0), latGCM(0))
1668               ALLOCATE(iGCM(0), jGCM(0))
1669            end if
1670         else
1671            ALLOCATE(tabijGCM(0))
1672            ALLOCATE(lonGCM(0), latGCM(0))
1673            ALLOCATE(iGCM(0), jGCM(0))
1674         ENDIF
1675 
1676           DO i=1,klon
1677             rugoro(i) = f_rugoro * MAX(1.0e-05, zstd(i)*zsig(i)/2.0)
1678           ENDDO
1679
1680!c34EK
1681         IF (ok_orodr) THEN
1682
1683!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1684! FH sans doute a enlever de finitivement ou, si on le garde, l'activer
1685! justement quand ok_orodr = false.
1686! ce rugoro est utilise par la couche limite et fait double emploi
1687! avec les param\'etrisations sp\'ecifiques de Francois Lott.
1688!           DO i=1,klon
1689!             rugoro(i) = MAX(1.0e-05, zstd(i)*zsig(i)/2.0)
1690!           ENDDO
1691!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1692           IF (ok_strato) THEN
1693             CALL SUGWD_strato(klon,klev,paprs,pplay)
1694           ELSE
1695             CALL SUGWD(klon,klev,paprs,pplay)
1696           ENDIF
1697           
1698           DO i=1,klon
1699             zuthe(i)=0.
1700             zvthe(i)=0.
1701             if(zstd(i).gt.10.)then
1702               zuthe(i)=(1.-zgam(i))*cos(zthe(i))
1703               zvthe(i)=(1.-zgam(i))*sin(zthe(i))
1704             endif
1705           ENDDO
1706         ENDIF
1707!c
1708!c
1709         lmt_pas = NINT(86400./dtime * 1.0)   ! tous les jours
1710         WRITE(lunout,*)'La frequence de lecture surface est de ',                   &
1711       &                   lmt_pas
1712!c
1713      capemaxcels = 't_max(X)'
1714      t2mincels = 't_min(X)'
1715      t2maxcels = 't_max(X)'
1716      tinst = 'inst(X)'
1717      tave = 'ave(X)'
1718!IM cf. AM 081204 BEG
1719      write(lunout,*)'AVANT HIST IFLAG_CON=',iflag_con
1720!IM cf. AM 081204 END
1721!c
1722!c=============================================================
1723!c   Initialisation des sorties
1724!c=============================================================
1725
1726#ifdef CPP_IOIPSL
1727
1728!$OMP MASTER
1729       call phys_output_open(rlon,rlat,nCFMIP,tabijGCM,                              &
1730       &                       iGCM,jGCM,lonGCM,latGCM,                              &
1731       &                       jjmp1,nlevSTD,clevSTD,                                &
1732       &                       nbteta, ctetaSTD, dtime,ok_veget,                     &
1733       &                       type_ocean,iflag_pbl,ok_mensuel,ok_journe,            &
1734       &                       ok_hf,ok_instan,ok_LES,ok_ade,ok_aie,                 &
1735       &                       read_climoz, phys_out_filestations,                   &
1736       &                       new_aod, aerosol_couple,                              &
1737       &                       flag_aerosol_strat )
1738!$OMP END MASTER
1739!$OMP BARRIER
1740
1741#ifdef histISCCP
1742#include "ini_histISCCP.h"
1743#endif
1744
1745#ifdef histNMC
1746#include "ini_histhfNMC.h"
1747#include "ini_histdayNMC.h"
1748#include "ini_histmthNMC.h"
1749#endif
1750
1751#include "ini_histday_seri.h"
1752
1753#include "ini_paramLMDZ_phy.h"
1754
1755#endif
1756         ecrit_reg = ecrit_reg * un_jour
1757         ecrit_tra = ecrit_tra * un_jour
1758       
1759!cXXXPB Positionner date0 pour initialisation de ORCHIDEE
1760      date0 = jD_ref
1761      WRITE(*,*) 'physiq date0 : ',date0
1762!c
1763!c
1764!c
1765!c Prescrire l'ozone dans l'atmosphere
1766!c
1767!c
1768!cc         DO i = 1, klon
1769!cc         DO k = 1, klev
1770!cc            CALL o3cm (paprs(i,k)/100.,paprs(i,k+1)/100., wo(i,k),20)
1771!cc         ENDDO
1772!cc         ENDDO
1773!c
1774      IF (type_trac == 'inca') THEN
1775#ifdef INCA
1776         CALL VTe(VTphysiq)
1777         CALL VTb(VTinca)
1778!         iii = MOD(NINT(xjour),360)
1779!         calday = REAL(iii) + jH_cur
1780         calday = REAL(days_elapsed) + jH_cur
1781         WRITE(lunout,*) 'initial time chemini', days_elapsed, calday
1782
1783         CALL chemini(                                                               &
1784       &                   rg,                                                       &
1785       &                   ra,                                                       &
1786       &                   airephy,                                                  &
1787       &                   rlat,                                                     &
1788       &                   rlon,                                                     &
1789       &                   presnivs,                                                 &
1790       &                   calday,                                                   &
1791       &                   klon,                                                     &
1792       &                   nqtot,                                                    &
1793       &                   pdtphys,                                                  &
1794       &                   annee_ref,                                                &
1795       &                   day_ref,                                                  &
1796       &                   itau_phy)
1797
1798         CALL VTe(VTinca)
1799         CALL VTb(VTphysiq)
1800#endif
1801      END IF
1802!c
1803!c
1804!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1805! Nouvelle initialisation pour le rayonnement RRTM
1806!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1807
1808      call iniradia(klon,klev,paprs(1,1:klev+1))
1809
1810!$OMP single
1811      if (read_climoz >= 1) then
1812         call open_climoz(ncid_climoz, press_climoz)
1813      END IF
1814!$OMP end single
1815!c
1816!IM betaCRF
1817      pfree=70000. !Pa
1818      beta_pbl=1.
1819      beta_free=1.
1820      lon1_beta=-180.
1821      lon2_beta=+180.
1822      lat1_beta=90.
1823      lat2_beta=-90.
1824      mskocean_beta=.FALSE.
1825
1826      OPEN(99,file='beta_crf.data',status='old',                                     &
1827       &          form='formatted',err=9999)
1828      READ(99,*,end=9998) pfree
1829      READ(99,*,end=9998) beta_pbl
1830      READ(99,*,end=9998) beta_free
1831      READ(99,*,end=9998) lon1_beta
1832      READ(99,*,end=9998) lon2_beta
1833      READ(99,*,end=9998) lat1_beta
1834      READ(99,*,end=9998) lat2_beta
1835      READ(99,*,end=9998) mskocean_beta
18369998  Continue
1837      CLOSE(99)
18389999  Continue
1839      WRITE(*,*)'pfree=',pfree
1840      WRITE(*,*)'beta_pbl=',beta_pbl
1841      WRITE(*,*)'beta_free=',beta_free
1842      WRITE(*,*)'lon1_beta=',lon1_beta
1843      WRITE(*,*)'lon2_beta=',lon2_beta
1844      WRITE(*,*)'lat1_beta=',lat1_beta
1845      WRITE(*,*)'lat2_beta=',lat2_beta
1846      WRITE(*,*)'mskocean_beta=',mskocean_beta
1847      ENDIF
1848!
1849!   ****************     Fin  de   IF ( debut  )   ***************
1850!
1851!
1852! Incrementer le compteur de la physique
1853!
1854      itap   = itap + 1
1855!c
1856!
1857! Update fraction of the sub-surfaces (pctsrf) and
1858! initialize, where a new fraction has appeared, all variables depending
1859! on the surface fraction.
1860!
1861      CALL change_srf_frac(itap, dtime, days_elapsed+1,                              &
1862       &     pctsrf, falb1, falb2, ftsol, ustar, u10m, v10m, pbl_tke)
1863
1864! Update time and other variables in Reprobus
1865      IF (type_trac == 'repr') THEN
1866#ifdef REPROBUS
1867         CALL Init_chem_rep_xjour(jD_cur-jD_ref+day_ref)
1868         print*,'xjour equivalent rjourvrai',jD_cur-jD_ref+day_ref
1869         CALL Rtime(debut)
1870#endif
1871      END IF
1872
1873
1874! Tendances bidons pour les processus qui n'affectent pas certaines
1875! variables.
1876      du0(:,:)=0.
1877      dv0(:,:)=0.
1878      dq0(:,:)=0.
1879      dql0(:,:)=0.
1880!c
1881!c Mettre a zero des variables de sortie (pour securite)
1882!c
1883      DO i = 1, klon
1884         d_ps(i) = 0.0
1885      ENDDO
1886      DO k = 1, klev
1887      DO i = 1, klon
1888         d_t(i,k) = 0.0
1889         d_u(i,k) = 0.0
1890         d_v(i,k) = 0.0
1891      ENDDO
1892      ENDDO
1893      DO iq = 1, nqtot
1894      DO k = 1, klev
1895      DO i = 1, klon
1896         d_qx(i,k,iq) = 0.0
1897      ENDDO
1898      ENDDO
1899      ENDDO
1900      da(:,:)=0.
1901      mp(:,:)=0.
1902      phi(:,:,:)=0.
1903! RomP >>>
1904      phi2(:,:,:)=0.
1905      beta_prec_fisrt(:,:)=0.
1906      beta_prec(:,:)=0.
1907      epmlmMm(:,:,:)=0.
1908      eplaMm(:,:)=0.
1909      d1a(:,:)=0.
1910      dam(:,:)=0.
1911          pmflxr=0.
1912          pmflxs=0.
1913! RomP <<<
1914
1915!c
1916!c Ne pas affecter les valeurs entrees de u, v, h, et q
1917!c
1918      DO k = 1, klev
1919      DO i = 1, klon
1920         t_seri(i,k)  = t(i,k)
1921         u_seri(i,k)  = u(i,k)
1922         v_seri(i,k)  = v(i,k)
1923         q_seri(i,k)  = qx(i,k,ivap)
1924         ql_seri(i,k) = qx(i,k,iliq)
1925         qs_seri(i,k) = 0.
1926      ENDDO
1927      ENDDO
1928      tke0(:,:)=pbl_tke(:,:,is_ave)
1929      IF (nqtot.GE.3) THEN
1930      DO iq = 3, nqtot
1931      DO  k = 1, klev
1932      DO  i = 1, klon
1933         tr_seri(i,k,iq-2) = qx(i,k,iq)
1934      ENDDO
1935      ENDDO
1936      ENDDO
1937      ELSE
1938      DO k = 1, klev
1939      DO i = 1, klon
1940         tr_seri(i,k,1) = 0.0
1941      ENDDO
1942      ENDDO
1943      ENDIF
1944!C
1945      DO i = 1, klon
1946        ztsol(i) = 0.
1947      ENDDO
1948      DO nsrf = 1, nbsrf
1949        DO i = 1, klon
1950          ztsol(i) = ztsol(i) + ftsol(i,nsrf)*pctsrf(i,nsrf)
1951        ENDDO
1952      ENDDO
1953!IM
1954      IF (ip_ebil_phy.ge.1) THEN
1955        ztit='after dynamic'
1956        CALL diagetpq(airephy,ztit,ip_ebil_phy,1,1,dtime                             &
1957       &      , t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,paprs,pplay              &
1958       &      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
1959!C     Comme les tendances de la physique sont ajoute dans la dynamique,
1960!C     on devrait avoir que la variation d'entalpie par la dynamique
1961!C     est egale a la variation de la physique au pas de temps precedent.
1962!C     Donc la somme de ces 2 variations devrait etre nulle.
1963        call diagphy(airephy,ztit,ip_ebil_phy                                        &
1964       &      , zero_v, zero_v, zero_v, zero_v, zero_v                               &
1965       &      , zero_v, zero_v, zero_v, ztsol                                        &
1966       &      , d_h_vcol+d_h_vcol_phy, d_qt, 0.                                      &
1967       &      , fs_bound, fq_bound )
1968      END IF
1969      PRINT *,'  Lluis 1 d_h_vcol: ',d_h_vcol,' d_h_vcol_phy: ',d_h_vcol_phy
1970
1971!c Diagnostiquer la tendance dynamique
1972!c
1973      IF (ancien_ok) THEN
1974         DO k = 1, klev
1975         DO i = 1, klon
1976            d_u_dyn(i,k) = (u_seri(i,k)-u_ancien(i,k))/dtime
1977            d_v_dyn(i,k) = (v_seri(i,k)-v_ancien(i,k))/dtime
1978            d_t_dyn(i,k) = (t_seri(i,k)-t_ancien(i,k))/dtime
1979            d_q_dyn(i,k) = (q_seri(i,k)-q_ancien(i,k))/dtime
1980         ENDDO
1981         ENDDO
1982!!! RomP >>>   td dyn traceur
1983       IF (nqtot.GE.3) THEN
1984          DO iq = 3, nqtot
1985          DO k = 1, klev
1986          DO i = 1, klon
1987            d_tr_dyn(i,k,iq-2)=                                                      &
1988       &       (tr_seri(i,k,iq-2)-tr_ancien(i,k,iq-2))/dtime
1989!         iiq=niadv(iq)
1990!         print*,i,k," d_tr_dyn",d_tr_dyn(i,k,iq-2),"tra:",iq,tname(iiq)
1991          ENDDO
1992          ENDDO
1993          ENDDO
1994       ENDIF
1995!!! RomP <<<
1996      ELSE
1997         DO k = 1, klev
1998         DO i = 1, klon
1999            d_u_dyn(i,k) = 0.0
2000            d_v_dyn(i,k) = 0.0
2001            d_t_dyn(i,k) = 0.0
2002            d_q_dyn(i,k) = 0.0
2003         ENDDO
2004         ENDDO
2005!!! RomP >>>   td dyn traceur
2006        IF (nqtot.GE.3) THEN
2007          DO iq = 3, nqtot
2008          DO k = 1, klev
2009          DO i = 1, klon
2010            d_tr_dyn(i,k,iq-2)= 0.0
2011          ENDDO
2012          ENDDO
2013          ENDDO
2014       ENDIF
2015!!! RomP <<<
2016         ancien_ok = .TRUE.
2017      ENDIF
2018!c
2019!c Ajouter le geopotentiel du sol:
2020!c
2021      DO k = 1, klev
2022      DO i = 1, klon
2023         zphi(i,k) = pphi(i,k) + pphis(i)
2024      ENDDO
2025      ENDDO
2026!c
2027!c Verifier les temperatures
2028!c
2029!IM BEG
2030      IF (check) THEN
2031       amn=MIN(ftsol(1,is_ter),1000.)
2032       amx=MAX(ftsol(1,is_ter),-1000.)
2033       DO i=2, klon
2034        amn=MIN(ftsol(i,is_ter),amn)
2035        amx=MAX(ftsol(i,is_ter),amx)
2036       ENDDO
2037!c
2038       PRINT*,' debut avant hgardfou min max ftsol',itap,amn,amx
2039      ENDIF !(check) THEN
2040
2041!IM END
2042!c
2043
2044      CALL hgardfou(t_seri,ftsol,'debutphy')
2045!c
2046!IM BEG
2047      IF (check) THEN
2048       amn=MIN(ftsol(1,is_ter),1000.)
2049       amx=MAX(ftsol(1,is_ter),-1000.)
2050       DO i=2, klon
2051        amn=MIN(ftsol(i,is_ter),amn)
2052        amx=MAX(ftsol(i,is_ter),amx)
2053       ENDDO
2054!c
2055       PRINT*,' debut apres hgardfou min max ftsol',itap,amn,amx
2056      ENDIF !(check) THEN
2057
2058!IM END
2059!c
2060!c Mettre en action les conditions aux limites (albedo, sst, etc.).
2061!c Prescrire l'ozone et calculer l'albedo sur l'ocean.
2062!c
2063      if (read_climoz >= 1) then
2064!C        Ozone from a file
2065!        Update required ozone index:
2066         ro3i = int((days_elapsed + jh_cur - jh_1jan)                                &
2067       &        / ioget_year_len(year_cur) * 360.) + 1
2068         if (ro3i == 361) ro3i = 360
2069!C        (This should never occur, except perhaps because of roundup
2070!C        error. See documentation.)
2071         if (ro3i /= co3i) then
2072!C           Update ozone field:
2073            if (read_climoz == 1) then
2074               call regr_pr_av(ncid_climoz, (/"tro3"/), julien=ro3i,                 &
2075       &              press_in_edg=press_climoz, paprs=paprs, v3=wo)
2076            else
2077!C              read_climoz == 2
2078               call regr_pr_av(ncid_climoz,                                          &
2079       &              (/"tro3         ", "tro3_daylight"/),                          &
2080       &              julien=ro3i, press_in_edg=press_climoz, paprs=paprs,           &
2081       &              v3=wo)
2082            end if
2083!           Convert from mole fraction of ozone to column density of ozone in a
2084!           cell, in kDU:
2085            forall (l = 1: read_climoz) wo(:, :, l) = wo(:, :, l)                    &
2086       &           * rmo3 / rmd * zmasse / dobson_u / 1e3
2087!C           (By regridding ozone values for LMDZ only once every 360th of
2088!C           year, we have already neglected the variation of pressure in one
2089!C           360th of year. So do not recompute "wo" at each time step even if
2090!C           "zmasse" changes a little.)
2091            co3i = ro3i
2092         end if
2093      elseif (MOD(itap-1,lmt_pas) == 0) THEN
2094!C        Once per day, update ozone from Royer:
2095         wo(:, :, 1) = ozonecm(rlat, paprs, rjour=real(days_elapsed+1))
2096      ENDIF
2097
2098!c
2099!c Re-evaporer l'eau liquide nuageuse
2100!c
2101      DO k = 1, klev  ! re-evaporation de l'eau liquide nuageuse
2102      DO i = 1, klon
2103         zlvdcp=RLVTT/RCPD/(1.0+RVTMP2*q_seri(i,k))
2104!c        zlsdcp=RLSTT/RCPD/(1.0+RVTMP2*q_seri(i,k))
2105         zlsdcp=RLVTT/RCPD/(1.0+RVTMP2*q_seri(i,k))
2106         zdelta = MAX(0.,SIGN(1.,RTT-t_seri(i,k)))
2107         zb = MAX(0.0,ql_seri(i,k))
2108         za = - MAX(0.0,ql_seri(i,k))                                                &
2109       &                  * (zlvdcp*(1.-zdelta)+zlsdcp*zdelta)
2110         t_seri(i,k) = t_seri(i,k) + za
2111         q_seri(i,k) = q_seri(i,k) + zb
2112         ql_seri(i,k) = 0.0
2113         d_t_eva(i,k) = za
2114         d_q_eva(i,k) = zb
2115      ENDDO
2116      ENDDO
2117!IM
2118      IF (ip_ebil_phy.ge.2) THEN
2119        ztit='after reevap'
2120        CALL diagetpq(airephy,ztit,ip_ebil_phy,2,1,dtime                             &
2121       &      , t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,paprs,pplay              &
2122       &      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
2123         call diagphy(airephy,ztit,ip_ebil_phy                                       &
2124       &      , zero_v, zero_v, zero_v, zero_v, zero_v                               &
2125       &      , zero_v, zero_v, zero_v, ztsol                                        &
2126       &      , d_h_vcol, d_qt, d_ec                                                 &
2127       &      , fs_bound, fq_bound )
2128!C
2129      END IF
2130      PRINT *,'  Lluis 2 d_h_vcol: ',d_h_vcol,' d_h_vcol_phy: ',d_h_vcol_phy
2131!c
2132!c=========================================================================
2133! Calculs de l'orbite.
2134! Necessaires pour le rayonnement et la surface (calcul de l'albedo).
2135! doit donc etre plac\'e avant radlwsw et pbl_surface
2136
2137!!!   jyg 17 Sep 2010 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2138      call ymds2ju(year_cur, mth_eq, day_eq,0., jD_eq)
2139      day_since_equinox = (jD_cur + jH_cur) - jD_eq
2140!
2141!   choix entre calcul de la longitude solaire vraie ou valeur fixee a
2142!   solarlong0
2143      if (solarlong0<-999.) then
2144       if (new_orbit) then
2145! calcul selon la routine utilisee pour les planetes
2146        call solarlong(day_since_equinox, zlongi, dist)
2147       else
2148! calcul selon la routine utilisee pour l'AR4
2149        CALL orbite(REAL(days_elapsed+1),zlongi,dist)
2150       endif
2151      else
2152           zlongi=solarlong0  ! longitude solaire vraie
2153           dist=1.            ! distance au soleil / moyenne
2154      endif
2155      if(prt_level.ge.1)                                                &
2156       &    write(lunout,*)'Longitude solaire ',zlongi,solarlong0,dist,&
2157       ' jD_cur: ',jD_cur,' jH_cur: ',jH_cur,' days_elapsed: ', &
2158       REAL(days_elapsed+1)
2159
2160
2161!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2162! Calcul de l'ensoleillement :
2163! ============================
2164! Pour une solarlong0=1000., on calcule un ensoleillement moyen sur
2165! l'annee a partir d'une formule analytique.
2166! Cet ensoleillement est sym\'etrique autour de l'\'equateur et
2167! non nul aux poles.
2168      IF (abs(solarlong0-1000.)<1.e-4) then
2169         PRINT *,' Lluis calling zenang_an'
2170         call zenang_an(cycle_diurne,jH_cur,rlat,rlon,rmu0,fract)
2171      ELSE
2172!  Avec ou sans cycle diurne
2173         IF (cycle_diurne) THEN
2174           zdtime=dtime*REAL(radpas) ! pas de temps du rayonnement (s)
2175           CALL zenang(zlongi,jH_cur,zdtime,rlat,rlon,rmu0,fract)
2176         ELSE
2177           CALL angle(zlongi, rlat, fract, rmu0)
2178         ENDIF
2179      ENDIF
2180
2181      if (mydebug) then
2182        call writefield_phy('u_seri',u_seri,llm)
2183        call writefield_phy('v_seri',v_seri,llm)
2184        call writefield_phy('t_seri',t_seri,llm)
2185        call writefield_phy('q_seri',q_seri,llm)
2186      endif
2187
2188!ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
2189!c Appel au pbl_surface : Planetary Boudary Layer et Surface
2190!c Cela implique tous les interactions des sous-surfaces et la partie diffusion
2191!c turbulent du couche limit.
2192!c
2193!c Certains varibales de sorties de pbl_surface sont utiliser que pour
2194!c ecriture des fihiers hist_XXXX.nc, ces sont :
2195!c   qsol,      zq2m,      s_pblh,  s_lcl,
2196!c   s_capCL,   s_oliqCL,  s_cteiCL,s_pblT,
2197!c   s_therm,   s_trmb1,   s_trmb2, s_trmb3,
2198!c   zxrugs,    zu10m,     zv10m,   fder,
2199!c   zxqsurf,   rh2m,      zxfluxu, zxfluxv,
2200!c   frugs,     agesno,    fsollw,  fsolsw,
2201!c   d_ts,      fevap,     fluxlat, t2m,
2202!c   wfbils,    wfbilo,    fluxt,   fluxu, fluxv,
2203!c
2204!c Certains ne sont pas utiliser du tout :
2205!c   dsens, devap, zxsnow, zxfluxt, zxfluxq, q2m, fluxq
2206!c
2207
2208!c Calcul de l'humidite de saturation au niveau du sol
2209
2210
2211
2212      if (iflag_pbl/=0) then
2213
2214      PRINT *,'  Lluis before pbl_surface qsol: ',qsol(llp),    &
2215        ' rmu0: ',rmu0(llp),' jH_cur: ',jH_cur
2216
2217      CALL pbl_surface(                                                              &
2218       &     dtime,     date0,     itap,    days_elapsed+1,                          &
2219       &     debut,     lafin,                                                       &
2220       &     rlon,      rlat,      rugoro,  rmu0,                                    &
2221       &     rain_fall, snow_fall, solsw,   sollw,                                   &
2222       &     t_seri,    q_seri,    u_seri,  v_seri,                                  &
2223       &     pplay,     paprs,     pctsrf,                                           &
2224       &     ftsol,     falb1,     falb2,   ustar, u10m,   v10m,                     &
2225       &     sollwdown, cdragh,    cdragm,  u1,    v1,                               &
2226       &     albsol1,   albsol2,   sens,    evap,                                    &
2227       &     zxtsol,    zxfluxlat, zt2m,    qsat2m,                                  &
2228       &     d_t_vdf,   d_q_vdf,   d_u_vdf, d_v_vdf, d_t_diss,                       &
2229       &     coefh,     coefm,     slab_wfbils,                                      &
2230       &     qsol,      zq2m,      s_pblh,  s_lcl,                                   &
2231       &     s_capCL,   s_oliqCL,  s_cteiCL,s_pblT,                                  &
2232       &     s_therm,   s_trmb1,   s_trmb2, s_trmb3,                                 &
2233       &     zxrugs,    zustar, zu10m,     zv10m,   fder,                            &
2234       &     zxqsurf,   rh2m,      zxfluxu, zxfluxv,                                 &
2235       &     frugs,     agesno,    fsollw,  fsolsw,                                  &
2236       &     d_ts,      fevap,     fluxlat, t2m,                                     &
2237       &     wfbils,    wfbilo,    fluxt,   fluxu,  fluxv,                           &
2238       &     dsens,     devap,     zxsnow,                                           &
2239       &     zxfluxt,   zxfluxq,   q2m,     fluxq, pbl_tke )
2240
2241      PRINT *,'  Lluis after pbl_surface qsol: ',qsol(llp),    &
2242        ' rmu0: ',rmu0(llp),' jH_cur: ',jH_cur
2243
2244!-----------------------------------------------------------------------------------------
2245! ajout des tendances de la diffusion turbulente
2246      CALL add_phys_tend                                                             &
2247       &     (d_u_vdf,d_v_vdf,d_t_vdf+d_t_diss,d_q_vdf,dql0,'vdf')
2248!-----------------------------------------------------------------------------------------
2249      if (mydebug) then
2250        call writefield_phy('u_seri',u_seri,llm)
2251        call writefield_phy('v_seri',v_seri,llm)
2252        call writefield_phy('t_seri',t_seri,llm)
2253        call writefield_phy('q_seri',q_seri,llm)
2254      endif
2255
2256         CALL evappot(klon,nbsrf,ftsol,pplay(:,1),cdragh,                            &
2257       &      t_seri(:,1),q_seri(:,1),u_seri(:,1),v_seri(:,1),evap_pot)
2258
2259
2260      IF (ip_ebil_phy.ge.2) THEN
2261        ztit='after surface_main'
2262        CALL diagetpq(airephy,ztit,ip_ebil_phy,2,2,dtime                             &
2263       &      , t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,paprs,pplay              &
2264       &      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
2265         call diagphy(airephy,ztit,ip_ebil_phy                                       &
2266       &      , zero_v, zero_v, zero_v, zero_v, sens                                 &
2267       &      , evap  , zero_v, zero_v, ztsol                                        &
2268       &      , d_h_vcol, d_qt, d_ec                                                 &
2269       &      , fs_bound, fq_bound )
2270      END IF
2271
2272      ENDIF
2273      PRINT *,'  Lluis 3 d_h_vcol: ',d_h_vcol,' d_h_vcol_phy: ',d_h_vcol_phy
2274!c =================================================================== c
2275!c   Calcul de Qsat
2276
2277      DO k = 1, klev
2278      DO i = 1, klon
2279         zx_t = t_seri(i,k)
2280         IF (thermcep) THEN
2281            zdelta = MAX(0.,SIGN(1.,rtt-zx_t))
2282            zx_qs  = r2es * FOEEW(zx_t,zdelta)/pplay(i,k)
2283            zx_qs  = MIN(0.5,zx_qs)
2284            zcor   = 1./(1.-retv*zx_qs)
2285            zx_qs  = zx_qs*zcor
2286         ELSE
2287           IF (zx_t.LT.t_coup) THEN
2288              zx_qs = qsats(zx_t)/pplay(i,k)
2289           ELSE
2290              zx_qs = qsatl(zx_t)/pplay(i,k)
2291           ENDIF
2292         ENDIF
2293         zqsat(i,k)=zx_qs
2294      ENDDO
2295      ENDDO
2296
2297      if (prt_level.ge.1) then
2298      write(lunout,*) 'L   qsat (g/kg) avant clouds_gno'
2299      write(lunout,'(i4,f15.4)') (k,1000.*zqsat(igout,k),k=1,klev)
2300      endif
2301!c
2302!c Appeler la convection (au choix)
2303!c
2304      DO k = 1, klev
2305      DO i = 1, klon
2306         conv_q(i,k) = d_q_dyn(i,k)                                                  &
2307       &               + d_q_vdf(i,k)/dtime
2308         conv_t(i,k) = d_t_dyn(i,k)                                                  &
2309       &               + d_t_vdf(i,k)/dtime
2310      ENDDO
2311      ENDDO
2312      IF (check) THEN
2313         za = qcheck(klon,klev,paprs,q_seri,ql_seri,airephy)
2314         WRITE(lunout,*) "avantcon=", za
2315      ENDIF
2316      zx_ajustq = .FALSE.
2317      IF (iflag_con.EQ.2) zx_ajustq=.TRUE.
2318      IF (zx_ajustq) THEN
2319         DO i = 1, klon
2320            z_avant(i) = 0.0
2321         ENDDO
2322         DO k = 1, klev
2323         DO i = 1, klon
2324            z_avant(i) = z_avant(i) + (q_seri(i,k)+ql_seri(i,k))                     &
2325       &                        *(paprs(i,k)-paprs(i,k+1))/RG
2326         ENDDO
2327         ENDDO
2328      ENDIF
2329
2330!c Calcule de vitesse verticale a partir de flux de masse verticale
2331      DO k = 1, klev
2332         DO i = 1, klon
2333            omega(i,k) = RG*flxmass_w(i,k) / airephy(i)
2334         END DO
2335      END DO
2336      if (prt_level.ge.1) write(lunout,*) 'omega(igout, :) = ',                      &
2337       &     omega(igout, :)
2338
2339      IF (iflag_con.EQ.1) THEN
2340        abort_message ='reactiver le call conlmd dans physiq.F'
2341        CALL abort_gcm (modname,abort_message,1)
2342!c     CALL conlmd (dtime, paprs, pplay, t_seri, q_seri, conv_q,
2343!c    .             d_t_con, d_q_con,
2344!c    .             rain_con, snow_con, ibas_con, itop_con)
2345      ELSE IF (iflag_con.EQ.2) THEN
2346      CALL conflx(dtime, paprs, pplay, t_seri, q_seri,                               &
2347       &            conv_t, conv_q, -evap, omega,                                    &
2348       &            d_t_con, d_q_con, rain_con, snow_con,                            &
2349       &            pmfu, pmfd, pen_u, pde_u, pen_d, pde_d,                          &
2350       &            kcbot, kctop, kdtop, pmflxr, pmflxs)
2351      d_u_con = 0.
2352      d_v_con = 0.
2353
2354      WHERE (rain_con < 0.) rain_con = 0.
2355      WHERE (snow_con < 0.) snow_con = 0.
2356      DO i = 1, klon
2357         ibas_con(i) = klev+1 - kcbot(i)
2358         itop_con(i) = klev+1 - kctop(i)
2359      ENDDO
2360      ELSE IF (iflag_con.GE.3) THEN
2361!c nb of tracers for the KE convection:
2362!c MAF la partie traceurs est faite dans phytrac
2363!c on met ntra=1 pour limiter les appels mais on peut
2364!c supprimer les calculs / ftra.
2365              ntra = 1
2366
2367!c=====================================================================================
2368!cajout pour la parametrisation des poches froides:
2369!ccalcul de t_wake et t_undi: si pas de poches froides, t_wake=t_undi=t_seri
2370      do k=1,klev
2371            do i=1,klon
2372             if (iflag_wake>=1) then
2373             t_wake(i,k) = t_seri(i,k)                                               &
2374       &           +(1-wake_s(i))*wake_deltat(i,k)
2375             q_wake(i,k) = q_seri(i,k)                                               &
2376       &           +(1-wake_s(i))*wake_deltaq(i,k)
2377             t_undi(i,k) = t_seri(i,k)                                               &
2378       &           -wake_s(i)*wake_deltat(i,k)
2379             q_undi(i,k) = q_seri(i,k)                                               &
2380       &           -wake_s(i)*wake_deltaq(i,k)
2381             else
2382             t_wake(i,k) = t_seri(i,k)
2383             q_wake(i,k) = q_seri(i,k)
2384             t_undi(i,k) = t_seri(i,k)
2385             q_undi(i,k) = q_seri(i,k)
2386             endif
2387            enddo
2388         enddo
2389     
2390!cc--   Calcul de l'energie disponible ALE (J/kg) et de la puissance disponible ALP (W/m2)
2391!cc--    pour le soulevement des particules dans le modele convectif
2392!c
2393      do i = 1,klon
2394        ALE(i) = 0.
2395        ALP(i) = 0.
2396      enddo
2397!c
2398!ccalcul de ale_wake et alp_wake
2399       if (iflag_wake>=1) then
2400         if (itap .le. it_wape_prescr) then
2401          do i = 1,klon
2402           ale_wake(i) = wape_prescr
2403           alp_wake(i) = fip_prescr
2404          enddo
2405         else
2406          do i = 1,klon
2407!cjyg  ALE=WAPE au lieu de ALE = 1/2 Cstar**2
2408!ccc           ale_wake(i) = 0.5*wake_cstar(i)**2
2409           ale_wake(i) = wake_pe(i)
2410           alp_wake(i) = wake_fip(i)
2411          enddo
2412         endif
2413       else
2414         do i = 1,klon
2415           ale_wake(i) = 0.
2416           alp_wake(i) = 0.
2417         enddo
2418       endif
2419!ccombinaison avec ale et alp de couche limite: constantes si pas de couplage, valeurs calculees
2420!cdans le thermique sinon
2421       if (iflag_coupl.eq.0) then
2422          if (debut.and.prt_level.gt.9)                                              &
2423       &                     WRITE(lunout,*)'ALE et ALP imposes'
2424          do i = 1,klon
2425!con ne couple que ale
2426!c           ALE(i) = max(ale_wake(i),Ale_bl(i))
2427            ALE(i) = max(ale_wake(i),ale_bl_prescr)
2428!con ne couple que alp
2429!c           ALP(i) = alp_wake(i) + Alp_bl(i)
2430            ALP(i) = alp_wake(i) + alp_bl_prescr
2431          enddo
2432       else
2433         IF(prt_level>9)WRITE(lunout,*)'ALE et ALP couples au thermique'
2434!         do i = 1,klon
2435!             ALE(i) = max(ale_wake(i),Ale_bl(i))
2436! avant        ALP(i) = alp_wake(i) + Alp_bl(i)
2437!             ALP(i) = alp_wake(i) + Alp_bl(i) + alp_offset ! modif sb
2438!         write(20,*)'ALE',ALE(i),Ale_bl(i),ale_wake(i)
2439!         write(21,*)'ALP',ALP(i),Alp_bl(i),alp_wake(i)
2440!         enddo
2441
2442!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2443! Modif FH 2010/04/27. Sans doute temporaire.
2444! Deux options pour le alp_offset : constant si >?? 0 ou proportionnel ??a
2445! w si <0
2446!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2447       do i = 1,klon
2448          ALE(i) = max(ale_wake(i),Ale_bl(i))
2449!ccc nrlmd le 10/04/2012----------Stochastic triggering--------------
2450          if (iflag_trig_bl.ge.1) then
2451             ALE(i) = max(ale_wake(i),Ale_bl_trig(i))
2452          endif
2453!ccc fin nrlmd le 10/04/2012
2454          if (alp_offset>=0.) then
2455            ALP(i) = alp_wake(i) + Alp_bl(i) + alp_offset ! modif sb
2456          else
2457            ALP(i)=alp_wake(i)+Alp_bl(i)+alp_offset*min(omega(i,6),0.)
2458            if (alp(i)<0.) then
2459               print*,'ALP ',alp(i),alp_wake(i)                                      &
2460       &         ,Alp_bl(i),alp_offset*min(omega(i,6),0.)
2461            endif
2462          endif
2463       enddo
2464!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2465
2466       endif
2467       do i=1,klon
2468          if (alp(i)>alp_max) then
2469             IF(prt_level>9)WRITE(lunout,*)                             &
2470       &       'WARNING SUPER ALP (seuil=',alp_max,                                  &
2471       &       '): i, alp, alp_wake,ale',i,alp(i),alp_wake(i),ale(i)
2472             alp(i)=alp_max
2473          endif
2474          if (ale(i)>ale_max) then
2475             IF(prt_level>9)WRITE(lunout,*)                             &
2476       &       'WARNING SUPER ALE (seuil=',ale_max,                                  &
2477       &       '): i, alp, alp_wake,ale',i,ale(i),ale_wake(i),alp(i)
2478             ale(i)=ale_max
2479          endif
2480       enddo
2481
2482!cfin calcul ale et alp
2483!c=================================================================================================
2484
2485
2486!c sb, oct02:
2487!c Schema de convection modularise et vectorise:
2488!c (driver commun aux versions 3 et 4)
2489!c
2490          IF (ok_cvl) THEN ! new driver for convectL
2491
2492             IF (type_trac == 'repr') THEN
2493                nbtr_tmp=ntra
2494             ELSE
2495                nbtr_tmp=nbtr
2496             END IF
2497          CALL concvl (iflag_con,iflag_clos,                                         &
2498       &        dtime,paprs,pplay,t_undi,q_undi,                                     &
2499       &        t_wake,q_wake,wake_s,                                                &
2500       &        u_seri,v_seri,tr_seri,nbtr_tmp,                                      &
2501       &        ALE,ALP,                                                             &
2502       &        ema_work1,ema_work2,                                                 &
2503       &        d_t_con,d_q_con,d_u_con,d_v_con,d_tr,                                &
2504       &        rain_con, snow_con, ibas_con, itop_con, sigd,                        &
2505       &        ema_cbmf,plcl,plfc,wbeff,upwd,dnwd,dnwd0,                            &
2506       &        Ma,mip,Vprecip,cape,cin,tvp,Tconv,iflagctrl,                         &
2507       &        pbase,bbase,dtvpdt1,dtvpdq1,dplcldt,dplcldr,qcondc,wd,               &
2508! RomP >>>
2509!!     .        pmflxr,pmflxs,da,phi,mp,
2510!!     .        ftd,fqd,lalim_conv,wght_th)                                          &
2511       &        pmflxr,pmflxs,da,phi,mp,phi2,d1a,dam,sij,clw,elij,                   &
2512       &        ftd,fqd,lalim_conv,wght_th,                                          &
2513       &        ev, ep,epmlmMm,eplaMm,                                               &
2514       &        wdtrainA,wdtrainM)
2515! RomP <<<
2516
2517!IM begin
2518!c       print*,'physiq: cin pbase dnwd0 ftd fqd ',cin(1),pbase(1),
2519!c    .dnwd0(1,1),ftd(1,1),fqd(1,1)
2520!IM end
2521!IM cf. FH
2522              clwcon0=qcondc
2523              pmfu(:,:)=upwd(:,:)+dnwd(:,:)
2524
2525              do i = 1, klon
2526                if (iflagctrl(i).le.1) itau_con(i)=itau_con(i)+1
2527              enddo
2528
2529          ELSE ! ok_cvl
2530
2531!c MAF conema3 ne contient pas les traceurs
2532          CALL conema3 (dtime,                                                       &
2533       &        paprs,pplay,t_seri,q_seri,                                           &
2534       &        u_seri,v_seri,tr_seri,ntra,                                          &
2535       &        ema_work1,ema_work2,                                                 &
2536       &        d_t_con,d_q_con,d_u_con,d_v_con,d_tr,                                &
2537       &        rain_con, snow_con, ibas_con, itop_con,                              &
2538       &        upwd,dnwd,dnwd0,bas,top,                                             &
2539       &        Ma,cape,tvp,rflag,                                                   &
2540       &        pbase                                                                &
2541       &        ,bbase,dtvpdt1,dtvpdq1,dplcldt,dplcldr                               &
2542       &        ,clwcon0)
2543
2544          ENDIF ! ok_cvl
2545
2546!c
2547!c Correction precip
2548          rain_con = rain_con * cvl_corr
2549          snow_con = snow_con * cvl_corr
2550!c
2551
2552           IF (.NOT. ok_gust) THEN
2553           do i = 1, klon
2554            wd(i)=0.0
2555           enddo
2556           ENDIF
2557
2558!c =================================================================== c
2559!c Calcul des proprietes des nuages convectifs
2560!c
2561
2562!c   calcul des proprietes des nuages convectifs
2563             clwcon0(:,:)=fact_cldcon*clwcon0(:,:)
2564             call clouds_gno                                                         &
2565       &       (klon,klev,q_seri,zqsat,clwcon0,ptconv,ratqsc,rnebcon0)
2566
2567!c =================================================================== c
2568
2569          DO i = 1, klon
2570           itop_con(i) = min(max(itop_con(i),1),klev)
2571           ibas_con(i) = min(max(ibas_con(i),1),itop_con(i))
2572          ENDDO
2573
2574          DO i = 1, klon
2575            ema_pcb(i)  = paprs(i,ibas_con(i))
2576          ENDDO
2577          DO i = 1, klon
2578! L'idicage de itop_con peut cacher un pb potentiel
2579! FH sous la dictee de JYG, CR
2580            ema_pct(i)  = paprs(i,itop_con(i)+1)
2581
2582            if (itop_con(i).gt.klev-3) then
2583              if(prt_level >= 9) then
2584                write(lunout,*)'La convection monte trop haut '
2585                write(lunout,*)'itop_con(,',i,',)=',itop_con(i)
2586              endif
2587            endif
2588          ENDDO     
2589      ELSE IF (iflag_con.eq.0) THEN
2590          write(lunout,*) 'On n appelle pas la convection'
2591          clwcon0=0.
2592          rnebcon0=0.
2593          d_t_con=0.
2594          d_q_con=0.
2595          d_u_con=0.
2596          d_v_con=0.
2597          rain_con=0.
2598          snow_con=0.
2599          bas=1
2600          top=1
2601      ELSE
2602          WRITE(lunout,*) "iflag_con non-prevu", iflag_con
2603          CALL abort
2604      ENDIF
2605
2606!c     CALL homogene(paprs, q_seri, d_q_con, u_seri,v_seri,
2607!c    .              d_u_con, d_v_con)
2608
2609!-----------------------------------------------------------------------------------------
2610! ajout des tendances de la diffusion turbulente
2611      CALL add_phys_tend(d_u_con,d_v_con,d_t_con,d_q_con,dql0,'con')
2612!-----------------------------------------------------------------------------------------
2613
2614      if (mydebug) then
2615        call writefield_phy('u_seri',u_seri,llm)
2616        call writefield_phy('v_seri',v_seri,llm)
2617        call writefield_phy('t_seri',t_seri,llm)
2618        call writefield_phy('q_seri',q_seri,llm)
2619      endif
2620
2621!IM
2622      IF (ip_ebil_phy.ge.2) THEN
2623        ztit='after convect'
2624        CALL diagetpq(airephy,ztit,ip_ebil_phy,2,2,dtime                             &
2625       &      , t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,paprs,pplay              &
2626       &      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
2627         call diagphy(airephy,ztit,ip_ebil_phy                                       &
2628       &      , zero_v, zero_v, zero_v, zero_v, zero_v                               &
2629       &      , zero_v, rain_con, snow_con, ztsol                                    &
2630       &      , d_h_vcol, d_qt, d_ec                                                 &
2631       &      , fs_bound, fq_bound )
2632      END IF
2633!C
2634      PRINT *,'  Lluis 4 d_h_vcol: ',d_h_vcol,' d_h_vcol_phy: ',d_h_vcol_phy
2635      IF (check) THEN
2636          za = qcheck(klon,klev,paprs,q_seri,ql_seri,airephy)
2637          WRITE(lunout,*)"aprescon=", za
2638          zx_t = 0.0
2639          za = 0.0
2640          DO i = 1, klon
2641            za = za + airephy(i)/REAL(klon)
2642            zx_t = zx_t + (rain_con(i)+                                              &
2643       &                   snow_con(i))*airephy(i)/REAL(klon)
2644          ENDDO
2645          zx_t = zx_t/za*dtime
2646          WRITE(lunout,*)"Precip=", zx_t
2647      ENDIF
2648      IF (zx_ajustq) THEN
2649          DO i = 1, klon
2650            z_apres(i) = 0.0
2651          ENDDO
2652          DO k = 1, klev
2653            DO i = 1, klon
2654              z_apres(i) = z_apres(i) + (q_seri(i,k)+ql_seri(i,k))                   &
2655       &            *(paprs(i,k)-paprs(i,k+1))/RG
2656            ENDDO
2657          ENDDO
2658          DO i = 1, klon
2659            z_factor(i) = (z_avant(i)-(rain_con(i)+snow_con(i))*dtime)               &
2660       &          /z_apres(i)
2661          ENDDO
2662          DO k = 1, klev
2663            DO i = 1, klon
2664              IF (z_factor(i).GT.(1.0+1.0E-08) .OR.                                  &
2665       &            z_factor(i).LT.(1.0-1.0E-08)) THEN
2666                  q_seri(i,k) = q_seri(i,k) * z_factor(i)
2667              ENDIF
2668            ENDDO
2669          ENDDO
2670      ENDIF
2671      zx_ajustq=.FALSE.
2672
2673!c
2674!c=============================================================================
2675!cRR:Evolution de la poche froide: on ne fait pas de separation wake/env
2676!cpour la couche limite diffuse pour l instant
2677!c
2678      if (iflag_wake>=1) then
2679      DO k=1,klev
2680        DO i=1,klon
2681          dt_dwn(i,k)  = ftd(i,k)
2682          wdt_PBL(i,k) = 0.
2683          dq_dwn(i,k)  = fqd(i,k)
2684          wdq_PBL(i,k) = 0.
2685          M_dwn(i,k)   = dnwd0(i,k)
2686          M_up(i,k)    = upwd(i,k)
2687          dt_a(i,k)    = d_t_con(i,k)/dtime - ftd(i,k)
2688          udt_PBL(i,k) = 0.
2689          dq_a(i,k)    = d_q_con(i,k)/dtime - fqd(i,k)
2690          udq_PBL(i,k) = 0.
2691        ENDDO
2692      ENDDO
2693
2694      if (iflag_wake==2) then
2695        ok_wk_lsp(:)=max(sign(1.,wake_s(:)-wake_s_min_lsp),0.)
2696        DO k = 1,klev
2697         dt_dwn(:,k)= dt_dwn(:,k)+                                                   &
2698       &            ok_wk_lsp(:)*(d_t_eva(:,k)+d_t_lsc(:,k))/dtime
2699         dq_dwn(:,k)= dq_dwn(:,k)+                                                   &
2700       &            ok_wk_lsp(:)*(d_q_eva(:,k)+d_q_lsc(:,k))/dtime
2701        ENDDO
2702      endif
2703!c
2704!ccalcul caracteristiques de la poche froide
2705      call calWAKE (paprs,pplay,dtime                                                &
2706       &               ,t_seri,q_seri,omega                                          &
2707       &               ,dt_dwn,dq_dwn,M_dwn,M_up                                     &
2708       &               ,dt_a,dq_a,sigd                                               &
2709       &               ,wdt_PBL,wdq_PBL                                              &
2710       &               ,udt_PBL,udq_PBL                                              &
2711       &               ,wake_deltat,wake_deltaq,wake_dth                             &
2712       &               ,wake_h,wake_s,wake_dens                                      &
2713       &               ,wake_pe,wake_fip,wake_gfl                                    &
2714       &               ,dt_wake,dq_wake                                              &
2715       &               ,wake_k, t_undi,q_undi                                        &
2716       &               ,wake_omgbdth,wake_dp_omgb                                    &
2717       &               ,wake_dtKE,wake_dqKE                                          &
2718       &               ,wake_dtPBL,wake_dqPBL                                        &
2719       &               ,wake_omg,wake_dp_deltomg                                     &
2720       &               ,wake_spread,wake_Cstar,wake_d_deltat_gw                      &
2721       &               ,wake_ddeltat,wake_ddeltaq)
2722!c
2723!-----------------------------------------------------------------------------------------
2724! ajout des tendances des poches froides
2725! Faire rapidement disparaitre l'ancien dt_wake pour garder un d_t_wake
2726! coherent avec les autres d_t_...
2727      d_t_wake(:,:)=dt_wake(:,:)*dtime
2728      d_q_wake(:,:)=dq_wake(:,:)*dtime
2729      CALL add_phys_tend(du0,dv0,d_t_wake,d_q_wake,dql0,'wake')
2730!-----------------------------------------------------------------------------------------
2731
2732      endif
2733!c
2734!c===================================================================
2735!cJYG
2736      IF (ip_ebil_phy.ge.2) THEN
2737        ztit='after wake'
2738        CALL diagetpq(airephy,ztit,ip_ebil_phy,2,2,dtime                             &
2739       &      , t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,paprs,pplay              &
2740       &      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
2741        call diagphy(airephy,ztit,ip_ebil_phy                                        &
2742       &      , zero_v, zero_v, zero_v, zero_v, zero_v                               &
2743       &      , zero_v, zero_v, zero_v, ztsol                                        &
2744       &      , d_h_vcol, d_qt, d_ec                                                 &
2745       &      , fs_bound, fq_bound )
2746      END IF
2747      PRINT *,'  Lluis 5 d_h_vcol: ',d_h_vcol,' d_h_vcol_phy: ',d_h_vcol_phy
2748!c      print*,'apres callwake iflag_cldcon=', iflag_cldcon
2749!c
2750!c===================================================================
2751!c Convection seche (thermiques ou ajustement)
2752!c===================================================================
2753!c
2754       call stratocu_if(klon,klev,pctsrf,paprs, pplay,t_seri                         &
2755       & ,seuil_inversion,weak_inversion,dthmin)
2756
2757
2758
2759      d_t_ajsb(:,:)=0.
2760      d_q_ajsb(:,:)=0.
2761      d_t_ajs(:,:)=0.
2762      d_u_ajs(:,:)=0.
2763      d_v_ajs(:,:)=0.
2764      d_q_ajs(:,:)=0.
2765      clwcon0th(:,:)=0.
2766!c
2767!c      fm_therm(:,:)=0.
2768!c      entr_therm(:,:)=0.
2769!c      detr_therm(:,:)=0.
2770!c
2771      IF(prt_level>9)WRITE(lunout,*)                                                 &
2772       &    'AVANT LA CONVECTION SECHE , iflag_thermals='                            &
2773       &   ,iflag_thermals,'   nsplit_thermals=',nsplit_thermals
2774      if(iflag_thermals.lt.0) then
2775!c  Rien
2776!c  ====
2777         IF(prt_level>9)WRITE(lunout,*)'pas de convection'
2778
2779
2780      else
2781
2782!c  Thermiques
2783!c  ==========
2784         IF(prt_level>9)WRITE(lunout,*)'JUSTE AVANT , iflag_thermals='               &
2785       &   ,iflag_thermals,'   nsplit_thermals=',nsplit_thermals
2786
2787
2788!ccc nrlmd le 10/04/2012
2789         DO k=1,klev+1
2790           DO i=1,klon
2791           pbl_tke_input(i,k,is_oce)=pbl_tke(i,k,is_oce)
2792           pbl_tke_input(i,k,is_ter)=pbl_tke(i,k,is_ter)
2793           pbl_tke_input(i,k,is_lic)=pbl_tke(i,k,is_lic)
2794           pbl_tke_input(i,k,is_sic)=pbl_tke(i,k,is_sic)
2795           ENDDO
2796         ENDDO
2797!ccc fin nrlmd le 10/04/2012
2798
2799         if (iflag_thermals>=1) then
2800         call calltherm(pdtphys                                                      &
2801       &      ,pplay,paprs,pphi,weak_inversion                                       &
2802       &      ,u_seri,v_seri,t_seri,q_seri,zqsat,debut                               &
2803       &      ,d_u_ajs,d_v_ajs,d_t_ajs,d_q_ajs                                       &
2804       &      ,fm_therm,entr_therm,detr_therm                                        &
2805       &      ,zqasc,clwcon0th,lmax_th,ratqscth                                      &
2806       &      ,ratqsdiff,zqsatth                                                     &
2807!con rajoute ale et alp, et les caracteristiques de la couche alim                   &
2808       &      ,Ale_bl,Alp_bl,lalim_conv,wght_th, zmax0, f0, zw2,fraca                &
2809       &      ,ztv,zpspsk,ztla,zthl                                                  &
2810!ccc nrlmd le 10/04/2012                                                             &
2811       &      ,pbl_tke_input,pctsrf,omega,airephy                                    &
2812       &      ,zlcl_th,fraca0,w0,w_conv,therm_tke_max0,env_tke_max0                  &
2813       &      ,n2,s2,ale_bl_stat                                                     &
2814       &      ,therm_tke_max,env_tke_max                                             &
2815       &      ,alp_bl_det,alp_bl_fluct_m,alp_bl_fluct_tke                            &
2816       &      ,alp_bl_conv,alp_bl_stat                                               &
2817!ccc fin nrlmd le 10/04/2012                                                         &
2818       &      ,zqla,ztva )
2819
2820!ccc nrlmd le 10/04/2012
2821!c-----------Stochastic triggering-----------
2822      if (iflag_trig_bl.ge.1) then
2823!c
2824        IF (prt_level .GE. 10) THEN
2825         print *,'cin, ale_bl_stat, alp_bl_stat ',                                   &
2826       &            cin, ale_bl_stat, alp_bl_stat
2827        ENDIF
2828
2829!c----Initialisations
2830      do i=1,klon
2831      proba_notrig(i)=1.
2832      random_notrig(i)=1e6*ale_bl_stat(i)-int(1e6*ale_bl_stat(i))
2833        if ( ale_bl_trig(i) .lt. abs(cin(i))+1.e-10 ) then
2834        tau_trig(i)=tau_trig_shallow
2835        else
2836        tau_trig(i)=tau_trig_deep
2837        endif
2838      enddo
2839!c
2840        IF (prt_level .GE. 10) THEN
2841         print *,'random_notrig, tau_trig ',                                         &
2842       &            random_notrig, tau_trig
2843          print *,'s_trig,s2,n2 ',                                                   &
2844       &             s_trig,s2,n2
2845        ENDIF
2846
2847!c----Tirage al\'eatoire et calcul de ale_bl_trig
2848      do i=1,klon
2849        if ( (ale_bl_stat(i) .gt. abs(cin(i))+1.e-10) )  then
2850        proba_notrig(i)=(1.-exp(-s_trig/s2(i)))**                                    &
2851       &                  (n2(i)*dtime/tau_trig(i))
2852!c        print *, 'proba_notrig(i) ',proba_notrig(i)
2853          if (random_notrig(i) .ge. proba_notrig(i)) then
2854          ale_bl_trig(i)=ale_bl_stat(i)
2855          else
2856          ale_bl_trig(i)=0.
2857          endif
2858        else
2859        proba_notrig(i)=1.
2860        random_notrig(i)=0.
2861        ale_bl_trig(i)=0.
2862        endif
2863      enddo
2864!c
2865        IF (prt_level .GE. 10) THEN
2866         print *,'proba_notrig, ale_bl_trig ',                                       &
2867       &            proba_notrig, ale_bl_trig
2868        ENDIF
2869
2870      endif !(iflag_trig_bl)
2871
2872!c-----------Statistical closure-----------
2873      if (iflag_clos_bl.ge.1) then
2874
2875        do i=1,klon
2876        alp_bl(i)=alp_bl_stat(i)
2877        enddo
2878
2879      else
2880
2881      alp_bl_stat(:)=0.
2882
2883      endif !(iflag_clos_bl)
2884
2885        IF (prt_level .GE. 10) THEN
2886         print *,'ale_bl_trig, alp_bl_stat ',ale_bl_trig, alp_bl_stat
2887        ENDIF
2888
2889!ccc fin nrlmd le 10/04/2012
2890
2891! ----------------------------------------------------------------------
2892! Transport de la TKE par les panaches thermiques.
2893! FH : 2010/02/01
2894!     if (iflag_pbl.eq.10) then
2895!     call thermcell_dtke(klon,klev,nbsrf,pdtphys,fm_therm,entr_therm,
2896!    s           rg,paprs,pbl_tke)
2897!     endif
2898! ----------------------------------------------------------------------
2899!IM/FH: 2011/02/23
2900! Couplage Thermiques/Emanuel seulement si T<0
2901      if (iflag_coupl==2) then
2902        print*,'Couplage Thermiques/Emanuel seulement si T<0'
2903        do i=1,klon
2904           if (t_seri(i,lmax_th(i))>273.) then
2905              Ale_bl(i)=0.
2906           endif
2907        enddo
2908      endif
2909
2910      do i=1,klon
2911         zmax_th(i)=pphi(i,lmax_th(i))/rg
2912      enddo
2913
2914         endif
2915
2916
2917!c  Ajustement sec
2918!c  ==============
2919
2920! Dans le cas o\`u on active les thermiques, on fait partir l'ajustement
2921! a partir du sommet des thermiques.
2922! Dans le cas contraire, on demarre au niveau 1.
2923
2924         if (iflag_thermals.ge.13.or.iflag_thermals.eq.0) then
2925
2926         if(iflag_thermals.eq.0) then
2927            IF(prt_level>9)WRITE(lunout,*)'ajsec'
2928            limbas(:)=1
2929         else
2930            limbas(:)=lmax_th(:)
2931         endif
2932 
2933! Attention : le call ajsec_convV2 n'est maintenu que momentanneement
2934! pour des test de convergence numerique.
2935! Le nouveau ajsec est a priori mieux, meme pour le cas
2936! iflag_thermals = 0 (l'ancienne version peut faire des tendances
2937! non nulles numeriquement pour des mailles non concernees.
2938
2939         if (iflag_thermals.eq.0) then
2940            CALL ajsec_convV2(paprs, pplay, t_seri,q_seri                            &
2941       &      , d_t_ajsb, d_q_ajsb)
2942         else
2943            CALL ajsec(paprs, pplay, t_seri,q_seri,limbas                            &
2944       &      , d_t_ajsb, d_q_ajsb)
2945         endif
2946
2947!-----------------------------------------------------------------------------------------
2948! ajout des tendances de l'ajustement sec ou des thermiques
2949      CALL add_phys_tend(du0,dv0,d_t_ajsb,d_q_ajsb,dql0,'ajsb')
2950         d_t_ajs(:,:)=d_t_ajs(:,:)+d_t_ajsb(:,:)
2951         d_q_ajs(:,:)=d_q_ajs(:,:)+d_q_ajsb(:,:)
2952
2953!-----------------------------------------------------------------------------------------
2954
2955         endif
2956
2957      endif
2958      lvarname = 't_seri'
2959      lfname='after thermals'
2960      CALL check_var3D(lfname, varname, t_seri, klon, klev, largest, .FALSE.)
2961      lvarname = 'q_seri'
2962      CALL check_var3D(lfname, varname, q_seri, klon, klev, largest, .FALSE.)
2963      lvarname = 'd_t_ajsb'
2964      CALL check_var3D(lfname, varname, d_t_ajsb, klon, klev, largest, .FALSE.)
2965      lvarname = 'd_q_ajsb'
2966      CALL check_var3D(lfname, varname, d_q_ajsb, klon, klev, largest, .FALSE.)
2967
2968!c
2969!c===================================================================
2970!IM
2971      IF (ip_ebil_phy.ge.2) THEN
2972        ztit='after dry_adjust'
2973        CALL diagetpq(airephy,ztit,ip_ebil_phy,2,2,dtime                             &
2974       &      , t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,paprs,pplay              &
2975       &      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
2976        call diagphy(airephy,ztit,ip_ebil_phy                                        &
2977       &      , zero_v, zero_v, zero_v, zero_v, zero_v                               &
2978       &      , zero_v, zero_v, zero_v, ztsol                                        &
2979       &      , d_h_vcol, d_qt, d_ec                                                 &
2980       &      , fs_bound, fq_bound )
2981      END IF
2982      PRINT *,'  Lluis 6 d_h_vcol: ',d_h_vcol,' d_h_vcol_phy: ',d_h_vcol_phy
2983
2984!c-------------------------------------------------------------------------
2985! Computation of ratqs, the width (normalized) of the subrid scale
2986! water distribution
2987      CALL  calcratqs(klon,klev,prt_level,lunout,                                    &
2988       &     iflag_ratqs,iflag_con,iflag_cldcon,pdtphys,                             &
2989       &     ratqsbas,ratqshaut,tau_ratqs,fact_cldcon,                               &
2990       &     ptconv,ptconvth,clwcon0th, rnebcon0th,                                  &
2991       &     paprs,pplay,q_seri,zqsat,fm_therm,                                      &
2992       &     ratqs,ratqsc)
2993
2994
2995!c
2996!c Appeler le processus de condensation a grande echelle
2997!c et le processus de precipitation
2998!c-------------------------------------------------------------------------
2999      IF (prt_level .GE.10) THEN
3000       print *,' ->fisrtilp '
3001      ENDIF
3002!c-------------------------------------------------------------------------
3003      CALL fisrtilp(dtime,paprs,pplay,                                               &
3004       &           t_seri, q_seri,ptconv,ratqs,                                      &
3005       &           d_t_lsc, d_q_lsc, d_ql_lsc, rneb, cldliq,                         &
3006       &           rain_lsc, snow_lsc,                                               &
3007       &           pfrac_impa, pfrac_nucl, pfrac_1nucl,                              &
3008       &           frac_impa, frac_nucl, beta_prec_fisrt,                            &
3009       &           prfl, psfl, rhcl,                                                 &
3010       &           zqasc, fraca,ztv,zpspsk,ztla,zthl,iflag_cldcon )
3011
3012      WHERE (rain_lsc < 0) rain_lsc = 0.
3013      WHERE (snow_lsc < 0) snow_lsc = 0.
3014!-----------------------------------------------------------------------------------------
3015! ajout des tendances de la diffusion turbulente
3016      CALL add_phys_tend(du0,dv0,d_t_lsc,d_q_lsc,d_ql_lsc,'lsc')
3017!-----------------------------------------------------------------------------------------
3018      DO k = 1, klev
3019      DO i = 1, klon
3020         cldfra(i,k) = rneb(i,k)
3021         IF (.NOT.new_oliq) cldliq(i,k) = ql_seri(i,k)
3022      ENDDO
3023      ENDDO
3024      IF (check) THEN
3025         za = qcheck(klon,klev,paprs,q_seri,ql_seri,airephy)
3026         WRITE(lunout,*)"apresilp=", za
3027         zx_t = 0.0
3028         za = 0.0
3029         DO i = 1, klon
3030            za = za + airephy(i)/REAL(klon)
3031            zx_t = zx_t + (rain_lsc(i)                                               &
3032       &                  + snow_lsc(i))*airephy(i)/REAL(klon)
3033        ENDDO
3034         zx_t = zx_t/za*dtime
3035         WRITE(lunout,*)"Precip=", zx_t
3036      ENDIF
3037!IM
3038      IF (ip_ebil_phy.ge.2) THEN
3039        ztit='after fisrt'
3040        CALL diagetpq(airephy,ztit,ip_ebil_phy,2,2,dtime                             &
3041       &      , t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,paprs,pplay              &
3042       &      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
3043        call diagphy(airephy,ztit,ip_ebil_phy                                        &
3044       &      , zero_v, zero_v, zero_v, zero_v, zero_v                               &
3045       &      , zero_v, rain_lsc, snow_lsc, ztsol                                    &
3046       &      , d_h_vcol, d_qt, d_ec                                                 &
3047       &      , fs_bound, fq_bound )
3048      END IF
3049      PRINT *,'  Lluis 7 d_h_vcol: ',d_h_vcol,' d_h_vcol_phy: ',d_h_vcol_phy
3050      if (mydebug) then
3051        call writefield_phy('u_seri',u_seri,llm)
3052        call writefield_phy('v_seri',v_seri,llm)
3053        call writefield_phy('t_seri',t_seri,llm)
3054        call writefield_phy('q_seri',q_seri,llm)
3055      endif
3056!c
3057!c-------------------------------------------------------------------
3058!c  PRESCRIPTION DES NUAGES POUR LE RAYONNEMENT
3059!c-------------------------------------------------------------------
3060
3061!c 1. NUAGES CONVECTIFS
3062!c
3063!IM cf FH
3064!c     IF (iflag_cldcon.eq.-1) THEN ! seulement pour Tiedtke
3065      IF (iflag_cldcon.le.-1) THEN ! seulement pour Tiedtke
3066       snow_tiedtke=0.
3067!c     print*,'avant calcul de la pseudo precip '
3068!c     print*,'iflag_cldcon',iflag_cldcon
3069       if (iflag_cldcon.eq.-1) then
3070          rain_tiedtke=rain_con
3071       else
3072!c       print*,'calcul de la pseudo precip '
3073          rain_tiedtke=0.
3074!c         print*,'calcul de la pseudo precip 0'
3075          do k=1,klev
3076          do i=1,klon
3077             if (d_q_con(i,k).lt.0.) then
3078                rain_tiedtke(i)=rain_tiedtke(i)-d_q_con(i,k)/pdtphys                 &
3079       &         *(paprs(i,k)-paprs(i,k+1))/rg
3080             endif
3081          enddo
3082          enddo
3083       endif
3084!c
3085!c     call dump2d(iim,jjm,rain_tiedtke(2:klon-1),'PSEUDO PRECIP ')
3086!c
3087
3088!c Nuages diagnostiques pour Tiedtke
3089      CALL diagcld1(paprs,pplay,                                                     &
3090!IM cf FH  .             rain_con,snow_con,ibas_con,itop_con,                       &
3091       &             rain_tiedtke,snow_tiedtke,ibas_con,itop_con,                    &
3092       &             diafra,dialiq)
3093      DO k = 1, klev
3094      DO i = 1, klon
3095      IF (diafra(i,k).GT.cldfra(i,k)) THEN
3096         cldliq(i,k) = dialiq(i,k)
3097         cldfra(i,k) = diafra(i,k)
3098      ENDIF
3099      ENDDO
3100      ENDDO
3101
3102      ELSE IF (iflag_cldcon.ge.3) THEN
3103!c  On prend pour les nuages convectifs le max du calcul de la
3104!c  convection et du calcul du pas de temps precedent diminue d'un facteur
3105!c  facttemps
3106      facteur = pdtphys *facttemps
3107      do k=1,klev
3108         do i=1,klon
3109            rnebcon(i,k)=rnebcon(i,k)*facteur
3110            if (rnebcon0(i,k)*clwcon0(i,k).gt.rnebcon(i,k)*clwcon(i,k))              &
3111       &      then
3112                rnebcon(i,k)=rnebcon0(i,k)
3113                clwcon(i,k)=clwcon0(i,k)
3114            endif
3115         enddo
3116      enddo
3117
3118!c
3119!cjq - introduce the aerosol direct and first indirect radiative forcings
3120!cjq - Johannes Quaas, 27/11/2003 (quaas@lmd.jussieu.fr)
3121      IF (flag_aerosol .gt. 0) THEN
3122         IF (.NOT. aerosol_couple)                                                   &
3123       &        CALL readaerosol_optic(                                              &
3124       &        debut, new_aod, flag_aerosol, itap, jD_cur-jD_ref,                   &
3125       &        pdtphys, pplay, paprs, t_seri, rhcl, presnivs,                       &
3126       &        mass_solu_aero, mass_solu_aero_pi,                                   &
3127       &        tau_aero, piz_aero, cg_aero,                                         &
3128       &        tausum_aero, tau3d_aero)
3129      ELSE
3130         tausum_aero(:,:,:) = 0.
3131         tau_aero(:,:,:,:) = 0.
3132         piz_aero(:,:,:,:) = 0.
3133         cg_aero(:,:,:,:)  = 0.
3134      ENDIF
3135!c
3136!c--STRAT AEROSOL
3137!c--updates tausum_aero,tau_aero,piz_aero,cg_aero
3138      IF (flag_aerosol_strat) THEN
3139         PRINT *,'appel a readaerosolstrat', mth_cur
3140         CALL readaerosolstrato(debut)
3141      ENDIF
3142!c--fin STRAT AEROSOL
3143
3144!IM calcul nuages par le simulateur ISCCP
3145!c
3146#ifdef histISCCP
3147      IF (ok_isccp) THEN
3148!c
3149!IM lecture invtau, tautab des fichiers formattes
3150!c
3151      IF (debut) THEN
3152!$OMP MASTER
3153!c
3154      open(99,file='tautab.formatted', FORM='FORMATTED')
3155      read(99,'(f30.20)') tautab_omp
3156      close(99)
3157!c
3158      open(99,file='invtau.formatted',form='FORMATTED')
3159      read(99,'(i10)') invtau_omp
3160
3161!c     print*,'calcul_simulISCCP invtau_omp',invtau_omp
3162!c     write(6,'(a,8i10)') 'invtau_omp',(invtau_omp(i),i=1,100)
3163
3164      close(99)
3165!$OMP END MASTER
3166!$OMP BARRIER
3167      tautab=tautab_omp
3168      invtau=invtau_omp
3169!c
3170      ENDIF !debut
3171!c
3172!IM appel simulateur toutes les  NINT(freq_ISCCP/dtime) heures
3173       IF (MOD(itap,NINT(freq_ISCCP/dtime)).EQ.0) THEN
3174#include "calcul_simulISCCP.h"
3175       ENDIF !(MOD(itap,NINT(freq_ISCCP/dtime))
3176      ENDIF !ok_isccp
3177#endif
3178
3179!c   On prend la somme des fractions nuageuses et des contenus en eau
3180
3181      if (iflag_cldcon>=5) then
3182
3183        do k=1,klev
3184         ptconvth(:,k)=fm_therm(:,k+1)>0.
3185        enddo
3186
3187       if (iflag_coupl==4) then
3188
3189! Dans le cas iflag_coupl==4, on prend la somme des convertures
3190! convectives et lsc dans la partie des thermiques
3191! Le controle par iflag_coupl est peut etre provisoire.
3192         do k=1,klev
3193            do i=1,klon
3194               if (ptconv(i,k).and.ptconvth(i,k)) then
3195                   cldliq(i,k)=cldliq(i,k)+rnebcon(i,k)*clwcon(i,k)
3196                   cldfra(i,k)=min(cldfra(i,k)+rnebcon(i,k),1.)
3197               else if (ptconv(i,k)) then
3198                   cldfra(i,k)=rnebcon(i,k)
3199                   cldliq(i,k)=rnebcon(i,k)*clwcon(i,k)
3200               endif
3201            enddo
3202         enddo
3203
3204         else if (iflag_coupl==5) then
3205         do k=1,klev
3206            do i=1,klon
3207               cldfra(i,k)=min(cldfra(i,k)+rnebcon(i,k),1.)
3208               cldliq(i,k)=cldliq(i,k)+rnebcon(i,k)*clwcon(i,k)
3209            enddo
3210         enddo
3211
3212         else
3213
3214! Si on est sur un point touche par la convection profonde et pas
3215! par les thermiques, on prend la couverture nuageuse et l'eau nuageuse
3216! de la convection profonde.
3217
3218!IM/FH: 2011/02/23
3219! definition des points sur lesquels ls thermiques sont actifs
3220
3221         do k=1,klev
3222            do i=1,klon
3223               if (ptconv(i,k).and. .not. ptconvth(i,k)) then
3224                   cldfra(i,k)=rnebcon(i,k)
3225                   cldliq(i,k)=rnebcon(i,k)*clwcon(i,k)
3226               endif
3227            enddo
3228         enddo
3229
3230        endif
3231
3232      else
3233
3234! Ancienne version
3235      cldfra(:,:)=min(max(cldfra(:,:),rnebcon(:,:)),1.)
3236      cldliq(:,:)=cldliq(:,:)+rnebcon(:,:)*clwcon(:,:)
3237      endif
3238
3239      ENDIF
3240
3241!     plulsc(:)=0.
3242!     do k=1,klev,-1
3243!        do i=1,klon
3244!              zzz=prfl(:,k)+psfl(:,k)
3245!           if (.not.ptconvth.zzz.gt.0.)
3246!        enddo prfl, psfl,
3247!     enddo
3248!c
3249!c 2. NUAGES STARTIFORMES
3250!c
3251      IF (ok_stratus) THEN
3252      CALL diagcld2(paprs,pplay,t_seri,q_seri, diafra,dialiq)
3253      DO k = 1, klev
3254      DO i = 1, klon
3255      IF (diafra(i,k).GT.cldfra(i,k)) THEN
3256         cldliq(i,k) = dialiq(i,k)
3257         cldfra(i,k) = diafra(i,k)
3258      ENDIF
3259      ENDDO
3260      ENDDO
3261      ENDIF
3262!c
3263!c Precipitation totale
3264!c
3265      DO i = 1, klon
3266         rain_fall(i) = rain_con(i) + rain_lsc(i)
3267         snow_fall(i) = snow_con(i) + snow_lsc(i)
3268      ENDDO
3269!IM
3270      IF (ip_ebil_phy.ge.2) THEN
3271        ztit="after diagcld"
3272        CALL diagetpq(airephy,ztit,ip_ebil_phy,2,2,dtime                             &
3273       &      , t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,paprs,pplay              &
3274       &      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
3275        call diagphy(airephy,ztit,ip_ebil_phy                                        &
3276       &      , zero_v, zero_v, zero_v, zero_v, zero_v                               &
3277       &      , zero_v, zero_v, zero_v, ztsol                                        &
3278       &      , d_h_vcol, d_qt, d_ec                                                 &
3279       &      , fs_bound, fq_bound )
3280      END IF
3281      PRINT *,'  Lluis 8 d_h_vcol: ',d_h_vcol,' d_h_vcol_phy: ',d_h_vcol_phy
3282!c
3283!c Calculer l'humidite relative pour diagnostique
3284!c
3285      DO k = 1, klev
3286      DO i = 1, klon
3287         zx_t = t_seri(i,k)
3288         IF (thermcep) THEN
3289            zdelta = MAX(0.,SIGN(1.,rtt-zx_t))
3290            zx_qs  = r2es * FOEEW(zx_t,zdelta)/pplay(i,k)
3291            zx_qs  = MIN(0.5,zx_qs)
3292            zcor   = 1./(1.-retv*zx_qs)
3293            zx_qs  = zx_qs*zcor
3294         ELSE
3295           IF (zx_t.LT.t_coup) THEN
3296              zx_qs = qsats(zx_t)/pplay(i,k)
3297           ELSE
3298              zx_qs = qsatl(zx_t)/pplay(i,k)
3299           ENDIF
3300         ENDIF
3301         zx_rh(i,k) = q_seri(i,k)/zx_qs
3302         zqsat(i,k)=zx_qs
3303      ENDDO
3304      ENDDO
3305
3306!IM Calcul temp.potentielle a 2m (tpot) et temp. potentielle
3307!c   equivalente a 2m (tpote) pour diagnostique
3308!c
3309      DO i = 1, klon
3310       tpot(i)=zt2m(i)*(100000./paprs(i,1))**RKAPPA
3311       IF (thermcep) THEN
3312        IF(zt2m(i).LT.RTT) then
3313         Lheat=RLSTT
3314        ELSE
3315         Lheat=RLVTT
3316        ENDIF
3317       ELSE
3318        IF (zt2m(i).LT.RTT) THEN
3319         Lheat=RLSTT
3320        ELSE
3321         Lheat=RLVTT
3322        ENDIF
3323       ENDIF
3324       tpote(i) = tpot(i)*                                                           &
3325       & EXP((Lheat *qsat2m(i))/(RCPD*zt2m(i)))
3326      ENDDO
3327
3328      IF (type_trac == 'inca') THEN
3329#ifdef INCA
3330         CALL VTe(VTphysiq)
3331         CALL VTb(VTinca)
3332         calday = REAL(days_elapsed + 1) + jH_cur
3333
3334         call chemtime(itap+itau_phy-1, date0, dtime)
3335         IF (config_inca == 'aero') THEN
3336            CALL AEROSOL_METEO_CALC(                                                 &
3337       &           calday,pdtphys,pplay,paprs,t,pmflxr,pmflxs,                       &
3338       &           prfl,psfl,pctsrf,airephy,rlat,rlon,u10m,v10m)
3339         END IF
3340
3341         zxsnow_dummy(:) = 0.0
3342
3343         CALL chemhook_begin (calday,                                                &
3344       &                          days_elapsed+1,                                    &
3345       &                          jH_cur,                                            &
3346       &                          pctsrf(1,1),                                       &
3347       &                          rlat,                                              &
3348       &                          rlon,                                              &
3349       &                          airephy,                                           &
3350       &                          paprs,                                             &
3351       &                          pplay,                                             &
3352       &                          coefh(:,:,is_ave),                                 &
3353       &                          pphi,                                              &
3354       &                          t_seri,                                            &
3355       &                          u,                                                 &
3356       &                          v,                                                 &
3357       &                          wo(:, :, 1),                                       &
3358       &                          q_seri,                                            &
3359       &                          zxtsol,                                            &
3360       &                          zxsnow_dummy,                                      &
3361       &                          solsw,                                             &
3362       &                          albsol1,                                           &
3363       &                          rain_fall,                                         &
3364       &                          snow_fall,                                         &
3365       &                          itop_con,                                          &
3366       &                          ibas_con,                                          &
3367       &                          cldfra,                                            &
3368       &                          iim,                                               &
3369       &                          jjm,                                               &
3370       &                          tr_seri,                                           &
3371       &                          ftsol,                                             &
3372       &                          paprs,                                             &
3373       &                          cdragh,                                            &
3374       &                          cdragm,                                            &
3375       &                          pctsrf,                                            &
3376       &                          pdtphys,                                           &
3377       &                            itap)
3378
3379         CALL VTe(VTinca)
3380         CALL VTb(VTphysiq)
3381#endif
3382      END IF !type_trac = inca
3383!c     
3384!c Calculer les parametres optiques des nuages et quelques
3385!c parametres pour diagnostiques:
3386!c
3387
3388      IF (aerosol_couple) THEN
3389         mass_solu_aero(:,:)    = ccm(:,:,1)
3390         mass_solu_aero_pi(:,:) = ccm(:,:,2)
3391      END IF
3392
3393      if (ok_newmicro) then
3394      CALL newmicro (ok_cdnc, bl95_b0, bl95_b1,                                      &
3395       &              paprs, pplay, t_seri, cldliq, cldfra,                          &
3396       &              cldtau, cldemi, cldh, cldl, cldm, cldt, cldq,                  &
3397       &              flwp, fiwp, flwc, fiwc,                                        &
3398       &              mass_solu_aero, mass_solu_aero_pi,                             &
3399       &              cldtaupi, re, fl, ref_liq, ref_ice)
3400      else
3401      CALL nuage (paprs, pplay,                                                      &
3402       &            t_seri, cldliq, cldfra, cldtau, cldemi,                          &
3403       &            cldh, cldl, cldm, cldt, cldq,                                    &
3404       &            ok_aie,                                                          &
3405       &            mass_solu_aero, mass_solu_aero_pi,                               &
3406       &            bl95_b0, bl95_b1,                                                &
3407       &            cldtaupi, re, fl)
3408      endif
3409!c
3410!IM betaCRF
3411!c
3412      cldtaurad   = cldtau
3413      cldtaupirad = cldtaupi
3414      cldemirad   = cldemi                                                           &
3415       &!c
3416      if(lon1_beta.EQ.-180..AND.lon2_beta.EQ.180..AND.                               &
3417       &lat1_beta.EQ.90..AND.lat2_beta.EQ.-90.) THEN
3418!c
3419!c global
3420!c
3421       DO k=1, klev
3422       DO i=1, klon
3423        if (pplay(i,k).GE.pfree) THEN
3424         beta(i,k) = beta_pbl
3425        else
3426         beta(i,k) = beta_free
3427        endif
3428        if (mskocean_beta) THEN
3429         beta(i,k) = beta(i,k) * pctsrf(i,is_oce)
3430        endif
3431        cldtaurad(i,k)   = cldtau(i,k) * beta(i,k)
3432        cldtaupirad(i,k) = cldtaupi(i,k) * beta(i,k)
3433        cldemirad(i,k)   = cldemi(i,k) * beta(i,k)
3434        cldfrarad(i,k)   = cldfra(i,k) * beta(i,k)
3435       ENDDO
3436       ENDDO
3437!c
3438      else
3439!c
3440!c regional
3441!c
3442       DO k=1, klev
3443       DO i=1,klon
3444!c
3445        if (rlon(i).ge.lon1_beta.AND.rlon(i).le.lon2_beta.AND.                       &
3446       &      rlat(i).le.lat1_beta.AND.rlat(i).ge.lat2_beta) THEN
3447         if (pplay(i,k).GE.pfree) THEN
3448          beta(i,k) = beta_pbl
3449         else
3450          beta(i,k) = beta_free
3451         endif
3452         if (mskocean_beta) THEN
3453          beta(i,k) = beta(i,k) * pctsrf(i,is_oce)
3454         endif
3455        cldtaurad(i,k)   = cldtau(i,k) * beta(i,k)
3456        cldtaupirad(i,k) = cldtaupi(i,k) * beta(i,k)
3457        cldemirad(i,k)   = cldemi(i,k) * beta(i,k)
3458        cldfrarad(i,k)   = cldfra(i,k) * beta(i,k)
3459        endif
3460!c
3461       ENDDO
3462       ENDDO
3463!c
3464      endif
3465!c
3466!c Appeler le rayonnement mais calculer tout d'abord l'albedo du sol.
3467!c
3468      IF (MOD(itaprad,radpas).EQ.0) THEN
3469
3470      DO i = 1, klon
3471         albsol1(i) = falb1(i,is_oce) * pctsrf(i,is_oce)                             &
3472       &             + falb1(i,is_lic) * pctsrf(i,is_lic)                            &
3473       &             + falb1(i,is_ter) * pctsrf(i,is_ter)                            &
3474       &             + falb1(i,is_sic) * pctsrf(i,is_sic)
3475         albsol2(i) = falb2(i,is_oce) * pctsrf(i,is_oce)                             &
3476       &               + falb2(i,is_lic) * pctsrf(i,is_lic)                          &
3477       &               + falb2(i,is_ter) * pctsrf(i,is_ter)                          &
3478       &               + falb2(i,is_sic) * pctsrf(i,is_sic)
3479      ENDDO
3480
3481      if (mydebug) then
3482        call writefield_phy('u_seri',u_seri,llm)
3483        call writefield_phy('v_seri',v_seri,llm)
3484        call writefield_phy('t_seri',t_seri,llm)
3485        call writefield_phy('q_seri',q_seri,llm)
3486      endif
3487     
3488      IF (aerosol_couple) THEN
3489#ifdef INCA
3490         CALL radlwsw_inca                                                           &
3491       &        (kdlon,kflev,dist, rmu0, fract, solaire,                             &
3492       &        paprs, pplay,zxtsol,albsol1, albsol2, t_seri,q_seri,                 &
3493       &        wo(:, :, 1),                                                         &
3494       &        cldfrarad, cldemirad, cldtaurad,                                     &
3495       &        heat,heat0,cool,cool0,radsol,albpla,                                 &
3496       &        topsw,toplw,solsw,sollw,                                             &
3497       &        sollwdown,                                                           &
3498       &        topsw0,toplw0,solsw0,sollw0,                                         &
3499       &        lwdn0, lwdn, lwup0, lwup,                                            &
3500       &        swdn0, swdn, swup0, swup,                                            &
3501       &        ok_ade, ok_aie,                                                      &
3502       &        tau_aero, piz_aero, cg_aero,                                         &
3503       &        topswad_aero, solswad_aero,                                          &
3504       &        topswad0_aero, solswad0_aero,                                        &
3505       &        topsw_aero, topsw0_aero,                                             &
3506       &        solsw_aero, solsw0_aero,                                             &
3507       &        cldtaupirad,                                                         &
3508       &        topswai_aero, solswai_aero)
3509           
3510#endif
3511      ELSE
3512!c
3513!IM calcul radiatif pour le cas actuel
3514!c
3515       RCO2 = RCO2_act
3516       RCH4 = RCH4_act
3517       RN2O = RN2O_act
3518       RCFC11 = RCFC11_act
3519       RCFC12 = RCFC12_act
3520!c
3521      IF (prt_level .GE.10) THEN
3522       print *,' ->radlwsw, number 1 '
3523      ENDIF
3524!c
3525      PRINT *,'  Lluis before calling radlwsw rmu0: ',rmu0(llp),   &
3526        ' dist: ',dist,' frac: ',fract(llp),' jH_cur: ',jH_cur
3527         CALL radlwsw                                                                &
3528       &        (dist, rmu0, fract,                                                  &
3529       &        paprs, pplay,zxtsol,albsol1, albsol2,                                &
3530       &        t_seri,q_seri,wo,                                                    &
3531       &        cldfrarad, cldemirad, cldtaurad,                                     &
3532       &        ok_ade.OR.flag_aerosol_strat, ok_aie, flag_aerosol,                  &
3533       &        flag_aerosol_strat,                                                  &
3534       &        tau_aero, piz_aero, cg_aero,                                         &
3535       &        cldtaupirad,new_aod,                                                 &
3536       &        zqsat, flwc, fiwc,                                                   &
3537       &        heat,heat0,cool,cool0,radsol,albpla,                                 &
3538       &        topsw,toplw,solsw,sollw,                                             &
3539       &        sollwdown,                                                           &
3540       &        topsw0,toplw0,solsw0,sollw0,                                         &
3541       &        lwdn0, lwdn, lwup0, lwup,                                            &
3542       &        swdn0, swdn, swup0, swup,                                            &
3543       &        topswad_aero, solswad_aero,                                          &
3544       &        topswai_aero, solswai_aero,                                          &
3545       &        topswad0_aero, solswad0_aero,                                        &
3546       &        topsw_aero, topsw0_aero,                                             &
3547       &        solsw_aero, solsw0_aero,                                             &
3548       &        topswcf_aero, solswcf_aero)
3549      PRINT *,'  Lluis after calling radlwsw rmu0: ',rmu0(llp),   &
3550        ' dist: ',dist,' frac: ',fract(llp),' jH_cur: ',jH_cur
3551         
3552!c
3553!IM 2eme calcul radiatif pour le cas perturbe ou au moins un
3554!IM des taux doit etre different du taux actuel
3555!IM Par defaut on a les taux perturbes egaux aux taux actuels
3556!c
3557
3558      if (ok_4xCO2atm) then
3559       if (RCO2_per.NE.RCO2_act.OR.RCH4_per.NE.RCH4_act.OR.                          &
3560       &RN2O_per.NE.RN2O_act.OR.RCFC11_per.NE.RCFC11_act.OR.                         &
3561       &RCFC12_per.NE.RCFC12_act) THEN
3562!c
3563       RCO2 = RCO2_per
3564       RCH4 = RCH4_per
3565       RN2O = RN2O_per
3566       RCFC11 = RCFC11_per
3567       RCFC12 = RCFC12_per
3568!c
3569      IF (prt_level .GE.10) THEN
3570       print *,' ->radlwsw, number 2 '
3571      ENDIF
3572!c
3573         CALL radlwsw                                                                &
3574       &        (dist, rmu0, fract,                                                  &
3575       &        paprs, pplay,zxtsol,albsol1, albsol2,                                &
3576       &        t_seri,q_seri,wo,                                                    &
3577       &        cldfra, cldemi, cldtau,                                              &
3578       &        ok_ade.OR.flag_aerosol_strat, ok_aie, flag_aerosol,                  &
3579       &        flag_aerosol_strat,                                                  &
3580       &        tau_aero, piz_aero, cg_aero,                                         &
3581       &        cldtaupi,new_aod,                                                    &
3582       &        zqsat, flwc, fiwc,                                                   &
3583       &        heatp,heat0p,coolp,cool0p,radsolp,albplap,                           &
3584       &        topswp,toplwp,solswp,sollwp,                                         &
3585       &        sollwdownp,                                                          &
3586       &        topsw0p,toplw0p,solsw0p,sollw0p,                                     &
3587       &        lwdn0p, lwdnp, lwup0p, lwupp,                                        &
3588       &        swdn0p, swdnp, swup0p, swupp,                                        &
3589       &        topswad_aerop, solswad_aerop,                                        &
3590       &        topswai_aerop, solswai_aerop,                                        &
3591       &        topswad0_aerop, solswad0_aerop,                                      &
3592       &        topsw_aerop, topsw0_aerop,                                           &
3593       &        solsw_aerop, solsw0_aerop,                                           &
3594       &        topswcf_aerop, solswcf_aerop)
3595       endif
3596      endif
3597!c
3598      ENDIF ! aerosol_couple
3599      itaprad = 0
3600      ENDIF ! MOD(itaprad,radpas)
3601      itaprad = itaprad + 1
3602
3603      IF (iflag_radia.eq.0) THEN
3604         IF (prt_level.ge.9) THEN
3605            PRINT *,'--------------------------------------------------'
3606            PRINT *,'>>>> ATTENTION rayonnement desactive pour ce cas'
3607            PRINT *,'>>>>           heat et cool mis a zero '
3608            PRINT *,'--------------------------------------------------'
3609         END IF
3610         heat=0.
3611         cool=0.
3612         sollw=0.   ! MPL 01032011
3613         solsw=0.
3614         radsol=0.
3615         swup=0.    ! MPL 27102011 pour les fichiers AMMA_profiles et AMMA_scalars
3616         swup0=0.
3617         swdn=0.
3618         swdn0=0.
3619         lwup=0.
3620         lwup0=0.
3621         lwdn=0.
3622         lwdn0=0.
3623      END IF
3624
3625!c
3626!c Ajouter la tendance des rayonnements (tous les pas)
3627!c
3628      DO k = 1, klev
3629      DO i = 1, klon
3630         t_seri(i,k) = t_seri(i,k)                                                   &
3631       &               + (heat(i,k)-cool(i,k)) * dtime/RDAY
3632      ENDDO
3633      ENDDO
3634!c
3635      if (mydebug) then
3636        call writefield_phy('u_seri',u_seri,llm)
3637        call writefield_phy('v_seri',v_seri,llm)
3638        call writefield_phy('t_seri',t_seri,llm)
3639        call writefield_phy('q_seri',q_seri,llm)
3640      endif
3641 
3642!IM
3643      IF (ip_ebil_phy.ge.2) THEN
3644        ztit='after rad'
3645        CALL diagetpq(airephy,ztit,ip_ebil_phy,2,2,dtime                             &
3646       &      , t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,paprs,pplay              &
3647       &      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
3648        call diagphy(airephy,ztit,ip_ebil_phy                                        &
3649       &      , topsw, toplw, solsw, sollw, zero_v                                   &
3650       &      , zero_v, zero_v, zero_v, ztsol                                        &
3651       &      , d_h_vcol, d_qt, d_ec                                                 &
3652       &      , fs_bound, fq_bound )
3653      END IF
3654      PRINT *,'  Lluis 9 d_h_vcol: ',d_h_vcol,' d_h_vcol_phy: ',d_h_vcol_phy
3655!c
3656!c
3657!c Calculer l'hydrologie de la surface
3658!c
3659!c      CALL hydrol(dtime,pctsrf,rain_fall, snow_fall, zxevap,
3660!c     .            agesno, ftsol,fqsurf,fsnow, ruis)
3661!c
3662
3663!c
3664!c Calculer le bilan du sol et la derive de temperature (couplage)
3665!c
3666      DO i = 1, klon
3667!c         bils(i) = radsol(i) - sens(i) - evap(i)*RLVTT
3668!c a la demande de JLD
3669         bils(i) = radsol(i) - sens(i) + zxfluxlat(i)
3670      ENDDO
3671!c
3672!cmoddeblott(jan95)
3673!c Appeler le programme de parametrisation de l'orographie
3674!c a l'echelle sous-maille:
3675!c
3676      IF (prt_level .GE.10) THEN
3677       print *,' call orography ? ', ok_orodr
3678      ENDIF
3679!c
3680      IF (ok_orodr) THEN
3681!c
3682!c  selection des points pour lesquels le shema est actif:
3683        igwd=0
3684        DO i=1,klon
3685        itest(i)=0
3686!c        IF ((zstd(i).gt.10.0)) THEN
3687        IF (((zpic(i)-zmea(i)).GT.100.).AND.(zstd(i).GT.10.0)) THEN
3688          itest(i)=1
3689          igwd=igwd+1
3690          idx(igwd)=i
3691        ENDIF
3692        ENDDO
3693!c        igwdim=MAX(1,igwd)
3694!c
3695        IF (ok_strato) THEN
3696       
3697          CALL drag_noro_strato(klon,klev,dtime,paprs,pplay,                         &
3698       &                   zmea,zstd, zsig, zgam, zthe,zpic,zval,                    &
3699       &                   igwd,idx,itest,                                           &
3700       &                   t_seri, u_seri, v_seri,                                   &
3701       &                   zulow, zvlow, zustrdr, zvstrdr,                           &
3702       &                   d_t_oro, d_u_oro, d_v_oro)
3703
3704       ELSE
3705        CALL drag_noro(klon,klev,dtime,paprs,pplay,                                  &
3706       &                   zmea,zstd, zsig, zgam, zthe,zpic,zval,                    &
3707       &                   igwd,idx,itest,                                           &
3708       &                   t_seri, u_seri, v_seri,                                   &
3709       &                   zulow, zvlow, zustrdr, zvstrdr,                           &
3710       &                   d_t_oro, d_u_oro, d_v_oro)
3711       ENDIF
3712!c
3713!c  ajout des tendances
3714!-----------------------------------------------------------------------------------------
3715! ajout des tendances de la trainee de l'orographie
3716      CALL add_phys_tend(d_u_oro,d_v_oro,d_t_oro,dq0,dql0,'oro')
3717!-----------------------------------------------------------------------------------------
3718!c
3719      ENDIF ! fin de test sur ok_orodr
3720!c
3721      if (mydebug) then
3722        call writefield_phy('u_seri',u_seri,llm)
3723        call writefield_phy('v_seri',v_seri,llm)
3724        call writefield_phy('t_seri',t_seri,llm)
3725        call writefield_phy('q_seri',q_seri,llm)
3726      endif
3727     
3728      IF (ok_orolf) THEN
3729!c
3730!c  selection des points pour lesquels le shema est actif:
3731        igwd=0
3732        DO i=1,klon
3733        itest(i)=0
3734        IF ((zpic(i)-zmea(i)).GT.100.) THEN
3735          itest(i)=1
3736          igwd=igwd+1
3737          idx(igwd)=i
3738        ENDIF
3739        ENDDO
3740!c        igwdim=MAX(1,igwd)
3741!c
3742        IF (ok_strato) THEN
3743
3744          CALL lift_noro_strato(klon,klev,dtime,paprs,pplay,                         &
3745       &                   rlat,zmea,zstd,zpic,zgam,zthe,zpic,zval,                  &
3746       &                   igwd,idx,itest,                                           &
3747       &                   t_seri, u_seri, v_seri,                                   &
3748       &                   zulow, zvlow, zustrli, zvstrli,                           &
3749       &                   d_t_lif, d_u_lif, d_v_lif               )
3750       
3751        ELSE
3752          CALL lift_noro(klon,klev,dtime,paprs,pplay,                                &
3753       &                   rlat,zmea,zstd,zpic,                                      &
3754       &                   itest,                                                    &
3755       &                   t_seri, u_seri, v_seri,                                   &
3756       &                   zulow, zvlow, zustrli, zvstrli,                           &
3757       &                   d_t_lif, d_u_lif, d_v_lif)
3758       ENDIF
3759!c   
3760!-----------------------------------------------------------------------------------------
3761! ajout des tendances de la portance de l'orographie
3762      CALL add_phys_tend(d_u_lif,d_v_lif,d_t_lif,dq0,dql0,'lif')
3763!-----------------------------------------------------------------------------------------
3764!c
3765      ENDIF ! fin de test sur ok_orolf
3766!C  HINES GWD PARAMETRIZATION
3767
3768       IF (ok_hines) then
3769
3770         CALL hines_gwd(klon,klev,dtime,paprs,pplay,                                 &
3771       &                  rlat,t_seri,u_seri,v_seri,                                 &
3772       &                  zustrhi,zvstrhi,                                           &
3773       &                  d_t_hin, d_u_hin, d_v_hin)
3774!c
3775!c  ajout des tendances
3776        CALL add_phys_tend(d_u_hin,d_v_hin,d_t_hin,dq0,dql0,'hin')
3777
3778      ENDIF
3779!c
3780
3781!c
3782!IM cf. FLott BEG
3783!C STRESS NECESSAIRES: TOUTE LA PHYSIQUE
3784
3785      if (mydebug) then
3786        call writefield_phy('u_seri',u_seri,llm)
3787        call writefield_phy('v_seri',v_seri,llm)
3788        call writefield_phy('t_seri',t_seri,llm)
3789        call writefield_phy('q_seri',q_seri,llm)
3790      endif
3791
3792      DO i = 1, klon
3793        zustrph(i)=0.
3794        zvstrph(i)=0.
3795      ENDDO
3796      DO k = 1, klev
3797      DO i = 1, klon
3798       zustrph(i)=zustrph(i)+(u_seri(i,k)-u(i,k))/dtime*                             &
3799       &            (paprs(i,k)-paprs(i,k+1))/rg
3800       zvstrph(i)=zvstrph(i)+(v_seri(i,k)-v(i,k))/dtime*                             &
3801       &            (paprs(i,k)-paprs(i,k+1))/rg
3802      ENDDO
3803      ENDDO
3804!c
3805!IM calcul composantes axiales du moment angulaire et couple des montagnes
3806!c
3807!      IF (is_sequential .and. ok_orodr) THEN
3808!        CALL aaam_bud (27,klon,klev,jD_cur-jD_ref,jH_cur,                            &
3809!       &                 ra,rg,romega,                                               &
3810!       &                 rlat,rlon,pphis,                                            &
3811!       &                 zustrdr,zustrli,zustrph,                                    &
3812!       &                 zvstrdr,zvstrli,zvstrph,                                    &
3813!       &                 paprs,u,v,                                                  &
3814!       &                 aam, torsfc)
3815!       ENDIF
3816!IM cf. FLott END
3817!IM
3818      IF (ip_ebil_phy.ge.2) THEN
3819        ztit='after orography'
3820        CALL diagetpq(airephy,ztit,ip_ebil_phy,2,2,dtime                             &
3821       &      , t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,paprs,pplay              &
3822       &      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
3823         call diagphy(airephy,ztit,ip_ebil_phy                                       &
3824       &      , zero_v, zero_v, zero_v, zero_v, zero_v                               &
3825       &      , zero_v, zero_v, zero_v, ztsol                                        &
3826       &      , d_h_vcol, d_qt, d_ec                                                 &
3827       &      , fs_bound, fq_bound )
3828      END IF
3829      PRINT *,'  Lluis 10 d_h_vcol: ',d_h_vcol,' d_h_vcol_phy: ',d_h_vcol_phy
3830!c
3831!c
3832!====================================================================
3833! Interface Simulateur COSP (Calipso, ISCCP, MISR, ..)
3834!====================================================================
3835! Abderrahmane 24.08.09
3836
3837      IF (ok_cosp) THEN
3838! adeclarer
3839#ifdef CPP_COSP
3840       IF (MOD(itap,NINT(freq_cosp/dtime)).EQ.0) THEN
3841
3842       print*,'freq_cosp',freq_cosp
3843          mr_ozone=wo(:, :, 1) * dobson_u * 1e3 / zmasse
3844!       print*,'Dans physiq.F avant appel cosp ref_liq,ref_ice=',
3845!     s        ref_liq,ref_ice
3846          call phys_cosp(itap,dtime,freq_cosp,                                       &
3847       &                   ok_mensuelCOSP,ok_journeCOSP,ok_hfCOSP,                   &
3848       &                   ecrit_mth,ecrit_day,ecrit_hf,                             &
3849       &                   klon,klev,rlon,rlat,presnivs,overlap,                     &
3850       &                   ref_liq,ref_ice,                                          &
3851       &                   pctsrf(:,is_ter)+pctsrf(:,is_lic),                        &
3852       &                   zu10m,zv10m,pphis,                                        &
3853       &                   zphi,paprs(:,1:klev),pplay,zxtsol,t_seri,                 &
3854       &                   qx(:,:,ivap),zx_rh,cldfra,rnebcon,flwc,fiwc,              &
3855       &                   prfl(:,1:klev),psfl(:,1:klev),                            &
3856       &                   pmflxr(:,1:klev),pmflxs(:,1:klev),                        &
3857       &                   mr_ozone,cldtau, cldemi)
3858
3859!     L          calipso2D,calipso3D,cfadlidar,parasolrefl,atb,betamol,
3860!     L          cfaddbze,clcalipso2,dbze,cltlidarradar,
3861!     M          clMISR,
3862!     R          clisccp2,boxtauisccp,boxptopisccp,tclisccp,ctpisccp,
3863!     I          tauisccp,albisccp,meantbisccp,meantbclrisccp)
3864
3865         ENDIF
3866
3867#endif
3868       ENDIF  !ok_cosp
3869!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3870!cAA
3871!cAA Installation de l'interface online-offline pour traceurs
3872!cAA
3873!c====================================================================
3874!c   Calcul  des tendances traceurs
3875!c====================================================================
3876!C
3877
3878       IF (type_trac=='repr') THEN
3879          sh_in(:,:) = q_seri(:,:)
3880       ELSE
3881          sh_in(:,:) = qx(:,:,ivap)
3882       END IF
3883
3884      call phytrac (                                                                 &
3885       &     itap,     days_elapsed+1,    jH_cur,   debut,                           &
3886       &     lafin,    dtime,     u, v,     t,                                       &
3887       &     paprs,    pplay,     pmfu,     pmfd,                                    &
3888       &     pen_u,    pde_u,     pen_d,    pde_d,                                   &
3889       &     cdragh,   coefh(:,:,is_ave),     fm_therm, entr_therm,                  &
3890       &     u1,       v1,        ftsol,    pctsrf,                                  &
3891       &     ustar,     u10m,      v10m,                                             &
3892       &     rlat,     rlon,                                                         &
3893       &     frac_impa,frac_nucl, beta_prec_fisrt,beta_prec,                         &
3894       &     presnivs, pphis,     pphi,     albsol1,                                 &
3895       &     sh_in,    rhcl,      cldfra,   rneb,                                    &
3896       &     diafra,   cldliq,    itop_con, ibas_con,                                &
3897       &     pmflxr,   pmflxs,    prfl,     psfl,                                    &
3898       &     da,       phi,       mp,       upwd,                                    &
3899       &     phi2,     d1a,       dam,      sij,                                     &
3900       &     wdtrainA, wdtrainM,  sigd,     clw,elij,                                &
3901       &     ev,       ep,        epmlmMm,  eplaMm,                                  &
3902       &     dnwd,     aerosol_couple,      flxmass_w,                               &
3903       &     tau_aero, piz_aero,  cg_aero,  ccm,                                     &
3904       &     rfname,                                                                 &
3905       &     d_tr_dyn,                                                               &
3906       &     tr_seri)
3907
3908      IF (offline) THEN
3909
3910       IF (prt_level.ge.9)                                                           &
3911       &    print*,'Attention on met a 0 les thermiques pour phystoke'
3912         call phystokenc (                                                                  &
3913       &                   nlon,klev,pdtphys,rlon,rlat,                              &
3914       &                   t,pmfu, pmfd, pen_u, pde_u, pen_d, pde_d,                 &
3915       &                   fm_therm,entr_therm,                                      &
3916       &                   cdragh,coefh(:,:,is_ave),u1,v1,ftsol,pctsrf,              &
3917       &                   frac_impa, frac_nucl,                                     &
3918       &                   pphis,airephy,dtime,itap,                                 &
3919       &                   qx(:,:,ivap),da,phi,mp,upwd,dnwd)
3920
3921
3922      ENDIF
3923
3924!c
3925!c Calculer le transport de l'eau et de l'energie (diagnostique)
3926!c
3927      CALL transp (paprs,zxtsol,                                                     &
3928       &                   t_seri, q_seri, u_seri, v_seri, zphi,                     &
3929       &                   ve, vq, ue, uq)
3930!c
3931!IM global posePB BEG
3932      IF(1.EQ.0) THEN
3933!c
3934      CALL transp_lay (paprs,zxtsol,                                                 &
3935       &                   t_seri, q_seri, u_seri, v_seri, zphi,                     &
3936       &                   ve_lay, vq_lay, ue_lay, uq_lay)
3937!c
3938      ENDIF !(1.EQ.0) THEN
3939!IM global posePB END
3940!c Accumuler les variables a stocker dans les fichiers histoire:
3941!c
3942
3943!================================================================
3944! Conversion of kinetic and potential energy into heat, for
3945! parameterisation of subgrid-scale motions
3946!================================================================
3947
3948      d_t_ec(:,:)=0.
3949      forall (k=1: llm) exner(:, k) = (pplay(:, k)/paprs(:,1))**RKAPPA
3950      CALL ener_conserv(klon,klev,pdtphys,u,v,t,qx(:,:,ivap),                        &
3951       &        u_seri,v_seri,t_seri,q_seri,pbl_tke(:,:,is_ave)-tke0(:,:),           &
3952       &        zmasse,exner,d_t_ec)
3953      t_seri(:,:)=t_seri(:,:)+d_t_ec(:,:)
3954
3955!IM
3956      IF (ip_ebil_phy.ge.1) THEN
3957        ztit='after physic'
3958        CALL diagetpq(airephy,ztit,ip_ebil_phy,1,1,dtime                             &
3959       &      , t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,paprs,pplay              &
3960       &      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
3961!C     Comme les tendances de la physique sont ajoute dans la dynamique,
3962!C     on devrait avoir que la variation d'entalpie par la dynamique
3963!C     est egale a la variation de la physique au pas de temps precedent.
3964!C     Donc la somme de ces 2 variations devrait etre nulle.
3965
3966       PRINT *,'  LLuis sending: d_h_vcol: ',d_h_vcol,' d_qt ',d_qt,' d_ec ',d_ec
3967
3968        call diagphy(airephy,ztit,ip_ebil_phy                                        &
3969       &      , topsw, toplw, solsw, sollw, sens                                     &
3970       &      , evap, rain_fall, snow_fall, ztsol                                    &
3971       &      , d_h_vcol, d_qt, d_ec                                                 &
3972       &      , fs_bound, fq_bound )
3973!C
3974      d_h_vcol_phy=d_h_vcol
3975!C
3976      END IF
3977      PRINT *,'  Lluis 11 d_h_vcol: ',d_h_vcol,' d_h_vcol_phy: ',d_h_vcol_phy
3978      PRINT *,'Lluis Reaching the SORTIES point'
3979
3980!C
3981!c=======================================================================
3982!c   SORTIES
3983!c=======================================================================
3984
3985!IM Interpolation sur les niveaux de pression du NMC
3986!c   -------------------------------------------------
3987!c
3988#include "calcul_STDlev.h"
3989!c
3990!c slp sea level pressure
3991      slp(:) = paprs(:,1)*exp(pphis(:)/(RD*t_seri(:,1)))
3992!c
3993!ccc prw = eau precipitable
3994      DO i = 1, klon
3995       prw(i) = 0.
3996       DO k = 1, klev
3997        prw(i) = prw(i) +                                                            &
3998       &           q_seri(i,k)*(paprs(i,k)-paprs(i,k+1))/RG
3999       ENDDO
4000      ENDDO
4001!c
4002!IM initialisation + calculs divers diag AMIP2
4003!c
4004#include "calcul_divers.h"
4005!c
4006      IF (type_trac == 'inca') THEN
4007#ifdef INCA
4008         CALL VTe(VTphysiq)
4009         CALL VTb(VTinca)
4010
4011         CALL chemhook_end (                                                         &
4012       &                        dtime,                                               &
4013       &                        pplay,                                               &
4014       &                        t_seri,                                              &
4015       &                        tr_seri,                                             &
4016       &                        nbtr,                                                &
4017       &                        paprs,                                               &
4018       &                        q_seri,                                              &
4019       &                        airephy,                                             &
4020       &                        pphi,                                                &
4021       &                        pphis,                                               &
4022       &                        zx_rh)
4023
4024         CALL VTe(VTinca)
4025         CALL VTb(VTphysiq)
4026#endif
4027      END IF
4028
4029
4030!c
4031!c Convertir les incrementations en tendances
4032!c
4033      IF (prt_level .GE.10) THEN
4034        print *,'Convertir les incrementations en tendances '
4035      ENDIF
4036!c
4037      if (mydebug) then
4038        call writefield_phy('u_seri',u_seri,llm)
4039        call writefield_phy('v_seri',v_seri,llm)
4040        call writefield_phy('t_seri',t_seri,llm)
4041        call writefield_phy('q_seri',q_seri,llm)
4042      endif
4043
4044      DO k = 1, klev
4045      DO i = 1, klon
4046         d_u(i,k) = ( u_seri(i,k) - u(i,k) ) / dtime
4047         d_v(i,k) = ( v_seri(i,k) - v(i,k) ) / dtime
4048         d_t(i,k) = ( t_seri(i,k)-t(i,k) ) / dtime
4049         d_qx(i,k,ivap) = ( q_seri(i,k) - qx(i,k,ivap) ) / dtime
4050         d_qx(i,k,iliq) = ( ql_seri(i,k) - qx(i,k,iliq) ) / dtime
4051      ENDDO
4052      ENDDO
4053!c
4054      IF (nqtot.GE.3) THEN
4055      DO iq = 3, nqtot
4056      DO  k = 1, klev
4057      DO  i = 1, klon
4058         d_qx(i,k,iq) = ( tr_seri(i,k,iq-2) - qx(i,k,iq) ) / dtime
4059      ENDDO
4060      ENDDO
4061      ENDDO
4062      ENDIF
4063!c
4064!IM rajout diagnostiques bilan KP pour analyse MJO par Jun-Ichi Yano
4065!IM global posePB#include "write_bilKP_ins.h"
4066!IM global posePB#include "write_bilKP_ave.h"
4067!c
4068
4069!c Sauvegarder les valeurs de t et q a la fin de la physique:
4070!c
4071      DO k = 1, klev
4072      DO i = 1, klon
4073         u_ancien(i,k) = u_seri(i,k)
4074         v_ancien(i,k) = v_seri(i,k)
4075         t_ancien(i,k) = t_seri(i,k)
4076         q_ancien(i,k) = q_seri(i,k)
4077      ENDDO
4078      ENDDO
4079
4080!!! RomP >>>
4081      IF (nqtot.GE.3) THEN
4082        DO iq = 3, nqtot
4083        DO k = 1, klev
4084        DO i = 1, klon
4085           tr_ancien(i,k,iq-2) = tr_seri(i,k,iq-2)
4086        ENDDO
4087        ENDDO
4088        ENDDO
4089      ENDIF
4090!!! RomP <<<
4091!==========================================================================
4092! Sorties des tendances pour un point particulier
4093! a utiliser en 1D, avec igout=1 ou en 3D sur un point particulier
4094! pour le debug
4095! La valeur de igout est attribuee plus haut dans le programme
4096!==========================================================================
4097
4098      if (prt_level.ge.1) then
4099      write(lunout,*) 'FIN DE PHYSIQ !!!!!!!!!!!!!!!!!!!!'
4100      write(lunout,*)                                                                &
4101       & 'nlon,klev,nqtot,debut,lafin,jD_cur, jH_cur, pdtphys pct tlos'
4102      write(lunout,*)                                                                &
4103       &  nlon,klev,nqtot,debut,lafin, jD_cur, jH_cur ,pdtphys,                      &
4104       &  pctsrf(igout,is_ter), pctsrf(igout,is_lic),pctsrf(igout,is_oce),           &
4105       &  pctsrf(igout,is_sic)
4106      write(lunout,*) 'd_t_dyn,d_t_con,d_t_lsc,d_t_ajsb,d_t_ajs,d_t_eva'
4107      do k=1,klev
4108         write(lunout,*) d_t_dyn(igout,k),d_t_con(igout,k),                          &
4109       &   d_t_lsc(igout,k),d_t_ajsb(igout,k),d_t_ajs(igout,k),                      &
4110       &   d_t_eva(igout,k)
4111      enddo
4112      write(lunout,*) 'cool,heat'
4113      do k=1,klev
4114         write(lunout,*) cool(igout,k),heat(igout,k)
4115      enddo
4116
4117      write(lunout,*) 'd_t_oli,d_t_vdf,d_t_oro,d_t_lif,d_t_ec'
4118      do k=1,klev
4119         write(lunout,*) d_t_oli(igout,k),d_t_vdf(igout,k),                          &
4120       & d_t_oro(igout,k),d_t_lif(igout,k),d_t_ec(igout,k)
4121      enddo
4122
4123      write(lunout,*) 'd_ps ',d_ps(igout)
4124      write(lunout,*) 'd_u, d_v, d_t, d_qx1, d_qx2 '
4125      do k=1,klev,klon
4126         write(lunout,*) d_u(igout,k),d_v(igout,k),d_t(igout,k),                     &
4127       &  d_qx(igout,k,1),d_qx(igout,k,2)
4128      enddo
4129      endif
4130
4131!==========================================================================
4132
4133!c============================================================
4134!c   Calcul de la temperature potentielle
4135!c============================================================
4136      DO k = 1, klev
4137      DO i = 1, klon
4138!cJYG/IM theta en debut du pas de temps
4139!cJYG/IM       theta(i,k)=t(i,k)*(100000./pplay(i,k))**(RD/RCPD)
4140!cJYG/IM theta en fin de pas de temps de physique
4141        theta(i,k)=t_seri(i,k)*(100000./pplay(i,k))**(RD/RCPD)
4142!c thetal: 2 lignes suivantes a decommenter si vous avez les fichiers     MPL 20130625
4143!c fth_fonctions.F90 et parkind1.F90
4144!c sinon thetal=theta
4145!c       thetal(i,k)=fth_thetal(pplay(i,k),t_seri(i,k),q_seri(i,k),
4146!c    :         ql_seri(i,k))
4147        thetal(i,k)=theta(i,k)
4148      ENDDO
4149      ENDDO
4150!c
4151
4152!c 22.03.04 BEG
4153!c=============================================================
4154!c   Ecriture des sorties
4155!c=============================================================
4156#ifdef CPP_IOIPSL
4157 
4158!c Recupere des varibles calcule dans differents modules
4159!c pour ecriture dans histxxx.nc
4160
4161      ! Get some variables from module fonte_neige_mod
4162!L. Fita, LMD. November 2013
4163!! It is not working after removing starphy.nc and limit.nc?
4164      CALL fonte_neige_get_vars(pctsrf,                                              &
4165       &     zxfqcalving, zxfqfonte, zxffonte)
4166
4167
4168
4169!c=============================================================
4170! Separation entre thermiques et non thermiques dans les sorties
4171! de fisrtilp
4172!c=============================================================
4173
4174      if (iflag_thermals>=1) then
4175      d_t_lscth=0.
4176      d_t_lscst=0.
4177      d_q_lscth=0.
4178      d_q_lscst=0.
4179      do k=1,klev
4180         do i=1,klon
4181            if (ptconvth(i,k)) then
4182                d_t_lscth(i,k)=d_t_eva(i,k)+d_t_lsc(i,k)
4183                d_q_lscth(i,k)=d_q_eva(i,k)+d_q_lsc(i,k)
4184            else
4185                d_t_lscst(i,k)=d_t_eva(i,k)+d_t_lsc(i,k)
4186                d_q_lscst(i,k)=d_q_eva(i,k)+d_q_lsc(i,k)
4187            endif
4188         enddo
4189      enddo
4190
4191      do i=1,klon
4192      plul_st(i)=prfl(i,lmax_th(i)+1)+psfl(i,lmax_th(i)+1)
4193      plul_th(i)=prfl(i,1)+psfl(i,1)
4194      enddo
4195      endif
4196
4197      PRINT *,'  Lluis WRITING outputs! itap: ',itap,' itau_phy: ',itau_phy,         &
4198        ' itau_w: ',itau_w
4199      PRINT *,'  Lluis writting outputs qsol: ',qsol(llp),    &
4200        ' ftsol: ',ftsol(llp,:)
4201
4202#include "phys_output_write_new.h"
4203
4204
4205#ifdef histISCCP
4206#include "write_histISCCP.h"
4207#endif
4208
4209      PRINT *,'  Lluis WRITING histfiles!'
4210
4211#ifdef histNMC
4212#include "write_histhfNMC.h"
4213#include "write_histdayNMC.h"
4214#include "write_histmthNMC.h"
4215#endif
4216
4217#include "write_histday_seri.h"
4218
4219#include "write_paramLMDZ_phy.h"
4220
4221#endif
4222
4223!c 22.03.04 END
4224!c
4225!c====================================================================
4226!c Si c'est la fin, il faut conserver l'etat de redemarrage
4227!c====================================================================
4228!c
4229
4230!c        -----------------------------------------------------------------
4231!c        WSTATS: Saving statistics
4232!c        -----------------------------------------------------------------
4233!c        ("stats" stores and accumulates 8 key variables in file "stats.nc"
4234!c        which can later be used to make the statistic files of the run:
4235!c        "stats")          only possible in 3D runs !
4236
4237         
4238         IF (callstats) THEN
4239
4240           call wstats(klon,o_psol%name,"Surface pressure","Pa"                      &
4241       &                 ,2,paprs(:,1))
4242           call wstats(klon,o_tsol%name,"Surface temperature","K",                   &
4243       &                 2,zxtsol)
4244           zx_tmp_fi2d(:) = rain_fall(:) + snow_fall(:)
4245           call wstats(klon,o_precip%name,"Precip Totale liq+sol",                   &
4246       &                 "kg/(s*m2)",2,zx_tmp_fi2d)
4247           zx_tmp_fi2d(:) = rain_lsc(:) + snow_lsc(:)
4248           call wstats(klon,o_plul%name,"Large-scale Precip",                        &
4249       &                 "kg/(s*m2)",2,zx_tmp_fi2d)
4250           zx_tmp_fi2d(:) = rain_con(:) + snow_con(:)
4251           call wstats(klon,o_pluc%name,"Convective Precip",                         &
4252       &                 "kg/(s*m2)",2,zx_tmp_fi2d)
4253           call wstats(klon,o_sols%name,"Solar rad. at surf.",                       &
4254       &                 "W/m2",2,solsw)
4255           call wstats(klon,o_soll%name,"IR rad. at surf.",                          &
4256       &                 "W/m2",2,sollw)
4257          zx_tmp_fi2d(:) = topsw(:)-toplw(:)
4258          call wstats(klon,o_nettop%name,"Net dn radiatif flux at TOA",              &
4259       &                 "W/m2",2,zx_tmp_fi2d)
4260
4261
4262
4263           call wstats(klon,o_temp%name,"Air temperature","K",                       &
4264       &                 3,t_seri)
4265           call wstats(klon,o_vitu%name,"Zonal wind","m.s-1",                        &
4266       &                 3,u_seri)
4267           call wstats(klon,o_vitv%name,"Meridional wind",                           &
4268       &                "m.s-1",3,v_seri)
4269           call wstats(klon,o_vitw%name,"Vertical wind",                             &
4270       &                "m.s-1",3,omega)
4271           call wstats(klon,o_ovap%name,"Specific humidity", "kg/kg",                &
4272       &                 3,q_seri)
4273 
4274
4275
4276           IF(lafin) THEN
4277             write (*,*) "Writing stats..."
4278             call mkstats(ierr)
4279           ENDIF
4280
4281         ENDIF !if callstats
4282
4283      IF (lafin) THEN
4284         itau_phy = itau_phy + itap
4285         CALL phyredem ("restartphy.nc")
4286!         open(97,form="unformatted",file="finbin")
4287!         write(97) u_seri,v_seri,t_seri,q_seri
4288!         close(97)
4289!$OMP MASTER
4290         if (read_climoz >= 1) then
4291            if (is_mpi_root) then
4292               call nf95_close(ncid_climoz)
4293            end if
4294            deallocate(press_climoz) ! pointer
4295         end if
4296!$OMP END MASTER
4297      ENDIF
4298     
4299!      first=.false.
4300
4301! Lluis
4302  PRINT *,'  Lluis: ',klev,'  UBOUNDS: ',UBOUND(t_seri), UBOUND(u_seri),             &
4303    UBOUND(d_q_con), UBOUND(d_t_con)
4304  PRINT *,'  Lluis llp ',llp,' itap: ',itap,' zlev t_seri u_seri d_q_con d_t_con_____'
4305  DO i=1,klev
4306     PRINT *,i,t_seri(llp,i), u_seri(llp,i), d_q_con(llp,i), d_t_con(llp,i)
4307  END DO
4308
4309
4310      RETURN
4311      END SUBROUTINE physiq
4312
4313      FUNCTION qcheck(klon,klev,paprs,q,ql,aire)
4314      IMPLICIT none
4315!c
4316!c Calculer et imprimer l'eau totale. A utiliser pour verifier
4317!c la conservation de l'eau
4318!c
4319#include "YOMCST.h"
4320      INTEGER klon,klev
4321      REAL paprs(klon,klev+1), q(klon,klev), ql(klon,klev)
4322      REAL aire(klon)
4323      REAL qtotal, zx, qcheck
4324      INTEGER i, k
4325!c
4326      zx = 0.0
4327      DO i = 1, klon
4328         zx = zx + aire(i)
4329      ENDDO
4330      qtotal = 0.0
4331      DO k = 1, klev
4332      DO i = 1, klon
4333         qtotal = qtotal + (q(i,k)+ql(i,k)) * aire(i)                                &
4334       &                     *(paprs(i,k)-paprs(i,k+1))/RG
4335      ENDDO
4336      ENDDO
4337!c
4338      qcheck = qtotal/zx
4339!c
4340      RETURN
4341      END
4342
4343      SUBROUTINE gr_fi_ecrit(nfield,nlon,iim,jjmp1,fi,ecrit)
4344      IMPLICIT none
4345!c
4346!c Tranformer une variable de la grille physique a
4347!c la grille d'ecriture
4348!c
4349      INTEGER nfield,nlon,iim,jjmp1, jjm
4350      REAL fi(nlon,nfield), ecrit(iim*jjmp1,nfield)
4351!c
4352      INTEGER i, n, ig
4353!c
4354      jjm = jjmp1 - 1
4355      DO n = 1, nfield
4356         DO i=1,iim
4357            ecrit(i,n) = fi(1,n)
4358            ecrit(i+jjm*iim,n) = fi(nlon,n)
4359         ENDDO
4360         DO ig = 1, nlon - 2
4361           ecrit(iim+ig,n) = fi(1+ig,n)
4362         ENDDO
4363      ENDDO
4364      RETURN
4365      END SUBROUTINE gr_fi_ecrit
4366
4367SUBROUTINE check_var3D(funcn, varn, var, sizev, zsize, bigvalue, stoprun)
4368!  Subroutine to check the consistency of a 3D LMDSZ - variable (klon, klev) !
4369!    * NaN value: by definition is variable /= variable
4370!    * bigvalue: threshold for the variable
4371
4372  IMPLICIT NONE
4373
4374#include "dimensions.h"
4375
4376  INTEGER, INTENT(IN)                                    :: sizev, zsize
4377  CHARACTER(LEN=50), INTENT(IN)                          :: funcn, varn
4378  REAL, DIMENSION(sizev,zsize), INTENT(IN)               :: var
4379  REAL, INTENT(IN)                                       :: bigvalue
4380  LOGICAL, INTENT(IN)                                    :: stoprun
4381
4382! Local
4383  INTEGER                                                :: i, k, wrongi, xpt, ypt
4384  CHARACTER(LEN=50)                                      :: errmsg
4385  LOGICAL                                                :: found
4386  REAL, DIMENSION(sizev*zsize)                           :: wrongvalues
4387  INTEGER, DIMENSION(sizev,2)                            :: wronggridpt
4388
4389!!!!!!! Variables
4390! funcn: at which functino of part of the program variable is checked
4391! varn: name of the variable
4392! var: variable to check
4393! sizev: size of the variable
4394! zsize: vertical size of the variable
4395! bigvalue: biggest attenaible value for the variable
4396! stoprun: Should the run stop if it founds a problem?
4397
4398  errmsg = 'ERROR -- error -- ERROR -- error'
4399
4400  found = .FALSE.
4401  wrongi = 0
4402  DO i=1,sizev
4403    DO k=1,zsize
4404      IF (var(i,k) /= var(i,k) .OR. ABS(var(i,k)) > bigvalue ) THEN
4405        IF (wrongi == 0) found = .TRUE.
4406        wrongi = wrongi + 1
4407        wrongvalues(wrongi) = var(i,k)
4408        wronggridpt(wrongi,1) = i
4409        wronggridpt(wrongi,2) = k
4410      END IF
4411    END DO
4412  END DO
4413
4414  IF (found) THEN
4415    PRINT *,TRIM(errmsg)
4416    PRINT *,"  at '" // TRIM(funcn) // "' variable '" //TRIM(varn)//                 &
4417      "' is wrong in Nvalues= ",wrongi,' at i (x,y) k value___'
4418    DO i=1,wrongi
4419       ypt = INT(wronggridpt(i,1)/wiim) + 1
4420       xpt = wronggridpt(i,1) - (ypt-1)*wiim
4421      PRINT *,wronggridpt(i,1), '(',xpt,', ',ypt,')', wronggridpt(i,2), wrongvalues(i)
4422    END DO
4423    IF (stoprun) THEN
4424      STOP
4425    END IF
4426  END IF
4427
4428  RETURN
4429
4430END SUBROUTINE check_var3D
4431
Note: See TracBrowser for help on using the repository browser.