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

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

Various changes to diagnose properly 2D tendency in q, ql, qs from dynamics
as previous diagnostics were incorrect.
Cleaned up all such diagnostics in physiq_mod.F90 as well

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