source: LMDZ6/branches/IPSLCM6.0.15/libf/phylmd/physiq_mod.F90 @ 3419

Last change on this file since 3419 was 3419, checked in by acozic, 6 years ago

merge with rev 3418 of trunk

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