source: LMDZ4/trunk/libf/phylmd/physiq.F @ 1355

Last change on this file since 1355 was 1355, checked in by musat, 14 years ago

use of phys_cal_mod in conf_phys (and change call order in physiq.F) to
automatically calculate the output frequency of standard pressure monthly
file (histmthNMC.nc)
IM

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 120.2 KB
RevLine 
[1279]1! $Id: physiq.F 1355 2010-04-14 13:27:18Z musat $
[766]2c#define IO_DEBUG
3
[1146]4      SUBROUTINE physiq (nlon,nlev,
[1279]5     .            debut,lafin,jD_cur, jH_cur,pdtphys,
[524]6     .            paprs,pplay,pphi,pphis,presnivs,clesphy0,
7     .            u,v,t,qx,
8     .            flxmass_w,
[644]9     .            d_u, d_v, d_t, d_qx, d_ps
10     .            , dudyn
11     .            , PVteta)
[524]12
[1279]13      USE ioipsl, only: histbeg, histvert, histdef, histend, histsync,
14     $     histwrite, ju2ymds, ymds2ju, ioget_year_len
[766]15      USE comgeomphy
[1279]16      USE phys_cal_mod
[766]17      USE write_field_phy
18      USE dimphy
[1146]19      USE infotrac
[776]20      USE mod_grid_phy_lmdz
21      USE mod_phys_lmdz_para
[766]22      USE iophy
23      USE misc_mod, mydebug=>debug
24      USE vampir
[782]25      USE pbl_surface_mod, ONLY : pbl_surface
[996]26      USE change_srf_frac_mod
27      USE surface_data,     ONLY : type_ocean, ok_veget
[904]28      USE phys_local_var_mod ! Variables internes non sauvegardees de la physique
[913]29      USE phys_state_var_mod ! Variables sauvegardees de la physique
[1334]30      USE phys_output_var_mod ! Variables pour les ecritures des sorties
[782]31      USE fonte_neige_mod, ONLY  : fonte_neige_get_vars
[909]32      USE phys_output_mod
[1279]33      use open_climoz_m, only: open_climoz ! ozone climatology from a file
34      use regr_pr_av_m, only: regr_pr_av
35      use netcdf95, only: nf95_close
[1352]36cIM for NMC files
37      use netcdf, only: nf90_fill_real
[1279]38      use mod_phys_lmdz_mpi_data, only: is_mpi_root
39      USE aero_mod
40      use ozonecm_m, only: ozonecm ! ozone of J.-F. Royer
41      use conf_phys_m, only: conf_phys
42      use radlwsw_m, only: radlwsw
[782]43
[524]44      IMPLICIT none
45c======================================================================
46c
47c Auteur(s) Z.X. Li (LMD/CNRS) date: 19930818
48c
49c Objet: Moniteur general de la physique du modele
50cAA      Modifications quant aux traceurs :
51cAA                  -  uniformisation des parametrisations ds phytrac
52cAA                  -  stockage des moyennes des champs necessaires
53cAA                     en mode traceur off-line
54c======================================================================
55c   CLEFS CPP POUR LES IO
56c   =====================
[1352]57#define histNMC
[766]58c#define histISCCP
[524]59c======================================================================
60c    modif   ( P. Le Van ,  12/10/98 )
61c
62c  Arguments:
63c
64c nlon----input-I-nombre de points horizontaux
[1279]65c nlev----input-I-nombre de couches verticales, doit etre egale a klev
[524]66c debut---input-L-variable logique indiquant le premier passage
67c lafin---input-L-variable logique indiquant le dernier passage
[1279]68c jD_cur       -R-jour courant a l'appel de la physique (jour julien)
69c jH_cur       -R-heure courante a l'appel de la physique (jour julien)
[524]70c pdtphys-input-R-pas d'integration pour la physique (seconde)
71c paprs---input-R-pression pour chaque inter-couche (en Pa)
72c pplay---input-R-pression pour le mileu de chaque couche (en Pa)
73c pphi----input-R-geopotentiel de chaque couche (g z) (reference sol)
74c pphis---input-R-geopotentiel du sol
75c presnivs-input_R_pressions approximat. des milieux couches ( en PA)
76c u-------input-R-vitesse dans la direction X (de O a E) en m/s
77c v-------input-R-vitesse Y (de S a N) en m/s
78c t-------input-R-temperature (K)
79c qx------input-R-humidite specifique (kg/kg) et d'autres traceurs
80c d_t_dyn-input-R-tendance dynamique pour "t" (K/s)
81c d_q_dyn-input-R-tendance dynamique pour "q" (kg/kg/s)
[959]82c flxmass_w -input-R- flux de masse verticale
[524]83c d_u-----output-R-tendance physique de "u" (m/s/s)
84c d_v-----output-R-tendance physique de "v" (m/s/s)
85c d_t-----output-R-tendance physique de "t" (K/s)
86c d_qx----output-R-tendance physique de "qx" (kg/kg/s)
87c d_ps----output-R-tendance physique de la pression au sol
[776]88cIM
[644]89c PVteta--output-R-vorticite potentielle a des thetas constantes
[524]90c======================================================================
91#include "dimensions.h"
92      integer jjmp1
93      parameter (jjmp1=jjm+1-1/jjm)
[766]94      integer iip1
95      parameter (iip1=iim+1)
[782]96
[524]97#include "regdim.h"
98#include "indicesol.h"
99#include "dimsoil.h"
100#include "clesphys.h"
101#include "control.h"
102#include "temps.h"
103#include "iniprint.h"
[541]104#include "thermcell.h"
[524]105c======================================================================
106      LOGICAL ok_cvl  ! pour activer le nouveau driver pour convection KE
107      PARAMETER (ok_cvl=.TRUE.)
108      LOGICAL ok_gust ! pour activer l'effet des gust sur flux surface
109      PARAMETER (ok_gust=.FALSE.)
[879]110      integer iflag_radia     ! active ou non le rayonnement (MPL)
111      save iflag_radia
[987]112c$OMP THREADPRIVATE(iflag_radia)
[524]113c======================================================================
114      LOGICAL check ! Verifier la conservation du modele en eau
115      PARAMETER (check=.FALSE.)
116      LOGICAL ok_stratus ! Ajouter artificiellement les stratus
117      PARAMETER (ok_stratus=.FALSE.)
118c======================================================================
[687]119      REAL amn, amx
[879]120      INTEGER igout
[524]121c======================================================================
122c Clef controlant l'activation du cycle diurne:
123ccc      LOGICAL cycle_diurne
124ccc      PARAMETER (cycle_diurne=.FALSE.)
125c======================================================================
126c Modele thermique du sol, a activer pour le cycle diurne:
127ccc      LOGICAL soil_model
128ccc      PARAMETER (soil_model=.FALSE.)
129c======================================================================
130c Dans les versions precedentes, l'eau liquide nuageuse utilisee dans
131c le calcul du rayonnement est celle apres la precipitation des nuages.
132c Si cette cle new_oliq est activee, ce sera une valeur moyenne entre
133c la condensation et la precipitation. Cette cle augmente les impacts
134c radiatifs des nuages.
135ccc      LOGICAL new_oliq
136ccc      PARAMETER (new_oliq=.FALSE.)
137c======================================================================
138c Clefs controlant deux parametrisations de l'orographie:
139cc      LOGICAL ok_orodr
140ccc      PARAMETER (ok_orodr=.FALSE.)
141ccc      LOGICAL ok_orolf
142ccc      PARAMETER (ok_orolf=.FALSE.)
143c======================================================================
144      LOGICAL ok_journe ! sortir le fichier journalier
145      save ok_journe
[766]146c$OMP THREADPRIVATE(ok_journe)
[524]147c
148      LOGICAL ok_mensuel ! sortir le fichier mensuel
149      save ok_mensuel
[766]150c$OMP THREADPRIVATE(ok_mensuel)
[524]151c
152      LOGICAL ok_instan ! sortir le fichier instantane
153      save ok_instan
[766]154c$OMP THREADPRIVATE(ok_instan)
[524]155c
[1054]156      LOGICAL ok_LES ! sortir le fichier LES
157      save ok_LES                           
158c$OMP THREADPRIVATE(ok_LES)                 
159c
[524]160      LOGICAL ok_region ! sortir le fichier regional
161      PARAMETER (ok_region=.FALSE.)
162c======================================================================
[878]163      real weak_inversion(klon),dthmin(klon)
164      real seuil_inversion
165      save seuil_inversion
166c$OMP THREADPRIVATE(seuil_inversion)
167      integer iflag_ratqs
168      save iflag_ratqs
169c$OMP THREADPRIVATE(iflag_ratqs)
[1032]170      REAL lambda_th(klon,klev),zz,znum,zden
171      REAL wmax_th(klon)
172      REAL zmax_th(klon)
173      REAL tau_overturning_th(klon)
[878]174
175      integer lmax_th(klon)
176      integer limbas(klon)
177      real ratqscth(klon,klev)
178      real ratqsdiff(klon,klev)
179      real zqsatth(klon,klev)
180
[541]181c======================================================================
[524]182c
183      INTEGER ivap          ! indice de traceurs pour vapeur d'eau
184      PARAMETER (ivap=1)
185      INTEGER iliq          ! indice de traceurs pour eau liquide
186      PARAMETER (iliq=2)
187
188c
189c
190c Variables argument:
191c
192      INTEGER nlon
193      INTEGER nlev
[1279]194      REAL, intent(in):: jD_cur, jH_cur
195
[524]196      REAL pdtphys
197      LOGICAL debut, lafin
198      REAL paprs(klon,klev+1)
199      REAL pplay(klon,klev)
200      REAL pphi(klon,klev)
201      REAL pphis(klon)
202      REAL presnivs(klev)
203      REAL znivsig(klev)
[644]204      real pir
[719]205
[524]206      REAL u(klon,klev)
207      REAL v(klon,klev)
[879]208      REAL t(klon,klev),theta(klon,klev)
[1146]209      REAL qx(klon,klev,nqtot)
[524]210      REAL flxmass_w(klon,klev)
[959]211      REAL omega(klon,klev) ! vitesse verticale en Pa/s
[524]212      REAL d_u(klon,klev)
213      REAL d_v(klon,klev)
214      REAL d_t(klon,klev)
[1146]215      REAL d_qx(klon,klev,nqtot)
[524]216      REAL d_ps(klon)
[619]217      real da(klon,klev),phi(klon,klev,klev),mp(klon,klev)
[644]218c
219cIM Amip2 PV a theta constante
220c
221      INTEGER nbteta
222      PARAMETER(nbteta=3)
223      CHARACTER*3 ctetaSTD(nbteta)
224      DATA ctetaSTD/'350','380','405'/
[766]225      SAVE ctetaSTD
226c$OMP THREADPRIVATE(ctetaSTD)
[644]227      REAL rtetaSTD(nbteta)
228      DATA rtetaSTD/350., 380., 405./
[766]229      SAVE rtetaSTD
230c$OMP THREADPRIVATE(rtetaSTD)     
[644]231c
232      REAL PVteta(klon,nbteta)
233      REAL zx_tmp_3dte(iim,jjmp1,nbteta)
234c
235cMI Amip2 PV a theta constante
[524]236
[766]237cym      INTEGER klevp1, klevm1
238cym      PARAMETER(klevp1=klev+1,klevm1=klev-1)
239cym#include "raddim.h"
[524]240c
241c
[644]242cIM Amip2
243c variables a une pression donnee
[524]244c
245      real rlevSTD(nlevSTD)
246      DATA rlevSTD/100000., 92500., 85000., 70000.,
247     .60000., 50000., 40000., 30000., 25000., 20000.,
248     .15000., 10000., 7000., 5000., 3000., 2000., 1000./
[766]249      SAVE rlevstd
[987]250c$OMP THREADPRIVATE(rlevstd)
[644]251      CHARACTER*4 clevSTD(nlevSTD)
[524]252      DATA clevSTD/'1000','925 ','850 ','700 ','600 ',
253     .'500 ','400 ','300 ','250 ','200 ','150 ','100 ',
254     .'70  ','50  ','30  ','20  ','10  '/
[766]255      SAVE clevSTD
[987]256c$OMP THREADPRIVATE(clevSTD)
[524]257c
[901]258      CHARACTER*4 bb2
[644]259      CHARACTER*2 bb3
[1352]260c
[1055]261      real twriteSTD(klon,nlevSTD,nfiles)
262      real qwriteSTD(klon,nlevSTD,nfiles)
263      real rhwriteSTD(klon,nlevSTD,nfiles)
264      real phiwriteSTD(klon,nlevSTD,nfiles)
265      real uwriteSTD(klon,nlevSTD,nfiles)
266      real vwriteSTD(klon,nlevSTD,nfiles)
267      real wwriteSTD(klon,nlevSTD,nfiles)
[1352]268cIM for NMC files
269      REAL geo500(klon)
270      real :: rlevSTD3(nlevSTD3)
271      DATA rlevSTD3/85000., 50000., 25000./
272      SAVE rlevSTD3
273c$OMP THREADPRIVATE(rlevSTD3)
274      real :: rlevSTD8(nlevSTD8)
275      DATA rlevSTD8/100000., 85000., 70000., 50000., 25000., 10000.,
276     $     5000., 1000./
277      SAVE rlevSTD8
278c$OMP THREADPRIVATE(rlevSTD8)
279      real twriteSTD3(klon,nlevSTD3)
280      real qwriteSTD3(klon,nlevSTD3)
281      real rhwriteSTD3(klon,nlevSTD3)
282      real phiwriteSTD3(klon,nlevSTD3)
283      real uwriteSTD3(klon,nlevSTD3)
284      real vwriteSTD3(klon,nlevSTD3)
285      real wwriteSTD3(klon,nlevSTD3)
[524]286c
[1352]287      real tnondefSTD8(klon,nlevSTD8)
288      real twriteSTD8(klon,nlevSTD8)
289      real qwriteSTD8(klon,nlevSTD8)
290      real rhwriteSTD8(klon,nlevSTD8)
291      real phiwriteSTD8(klon,nlevSTD8)
292      real uwriteSTD8(klon,nlevSTD8)
293      real vwriteSTD8(klon,nlevSTD8)
294      real wwriteSTD8(klon,nlevSTD8)
295c
296c plevSTD3 END
297c
[644]298c nout : niveau de output des variables a une pression donnee
299      logical oknondef(klon,nlevSTD,nout)
300c
301c les produits uvSTD, vqSTD, .., T2STD sont calcules
302c a partir des valeurs instantannees toutes les 6 h
303c qui sont moyennees sur le mois
304c
305#include "radopt.h"
306c
307c
[524]308c prw: precipitable water
309      real prw(klon)
310
311      REAL convliq(klon,klev)  ! eau liquide nuageuse convective
312      REAL convfra(klon,klev)  ! fraction nuageuse convective
313
314      REAL cldl_c(klon),cldm_c(klon),cldh_c(klon) !nuages bas, moyen et haut
315      REAL cldt_c(klon),cldq_c(klon) !nuage total, eau liquide integree
316      REAL cldl_s(klon),cldm_s(klon),cldh_s(klon) !nuages bas, moyen et haut
317      REAL cldt_s(klon),cldq_s(klon) !nuage total, eau liquide integree
318
[766]319      INTEGER linv, kp1
[524]320c flwp, fiwp = Liquid Water Path & Ice Water Path (kg/m2)
321c flwc, fiwc = Liquid Water Content & Ice Water Content (kg/kg)
322      REAL flwp(klon), fiwp(klon)
323      REAL flwc(klon,klev), fiwc(klon,klev)
324      REAL flwp_c(klon), fiwp_c(klon)
325      REAL flwc_c(klon,klev), fiwc_c(klon,klev)
326      REAL flwp_s(klon), fiwp_s(klon)
327      REAL flwc_s(klon,klev), fiwc_s(klon,klev)
328
[644]329cIM ISCCP simulator v3.4
[524]330c dans clesphys.h top_height, overlap
331cv3.4
332      INTEGER debug, debugcol
[766]333cym      INTEGER npoints
334cym      PARAMETER(npoints=klon)
[524]335c
336      INTEGER sunlit(klon) !sunlit=1 if day; sunlit=0 if night
337      INTEGER nregISCtot
338      PARAMETER(nregISCtot=1)
339c
340c imin_debut, nbpti, jmin_debut, nbptj : parametres pour sorties sur 1 region rectangulaire
341c y compris pour 1 point
342c imin_debut : indice minimum de i; nbpti : nombre de points en direction i (longitude)
343c jmin_debut : indice minimum de j; nbptj : nombre de points en direction j (latitude)
344      INTEGER imin_debut, nbpti
345      INTEGER jmin_debut, nbptj
[687]346cIM parametres ISCCP BEG
[828]347      INTEGER nbapp_isccp
348!     INTEGER nbapp_isccp,isccppas
349!     PARAMETER(isccppas=6) !appel du simulateurs tous les 6pas de temps de la physique
350!                           !i.e. toutes les 3 heures
[952]351      INTEGER n
[687]352      INTEGER ifreq_isccp(napisccp), freqin_pdt(napisccp)
353      DATA ifreq_isccp/3/
354      SAVE ifreq_isccp
[766]355c$OMP THREADPRIVATE(ifreq_isccp)
[687]356      CHARACTER*5 typinout(napisccp)
357      DATA typinout/'i3od'/
[766]358      SAVE typinout
359c$OMP THREADPRIVATE(typinout)
[687]360cIM verif boxptop BEG
361      CHARACTER*1 verticaxe(napisccp)
362      DATA verticaxe/'1'/
[766]363      SAVE verticaxe
364c$OMP THREADPRIVATE(verticaxe)
[687]365cIM verif boxptop END
366      INTEGER nvlev(napisccp)
367c     INTEGER nvlev
368      REAL t1, aa
369      REAL seed_re(klon,napisccp)
[766]370cym !!!! A voir plus tard
371cym      INTEGER iphy(iim,jjmp1)
[687]372cIM parametres ISCCP END
[524]373c
374c ncol = nb. de sous-colonnes pour chaque maille du GCM
[687]375c ncolmx = No. max. de sous-colonnes pour chaque maille du GCM
[766]376c      INTEGER ncol(napisccp), ncolmx, seed(klon,napisccp)
377      INTEGER,SAVE :: ncol(napisccp)
[987]378c$OMP THREADPRIVATE(ncol)
[766]379      INTEGER ncolmx, seed(klon,napisccp)
[687]380      REAL nbsunlit(nregISCtot,klon,napisccp)  !nbsunlit : moyenne de sunlit
[828]381c     PARAMETER(ncolmx=1500)
382      PARAMETER(ncolmx=300)
[687]383c
384cIM verif boxptop BEG
385      REAL vertlev(ncolmx,napisccp)
386cIM verif boxptop END
387c
[766]388      REAL,SAVE :: tautab_omp(0:255),tautab(0:255)
389      INTEGER,SAVE :: invtau_omp(-20:45000),invtau(-20:45000)
390c$OMP THREADPRIVATE(tautab,invtau)
[524]391      REAL emsfc_lw
392      PARAMETER(emsfc_lw=0.99)
[644]393c     REAL    ran0                      ! type for random number fuction
[524]394c
395      REAL cldtot(klon,klev)
396c variables de haut en bas pour le simulateur ISCCP
397      REAL dtau_s(klon,klev) !tau nuages startiformes
398      REAL dtau_c(klon,klev) !tau nuages convectifs
399      REAL dem_s(klon,klev)  !emissivite nuages startiformes
400      REAL dem_c(klon,klev)  !emissivite nuages convectifs
401c
402c variables de haut en bas pour le simulateur ISCCP
403      REAL pfull(klon,klev)
404      REAL phalf(klon,klev+1)
405      REAL qv(klon,klev)
406      REAL cc(klon,klev)
407      REAL conv(klon,klev)
408      REAL dtau_sH2B(klon,klev)
409      REAL dtau_cH2B(klon,klev)
410      REAL at(klon,klev)
411      REAL dem_sH2B(klon,klev)
412      REAL dem_cH2B(klon,klev)
413c
[687]414      INTEGER kmax, lmax, lmax3
415      PARAMETER(kmax=8, lmax=8, lmax3=3)
[524]416      INTEGER kmaxm1, lmaxm1
417      PARAMETER(kmaxm1=kmax-1, lmaxm1=lmax-1)
418      INTEGER iimx7, jjmx7, jjmp1x7
419      PARAMETER(iimx7=iim*kmaxm1, jjmx7=jjm*lmaxm1,
420     .jjmp1x7=jjmp1*lmaxm1)
421c
[687]422c output from ISCCP simulator
423      REAL fq_isccp(klon,kmaxm1,lmaxm1,napisccp)
424      REAL fq_is_true(klon,kmaxm1,lmaxm1,napisccp)
425      REAL totalcldarea(klon,napisccp)
426      REAL meanptop(klon,napisccp)
427      REAL meantaucld(klon,napisccp)
428      REAL boxtau(klon,ncolmx,napisccp)
429      REAL boxptop(klon,ncolmx,napisccp)
430      REAL zx_tmp_fi3d_bx(klon,ncolmx)
431      REAL zx_tmp_3d_bx(iim,jjmp1,ncolmx)
432c
433      REAL cld_fi3d(klon,lmax3)
434      REAL cld_3d(iim,jjmp1,lmax3)
435c
[524]436      INTEGER iw, iwmax
437      REAL wmin, pas_w
[766]438c     PARAMETER(wmin=-100.,pas_w=10.,iwmax=30)
439cIM 051005     PARAMETER(wmin=-200.,pas_w=10.,iwmax=40)
[687]440      PARAMETER(wmin=-100.,pas_w=10.,iwmax=20)
[524]441      REAL o500(klon)
442c
443
444c sorties ISCCP
445
446      integer nid_isccp
[644]447      save nid_isccp       
[766]448c$OMP THREADPRIVATE(nid_isccp)
[524]449
450      REAL zx_tau(kmaxm1), zx_pc(lmaxm1), zx_o500(iwmax)
451      DATA zx_tau/0.0, 0.3, 1.3, 3.6, 9.4, 23., 60./
[766]452      SAVE zx_tau
[687]453      DATA zx_pc/180., 310., 440., 560., 680., 800., 1000./
[766]454      SAVE zx_pc
455c$OMP THREADPRIVATE(zx_tau,zx_pc)
[524]456c cldtopres pression au sommet des nuages
[687]457      REAL cldtopres(lmaxm1), cldtopres3(lmax3)
458      DATA cldtopres/180., 310., 440., 560., 680., 800., 1000./
459      DATA cldtopres3/440., 680., 1000./
[766]460      SAVE cldtopres,cldtopres3
461c$OMP THREADPRIVATE(cldtopres,cldtopres3)
462cIM 051005 BEG
[524]463      INTEGER komega, nhoriRD
464
465c taulev: numero du niveau de tau dans les sorties ISCCP
466      CHARACTER *4 taulev(kmaxm1)
[644]467c     DATA taulev/'tau1','tau2','tau3','tau4','tau5','tau6','tau7'/
468      DATA taulev/'tau0','tau1','tau2','tau3','tau4','tau5','tau6'/
469      CHARACTER *3 pclev(lmaxm1)
470      DATA pclev/'pc1','pc2','pc3','pc4','pc5','pc6','pc7'/
[766]471      SAVE taulev,pclev
472c$OMP THREADPRIVATE(taulev,pclev)
[644]473c
474c cnameisccp
475      CHARACTER *27 cnameisccp(lmaxm1,kmaxm1)
[687]476cIM bad 151205     DATA cnameisccp/'pc< 50hPa, tau< 0.3',
477      DATA cnameisccp/'pc= 50-180hPa, tau< 0.3',
[644]478     .                'pc= 180-310hPa, tau< 0.3',
479     .                'pc= 310-440hPa, tau< 0.3',
480     .                'pc= 440-560hPa, tau< 0.3',
481     .                'pc= 560-680hPa, tau< 0.3',
482     .                'pc= 680-800hPa, tau< 0.3',
[687]483     .                'pc= 800-1000hPa, tau< 0.3',
[644]484     .                'pc= 50-180hPa, tau= 0.3-1.3',
485     .                'pc= 180-310hPa, tau= 0.3-1.3',
486     .                'pc= 310-440hPa, tau= 0.3-1.3',
487     .                'pc= 440-560hPa, tau= 0.3-1.3',
488     .                'pc= 560-680hPa, tau= 0.3-1.3',
489     .                'pc= 680-800hPa, tau= 0.3-1.3',
[687]490     .                'pc= 800-1000hPa, tau= 0.3-1.3',
[644]491     .                'pc= 50-180hPa, tau= 1.3-3.6',
492     .                'pc= 180-310hPa, tau= 1.3-3.6',
493     .                'pc= 310-440hPa, tau= 1.3-3.6',
494     .                'pc= 440-560hPa, tau= 1.3-3.6',
495     .                'pc= 560-680hPa, tau= 1.3-3.6',
496     .                'pc= 680-800hPa, tau= 1.3-3.6',
[687]497     .                'pc= 800-1000hPa, tau= 1.3-3.6',
[644]498     .                'pc= 50-180hPa, tau= 3.6-9.4',
499     .                'pc= 180-310hPa, tau= 3.6-9.4',
500     .                'pc= 310-440hPa, tau= 3.6-9.4',
501     .                'pc= 440-560hPa, tau= 3.6-9.4',
502     .                'pc= 560-680hPa, tau= 3.6-9.4',
503     .                'pc= 680-800hPa, tau= 3.6-9.4',
[687]504     .                'pc= 800-1000hPa, tau= 3.6-9.4',
[644]505     .                'pc= 50-180hPa, tau= 9.4-23',
506     .                'pc= 180-310hPa, tau= 9.4-23',
507     .                'pc= 310-440hPa, tau= 9.4-23',
508     .                'pc= 440-560hPa, tau= 9.4-23',
509     .                'pc= 560-680hPa, tau= 9.4-23',
510     .                'pc= 680-800hPa, tau= 9.4-23',
[687]511     .                'pc= 800-1000hPa, tau= 9.4-23',
[644]512     .                'pc= 50-180hPa, tau= 23-60',
513     .                'pc= 180-310hPa, tau= 23-60',
514     .                'pc= 310-440hPa, tau= 23-60',
515     .                'pc= 440-560hPa, tau= 23-60',
516     .                'pc= 560-680hPa, tau= 23-60',
517     .                'pc= 680-800hPa, tau= 23-60',
[687]518     .                'pc= 800-1000hPa, tau= 23-60',
[644]519     .                'pc= 50-180hPa, tau> 60.',
520     .                'pc= 180-310hPa, tau> 60.',
521     .                'pc= 310-440hPa, tau> 60.',
522     .                'pc= 440-560hPa, tau> 60.',
523     .                'pc= 560-680hPa, tau> 60.',
[687]524     .                'pc= 680-800hPa, tau> 60.',
525     .                'pc= 800-1000hPa, tau> 60.'/
[766]526       SAVE cnameisccp
527c$OMP THREADPRIVATE(cnameisccp)
[644]528c
529c     REAL zx_lonx7(iimx7), zx_latx7(jjmp1x7)
530c     INTEGER nhorix7
[524]531cIM: region='3d' <==> sorties en global
532      CHARACTER*3 region
533      PARAMETER(region='3d')
534c
[644]535cIM ISCCP simulator v3.4
536c
[524]537      logical ok_hf
[644]538c
[524]539      integer nid_hf, nid_hf3d
[644]540      save ok_hf, nid_hf, nid_hf3d
[766]541c$OMP THREADPRIVATE(ok_hf, nid_hf, nid_hf3d)
[524]542c  QUESTION : noms de variables ?
543
544      INTEGER        longcles
545      PARAMETER    ( longcles = 20 )
546      REAL clesphy0( longcles      )
547c
548c Variables propres a la physique
549      INTEGER itap
550      SAVE itap                   ! compteur pour la physique
[766]551c$OMP THREADPRIVATE(itap)
[524]552c
553      real slp(klon) ! sea level pressure
554c
[782]555      REAL fevap(klon,nbsrf)
556      REAL fluxlat(klon,nbsrf)
[524]557c
[782]558      REAL qsol(klon)
[883]559      REAL,save ::  solarlong0
[987]560c$OMP THREADPRIVATE(solarlong0)
561
[524]562c
563c  Parametres de l'Orographie a l'Echelle Sous-Maille (OESM):
564c
[644]565cIM 141004     REAL zulow(klon),zvlow(klon),zustr(klon), zvstr(klon)
566      REAL zulow(klon),zvlow(klon)
[524]567c
568      INTEGER igwd,idx(klon),itest(klon)
569c
[782]570      REAL agesno(klon,nbsrf)
[524]571c
[782]572c      REAL,allocatable,save :: run_off_lic_0(:)
573cc$OMP THREADPRIVATE(run_off_lic_0)
[766]574cym      SAVE run_off_lic_0
[524]575cKE43
576c Variables liees a la convection de K. Emanuel (sb):
577c
578      REAL bas, top             ! cloud base and top levels
579      SAVE bas
580      SAVE top
[766]581c$OMP THREADPRIVATE(bas, top)
[524]582
583      REAL wdn(klon), tdn(klon), qdn(klon)
[879]584c
585c=================================================================================================
586cCR04.12.07: on ajoute les nouvelles variables du nouveau schema de convection avec poches froides
587c Variables liées à la poche froide (jyg)
588
589      REAL mip(klon,klev)  ! mass flux shed by the adiab ascent at each level
[1340]590      REAL Vprecip(klon,klev+1)   ! precipitation vertical profile
[879]591c
592      REAL wape_prescr, fip_prescr
593      INTEGER it_wape_prescr
594      SAVE wape_prescr, fip_prescr, it_wape_prescr
[987]595c$OMP THREADPRIVATE(wape_prescr, fip_prescr, it_wape_prescr)
[879]596c
597c variables supplementaires de concvl
598      REAL Tconv(klon,klev)
599      REAL ment(klon,klev,klev),sij(klon,klev,klev)
600      REAL dd_t(klon,klev),dd_q(klon,klev)
[970]601
602      real, save :: alp_bl_prescr=0.
603      real, save :: ale_bl_prescr=0.
[979]604
605      real, save :: ale_max=100.
606      real, save :: alp_max=2.
607
[970]608c$OMP THREADPRIVATE(alp_bl_prescr,ale_bl_prescr)
[987]609c$OMP THREADPRIVATE(ale_max,alp_max)
[970]610
[879]611      real ale_wake(klon)
612      real alp_wake(klon)
613cRC
614c Variables liées à la poche froide (jyg et rr)
615c Version diagnostique pour l'instant : pas de rétroaction sur la convection
616
617      REAL t_wake(klon,klev),q_wake(klon,klev) ! wake pour la convection
618
619      REAL wake_dth(klon,klev)        ! wake : temp pot difference
620
621      REAL wake_d_deltat_gw(klon,klev)! wake : delta T tendency due to Gravity Wave (/s)
622      REAL wake_omgbdth(klon,klev)    ! Wake : flux of Delta_Theta transported by LS omega
623      REAL wake_dp_omgb(klon,klev)    ! Wake : vertical gradient of large scale omega
624      REAL wake_dtKE(klon,klev)       ! Wake : differential heating (wake - unpertubed) CONV
625      REAL wake_dqKE(klon,klev)       ! Wake : differential moistening (wake - unpertubed) CONV
626      REAL wake_dtPBL(klon,klev)      ! Wake : differential heating (wake - unpertubed) PBL
627      REAL wake_dqPBL(klon,klev)      ! Wake : differential moistening (wake - unpertubed) PBL
628      REAL wake_omg(klon,klev)        ! Wake : velocity difference (wake - unpertubed)
629      REAL wake_ddeltat(klon,klev),wake_ddeltaq(klon,klev)
630      REAL wake_dp_deltomg(klon,klev) ! Wake : gradient vertical de wake_omg
631      REAL wake_spread(klon,klev)     ! spreading term in wake_delt
[952]632c
[879]633cpourquoi y'a pas de save??
634      REAL wake_h(klon)               ! Wake : hauteur de la poche froide
[952]635c
[879]636      INTEGER wake_k(klon)            ! Wake sommet
637c
638      REAL t_undi(klon,klev)               ! temperature moyenne dans la zone non perturbee
639      REAL q_undi(klon,klev)               ! humidite moyenne dans la zone non perturbee
640c
641      REAL wake_pe(klon)              ! Wake potential energy - WAPE
642
643      REAL wake_gfl(klon)             ! Gust Front Length
644      REAL wake_dens(klon)
645c
646c
647      REAL dt_dwn(klon,klev)
648      REAL dq_dwn(klon,klev)
649      REAL wdt_PBL(klon,klev)
650      REAL udt_PBL(klon,klev)
651      REAL wdq_PBL(klon,klev)
652      REAL udq_PBL(klon,klev)
653      REAL M_dwn(klon,klev)
654      REAL M_up(klon,klev)
655      REAL dt_a(klon,klev)
656      REAL dq_a(klon,klev)
657c
658cRR:fin declarations poches froides
659c=======================================================================================================
660
[1032]661      REAL zw2(klon,klev+1)
662      REAL fraca(klon,klev+1)
663
[524]664c Variables locales pour la couche limite (al1):
665c
666cAl1      REAL pblh(klon)           ! Hauteur de couche limite
667cAl1      SAVE pblh
668c34EK
669c
670c Variables locales:
671c
672      REAL cdragh(klon) ! drag coefficient pour T and Q
673      REAL cdragm(klon) ! drag coefficient pour vent
674cAA
675cAA  Pour phytrac
676cAA
[1067]677      REAL coefh(klon,klev)     ! coef d'echange pour phytrac, valable pour 2<=k<=klev
678      REAL u1(klon)             ! vents dans la premiere couche U
679      REAL v1(klon)             ! vents dans la premiere couche V
[782]680
[766]681      REAL zxffonte(klon), zxfqcalving(klon),zxfqfonte(klon)
[524]682
[766]683c@$$      LOGICAL offline           ! Controle du stockage ds "physique"
684c@$$      PARAMETER (offline=.false.)
685c@$$      INTEGER physid
[524]686      REAL frac_impa(klon,klev) ! fractions d'aerosols lessivees (impaction)
687      REAL frac_nucl(klon,klev) ! idem (nucleation)
[567]688      INTEGER       :: iii
[524]689      REAL          :: calday
690
[644]691cIM cf FH pour Tiedtke 080604
692      REAL rain_tiedtke(klon),snow_tiedtke(klon)
693c
[766]694cIM 050204 END
[524]695      REAL evap(klon), devap(klon) ! evaporation et sa derivee
696      REAL sens(klon), dsens(klon) ! chaleur sensible et sa derivee
[782]697
[524]698      REAL bils(klon) ! bilan de chaleur au sol
[687]699      REAL wfbilo(klon,nbsrf) ! bilan d'eau, pour chaque
700C                             ! type de sous-surface et pondere par la fraction
[524]701      REAL wfbils(klon,nbsrf) ! bilan de chaleur au sol, pour chaque
702C                             ! type de sous-surface et pondere par la fraction
[996]703      REAL slab_wfbils(klon)  ! bilan de chaleur au sol pour le cas de slab, sur les points d'ocean
704
[782]705      REAL fder(klon)         
[524]706      REAL ve(klon) ! integr. verticale du transport meri. de l'energie
707      REAL vq(klon) ! integr. verticale du transport meri. de l'eau
708      REAL ue(klon) ! integr. verticale du transport zonal de l'energie
709      REAL uq(klon) ! integr. verticale du transport zonal de l'eau
710c
[782]711      REAL frugs(klon,nbsrf)
[524]712      REAL zxrugs(klon) ! longueur de rugosite
713c
714c Conditions aux limites
715c
[1279]716!
717      REAL :: day_since_equinox
718! Date de l'equinoxe de printemps
719      INTEGER, parameter :: mth_eq=3, day_eq=21
720      REAL :: jD_eq
721
722      LOGICAL, parameter :: new_orbit = .true.
723
[524]724c
725      INTEGER lmt_pas
726      SAVE lmt_pas                ! frequence de mise a jour
[766]727c$OMP THREADPRIVATE(lmt_pas)
[1279]728      real zmasse(klon, llm)
729C     (column-density of mass of air in a cell, in kg m-2)
730      real, parameter:: dobson_u = 2.1415e-05 ! Dobson unit, in kg m-2
[524]731
[687]732cIM sorties
733      REAL un_jour
734      PARAMETER(un_jour=86400.)
[524]735c======================================================================
736c
737c Declaration des procedures appelees
738c
739      EXTERNAL angle     ! calculer angle zenithal du soleil
740      EXTERNAL alboc     ! calculer l'albedo sur ocean
741      EXTERNAL ajsec     ! ajustement sec
742      EXTERNAL conlmd    ! convection (schema LMD)
743cKE43
744      EXTERNAL conema3  ! convect4.3
745      EXTERNAL fisrtilp  ! schema de condensation a grande echelle (pluie)
746cAA
747      EXTERNAL fisrtilp_tr ! schema de condensation a grande echelle (pluie)
748c                          ! stockage des coefficients necessaires au
749c                          ! lessivage OFF-LINE et ON-LINE
750      EXTERNAL hgardfou  ! verifier les temperatures
751      EXTERNAL nuage     ! calculer les proprietes radiatives
[1279]752CC      EXTERNAL o3cm      ! initialiser l'ozone
[524]753      EXTERNAL orbite    ! calculer l'orbite terrestre
754      EXTERNAL phyetat0  ! lire l'etat initial de la physique
755      EXTERNAL phyredem  ! ecrire l'etat de redemarrage de la physique
[879]756      EXTERNAL suphel    ! initialiser certaines constantes
[524]757      EXTERNAL transp    ! transport total de l'eau et de l'energie
758      EXTERNAL ecribina  ! ecrire le fichier binaire global
759      EXTERNAL ecribins  ! ecrire le fichier binaire global
760      EXTERNAL ecrirega  ! ecrire le fichier binaire regional
761      EXTERNAL ecriregs  ! ecrire le fichier binaire regional
762cIM
763      EXTERNAL haut2bas  !variables de haut en bas
764      INTEGER lnblnk1
765      EXTERNAL lnblnk1   !enleve les blancs a la fin d'une variable de type
766                         !caracter
[644]767      EXTERNAL ini_undefSTD  !initialise a 0 une variable a 1 niveau de pression
768      EXTERNAL undefSTD      !somme les valeurs definies d'1 var a 1 niveau de pression
769c     EXTERNAL moy_undefSTD  !moyenne d'1 var a 1 niveau de pression
770c     EXTERNAL moyglo_aire   !moyenne globale d'1 var ponderee par l'aire de la maille (moyglo_pondaire)
771c                            !par la masse/airetot (moyglo_pondaima) et la vraie masse (moyglo_pondmass)
[524]772c
773c Variables locales
774c
775      REAL rhcl(klon,klev)    ! humiditi relative ciel clair
776      REAL dialiq(klon,klev)  ! eau liquide nuageuse
777      REAL diafra(klon,klev)  ! fraction nuageuse
778      REAL cldliq(klon,klev)  ! eau liquide nuageuse
779      REAL cldfra(klon,klev)  ! fraction nuageuse
780      REAL cldtau(klon,klev)  ! epaisseur optique
781      REAL cldemi(klon,klev)  ! emissivite infrarouge
782c
783CXXX PB
784      REAL fluxq(klon,klev, nbsrf)   ! flux turbulent d'humidite
785      REAL fluxt(klon,klev, nbsrf)   ! flux turbulent de chaleur
786      REAL fluxu(klon,klev, nbsrf)   ! flux turbulent de vitesse u
787      REAL fluxv(klon,klev, nbsrf)   ! flux turbulent de vitesse v
788c
789      REAL zxfluxt(klon, klev)
790      REAL zxfluxq(klon, klev)
791      REAL zxfluxu(klon, klev)
792      REAL zxfluxv(klon, klev)
793CXXX
[952]794c
[524]795      REAL fsollw(klon, nbsrf)   ! bilan flux IR pour chaque sous surface
796      REAL fsolsw(klon, nbsrf)   ! flux solaire absorb. pour chaque sous surface
797c Le rayonnement n'est pas calcule tous les pas, il faut donc
798c                      sauvegarder les sorties du rayonnement
[766]799cym      SAVE  heat,cool,albpla,topsw,toplw,solsw,sollw,sollwdown
800cym      SAVE  sollwdownclr, toplwdown, toplwdownclr
801cym      SAVE  topsw0,toplw0,solsw0,sollw0, heat0, cool0
[524]802c
803      INTEGER itaprad
804      SAVE itaprad
[766]805c$OMP THREADPRIVATE(itaprad)
[524]806c
807      REAL conv_q(klon,klev) ! convergence de l'humidite (kg/kg/s)
808      REAL conv_t(klon,klev) ! convergence de la temperature(K/s)
809c
810      REAL cldl(klon),cldm(klon),cldh(klon) !nuages bas, moyen et haut
811      REAL cldt(klon),cldq(klon) !nuage total, eau liquide integree
812c
813      REAL zxtsol(klon), zxqsurf(klon), zxsnow(klon), zxfluxlat(klon)
[782]814      REAL zxsnow_dummy(klon)
[524]815c
816      REAL dist, rmu0(klon), fract(klon)
817      REAL zdtime, zlongi
818c
819      CHARACTER*2 str2
820      CHARACTER*2 iqn
821c
822      REAL qcheck
823      REAL z_avant(klon), z_apres(klon), z_factor(klon)
824      LOGICAL zx_ajustq
825c
826      REAL za, zb
827      REAL zx_t, zx_qs, zdelta, zcor, zfra, zlvdcp, zlsdcp
828      real zqsat(klon,klev)
[909]829      INTEGER i, k, iq, ig, j, nsrf, ll, l, iiq, iff
[524]830      REAL t_coup
831      PARAMETER (t_coup=234.0)
832c
833      REAL zphi(klon,klev)
[766]834cym A voir plus tard !!
835cym      REAL zx_relief(iim,jjmp1)
836cym      REAL zx_aire(iim,jjmp1)
[644]837c
[782]838c Grandeurs de sorties
[644]839      REAL s_pblh(klon), s_lcl(klon), s_capCL(klon)
840      REAL s_oliqCL(klon), s_cteiCL(klon), s_pblt(klon)
841      REAL s_therm(klon), s_trmb1(klon), s_trmb2(klon)
842      REAL s_trmb3(klon)
[524]843cKE43
844c Variables locales pour la convection de K. Emanuel (sb):
845c
846      REAL upwd(klon,klev)      ! saturated updraft mass flux
847      REAL dnwd(klon,klev)      ! saturated downdraft mass flux
848      REAL dnwd0(klon,klev)     ! unsaturated downdraft mass flux
849      REAL tvp(klon,klev)       ! virtual temp of lifted parcel
850      CHARACTER*40 capemaxcels  !max(CAPE)
851
852      REAL rflag(klon)          ! flag fonctionnement de convect
853      INTEGER iflagctrl(klon)          ! flag fonctionnement de convect
[1334]854
[524]855c -- convect43:
[644]856      INTEGER ntra              ! nb traceurs pour convect4.3
[524]857      REAL pori_con(klon)    ! pressure at the origin level of lifted parcel
858      REAL plcl_con(klon),dtma_con(klon),dtlcl_con(klon)
859      REAL dtvpdt1(klon,klev), dtvpdq1(klon,klev)
860      REAL dplcldt(klon), dplcldr(klon)
861c?     .     condm_con(klon,klev),conda_con(klon,klev),
862c?     .     mr_con(klon,klev),ep_con(klon,klev)
863c?     .    ,sadiab(klon,klev),wadiab(klon,klev)
864c --
865c34EK
866c
867c Variables du changement
868c
869c con: convection
870c lsc: condensation a grande echelle (Large-Scale-Condensation)
871c ajs: ajustement sec
872c eva: evaporation de l'eau liquide nuageuse
873c vdf: couche limite (Vertical DiFfusion)
874      REAL rneb(klon,klev)
[904]875
876! tendance nulles
877      REAL du0(klon,klev),dv0(klon,klev),dq0(klon,klev),dql0(klon,klev)
878
[524]879c
[644]880*********************************************************
881*     declarations
882     
883*********************************************************
884cIM 081204 END
885c
[524]886      REAL pmfu(klon,klev), pmfd(klon,klev)
887      REAL pen_u(klon,klev), pen_d(klon,klev)
888      REAL pde_u(klon,klev), pde_d(klon,klev)
889      INTEGER kcbot(klon), kctop(klon), kdtop(klon)
890      REAL pmflxr(klon,klev+1), pmflxs(klon,klev+1)
891      REAL prfl(klon,klev+1), psfl(klon,klev+1)
892c
[766]893      REAL rain_lsc(klon)
894      REAL snow_lsc(klon)
[524]895c
[766]896      REAL ratqss(klon,klev),ratqsc(klon,klev)
[1279]897      real ratqsbas,ratqshaut,tau_ratqs
898      save ratqsbas,ratqshaut,tau_ratqs
899c$OMP THREADPRIVATE(ratqsbas,ratqshaut,tau_ratqs)
[524]900      real zpt_conv(klon,klev)
901
902c Parametres lies au nouveau schema de nuages (SB, PDF)
903      real fact_cldcon
904      real facttemps
905      logical ok_newmicro
906      save ok_newmicro
[1279]907      real ref_liq(klon,klev), ref_ice(klon,klev)
[766]908c$OMP THREADPRIVATE(ok_newmicro)
[524]909      save fact_cldcon,facttemps
[766]910c$OMP THREADPRIVATE(fact_cldcon,facttemps)
[524]911      real facteur
912
913      integer iflag_cldcon
914      save iflag_cldcon
[766]915c$OMP THREADPRIVATE(iflag_cldcon)
[524]916      logical ptconv(klon,klev)
[644]917cIM cf. AM 081204 BEG
918      logical ptconvth(klon,klev)
919cIM cf. AM 081204 END
[524]920c
921c Variables liees a l'ecriture de la bande histoire physique
922c
[644]923c======================================================================
[524]924c
[644]925cIM cf. AM 081204 BEG
926c   declarations pour sortir sur une sous-region
927      integer imin_ins,imax_ins,jmin_ins,jmax_ins
928      save imin_ins,imax_ins,jmin_ins,jmax_ins
[766]929c$OMP THREADPRIVATE(imin_ins,imax_ins,jmin_ins,jmax_ins)
[644]930c      real lonmin_ins,lonmax_ins,latmin_ins
931c     s  ,latmax_ins
932c     data lonmin_ins,lonmax_ins,latmin_ins
933c    s  ,latmax_ins/
934c valeurs initiales     s   -5.,20.,41.,55./   
935c    s   100.,130.,-20.,20./
936c    s   -180.,180.,-90.,90./
937c======================================================================
938cIM cf. AM 081204 END
939
[524]940c
941      integer itau_w   ! pas de temps ecriture = itap + itau_phy
942c
943c
944c Variables locales pour effectuer les appels en serie
945c
946      REAL zx_rh(klon,klev)
[687]947cIM RH a 2m (la surface)
948      REAL rh2m(klon), qsat2m(klon)
949      REAL tpot(klon), tpote(klon)
950      REAL Lheat
[524]951
952      INTEGER        length
953      PARAMETER    ( length = 100 )
954      REAL tabcntr0( length       )
955c
956      INTEGER ndex2d(iim*jjmp1),ndex3d(iim*jjmp1*klev)
[687]957cIM
958      INTEGER ndex2d1(iwmax)
[644]959c
960cIM AMIP2 BEG
961      REAL moyglo, mountor
962cIM 141004 BEG
963      REAL zustrdr(klon), zvstrdr(klon)
964      REAL zustrli(klon), zvstrli(klon)
965      REAL zustrph(klon), zvstrph(klon)
[1001]966      REAL zustrhi(klon), zvstrhi(klon)
[644]967      REAL aam, torsfc
968cIM 141004 END
969cIM 190504 BEG
970      INTEGER ij, imp1jmp1
971      PARAMETER(imp1jmp1=(iim+1)*jjmp1)
[766]972cym A voir plus tard
[644]973      REAL zx_tmp(imp1jmp1), airedyn(iim+1,jjmp1)
974      REAL padyn(iim+1,jjmp1,klev+1)
975      REAL dudyn(iim+1,jjmp1,klev)
976      REAL rlatdyn(iim+1,jjmp1)
977cIM 190504 END
978      LOGICAL ok_msk
979      REAL msk(klon)
980cIM
981      REAL airetot, pi
[766]982cym A voir plus tard
983cym      REAL zm_wo(jjmp1, klev)
[644]984cIM AMIP2 END
985c
[524]986      REAL zx_tmp_fi2d(klon)      ! variable temporaire grille physique
987      REAL zx_tmp_fi3d(klon,klev) ! variable temporaire pour champs 3D
[1352]988c#ifdef histNMC
[766]989cym   A voir plus tard !!!!
990cym      REAL zx_tmp_NC(iim,jjmp1,nlevSTD)
[694]991      REAL zx_tmp_fiNC(klon,nlevSTD)
[766]992c#endif
[1279]993      REAL(KIND=8) zx_tmp2_fi3d(klon,klev) ! variable temporaire pour champs 3D
[524]994      REAL zx_tmp_2d(iim,jjmp1), zx_tmp_3d(iim,jjmp1,klev)
995      REAL zx_lon(iim,jjmp1), zx_lat(iim,jjmp1)
[1352]996cIM for NMC files
997      REAL missing_val
998      REAL, SAVE :: freq_moyNMC(nout)
999c$OMP THREADPRIVATE(freq_moyNMC)
[524]1000c
[1352]1001      INTEGER nid_day, nid_mth, nid_ins, nid_mthnmc, nid_daynmc
1002      INTEGER nid_hfnmc, nid_day_seri, nid_ctesGCM
1003      SAVE nid_day, nid_mth, nid_ins, nid_mthnmc, nid_daynmc
1004      SAVE nid_hfnmc, nid_day_seri, nid_ctesGCM
1005c$OMP THREADPRIVATE(nid_day, nid_mth, nid_ins)
1006c$OMP THREADPRIVATE(nid_mthnmc, nid_daynmc, nid_hfnmc)
[766]1007c$OMP THREADPRIVATE(nid_day_seri,nid_ctesGCM)
[524]1008c
[644]1009cIM 280405 BEG
1010      INTEGER nid_bilKPins, nid_bilKPave
1011      SAVE nid_bilKPins, nid_bilKPave
[766]1012c$OMP THREADPRIVATE(nid_bilKPins, nid_bilKPave)
[644]1013c
1014      REAL ve_lay(klon,klev) ! transport meri. de l'energie a chaque niveau vert.
1015      REAL vq_lay(klon,klev) ! transport meri. de l'eau a chaque niveau vert.
1016      REAL ue_lay(klon,klev) ! transport zonal de l'energie a chaque niveau vert.
1017      REAL uq_lay(klon,klev) ! transport zonal de l'eau a chaque niveau vert.
1018c
1019cIM 280405 END
1020c
[687]1021      INTEGER nhori, nvert, nvert1, nvert3
1022      REAL zsto, zsto1, zsto2
1023      REAL zstophy, zstorad, zstohf, zstoday, zstomth, zout
1024      REAL zcals(napisccp), zcalh(napisccp), zoutj(napisccp)
1025      REAL zout_isccp(napisccp)
1026      SAVE zcals, zcalh, zoutj, zout_isccp
[766]1027c$OMP THREADPRIVATE(zcals, zcalh, zoutj, zout_isccp)
[687]1028
[524]1029      real zjulian
1030      save zjulian
[766]1031c$OMP THREADPRIVATE(zjulian)
[524]1032
1033      character*20 modname
1034      character*80 abort_message
1035      logical ok_sync
1036      real date0
1037      integer idayref
1038
1039C essai writephys
1040      integer fid_day, fid_mth, fid_ins
1041      parameter (fid_ins = 1, fid_day = 2, fid_mth = 3)
1042      integer prof2d_on, prof3d_on, prof2d_av, prof3d_av
1043      parameter (prof2d_on = 1, prof3d_on = 2,
1044     .           prof2d_av = 3, prof3d_av = 4)
1045      character*30 nom_fichier
1046      character*10 varname
1047      character*40 vartitle
1048      character*20 varunits
1049C     Variables liees au bilan d'energie et d'enthalpi
1050      REAL ztsol(klon)
1051      REAL      h_vcol_tot, h_dair_tot, h_qw_tot, h_ql_tot
1052     $        , h_qs_tot, qw_tot, ql_tot, qs_tot , ec_tot
1053      SAVE      h_vcol_tot, h_dair_tot, h_qw_tot, h_ql_tot
1054     $        , h_qs_tot, qw_tot, ql_tot, qs_tot , ec_tot
[766]1055c$OMP THREADPRIVATE(h_vcol_tot, h_dair_tot, h_qw_tot, h_ql_tot,
1056c$OMP+              h_qs_tot, qw_tot, ql_tot, qs_tot , ec_tot)
[524]1057      REAL      d_h_vcol, d_h_dair, d_qt, d_qw, d_ql, d_qs, d_ec
1058      REAL      d_h_vcol_phy
1059      REAL      fs_bound, fq_bound
1060      SAVE      d_h_vcol_phy
[766]1061c$OMP THREADPRIVATE(d_h_vcol_phy)
[524]1062      REAL      zero_v(klon)
1063      CHARACTER*15 ztit
[766]1064      INTEGER   ip_ebil  ! PRINT level for energy conserv. diag.
1065      SAVE      ip_ebil
1066      DATA      ip_ebil/0/
1067c$OMP THREADPRIVATE(ip_ebil)
1068      INTEGER   if_ebil ! level for energy conserv. dignostics
1069      SAVE      if_ebil
1070c$OMP THREADPRIVATE(if_ebil)
[524]1071c+jld ec_conser
1072      REAL ZRCPD
1073c-jld ec_conser
[782]1074      REAL t2m(klon,nbsrf)  ! temperature a 2m
1075      REAL q2m(klon,nbsrf)  ! humidite a 2m
1076
[524]1077cIM: t2m, q2m, u10m, v10m et t2mincels, t2maxcels
1078      REAL zt2m(klon), zq2m(klon)             !temp., hum. 2m moyenne s/ 1 maille
1079      REAL zu10m(klon), zv10m(klon)           !vents a 10m moyennes s/1 maille
1080      CHARACTER*40 t2mincels, t2maxcels       !t2m min., t2m max
[644]1081      CHARACTER*40 tinst, tave, typeval
[524]1082      REAL cldtaupi(klon,klev)  ! Cloud optical thickness for pre-industrial (pi) aerosols
1083
1084      REAL re(klon, klev)       ! Cloud droplet effective radius
1085      REAL fl(klon, klev)  ! denominator of re
1086
1087      REAL re_top(klon), fl_top(klon) ! CDR at top of liquid water clouds
1088
1089      ! Aerosol optical properties
[1279]1090      CHARACTER*4, DIMENSION(naero_grp) :: rfname
1091      REAL, DIMENSION(klon)          :: aerindex     ! POLDER aerosol index
1092      REAL, DIMENSION(klon,klev)     :: mass_solu_aero    ! total mass concentration for all soluble aerosols[ug/m3]
1093      REAL, DIMENSION(klon,klev)     :: mass_solu_aero_pi ! - " - (pre-industrial value)
1094      INTEGER :: naero ! aerosol species
[959]1095
[524]1096      ! Parameters
1097      LOGICAL ok_ade, ok_aie    ! Apply aerosol (in)direct effects or not
1098      REAL bl95_b0, bl95_b1   ! Parameter in Boucher and Lohmann (1995)
[559]1099      SAVE ok_ade, ok_aie, bl95_b0, bl95_b1
[766]1100c$OMP THREADPRIVATE(ok_ade, ok_aie, bl95_b0, bl95_b1)
[955]1101      LOGICAL, SAVE :: aerosol_couple ! true  : calcul des aerosols dans INCA
1102                                      ! false : lecture des aerosol dans un fichier
1103c$OMP THREADPRIVATE(aerosol_couple)   
[1279]1104      INTEGER, SAVE :: flag_aerosol
1105c$OMP THREADPRIVATE(flag_aerosol)
1106      LOGICAL, SAVE :: new_aod
1107c$OMP THREADPRIVATE(new_aod)
1108   
[524]1109c
1110c Declaration des constantes et des fonctions thermodynamiques
1111c
[766]1112      LOGICAL,SAVE :: first=.true.
1113c$OMP THREADPRIVATE(first)
[1279]1114
1115      integer iunit
1116
1117      integer, save::  read_climoz ! read ozone climatology
1118C     Allowed values are 0, 1 and 2
1119C     0: do not read an ozone climatology
1120C     1: read a single ozone climatology that will be used day and night
1121C     2: read two ozone climatologies, the average day and night
1122C     climatology and the daylight climatology
1123
1124      integer, save:: ncid_climoz ! NetCDF file containing ozone climatologies
1125
1126      real, pointer, save:: press_climoz(:)
1127!     edges of pressure intervals for ozone climatologies, in Pa, in strictly
1128!     ascending order
[1352]1129cIM for NMC files en parallele
1130c$OMP THREADPRIVATE(read_climoz, ncid_climoz, press_climoz)
[1279]1131
1132      integer, save:: co3i = 0
1133!     time index in NetCDF file of current ozone fields
1134c$OMP THREADPRIVATE(co3i)
1135
1136      integer ro3i
1137!     required time index in NetCDF file for the ozone fields, between 1
1138!     and 360
1139
[524]1140#include "YOMCST.h"
1141#include "YOETHF.h"
1142#include "FCTTRE.h"
[687]1143cIM 100106 BEG : pouvoir sortir les ctes de la physique
1144#include "conema3.h"
1145#include "fisrtilp.h"
1146#include "nuage.h"
1147#include "compbl.h"
1148cIM 100106 END : pouvoir sortir les ctes de la physique
1149c
[1279]1150!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1151c Declarations pour Simulateur COSP
1152c============================================================
1153      real :: mr_ozone(klon,klev)
[1352]1154cIM for NMC files
1155      missing_val=nf90_fill_real
[524]1156c======================================================================
[1355]1157! Gestion calendrier : mise a jour du module phys_cal_mod
1158!
1159      CALL phys_cal_update(jD_cur,jH_cur)
1160
1161c======================================================================
[879]1162! Ecriture eventuelle d'un profil verticale en entree de la physique.
1163! Utilise notamment en 1D mais peut etre active egalement en 3D
1164! en imposant la valeur de igout.
1165c======================================================================
[766]1166
[942]1167      if (prt_level.ge.1) then
[950]1168          igout=klon/2+1/klon
[879]1169         write(lunout,*) 'DEBUT DE PHYSIQ !!!!!!!!!!!!!!!!!!!!'
1170         write(lunout,*)
[1279]1171     s 'nlon,klev,nqtot,debut,lafin, jD_cur, jH_cur,pdtphys'
[879]1172         write(lunout,*)
[1279]1173     s  nlon,klev,nqtot,debut,lafin, jD_cur, jH_cur,pdtphys
[879]1174
[1279]1175         write(lunout,*) 'paprs, play, phi, u, v, t'
1176         do k=1,klev
[879]1177            write(lunout,*) paprs(igout,k),pplay(igout,k),pphi(igout,k),
[1279]1178     s   u(igout,k),v(igout,k),t(igout,k)
[879]1179         enddo
1180         write(lunout,*) 'ovap (g/kg),  oliq (g/kg)'
[1279]1181         do k=1,klev
[879]1182            write(lunout,*) qx(igout,k,1)*1000,qx(igout,k,2)*1000.
1183         enddo
1184      endif
1185
1186c======================================================================
1187
[766]1188cym => necessaire pour iflag_con != 2   
1189      pmfd(:,:) = 0.
1190      pen_u(:,:) = 0.
1191      pen_d(:,:) = 0.
1192      pde_d(:,:) = 0.
1193      pde_u(:,:) = 0.
1194      aam=0.
[1032]1195
[766]1196      torsfc=0.
[1279]1197      forall (k=1: llm) zmasse(:, k) = (paprs(:, k)-paprs(:, k+1)) / rg
[766]1198
1199      if (first) then
1200     
[879]1201cCR:nvelles variables convection/poches froides
[766]1202     
[909]1203      print*, '================================================='
1204      print*, 'Allocation des variables locales et sauvegardees'
1205      call phys_local_var_init
[1352]1206c
1207      pasphys=pdtphys
[1279]1208c     appel a la lecture du run.def physique
1209      call conf_phys(ok_journe, ok_mensuel,
1210     .     ok_instan, ok_hf,
1211     .     ok_LES,
1212     .     solarlong0,seuil_inversion,
1213     .     fact_cldcon, facttemps,ok_newmicro,iflag_radia,
1214     .     iflag_cldcon,iflag_ratqs,ratqsbas,ratqshaut,tau_ratqs,
1215     .     ok_ade, ok_aie, aerosol_couple,
1216     .     flag_aerosol, new_aod,
1217     .     bl95_b0, bl95_b1,
1218     .     iflag_thermals,nsplit_thermals,tau_thermals,
1219     .     iflag_thermals_ed,iflag_thermals_optflux,
1220c     nv flags pour la convection et les poches froides
1221     .     iflag_coupl,iflag_clos,iflag_wake, read_climoz)
1222      call phys_state_var_init(read_climoz)
[1334]1223      call phys_output_var_init
[909]1224      print*, '================================================='
[1352]1225cIM for NMC files
1226cIM freq_moyNMC = frequences auxquelles on moyenne les champs accumules
1227cIM               sur les niveaux de pression standard du NMC
1228      DO n=1, nout
1229       freq_moyNMC(n)=freq_outNMC(n)/freq_calNMC(n)
1230      ENDDO
1231c
[973]1232cIM beg
1233          dnwd0=0.0
1234          ftd=0.0
1235          fqd=0.0
1236          cin=0.
[766]1237cym Attention pbase pas initialise dans concvl !!!!
[973]1238          pbase=0
1239          paire_ter(:)=0.   
1240cIM 180608
1241c         pmflxr=0.
1242c         pmflxs=0.
[1334]1243          itau_con=0
[766]1244        first=.false.
1245
[1279]1246      endif  ! first
[904]1247
[766]1248       modname = 'physiq'
[687]1249cIM
1250      IF (ip_ebil_phy.ge.1) THEN
[524]1251        DO i=1,klon
1252          zero_v(i)=0.
1253        END DO
1254      END IF
1255      ok_sync=.TRUE.
[1146]1256
[524]1257      IF (debut) THEN
[879]1258         CALL suphel ! initialiser constantes et parametres phys.
[644]1259      ENDIF
1260
[942]1261      if(prt_level.ge.1) print*,'CONVERGENCE PHYSIQUE THERM 1 '
[644]1262
[878]1263
[524]1264c======================================================================
[1279]1265! Gestion calendrier : mise a jour du module phys_cal_mod
1266!
[1355]1267cIM     CALL phys_cal_update(jD_cur,jH_cur)
[1279]1268
[524]1269c
1270c Si c'est le debut, il faut initialiser plusieurs choses
1271c          ********
1272c
1273       IF (debut) THEN
[645]1274!rv
[879]1275cCRinitialisation de wght_th et lalim_conv pour la definition de la couche alimentation
1276cde la convection a partir des caracteristiques du thermique
1277         wght_th(:,:)=1.
1278         lalim_conv(:)=1
1279cRC
[645]1280         u10m(:,:)=0.
1281         v10m(:,:)=0.
1282         rain_con(:)=0.
1283         snow_con(:)=0.
1284         topswai(:)=0.
1285         topswad(:)=0.
1286         solswai(:)=0.
1287         solswad(:)=0.
[959]1288
[1032]1289         lambda_th(:,:)=0.
1290         wmax_th(:)=0.
1291         tau_overturning_th(:)=0.
[1279]1292
[959]1293         IF (config_inca /= 'none') THEN
[1279]1294            ! jg : initialisation jusqu'au ces variables sont dans restart
1295            ccm(:,:,:) = 0.
1296            tau_aero(:,:,:,:) = 0.
1297            piz_aero(:,:,:,:) = 0.
1298            cg_aero(:,:,:,:) = 0.
[959]1299         END IF
1300
[645]1301         rnebcon0(:,:) = 0.0
1302         clwcon0(:,:) = 0.0
1303         rnebcon(:,:) = 0.0
1304         clwcon(:,:) = 0.0
1305
[687]1306cIM     
1307         IF (ip_ebil_phy.ge.1) d_h_vcol_phy=0.
[524]1308c
[879]1309      print*,'iflag_coupl,iflag_clos,iflag_wake',
1310     .   iflag_coupl,iflag_clos,iflag_wake
[956]1311      print*,'CYCLE_DIURNE', cycle_diurne
[524]1312c
[1037]1313      IF (iflag_con.EQ.2.AND.iflag_cldcon.GT.-1) THEN
1314         abort_message = 'Tiedtke needs iflag_cldcon=-2 or -1'
[1035]1315         CALL abort_gcm (modname,abort_message,1)
1316      ENDIF
[524]1317c
[1035]1318      IF(ok_isccp.AND.iflag_con.LE.2) THEN
[1043]1319         abort_message = 'ISCCP-like outputs may be available for KE
1320     .(iflag_con >= 3); for Tiedtke (iflag_con=-2) put ok_isccp=n'
[1035]1321         CALL abort_gcm (modname,abort_message,1)
1322      ENDIF
1323c
[524]1324c Initialiser les compteurs:
1325c
1326         itap    = 0
1327         itaprad = 0
[782]1328
[878]1329!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1330!! Un petit travail à faire ici.
1331!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1332
1333         if (iflag_pbl>1) then
1334             PRINT*, "Using method MELLOR&YAMADA"
1335         endif
1336
[956]1337!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1338! FH 2008/05/02 changement lie a la lecture de nbapp_rad dans phylmd plutot que
1339! dyn3d
1340! Attention : la version precedente n'etait pas tres propre.
1341! Il se peut qu'il faille prendre une valeur differente de nbapp_rad
1342! pour obtenir le meme resultat.
1343         dtime=pdtphys
1344         radpas = NINT( 86400./dtime/nbapp_rad)
1345!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1346
[996]1347         CALL phyetat0 ("startphy.nc",clesphy0,tabcntr0)
[973]1348cIM begin
1349          print*,'physiq: clwcon rnebcon ratqs',clwcon(1,1),rnebcon(1,1)
1350     $,ratqs(1,1)
1351cIM end
[524]1352
[878]1353
1354
1355!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
[524]1356c
1357C on remet le calendrier a zero
1358c
1359         IF (raz_date .eq. 1) THEN
1360           itau_phy = 0
1361         ENDIF
1362
[644]1363cIM cf. AM 081204 BEG
1364         PRINT*,'cycle_diurne3 =',cycle_diurne
1365cIM cf. AM 081204 END
[524]1366c
[782]1367         CALL printflag( tabcntr0,radpas,ok_journe,
[524]1368     ,                    ok_instan, ok_region )
1369c
1370         IF (ABS(dtime-pdtphys).GT.0.001) THEN
1371            WRITE(lunout,*) 'Pas physique n est pas correct',dtime,
1372     .                        pdtphys
1373            abort_message='Pas physique n est pas correct '
[878]1374!           call abort_gcm(modname,abort_message,1)
1375            dtime=pdtphys
[524]1376         ENDIF
1377         IF (nlon .NE. klon) THEN
1378            WRITE(lunout,*)'nlon et klon ne sont pas coherents', nlon,
1379     .                      klon
1380            abort_message='nlon et klon ne sont pas coherents'
1381            call abort_gcm(modname,abort_message,1)
1382         ENDIF
1383         IF (nlev .NE. klev) THEN
1384            WRITE(lunout,*)'nlev et klev ne sont pas coherents', nlev,
1385     .                       klev
1386            abort_message='nlev et klev ne sont pas coherents'
1387            call abort_gcm(modname,abort_message,1)
1388         ENDIF
1389c
1390         IF (dtime*FLOAT(radpas).GT.21600..AND.cycle_diurne) THEN
1391           WRITE(lunout,*)'Nbre d appels au rayonnement insuffisant'
1392           WRITE(lunout,*)"Au minimum 4 appels par jour si cycle diurne"
1393           abort_message='Nbre d appels au rayonnement insuffisant'
1394           call abort_gcm(modname,abort_message,1)
1395         ENDIF
1396         WRITE(lunout,*)"Clef pour la convection, iflag_con=", iflag_con
1397         WRITE(lunout,*)"Clef pour le driver de la convection, ok_cvl=",
1398     .                   ok_cvl
1399c
1400cKE43
1401c Initialisation pour la convection de K.E. (sb):
1402         IF (iflag_con.GE.3) THEN
1403
1404         WRITE(lunout,*)"*** Convection de Kerry Emanuel 4.3  "
[687]1405         WRITE(lunout,*)
1406     .      "On va utiliser le melange convectif des traceurs qui"
1407         WRITE(lunout,*)"est calcule dans convect4.3"
1408         WRITE(lunout,*)" !!! penser aux logical flags de phytrac"
[524]1409
1410          DO i = 1, klon
1411           ema_cbmf(i) = 0.
1412           ema_pcb(i)  = 0.
1413           ema_pct(i)  = 0.
1414           ema_workcbmf(i) = 0.
1415          ENDDO
1416cIM15/11/02 rajout initialisation ibas_con,itop_con cf. SB =>BEG
1417          DO i = 1, klon
1418           ibas_con(i) = 1
[619]1419           itop_con(i) = 1
[524]1420          ENDDO
1421cIM15/11/02 rajout initialisation ibas_con,itop_con cf. SB =>END
[879]1422c===============================================================================
1423cCR:04.12.07: initialisations poches froides
1424c Controle de ALE et ALP pour la fermeture convective (jyg)
1425          if (iflag_wake.eq.1) then
1426            CALL ini_wake(0.,0.,it_wape_prescr,wape_prescr,fip_prescr
1427     s                  ,alp_bl_prescr, ale_bl_prescr)
1428c 11/09/06 rajout initialisation ALE et ALP du wake et PBL(YU)
1429c        print*,'apres ini_wake iflag_cldcon=', iflag_cldcon
1430          endif
[524]1431
[879]1432        do i = 1,klon
[973]1433         Ale_bl(i)=0.
1434         Alp_bl(i)=0.
[879]1435        enddo
[973]1436
[879]1437c================================================================================
1438
[524]1439         ENDIF
1440
[1279]1441           DO i=1,klon
1442             rugoro(i) = f_rugoro * MAX(1.0e-05, zstd(i)*zsig(i)/2.0)
1443           ENDDO
1444
[524]1445c34EK
1446         IF (ok_orodr) THEN
[878]1447
1448!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1449! FH sans doute a enlever de finitivement ou, si on le garde, l'activer
1450! justement quand ok_orodr = false.
1451! ce rugoro est utilise par la couche limite et fait double emploi
1452! avec les paramétrisations spécifiques de Francois Lott.
1453!           DO i=1,klon
1454!             rugoro(i) = MAX(1.0e-05, zstd(i)*zsig(i)/2.0)
1455!           ENDDO
1456!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
[1001]1457           IF (ok_strato) THEN
1458             CALL SUGWD_strato(klon,klev,paprs,pplay)
1459           ELSE
1460             CALL SUGWD(klon,klev,paprs,pplay)
1461           ENDIF
1462           
[782]1463           DO i=1,klon
1464             zuthe(i)=0.
1465             zvthe(i)=0.
1466             if(zstd(i).gt.10.)then
1467               zuthe(i)=(1.-zgam(i))*cos(zthe(i))
1468               zvthe(i)=(1.-zgam(i))*sin(zthe(i))
1469             endif
1470           ENDDO
[524]1471         ENDIF
1472c
1473c
1474         lmt_pas = NINT(86400./dtime * 1.0)   ! tous les jours
1475         WRITE(lunout,*)'La frequence de lecture surface est de ',
1476     .                   lmt_pas
1477c
[687]1478cIM 030306 END
[782]1479
[524]1480      capemaxcels = 't_max(X)'
1481      t2mincels = 't_min(X)'
1482      t2maxcels = 't_max(X)'
[644]1483      tinst = 'inst(X)'
1484      tave = 'ave(X)'
1485cIM cf. AM 081204 BEG
1486      write(lunout,*)'AVANT HIST IFLAG_CON=',iflag_con
1487cIM cf. AM 081204 END
[524]1488c
1489c=============================================================
1490c   Initialisation des sorties
1491c=============================================================
1492
1493#ifdef CPP_IOIPSL
1494
[987]1495c$OMP MASTER
[1146]1496       call phys_output_open(jjmp1,nlevSTD,clevSTD,nbteta,
[1279]1497     &                        ctetaSTD,dtime,ok_veget,
[996]1498     &                        type_ocean,iflag_pbl,ok_mensuel,ok_journe,
[1279]1499     &                        ok_hf,ok_instan,ok_LES,ok_ade,ok_aie,
1500     &                        read_climoz, new_aod, aerosol_couple)
[987]1501c$OMP END MASTER
1502c$OMP BARRIER
[909]1503
[524]1504#ifdef histISCCP
1505#include "ini_histISCCP.h"
1506#endif
1507
[1352]1508#ifdef histNMC
1509#include "ini_histhfNMC.h"
1510#include "ini_histdayNMC.h"
[524]1511#include "ini_histmthNMC.h"
1512#endif
1513
[687]1514#include "ini_histday_seri.h"
[524]1515
[687]1516#include "ini_paramLMDZ_phy.h"
[524]1517
[644]1518#endif
1519
[1279]1520cIM 250308bad guide        ecrit_hf2mth = 30*1/ecrit_hf
1521         ecrit_hf2mth = ecrit_mth/ecrit_hf
1522
1523         ecrit_hf = ecrit_hf * un_jour
[1352]1524cIM
[1279]1525         IF(ecrit_day.LE.1.) THEN
1526          ecrit_day = ecrit_day * un_jour !en secondes
1527         ENDIF
[1352]1528cIM
[1279]1529         ecrit_mth = ecrit_mth * un_jour
1530         ecrit_ins = ecrit_ins * un_jour
1531         ecrit_reg = ecrit_reg * un_jour
1532         ecrit_tra = ecrit_tra * un_jour
1533         ecrit_ISCCP = ecrit_ISCCP * un_jour
1534         ecrit_LES = ecrit_LES * un_jour
1535c
1536         PRINT*,'physiq ecrit_ hf day mth reg tra ISCCP hf2mth',
1537     .   ecrit_hf,ecrit_day,ecrit_mth,ecrit_reg,ecrit_tra,ecrit_ISCCP,
1538     .   ecrit_hf2mth
1539cIM 030306 END
1540
1541
[524]1542cXXXPB Positionner date0 pour initialisation de ORCHIDEE
[1279]1543      date0 = jD_ref
[524]1544      WRITE(*,*) 'physiq date0 : ',date0
1545c
1546c
1547c
1548c Prescrire l'ozone dans l'atmosphere
1549c
1550c
1551cc         DO i = 1, klon
1552cc         DO k = 1, klev
1553cc            CALL o3cm (paprs(i,k)/100.,paprs(i,k+1)/100., wo(i,k),20)
1554cc         ENDDO
1555cc         ENDDO
1556c
[959]1557      IF (config_inca /= 'none') THEN
[524]1558#ifdef INCA
[959]1559         CALL VTe(VTphysiq)
1560         CALL VTb(VTinca)
[1279]1561!         iii = MOD(NINT(xjour),360)
1562!         calday = FLOAT(iii) + jH_cur
1563         calday = FLOAT(days_elapsed) + jH_cur
1564         WRITE(lunout,*) 'initial time chemini', days_elapsed, calday
[959]1565
1566         CALL chemini(
[524]1567     $                   rg,
1568     $                   ra,
1569     $                   airephy,
1570     $                   rlat,
1571     $                   rlon,
1572     $                   presnivs,
1573     $                   calday,
1574     $                   klon,
[1146]1575     $                   nqtot,
[524]1576     $                   pdtphys,
[567]1577     $                   annee_ref,
[1279]1578     $                   day_ref,
1579     $                   itau_phy)
[959]1580
1581         CALL VTe(VTinca)
1582         CALL VTb(VTphysiq)
[524]1583#endif
[959]1584      END IF
[524]1585c
[998]1586c
1587!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1588! Nouvelle initialisation pour le rayonnement RRTM
1589!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1590
1591      call iniradia(klon,klev,paprs(1,1:klev+1))
1592
[1279]1593C$omp single
1594      if (read_climoz >= 1) then
1595         call open_climoz(ncid_climoz, press_climoz)
1596      END IF
1597C$omp end single
[524]1598      ENDIF
[996]1599!
1600!   ****************     Fin  de   IF ( debut  )   ***************
1601!
1602!
1603! Incrementer le compteur de la physique
1604!
1605      itap   = itap + 1
1606!
1607! Update fraction of the sub-surfaces (pctsrf) and
1608! initialize, where a new fraction has appeared, all variables depending
1609! on the surface fraction.
1610!
[1279]1611      CALL change_srf_frac(itap, dtime, days_elapsed+1,
[996]1612     *     pctsrf, falb1, falb2, ftsol, u10m, v10m, pbl_tke)
1613
[904]1614! Tendances bidons pour les processus qui n'affectent pas certaines
1615! variables.
1616      du0(:,:)=0.
1617      dv0(:,:)=0.
1618      dq0(:,:)=0.
1619      dql0(:,:)=0.
[524]1620c
1621c Mettre a zero des variables de sortie (pour securite)
1622c
1623      DO i = 1, klon
1624         d_ps(i) = 0.0
1625      ENDDO
1626      DO k = 1, klev
1627      DO i = 1, klon
1628         d_t(i,k) = 0.0
1629         d_u(i,k) = 0.0
1630         d_v(i,k) = 0.0
1631      ENDDO
1632      ENDDO
[1146]1633      DO iq = 1, nqtot
[524]1634      DO k = 1, klev
1635      DO i = 1, klon
1636         d_qx(i,k,iq) = 0.0
1637      ENDDO
1638      ENDDO
1639      ENDDO
[660]1640      da(:,:)=0.
1641      mp(:,:)=0.
1642      phi(:,:,:)=0.
[524]1643c
1644c Ne pas affecter les valeurs entrees de u, v, h, et q
1645c
1646      DO k = 1, klev
1647      DO i = 1, klon
1648         t_seri(i,k)  = t(i,k)
1649         u_seri(i,k)  = u(i,k)
1650         v_seri(i,k)  = v(i,k)
1651         q_seri(i,k)  = qx(i,k,ivap)
1652         ql_seri(i,k) = qx(i,k,iliq)
1653         qs_seri(i,k) = 0.
1654      ENDDO
1655      ENDDO
[1146]1656      IF (nqtot.GE.3) THEN
1657      DO iq = 3, nqtot
[524]1658      DO  k = 1, klev
1659      DO  i = 1, klon
1660         tr_seri(i,k,iq-2) = qx(i,k,iq)
1661      ENDDO
1662      ENDDO
1663      ENDDO
1664      ELSE
1665      DO k = 1, klev
1666      DO i = 1, klon
1667         tr_seri(i,k,1) = 0.0
1668      ENDDO
1669      ENDDO
1670      ENDIF
1671C
1672      DO i = 1, klon
1673        ztsol(i) = 0.
1674      ENDDO
1675      DO nsrf = 1, nbsrf
1676        DO i = 1, klon
1677          ztsol(i) = ztsol(i) + ftsol(i,nsrf)*pctsrf(i,nsrf)
1678        ENDDO
1679      ENDDO
[687]1680cIM
1681      IF (ip_ebil_phy.ge.1) THEN
[524]1682        ztit='after dynamic'
[687]1683        CALL diagetpq(airephy,ztit,ip_ebil_phy,1,1,dtime
[524]1684     e      , t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,paprs,pplay
1685     s      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
1686C     Comme les tendances de la physique sont ajoute dans la dynamique,
1687C     on devrait avoir que la variation d'entalpie par la dynamique
1688C     est egale a la variation de la physique au pas de temps precedent.
1689C     Donc la somme de ces 2 variations devrait etre nulle.
[687]1690        call diagphy(airephy,ztit,ip_ebil_phy
[524]1691     e      , zero_v, zero_v, zero_v, zero_v, zero_v
1692     e      , zero_v, zero_v, zero_v, ztsol
1693     e      , d_h_vcol+d_h_vcol_phy, d_qt, 0.
1694     s      , fs_bound, fq_bound )
1695      END IF
1696
1697c Diagnostiquer la tendance dynamique
1698c
1699      IF (ancien_ok) THEN
1700         DO k = 1, klev
1701         DO i = 1, klon
[1054]1702            d_u_dyn(i,k) = (u_seri(i,k)-u_ancien(i,k))/dtime
1703            d_v_dyn(i,k) = (v_seri(i,k)-v_ancien(i,k))/dtime
[524]1704            d_t_dyn(i,k) = (t_seri(i,k)-t_ancien(i,k))/dtime
1705            d_q_dyn(i,k) = (q_seri(i,k)-q_ancien(i,k))/dtime
1706         ENDDO
1707         ENDDO
1708      ELSE
1709         DO k = 1, klev
1710         DO i = 1, klon
[1054]1711            d_u_dyn(i,k) = 0.0
1712            d_v_dyn(i,k) = 0.0
[524]1713            d_t_dyn(i,k) = 0.0
1714            d_q_dyn(i,k) = 0.0
1715         ENDDO
1716         ENDDO
1717         ancien_ok = .TRUE.
1718      ENDIF
1719c
1720c Ajouter le geopotentiel du sol:
1721c
1722      DO k = 1, klev
1723      DO i = 1, klon
1724         zphi(i,k) = pphi(i,k) + pphis(i)
1725      ENDDO
1726      ENDDO
1727c
1728c Verifier les temperatures
1729c
[687]1730cIM BEG
1731      IF (check) THEN
1732       amn=MIN(ftsol(1,is_ter),1000.)
1733       amx=MAX(ftsol(1,is_ter),-1000.)
1734       DO i=2, klon
1735        amn=MIN(ftsol(i,is_ter),amn)
1736        amx=MAX(ftsol(i,is_ter),amx)
1737       ENDDO
1738c
1739       PRINT*,' debut avant hgardfou min max ftsol',itap,amn,amx
1740      ENDIF !(check) THEN
1741cIM END
1742c
[524]1743      CALL hgardfou(t_seri,ftsol,'debutphy')
1744c
[687]1745cIM BEG
1746      IF (check) THEN
1747       amn=MIN(ftsol(1,is_ter),1000.)
1748       amx=MAX(ftsol(1,is_ter),-1000.)
1749       DO i=2, klon
1750        amn=MIN(ftsol(i,is_ter),amn)
1751        amx=MAX(ftsol(i,is_ter),amx)
1752       ENDDO
1753c
1754       PRINT*,' debut apres hgardfou min max ftsol',itap,amn,amx
1755      ENDIF !(check) THEN
1756cIM END
1757c
[524]1758c Mettre en action les conditions aux limites (albedo, sst, etc.).
1759c Prescrire l'ozone et calculer l'albedo sur l'ocean.
1760c
[1279]1761      if (read_climoz >= 1) then
1762C        Ozone from a file
1763!        Update required ozone index:
1764         ro3i = int((days_elapsed + jh_cur - jh_1jan)
1765     $        / ioget_year_len(year_cur) * 360.) + 1
1766         if (ro3i == 361) ro3i = 360
1767C        (This should never occur, except perhaps because of roundup
1768C        error. See documentation.)
1769         if (ro3i /= co3i) then
1770C           Update ozone field:
1771            if (read_climoz == 1) then
1772               call regr_pr_av(ncid_climoz, (/"tro3"/), julien=ro3i,
1773     $              press_in_edg=press_climoz, paprs=paprs, v3=wo)
1774            else
1775C              read_climoz == 2
1776               call regr_pr_av(ncid_climoz,
1777     $              (/"tro3         ", "tro3_daylight"/),
1778     $              julien=ro3i, press_in_edg=press_climoz, paprs=paprs,
1779     $              v3=wo)
1780            end if
1781!           Convert from mole fraction of ozone to column density of ozone in a
1782!           cell, in kDU:
1783            forall (l = 1: read_climoz) wo(:, :, l) = wo(:, :, l)
1784     $           * rmo3 / rmd * zmasse / dobson_u / 1e3
1785C           (By regridding ozone values for LMDZ only once every 360th of
1786C           year, we have already neglected the variation of pressure in one
1787C           360th of year. So do not recompute "wo" at each time step even if
1788C           "zmasse" changes a little.)
1789            co3i = ro3i
1790         end if
1791      elseif (MOD(itap-1,lmt_pas) == 0) THEN
1792C        Once per day, update ozone from Royer:
1793         wo(:, :, 1) = ozonecm(rlat, paprs, rjour=real(days_elapsed+1))
[524]1794      ENDIF
1795c
1796c Re-evaporer l'eau liquide nuageuse
1797c
1798      DO k = 1, klev  ! re-evaporation de l'eau liquide nuageuse
1799      DO i = 1, klon
1800         zlvdcp=RLVTT/RCPD/(1.0+RVTMP2*q_seri(i,k))
1801c        zlsdcp=RLSTT/RCPD/(1.0+RVTMP2*q_seri(i,k))
1802         zlsdcp=RLVTT/RCPD/(1.0+RVTMP2*q_seri(i,k))
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      ENDDO
1813      ENDDO
[687]1814cIM
1815      IF (ip_ebil_phy.ge.2) THEN
[524]1816        ztit='after reevap'
[687]1817        CALL diagetpq(airephy,ztit,ip_ebil_phy,2,1,dtime
[524]1818     e      , t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,paprs,pplay
1819     s      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
[687]1820         call diagphy(airephy,ztit,ip_ebil_phy
[524]1821     e      , zero_v, zero_v, zero_v, zero_v, zero_v
1822     e      , zero_v, zero_v, zero_v, ztsol
1823     e      , d_h_vcol, d_qt, d_ec
1824     s      , fs_bound, fq_bound )
1825C
1826      END IF
[782]1827
[524]1828c
[883]1829c=========================================================================
1830! Calculs de l'orbite.
1831! Necessaires pour le rayonnement et la surface (calcul de l'albedo).
1832! doit donc etre placé avant radlwsw et pbl_surface
1833
[1279]1834! calcul selon la routine utilisee pour les planetes
1835      if (new_orbit) then
1836        call ymds2ju(year_cur, mth_eq, day_eq,0., jD_eq)
1837        day_since_equinox = (jD_cur + jH_cur) - jD_eq
1838!        day_since_equinox = (jD_cur) - jD_eq
1839        call solarlong(day_since_equinox, zlongi, dist)
1840      else     
1841! calcul selon la routine utilisee pour l'AR4
[883]1842!   choix entre calcul de la longitude solaire vraie ou valeur fixee a
1843!   solarlong0
[1279]1844        if (solarlong0<-999.) then
1845           CALL orbite(FLOAT(days_elapsed+1),zlongi,dist)
1846        else
1847           zlongi=solarlong0  ! longitude solaire vraie
1848           dist=1.            ! distance au soleil / moyenne
1849        endif
[883]1850      endif
[1279]1851      if(prt_level.ge.1)                                                &
1852     &    write(lunout,*)'Longitude solaire ',zlongi,solarlong0,dist
[883]1853
1854!  Avec ou sans cycle diurne
[524]1855      IF (cycle_diurne) THEN
1856        zdtime=dtime*FLOAT(radpas) ! pas de temps du rayonnement (s)
[1279]1857        CALL zenang(zlongi,jH_cur,zdtime,rlat,rlon,rmu0,fract)
[524]1858      ELSE
[1068]1859        CALL angle(zlongi, rlat, fract, rmu0)
[524]1860      ENDIF
1861
[766]1862      if (mydebug) then
1863        call writefield_phy('u_seri',u_seri,llm)
1864        call writefield_phy('v_seri',v_seri,llm)
1865        call writefield_phy('t_seri',t_seri,llm)
1866        call writefield_phy('q_seri',q_seri,llm)
1867      endif
[782]1868
1869ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1870c Appel au pbl_surface : Planetary Boudary Layer et Surface
1871c Cela implique tous les interactions des sous-surfaces et la partie diffusion
1872c turbulent du couche limit.
1873c
1874c Certains varibales de sorties de pbl_surface sont utiliser que pour
1875c ecriture des fihiers hist_XXXX.nc, ces sont :
1876c   qsol,      zq2m,      s_pblh,  s_lcl,
1877c   s_capCL,   s_oliqCL,  s_cteiCL,s_pblT,
1878c   s_therm,   s_trmb1,   s_trmb2, s_trmb3,
1879c   zxrugs,    zu10m,     zv10m,   fder,
1880c   zxqsurf,   rh2m,      zxfluxu, zxfluxv,
1881c   frugs,     agesno,    fsollw,  fsolsw,
1882c   d_ts,      fevap,     fluxlat, t2m,
1883c   wfbils,    wfbilo,    fluxt,   fluxu, fluxv,
[687]1884c
[782]1885c Certains ne sont pas utiliser du tout :
1886c   dsens, devap, zxsnow, zxfluxt, zxfluxq, q2m, fluxq
[687]1887c
[883]1888
[782]1889      CALL pbl_surface(
[1279]1890     e     dtime,     date0,     itap,    days_elapsed+1,
[782]1891     e     debut,     lafin,
1892     e     rlon,      rlat,      rugoro,  rmu0,     
1893     e     rain_fall, snow_fall, solsw,   sollw,   
1894     e     t_seri,    q_seri,    u_seri,  v_seri,   
1895     e     pplay,     paprs,     pctsrf,           
[888]1896     +     ftsol,     falb1,     falb2,   u10m,   v10m,
[1067]1897     s     sollwdown, cdragh,    cdragm,  u1,    v1,
[888]1898     s     albsol1,   albsol2,   sens,    evap, 
[782]1899     s     zxtsol,    zxfluxlat, zt2m,    qsat2m,
1900     s     d_t_vdf,   d_q_vdf,   d_u_vdf, d_v_vdf,
[1067]1901     s     coefh,     slab_wfbils,               
[782]1902     d     qsol,      zq2m,      s_pblh,  s_lcl,
1903     d     s_capCL,   s_oliqCL,  s_cteiCL,s_pblT,
1904     d     s_therm,   s_trmb1,   s_trmb2, s_trmb3,
1905     d     zxrugs,    zu10m,     zv10m,   fder,
1906     d     zxqsurf,   rh2m,      zxfluxu, zxfluxv,
1907     d     frugs,     agesno,    fsollw,  fsolsw,
1908     d     d_ts,      fevap,     fluxlat, t2m,
1909     d     wfbils,    wfbilo,    fluxt,   fluxu,  fluxv,
1910     -     dsens,     devap,     zxsnow,
[878]1911     -     zxfluxt,   zxfluxq,   q2m,     fluxq, pbl_tke )
[996]1912
[1067]1913
[904]1914!-----------------------------------------------------------------------------------------
1915! ajout des tendances de la diffusion turbulente
1916      CALL add_phys_tend(d_u_vdf,d_v_vdf,d_t_vdf,d_q_vdf,dql0,'vdf')
1917!-----------------------------------------------------------------------------------------
[766]1918
1919      if (mydebug) then
1920        call writefield_phy('u_seri',u_seri,llm)
1921        call writefield_phy('v_seri',v_seri,llm)
1922        call writefield_phy('t_seri',t_seri,llm)
1923        call writefield_phy('q_seri',q_seri,llm)
1924      endif
1925
1926
[687]1927      IF (ip_ebil_phy.ge.2) THEN
[782]1928        ztit='after surface_main'
[687]1929        CALL diagetpq(airephy,ztit,ip_ebil_phy,2,2,dtime
[524]1930     e      , t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,paprs,pplay
1931     s      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
[687]1932         call diagphy(airephy,ztit,ip_ebil_phy
[524]1933     e      , zero_v, zero_v, zero_v, zero_v, sens
1934     e      , evap  , zero_v, zero_v, ztsol
1935     e      , d_h_vcol, d_qt, d_ec
1936     s      , fs_bound, fq_bound )
1937      END IF
1938
[881]1939c =================================================================== c
1940c   Calcul de Qsat
1941
1942      DO k = 1, klev
1943      DO i = 1, klon
1944         zx_t = t_seri(i,k)
1945         IF (thermcep) THEN
1946            zdelta = MAX(0.,SIGN(1.,rtt-zx_t))
1947            zx_qs  = r2es * FOEEW(zx_t,zdelta)/pplay(i,k)
1948            zx_qs  = MIN(0.5,zx_qs)
1949            zcor   = 1./(1.-retv*zx_qs)
1950            zx_qs  = zx_qs*zcor
1951         ELSE
1952           IF (zx_t.LT.t_coup) THEN
1953              zx_qs = qsats(zx_t)/pplay(i,k)
1954           ELSE
1955              zx_qs = qsatl(zx_t)/pplay(i,k)
1956           ENDIF
1957         ENDIF
1958         zqsat(i,k)=zx_qs
1959      ENDDO
1960      ENDDO
1961
[942]1962      if (prt_level.ge.1) then
[881]1963      write(lunout,*) 'L   qsat (g/kg) avant clouds_gno'
1964      write(lunout,'(i4,f15.4)') (k,1000.*zqsat(igout,k),k=1,klev)
1965      endif
[524]1966c
1967c Appeler la convection (au choix)
1968c
1969      DO k = 1, klev
1970      DO i = 1, klon
1971         conv_q(i,k) = d_q_dyn(i,k)
1972     .               + d_q_vdf(i,k)/dtime
1973         conv_t(i,k) = d_t_dyn(i,k)
1974     .               + d_t_vdf(i,k)/dtime
1975      ENDDO
1976      ENDDO
1977      IF (check) THEN
1978         za = qcheck(klon,klev,paprs,q_seri,ql_seri,airephy)
1979         WRITE(lunout,*) "avantcon=", za
1980      ENDIF
1981      zx_ajustq = .FALSE.
1982      IF (iflag_con.EQ.2) zx_ajustq=.TRUE.
1983      IF (zx_ajustq) THEN
1984         DO i = 1, klon
1985            z_avant(i) = 0.0
1986         ENDDO
1987         DO k = 1, klev
1988         DO i = 1, klon
1989            z_avant(i) = z_avant(i) + (q_seri(i,k)+ql_seri(i,k))
1990     .                        *(paprs(i,k)-paprs(i,k+1))/RG
1991         ENDDO
1992         ENDDO
1993      ENDIF
[959]1994
1995c Calcule de vitesse verticale a partir de flux de masse verticale
1996      DO k = 1, klev
1997         DO i = 1, klon
1998            omega(i,k) = RG*flxmass_w(i,k) / airephy(i)
1999         END DO
2000      END DO
[1279]2001      if (prt_level.ge.1) write(lunout,*) 'omega(igout, :) = ',
2002     $     omega(igout, :)
[959]2003
[524]2004      IF (iflag_con.EQ.1) THEN
2005          stop'reactiver le call conlmd dans physiq.F'
2006c     CALL conlmd (dtime, paprs, pplay, t_seri, q_seri, conv_q,
2007c    .             d_t_con, d_q_con,
2008c    .             rain_con, snow_con, ibas_con, itop_con)
2009      ELSE IF (iflag_con.EQ.2) THEN
2010      CALL conflx(dtime, paprs, pplay, t_seri, q_seri,
[782]2011     e            conv_t, conv_q, -evap, omega,
[524]2012     s            d_t_con, d_q_con, rain_con, snow_con,
2013     s            pmfu, pmfd, pen_u, pde_u, pen_d, pde_d,
2014     s            kcbot, kctop, kdtop, pmflxr, pmflxs)
[1015]2015      d_u_con = 0.
2016      d_v_con = 0.
2017
[524]2018      WHERE (rain_con < 0.) rain_con = 0.
2019      WHERE (snow_con < 0.) snow_con = 0.
2020      DO i = 1, klon
2021         ibas_con(i) = klev+1 - kcbot(i)
2022         itop_con(i) = klev+1 - kctop(i)
2023      ENDDO
2024      ELSE IF (iflag_con.GE.3) THEN
2025c nb of tracers for the KE convection:
[619]2026c MAF la partie traceurs est faite dans phytrac
2027c on met ntra=1 pour limiter les appels mais on peut
2028c supprimer les calculs / ftra.
2029              ntra = 1
[879]2030
2031c=====================================================================================
2032cajout pour la parametrisation des poches froides:
2033ccalcul de t_wake et t_undi: si pas de poches froides, t_wake=t_undi=t_seri
2034      do k=1,klev
2035            do i=1,klon
2036             if (iflag_wake.eq.1) then
2037             t_wake(i,k) = t_seri(i,k)
2038     .           +(1-wake_s(i))*wake_deltat(i,k)
2039             q_wake(i,k) = q_seri(i,k)
2040     .           +(1-wake_s(i))*wake_deltaq(i,k)
2041             t_undi(i,k) = t_seri(i,k)
2042     .           -wake_s(i)*wake_deltat(i,k)
2043             q_undi(i,k) = q_seri(i,k)
2044     .           -wake_s(i)*wake_deltaq(i,k)
2045             else
2046             t_wake(i,k) = t_seri(i,k)
2047             q_wake(i,k) = q_seri(i,k)
2048             t_undi(i,k) = t_seri(i,k)
2049             q_undi(i,k) = q_seri(i,k)
2050             endif
2051            enddo
2052         enddo
2053     
2054cc--   Calcul de l'energie disponible ALE (J/kg) et de la puissance disponible ALP (W/m2)
2055cc--    pour le soulevement des particules dans le modele convectif
2056c
2057      do i = 1,klon
2058        ALE(i) = 0.
2059        ALP(i) = 0.
2060      enddo
2061c
2062ccalcul de ale_wake et alp_wake
2063       do i = 1,klon
2064          if (iflag_wake.eq.1) then
2065          ale_wake(i) = 0.5*wake_cstar(i)**2
2066          alp_wake(i) = wake_fip(i)
2067          else
2068          ale_wake(i) = 0.
2069          alp_wake(i) = 0.
2070          endif
2071       enddo
2072ccombinaison avec ale et alp de couche limite: constantes si pas de couplage, valeurs calculees
2073cdans le thermique sinon
2074       if (iflag_coupl.eq.0) then
[942]2075          if (debut) print*,'ALE et ALP imposes'
[879]2076          do i = 1,klon
2077con ne couple que ale
2078c           ALE(i) = max(ale_wake(i),Ale_bl(i))
2079            ALE(i) = max(ale_wake(i),ale_bl_prescr)
2080con ne couple que alp
2081c           ALP(i) = alp_wake(i) + Alp_bl(i)
2082            ALP(i) = alp_wake(i) + alp_bl_prescr
2083          enddo
2084       else
[965]2085         IF(prt_level>9)WRITE(lunout,*)'ALE et ALP couples au thermique'
[879]2086          do i = 1,klon
2087              ALE(i) = max(ale_wake(i),Ale_bl(i))
2088              ALP(i) = alp_wake(i) + Alp_bl(i)
2089c         write(20,*)'ALE',ALE(i),Ale_bl(i),ale_wake(i)
2090c         write(21,*)'ALP',ALP(i),Alp_bl(i),alp_wake(i)
2091          enddo
2092       endif
[979]2093       do i=1,klon
2094          if (alp(i)>alp_max) then
[1146]2095             IF(prt_level>9)WRITE(lunout,*)                             &
2096     &       'WARNING SUPER ALP (seuil=',alp_max,
[979]2097     ,       '): i, alp, alp_wake,ale',i,alp(i),alp_wake(i),ale(i)
2098             alp(i)=alp_max
2099          endif
2100          if (ale(i)>ale_max) then
[1146]2101             IF(prt_level>9)WRITE(lunout,*)                             &
2102     &       'WARNING SUPER ALE (seuil=',ale_max,
[979]2103     ,       '): i, alp, alp_wake,ale',i,ale(i),ale_wake(i),alp(i)
2104             ale(i)=ale_max
2105          endif
2106       enddo
[879]2107
2108cfin calcul ale et alp
2109c=================================================================================================
2110
2111
[524]2112c sb, oct02:
2113c Schema de convection modularise et vectorise:
2114c (driver commun aux versions 3 et 4)
2115c
2116          IF (ok_cvl) THEN ! new driver for convectL
2117
[879]2118          CALL concvl (iflag_con,iflag_clos,
2119     .        dtime,paprs,pplay,t_undi,q_undi,
[1146]2120     .        t_wake,q_wake,wake_s,
[879]2121     .        u_seri,v_seri,tr_seri,nbtr,
2122     .        ALE,ALP,
[524]2123     .        ema_work1,ema_work2,
2124     .        d_t_con,d_q_con,d_u_con,d_v_con,d_tr,
[879]2125     .        rain_con, snow_con, ibas_con, itop_con, sigd,
[524]2126     .        upwd,dnwd,dnwd0,
[879]2127     .        Ma,mip,Vprecip,cape,cin,tvp,Tconv,iflagctrl,
[619]2128     .        pbase,bbase,dtvpdt1,dtvpdq1,dplcldt,dplcldr,qcondc,wd,
[879]2129     .        pmflxr,pmflxs,da,phi,mp,
2130     .        ftd,fqd,lalim_conv,wght_th)
[619]2131
[973]2132cIM begin
[1045]2133c       print*,'physiq: cin pbase dnwd0 ftd fqd ',cin(1),pbase(1),
2134c    .dnwd0(1,1),ftd(1,1),fqd(1,1)
[973]2135cIM end
[524]2136cIM cf. FH
2137              clwcon0=qcondc
[619]2138              pmfu(:,:)=upwd(:,:)+dnwd(:,:)
[524]2139
[1334]2140              do i = 1, klon
2141                if (iflagctrl(i).le.1) itau_con(i)=itau_con(i)+1
2142              enddo
2143
[524]2144          ELSE ! ok_cvl
[619]2145c MAF conema3 ne contient pas les traceurs
[524]2146          CALL conema3 (dtime,
2147     .        paprs,pplay,t_seri,q_seri,
[619]2148     .        u_seri,v_seri,tr_seri,ntra,
[524]2149     .        ema_work1,ema_work2,
2150     .        d_t_con,d_q_con,d_u_con,d_v_con,d_tr,
2151     .        rain_con, snow_con, ibas_con, itop_con,
2152     .        upwd,dnwd,dnwd0,bas,top,
2153     .        Ma,cape,tvp,rflag,
2154     .        pbase
2155     .        ,bbase,dtvpdt1,dtvpdq1,dplcldt,dplcldr
2156     .        ,clwcon0)
2157
2158          ENDIF ! ok_cvl
2159
[766]2160c
2161c Correction precip
2162          rain_con = rain_con * cvl_corr
2163          snow_con = snow_con * cvl_corr
2164c
2165
[524]2166           IF (.NOT. ok_gust) THEN
2167           do i = 1, klon
2168            wd(i)=0.0
2169           enddo
2170           ENDIF
2171
2172c =================================================================== c
2173c Calcul des proprietes des nuages convectifs
2174c
2175
2176c   calcul des proprietes des nuages convectifs
2177             clwcon0(:,:)=fact_cldcon*clwcon0(:,:)
2178             call clouds_gno
2179     s       (klon,klev,q_seri,zqsat,clwcon0,ptconv,ratqsc,rnebcon0)
2180
2181c =================================================================== c
2182
2183          DO i = 1, klon
[1334]2184            ema_pcb(i)  = paprs(i,ibas_con(i))
[524]2185          ENDDO
2186          DO i = 1, klon
[879]2187! L'idicage de itop_con peut cacher un pb potentiel
2188! FH sous la dictee de JYG, CR
2189            ema_pct(i)  = paprs(i,itop_con(i)+1)
2190
[878]2191            if (itop_con(i).gt.klev-3) then
[1279]2192              if(prt_level >= 9) then
2193                write(lunout,*)'La convection monte trop haut '
2194                write(lunout,*)'itop_con(,',i,',)=',itop_con(i)
2195              endif
[878]2196            endif
[524]2197          ENDDO
2198          DO i = 1, klon
2199            ema_cbmf(i) = ema_workcbmf(i)
2200          ENDDO     
[881]2201      ELSE IF (iflag_con.eq.0) THEN
2202          write(lunout,*) 'On n appelle pas la convection'
2203          clwcon0=0.
2204          rnebcon0=0.
2205          d_t_con=0.
2206          d_q_con=0.
2207          d_u_con=0.
2208          d_v_con=0.
2209          rain_con=0.
2210          snow_con=0.
2211          bas=1
2212          top=1
[524]2213      ELSE
2214          WRITE(lunout,*) "iflag_con non-prevu", iflag_con
2215          CALL abort
2216      ENDIF
2217
2218c     CALL homogene(paprs, q_seri, d_q_con, u_seri,v_seri,
2219c    .              d_u_con, d_v_con)
2220
[904]2221!-----------------------------------------------------------------------------------------
2222! ajout des tendances de la diffusion turbulente
2223      CALL add_phys_tend(d_u_con,d_v_con,d_t_con,d_q_con,dql0,'con')
2224!-----------------------------------------------------------------------------------------
[766]2225
2226      if (mydebug) then
2227        call writefield_phy('u_seri',u_seri,llm)
2228        call writefield_phy('v_seri',v_seri,llm)
2229        call writefield_phy('t_seri',t_seri,llm)
2230        call writefield_phy('q_seri',q_seri,llm)
2231      endif
2232
[687]2233cIM
2234      IF (ip_ebil_phy.ge.2) THEN
[524]2235        ztit='after convect'
[687]2236        CALL diagetpq(airephy,ztit,ip_ebil_phy,2,2,dtime
[524]2237     e      , t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,paprs,pplay
2238     s      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
[687]2239         call diagphy(airephy,ztit,ip_ebil_phy
[524]2240     e      , zero_v, zero_v, zero_v, zero_v, zero_v
2241     e      , zero_v, rain_con, snow_con, ztsol
2242     e      , d_h_vcol, d_qt, d_ec
2243     s      , fs_bound, fq_bound )
2244      END IF
2245C
2246      IF (check) THEN
2247          za = qcheck(klon,klev,paprs,q_seri,ql_seri,airephy)
2248          WRITE(lunout,*)"aprescon=", za
2249          zx_t = 0.0
2250          za = 0.0
2251          DO i = 1, klon
2252            za = za + airephy(i)/FLOAT(klon)
2253            zx_t = zx_t + (rain_con(i)+
2254     .                   snow_con(i))*airephy(i)/FLOAT(klon)
2255          ENDDO
2256          zx_t = zx_t/za*dtime
2257          WRITE(lunout,*)"Precip=", zx_t
2258      ENDIF
2259      IF (zx_ajustq) THEN
2260          DO i = 1, klon
2261            z_apres(i) = 0.0
2262          ENDDO
2263          DO k = 1, klev
2264            DO i = 1, klon
2265              z_apres(i) = z_apres(i) + (q_seri(i,k)+ql_seri(i,k))
2266     .            *(paprs(i,k)-paprs(i,k+1))/RG
2267            ENDDO
2268          ENDDO
2269          DO i = 1, klon
2270            z_factor(i) = (z_avant(i)-(rain_con(i)+snow_con(i))*dtime)
2271     .          /z_apres(i)
2272          ENDDO
2273          DO k = 1, klev
2274            DO i = 1, klon
2275              IF (z_factor(i).GT.(1.0+1.0E-08) .OR.
2276     .            z_factor(i).LT.(1.0-1.0E-08)) THEN
2277                  q_seri(i,k) = q_seri(i,k) * z_factor(i)
2278              ENDIF
2279            ENDDO
2280          ENDDO
2281      ENDIF
2282      zx_ajustq=.FALSE.
[879]2283
[524]2284c
[879]2285c=============================================================================
2286cRR:Evolution de la poche froide: on ne fait pas de separation wake/env
2287cpour la couche limite diffuse pour l instant
2288c
2289      if (iflag_wake.eq.1) then
2290      DO k=1,klev
2291        DO i=1,klon
2292          dt_dwn(i,k)  = ftd(i,k)
[973]2293          wdt_PBL(i,k) = 0.
[879]2294          dq_dwn(i,k)  = fqd(i,k)
[973]2295          wdq_PBL(i,k) = 0.
[879]2296          M_dwn(i,k)   = dnwd0(i,k)
2297          M_up(i,k)    = upwd(i,k)
2298          dt_a(i,k)    = d_t_con(i,k)/dtime - ftd(i,k)
[973]2299          udt_PBL(i,k) = 0.
[879]2300          dq_a(i,k)    = d_q_con(i,k)/dtime - fqd(i,k)
[973]2301          udq_PBL(i,k) = 0.
[879]2302        ENDDO
2303      ENDDO
2304c
2305ccalcul caracteristiques de la poche froide
2306      call calWAKE (paprs,pplay,dtime
[953]2307     :               ,t_seri,q_seri,omega
[879]2308     :               ,dt_dwn,dq_dwn,M_dwn,M_up
2309     :               ,dt_a,dq_a,sigd
2310     :               ,wdt_PBL,wdq_PBL
2311     :               ,udt_PBL,udq_PBL
2312     o               ,wake_deltat,wake_deltaq,wake_dth
2313     o               ,wake_h,wake_s,wake_dens
2314     o               ,wake_pe,wake_fip,wake_gfl
2315     o               ,dt_wake,dq_wake
2316     o               ,wake_k, t_undi,q_undi
2317     o               ,wake_omgbdth,wake_dp_omgb
2318     o               ,wake_dtKE,wake_dqKE
2319     o               ,wake_dtPBL,wake_dqPBL
2320     o               ,wake_omg,wake_dp_deltomg
2321     o               ,wake_spread,wake_Cstar,wake_d_deltat_gw
2322     o               ,wake_ddeltat,wake_ddeltaq)
2323c
[904]2324!-----------------------------------------------------------------------------------------
2325! ajout des tendances des poches froides
2326! Faire rapidement disparaitre l'ancien dt_wake pour garder un d_t_wake
2327! coherent avec les autres d_t_...
2328      d_t_wake(:,:)=dt_wake(:,:)*dtime
2329      d_q_wake(:,:)=dq_wake(:,:)*dtime
2330      CALL add_phys_tend(du0,dv0,d_t_wake,d_q_wake,dql0,'wake')
2331!-----------------------------------------------------------------------------------------
[879]2332
2333      endif
2334c      print*,'apres callwake iflag_cldcon=', iflag_cldcon
2335c
[541]2336c===================================================================
2337c Convection seche (thermiques ou ajustement)
2338c===================================================================
[524]2339c
[878]2340       call stratocu_if(klon,klev,pctsrf,paprs, pplay,t_seri
2341     s ,seuil_inversion,weak_inversion,dthmin)
2342
2343
2344
2345      d_t_ajsb(:,:)=0.
2346      d_q_ajsb(:,:)=0.
[541]2347      d_t_ajs(:,:)=0.
2348      d_u_ajs(:,:)=0.
2349      d_v_ajs(:,:)=0.
2350      d_q_ajs(:,:)=0.
[878]2351      clwcon0th(:,:)=0.
[541]2352c
[973]2353      fm_therm(:,:)=0.
2354      entr_therm(:,:)=0.
2355      detr_therm(:,:)=0.
2356c
[557]2357      IF(prt_level>9)WRITE(lunout,*)
2358     .    'AVANT LA CONVECTION SECHE , iflag_thermals='
[541]2359     s   ,iflag_thermals,'   nsplit_thermals=',nsplit_thermals
2360      if(iflag_thermals.lt.0) then
2361c  Rien
2362c  ====
[557]2363         IF(prt_level>9)WRITE(lunout,*)'pas de convection'
[541]2364
[878]2365
[541]2366      else
[878]2367
[541]2368c  Thermiques
2369c  ==========
[557]2370         IF(prt_level>9)WRITE(lunout,*)'JUSTE AVANT , iflag_thermals='
[541]2371     s   ,iflag_thermals,'   nsplit_thermals=',nsplit_thermals
[878]2372
2373
2374         if (iflag_thermals.gt.1) then
[541]2375         call calltherm(pdtphys
[878]2376     s      ,pplay,paprs,pphi,weak_inversion
2377     s      ,u_seri,v_seri,t_seri,q_seri,zqsat,debut
[541]2378     s      ,d_u_ajs,d_v_ajs,d_t_ajs,d_q_ajs
[973]2379     s      ,fm_therm,entr_therm,detr_therm
2380     s      ,zqasc,clwcon0th,lmax_th,ratqscth
[879]2381     s      ,ratqsdiff,zqsatth
2382con rajoute ale et alp, et les caracteristiques de la couche alim
[1032]2383     s      ,Ale_bl,Alp_bl,lalim_conv,wght_th, zmax0, f0, zw2,fraca)
[878]2384         endif
2385
2386
2387c  Ajustement sec
2388c  ==============
2389
2390! Dans le cas où on active les thermiques, on fait partir l'ajustement
2391! a partir du sommet des thermiques.
2392! Dans le cas contraire, on demarre au niveau 1.
2393
2394         if (iflag_thermals.ge.13.or.iflag_thermals.eq.0) then
2395
2396         if(iflag_thermals.eq.0) then
2397            IF(prt_level>9)WRITE(lunout,*)'ajsec'
2398            limbas(:)=1
2399         else
2400            limbas(:)=lmax_th(:)
2401         endif
2402 
2403! Attention : le call ajsec_convV2 n'est maintenu que momentanneement
2404! pour des test de convergence numerique.
2405! Le nouveau ajsec est a priori mieux, meme pour le cas
2406! iflag_thermals = 0 (l'ancienne version peut faire des tendances
2407! non nulles numeriquement pour des mailles non concernees.
2408
2409         if (iflag_thermals.eq.0) then
2410            CALL ajsec_convV2(paprs, pplay, t_seri,q_seri
2411     s      , d_t_ajsb, d_q_ajsb)
2412         else
2413            CALL ajsec(paprs, pplay, t_seri,q_seri,limbas
2414     s      , d_t_ajsb, d_q_ajsb)
2415         endif
2416
[904]2417!-----------------------------------------------------------------------------------------
2418! ajout des tendances de l'ajustement sec ou des thermiques
2419      CALL add_phys_tend(du0,dv0,d_t_ajsb,d_q_ajsb,dql0,'ajsb')
[878]2420         d_t_ajs(:,:)=d_t_ajs(:,:)+d_t_ajsb(:,:)
2421         d_q_ajs(:,:)=d_q_ajs(:,:)+d_q_ajsb(:,:)
2422
[904]2423!-----------------------------------------------------------------------------------------
2424
[878]2425         endif
2426
[541]2427      endif
2428c
2429c===================================================================
[687]2430cIM
2431      IF (ip_ebil_phy.ge.2) THEN
[524]2432        ztit='after dry_adjust'
[687]2433        CALL diagetpq(airephy,ztit,ip_ebil_phy,2,2,dtime
[524]2434     e      , t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,paprs,pplay
2435     s      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
2436      END IF
2437
2438
2439c-------------------------------------------------------------------------
2440c  Caclul des ratqs
2441c-------------------------------------------------------------------------
2442
2443c      print*,'calcul des ratqs'
2444c   ratqs convectifs a l'ancienne en fonction de q(z=0)-q / q
2445c   ----------------
2446c   on ecrase le tableau ratqsc calcule par clouds_gno
2447      if (iflag_cldcon.eq.1) then
2448         do k=1,klev
2449         do i=1,klon
2450            if(ptconv(i,k)) then
2451              ratqsc(i,k)=ratqsbas
2452     s        +fact_cldcon*(q_seri(i,1)-q_seri(i,k))/q_seri(i,k)
2453            else
2454               ratqsc(i,k)=0.
2455            endif
2456         enddo
2457         enddo
[1032]2458
2459c-----------------------------------------------------------------------
2460c  par nversion de la fonction log normale
2461c-----------------------------------------------------------------------
[878]2462      else if (iflag_cldcon.eq.4) then
2463         ptconvth(:,:)=.false.
2464         ratqsc(:,:)=0.
[942]2465         if(prt_level.ge.9) print*,'avant clouds_gno thermique'
[878]2466         call clouds_gno
2467     s   (klon,klev,q_seri,zqsat,clwcon0th,ptconvth,ratqsc,rnebcon0th)
[942]2468         if(prt_level.ge.9) print*,' CLOUDS_GNO OK'
[1032]2469
2470c-----------------------------------------------------------------------
2471c   par calcul direct de l'ecart-type
2472c-----------------------------------------------------------------------
2473
2474      else if (iflag_cldcon>=5) then
2475         wmax_th(:)=0.
2476         zmax_th(:)=0.
2477         do k=1,klev
2478            do i=1,klon
2479               wmax_th(i)=max(wmax_th(i),zw2(i,k))
2480               if (detr_therm(i,k).gt.0.) zmax_th(i)=pphi(i,k)/rg
2481            enddo
2482         enddo
2483         tau_overturning_th(:)=zmax_th(:)/max(0.5*wmax_th(:),0.1)
2484         print*,'TAU TH OK ',tau_overturning_th(1),detr_therm(1,3)
2485
2486c On impose que l'air autour de la fraction couverte par le thermique
2487c plus son air detraine durant tau_overturning_th soit superieur
2488c a 0.1 q_seri
2489         zz=0.1
2490         do k=1,klev
2491            do i=1,klon
2492               lambda_th(i,k)=0.5*(fraca(i,k)+fraca(i,k+1))+
2493     s         tau_overturning_th(i)*detr_therm(i,k)
2494     s         *rg/(paprs(i,k)-paprs(i,k+1))
2495               znum=(1.-zz)*q_seri(i,k)
2496               zden=zqasc(i,k)-zz*q_seri(i,k)
2497               if (znum-lambda_th(i,k)*zden<0.) lambda_th(i,k)=znum/zden
2498               lambda_th(i,k)=min(lambda_th(i,k),0.9)
2499            enddo
2500         enddo
2501
2502         if(iflag_cldcon==5) then
2503            do k=1,klev
2504               do i=1,klon
2505                  ratqsc(i,k)=sqrt(lambda_th(i,k)/(1.-lambda_th(i,k)))*
2506     s            abs((zqasc(i,k)-q_seri(i,k))/q_seri(i,k))
2507               enddo
2508            enddo
2509         else if(iflag_cldcon==6) then
2510            do k=1,klev
2511               do i=1,klon
2512                  ratqsc(i,k)=sqrt(lambda_th(i,k))*
2513     s            (zqasc(i,k)-q_seri(i,k))/q_seri(i,k)
2514               enddo
2515            enddo
2516         endif
2517
[524]2518      endif
2519
2520c   ratqs stables
2521c   -------------
2522
[878]2523      if (iflag_ratqs.eq.0) then
[524]2524
[878]2525! Le cas iflag_ratqs=0 correspond a la version IPCC 2005 du modele.
2526         do k=1,klev
2527            do i=1, klon
2528               ratqss(i,k)=ratqsbas+(ratqshaut-ratqsbas)*
2529     s         min((paprs(i,1)-pplay(i,k))/(paprs(i,1)-30000.),1.)
2530            enddo
2531         enddo
2532
2533! Pour iflag_ratqs=1 ou 2, le ratqs est constant au dessus de
2534! 300 hPa (ratqshaut), varie lineariement en fonction de la pression
2535! entre 600 et 300 hPa et est soit constant (ratqsbas) pour iflag_ratqs=1
2536! soit lineaire (entre 0 a la surface et ratqsbas) pour iflag_ratqs=2
2537! Il s'agit de differents tests dans la phase de reglage du modele
2538! avec thermiques.
2539
2540      else if (iflag_ratqs.eq.1) then
2541
2542         do k=1,klev
2543            do i=1, klon
2544               if (pplay(i,k).ge.60000.) then
2545                  ratqss(i,k)=ratqsbas
2546               else if ((pplay(i,k).ge.30000.).and.
2547     s            (pplay(i,k).lt.60000.)) then
2548                  ratqss(i,k)=ratqsbas+(ratqshaut-ratqsbas)*
2549     s            (60000.-pplay(i,k))/(60000.-30000.)
2550               else
2551                  ratqss(i,k)=ratqshaut
2552               endif
2553            enddo
2554         enddo
2555
2556      else
2557
2558         do k=1,klev
2559            do i=1, klon
2560               if (pplay(i,k).ge.60000.) then
2561                  ratqss(i,k)=ratqsbas
2562     s            *(paprs(i,1)-pplay(i,k))/(paprs(i,1)-60000.)
2563               else if ((pplay(i,k).ge.30000.).and.
2564     s             (pplay(i,k).lt.60000.)) then
2565                    ratqss(i,k)=ratqsbas+(ratqshaut-ratqsbas)*
2566     s              (60000.-pplay(i,k))/(60000.-30000.)
2567               else
2568                    ratqss(i,k)=ratqshaut
2569               endif
2570            enddo
2571         enddo
2572      endif
2573
2574
2575
2576
[524]2577c  ratqs final
2578c  -----------
[878]2579
2580      if (iflag_cldcon.eq.1 .or.iflag_cldcon.eq.2
[1032]2581     s    .or.iflag_cldcon.ge.4) then
[878]2582
2583! On ajoute une constante au ratqsc*2 pour tenir compte de
2584! fluctuations turbulentes de petite echelle
2585
2586         do k=1,klev
2587            do i=1,klon
2588               if ((fm_therm(i,k).gt.1.e-10)) then
2589                  ratqsc(i,k)=sqrt(ratqsc(i,k)**2+0.05**2)
2590               endif
2591            enddo
2592         enddo
2593
[1279]2594!   les ratqs sont une combinaison de ratqss et ratqsc
[1319]2595!       print*,'PHYLMD NOUVEAU TAU_RATQS ',tau_ratqs
[878]2596
[1279]2597         if (tau_ratqs>1.e-10) then
2598            facteur=exp(-pdtphys/tau_ratqs)
2599         else
2600            facteur=0.
2601         endif
[878]2602         ratqs(:,:)=ratqsc(:,:)*(1.-facteur)+ratqs(:,:)*facteur
[1279]2603!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2604! FH 22/09/2009
2605! La ligne ci-dessous faisait osciller le modele et donnait une solution
2606! assymptotique bidon et dépendant fortement du pas de temps.
2607!        ratqs(:,:)=sqrt(ratqs(:,:)**2+ratqss(:,:)**2)
2608!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2609         ratqs(:,:)=max(ratqs(:,:),ratqss(:,:))
[524]2610      else
[878]2611!   on ne prend que le ratqs stable pour fisrtilp
[524]2612         ratqs(:,:)=ratqss(:,:)
2613      endif
2614
2615
2616c
2617c Appeler le processus de condensation a grande echelle
2618c et le processus de precipitation
2619c-------------------------------------------------------------------------
2620      CALL fisrtilp(dtime,paprs,pplay,
2621     .           t_seri, q_seri,ptconv,ratqs,
2622     .           d_t_lsc, d_q_lsc, d_ql_lsc, rneb, cldliq,
2623     .           rain_lsc, snow_lsc,
2624     .           pfrac_impa, pfrac_nucl, pfrac_1nucl,
2625     .           frac_impa, frac_nucl,
2626     .           prfl, psfl, rhcl)
2627
2628      WHERE (rain_lsc < 0) rain_lsc = 0.
2629      WHERE (snow_lsc < 0) snow_lsc = 0.
[904]2630!-----------------------------------------------------------------------------------------
2631! ajout des tendances de la diffusion turbulente
2632      CALL add_phys_tend(du0,dv0,d_t_lsc,d_q_lsc,d_ql_lsc,'lsc')
2633!-----------------------------------------------------------------------------------------
[524]2634      DO k = 1, klev
2635      DO i = 1, klon
2636         cldfra(i,k) = rneb(i,k)
2637         IF (.NOT.new_oliq) cldliq(i,k) = ql_seri(i,k)
2638      ENDDO
2639      ENDDO
2640      IF (check) THEN
2641         za = qcheck(klon,klev,paprs,q_seri,ql_seri,airephy)
2642         WRITE(lunout,*)"apresilp=", za
2643         zx_t = 0.0
2644         za = 0.0
2645         DO i = 1, klon
2646            za = za + airephy(i)/FLOAT(klon)
2647            zx_t = zx_t + (rain_lsc(i)
2648     .                  + snow_lsc(i))*airephy(i)/FLOAT(klon)
2649        ENDDO
2650         zx_t = zx_t/za*dtime
2651         WRITE(lunout,*)"Precip=", zx_t
2652      ENDIF
[687]2653cIM
2654      IF (ip_ebil_phy.ge.2) THEN
[524]2655        ztit='after fisrt'
[687]2656        CALL diagetpq(airephy,ztit,ip_ebil_phy,2,2,dtime
[524]2657     e      , t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,paprs,pplay
2658     s      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
[687]2659        call diagphy(airephy,ztit,ip_ebil_phy
[524]2660     e      , zero_v, zero_v, zero_v, zero_v, zero_v
2661     e      , zero_v, rain_lsc, snow_lsc, ztsol
2662     e      , d_h_vcol, d_qt, d_ec
2663     s      , fs_bound, fq_bound )
2664      END IF
[766]2665
2666      if (mydebug) then
2667        call writefield_phy('u_seri',u_seri,llm)
2668        call writefield_phy('v_seri',v_seri,llm)
2669        call writefield_phy('t_seri',t_seri,llm)
2670        call writefield_phy('q_seri',q_seri,llm)
2671      endif
2672
[524]2673c
2674c-------------------------------------------------------------------
2675c  PRESCRIPTION DES NUAGES POUR LE RAYONNEMENT
2676c-------------------------------------------------------------------
2677
2678c 1. NUAGES CONVECTIFS
2679c
[644]2680cIM cf FH
2681c     IF (iflag_cldcon.eq.-1) THEN ! seulement pour Tiedtke
[878]2682      IF (iflag_cldcon.le.-1) THEN ! seulement pour Tiedtke
[644]2683       snow_tiedtke=0.
2684c     print*,'avant calcul de la pseudo precip '
2685c     print*,'iflag_cldcon',iflag_cldcon
2686       if (iflag_cldcon.eq.-1) then
2687          rain_tiedtke=rain_con
2688       else
2689c       print*,'calcul de la pseudo precip '
2690          rain_tiedtke=0.
2691c         print*,'calcul de la pseudo precip 0'
2692          do k=1,klev
2693          do i=1,klon
2694             if (d_q_con(i,k).lt.0.) then
2695                rain_tiedtke(i)=rain_tiedtke(i)-d_q_con(i,k)/pdtphys
2696     s         *(paprs(i,k)-paprs(i,k+1))/rg
2697             endif
2698          enddo
2699          enddo
2700       endif
2701c
2702c     call dump2d(iim,jjm,rain_tiedtke(2:klon-1),'PSEUDO PRECIP ')
2703c
[524]2704
2705c Nuages diagnostiques pour Tiedtke
2706      CALL diagcld1(paprs,pplay,
[644]2707cIM cf FH  .             rain_con,snow_con,ibas_con,itop_con,
2708     .             rain_tiedtke,snow_tiedtke,ibas_con,itop_con,
[524]2709     .             diafra,dialiq)
2710      DO k = 1, klev
2711      DO i = 1, klon
2712      IF (diafra(i,k).GT.cldfra(i,k)) THEN
2713         cldliq(i,k) = dialiq(i,k)
2714         cldfra(i,k) = diafra(i,k)
2715      ENDIF
2716      ENDDO
2717      ENDDO
2718
[878]2719      ELSE IF (iflag_cldcon.ge.3) THEN
[524]2720c  On prend pour les nuages convectifs le max du calcul de la
[766]2721c  convection et du calcul du pas de temps precedent diminue d'un facteur
[524]2722c  facttemps
2723      facteur = pdtphys *facttemps
2724      do k=1,klev
2725         do i=1,klon
2726            rnebcon(i,k)=rnebcon(i,k)*facteur
2727            if (rnebcon0(i,k)*clwcon0(i,k).gt.rnebcon(i,k)*clwcon(i,k))
2728     s      then
2729                rnebcon(i,k)=rnebcon0(i,k)
2730                clwcon(i,k)=clwcon0(i,k)
2731            endif
2732         enddo
2733      enddo
2734
[644]2735c
[766]2736cjq - introduce the aerosol direct and first indirect radiative forcings
2737cjq - Johannes Quaas, 27/11/2003 (quaas@lmd.jussieu.fr)
2738      IF (ok_ade.OR.ok_aie) THEN
[1279]2739         IF (.NOT. aerosol_couple)
2740     &        CALL readaerosol_optic(
2741     &        debut, new_aod, flag_aerosol, itap, jD_cur-jD_ref,
2742     &        pdtphys, pplay, paprs, t_seri, rhcl, presnivs,
2743     &        mass_solu_aero, mass_solu_aero_pi,
2744     &        tau_aero, piz_aero, cg_aero,
2745     &        tausum_aero, tau3d_aero)
[766]2746      ELSE
[1279]2747         tau_aero(:,:,:,:) = 0.
2748         piz_aero(:,:,:,:) = 0.
2749         cg_aero(:,:,:,:)  = 0.
[766]2750      ENDIF
2751
[524]2752cIM calcul nuages par le simulateur ISCCP
[644]2753c
[839]2754#ifdef histISCCP
[524]2755      IF (ok_isccp) THEN
[1035]2756c
[1045]2757cIM lecture invtau, tautab des fichiers formattes
[1035]2758c
[1045]2759      IF (debut) THEN
2760c$OMP MASTER
2761c
2762      open(99,file='tautab.formatted', FORM='FORMATTED')
2763      read(99,'(f30.20)') tautab_omp
2764      close(99)
2765c
2766      open(99,file='invtau.formatted',form='FORMATTED')
2767      read(99,'(i10)') invtau_omp
2768
2769c     print*,'calcul_simulISCCP invtau_omp',invtau_omp
2770c     write(6,'(a,8i10)') 'invtau_omp',(invtau_omp(i),i=1,100)
2771
2772      close(99)
2773c$OMP END MASTER
2774c$OMP BARRIER
2775      tautab=tautab_omp
2776      invtau=invtau_omp
2777c
2778      ENDIF !debut
2779c
[828]2780cIM appel simulateur toutes les  NINT(freq_ISCCP/dtime) heures
2781       IF (MOD(itap,NINT(freq_ISCCP/dtime)).EQ.0) THEN
[644]2782#include "calcul_simulISCCP.h"
[828]2783       ENDIF !(MOD(itap,NINT(freq_ISCCP/dtime))
[524]2784      ENDIF !ok_isccp
[839]2785#endif
[524]2786
2787c   On prend la somme des fractions nuageuses et des contenus en eau
2788      cldfra(:,:)=min(max(cldfra(:,:),rnebcon(:,:)),1.)
2789      cldliq(:,:)=cldliq(:,:)+rnebcon(:,:)*clwcon(:,:)
2790
2791      ENDIF
2792c
2793c 2. NUAGES STARTIFORMES
2794c
2795      IF (ok_stratus) THEN
2796      CALL diagcld2(paprs,pplay,t_seri,q_seri, diafra,dialiq)
2797      DO k = 1, klev
2798      DO i = 1, klon
2799      IF (diafra(i,k).GT.cldfra(i,k)) THEN
2800         cldliq(i,k) = dialiq(i,k)
2801         cldfra(i,k) = diafra(i,k)
2802      ENDIF
2803      ENDDO
2804      ENDDO
2805      ENDIF
2806c
2807c Precipitation totale
2808c
2809      DO i = 1, klon
2810         rain_fall(i) = rain_con(i) + rain_lsc(i)
2811         snow_fall(i) = snow_con(i) + snow_lsc(i)
2812      ENDDO
[687]2813cIM
2814      IF (ip_ebil_phy.ge.2) THEN
[524]2815        ztit="after diagcld"
[687]2816        CALL diagetpq(airephy,ztit,ip_ebil_phy,2,2,dtime
[524]2817     e      , t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,paprs,pplay
2818     s      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
2819      END IF
2820c
2821c Calculer l'humidite relative pour diagnostique
2822c
2823      DO k = 1, klev
2824      DO i = 1, klon
2825         zx_t = t_seri(i,k)
2826         IF (thermcep) THEN
2827            zdelta = MAX(0.,SIGN(1.,rtt-zx_t))
2828            zx_qs  = r2es * FOEEW(zx_t,zdelta)/pplay(i,k)
2829            zx_qs  = MIN(0.5,zx_qs)
2830            zcor   = 1./(1.-retv*zx_qs)
2831            zx_qs  = zx_qs*zcor
2832         ELSE
2833           IF (zx_t.LT.t_coup) THEN
2834              zx_qs = qsats(zx_t)/pplay(i,k)
2835           ELSE
2836              zx_qs = qsatl(zx_t)/pplay(i,k)
2837           ENDIF
2838         ENDIF
2839         zx_rh(i,k) = q_seri(i,k)/zx_qs
2840         zqsat(i,k)=zx_qs
2841      ENDDO
2842      ENDDO
[782]2843
[687]2844cIM Calcul temp.potentielle a 2m (tpot) et temp. potentielle
2845c   equivalente a 2m (tpote) pour diagnostique
2846c
2847      DO i = 1, klon
2848       tpot(i)=zt2m(i)*(100000./paprs(i,1))**RKAPPA
2849       IF (thermcep) THEN
2850        IF(zt2m(i).LT.RTT) then
2851         Lheat=RLSTT
2852        ELSE
2853         Lheat=RLVTT
2854        ENDIF
2855       ELSE
2856        IF (zt2m(i).LT.RTT) THEN
2857         Lheat=RLSTT
2858        ELSE
2859         Lheat=RLVTT
2860        ENDIF
2861       ENDIF
2862       tpote(i) = tpot(i)*     
2863     . EXP((Lheat *qsat2m(i))/(RCPD*zt2m(i)))
2864      ENDDO
[524]2865
[959]2866      IF (config_inca /= 'none') THEN
[524]2867#ifdef INCA
[959]2868         CALL VTe(VTphysiq)
2869         CALL VTb(VTinca)
[1279]2870         calday = FLOAT(days_elapsed + 1) + jH_cur
[524]2871
[1287]2872         call chemtime(itap+itau_phy-1, date0, dtime)
[959]2873         IF (config_inca == 'aero') THEN
[1015]2874            CALL AEROSOL_METEO_CALC(
2875     $           calday,pdtphys,pplay,paprs,t,pmflxr,pmflxs,
[1279]2876     $           prfl,psfl,pctsrf,airephy,rlat,rlon,u10m,v10m)
[959]2877         END IF
[524]2878
[959]2879         zxsnow_dummy(:) = 0.0
[625]2880
[959]2881         CALL chemhook_begin (calday,
[1279]2882     $                          days_elapsed+1,
2883     $                          jH_cur,
[593]2884     $                          pctsrf(1,1),
[524]2885     $                          rlat,
2886     $                          rlon,
2887     $                          airephy,
2888     $                          paprs,
2889     $                          pplay,
[1067]2890     $                          coefh,
[524]2891     $                          pphi,
2892     $                          t_seri,
2893     $                          u,
2894     $                          v,
[1279]2895     $                          wo(:, :, 1),
[524]2896     $                          q_seri,
2897     $                          zxtsol,
[782]2898     $                          zxsnow_dummy,
[524]2899     $                          solsw,
[888]2900     $                          albsol1,
[524]2901     $                          rain_fall,
2902     $                          snow_fall,
2903     $                          itop_con,
2904     $                          ibas_con,
2905     $                          cldfra,
2906     $                          iim,
2907     $                          jjm,
[616]2908     $                          tr_seri,
2909     $                          ftsol,
2910     $                          paprs,
2911     $                          cdragh,
2912     $                          cdragm,
2913     $                          pctsrf,
2914     $                          pdtphys,
2915     $                          itap)
2916
[959]2917         CALL VTe(VTinca)
2918         CALL VTb(VTphysiq)
2919#endif
2920      END IF !config_inca /= 'none'
[524]2921c     
2922c Calculer les parametres optiques des nuages et quelques
2923c parametres pour diagnostiques:
2924c
[959]2925
2926      IF (aerosol_couple) THEN
[1279]2927         mass_solu_aero(:,:)    = ccm(:,:,1)
2928         mass_solu_aero_pi(:,:) = ccm(:,:,2)
2929      END IF
[955]2930
[524]2931      if (ok_newmicro) then
2932      CALL newmicro (paprs, pplay,ok_newmicro,
2933     .            t_seri, cldliq, cldfra, cldtau, cldemi,
2934     .            cldh, cldl, cldm, cldt, cldq,
2935     .            flwp, fiwp, flwc, fiwc,
2936     e            ok_aie,
[1279]2937     e            mass_solu_aero, mass_solu_aero_pi,
[524]2938     e            bl95_b0, bl95_b1,
[1279]2939     s            cldtaupi, re, fl, ref_liq, ref_ice)
[524]2940      else
2941      CALL nuage (paprs, pplay,
2942     .            t_seri, cldliq, cldfra, cldtau, cldemi,
2943     .            cldh, cldl, cldm, cldt, cldq,
2944     e            ok_aie,
[1279]2945     e            mass_solu_aero, mass_solu_aero_pi,
[524]2946     e            bl95_b0, bl95_b1,
2947     s            cldtaupi, re, fl)
2948     
2949      endif
2950c
2951c Appeler le rayonnement mais calculer tout d'abord l'albedo du sol.
2952c
2953      IF (MOD(itaprad,radpas).EQ.0) THEN
[782]2954
[524]2955      DO i = 1, klon
[888]2956         albsol1(i) = falb1(i,is_oce) * pctsrf(i,is_oce)
2957     .             + falb1(i,is_lic) * pctsrf(i,is_lic)
2958     .             + falb1(i,is_ter) * pctsrf(i,is_ter)
2959     .             + falb1(i,is_sic) * pctsrf(i,is_sic)
2960         albsol2(i) = falb2(i,is_oce) * pctsrf(i,is_oce)
2961     .               + falb2(i,is_lic) * pctsrf(i,is_lic)
2962     .               + falb2(i,is_ter) * pctsrf(i,is_ter)
2963     .               + falb2(i,is_sic) * pctsrf(i,is_sic)
[524]2964      ENDDO
[766]2965
2966      if (mydebug) then
2967        call writefield_phy('u_seri',u_seri,llm)
2968        call writefield_phy('v_seri',v_seri,llm)
2969        call writefield_phy('t_seri',t_seri,llm)
2970        call writefield_phy('q_seri',q_seri,llm)
2971      endif
2972     
[955]2973      IF (aerosol_couple) THEN
[959]2974#ifdef INCA
[1279]2975         CALL radlwsw_inca
2976     e        (kdlon,kflev,dist, rmu0, fract, solaire,
2977     e        paprs, pplay,zxtsol,albsol1, albsol2, t_seri,q_seri,
2978     e        wo(:, :, 1),
2979     e        cldfra, cldemi, cldtau,
2980     s        heat,heat0,cool,cool0,radsol,albpla,
2981     s        topsw,toplw,solsw,sollw,
2982     s        sollwdown,
2983     s        topsw0,toplw0,solsw0,sollw0,
2984     s        lwdn0, lwdn, lwup0, lwup,
2985     s        swdn0, swdn, swup0, swup,
2986     e        ok_ade, ok_aie,
2987     e        tau_aero, piz_aero, cg_aero,
2988     s        topswad_aero, solswad_aero,
2989     s        topswad0_aero, solswad0_aero,
2990     s        topsw_aero, topsw0_aero,
2991     s        solsw_aero, solsw0_aero,
2992     e        cldtaupi,
2993     s        topswai_aero, solswai_aero)
2994           
[955]2995#endif
2996      ELSE
[1279]2997
2998         CALL radlwsw
2999     e        (dist, rmu0, fract,
3000     e        paprs, pplay,zxtsol,albsol1, albsol2,
3001     e        t_seri,q_seri,wo,
3002     e        cldfra, cldemi, cldtau,
3003     e        ok_ade, ok_aie,
3004     e        tau_aero, piz_aero, cg_aero,
3005     e        cldtaupi,new_aod,
3006     e        zqsat, flwc, fiwc,
3007     s        heat,heat0,cool,cool0,radsol,albpla,
3008     s        topsw,toplw,solsw,sollw,
3009     s        sollwdown,
3010     s        topsw0,toplw0,solsw0,sollw0,
3011     s        lwdn0, lwdn, lwup0, lwup,
3012     s        swdn0, swdn, swup0, swup,
3013     s        topswad_aero, solswad_aero,
3014     s        topswai_aero, solswai_aero,
3015     o        topswad0_aero, solswad0_aero,
3016     o        topsw_aero, topsw0_aero,
3017     o        solsw_aero, solsw0_aero,
3018     o        topswcf_aero, solswcf_aero)
3019         
3020
3021      ENDIF ! aerosol_couple
[524]3022      itaprad = 0
[1279]3023      ENDIF ! MOD(itaprad,radpas)
[524]3024      itaprad = itaprad + 1
[879]3025
3026      if (iflag_radia.eq.0) then
3027      print *,'--------------------------------------------------'
3028      print *,'>>>> ATTENTION rayonnement desactive pour ce cas'
3029      print *,'>>>>           heat et cool mis a zero '
3030      print *,'--------------------------------------------------'
3031      heat=0.
3032      cool=0.
3033      endif
3034
[524]3035c
3036c Ajouter la tendance des rayonnements (tous les pas)
3037c
3038      DO k = 1, klev
3039      DO i = 1, klon
3040         t_seri(i,k) = t_seri(i,k)
[1035]3041     .               + (heat(i,k)-cool(i,k)) * dtime/RDAY
[524]3042      ENDDO
3043      ENDDO
[766]3044c
3045      if (mydebug) then
3046        call writefield_phy('u_seri',u_seri,llm)
3047        call writefield_phy('v_seri',v_seri,llm)
3048        call writefield_phy('t_seri',t_seri,llm)
3049        call writefield_phy('q_seri',q_seri,llm)
3050      endif
3051 
[687]3052cIM
3053      IF (ip_ebil_phy.ge.2) THEN
[524]3054        ztit='after rad'
[687]3055        CALL diagetpq(airephy,ztit,ip_ebil_phy,2,2,dtime
[524]3056     e      , t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,paprs,pplay
3057     s      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
[687]3058        call diagphy(airephy,ztit,ip_ebil_phy
[524]3059     e      , topsw, toplw, solsw, sollw, zero_v
3060     e      , zero_v, zero_v, zero_v, ztsol
3061     e      , d_h_vcol, d_qt, d_ec
3062     s      , fs_bound, fq_bound )
3063      END IF
3064c
3065c
3066c Calculer l'hydrologie de la surface
3067c
3068c      CALL hydrol(dtime,pctsrf,rain_fall, snow_fall, zxevap,
3069c     .            agesno, ftsol,fqsurf,fsnow, ruis)
3070c
[782]3071
[524]3072c
3073c Calculer le bilan du sol et la derive de temperature (couplage)
3074c
3075      DO i = 1, klon
3076c         bils(i) = radsol(i) - sens(i) - evap(i)*RLVTT
3077c a la demande de JLD
3078         bils(i) = radsol(i) - sens(i) + zxfluxlat(i)
3079      ENDDO
3080c
3081cmoddeblott(jan95)
3082c Appeler le programme de parametrisation de l'orographie
3083c a l'echelle sous-maille:
3084c
3085      IF (ok_orodr) THEN
3086c
3087c  selection des points pour lesquels le shema est actif:
3088        igwd=0
3089        DO i=1,klon
3090        itest(i)=0
3091c        IF ((zstd(i).gt.10.0)) THEN
3092        IF (((zpic(i)-zmea(i)).GT.100.).AND.(zstd(i).GT.10.0)) THEN
3093          itest(i)=1
3094          igwd=igwd+1
3095          idx(igwd)=i
3096        ENDIF
3097        ENDDO
3098c        igwdim=MAX(1,igwd)
3099c
[1001]3100        IF (ok_strato) THEN
3101       
3102          CALL drag_noro_strato(klon,klev,dtime,paprs,pplay,
3103     e                   zmea,zstd, zsig, zgam, zthe,zpic,zval,
3104     e                   igwd,idx,itest,
3105     e                   t_seri, u_seri, v_seri,
3106     s                   zulow, zvlow, zustrdr, zvstrdr,
3107     s                   d_t_oro, d_u_oro, d_v_oro)
3108
3109       ELSE
[524]3110        CALL drag_noro(klon,klev,dtime,paprs,pplay,
3111     e                   zmea,zstd, zsig, zgam, zthe,zpic,zval,
3112     e                   igwd,idx,itest,
3113     e                   t_seri, u_seri, v_seri,
[644]3114     s                   zulow, zvlow, zustrdr, zvstrdr,
[524]3115     s                   d_t_oro, d_u_oro, d_v_oro)
[1001]3116       ENDIF
[524]3117c
3118c  ajout des tendances
[904]3119!-----------------------------------------------------------------------------------------
3120! ajout des tendances de la trainee de l'orographie
3121      CALL add_phys_tend(d_u_oro,d_v_oro,d_t_oro,dq0,dql0,'oro')
3122!-----------------------------------------------------------------------------------------
[524]3123c
3124      ENDIF ! fin de test sur ok_orodr
3125c
[766]3126      if (mydebug) then
3127        call writefield_phy('u_seri',u_seri,llm)
3128        call writefield_phy('v_seri',v_seri,llm)
3129        call writefield_phy('t_seri',t_seri,llm)
3130        call writefield_phy('q_seri',q_seri,llm)
3131      endif
3132     
[524]3133      IF (ok_orolf) THEN
3134c
3135c  selection des points pour lesquels le shema est actif:
3136        igwd=0
3137        DO i=1,klon
3138        itest(i)=0
3139        IF ((zpic(i)-zmea(i)).GT.100.) THEN
3140          itest(i)=1
3141          igwd=igwd+1
3142          idx(igwd)=i
3143        ENDIF
3144        ENDDO
3145c        igwdim=MAX(1,igwd)
3146c
[1001]3147        IF (ok_strato) THEN
3148
3149          CALL lift_noro_strato(klon,klev,dtime,paprs,pplay,
3150     e                   rlat,zmea,zstd,zpic,zgam,zthe,zpic,zval,
3151     e                   igwd,idx,itest,
3152     e                   t_seri, u_seri, v_seri,
3153     s                   zulow, zvlow, zustrli, zvstrli,
3154     s                   d_t_lif, d_u_lif, d_v_lif               )
3155       
3156        ELSE
3157          CALL lift_noro(klon,klev,dtime,paprs,pplay,
[524]3158     e                   rlat,zmea,zstd,zpic,
3159     e                   itest,
3160     e                   t_seri, u_seri, v_seri,
[644]3161     s                   zulow, zvlow, zustrli, zvstrli,
[524]3162     s                   d_t_lif, d_u_lif, d_v_lif)
[1001]3163       ENDIF
3164c   
[904]3165!-----------------------------------------------------------------------------------------
3166! ajout des tendances de la portance de l'orographie
3167      CALL add_phys_tend(d_u_lif,d_v_lif,d_t_lif,dq0,dql0,'lif')
3168!-----------------------------------------------------------------------------------------
[524]3169c
3170      ENDIF ! fin de test sur ok_orolf
[1001]3171C  HINES GWD PARAMETRIZATION
3172
3173       IF (ok_hines) then
3174
3175         CALL hines_gwd(klon,klev,dtime,paprs,pplay,
3176     i                  rlat,t_seri,u_seri,v_seri,
3177     o                  zustrhi,zvstrhi,
3178     o                  d_t_hin, d_u_hin, d_v_hin)
[524]3179c
[1001]3180c  ajout des tendances
3181        CALL add_phys_tend(d_u_hin,d_v_hin,d_t_hin,dq0,dql0,'lif')
3182
3183      ENDIF
3184c
3185
3186c
[644]3187cIM cf. FLott BEG
3188C STRESS NECESSAIRES: TOUTE LA PHYSIQUE
3189
[766]3190      if (mydebug) then
3191        call writefield_phy('u_seri',u_seri,llm)
3192        call writefield_phy('v_seri',v_seri,llm)
3193        call writefield_phy('t_seri',t_seri,llm)
3194        call writefield_phy('q_seri',q_seri,llm)
3195      endif
3196
[644]3197      DO i = 1, klon
3198        zustrph(i)=0.
3199        zvstrph(i)=0.
3200      ENDDO
3201      DO k = 1, klev
3202      DO i = 1, klon
3203       zustrph(i)=zustrph(i)+(u_seri(i,k)-u(i,k))/dtime*
3204     c            (paprs(i,k)-paprs(i,k+1))/rg
3205       zvstrph(i)=zvstrph(i)+(v_seri(i,k)-v(i,k))/dtime*
3206     c            (paprs(i,k)-paprs(i,k+1))/rg
3207      ENDDO
3208      ENDDO
3209c
3210cIM calcul composantes axiales du moment angulaire et couple des montagnes
3211c
[1279]3212      IF (is_sequential) THEN
[766]3213     
[1279]3214        CALL aaam_bud (27,klon,klev,jD_cur-jD_ref,jH_cur,
[766]3215     C                 ra,rg,romega,
3216     C                 rlat,rlon,pphis,
3217     C                 zustrdr,zustrli,zustrph,
3218     C                 zvstrdr,zvstrli,zvstrph,
3219     C                 paprs,u,v,
3220     C                 aam, torsfc)
3221       ENDIF
[644]3222cIM cf. FLott END
[687]3223cIM
3224      IF (ip_ebil_phy.ge.2) THEN
[524]3225        ztit='after orography'
[687]3226        CALL diagetpq(airephy,ztit,ip_ebil_phy,2,2,dtime
[524]3227     e      , t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,paprs,pplay
3228     s      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
3229      END IF
3230c
3231c
[1279]3232!====================================================================
3233! Interface Simulateur COSP (Calipso, ISCCP, MISR, ..)
3234!====================================================================
3235! Abderrahmane 24.08.09
3236
3237      IF (ok_cosp) THEN
3238! adeclarer
3239#ifdef CPP_COSP
3240       IF (MOD(itap,NINT(freq_cosp/dtime)).EQ.0) THEN
3241
3242       print*,'freq_cosp',freq_cosp
3243          mr_ozone=wo(:, :, 1) * dobson_u * 1e3 / zmasse
3244!       print*,'Dans physiq.F avant appel cosp ref_liq,ref_ice=',
3245!     s        ref_liq,ref_ice
3246          call phys_cosp(itap,dtime,freq_cosp,
3247     $                 ecrit_mth,ecrit_day,ecrit_hf,overlap,
3248     $                   klon,klev,rlon,rlat,presnivs,
3249     $                   ref_liq,ref_ice,
3250     $                   pctsrf(:,is_ter)+pctsrf(:,is_lic),
3251     $                   zu10m,zv10m,
3252     $                   zphi,paprs(:,1:klev),pplay,zxtsol,t_seri,
3253     $                   qx(:,:,ivap),zx_rh,cldfra,rnebcon,flwc,fiwc,
3254     $                   prfl(:,1:klev),psfl(:,1:klev),
3255     $                   pmflxr(:,1:klev),pmflxs(:,1:klev),
3256     $                   mr_ozone,cldtau, cldemi)
[1334]3257
[1279]3258!     L          calipso2D,calipso3D,cfadlidar,parasolrefl,atb,betamol,
3259!     L          cfaddbze,clcalipso2,dbze,cltlidarradar,
3260!     M          clMISR,
3261!     R          clisccp2,boxtauisccp,boxptopisccp,tclisccp,ctpisccp,
3262!     I          tauisccp,albisccp,meantbisccp,meantbclrisccp)
3263
3264         ENDIF
3265
3266#endif
3267       ENDIF  !ok_cosp
3268!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
[524]3269cAA
3270cAA Installation de l'interface online-offline pour traceurs
3271cAA
3272c====================================================================
3273c   Calcul  des tendances traceurs
3274c====================================================================
3275C
[959]3276
[1279]3277      call phytrac (
3278     I     itap,     days_elapsed+1,    jH_cur,   debut,
3279     I     lafin,    dtime,     u, v,     t,
3280     I     paprs,    pplay,     pmfu,     pmfd,
3281     I     pen_u,    pde_u,     pen_d,    pde_d,
3282     I     cdragh,   coefh,     fm_therm, entr_therm,
3283     I     u1,       v1,        ftsol,    pctsrf,
3284     I     rlat,     frac_impa, frac_nucl,rlon,
3285     I     presnivs, pphis,     pphi,     albsol1,
3286     I     qx(:,:,ivap),rhcl,   cldfra,   rneb,
3287     I     diafra,   cldliq,    itop_con, ibas_con,
3288     I     pmflxr,   pmflxs,    prfl,     psfl,
3289     I     da,       phi,       mp,       upwd,     
3290     I     dnwd,     aerosol_couple,      flxmass_w,
3291     I     tau_aero, piz_aero,  cg_aero,  ccm,
3292     I     rfname,
3293     O     tr_seri)
[524]3294
3295      IF (offline) THEN
3296
[541]3297         print*,'Attention on met a 0 les thermiques pour phystoke'
[524]3298         call phystokenc (
[1279]3299     I                   nlon,klev,pdtphys,rlon,rlat,
[524]3300     I                   t,pmfu, pmfd, pen_u, pde_u, pen_d, pde_d,
[541]3301     I                   fm_therm,entr_therm,
[1067]3302     I                   cdragh,coefh,u1,v1,ftsol,pctsrf,
[524]3303     I                   frac_impa, frac_nucl,
3304     I                   pphis,airephy,dtime,itap)
3305
3306
3307      ENDIF
3308
3309c
3310c Calculer le transport de l'eau et de l'energie (diagnostique)
3311c
3312      CALL transp (paprs,zxtsol,
3313     e                   t_seri, q_seri, u_seri, v_seri, zphi,
3314     s                   ve, vq, ue, uq)
3315c
[687]3316cIM global posePB BEG
3317      IF(1.EQ.0) THEN
[524]3318c
[644]3319      CALL transp_lay (paprs,zxtsol,
3320     e                   t_seri, q_seri, u_seri, v_seri, zphi,
3321     s                   ve_lay, vq_lay, ue_lay, uq_lay)
[524]3322c
[687]3323      ENDIF !(1.EQ.0) THEN
3324cIM global posePB END
[644]3325c Accumuler les variables a stocker dans les fichiers histoire:
[524]3326c
3327c+jld ec_conser
3328      DO k = 1, klev
3329      DO i = 1, klon
3330        ZRCPD = RCPD*(1.0+RVTMP2*q_seri(i,k))
3331        d_t_ec(i,k)=0.5/ZRCPD
3332     $      *(u(i,k)**2+v(i,k)**2-u_seri(i,k)**2-v_seri(i,k)**2)
[1279]3333      ENDDO
3334      ENDDO
3335
3336      DO k = 1, klev
3337      DO i = 1, klon
[524]3338        t_seri(i,k)=t_seri(i,k)+d_t_ec(i,k)
3339        d_t_ec(i,k) = d_t_ec(i,k)/dtime
3340       END DO
3341      END DO
3342c-jld ec_conser
[687]3343cIM
3344      IF (ip_ebil_phy.ge.1) THEN
[524]3345        ztit='after physic'
[687]3346        CALL diagetpq(airephy,ztit,ip_ebil_phy,1,1,dtime
[524]3347     e      , t_seri,q_seri,ql_seri,qs_seri,u_seri,v_seri,paprs,pplay
3348     s      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
3349C     Comme les tendances de la physique sont ajoute dans la dynamique,
3350C     on devrait avoir que la variation d'entalpie par la dynamique
3351C     est egale a la variation de la physique au pas de temps precedent.
3352C     Donc la somme de ces 2 variations devrait etre nulle.
[1279]3353
[687]3354        call diagphy(airephy,ztit,ip_ebil_phy
[524]3355     e      , topsw, toplw, solsw, sollw, sens
3356     e      , evap, rain_fall, snow_fall, ztsol
3357     e      , d_h_vcol, d_qt, d_ec
3358     s      , fs_bound, fq_bound )
3359C
3360      d_h_vcol_phy=d_h_vcol
3361C
3362      END IF
3363C
3364c=======================================================================
3365c   SORTIES
3366c=======================================================================
3367
[644]3368cIM Interpolation sur les niveaux de pression du NMC
3369c   -------------------------------------------------
[524]3370c
[644]3371#include "calcul_STDlev.h"
[1352]3372      twriteSTD(:,:,1)=tsumSTD(:,:,1)
3373      qwriteSTD(:,:,1)=qsumSTD(:,:,1)
3374      rhwriteSTD(:,:,1)=rhsumSTD(:,:,1)
3375      phiwriteSTD(:,:,1)=phisumSTD(:,:,1)
3376      uwriteSTD(:,:,1)=usumSTD(:,:,1)
3377      vwriteSTD(:,:,1)=vsumSTD(:,:,1)
3378      wwriteSTD(:,:,1)=wsumSTD(:,:,1)
[1055]3379
[1352]3380      twriteSTD(:,:,2)=tsumSTD(:,:,2)
3381      qwriteSTD(:,:,2)=qsumSTD(:,:,2)
3382      rhwriteSTD(:,:,2)=rhsumSTD(:,:,2)
3383      phiwriteSTD(:,:,2)=phisumSTD(:,:,2)
3384      uwriteSTD(:,:,2)=usumSTD(:,:,2)
3385      vwriteSTD(:,:,2)=vsumSTD(:,:,2)
3386      wwriteSTD(:,:,2)=wsumSTD(:,:,2)
[1055]3387
3388      twriteSTD(:,:,3)=tlevSTD(:,:)
3389      qwriteSTD(:,:,3)=qlevSTD(:,:)
3390      rhwriteSTD(:,:,3)=rhlevSTD(:,:)
3391      phiwriteSTD(:,:,3)=philevSTD(:,:)
3392      uwriteSTD(:,:,3)=ulevSTD(:,:)
3393      vwriteSTD(:,:,3)=vlevSTD(:,:)
3394      wwriteSTD(:,:,3)=wlevSTD(:,:)
3395
3396      twriteSTD(:,:,4)=tlevSTD(:,:)
3397      qwriteSTD(:,:,4)=qlevSTD(:,:)
3398      rhwriteSTD(:,:,4)=rhlevSTD(:,:)
3399      phiwriteSTD(:,:,4)=philevSTD(:,:)
3400      uwriteSTD(:,:,4)=ulevSTD(:,:)
3401      vwriteSTD(:,:,4)=vlevSTD(:,:)
3402      wwriteSTD(:,:,4)=wlevSTD(:,:)
[524]3403c
[1352]3404cIM initialisation 5eme fichier de sortie
3405      twriteSTD(:,:,5)=tlevSTD(:,:)
3406      qwriteSTD(:,:,5)=qlevSTD(:,:)
3407      rhwriteSTD(:,:,5)=rhlevSTD(:,:)
3408      phiwriteSTD(:,:,5)=philevSTD(:,:)
3409      uwriteSTD(:,:,5)=ulevSTD(:,:)
3410      vwriteSTD(:,:,5)=vlevSTD(:,:)
3411      wwriteSTD(:,:,5)=wlevSTD(:,:)
3412cIM for NMC files
3413      DO n=1, nlevSTD3
3414       DO k=1, nlevSTD
3415        if(rlevSTD3(n).EQ.rlevSTD(k)) THEN
3416         twriteSTD3(:,n)=tlevSTD(:,k)
3417         qwriteSTD3(:,n)=qlevSTD(:,k)
3418         rhwriteSTD3(:,n)=rhlevSTD(:,k)
3419         phiwriteSTD3(:,n)=philevSTD(:,k)
3420         uwriteSTD3(:,n)=ulevSTD(:,k)
3421         vwriteSTD3(:,n)=vlevSTD(:,k)
3422         wwriteSTD3(:,n)=wlevSTD(:,k)
3423        endif !rlevSTD3(n).EQ.rlevSTD(k)
3424       ENDDO
3425      ENDDO
3426c
3427      DO n=1, nlevSTD8
3428       DO k=1, nlevSTD
3429        if(rlevSTD8(n).EQ.rlevSTD(k)) THEN
3430         tnondefSTD8(:,n)=tnondef(:,k,2)
3431         twriteSTD8(:,n)=tsumSTD(:,k,2)
3432         qwriteSTD8(:,n)=qsumSTD(:,k,2)
3433         rhwriteSTD8(:,n)=rhsumSTD(:,k,2)
3434         phiwriteSTD8(:,n)=phisumSTD(:,k,2)
3435         uwriteSTD8(:,n)=usumSTD(:,k,2)
3436         vwriteSTD8(:,n)=vsumSTD(:,k,2)
3437         wwriteSTD8(:,n)=wsumSTD(:,k,2)
3438        endif !rlevSTD8(n).EQ.rlevSTD(k)
3439       ENDDO
3440      ENDDO
3441c
[524]3442c slp sea level pressure
3443      slp(:) = paprs(:,1)*exp(pphis(:)/(RD*t_seri(:,1)))
3444c
3445ccc prw = eau precipitable
3446      DO i = 1, klon
3447       prw(i) = 0.
3448       DO k = 1, klev
3449        prw(i) = prw(i) +
3450     .           q_seri(i,k)*(paprs(i,k)-paprs(i,k+1))/RG
3451       ENDDO
3452      ENDDO
3453c
[644]3454cIM initialisation + calculs divers diag AMIP2
[524]3455c
[644]3456#include "calcul_divers.h"
3457c
[959]3458      IF (config_inca /= 'none') THEN
[655]3459#ifdef INCA
[959]3460         CALL VTe(VTphysiq)
3461         CALL VTb(VTinca)
3462
[1287]3463         CALL chemhook_end (
[655]3464     $                        dtime,
3465     $                        pplay,
3466     $                        t_seri,
3467     $                        tr_seri,
3468     $                        nbtr,
3469     $                        paprs,
3470     $                        q_seri,
[791]3471     $                        airephy,
[655]3472     $                        pphi,
3473     $                        pphis,
[766]3474     $                        zx_rh)
[959]3475
3476         CALL VTe(VTinca)
3477         CALL VTb(VTphysiq)
[655]3478#endif
[959]3479      END IF
[655]3480
[524]3481c=============================================================
3482c
3483c Convertir les incrementations en tendances
3484c
[766]3485      if (mydebug) then
3486        call writefield_phy('u_seri',u_seri,llm)
3487        call writefield_phy('v_seri',v_seri,llm)
3488        call writefield_phy('t_seri',t_seri,llm)
3489        call writefield_phy('q_seri',q_seri,llm)
3490      endif
3491
[524]3492      DO k = 1, klev
3493      DO i = 1, klon
3494         d_u(i,k) = ( u_seri(i,k) - u(i,k) ) / dtime
3495         d_v(i,k) = ( v_seri(i,k) - v(i,k) ) / dtime
3496         d_t(i,k) = ( t_seri(i,k)-t(i,k) ) / dtime
3497         d_qx(i,k,ivap) = ( q_seri(i,k) - qx(i,k,ivap) ) / dtime
3498         d_qx(i,k,iliq) = ( ql_seri(i,k) - qx(i,k,iliq) ) / dtime
3499      ENDDO
3500      ENDDO
3501c
[1146]3502      IF (nqtot.GE.3) THEN
3503      DO iq = 3, nqtot
[524]3504      DO  k = 1, klev
3505      DO  i = 1, klon
3506         d_qx(i,k,iq) = ( tr_seri(i,k,iq-2) - qx(i,k,iq) ) / dtime
3507      ENDDO
3508      ENDDO
3509      ENDDO
3510      ENDIF
3511c
[644]3512cIM rajout diagnostiques bilan KP pour analyse MJO par Jun-Ichi Yano
[687]3513cIM global posePB#include "write_bilKP_ins.h"
3514cIM global posePB#include "write_bilKP_ave.h"
[644]3515c
[1334]3516
[524]3517c Sauvegarder les valeurs de t et q a la fin de la physique:
3518c
3519      DO k = 1, klev
3520      DO i = 1, klon
[1054]3521         u_ancien(i,k) = u_seri(i,k)
3522         v_ancien(i,k) = v_seri(i,k)
[524]3523         t_ancien(i,k) = t_seri(i,k)
3524         q_ancien(i,k) = q_seri(i,k)
3525      ENDDO
3526      ENDDO
3527c
[879]3528!==========================================================================
3529! Sorties des tendances pour un point particulier
3530! a utiliser en 1D, avec igout=1 ou en 3D sur un point particulier
3531! pour le debug
3532! La valeur de igout est attribuee plus haut dans le programme
3533!==========================================================================
3534
[942]3535      if (prt_level.ge.1) then
[879]3536      write(lunout,*) 'FIN DE PHYSIQ !!!!!!!!!!!!!!!!!!!!'
3537      write(lunout,*)
[1279]3538     s 'nlon,klev,nqtot,debut,lafin,jD_cur, jH_cur, pdtphys pct tlos'
[879]3539      write(lunout,*)
[1279]3540     s  nlon,klev,nqtot,debut,lafin, jD_cur, jH_cur ,pdtphys,
[930]3541     s  pctsrf(igout,is_ter), pctsrf(igout,is_lic),pctsrf(igout,is_oce),
[929]3542     s  pctsrf(igout,is_sic)
[879]3543      write(lunout,*) 'd_t_dyn,d_t_con,d_t_lsc,d_t_ajsb,d_t_ajs,d_t_eva'
[1279]3544      do k=1,klev
[879]3545         write(lunout,*) d_t_dyn(igout,k),d_t_con(igout,k),
3546     s   d_t_lsc(igout,k),d_t_ajsb(igout,k),d_t_ajs(igout,k),
3547     s   d_t_eva(igout,k)
3548      enddo
3549      write(lunout,*) 'cool,heat'
[1279]3550      do k=1,klev
[879]3551         write(lunout,*) cool(igout,k),heat(igout,k)
3552      enddo
3553
3554      write(lunout,*) 'd_t_oli,d_t_vdf,d_t_oro,d_t_lif,d_t_ec'
[1279]3555      do k=1,klev
[879]3556         write(lunout,*) d_t_oli(igout,k),d_t_vdf(igout,k),
3557     s d_t_oro(igout,k),d_t_lif(igout,k),d_t_ec(igout,k)
3558      enddo
3559
3560      write(lunout,*) 'd_ps ',d_ps(igout)
3561      write(lunout,*) 'd_u, d_v, d_t, d_qx1, d_qx2 '
[1279]3562      do k=1,klev
[879]3563         write(lunout,*) d_u(igout,k),d_v(igout,k),d_t(igout,k),
3564     s  d_qx(igout,k,1),d_qx(igout,k,2)
3565      enddo
3566      endif
3567
3568!==========================================================================
3569
3570c============================================================
3571c   Calcul de la temperature potentielle
3572c============================================================
3573      DO k = 1, klev
3574      DO i = 1, klon
3575        theta(i,k)=t(i,k)*(100000./pplay(i,k))**(RD/RCPD)
3576      ENDDO
3577      ENDDO
3578c
3579
[524]3580c 22.03.04 BEG
3581c=============================================================
3582c   Ecriture des sorties
3583c=============================================================
3584#ifdef CPP_IOIPSL
[782]3585 
3586c Recupere des varibles calcule dans differents modules
3587c pour ecriture dans histxxx.nc
[524]3588
[888]3589      ! Get some variables from module fonte_neige_mod
[782]3590      CALL fonte_neige_get_vars(pctsrf,
3591     .     zxfqcalving, zxfqfonte, zxffonte)
3592
3593
[909]3594#include "phys_output_write.h"
3595
[524]3596#ifdef histISCCP
3597#include "write_histISCCP.h"
3598#endif
3599
[1352]3600#ifdef histNMC
3601#include "write_histhfNMC.h"
3602#include "write_histdayNMC.h"
[524]3603#include "write_histmthNMC.h"
3604#endif
3605
[687]3606#include "write_histday_seri.h"
3607
3608#include "write_paramLMDZ_phy.h"
3609
[524]3610#endif
3611
3612c 22.03.04 END
3613c
3614c====================================================================
3615c Si c'est la fin, il faut conserver l'etat de redemarrage
3616c====================================================================
3617c
[782]3618     
3619
[524]3620      IF (lafin) THEN
3621         itau_phy = itau_phy + itap
[967]3622         CALL phyredem ("restartphy.nc")
[1001]3623!         open(97,form="unformatted",file="finbin")
3624!         write(97) u_seri,v_seri,t_seri,q_seri
3625!         close(97)
[1279]3626C$OMP MASTER
3627         if (read_climoz >= 1) then
3628            if (is_mpi_root) then
3629               call nf95_close(ncid_climoz)
3630            end if
3631            deallocate(press_climoz) ! pointer
3632         end if
3633C$OMP END MASTER
[524]3634      ENDIF
3635     
[1279]3636!      first=.false.
[524]3637
3638      RETURN
3639      END
3640      FUNCTION qcheck(klon,klev,paprs,q,ql,aire)
3641      IMPLICIT none
3642c
3643c Calculer et imprimer l'eau totale. A utiliser pour verifier
3644c la conservation de l'eau
3645c
3646#include "YOMCST.h"
3647      INTEGER klon,klev
3648      REAL paprs(klon,klev+1), q(klon,klev), ql(klon,klev)
3649      REAL aire(klon)
3650      REAL qtotal, zx, qcheck
3651      INTEGER i, k
3652c
3653      zx = 0.0
3654      DO i = 1, klon
3655         zx = zx + aire(i)
3656      ENDDO
3657      qtotal = 0.0
3658      DO k = 1, klev
3659      DO i = 1, klon
3660         qtotal = qtotal + (q(i,k)+ql(i,k)) * aire(i)
3661     .                     *(paprs(i,k)-paprs(i,k+1))/RG
3662      ENDDO
3663      ENDDO
3664c
3665      qcheck = qtotal/zx
3666c
3667      RETURN
3668      END
3669      SUBROUTINE gr_fi_ecrit(nfield,nlon,iim,jjmp1,fi,ecrit)
3670      IMPLICIT none
3671c
3672c Tranformer une variable de la grille physique a
3673c la grille d'ecriture
3674c
3675      INTEGER nfield,nlon,iim,jjmp1, jjm
3676      REAL fi(nlon,nfield), ecrit(iim*jjmp1,nfield)
3677c
3678      INTEGER i, n, ig
3679c
3680      jjm = jjmp1 - 1
3681      DO n = 1, nfield
3682         DO i=1,iim
3683            ecrit(i,n) = fi(1,n)
3684            ecrit(i+jjm*iim,n) = fi(nlon,n)
3685         ENDDO
3686         DO ig = 1, nlon - 2
3687           ecrit(iim+ig,n) = fi(1+ig,n)
3688         ENDDO
3689      ENDDO
3690      RETURN
3691      END
Note: See TracBrowser for help on using the repository browser.