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

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

removing a spurious print

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