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

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

Forgotten initialization

  • 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.1 KB
Line 
1!
2! $Id: physiq_mod.F90 3154 2018-01-16 09:42:14Z 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 (abs(d_t_con(i,k)) > 0.24 .OR. &
2686!!                   abs(d_q_con(i,k)) > 2.e-2) THEN
2687               IF (abs(d_t_con(i,k)) > dtcon_multistep_max .OR. &
2688                   abs(d_q_con(i,k)) > dqcon_multistep_max) THEN
2689                 cvpas = 1
2690!!                 print *,'physiq1, i,k,d_t_con(i,k),d_q_con(i,k) ', &
2691!!                                   i,k,d_t_con(i,k),d_q_con(i,k)
2692               ENDIF
2693             ENDDO
2694          ENDDO
2695!!!   Ligne a ne surtout pas remettre sans avoir murement reflechi (jyg)
2696!!!          call bcast(cvpas)
2697!!!   ------------------------------------------------------------
2698          !>jyg
2699          !
2700          DO i = 1, klon
2701             IF (iflagctrl(i).le.1) itau_con(i)=itau_con(i)+cvpas
2702          ENDDO
2703          !
2704          !jyg<
2705          !    Add the tendency due to the dry adjustment of the wake profile
2706          IF (iflag_wake>=1) THEN
2707            IF (iflag_adjwk == 2) THEN
2708              DO k=1,klev
2709                 DO i=1,klon
2710                    ftd(i,k) = ftd(i,k) + wake_s(i)*d_t_adjwk(i,k)/dtime
2711                    fqd(i,k) = fqd(i,k) + wake_s(i)*d_q_adjwk(i,k)/dtime
2712                    d_t_con(i,k) = d_t_con(i,k) + wake_s(i)*d_t_adjwk(i,k)
2713                    d_q_con(i,k) = d_q_con(i,k) + wake_s(i)*d_q_adjwk(i,k)
2714                 ENDDO
2715              ENDDO
2716            ENDIF  ! (iflag_adjwk = 2)
2717          ENDIF   ! (iflag_wake>=1)
2718          !>jyg
2719          !
2720       ELSE ! ok_cvl
2721
2722          ! MAF conema3 ne contient pas les traceurs
2723          CALL conema3 (dtime, &
2724               paprs,pplay,t_seri,q_seri, &
2725               u_seri,v_seri,tr_seri,ntra, &
2726               sig1,w01, &
2727               d_t_con,d_q_con,d_u_con,d_v_con,d_tr, &
2728               rain_con, snow_con, ibas_con, itop_con, &
2729               upwd,dnwd,dnwd0,bas,top, &
2730               Ma,cape,tvp,rflag, &
2731               pbase &
2732               ,bbase,dtvpdt1,dtvpdq1,dplcldt,dplcldr &
2733               ,clwcon0)
2734
2735       ENDIF ! ok_cvl
2736
2737       !
2738       ! Correction precip
2739       rain_con = rain_con * cvl_corr
2740       snow_con = snow_con * cvl_corr
2741       !
2742
2743       IF (.NOT. ok_gust) THEN
2744          do i = 1, klon
2745             wd(i)=0.0
2746          enddo
2747       ENDIF
2748
2749       ! =================================================================== c
2750       ! Calcul des proprietes des nuages convectifs
2751       !
2752
2753       !   calcul des proprietes des nuages convectifs
2754       clwcon0(:,:)=fact_cldcon*clwcon0(:,:)
2755       IF (iflag_cld_cv == 0) THEN
2756          CALL clouds_gno &
2757               (klon,klev,q_seri,zqsat,clwcon0,ptconv,ratqsc,rnebcon0)
2758       ELSE
2759          CALL clouds_bigauss &
2760               (klon,klev,q_seri,zqsat,qtc_cv,sigt_cv,ptconv,ratqsc,rnebcon0)
2761       ENDIF
2762
2763
2764       ! =================================================================== c
2765
2766       DO i = 1, klon
2767          itop_con(i) = min(max(itop_con(i),1),klev)
2768          ibas_con(i) = min(max(ibas_con(i),1),itop_con(i))
2769       ENDDO
2770
2771       DO i = 1, klon
2772          ema_pcb(i)  = paprs(i,ibas_con(i))
2773       ENDDO
2774       DO i = 1, klon
2775          ! L'idicage de itop_con peut cacher un pb potentiel
2776          ! FH sous la dictee de JYG, CR
2777          ema_pct(i)  = paprs(i,itop_con(i)+1)
2778
2779          IF (itop_con(i).gt.klev-3) THEN
2780             IF (prt_level >= 9) THEN
2781                write(lunout,*)'La convection monte trop haut '
2782                write(lunout,*)'itop_con(,',i,',)=',itop_con(i)
2783             ENDIF
2784          ENDIF
2785       ENDDO
2786    ELSE IF (iflag_con.eq.0) THEN
2787       write(lunout,*) 'On n appelle pas la convection'
2788       clwcon0=0.
2789       rnebcon0=0.
2790       d_t_con=0.
2791       d_q_con=0.
2792       d_u_con=0.
2793       d_v_con=0.
2794       rain_con=0.
2795       snow_con=0.
2796       bas=1
2797       top=1
2798    ELSE
2799       WRITE(lunout,*) "iflag_con non-prevu", iflag_con
2800       CALL abort_physic("physiq", "", 1)
2801    ENDIF
2802
2803    !     CALL homogene(paprs, q_seri, d_q_con, u_seri,v_seri,
2804    !    .              d_u_con, d_v_con)
2805
2806!jyg    Reinitialize proba_notrig and itapcv when convection has been called
2807    proba_notrig(:) = 1.
2808    itapcv = 0
2809    ENDIF !  (MOD(itapcv,cvpas).EQ.0 .OR. MOD(itapcv,cvpas_0).EQ.0)
2810!
2811    itapcv = itapcv+1
2812    !
2813    ! Compter les steps ou cvpas=1
2814    IF (cvpas == 1) THEN
2815      Ncvpaseq1 = Ncvpaseq1+1
2816    ENDIF
2817    IF (mod(itap,1000) == 0) THEN
2818      print *,' physiq, nombre de steps ou cvpas = 1 : ', Ncvpaseq1
2819    ENDIF
2820
2821!!!jyg  Appel diagnostique a add_phys_tend pour tester la conservation de
2822!!!     l'energie dans les courants satures.
2823!!    d_t_con_sat(:,:) = d_t_con(:,:) - ftd(:,:)*dtime
2824!!    d_q_con_sat(:,:) = d_q_con(:,:) - fqd(:,:)*dtime
2825!!    dql_sat(:,:) = (wdtrainA(:,:)+wdtrainM(:,:))*dtime/zmasse(:,:)
2826!!    CALL add_phys_tend(d_u_con, d_v_con, d_t_con_sat, d_q_con_sat, dql_sat,   &
2827!!                     dqi0, paprs, 'convection_sat', abortphy, flag_inhib_tend,& 
2828!!                     itap, 1)
2829!!    call prt_enerbil('convection_sat',itap)
2830!!
2831!!
2832    CALL add_phys_tend(d_u_con, d_v_con, d_t_con, d_q_con, dql0, dqi0, paprs, &
2833         'convection',abortphy,flag_inhib_tend,itap,0)
2834    call prt_enerbil('convection',itap)
2835
2836    !-------------------------------------------------------------------------
2837
2838    IF (mydebug) THEN
2839       CALL writefield_phy('u_seri',u_seri,nbp_lev)
2840       CALL writefield_phy('v_seri',v_seri,nbp_lev)
2841       CALL writefield_phy('t_seri',t_seri,nbp_lev)
2842       CALL writefield_phy('q_seri',q_seri,nbp_lev)
2843    ENDIF
2844
2845    IF (check) THEN
2846       za = qcheck(klon,klev,paprs,q_seri,ql_seri,cell_area)
2847       WRITE(lunout,*)"aprescon=", za
2848       zx_t = 0.0
2849       za = 0.0
2850       DO i = 1, klon
2851          za = za + cell_area(i)/REAL(klon)
2852          zx_t = zx_t + (rain_con(i)+ &
2853               snow_con(i))*cell_area(i)/REAL(klon)
2854       ENDDO
2855       zx_t = zx_t/za*dtime
2856       WRITE(lunout,*)"Precip=", zx_t
2857    ENDIF
2858    IF (zx_ajustq) THEN
2859       DO i = 1, klon
2860          z_apres(i) = 0.0
2861       ENDDO
2862       DO k = 1, klev
2863          DO i = 1, klon
2864             z_apres(i) = z_apres(i) + (q_seri(i,k)+ql_seri(i,k)) &
2865                  *(paprs(i,k)-paprs(i,k+1))/RG
2866          ENDDO
2867       ENDDO
2868       DO i = 1, klon
2869          z_factor(i) = (z_avant(i)-(rain_con(i)+snow_con(i))*dtime) &
2870               /z_apres(i)
2871       ENDDO
2872       DO k = 1, klev
2873          DO i = 1, klon
2874             IF (z_factor(i).GT.(1.0+1.0E-08) .OR. &
2875                  z_factor(i).LT.(1.0-1.0E-08)) THEN
2876                q_seri(i,k) = q_seri(i,k) * z_factor(i)
2877             ENDIF
2878          ENDDO
2879       ENDDO
2880    ENDIF
2881    zx_ajustq=.FALSE.
2882
2883    !
2884    !==========================================================================
2885    !RR:Evolution de la poche froide: on ne fait pas de separation wake/env
2886    !pour la couche limite diffuse pour l instant
2887    !
2888    !
2889    ! nrlmd le 22/03/2011---Si on met les poches hors des thermiques
2890    ! il faut rajouter cette tendance calcul\'ee hors des poches
2891    ! froides
2892    !
2893    IF (iflag_wake>=1) THEN
2894       !
2895       !
2896       ! Call wakes every "wkpas" step
2897       !
2898       IF (MOD(itapwk,wkpas).EQ.0) THEN
2899          !
2900          DO k=1,klev
2901             DO i=1,klon
2902                dt_dwn(i,k)  = ftd(i,k)
2903                dq_dwn(i,k)  = fqd(i,k)
2904                M_dwn(i,k)   = dnwd0(i,k)
2905                M_up(i,k)    = upwd(i,k)
2906                dt_a(i,k)    = d_t_con(i,k)/dtime - ftd(i,k)
2907                dq_a(i,k)    = d_q_con(i,k)/dtime - fqd(i,k)
2908             ENDDO
2909          ENDDO
2910         
2911          IF (iflag_wake==2) THEN
2912             ok_wk_lsp(:)=max(sign(1.,wake_s(:)-wake_s_min_lsp),0.)
2913             DO k = 1,klev
2914                dt_dwn(:,k)= dt_dwn(:,k)+ &
2915                     ok_wk_lsp(:)*(d_t_eva(:,k)+d_t_lsc(:,k))/dtime
2916                dq_dwn(:,k)= dq_dwn(:,k)+ &
2917                     ok_wk_lsp(:)*(d_q_eva(:,k)+d_q_lsc(:,k))/dtime
2918             ENDDO
2919          ELSEIF (iflag_wake==3) THEN
2920             ok_wk_lsp(:)=max(sign(1.,wake_s(:)-wake_s_min_lsp),0.)
2921             DO k = 1,klev
2922                DO i=1,klon
2923                   IF (rneb(i,k)==0.) THEN
2924                      ! On ne tient compte des tendances qu'en dehors des
2925                      ! nuages (c'est-\`a-dire a priri dans une region ou
2926                      ! l'eau se reevapore).
2927                      dt_dwn(i,k)= dt_dwn(i,k)+ &
2928                           ok_wk_lsp(i)*d_t_lsc(i,k)/dtime
2929                      dq_dwn(i,k)= dq_dwn(i,k)+ &
2930                           ok_wk_lsp(i)*d_q_lsc(i,k)/dtime
2931                   ENDIF
2932                ENDDO
2933             ENDDO
2934          ENDIF
2935         
2936          !
2937          !calcul caracteristiques de la poche froide
2938          CALL calWAKE (iflag_wake_tend, paprs, pplay, dtime, &
2939               t_seri, q_seri, omega,  &
2940               dt_dwn, dq_dwn, M_dwn, M_up,  &
2941               dt_a, dq_a,  &
2942               sigd,  &
2943               wake_deltat, wake_deltaq, wake_s, wake_dens,  &
2944               wake_dth, wake_h,  &
2945!!               wake_pe, wake_fip, wake_gfl,  &
2946               wake_pe, wake_fip_0, wake_gfl,  &   !! jyg
2947               d_t_wake, d_q_wake,  &
2948               wake_k, t_x, q_x,  &
2949               wake_omgbdth, wake_dp_omgb,  &
2950               wake_dtKE, wake_dqKE,  &
2951               wake_omg, wake_dp_deltomg,  &
2952               wake_spread, wake_Cstar, d_deltat_wk_gw,  &
2953               d_deltat_wk, d_deltaq_wk, d_s_wk, d_dens_wk)
2954          !
2955          !jyg    Reinitialize itapwk when wakes have been called
2956          itapwk = 0
2957       ENDIF !  (MOD(itapwk,wkpas).EQ.0)
2958       !
2959       itapwk = itapwk+1
2960       !
2961       !-----------------------------------------------------------------------
2962       ! ajout des tendances des poches froides
2963       CALL add_phys_tend(du0,dv0,d_t_wake,d_q_wake,dql0,dqi0,paprs,'wake', &
2964            abortphy,flag_inhib_tend,itap,0)
2965       call prt_enerbil('wake',itap)
2966       !------------------------------------------------------------------------
2967
2968       ! Increment Wake state variables
2969       IF (iflag_wake_tend .GT. 0.) THEN
2970
2971         CALL add_wake_tend &
2972            (d_deltat_wk, d_deltaq_wk, d_s_wk, d_dens_wk, wake_k, &
2973             'wake', abortphy)
2974          call prt_enerbil('wake',itap)
2975       ENDIF   ! (iflag_wake_tend .GT. 0.)
2976
2977       IF (iflag_alp_wk_cond .GT. 0.) THEN
2978
2979         CALL alpale_wk(dtime, cell_area, wake_k, wake_s, wake_dens, wake_fip_0, &
2980                        wake_fip)
2981       ELSE
2982         wake_fip(:) = wake_fip_0(:)
2983       ENDIF   ! (iflag_alp_wk_cond .GT. 0.)
2984
2985    ENDIF  ! (iflag_wake>=1)
2986    !
2987    !===================================================================
2988    ! Convection seche (thermiques ou ajustement)
2989    !===================================================================
2990    !
2991    CALL stratocu_if(klon,klev,pctsrf,paprs, pplay,t_seri &
2992         ,seuil_inversion,weak_inversion,dthmin)
2993
2994
2995
2996    d_t_ajsb(:,:)=0.
2997    d_q_ajsb(:,:)=0.
2998    d_t_ajs(:,:)=0.
2999    d_u_ajs(:,:)=0.
3000    d_v_ajs(:,:)=0.
3001    d_q_ajs(:,:)=0.
3002    clwcon0th(:,:)=0.
3003    !
3004    !      fm_therm(:,:)=0.
3005    !      entr_therm(:,:)=0.
3006    !      detr_therm(:,:)=0.
3007    !
3008    IF (prt_level>9) WRITE(lunout,*) &
3009         'AVANT LA CONVECTION SECHE , iflag_thermals=' &
3010         ,iflag_thermals,'   nsplit_thermals=',nsplit_thermals
3011    IF (iflag_thermals<0) THEN
3012       !  Rien
3013       !  ====
3014       IF (prt_level>9) WRITE(lunout,*)'pas de convection seche'
3015
3016
3017    ELSE
3018
3019       !  Thermiques
3020       !  ==========
3021       IF (prt_level>9) WRITE(lunout,*)'JUSTE AVANT , iflag_thermals=' &
3022            ,iflag_thermals,'   nsplit_thermals=',nsplit_thermals
3023
3024
3025       !cc nrlmd le 10/04/2012
3026       DO k=1,klev+1
3027          DO i=1,klon
3028             pbl_tke_input(i,k,is_oce)=pbl_tke(i,k,is_oce)
3029             pbl_tke_input(i,k,is_ter)=pbl_tke(i,k,is_ter)
3030             pbl_tke_input(i,k,is_lic)=pbl_tke(i,k,is_lic)
3031             pbl_tke_input(i,k,is_sic)=pbl_tke(i,k,is_sic)
3032          ENDDO
3033       ENDDO
3034       !cc fin nrlmd le 10/04/2012
3035
3036       IF (iflag_thermals>=1) THEN
3037          !jyg<
3038!!       IF (mod(iflag_pbl_split/2,2) .EQ. 1) THEN
3039       IF (mod(iflag_pbl_split/10,10) .GE. 1) THEN
3040             !  Appel des thermiques avec les profils exterieurs aux poches
3041             DO k=1,klev
3042                DO i=1,klon
3043                   t_therm(i,k) = t_seri(i,k) - wake_s(i)*wake_deltat(i,k)
3044                   q_therm(i,k) = q_seri(i,k) - wake_s(i)*wake_deltaq(i,k)
3045                   u_therm(i,k) = u_seri(i,k)
3046                   v_therm(i,k) = v_seri(i,k)
3047                ENDDO
3048             ENDDO
3049          ELSE
3050             !  Appel des thermiques avec les profils moyens
3051             DO k=1,klev
3052                DO i=1,klon
3053                   t_therm(i,k) = t_seri(i,k)
3054                   q_therm(i,k) = q_seri(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          ENDIF
3060          !>jyg
3061          CALL calltherm(pdtphys &
3062               ,pplay,paprs,pphi,weak_inversion &
3063                        ! ,u_seri,v_seri,t_seri,q_seri,zqsat,debut & !jyg
3064               ,u_therm,v_therm,t_therm,q_therm,zqsat,debut &  !jyg
3065               ,d_u_ajs,d_v_ajs,d_t_ajs,d_q_ajs &
3066               ,fm_therm,entr_therm,detr_therm &
3067               ,zqasc,clwcon0th,lmax_th,ratqscth &
3068               ,ratqsdiff,zqsatth &
3069                                !on rajoute ale et alp, et les
3070                                !caracteristiques de la couche alim
3071               ,Ale_bl,Alp_bl,lalim_conv,wght_th, zmax0, f0, zw2,fraca &
3072               ,ztv,zpspsk,ztla,zthl &
3073                                !cc nrlmd le 10/04/2012
3074               ,pbl_tke_input,pctsrf,omega,cell_area &
3075               ,zlcl_th,fraca0,w0,w_conv,therm_tke_max0,env_tke_max0 &
3076               ,n2,s2,ale_bl_stat &
3077               ,therm_tke_max,env_tke_max &
3078               ,alp_bl_det,alp_bl_fluct_m,alp_bl_fluct_tke &
3079               ,alp_bl_conv,alp_bl_stat &
3080                                !cc fin nrlmd le 10/04/2012
3081               ,zqla,ztva )
3082          !
3083          !jyg<
3084!!jyg          IF (mod(iflag_pbl_split/2,2) .EQ. 1) THEN
3085          IF (mod(iflag_pbl_split/10,10) .GE. 1) THEN
3086             !  Si les thermiques ne sont presents que hors des
3087             !  poches, la tendance moyenne associ\'ee doit etre
3088             !  multipliee par la fraction surfacique qu'ils couvrent.
3089             DO k=1,klev
3090                DO i=1,klon
3091                   !
3092                   d_deltat_the(i,k) = - d_t_ajs(i,k)
3093                   d_deltaq_the(i,k) = - d_q_ajs(i,k)
3094                   !
3095                   d_u_ajs(i,k) = d_u_ajs(i,k)*(1.-wake_s(i))
3096                   d_v_ajs(i,k) = d_v_ajs(i,k)*(1.-wake_s(i))
3097                   d_t_ajs(i,k) = d_t_ajs(i,k)*(1.-wake_s(i))
3098                   d_q_ajs(i,k) = d_q_ajs(i,k)*(1.-wake_s(i))
3099                   !
3100                ENDDO
3101             ENDDO
3102          !
3103             CALL add_wake_tend &
3104                 (d_deltat_the, d_deltaq_the, dsig0, ddens0, wkoccur1, 'the', abortphy)
3105             call prt_enerbil('the',itap)
3106          !
3107          ENDIF  ! (mod(iflag_pbl_split/10,10) .GE. 1)
3108          !
3109          CALL add_phys_tend(d_u_ajs,d_v_ajs,d_t_ajs,d_q_ajs,  &
3110                             dql0,dqi0,paprs,'thermals', abortphy,flag_inhib_tend,itap,0)
3111          call prt_enerbil('thermals',itap)
3112          !
3113!
3114          CALL alpale_th( dtime, lmax_th, t_seri, cell_area,  &
3115                          cin, s2, n2,  &
3116                          ale_bl_trig, ale_bl_stat, ale_bl,  &
3117                          alp_bl, alp_bl_stat, &
3118                          proba_notrig, random_notrig)
3119          !>jyg
3120
3121          ! ------------------------------------------------------------------
3122          ! Transport de la TKE par les panaches thermiques.
3123          ! FH : 2010/02/01
3124          !     if (iflag_pbl.eq.10) then
3125          !     call thermcell_dtke(klon,klev,nbsrf,pdtphys,fm_therm,entr_therm,
3126          !    s           rg,paprs,pbl_tke)
3127          !     endif
3128          ! -------------------------------------------------------------------
3129
3130          DO i=1,klon
3131             !           zmax_th(i)=pphi(i,lmax_th(i))/rg
3132             !CR:04/05/12:correction calcul zmax
3133             zmax_th(i)=zmax0(i)
3134          ENDDO
3135
3136       ENDIF
3137
3138       !  Ajustement sec
3139       !  ==============
3140
3141       ! Dans le cas o\`u on active les thermiques, on fait partir l'ajustement
3142       ! a partir du sommet des thermiques.
3143       ! Dans le cas contraire, on demarre au niveau 1.
3144
3145       IF (iflag_thermals>=13.or.iflag_thermals<=0) THEN
3146
3147          IF (iflag_thermals.eq.0) THEN
3148             IF (prt_level>9) WRITE(lunout,*)'ajsec'
3149             limbas(:)=1
3150          ELSE
3151             limbas(:)=lmax_th(:)
3152          ENDIF
3153
3154          ! Attention : le call ajsec_convV2 n'est maintenu que momentanneement
3155          ! pour des test de convergence numerique.
3156          ! Le nouveau ajsec est a priori mieux, meme pour le cas
3157          ! iflag_thermals = 0 (l'ancienne version peut faire des tendances
3158          ! non nulles numeriquement pour des mailles non concernees.
3159
3160          IF (iflag_thermals==0) THEN
3161             ! Calling adjustment alone (but not the thermal plume model)
3162             CALL ajsec_convV2(paprs, pplay, t_seri,q_seri &
3163                  , d_t_ajsb, d_q_ajsb)
3164          ELSE IF (iflag_thermals>0) THEN
3165             ! Calling adjustment above the top of thermal plumes
3166             CALL ajsec(paprs, pplay, t_seri,q_seri,limbas &
3167                  , d_t_ajsb, d_q_ajsb)
3168          ENDIF
3169
3170          !--------------------------------------------------------------------
3171          ! ajout des tendances de l'ajustement sec ou des thermiques
3172          CALL add_phys_tend(du0,dv0,d_t_ajsb,d_q_ajsb,dql0,dqi0,paprs, &
3173               'ajsb',abortphy,flag_inhib_tend,itap,0)
3174          call prt_enerbil('ajsb',itap)
3175          d_t_ajs(:,:)=d_t_ajs(:,:)+d_t_ajsb(:,:)
3176          d_q_ajs(:,:)=d_q_ajs(:,:)+d_q_ajsb(:,:)
3177
3178          !---------------------------------------------------------------------
3179
3180       ENDIF
3181
3182    ENDIF
3183    !
3184    !===================================================================
3185    ! Computation of ratqs, the width (normalized) of the subrid scale
3186    ! water distribution
3187    CALL  calcratqs(klon,klev,prt_level,lunout,        &
3188         iflag_ratqs,iflag_con,iflag_cld_th,pdtphys,  &
3189         ratqsbas,ratqshaut,ratqsp0, ratqsdp, &
3190         tau_ratqs,fact_cldcon,   &
3191         ptconv,ptconvth,clwcon0th, rnebcon0th,     &
3192         paprs,pplay,q_seri,zqsat,fm_therm, &
3193         ratqs,ratqsc)
3194
3195
3196    !
3197    ! Appeler le processus de condensation a grande echelle
3198    ! et le processus de precipitation
3199    !-------------------------------------------------------------------------
3200    IF (prt_level .GE.10) THEN
3201       print *,'itap, ->fisrtilp ',itap
3202    ENDIF
3203    !
3204    CALL fisrtilp(dtime,paprs,pplay, &
3205         t_seri, q_seri,ptconv,ratqs, &
3206         d_t_lsc, d_q_lsc, d_ql_lsc, d_qi_lsc, rneb, cldliq, &
3207         rain_lsc, snow_lsc, &
3208         pfrac_impa, pfrac_nucl, pfrac_1nucl, &
3209         frac_impa, frac_nucl, beta_prec_fisrt, &
3210         prfl, psfl, rhcl,  &
3211         zqasc, fraca,ztv,zpspsk,ztla,zthl,iflag_cld_th, &
3212         iflag_ice_thermo)
3213    !
3214    WHERE (rain_lsc < 0) rain_lsc = 0.
3215    WHERE (snow_lsc < 0) snow_lsc = 0.
3216
3217!+JLD
3218!    write(*,9000) 'phys lsc',"enerbil: bil_q, bil_e,",rain_lsc+snow_lsc &
3219!        & ,((rcw-rcpd)*rain_lsc + (rcs-rcpd)*snow_lsc)*t_seri(1,1)-rlvtt*rain_lsc+rlstt*snow_lsc &
3220!        & ,rain_lsc,snow_lsc
3221!    write(*,9000) "rcpv","rcw",rcpv,rcw,rcs,t_seri(1,1)
3222!-JLD
3223    CALL add_phys_tend(du0,dv0,d_t_lsc,d_q_lsc,d_ql_lsc,d_qi_lsc,paprs, &
3224         'lsc',abortphy,flag_inhib_tend,itap,0)
3225    call prt_enerbil('lsc',itap)
3226    rain_num(:)=0.
3227    DO k = 1, klev
3228       DO i = 1, klon
3229          IF (ql_seri(i,k)>oliqmax) THEN
3230             rain_num(i)=rain_num(i)+(ql_seri(i,k)-oliqmax)*zmasse(i,k)/pdtphys
3231             ql_seri(i,k)=oliqmax
3232          ENDIF
3233       ENDDO
3234    ENDDO
3235    IF (nqo==3) THEN
3236    DO k = 1, klev
3237       DO i = 1, klon
3238          IF (qs_seri(i,k)>oicemax) THEN
3239             rain_num(i)=rain_num(i)+(qs_seri(i,k)-oicemax)*zmasse(i,k)/pdtphys
3240             qs_seri(i,k)=oicemax
3241          ENDIF
3242       ENDDO
3243    ENDDO
3244    ENDIF
3245
3246    !---------------------------------------------------------------------------
3247    DO k = 1, klev
3248       DO i = 1, klon
3249          cldfra(i,k) = rneb(i,k)
3250          !CR: a quoi ca sert? Faut-il ajouter qs_seri?
3251          IF (.NOT.new_oliq) cldliq(i,k) = ql_seri(i,k)
3252       ENDDO
3253    ENDDO
3254    IF (check) THEN
3255       za = qcheck(klon,klev,paprs,q_seri,ql_seri,cell_area)
3256       WRITE(lunout,*)"apresilp=", za
3257       zx_t = 0.0
3258       za = 0.0
3259       DO i = 1, klon
3260          za = za + cell_area(i)/REAL(klon)
3261          zx_t = zx_t + (rain_lsc(i) &
3262               + snow_lsc(i))*cell_area(i)/REAL(klon)
3263       ENDDO
3264       zx_t = zx_t/za*dtime
3265       WRITE(lunout,*)"Precip=", zx_t
3266    ENDIF
3267
3268    IF (mydebug) THEN
3269       CALL writefield_phy('u_seri',u_seri,nbp_lev)
3270       CALL writefield_phy('v_seri',v_seri,nbp_lev)
3271       CALL writefield_phy('t_seri',t_seri,nbp_lev)
3272       CALL writefield_phy('q_seri',q_seri,nbp_lev)
3273    ENDIF
3274
3275    !
3276    !-------------------------------------------------------------------
3277    !  PRESCRIPTION DES NUAGES POUR LE RAYONNEMENT
3278    !-------------------------------------------------------------------
3279
3280    ! 1. NUAGES CONVECTIFS
3281    !
3282    !IM cf FH
3283    !     IF (iflag_cld_th.eq.-1) THEN ! seulement pour Tiedtke
3284    IF (iflag_cld_th.le.-1) THEN ! seulement pour Tiedtke
3285       snow_tiedtke=0.
3286       !     print*,'avant calcul de la pseudo precip '
3287       !     print*,'iflag_cld_th',iflag_cld_th
3288       IF (iflag_cld_th.eq.-1) THEN
3289          rain_tiedtke=rain_con
3290       ELSE
3291          !       print*,'calcul de la pseudo precip '
3292          rain_tiedtke=0.
3293          !         print*,'calcul de la pseudo precip 0'
3294          DO k=1,klev
3295             DO i=1,klon
3296                IF (d_q_con(i,k).lt.0.) THEN
3297                   rain_tiedtke(i)=rain_tiedtke(i)-d_q_con(i,k)/pdtphys &
3298                        *(paprs(i,k)-paprs(i,k+1))/rg
3299                ENDIF
3300             ENDDO
3301          ENDDO
3302       ENDIF
3303       !
3304       !     call dump2d(iim,jjm,rain_tiedtke(2:klon-1),'PSEUDO PRECIP ')
3305       !
3306
3307       ! Nuages diagnostiques pour Tiedtke
3308       CALL diagcld1(paprs,pplay, &
3309                                !IM cf FH. rain_con,snow_con,ibas_con,itop_con,
3310            rain_tiedtke,snow_tiedtke,ibas_con,itop_con, &
3311            diafra,dialiq)
3312       DO k = 1, klev
3313          DO i = 1, klon
3314             IF (diafra(i,k).GT.cldfra(i,k)) THEN
3315                cldliq(i,k) = dialiq(i,k)
3316                cldfra(i,k) = diafra(i,k)
3317             ENDIF
3318          ENDDO
3319       ENDDO
3320
3321    ELSE IF (iflag_cld_th.ge.3) THEN
3322       !  On prend pour les nuages convectifs le max du calcul de la
3323       !  convection et du calcul du pas de temps precedent diminue d'un facteur
3324       !  facttemps
3325       facteur = pdtphys *facttemps
3326       DO k=1,klev
3327          DO i=1,klon
3328             rnebcon(i,k)=rnebcon(i,k)*facteur
3329             IF (rnebcon0(i,k)*clwcon0(i,k).GT.rnebcon(i,k)*clwcon(i,k)) THEN
3330                rnebcon(i,k)=rnebcon0(i,k)
3331                clwcon(i,k)=clwcon0(i,k)
3332             ENDIF
3333          ENDDO
3334       ENDDO
3335
3336       !   On prend la somme des fractions nuageuses et des contenus en eau
3337
3338       IF (iflag_cld_th>=5) THEN
3339
3340          DO k=1,klev
3341             ptconvth(:,k)=fm_therm(:,k+1)>0.
3342          ENDDO
3343
3344          IF (iflag_coupl==4) THEN
3345
3346             ! Dans le cas iflag_coupl==4, on prend la somme des convertures
3347             ! convectives et lsc dans la partie des thermiques
3348             ! Le controle par iflag_coupl est peut etre provisoire.
3349             DO k=1,klev
3350                DO i=1,klon
3351                   IF (ptconv(i,k).AND.ptconvth(i,k)) THEN
3352                      cldliq(i,k)=cldliq(i,k)+rnebcon(i,k)*clwcon(i,k)
3353                      cldfra(i,k)=min(cldfra(i,k)+rnebcon(i,k),1.)
3354                   ELSE IF (ptconv(i,k)) THEN
3355                      cldfra(i,k)=rnebcon(i,k)
3356                      cldliq(i,k)=rnebcon(i,k)*clwcon(i,k)
3357                   ENDIF
3358                ENDDO
3359             ENDDO
3360
3361          ELSE IF (iflag_coupl==5) THEN
3362             DO k=1,klev
3363                DO i=1,klon
3364                   cldfra(i,k)=min(cldfra(i,k)+rnebcon(i,k),1.)
3365                   cldliq(i,k)=cldliq(i,k)+rnebcon(i,k)*clwcon(i,k)
3366                ENDDO
3367             ENDDO
3368
3369          ELSE
3370
3371             ! Si on est sur un point touche par la convection
3372             ! profonde et pas par les thermiques, on prend la
3373             ! couverture nuageuse et l'eau nuageuse de la convection
3374             ! profonde.
3375
3376             !IM/FH: 2011/02/23
3377             ! definition des points sur lesquels ls thermiques sont actifs
3378
3379             DO k=1,klev
3380                DO i=1,klon
3381                   IF (ptconv(i,k).AND. .NOT.ptconvth(i,k)) THEN
3382                      cldfra(i,k)=rnebcon(i,k)
3383                      cldliq(i,k)=rnebcon(i,k)*clwcon(i,k)
3384                   ENDIF
3385                ENDDO
3386             ENDDO
3387
3388          ENDIF
3389
3390       ELSE
3391
3392          ! Ancienne version
3393          cldfra(:,:)=min(max(cldfra(:,:),rnebcon(:,:)),1.)
3394          cldliq(:,:)=cldliq(:,:)+rnebcon(:,:)*clwcon(:,:)
3395       ENDIF
3396
3397    ENDIF
3398
3399    !     plulsc(:)=0.
3400    !     do k=1,klev,-1
3401    !        do i=1,klon
3402    !              zzz=prfl(:,k)+psfl(:,k)
3403    !           if (.not.ptconvth.zzz.gt.0.)
3404    !        enddo prfl, psfl,
3405    !     enddo
3406    !
3407    ! 2. NUAGES STARTIFORMES
3408    !
3409    IF (ok_stratus) THEN
3410       CALL diagcld2(paprs,pplay,t_seri,q_seri, diafra,dialiq)
3411       DO k = 1, klev
3412          DO i = 1, klon
3413             IF (diafra(i,k).GT.cldfra(i,k)) THEN
3414                cldliq(i,k) = dialiq(i,k)
3415                cldfra(i,k) = diafra(i,k)
3416             ENDIF
3417          ENDDO
3418       ENDDO
3419    ENDIF
3420    !
3421    ! Precipitation totale
3422    !
3423    DO i = 1, klon
3424       rain_fall(i) = rain_con(i) + rain_lsc(i)
3425       snow_fall(i) = snow_con(i) + snow_lsc(i)
3426    ENDDO
3427    !
3428    ! Calculer l'humidite relative pour diagnostique
3429    !
3430    DO k = 1, klev
3431       DO i = 1, klon
3432          zx_t = t_seri(i,k)
3433          IF (thermcep) THEN
3434             !!           if (iflag_ice_thermo.eq.0) then                 !jyg
3435             zdelta = MAX(0.,SIGN(1.,rtt-zx_t))
3436             !!           else                                            !jyg
3437             !!           zdelta = MAX(0.,SIGN(1.,t_glace_min-zx_t))      !jyg
3438             !!           endif                                           !jyg
3439             zx_qs  = r2es * FOEEW(zx_t,zdelta)/pplay(i,k)
3440             zx_qs  = MIN(0.5,zx_qs)
3441             zcor   = 1./(1.-retv*zx_qs)
3442             zx_qs  = zx_qs*zcor
3443          ELSE
3444             !!           IF (zx_t.LT.t_coup) THEN             !jyg
3445             IF (zx_t.LT.rtt) THEN                  !jyg
3446                zx_qs = qsats(zx_t)/pplay(i,k)
3447             ELSE
3448                zx_qs = qsatl(zx_t)/pplay(i,k)
3449             ENDIF
3450          ENDIF
3451          zx_rh(i,k) = q_seri(i,k)/zx_qs
3452          zqsat(i,k)=zx_qs
3453       ENDDO
3454    ENDDO
3455
3456    !IM Calcul temp.potentielle a 2m (tpot) et temp. potentielle
3457    !   equivalente a 2m (tpote) pour diagnostique
3458    !
3459    DO i = 1, klon
3460       tpot(i)=zt2m(i)*(100000./paprs(i,1))**RKAPPA
3461       IF (thermcep) THEN
3462          IF(zt2m(i).LT.RTT) then
3463             Lheat=RLSTT
3464          ELSE
3465             Lheat=RLVTT
3466          ENDIF
3467       ELSE
3468          IF (zt2m(i).LT.RTT) THEN
3469             Lheat=RLSTT
3470          ELSE
3471             Lheat=RLVTT
3472          ENDIF
3473       ENDIF
3474       tpote(i) = tpot(i)*      &
3475            EXP((Lheat *qsat2m(i))/(RCPD*zt2m(i)))
3476    ENDDO
3477
3478    IF (type_trac == 'inca') THEN
3479#ifdef INCA
3480       CALL VTe(VTphysiq)
3481       CALL VTb(VTinca)
3482       calday = REAL(days_elapsed + 1) + jH_cur
3483
3484       CALL chemtime(itap+itau_phy-1, date0, dtime, itap)
3485       IF (config_inca == 'aero' .OR. config_inca == 'aeNP') THEN
3486          CALL AEROSOL_METEO_CALC( &
3487               calday,pdtphys,pplay,paprs,t,pmflxr,pmflxs, &
3488               prfl,psfl,pctsrf,cell_area, &
3489               latitude_deg,longitude_deg,u10m,v10m)
3490       ENDIF
3491
3492       zxsnow_dummy(:) = 0.0
3493
3494       CALL chemhook_begin (calday, &
3495            days_elapsed+1, &
3496            jH_cur, &
3497            pctsrf(1,1), &
3498            latitude_deg, &
3499            longitude_deg, &
3500            cell_area, &
3501            paprs, &
3502            pplay, &
3503            coefh(1:klon,1:klev,is_ave), &
3504            pphi, &
3505            t_seri, &
3506            u, &
3507            v, &
3508            wo(:, :, 1), &
3509            q_seri, &
3510            zxtsol, &
3511            zxsnow_dummy, &
3512            solsw, &
3513            albsol1, &
3514            rain_fall, &
3515            snow_fall, &
3516            itop_con, &
3517            ibas_con, &
3518            cldfra, &
3519            nbp_lon, &
3520            nbp_lat-1, &
3521            tr_seri, &
3522            ftsol, &
3523            paprs, &
3524            cdragh, &
3525            cdragm, &
3526            pctsrf, &
3527            pdtphys, &
3528            itap)
3529
3530       CALL VTe(VTinca)
3531       CALL VTb(VTphysiq)
3532#endif
3533    ENDIF !type_trac = inca
3534
3535
3536    !
3537    ! Appeler le rayonnement mais calculer tout d'abord l'albedo du sol.
3538    !
3539    IF (MOD(itaprad,radpas).EQ.0) THEN
3540
3541       !
3542       !jq - introduce the aerosol direct and first indirect radiative forcings
3543       !jq - Johannes Quaas, 27/11/2003 (quaas@lmd.jussieu.fr)
3544       IF (flag_aerosol .GT. 0) THEN
3545          IF (iflag_rrtm .EQ. 0) THEN !--old radiation
3546             IF (.NOT. aerosol_couple) THEN
3547                !
3548                CALL readaerosol_optic( &
3549                     debut, new_aod, flag_aerosol, itap, jD_cur-jD_ref, &
3550                     pdtphys, pplay, paprs, t_seri, rhcl, presnivs,  &
3551                     mass_solu_aero, mass_solu_aero_pi,  &
3552                     tau_aero, piz_aero, cg_aero,  &
3553                     tausum_aero, tau3d_aero)
3554             ENDIF
3555          ELSE                       ! RRTM radiation
3556             IF (aerosol_couple .AND. config_inca == 'aero' ) THEN
3557                abort_message='config_inca=aero et rrtm=1 impossible'
3558                CALL abort_physic(modname,abort_message,1)
3559             ELSE
3560                !
3561#ifdef CPP_RRTM
3562                IF (NSW.EQ.6) THEN
3563                   !--new aerosol properties SW and LW
3564                   !
3565#ifdef CPP_Dust
3566                   !--SPL aerosol model
3567                   CALL splaerosol_optic_rrtm( ok_alw, pplay, paprs, t_seri, rhcl, &
3568                        tr_seri, mass_solu_aero, mass_solu_aero_pi,  &
3569                        tau_aero_sw_rrtm, piz_aero_sw_rrtm, cg_aero_sw_rrtm,  &
3570                        tausum_aero, tau3d_aero)
3571#else
3572                   !--climatologies or INCA aerosols
3573                   CALL readaerosol_optic_rrtm( debut, aerosol_couple, ok_alw, &
3574                        new_aod, flag_aerosol, flag_bc_internal_mixture, itap, jD_cur-jD_ref, &
3575                        pdtphys, pplay, paprs, t_seri, rhcl, presnivs,  &
3576                        tr_seri, mass_solu_aero, mass_solu_aero_pi,  &
3577                        tau_aero_sw_rrtm, piz_aero_sw_rrtm, cg_aero_sw_rrtm,  &
3578                        tausum_aero, drytausum_aero, tau3d_aero)
3579#endif
3580                   !
3581                ELSE IF (NSW.EQ.2) THEN
3582                   !--for now we use the old aerosol properties
3583                   !
3584                   CALL readaerosol_optic( &
3585                        debut, new_aod, flag_aerosol, itap, jD_cur-jD_ref, &
3586                        pdtphys, pplay, paprs, t_seri, rhcl, presnivs,  &
3587                        mass_solu_aero, mass_solu_aero_pi,  &
3588                        tau_aero, piz_aero, cg_aero,  &
3589                        tausum_aero, tau3d_aero)
3590                   !
3591                   !--natural aerosols
3592                   tau_aero_sw_rrtm(:,:,1,:)=tau_aero(:,:,3,:)
3593                   piz_aero_sw_rrtm(:,:,1,:)=piz_aero(:,:,3,:)
3594                   cg_aero_sw_rrtm (:,:,1,:)=cg_aero (:,:,3,:)
3595                   !--all aerosols
3596                   tau_aero_sw_rrtm(:,:,2,:)=tau_aero(:,:,2,:)
3597                   piz_aero_sw_rrtm(:,:,2,:)=piz_aero(:,:,2,:)
3598                   cg_aero_sw_rrtm (:,:,2,:)=cg_aero (:,:,2,:)
3599                   !
3600                   !--no LW optics
3601                   tau_aero_lw_rrtm(:,:,:,:) = 1.e-15
3602                   !
3603                ELSE
3604                   abort_message='Only NSW=2 or 6 are possible with ' &
3605                        // 'aerosols and iflag_rrtm=1'
3606                   CALL abort_physic(modname,abort_message,1)
3607                ENDIF
3608#else
3609                abort_message='You should compile with -rrtm if running ' &
3610                     // 'with iflag_rrtm=1'
3611                CALL abort_physic(modname,abort_message,1)
3612#endif
3613                !
3614             ENDIF
3615          ENDIF
3616       ELSE   !--flag_aerosol = 0
3617          tausum_aero(:,:,:) = 0.
3618          drytausum_aero(:,:) = 0.
3619          mass_solu_aero(:,:) = 0.
3620          mass_solu_aero_pi(:,:) = 0.
3621          IF (iflag_rrtm .EQ. 0) THEN !--old radiation
3622             tau_aero(:,:,:,:) = 1.e-15
3623             piz_aero(:,:,:,:) = 1.
3624             cg_aero(:,:,:,:)  = 0.
3625          ELSE
3626             tau_aero_sw_rrtm(:,:,:,:) = 1.e-15
3627             tau_aero_lw_rrtm(:,:,:,:) = 1.e-15
3628             piz_aero_sw_rrtm(:,:,:,:) = 1.0
3629             cg_aero_sw_rrtm(:,:,:,:)  = 0.0
3630          ENDIF
3631       ENDIF
3632       !
3633       !--WMO criterion to determine tropopause
3634       CALL stratosphere_mask(missing_val, pphis, t_seri, pplay, latitude_deg)
3635       !
3636       !--STRAT AEROSOL
3637       !--updates tausum_aero,tau_aero,piz_aero,cg_aero
3638       IF (flag_aerosol_strat.GT.0) THEN
3639          IF (prt_level .GE.10) THEN
3640             PRINT *,'appel a readaerosolstrat', mth_cur
3641          ENDIF
3642          IF (iflag_rrtm.EQ.0) THEN
3643           IF (flag_aerosol_strat.EQ.1) THEN
3644             CALL readaerosolstrato(debut)
3645           ELSE
3646             abort_message='flag_aerosol_strat must equal 1 for rrtm=0'
3647             CALL abort_physic(modname,abort_message,1)
3648           ENDIF
3649          ELSE
3650#ifdef CPP_RRTM
3651#ifndef CPP_StratAer
3652          !--prescribed strat aerosols
3653          !--only in the case of non-interactive strat aerosols
3654            IF (flag_aerosol_strat.EQ.1) THEN
3655             CALL readaerosolstrato1_rrtm(debut)
3656            ELSEIF (flag_aerosol_strat.EQ.2) THEN
3657             CALL readaerosolstrato2_rrtm(debut)
3658            ELSE
3659             abort_message='flag_aerosol_strat must equal 1 or 2 for rrtm=1'
3660             CALL abort_physic(modname,abort_message,1)
3661            ENDIF
3662#endif
3663#else
3664             abort_message='You should compile with -rrtm if running ' &
3665                  // 'with iflag_rrtm=1'
3666             CALL abort_physic(modname,abort_message,1)
3667#endif
3668          ENDIF
3669       ENDIF
3670!
3671#ifdef CPP_RRTM
3672#ifdef CPP_StratAer
3673       !--compute stratospheric mask
3674       CALL stratosphere_mask(missing_val, pphis, t_seri, pplay, latitude_deg)
3675       !--interactive strat aerosols
3676       CALL calcaerosolstrato_rrtm(pplay,t_seri,paprs,debut)
3677#endif
3678#endif
3679       !--fin STRAT AEROSOL
3680       !     
3681
3682       ! Calculer les parametres optiques des nuages et quelques
3683       ! parametres pour diagnostiques:
3684       !
3685       IF (aerosol_couple.AND.config_inca=='aero') THEN
3686          mass_solu_aero(:,:)    = ccm(:,:,1)
3687          mass_solu_aero_pi(:,:) = ccm(:,:,2)
3688       ENDIF
3689
3690       IF (ok_newmicro) then
3691          IF (iflag_rrtm.NE.0) THEN
3692#ifdef CPP_RRTM
3693             IF (ok_cdnc.AND.NRADLP.NE.3) THEN
3694             abort_message='RRTM choix incoherent NRADLP doit etre egal a 3 ' &
3695                  // 'pour ok_cdnc'
3696             CALL abort_physic(modname,abort_message,1)
3697             ENDIF
3698#else
3699
3700             abort_message='You should compile with -rrtm if running with '//'iflag_rrtm=1'
3701             CALL abort_physic(modname,abort_message,1)
3702#endif
3703          ENDIF
3704          CALL newmicro (ok_cdnc, bl95_b0, bl95_b1, &
3705               paprs, pplay, t_seri, cldliq, cldfra, &
3706               cldtau, cldemi, cldh, cldl, cldm, cldt, cldq, &
3707               flwp, fiwp, flwc, fiwc, &
3708               mass_solu_aero, mass_solu_aero_pi, &
3709               cldtaupi, re, fl, ref_liq, ref_ice, &
3710               ref_liq_pi, ref_ice_pi)
3711       ELSE
3712          CALL nuage (paprs, pplay, &
3713               t_seri, cldliq, cldfra, cldtau, cldemi, &
3714               cldh, cldl, cldm, cldt, cldq, &
3715               ok_aie, &
3716               mass_solu_aero, mass_solu_aero_pi, &
3717               bl95_b0, bl95_b1, &
3718               cldtaupi, re, fl)
3719       ENDIF
3720       !
3721       !IM betaCRF
3722       !
3723       cldtaurad   = cldtau
3724       cldtaupirad = cldtaupi
3725       cldemirad   = cldemi
3726       cldfrarad   = cldfra
3727
3728       !
3729       IF (lon1_beta.EQ.-180..AND.lon2_beta.EQ.180..AND. &
3730           lat1_beta.EQ.90..AND.lat2_beta.EQ.-90.) THEN
3731          !
3732          ! global
3733          !
3734!IM 251017 begin
3735                print*,'physiq betaCRF global zdtime=',zdtime
3736!IM 251017 end
3737          DO k=1, klev
3738             DO i=1, klon
3739                IF (pplay(i,k).GE.pfree) THEN
3740                   beta(i,k) = beta_pbl
3741                ELSE
3742                   beta(i,k) = beta_free
3743                ENDIF
3744                IF (mskocean_beta) THEN
3745                   beta(i,k) = beta(i,k) * pctsrf(i,is_oce)
3746                ENDIF
3747                cldtaurad(i,k)   = cldtau(i,k) * beta(i,k)
3748                cldtaupirad(i,k) = cldtaupi(i,k) * beta(i,k)
3749                cldemirad(i,k)   = cldemi(i,k) * beta(i,k)
3750                cldfrarad(i,k)   = cldfra(i,k) * beta(i,k)
3751             ENDDO
3752          ENDDO
3753          !
3754       ELSE
3755          !
3756          ! regional
3757          !
3758          DO k=1, klev
3759             DO i=1,klon
3760                !
3761                IF (longitude_deg(i).ge.lon1_beta.AND. &
3762                    longitude_deg(i).le.lon2_beta.AND. &
3763                    latitude_deg(i).le.lat1_beta.AND.  &
3764                    latitude_deg(i).ge.lat2_beta) THEN
3765                   IF (pplay(i,k).GE.pfree) THEN
3766                      beta(i,k) = beta_pbl
3767                   ELSE
3768                      beta(i,k) = beta_free
3769                   ENDIF
3770                   IF (mskocean_beta) THEN
3771                      beta(i,k) = beta(i,k) * pctsrf(i,is_oce)
3772                   ENDIF
3773                   cldtaurad(i,k)   = cldtau(i,k) * beta(i,k)
3774                   cldtaupirad(i,k) = cldtaupi(i,k) * beta(i,k)
3775                   cldemirad(i,k)   = cldemi(i,k) * beta(i,k)
3776                   cldfrarad(i,k)   = cldfra(i,k) * beta(i,k)
3777                ENDIF
3778             !
3779             ENDDO
3780          ENDDO
3781       !
3782       ENDIF
3783
3784       !lecture de la chlorophylle pour le nouvel albedo de Sunghye Baek
3785       IF (ok_chlorophyll) THEN
3786          print*,"-- reading chlorophyll"
3787          CALL readchlorophyll(debut)
3788       ENDIF
3789
3790!--if ok_suntime_rrtm we use ancillay data for RSUN
3791!--previous values are therefore overwritten
3792!--this is needed for CMIP6 runs
3793!--and only possible for new radiation scheme
3794       IF (iflag_rrtm.EQ.1.AND.ok_suntime_rrtm) THEN
3795#ifdef CPP_RRTM
3796         CALL read_rsun_rrtm(debut)
3797#endif
3798       ENDIF
3799
3800       IF (mydebug) THEN
3801          CALL writefield_phy('u_seri',u_seri,nbp_lev)
3802          CALL writefield_phy('v_seri',v_seri,nbp_lev)
3803          CALL writefield_phy('t_seri',t_seri,nbp_lev)
3804          CALL writefield_phy('q_seri',q_seri,nbp_lev)
3805       ENDIF
3806
3807       !
3808       !sonia : If Iflag_radia >=2, pertubation of some variables
3809       !input to radiation (DICE)
3810       !
3811       IF (iflag_radia .ge. 2) THEN
3812          zsav_tsol (:) = zxtsol(:)
3813          CALL perturb_radlwsw(zxtsol,iflag_radia)
3814       ENDIF
3815
3816       IF (aerosol_couple.AND.config_inca=='aero') THEN
3817#ifdef INCA
3818          CALL radlwsw_inca  &
3819               (kdlon,kflev,dist, rmu0, fract, solaire, &
3820               paprs, pplay,zxtsol,albsol1, albsol2, t_seri,q_seri, &
3821               size(wo,3), wo, &
3822               cldfrarad, cldemirad, cldtaurad, &
3823               heat,heat0,cool,cool0,albpla, &
3824               topsw,toplw,solsw,sollw, &
3825               sollwdown, &
3826               topsw0,toplw0,solsw0,sollw0, &
3827               lwdn0, lwdn, lwup0, lwup,  &
3828               swdn0, swdn, swup0, swup, &
3829               ok_ade, ok_aie, &
3830               tau_aero, piz_aero, cg_aero, &
3831               topswad_aero, solswad_aero, &
3832               topswad0_aero, solswad0_aero, &
3833               topsw_aero, topsw0_aero, &
3834               solsw_aero, solsw0_aero, &
3835               cldtaupirad, &
3836               topswai_aero, solswai_aero)
3837#endif
3838       ELSE
3839          !
3840          !IM calcul radiatif pour le cas actuel
3841          !
3842          RCO2 = RCO2_act
3843          RCH4 = RCH4_act
3844          RN2O = RN2O_act
3845          RCFC11 = RCFC11_act
3846          RCFC12 = RCFC12_act
3847          !
3848          IF (prt_level .GE.10) THEN
3849             print *,' ->radlwsw, number 1 '
3850          ENDIF
3851
3852          !
3853          CALL radlwsw &
3854               (dist, rmu0, fract,  &
3855                                !albedo SB >>>
3856                                !      paprs, pplay,zxtsol,albsol1, albsol2,  &
3857               paprs, pplay,zxtsol,SFRWL,albsol_dir, albsol_dif,  &
3858                                !albedo SB <<<
3859               t_seri,q_seri,wo, &
3860               cldfrarad, cldemirad, cldtaurad, &
3861               ok_ade.OR.flag_aerosol_strat.GT.0, ok_aie, flag_aerosol, &
3862               flag_aerosol_strat, &
3863               tau_aero, piz_aero, cg_aero, &
3864               tau_aero_sw_rrtm, piz_aero_sw_rrtm, cg_aero_sw_rrtm, &
3865               ! Rajoute par OB pour RRTM
3866               tau_aero_lw_rrtm, &
3867               cldtaupirad,new_aod, &
3868!              zqsat, flwcrad, fiwcrad, &
3869               zqsat, flwc, fiwc, &
3870               ref_liq, ref_ice, ref_liq_pi, ref_ice_pi, &
3871               heat,heat0,cool,cool0,albpla, &
3872               topsw,toplw,solsw,sollw, &
3873               sollwdown, &
3874               topsw0,toplw0,solsw0,sollw0, &
3875               lwdnc0, lwdn0, lwdn, lwupc0, lwup0, lwup,  &
3876               swdnc0, swdn0, swdn, swupc0, swup0, swup, &
3877               topswad_aero, solswad_aero, &
3878               topswai_aero, solswai_aero, &
3879               topswad0_aero, solswad0_aero, &
3880               topsw_aero, topsw0_aero, &
3881               solsw_aero, solsw0_aero, &
3882               topswcf_aero, solswcf_aero, &
3883                                !-C. Kleinschmitt for LW diagnostics
3884               toplwad_aero, sollwad_aero,&
3885               toplwai_aero, sollwai_aero, &
3886               toplwad0_aero, sollwad0_aero,&
3887                                !-end
3888               ZLWFT0_i, ZFLDN0, ZFLUP0, &
3889               ZSWFT0_i, ZFSDN0, ZFSUP0)
3890
3891          !lwoff=y, betalwoff=1. : offset LW CRE for radiation code and other
3892          !schemes
3893          toplw = toplw + betalwoff * (toplw0 - toplw)
3894          sollw = sollw + betalwoff * (sollw0 - sollw)
3895          lwdn = lwdn + betalwoff * (lwdn0 - lwdn)
3896          lwup = lwup + betalwoff * (lwup0 - lwup)
3897          sollwdown(:)= sollwdown(:) + betalwoff *(-1.*ZFLDN0(:,1) - &
3898                        sollwdown(:))
3899          cool = cool + betalwoff * (cool0 - cool)
3900 
3901#ifndef CPP_XIOS
3902          !--OB 30/05/2016 modified 21/10/2016
3903          !--here we return swaero_diag and dryaod_diag to FALSE
3904          !--and histdef will switch it back to TRUE if necessary
3905          !--this is necessary to get the right swaero at first step
3906          !--but only in the case of no XIOS as XIOS is covered elsewhere
3907          IF (debut) swaerofree_diag = .FALSE.
3908          IF (debut) swaero_diag = .FALSE.
3909          IF (debut) dryaod_diag = .FALSE.
3910          !--IM 15/09/2017 here we return ok_4xCO2atm to FALSE
3911          !--as for swaero_diag, see above
3912          IF (debut) ok_4xCO2atm = .FALSE.
3913
3914          !
3915          !IM 2eme calcul radiatif pour le cas perturbe ou au moins un
3916          !IM des taux doit etre different du taux actuel
3917          !IM Par defaut on a les taux perturbes egaux aux taux actuels
3918          !
3919          IF (RCO2_per.NE.RCO2_act.OR. &
3920              RCH4_per.NE.RCH4_act.OR. &
3921              RN2O_per.NE.RN2O_act.OR. &
3922              RCFC11_per.NE.RCFC11_act.OR. &
3923              RCFC12_per.NE.RCFC12_act) ok_4xCO2atm =.TRUE.
3924#endif
3925   !
3926          IF (ok_4xCO2atm) THEN
3927                !
3928                RCO2 = RCO2_per
3929                RCH4 = RCH4_per
3930                RN2O = RN2O_per
3931                RCFC11 = RCFC11_per
3932                RCFC12 = RCFC12_per
3933                !
3934                IF (prt_level .GE.10) THEN
3935                   print *,' ->radlwsw, number 2 '
3936                ENDIF
3937                !
3938                CALL radlwsw &
3939                     (dist, rmu0, fract,  &
3940                                !albedo SB >>>
3941                                !      paprs, pplay,zxtsol,albsol1, albsol2,  &
3942                     paprs, pplay,zxtsol,SFRWL,albsol_dir, albsol_dif, &
3943                                !albedo SB <<<
3944                     t_seri,q_seri,wo, &
3945                     cldfrarad, cldemirad, cldtaurad, &
3946                     ok_ade.OR.flag_aerosol_strat.GT.0, ok_aie, flag_aerosol, &
3947                     flag_aerosol_strat, &
3948                     tau_aero, piz_aero, cg_aero, &
3949                     tau_aero_sw_rrtm, piz_aero_sw_rrtm, cg_aero_sw_rrtm, &
3950                                ! Rajoute par OB pour RRTM
3951                     tau_aero_lw_rrtm, &
3952                     cldtaupi,new_aod, &
3953!                    zqsat, flwcrad, fiwcrad, &
3954                     zqsat, flwc, fiwc, &
3955                     ref_liq, ref_ice, ref_liq_pi, ref_ice_pi, &
3956                     heatp,heat0p,coolp,cool0p,albplap, &
3957                     topswp,toplwp,solswp,sollwp, &
3958                     sollwdownp, &
3959                     topsw0p,toplw0p,solsw0p,sollw0p, &
3960                     lwdnc0p, lwdn0p, lwdnp, lwupc0p, lwup0p, lwupp,  &
3961                     swdnc0p, swdn0p, swdnp, swupc0p, swup0p, swupp, &
3962                     topswad_aerop, solswad_aerop, &
3963                     topswai_aerop, solswai_aerop, &
3964                     topswad0_aerop, solswad0_aerop, &
3965                     topsw_aerop, topsw0_aerop, &
3966                     solsw_aerop, solsw0_aerop, &
3967                     topswcf_aerop, solswcf_aerop, &
3968                                !-C. Kleinschmitt for LW diagnostics
3969                     toplwad_aerop, sollwad_aerop,&
3970                     toplwai_aerop, sollwai_aerop, &
3971                     toplwad0_aerop, sollwad0_aerop,&
3972                                !-end
3973                     ZLWFT0_i, ZFLDN0, ZFLUP0, &
3974                     ZSWFT0_i, ZFSDN0, ZFSUP0)
3975          endif !ok_4xCO2atm
3976       ENDIF ! aerosol_couple
3977       itaprad = 0
3978       !
3979       !  If Iflag_radia >=2, reset pertubed variables
3980       !
3981       IF (iflag_radia .ge. 2) THEN
3982          zxtsol(:) = zsav_tsol (:)
3983       ENDIF
3984    ENDIF ! MOD(itaprad,radpas)
3985    itaprad = itaprad + 1
3986
3987    IF (iflag_radia.eq.0) THEN
3988       IF (prt_level.ge.9) THEN
3989          PRINT *,'--------------------------------------------------'
3990          PRINT *,'>>>> ATTENTION rayonnement desactive pour ce cas'
3991          PRINT *,'>>>>           heat et cool mis a zero '
3992          PRINT *,'--------------------------------------------------'
3993       ENDIF
3994       heat=0.
3995       cool=0.
3996       sollw=0.   ! MPL 01032011
3997       solsw=0.
3998       radsol=0.
3999       swup=0.    ! MPL 27102011 pour les fichiers AMMA_profiles et AMMA_scalars
4000       swup0=0.
4001       lwup=0.
4002       lwup0=0.
4003       lwdn=0.
4004       lwdn0=0.
4005    ENDIF
4006
4007    !
4008    ! Calculer radsol a l'exterieur de radlwsw
4009    ! pour prendre en compte le cycle diurne
4010    ! recode par Olivier Boucher en sept 2015
4011    !
4012    radsol=solsw*swradcorr+sollw
4013
4014    IF (ok_4xCO2atm) THEN
4015       radsolp=solswp*swradcorr+sollwp
4016    ENDIF
4017
4018    !
4019    ! Ajouter la tendance des rayonnements (tous les pas)
4020    ! avec une correction pour le cycle diurne dans le SW
4021    !
4022
4023    DO k=1, klev
4024       d_t_swr(:,k)=swradcorr(:)*heat(:,k)*dtime/RDAY
4025       d_t_sw0(:,k)=swradcorr(:)*heat0(:,k)*dtime/RDAY
4026       d_t_lwr(:,k)=-cool(:,k)*dtime/RDAY
4027       d_t_lw0(:,k)=-cool0(:,k)*dtime/RDAY
4028    ENDDO
4029
4030    CALL add_phys_tend(du0,dv0,d_t_swr,dq0,dql0,dqi0,paprs,'SW',abortphy,flag_inhib_tend,itap,0)
4031    call prt_enerbil('SW',itap)
4032    CALL add_phys_tend(du0,dv0,d_t_lwr,dq0,dql0,dqi0,paprs,'LW',abortphy,flag_inhib_tend,itap,0)
4033    call prt_enerbil('LW',itap)
4034
4035    !
4036    IF (mydebug) THEN
4037       CALL writefield_phy('u_seri',u_seri,nbp_lev)
4038       CALL writefield_phy('v_seri',v_seri,nbp_lev)
4039       CALL writefield_phy('t_seri',t_seri,nbp_lev)
4040       CALL writefield_phy('q_seri',q_seri,nbp_lev)
4041    ENDIF
4042
4043    ! Calculer l'hydrologie de la surface
4044    !
4045    !      CALL hydrol(dtime,pctsrf,rain_fall, snow_fall, zxevap,
4046    !     .            agesno, ftsol,fqsurf,fsnow, ruis)
4047    !
4048
4049    !
4050    ! Calculer le bilan du sol et la derive de temperature (couplage)
4051    !
4052    DO i = 1, klon
4053       !         bils(i) = radsol(i) - sens(i) - evap(i)*RLVTT
4054       ! a la demande de JLD
4055       bils(i) = radsol(i) - sens(i) + zxfluxlat(i)
4056    ENDDO
4057    !
4058    !moddeblott(jan95)
4059    ! Appeler le programme de parametrisation de l'orographie
4060    ! a l'echelle sous-maille:
4061    !
4062    IF (prt_level .GE.10) THEN
4063       print *,' call orography ? ', ok_orodr
4064    ENDIF
4065    !
4066    IF (ok_orodr) THEN
4067       !
4068       !  selection des points pour lesquels le shema est actif:
4069       igwd=0
4070       DO i=1,klon
4071          itest(i)=0
4072          !        IF ((zstd(i).gt.10.0)) THEN
4073          IF (((zpic(i)-zmea(i)).GT.100.).AND.(zstd(i).GT.10.0)) THEN
4074             itest(i)=1
4075             igwd=igwd+1
4076             idx(igwd)=i
4077          ENDIF
4078       ENDDO
4079       !        igwdim=MAX(1,igwd)
4080       !
4081       IF (ok_strato) THEN
4082
4083          CALL drag_noro_strato(0,klon,klev,dtime,paprs,pplay, &
4084               zmea,zstd, zsig, zgam, zthe,zpic,zval, &
4085               igwd,idx,itest, &
4086               t_seri, u_seri, v_seri, &
4087               zulow, zvlow, zustrdr, zvstrdr, &
4088               d_t_oro, d_u_oro, d_v_oro)
4089
4090       ELSE
4091          CALL drag_noro(klon,klev,dtime,paprs,pplay, &
4092               zmea,zstd, zsig, zgam, zthe,zpic,zval, &
4093               igwd,idx,itest, &
4094               t_seri, u_seri, v_seri, &
4095               zulow, zvlow, zustrdr, zvstrdr, &
4096               d_t_oro, d_u_oro, d_v_oro)
4097       ENDIF
4098       !
4099       !  ajout des tendances
4100       !-----------------------------------------------------------------------
4101       ! ajout des tendances de la trainee de l'orographie
4102       CALL add_phys_tend(d_u_oro,d_v_oro,d_t_oro,dq0,dql0,dqi0,paprs,'oro', &
4103            abortphy,flag_inhib_tend,itap,0)
4104       call prt_enerbil('oro',itap)
4105       !----------------------------------------------------------------------
4106       !
4107    ENDIF ! fin de test sur ok_orodr
4108    !
4109    IF (mydebug) THEN
4110       CALL writefield_phy('u_seri',u_seri,nbp_lev)
4111       CALL writefield_phy('v_seri',v_seri,nbp_lev)
4112       CALL writefield_phy('t_seri',t_seri,nbp_lev)
4113       CALL writefield_phy('q_seri',q_seri,nbp_lev)
4114    ENDIF
4115
4116    IF (ok_orolf) THEN
4117       !
4118       !  selection des points pour lesquels le shema est actif:
4119       igwd=0
4120       DO i=1,klon
4121          itest(i)=0
4122          IF ((zpic(i)-zmea(i)).GT.100.) THEN
4123             itest(i)=1
4124             igwd=igwd+1
4125             idx(igwd)=i
4126          ENDIF
4127       ENDDO
4128       !        igwdim=MAX(1,igwd)
4129       !
4130       IF (ok_strato) THEN
4131
4132          CALL lift_noro_strato(klon,klev,dtime,paprs,pplay, &
4133               latitude_deg,zmea,zstd,zpic,zgam,zthe,zpic,zval, &
4134               igwd,idx,itest, &
4135               t_seri, u_seri, v_seri, &
4136               zulow, zvlow, zustrli, zvstrli, &
4137               d_t_lif, d_u_lif, d_v_lif               )
4138
4139       ELSE
4140          CALL lift_noro(klon,klev,dtime,paprs,pplay, &
4141               latitude_deg,zmea,zstd,zpic, &
4142               itest, &
4143               t_seri, u_seri, v_seri, &
4144               zulow, zvlow, zustrli, zvstrli, &
4145               d_t_lif, d_u_lif, d_v_lif)
4146       ENDIF
4147
4148       ! ajout des tendances de la portance de l'orographie
4149       CALL add_phys_tend(d_u_lif, d_v_lif, d_t_lif, dq0, dql0, dqi0, paprs, &
4150            'lif', abortphy,flag_inhib_tend,itap,0)
4151       call prt_enerbil('lif',itap)
4152    ENDIF ! fin de test sur ok_orolf
4153
4154    IF (ok_hines) then
4155       !  HINES GWD PARAMETRIZATION
4156       east_gwstress=0.
4157       west_gwstress=0.
4158       du_gwd_hines=0.
4159       dv_gwd_hines=0.
4160       CALL hines_gwd(klon, klev, dtime, paprs, pplay, latitude_deg, t_seri, &
4161            u_seri, v_seri, zustr_gwd_hines, zvstr_gwd_hines, d_t_hin, &
4162            du_gwd_hines, dv_gwd_hines)
4163       zustr_gwd_hines=0.
4164       zvstr_gwd_hines=0.
4165       DO k = 1, klev
4166          zustr_gwd_hines(:)=zustr_gwd_hines(:)+ du_gwd_hines(:, k)/dtime &
4167               * (paprs(:, k)-paprs(:, k+1))/rg
4168          zvstr_gwd_hines(:)=zvstr_gwd_hines(:)+ dv_gwd_hines(:, k)/dtime &
4169               * (paprs(:, k)-paprs(:, k+1))/rg
4170       ENDDO
4171
4172       d_t_hin(:, :)=0.
4173       CALL add_phys_tend(du_gwd_hines, dv_gwd_hines, d_t_hin, dq0, dql0, &
4174            dqi0, paprs, 'hin', abortphy,flag_inhib_tend,itap,0)
4175       call prt_enerbil('hin',itap)
4176    ENDIF
4177
4178    IF (.not. ok_hines .and. ok_gwd_rando) then
4179       CALL acama_GWD_rando(DTIME, pplay, latitude_deg, t_seri, u_seri, &
4180            v_seri, rot, zustr_gwd_front, zvstr_gwd_front, du_gwd_front, &
4181            dv_gwd_front, east_gwstress, west_gwstress)
4182       zustr_gwd_front=0.
4183       zvstr_gwd_front=0.
4184       DO k = 1, klev
4185          zustr_gwd_front(:)=zustr_gwd_front(:)+ du_gwd_front(:, k)/dtime &
4186               * (paprs(:, k)-paprs(:, k+1))/rg
4187          zvstr_gwd_front(:)=zvstr_gwd_front(:)+ dv_gwd_front(:, k)/dtime &
4188               * (paprs(:, k)-paprs(:, k+1))/rg
4189       ENDDO
4190
4191       CALL add_phys_tend(du_gwd_front, dv_gwd_front, dt0, dq0, dql0, dqi0, &
4192            paprs, 'front_gwd_rando', abortphy,flag_inhib_tend,itap,0)
4193       call prt_enerbil('front_gwd_rando',itap)
4194    ENDIF
4195
4196    IF (ok_gwd_rando) THEN
4197       CALL FLOTT_GWD_rando(DTIME, pplay, t_seri, u_seri, v_seri, &
4198            rain_fall + snow_fall, zustr_gwd_rando, zvstr_gwd_rando, &
4199            du_gwd_rando, dv_gwd_rando, east_gwstress, west_gwstress)
4200       CALL add_phys_tend(du_gwd_rando, dv_gwd_rando, dt0, dq0, dql0, dqi0, &
4201            paprs, 'flott_gwd_rando', abortphy,flag_inhib_tend,itap,0)
4202       call prt_enerbil('flott_gwd_rando',itap)
4203       zustr_gwd_rando=0.
4204       zvstr_gwd_rando=0.
4205       DO k = 1, klev
4206          zustr_gwd_rando(:)=zustr_gwd_rando(:)+ du_gwd_rando(:, k)/dtime &
4207               * (paprs(:, k)-paprs(:, k+1))/rg
4208          zvstr_gwd_rando(:)=zvstr_gwd_rando(:)+ dv_gwd_rando(:, k)/dtime &
4209               * (paprs(:, k)-paprs(:, k+1))/rg
4210       ENDDO
4211    ENDIF
4212
4213    ! STRESS NECESSAIRES: TOUTE LA PHYSIQUE
4214
4215    IF (mydebug) THEN
4216       CALL writefield_phy('u_seri',u_seri,nbp_lev)
4217       CALL writefield_phy('v_seri',v_seri,nbp_lev)
4218       CALL writefield_phy('t_seri',t_seri,nbp_lev)
4219       CALL writefield_phy('q_seri',q_seri,nbp_lev)
4220    ENDIF
4221
4222    DO i = 1, klon
4223       zustrph(i)=0.
4224       zvstrph(i)=0.
4225    ENDDO
4226    DO k = 1, klev
4227       DO i = 1, klon
4228          zustrph(i)=zustrph(i)+(u_seri(i,k)-u(i,k))/dtime* &
4229               (paprs(i,k)-paprs(i,k+1))/rg
4230          zvstrph(i)=zvstrph(i)+(v_seri(i,k)-v(i,k))/dtime* &
4231               (paprs(i,k)-paprs(i,k+1))/rg
4232       ENDDO
4233    ENDDO
4234    !
4235    !IM calcul composantes axiales du moment angulaire et couple des montagnes
4236    !
4237    IF (is_sequential .and. ok_orodr) THEN
4238       CALL aaam_bud (27,klon,klev,jD_cur-jD_ref,jH_cur, &
4239            ra,rg,romega, &
4240            latitude_deg,longitude_deg,pphis, &
4241            zustrdr,zustrli,zustrph, &
4242            zvstrdr,zvstrli,zvstrph, &
4243            paprs,u,v, &
4244            aam, torsfc)
4245    ENDIF
4246    !IM cf. FLott END
4247    !DC Calcul de la tendance due au methane
4248    IF(ok_qch4) THEN
4249       CALL METHOX(1,klon,klon,klev,q_seri,d_q_ch4,pplay)
4250       ! ajout de la tendance d'humidite due au methane
4251       d_q_ch4_dtime(:,:) = d_q_ch4(:,:)*dtime
4252       CALL add_phys_tend(du0, dv0, dt0, d_q_ch4_dtime, dql0, dqi0, paprs, &
4253            'q_ch4', abortphy,flag_inhib_tend,itap,0)
4254       d_q_ch4(:,:) = d_q_ch4_dtime(:,:)/dtime
4255    ENDIF
4256    !
4257    !
4258
4259!===============================================================
4260!            Additional tendency of TKE due to orography
4261!===============================================================
4262!
4263! Inititialization
4264!------------------
4265
4266   
4267
4268       addtkeoro=0   
4269       CALL getin_p('addtkeoro',addtkeoro)
4270     
4271       IF (prt_level.ge.5) &
4272            print*,'addtkeoro', addtkeoro
4273           
4274       alphatkeoro=1.   
4275       CALL getin_p('alphatkeoro',alphatkeoro)
4276       alphatkeoro=min(max(0.,alphatkeoro),1.)
4277
4278       smallscales_tkeoro=.false.   
4279       CALL getin_p('smallscales_tkeoro',smallscales_tkeoro)
4280
4281
4282        dtadd(:,:)=0.
4283        duadd(:,:)=0.
4284        dvadd(:,:)=0.
4285
4286
4287
4288! Choices for addtkeoro:
4289!      ** 0 no TKE tendency from orography   
4290!      ** 1 we include a fraction alphatkeoro of the whole tendency duoro
4291!      ** 2 we include a fraction alphatkeoro of the gravity wave part of duoro
4292!
4293
4294       IF (addtkeoro .GT. 0 .AND. ok_orodr ) THEN
4295!      -------------------------------------------
4296
4297
4298       !  selection des points pour lesquels le schema est actif:
4299
4300
4301
4302  IF (addtkeoro .EQ. 1 ) THEN
4303
4304            duadd(:,:)=alphatkeoro*d_u_oro(:,:)
4305            dvadd(:,:)=alphatkeoro*d_v_oro(:,:)
4306
4307  ELSE IF (addtkeoro .EQ. 2) THEN
4308
4309
4310
4311       IF (smallscales_tkeoro) THEN
4312       igwd=0
4313       DO i=1,klon
4314          itest(i)=0
4315! Etienne: ici je prends en compte plus de relief que la routine drag_noro_strato
4316! car on peut s'attendre a ce que les petites echelles produisent aussi de la TKE
4317! Mais attention, cela ne va pas dans le sens de la conservation de l'energie!
4318          IF (zstd(i).GT.1.0) THEN
4319             itest(i)=1
4320             igwd=igwd+1
4321             idx(igwd)=i
4322          ENDIF
4323       ENDDO
4324
4325     ELSE
4326
4327       igwd=0
4328       DO i=1,klon
4329          itest(i)=0
4330        IF (((zpic(i)-zmea(i)).GT.100.).AND.(zstd(i).GT.10.0)) THEN
4331             itest(i)=1
4332             igwd=igwd+1
4333             idx(igwd)=i
4334          ENDIF
4335       ENDDO
4336
4337       END IF
4338
4339
4340
4341
4342       CALL drag_noro_strato(addtkeoro,klon,klev,dtime,paprs,pplay, &
4343               zmea,zstd, zsig, zgam, zthe,zpic,zval, &
4344               igwd,idx,itest, &
4345               t_seri, u_seri, v_seri, &
4346               zulow, zvlow, zustrdr, zvstrdr, &
4347               d_t_oro_gw, d_u_oro_gw, d_v_oro_gw)
4348
4349            zustrdr(:)=0.
4350            zvstrdr(:)=0.
4351            zulow(:)=0.
4352            zvlow(:)=0.
4353
4354            duadd(:,:)=alphatkeoro*d_u_oro_gw(:,:)
4355            dvadd(:,:)=alphatkeoro*d_v_oro_gw(:,:)
4356 END IF
4357   
4358
4359
4360   ! TKE update from subgrid temperature and wind tendencies
4361   !----------------------------------------------------------
4362    forall (k=1: nbp_lev) exner(:, k) = (pplay(:, k)/paprs(:,1))**RKAPPA
4363
4364
4365    CALL tend_to_tke(pdtphys,paprs,exner,t_seri,u_seri,v_seri,dtadd,duadd,dvadd,pbl_tke)
4366
4367
4368
4369       ENDIF
4370!      -----
4371!===============================================================
4372
4373
4374
4375    !====================================================================
4376    ! Interface Simulateur COSP (Calipso, ISCCP, MISR, ..)
4377    !====================================================================
4378    ! Abderrahmane 24.08.09
4379
4380    IF (ok_cosp) THEN
4381       ! adeclarer
4382#ifdef CPP_COSP
4383       IF (itap.eq.1.or.MOD(itap,NINT(freq_cosp/dtime)).EQ.0) THEN
4384
4385          IF (prt_level .GE.10) THEN
4386             print*,'freq_cosp',freq_cosp
4387          ENDIF
4388          mr_ozone=wo(:, :, 1) * dobson_u * 1e3 / zmasse
4389          !       print*,'Dans physiq.F avant appel cosp ref_liq,ref_ice=',
4390          !     s        ref_liq,ref_ice
4391          CALL phys_cosp(itap,dtime,freq_cosp, &
4392               ok_mensuelCOSP,ok_journeCOSP,ok_hfCOSP, &
4393               ecrit_mth,ecrit_day,ecrit_hf, ok_all_xml, missing_val, &
4394               klon,klev,longitude_deg,latitude_deg,presnivs,overlap, &
4395               JrNt,ref_liq,ref_ice, &
4396               pctsrf(:,is_ter)+pctsrf(:,is_lic), &
4397               zu10m,zv10m,pphis, &
4398               zphi,paprs(:,1:klev),pplay,zxtsol,t_seri, &
4399               qx(:,:,ivap),zx_rh,cldfra,rnebcon,flwc,fiwc, &
4400               prfl(:,1:klev),psfl(:,1:klev), &
4401               pmflxr(:,1:klev),pmflxs(:,1:klev), &
4402               mr_ozone,cldtau, cldemi)
4403
4404          !     L         calipso2D,calipso3D,cfadlidar,parasolrefl,atb,betamol,
4405          !     L          cfaddbze,clcalipso2,dbze,cltlidarradar,
4406          !     M          clMISR,
4407          !     R          clisccp2,boxtauisccp,boxptopisccp,tclisccp,ctpisccp,
4408          !     I          tauisccp,albisccp,meantbisccp,meantbclrisccp)
4409
4410       ENDIF
4411
4412#endif
4413    ENDIF  !ok_cosp
4414
4415
4416! Marine
4417
4418  IF (ok_airs) then
4419
4420  IF (itap.eq.1.or.MOD(itap,NINT(freq_airs/dtime)).EQ.0) THEN
4421     write(*,*) 'je vais appeler simu_airs, ok_airs, freq_airs=', ok_airs, freq_airs
4422     CALL simu_airs(itap,rneb, t_seri, cldemi, fiwc, ref_ice, pphi, pplay, paprs,&
4423        & map_prop_hc,map_prop_hist,&
4424        & map_emis_hc,map_iwp_hc,map_deltaz_hc,map_pcld_hc,map_tcld_hc,&
4425        & map_emis_Cb,map_pcld_Cb,map_tcld_Cb,&
4426        & map_emis_ThCi,map_pcld_ThCi,map_tcld_ThCi,&
4427        & map_emis_Anv,map_pcld_Anv,map_tcld_Anv,&
4428        & map_emis_hist,map_iwp_hist,map_deltaz_hist,map_rad_hist,&
4429        & map_ntot,map_hc,map_hist,&
4430        & map_Cb,map_ThCi,map_Anv,&
4431        & alt_tropo )
4432  ENDIF
4433
4434  ENDIF  ! ok_airs
4435
4436
4437    ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4438    !AA
4439    !AA Installation de l'interface online-offline pour traceurs
4440    !AA
4441    !====================================================================
4442    !   Calcul  des tendances traceurs
4443    !====================================================================
4444    !
4445
4446    IF (type_trac=='repr') THEN
4447       sh_in(:,:) = q_seri(:,:)
4448    ELSE
4449       sh_in(:,:) = qx(:,:,ivap)
4450       ch_in(:,:) = qx(:,:,iliq)
4451    ENDIF
4452
4453    IF (iflag_phytrac == 1 ) THEN
4454
4455#ifdef CPP_Dust
4456      CALL       phytracr_spl ( debut,lafin , jD_cur,jH_cur,iflag_con,       &  ! I
4457                      pdtphys,ftsol,                                   &  ! I
4458                      t,q_seri,paprs,pplay,RHcl,                  &  ! I
4459                      pmfu, pmfd, pen_u, pde_u, pen_d, pde_d,          &  ! I
4460                      coefh(1:klon,1:klev,is_ave), cdragh, cdragm, u1, v1,                 &  ! I
4461                      u_seri, v_seri, latitude_deg, longitude_deg,  &
4462                      pphis,pctsrf,pmflxr,pmflxs,prfl,psfl,            &  ! I
4463                      da,phi,phi2,d1a,dam,mp,ep,sigd,sij,clw,elij,     &  ! I
4464                      epmlmMm,eplaMm,upwd,dnwd,itop_con,ibas_con,      &  ! I
4465                      ev,wdtrainA,  wdtrainM,wght_cvfd,              &  ! I
4466                      fm_therm, entr_therm, rneb,                      &  ! I
4467                      beta_prec_fisrt,beta_prec, & !I
4468                      zu10m,zv10m,wstar,ale_bl,ale_wake,               &  ! I
4469                      d_tr_dyn,tr_seri)
4470
4471#else
4472
4473    CALL phytrac ( &
4474         itap,     days_elapsed+1,    jH_cur,   debut, &
4475         lafin,    dtime,     u, v,     t, &
4476         paprs,    pplay,     pmfu,     pmfd, &
4477         pen_u,    pde_u,     pen_d,    pde_d, &
4478         cdragh,   coefh(1:klon,1:klev,is_ave),   fm_therm, entr_therm, &
4479         u1,       v1,        ftsol,    pctsrf, &
4480         zustar,   zu10m,     zv10m, &
4481         wstar(:,is_ave),    ale_bl,         ale_wake, &
4482         latitude_deg, longitude_deg, &
4483         frac_impa,frac_nucl, beta_prec_fisrt,beta_prec, &
4484         presnivs, pphis,     pphi,     albsol1, &
4485         sh_in,   ch_in,    rhcl,      cldfra,   rneb, &
4486         diafra,   cldliq,    itop_con, ibas_con, &
4487         pmflxr,   pmflxs,    prfl,     psfl, &
4488         da,       phi,       mp,       upwd, &
4489         phi2,     d1a,       dam,      sij, wght_cvfd, &        !<<RomP+RL
4490         wdtrainA, wdtrainM,  sigd,     clw,elij, &   !<<RomP
4491         ev,       ep,        epmlmMm,  eplaMm, &     !<<RomP
4492         dnwd,     aerosol_couple,      flxmass_w, &
4493         tau_aero, piz_aero,  cg_aero,  ccm, &
4494         rfname, &
4495         d_tr_dyn, &                                 !<<RomP
4496         tr_seri)
4497#endif
4498    ENDIF    ! (iflag_phytrac=1)
4499
4500    IF (offline) THEN
4501
4502       IF (prt_level.ge.9) &
4503            print*,'Attention on met a 0 les thermiques pour phystoke'
4504       CALL phystokenc ( &
4505            nlon,klev,pdtphys,longitude_deg,latitude_deg, &
4506            t,pmfu, pmfd, pen_u, pde_u, pen_d, pde_d, &
4507            fm_therm,entr_therm, &
4508            cdragh,coefh(1:klon,1:klev,is_ave),u1,v1,ftsol,pctsrf, &
4509            frac_impa, frac_nucl, &
4510            pphis,cell_area,dtime,itap, &
4511            qx(:,:,ivap),da,phi,mp,upwd,dnwd)
4512
4513
4514    ENDIF
4515
4516    !
4517    ! Calculer le transport de l'eau et de l'energie (diagnostique)
4518    !
4519    CALL transp (paprs,zxtsol, &
4520         t_seri, q_seri, u_seri, v_seri, zphi, &
4521         ve, vq, ue, uq)
4522    !
4523    !IM global posePB BEG
4524    IF(1.EQ.0) THEN
4525       !
4526       CALL transp_lay (paprs,zxtsol, &
4527            t_seri, q_seri, u_seri, v_seri, zphi, &
4528            ve_lay, vq_lay, ue_lay, uq_lay)
4529       !
4530    ENDIF !(1.EQ.0) THEN
4531    !IM global posePB END
4532    ! Accumuler les variables a stocker dans les fichiers histoire:
4533    !
4534
4535    !================================================================
4536    ! Conversion of kinetic and potential energy into heat, for
4537    ! parameterisation of subgrid-scale motions
4538    !================================================================
4539
4540    d_t_ec(:,:)=0.
4541    forall (k=1: nbp_lev) exner(:, k) = (pplay(:, k)/paprs(:,1))**RKAPPA
4542    CALL ener_conserv(klon,klev,pdtphys,u,v,t,qx(:,:,ivap),qx(:,:,iliq),qx(:,:,isol), &
4543         u_seri,v_seri,t_seri,q_seri,ql_seri,qs_seri,pbl_tke(:,:,is_ave)-tke0(:,:), &
4544         zmasse,exner,d_t_ec)
4545    t_seri(:,:)=t_seri(:,:)+d_t_ec(:,:)
4546
4547    !=======================================================================
4548    !   SORTIES
4549    !=======================================================================
4550    !
4551    !IM initialisation + calculs divers diag AMIP2
4552    !
4553    include "calcul_divers.h"
4554    !
4555    !IM Interpolation sur les niveaux de pression du NMC
4556    !   -------------------------------------------------
4557    !
4558    include "calcul_STDlev.h"
4559    !
4560    ! slp sea level pressure derived from Arpege-IFS : CALL ctstar + CALL pppmer
4561    CALL diag_slp(klon,t_seri,paprs,pplay,pphis,ptstar,pt0,slp)
4562    !
4563    !cc prw  = eau precipitable
4564    !   prlw = colonne eau liquide
4565    !   prlw = colonne eau solide
4566    prw(:) = 0.
4567    prlw(:) = 0.
4568    prsw(:) = 0.
4569    DO k = 1, klev
4570       prw(:)  = prw(:)  + q_seri(:,k)*zmasse(:,k)
4571       prlw(:) = prlw(:) + ql_seri(:,k)*zmasse(:,k)
4572       prsw(:) = prsw(:) + qs_seri(:,k)*zmasse(:,k)
4573    ENDDO
4574    !
4575    IF (type_trac == 'inca') THEN
4576#ifdef INCA
4577       CALL VTe(VTphysiq)
4578       CALL VTb(VTinca)
4579
4580       CALL chemhook_end ( &
4581            dtime, &
4582            pplay, &
4583            t_seri, &
4584            tr_seri, &
4585            nbtr, &
4586            paprs, &
4587            q_seri, &
4588            cell_area, &
4589            pphi, &
4590            pphis, &
4591            zx_rh, &
4592            aps, bps)
4593
4594       CALL VTe(VTinca)
4595       CALL VTb(VTphysiq)
4596#endif
4597    ENDIF
4598
4599
4600    !
4601    ! Convertir les incrementations en tendances
4602    !
4603    IF (prt_level .GE.10) THEN
4604       print *,'Convertir les incrementations en tendances '
4605    ENDIF
4606    !
4607    IF (mydebug) THEN
4608       CALL writefield_phy('u_seri',u_seri,nbp_lev)
4609       CALL writefield_phy('v_seri',v_seri,nbp_lev)
4610       CALL writefield_phy('t_seri',t_seri,nbp_lev)
4611       CALL writefield_phy('q_seri',q_seri,nbp_lev)
4612    ENDIF
4613
4614    DO k = 1, klev
4615       DO i = 1, klon
4616          d_u(i,k) = ( u_seri(i,k) - u(i,k) ) / dtime
4617          d_v(i,k) = ( v_seri(i,k) - v(i,k) ) / dtime
4618          d_t(i,k) = ( t_seri(i,k)-t(i,k) ) / dtime
4619          d_qx(i,k,ivap) = ( q_seri(i,k) - qx(i,k,ivap) ) / dtime
4620          d_qx(i,k,iliq) = ( ql_seri(i,k) - qx(i,k,iliq) ) / dtime
4621          !CR: on ajoute le contenu en glace
4622          IF (nqo.eq.3) THEN
4623             d_qx(i,k,isol) = ( qs_seri(i,k) - qx(i,k,isol) ) / dtime
4624          ENDIF
4625       ENDDO
4626    ENDDO
4627    !
4628    !CR: nb de traceurs eau: nqo
4629    !  IF (nqtot.GE.3) THEN
4630    IF (nqtot.GE.(nqo+1)) THEN
4631       !     DO iq = 3, nqtot
4632       DO iq = nqo+1, nqtot
4633          DO  k = 1, klev
4634             DO  i = 1, klon
4635                ! d_qx(i,k,iq) = ( tr_seri(i,k,iq-2) - qx(i,k,iq) ) / dtime
4636                d_qx(i,k,iq) = ( tr_seri(i,k,iq-nqo) - qx(i,k,iq) ) / dtime
4637             ENDDO
4638          ENDDO
4639       ENDDO
4640    ENDIF
4641    !
4642    !IM rajout diagnostiques bilan KP pour analyse MJO par Jun-Ichi Yano
4643    !IM global posePB      include "write_bilKP_ins.h"
4644    !IM global posePB      include "write_bilKP_ave.h"
4645    !
4646
4647    !--OB mass fixer
4648    !--profile is corrected to force mass conservation of water
4649    IF (mass_fixer) THEN
4650    qql2(:)=0.0
4651    DO k = 1, klev
4652      qql2(:)=qql2(:)+(q_seri(:,k)+ql_seri(:,k)+qs_seri(:,k))*zmasse(:,k)
4653    ENDDO
4654    DO i = 1, klon
4655      !--compute ratio of what q+ql should be with conservation to what it is
4656      corrqql=(qql1(i)+(evap(i)-rain_fall(i)-snow_fall(i))*pdtphys)/qql2(i)
4657      DO k = 1, klev
4658        q_seri(i,k) =q_seri(i,k)*corrqql
4659        ql_seri(i,k)=ql_seri(i,k)*corrqql
4660      ENDDO
4661    ENDDO
4662    ENDIF
4663    !--fin mass fixer
4664
4665    ! Sauvegarder les valeurs de t et q a la fin de la physique:
4666    !
4667    u_ancien(:,:)  = u_seri(:,:)
4668    v_ancien(:,:)  = v_seri(:,:)
4669    t_ancien(:,:)  = t_seri(:,:)
4670    q_ancien(:,:)  = q_seri(:,:)
4671    ql_ancien(:,:) = ql_seri(:,:)
4672    qs_ancien(:,:) = qs_seri(:,:)
4673    CALL water_int(klon,klev,q_ancien,zmasse,prw_ancien)
4674    CALL water_int(klon,klev,ql_ancien,zmasse,prlw_ancien)
4675    CALL water_int(klon,klev,qs_ancien,zmasse,prsw_ancien)
4676    ! !! RomP >>>
4677    !CR: nb de traceurs eau: nqo
4678    IF (nqtot.GT.nqo) THEN
4679       DO iq = nqo+1, nqtot
4680          tr_ancien(:,:,iq-nqo) = tr_seri(:,:,iq-nqo)
4681       ENDDO
4682    ENDIF
4683    ! !! RomP <<<
4684    !==========================================================================
4685    ! Sorties des tendances pour un point particulier
4686    ! a utiliser en 1D, avec igout=1 ou en 3D sur un point particulier
4687    ! pour le debug
4688    ! La valeur de igout est attribuee plus haut dans le programme
4689    !==========================================================================
4690
4691    IF (prt_level.ge.1) THEN
4692       write(lunout,*) 'FIN DE PHYSIQ !!!!!!!!!!!!!!!!!!!!'
4693       write(lunout,*) &
4694            'nlon,klev,nqtot,debut,lafin,jD_cur, jH_cur, pdtphys pct tlos'
4695       write(lunout,*) &
4696            nlon,klev,nqtot,debut,lafin, jD_cur, jH_cur ,pdtphys, &
4697            pctsrf(igout,is_ter), pctsrf(igout,is_lic),pctsrf(igout,is_oce), &
4698            pctsrf(igout,is_sic)
4699       write(lunout,*) 'd_t_dyn,d_t_con,d_t_lsc,d_t_ajsb,d_t_ajs,d_t_eva'
4700       DO k=1,klev
4701          write(lunout,*) d_t_dyn(igout,k),d_t_con(igout,k), &
4702               d_t_lsc(igout,k),d_t_ajsb(igout,k),d_t_ajs(igout,k), &
4703               d_t_eva(igout,k)
4704       ENDDO
4705       write(lunout,*) 'cool,heat'
4706       DO k=1,klev
4707          write(lunout,*) cool(igout,k),heat(igout,k)
4708       ENDDO
4709
4710       !jyg<     (En attendant de statuer sur le sort de d_t_oli)
4711       !jyg!     write(lunout,*) 'd_t_oli,d_t_vdf,d_t_oro,d_t_lif,d_t_ec'
4712       !jyg!     do k=1,klev
4713       !jyg!        write(lunout,*) d_t_oli(igout,k),d_t_vdf(igout,k), &
4714       !jyg!             d_t_oro(igout,k),d_t_lif(igout,k),d_t_ec(igout,k)
4715       !jyg!     enddo
4716       write(lunout,*) 'd_t_vdf,d_t_oro,d_t_lif,d_t_ec'
4717       DO k=1,klev
4718          write(lunout,*) d_t_vdf(igout,k), &
4719               d_t_oro(igout,k),d_t_lif(igout,k),d_t_ec(igout,k)
4720       ENDDO
4721       !>jyg
4722
4723       write(lunout,*) 'd_ps ',d_ps(igout)
4724       write(lunout,*) 'd_u, d_v, d_t, d_qx1, d_qx2 '
4725       DO k=1,klev
4726          write(lunout,*) d_u(igout,k),d_v(igout,k),d_t(igout,k), &
4727               d_qx(igout,k,1),d_qx(igout,k,2)
4728       ENDDO
4729    ENDIF
4730
4731    !============================================================
4732    !   Calcul de la temperature potentielle
4733    !============================================================
4734    DO k = 1, klev
4735       DO i = 1, klon
4736          !JYG/IM theta en debut du pas de temps
4737          !JYG/IM       theta(i,k)=t(i,k)*(100000./pplay(i,k))**(RD/RCPD)
4738          !JYG/IM theta en fin de pas de temps de physique
4739          theta(i,k)=t_seri(i,k)*(100000./pplay(i,k))**(RD/RCPD)
4740          ! thetal: 2 lignes suivantes a decommenter si vous avez les fichiers
4741          !     MPL 20130625
4742          ! fth_fonctions.F90 et parkind1.F90
4743          ! sinon thetal=theta
4744          !       thetal(i,k)=fth_thetal(pplay(i,k),t_seri(i,k),q_seri(i,k),
4745          !    :         ql_seri(i,k))
4746          thetal(i,k)=theta(i,k)
4747       ENDDO
4748    ENDDO
4749    !
4750
4751    ! 22.03.04 BEG
4752    !=============================================================
4753    !   Ecriture des sorties
4754    !=============================================================
4755#ifdef CPP_IOIPSL
4756
4757    ! Recupere des varibles calcule dans differents modules
4758    ! pour ecriture dans histxxx.nc
4759
4760    ! Get some variables from module fonte_neige_mod
4761    CALL fonte_neige_get_vars(pctsrf,  &
4762         zxfqcalving, zxfqfonte, zxffonte, zxrunofflic)
4763
4764
4765    !=============================================================
4766    ! Separation entre thermiques et non thermiques dans les sorties
4767    ! de fisrtilp
4768    !=============================================================
4769
4770    IF (iflag_thermals>=1) THEN
4771       d_t_lscth=0.
4772       d_t_lscst=0.
4773       d_q_lscth=0.
4774       d_q_lscst=0.
4775       DO k=1,klev
4776          DO i=1,klon
4777             IF (ptconvth(i,k)) THEN
4778                d_t_lscth(i,k)=d_t_eva(i,k)+d_t_lsc(i,k)
4779                d_q_lscth(i,k)=d_q_eva(i,k)+d_q_lsc(i,k)
4780             ELSE
4781                d_t_lscst(i,k)=d_t_eva(i,k)+d_t_lsc(i,k)
4782                d_q_lscst(i,k)=d_q_eva(i,k)+d_q_lsc(i,k)
4783             ENDIF
4784          ENDDO
4785       ENDDO
4786
4787       DO i=1,klon
4788          plul_st(i)=prfl(i,lmax_th(i)+1)+psfl(i,lmax_th(i)+1)
4789          plul_th(i)=prfl(i,1)+psfl(i,1)
4790       ENDDO
4791    ENDIF
4792
4793    !On effectue les sorties:
4794
4795#ifdef CPP_Dust
4796  CALL phys_output_write_spl(itap, pdtphys, paprs, pphis,  &
4797       pplay, lmax_th, aerosol_couple,                 &
4798       ok_ade, ok_aie, ivap, new_aod, ok_sync,         &
4799       ptconv, read_climoz, clevSTD,                   &
4800       ptconvth, d_t, qx, d_qx, d_tr_dyn, zmasse,      &
4801       flag_aerosol, flag_aerosol_strat, ok_cdnc)
4802#else
4803    CALL phys_output_write(itap, pdtphys, paprs, pphis,  &
4804         pplay, lmax_th, aerosol_couple,                 &
4805         ok_ade, ok_aie, ivap, iliq, isol, new_aod,      &
4806         ok_sync, ptconv, read_climoz, clevSTD,          &
4807         ptconvth, d_u, d_t, qx, d_qx, zmasse,           &
4808         flag_aerosol, flag_aerosol_strat, ok_cdnc)
4809#endif
4810
4811#ifndef CPP_XIOS
4812    CALL write_paramLMDZ_phy(itap,nid_ctesGCM,ok_sync)
4813#endif
4814
4815#endif
4816
4817
4818    !====================================================================
4819    ! Arret du modele apres hgardfou en cas de detection d'un
4820    ! plantage par hgardfou
4821    !====================================================================
4822
4823    IF (abortphy==1) THEN
4824       abort_message ='Plantage hgardfou'
4825       CALL abort_physic (modname,abort_message,1)
4826    ENDIF
4827
4828    ! 22.03.04 END
4829    !
4830    !====================================================================
4831    ! Si c'est la fin, il faut conserver l'etat de redemarrage
4832    !====================================================================
4833    !
4834
4835    IF (lafin) THEN
4836       itau_phy = itau_phy + itap
4837       CALL phyredem ("restartphy.nc")
4838       !         open(97,form="unformatted",file="finbin")
4839       !         write(97) u_seri,v_seri,t_seri,q_seri
4840       !         close(97)
4841       !$OMP MASTER
4842       IF (read_climoz >= 1) THEN
4843          IF (is_mpi_root) THEN
4844             CALL nf95_close(ncid_climoz)
4845          ENDIF
4846          DEALLOCATE(press_edg_climoz) ! pointer
4847          DEALLOCATE(press_cen_climoz) ! pointer
4848       ENDIF
4849       !$OMP END MASTER
4850       print *,' physiq fin, nombre de steps ou cvpas = 1 : ', Ncvpaseq1
4851    ENDIF
4852
4853    !      first=.false.
4854
4855
4856  END SUBROUTINE physiq
4857
4858END MODULE physiq_mod
Note: See TracBrowser for help on using the repository browser.