source: LMDZ5/trunk/libf/phylmd/physiq_mod.F90 @ 2529

Last change on this file since 2529 was 2529, checked in by oboucher, 8 years ago

Reviewing the way swaero_diag is computed to correct an old bug that
makes topswad and co diagnostics wrong for the first timestep...
And introducing swaero_diag in rrtm/recmwf_aero so that double and
triple radiation calls when diagnostics are not needed to save time

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