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

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

test conv call every step if dtcon > threshold

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