source: LMDZ6/trunk/libf/phylmd/physiq_mod.F90 @ 3178

Last change on this file since 3178 was 3178, checked in by jyg, 6 years ago

Bug fix concerning the effect of thermals on wakes
when thermals are allowed only outside wakes.

  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 168.6 KB
Line 
1!
2! $Id: physiq_mod.F90 3178 2018-02-03 07:58:10Z jyg $
3!
4!#define IO_DEBUG
5MODULE physiq_mod
6
7  IMPLICIT NONE
8
9CONTAINS
10
11  SUBROUTINE physiq (nlon,nlev, &
12       debut,lafin,pdtphys_, &
13       paprs,pplay,pphi,pphis,presnivs, &
14       u,v,rot,t,qx, &
15       flxmass_w, &
16       d_u, d_v, d_t, d_qx, d_ps)
17
18    use assert_m, only: assert
19    USE ioipsl, only: histbeg, histvert, histdef, histend, histsync, &
20         histwrite, ju2ymds, ymds2ju, getin
21    USE geometry_mod, ONLY: cell_area, latitude_deg, longitude_deg
22    USE phys_cal_mod, only: year_len, mth_len, days_elapsed, jh_1jan, &
23         year_cur, mth_cur,jD_cur, jH_cur, jD_ref, day_cur, hour
24    USE write_field_phy
25    USE dimphy
26    USE infotrac_phy, ONLY: nqtot, nbtr, nqo, type_trac
27    USE mod_grid_phy_lmdz, ONLY: nbp_lon, nbp_lat, nbp_lev, klon_glo
28    USE mod_phys_lmdz_para
29    USE iophy
30    USE print_control_mod, ONLY: mydebug=>debug , lunout, prt_level
31    USE phystokenc_mod, ONLY: offline, phystokenc
32    USE time_phylmdz_mod, only: raz_date, day_step_phy, update_time,current_time
33    USE vampir
34    USE pbl_surface_mod, ONLY : pbl_surface
35    USE change_srf_frac_mod
36    USE surface_data,     ONLY : type_ocean, ok_veget, ok_snow
37    USE tropopause_m,     ONLY: dyn_tropopause
38#ifdef CPP_Dust
39    USE phytracr_spl_mod, ONLY: phytracr_spl
40#endif
41    USE phys_local_var_mod, ONLY: phys_local_var_init, phys_local_var_end, &
42       ! [Variables internes non sauvegardees de la physique]
43       ! Variables locales pour effectuer les appels en serie
44       t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,tr_seri, &
45       ! Dynamic tendencies (diagnostics)
46       d_t_dyn,d_q_dyn,d_ql_dyn,d_qs_dyn,d_u_dyn,d_v_dyn,d_tr_dyn, &
47       d_q_dyn2d,d_ql_dyn2d,d_qs_dyn2d, &
48       ! Physic tendencies
49       d_t_con,d_q_con,d_u_con,d_v_con, &
50       d_tr, &                              !! to be removed?? (jyg)
51       d_t_wake,d_q_wake, &
52       d_t_lwr,d_t_lw0,d_t_swr,d_t_sw0, &
53       d_t_ajsb,d_q_ajsb, &
54       d_t_ajs,d_q_ajs,d_u_ajs,d_v_ajs, &
55       d_t_ajs_w,d_q_ajs_w, &
56       d_t_ajs_x,d_q_ajs_x, &
57       !
58       d_t_eva,d_q_eva,d_ql_eva,d_qi_eva, &
59       d_t_lsc,d_q_lsc,d_ql_lsc,d_qi_lsc, &
60       d_t_lscst,d_q_lscst, &
61       d_t_lscth,d_q_lscth, &
62       plul_st,plul_th, &
63       !
64       d_t_vdf,d_q_vdf,d_u_vdf,d_v_vdf,d_t_diss, &
65       d_t_vdf_w,d_q_vdf_w, &
66       d_t_vdf_x,d_q_vdf_x, &
67       d_ts, &
68       !
69       d_t_oli,d_u_oli,d_v_oli, &
70       d_t_oro,d_u_oro,d_v_oro, &
71       d_t_oro_gw,d_u_oro_gw,d_v_oro_gw, &
72       d_t_lif,d_u_lif,d_v_lif, &
73       d_t_ec, &
74       !
75       du_gwd_hines,dv_gwd_hines,d_t_hin, &
76       dv_gwd_rando,dv_gwd_front, &
77       east_gwstress,west_gwstress, &
78       d_q_ch4, &
79       !  Special RRTM
80       ZLWFT0_i,ZSWFT0_i,ZFLDN0,  &
81       ZFLUP0,ZFSDN0,ZFSUP0,      &
82       !
83       topswad_aero,solswad_aero,   &
84       topswai_aero,solswai_aero,   &
85       topswad0_aero,solswad0_aero, &
86       !LW additional
87       toplwad_aero,sollwad_aero,   &
88       toplwai_aero,sollwai_aero,   &
89       toplwad0_aero,sollwad0_aero, &
90       !
91       topsw_aero,solsw_aero,       &
92       topsw0_aero,solsw0_aero,     &
93       topswcf_aero,solswcf_aero,   &
94       tausum_aero,tau3d_aero,      &
95       drytausum_aero,              &
96       !
97       !variables CFMIP2/CMIP5
98       topswad_aerop, solswad_aerop,   &
99       topswai_aerop, solswai_aerop,   &
100       topswad0_aerop, solswad0_aerop, &
101       topsw_aerop, topsw0_aerop,      &
102       solsw_aerop, solsw0_aerop,      &
103       topswcf_aerop, solswcf_aerop,   &
104       !LW diagnostics
105       toplwad_aerop, sollwad_aerop,   &
106       toplwai_aerop, sollwai_aerop,   &
107       toplwad0_aerop, sollwad0_aerop, &
108       !
109       ptstar, pt0, slp, &
110       !
111       bils, &
112       !
113       cldh, cldl,cldm, cldq, cldt,      &
114       JrNt,                             &
115       dthmin, evap, fder, plcl, plfc,   &
116       prw, prlw, prsw,                  &
117       s_lcl, s_pblh, s_pblt, s_therm,   &
118       cdragm, cdragh,                   &
119       zustar, zu10m, zv10m, rh2m, qsat2m, &
120       zq2m, zt2m, weak_inversion, &
121       zt2m_min_mon, zt2m_max_mon,   &         ! pour calcul_divers.h
122       t2m_min_mon, t2m_max_mon,  &            ! pour calcul_divers.h
123       !
124       s_pblh_x, s_pblh_w, &
125       s_lcl_x, s_lcl_w,   &
126       !
127       slab_wfbils, tpot, tpote,               &
128       ue, uq, ve, vq, zxffonte,               &
129       zxfqcalving, zxfluxlat,                 &
130       zxrunofflic,                            &
131       zxtsol, snow_lsc, zxfqfonte, zxqsurf,   &
132       rain_lsc, rain_num,                     &
133       !
134       sens_x, sens_w, &
135       zxfluxlat_x, zxfluxlat_w, &
136       !
137       dtvdf_x, dtvdf_w, &
138       dqvdf_x, dqvdf_w, &
139       pbl_tke_input, &
140       t_therm, q_therm, u_therm, v_therm, &
141       cdragh_x, cdragh_w, &
142       cdragm_x, cdragm_w, &
143       kh, kh_x, kh_w, &
144       !
145       wake_k, &
146       alp_wake, &
147       wake_h, wake_omg, &
148                       ! tendencies of delta T and delta q:
149       d_deltat_wk, d_deltaq_wk, &         ! due to wakes
150       d_deltat_wk_gw, d_deltaq_wk_gw, &   ! due to wake induced gravity waves
151       d_deltat_vdf, d_deltaq_vdf, &       ! due to vertical diffusion
152       d_deltat_the, d_deltaq_the, &       ! due to thermals
153       d_deltat_ajs_cv, d_deltaq_ajs_cv, & ! due to dry adjustment of (w) before convection
154                       ! tendencies of wake fractional area and wake number per unit area:
155       d_s_wk,  d_dens_wk, &             ! due to wakes
156!!!       d_s_vdf, d_dens_vdf, &            ! due to vertical diffusion
157!!!       d_s_the, d_dens_the, &            ! due to thermals
158       !                                 
159       ptconv, ratqsc, &
160       wbeff, convoccur, zmax_th, &
161       sens, flwp, fiwp,  &
162       alp_bl_conv,alp_bl_det,  &
163       alp_bl_fluct_m,alp_bl_fluct_tke,  &
164       alp_bl_stat, n2, s2,  &
165       proba_notrig, random_notrig,  &
166       !
167       dnwd0,  &
168       omega,  &
169       epmax_diag,  &
170
171       !    Deep convective variables used in phytrac
172       pmflxr, pmflxs,  &
173       wdtrainA, wdtrainM,  &
174       upwd, dnwd, &
175       ep,  &
176       da, mp, &
177       phi, &
178       wght_cvfd, &
179       phi2, &
180       d1a, dam, &
181       ev, &
182       elij, &
183       clw, &
184       epmlmMm, eplaMm, &
185       sij, &
186
187       cldemi,  &
188       cldfra, cldtau, fiwc,  &
189       fl, re, flwc,  &
190       ref_liq, ref_ice, theta,  &
191       ref_liq_pi, ref_ice_pi,  &
192       zphi, zx_rh,  &
193       pmfd, pmfu,  &
194       !
195       t2m, fluxlat,  &
196       fsollw, evap_pot,  &
197       fsolsw, wfbils, wfbilo,  &
198       wfevap, wfrain, wfsnow,  & 
199       prfl, psfl, fraca, Vprecip,  &
200       zw2,  &
201       
202       fluxu, fluxv,  &
203       fluxt,  &
204
205       uwriteSTD, vwriteSTD, &                !pour calcul_STDlev.h
206       wwriteSTD, phiwriteSTD, &              !pour calcul_STDlev.h
207       qwriteSTD, twriteSTD, rhwriteSTD, &    !pour calcul_STDlev.h
208       
209       beta_prec,  &
210       rneb,  &
211       zxsnow,snowhgt,qsnow,to_ice,sissnow,runoff,albsol3_lic
212       !
213    USE phys_state_var_mod ! Variables sauvegardees de la physique
214#ifdef CPP_Dust
215  USE phys_output_write_spl_mod
216#else
217    USE phys_output_var_mod ! Variables pour les ecritures des sorties
218#endif
219
220    USE phys_output_write_mod
221    USE fonte_neige_mod, ONLY  : fonte_neige_get_vars
222    USE phys_output_mod
223    USE phys_output_ctrlout_mod
224    use open_climoz_m, only: open_climoz ! ozone climatology from a file
225    use regr_pr_time_av_m, only: regr_pr_time_av
226    use netcdf95, only: nf95_close
227    !IM for NMC files
228    !     use netcdf, only: nf90_fill_real
229    use netcdf, only: nf90_fill_real
230    use mod_phys_lmdz_mpi_data, only: is_mpi_root
231    USE aero_mod
232    use ozonecm_m, only: ozonecm ! ozone of J.-F. Royer
233    use conf_phys_m, only: conf_phys
234    use radlwsw_m, only: radlwsw
235    use phyaqua_mod, only: zenang_an
236    USE time_phylmdz_mod, only: day_step_phy, annee_ref, day_ref, itau_phy, &
237         start_time, pdtphys, day_ini
238    USE tracinca_mod, ONLY: config_inca
239#ifdef CPP_XIOS
240    USE wxios, ONLY: missing_val, missing_val_omp
241    USE xios, ONLY: xios_get_field_attr, xios_field_is_active
242#endif
243#ifdef REPROBUS
244    USE CHEM_REP, ONLY : Init_chem_rep_xjour
245#endif
246    USE indice_sol_mod
247    USE phytrac_mod, ONLY : phytrac
248
249#ifdef CPP_RRTM
250    USE YOERAD, ONLY : NRADLP
251    USE YOESW, ONLY : RSUN
252#endif
253    USE ioipsl_getin_p_mod, ONLY : getin_p
254
255#ifndef CPP_XIOS
256    USE paramLMDZ_phy_mod
257#endif
258
259    USE cmp_seri_mod
260    USE add_phys_tend_mod, only : add_pbl_tend, add_phys_tend, diag_phys_tend, prt_enerbil, &
261  &      fl_ebil, fl_cor_ebil
262
263    !IM stations CFMIP
264    USE CFMIP_point_locations
265    use FLOTT_GWD_rando_m, only: FLOTT_GWD_rando
266    use ACAMA_GWD_rando_m, only: ACAMA_GWD_rando
267    USE VERTICAL_LAYERS_MOD, ONLY: aps,bps
268
269
270    IMPLICIT none
271    !>======================================================================
272    !!
273    !! Auteur(s) Z.X. Li (LMD/CNRS) date: 19930818
274    !!
275    !! Objet: Moniteur general de la physique du modele
276    !!AA      Modifications quant aux traceurs :
277    !!AA                  -  uniformisation des parametrisations ds phytrac
278    !!AA                  -  stockage des moyennes des champs necessaires
279    !!AA                     en mode traceur off-line
280    !!======================================================================
281    !!   CLEFS CPP POUR LES IO
282    !!   =====================
283#define histNMC
284    !!======================================================================
285    !!    modif   ( P. Le Van ,  12/10/98 )
286    !!
287    !!  Arguments:
288    !!
289    !! nlon----input-I-nombre de points horizontaux
290    !! nlev----input-I-nombre de couches verticales, doit etre egale a klev
291    !! debut---input-L-variable logique indiquant le premier passage
292    !! lafin---input-L-variable logique indiquant le dernier passage
293    !! jD_cur       -R-jour courant a l'appel de la physique (jour julien)
294    !! jH_cur       -R-heure courante a l'appel de la physique (jour julien)
295    !! pdtphys-input-R-pas d'integration pour la physique (seconde)
296    !! paprs---input-R-pression pour chaque inter-couche (en Pa)
297    !! pplay---input-R-pression pour le mileu de chaque couche (en Pa)
298    !! pphi----input-R-geopotentiel de chaque couche (g z) (reference sol)
299    !! pphis---input-R-geopotentiel du sol
300    !! presnivs-input_R_pressions approximat. des milieux couches ( en PA)
301    !! u-------input-R-vitesse dans la direction X (de O a E) en m/s
302    !! v-------input-R-vitesse Y (de S a N) en m/s
303    !! t-------input-R-temperature (K)
304    !! qx------input-R-humidite specifique (kg/kg) et d'autres traceurs
305    !! d_t_dyn-input-R-tendance dynamique pour "t" (K/s)
306    !! d_q_dyn-input-R-tendance dynamique pour "q" (kg/kg/s)
307    !! d_ql_dyn-input-R-tendance dynamique pour "ql" (kg/kg/s)
308    !! d_qs_dyn-input-R-tendance dynamique pour "qs" (kg/kg/s)
309    !! flxmass_w -input-R- flux de masse verticale
310    !! d_u-----output-R-tendance physique de "u" (m/s/s)
311    !! d_v-----output-R-tendance physique de "v" (m/s/s)
312    !! d_t-----output-R-tendance physique de "t" (K/s)
313    !! d_qx----output-R-tendance physique de "qx" (kg/kg/s)
314    !! d_ps----output-R-tendance physique de la pression au sol
315    !!======================================================================
316    integer jjmp1
317    !  parameter (jjmp1=jjm+1-1/jjm) ! => (jjmp1=nbp_lat-1/(nbp_lat-1))
318    !  integer iip1
319    !  parameter (iip1=iim+1)
320
321    include "regdim.h"
322    include "dimsoil.h"
323    include "clesphys.h"
324    include "thermcell.h"
325    include "dimpft.h"
326    !======================================================================
327    LOGICAL ok_cvl  ! pour activer le nouveau driver pour convection KE
328    PARAMETER (ok_cvl=.TRUE.)
329    LOGICAL ok_gust ! pour activer l'effet des gust sur flux surface
330    PARAMETER (ok_gust=.FALSE.)
331    integer iflag_radia     ! active ou non le rayonnement (MPL)
332    save iflag_radia
333    !$OMP THREADPRIVATE(iflag_radia)
334    !======================================================================
335    LOGICAL check ! Verifier la conservation du modele en eau
336    PARAMETER (check=.FALSE.)
337    LOGICAL ok_stratus ! Ajouter artificiellement les stratus
338    PARAMETER (ok_stratus=.FALSE.)
339    !======================================================================
340    REAL amn, amx
341    INTEGER igout
342    !======================================================================
343    ! Clef controlant l'activation du cycle diurne:
344    ! en attente du codage des cles par Fred
345    INTEGER iflag_cycle_diurne
346    PARAMETER (iflag_cycle_diurne=1)
347    !======================================================================
348    ! Modele thermique du sol, a activer pour le cycle diurne:
349    !cc      LOGICAL soil_model
350    !cc      PARAMETER (soil_model=.FALSE.)
351    !======================================================================
352    ! Dans les versions precedentes, l'eau liquide nuageuse utilisee dans
353    ! le calcul du rayonnement est celle apres la precipitation des nuages.
354    ! Si cette cle new_oliq est activee, ce sera une valeur moyenne entre
355    ! la condensation et la precipitation. Cette cle augmente les impacts
356    ! radiatifs des nuages.
357    !cc      LOGICAL new_oliq
358    !cc      PARAMETER (new_oliq=.FALSE.)
359    !======================================================================
360    ! Clefs controlant deux parametrisations de l'orographie:
361    !c      LOGICAL ok_orodr
362    !cc      PARAMETER (ok_orodr=.FALSE.)
363    !cc      LOGICAL ok_orolf
364    !cc      PARAMETER (ok_orolf=.FALSE.)
365    !======================================================================
366    LOGICAL ok_journe ! sortir le fichier journalier
367    save ok_journe
368    !$OMP THREADPRIVATE(ok_journe)
369    !
370    LOGICAL ok_mensuel ! sortir le fichier mensuel
371    save ok_mensuel
372    !$OMP THREADPRIVATE(ok_mensuel)
373    !
374    LOGICAL ok_instan ! sortir le fichier instantane
375    save ok_instan
376    !$OMP THREADPRIVATE(ok_instan)
377    !
378    LOGICAL ok_LES ! sortir le fichier LES
379    save ok_LES                           
380    !$OMP THREADPRIVATE(ok_LES)                 
381    !
382    LOGICAL callstats ! sortir le fichier stats
383    save callstats                           
384    !$OMP THREADPRIVATE(callstats)                 
385    !
386    LOGICAL ok_region ! sortir le fichier regional
387    PARAMETER (ok_region=.FALSE.)
388    !======================================================================
389    real seuil_inversion
390    save seuil_inversion
391    !$OMP THREADPRIVATE(seuil_inversion)
392    integer iflag_ratqs
393    save iflag_ratqs
394    !$OMP THREADPRIVATE(iflag_ratqs)
395    real facteur
396
397    REAL wmax_th(klon)
398    REAL tau_overturning_th(klon)
399
400    integer lmax_th(klon)
401    integer limbas(klon)
402    real ratqscth(klon,klev)
403    real ratqsdiff(klon,klev)
404    real zqsatth(klon,klev)
405
406    !======================================================================
407    !
408    INTEGER ivap          ! indice de traceurs pour vapeur d'eau
409    PARAMETER (ivap=1)
410    INTEGER iliq          ! indice de traceurs pour eau liquide
411    PARAMETER (iliq=2)
412    !CR: on ajoute la phase glace
413    INTEGER isol          ! indice de traceurs pour eau glace
414    PARAMETER (isol=3)
415    !
416    !
417    ! Variables argument:
418    !
419    INTEGER nlon
420    INTEGER nlev
421    REAL,INTENT(IN) :: pdtphys_
422    ! NB: pdtphys to be used in physics is in time_phylmdz_mod
423    LOGICAL debut, lafin
424    REAL paprs(klon,klev+1)
425    REAL pplay(klon,klev)
426    REAL pphi(klon,klev)
427    REAL pphis(klon)
428    REAL presnivs(klev)
429!JLD    REAL znivsig(klev)
430!JLD    real pir
431
432    REAL u(klon,klev)
433    REAL v(klon,klev)
434
435    REAL, intent(in):: rot(klon, klev)
436    ! relative vorticity, in s-1, needed for frontal waves
437
438    REAL t(klon,klev),thetal(klon,klev)
439    ! thetal: ligne suivante a decommenter si vous avez les fichiers
440    !     MPL 20130625
441    ! fth_fonctions.F90 et parkind1.F90
442    ! sinon thetal=theta
443    !     REAL fth_thetae,fth_thetav,fth_thetal
444    REAL qx(klon,klev,nqtot)
445    REAL flxmass_w(klon,klev)
446    REAL d_u(klon,klev)
447    REAL d_v(klon,klev)
448    REAL d_t(klon,klev)
449    REAL d_qx(klon,klev,nqtot)
450    REAL d_ps(klon)
451  ! variables pour tend_to_tke
452    REAL duadd(klon,klev)
453    REAL dvadd(klon,klev)
454    REAL dtadd(klon,klev)
455
456#ifndef CPP_XIOS
457    REAL, SAVE :: missing_val=nf90_fill_real
458#endif
459!!   Variables moved to phys_local_var_mod
460!!    ! Variables pour le transport convectif
461!!    real da(klon,klev),phi(klon,klev,klev),mp(klon,klev)
462!!    real wght_cvfd(klon,klev)
463!!    ! Variables pour le lessivage convectif
464!!    ! RomP >>>
465!!    real phi2(klon,klev,klev)
466!!    real d1a(klon,klev),dam(klon,klev)
467!!    real ev(klon,klev)
468!!    real clw(klon,klev),elij(klon,klev,klev)
469!!    real epmlmMm(klon,klev,klev),eplaMm(klon,klev)
470!!    ! RomP <<<
471    !IM definition dynamique o_trac dans phys_output_open
472    !      type(ctrl_out) :: o_trac(nqtot)
473
474    ! variables a une pression donnee
475    !
476    include "declare_STDlev.h"
477    !
478    !
479    include "radopt.h"
480    !
481    !
482    INTEGER debug
483    INTEGER n
484    !ym      INTEGER npoints
485    !ym      PARAMETER(npoints=klon)
486    !
487    INTEGER nregISCtot
488    PARAMETER(nregISCtot=1)
489    !
490    ! imin_debut, nbpti, jmin_debut, nbptj : parametres pour sorties
491    ! sur 1 region rectangulaire y compris pour 1 point
492    ! imin_debut : indice minimum de i; nbpti : nombre de points en
493    ! direction i (longitude)
494    ! jmin_debut : indice minimum de j; nbptj : nombre de points en
495    ! direction j (latitude)
496!JLD    INTEGER imin_debut, nbpti
497!JLD    INTEGER jmin_debut, nbptj
498    !IM: region='3d' <==> sorties en global
499    CHARACTER*3 region
500    PARAMETER(region='3d')
501    logical ok_hf
502    !
503    save ok_hf
504    !$OMP THREADPRIVATE(ok_hf)
505
506    INTEGER,PARAMETER :: longcles=20
507    REAL,SAVE :: clesphy0(longcles)
508    !$OMP THREADPRIVATE(clesphy0)
509    !
510    ! Variables propres a la physique
511    INTEGER itap
512    SAVE itap                   ! compteur pour la physique
513    !$OMP THREADPRIVATE(itap)
514
515    INTEGER, SAVE :: abortphy=0   ! Reprere si on doit arreter en fin de phys
516    !$OMP THREADPRIVATE(abortphy)
517    !
518    REAL,save ::  solarlong0
519    !$OMP THREADPRIVATE(solarlong0)
520
521    !
522    !  Parametres de l'Orographie a l'Echelle Sous-Maille (OESM):
523    !
524    !IM 141004     REAL zulow(klon),zvlow(klon),zustr(klon), zvstr(klon)
525    REAL zulow(klon),zvlow(klon)
526    !
527    INTEGER igwd,idx(klon),itest(klon)
528    !
529    !      REAL,allocatable,save :: run_off_lic_0(:)
530    ! !$OMP THREADPRIVATE(run_off_lic_0)
531    !ym      SAVE run_off_lic_0
532    !KE43
533    ! Variables liees a la convection de K. Emanuel (sb):
534    !
535    REAL bas, top             ! cloud base and top levels
536    SAVE bas
537    SAVE top
538    !$OMP THREADPRIVATE(bas, top)
539    !------------------------------------------------------------------
540    ! Upmost level reached by deep convection and related variable (jyg)
541    !
542    INTEGER izero
543    INTEGER k_upper_cv
544    !------------------------------------------------------------------
545    ! Compteur de l'occurence de cvpas=1
546    INTEGER Ncvpaseq1
547    SAVE Ncvpaseq1
548    !$OMP THREADPRIVATE(Ncvpaseq1)
549    !
550    !==========================================================================
551    !CR04.12.07: on ajoute les nouvelles variables du nouveau schema
552    !de convection avec poches froides
553    ! Variables li\'ees \`a la poche froide (jyg)
554
555    REAL mip(klon,klev)  ! mass flux shed by the adiab ascent at each level
556    !
557    REAL wape_prescr, fip_prescr
558    INTEGER it_wape_prescr
559    SAVE wape_prescr, fip_prescr, it_wape_prescr
560    !$OMP THREADPRIVATE(wape_prescr, fip_prescr, it_wape_prescr)
561    !
562    ! variables supplementaires de concvl
563    REAL Tconv(klon,klev)
564!!    variable moved to phys_local_var_mod
565!!    REAL sij(klon,klev,klev)
566!!    !
567!!    ! variables pour tester la conservation de l'energie dans concvl
568!!    REAL, DIMENSION(klon,klev)     :: d_t_con_sat
569!!    REAL, DIMENSION(klon,klev)     :: d_q_con_sat
570!!    REAL, DIMENSION(klon,klev)     :: dql_sat
571
572    real, save :: alp_bl_prescr=0.
573    real, save :: ale_bl_prescr=0.
574
575    real, save :: wake_s_min_lsp=0.1
576
577    !$OMP THREADPRIVATE(alp_bl_prescr,ale_bl_prescr)
578    !$OMP THREADPRIVATE(wake_s_min_lsp)
579
580
581    real ok_wk_lsp(klon)
582
583    !RC
584    ! Variables li\'ees \`a la poche froide (jyg et rr)
585
586    INTEGER,  SAVE               :: iflag_wake_tend  ! wake: if =0, then wake state variables are
587                                                     ! updated within calwake
588    !$OMP THREADPRIVATE(iflag_wake_tend)
589    INTEGER,  SAVE               :: iflag_alp_wk_cond=0 ! wake: if =0, then Alp_wk is the average lifting
590                                                        ! power provided by the wakes; else, Alp_wk is the
591                                                        ! lifting power conditionned on the presence of a
592                                                        ! gust-front in the grid cell.
593    !$OMP THREADPRIVATE(iflag_alp_wk_cond)
594    REAL t_w(klon,klev),q_w(klon,klev) ! temperature and moisture profiles in the wake region
595    REAL t_x(klon,klev),q_x(klon,klev) ! temperature and moisture profiles in the off-wake region
596
597    REAL wake_dth(klon,klev)        ! wake : temp pot difference
598
599    REAL wake_omgbdth(klon,klev)    ! Wake : flux of Delta_Theta
600    ! transported by LS omega
601    REAL wake_dp_omgb(klon,klev)    ! Wake : vertical gradient of
602    ! large scale omega
603    REAL wake_dtKE(klon,klev)       ! Wake : differential heating
604    ! (wake - unpertubed) CONV
605    REAL wake_dqKE(klon,klev)       ! Wake : differential moistening
606    ! (wake - unpertubed) CONV
607    REAL wake_dp_deltomg(klon,klev) ! Wake : gradient vertical de wake_omg
608    REAL wake_spread(klon,klev)     ! spreading term in wake_delt
609    !
610    !pourquoi y'a pas de save??
611    !
612!!!    INTEGER, SAVE, DIMENSION(klon)   :: wake_k
613!!!    !$OMP THREADPRIVATE(wake_k)
614    !
615    !jyg<
616    !cc      REAL wake_pe(klon)              ! Wake potential energy - WAPE
617    !>jyg
618
619    REAL wake_fip_0(klon)           ! Average Front Incoming Power (unconditionned)
620    REAL wake_gfl(klon)             ! Gust Front Length
621!!!    REAL wake_dens(klon)         ! moved to phys_state_var_mod
622    !
623    !
624    REAL dt_dwn(klon,klev)
625    REAL dq_dwn(klon,klev)
626    REAL M_dwn(klon,klev)
627    REAL M_up(klon,klev)
628    REAL dt_a(klon,klev)
629    REAL dq_a(klon,klev)
630    REAL d_t_adjwk(klon,klev)                !jyg
631    REAL d_q_adjwk(klon,klev)                !jyg
632    LOGICAL,SAVE :: ok_adjwk=.FALSE.
633    !$OMP THREADPRIVATE(ok_adjwk)
634    INTEGER,SAVE :: iflag_adjwk=0            !jyg
635    !$OMP THREADPRIVATE(iflag_adjwk)         !jyg
636    REAL,SAVE :: oliqmax=999.,oicemax=999.
637    !$OMP THREADPRIVATE(oliqmax,oicemax)
638    REAL, SAVE :: alp_offset
639    !$OMP THREADPRIVATE(alp_offset)
640    REAL, SAVE :: dtcon_multistep_max=1.e6
641    !$OMP THREADPRIVATE(dtcon_multistep_max)
642    REAL, SAVE :: dqcon_multistep_max=1.e6
643    !$OMP THREADPRIVATE(dqcon_multistep_max)
644
645 
646    !
647    !RR:fin declarations poches froides
648    !==========================================================================
649
650    REAL ztv(klon,klev),ztva(klon,klev)
651    REAL zpspsk(klon,klev)
652    REAL ztla(klon,klev),zqla(klon,klev)
653    REAL zthl(klon,klev)
654
655    !cc nrlmd le 10/04/2012
656
657    !--------Stochastic Boundary Layer Triggering: ALE_BL--------
658    !---Propri\'et\'es du thermiques au LCL
659    real zlcl_th(klon)          ! Altitude du LCL calcul\'e
660    ! continument (pcon dans
661    ! thermcell_main.F90)
662    real fraca0(klon)           ! Fraction des thermiques au LCL
663    real w0(klon)               ! Vitesse des thermiques au LCL
664    real w_conv(klon)           ! Vitesse verticale de grande \'echelle au LCL
665    real tke0(klon,klev+1)      ! TKE au d\'ebut du pas de temps
666    real therm_tke_max0(klon)   ! TKE dans les thermiques au LCL
667    real env_tke_max0(klon)     ! TKE dans l'environnement au LCL
668
669!JLD    !---D\'eclenchement stochastique
670!JLD    integer :: tau_trig(klon)
671
672    REAL,SAVE :: random_notrig_max=1.
673    !$OMP THREADPRIVATE(random_notrig_max)
674
675    !--------Statistical Boundary Layer Closure: ALP_BL--------
676    !---Profils de TKE dans et hors du thermique
677    real therm_tke_max(klon,klev)   ! Profil de TKE dans les thermiques
678    real env_tke_max(klon,klev)     ! Profil de TKE dans l'environnement
679
680    !-------Activer les tendances de TKE due a l'orograp??ie---------
681     INTEGER, SAVE :: addtkeoro
682    !$OMP THREADPRIVATE(addtkeoro)
683     REAL, SAVE :: alphatkeoro
684    !$OMP THREADPRIVATE(alphatkeoro)
685     LOGICAL, SAVE :: smallscales_tkeoro
686    !$OMP THREADPRIVATE(smallscales_tkeoro)
687
688
689
690    !cc fin nrlmd le 10/04/2012
691
692    ! Variables locales pour la couche limite (al1):
693    !
694    !Al1      REAL pblh(klon)           ! Hauteur de couche limite
695    !Al1      SAVE pblh
696    !34EK
697    !
698    ! Variables locales:
699    !
700    !AA
701    !AA  Pour phytrac
702    REAL u1(klon)             ! vents dans la premiere couche U
703    REAL v1(klon)             ! vents dans la premiere couche V
704
705    !@$$      LOGICAL offline           ! Controle du stockage ds "physique"
706    !@$$      PARAMETER (offline=.false.)
707    !@$$      INTEGER physid
708    REAL frac_impa(klon,klev) ! fractions d'aerosols lessivees (impaction)
709    REAL frac_nucl(klon,klev) ! idem (nucleation)
710    ! RomP >>>
711    REAL beta_prec_fisrt(klon,klev) ! taux de conv de l'eau cond (fisrt)
712    ! RomP <<<
713    REAL          :: calday
714
715    !IM cf FH pour Tiedtke 080604
716    REAL rain_tiedtke(klon),snow_tiedtke(klon)
717    !
718    !IM 050204 END
719    REAL devap(klon) ! evaporation et sa derivee
720    REAL dsens(klon) ! chaleur sensible et sa derivee
721
722    !
723    ! Conditions aux limites
724    !
725    !
726    REAL :: day_since_equinox
727    ! Date de l'equinoxe de printemps
728    INTEGER, parameter :: mth_eq=3, day_eq=21
729    REAL :: jD_eq
730
731    LOGICAL, parameter :: new_orbit = .true.
732
733    !
734    INTEGER lmt_pas
735    SAVE lmt_pas                ! frequence de mise a jour
736    !$OMP THREADPRIVATE(lmt_pas)
737    real zmasse(klon, nbp_lev),exner(klon, nbp_lev)
738    !     (column-density of mass of air in a cell, in kg m-2)
739    real, parameter:: dobson_u = 2.1415e-05 ! Dobson unit, in kg m-2
740
741    !IM sorties
742    REAL un_jour
743    PARAMETER(un_jour=86400.)
744    INTEGER itapm1 !pas de temps de la physique du(es) mois precedents
745    SAVE itapm1    !mis a jour le dernier pas de temps du mois en cours
746    !$OMP THREADPRIVATE(itapm1)
747    !======================================================================
748    !
749    ! Declaration des procedures appelees
750    !
751    EXTERNAL angle     ! calculer angle zenithal du soleil
752    EXTERNAL alboc     ! calculer l'albedo sur ocean
753    EXTERNAL ajsec     ! ajustement sec
754    EXTERNAL conlmd    ! convection (schema LMD)
755    !KE43
756    EXTERNAL conema3  ! convect4.3
757    EXTERNAL fisrtilp  ! schema de condensation a grande echelle (pluie)
758    !AA
759    ! JBM (3/14) fisrtilp_tr not loaded
760    ! EXTERNAL fisrtilp_tr ! schema de condensation a grande echelle (pluie)
761    !                          ! stockage des coefficients necessaires au
762    !                          ! lessivage OFF-LINE et ON-LINE
763    EXTERNAL hgardfou  ! verifier les temperatures
764    EXTERNAL nuage     ! calculer les proprietes radiatives
765    !C      EXTERNAL o3cm      ! initialiser l'ozone
766    EXTERNAL orbite    ! calculer l'orbite terrestre
767    EXTERNAL phyetat0  ! lire l'etat initial de la physique
768    EXTERNAL phyredem  ! ecrire l'etat de redemarrage de la physique
769    EXTERNAL suphel    ! initialiser certaines constantes
770    EXTERNAL transp    ! transport total de l'eau et de l'energie
771    !IM
772    EXTERNAL haut2bas  !variables de haut en bas
773    EXTERNAL ini_undefSTD  !initialise a 0 une variable a 1 niveau de pression
774    EXTERNAL undefSTD !somme les valeurs definies d'1 var a 1 niveau de pression
775    !     EXTERNAL moy_undefSTD  !moyenne d'1 var a 1 niveau de pression
776    ! EXTERNAL moyglo_aire
777    ! moyenne globale d'1 var ponderee par l'aire de la maille (moyglo_pondaire)
778    ! par la masse/airetot (moyglo_pondaima) et la vraie masse (moyglo_pondmass)
779    !
780    !
781    ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
782    ! Local variables
783    ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
784    !
785    REAL rhcl(klon,klev)    ! humiditi relative ciel clair
786    REAL dialiq(klon,klev)  ! eau liquide nuageuse
787    REAL diafra(klon,klev)  ! fraction nuageuse
788    REAL cldliq(klon,klev)  ! eau liquide nuageuse
789    !
790    !XXX PB
791    REAL fluxq(klon,klev, nbsrf)   ! flux turbulent d'humidite
792    !
793    REAL zxfluxt(klon, klev)
794    REAL zxfluxq(klon, klev)
795    REAL zxfluxu(klon, klev)
796    REAL zxfluxv(klon, klev)
797
798    ! Le rayonnement n'est pas calcule tous les pas, il faut donc
799    !                      sauvegarder les sorties du rayonnement
800    !ym      SAVE  heat,cool,albpla,topsw,toplw,solsw,sollw,sollwdown
801    !ym      SAVE  sollwdownclr, toplwdown, toplwdownclr
802    !ym      SAVE  topsw0,toplw0,solsw0,sollw0, heat0, cool0
803    !
804    INTEGER itaprad
805    SAVE itaprad
806    !$OMP THREADPRIVATE(itaprad)
807    !
808    REAL conv_q(klon,klev) ! convergence de l'humidite (kg/kg/s)
809    REAL conv_t(klon,klev) ! convergence de la temperature(K/s)
810    !
811#ifdef INCA
812    REAL zxsnow_dummy(klon)
813#endif
814    REAL zsav_tsol(klon)
815    !
816    REAL dist, rmu0(klon), fract(klon)
817    REAL zrmu0(klon), zfract(klon)
818    REAL zdtime, zdtime1, zdtime2, zlongi
819    !
820    REAL qcheck
821    REAL z_avant(klon), z_apres(klon), z_factor(klon)
822    LOGICAL zx_ajustq
823    !
824    REAL za
825    REAL zx_t, zx_qs, zdelta, zcor
826    real zqsat(klon,klev)
827    !
828    INTEGER i, k, iq, j, nsrf, ll, l
829    !
830    REAL t_coup
831    PARAMETER (t_coup=234.0)
832
833    !ym A voir plus tard !!
834    !ym      REAL zx_relief(iim,jjmp1)
835    !ym      REAL zx_aire(iim,jjmp1)
836    !
837    ! Grandeurs de sorties
838    REAL s_capCL(klon)
839    REAL s_oliqCL(klon), s_cteiCL(klon)
840    REAL s_trmb1(klon), s_trmb2(klon)
841    REAL s_trmb3(klon)
842
843    ! La convection n'est pas calculee tous les pas, il faut donc
844    !                      sauvegarder les sorties de la convection
845    !ym      SAVE 
846    !ym      SAVE 
847    !ym      SAVE 
848    !
849    INTEGER itapcv, itapwk
850    SAVE itapcv, itapwk
851    !$OMP THREADPRIVATE(itapcv, itapwk)
852
853    !KE43
854    ! Variables locales pour la convection de K. Emanuel (sb):
855
856    REAL tvp(klon,klev)       ! virtual temp of lifted parcel
857    CHARACTER*40 capemaxcels  !max(CAPE)
858
859    REAL rflag(klon)          ! flag fonctionnement de convect
860    INTEGER iflagctrl(klon)          ! flag fonctionnement de convect
861
862    ! -- convect43:
863    INTEGER ntra              ! nb traceurs pour convect4.3
864    REAL dtvpdt1(klon,klev), dtvpdq1(klon,klev)
865    REAL dplcldt(klon), dplcldr(klon)
866    !?     .     condm_con(klon,klev),conda_con(klon,klev),
867    !?     .     mr_con(klon,klev),ep_con(klon,klev)
868    !?     .    ,sadiab(klon,klev),wadiab(klon,klev)
869    ! --
870    !34EK
871    !
872    ! Variables du changement
873    !
874    ! con: convection
875    ! lsc: condensation a grande echelle (Large-Scale-Condensation)
876    ! ajs: ajustement sec
877    ! eva: evaporation de l'eau liquide nuageuse
878    ! vdf: couche limite (Vertical DiFfusion)
879    !
880    ! tendance nulles
881    REAL, dimension(klon,klev):: du0, dv0, dt0, dq0, dql0, dqi0
882    REAL, dimension(klon)     :: dsig0, ddens0
883    INTEGER, dimension(klon)  :: wkoccur1
884    ! tendance buffer pour appel de add_phys_tend
885    REAL, DIMENSION(klon,klev)  :: d_q_ch4_dtime
886    !
887    ! Flag pour pouvoir ne pas ajouter les tendances.
888    ! Par defaut, les tendances doivente etre ajoutees et
889    ! flag_inhib_tend = 0
890    ! flag_inhib_tend > 0 : tendances non ajoutees, avec un nombre
891    ! croissant de print quand la valeur du flag augmente
892    !!! attention, ce flag doit etre change avec prudence !!!
893    INTEGER :: flag_inhib_tend = 0 !  0 is the default value
894!!    INTEGER :: flag_inhib_tend = 2
895    !
896    ! Logical switch to a bug : reseting to 0 convective variables at the
897    ! begining of physiq.
898    LOGICAL, SAVE :: ok_bug_cv_trac = .TRUE.
899    !$OMP THREADPRIVATE(ok_bug_cv_trac)
900
901    !
902    !********************************************************
903    !     declarations
904
905    !********************************************************
906    !IM 081204 END
907    !
908    REAL pen_u(klon,klev), pen_d(klon,klev)
909    REAL pde_u(klon,klev), pde_d(klon,klev)
910    INTEGER kcbot(klon), kctop(klon), kdtop(klon)
911    !
912    real ratqsbas,ratqshaut,tau_ratqs
913    save ratqsbas,ratqshaut,tau_ratqs
914    !$OMP THREADPRIVATE(ratqsbas,ratqshaut,tau_ratqs)
915    REAL, SAVE :: ratqsp0=50000., ratqsdp=20000.
916    !$OMP THREADPRIVATE(ratqsp0, ratqsdp)
917
918    ! Parametres lies au nouveau schema de nuages (SB, PDF)
919    real fact_cldcon
920    real facttemps
921    logical ok_newmicro
922    save ok_newmicro
923    !$OMP THREADPRIVATE(ok_newmicro)
924    !real ref_liq_pi(klon,klev), ref_ice_pi(klon,klev)
925    save fact_cldcon,facttemps
926    !$OMP THREADPRIVATE(fact_cldcon,facttemps)
927
928    integer iflag_cld_th
929    save iflag_cld_th
930    !$OMP THREADPRIVATE(iflag_cld_th)
931!IM logical ptconv(klon,klev)  !passe dans phys_local_var_mod
932    !IM cf. AM 081204 BEG
933    logical ptconvth(klon,klev)
934    !IM cf. AM 081204 END
935    !
936    ! Variables liees a l'ecriture de la bande histoire physique
937    !
938    !======================================================================
939    !
940
941    !
942!JLD    integer itau_w   ! pas de temps ecriture = itap + itau_phy
943    !
944    !
945    ! Variables locales pour effectuer les appels en serie
946    !
947    !IM RH a 2m (la surface)
948    REAL Lheat
949
950    INTEGER        length
951    PARAMETER    ( length = 100 )
952    REAL tabcntr0( length       )
953    !
954!JLD    INTEGER ndex2d(nbp_lon*nbp_lat)
955    !IM
956    !
957    !IM AMIP2 BEG
958!JLD    REAL moyglo, mountor
959    !IM 141004 BEG
960    REAL zustrdr(klon), zvstrdr(klon)
961    REAL zustrli(klon), zvstrli(klon)
962    REAL zustrph(klon), zvstrph(klon)
963    REAL aam, torsfc
964    !IM 141004 END
965    !IM 190504 BEG
966    !  INTEGER imp1jmp1
967    !  PARAMETER(imp1jmp1=(iim+1)*jjmp1)
968    !ym A voir plus tard
969    !  REAL zx_tmp((nbp_lon+1)*nbp_lat)
970    !  REAL airedyn(nbp_lon+1,nbp_lat)
971    !IM 190504 END
972!JLD    LOGICAL ok_msk
973!JLD    REAL msk(klon)
974    !ym A voir plus tard
975    !ym      REAL zm_wo(jjmp1, klev)
976    !IM AMIP2 END
977    !
978    REAL zx_tmp_fi2d(klon)      ! variable temporaire grille physique
979    REAL zx_tmp_fi3d(klon,klev) ! variable temporaire pour champs 3D
980!JLD    REAL zx_tmp_2d(nbp_lon,nbp_lat)
981!JLD    REAL zx_lon(nbp_lon,nbp_lat)
982!JLD    REAL zx_lat(nbp_lon,nbp_lat)
983    !
984    INTEGER nid_ctesGCM
985    SAVE nid_ctesGCM
986    !$OMP THREADPRIVATE(nid_ctesGCM)
987    !
988    !IM 280405 BEG
989    !  INTEGER nid_bilKPins, nid_bilKPave
990    !  SAVE nid_bilKPins, nid_bilKPave
991    !  !$OMP THREADPRIVATE(nid_bilKPins, nid_bilKPave)
992    !
993    REAL ve_lay(klon,klev) ! transport meri. de l'energie a chaque niveau vert.
994    REAL vq_lay(klon,klev) ! transport meri. de l'eau a chaque niveau vert.
995    REAL ue_lay(klon,klev) ! transport zonal de l'energie a chaque niveau vert.
996    REAL uq_lay(klon,klev) ! transport zonal de l'eau a chaque niveau vert.
997    !
998!JLD    REAL zjulian
999!JLD    SAVE zjulian
1000!JLD!$OMP THREADPRIVATE(zjulian)
1001
1002!JLD    INTEGER nhori, nvert
1003!JLD    REAL zsto
1004!JLD    REAL zstophy, zout
1005
1006    character*20 modname
1007    character*80 abort_message
1008    logical, save ::  ok_sync, ok_sync_omp
1009    !$OMP THREADPRIVATE(ok_sync)
1010    real date0
1011
1012    ! essai writephys
1013    integer fid_day, fid_mth, fid_ins
1014    parameter (fid_ins = 1, fid_day = 2, fid_mth = 3)
1015    integer prof2d_on, prof3d_on, prof2d_av, prof3d_av
1016    parameter (prof2d_on = 1, prof3d_on = 2, &
1017         prof2d_av = 3, prof3d_av = 4)
1018    REAL ztsol(klon)
1019    REAL q2m(klon,nbsrf)  ! humidite a 2m
1020
1021    !IM: t2m, q2m, ustar, u10m, v10m et t2mincels, t2maxcels
1022    CHARACTER*40 t2mincels, t2maxcels       !t2m min., t2m max
1023    CHARACTER*40 tinst, tave
1024    REAL cldtaupi(klon,klev) ! Cloud optical thickness for
1025    ! pre-industrial (pi) aerosols
1026
1027    INTEGER :: naero
1028    ! Aerosol optical properties
1029    CHARACTER*4, DIMENSION(naero_grp) :: rfname
1030    REAL, DIMENSION(klon,klev)     :: mass_solu_aero ! total mass
1031    ! concentration
1032    ! for all soluble
1033    ! aerosols[ug/m3]
1034    REAL, DIMENSION(klon,klev)     :: mass_solu_aero_pi
1035    ! - " - (pre-industrial value)
1036
1037    ! Parameters
1038    LOGICAL ok_ade, ok_aie    ! Apply aerosol (in)direct effects or not
1039    LOGICAL ok_alw            ! Apply aerosol LW effect or not
1040    LOGICAL ok_cdnc ! ok cloud droplet number concentration (O. Boucher 01-2013)
1041    REAL bl95_b0, bl95_b1   ! Parameter in Boucher and Lohmann (1995)
1042    SAVE ok_ade, ok_aie, ok_alw, ok_cdnc, bl95_b0, bl95_b1
1043    !$OMP THREADPRIVATE(ok_ade, ok_aie, ok_alw, ok_cdnc, bl95_b0, bl95_b1)
1044    LOGICAL, SAVE :: aerosol_couple ! true  : calcul des aerosols dans INCA
1045    ! false : lecture des aerosol dans un fichier
1046    !$OMP THREADPRIVATE(aerosol_couple)   
1047    INTEGER, SAVE :: flag_aerosol
1048    !$OMP THREADPRIVATE(flag_aerosol)
1049    LOGICAL, SAVE :: flag_bc_internal_mixture
1050    !$OMP THREADPRIVATE(flag_bc_internal_mixture)
1051    LOGICAL, SAVE :: new_aod
1052    !$OMP THREADPRIVATE(new_aod)
1053    !
1054    !--STRAT AEROSOL
1055    INTEGER, SAVE :: flag_aerosol_strat
1056    !$OMP THREADPRIVATE(flag_aerosol_strat)
1057    !c-fin STRAT AEROSOL
1058    !
1059    ! Declaration des constantes et des fonctions thermodynamiques
1060    !
1061    LOGICAL,SAVE :: first=.true.
1062    !$OMP THREADPRIVATE(first)
1063
1064    ! VARIABLES RELATED TO OZONE CLIMATOLOGIES ; all are OpenMP shared
1065    ! Note that pressure vectors are in Pa and in stricly ascending order
1066    INTEGER,SAVE :: read_climoz                ! Read ozone climatology
1067    !     (let it keep the default OpenMP shared attribute)
1068    !     Allowed values are 0, 1 and 2
1069    !     0: do not read an ozone climatology
1070    !     1: read a single ozone climatology that will be used day and night
1071    !     2: read two ozone climatologies, the average day and night
1072    !     climatology and the daylight climatology
1073    INTEGER,SAVE :: ncid_climoz                ! NetCDF file identifier
1074    REAL, POINTER, SAVE :: press_cen_climoz(:) ! Pressure levels
1075    REAL, POINTER, SAVE :: press_edg_climoz(:) ! Edges of pressure intervals
1076    REAL, POINTER, SAVE :: time_climoz(:)      ! Time vector
1077    CHARACTER(LEN=13), PARAMETER :: vars_climoz(2) &
1078                                  = ["tro3         ","tro3_daylight"]
1079    ! vars_climoz(1:read_climoz): variables names in climoz file.
1080    ! vars_climoz(1:read_climoz-2) if read_climoz>2 (temporary)
1081    REAL :: ro3i ! 0<=ro3i<=360 ; required time index in NetCDF file for
1082                 ! the ozone fields, old method.
1083
1084    include "YOMCST.h"
1085    include "YOETHF.h"
1086    include "FCTTRE.h"
1087    !IM 100106 BEG : pouvoir sortir les ctes de la physique
1088    include "conema3.h"
1089    include "fisrtilp.h"
1090    include "nuage.h"
1091    include "compbl.h"
1092    !IM 100106 END : pouvoir sortir les ctes de la physique
1093    !
1094    ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1095    ! Declarations pour Simulateur COSP
1096    !============================================================
1097#ifdef CPP_COSP
1098    real :: mr_ozone(klon,klev)
1099#endif
1100    !IM stations CFMIP
1101    INTEGER, SAVE :: nCFMIP
1102    !$OMP THREADPRIVATE(nCFMIP)
1103    INTEGER, PARAMETER :: npCFMIP=120
1104    INTEGER, ALLOCATABLE, SAVE :: tabCFMIP(:)
1105    REAL, ALLOCATABLE, SAVE :: lonCFMIP(:), latCFMIP(:)
1106    !$OMP THREADPRIVATE(tabCFMIP, lonCFMIP, latCFMIP)
1107    INTEGER, ALLOCATABLE, SAVE :: tabijGCM(:)
1108    REAL, ALLOCATABLE, SAVE :: lonGCM(:), latGCM(:)
1109    !$OMP THREADPRIVATE(tabijGCM, lonGCM, latGCM)
1110    INTEGER, ALLOCATABLE, SAVE :: iGCM(:), jGCM(:)
1111    !$OMP THREADPRIVATE(iGCM, jGCM)
1112    logical, dimension(nfiles)            :: phys_out_filestations
1113    logical, parameter :: lNMC=.FALSE.
1114
1115    !IM betaCRF
1116    REAL, SAVE :: pfree, beta_pbl, beta_free
1117    !$OMP THREADPRIVATE(pfree, beta_pbl, beta_free)
1118    REAL, SAVE :: lon1_beta,  lon2_beta, lat1_beta, lat2_beta
1119    !$OMP THREADPRIVATE(lon1_beta,  lon2_beta, lat1_beta, lat2_beta)
1120    LOGICAL, SAVE :: mskocean_beta
1121    !$OMP THREADPRIVATE(mskocean_beta)
1122    REAL, dimension(klon, klev) :: beta ! facteur sur cldtaurad et
1123    ! cldemirad pour evaluer les
1124    ! retros liees aux CRF
1125    REAL, dimension(klon, klev) :: cldtaurad   ! epaisseur optique
1126    ! pour radlwsw pour
1127    ! tester "CRF off"
1128    REAL, dimension(klon, klev) :: cldtaupirad ! epaisseur optique
1129    ! pour radlwsw pour
1130    ! tester "CRF off"
1131    REAL, dimension(klon, klev) :: cldemirad   ! emissivite pour
1132    ! radlwsw pour tester
1133    ! "CRF off"
1134    REAL, dimension(klon, klev) :: cldfrarad   ! fraction nuageuse
1135
1136    !lwoff=y : offset LW CRE for radiation code and other schemes
1137    REAL, SAVE :: betalwoff
1138    !OMP THREADPRIVATE(betalwoff)
1139!
1140    INTEGER :: nbtr_tmp ! Number of tracer inside concvl
1141    REAL, dimension(klon,klev) :: sh_in ! Specific humidity entering in phytrac
1142    REAL, dimension(klon,klev) :: ch_in ! Condensed humidity entering in phytrac (eau liquide)
1143    integer iostat
1144
1145    REAL zzz
1146    !albedo SB >>>
1147    real,dimension(6),save :: SFRWL
1148    !albedo SB <<<
1149
1150    !--OB variables for mass fixer (hard coded for now)
1151    logical, parameter :: mass_fixer=.false.
1152    real qql1(klon),qql2(klon),corrqql
1153
1154    REAL pi
1155
1156    pi = 4. * ATAN(1.)
1157
1158    ! Ehouarn: set value of jjmp1 since it is no longer a "fixed parameter"
1159    jjmp1=nbp_lat
1160
1161    !======================================================================
1162    ! Gestion calendrier : mise a jour du module phys_cal_mod
1163    !
1164    pdtphys=pdtphys_
1165    CALL update_time(pdtphys)
1166
1167    !======================================================================
1168    ! Ecriture eventuelle d'un profil verticale en entree de la physique.
1169    ! Utilise notamment en 1D mais peut etre active egalement en 3D
1170    ! en imposant la valeur de igout.
1171    !======================================================================d
1172    IF (prt_level.ge.1) THEN
1173       igout=klon/2+1/klon
1174       write(lunout,*) 'DEBUT DE PHYSIQ !!!!!!!!!!!!!!!!!!!!'
1175       write(lunout,*) 'igout, lat, lon ',igout, latitude_deg(igout), &
1176            longitude_deg(igout)
1177       write(lunout,*) &
1178            'nlon,klev,nqtot,debut,lafin, jD_cur, jH_cur,pdtphys'
1179       write(lunout,*) &
1180            nlon,klev,nqtot,debut,lafin, jD_cur, jH_cur,pdtphys
1181
1182       write(lunout,*) 'paprs, play, phi, u, v, t'
1183       DO k=1,klev
1184          write(lunout,*) paprs(igout,k),pplay(igout,k),pphi(igout,k), &
1185               u(igout,k),v(igout,k),t(igout,k)
1186       ENDDO
1187       write(lunout,*) 'ovap (g/kg),  oliq (g/kg)'
1188       DO k=1,klev
1189          write(lunout,*) qx(igout,k,1)*1000,qx(igout,k,2)*1000.
1190       ENDDO
1191    ENDIF
1192
1193    ! Quick check on pressure levels:
1194    call assert(paprs(:, nbp_lev + 1) < paprs(:, nbp_lev), &
1195            "physiq_mod paprs bad order")
1196
1197    IF (first) THEN
1198       !CR:nvelles variables convection/poches froides
1199
1200       print*, '================================================='
1201       print*, 'Allocation des variables locales et sauvegardees'
1202       CALL phys_local_var_init
1203       !
1204       pasphys=pdtphys
1205       !     appel a la lecture du run.def physique
1206       CALL conf_phys(ok_journe, ok_mensuel, &
1207            ok_instan, ok_hf, &
1208            ok_LES, &
1209            callstats, &
1210            solarlong0,seuil_inversion, &
1211            fact_cldcon, facttemps,ok_newmicro,iflag_radia, &
1212            iflag_cld_th,iflag_ratqs,ratqsbas,ratqshaut,tau_ratqs, &
1213            ok_ade, ok_aie, ok_alw, ok_cdnc, aerosol_couple,  &
1214            flag_aerosol, flag_aerosol_strat, new_aod, &
1215            flag_bc_internal_mixture, bl95_b0, bl95_b1, &
1216                                ! nv flags pour la convection et les
1217                                ! poches froides
1218            read_climoz, &
1219            alp_offset)
1220       CALL phys_state_var_init(read_climoz)
1221       CALL phys_output_var_init
1222       print*, '================================================='
1223       !
1224       !CR: check sur le nb de traceurs de l eau
1225       IF ((iflag_ice_thermo.gt.0).and.(nqo==2)) THEN
1226          WRITE (lunout, *) ' iflag_ice_thermo==1 requires 3 H2O tracers ', &
1227               '(H2Ov, H2Ol, H2Oi) but nqo=', nqo, '. Might as well stop here.'
1228          STOP
1229       ENDIF
1230
1231       Ncvpaseq1 = 0
1232       dnwd0=0.0
1233       ftd=0.0
1234       fqd=0.0
1235       cin=0.
1236       !ym Attention pbase pas initialise dans concvl !!!!
1237       pbase=0
1238       !IM 180608
1239
1240       itau_con=0
1241       first=.false.
1242
1243    ENDIF  ! first
1244
1245    !ym => necessaire pour iflag_con != 2   
1246    pmfd(:,:) = 0.
1247    pen_u(:,:) = 0.
1248    pen_d(:,:) = 0.
1249    pde_d(:,:) = 0.
1250    pde_u(:,:) = 0.
1251    aam=0.
1252    d_t_adjwk(:,:)=0
1253    d_q_adjwk(:,:)=0
1254
1255    alp_bl_conv(:)=0.
1256
1257    torsfc=0.
1258    forall (k=1: nbp_lev) zmasse(:, k) = (paprs(:, k)-paprs(:, k+1)) / rg
1259
1260    modname = 'physiq'
1261
1262    IF (debut) THEN
1263       CALL suphel ! initialiser constantes et parametres phys.
1264       CALL getin_p('iflag_alp_wk_cond', iflag_alp_wk_cond)
1265       CALL getin_p('random_notrig_max',random_notrig_max)
1266       CALL getin_p('ok_adjwk',ok_adjwk)
1267       IF (ok_adjwk) iflag_adjwk=2  ! for compatibility with older versions
1268       ! iflag_adjwk: ! 0 = Default: no convective adjustment of w-region
1269                      ! 1 => convective adjustment but state variables are unchanged
1270                      ! 2 => convective adjustment and state variables are changed
1271       CALL getin_p('iflag_adjwk',iflag_adjwk)
1272       CALL getin_p('dtcon_multistep_max',dtcon_multistep_max)
1273       CALL getin_p('dqcon_multistep_max',dqcon_multistep_max)
1274       CALL getin_p('oliqmax',oliqmax)
1275       CALL getin_p('oicemax',oicemax)
1276       CALL getin_p('ratqsp0',ratqsp0)
1277       CALL getin_p('ratqsdp',ratqsdp)
1278       iflag_wake_tend = 0
1279       CALL getin_p('iflag_wake_tend',iflag_wake_tend)
1280       ok_bad_ecmwf_thermo=.TRUE. ! By default thermodynamical constants are set
1281                                  ! in rrtm/suphec.F90 (and rvtmp2 is set to 0).
1282       CALL getin_p('ok_bad_ecmwf_thermo',ok_bad_ecmwf_thermo)
1283       CALL getin_p('ok_bug_cv_trac',ok_bug_cv_trac)
1284       fl_ebil = 0 ! by default, conservation diagnostics are desactivated
1285       CALL getin_p('fl_ebil',fl_ebil)
1286       fl_cor_ebil = 0 ! by default, no correction to ensure energy conservation
1287       CALL getin_p('fl_cor_ebil',fl_cor_ebil)
1288       iflag_phytrac = 1 ! by default we do want to call phytrac
1289       CALL getin_p('iflag_phytrac',iflag_phytrac)
1290       nvm_lmdz = 13
1291       CALL getin_p('NVM',nvm_lmdz)
1292    ENDIF
1293
1294    IF (prt_level.ge.1) print *,'CONVERGENCE PHYSIQUE THERM 1 '
1295
1296
1297    !======================================================================
1298    ! Gestion calendrier : mise a jour du module phys_cal_mod
1299    !
1300    !     CALL phys_cal_update(jD_cur,jH_cur)
1301
1302    !
1303    ! Si c'est le debut, il faut initialiser plusieurs choses
1304    !          ********
1305    !
1306    IF (debut) THEN
1307       !rv CRinitialisation de wght_th et lalim_conv pour la
1308       !definition de la couche alimentation de la convection a partir
1309       !des caracteristiques du thermique
1310       wght_th(:,:)=1.
1311       lalim_conv(:)=1
1312       !RC
1313       ustar(:,:)=0.
1314!       u10m(:,:)=0.
1315!       v10m(:,:)=0.
1316       rain_con(:)=0.
1317       snow_con(:)=0.
1318       topswai(:)=0.
1319       topswad(:)=0.
1320       solswai(:)=0.
1321       solswad(:)=0.
1322
1323       wmax_th(:)=0.
1324       tau_overturning_th(:)=0.
1325
1326       IF (type_trac == 'inca') THEN
1327          ! jg : initialisation jusqu'au ces variables sont dans restart
1328          ccm(:,:,:) = 0.
1329          tau_aero(:,:,:,:) = 0.
1330          piz_aero(:,:,:,:) = 0.
1331          cg_aero(:,:,:,:) = 0.
1332
1333          config_inca='none' ! default
1334          CALL getin_p('config_inca',config_inca)
1335
1336       ELSE
1337          config_inca='none' ! default
1338       ENDIF
1339
1340       IF (aerosol_couple .AND. (config_inca /= "aero" &
1341            .AND. config_inca /= "aeNP ")) THEN
1342          abort_message &
1343               = 'if aerosol_couple is activated, config_inca need to be ' &
1344               // 'aero or aeNP'
1345          CALL abort_physic (modname,abort_message,1)
1346       ENDIF
1347
1348
1349
1350       rnebcon0(:,:) = 0.0
1351       clwcon0(:,:) = 0.0
1352       rnebcon(:,:) = 0.0
1353       clwcon(:,:) = 0.0
1354
1355       !
1356       print*,'iflag_coupl,iflag_clos,iflag_wake', &
1357            iflag_coupl,iflag_clos,iflag_wake
1358       print*,'iflag_CYCLE_DIURNE', iflag_cycle_diurne
1359       !
1360       IF (iflag_con.EQ.2.AND.iflag_cld_th.GT.-1) THEN
1361          abort_message = 'Tiedtke needs iflag_cld_th=-2 or -1'
1362          CALL abort_physic (modname,abort_message,1)
1363       ENDIF
1364       !
1365       !
1366       ! Initialiser les compteurs:
1367       !
1368       itap    = 0
1369       itaprad = 0
1370       itapcv = 0
1371       itapwk = 0
1372
1373       ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1374       !! Un petit travail \`a faire ici.
1375       ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1376
1377       IF (iflag_pbl>1) THEN
1378          PRINT*, "Using method MELLOR&YAMADA"
1379       ENDIF
1380
1381       ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1382       ! FH 2008/05/02 changement lie a la lecture de nbapp_rad dans
1383       ! phylmd plutot que dyn3d
1384       ! Attention : la version precedente n'etait pas tres propre.
1385       ! Il se peut qu'il faille prendre une valeur differente de nbapp_rad
1386       ! pour obtenir le meme resultat.
1387!jyg for fh<
1388!!       dtime=pdtphys
1389       dtime=NINT(pdtphys)
1390       WRITE(lunout,*) 'Pas de temps dtime pdtphys ',dtime,pdtphys
1391       IF (abs(dtime-pdtphys)>1.e-10) THEN
1392          abort_message='pas de temps doit etre entier en seconde pour orchidee et XIOS'
1393          CALL abort_physic(modname,abort_message,1)
1394       ENDIF
1395!>jyg
1396       IF (MOD(NINT(86400./dtime),nbapp_rad).EQ.0) THEN
1397          radpas = NINT( 86400./dtime)/nbapp_rad
1398       ELSE
1399          WRITE(lunout,*) 'le nombre de pas de temps physique doit etre un ', &
1400               'multiple de nbapp_rad'
1401          WRITE(lunout,*) 'changer nbapp_rad ou alors commenter ce test ', &
1402               'mais 1+1<>2'
1403          abort_message='nbre de pas de temps physique n est pas multiple ' &
1404               // 'de nbapp_rad'
1405          CALL abort_physic(modname,abort_message,1)
1406       ENDIF
1407       IF (nbapp_cv .EQ. 0) nbapp_cv=86400./dtime
1408       IF (nbapp_wk .EQ. 0) nbapp_wk=86400./dtime
1409       print *,'physiq, nbapp_cv, nbapp_wk ',nbapp_cv,nbapp_wk
1410       IF (MOD(NINT(86400./dtime),nbapp_cv).EQ.0) THEN
1411          cvpas_0 = NINT( 86400./dtime)/nbapp_cv
1412          cvpas = cvpas_0
1413       print *,'physiq, cvpas ',cvpas
1414       ELSE
1415          WRITE(lunout,*) 'le nombre de pas de temps physique doit etre un ', &
1416               'multiple de nbapp_cv'
1417          WRITE(lunout,*) 'changer nbapp_cv ou alors commenter ce test ', &
1418               'mais 1+1<>2'
1419          abort_message='nbre de pas de temps physique n est pas multiple ' &
1420               // 'de nbapp_cv'
1421          call abort_physic(modname,abort_message,1)
1422       ENDIF
1423       IF (MOD(NINT(86400./dtime),nbapp_wk).EQ.0) THEN
1424          wkpas = NINT( 86400./dtime)/nbapp_wk
1425       print *,'physiq, wkpas ',wkpas
1426       ELSE
1427          WRITE(lunout,*) 'le nombre de pas de temps physique doit etre un ', &
1428               'multiple de nbapp_wk'
1429          WRITE(lunout,*) 'changer nbapp_wk ou alors commenter ce test ', &
1430               'mais 1+1<>2'
1431          abort_message='nbre de pas de temps physique n est pas multiple ' &
1432               // 'de nbapp_wk'
1433          call abort_physic(modname,abort_message,1)
1434       ENDIF
1435       ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1436
1437       CALL phyetat0 ("startphy.nc",clesphy0,tabcntr0)
1438!jyg<
1439       IF (klon_glo==1) THEN
1440          IF (iflag_pbl > 1) THEN         
1441              pbl_tke(:,:,is_ave) = 0.
1442              DO nsrf=1,nbsrf
1443                DO k = 1,klev+1
1444                     pbl_tke(:,k,is_ave) = pbl_tke(:,k,is_ave) &
1445                         +pctsrf(:,nsrf)*pbl_tke(:,k,nsrf)
1446                ENDDO
1447              ENDDO
1448          ELSE   ! (iflag_pbl > 1)
1449              pbl_tke(:,:,:) = 0.
1450          ENDIF  ! (iflag_pbl > 1)
1451!>jyg
1452       ENDIF
1453       !IM begin
1454       print*,'physiq: clwcon rnebcon ratqs',clwcon(1,1),rnebcon(1,1) &
1455            ,ratqs(1,1)
1456       !IM end
1457
1458
1459       ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1460       !
1461       ! on remet le calendrier a zero
1462       !
1463       IF (raz_date .eq. 1) THEN
1464          itau_phy = 0
1465       ENDIF
1466
1467       CALL printflag( tabcntr0,radpas,ok_journe, &
1468            ok_instan, ok_region )
1469       !
1470       IF (ABS(dtime-pdtphys).GT.0.001) THEN
1471          WRITE(lunout,*) 'Pas physique n est pas correct',dtime, &
1472               pdtphys
1473          abort_message='Pas physique n est pas correct '
1474          !           call abort_physic(modname,abort_message,1)
1475          dtime=pdtphys
1476       ENDIF
1477       IF (nlon .NE. klon) THEN
1478          WRITE(lunout,*)'nlon et klon ne sont pas coherents', nlon,  &
1479               klon
1480          abort_message='nlon et klon ne sont pas coherents'
1481          CALL abort_physic(modname,abort_message,1)
1482       ENDIF
1483       IF (nlev .NE. klev) THEN
1484          WRITE(lunout,*)'nlev et klev ne sont pas coherents', nlev, &
1485               klev
1486          abort_message='nlev et klev ne sont pas coherents'
1487          CALL abort_physic(modname,abort_message,1)
1488       ENDIF
1489       !
1490       IF (dtime*REAL(radpas).GT.21600..AND.iflag_cycle_diurne.GE.1) THEN
1491          WRITE(lunout,*)'Nbre d appels au rayonnement insuffisant'
1492          WRITE(lunout,*)"Au minimum 4 appels par jour si cycle diurne"
1493          abort_message='Nbre d appels au rayonnement insuffisant'
1494          CALL abort_physic(modname,abort_message,1)
1495       ENDIF
1496       WRITE(lunout,*)"Clef pour la convection, iflag_con=", iflag_con
1497       WRITE(lunout,*)"Clef pour le driver de la convection, ok_cvl=", &
1498            ok_cvl
1499       !
1500       !KE43
1501       ! Initialisation pour la convection de K.E. (sb):
1502       IF (iflag_con.GE.3) THEN
1503
1504          WRITE(lunout,*)"*** Convection de Kerry Emanuel 4.3  "
1505          WRITE(lunout,*) &
1506               "On va utiliser le melange convectif des traceurs qui"
1507          WRITE(lunout,*)"est calcule dans convect4.3"
1508          WRITE(lunout,*)" !!! penser aux logical flags de phytrac"
1509
1510          DO i = 1, klon
1511             ema_cbmf(i) = 0.
1512             ema_pcb(i)  = 0.
1513             ema_pct(i)  = 0.
1514             !          ema_workcbmf(i) = 0.
1515          ENDDO
1516          !IM15/11/02 rajout initialisation ibas_con,itop_con cf. SB =>BEG
1517          DO i = 1, klon
1518             ibas_con(i) = 1
1519             itop_con(i) = 1
1520          ENDDO
1521          !IM15/11/02 rajout initialisation ibas_con,itop_con cf. SB =>END
1522          !================================================================
1523          !CR:04.12.07: initialisations poches froides
1524          ! Controle de ALE et ALP pour la fermeture convective (jyg)
1525          IF (iflag_wake>=1) THEN
1526             CALL ini_wake(0.,0.,it_wape_prescr,wape_prescr,fip_prescr &
1527                  ,alp_bl_prescr, ale_bl_prescr)
1528             ! 11/09/06 rajout initialisation ALE et ALP du wake et PBL(YU)
1529             !        print*,'apres ini_wake iflag_cld_th=', iflag_cld_th
1530             !
1531             ! Initialize tendencies of wake state variables (for some flag values
1532             ! they are not computed).
1533             d_deltat_wk(:,:) = 0.
1534             d_deltaq_wk(:,:) = 0.
1535             d_deltat_wk_gw(:,:) = 0.
1536             d_deltaq_wk_gw(:,:) = 0.
1537             d_deltat_vdf(:,:) = 0.
1538             d_deltaq_vdf(:,:) = 0.
1539             d_deltat_the(:,:) = 0.
1540             d_deltaq_the(:,:) = 0.
1541             d_deltat_ajs_cv(:,:) = 0.
1542             d_deltaq_ajs_cv(:,:) = 0.
1543             d_s_wk(:) = 0.
1544             d_dens_wk(:) = 0.
1545          ENDIF
1546
1547          !        do i = 1,klon
1548          !           Ale_bl(i)=0.
1549          !           Alp_bl(i)=0.
1550          !        enddo
1551
1552          !===================================================================
1553          !IM stations CFMIP
1554          nCFMIP=npCFMIP
1555          OPEN(98,file='npCFMIP_param.data',status='old', &
1556               form='formatted',iostat=iostat)
1557          IF (iostat == 0) THEN
1558             READ(98,*,end=998) nCFMIP
1559998          CONTINUE
1560             CLOSE(98)
1561             CONTINUE
1562             IF(nCFMIP.GT.npCFMIP) THEN
1563                print*,'nCFMIP > npCFMIP : augmenter npCFMIP et recompiler'
1564                CALL abort_physic("physiq", "", 1)
1565             ELSE
1566                print*,'physiq npCFMIP=',npCFMIP,'nCFMIP=',nCFMIP
1567             ENDIF
1568
1569             !
1570             ALLOCATE(tabCFMIP(nCFMIP))
1571             ALLOCATE(lonCFMIP(nCFMIP), latCFMIP(nCFMIP))
1572             ALLOCATE(tabijGCM(nCFMIP))
1573             ALLOCATE(lonGCM(nCFMIP), latGCM(nCFMIP))
1574             ALLOCATE(iGCM(nCFMIP), jGCM(nCFMIP))
1575             !
1576             ! lecture des nCFMIP stations CFMIP, de leur numero
1577             ! et des coordonnees geographiques lonCFMIP, latCFMIP
1578             !
1579             CALL read_CFMIP_point_locations(nCFMIP, tabCFMIP,  &
1580                  lonCFMIP, latCFMIP)
1581             !
1582             ! identification des
1583             ! 1) coordonnees lonGCM, latGCM des points CFMIP dans la
1584             ! grille de LMDZ
1585             ! 2) indices points tabijGCM de la grille physique 1d sur
1586             ! klon points
1587             ! 3) indices iGCM, jGCM de la grille physique 2d
1588             !
1589             CALL LMDZ_CFMIP_point_locations(nCFMIP, lonCFMIP, latCFMIP, &
1590                  tabijGCM, lonGCM, latGCM, iGCM, jGCM)
1591             !
1592          ELSE
1593             ALLOCATE(tabijGCM(0))
1594             ALLOCATE(lonGCM(0), latGCM(0))
1595             ALLOCATE(iGCM(0), jGCM(0))
1596          ENDIF
1597       ELSE
1598          ALLOCATE(tabijGCM(0))
1599          ALLOCATE(lonGCM(0), latGCM(0))
1600          ALLOCATE(iGCM(0), jGCM(0))
1601       ENDIF
1602
1603       DO i=1,klon
1604          rugoro(i) = f_rugoro * MAX(1.0e-05, zstd(i)*zsig(i)/2.0)
1605       ENDDO
1606
1607       !34EK
1608       IF (ok_orodr) THEN
1609
1610          ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1611          ! FH sans doute a enlever de finitivement ou, si on le
1612          ! garde, l'activer justement quand ok_orodr = false.
1613          ! ce rugoro est utilise par la couche limite et fait double emploi
1614          ! avec les param\'etrisations sp\'ecifiques de Francois Lott.
1615          !           DO i=1,klon
1616          !             rugoro(i) = MAX(1.0e-05, zstd(i)*zsig(i)/2.0)
1617          !           ENDDO
1618          ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1619          IF (ok_strato) THEN
1620             CALL SUGWD_strato(klon,klev,paprs,pplay)
1621          ELSE
1622             CALL SUGWD(klon,klev,paprs,pplay)
1623          ENDIF
1624
1625          DO i=1,klon
1626             zuthe(i)=0.
1627             zvthe(i)=0.
1628             IF (zstd(i).gt.10.) THEN
1629                zuthe(i)=(1.-zgam(i))*cos(zthe(i))
1630                zvthe(i)=(1.-zgam(i))*sin(zthe(i))
1631             ENDIF
1632          ENDDO
1633       ENDIF
1634       !
1635       !
1636       lmt_pas = NINT(86400./dtime * 1.0)   ! tous les jours
1637       WRITE(lunout,*)'La frequence de lecture surface est de ',  &
1638            lmt_pas
1639       !
1640       capemaxcels = 't_max(X)'
1641       t2mincels = 't_min(X)'
1642       t2maxcels = 't_max(X)'
1643       tinst = 'inst(X)'
1644       tave = 'ave(X)'
1645       !IM cf. AM 081204 BEG
1646       write(lunout,*)'AVANT HIST IFLAG_CON=',iflag_con
1647       !IM cf. AM 081204 END
1648       !
1649       !=============================================================
1650       !   Initialisation des sorties
1651       !=============================================================
1652
1653#ifdef CPP_XIOS
1654       !--setting up swaero_diag to TRUE in XIOS case
1655       IF (xios_field_is_active("topswad").OR.xios_field_is_active("topswad0").OR. &
1656           xios_field_is_active("solswad").OR.xios_field_is_active("solswad0").OR. &
1657           xios_field_is_active("topswai").OR.xios_field_is_active("solswai").OR.  &
1658             (iflag_rrtm==1.AND.(xios_field_is_active("toplwad").OR.xios_field_is_active("toplwad0").OR. &
1659                                 xios_field_is_active("sollwad").OR.xios_field_is_active("sollwad0"))))  &
1660           !!!--for now these fields are not in the XML files so they are omitted
1661           !!!  xios_field_is_active("toplwai").OR.xios_field_is_active("sollwai") !))) &
1662           swaero_diag=.TRUE.
1663
1664       !--setting up swaerofree_diag to TRUE in XIOS case
1665       IF (xios_field_is_active("SWdnSFCcleanclr").OR.xios_field_is_active("SWupSFCcleanclr").OR. &
1666           xios_field_is_active("SWupTOAcleanclr").OR.xios_field_is_active("rsucsaf").OR.   &
1667           xios_field_is_active("rsdcsaf") .OR. xios_field_is_active("LWdnSFCcleanclr").OR. &
1668           xios_field_is_active("LWupTOAcleanclr")) &
1669           swaerofree_diag=.TRUE.
1670
1671       !--setting up dryaod_diag to TRUE in XIOS case
1672       DO naero = 1, naero_tot-1
1673         IF (xios_field_is_active("dryod550_"//name_aero_tau(naero))) dryaod_diag=.TRUE.
1674       ENDDO
1675       !
1676       !--setting up ok_4xCO2atm to TRUE in XIOS case
1677       IF (xios_field_is_active("rsut4co2").OR.xios_field_is_active("rlut4co2").OR. &
1678           xios_field_is_active("rsutcs4co2").OR.xios_field_is_active("rlutcs4co2").OR. &
1679           xios_field_is_active("rsu4co2").OR.xios_field_is_active("rsucs4co2").OR. &
1680           xios_field_is_active("rsd4co2").OR.xios_field_is_active("rsdcs4co2").OR. &
1681           xios_field_is_active("rlu4co2").OR.xios_field_is_active("rlucs4co2").OR. &
1682           xios_field_is_active("rld4co2").OR.xios_field_is_active("rldcs4co2")) &
1683           ok_4xCO2atm=.TRUE.
1684! Need to put this initialisation after phyetat0 as in the coupled model the XIOS context is only
1685! initialised at that moment
1686       ! Get "missing_val" value from XML files (from temperature variable)
1687       !$OMP MASTER
1688       CALL xios_get_field_attr("temp",default_value=missing_val_omp)
1689       !$OMP END MASTER
1690       !$OMP BARRIER
1691       missing_val=missing_val_omp
1692#endif
1693
1694#ifdef CPP_IOIPSL
1695
1696       !$OMP MASTER
1697       ! FH : if ok_sync=.true. , the time axis is written at each time step
1698       ! in the output files. Only at the end in the opposite case
1699       ok_sync_omp=.false.
1700       CALL getin('ok_sync',ok_sync_omp)
1701       CALL phys_output_open(longitude_deg,latitude_deg,nCFMIP,tabijGCM, &
1702            iGCM,jGCM,lonGCM,latGCM, &
1703            jjmp1,nlevSTD,clevSTD,rlevSTD, dtime,ok_veget, &
1704            type_ocean,iflag_pbl,iflag_pbl_split,ok_mensuel,ok_journe, &
1705            ok_hf,ok_instan,ok_LES,ok_ade,ok_aie, &
1706            read_climoz, phys_out_filestations, &
1707            new_aod, aerosol_couple, &
1708            flag_aerosol_strat, pdtphys, paprs, pphis,  &
1709            pplay, lmax_th, ptconv, ptconvth, ivap,  &
1710            d_u, d_t, qx, d_qx, zmasse, ok_sync_omp)
1711       !$OMP END MASTER
1712       !$OMP BARRIER
1713       ok_sync=ok_sync_omp
1714
1715       freq_outNMC(1) = ecrit_files(7)
1716       freq_outNMC(2) = ecrit_files(8)
1717       freq_outNMC(3) = ecrit_files(9)
1718       WRITE(lunout,*)'OK freq_outNMC(1)=',freq_outNMC(1)
1719       WRITE(lunout,*)'OK freq_outNMC(2)=',freq_outNMC(2)
1720       WRITE(lunout,*)'OK freq_outNMC(3)=',freq_outNMC(3)
1721
1722#ifndef CPP_XIOS
1723       CALL ini_paramLMDZ_phy(dtime,nid_ctesGCM)
1724#endif
1725
1726#endif
1727       ecrit_reg = ecrit_reg * un_jour
1728       ecrit_tra = ecrit_tra * un_jour
1729
1730       !XXXPB Positionner date0 pour initialisation de ORCHIDEE
1731       date0 = jD_ref
1732       WRITE(*,*) 'physiq date0 : ',date0
1733       !
1734       !
1735       !
1736       ! Prescrire l'ozone dans l'atmosphere
1737       !
1738       !
1739       !c         DO i = 1, klon
1740       !c         DO k = 1, klev
1741       !c            CALL o3cm (paprs(i,k)/100.,paprs(i,k+1)/100., wo(i,k),20)
1742       !c         ENDDO
1743       !c         ENDDO
1744       !
1745       IF (type_trac == 'inca') THEN
1746#ifdef INCA
1747          CALL VTe(VTphysiq)
1748          CALL VTb(VTinca)
1749          calday = REAL(days_elapsed) + jH_cur
1750          WRITE(lunout,*) 'initial time chemini', days_elapsed, calday
1751
1752          CALL chemini(  &
1753               rg, &
1754               ra, &
1755               cell_area, &
1756               latitude_deg, &
1757               longitude_deg, &
1758               presnivs, &
1759               calday, &
1760               klon, &
1761               nqtot, &
1762               nqo, &
1763               pdtphys, &
1764               annee_ref, &
1765               year_cur, &
1766               day_ref,  &
1767               day_ini, &
1768               start_time, &
1769               itau_phy, &
1770               date0, &
1771               io_lon, &
1772               io_lat)
1773
1774          CALL VTe(VTinca)
1775          CALL VTb(VTphysiq)
1776#endif
1777       ENDIF
1778       !
1779       ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1780       ! Nouvelle initialisation pour le rayonnement RRTM
1781       ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1782
1783       CALL iniradia(klon,klev,paprs(1,1:klev+1))
1784
1785       !$omp single
1786       IF (read_climoz >= 1) CALL open_climoz(ncid_climoz, press_cen_climoz,   &
1787           press_edg_climoz, time_climoz, ok_daily_climoz, adjust_tropopause)
1788       !$omp end single
1789       !
1790       !IM betaCRF
1791       pfree=70000. !Pa
1792       beta_pbl=1.
1793       beta_free=1.
1794       lon1_beta=-180.
1795       lon2_beta=+180.
1796       lat1_beta=90.
1797       lat2_beta=-90.
1798       mskocean_beta=.FALSE.
1799
1800       !albedo SB >>>
1801       select case(nsw)
1802       case(2)
1803          SFRWL(1)=0.45538747
1804          SFRWL(2)=0.54461211
1805       case(4)
1806          SFRWL(1)=0.45538747
1807          SFRWL(2)=0.32870591
1808          SFRWL(3)=0.18568763
1809          SFRWL(4)=3.02191470E-02
1810       case(6)
1811          SFRWL(1)=1.28432794E-03
1812          SFRWL(2)=0.12304168
1813          SFRWL(3)=0.33106142
1814          SFRWL(4)=0.32870591
1815          SFRWL(5)=0.18568763
1816          SFRWL(6)=3.02191470E-02
1817       end select
1818
1819
1820       !albedo SB <<<
1821
1822       OPEN(99,file='beta_crf.data',status='old', &
1823            form='formatted',err=9999)
1824       READ(99,*,end=9998) pfree
1825       READ(99,*,end=9998) beta_pbl
1826       READ(99,*,end=9998) beta_free
1827       READ(99,*,end=9998) lon1_beta
1828       READ(99,*,end=9998) lon2_beta
1829       READ(99,*,end=9998) lat1_beta
1830       READ(99,*,end=9998) lat2_beta
1831       READ(99,*,end=9998) mskocean_beta
18329998   Continue
1833       CLOSE(99)
18349999   Continue
1835       WRITE(*,*)'pfree=',pfree
1836       WRITE(*,*)'beta_pbl=',beta_pbl
1837       WRITE(*,*)'beta_free=',beta_free
1838       WRITE(*,*)'lon1_beta=',lon1_beta
1839       WRITE(*,*)'lon2_beta=',lon2_beta
1840       WRITE(*,*)'lat1_beta=',lat1_beta
1841       WRITE(*,*)'lat2_beta=',lat2_beta
1842       WRITE(*,*)'mskocean_beta=',mskocean_beta
1843
1844      !lwoff=y : offset LW CRE for radiation code and other schemes
1845      !lwoff=y : betalwoff=1.
1846      betalwoff=0.
1847      IF (ok_lwoff) THEN
1848         betalwoff=1.
1849      ENDIF
1850      WRITE(*,*)'ok_lwoff=',ok_lwoff
1851      !
1852      !lwoff=y to begin only sollw and sollwdown are set up to CS values
1853      sollw = sollw + betalwoff * (sollw0 - sollw)
1854      sollwdown(:)= sollwdown(:) + betalwoff *(-1.*ZFLDN0(:,1) - &
1855                    sollwdown(:))
1856    ENDIF
1857    !
1858    !   ****************     Fin  de   IF ( debut  )   ***************
1859    !
1860    !
1861    ! Incrementer le compteur de la physique
1862    !
1863    itap   = itap + 1
1864    IF (is_master .OR. prt_level > 9) THEN
1865      IF (prt_level > 5 .or. MOD(itap,5) == 0) THEN
1866         WRITE(LUNOUT,*)'Entering physics elapsed seconds since start ', current_time
1867         WRITE(LUNOUT,100)year_cur,mth_cur,day_cur,hour/3600.
1868 100     FORMAT('Date = ',i4.4,' / ',i2.2, ' / ',i2.2,' : ',f20.17)
1869      ENDIF
1870    ENDIF
1871    !
1872    !
1873    ! Update fraction of the sub-surfaces (pctsrf) and
1874    ! initialize, where a new fraction has appeared, all variables depending
1875    ! on the surface fraction.
1876    !
1877    CALL change_srf_frac(itap, dtime, days_elapsed+1,  &
1878         pctsrf, fevap, z0m, z0h, agesno,              &
1879         falb_dir, falb_dif, ftsol, ustar, u10m, v10m, pbl_tke)
1880
1881    ! Update time and other variables in Reprobus
1882    IF (type_trac == 'repr') THEN
1883#ifdef REPROBUS
1884       CALL Init_chem_rep_xjour(jD_cur-jD_ref+day_ref)
1885       print*,'xjour equivalent rjourvrai',jD_cur-jD_ref+day_ref
1886       CALL Rtime(debut)
1887#endif
1888    ENDIF
1889
1890
1891    ! Tendances bidons pour les processus qui n'affectent pas certaines
1892    ! variables.
1893    du0(:,:)=0.
1894    dv0(:,:)=0.
1895    dt0 = 0.
1896    dq0(:,:)=0.
1897    dql0(:,:)=0.
1898    dqi0(:,:)=0.
1899    dsig0(:) = 0.
1900    ddens0(:) = 0.
1901    wkoccur1(:)=1
1902    !
1903    ! Mettre a zero des variables de sortie (pour securite)
1904    !
1905    DO i = 1, klon
1906       d_ps(i) = 0.0
1907    ENDDO
1908    DO k = 1, klev
1909       DO i = 1, klon
1910          d_t(i,k) = 0.0
1911          d_u(i,k) = 0.0
1912          d_v(i,k) = 0.0
1913       ENDDO
1914    ENDDO
1915    DO iq = 1, nqtot
1916       DO k = 1, klev
1917          DO i = 1, klon
1918             d_qx(i,k,iq) = 0.0
1919          ENDDO
1920       ENDDO
1921    ENDDO
1922    beta_prec_fisrt(:,:)=0.
1923    beta_prec(:,:)=0.
1924    !
1925    !   Output variables from the convective scheme should not be set to 0
1926    !   since convection is not always called at every time step.
1927    IF (ok_bug_cv_trac) THEN
1928      da(:,:)=0.
1929      mp(:,:)=0.
1930      phi(:,:,:)=0.
1931      ! RomP >>>
1932      phi2(:,:,:)=0.
1933      epmlmMm(:,:,:)=0.
1934      eplaMm(:,:)=0.
1935      d1a(:,:)=0.
1936      dam(:,:)=0.
1937      pmflxr(:,:)=0.
1938      pmflxs(:,:)=0.
1939      ! RomP <<<
1940    ENDIF
1941
1942    !
1943    ! Ne pas affecter les valeurs entrees de u, v, h, et q
1944    !
1945    DO k = 1, klev
1946       DO i = 1, klon
1947          t_seri(i,k)  = t(i,k)
1948          u_seri(i,k)  = u(i,k)
1949          v_seri(i,k)  = v(i,k)
1950          q_seri(i,k)  = qx(i,k,ivap)
1951          ql_seri(i,k) = qx(i,k,iliq)
1952          !CR: ATTENTION, on rajoute la variable glace
1953          IF (nqo.eq.2) THEN
1954             qs_seri(i,k) = 0.
1955          ELSE IF (nqo.eq.3) THEN
1956             qs_seri(i,k) = qx(i,k,isol)
1957          ENDIF
1958       ENDDO
1959    ENDDO
1960    !
1961    !--OB mass fixer
1962    IF (mass_fixer) THEN
1963    !--store initial water burden
1964    qql1(:)=0.0
1965    DO k = 1, klev
1966      qql1(:)=qql1(:)+(q_seri(:,k)+ql_seri(:,k)+qs_seri(:,k))*zmasse(:,k)
1967    ENDDO
1968    ENDIF
1969    !--fin mass fixer
1970
1971    tke0(:,:)=pbl_tke(:,:,is_ave)
1972    !CR:Nombre de traceurs de l'eau: nqo
1973    !  IF (nqtot.GE.3) THEN
1974    IF (nqtot.GE.(nqo+1)) THEN
1975       !     DO iq = 3, nqtot       
1976       DO iq = nqo+1, nqtot 
1977          DO  k = 1, klev
1978             DO  i = 1, klon
1979                !              tr_seri(i,k,iq-2) = qx(i,k,iq)
1980                tr_seri(i,k,iq-nqo) = qx(i,k,iq)
1981             ENDDO
1982          ENDDO
1983       ENDDO
1984    ELSE
1985       DO k = 1, klev
1986          DO i = 1, klon
1987             tr_seri(i,k,1) = 0.0
1988          ENDDO
1989       ENDDO
1990    ENDIF
1991    !
1992    DO i = 1, klon
1993       ztsol(i) = 0.
1994    ENDDO
1995    DO nsrf = 1, nbsrf
1996       DO i = 1, klon
1997          ztsol(i) = ztsol(i) + ftsol(i,nsrf)*pctsrf(i,nsrf)
1998       ENDDO
1999    ENDDO
2000    ! Initialize variables used for diagnostic purpose
2001    IF (flag_inhib_tend .ne. 0) CALL init_cmp_seri
2002
2003    ! Diagnostiquer la tendance dynamique
2004    !
2005    IF (ancien_ok) THEN
2006    !
2007       d_u_dyn(:,:)  = (u_seri(:,:)-u_ancien(:,:))/dtime
2008       d_v_dyn(:,:)  = (v_seri(:,:)-v_ancien(:,:))/dtime
2009       d_t_dyn(:,:)  = (t_seri(:,:)-t_ancien(:,:))/dtime
2010       d_q_dyn(:,:)  = (q_seri(:,:)-q_ancien(:,:))/dtime
2011       d_ql_dyn(:,:) = (ql_seri(:,:)-ql_ancien(:,:))/dtime
2012       d_qs_dyn(:,:) = (qs_seri(:,:)-qs_ancien(:,:))/dtime
2013       CALL water_int(klon,klev,q_seri,zmasse,zx_tmp_fi2d)
2014       d_q_dyn2d(:)=(zx_tmp_fi2d(:)-prw_ancien(:))/dtime
2015       CALL water_int(klon,klev,ql_seri,zmasse,zx_tmp_fi2d)
2016       d_ql_dyn2d(:)=(zx_tmp_fi2d(:)-prlw_ancien(:))/dtime
2017       CALL water_int(klon,klev,qs_seri,zmasse,zx_tmp_fi2d)
2018       d_qs_dyn2d(:)=(zx_tmp_fi2d(:)-prsw_ancien(:))/dtime
2019       ! !! RomP >>>   td dyn traceur
2020       IF (nqtot.GT.nqo) THEN     ! jyg
2021          DO iq = nqo+1, nqtot      ! jyg
2022              d_tr_dyn(:,:,iq-nqo)=(tr_seri(:,:,iq-nqo)-tr_ancien(:,:,iq-nqo))/dtime ! jyg
2023          ENDDO
2024       ENDIF
2025       ! !! RomP <<<
2026    ELSE
2027       d_u_dyn(:,:)  = 0.0
2028       d_v_dyn(:,:)  = 0.0
2029       d_t_dyn(:,:)  = 0.0
2030       d_q_dyn(:,:)  = 0.0
2031       d_ql_dyn(:,:) = 0.0
2032       d_qs_dyn(:,:) = 0.0
2033       d_q_dyn2d(:)  = 0.0
2034       d_ql_dyn2d(:) = 0.0
2035       d_qs_dyn2d(:) = 0.0
2036       ! !! RomP >>>   td dyn traceur
2037       IF (nqtot.GT.nqo) THEN                                       ! jyg
2038          DO iq = nqo+1, nqtot                                      ! jyg
2039              d_tr_dyn(:,:,iq-nqo)= 0.0                             ! jyg
2040          ENDDO
2041       ENDIF
2042       ! !! RomP <<<
2043       ancien_ok = .TRUE.
2044    ENDIF
2045    !
2046    ! Ajouter le geopotentiel du sol:
2047    !
2048    DO k = 1, klev
2049       DO i = 1, klon
2050          zphi(i,k) = pphi(i,k) + pphis(i)
2051       ENDDO
2052    ENDDO
2053    !
2054    ! Verifier les temperatures
2055    !
2056    !IM BEG
2057    IF (check) THEN
2058       amn=MIN(ftsol(1,is_ter),1000.)
2059       amx=MAX(ftsol(1,is_ter),-1000.)
2060       DO i=2, klon
2061          amn=MIN(ftsol(i,is_ter),amn)
2062          amx=MAX(ftsol(i,is_ter),amx)
2063       ENDDO
2064       !
2065       PRINT*,' debut avant hgardfou min max ftsol',itap,amn,amx
2066    ENDIF !(check) THEN
2067    !IM END
2068    !
2069    CALL hgardfou(t_seri,ftsol,'debutphy',abortphy)
2070    IF (abortphy==1) Print*,'ERROR ABORT hgardfou debutphy'
2071
2072    !
2073    !IM BEG
2074    IF (check) THEN
2075       amn=MIN(ftsol(1,is_ter),1000.)
2076       amx=MAX(ftsol(1,is_ter),-1000.)
2077       DO i=2, klon
2078          amn=MIN(ftsol(i,is_ter),amn)
2079          amx=MAX(ftsol(i,is_ter),amx)
2080       ENDDO
2081       !
2082       PRINT*,' debut apres hgardfou min max ftsol',itap,amn,amx
2083    ENDIF !(check) THEN
2084    !IM END
2085    !
2086    ! Mettre en action les conditions aux limites (albedo, sst, etc.).
2087    ! Prescrire l'ozone et calculer l'albedo sur l'ocean.
2088    !
2089    ! Update ozone if day change
2090    IF (MOD(itap-1,lmt_pas) == 0) THEN
2091       IF (read_climoz <= 0) THEN
2092          ! Once per day, update ozone from Royer:
2093          IF (solarlong0<-999.) then
2094             ! Generic case with evolvoing season
2095             zzz=real(days_elapsed+1)
2096          ELSE IF (abs(solarlong0-1000.)<1.e-4) then
2097             ! Particular case with annual mean insolation
2098             zzz=real(90) ! could be revisited
2099             IF (read_climoz/=-1) THEN
2100                abort_message ='read_climoz=-1 is recommended when ' &
2101                     // 'solarlong0=1000.'
2102                CALL abort_physic (modname,abort_message,1)
2103             ENDIF
2104          ELSE
2105             ! Case where the season is imposed with solarlong0
2106             zzz=real(90) ! could be revisited
2107          ENDIF
2108
2109          wo(:,:,1)=ozonecm(latitude_deg, paprs,read_climoz,rjour=zzz)
2110       ELSE
2111          !--- ro3i = elapsed days number since current year 1st january, 0h
2112          ro3i=days_elapsed+jh_cur-jh_1jan
2113          !--- scaling for old style files (360 records)
2114          IF(SIZE(time_climoz)==360.AND..NOT.ok_daily_climoz) ro3i=ro3i*360./year_len
2115          IF(adjust_tropopause) THEN
2116             CALL regr_pr_time_av(ncid_climoz, vars_climoz(1:read_climoz),   &
2117                      ro3i, 'C', press_cen_climoz, pplay, wo, paprs(:,1),    &
2118                      time_climoz ,  longitude_deg,   latitude_deg,          &
2119                      dyn_tropopause(t_seri, ztsol, paprs, pplay, rot))
2120          ELSE
2121             CALL regr_pr_time_av(ncid_climoz,  vars_climoz(1:read_climoz),  &
2122                      ro3i, 'C', press_cen_climoz, pplay, wo, paprs(:,1),    &
2123                      time_climoz )
2124          END IF
2125          ! Convert from mole fraction of ozone to column density of ozone in a
2126          ! cell, in kDU:
2127          FORALL (l = 1: read_climoz) wo(:, :, l) = wo(:, :, l) * rmo3 / rmd &
2128               * zmasse / dobson_u / 1e3
2129          ! (By regridding ozone values for LMDZ only once a day, we
2130          ! have already neglected the variation of pressure in one
2131          ! day. So do not recompute "wo" at each time step even if
2132          ! "zmasse" changes a little.)
2133       ENDIF
2134    ENDIF
2135    !
2136    ! Re-evaporer l'eau liquide nuageuse
2137    !
2138     CALL reevap (klon,klev,iflag_ice_thermo,t_seri,q_seri,ql_seri,qs_seri, &
2139   &         d_t_eva,d_q_eva,d_ql_eva,d_qi_eva)
2140
2141     CALL add_phys_tend &
2142            (du0,dv0,d_t_eva,d_q_eva,d_ql_eva,d_qi_eva,paprs,&
2143               'eva',abortphy,flag_inhib_tend,itap,0)
2144    call prt_enerbil('eva',itap)
2145
2146    !=========================================================================
2147    ! Calculs de l'orbite.
2148    ! Necessaires pour le rayonnement et la surface (calcul de l'albedo).
2149    ! doit donc etre plac\'e avant radlwsw et pbl_surface
2150
2151    ! !!   jyg 17 Sep 2010 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2152    CALL ymds2ju(year_cur, mth_eq, day_eq,0., jD_eq)
2153    day_since_equinox = (jD_cur + jH_cur) - jD_eq
2154    !
2155    !   choix entre calcul de la longitude solaire vraie ou valeur fixee a
2156    !   solarlong0
2157    IF (solarlong0<-999.) THEN
2158       IF (new_orbit) THEN
2159          ! calcul selon la routine utilisee pour les planetes
2160          CALL solarlong(day_since_equinox, zlongi, dist)
2161       ELSE
2162          ! calcul selon la routine utilisee pour l'AR4
2163          CALL orbite(REAL(days_elapsed+1),zlongi,dist)
2164       ENDIF
2165    ELSE
2166       zlongi=solarlong0  ! longitude solaire vraie
2167       dist=1.            ! distance au soleil / moyenne
2168    ENDIF
2169
2170    IF (prt_level.ge.1) write(lunout,*)'Longitude solaire ',zlongi,solarlong0,dist
2171
2172
2173    ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2174    ! Calcul de l'ensoleillement :
2175    ! ============================
2176    ! Pour une solarlong0=1000., on calcule un ensoleillement moyen sur
2177    ! l'annee a partir d'une formule analytique.
2178    ! Cet ensoleillement est sym\'etrique autour de l'\'equateur et
2179    ! non nul aux poles.
2180    IF (abs(solarlong0-1000.)<1.e-4) THEN
2181       CALL zenang_an(iflag_cycle_diurne.GE.1,jH_cur, &
2182            latitude_deg,longitude_deg,rmu0,fract)
2183       swradcorr(:) = 1.0
2184       JrNt(:) = 1.0
2185       zrmu0(:) = rmu0(:)
2186    ELSE
2187       ! recode par Olivier Boucher en sept 2015
2188       SELECT CASE (iflag_cycle_diurne)
2189       CASE(0) 
2190          !  Sans cycle diurne
2191          CALL angle(zlongi, latitude_deg, fract, rmu0)
2192          swradcorr = 1.0
2193          JrNt = 1.0
2194          zrmu0 = rmu0
2195       CASE(1) 
2196          !  Avec cycle diurne sans application des poids
2197          !  bit comparable a l ancienne formulation cycle_diurne=true
2198          !  on integre entre gmtime et gmtime+radpas
2199          zdtime=dtime*REAL(radpas) ! pas de temps du rayonnement (s)
2200          CALL zenang(zlongi,jH_cur,0.0,zdtime, &
2201               latitude_deg,longitude_deg,rmu0,fract)
2202          zrmu0 = rmu0
2203          swradcorr = 1.0
2204          ! Calcul du flag jour-nuit
2205          JrNt = 0.0
2206          WHERE (fract.GT.0.0) JrNt = 1.0
2207       CASE(2) 
2208          !  Avec cycle diurne sans application des poids
2209          !  On integre entre gmtime-pdtphys et gmtime+pdtphys*(radpas-1)
2210          !  Comme cette routine est appele a tous les pas de temps de
2211          !  la physique meme si le rayonnement n'est pas appele je
2212          !  remonte en arriere les radpas-1 pas de temps
2213          !  suivant. Petite ruse avec MOD pour prendre en compte le
2214          !  premier pas de temps de la physique pendant lequel
2215          !  itaprad=0
2216          zdtime1=dtime*REAL(-MOD(itaprad,radpas)-1)     
2217          zdtime2=dtime*REAL(radpas-MOD(itaprad,radpas)-1)
2218          CALL zenang(zlongi,jH_cur,zdtime1,zdtime2, &
2219               latitude_deg,longitude_deg,rmu0,fract)
2220          !
2221          ! Calcul des poids
2222          !
2223          zdtime1=-dtime !--on corrige le rayonnement pour representer le
2224          zdtime2=0.0    !--pas de temps de la physique qui se termine
2225          CALL zenang(zlongi,jH_cur,zdtime1,zdtime2, &
2226               latitude_deg,longitude_deg,zrmu0,zfract)
2227          swradcorr = 0.0
2228          WHERE (rmu0.GE.1.e-10 .OR. fract.GE.1.e-10) &
2229               swradcorr=zfract/fract*zrmu0/rmu0
2230          ! Calcul du flag jour-nuit
2231          JrNt = 0.0
2232          WHERE (zfract.GT.0.0) JrNt = 1.0
2233       END SELECT
2234    ENDIF
2235    sza_o = ACOS (rmu0) *180./pi
2236
2237    IF (mydebug) THEN
2238       CALL writefield_phy('u_seri',u_seri,nbp_lev)
2239       CALL writefield_phy('v_seri',v_seri,nbp_lev)
2240       CALL writefield_phy('t_seri',t_seri,nbp_lev)
2241       CALL writefield_phy('q_seri',q_seri,nbp_lev)
2242    ENDIF
2243
2244    !cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
2245    ! Appel au pbl_surface : Planetary Boudary Layer et Surface
2246    ! Cela implique tous les interactions des sous-surfaces et la
2247    ! partie diffusion turbulent du couche limit.
2248    !
2249    ! Certains varibales de sorties de pbl_surface sont utiliser que pour
2250    ! ecriture des fihiers hist_XXXX.nc, ces sont :
2251    !   qsol,      zq2m,      s_pblh,  s_lcl,
2252    !   s_capCL,   s_oliqCL,  s_cteiCL,s_pblT,
2253    !   s_therm,   s_trmb1,   s_trmb2, s_trmb3,
2254    !   zu10m,     zv10m,   fder,
2255    !   zxqsurf,   rh2m,      zxfluxu, zxfluxv,
2256    !   frugs,     agesno,    fsollw,  fsolsw,
2257    !   d_ts,      fevap,     fluxlat, t2m,
2258    !   wfbils,    wfbilo,    fluxt,   fluxu, fluxv,
2259    !
2260    ! Certains ne sont pas utiliser du tout :
2261    !   dsens, devap, zxsnow, zxfluxt, zxfluxq, q2m, fluxq
2262    !
2263
2264    ! Calcul de l'humidite de saturation au niveau du sol
2265
2266
2267
2268    IF (iflag_pbl/=0) THEN
2269
2270       !jyg+nrlmd<
2271!!jyg       IF (prt_level .ge. 2 .and. mod(iflag_pbl_split,2) .eq. 1) THEN
2272       IF (prt_level .ge. 2 .and. mod(iflag_pbl_split,10) .ge. 1) THEN
2273          print *,'debut du splitting de la PBL'
2274       ENDIF
2275       ! !!
2276       !>jyg+nrlmd
2277       !
2278       !-------gustiness calculation-------!
2279       IF (iflag_gusts==0) THEN
2280          gustiness(1:klon)=0
2281       ELSE IF (iflag_gusts==1) THEN
2282          gustiness(1:klon)=f_gust_bl*ale_bl(1:klon)+f_gust_wk*ale_wake(1:klon)
2283       ELSE IF (iflag_gusts==2) THEN
2284          gustiness(1:klon)=f_gust_bl*ale_bl_stat(1:klon)+f_gust_wk*ale_wake(1:klon)
2285          ! ELSE IF (iflag_gusts==2) THEN
2286          !    do i = 1, klon
2287          !       gustiness(i)=f_gust_bl*ale_bl(i)+sigma_wk(i)*f_gust_wk&
2288          !           *ale_wake(i) !! need to make sigma_wk accessible here
2289          !    enddo
2290          ! ELSE IF (iflag_gusts==3) THEN
2291          !    do i = 1, klon
2292          !       gustiness(i)=f_gust_bl*alp_bl(i)+f_gust_wk*alp_wake(i)
2293          !    enddo
2294       ENDIF
2295
2296
2297
2298       CALL pbl_surface(  &
2299            dtime,     date0,     itap,    days_elapsed+1, &
2300            debut,     lafin, &
2301            longitude_deg, latitude_deg, rugoro,  zrmu0,      &
2302            zsig,      sollwdown, pphi,    cldt,      &
2303            rain_fall, snow_fall, solsw,   sollw,     &
2304            gustiness,                                &
2305            t_seri,    q_seri,    u_seri,  v_seri,    &
2306                                !nrlmd+jyg<
2307            wake_deltat, wake_deltaq, wake_cstar, wake_s, &
2308                                !>nrlmd+jyg
2309            pplay,     paprs,     pctsrf,             &
2310            ftsol,SFRWL,falb_dir,falb_dif,ustar,u10m,v10m,wstar, &
2311                                !albedo SB <<<
2312            cdragh,    cdragm,  u1,    v1,            &
2313                                !albedo SB >>>
2314                                ! albsol1,   albsol2,   sens,    evap,      &
2315            albsol_dir,   albsol_dif,   sens,    evap,   & 
2316                                !albedo SB <<<
2317            albsol3_lic,runoff,   snowhgt,   qsnow, to_ice, sissnow, &
2318            zxtsol,    zxfluxlat, zt2m,    qsat2m,  &
2319            d_t_vdf,   d_q_vdf,   d_u_vdf, d_v_vdf, d_t_diss, &
2320                                !nrlmd<
2321                                !jyg<
2322            d_t_vdf_w, d_q_vdf_w, &
2323            d_t_vdf_x, d_q_vdf_x, &
2324            sens_x, zxfluxlat_x, sens_w, zxfluxlat_w, &
2325                                !>jyg
2326            delta_tsurf,wake_dens, &
2327            cdragh_x,cdragh_w,cdragm_x,cdragm_w, &
2328            kh,kh_x,kh_w, &
2329                                !>nrlmd
2330            coefh(1:klon,1:klev,1:nbsrf+1), coefm(1:klon,1:klev,1:nbsrf+1), &
2331            slab_wfbils,                 &
2332            qsol,      zq2m,      s_pblh,  s_lcl, &
2333                                !jyg<
2334            s_pblh_x, s_lcl_x, s_pblh_w, s_lcl_w, &
2335                                !>jyg
2336            s_capCL,   s_oliqCL,  s_cteiCL,s_pblT, &
2337            s_therm,   s_trmb1,   s_trmb2, s_trmb3, &
2338            zustar, zu10m,     zv10m,   fder, &
2339            zxqsurf,   rh2m,      zxfluxu, zxfluxv, &
2340            z0m, z0h,     agesno,    fsollw,  fsolsw, &
2341            d_ts,      fevap,     fluxlat, t2m, &
2342            wfbils, wfbilo, wfevap, wfrain, wfsnow, &
2343            fluxt,   fluxu,  fluxv, &
2344            dsens,     devap,     zxsnow, &
2345            zxfluxt,   zxfluxq,   q2m,     fluxq, pbl_tke, &
2346                                !nrlmd+jyg<
2347            wake_delta_pbl_TKE, &
2348                                !>nrlmd+jyg
2349             treedrg )
2350!FC
2351       !
2352       !  Add turbulent diffusion tendency to the wake difference variables
2353!!jyg       IF (mod(iflag_pbl_split,2) .NE. 0) THEN
2354       IF (mod(iflag_pbl_split,10) .NE. 0) THEN
2355!jyg<
2356          d_deltat_vdf(:,:) = d_t_vdf_w(:,:)-d_t_vdf_x(:,:)
2357          d_deltaq_vdf(:,:) = d_q_vdf_w(:,:)-d_q_vdf_x(:,:)
2358          CALL add_wake_tend &
2359             (d_deltat_vdf, d_deltaq_vdf, dsig0, ddens0, wkoccur1, 'vdf', abortphy)
2360       ELSE
2361          d_deltat_vdf(:,:) = 0.
2362          d_deltaq_vdf(:,:) = 0.
2363!>jyg
2364       ENDIF
2365
2366
2367
2368
2369
2370       !---------------------------------------------------------------------
2371       ! ajout des tendances de la diffusion turbulente
2372       IF (klon_glo==1) THEN
2373          CALL add_pbl_tend &
2374               (d_u_vdf,d_v_vdf,d_t_vdf+d_t_diss,d_q_vdf,dql0,dqi0,paprs,&
2375               'vdf',abortphy,flag_inhib_tend,itap)
2376       ELSE
2377          CALL add_phys_tend &
2378               (d_u_vdf,d_v_vdf,d_t_vdf+d_t_diss,d_q_vdf,dql0,dqi0,paprs,&
2379               'vdf',abortphy,flag_inhib_tend,itap,0)
2380       ENDIF
2381       call prt_enerbil('vdf',itap)
2382       !--------------------------------------------------------------------
2383
2384       IF (mydebug) THEN
2385          CALL writefield_phy('u_seri',u_seri,nbp_lev)
2386          CALL writefield_phy('v_seri',v_seri,nbp_lev)
2387          CALL writefield_phy('t_seri',t_seri,nbp_lev)
2388          CALL writefield_phy('q_seri',q_seri,nbp_lev)
2389       ENDIF
2390
2391       !albedo SB >>>
2392       albsol1=0.
2393       albsol2=0.
2394       falb1=0.
2395       falb2=0.
2396       SELECT CASE(nsw)
2397       CASE(2)
2398          albsol1=albsol_dir(:,1)
2399          albsol2=albsol_dir(:,2)
2400          falb1=falb_dir(:,1,:)
2401          falb2=falb_dir(:,2,:)
2402       CASE(4)
2403          albsol1=albsol_dir(:,1)
2404          albsol2=albsol_dir(:,2)*SFRWL(2)+albsol_dir(:,3)*SFRWL(3) &
2405               +albsol_dir(:,4)*SFRWL(4)
2406          albsol2=albsol2/(SFRWL(2)+SFRWL(3)+SFRWL(4))
2407          falb1=falb_dir(:,1,:)
2408          falb2=falb_dir(:,2,:)*SFRWL(2)+falb_dir(:,3,:)*SFRWL(3) &
2409               +falb_dir(:,4,:)*SFRWL(4)
2410          falb2=falb2/(SFRWL(2)+SFRWL(3)+SFRWL(4))
2411       CASE(6)
2412          albsol1=albsol_dir(:,1)*SFRWL(1)+albsol_dir(:,2)*SFRWL(2) &
2413               +albsol_dir(:,3)*SFRWL(3)
2414          albsol1=albsol1/(SFRWL(1)+SFRWL(2)+SFRWL(3))
2415          albsol2=albsol_dir(:,4)*SFRWL(4)+albsol_dir(:,5)*SFRWL(5) &
2416               +albsol_dir(:,6)*SFRWL(6)
2417          albsol2=albsol2/(SFRWL(4)+SFRWL(5)+SFRWL(6))
2418          falb1=falb_dir(:,1,:)*SFRWL(1)+falb_dir(:,2,:)*SFRWL(2) &
2419               +falb_dir(:,3,:)*SFRWL(3)
2420          falb1=falb1/(SFRWL(1)+SFRWL(2)+SFRWL(3))
2421          falb2=falb_dir(:,4,:)*SFRWL(4)+falb_dir(:,5,:)*SFRWL(5) &
2422               +falb_dir(:,6,:)*SFRWL(6)
2423          falb2=falb2/(SFRWL(4)+SFRWL(5)+SFRWL(6))
2424       END SELECt
2425       !albedo SB <<<
2426
2427
2428       CALL evappot(klon,nbsrf,ftsol,pplay(:,1),cdragh, &
2429            t_seri(:,1),q_seri(:,1),u_seri(:,1),v_seri(:,1),evap_pot)
2430
2431    ENDIF
2432    ! =================================================================== c
2433    !   Calcul de Qsat
2434
2435    DO k = 1, klev
2436       DO i = 1, klon
2437          zx_t = t_seri(i,k)
2438          IF (thermcep) THEN
2439             zdelta = MAX(0.,SIGN(1.,rtt-zx_t))
2440             zx_qs  = r2es * FOEEW(zx_t,zdelta)/pplay(i,k)
2441             zx_qs  = MIN(0.5,zx_qs)
2442             zcor   = 1./(1.-retv*zx_qs)
2443             zx_qs  = zx_qs*zcor
2444          ELSE
2445             !!           IF (zx_t.LT.t_coup) THEN             !jyg
2446             IF (zx_t.LT.rtt) THEN                  !jyg
2447                zx_qs = qsats(zx_t)/pplay(i,k)
2448             ELSE
2449                zx_qs = qsatl(zx_t)/pplay(i,k)
2450             ENDIF
2451          ENDIF
2452          zqsat(i,k)=zx_qs
2453       ENDDO
2454    ENDDO
2455
2456    IF (prt_level.ge.1) THEN
2457       write(lunout,*) 'L   qsat (g/kg) avant clouds_gno'
2458       write(lunout,'(i4,f15.4)') (k,1000.*zqsat(igout,k),k=1,klev)
2459    ENDIF
2460    !
2461    ! Appeler la convection (au choix)
2462    !
2463    DO k = 1, klev
2464       DO i = 1, klon
2465          conv_q(i,k) = d_q_dyn(i,k)  &
2466               + d_q_vdf(i,k)/dtime
2467          conv_t(i,k) = d_t_dyn(i,k)  &
2468               + d_t_vdf(i,k)/dtime
2469       ENDDO
2470    ENDDO
2471    IF (check) THEN
2472       za = qcheck(klon,klev,paprs,q_seri,ql_seri,cell_area)
2473       WRITE(lunout,*) "avantcon=", za
2474    ENDIF
2475    zx_ajustq = .FALSE.
2476    IF (iflag_con.EQ.2) zx_ajustq=.TRUE.
2477    IF (zx_ajustq) THEN
2478       DO i = 1, klon
2479          z_avant(i) = 0.0
2480       ENDDO
2481       DO k = 1, klev
2482          DO i = 1, klon
2483             z_avant(i) = z_avant(i) + (q_seri(i,k)+ql_seri(i,k)) &
2484                  *(paprs(i,k)-paprs(i,k+1))/RG
2485          ENDDO
2486       ENDDO
2487    ENDIF
2488
2489    ! Calcule de vitesse verticale a partir de flux de masse verticale
2490    DO k = 1, klev
2491       DO i = 1, klon
2492          omega(i,k) = RG*flxmass_w(i,k) / cell_area(i)
2493       ENDDO
2494    ENDDO
2495
2496    IF (prt_level.ge.1) write(lunout,*) 'omega(igout, :) = ', &
2497         omega(igout, :)
2498    !
2499    ! Appel de la convection tous les "cvpas"
2500    !
2501!!jyg    IF (MOD(itapcv,cvpas).EQ.0) THEN
2502!!    print *,' physiq : itapcv, cvpas, itap-1, cvpas_0 ', &
2503!!                       itapcv, cvpas, itap-1, cvpas_0
2504    IF (MOD(itapcv,cvpas).EQ.0 .OR. MOD(itap-1,cvpas_0).EQ.0) THEN
2505
2506    !
2507    ! Mettre a zero des variables de sortie (pour securite)
2508    !
2509    pmflxr(:,:) = 0.
2510    pmflxs(:,:) = 0.
2511    wdtrainA(:,:) = 0.
2512    wdtrainM(:,:) = 0.
2513    upwd(:,:) = 0.
2514    dnwd(:,:) = 0.
2515    ep(:,:) = 0.
2516    da(:,:)=0.
2517    mp(:,:)=0.
2518    wght_cvfd(:,:)=0.
2519    phi(:,:,:)=0.
2520    phi2(:,:,:)=0.
2521    epmlmMm(:,:,:)=0.
2522    eplaMm(:,:)=0.
2523    d1a(:,:)=0.
2524    dam(:,:)=0.
2525    elij(:,:,:)=0.
2526    ev(:,:)=0.
2527    clw(:,:)=0.
2528    sij(:,:,:)=0.
2529    !
2530    IF (iflag_con.EQ.1) THEN
2531       abort_message ='reactiver le call conlmd dans physiq.F'
2532       CALL abort_physic (modname,abort_message,1)
2533       !     CALL conlmd (dtime, paprs, pplay, t_seri, q_seri, conv_q,
2534       !    .             d_t_con, d_q_con,
2535       !    .             rain_con, snow_con, ibas_con, itop_con)
2536    ELSE IF (iflag_con.EQ.2) THEN
2537       CALL conflx(dtime, paprs, pplay, t_seri, q_seri, &
2538            conv_t, conv_q, -evap, omega, &
2539            d_t_con, d_q_con, rain_con, snow_con, &
2540            pmfu, pmfd, pen_u, pde_u, pen_d, pde_d, &
2541            kcbot, kctop, kdtop, pmflxr, pmflxs)
2542       d_u_con = 0.
2543       d_v_con = 0.
2544
2545       WHERE (rain_con < 0.) rain_con = 0.
2546       WHERE (snow_con < 0.) snow_con = 0.
2547       DO i = 1, klon
2548          ibas_con(i) = klev+1 - kcbot(i)
2549          itop_con(i) = klev+1 - kctop(i)
2550       ENDDO
2551    ELSE IF (iflag_con.GE.3) THEN
2552       ! nb of tracers for the KE convection:
2553       ! MAF la partie traceurs est faite dans phytrac
2554       ! on met ntra=1 pour limiter les appels mais on peut
2555       ! supprimer les calculs / ftra.
2556       ntra = 1
2557
2558       !=======================================================================
2559       !ajout pour la parametrisation des poches froides: calcul de
2560       !t_w et t_x: si pas de poches froides, t_w=t_x=t_seri
2561       IF (iflag_wake>=1) THEN
2562         DO k=1,klev
2563            DO i=1,klon
2564                t_w(i,k) = t_seri(i,k) + (1-wake_s(i))*wake_deltat(i,k)
2565                q_w(i,k) = q_seri(i,k) + (1-wake_s(i))*wake_deltaq(i,k)
2566                t_x(i,k) = t_seri(i,k) - wake_s(i)*wake_deltat(i,k)
2567                q_x(i,k) = q_seri(i,k) - wake_s(i)*wake_deltaq(i,k)
2568            ENDDO
2569         ENDDO
2570       ELSE
2571               t_w(:,:) = t_seri(:,:)
2572                q_w(:,:) = q_seri(:,:)
2573                t_x(:,:) = t_seri(:,:)
2574                q_x(:,:) = q_seri(:,:)
2575       ENDIF
2576       !
2577       !jyg<
2578       ! Perform dry adiabatic adjustment on wake profile
2579       ! The corresponding tendencies are added to the convective tendencies
2580       ! after the call to the convective scheme.
2581       IF (iflag_wake>=1) then
2582          IF (iflag_adjwk >= 1) THEN
2583             limbas(:) = 1
2584             CALL ajsec(paprs, pplay, t_w, q_w, limbas, &
2585                  d_t_adjwk, d_q_adjwk)
2586             !
2587             DO k=1,klev
2588                DO i=1,klon
2589                   IF (wake_s(i) .GT. 1.e-3) THEN
2590                      t_w(i,k) = t_w(i,k) + d_t_adjwk(i,k)
2591                      q_w(i,k) = q_w(i,k) + d_q_adjwk(i,k)
2592                      d_deltat_ajs_cv(i,k) = d_t_adjwk(i,k)
2593                      d_deltaq_ajs_cv(i,k) = d_q_adjwk(i,k)
2594                   ELSE
2595                      d_deltat_ajs_cv(i,k) = 0.
2596                      d_deltaq_ajs_cv(i,k) = 0.
2597                   ENDIF
2598                ENDDO
2599             ENDDO
2600             IF (iflag_adjwk == 2) THEN
2601               CALL add_wake_tend &
2602                 (d_deltat_ajs_cv, d_deltaq_ajs_cv, dsig0, ddens0, wkoccur1, 'ajs_cv', abortphy)
2603             ENDIF  ! (iflag_adjwk == 2)
2604          ENDIF  ! (iflag_adjwk >= 1)
2605       ENDIF ! (iflag_wake>=1)
2606       !>jyg
2607       !
2608       
2609!!      print *,'physiq. q_w(1,k), q_x(1,k) ', &
2610!!             (k, q_w(1,k), q_x(1,k),k=1,25)
2611
2612!jyg<
2613       CALL alpale( debut, itap, dtime, paprs, omega, t_seri,   &
2614                    alp_offset, it_wape_prescr,  wape_prescr, fip_prescr, &
2615                    ale_bl_prescr, alp_bl_prescr, &
2616                    wake_pe, wake_fip,  &
2617                    Ale_bl, Ale_bl_trig, Alp_bl, &
2618                    Ale, Alp , Ale_wake, Alp_wake)
2619!>jyg
2620!
2621       ! sb, oct02:
2622       ! Schema de convection modularise et vectorise:
2623       ! (driver commun aux versions 3 et 4)
2624       !
2625       IF (ok_cvl) THEN ! new driver for convectL
2626          !
2627          !jyg<
2628          ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2629          ! Calculate the upmost level of deep convection loops: k_upper_cv
2630          !  (near 22 km)
2631          izero = klon/2+1/klon
2632          k_upper_cv = klev
2633          DO k = klev,1,-1
2634             IF (pphi(izero,k) > 22.e4) k_upper_cv = k
2635          ENDDO
2636          IF (prt_level .ge. 5) THEN
2637             Print *, 'upmost level of deep convection loops: k_upper_cv = ', &
2638                  k_upper_cv
2639          ENDIF
2640          !
2641          !>jyg
2642          IF (type_trac == 'repr') THEN
2643             nbtr_tmp=ntra
2644          ELSE
2645             nbtr_tmp=nbtr
2646          ENDIF
2647          !jyg   iflag_con est dans clesphys
2648          !c          CALL concvl (iflag_con,iflag_clos,
2649          CALL concvl (iflag_clos, &
2650               dtime, paprs, pplay, k_upper_cv, t_x,q_x, &
2651               t_w,q_w,wake_s, &
2652               u_seri,v_seri,tr_seri,nbtr_tmp, &
2653               ALE,ALP, &
2654               sig1,w01, &
2655               d_t_con,d_q_con,d_u_con,d_v_con,d_tr, &
2656               rain_con, snow_con, ibas_con, itop_con, sigd, &
2657               ema_cbmf,plcl,plfc,wbeff,convoccur,upwd,dnwd,dnwd0, &
2658               Ma,mip,Vprecip,cape,cin,tvp,Tconv,iflagctrl, &
2659               pbase,bbase,dtvpdt1,dtvpdq1,dplcldt,dplcldr,qcondc,wd, &
2660                                ! RomP >>>
2661                                !!     .        pmflxr,pmflxs,da,phi,mp,
2662                                !!     .        ftd,fqd,lalim_conv,wght_th)
2663               pmflxr,pmflxs,da,phi,mp,phi2,d1a,dam,sij,clw,elij, &
2664               ftd,fqd,lalim_conv,wght_th, &
2665               ev, ep,epmlmMm,eplaMm, &
2666               wdtrainA,wdtrainM,wght_cvfd,qtc_cv,sigt_cv, &
2667               tau_cld_cv,coefw_cld_cv,epmax_diag)
2668
2669          ! RomP <<<
2670
2671          !IM begin
2672          !       print*,'physiq: cin pbase dnwd0 ftd fqd ',cin(1),pbase(1),
2673          !    .dnwd0(1,1),ftd(1,1),fqd(1,1)
2674          !IM end
2675          !IM cf. FH
2676          clwcon0=qcondc
2677          pmfu(:,:)=upwd(:,:)+dnwd(:,:)
2678          !
2679          !jyg<
2680          ! If convective tendencies are too large, then call convection
2681          !  every time step
2682          cvpas = cvpas_0
2683          DO k=1,k_upper_cv
2684             DO i=1,klon
2685               IF (d_t_con(i,k) > 6.721 .AND. d_t_con(i,k) < 6.722 .AND.&
2686                   d_q_con(i,k) > -.0002171 .AND. d_q_con(i,k) < -.0002170) THEN
2687                     dtcon_multistep_max = 3.
2688                     dqcon_multistep_max = 0.02
2689               ENDIF
2690             ENDDO
2691          ENDDO
2692!
2693          DO k=1,k_upper_cv
2694             DO i=1,klon
2695!!               IF (abs(d_t_con(i,k)) > 0.24 .OR. &
2696!!                   abs(d_q_con(i,k)) > 2.e-2) THEN
2697               IF (abs(d_t_con(i,k)) > dtcon_multistep_max .OR. &
2698                   abs(d_q_con(i,k)) > dqcon_multistep_max) THEN
2699                 cvpas = 1
2700!!                 print *,'physiq1, i,k,d_t_con(i,k),d_q_con(i,k) ', &
2701!!                                   i,k,d_t_con(i,k),d_q_con(i,k)
2702               ENDIF
2703             ENDDO
2704          ENDDO
2705!!!   Ligne a ne surtout pas remettre sans avoir murement reflechi (jyg)
2706!!!          call bcast(cvpas)
2707!!!   ------------------------------------------------------------
2708          !>jyg
2709          !
2710          DO i = 1, klon
2711             IF (iflagctrl(i).le.1) itau_con(i)=itau_con(i)+cvpas
2712          ENDDO
2713          !
2714          !jyg<
2715          !    Add the tendency due to the dry adjustment of the wake profile
2716          IF (iflag_wake>=1) THEN
2717            IF (iflag_adjwk == 2) THEN
2718              DO k=1,klev
2719                 DO i=1,klon
2720                    ftd(i,k) = ftd(i,k) + wake_s(i)*d_t_adjwk(i,k)/dtime
2721                    fqd(i,k) = fqd(i,k) + wake_s(i)*d_q_adjwk(i,k)/dtime
2722                    d_t_con(i,k) = d_t_con(i,k) + wake_s(i)*d_t_adjwk(i,k)
2723                    d_q_con(i,k) = d_q_con(i,k) + wake_s(i)*d_q_adjwk(i,k)
2724                 ENDDO
2725              ENDDO
2726            ENDIF  ! (iflag_adjwk = 2)
2727          ENDIF   ! (iflag_wake>=1)
2728          !>jyg
2729          !
2730       ELSE ! ok_cvl
2731
2732          ! MAF conema3 ne contient pas les traceurs
2733          CALL conema3 (dtime, &
2734               paprs,pplay,t_seri,q_seri, &
2735               u_seri,v_seri,tr_seri,ntra, &
2736               sig1,w01, &
2737               d_t_con,d_q_con,d_u_con,d_v_con,d_tr, &
2738               rain_con, snow_con, ibas_con, itop_con, &
2739               upwd,dnwd,dnwd0,bas,top, &
2740               Ma,cape,tvp,rflag, &
2741               pbase &
2742               ,bbase,dtvpdt1,dtvpdq1,dplcldt,dplcldr &
2743               ,clwcon0)
2744
2745       ENDIF ! ok_cvl
2746
2747       !
2748       ! Correction precip
2749       rain_con = rain_con * cvl_corr
2750       snow_con = snow_con * cvl_corr
2751       !
2752
2753       IF (.NOT. ok_gust) THEN
2754          do i = 1, klon
2755             wd(i)=0.0
2756          enddo
2757       ENDIF
2758
2759       ! =================================================================== c
2760       ! Calcul des proprietes des nuages convectifs
2761       !
2762
2763       !   calcul des proprietes des nuages convectifs
2764       clwcon0(:,:)=fact_cldcon*clwcon0(:,:)
2765       IF (iflag_cld_cv == 0) THEN
2766          CALL clouds_gno &
2767               (klon,klev,q_seri,zqsat,clwcon0,ptconv,ratqsc,rnebcon0)
2768       ELSE
2769          CALL clouds_bigauss &
2770               (klon,klev,q_seri,zqsat,qtc_cv,sigt_cv,ptconv,ratqsc,rnebcon0)
2771       ENDIF
2772
2773
2774       ! =================================================================== c
2775
2776       DO i = 1, klon
2777          itop_con(i) = min(max(itop_con(i),1),klev)
2778          ibas_con(i) = min(max(ibas_con(i),1),itop_con(i))
2779       ENDDO
2780
2781       DO i = 1, klon
2782          ema_pcb(i)  = paprs(i,ibas_con(i))
2783       ENDDO
2784       DO i = 1, klon
2785          ! L'idicage de itop_con peut cacher un pb potentiel
2786          ! FH sous la dictee de JYG, CR
2787          ema_pct(i)  = paprs(i,itop_con(i)+1)
2788
2789          IF (itop_con(i).gt.klev-3) THEN
2790             IF (prt_level >= 9) THEN
2791                write(lunout,*)'La convection monte trop haut '
2792                write(lunout,*)'itop_con(,',i,',)=',itop_con(i)
2793             ENDIF
2794          ENDIF
2795       ENDDO
2796    ELSE IF (iflag_con.eq.0) THEN
2797       write(lunout,*) 'On n appelle pas la convection'
2798       clwcon0=0.
2799       rnebcon0=0.
2800       d_t_con=0.
2801       d_q_con=0.
2802       d_u_con=0.
2803       d_v_con=0.
2804       rain_con=0.
2805       snow_con=0.
2806       bas=1
2807       top=1
2808    ELSE
2809       WRITE(lunout,*) "iflag_con non-prevu", iflag_con
2810       CALL abort_physic("physiq", "", 1)
2811    ENDIF
2812
2813    !     CALL homogene(paprs, q_seri, d_q_con, u_seri,v_seri,
2814    !    .              d_u_con, d_v_con)
2815
2816!jyg    Reinitialize proba_notrig and itapcv when convection has been called
2817    proba_notrig(:) = 1.
2818    itapcv = 0
2819    ENDIF !  (MOD(itapcv,cvpas).EQ.0 .OR. MOD(itapcv,cvpas_0).EQ.0)
2820!
2821    itapcv = itapcv+1
2822    !
2823    ! Compter les steps ou cvpas=1
2824    IF (cvpas == 1) THEN
2825      Ncvpaseq1 = Ncvpaseq1+1
2826    ENDIF
2827    IF (mod(itap,1000) == 0) THEN
2828      print *,' physiq, nombre de steps ou cvpas = 1 : ', Ncvpaseq1
2829    ENDIF
2830
2831!!!jyg  Appel diagnostique a add_phys_tend pour tester la conservation de
2832!!!     l'energie dans les courants satures.
2833!!    d_t_con_sat(:,:) = d_t_con(:,:) - ftd(:,:)*dtime
2834!!    d_q_con_sat(:,:) = d_q_con(:,:) - fqd(:,:)*dtime
2835!!    dql_sat(:,:) = (wdtrainA(:,:)+wdtrainM(:,:))*dtime/zmasse(:,:)
2836!!    CALL add_phys_tend(d_u_con, d_v_con, d_t_con_sat, d_q_con_sat, dql_sat,   &
2837!!                     dqi0, paprs, 'convection_sat', abortphy, flag_inhib_tend,& 
2838!!                     itap, 1)
2839!!    call prt_enerbil('convection_sat',itap)
2840!!
2841!!
2842    CALL add_phys_tend(d_u_con, d_v_con, d_t_con, d_q_con, dql0, dqi0, paprs, &
2843         'convection',abortphy,flag_inhib_tend,itap,0)
2844    call prt_enerbil('convection',itap)
2845
2846    !-------------------------------------------------------------------------
2847
2848    IF (mydebug) THEN
2849       CALL writefield_phy('u_seri',u_seri,nbp_lev)
2850       CALL writefield_phy('v_seri',v_seri,nbp_lev)
2851       CALL writefield_phy('t_seri',t_seri,nbp_lev)
2852       CALL writefield_phy('q_seri',q_seri,nbp_lev)
2853    ENDIF
2854
2855    IF (check) THEN
2856       za = qcheck(klon,klev,paprs,q_seri,ql_seri,cell_area)
2857       WRITE(lunout,*)"aprescon=", za
2858       zx_t = 0.0
2859       za = 0.0
2860       DO i = 1, klon
2861          za = za + cell_area(i)/REAL(klon)
2862          zx_t = zx_t + (rain_con(i)+ &
2863               snow_con(i))*cell_area(i)/REAL(klon)
2864       ENDDO
2865       zx_t = zx_t/za*dtime
2866       WRITE(lunout,*)"Precip=", zx_t
2867    ENDIF
2868    IF (zx_ajustq) THEN
2869       DO i = 1, klon
2870          z_apres(i) = 0.0
2871       ENDDO
2872       DO k = 1, klev
2873          DO i = 1, klon
2874             z_apres(i) = z_apres(i) + (q_seri(i,k)+ql_seri(i,k)) &
2875                  *(paprs(i,k)-paprs(i,k+1))/RG
2876          ENDDO
2877       ENDDO
2878       DO i = 1, klon
2879          z_factor(i) = (z_avant(i)-(rain_con(i)+snow_con(i))*dtime) &
2880               /z_apres(i)
2881       ENDDO
2882       DO k = 1, klev
2883          DO i = 1, klon
2884             IF (z_factor(i).GT.(1.0+1.0E-08) .OR. &
2885                  z_factor(i).LT.(1.0-1.0E-08)) THEN
2886                q_seri(i,k) = q_seri(i,k) * z_factor(i)
2887             ENDIF
2888          ENDDO
2889       ENDDO
2890    ENDIF
2891    zx_ajustq=.FALSE.
2892
2893    !
2894    !==========================================================================
2895    !RR:Evolution de la poche froide: on ne fait pas de separation wake/env
2896    !pour la couche limite diffuse pour l instant
2897    !
2898    !
2899    ! nrlmd le 22/03/2011---Si on met les poches hors des thermiques
2900    ! il faut rajouter cette tendance calcul\'ee hors des poches
2901    ! froides
2902    !
2903    IF (iflag_wake>=1) THEN
2904       !
2905       !
2906       ! Call wakes every "wkpas" step
2907       !
2908       IF (MOD(itapwk,wkpas).EQ.0) THEN
2909          !
2910          DO k=1,klev
2911             DO i=1,klon
2912                dt_dwn(i,k)  = ftd(i,k)
2913                dq_dwn(i,k)  = fqd(i,k)
2914                M_dwn(i,k)   = dnwd0(i,k)
2915                M_up(i,k)    = upwd(i,k)
2916                dt_a(i,k)    = d_t_con(i,k)/dtime - ftd(i,k)
2917                dq_a(i,k)    = d_q_con(i,k)/dtime - fqd(i,k)
2918             ENDDO
2919          ENDDO
2920         
2921          IF (iflag_wake==2) THEN
2922             ok_wk_lsp(:)=max(sign(1.,wake_s(:)-wake_s_min_lsp),0.)
2923             DO k = 1,klev
2924                dt_dwn(:,k)= dt_dwn(:,k)+ &
2925                     ok_wk_lsp(:)*(d_t_eva(:,k)+d_t_lsc(:,k))/dtime
2926                dq_dwn(:,k)= dq_dwn(:,k)+ &
2927                     ok_wk_lsp(:)*(d_q_eva(:,k)+d_q_lsc(:,k))/dtime
2928             ENDDO
2929          ELSEIF (iflag_wake==3) THEN
2930             ok_wk_lsp(:)=max(sign(1.,wake_s(:)-wake_s_min_lsp),0.)
2931             DO k = 1,klev
2932                DO i=1,klon
2933                   IF (rneb(i,k)==0.) THEN
2934                      ! On ne tient compte des tendances qu'en dehors des
2935                      ! nuages (c'est-\`a-dire a priri dans une region ou
2936                      ! l'eau se reevapore).
2937                      dt_dwn(i,k)= dt_dwn(i,k)+ &
2938                           ok_wk_lsp(i)*d_t_lsc(i,k)/dtime
2939                      dq_dwn(i,k)= dq_dwn(i,k)+ &
2940                           ok_wk_lsp(i)*d_q_lsc(i,k)/dtime
2941                   ENDIF
2942                ENDDO
2943             ENDDO
2944          ENDIF
2945         
2946          !
2947          !calcul caracteristiques de la poche froide
2948          CALL calWAKE (iflag_wake_tend, paprs, pplay, dtime, &
2949               t_seri, q_seri, omega,  &
2950               dt_dwn, dq_dwn, M_dwn, M_up,  &
2951               dt_a, dq_a,  &
2952               sigd,  &
2953               wake_deltat, wake_deltaq, wake_s, wake_dens,  &
2954               wake_dth, wake_h,  &
2955!!               wake_pe, wake_fip, wake_gfl,  &
2956               wake_pe, wake_fip_0, wake_gfl,  &   !! jyg
2957               d_t_wake, d_q_wake,  &
2958               wake_k, t_x, q_x,  &
2959               wake_omgbdth, wake_dp_omgb,  &
2960               wake_dtKE, wake_dqKE,  &
2961               wake_omg, wake_dp_deltomg,  &
2962               wake_spread, wake_Cstar, d_deltat_wk_gw,  &
2963               d_deltat_wk, d_deltaq_wk, d_s_wk, d_dens_wk)
2964          !
2965          !jyg    Reinitialize itapwk when wakes have been called
2966          itapwk = 0
2967       ENDIF !  (MOD(itapwk,wkpas).EQ.0)
2968       !
2969       itapwk = itapwk+1
2970       !
2971       !-----------------------------------------------------------------------
2972       ! ajout des tendances des poches froides
2973       CALL add_phys_tend(du0,dv0,d_t_wake,d_q_wake,dql0,dqi0,paprs,'wake', &
2974            abortphy,flag_inhib_tend,itap,0)
2975       call prt_enerbil('wake',itap)
2976       !------------------------------------------------------------------------
2977
2978       ! Increment Wake state variables
2979       IF (iflag_wake_tend .GT. 0.) THEN
2980
2981         CALL add_wake_tend &
2982            (d_deltat_wk, d_deltaq_wk, d_s_wk, d_dens_wk, wake_k, &
2983             'wake', abortphy)
2984          call prt_enerbil('wake',itap)
2985       ENDIF   ! (iflag_wake_tend .GT. 0.)
2986
2987       IF (iflag_alp_wk_cond .GT. 0.) THEN
2988
2989         CALL alpale_wk(dtime, cell_area, wake_k, wake_s, wake_dens, wake_fip_0, &
2990                        wake_fip)
2991       ELSE
2992         wake_fip(:) = wake_fip_0(:)
2993       ENDIF   ! (iflag_alp_wk_cond .GT. 0.)
2994
2995    ENDIF  ! (iflag_wake>=1)
2996    !
2997    !===================================================================
2998    ! Convection seche (thermiques ou ajustement)
2999    !===================================================================
3000    !
3001    CALL stratocu_if(klon,klev,pctsrf,paprs, pplay,t_seri &
3002         ,seuil_inversion,weak_inversion,dthmin)
3003
3004
3005
3006    d_t_ajsb(:,:)=0.
3007    d_q_ajsb(:,:)=0.
3008    d_t_ajs(:,:)=0.
3009    d_u_ajs(:,:)=0.
3010    d_v_ajs(:,:)=0.
3011    d_q_ajs(:,:)=0.
3012    clwcon0th(:,:)=0.
3013    !
3014    !      fm_therm(:,:)=0.
3015    !      entr_therm(:,:)=0.
3016    !      detr_therm(:,:)=0.
3017    !
3018    IF (prt_level>9) WRITE(lunout,*) &
3019         'AVANT LA CONVECTION SECHE , iflag_thermals=' &
3020         ,iflag_thermals,'   nsplit_thermals=',nsplit_thermals
3021    IF (iflag_thermals<0) THEN
3022       !  Rien
3023       !  ====
3024       IF (prt_level>9) WRITE(lunout,*)'pas de convection seche'
3025
3026
3027    ELSE
3028
3029       !  Thermiques
3030       !  ==========
3031       IF (prt_level>9) WRITE(lunout,*)'JUSTE AVANT , iflag_thermals=' &
3032            ,iflag_thermals,'   nsplit_thermals=',nsplit_thermals
3033
3034
3035       !cc nrlmd le 10/04/2012
3036       DO k=1,klev+1
3037          DO i=1,klon
3038             pbl_tke_input(i,k,is_oce)=pbl_tke(i,k,is_oce)
3039             pbl_tke_input(i,k,is_ter)=pbl_tke(i,k,is_ter)
3040             pbl_tke_input(i,k,is_lic)=pbl_tke(i,k,is_lic)
3041             pbl_tke_input(i,k,is_sic)=pbl_tke(i,k,is_sic)
3042          ENDDO
3043       ENDDO
3044       !cc fin nrlmd le 10/04/2012
3045
3046       IF (iflag_thermals>=1) THEN
3047          !jyg<
3048!!       IF (mod(iflag_pbl_split/2,2) .EQ. 1) THEN
3049       IF (mod(iflag_pbl_split/10,10) .GE. 1) THEN
3050             !  Appel des thermiques avec les profils exterieurs aux poches
3051             DO k=1,klev
3052                DO i=1,klon
3053                   t_therm(i,k) = t_seri(i,k) - wake_s(i)*wake_deltat(i,k)
3054                   q_therm(i,k) = q_seri(i,k) - wake_s(i)*wake_deltaq(i,k)
3055                   u_therm(i,k) = u_seri(i,k)
3056                   v_therm(i,k) = v_seri(i,k)
3057                ENDDO
3058             ENDDO
3059          ELSE
3060             !  Appel des thermiques avec les profils moyens
3061             DO k=1,klev
3062                DO i=1,klon
3063                   t_therm(i,k) = t_seri(i,k)
3064                   q_therm(i,k) = q_seri(i,k)
3065                   u_therm(i,k) = u_seri(i,k)
3066                   v_therm(i,k) = v_seri(i,k)
3067                ENDDO
3068             ENDDO
3069          ENDIF
3070          !>jyg
3071          CALL calltherm(pdtphys &
3072               ,pplay,paprs,pphi,weak_inversion &
3073                        ! ,u_seri,v_seri,t_seri,q_seri,zqsat,debut & !jyg
3074               ,u_therm,v_therm,t_therm,q_therm,zqsat,debut &  !jyg
3075               ,d_u_ajs,d_v_ajs,d_t_ajs,d_q_ajs &
3076               ,fm_therm,entr_therm,detr_therm &
3077               ,zqasc,clwcon0th,lmax_th,ratqscth &
3078               ,ratqsdiff,zqsatth &
3079                                !on rajoute ale et alp, et les
3080                                !caracteristiques de la couche alim
3081               ,Ale_bl,Alp_bl,lalim_conv,wght_th, zmax0, f0, zw2,fraca &
3082               ,ztv,zpspsk,ztla,zthl &
3083                                !cc nrlmd le 10/04/2012
3084               ,pbl_tke_input,pctsrf,omega,cell_area &
3085               ,zlcl_th,fraca0,w0,w_conv,therm_tke_max0,env_tke_max0 &
3086               ,n2,s2,ale_bl_stat &
3087               ,therm_tke_max,env_tke_max &
3088               ,alp_bl_det,alp_bl_fluct_m,alp_bl_fluct_tke &
3089               ,alp_bl_conv,alp_bl_stat &
3090                                !cc fin nrlmd le 10/04/2012
3091               ,zqla,ztva )
3092          !
3093          !jyg<
3094!!jyg          IF (mod(iflag_pbl_split/2,2) .EQ. 1) THEN
3095          IF (mod(iflag_pbl_split/10,10) .GE. 1) THEN
3096             !  Si les thermiques ne sont presents que hors des
3097             !  poches, la tendance moyenne associ\'ee doit etre
3098             !  multipliee par la fraction surfacique qu'ils couvrent.
3099             DO k=1,klev
3100                DO i=1,klon
3101                   !
3102                   d_deltat_the(i,k) = - d_t_ajs(i,k)
3103                   d_deltaq_the(i,k) = - d_q_ajs(i,k)
3104                   !
3105                   d_u_ajs(i,k) = d_u_ajs(i,k)*(1.-wake_s(i))
3106                   d_v_ajs(i,k) = d_v_ajs(i,k)*(1.-wake_s(i))
3107                   d_t_ajs(i,k) = d_t_ajs(i,k)*(1.-wake_s(i))
3108                   d_q_ajs(i,k) = d_q_ajs(i,k)*(1.-wake_s(i))
3109                   !
3110                ENDDO
3111             ENDDO
3112          !
3113!!             CALL add_wake_tend &
3114!!                 (d_deltat_the, d_deltaq_the, dsig0, ddens0, wkoccur1, 'the', abortphy)
3115             CALL add_wake_tend &
3116                 (d_deltat_the, d_deltaq_the, dsig0, ddens0, wake_k, 'the', abortphy)
3117             call prt_enerbil('the',itap)
3118          !
3119          ENDIF  ! (mod(iflag_pbl_split/10,10) .GE. 1)
3120          !
3121          CALL add_phys_tend(d_u_ajs,d_v_ajs,d_t_ajs,d_q_ajs,  &
3122                             dql0,dqi0,paprs,'thermals', abortphy,flag_inhib_tend,itap,0)
3123          call prt_enerbil('thermals',itap)
3124          !
3125!
3126          CALL alpale_th( dtime, lmax_th, t_seri, cell_area,  &
3127                          cin, s2, n2,  &
3128                          ale_bl_trig, ale_bl_stat, ale_bl,  &
3129                          alp_bl, alp_bl_stat, &
3130                          proba_notrig, random_notrig)
3131          !>jyg
3132
3133          ! ------------------------------------------------------------------
3134          ! Transport de la TKE par les panaches thermiques.
3135          ! FH : 2010/02/01
3136          !     if (iflag_pbl.eq.10) then
3137          !     call thermcell_dtke(klon,klev,nbsrf,pdtphys,fm_therm,entr_therm,
3138          !    s           rg,paprs,pbl_tke)
3139          !     endif
3140          ! -------------------------------------------------------------------
3141
3142          DO i=1,klon
3143             !           zmax_th(i)=pphi(i,lmax_th(i))/rg
3144             !CR:04/05/12:correction calcul zmax
3145             zmax_th(i)=zmax0(i)
3146          ENDDO
3147
3148       ENDIF
3149
3150       !  Ajustement sec
3151       !  ==============
3152
3153       ! Dans le cas o\`u on active les thermiques, on fait partir l'ajustement
3154       ! a partir du sommet des thermiques.
3155       ! Dans le cas contraire, on demarre au niveau 1.
3156
3157       IF (iflag_thermals>=13.or.iflag_thermals<=0) THEN
3158
3159          IF (iflag_thermals.eq.0) THEN
3160             IF (prt_level>9) WRITE(lunout,*)'ajsec'
3161             limbas(:)=1
3162          ELSE
3163             limbas(:)=lmax_th(:)
3164          ENDIF
3165
3166          ! Attention : le call ajsec_convV2 n'est maintenu que momentanneement
3167          ! pour des test de convergence numerique.
3168          ! Le nouveau ajsec est a priori mieux, meme pour le cas
3169          ! iflag_thermals = 0 (l'ancienne version peut faire des tendances
3170          ! non nulles numeriquement pour des mailles non concernees.
3171
3172          IF (iflag_thermals==0) THEN
3173             ! Calling adjustment alone (but not the thermal plume model)
3174             CALL ajsec_convV2(paprs, pplay, t_seri,q_seri &
3175                  , d_t_ajsb, d_q_ajsb)
3176          ELSE IF (iflag_thermals>0) THEN
3177             ! Calling adjustment above the top of thermal plumes
3178             CALL ajsec(paprs, pplay, t_seri,q_seri,limbas &
3179                  , d_t_ajsb, d_q_ajsb)
3180          ENDIF
3181
3182          !--------------------------------------------------------------------
3183          ! ajout des tendances de l'ajustement sec ou des thermiques
3184          CALL add_phys_tend(du0,dv0,d_t_ajsb,d_q_ajsb,dql0,dqi0,paprs, &
3185               'ajsb',abortphy,flag_inhib_tend,itap,0)
3186          call prt_enerbil('ajsb',itap)
3187          d_t_ajs(:,:)=d_t_ajs(:,:)+d_t_ajsb(:,:)
3188          d_q_ajs(:,:)=d_q_ajs(:,:)+d_q_ajsb(:,:)
3189
3190          !---------------------------------------------------------------------
3191
3192       ENDIF
3193
3194    ENDIF
3195    !
3196    !===================================================================
3197    ! Computation of ratqs, the width (normalized) of the subrid scale
3198    ! water distribution
3199    CALL  calcratqs(klon,klev,prt_level,lunout,        &
3200         iflag_ratqs,iflag_con,iflag_cld_th,pdtphys,  &
3201         ratqsbas,ratqshaut,ratqsp0, ratqsdp, &
3202         tau_ratqs,fact_cldcon,   &
3203         ptconv,ptconvth,clwcon0th, rnebcon0th,     &
3204         paprs,pplay,q_seri,zqsat,fm_therm, &
3205         ratqs,ratqsc)
3206
3207
3208    !
3209    ! Appeler le processus de condensation a grande echelle
3210    ! et le processus de precipitation
3211    !-------------------------------------------------------------------------
3212    IF (prt_level .GE.10) THEN
3213       print *,'itap, ->fisrtilp ',itap
3214    ENDIF
3215    !
3216    CALL fisrtilp(dtime,paprs,pplay, &
3217         t_seri, q_seri,ptconv,ratqs, &
3218         d_t_lsc, d_q_lsc, d_ql_lsc, d_qi_lsc, rneb, cldliq, &
3219         rain_lsc, snow_lsc, &
3220         pfrac_impa, pfrac_nucl, pfrac_1nucl, &
3221         frac_impa, frac_nucl, beta_prec_fisrt, &
3222         prfl, psfl, rhcl,  &
3223         zqasc, fraca,ztv,zpspsk,ztla,zthl,iflag_cld_th, &
3224         iflag_ice_thermo)
3225    !
3226    WHERE (rain_lsc < 0) rain_lsc = 0.
3227    WHERE (snow_lsc < 0) snow_lsc = 0.
3228
3229!+JLD
3230!    write(*,9000) 'phys lsc',"enerbil: bil_q, bil_e,",rain_lsc+snow_lsc &
3231!        & ,((rcw-rcpd)*rain_lsc + (rcs-rcpd)*snow_lsc)*t_seri(1,1)-rlvtt*rain_lsc+rlstt*snow_lsc &
3232!        & ,rain_lsc,snow_lsc
3233!    write(*,9000) "rcpv","rcw",rcpv,rcw,rcs,t_seri(1,1)
3234!-JLD
3235    CALL add_phys_tend(du0,dv0,d_t_lsc,d_q_lsc,d_ql_lsc,d_qi_lsc,paprs, &
3236         'lsc',abortphy,flag_inhib_tend,itap,0)
3237    call prt_enerbil('lsc',itap)
3238    rain_num(:)=0.
3239    DO k = 1, klev
3240       DO i = 1, klon
3241          IF (ql_seri(i,k)>oliqmax) THEN
3242             rain_num(i)=rain_num(i)+(ql_seri(i,k)-oliqmax)*zmasse(i,k)/pdtphys
3243             ql_seri(i,k)=oliqmax
3244          ENDIF
3245       ENDDO
3246    ENDDO
3247    IF (nqo==3) THEN
3248    DO k = 1, klev
3249       DO i = 1, klon
3250          IF (qs_seri(i,k)>oicemax) THEN
3251             rain_num(i)=rain_num(i)+(qs_seri(i,k)-oicemax)*zmasse(i,k)/pdtphys
3252             qs_seri(i,k)=oicemax
3253          ENDIF
3254       ENDDO
3255    ENDDO
3256    ENDIF
3257
3258    !---------------------------------------------------------------------------
3259    DO k = 1, klev
3260       DO i = 1, klon
3261          cldfra(i,k) = rneb(i,k)
3262          !CR: a quoi ca sert? Faut-il ajouter qs_seri?
3263          IF (.NOT.new_oliq) cldliq(i,k) = ql_seri(i,k)
3264       ENDDO
3265    ENDDO
3266    IF (check) THEN
3267       za = qcheck(klon,klev,paprs,q_seri,ql_seri,cell_area)
3268       WRITE(lunout,*)"apresilp=", za
3269       zx_t = 0.0
3270       za = 0.0
3271       DO i = 1, klon
3272          za = za + cell_area(i)/REAL(klon)
3273          zx_t = zx_t + (rain_lsc(i) &
3274               + snow_lsc(i))*cell_area(i)/REAL(klon)
3275       ENDDO
3276       zx_t = zx_t/za*dtime
3277       WRITE(lunout,*)"Precip=", zx_t
3278    ENDIF
3279
3280    IF (mydebug) THEN
3281       CALL writefield_phy('u_seri',u_seri,nbp_lev)
3282       CALL writefield_phy('v_seri',v_seri,nbp_lev)
3283       CALL writefield_phy('t_seri',t_seri,nbp_lev)
3284       CALL writefield_phy('q_seri',q_seri,nbp_lev)
3285    ENDIF
3286
3287    !
3288    !-------------------------------------------------------------------
3289    !  PRESCRIPTION DES NUAGES POUR LE RAYONNEMENT
3290    !-------------------------------------------------------------------
3291
3292    ! 1. NUAGES CONVECTIFS
3293    !
3294    !IM cf FH
3295    !     IF (iflag_cld_th.eq.-1) THEN ! seulement pour Tiedtke
3296    IF (iflag_cld_th.le.-1) THEN ! seulement pour Tiedtke
3297       snow_tiedtke=0.
3298       !     print*,'avant calcul de la pseudo precip '
3299       !     print*,'iflag_cld_th',iflag_cld_th
3300       IF (iflag_cld_th.eq.-1) THEN
3301          rain_tiedtke=rain_con
3302       ELSE
3303          !       print*,'calcul de la pseudo precip '
3304          rain_tiedtke=0.
3305          !         print*,'calcul de la pseudo precip 0'
3306          DO k=1,klev
3307             DO i=1,klon
3308                IF (d_q_con(i,k).lt.0.) THEN
3309                   rain_tiedtke(i)=rain_tiedtke(i)-d_q_con(i,k)/pdtphys &
3310                        *(paprs(i,k)-paprs(i,k+1))/rg
3311                ENDIF
3312             ENDDO
3313          ENDDO
3314       ENDIF
3315       !
3316       !     call dump2d(iim,jjm,rain_tiedtke(2:klon-1),'PSEUDO PRECIP ')
3317       !
3318
3319       ! Nuages diagnostiques pour Tiedtke
3320       CALL diagcld1(paprs,pplay, &
3321                                !IM cf FH. rain_con,snow_con,ibas_con,itop_con,
3322            rain_tiedtke,snow_tiedtke,ibas_con,itop_con, &
3323            diafra,dialiq)
3324       DO k = 1, klev
3325          DO i = 1, klon
3326             IF (diafra(i,k).GT.cldfra(i,k)) THEN
3327                cldliq(i,k) = dialiq(i,k)
3328                cldfra(i,k) = diafra(i,k)
3329             ENDIF
3330          ENDDO
3331       ENDDO
3332
3333    ELSE IF (iflag_cld_th.ge.3) THEN
3334       !  On prend pour les nuages convectifs le max du calcul de la
3335       !  convection et du calcul du pas de temps precedent diminue d'un facteur
3336       !  facttemps
3337       facteur = pdtphys *facttemps
3338       DO k=1,klev
3339          DO i=1,klon
3340             rnebcon(i,k)=rnebcon(i,k)*facteur
3341             IF (rnebcon0(i,k)*clwcon0(i,k).GT.rnebcon(i,k)*clwcon(i,k)) THEN
3342                rnebcon(i,k)=rnebcon0(i,k)
3343                clwcon(i,k)=clwcon0(i,k)
3344             ENDIF
3345          ENDDO
3346       ENDDO
3347
3348       !   On prend la somme des fractions nuageuses et des contenus en eau
3349
3350       IF (iflag_cld_th>=5) THEN
3351
3352          DO k=1,klev
3353             ptconvth(:,k)=fm_therm(:,k+1)>0.
3354          ENDDO
3355
3356          IF (iflag_coupl==4) THEN
3357
3358             ! Dans le cas iflag_coupl==4, on prend la somme des convertures
3359             ! convectives et lsc dans la partie des thermiques
3360             ! Le controle par iflag_coupl est peut etre provisoire.
3361             DO k=1,klev
3362                DO i=1,klon
3363                   IF (ptconv(i,k).AND.ptconvth(i,k)) THEN
3364                      cldliq(i,k)=cldliq(i,k)+rnebcon(i,k)*clwcon(i,k)
3365                      cldfra(i,k)=min(cldfra(i,k)+rnebcon(i,k),1.)
3366                   ELSE IF (ptconv(i,k)) THEN
3367                      cldfra(i,k)=rnebcon(i,k)
3368                      cldliq(i,k)=rnebcon(i,k)*clwcon(i,k)
3369                   ENDIF
3370                ENDDO
3371             ENDDO
3372
3373          ELSE IF (iflag_coupl==5) THEN
3374             DO k=1,klev
3375                DO i=1,klon
3376                   cldfra(i,k)=min(cldfra(i,k)+rnebcon(i,k),1.)
3377                   cldliq(i,k)=cldliq(i,k)+rnebcon(i,k)*clwcon(i,k)
3378                ENDDO
3379             ENDDO
3380
3381          ELSE
3382
3383             ! Si on est sur un point touche par la convection
3384             ! profonde et pas par les thermiques, on prend la
3385             ! couverture nuageuse et l'eau nuageuse de la convection
3386             ! profonde.
3387
3388             !IM/FH: 2011/02/23
3389             ! definition des points sur lesquels ls thermiques sont actifs
3390
3391             DO k=1,klev
3392                DO i=1,klon
3393                   IF (ptconv(i,k).AND. .NOT.ptconvth(i,k)) THEN
3394                      cldfra(i,k)=rnebcon(i,k)
3395                      cldliq(i,k)=rnebcon(i,k)*clwcon(i,k)
3396                   ENDIF
3397                ENDDO
3398             ENDDO
3399
3400          ENDIF
3401
3402       ELSE
3403
3404          ! Ancienne version
3405          cldfra(:,:)=min(max(cldfra(:,:),rnebcon(:,:)),1.)
3406          cldliq(:,:)=cldliq(:,:)+rnebcon(:,:)*clwcon(:,:)
3407       ENDIF
3408
3409    ENDIF
3410
3411    !     plulsc(:)=0.
3412    !     do k=1,klev,-1
3413    !        do i=1,klon
3414    !              zzz=prfl(:,k)+psfl(:,k)
3415    !           if (.not.ptconvth.zzz.gt.0.)
3416    !        enddo prfl, psfl,
3417    !     enddo
3418    !
3419    ! 2. NUAGES STARTIFORMES
3420    !
3421    IF (ok_stratus) THEN
3422       CALL diagcld2(paprs,pplay,t_seri,q_seri, diafra,dialiq)
3423       DO k = 1, klev
3424          DO i = 1, klon
3425             IF (diafra(i,k).GT.cldfra(i,k)) THEN
3426                cldliq(i,k) = dialiq(i,k)
3427                cldfra(i,k) = diafra(i,k)
3428             ENDIF
3429          ENDDO
3430       ENDDO
3431    ENDIF
3432    !
3433    ! Precipitation totale
3434    !
3435    DO i = 1, klon
3436       rain_fall(i) = rain_con(i) + rain_lsc(i)
3437       snow_fall(i) = snow_con(i) + snow_lsc(i)
3438    ENDDO
3439    !
3440    ! Calculer l'humidite relative pour diagnostique
3441    !
3442    DO k = 1, klev
3443       DO i = 1, klon
3444          zx_t = t_seri(i,k)
3445          IF (thermcep) THEN
3446             !!           if (iflag_ice_thermo.eq.0) then                 !jyg
3447             zdelta = MAX(0.,SIGN(1.,rtt-zx_t))
3448             !!           else                                            !jyg
3449             !!           zdelta = MAX(0.,SIGN(1.,t_glace_min-zx_t))      !jyg
3450             !!           endif                                           !jyg
3451             zx_qs  = r2es * FOEEW(zx_t,zdelta)/pplay(i,k)
3452             zx_qs  = MIN(0.5,zx_qs)
3453             zcor   = 1./(1.-retv*zx_qs)
3454             zx_qs  = zx_qs*zcor
3455          ELSE
3456             !!           IF (zx_t.LT.t_coup) THEN             !jyg
3457             IF (zx_t.LT.rtt) THEN                  !jyg
3458                zx_qs = qsats(zx_t)/pplay(i,k)
3459             ELSE
3460                zx_qs = qsatl(zx_t)/pplay(i,k)
3461             ENDIF
3462          ENDIF
3463          zx_rh(i,k) = q_seri(i,k)/zx_qs
3464          zqsat(i,k)=zx_qs
3465       ENDDO
3466    ENDDO
3467
3468    !IM Calcul temp.potentielle a 2m (tpot) et temp. potentielle
3469    !   equivalente a 2m (tpote) pour diagnostique
3470    !
3471    DO i = 1, klon
3472       tpot(i)=zt2m(i)*(100000./paprs(i,1))**RKAPPA
3473       IF (thermcep) THEN
3474          IF(zt2m(i).LT.RTT) then
3475             Lheat=RLSTT
3476          ELSE
3477             Lheat=RLVTT
3478          ENDIF
3479       ELSE
3480          IF (zt2m(i).LT.RTT) THEN
3481             Lheat=RLSTT
3482          ELSE
3483             Lheat=RLVTT
3484          ENDIF
3485       ENDIF
3486       tpote(i) = tpot(i)*      &
3487            EXP((Lheat *qsat2m(i))/(RCPD*zt2m(i)))
3488    ENDDO
3489
3490    IF (type_trac == 'inca') THEN
3491#ifdef INCA
3492       CALL VTe(VTphysiq)
3493       CALL VTb(VTinca)
3494       calday = REAL(days_elapsed + 1) + jH_cur
3495
3496       CALL chemtime(itap+itau_phy-1, date0, dtime, itap)
3497       IF (config_inca == 'aero' .OR. config_inca == 'aeNP') THEN
3498          CALL AEROSOL_METEO_CALC( &
3499               calday,pdtphys,pplay,paprs,t,pmflxr,pmflxs, &
3500               prfl,psfl,pctsrf,cell_area, &
3501               latitude_deg,longitude_deg,u10m,v10m)
3502       ENDIF
3503
3504       zxsnow_dummy(:) = 0.0
3505
3506       CALL chemhook_begin (calday, &
3507            days_elapsed+1, &
3508            jH_cur, &
3509            pctsrf(1,1), &
3510            latitude_deg, &
3511            longitude_deg, &
3512            cell_area, &
3513            paprs, &
3514            pplay, &
3515            coefh(1:klon,1:klev,is_ave), &
3516            pphi, &
3517            t_seri, &
3518            u, &
3519            v, &
3520            wo(:, :, 1), &
3521            q_seri, &
3522            zxtsol, &
3523            zxsnow_dummy, &
3524            solsw, &
3525            albsol1, &
3526            rain_fall, &
3527            snow_fall, &
3528            itop_con, &
3529            ibas_con, &
3530            cldfra, &
3531            nbp_lon, &
3532            nbp_lat-1, &
3533            tr_seri, &
3534            ftsol, &
3535            paprs, &
3536            cdragh, &
3537            cdragm, &
3538            pctsrf, &
3539            pdtphys, &
3540            itap)
3541
3542       CALL VTe(VTinca)
3543       CALL VTb(VTphysiq)
3544#endif
3545    ENDIF !type_trac = inca
3546
3547
3548    !
3549    ! Appeler le rayonnement mais calculer tout d'abord l'albedo du sol.
3550    !
3551    IF (MOD(itaprad,radpas).EQ.0) THEN
3552
3553       !
3554       !jq - introduce the aerosol direct and first indirect radiative forcings
3555       !jq - Johannes Quaas, 27/11/2003 (quaas@lmd.jussieu.fr)
3556       IF (flag_aerosol .GT. 0) THEN
3557          IF (iflag_rrtm .EQ. 0) THEN !--old radiation
3558             IF (.NOT. aerosol_couple) THEN
3559                !
3560                CALL readaerosol_optic( &
3561                     debut, new_aod, flag_aerosol, itap, jD_cur-jD_ref, &
3562                     pdtphys, pplay, paprs, t_seri, rhcl, presnivs,  &
3563                     mass_solu_aero, mass_solu_aero_pi,  &
3564                     tau_aero, piz_aero, cg_aero,  &
3565                     tausum_aero, tau3d_aero)
3566             ENDIF
3567          ELSE                       ! RRTM radiation
3568             IF (aerosol_couple .AND. config_inca == 'aero' ) THEN
3569                abort_message='config_inca=aero et rrtm=1 impossible'
3570                CALL abort_physic(modname,abort_message,1)
3571             ELSE
3572                !
3573#ifdef CPP_RRTM
3574                IF (NSW.EQ.6) THEN
3575                   !--new aerosol properties SW and LW
3576                   !
3577#ifdef CPP_Dust
3578                   !--SPL aerosol model
3579                   CALL splaerosol_optic_rrtm( ok_alw, pplay, paprs, t_seri, rhcl, &
3580                        tr_seri, mass_solu_aero, mass_solu_aero_pi,  &
3581                        tau_aero_sw_rrtm, piz_aero_sw_rrtm, cg_aero_sw_rrtm,  &
3582                        tausum_aero, tau3d_aero)
3583#else
3584                   !--climatologies or INCA aerosols
3585                   CALL readaerosol_optic_rrtm( debut, aerosol_couple, ok_alw, &
3586                        new_aod, flag_aerosol, flag_bc_internal_mixture, itap, jD_cur-jD_ref, &
3587                        pdtphys, pplay, paprs, t_seri, rhcl, presnivs,  &
3588                        tr_seri, mass_solu_aero, mass_solu_aero_pi,  &
3589                        tau_aero_sw_rrtm, piz_aero_sw_rrtm, cg_aero_sw_rrtm,  &
3590                        tausum_aero, drytausum_aero, tau3d_aero)
3591#endif
3592                   !
3593                ELSE IF (NSW.EQ.2) THEN
3594                   !--for now we use the old aerosol properties
3595                   !
3596                   CALL readaerosol_optic( &
3597                        debut, new_aod, flag_aerosol, itap, jD_cur-jD_ref, &
3598                        pdtphys, pplay, paprs, t_seri, rhcl, presnivs,  &
3599                        mass_solu_aero, mass_solu_aero_pi,  &
3600                        tau_aero, piz_aero, cg_aero,  &
3601                        tausum_aero, tau3d_aero)
3602                   !
3603                   !--natural aerosols
3604                   tau_aero_sw_rrtm(:,:,1,:)=tau_aero(:,:,3,:)
3605                   piz_aero_sw_rrtm(:,:,1,:)=piz_aero(:,:,3,:)
3606                   cg_aero_sw_rrtm (:,:,1,:)=cg_aero (:,:,3,:)
3607                   !--all aerosols
3608                   tau_aero_sw_rrtm(:,:,2,:)=tau_aero(:,:,2,:)
3609                   piz_aero_sw_rrtm(:,:,2,:)=piz_aero(:,:,2,:)
3610                   cg_aero_sw_rrtm (:,:,2,:)=cg_aero (:,:,2,:)
3611                   !
3612                   !--no LW optics
3613                   tau_aero_lw_rrtm(:,:,:,:) = 1.e-15
3614                   !
3615                ELSE
3616                   abort_message='Only NSW=2 or 6 are possible with ' &
3617                        // 'aerosols and iflag_rrtm=1'
3618                   CALL abort_physic(modname,abort_message,1)
3619                ENDIF
3620#else
3621                abort_message='You should compile with -rrtm if running ' &
3622                     // 'with iflag_rrtm=1'
3623                CALL abort_physic(modname,abort_message,1)
3624#endif
3625                !
3626             ENDIF
3627          ENDIF
3628       ELSE   !--flag_aerosol = 0
3629          tausum_aero(:,:,:) = 0.
3630          drytausum_aero(:,:) = 0.
3631          mass_solu_aero(:,:) = 0.
3632          mass_solu_aero_pi(:,:) = 0.
3633          IF (iflag_rrtm .EQ. 0) THEN !--old radiation
3634             tau_aero(:,:,:,:) = 1.e-15
3635             piz_aero(:,:,:,:) = 1.
3636             cg_aero(:,:,:,:)  = 0.
3637          ELSE
3638             tau_aero_sw_rrtm(:,:,:,:) = 1.e-15
3639             tau_aero_lw_rrtm(:,:,:,:) = 1.e-15
3640             piz_aero_sw_rrtm(:,:,:,:) = 1.0
3641             cg_aero_sw_rrtm(:,:,:,:)  = 0.0
3642          ENDIF
3643       ENDIF
3644       !
3645       !--WMO criterion to determine tropopause
3646       CALL stratosphere_mask(missing_val, pphis, t_seri, pplay, latitude_deg)
3647       !
3648       !--STRAT AEROSOL
3649       !--updates tausum_aero,tau_aero,piz_aero,cg_aero
3650       IF (flag_aerosol_strat.GT.0) THEN
3651          IF (prt_level .GE.10) THEN
3652             PRINT *,'appel a readaerosolstrat', mth_cur
3653          ENDIF
3654          IF (iflag_rrtm.EQ.0) THEN
3655           IF (flag_aerosol_strat.EQ.1) THEN
3656             CALL readaerosolstrato(debut)
3657           ELSE
3658             abort_message='flag_aerosol_strat must equal 1 for rrtm=0'
3659             CALL abort_physic(modname,abort_message,1)
3660           ENDIF
3661          ELSE
3662#ifdef CPP_RRTM
3663#ifndef CPP_StratAer
3664          !--prescribed strat aerosols
3665          !--only in the case of non-interactive strat aerosols
3666            IF (flag_aerosol_strat.EQ.1) THEN
3667             CALL readaerosolstrato1_rrtm(debut)
3668            ELSEIF (flag_aerosol_strat.EQ.2) THEN
3669             CALL readaerosolstrato2_rrtm(debut)
3670            ELSE
3671             abort_message='flag_aerosol_strat must equal 1 or 2 for rrtm=1'
3672             CALL abort_physic(modname,abort_message,1)
3673            ENDIF
3674#endif
3675#else
3676             abort_message='You should compile with -rrtm if running ' &
3677                  // 'with iflag_rrtm=1'
3678             CALL abort_physic(modname,abort_message,1)
3679#endif
3680          ENDIF
3681       ENDIF
3682!
3683#ifdef CPP_RRTM
3684#ifdef CPP_StratAer
3685       !--compute stratospheric mask
3686       CALL stratosphere_mask(missing_val, pphis, t_seri, pplay, latitude_deg)
3687       !--interactive strat aerosols
3688       CALL calcaerosolstrato_rrtm(pplay,t_seri,paprs,debut)
3689#endif
3690#endif
3691       !--fin STRAT AEROSOL
3692       !     
3693
3694       ! Calculer les parametres optiques des nuages et quelques
3695       ! parametres pour diagnostiques:
3696       !
3697       IF (aerosol_couple.AND.config_inca=='aero') THEN
3698          mass_solu_aero(:,:)    = ccm(:,:,1)
3699          mass_solu_aero_pi(:,:) = ccm(:,:,2)
3700       ENDIF
3701
3702       IF (ok_newmicro) then
3703          IF (iflag_rrtm.NE.0) THEN
3704#ifdef CPP_RRTM
3705             IF (ok_cdnc.AND.NRADLP.NE.3) THEN
3706             abort_message='RRTM choix incoherent NRADLP doit etre egal a 3 ' &
3707                  // 'pour ok_cdnc'
3708             CALL abort_physic(modname,abort_message,1)
3709             ENDIF
3710#else
3711
3712             abort_message='You should compile with -rrtm if running with '//'iflag_rrtm=1'
3713             CALL abort_physic(modname,abort_message,1)
3714#endif
3715          ENDIF
3716          CALL newmicro (ok_cdnc, bl95_b0, bl95_b1, &
3717               paprs, pplay, t_seri, cldliq, cldfra, &
3718               cldtau, cldemi, cldh, cldl, cldm, cldt, cldq, &
3719               flwp, fiwp, flwc, fiwc, &
3720               mass_solu_aero, mass_solu_aero_pi, &
3721               cldtaupi, re, fl, ref_liq, ref_ice, &
3722               ref_liq_pi, ref_ice_pi)
3723       ELSE
3724          CALL nuage (paprs, pplay, &
3725               t_seri, cldliq, cldfra, cldtau, cldemi, &
3726               cldh, cldl, cldm, cldt, cldq, &
3727               ok_aie, &
3728               mass_solu_aero, mass_solu_aero_pi, &
3729               bl95_b0, bl95_b1, &
3730               cldtaupi, re, fl)
3731       ENDIF
3732       !
3733       !IM betaCRF
3734       !
3735       cldtaurad   = cldtau
3736       cldtaupirad = cldtaupi
3737       cldemirad   = cldemi
3738       cldfrarad   = cldfra
3739
3740       !
3741       IF (lon1_beta.EQ.-180..AND.lon2_beta.EQ.180..AND. &
3742           lat1_beta.EQ.90..AND.lat2_beta.EQ.-90.) THEN
3743          !
3744          ! global
3745          !
3746!IM 251017 begin
3747                print*,'physiq betaCRF global zdtime=',zdtime
3748!IM 251017 end
3749          DO k=1, klev
3750             DO i=1, klon
3751                IF (pplay(i,k).GE.pfree) THEN
3752                   beta(i,k) = beta_pbl
3753                ELSE
3754                   beta(i,k) = beta_free
3755                ENDIF
3756                IF (mskocean_beta) THEN
3757                   beta(i,k) = beta(i,k) * pctsrf(i,is_oce)
3758                ENDIF
3759                cldtaurad(i,k)   = cldtau(i,k) * beta(i,k)
3760                cldtaupirad(i,k) = cldtaupi(i,k) * beta(i,k)
3761                cldemirad(i,k)   = cldemi(i,k) * beta(i,k)
3762                cldfrarad(i,k)   = cldfra(i,k) * beta(i,k)
3763             ENDDO
3764          ENDDO
3765          !
3766       ELSE
3767          !
3768          ! regional
3769          !
3770          DO k=1, klev
3771             DO i=1,klon
3772                !
3773                IF (longitude_deg(i).ge.lon1_beta.AND. &
3774                    longitude_deg(i).le.lon2_beta.AND. &
3775                    latitude_deg(i).le.lat1_beta.AND.  &
3776                    latitude_deg(i).ge.lat2_beta) THEN
3777                   IF (pplay(i,k).GE.pfree) THEN
3778                      beta(i,k) = beta_pbl
3779                   ELSE
3780                      beta(i,k) = beta_free
3781                   ENDIF
3782                   IF (mskocean_beta) THEN
3783                      beta(i,k) = beta(i,k) * pctsrf(i,is_oce)
3784                   ENDIF
3785                   cldtaurad(i,k)   = cldtau(i,k) * beta(i,k)
3786                   cldtaupirad(i,k) = cldtaupi(i,k) * beta(i,k)
3787                   cldemirad(i,k)   = cldemi(i,k) * beta(i,k)
3788                   cldfrarad(i,k)   = cldfra(i,k) * beta(i,k)
3789                ENDIF
3790             !
3791             ENDDO
3792          ENDDO
3793       !
3794       ENDIF
3795
3796       !lecture de la chlorophylle pour le nouvel albedo de Sunghye Baek
3797       IF (ok_chlorophyll) THEN
3798          print*,"-- reading chlorophyll"
3799          CALL readchlorophyll(debut)
3800       ENDIF
3801
3802!--if ok_suntime_rrtm we use ancillay data for RSUN
3803!--previous values are therefore overwritten
3804!--this is needed for CMIP6 runs
3805!--and only possible for new radiation scheme
3806       IF (iflag_rrtm.EQ.1.AND.ok_suntime_rrtm) THEN
3807#ifdef CPP_RRTM
3808         CALL read_rsun_rrtm(debut)
3809#endif
3810       ENDIF
3811
3812       IF (mydebug) THEN
3813          CALL writefield_phy('u_seri',u_seri,nbp_lev)
3814          CALL writefield_phy('v_seri',v_seri,nbp_lev)
3815          CALL writefield_phy('t_seri',t_seri,nbp_lev)
3816          CALL writefield_phy('q_seri',q_seri,nbp_lev)
3817       ENDIF
3818
3819       !
3820       !sonia : If Iflag_radia >=2, pertubation of some variables
3821       !input to radiation (DICE)
3822       !
3823       IF (iflag_radia .ge. 2) THEN
3824          zsav_tsol (:) = zxtsol(:)
3825          CALL perturb_radlwsw(zxtsol,iflag_radia)
3826       ENDIF
3827
3828       IF (aerosol_couple.AND.config_inca=='aero') THEN
3829#ifdef INCA
3830          CALL radlwsw_inca  &
3831               (kdlon,kflev,dist, rmu0, fract, solaire, &
3832               paprs, pplay,zxtsol,albsol1, albsol2, t_seri,q_seri, &
3833               size(wo,3), wo, &
3834               cldfrarad, cldemirad, cldtaurad, &
3835               heat,heat0,cool,cool0,albpla, &
3836               topsw,toplw,solsw,sollw, &
3837               sollwdown, &
3838               topsw0,toplw0,solsw0,sollw0, &
3839               lwdn0, lwdn, lwup0, lwup,  &
3840               swdn0, swdn, swup0, swup, &
3841               ok_ade, ok_aie, &
3842               tau_aero, piz_aero, cg_aero, &
3843               topswad_aero, solswad_aero, &
3844               topswad0_aero, solswad0_aero, &
3845               topsw_aero, topsw0_aero, &
3846               solsw_aero, solsw0_aero, &
3847               cldtaupirad, &
3848               topswai_aero, solswai_aero)
3849#endif
3850       ELSE
3851          !
3852          !IM calcul radiatif pour le cas actuel
3853          !
3854          RCO2 = RCO2_act
3855          RCH4 = RCH4_act
3856          RN2O = RN2O_act
3857          RCFC11 = RCFC11_act
3858          RCFC12 = RCFC12_act
3859          !
3860          IF (prt_level .GE.10) THEN
3861             print *,' ->radlwsw, number 1 '
3862          ENDIF
3863
3864          !
3865          CALL radlwsw &
3866               (dist, rmu0, fract,  &
3867                                !albedo SB >>>
3868                                !      paprs, pplay,zxtsol,albsol1, albsol2,  &
3869               paprs, pplay,zxtsol,SFRWL,albsol_dir, albsol_dif,  &
3870                                !albedo SB <<<
3871               t_seri,q_seri,wo, &
3872               cldfrarad, cldemirad, cldtaurad, &
3873               ok_ade.OR.flag_aerosol_strat.GT.0, ok_aie, flag_aerosol, &
3874               flag_aerosol_strat, &
3875               tau_aero, piz_aero, cg_aero, &
3876               tau_aero_sw_rrtm, piz_aero_sw_rrtm, cg_aero_sw_rrtm, &
3877               ! Rajoute par OB pour RRTM
3878               tau_aero_lw_rrtm, &
3879               cldtaupirad,new_aod, &
3880!              zqsat, flwcrad, fiwcrad, &
3881               zqsat, flwc, fiwc, &
3882               ref_liq, ref_ice, ref_liq_pi, ref_ice_pi, &
3883               heat,heat0,cool,cool0,albpla, &
3884               topsw,toplw,solsw,sollw, &
3885               sollwdown, &
3886               topsw0,toplw0,solsw0,sollw0, &
3887               lwdnc0, lwdn0, lwdn, lwupc0, lwup0, lwup,  &
3888               swdnc0, swdn0, swdn, swupc0, swup0, swup, &
3889               topswad_aero, solswad_aero, &
3890               topswai_aero, solswai_aero, &
3891               topswad0_aero, solswad0_aero, &
3892               topsw_aero, topsw0_aero, &
3893               solsw_aero, solsw0_aero, &
3894               topswcf_aero, solswcf_aero, &
3895                                !-C. Kleinschmitt for LW diagnostics
3896               toplwad_aero, sollwad_aero,&
3897               toplwai_aero, sollwai_aero, &
3898               toplwad0_aero, sollwad0_aero,&
3899                                !-end
3900               ZLWFT0_i, ZFLDN0, ZFLUP0, &
3901               ZSWFT0_i, ZFSDN0, ZFSUP0)
3902
3903          !lwoff=y, betalwoff=1. : offset LW CRE for radiation code and other
3904          !schemes
3905          toplw = toplw + betalwoff * (toplw0 - toplw)
3906          sollw = sollw + betalwoff * (sollw0 - sollw)
3907          lwdn = lwdn + betalwoff * (lwdn0 - lwdn)
3908          lwup = lwup + betalwoff * (lwup0 - lwup)
3909          sollwdown(:)= sollwdown(:) + betalwoff *(-1.*ZFLDN0(:,1) - &
3910                        sollwdown(:))
3911          cool = cool + betalwoff * (cool0 - cool)
3912 
3913#ifndef CPP_XIOS
3914          !--OB 30/05/2016 modified 21/10/2016
3915          !--here we return swaero_diag and dryaod_diag to FALSE
3916          !--and histdef will switch it back to TRUE if necessary
3917          !--this is necessary to get the right swaero at first step
3918          !--but only in the case of no XIOS as XIOS is covered elsewhere
3919          IF (debut) swaerofree_diag = .FALSE.
3920          IF (debut) swaero_diag = .FALSE.
3921          IF (debut) dryaod_diag = .FALSE.
3922          !--IM 15/09/2017 here we return ok_4xCO2atm to FALSE
3923          !--as for swaero_diag, see above
3924          IF (debut) ok_4xCO2atm = .FALSE.
3925
3926          !
3927          !IM 2eme calcul radiatif pour le cas perturbe ou au moins un
3928          !IM des taux doit etre different du taux actuel
3929          !IM Par defaut on a les taux perturbes egaux aux taux actuels
3930          !
3931          IF (RCO2_per.NE.RCO2_act.OR. &
3932              RCH4_per.NE.RCH4_act.OR. &
3933              RN2O_per.NE.RN2O_act.OR. &
3934              RCFC11_per.NE.RCFC11_act.OR. &
3935              RCFC12_per.NE.RCFC12_act) ok_4xCO2atm =.TRUE.
3936#endif
3937   !
3938          IF (ok_4xCO2atm) THEN
3939                !
3940                RCO2 = RCO2_per
3941                RCH4 = RCH4_per
3942                RN2O = RN2O_per
3943                RCFC11 = RCFC11_per
3944                RCFC12 = RCFC12_per
3945                !
3946                IF (prt_level .GE.10) THEN
3947                   print *,' ->radlwsw, number 2 '
3948                ENDIF
3949                !
3950                CALL radlwsw &
3951                     (dist, rmu0, fract,  &
3952                                !albedo SB >>>
3953                                !      paprs, pplay,zxtsol,albsol1, albsol2,  &
3954                     paprs, pplay,zxtsol,SFRWL,albsol_dir, albsol_dif, &
3955                                !albedo SB <<<
3956                     t_seri,q_seri,wo, &
3957                     cldfrarad, cldemirad, cldtaurad, &
3958                     ok_ade.OR.flag_aerosol_strat.GT.0, ok_aie, flag_aerosol, &
3959                     flag_aerosol_strat, &
3960                     tau_aero, piz_aero, cg_aero, &
3961                     tau_aero_sw_rrtm, piz_aero_sw_rrtm, cg_aero_sw_rrtm, &
3962                                ! Rajoute par OB pour RRTM
3963                     tau_aero_lw_rrtm, &
3964                     cldtaupi,new_aod, &
3965!                    zqsat, flwcrad, fiwcrad, &
3966                     zqsat, flwc, fiwc, &
3967                     ref_liq, ref_ice, ref_liq_pi, ref_ice_pi, &
3968                     heatp,heat0p,coolp,cool0p,albplap, &
3969                     topswp,toplwp,solswp,sollwp, &
3970                     sollwdownp, &
3971                     topsw0p,toplw0p,solsw0p,sollw0p, &
3972                     lwdnc0p, lwdn0p, lwdnp, lwupc0p, lwup0p, lwupp,  &
3973                     swdnc0p, swdn0p, swdnp, swupc0p, swup0p, swupp, &
3974                     topswad_aerop, solswad_aerop, &
3975                     topswai_aerop, solswai_aerop, &
3976                     topswad0_aerop, solswad0_aerop, &
3977                     topsw_aerop, topsw0_aerop, &
3978                     solsw_aerop, solsw0_aerop, &
3979                     topswcf_aerop, solswcf_aerop, &
3980                                !-C. Kleinschmitt for LW diagnostics
3981                     toplwad_aerop, sollwad_aerop,&
3982                     toplwai_aerop, sollwai_aerop, &
3983                     toplwad0_aerop, sollwad0_aerop,&
3984                                !-end
3985                     ZLWFT0_i, ZFLDN0, ZFLUP0, &
3986                     ZSWFT0_i, ZFSDN0, ZFSUP0)
3987          endif !ok_4xCO2atm
3988       ENDIF ! aerosol_couple
3989       itaprad = 0
3990       !
3991       !  If Iflag_radia >=2, reset pertubed variables
3992       !
3993       IF (iflag_radia .ge. 2) THEN
3994          zxtsol(:) = zsav_tsol (:)
3995       ENDIF
3996    ENDIF ! MOD(itaprad,radpas)
3997    itaprad = itaprad + 1
3998
3999    IF (iflag_radia.eq.0) THEN
4000       IF (prt_level.ge.9) THEN
4001          PRINT *,'--------------------------------------------------'
4002          PRINT *,'>>>> ATTENTION rayonnement desactive pour ce cas'
4003          PRINT *,'>>>>           heat et cool mis a zero '
4004          PRINT *,'--------------------------------------------------'
4005       ENDIF
4006       heat=0.
4007       cool=0.
4008       sollw=0.   ! MPL 01032011
4009       solsw=0.
4010       radsol=0.
4011       swup=0.    ! MPL 27102011 pour les fichiers AMMA_profiles et AMMA_scalars
4012       swup0=0.
4013       lwup=0.
4014       lwup0=0.
4015       lwdn=0.
4016       lwdn0=0.
4017    ENDIF
4018
4019    !
4020    ! Calculer radsol a l'exterieur de radlwsw
4021    ! pour prendre en compte le cycle diurne
4022    ! recode par Olivier Boucher en sept 2015
4023    !
4024    radsol=solsw*swradcorr+sollw
4025
4026    IF (ok_4xCO2atm) THEN
4027       radsolp=solswp*swradcorr+sollwp
4028    ENDIF
4029
4030    !
4031    ! Ajouter la tendance des rayonnements (tous les pas)
4032    ! avec une correction pour le cycle diurne dans le SW
4033    !
4034
4035    DO k=1, klev
4036       d_t_swr(:,k)=swradcorr(:)*heat(:,k)*dtime/RDAY
4037       d_t_sw0(:,k)=swradcorr(:)*heat0(:,k)*dtime/RDAY
4038       d_t_lwr(:,k)=-cool(:,k)*dtime/RDAY
4039       d_t_lw0(:,k)=-cool0(:,k)*dtime/RDAY
4040    ENDDO
4041
4042    CALL add_phys_tend(du0,dv0,d_t_swr,dq0,dql0,dqi0,paprs,'SW',abortphy,flag_inhib_tend,itap,0)
4043    call prt_enerbil('SW',itap)
4044    CALL add_phys_tend(du0,dv0,d_t_lwr,dq0,dql0,dqi0,paprs,'LW',abortphy,flag_inhib_tend,itap,0)
4045    call prt_enerbil('LW',itap)
4046
4047    !
4048    IF (mydebug) THEN
4049       CALL writefield_phy('u_seri',u_seri,nbp_lev)
4050       CALL writefield_phy('v_seri',v_seri,nbp_lev)
4051       CALL writefield_phy('t_seri',t_seri,nbp_lev)
4052       CALL writefield_phy('q_seri',q_seri,nbp_lev)
4053    ENDIF
4054
4055    ! Calculer l'hydrologie de la surface
4056    !
4057    !      CALL hydrol(dtime,pctsrf,rain_fall, snow_fall, zxevap,
4058    !     .            agesno, ftsol,fqsurf,fsnow, ruis)
4059    !
4060
4061    !
4062    ! Calculer le bilan du sol et la derive de temperature (couplage)
4063    !
4064    DO i = 1, klon
4065       !         bils(i) = radsol(i) - sens(i) - evap(i)*RLVTT
4066       ! a la demande de JLD
4067       bils(i) = radsol(i) - sens(i) + zxfluxlat(i)
4068    ENDDO
4069    !
4070    !moddeblott(jan95)
4071    ! Appeler le programme de parametrisation de l'orographie
4072    ! a l'echelle sous-maille:
4073    !
4074    IF (prt_level .GE.10) THEN
4075       print *,' call orography ? ', ok_orodr
4076    ENDIF
4077    !
4078    IF (ok_orodr) THEN
4079       !
4080       !  selection des points pour lesquels le shema est actif:
4081       igwd=0
4082       DO i=1,klon
4083          itest(i)=0
4084          !        IF ((zstd(i).gt.10.0)) THEN
4085          IF (((zpic(i)-zmea(i)).GT.100.).AND.(zstd(i).GT.10.0)) THEN
4086             itest(i)=1
4087             igwd=igwd+1
4088             idx(igwd)=i
4089          ENDIF
4090       ENDDO
4091       !        igwdim=MAX(1,igwd)
4092       !
4093       IF (ok_strato) THEN
4094
4095          CALL drag_noro_strato(0,klon,klev,dtime,paprs,pplay, &
4096               zmea,zstd, zsig, zgam, zthe,zpic,zval, &
4097               igwd,idx,itest, &
4098               t_seri, u_seri, v_seri, &
4099               zulow, zvlow, zustrdr, zvstrdr, &
4100               d_t_oro, d_u_oro, d_v_oro)
4101
4102       ELSE
4103          CALL drag_noro(klon,klev,dtime,paprs,pplay, &
4104               zmea,zstd, zsig, zgam, zthe,zpic,zval, &
4105               igwd,idx,itest, &
4106               t_seri, u_seri, v_seri, &
4107               zulow, zvlow, zustrdr, zvstrdr, &
4108               d_t_oro, d_u_oro, d_v_oro)
4109       ENDIF
4110       !
4111       !  ajout des tendances
4112       !-----------------------------------------------------------------------
4113       ! ajout des tendances de la trainee de l'orographie
4114       CALL add_phys_tend(d_u_oro,d_v_oro,d_t_oro,dq0,dql0,dqi0,paprs,'oro', &
4115            abortphy,flag_inhib_tend,itap,0)
4116       call prt_enerbil('oro',itap)
4117       !----------------------------------------------------------------------
4118       !
4119    ENDIF ! fin de test sur ok_orodr
4120    !
4121    IF (mydebug) THEN
4122       CALL writefield_phy('u_seri',u_seri,nbp_lev)
4123       CALL writefield_phy('v_seri',v_seri,nbp_lev)
4124       CALL writefield_phy('t_seri',t_seri,nbp_lev)
4125       CALL writefield_phy('q_seri',q_seri,nbp_lev)
4126    ENDIF
4127
4128    IF (ok_orolf) THEN
4129       !
4130       !  selection des points pour lesquels le shema est actif:
4131       igwd=0
4132       DO i=1,klon
4133          itest(i)=0
4134          IF ((zpic(i)-zmea(i)).GT.100.) THEN
4135             itest(i)=1
4136             igwd=igwd+1
4137             idx(igwd)=i
4138          ENDIF
4139       ENDDO
4140       !        igwdim=MAX(1,igwd)
4141       !
4142       IF (ok_strato) THEN
4143
4144          CALL lift_noro_strato(klon,klev,dtime,paprs,pplay, &
4145               latitude_deg,zmea,zstd,zpic,zgam,zthe,zpic,zval, &
4146               igwd,idx,itest, &
4147               t_seri, u_seri, v_seri, &
4148               zulow, zvlow, zustrli, zvstrli, &
4149               d_t_lif, d_u_lif, d_v_lif               )
4150
4151       ELSE
4152          CALL lift_noro(klon,klev,dtime,paprs,pplay, &
4153               latitude_deg,zmea,zstd,zpic, &
4154               itest, &
4155               t_seri, u_seri, v_seri, &
4156               zulow, zvlow, zustrli, zvstrli, &
4157               d_t_lif, d_u_lif, d_v_lif)
4158       ENDIF
4159
4160       ! ajout des tendances de la portance de l'orographie
4161       CALL add_phys_tend(d_u_lif, d_v_lif, d_t_lif, dq0, dql0, dqi0, paprs, &
4162            'lif', abortphy,flag_inhib_tend,itap,0)
4163       call prt_enerbil('lif',itap)
4164    ENDIF ! fin de test sur ok_orolf
4165
4166    IF (ok_hines) then
4167       !  HINES GWD PARAMETRIZATION
4168       east_gwstress=0.
4169       west_gwstress=0.
4170       du_gwd_hines=0.
4171       dv_gwd_hines=0.
4172       CALL hines_gwd(klon, klev, dtime, paprs, pplay, latitude_deg, t_seri, &
4173            u_seri, v_seri, zustr_gwd_hines, zvstr_gwd_hines, d_t_hin, &
4174            du_gwd_hines, dv_gwd_hines)
4175       zustr_gwd_hines=0.
4176       zvstr_gwd_hines=0.
4177       DO k = 1, klev
4178          zustr_gwd_hines(:)=zustr_gwd_hines(:)+ du_gwd_hines(:, k)/dtime &
4179               * (paprs(:, k)-paprs(:, k+1))/rg
4180          zvstr_gwd_hines(:)=zvstr_gwd_hines(:)+ dv_gwd_hines(:, k)/dtime &
4181               * (paprs(:, k)-paprs(:, k+1))/rg
4182       ENDDO
4183
4184       d_t_hin(:, :)=0.
4185       CALL add_phys_tend(du_gwd_hines, dv_gwd_hines, d_t_hin, dq0, dql0, &
4186            dqi0, paprs, 'hin', abortphy,flag_inhib_tend,itap,0)
4187       call prt_enerbil('hin',itap)
4188    ENDIF
4189
4190    IF (.not. ok_hines .and. ok_gwd_rando) then
4191       CALL acama_GWD_rando(DTIME, pplay, latitude_deg, t_seri, u_seri, &
4192            v_seri, rot, zustr_gwd_front, zvstr_gwd_front, du_gwd_front, &
4193            dv_gwd_front, east_gwstress, west_gwstress)
4194       zustr_gwd_front=0.
4195       zvstr_gwd_front=0.
4196       DO k = 1, klev
4197          zustr_gwd_front(:)=zustr_gwd_front(:)+ du_gwd_front(:, k)/dtime &
4198               * (paprs(:, k)-paprs(:, k+1))/rg
4199          zvstr_gwd_front(:)=zvstr_gwd_front(:)+ dv_gwd_front(:, k)/dtime &
4200               * (paprs(:, k)-paprs(:, k+1))/rg
4201       ENDDO
4202
4203       CALL add_phys_tend(du_gwd_front, dv_gwd_front, dt0, dq0, dql0, dqi0, &
4204            paprs, 'front_gwd_rando', abortphy,flag_inhib_tend,itap,0)
4205       call prt_enerbil('front_gwd_rando',itap)
4206    ENDIF
4207
4208    IF (ok_gwd_rando) THEN
4209       CALL FLOTT_GWD_rando(DTIME, pplay, t_seri, u_seri, v_seri, &
4210            rain_fall + snow_fall, zustr_gwd_rando, zvstr_gwd_rando, &
4211            du_gwd_rando, dv_gwd_rando, east_gwstress, west_gwstress)
4212       CALL add_phys_tend(du_gwd_rando, dv_gwd_rando, dt0, dq0, dql0, dqi0, &
4213            paprs, 'flott_gwd_rando', abortphy,flag_inhib_tend,itap,0)
4214       call prt_enerbil('flott_gwd_rando',itap)
4215       zustr_gwd_rando=0.
4216       zvstr_gwd_rando=0.
4217       DO k = 1, klev
4218          zustr_gwd_rando(:)=zustr_gwd_rando(:)+ du_gwd_rando(:, k)/dtime &
4219               * (paprs(:, k)-paprs(:, k+1))/rg
4220          zvstr_gwd_rando(:)=zvstr_gwd_rando(:)+ dv_gwd_rando(:, k)/dtime &
4221               * (paprs(:, k)-paprs(:, k+1))/rg
4222       ENDDO
4223    ENDIF
4224
4225    ! STRESS NECESSAIRES: TOUTE LA PHYSIQUE
4226
4227    IF (mydebug) THEN
4228       CALL writefield_phy('u_seri',u_seri,nbp_lev)
4229       CALL writefield_phy('v_seri',v_seri,nbp_lev)
4230       CALL writefield_phy('t_seri',t_seri,nbp_lev)
4231       CALL writefield_phy('q_seri',q_seri,nbp_lev)
4232    ENDIF
4233
4234    DO i = 1, klon
4235       zustrph(i)=0.
4236       zvstrph(i)=0.
4237    ENDDO
4238    DO k = 1, klev
4239       DO i = 1, klon
4240          zustrph(i)=zustrph(i)+(u_seri(i,k)-u(i,k))/dtime* &
4241               (paprs(i,k)-paprs(i,k+1))/rg
4242          zvstrph(i)=zvstrph(i)+(v_seri(i,k)-v(i,k))/dtime* &
4243               (paprs(i,k)-paprs(i,k+1))/rg
4244       ENDDO
4245    ENDDO
4246    !
4247    !IM calcul composantes axiales du moment angulaire et couple des montagnes
4248    !
4249    IF (is_sequential .and. ok_orodr) THEN
4250       CALL aaam_bud (27,klon,klev,jD_cur-jD_ref,jH_cur, &
4251            ra,rg,romega, &
4252            latitude_deg,longitude_deg,pphis, &
4253            zustrdr,zustrli,zustrph, &
4254            zvstrdr,zvstrli,zvstrph, &
4255            paprs,u,v, &
4256            aam, torsfc)
4257    ENDIF
4258    !IM cf. FLott END
4259    !DC Calcul de la tendance due au methane
4260    IF(ok_qch4) THEN
4261       CALL METHOX(1,klon,klon,klev,q_seri,d_q_ch4,pplay)
4262       ! ajout de la tendance d'humidite due au methane
4263       d_q_ch4_dtime(:,:) = d_q_ch4(:,:)*dtime
4264       CALL add_phys_tend(du0, dv0, dt0, d_q_ch4_dtime, dql0, dqi0, paprs, &
4265            'q_ch4', abortphy,flag_inhib_tend,itap,0)
4266       d_q_ch4(:,:) = d_q_ch4_dtime(:,:)/dtime
4267    ENDIF
4268    !
4269    !
4270
4271!===============================================================
4272!            Additional tendency of TKE due to orography
4273!===============================================================
4274!
4275! Inititialization
4276!------------------
4277
4278   
4279
4280       addtkeoro=0   
4281       CALL getin_p('addtkeoro',addtkeoro)
4282     
4283       IF (prt_level.ge.5) &
4284            print*,'addtkeoro', addtkeoro
4285           
4286       alphatkeoro=1.   
4287       CALL getin_p('alphatkeoro',alphatkeoro)
4288       alphatkeoro=min(max(0.,alphatkeoro),1.)
4289
4290       smallscales_tkeoro=.false.   
4291       CALL getin_p('smallscales_tkeoro',smallscales_tkeoro)
4292
4293
4294        dtadd(:,:)=0.
4295        duadd(:,:)=0.
4296        dvadd(:,:)=0.
4297
4298
4299
4300! Choices for addtkeoro:
4301!      ** 0 no TKE tendency from orography   
4302!      ** 1 we include a fraction alphatkeoro of the whole tendency duoro
4303!      ** 2 we include a fraction alphatkeoro of the gravity wave part of duoro
4304!
4305
4306       IF (addtkeoro .GT. 0 .AND. ok_orodr ) THEN
4307!      -------------------------------------------
4308
4309
4310       !  selection des points pour lesquels le schema est actif:
4311
4312
4313
4314  IF (addtkeoro .EQ. 1 ) THEN
4315
4316            duadd(:,:)=alphatkeoro*d_u_oro(:,:)
4317            dvadd(:,:)=alphatkeoro*d_v_oro(:,:)
4318
4319  ELSE IF (addtkeoro .EQ. 2) THEN
4320
4321
4322
4323       IF (smallscales_tkeoro) THEN
4324       igwd=0
4325       DO i=1,klon
4326          itest(i)=0
4327! Etienne: ici je prends en compte plus de relief que la routine drag_noro_strato
4328! car on peut s'attendre a ce que les petites echelles produisent aussi de la TKE
4329! Mais attention, cela ne va pas dans le sens de la conservation de l'energie!
4330          IF (zstd(i).GT.1.0) THEN
4331             itest(i)=1
4332             igwd=igwd+1
4333             idx(igwd)=i
4334          ENDIF
4335       ENDDO
4336
4337     ELSE
4338
4339       igwd=0
4340       DO i=1,klon
4341          itest(i)=0
4342        IF (((zpic(i)-zmea(i)).GT.100.).AND.(zstd(i).GT.10.0)) THEN
4343             itest(i)=1
4344             igwd=igwd+1
4345             idx(igwd)=i
4346          ENDIF
4347       ENDDO
4348
4349       END IF
4350
4351
4352
4353
4354       CALL drag_noro_strato(addtkeoro,klon,klev,dtime,paprs,pplay, &
4355               zmea,zstd, zsig, zgam, zthe,zpic,zval, &
4356               igwd,idx,itest, &
4357               t_seri, u_seri, v_seri, &
4358               zulow, zvlow, zustrdr, zvstrdr, &
4359               d_t_oro_gw, d_u_oro_gw, d_v_oro_gw)
4360
4361            zustrdr(:)=0.
4362            zvstrdr(:)=0.
4363            zulow(:)=0.
4364            zvlow(:)=0.
4365
4366            duadd(:,:)=alphatkeoro*d_u_oro_gw(:,:)
4367            dvadd(:,:)=alphatkeoro*d_v_oro_gw(:,:)
4368 END IF
4369   
4370
4371
4372   ! TKE update from subgrid temperature and wind tendencies
4373   !----------------------------------------------------------
4374    forall (k=1: nbp_lev) exner(:, k) = (pplay(:, k)/paprs(:,1))**RKAPPA
4375
4376
4377    CALL tend_to_tke(pdtphys,paprs,exner,t_seri,u_seri,v_seri,dtadd,duadd,dvadd,pbl_tke)
4378
4379
4380
4381       ENDIF
4382!      -----
4383!===============================================================
4384
4385
4386
4387    !====================================================================
4388    ! Interface Simulateur COSP (Calipso, ISCCP, MISR, ..)
4389    !====================================================================
4390    ! Abderrahmane 24.08.09
4391
4392    IF (ok_cosp) THEN
4393       ! adeclarer
4394#ifdef CPP_COSP
4395       IF (itap.eq.1.or.MOD(itap,NINT(freq_cosp/dtime)).EQ.0) THEN
4396
4397          IF (prt_level .GE.10) THEN
4398             print*,'freq_cosp',freq_cosp
4399          ENDIF
4400          mr_ozone=wo(:, :, 1) * dobson_u * 1e3 / zmasse
4401          !       print*,'Dans physiq.F avant appel cosp ref_liq,ref_ice=',
4402          !     s        ref_liq,ref_ice
4403          CALL phys_cosp(itap,dtime,freq_cosp, &
4404               ok_mensuelCOSP,ok_journeCOSP,ok_hfCOSP, &
4405               ecrit_mth,ecrit_day,ecrit_hf, ok_all_xml, missing_val, &
4406               klon,klev,longitude_deg,latitude_deg,presnivs,overlap, &
4407               JrNt,ref_liq,ref_ice, &
4408               pctsrf(:,is_ter)+pctsrf(:,is_lic), &
4409               zu10m,zv10m,pphis, &
4410               zphi,paprs(:,1:klev),pplay,zxtsol,t_seri, &
4411               qx(:,:,ivap),zx_rh,cldfra,rnebcon,flwc,fiwc, &
4412               prfl(:,1:klev),psfl(:,1:klev), &
4413               pmflxr(:,1:klev),pmflxs(:,1:klev), &
4414               mr_ozone,cldtau, cldemi)
4415
4416          !     L         calipso2D,calipso3D,cfadlidar,parasolrefl,atb,betamol,
4417          !     L          cfaddbze,clcalipso2,dbze,cltlidarradar,
4418          !     M          clMISR,
4419          !     R          clisccp2,boxtauisccp,boxptopisccp,tclisccp,ctpisccp,
4420          !     I          tauisccp,albisccp,meantbisccp,meantbclrisccp)
4421
4422       ENDIF
4423
4424#endif
4425    ENDIF  !ok_cosp
4426
4427
4428! Marine
4429
4430  IF (ok_airs) then
4431
4432  IF (itap.eq.1.or.MOD(itap,NINT(freq_airs/dtime)).EQ.0) THEN
4433     write(*,*) 'je vais appeler simu_airs, ok_airs, freq_airs=', ok_airs, freq_airs
4434     CALL simu_airs(itap,rneb, t_seri, cldemi, fiwc, ref_ice, pphi, pplay, paprs,&
4435        & map_prop_hc,map_prop_hist,&
4436        & map_emis_hc,map_iwp_hc,map_deltaz_hc,map_pcld_hc,map_tcld_hc,&
4437        & map_emis_Cb,map_pcld_Cb,map_tcld_Cb,&
4438        & map_emis_ThCi,map_pcld_ThCi,map_tcld_ThCi,&
4439        & map_emis_Anv,map_pcld_Anv,map_tcld_Anv,&
4440        & map_emis_hist,map_iwp_hist,map_deltaz_hist,map_rad_hist,&
4441        & map_ntot,map_hc,map_hist,&
4442        & map_Cb,map_ThCi,map_Anv,&
4443        & alt_tropo )
4444  ENDIF
4445
4446  ENDIF  ! ok_airs
4447
4448
4449    ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4450    !AA
4451    !AA Installation de l'interface online-offline pour traceurs
4452    !AA
4453    !====================================================================
4454    !   Calcul  des tendances traceurs
4455    !====================================================================
4456    !
4457
4458    IF (type_trac=='repr') THEN
4459       sh_in(:,:) = q_seri(:,:)
4460    ELSE
4461       sh_in(:,:) = qx(:,:,ivap)
4462       ch_in(:,:) = qx(:,:,iliq)
4463    ENDIF
4464
4465    IF (iflag_phytrac == 1 ) THEN
4466
4467#ifdef CPP_Dust
4468      CALL       phytracr_spl ( debut,lafin , jD_cur,jH_cur,iflag_con,       &  ! I
4469                      pdtphys,ftsol,                                   &  ! I
4470                      t,q_seri,paprs,pplay,RHcl,                  &  ! I
4471                      pmfu, pmfd, pen_u, pde_u, pen_d, pde_d,          &  ! I
4472                      coefh(1:klon,1:klev,is_ave), cdragh, cdragm, u1, v1,                 &  ! I
4473                      u_seri, v_seri, latitude_deg, longitude_deg,  &
4474                      pphis,pctsrf,pmflxr,pmflxs,prfl,psfl,            &  ! I
4475                      da,phi,phi2,d1a,dam,mp,ep,sigd,sij,clw,elij,     &  ! I
4476                      epmlmMm,eplaMm,upwd,dnwd,itop_con,ibas_con,      &  ! I
4477                      ev,wdtrainA,  wdtrainM,wght_cvfd,              &  ! I
4478                      fm_therm, entr_therm, rneb,                      &  ! I
4479                      beta_prec_fisrt,beta_prec, & !I
4480                      zu10m,zv10m,wstar,ale_bl,ale_wake,               &  ! I
4481                      d_tr_dyn,tr_seri)
4482
4483#else
4484
4485    CALL phytrac ( &
4486         itap,     days_elapsed+1,    jH_cur,   debut, &
4487         lafin,    dtime,     u, v,     t, &
4488         paprs,    pplay,     pmfu,     pmfd, &
4489         pen_u,    pde_u,     pen_d,    pde_d, &
4490         cdragh,   coefh(1:klon,1:klev,is_ave),   fm_therm, entr_therm, &
4491         u1,       v1,        ftsol,    pctsrf, &
4492         zustar,   zu10m,     zv10m, &
4493         wstar(:,is_ave),    ale_bl,         ale_wake, &
4494         latitude_deg, longitude_deg, &
4495         frac_impa,frac_nucl, beta_prec_fisrt,beta_prec, &
4496         presnivs, pphis,     pphi,     albsol1, &
4497         sh_in,   ch_in,    rhcl,      cldfra,   rneb, &
4498         diafra,   cldliq,    itop_con, ibas_con, &
4499         pmflxr,   pmflxs,    prfl,     psfl, &
4500         da,       phi,       mp,       upwd, &
4501         phi2,     d1a,       dam,      sij, wght_cvfd, &        !<<RomP+RL
4502         wdtrainA, wdtrainM,  sigd,     clw,elij, &   !<<RomP
4503         ev,       ep,        epmlmMm,  eplaMm, &     !<<RomP
4504         dnwd,     aerosol_couple,      flxmass_w, &
4505         tau_aero, piz_aero,  cg_aero,  ccm, &
4506         rfname, &
4507         d_tr_dyn, &                                 !<<RomP
4508         tr_seri)
4509#endif
4510    ENDIF    ! (iflag_phytrac=1)
4511
4512    IF (offline) THEN
4513
4514       IF (prt_level.ge.9) &
4515            print*,'Attention on met a 0 les thermiques pour phystoke'
4516       CALL phystokenc ( &
4517            nlon,klev,pdtphys,longitude_deg,latitude_deg, &
4518            t,pmfu, pmfd, pen_u, pde_u, pen_d, pde_d, &
4519            fm_therm,entr_therm, &
4520            cdragh,coefh(1:klon,1:klev,is_ave),u1,v1,ftsol,pctsrf, &
4521            frac_impa, frac_nucl, &
4522            pphis,cell_area,dtime,itap, &
4523            qx(:,:,ivap),da,phi,mp,upwd,dnwd)
4524
4525
4526    ENDIF
4527
4528    !
4529    ! Calculer le transport de l'eau et de l'energie (diagnostique)
4530    !
4531    CALL transp (paprs,zxtsol, &
4532         t_seri, q_seri, u_seri, v_seri, zphi, &
4533         ve, vq, ue, uq)
4534    !
4535    !IM global posePB BEG
4536    IF(1.EQ.0) THEN
4537       !
4538       CALL transp_lay (paprs,zxtsol, &
4539            t_seri, q_seri, u_seri, v_seri, zphi, &
4540            ve_lay, vq_lay, ue_lay, uq_lay)
4541       !
4542    ENDIF !(1.EQ.0) THEN
4543    !IM global posePB END
4544    ! Accumuler les variables a stocker dans les fichiers histoire:
4545    !
4546
4547    !================================================================
4548    ! Conversion of kinetic and potential energy into heat, for
4549    ! parameterisation of subgrid-scale motions
4550    !================================================================
4551
4552    d_t_ec(:,:)=0.
4553    forall (k=1: nbp_lev) exner(:, k) = (pplay(:, k)/paprs(:,1))**RKAPPA
4554    CALL ener_conserv(klon,klev,pdtphys,u,v,t,qx(:,:,ivap),qx(:,:,iliq),qx(:,:,isol), &
4555         u_seri,v_seri,t_seri,q_seri,ql_seri,qs_seri,pbl_tke(:,:,is_ave)-tke0(:,:), &
4556         zmasse,exner,d_t_ec)
4557    t_seri(:,:)=t_seri(:,:)+d_t_ec(:,:)
4558
4559    !=======================================================================
4560    !   SORTIES
4561    !=======================================================================
4562    !
4563    !IM initialisation + calculs divers diag AMIP2
4564    !
4565    include "calcul_divers.h"
4566    !
4567    !IM Interpolation sur les niveaux de pression du NMC
4568    !   -------------------------------------------------
4569    !
4570    include "calcul_STDlev.h"
4571    !
4572    ! slp sea level pressure derived from Arpege-IFS : CALL ctstar + CALL pppmer
4573    CALL diag_slp(klon,t_seri,paprs,pplay,pphis,ptstar,pt0,slp)
4574    !
4575    !cc prw  = eau precipitable
4576    !   prlw = colonne eau liquide
4577    !   prlw = colonne eau solide
4578    prw(:) = 0.
4579    prlw(:) = 0.
4580    prsw(:) = 0.
4581    DO k = 1, klev
4582       prw(:)  = prw(:)  + q_seri(:,k)*zmasse(:,k)
4583       prlw(:) = prlw(:) + ql_seri(:,k)*zmasse(:,k)
4584       prsw(:) = prsw(:) + qs_seri(:,k)*zmasse(:,k)
4585    ENDDO
4586    !
4587    IF (type_trac == 'inca') THEN
4588#ifdef INCA
4589       CALL VTe(VTphysiq)
4590       CALL VTb(VTinca)
4591
4592       CALL chemhook_end ( &
4593            dtime, &
4594            pplay, &
4595            t_seri, &
4596            tr_seri, &
4597            nbtr, &
4598            paprs, &
4599            q_seri, &
4600            cell_area, &
4601            pphi, &
4602            pphis, &
4603            zx_rh, &
4604            aps, bps)
4605
4606       CALL VTe(VTinca)
4607       CALL VTb(VTphysiq)
4608#endif
4609    ENDIF
4610
4611
4612    !
4613    ! Convertir les incrementations en tendances
4614    !
4615    IF (prt_level .GE.10) THEN
4616       print *,'Convertir les incrementations en tendances '
4617    ENDIF
4618    !
4619    IF (mydebug) THEN
4620       CALL writefield_phy('u_seri',u_seri,nbp_lev)
4621       CALL writefield_phy('v_seri',v_seri,nbp_lev)
4622       CALL writefield_phy('t_seri',t_seri,nbp_lev)
4623       CALL writefield_phy('q_seri',q_seri,nbp_lev)
4624    ENDIF
4625
4626    DO k = 1, klev
4627       DO i = 1, klon
4628          d_u(i,k) = ( u_seri(i,k) - u(i,k) ) / dtime
4629          d_v(i,k) = ( v_seri(i,k) - v(i,k) ) / dtime
4630          d_t(i,k) = ( t_seri(i,k)-t(i,k) ) / dtime
4631          d_qx(i,k,ivap) = ( q_seri(i,k) - qx(i,k,ivap) ) / dtime
4632          d_qx(i,k,iliq) = ( ql_seri(i,k) - qx(i,k,iliq) ) / dtime
4633          !CR: on ajoute le contenu en glace
4634          IF (nqo.eq.3) THEN
4635             d_qx(i,k,isol) = ( qs_seri(i,k) - qx(i,k,isol) ) / dtime
4636          ENDIF
4637       ENDDO
4638    ENDDO
4639    !
4640    !CR: nb de traceurs eau: nqo
4641    !  IF (nqtot.GE.3) THEN
4642    IF (nqtot.GE.(nqo+1)) THEN
4643       !     DO iq = 3, nqtot
4644       DO iq = nqo+1, nqtot
4645          DO  k = 1, klev
4646             DO  i = 1, klon
4647                ! d_qx(i,k,iq) = ( tr_seri(i,k,iq-2) - qx(i,k,iq) ) / dtime
4648                d_qx(i,k,iq) = ( tr_seri(i,k,iq-nqo) - qx(i,k,iq) ) / dtime
4649             ENDDO
4650          ENDDO
4651       ENDDO
4652    ENDIF
4653    !
4654    !IM rajout diagnostiques bilan KP pour analyse MJO par Jun-Ichi Yano
4655    !IM global posePB      include "write_bilKP_ins.h"
4656    !IM global posePB      include "write_bilKP_ave.h"
4657    !
4658
4659    !--OB mass fixer
4660    !--profile is corrected to force mass conservation of water
4661    IF (mass_fixer) THEN
4662    qql2(:)=0.0
4663    DO k = 1, klev
4664      qql2(:)=qql2(:)+(q_seri(:,k)+ql_seri(:,k)+qs_seri(:,k))*zmasse(:,k)
4665    ENDDO
4666    DO i = 1, klon
4667      !--compute ratio of what q+ql should be with conservation to what it is
4668      corrqql=(qql1(i)+(evap(i)-rain_fall(i)-snow_fall(i))*pdtphys)/qql2(i)
4669      DO k = 1, klev
4670        q_seri(i,k) =q_seri(i,k)*corrqql
4671        ql_seri(i,k)=ql_seri(i,k)*corrqql
4672      ENDDO
4673    ENDDO
4674    ENDIF
4675    !--fin mass fixer
4676
4677    ! Sauvegarder les valeurs de t et q a la fin de la physique:
4678    !
4679    u_ancien(:,:)  = u_seri(:,:)
4680    v_ancien(:,:)  = v_seri(:,:)
4681    t_ancien(:,:)  = t_seri(:,:)
4682    q_ancien(:,:)  = q_seri(:,:)
4683    ql_ancien(:,:) = ql_seri(:,:)
4684    qs_ancien(:,:) = qs_seri(:,:)
4685    CALL water_int(klon,klev,q_ancien,zmasse,prw_ancien)
4686    CALL water_int(klon,klev,ql_ancien,zmasse,prlw_ancien)
4687    CALL water_int(klon,klev,qs_ancien,zmasse,prsw_ancien)
4688    ! !! RomP >>>
4689    !CR: nb de traceurs eau: nqo
4690    IF (nqtot.GT.nqo) THEN
4691       DO iq = nqo+1, nqtot
4692          tr_ancien(:,:,iq-nqo) = tr_seri(:,:,iq-nqo)
4693       ENDDO
4694    ENDIF
4695    ! !! RomP <<<
4696    !==========================================================================
4697    ! Sorties des tendances pour un point particulier
4698    ! a utiliser en 1D, avec igout=1 ou en 3D sur un point particulier
4699    ! pour le debug
4700    ! La valeur de igout est attribuee plus haut dans le programme
4701    !==========================================================================
4702
4703    IF (prt_level.ge.1) THEN
4704       write(lunout,*) 'FIN DE PHYSIQ !!!!!!!!!!!!!!!!!!!!'
4705       write(lunout,*) &
4706            'nlon,klev,nqtot,debut,lafin,jD_cur, jH_cur, pdtphys pct tlos'
4707       write(lunout,*) &
4708            nlon,klev,nqtot,debut,lafin, jD_cur, jH_cur ,pdtphys, &
4709            pctsrf(igout,is_ter), pctsrf(igout,is_lic),pctsrf(igout,is_oce), &
4710            pctsrf(igout,is_sic)
4711       write(lunout,*) 'd_t_dyn,d_t_con,d_t_lsc,d_t_ajsb,d_t_ajs,d_t_eva'
4712       DO k=1,klev
4713          write(lunout,*) d_t_dyn(igout,k),d_t_con(igout,k), &
4714               d_t_lsc(igout,k),d_t_ajsb(igout,k),d_t_ajs(igout,k), &
4715               d_t_eva(igout,k)
4716       ENDDO
4717       write(lunout,*) 'cool,heat'
4718       DO k=1,klev
4719          write(lunout,*) cool(igout,k),heat(igout,k)
4720       ENDDO
4721
4722       !jyg<     (En attendant de statuer sur le sort de d_t_oli)
4723       !jyg!     write(lunout,*) 'd_t_oli,d_t_vdf,d_t_oro,d_t_lif,d_t_ec'
4724       !jyg!     do k=1,klev
4725       !jyg!        write(lunout,*) d_t_oli(igout,k),d_t_vdf(igout,k), &
4726       !jyg!             d_t_oro(igout,k),d_t_lif(igout,k),d_t_ec(igout,k)
4727       !jyg!     enddo
4728       write(lunout,*) 'd_t_vdf,d_t_oro,d_t_lif,d_t_ec'
4729       DO k=1,klev
4730          write(lunout,*) d_t_vdf(igout,k), &
4731               d_t_oro(igout,k),d_t_lif(igout,k),d_t_ec(igout,k)
4732       ENDDO
4733       !>jyg
4734
4735       write(lunout,*) 'd_ps ',d_ps(igout)
4736       write(lunout,*) 'd_u, d_v, d_t, d_qx1, d_qx2 '
4737       DO k=1,klev
4738          write(lunout,*) d_u(igout,k),d_v(igout,k),d_t(igout,k), &
4739               d_qx(igout,k,1),d_qx(igout,k,2)
4740       ENDDO
4741    ENDIF
4742
4743    !============================================================
4744    !   Calcul de la temperature potentielle
4745    !============================================================
4746    DO k = 1, klev
4747       DO i = 1, klon
4748          !JYG/IM theta en debut du pas de temps
4749          !JYG/IM       theta(i,k)=t(i,k)*(100000./pplay(i,k))**(RD/RCPD)
4750          !JYG/IM theta en fin de pas de temps de physique
4751          theta(i,k)=t_seri(i,k)*(100000./pplay(i,k))**(RD/RCPD)
4752          ! thetal: 2 lignes suivantes a decommenter si vous avez les fichiers
4753          !     MPL 20130625
4754          ! fth_fonctions.F90 et parkind1.F90
4755          ! sinon thetal=theta
4756          !       thetal(i,k)=fth_thetal(pplay(i,k),t_seri(i,k),q_seri(i,k),
4757          !    :         ql_seri(i,k))
4758          thetal(i,k)=theta(i,k)
4759       ENDDO
4760    ENDDO
4761    !
4762
4763    ! 22.03.04 BEG
4764    !=============================================================
4765    !   Ecriture des sorties
4766    !=============================================================
4767#ifdef CPP_IOIPSL
4768
4769    ! Recupere des varibles calcule dans differents modules
4770    ! pour ecriture dans histxxx.nc
4771
4772    ! Get some variables from module fonte_neige_mod
4773    CALL fonte_neige_get_vars(pctsrf,  &
4774         zxfqcalving, zxfqfonte, zxffonte, zxrunofflic)
4775
4776
4777    !=============================================================
4778    ! Separation entre thermiques et non thermiques dans les sorties
4779    ! de fisrtilp
4780    !=============================================================
4781
4782    IF (iflag_thermals>=1) THEN
4783       d_t_lscth=0.
4784       d_t_lscst=0.
4785       d_q_lscth=0.
4786       d_q_lscst=0.
4787       DO k=1,klev
4788          DO i=1,klon
4789             IF (ptconvth(i,k)) THEN
4790                d_t_lscth(i,k)=d_t_eva(i,k)+d_t_lsc(i,k)
4791                d_q_lscth(i,k)=d_q_eva(i,k)+d_q_lsc(i,k)
4792             ELSE
4793                d_t_lscst(i,k)=d_t_eva(i,k)+d_t_lsc(i,k)
4794                d_q_lscst(i,k)=d_q_eva(i,k)+d_q_lsc(i,k)
4795             ENDIF
4796          ENDDO
4797       ENDDO
4798
4799       DO i=1,klon
4800          plul_st(i)=prfl(i,lmax_th(i)+1)+psfl(i,lmax_th(i)+1)
4801          plul_th(i)=prfl(i,1)+psfl(i,1)
4802       ENDDO
4803    ENDIF
4804
4805    !On effectue les sorties:
4806
4807#ifdef CPP_Dust
4808  CALL phys_output_write_spl(itap, pdtphys, paprs, pphis,  &
4809       pplay, lmax_th, aerosol_couple,                 &
4810       ok_ade, ok_aie, ivap, new_aod, ok_sync,         &
4811       ptconv, read_climoz, clevSTD,                   &
4812       ptconvth, d_t, qx, d_qx, d_tr_dyn, zmasse,      &
4813       flag_aerosol, flag_aerosol_strat, ok_cdnc)
4814#else
4815    CALL phys_output_write(itap, pdtphys, paprs, pphis,  &
4816         pplay, lmax_th, aerosol_couple,                 &
4817         ok_ade, ok_aie, ivap, iliq, isol, new_aod,      &
4818         ok_sync, ptconv, read_climoz, clevSTD,          &
4819         ptconvth, d_u, d_t, qx, d_qx, zmasse,           &
4820         flag_aerosol, flag_aerosol_strat, ok_cdnc)
4821#endif
4822
4823#ifndef CPP_XIOS
4824    CALL write_paramLMDZ_phy(itap,nid_ctesGCM,ok_sync)
4825#endif
4826
4827#endif
4828
4829
4830    !====================================================================
4831    ! Arret du modele apres hgardfou en cas de detection d'un
4832    ! plantage par hgardfou
4833    !====================================================================
4834
4835    IF (abortphy==1) THEN
4836       abort_message ='Plantage hgardfou'
4837       CALL abort_physic (modname,abort_message,1)
4838    ENDIF
4839
4840    ! 22.03.04 END
4841    !
4842    !====================================================================
4843    ! Si c'est la fin, il faut conserver l'etat de redemarrage
4844    !====================================================================
4845    !
4846
4847    IF (lafin) THEN
4848       itau_phy = itau_phy + itap
4849       CALL phyredem ("restartphy.nc")
4850       !         open(97,form="unformatted",file="finbin")
4851       !         write(97) u_seri,v_seri,t_seri,q_seri
4852       !         close(97)
4853       !$OMP MASTER
4854       IF (read_climoz >= 1) THEN
4855          IF (is_mpi_root) THEN
4856             CALL nf95_close(ncid_climoz)
4857          ENDIF
4858          DEALLOCATE(press_edg_climoz) ! pointer
4859          DEALLOCATE(press_cen_climoz) ! pointer
4860       ENDIF
4861       !$OMP END MASTER
4862       print *,' physiq fin, nombre de steps ou cvpas = 1 : ', Ncvpaseq1
4863    ENDIF
4864
4865    !      first=.false.
4866
4867
4868  END SUBROUTINE physiq
4869
4870END MODULE physiq_mod
Note: See TracBrowser for help on using the repository browser.