/[lmdze]/trunk/Sources/phylmd/physiq.f
ViewVC logotype

Diff of /trunk/Sources/phylmd/physiq.f

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

trunk/phylmd/physiq.f revision 99 by guez, Wed Jul 2 18:39:15 2014 UTC trunk/Sources/phylmd/physiq.f revision 191 by guez, Mon May 9 19:56:28 2016 UTC
# Line 4  module physiq_m Line 4  module physiq_m
4    
5  contains  contains
6    
7    SUBROUTINE physiq(lafin, rdayvrai, time, dtphys, paprs, play, pphi, pphis, &    SUBROUTINE physiq(lafin, dayvrai, time, paprs, play, pphi, pphis, u, v, t, &
8         u, v, t, qx, omega, d_u, d_v, d_t, d_qx)         qx, omega, d_u, d_v, d_t, d_qx)
9    
10      ! From phylmd/physiq.F, version 1.22 2006/02/20 09:38:28      ! From phylmd/physiq.F, version 1.22 2006/02/20 09:38:28
11      ! (subversion revision 678)      ! (subversion revision 678)
12    
13      ! Author: Z.X. Li (LMD/CNRS) 1993      ! Author: Z. X. Li (LMD/CNRS) 1993
14    
15      ! This is the main procedure for the "physics" part of the program.      ! This is the main procedure for the "physics" part of the program.
16    
# Line 19  contains Line 19  contains
19      use aeropt_m, only: aeropt      use aeropt_m, only: aeropt
20      use ajsec_m, only: ajsec      use ajsec_m, only: ajsec
21      use calltherm_m, only: calltherm      use calltherm_m, only: calltherm
22      USE clesphys, ONLY: cdhmax, cdmmax, co2_ppm, ecrit_hf, ecrit_ins, &      USE clesphys, ONLY: cdhmax, cdmmax, ecrit_hf, ecrit_ins, ecrit_mth, &
23           ecrit_mth, ecrit_reg, ecrit_tra, ksta, ksta_ter, ok_kzmin           ecrit_reg, ecrit_tra, ksta, ksta_ter, ok_kzmin, ok_instan
24      USE clesphys2, ONLY: cycle_diurne, iflag_con, nbapp_rad, new_oliq, &      USE clesphys2, ONLY: cycle_diurne, conv_emanuel, nbapp_rad, new_oliq, &
25           ok_orodr, ok_orolf, soil_model           ok_orodr, ok_orolf
26      USE clmain_m, ONLY: clmain      USE clmain_m, ONLY: clmain
27      use clouds_gno_m, only: clouds_gno      use clouds_gno_m, only: clouds_gno
28      USE comgeomphy, ONLY: airephy, cuphy, cvphy      use comconst, only: dtphys
29        USE comgeomphy, ONLY: airephy
30      USE concvl_m, ONLY: concvl      USE concvl_m, ONLY: concvl
31      USE conf_gcm_m, ONLY: offline, raz_date      USE conf_gcm_m, ONLY: offline, day_step, iphysiq
32      USE conf_phys_m, ONLY: conf_phys      USE conf_phys_m, ONLY: conf_phys
33      use conflx_m, only: conflx      use conflx_m, only: conflx
34      USE ctherm, ONLY: iflag_thermals, nsplit_thermals      USE ctherm, ONLY: iflag_thermals, nsplit_thermals
# Line 38  contains Line 39  contains
39      USE dimphy, ONLY: klon      USE dimphy, ONLY: klon
40      USE dimsoil, ONLY: nsoilmx      USE dimsoil, ONLY: nsoilmx
41      use drag_noro_m, only: drag_noro      use drag_noro_m, only: drag_noro
42        use dynetat0_m, only: day_ref, annee_ref
43      USE fcttre, ONLY: foeew, qsatl, qsats, thermcep      USE fcttre, ONLY: foeew, qsatl, qsats, thermcep
44      use fisrtilp_m, only: fisrtilp      use fisrtilp_m, only: fisrtilp
45      USE hgardfou_m, ONLY: hgardfou      USE hgardfou_m, ONLY: hgardfou
46        USE histsync_m, ONLY: histsync
47        USE histwrite_phy_m, ONLY: histwrite_phy
48      USE indicesol, ONLY: clnsurf, epsfra, is_lic, is_oce, is_sic, is_ter, &      USE indicesol, ONLY: clnsurf, epsfra, is_lic, is_oce, is_sic, is_ter, &
49           nbsrf           nbsrf
50      USE ini_histins_m, ONLY: ini_histins      USE ini_histins_m, ONLY: ini_histins, nid_ins
51        use netcdf95, only: NF95_CLOSE
52      use newmicro_m, only: newmicro      use newmicro_m, only: newmicro
53        use nr_util, only: assert
54        use nuage_m, only: nuage
55      USE orbite_m, ONLY: orbite      USE orbite_m, ONLY: orbite
56      USE ozonecm_m, ONLY: ozonecm      USE ozonecm_m, ONLY: ozonecm
57      USE phyetat0_m, ONLY: phyetat0, rlat, rlon      USE phyetat0_m, ONLY: phyetat0, rlat, rlon
58      USE phyredem_m, ONLY: phyredem      USE phyredem_m, ONLY: phyredem
59        USE phyredem0_m, ONLY: phyredem0
60      USE phystokenc_m, ONLY: phystokenc      USE phystokenc_m, ONLY: phystokenc
61      USE phytrac_m, ONLY: phytrac      USE phytrac_m, ONLY: phytrac
62      USE qcheck_m, ONLY: qcheck      USE qcheck_m, ONLY: qcheck
63      use radlwsw_m, only: radlwsw      use radlwsw_m, only: radlwsw
64      use readsulfate_m, only: readsulfate      use readsulfate_m, only: readsulfate
65      use sugwd_m, only: sugwd      use readsulfate_preind_m, only: readsulfate_preind
66      USE suphec_m, ONLY: ra, rcpd, retv, rg, rlvtt, romega, rsigma, rtt      use yoegwd, only: sugwd
67      USE temps, ONLY: annee_ref, day_ref, itau_phy      USE suphec_m, ONLY: rcpd, retv, rg, rlvtt, romega, rsigma, rtt
68        use time_phylmdz, only: itap, increment_itap
69        use transp_m, only: transp
70        use transp_lay_m, only: transp_lay
71      use unit_nml_m, only: unit_nml      use unit_nml_m, only: unit_nml
72      USE ymds2ju_m, ONLY: ymds2ju      USE ymds2ju_m, ONLY: ymds2ju
73      USE yoethf_m, ONLY: r2es, rvtmp2      USE yoethf_m, ONLY: r2es, rvtmp2
# Line 64  contains Line 75  contains
75    
76      logical, intent(in):: lafin ! dernier passage      logical, intent(in):: lafin ! dernier passage
77    
78      REAL, intent(in):: rdayvrai      integer, intent(in):: dayvrai
79      ! (elapsed time since January 1st 0h of the starting year, in days)      ! current day number, based at value 1 on January 1st of annee_ref
80    
81      REAL, intent(in):: time ! heure de la journ\'ee en fraction de jour      REAL, intent(in):: time ! heure de la journ\'ee en fraction de jour
     REAL, intent(in):: dtphys ! pas d'integration pour la physique (seconde)  
82    
83      REAL, intent(in):: paprs(:, :) ! (klon, llm + 1)      REAL, intent(in):: paprs(:, :) ! (klon, llm + 1)
84      ! pression pour chaque inter-couche, en Pa      ! pression pour chaque inter-couche, en Pa
# Line 76  contains Line 86  contains
86      REAL, intent(in):: play(:, :) ! (klon, llm)      REAL, intent(in):: play(:, :) ! (klon, llm)
87      ! pression pour le mileu de chaque couche (en Pa)      ! pression pour le mileu de chaque couche (en Pa)
88    
89      REAL, intent(in):: pphi(:, :) ! (klon, llm)      REAL, intent(in):: pphi(:, :) ! (klon, llm)
90      ! géopotentiel de chaque couche (référence sol)      ! géopotentiel de chaque couche (référence sol)
91    
92      REAL, intent(in):: pphis(:) ! (klon) géopotentiel du sol      REAL, intent(in):: pphis(:) ! (klon) géopotentiel du sol
# Line 102  contains Line 112  contains
112    
113      LOGICAL:: firstcal = .true.      LOGICAL:: firstcal = .true.
114    
115      LOGICAL ok_gust ! pour activer l'effet des gust sur flux surface      LOGICAL, PARAMETER:: check = .FALSE.
     PARAMETER (ok_gust = .FALSE.)  
   
     LOGICAL, PARAMETER:: check = .FALSE.  
116      ! Verifier la conservation du modele en eau      ! Verifier la conservation du modele en eau
117    
118      LOGICAL, PARAMETER:: ok_stratus = .FALSE.      LOGICAL, PARAMETER:: ok_stratus = .FALSE.
119      ! Ajouter artificiellement les stratus      ! Ajouter artificiellement les stratus
120    
     ! "slab" ocean  
     REAL, save:: tslab(klon) ! temperature of ocean slab  
     REAL, save:: seaice(klon) ! glace de mer (kg/m2)  
     REAL fluxo(klon) ! flux turbulents ocean-glace de mer  
     REAL fluxg(klon) ! flux turbulents ocean-atmosphere  
   
     logical:: ok_journe = .false., ok_mensuel = .true., ok_instan = .false.  
     ! sorties journalieres, mensuelles et instantanees dans les  
     ! fichiers histday, histmth et histins  
   
     LOGICAL ok_region ! sortir le fichier regional  
     PARAMETER (ok_region = .FALSE.)  
   
121      ! pour phsystoke avec thermiques      ! pour phsystoke avec thermiques
122      REAL fm_therm(klon, llm + 1)      REAL fm_therm(klon, llm + 1)
123      REAL entr_therm(klon, llm)      REAL entr_therm(klon, llm)
# Line 146  contains Line 140  contains
140    
141      REAL lwdn0(klon, llm + 1), lwdn(klon, llm + 1)      REAL lwdn0(klon, llm + 1), lwdn(klon, llm + 1)
142      REAL lwup0(klon, llm + 1), lwup(klon, llm + 1)      REAL lwup0(klon, llm + 1), lwup(klon, llm + 1)
143      SAVE lwdn0, lwdn, lwup0, lwup      SAVE lwdn0, lwdn, lwup0, lwup
   
     ! Amip2  
     ! variables a une pression donnee  
   
     integer nlevSTD  
     PARAMETER(nlevSTD = 17)  
     real rlevSTD(nlevSTD)  
     DATA rlevSTD/100000., 92500., 85000., 70000., &  
          60000., 50000., 40000., 30000., 25000., 20000., &  
          15000., 10000., 7000., 5000., 3000., 2000., 1000./  
     CHARACTER(LEN = 4) clevSTD(nlevSTD)  
     DATA clevSTD/'1000', '925 ', '850 ', '700 ', '600 ', &  
          '500 ', '400 ', '300 ', '250 ', '200 ', '150 ', '100 ', &  
          '70 ', '50 ', '30 ', '20 ', '10 '/  
144    
145      ! prw: precipitable water      ! prw: precipitable water
146      real prw(klon)      real prw(klon)
# Line 170  contains Line 150  contains
150      REAL flwp(klon), fiwp(klon)      REAL flwp(klon), fiwp(klon)
151      REAL flwc(klon, llm), fiwc(klon, llm)      REAL flwc(klon, llm), fiwc(klon, llm)
152    
     INTEGER kmax, lmax  
     PARAMETER(kmax = 8, lmax = 8)  
     INTEGER kmaxm1, lmaxm1  
     PARAMETER(kmaxm1 = kmax-1, lmaxm1 = lmax-1)  
   
     REAL zx_tau(kmaxm1), zx_pc(lmaxm1)  
     DATA zx_tau/0., 0.3, 1.3, 3.6, 9.4, 23., 60./  
     DATA zx_pc/50., 180., 310., 440., 560., 680., 800./  
   
     ! cldtopres pression au sommet des nuages  
     REAL cldtopres(lmaxm1)  
     DATA cldtopres/50., 180., 310., 440., 560., 680., 800./  
   
     ! taulev: numero du niveau de tau dans les sorties ISCCP  
     CHARACTER(LEN = 4) taulev(kmaxm1)  
   
     DATA taulev/'tau0', 'tau1', 'tau2', 'tau3', 'tau4', 'tau5', 'tau6'/  
     CHARACTER(LEN = 3) pclev(lmaxm1)  
     DATA pclev/'pc1', 'pc2', 'pc3', 'pc4', 'pc5', 'pc6', 'pc7'/  
   
     CHARACTER(LEN = 28) cnameisccp(lmaxm1, kmaxm1)  
     DATA cnameisccp/'pc< 50hPa, tau< 0.3', 'pc= 50-180hPa, tau< 0.3', &  
          'pc= 180-310hPa, tau< 0.3', 'pc= 310-440hPa, tau< 0.3', &  
          'pc= 440-560hPa, tau< 0.3', 'pc= 560-680hPa, tau< 0.3', &  
          'pc= 680-800hPa, tau< 0.3', 'pc< 50hPa, tau= 0.3-1.3', &  
          'pc= 50-180hPa, tau= 0.3-1.3', 'pc= 180-310hPa, tau= 0.3-1.3', &  
          'pc= 310-440hPa, tau= 0.3-1.3', 'pc= 440-560hPa, tau= 0.3-1.3', &  
          'pc= 560-680hPa, tau= 0.3-1.3', 'pc= 680-800hPa, tau= 0.3-1.3', &  
          'pc< 50hPa, tau= 1.3-3.6', 'pc= 50-180hPa, tau= 1.3-3.6', &  
          'pc= 180-310hPa, tau= 1.3-3.6', 'pc= 310-440hPa, tau= 1.3-3.6', &  
          'pc= 440-560hPa, tau= 1.3-3.6', 'pc= 560-680hPa, tau= 1.3-3.6', &  
          'pc= 680-800hPa, tau= 1.3-3.6', 'pc< 50hPa, tau= 3.6-9.4', &  
          'pc= 50-180hPa, tau= 3.6-9.4', 'pc= 180-310hPa, tau= 3.6-9.4', &  
          'pc= 310-440hPa, tau= 3.6-9.4', 'pc= 440-560hPa, tau= 3.6-9.4', &  
          'pc= 560-680hPa, tau= 3.6-9.4', 'pc= 680-800hPa, tau= 3.6-9.4', &  
          'pc< 50hPa, tau= 9.4-23', 'pc= 50-180hPa, tau= 9.4-23', &  
          'pc= 180-310hPa, tau= 9.4-23', 'pc= 310-440hPa, tau= 9.4-23', &  
          'pc= 440-560hPa, tau= 9.4-23', 'pc= 560-680hPa, tau= 9.4-23', &  
          'pc= 680-800hPa, tau= 9.4-23', 'pc< 50hPa, tau= 23-60', &  
          'pc= 50-180hPa, tau= 23-60', 'pc= 180-310hPa, tau= 23-60', &  
          'pc= 310-440hPa, tau= 23-60', 'pc= 440-560hPa, tau= 23-60', &  
          'pc= 560-680hPa, tau= 23-60', 'pc= 680-800hPa, tau= 23-60', &  
          'pc< 50hPa, tau> 60.', 'pc= 50-180hPa, tau> 60.', &  
          'pc= 180-310hPa, tau> 60.', 'pc= 310-440hPa, tau> 60.', &  
          'pc= 440-560hPa, tau> 60.', 'pc= 560-680hPa, tau> 60.', &  
          'pc= 680-800hPa, tau> 60.'/  
   
     ! ISCCP simulator v3.4  
   
153      ! Variables propres a la physique      ! Variables propres a la physique
154    
155      INTEGER, save:: radpas      INTEGER, save:: radpas
156      ! (Radiative transfer computations are made every "radpas" call to      ! Radiative transfer computations are made every "radpas" call to
157      ! "physiq".)      ! "physiq".
158    
159      REAL radsol(klon)      REAL radsol(klon)
160      SAVE radsol ! bilan radiatif au sol calcule par code radiatif      SAVE radsol ! bilan radiatif au sol calcule par code radiatif
161    
     INTEGER, SAVE:: itap ! number of calls to "physiq"  
   
162      REAL, save:: ftsol(klon, nbsrf) ! skin temperature of surface fraction      REAL, save:: ftsol(klon, nbsrf) ! skin temperature of surface fraction
163    
164      REAL, save:: ftsoil(klon, nsoilmx, nbsrf)      REAL, save:: ftsoil(klon, nsoilmx, nbsrf)
# Line 242  contains Line 171  contains
171      REAL, save:: fqsurf(klon, nbsrf)      REAL, save:: fqsurf(klon, nbsrf)
172      ! humidite de l'air au contact de la surface      ! humidite de l'air au contact de la surface
173    
174      REAL, save:: qsol(klon) ! hauteur d'eau dans le sol      REAL, save:: qsol(klon)
175        ! column-density of water in soil, in kg m-2
176    
177      REAL, save:: fsnow(klon, nbsrf) ! epaisseur neigeuse      REAL, save:: fsnow(klon, nbsrf) ! epaisseur neigeuse
178      REAL, save:: falbe(klon, nbsrf) ! albedo par type de surface      REAL, save:: falbe(klon, nbsrf) ! albedo visible par type de surface
     REAL, save:: falblw(klon, nbsrf) ! albedo par type de surface  
179    
180      ! Param\`etres de l'orographie \`a l'\'echelle sous-maille (OESM) :      ! Param\`etres de l'orographie \`a l'\'echelle sous-maille (OESM) :
181      REAL, save:: zmea(klon) ! orographie moyenne      REAL, save:: zmea(klon) ! orographie moyenne
# Line 256  contains Line 186  contains
186      REAL, save:: zpic(klon) ! Maximum de l'OESM      REAL, save:: zpic(klon) ! Maximum de l'OESM
187      REAL, save:: zval(klon) ! Minimum de l'OESM      REAL, save:: zval(klon) ! Minimum de l'OESM
188      REAL, save:: rugoro(klon) ! longueur de rugosite de l'OESM      REAL, save:: rugoro(klon) ! longueur de rugosite de l'OESM
   
189      REAL zulow(klon), zvlow(klon)      REAL zulow(klon), zvlow(klon)
190        INTEGER igwd, itest(klon)
191    
192      INTEGER igwd, idx(klon), itest(klon)      REAL, save:: agesno(klon, nbsrf) ! age de la neige
193        REAL, save:: run_off_lic_0(klon)
     REAL agesno(klon, nbsrf)  
     SAVE agesno ! age de la neige  
194    
195      REAL run_off_lic_0(klon)      ! Variables li\'ees \`a la convection d'Emanuel :
196      SAVE run_off_lic_0      REAL, save:: Ma(klon, llm) ! undilute upward mass flux
197      !KE43      REAL, save:: qcondc(klon, llm) ! in-cld water content from convect
     ! Variables liees a la convection de K. Emanuel (sb):  
   
     REAL Ma(klon, llm) ! undilute upward mass flux  
     SAVE Ma  
     REAL qcondc(klon, llm) ! in-cld water content from convect  
     SAVE qcondc  
198      REAL, save:: sig1(klon, llm), w01(klon, llm)      REAL, save:: sig1(klon, llm), w01(klon, llm)
     REAL, save:: wd(klon)  
   
     ! Variables locales pour la couche limite (al1):  
   
     ! Variables locales:  
199    
200        ! Variables pour la couche limite (Alain Lahellec) :
201      REAL cdragh(klon) ! drag coefficient pour T and Q      REAL cdragh(klon) ! drag coefficient pour T and Q
202      REAL cdragm(klon) ! drag coefficient pour vent      REAL cdragm(klon) ! drag coefficient pour vent
203    
# Line 287  contains Line 205  contains
205      REAL ycoefh(klon, llm) ! coef d'echange pour phytrac      REAL ycoefh(klon, llm) ! coef d'echange pour phytrac
206      REAL yu1(klon) ! vents dans la premiere couche U      REAL yu1(klon) ! vents dans la premiere couche U
207      REAL yv1(klon) ! vents dans la premiere couche V      REAL yv1(klon) ! vents dans la premiere couche V
208      REAL ffonte(klon, nbsrf) !Flux thermique utilise pour fondre la neige      REAL ffonte(klon, nbsrf) ! flux thermique utilise pour fondre la neige
209      REAL fqcalving(klon, nbsrf) !Flux d'eau "perdue" par la surface  
210      ! !et necessaire pour limiter la      REAL fqcalving(klon, nbsrf)
211      ! !hauteur de neige, en kg/m2/s      ! flux d'eau "perdue" par la surface et necessaire pour limiter la
212        ! hauteur de neige, en kg/m2/s
213    
214      REAL zxffonte(klon), zxfqcalving(klon)      REAL zxffonte(klon), zxfqcalving(klon)
215    
216      REAL pfrac_impa(klon, llm)! Produits des coefs lessivage impaction      REAL pfrac_impa(klon, llm)! Produits des coefs lessivage impaction
# Line 302  contains Line 222  contains
222      REAL frac_impa(klon, llm) ! fractions d'aerosols lessivees (impaction)      REAL frac_impa(klon, llm) ! fractions d'aerosols lessivees (impaction)
223      REAL frac_nucl(klon, llm) ! idem (nucleation)      REAL frac_nucl(klon, llm) ! idem (nucleation)
224    
225      REAL, save:: rain_fall(klon) ! pluie      REAL, save:: rain_fall(klon)
226      REAL, save:: snow_fall(klon) ! neige      ! liquid water mass flux (kg/m2/s), positive down
227    
228        REAL, save:: snow_fall(klon)
229        ! solid water mass flux (kg/m2/s), positive down
230    
231      REAL rain_tiedtke(klon), snow_tiedtke(klon)      REAL rain_tiedtke(klon), snow_tiedtke(klon)
232    
# Line 312  contains Line 235  contains
235      REAL dlw(klon) ! derivee infra rouge      REAL dlw(klon) ! derivee infra rouge
236      SAVE dlw      SAVE dlw
237      REAL bils(klon) ! bilan de chaleur au sol      REAL bils(klon) ! bilan de chaleur au sol
238      REAL fder(klon) ! Derive de flux (sensible et latente)      REAL, save:: fder(klon) ! Derive de flux (sensible et latente)
     save fder  
239      REAL ve(klon) ! integr. verticale du transport meri. de l'energie      REAL ve(klon) ! integr. verticale du transport meri. de l'energie
240      REAL vq(klon) ! integr. verticale du transport meri. de l'eau      REAL vq(klon) ! integr. verticale du transport meri. de l'eau
241      REAL ue(klon) ! integr. verticale du transport zonal de l'energie      REAL ue(klon) ! integr. verticale du transport zonal de l'energie
# Line 328  contains Line 250  contains
250      INTEGER, SAVE:: lmt_pas ! number of time steps of "physics" per day      INTEGER, SAVE:: lmt_pas ! number of time steps of "physics" per day
251      REAL, save:: pctsrf(klon, nbsrf) ! percentage of surface      REAL, save:: pctsrf(klon, nbsrf) ! percentage of surface
252      REAL pctsrf_new(klon, nbsrf) ! pourcentage surfaces issus d'ORCHIDEE      REAL pctsrf_new(klon, nbsrf) ! pourcentage surfaces issus d'ORCHIDEE
253      REAL, save:: albsol(klon) ! albedo du sol total      REAL, save:: albsol(klon) ! albedo du sol total visible
     REAL, save:: albsollw(klon) ! albedo du sol total  
254      REAL, SAVE:: wo(klon, llm) ! column density of ozone in a cell, in kDU      REAL, SAVE:: wo(klon, llm) ! column density of ozone in a cell, in kDU
255    
     ! Declaration des procedures appelees  
   
     EXTERNAL nuage ! calculer les proprietes radiatives  
     EXTERNAL transp ! transport total de l'eau et de l'energie  
   
     ! Variables locales  
   
256      real, save:: clwcon(klon, llm), rnebcon(klon, llm)      real, save:: clwcon(klon, llm), rnebcon(klon, llm)
257      real, save:: clwcon0(klon, llm), rnebcon0(klon, llm)      real, save:: clwcon0(klon, llm), rnebcon0(klon, llm)
258    
# Line 363  contains Line 277  contains
277      ! Le rayonnement n'est pas calcul\'e tous les pas, il faut donc que      ! Le rayonnement n'est pas calcul\'e tous les pas, il faut donc que
278      ! les variables soient r\'emanentes.      ! les variables soient r\'emanentes.
279      REAL, save:: heat(klon, llm) ! chauffage solaire      REAL, save:: heat(klon, llm) ! chauffage solaire
280      REAL heat0(klon, llm) ! chauffage solaire ciel clair      REAL, save:: heat0(klon, llm) ! chauffage solaire ciel clair
281      REAL, save:: cool(klon, llm) ! refroidissement infrarouge      REAL, save:: cool(klon, llm) ! refroidissement infrarouge
282      REAL cool0(klon, llm) ! refroidissement infrarouge ciel clair      REAL, save:: cool0(klon, llm) ! refroidissement infrarouge ciel clair
283      REAL, save:: topsw(klon), toplw(klon), solsw(klon)      REAL, save:: topsw(klon), toplw(klon), solsw(klon)
284      REAL, save:: sollw(klon) ! rayonnement infrarouge montant \`a la surface      REAL, save:: sollw(klon) ! rayonnement infrarouge montant \`a la surface
285      real, save:: sollwdown(klon) ! downward LW flux at surface      real, save:: sollwdown(klon) ! downward LW flux at surface
286      REAL, save:: topsw0(klon), toplw0(klon), solsw0(klon), sollw0(klon)      REAL, save:: topsw0(klon), toplw0(klon), solsw0(klon), sollw0(klon)
287      REAL albpla(klon)      REAL, save:: albpla(klon)
288      REAL fsollw(klon, nbsrf) ! bilan flux IR pour chaque sous surface      REAL fsollw(klon, nbsrf) ! bilan flux IR pour chaque sous-surface
289      REAL fsolsw(klon, nbsrf) ! flux solaire absorb. pour chaque sous surface      REAL fsolsw(klon, nbsrf) ! flux solaire absorb\'e pour chaque sous-surface
     SAVE albpla  
     SAVE heat0, cool0  
   
     INTEGER itaprad  
     SAVE itaprad  
290    
291      REAL conv_q(klon, llm) ! convergence de l'humidite (kg/kg/s)      REAL conv_q(klon, llm) ! convergence de l'humidite (kg/kg/s)
292      REAL conv_t(klon, llm) ! convergence of temperature (K/s)      REAL conv_t(klon, llm) ! convergence of temperature (K/s)
293    
294      REAL cldl(klon), cldm(klon), cldh(klon) !nuages bas, moyen et haut      REAL cldl(klon), cldm(klon), cldh(klon) ! nuages bas, moyen et haut
295      REAL cldt(klon), cldq(klon) !nuage total, eau liquide integree      REAL cldt(klon), cldq(klon) ! nuage total, eau liquide integree
296    
297      REAL zxtsol(klon), zxqsurf(klon), zxsnow(klon), zxfluxlat(klon)      REAL zxtsol(klon), zxqsurf(klon), zxsnow(klon), zxfluxlat(klon)
298    
299      REAL dist, rmu0(klon), fract(klon)      REAL dist, mu0(klon), fract(klon)
300      real zlongi      real longi
301      REAL z_avant(klon), z_apres(klon), z_factor(klon)      REAL z_avant(klon), z_apres(klon), z_factor(klon)
302      REAL za, zb      REAL za, zb
303      REAL zx_t, zx_qs, zdelta, zcor      REAL zx_t, zx_qs, zcor
304      real zqsat(klon, llm)      real zqsat(klon, llm)
305      INTEGER i, k, iq, nsrf      INTEGER i, k, iq, nsrf
306      REAL, PARAMETER:: t_coup = 234.      REAL, PARAMETER:: t_coup = 234.
307      REAL zphi(klon, llm)      REAL zphi(klon, llm)
308    
309      ! cf. AM Variables locales pour la CLA (hbtm2)      ! cf. Anne Mathieu variables pour la couche limite atmosphérique (hbtm)
310    
311      REAL, SAVE:: pblh(klon, nbsrf) ! Hauteur de couche limite      REAL, SAVE:: pblh(klon, nbsrf) ! Hauteur de couche limite
312      REAL, SAVE:: plcl(klon, nbsrf) ! Niveau de condensation de la CLA      REAL, SAVE:: plcl(klon, nbsrf) ! Niveau de condensation de la CLA
# Line 407  contains Line 316  contains
316      REAL, SAVE:: pblt(klon, nbsrf) ! T a la Hauteur de couche limite      REAL, SAVE:: pblt(klon, nbsrf) ! T a la Hauteur de couche limite
317      REAL, SAVE:: therm(klon, nbsrf)      REAL, SAVE:: therm(klon, nbsrf)
318      REAL, SAVE:: trmb1(klon, nbsrf) ! deep_cape      REAL, SAVE:: trmb1(klon, nbsrf) ! deep_cape
319      REAL, SAVE:: trmb2(klon, nbsrf) ! inhibition      REAL, SAVE:: trmb2(klon, nbsrf) ! inhibition
320      REAL, SAVE:: trmb3(klon, nbsrf) ! Point Omega      REAL, SAVE:: trmb3(klon, nbsrf) ! Point Omega
321      ! Grdeurs de sorties      ! Grandeurs de sorties
322      REAL s_pblh(klon), s_lcl(klon), s_capCL(klon)      REAL s_pblh(klon), s_lcl(klon), s_capCL(klon)
323      REAL s_oliqCL(klon), s_cteiCL(klon), s_pblt(klon)      REAL s_oliqCL(klon), s_cteiCL(klon), s_pblt(klon)
324      REAL s_therm(klon), s_trmb1(klon), s_trmb2(klon)      REAL s_therm(klon), s_trmb1(klon), s_trmb2(klon)
325      REAL s_trmb3(klon)      REAL s_trmb3(klon)
326    
327      ! Variables locales pour la convection de K. Emanuel :      ! Variables pour la convection de K. Emanuel :
328    
329      REAL upwd(klon, llm) ! saturated updraft mass flux      REAL upwd(klon, llm) ! saturated updraft mass flux
330      REAL dnwd(klon, llm) ! saturated downdraft mass flux      REAL dnwd(klon, llm) ! saturated downdraft mass flux
# Line 447  contains Line 356  contains
356      REAL prfl(klon, llm + 1), psfl(klon, llm + 1)      REAL prfl(klon, llm + 1), psfl(klon, llm + 1)
357    
358      INTEGER, save:: ibas_con(klon), itop_con(klon)      INTEGER, save:: ibas_con(klon), itop_con(klon)
359        real ema_pct(klon) ! Emanuel pressure at cloud top, in Pa
360    
361      REAL rain_con(klon), rain_lsc(klon)      REAL rain_con(klon), rain_lsc(klon)
362      REAL snow_con(klon), snow_lsc(klon)      REAL, save:: snow_con(klon) ! neige (mm / s)
363        real snow_lsc(klon)
364      REAL d_ts(klon, nbsrf)      REAL d_ts(klon, nbsrf)
365    
366      REAL d_u_vdf(klon, llm), d_v_vdf(klon, llm)      REAL d_u_vdf(klon, llm), d_v_vdf(klon, llm)
# Line 473  contains Line 384  contains
384      integer:: iflag_cldcon = 1      integer:: iflag_cldcon = 1
385      logical ptconv(klon, llm)      logical ptconv(klon, llm)
386    
387      ! Variables locales pour effectuer les appels en s\'erie :      ! Variables pour effectuer les appels en s\'erie :
388    
389      REAL t_seri(klon, llm), q_seri(klon, llm)      REAL t_seri(klon, llm), q_seri(klon, llm)
390      REAL ql_seri(klon, llm)      REAL ql_seri(klon, llm)
# Line 487  contains Line 398  contains
398      REAL zustrph(klon), zvstrph(klon)      REAL zustrph(klon), zvstrph(klon)
399      REAL aam, torsfc      REAL aam, torsfc
400    
     REAL zx_tmp_fi2d(klon) ! variable temporaire grille physique  
   
     INTEGER, SAVE:: nid_ins  
   
401      REAL ve_lay(klon, llm) ! transport meri. de l'energie a chaque niveau vert.      REAL ve_lay(klon, llm) ! transport meri. de l'energie a chaque niveau vert.
402      REAL vq_lay(klon, llm) ! transport meri. de l'eau a chaque niveau vert.      REAL vq_lay(klon, llm) ! transport meri. de l'eau a chaque niveau vert.
403      REAL ue_lay(klon, llm) ! transport zonal de l'energie a chaque niveau vert.      REAL ue_lay(klon, llm) ! transport zonal de l'energie a chaque niveau vert.
404      REAL uq_lay(klon, llm) ! transport zonal de l'eau a chaque niveau vert.      REAL uq_lay(klon, llm) ! transport zonal de l'eau a chaque niveau vert.
405    
     REAL zsto  
406      real date0      real date0
407    
408      ! Variables li\'ees au bilan d'\'energie et d'enthalpie :      ! Variables li\'ees au bilan d'\'energie et d'enthalpie :
# Line 506  contains Line 412  contains
412      REAL zero_v(klon)      REAL zero_v(klon)
413      CHARACTER(LEN = 20) tit      CHARACTER(LEN = 20) tit
414      INTEGER:: ip_ebil = 0 ! print level for energy conservation diagnostics      INTEGER:: ip_ebil = 0 ! print level for energy conservation diagnostics
415      INTEGER:: if_ebil = 0 ! verbosity for diagnostics of energy conservation      INTEGER:: if_ebil = 0 ! verbosity for diagnostics of energy conservation
416    
417      REAL d_t_ec(klon, llm) ! tendance due \`a la conversion Ec -> E thermique      REAL d_t_ec(klon, llm) ! tendance due \`a la conversion Ec -> E thermique
418      REAL ZRCPD      REAL ZRCPD
# Line 521  contains Line 427  contains
427      REAL sulfate(klon, llm) ! SO4 aerosol concentration (micro g/m3)      REAL sulfate(klon, llm) ! SO4 aerosol concentration (micro g/m3)
428    
429      REAL, save:: sulfate_pi(klon, llm)      REAL, save:: sulfate_pi(klon, llm)
430      ! SO4 aerosol concentration, in micro g/m3, pre-industrial value      ! SO4 aerosol concentration, in \mu g/m3, pre-industrial value
431    
432      REAL cldtaupi(klon, llm)      REAL cldtaupi(klon, llm)
433      ! cloud optical thickness for pre-industrial (pi) aerosols      ! cloud optical thickness for pre-industrial aerosols
434    
435      REAL re(klon, llm) ! Cloud droplet effective radius      REAL re(klon, llm) ! Cloud droplet effective radius
436      REAL fl(klon, llm) ! denominator of re      REAL fl(klon, llm) ! denominator of re
# Line 553  contains Line 459  contains
459      SAVE ffonte      SAVE ffonte
460      SAVE fqcalving      SAVE fqcalving
461      SAVE rain_con      SAVE rain_con
     SAVE snow_con  
462      SAVE topswai      SAVE topswai
463      SAVE topswad      SAVE topswad
464      SAVE solswai      SAVE solswai
# Line 561  contains Line 466  contains
466      SAVE d_u_con      SAVE d_u_con
467      SAVE d_v_con      SAVE d_v_con
468    
469      real zmasse(klon, llm)      real zmasse(klon, llm)
470      ! (column-density of mass of air in a cell, in kg m-2)      ! (column-density of mass of air in a cell, in kg m-2)
471    
472      real, parameter:: dobson_u = 2.1415e-05 ! Dobson unit, in kg m-2      integer, save:: ncid_startphy
473    
474      namelist /physiq_nml/ ok_journe, ok_mensuel, ok_instan, fact_cldcon, &      namelist /physiq_nml/ fact_cldcon, facttemps, ok_newmicro, &
475           facttemps, ok_newmicro, iflag_cldcon, ratqsbas, ratqshaut, if_ebil, &           iflag_cldcon, ratqsbas, ratqshaut, if_ebil, ok_ade, ok_aie, bl95_b0, &
476           ok_ade, ok_aie, bl95_b0, bl95_b1, iflag_thermals, nsplit_thermals           bl95_b1, iflag_thermals, nsplit_thermals
477    
478      !----------------------------------------------------------------      !----------------------------------------------------------------
479    
480      IF (if_ebil >= 1) zero_v = 0.      IF (if_ebil >= 1) zero_v = 0.
481      IF (nqmx < 2) CALL abort_gcm('physiq', &      IF (nqmx < 2) CALL abort_gcm('physiq', &
482           'eaux vapeur et liquide sont indispensables', 1)           'eaux vapeur et liquide sont indispensables')
483    
484      test_firstcal: IF (firstcal) THEN      test_firstcal: IF (firstcal) THEN
485         ! initialiser         ! initialiser
# Line 609  contains Line 514  contains
514         pblt =0. ! T a la Hauteur de couche limite         pblt =0. ! T a la Hauteur de couche limite
515         therm =0.         therm =0.
516         trmb1 =0. ! deep_cape         trmb1 =0. ! deep_cape
517         trmb2 =0. ! inhibition         trmb2 =0. ! inhibition
518         trmb3 =0. ! Point Omega         trmb3 =0. ! Point Omega
519    
520         IF (if_ebil >= 1) d_h_vcol_phy = 0.         IF (if_ebil >= 1) d_h_vcol_phy = 0.
# Line 625  contains Line 530  contains
530         ! Initialiser les compteurs:         ! Initialiser les compteurs:
531    
532         frugs = 0.         frugs = 0.
533         itap = 0         CALL phyetat0(pctsrf, ftsol, ftsoil, fqsurf, qsol, fsnow, falbe, &
534         itaprad = 0              fevap, rain_fall, snow_fall, solsw, sollw, dlw, radsol, frugs, &
535         CALL phyetat0(pctsrf, ftsol, ftsoil, tslab, seaice, fqsurf, qsol, &              agesno, zmea, zstd, zsig, zgam, zthe, zpic, zval, t_ancien, &
536              fsnow, falbe, falblw, fevap, rain_fall, snow_fall, solsw, sollw, &              q_ancien, ancien_ok, rnebcon, ratqs, clwcon, run_off_lic_0, sig1, &
537              dlw, radsol, frugs, agesno, zmea, zstd, zsig, zgam, zthe, zpic, &              w01, ncid_startphy)
             zval, t_ancien, q_ancien, ancien_ok, rnebcon, ratqs, clwcon, &  
             run_off_lic_0, sig1, w01)  
538    
539         ! ATTENTION : il faudra a terme relire q2 dans l'etat initial         ! ATTENTION : il faudra a terme relire q2 dans l'etat initial
540         q2 = 1e-8         q2 = 1e-8
541    
542         radpas = NINT(86400. / dtphys / nbapp_rad)         lmt_pas = day_step / iphysiq
543           print *, 'Number of time steps of "physics" per day: ', lmt_pas
        ! on remet le calendrier a zero  
        IF (raz_date) itau_phy = 0  
544    
545         PRINT *, 'cycle_diurne = ', cycle_diurne         radpas = lmt_pas / nbapp_rad
546         CALL printflag(radpas, ok_journe, ok_instan, ok_region)         print *, "radpas = ", radpas
   
        IF (dtphys * REAL(radpas) > 21600. .AND. cycle_diurne) THEN  
           print *, "Au minimum 4 appels par jour si cycle diurne"  
           call abort_gcm('physiq', &  
                "Nombre d'appels au rayonnement insuffisant", 1)  
        ENDIF  
547    
548         ! Initialisation pour le sch\'ema de convection d'Emanuel :         ! Initialisation pour le sch\'ema de convection d'Emanuel :
549         IF (iflag_con >= 3) THEN         IF (conv_emanuel) THEN
550            ibas_con = 1            ibas_con = 1
551            itop_con = 1            itop_con = 1
552         ENDIF         ENDIF
# Line 663  contains Line 558  contains
558            rugoro = 0.            rugoro = 0.
559         ENDIF         ENDIF
560    
        lmt_pas = NINT(86400. / dtphys) ! tous les jours  
        print *, 'Number of time steps of "physics" per day: ', lmt_pas  
   
561         ecrit_ins = NINT(ecrit_ins/dtphys)         ecrit_ins = NINT(ecrit_ins/dtphys)
562         ecrit_hf = NINT(ecrit_hf/dtphys)         ecrit_hf = NINT(ecrit_hf/dtphys)
563         ecrit_mth = NINT(ecrit_mth/dtphys)         ecrit_mth = NINT(ecrit_mth/dtphys)
# Line 674  contains Line 566  contains
566    
567         ! Initialisation des sorties         ! Initialisation des sorties
568    
569         call ini_histins(dtphys, ok_instan, nid_ins)         call ini_histins(dtphys)
570         CALL ymds2ju(annee_ref, 1, int(day_ref), 0., date0)         CALL ymds2ju(annee_ref, 1, day_ref, 0., date0)
571         ! Positionner date0 pour initialisation de ORCHIDEE         ! Positionner date0 pour initialisation de ORCHIDEE
572         print *, 'physiq date0: ', date0         print *, 'physiq date0: ', date0
573           CALL phyredem0(lmt_pas)
574      ENDIF test_firstcal      ENDIF test_firstcal
575    
576      ! We will modify variables *_seri and we will not touch variables      ! We will modify variables *_seri and we will not touch variables
# Line 687  contains Line 580  contains
580      v_seri = v      v_seri = v
581      q_seri = qx(:, :, ivap)      q_seri = qx(:, :, ivap)
582      ql_seri = qx(:, :, iliq)      ql_seri = qx(:, :, iliq)
583      tr_seri = qx(:, :, 3: nqmx)      tr_seri = qx(:, :, 3:nqmx)
584    
585      ztsol = sum(ftsol * pctsrf, dim = 2)      ztsol = sum(ftsol * pctsrf, dim = 2)
586    
587      IF (if_ebil >= 1) THEN      IF (if_ebil >= 1) THEN
588         tit = 'after dynamics'         tit = 'after dynamics'
589         CALL diagetpq(airephy, tit, ip_ebil, 1, 1, dtphys, t_seri, q_seri, &         CALL diagetpq(airephy, tit, ip_ebil, 1, 1, dtphys, t_seri, q_seri, &
590              ql_seri, u_seri, v_seri, paprs, d_h_vcol, d_qt, d_ec)              ql_seri, u_seri, v_seri, paprs, d_h_vcol, d_qt, d_ec)
591         ! Comme les tendances de la physique sont ajout\'es dans la         ! Comme les tendances de la physique sont ajout\'es dans la
592         !  dynamique, la variation d'enthalpie par la dynamique devrait         ! dynamique, la variation d'enthalpie par la dynamique devrait
593         !  \^etre \'egale \`a la variation de la physique au pas de temps         ! \^etre \'egale \`a la variation de la physique au pas de temps
594         !  pr\'ec\'edent.  Donc la somme de ces 2 variations devrait \^etre         ! pr\'ec\'edent. Donc la somme de ces 2 variations devrait \^etre
595         !  nulle.         ! nulle.
596         call diagphy(airephy, tit, ip_ebil, zero_v, zero_v, zero_v, zero_v, &         call diagphy(airephy, tit, ip_ebil, zero_v, zero_v, zero_v, zero_v, &
597              zero_v, zero_v, zero_v, zero_v, ztsol, d_h_vcol + d_h_vcol_phy, &              zero_v, zero_v, zero_v, zero_v, ztsol, d_h_vcol + d_h_vcol_phy, &
598              d_qt, 0.)              d_qt, 0.)
# Line 733  contains Line 626  contains
626      ! Check temperatures:      ! Check temperatures:
627      CALL hgardfou(t_seri, ftsol)      CALL hgardfou(t_seri, ftsol)
628    
629      ! Incrémenter le compteur de la physique      call increment_itap
630      itap = itap + 1      julien = MOD(dayvrai, 360)
     julien = MOD(NINT(rdayvrai), 360)  
631      if (julien == 0) julien = 360      if (julien == 0) julien = 360
632    
633      forall (k = 1: llm) zmasse(:, k) = (paprs(:, k)-paprs(:, k + 1)) / rg      forall (k = 1: llm) zmasse(:, k) = (paprs(:, k) - paprs(:, k + 1)) / rg
634    
635      ! Prescrire l'ozone :      ! Prescrire l'ozone :
636      wo = ozonecm(REAL(julien), paprs)      wo = ozonecm(REAL(julien), paprs)
# Line 754  contains Line 646  contains
646      ENDDO      ENDDO
647      ql_seri = 0.      ql_seri = 0.
648    
649      IF (if_ebil >= 2) THEN      IF (if_ebil >= 2) THEN
650         tit = 'after reevap'         tit = 'after reevap'
651         CALL diagetpq(airephy, tit, ip_ebil, 2, 1, dtphys, t_seri, q_seri, &         CALL diagetpq(airephy, tit, ip_ebil, 2, 1, dtphys, t_seri, q_seri, &
652              ql_seri, u_seri, v_seri, paprs, d_h_vcol, d_qt, d_ec)              ql_seri, u_seri, v_seri, paprs, d_h_vcol, d_qt, d_ec)
# Line 765  contains Line 657  contains
657      frugs = MAX(frugs, 0.000015)      frugs = MAX(frugs, 0.000015)
658      zxrugs = sum(frugs * pctsrf, dim = 2)      zxrugs = sum(frugs * pctsrf, dim = 2)
659    
660      ! Calculs nécessaires au calcul de l'albedo dans l'interface      ! Calculs n\'ecessaires au calcul de l'albedo dans l'interface avec
661        ! la surface.
662    
663      CALL orbite(REAL(julien), zlongi, dist)      CALL orbite(REAL(julien), longi, dist)
664      IF (cycle_diurne) THEN      IF (cycle_diurne) THEN
665         CALL zenang(zlongi, time, dtphys * REAL(radpas), rmu0, fract)         CALL zenang(longi, time, dtphys * radpas, mu0, fract)
666      ELSE      ELSE
667         rmu0 = -999.999         mu0 = - 999.999
668      ENDIF      ENDIF
669    
670      ! Calcul de l'abedo moyen par maille      ! Calcul de l'abedo moyen par maille
671      albsol = sum(falbe * pctsrf, dim = 2)      albsol = sum(falbe * pctsrf, dim = 2)
     albsollw = sum(falblw * pctsrf, dim = 2)  
672    
673      ! R\'epartition sous maille des flux longwave et shortwave      ! R\'epartition sous maille des flux longwave et shortwave
674      ! R\'epartition du longwave par sous-surface lin\'earis\'ee      ! R\'epartition du longwave par sous-surface lin\'earis\'ee
# Line 791  contains Line 683  contains
683    
684      ! Couche limite:      ! Couche limite:
685    
686      CALL clmain(dtphys, itap, pctsrf, pctsrf_new, t_seri, q_seri, u_seri, &      CALL clmain(dtphys, pctsrf, pctsrf_new, t_seri, q_seri, u_seri, v_seri, &
687           v_seri, julien, rmu0, co2_ppm, ftsol, soil_model, &           julien, mu0, ftsol, cdmmax, cdhmax, ksta, ksta_ter, ok_kzmin, &
688           cdmmax, cdhmax, ksta, ksta_ter, ok_kzmin, ftsoil, qsol, paprs, play, &           ftsoil, qsol, paprs, play, fsnow, fqsurf, fevap, falbe, fluxlat, &
689           fsnow, fqsurf, fevap, falbe, falblw, fluxlat, rain_fall, snow_fall, &           rain_fall, snow_fall, fsolsw, fsollw, fder, rlat, frugs, firstcal, &
690           fsolsw, fsollw, fder, rlat, frugs, firstcal, agesno, rugoro, &           agesno, rugoro, d_t_vdf, d_q_vdf, d_u_vdf, d_v_vdf, d_ts, fluxt, &
691           d_t_vdf, d_q_vdf, d_u_vdf, d_v_vdf, d_ts, fluxt, fluxq, fluxu, &           fluxq, fluxu, fluxv, cdragh, cdragm, q2, dsens, devap, ycoefh, yu1, &
692           fluxv, cdragh, cdragm, q2, dsens, devap, ycoefh, yu1, yv1, t2m, q2m, &           yv1, t2m, q2m, u10m, v10m, pblh, capCL, oliqCL, cteiCL, pblT, therm, &
693           u10m, v10m, pblh, capCL, oliqCL, cteiCL, pblT, therm, trmb1, trmb2, &           trmb1, trmb2, trmb3, plcl, fqcalving, ffonte, run_off_lic_0)
          trmb3, plcl, fqcalving, ffonte, run_off_lic_0, fluxo, fluxg, tslab, &  
          seaice)  
694    
695      ! Incr\'ementation des flux      ! Incr\'ementation des flux
696    
# Line 833  contains Line 723  contains
723         ENDDO         ENDDO
724      ENDDO      ENDDO
725    
726      IF (if_ebil >= 2) THEN      IF (if_ebil >= 2) THEN
727         tit = 'after clmain'         tit = 'after clmain'
728         CALL diagetpq(airephy, tit, ip_ebil, 2, 2, dtphys, t_seri, q_seri, &         CALL diagetpq(airephy, tit, ip_ebil, 2, 2, dtphys, t_seri, q_seri, &
729              ql_seri, u_seri, v_seri, paprs, d_h_vcol, d_qt, d_ec)              ql_seri, u_seri, v_seri, paprs, d_h_vcol, d_qt, d_ec)
# Line 854  contains Line 744  contains
744         zxffonte(i) = 0.         zxffonte(i) = 0.
745         zxfqcalving(i) = 0.         zxfqcalving(i) = 0.
746    
747         s_pblh(i) = 0.         s_pblh(i) = 0.
748         s_lcl(i) = 0.         s_lcl(i) = 0.
749         s_capCL(i) = 0.         s_capCL(i) = 0.
750         s_oliqCL(i) = 0.         s_oliqCL(i) = 0.
751         s_cteiCL(i) = 0.         s_cteiCL(i) = 0.
# Line 864  contains Line 754  contains
754         s_trmb1(i) = 0.         s_trmb1(i) = 0.
755         s_trmb2(i) = 0.         s_trmb2(i) = 0.
756         s_trmb3(i) = 0.         s_trmb3(i) = 0.
   
        IF (abs(pctsrf(i, is_ter) + pctsrf(i, is_lic) + pctsrf(i, is_oce) &  
             + pctsrf(i, is_sic) - 1.)  >  EPSFRA) print *, &  
             'physiq : probl\`eme sous surface au point ', i, &  
             pctsrf(i, 1 : nbsrf)  
757      ENDDO      ENDDO
758    
759        call assert(abs(sum(pctsrf, dim = 2) - 1.) <= EPSFRA, 'physiq: pctsrf')
760    
761      DO nsrf = 1, nbsrf      DO nsrf = 1, nbsrf
762         DO i = 1, klon         DO i = 1, klon
763            ftsol(i, nsrf) = ftsol(i, nsrf) + d_ts(i, nsrf)            ftsol(i, nsrf) = ftsol(i, nsrf) + d_ts(i, nsrf)
# Line 924  contains Line 812  contains
812      ! Calculer la dérive du flux infrarouge      ! Calculer la dérive du flux infrarouge
813    
814      DO i = 1, klon      DO i = 1, klon
815         dlw(i) = - 4. * RSIGMA * zxtsol(i)**3         dlw(i) = - 4. * RSIGMA * zxtsol(i)**3
     ENDDO  
   
     ! Appeler la convection (au choix)  
   
     DO k = 1, llm  
        DO i = 1, klon  
           conv_q(i, k) = d_q_dyn(i, k) + d_q_vdf(i, k) / dtphys  
           conv_t(i, k) = d_t_dyn(i, k) + d_t_vdf(i, k) / dtphys  
        ENDDO  
816      ENDDO      ENDDO
817    
818      IF (check) print *, "avantcon = ", qcheck(paprs, q_seri, ql_seri)      IF (check) print *, "avantcon = ", qcheck(paprs, q_seri, ql_seri)
819    
820      if (iflag_con == 2) then      ! Appeler la convection
        z_avant = sum((q_seri + ql_seri) * zmasse, dim=2)  
        CALL conflx(dtphys, paprs, play, t_seri(:, llm:1:-1), &  
             q_seri(:, llm:1:-1), conv_t, conv_q, zxfluxq(:, 1), omega, &  
             d_t_con, d_q_con, rain_con, snow_con, mfu(:, llm:1:-1), &  
             mfd(:, llm:1:-1), pen_u, pde_u, pen_d, pde_d, kcbot, kctop, &  
             kdtop, pmflxr, pmflxs)  
        WHERE (rain_con < 0.) rain_con = 0.  
        WHERE (snow_con < 0.) snow_con = 0.  
        ibas_con = llm + 1 - kcbot  
        itop_con = llm + 1 - kctop  
     else  
        ! iflag_con >= 3  
821    
822        if (conv_emanuel) then
823         da = 0.         da = 0.
824         mp = 0.         mp = 0.
825         phi = 0.         phi = 0.
826         CALL concvl(dtphys, paprs, play, t_seri, q_seri, u_seri, v_seri, sig1, &         CALL concvl(dtphys, paprs, play, t_seri, q_seri, u_seri, v_seri, sig1, &
827              w01, d_t_con, d_q_con, d_u_con, d_v_con, rain_con, snow_con, &              w01, d_t_con, d_q_con, d_u_con, d_v_con, rain_con, ibas_con, &
828              ibas_con, itop_con, upwd, dnwd, dnwd0, Ma, cape, iflagctrl, &              itop_con, upwd, dnwd, dnwd0, Ma, cape, iflagctrl, qcondc, pmflxr, &
829              qcondc, wd, pmflxr, pmflxs, da, phi, mp)              da, phi, mp)
830           snow_con = 0.
831         clwcon0 = qcondc         clwcon0 = qcondc
832         mfu = upwd + dnwd         mfu = upwd + dnwd
        IF (.NOT. ok_gust) wd = 0.  
   
        ! Calcul des propri\'et\'es des nuages convectifs  
833    
834         DO k = 1, llm         IF (thermcep) THEN
835            DO i = 1, klon            zqsat = MIN(0.5, r2es * FOEEW(t_seri, rtt >= t_seri) / play)
836               IF (thermcep) THEN            zqsat = zqsat / (1. - retv * zqsat)
837                  zdelta = MAX(0., SIGN(1., rtt - t_seri(i, k)))         ELSE
838                  zqsat(i, k) = r2es * FOEEW(t_seri(i, k), zdelta) / play(i, k)            zqsat = merge(qsats(t_seri), qsatl(t_seri), t_seri < t_coup) / play
839                  zqsat(i, k) = MIN(0.5, zqsat(i, k))         ENDIF
                 zqsat(i, k) = zqsat(i, k) / (1.-retv*zqsat(i, k))  
              ELSE  
                 IF (t_seri(i, k) < t_coup) THEN  
                    zqsat(i, k) = qsats(t_seri(i, k))/play(i, k)  
                 ELSE  
                    zqsat(i, k) = qsatl(t_seri(i, k))/play(i, k)  
                 ENDIF  
              ENDIF  
           ENDDO  
        ENDDO  
840    
841         ! calcul des proprietes des nuages convectifs         ! Properties of convective clouds
842         clwcon0 = fact_cldcon * clwcon0         clwcon0 = fact_cldcon * clwcon0
843         call clouds_gno(klon, llm, q_seri, zqsat, clwcon0, ptconv, ratqsc, &         call clouds_gno(klon, llm, q_seri, zqsat, clwcon0, ptconv, ratqsc, &
844              rnebcon0)              rnebcon0)
845    
846           forall (i = 1:klon) ema_pct(i) = paprs(i, itop_con(i) + 1)
847         mfd = 0.         mfd = 0.
848         pen_u = 0.         pen_u = 0.
849         pen_d = 0.         pen_d = 0.
850         pde_d = 0.         pde_d = 0.
851         pde_u = 0.         pde_u = 0.
852        else
853           conv_q = d_q_dyn + d_q_vdf / dtphys
854           conv_t = d_t_dyn + d_t_vdf / dtphys
855           z_avant = sum((q_seri + ql_seri) * zmasse, dim=2)
856           CALL conflx(dtphys, paprs, play, t_seri(:, llm:1:- 1), &
857                q_seri(:, llm:1:- 1), conv_t, conv_q, zxfluxq(:, 1), omega, &
858                d_t_con, d_q_con, rain_con, snow_con, mfu(:, llm:1:- 1), &
859                mfd(:, llm:1:- 1), pen_u, pde_u, pen_d, pde_d, kcbot, kctop, &
860                kdtop, pmflxr, pmflxs)
861           WHERE (rain_con < 0.) rain_con = 0.
862           WHERE (snow_con < 0.) snow_con = 0.
863           ibas_con = llm + 1 - kcbot
864           itop_con = llm + 1 - kctop
865      END if      END if
866    
867      DO k = 1, llm      DO k = 1, llm
# Line 1003  contains Line 873  contains
873         ENDDO         ENDDO
874      ENDDO      ENDDO
875    
876      IF (if_ebil >= 2) THEN      IF (if_ebil >= 2) THEN
877         tit = 'after convect'         tit = 'after convect'
878         CALL diagetpq(airephy, tit, ip_ebil, 2, 2, dtphys, t_seri, q_seri, &         CALL diagetpq(airephy, tit, ip_ebil, 2, 2, dtphys, t_seri, q_seri, &
879              ql_seri, u_seri, v_seri, paprs, d_h_vcol, d_qt, d_ec)              ql_seri, u_seri, v_seri, paprs, d_h_vcol, d_qt, d_ec)
# Line 1025  contains Line 895  contains
895         print *, "Precip = ", zx_t         print *, "Precip = ", zx_t
896      ENDIF      ENDIF
897    
898      IF (iflag_con == 2) THEN      IF (.not. conv_emanuel) THEN
899         z_apres = sum((q_seri + ql_seri) * zmasse, dim=2)         z_apres = sum((q_seri + ql_seri) * zmasse, dim=2)
900         z_factor = (z_avant - (rain_con + snow_con) * dtphys) / z_apres         z_factor = (z_avant - (rain_con + snow_con) * dtphys) / z_apres
901         DO k = 1, llm         DO k = 1, llm
# Line 1057  contains Line 927  contains
927              q_seri, d_u_ajs, d_v_ajs, d_t_ajs, d_q_ajs, fm_therm, entr_therm)              q_seri, d_u_ajs, d_v_ajs, d_t_ajs, d_q_ajs, fm_therm, entr_therm)
928      endif      endif
929    
930      IF (if_ebil >= 2) THEN      IF (if_ebil >= 2) THEN
931         tit = 'after dry_adjust'         tit = 'after dry_adjust'
932         CALL diagetpq(airephy, tit, ip_ebil, 2, 2, dtphys, t_seri, q_seri, &         CALL diagetpq(airephy, tit, ip_ebil, 2, 2, dtphys, t_seri, q_seri, &
933              ql_seri, u_seri, v_seri, paprs, d_h_vcol, d_qt, d_ec)              ql_seri, u_seri, v_seri, paprs, d_h_vcol, d_qt, d_ec)
# Line 1084  contains Line 954  contains
954      do k = 1, llm      do k = 1, llm
955         do i = 1, klon         do i = 1, klon
956            ratqss(i, k) = ratqsbas + (ratqshaut - ratqsbas) &            ratqss(i, k) = ratqsbas + (ratqshaut - ratqsbas) &
957                 * min((paprs(i, 1) - play(i, k)) / (paprs(i, 1) - 3e4), 1.)                 * min((paprs(i, 1) - play(i, k)) / (paprs(i, 1) - 3e4), 1.)
958         enddo         enddo
959      enddo      enddo
960    
# Line 1131  contains Line 1001  contains
1001         print *, "Precip = ", zx_t         print *, "Precip = ", zx_t
1002      ENDIF      ENDIF
1003    
1004      IF (if_ebil >= 2) THEN      IF (if_ebil >= 2) THEN
1005         tit = 'after fisrt'         tit = 'after fisrt'
1006         CALL diagetpq(airephy, tit, ip_ebil, 2, 2, dtphys, t_seri, q_seri, &         CALL diagetpq(airephy, tit, ip_ebil, 2, 2, dtphys, t_seri, q_seri, &
1007              ql_seri, u_seri, v_seri, paprs, d_h_vcol, d_qt, d_ec)              ql_seri, u_seri, v_seri, paprs, d_h_vcol, d_qt, d_ec)
# Line 1143  contains Line 1013  contains
1013    
1014      ! 1. NUAGES CONVECTIFS      ! 1. NUAGES CONVECTIFS
1015    
1016      IF (iflag_cldcon <= -1) THEN      IF (iflag_cldcon <= - 1) THEN
1017         ! seulement pour Tiedtke         ! seulement pour Tiedtke
1018         snow_tiedtke = 0.         snow_tiedtke = 0.
1019         if (iflag_cldcon == -1) then         if (iflag_cldcon == - 1) then
1020            rain_tiedtke = rain_con            rain_tiedtke = rain_con
1021         else         else
1022            rain_tiedtke = 0.            rain_tiedtke = 0.
1023            do k = 1, llm            do k = 1, llm
1024               do i = 1, klon               do i = 1, klon
1025                  if (d_q_con(i, k) < 0.) then                  if (d_q_con(i, k) < 0.) then
1026                     rain_tiedtke(i) = rain_tiedtke(i)-d_q_con(i, k)/dtphys &                     rain_tiedtke(i) = rain_tiedtke(i) - d_q_con(i, k)/dtphys &
1027                          *zmasse(i, k)                          *zmasse(i, k)
1028                  endif                  endif
1029               enddo               enddo
# Line 1221  contains Line 1091  contains
1091         DO i = 1, klon         DO i = 1, klon
1092            zx_t = t_seri(i, k)            zx_t = t_seri(i, k)
1093            IF (thermcep) THEN            IF (thermcep) THEN
1094               zdelta = MAX(0., SIGN(1., rtt-zx_t))               zx_qs = r2es * FOEEW(zx_t, rtt >= zx_t)/play(i, k)
              zx_qs = r2es * FOEEW(zx_t, zdelta)/play(i, k)  
1095               zx_qs = MIN(0.5, zx_qs)               zx_qs = MIN(0.5, zx_qs)
1096               zcor = 1./(1.-retv*zx_qs)               zcor = 1./(1. - retv*zx_qs)
1097               zx_qs = zx_qs*zcor               zx_qs = zx_qs*zcor
1098            ELSE            ELSE
1099               IF (zx_t < t_coup) THEN               IF (zx_t < t_coup) THEN
# Line 1241  contains Line 1110  contains
1110      ! Introduce the aerosol direct and first indirect radiative forcings:      ! Introduce the aerosol direct and first indirect radiative forcings:
1111      IF (ok_ade .OR. ok_aie) THEN      IF (ok_ade .OR. ok_aie) THEN
1112         ! Get sulfate aerosol distribution :         ! Get sulfate aerosol distribution :
1113         CALL readsulfate(rdayvrai, firstcal, sulfate)         CALL readsulfate(dayvrai, time, firstcal, sulfate)
1114         CALL readsulfate_preind(rdayvrai, firstcal, sulfate_pi)         CALL readsulfate_preind(dayvrai, time, firstcal, sulfate_pi)
1115    
1116         CALL aeropt(play, paprs, t_seri, sulfate, rhcl, tau_ae, piz_ae, cg_ae, &         CALL aeropt(play, paprs, t_seri, sulfate, rhcl, tau_ae, piz_ae, cg_ae, &
1117              aerindex)              aerindex)
# Line 1264  contains Line 1133  contains
1133              bl95_b1, cldtaupi, re, fl)              bl95_b1, cldtaupi, re, fl)
1134      endif      endif
1135    
1136      ! Appeler le rayonnement mais calculer tout d'abord l'albedo du sol.      IF (MOD(itap - 1, radpas) == 0) THEN
1137      IF (MOD(itaprad, radpas) == 0) THEN         ! Appeler le rayonnement mais calculer tout d'abord l'albedo du sol.
1138         DO i = 1, klon         ! Calcul de l'abedo moyen par maille
1139            albsol(i) = falbe(i, is_oce) * pctsrf(i, is_oce) &         albsol = sum(falbe * pctsrf, dim = 2)
1140                 + falbe(i, is_lic) * pctsrf(i, is_lic) &  
                + falbe(i, is_ter) * pctsrf(i, is_ter) &  
                + falbe(i, is_sic) * pctsrf(i, is_sic)  
           albsollw(i) = falblw(i, is_oce) * pctsrf(i, is_oce) &  
                + falblw(i, is_lic) * pctsrf(i, is_lic) &  
                + falblw(i, is_ter) * pctsrf(i, is_ter) &  
                + falblw(i, is_sic) * pctsrf(i, is_sic)  
        ENDDO  
1141         ! Rayonnement (compatible Arpege-IFS) :         ! Rayonnement (compatible Arpege-IFS) :
1142         CALL radlwsw(dist, rmu0, fract, paprs, play, zxtsol, albsol, &         CALL radlwsw(dist, mu0, fract, paprs, play, zxtsol, albsol, t_seri, &
1143              albsollw, t_seri, q_seri, wo, cldfra, cldemi, cldtau, heat, &              q_seri, wo, cldfra, cldemi, cldtau, heat, heat0, cool, cool0, &
1144              heat0, cool, cool0, radsol, albpla, topsw, toplw, solsw, sollw, &              radsol, albpla, topsw, toplw, solsw, sollw, sollwdown, topsw0, &
1145              sollwdown, topsw0, toplw0, solsw0, sollw0, lwdn0, lwdn, lwup0, &              toplw0, solsw0, sollw0, lwdn0, lwdn, lwup0, lwup, swdn0, swdn, &
1146              lwup, swdn0, swdn, swup0, swup, ok_ade, ok_aie, tau_ae, piz_ae, &              swup0, swup, ok_ade, ok_aie, tau_ae, piz_ae, cg_ae, topswad, &
1147              cg_ae, topswad, solswad, cldtaupi, topswai, solswai)              solswad, cldtaupi, topswai, solswai)
        itaprad = 0  
1148      ENDIF      ENDIF
     itaprad = itaprad + 1  
1149    
1150      ! Ajouter la tendance des rayonnements (tous les pas)      ! Ajouter la tendance des rayonnements (tous les pas)
1151    
1152      DO k = 1, llm      DO k = 1, llm
1153         DO i = 1, klon         DO i = 1, klon
1154            t_seri(i, k) = t_seri(i, k) + (heat(i, k)-cool(i, k)) * dtphys/86400.            t_seri(i, k) = t_seri(i, k) + (heat(i, k) - cool(i, k)) * dtphys/86400.
1155         ENDDO         ENDDO
1156      ENDDO      ENDDO
1157    
1158      IF (if_ebil >= 2) THEN      IF (if_ebil >= 2) THEN
1159         tit = 'after rad'         tit = 'after rad'
1160         CALL diagetpq(airephy, tit, ip_ebil, 2, 2, dtphys, t_seri, q_seri, &         CALL diagetpq(airephy, tit, ip_ebil, 2, 2, dtphys, t_seri, q_seri, &
1161              ql_seri, u_seri, v_seri, paprs, d_h_vcol, d_qt, d_ec)              ql_seri, u_seri, v_seri, paprs, d_h_vcol, d_qt, d_ec)
# Line 1324  contains Line 1184  contains
1184      ! Param\'etrisation de l'orographie \`a l'\'echelle sous-maille :      ! Param\'etrisation de l'orographie \`a l'\'echelle sous-maille :
1185    
1186      IF (ok_orodr) THEN      IF (ok_orodr) THEN
1187         ! selection des points pour lesquels le shema est actif:         ! S\'election des points pour lesquels le sch\'ema est actif :
1188         igwd = 0         igwd = 0
1189         DO i = 1, klon         DO i = 1, klon
1190            itest(i) = 0            itest(i) = 0
1191            IF (((zpic(i)-zmea(i)) > 100.).AND.(zstd(i) > 10.)) THEN            IF (zpic(i) - zmea(i) > 100. .AND. zstd(i) > 10.) THEN
1192               itest(i) = 1               itest(i) = 1
1193               igwd = igwd + 1               igwd = igwd + 1
              idx(igwd) = i  
1194            ENDIF            ENDIF
1195         ENDDO         ENDDO
1196    
1197         CALL drag_noro(klon, llm, dtphys, paprs, play, zmea, zstd, zsig, zgam, &         CALL drag_noro(klon, llm, dtphys, paprs, play, zmea, zstd, zsig, zgam, &
1198              zthe, zpic, zval, igwd, idx, itest, t_seri, u_seri, v_seri, &              zthe, zpic, zval, itest, t_seri, u_seri, v_seri, zulow, zvlow, &
1199              zulow, zvlow, zustrdr, zvstrdr, d_t_oro, d_u_oro, d_v_oro)              zustrdr, zvstrdr, d_t_oro, d_u_oro, d_v_oro)
1200    
1201         ! ajout des tendances         ! ajout des tendances
1202         DO k = 1, llm         DO k = 1, llm
# Line 1354  contains Line 1213  contains
1213         igwd = 0         igwd = 0
1214         DO i = 1, klon         DO i = 1, klon
1215            itest(i) = 0            itest(i) = 0
1216            IF ((zpic(i) - zmea(i)) > 100.) THEN            IF (zpic(i) - zmea(i) > 100.) THEN
1217               itest(i) = 1               itest(i) = 1
1218               igwd = igwd + 1               igwd = igwd + 1
              idx(igwd) = i  
1219            ENDIF            ENDIF
1220         ENDDO         ENDDO
1221    
# Line 1390  contains Line 1248  contains
1248         ENDDO         ENDDO
1249      ENDDO      ENDDO
1250    
1251      CALL aaam_bud(ra, rg, romega, rlat, rlon, pphis, zustrdr, zustrli, &      CALL aaam_bud(rg, romega, rlat, rlon, pphis, zustrdr, zustrli, zustrph, &
1252           zustrph, zvstrdr, zvstrli, zvstrph, paprs, u, v, aam, torsfc)           zvstrdr, zvstrli, zvstrph, paprs, u, v, aam, torsfc)
1253    
1254      IF (if_ebil >= 2) CALL diagetpq(airephy, 'after orography', ip_ebil, 2, &      IF (if_ebil >= 2) CALL diagetpq(airephy, 'after orography', ip_ebil, 2, &
1255           2, dtphys, t_seri, q_seri, ql_seri, u_seri, v_seri, paprs, d_h_vcol, &           2, dtphys, t_seri, q_seri, ql_seri, u_seri, v_seri, paprs, d_h_vcol, &
1256           d_qt, d_ec)           d_qt, d_ec)
1257    
1258      ! Calcul des tendances traceurs      ! Calcul des tendances traceurs
1259      call phytrac(itap, lmt_pas, julien, time, firstcal, lafin, dtphys, u, t, &      call phytrac(lmt_pas, julien, time, firstcal, lafin, dtphys, t, paprs, &
1260           paprs, play, mfu, mfd, pde_u, pen_d, ycoefh, fm_therm, entr_therm, &           play, mfu, mfd, pde_u, pen_d, ycoefh, fm_therm, entr_therm, yu1, &
1261           yu1, yv1, ftsol, pctsrf, frac_impa, frac_nucl, pphis, albsol, rhcl, &           yv1, ftsol, pctsrf, frac_impa, frac_nucl, da, phi, mp, upwd, dnwd, &
1262           cldfra, rneb, diafra, cldliq, pmflxr, pmflxs, prfl, psfl, da, phi, &           tr_seri, zmasse, ncid_startphy)
1263           mp, upwd, dnwd, tr_seri, zmasse)  
1264        IF (offline) call phystokenc(dtphys, t, mfu, mfd, pen_u, pde_u, pen_d, &
1265      IF (offline) call phystokenc(dtphys, rlon, rlat, t, mfu, mfd, pen_u, &           pde_d, fm_therm, entr_therm, ycoefh, yu1, yv1, ftsol, pctsrf, &
1266           pde_u, pen_d, pde_d, fm_therm, entr_therm, ycoefh, yu1, yv1, ftsol, &           frac_impa, frac_nucl, pphis, airephy, dtphys)
          pctsrf, frac_impa, frac_nucl, pphis, airephy, dtphys, itap)  
1267    
1268      ! Calculer le transport de l'eau et de l'energie (diagnostique)      ! Calculer le transport de l'eau et de l'energie (diagnostique)
1269      CALL transp(paprs, zxtsol, t_seri, q_seri, u_seri, v_seri, zphi, ve, vq, &      CALL transp(paprs, t_seri, q_seri, u_seri, v_seri, zphi, ve, vq, ue, uq)
          ue, uq)  
1270    
1271      ! diag. bilKP      ! diag. bilKP
1272    
1273      CALL transp_lay(paprs, zxtsol, t_seri, q_seri, u_seri, v_seri, zphi, &      CALL transp_lay(paprs, t_seri, q_seri, u_seri, v_seri, zphi, &
1274           ve_lay, vq_lay, ue_lay, uq_lay)           ve_lay, vq_lay, ue_lay, uq_lay)
1275    
1276      ! Accumuler les variables a stocker dans les fichiers histoire:      ! Accumuler les variables a stocker dans les fichiers histoire:
# Line 1430  contains Line 1286  contains
1286         END DO         END DO
1287      END DO      END DO
1288    
1289      IF (if_ebil >= 1) THEN      IF (if_ebil >= 1) THEN
1290         tit = 'after physic'         tit = 'after physic'
1291         CALL diagetpq(airephy, tit, ip_ebil, 1, 1, dtphys, t_seri, q_seri, &         CALL diagetpq(airephy, tit, ip_ebil, 1, 1, dtphys, t_seri, q_seri, &
1292              ql_seri, u_seri, v_seri, paprs, d_h_vcol, d_qt, d_ec)              ql_seri, u_seri, v_seri, paprs, d_h_vcol, d_qt, d_ec)
1293         ! Comme les tendances de la physique sont ajoute dans la dynamique,         ! Comme les tendances de la physique sont ajoute dans la dynamique,
1294         ! on devrait avoir que la variation d'entalpie par la dynamique         ! on devrait avoir que la variation d'entalpie par la dynamique
1295         ! est egale a la variation de la physique au pas de temps precedent.         ! est egale a la variation de la physique au pas de temps precedent.
1296         ! Donc la somme de ces 2 variations devrait etre nulle.         ! Donc la somme de ces 2 variations devrait etre nulle.
# Line 1468  contains Line 1324  contains
1324      DO iq = 3, nqmx      DO iq = 3, nqmx
1325         DO k = 1, llm         DO k = 1, llm
1326            DO i = 1, klon            DO i = 1, klon
1327               d_qx(i, k, iq) = (tr_seri(i, k, iq-2) - qx(i, k, iq)) / dtphys               d_qx(i, k, iq) = (tr_seri(i, k, iq - 2) - qx(i, k, iq)) / dtphys
1328            ENDDO            ENDDO
1329         ENDDO         ENDDO
1330      ENDDO      ENDDO
# Line 1481  contains Line 1337  contains
1337         ENDDO         ENDDO
1338      ENDDO      ENDDO
1339    
1340      ! Ecriture des sorties      CALL histwrite_phy("phis", pphis)
1341      call write_histins      CALL histwrite_phy("aire", airephy)
1342        CALL histwrite_phy("psol", paprs(:, 1))
1343      ! Si c'est la fin, il faut conserver l'etat de redemarrage      CALL histwrite_phy("precip", rain_fall + snow_fall)
1344      IF (lafin) THEN      CALL histwrite_phy("plul", rain_lsc + snow_lsc)
1345         itau_phy = itau_phy + itap      CALL histwrite_phy("pluc", rain_con + snow_con)
1346         CALL phyredem("restartphy.nc", rlat, rlon, pctsrf, ftsol, ftsoil, &      CALL histwrite_phy("tsol", zxtsol)
1347              tslab, seaice, fqsurf, qsol, fsnow, falbe, falblw, fevap, &      CALL histwrite_phy("t2m", zt2m)
1348              rain_fall, snow_fall, solsw, sollw, dlw, radsol, frugs, &      CALL histwrite_phy("q2m", zq2m)
1349              agesno, zmea, zstd, zsig, zgam, zthe, zpic, zval, t_ancien, &      CALL histwrite_phy("u10m", zu10m)
1350              q_ancien, rnebcon, ratqs, clwcon, run_off_lic_0, sig1, w01)      CALL histwrite_phy("v10m", zv10m)
1351      ENDIF      CALL histwrite_phy("snow", snow_fall)
1352        CALL histwrite_phy("cdrm", cdragm)
1353        CALL histwrite_phy("cdrh", cdragh)
1354        CALL histwrite_phy("topl", toplw)
1355        CALL histwrite_phy("evap", evap)
1356        CALL histwrite_phy("sols", solsw)
1357        CALL histwrite_phy("soll", sollw)
1358        CALL histwrite_phy("solldown", sollwdown)
1359        CALL histwrite_phy("bils", bils)
1360        CALL histwrite_phy("sens", - sens)
1361        CALL histwrite_phy("fder", fder)
1362        CALL histwrite_phy("dtsvdfo", d_ts(:, is_oce))
1363        CALL histwrite_phy("dtsvdft", d_ts(:, is_ter))
1364        CALL histwrite_phy("dtsvdfg", d_ts(:, is_lic))
1365        CALL histwrite_phy("dtsvdfi", d_ts(:, is_sic))
1366    
1367      firstcal = .FALSE.      DO nsrf = 1, nbsrf
1368           CALL histwrite_phy("pourc_"//clnsurf(nsrf), pctsrf(:, nsrf)*100.)
1369    contains         CALL histwrite_phy("fract_"//clnsurf(nsrf), pctsrf(:, nsrf))
1370           CALL histwrite_phy("sens_"//clnsurf(nsrf), fluxt(:, 1, nsrf))
1371      subroutine write_histins         CALL histwrite_phy("lat_"//clnsurf(nsrf), fluxlat(:, nsrf))
1372           CALL histwrite_phy("tsol_"//clnsurf(nsrf), ftsol(:, nsrf))
1373        ! From phylmd/write_histins.h, version 1.2 2005/05/25 13:10:09         CALL histwrite_phy("taux_"//clnsurf(nsrf), fluxu(:, 1, nsrf))
1374           CALL histwrite_phy("tauy_"//clnsurf(nsrf), fluxv(:, 1, nsrf))
1375        use dimens_m, only: iim, jjm         CALL histwrite_phy("rugs_"//clnsurf(nsrf), frugs(:, nsrf))
1376        USE histsync_m, ONLY: histsync         CALL histwrite_phy("albe_"//clnsurf(nsrf), falbe(:, nsrf))
1377        USE histwrite_m, ONLY: histwrite      END DO
   
       real zout  
       integer itau_w ! pas de temps ecriture  
       REAL zx_tmp_2d(iim, jjm + 1), zx_tmp_3d(iim, jjm + 1, llm)  
   
       !--------------------------------------------------  
   
       IF (ok_instan) THEN  
          ! Champs 2D:  
   
          zsto = dtphys * ecrit_ins  
          zout = dtphys * ecrit_ins  
          itau_w = itau_phy + itap  
   
          i = NINT(zout/zsto)  
          CALL gr_fi_ecrit(1, klon, iim, jjm + 1, pphis, zx_tmp_2d)  
          CALL histwrite(nid_ins, "phis", itau_w, zx_tmp_2d)  
   
          i = NINT(zout/zsto)  
          CALL gr_fi_ecrit(1, klon, iim, jjm + 1, airephy, zx_tmp_2d)  
          CALL histwrite(nid_ins, "aire", itau_w, zx_tmp_2d)  
   
          DO i = 1, klon  
             zx_tmp_fi2d(i) = paprs(i, 1)  
          ENDDO  
          CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zx_tmp_fi2d, zx_tmp_2d)  
          CALL histwrite(nid_ins, "psol", itau_w, zx_tmp_2d)  
   
          DO i = 1, klon  
             zx_tmp_fi2d(i) = rain_fall(i) + snow_fall(i)  
          ENDDO  
          CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zx_tmp_fi2d, zx_tmp_2d)  
          CALL histwrite(nid_ins, "precip", itau_w, zx_tmp_2d)  
   
          DO i = 1, klon  
             zx_tmp_fi2d(i) = rain_lsc(i) + snow_lsc(i)  
          ENDDO  
          CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zx_tmp_fi2d, zx_tmp_2d)  
          CALL histwrite(nid_ins, "plul", itau_w, zx_tmp_2d)  
   
          DO i = 1, klon  
             zx_tmp_fi2d(i) = rain_con(i) + snow_con(i)  
          ENDDO  
          CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zx_tmp_fi2d, zx_tmp_2d)  
          CALL histwrite(nid_ins, "pluc", itau_w, zx_tmp_2d)  
   
          CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zxtsol, zx_tmp_2d)  
          CALL histwrite(nid_ins, "tsol", itau_w, zx_tmp_2d)  
          !ccIM  
          CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zt2m, zx_tmp_2d)  
          CALL histwrite(nid_ins, "t2m", itau_w, zx_tmp_2d)  
   
          CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zq2m, zx_tmp_2d)  
          CALL histwrite(nid_ins, "q2m", itau_w, zx_tmp_2d)  
   
          CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zu10m, zx_tmp_2d)  
          CALL histwrite(nid_ins, "u10m", itau_w, zx_tmp_2d)  
   
          CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zv10m, zx_tmp_2d)  
          CALL histwrite(nid_ins, "v10m", itau_w, zx_tmp_2d)  
   
          CALL gr_fi_ecrit(1, klon, iim, jjm + 1, snow_fall, zx_tmp_2d)  
          CALL histwrite(nid_ins, "snow", itau_w, zx_tmp_2d)  
   
          CALL gr_fi_ecrit(1, klon, iim, jjm + 1, cdragm, zx_tmp_2d)  
          CALL histwrite(nid_ins, "cdrm", itau_w, zx_tmp_2d)  
   
          CALL gr_fi_ecrit(1, klon, iim, jjm + 1, cdragh, zx_tmp_2d)  
          CALL histwrite(nid_ins, "cdrh", itau_w, zx_tmp_2d)  
   
          CALL gr_fi_ecrit(1, klon, iim, jjm + 1, toplw, zx_tmp_2d)  
          CALL histwrite(nid_ins, "topl", itau_w, zx_tmp_2d)  
   
          CALL gr_fi_ecrit(1, klon, iim, jjm + 1, evap, zx_tmp_2d)  
          CALL histwrite(nid_ins, "evap", itau_w, zx_tmp_2d)  
   
          CALL gr_fi_ecrit(1, klon, iim, jjm + 1, solsw, zx_tmp_2d)  
          CALL histwrite(nid_ins, "sols", itau_w, zx_tmp_2d)  
   
          CALL gr_fi_ecrit(1, klon, iim, jjm + 1, sollw, zx_tmp_2d)  
          CALL histwrite(nid_ins, "soll", itau_w, zx_tmp_2d)  
   
          CALL gr_fi_ecrit(1, klon, iim, jjm + 1, sollwdown, zx_tmp_2d)  
          CALL histwrite(nid_ins, "solldown", itau_w, zx_tmp_2d)  
   
          CALL gr_fi_ecrit(1, klon, iim, jjm + 1, bils, zx_tmp_2d)  
          CALL histwrite(nid_ins, "bils", itau_w, zx_tmp_2d)  
   
          zx_tmp_fi2d(1:klon) = -1*sens(1:klon)  
          ! CALL gr_fi_ecrit(1, klon, iim, jjm + 1, sens, zx_tmp_2d)  
          CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zx_tmp_fi2d, zx_tmp_2d)  
          CALL histwrite(nid_ins, "sens", itau_w, zx_tmp_2d)  
   
          CALL gr_fi_ecrit(1, klon, iim, jjm + 1, fder, zx_tmp_2d)  
          CALL histwrite(nid_ins, "fder", itau_w, zx_tmp_2d)  
   
          CALL gr_fi_ecrit(1, klon, iim, jjm + 1, d_ts(1, is_oce), zx_tmp_2d)  
          CALL histwrite(nid_ins, "dtsvdfo", itau_w, zx_tmp_2d)  
   
          CALL gr_fi_ecrit(1, klon, iim, jjm + 1, d_ts(1, is_ter), zx_tmp_2d)  
          CALL histwrite(nid_ins, "dtsvdft", itau_w, zx_tmp_2d)  
   
          CALL gr_fi_ecrit(1, klon, iim, jjm + 1, d_ts(1, is_lic), zx_tmp_2d)  
          CALL histwrite(nid_ins, "dtsvdfg", itau_w, zx_tmp_2d)  
   
          CALL gr_fi_ecrit(1, klon, iim, jjm + 1, d_ts(1, is_sic), zx_tmp_2d)  
          CALL histwrite(nid_ins, "dtsvdfi", itau_w, zx_tmp_2d)  
   
          DO nsrf = 1, nbsrf  
             !XXX  
             zx_tmp_fi2d(1 : klon) = pctsrf(1 : klon, nsrf)*100.  
             CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zx_tmp_fi2d, zx_tmp_2d)  
             CALL histwrite(nid_ins, "pourc_"//clnsurf(nsrf), itau_w, &  
                  zx_tmp_2d)  
   
             zx_tmp_fi2d(1 : klon) = pctsrf(1 : klon, nsrf)  
             CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zx_tmp_fi2d, zx_tmp_2d)  
             CALL histwrite(nid_ins, "fract_"//clnsurf(nsrf), itau_w, &  
                  zx_tmp_2d)  
   
             zx_tmp_fi2d(1 : klon) = fluxt(1 : klon, 1, nsrf)  
             CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zx_tmp_fi2d, zx_tmp_2d)  
             CALL histwrite(nid_ins, "sens_"//clnsurf(nsrf), itau_w, &  
                  zx_tmp_2d)  
   
             zx_tmp_fi2d(1 : klon) = fluxlat(1 : klon, nsrf)  
             CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zx_tmp_fi2d, zx_tmp_2d)  
             CALL histwrite(nid_ins, "lat_"//clnsurf(nsrf), itau_w, &  
                  zx_tmp_2d)  
   
             zx_tmp_fi2d(1 : klon) = ftsol(1 : klon, nsrf)  
             CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zx_tmp_fi2d, zx_tmp_2d)  
             CALL histwrite(nid_ins, "tsol_"//clnsurf(nsrf), itau_w, &  
                  zx_tmp_2d)  
   
             zx_tmp_fi2d(1 : klon) = fluxu(1 : klon, 1, nsrf)  
             CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zx_tmp_fi2d, zx_tmp_2d)  
             CALL histwrite(nid_ins, "taux_"//clnsurf(nsrf), itau_w, &  
                  zx_tmp_2d)  
   
             zx_tmp_fi2d(1 : klon) = fluxv(1 : klon, 1, nsrf)  
             CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zx_tmp_fi2d, zx_tmp_2d)  
             CALL histwrite(nid_ins, "tauy_"//clnsurf(nsrf), itau_w, &  
                  zx_tmp_2d)  
   
             zx_tmp_fi2d(1 : klon) = frugs(1 : klon, nsrf)  
             CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zx_tmp_fi2d, zx_tmp_2d)  
             CALL histwrite(nid_ins, "rugs_"//clnsurf(nsrf), itau_w, &  
                  zx_tmp_2d)  
   
             zx_tmp_fi2d(1 : klon) = falbe(1 : klon, nsrf)  
             CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zx_tmp_fi2d, zx_tmp_2d)  
             CALL histwrite(nid_ins, "albe_"//clnsurf(nsrf), itau_w, &  
                  zx_tmp_2d)  
   
          END DO  
          CALL gr_fi_ecrit(1, klon, iim, jjm + 1, albsol, zx_tmp_2d)  
          CALL histwrite(nid_ins, "albs", itau_w, zx_tmp_2d)  
          CALL gr_fi_ecrit(1, klon, iim, jjm + 1, albsollw, zx_tmp_2d)  
          CALL histwrite(nid_ins, "albslw", itau_w, zx_tmp_2d)  
   
          CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zxrugs, zx_tmp_2d)  
          CALL histwrite(nid_ins, "rugs", itau_w, zx_tmp_2d)  
   
          !HBTM2  
   
          CALL gr_fi_ecrit(1, klon, iim, jjm + 1, s_pblh, zx_tmp_2d)  
          CALL histwrite(nid_ins, "s_pblh", itau_w, zx_tmp_2d)  
   
          CALL gr_fi_ecrit(1, klon, iim, jjm + 1, s_pblt, zx_tmp_2d)  
          CALL histwrite(nid_ins, "s_pblt", itau_w, zx_tmp_2d)  
   
          CALL gr_fi_ecrit(1, klon, iim, jjm + 1, s_lcl, zx_tmp_2d)  
          CALL histwrite(nid_ins, "s_lcl", itau_w, zx_tmp_2d)  
   
          CALL gr_fi_ecrit(1, klon, iim, jjm + 1, s_capCL, zx_tmp_2d)  
          CALL histwrite(nid_ins, "s_capCL", itau_w, zx_tmp_2d)  
   
          CALL gr_fi_ecrit(1, klon, iim, jjm + 1, s_oliqCL, zx_tmp_2d)  
          CALL histwrite(nid_ins, "s_oliqCL", itau_w, zx_tmp_2d)  
   
          CALL gr_fi_ecrit(1, klon, iim, jjm + 1, s_cteiCL, zx_tmp_2d)  
          CALL histwrite(nid_ins, "s_cteiCL", itau_w, zx_tmp_2d)  
   
          CALL gr_fi_ecrit(1, klon, iim, jjm + 1, s_therm, zx_tmp_2d)  
          CALL histwrite(nid_ins, "s_therm", itau_w, zx_tmp_2d)  
   
          CALL gr_fi_ecrit(1, klon, iim, jjm + 1, s_trmb1, zx_tmp_2d)  
          CALL histwrite(nid_ins, "s_trmb1", itau_w, zx_tmp_2d)  
   
          CALL gr_fi_ecrit(1, klon, iim, jjm + 1, s_trmb2, zx_tmp_2d)  
          CALL histwrite(nid_ins, "s_trmb2", itau_w, zx_tmp_2d)  
   
          CALL gr_fi_ecrit(1, klon, iim, jjm + 1, s_trmb3, zx_tmp_2d)  
          CALL histwrite(nid_ins, "s_trmb3", itau_w, zx_tmp_2d)  
   
          ! Champs 3D:  
   
          CALL gr_fi_ecrit(llm, klon, iim, jjm + 1, t_seri, zx_tmp_3d)  
          CALL histwrite(nid_ins, "temp", itau_w, zx_tmp_3d)  
   
          CALL gr_fi_ecrit(llm, klon, iim, jjm + 1, u_seri, zx_tmp_3d)  
          CALL histwrite(nid_ins, "vitu", itau_w, zx_tmp_3d)  
   
          CALL gr_fi_ecrit(llm, klon, iim, jjm + 1, v_seri, zx_tmp_3d)  
          CALL histwrite(nid_ins, "vitv", itau_w, zx_tmp_3d)  
   
          CALL gr_fi_ecrit(llm, klon, iim, jjm + 1, zphi, zx_tmp_3d)  
          CALL histwrite(nid_ins, "geop", itau_w, zx_tmp_3d)  
   
          CALL gr_fi_ecrit(llm, klon, iim, jjm + 1, play, zx_tmp_3d)  
          CALL histwrite(nid_ins, "pres", itau_w, zx_tmp_3d)  
   
          CALL gr_fi_ecrit(llm, klon, iim, jjm + 1, d_t_vdf, zx_tmp_3d)  
          CALL histwrite(nid_ins, "dtvdf", itau_w, zx_tmp_3d)  
   
          CALL gr_fi_ecrit(llm, klon, iim, jjm + 1, d_q_vdf, zx_tmp_3d)  
          CALL histwrite(nid_ins, "dqvdf", itau_w, zx_tmp_3d)  
1378    
1379           call histsync(nid_ins)      CALL histwrite_phy("albs", albsol)
1380        ENDIF      CALL histwrite_phy("rugs", zxrugs)
1381        CALL histwrite_phy("s_pblh", s_pblh)
1382        CALL histwrite_phy("s_pblt", s_pblt)
1383        CALL histwrite_phy("s_lcl", s_lcl)
1384        CALL histwrite_phy("s_capCL", s_capCL)
1385        CALL histwrite_phy("s_oliqCL", s_oliqCL)
1386        CALL histwrite_phy("s_cteiCL", s_cteiCL)
1387        CALL histwrite_phy("s_therm", s_therm)
1388        CALL histwrite_phy("s_trmb1", s_trmb1)
1389        CALL histwrite_phy("s_trmb2", s_trmb2)
1390        CALL histwrite_phy("s_trmb3", s_trmb3)
1391        if (conv_emanuel) CALL histwrite_phy("ptop", ema_pct)
1392        CALL histwrite_phy("temp", t_seri)
1393        CALL histwrite_phy("vitu", u_seri)
1394        CALL histwrite_phy("vitv", v_seri)
1395        CALL histwrite_phy("geop", zphi)
1396        CALL histwrite_phy("pres", play)
1397        CALL histwrite_phy("dtvdf", d_t_vdf)
1398        CALL histwrite_phy("dqvdf", d_q_vdf)
1399        CALL histwrite_phy("rhum", zx_rh)
1400    
1401        if (ok_instan) call histsync(nid_ins)
1402    
1403        IF (lafin) then
1404           call NF95_CLOSE(ncid_startphy)
1405           CALL phyredem(pctsrf, ftsol, ftsoil, fqsurf, qsol, &
1406                fsnow, falbe, fevap, rain_fall, snow_fall, solsw, sollw, dlw, &
1407                radsol, frugs, agesno, zmea, zstd, zsig, zgam, zthe, zpic, zval, &
1408                t_ancien, q_ancien, rnebcon, ratqs, clwcon, run_off_lic_0, sig1, &
1409                w01)
1410        end IF
1411    
1412      end subroutine write_histins      firstcal = .FALSE.
1413    
1414    END SUBROUTINE physiq    END SUBROUTINE physiq
1415    

Legend:
Removed from v.99  
changed lines
  Added in v.191

  ViewVC Help
Powered by ViewVC 1.1.21