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

Last change on this file since 4380 was 4380, checked in by evignon, 18 months ago

premier commit d'un travail en cours sur l'externalisation de la routine lscp pour l'utilisation du replay
+ nettoyage

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