source: trunk/libf/phytitan/physiq.F @ 119

Last change on this file since 119 was 106, checked in by slebonnois, 14 years ago

SL : mise a jour de phytitan pour etre conforme aux sources actuelles
utilisees sur gnome.

File size: 48.2 KB
Line 
1!
2! $Header: /home/cvsroot/LMDZ4/libf/phylmd/physiq.F,v 1.8 2005/02/24 09:58:18 fairhead Exp $
3!
4c
5      SUBROUTINE physiq (nlon,nlev,nqmax,
6     .            debut,lafin,rjourvrai,gmtime,pdtphys,
7     .            paprs,pplay,ppk,pphi,pphis,presnivs,
8     .            u,v,t,qx,
9     .            omega,
10     .            d_u, d_v, d_t, d_qx, d_ps)
11
12c======================================================================
13c
14c Modifications pour la physique de Titan
15c  adaptation a partir de celle de Venus
16c     S. Lebonnois (LMD/CNRS) Mai 2008
17c
18c ---------------------------------------------------------------------
19c Auteur(s) Z.X. Li (LMD/CNRS) date: 19930818
20c
21c Objet: Moniteur general de la physique du modele
22cAA      Modifications quant aux traceurs :
23cAA                  -  uniformisation des parametrisations ds phytrac
24cAA                  -  stockage des moyennes des champs necessaires
25cAA                     en mode traceur off-line
26c    modif   ( P. Le Van ,  12/10/98 )
27c
28c  Arguments:
29c
30c nlon------input-I-nombre de points horizontaux
31c nlev------input-I-nombre de couches verticales
32c nqmax-----input-I-nombre de traceurs
33c debut-----input-L-variable logique indiquant le premier passage
34c lafin-----input-L-variable logique indiquant le dernier passage
35c rjourvrai-input-R-valeur réelle du jour (NBjours.gmtime)
36c gmtime----input-R-temps universel dans la journee (fraction de jour)
37c pdtphys---input-R-pas d'integration pour la physique (seconde)
38c paprs-----input-R-pression pour chaque inter-couche (en Pa)
39c pplay-----input-R-pression pour le mileu de chaque couche (en Pa)
40c ppk  -----input-R-fonction d'Exner au milieu de couche
41c pphi------input-R-geopotentiel de chaque couche (g z) (reference sol)
42c pphis-----input-R-geopotentiel du sol
43c presnivs--input_R_pressions approximat. des milieux couches ( en PA)
44c u---------input-R-vitesse dans la direction X (de O a E) en m/s
45c v---------input-R-vitesse Y (de S a N) en m/s
46c t---------input-R-temperature (K)
47c qx--------input-R-mass mixing ratio traceurs (kg/kg)
48c d_t_dyn---input-R-tendance dynamique pour "t" (K/s)
49c omega-----input-R-vitesse verticale en Pa/s
50c
51c d_u-----output-R-tendance physique de "u" (m/s/s)
52c d_v-----output-R-tendance physique de "v" (m/s/s)
53c d_t-----output-R-tendance physique de "t" (K/s)
54c d_qx----output-R-tendance physique de "qx" (kg/kg/s)
55c d_ps----output-R-tendance physique de la pression au sol
56c======================================================================
57      USE ioipsl
58      USE histcom
59      USE infotrac
60      USE control_mod
61      use dimphy
62      USE comgeomphy
63      IMPLICIT none
64c======================================================================
65c   CLEFS CPP POUR LES IO
66c   =====================
67#define histmth
68#define histday
69#define histins
70c======================================================================
71#include "dimensions.h"
72      integer jjmp1
73      parameter (jjmp1=jjm+1-1/jjm)
74#include "dimsoil.h"
75#include "clesphys.h"
76#include "temps.h"
77#include "iniprint.h"
78#include "timerad.h"
79#include "logic.h"
80#include "comorbit.h"
81c======================================================================
82      LOGICAL ok_mensuel ! sortir le fichier mensuel
83      save ok_mensuel
84c      PARAMETER (ok_mensuel=.true.)
85c
86      LOGICAL ok_journe ! sortir le fichier journalier
87      save ok_journe
88c      PARAMETER (ok_journe=.true.)
89c
90      LOGICAL ok_instan ! sortir le fichier instantane
91      save ok_instan
92c      PARAMETER (ok_instan=.true.)
93c
94c======================================================================
95c
96c Variables argument:
97c
98      INTEGER nlon
99      INTEGER nlev
100      INTEGER nqmax
101      REAL rjourvrai
102      REAL gmtime
103      REAL pdtphys
104      LOGICAL debut, lafin
105      REAL paprs(klon,klev+1)
106      REAL pplay(klon,klev)
107      REAL pphi(klon,klev)
108      REAL pphis(klon)
109      REAL presnivs(klev)
110
111! ADAPTATION GCM POUR CP(T)
112      REAL ppk(klon,klev)
113
114      REAL u(klon,klev)
115      REAL v(klon,klev)
116      REAL t(klon,klev)
117      REAL qx(klon,klev,nqmax)
118
119      REAL,save,allocatable :: t_ancien(:,:)
120      REAL,save,allocatable :: u_ancien(:,:)
121      LOGICAL ancien_ok
122      SAVE ancien_ok
123
124      REAL d_u_dyn(klon,klev)
125      REAL d_t_dyn(klon,klev)
126
127      REAL omega(klon,klev)
128
129      REAL d_u(klon,klev)
130      REAL d_v(klon,klev)
131      REAL d_t(klon,klev)
132      REAL d_qx(klon,klev,nqmax)
133      REAL d_ps(klon)
134
135      REAL,save,allocatable :: swnet(:,:)
136      REAL,save,allocatable :: lwnet(:,:)
137c
138c Variables propres a la physique
139c
140      REAL dtime
141      SAVE dtime                  ! pas temporel de la physique
142c
143      INTEGER radpas
144      SAVE radpas                 ! frequence d'appel rayonnement
145c
146      INTEGER chimpas
147      SAVE chimpas                 ! frequence d'appel chimie
148c
149      REAL,save,allocatable :: radsol(:) ! bilan radiatif au sol calcule par code radiatif
150      REAL,save,allocatable :: rlev(:,:) ! altitude a chaque niveau (interface inferieure de la couche)
151      INTEGER,save :: itap        ! compteur pour la physique
152      REAL,save,allocatable :: ftsol(:)    ! temperature du sol
153      REAL,save,allocatable :: ftsoil(:,:) ! temperature dans le sol
154      REAL,save,allocatable :: falbe(:)    ! albedo
155      REAL delp(klon,klev)        ! epaisseur d'une couche
156     
157CMODDEB FLOTT
158c
159c  Parametres de l'Orographie a l'Echelle Sous-Maille (OESM):
160c
161      REAL,save,allocatable :: zmea(:)   ! orographie moyenne
162      REAL,save,allocatable :: zstd(:)   ! deviation standard de l'OESM
163      REAL,save,allocatable :: zsig(:)   ! pente de l'OESM
164      REAL,save,allocatable :: zgam(:)   ! anisotropie de l'OESM
165      REAL,save,allocatable :: zthe(:)   ! orientation de l'OESM
166      REAL,save,allocatable :: zpic(:)   ! Maximum de l'OESM
167      REAL,save,allocatable :: zval(:)   ! Minimum de l'OESM
168      REAL,save,allocatable :: rugoro(:) ! longueur de rugosite de l'OESM
169
170      INTEGER igwd,idx(klon),itest(klon)
171c
172c  Diagnostiques 2D de drag_noro, lift_noro et gw_nonoro
173
174      REAL zulow(klon),zvlow(klon)
175      REAL zustrdr(klon), zvstrdr(klon)
176      REAL zustrli(klon), zvstrli(klon)
177      REAL zustrhi(klon), zvstrhi(klon)
178
179c Pour calcul GW drag oro et nonoro: CALCUL de N2:
180      real zdzlev(klon,klev)
181      real ztlev(klon,klev),zpklev(klon,klev)
182      real ztetalay(klon,klev),ztetalev(klon,klev)
183      real zdtetalev(klon,klev)
184      real zn2(klon,klev) ! BV^2 at plev
185
186c Pour les bilans de moment angulaire,
187      integer bilansmc
188c Pour le transport de ballons
189      integer ballons
190c j'ai aussi besoin
191c du stress de couche limite a la surface:
192
193      REAL zustrcl(klon),zvstrcl(klon)
194
195c et du stress total c de la physique:
196
197      REAL zustrph(klon),zvstrph(klon)
198c
199      REAL,save,allocatable :: zuthe(:),zvthe(:)
200
201c Variables locales:
202c
203      REAL cdragh(klon) ! drag coefficient pour T and Q
204      REAL cdragm(klon) ! drag coefficient pour vent
205c
206cAA  Pour TRACEURS
207cAA
208      REAL,save,allocatable :: source(:,:)
209      integer nmicro
210      save    nmicro
211
212      REAL ycoefh(klon,klev)    ! coef d'echange pour phytrac
213      REAL yu1(klon)            ! vents dans la premiere couche U
214      REAL yv1(klon)            ! vents dans la premiere couche V
215      character*8 nom
216      REAL qaer(klon,klev,nqmax)
217
218      REAL sens(klon), dsens(klon) ! chaleur sensible et sa derivee
219      REAL,save,allocatable :: dlw(:)  ! derivee infra rouge
220      REAL,save,allocatable :: fder(:) ! Derive de flux (sensible et latente)
221      REAL ve(klon) ! integr. verticale du transport meri. de l'energie
222      REAL vq(klon) ! integr. verticale du transport meri. de l'eau
223      REAL ue(klon) ! integr. verticale du transport zonal de l'energie
224      REAL uq(klon) ! integr. verticale du transport zonal de l'eau
225c
226
227c======================================================================
228c
229c Declaration des procedures appelees
230c
231      EXTERNAL ajsec     ! ajustement sec
232      EXTERNAL clmain    ! couche limite
233      EXTERNAL hgardfou  ! verifier les temperatures
234      EXTERNAL orbite    ! calculer l'orbite
235      EXTERNAL phyetat0  ! lire l'etat initial de la physique
236      EXTERNAL phyredem  ! ecrire l'etat de redemarrage de la physique
237      EXTERNAL radlwsw   ! rayonnements solaire et infrarouge
238      EXTERNAL suphec    ! initialiser certaines constantes
239c      EXTERNAL transp    ! transport total de l'eau et de l'energie
240      EXTERNAL abort_gcm
241      EXTERNAL printflag
242      EXTERNAL zenang
243      EXTERNAL diagetpq
244      EXTERNAL conf_phys
245      EXTERNAL diagphy
246      EXTERNAL mucorr
247      EXTERNAL phytrac
248c
249c Variables locales
250c
251CXXX PB
252      REAL fluxt(klon,klev)   ! flux turbulent de chaleur
253      REAL fluxu(klon,klev)   ! flux turbulent de vitesse u
254      REAL fluxv(klon,klev)   ! flux turbulent de vitesse v
255c
256      REAL flux_dyn(klon,klev)  ! flux de chaleur produit par la dynamique
257      REAL flux_ajs(klon,klev)  ! flux de chaleur ajustement sec
258      REAL flux_ec(klon,klev)   ! flux de chaleur Ec
259c
260c Le rayonnement n'est pas calcule tous les pas, il faut donc
261c                      sauvegarder les sorties du rayonnement
262      REAL,save,allocatable :: heat(:,:)    ! chauffage solaire
263      REAL,save,allocatable :: cool(:,:)    ! refroidissement infrarouge
264      REAL,save,allocatable :: dtrad(:,:)   ! K s-1
265      REAL,save,allocatable :: topsw(:), toplw(:)
266      REAL,save,allocatable :: solsw(:), sollw(:)
267      REAL,save,allocatable :: sollwdown(:) ! downward LW flux at surface
268      REAL tmpout(klon,klev)  ! K s-1
269
270      INTEGER itaprad
271      SAVE itaprad
272      REAL zdtime
273c
274
275c CHIMIE
276
277      REAL    dtimechim
278      INTEGER itapchim,appel_chim
279      SAVE itapchim,dtimechim
280
281c ORBITE
282
283      REAL dist, rmu0(klon), fract(klon), pdecli
284      REAL zday
285      REAL zls
286c
287      INTEGER i, k, iq, ig, j, ll, l
288c
289      REAL zphi(klon,klev)
290      REAL zzlev(klon,klev+1),zzlay(klon,klev),z1,z2
291c
292c Variables du changement
293c
294c ajs: ajustement sec
295c vdf: couche limite (Vertical DiFfusion)
296c mph: microphysique
297c kim: chimie
298      REAL d_t_ajs(klon,klev), d_tr_ajs(klon,klev,nqmax)
299      REAL d_u_ajs(klon,klev), d_v_ajs(klon,klev)
300c
301      REAL d_ts(klon)
302c
303      REAL d_u_vdf(klon,klev), d_v_vdf(klon,klev)
304      REAL d_t_vdf(klon,klev), d_tr_vdf(klon,klev,nqmax)
305c
306      REAL d_tr_mph(klon,klev,nqmax),d_tr_kim(klon,klev,nqmax)
307
308CMOD LOTT: Tendances Orography Sous-maille
309      REAL d_u_oro(klon,klev), d_v_oro(klon,klev)
310      REAL d_t_oro(klon,klev)
311      REAL d_u_lif(klon,klev), d_v_lif(klon,klev)
312      REAL d_t_lif(klon,klev)
313C          Tendances Ondes de G non oro (runs strato).
314      REAL d_u_hin(klon,klev), d_v_hin(klon,klev)
315      REAL d_t_hin(klon,klev)
316
317c
318c Variables liees a l'ecriture de la bande histoire physique
319c
320      INTEGER ecrit_mth
321      SAVE ecrit_mth   ! frequence d'ecriture (fichier mensuel)
322c
323      INTEGER ecrit_day
324      SAVE ecrit_day   ! frequence d'ecriture (fichier journalier)
325c
326      INTEGER ecrit_ins
327      SAVE ecrit_ins   ! frequence d'ecriture (fichier instantane)
328c
329      integer itau_w   ! pas de temps ecriture = itap + itau_phy
330
331c Variables locales pour effectuer les appels en serie
332c
333      REAL t_seri(klon,klev)
334      REAL u_seri(klon,klev), v_seri(klon,klev)
335c
336      REAL tr_seri(klon,klev,nqmax)
337
338      INTEGER        length
339      PARAMETER    ( length = 100 )
340      REAL tabcntr0( length       )
341c
342c pour ioipsl
343      INTEGER ndex2d(iim*jjmp1),ndex3d(iim*jjmp1*klev)
344      REAL zx_tmp_fi2d(klon)      ! variable temporaire grille physique
345      REAL zx_tmp_fi3d(klon,klev) ! variable temporaire pour champs 3D
346      REAL zx_tmp_2d(iim,jjmp1),zx_tmp_3d(iim,jjmp1,klev)
347      REAL zx_lon(iim,jjmp1), zx_lat(iim,jjmp1)
348
349      INTEGER nid_day, nid_mth, nid_ins
350      SAVE nid_day, nid_mth, nid_ins
351c
352      INTEGER nhori, nvert, idayref
353      REAL zsto, zout, zsto1, zsto2, zero
354      parameter (zero=0.0e0)
355      real zjulian
356      save zjulian
357
358      CHARACTER*2  str2
359      character*20 modname
360      character*80 abort_message
361      logical ok_sync
362
363      character*30 nom_fichier
364      character*10 varname
365      character*40 vartitle
366      character*20 varunits
367C     Variables liees au bilan d'energie et d'enthalpi
368      REAL ztsol(klon)
369      REAL      h_vcol_tot, h_dair_tot, h_qw_tot, h_ql_tot
370     $        , h_qs_tot, qw_tot, ql_tot, qs_tot , ec_tot
371      SAVE      h_vcol_tot, h_dair_tot, h_qw_tot, h_ql_tot
372     $        , h_qs_tot, qw_tot, ql_tot, qs_tot , ec_tot
373      REAL      d_h_vcol, d_h_dair, d_qt, d_qw, d_ql, d_qs, d_ec
374      REAL      d_h_vcol_phy
375      REAL      fs_bound, fq_bound
376      SAVE      d_h_vcol_phy
377      REAL      zero_v(klon),zero_v2(klon,klev)
378      CHARACTER*15 ztit
379      INTEGER   ip_ebil  ! PRINT level for energy conserv. diag.
380      SAVE      ip_ebil
381      DATA      ip_ebil/2/
382      INTEGER   if_ebil ! level for energy conserv. dignostics
383      SAVE      if_ebil
384c+jld ec_conser
385      REAL d_t_ec(klon,klev)    ! tendance du a la conversion Ec -> E thermique
386c-jld ec_conser
387
388c TEST VENUS...
389      REAL mang(klon,klev)    ! moment cinetique
390      REAL mangtot            ! moment cinetique total
391
392      CHARACTER*2 str1
393
394c Temporaire avant de trouver mieux :
395c Recuperation des TAU du TR
396      REAL t_tauhvd(klon,klev),t_khvd(klon,klev)
397c  ASTUCE POUR EVITER klon... EN ATTENDANT MIEUX
398      INTEGER   ngrid
399      PARAMETER (ngrid=(jjm-1)*iim+2)  ! = klon
400      INTEGER NSPECV,NSPECI,NLAYER
401      PARAMETER (NSPECV=24,NSPECI=46,NLAYER=llm)
402      REAL TAUHID(ngrid,NLAYER,NSPECI)
403     &               ,TAUGID(ngrid,NLAYER,NSPECI)
404     &               ,TAUHVD(ngrid,NLAYER,NSPECV)
405     &               ,TAUGVD(ngrid,NLAYER,NSPECV)
406
407      COMMON /TAUD/   TAUHID,TAUGID,TAUHVD,TAUGVD
408
409c Declaration des constantes et des fonctions thermodynamiques
410c
411#include "YOMCST.h"
412
413c======================================================================
414c INITIALISATIONS
415c======================================================================
416
417      modname = 'physiq'
418      ok_sync=.TRUE.
419
420      bilansmc = 0
421      ballons  = 0
422
423      IF (if_ebil.ge.1) THEN
424        DO i=1,klon
425          zero_v(i)=0.
426        END DO
427        DO i=1,klon
428         DO j=1,klev
429          zero_v2(i,j)=0.
430         END DO
431        END DO
432      END IF
433     
434c PREMIER APPEL SEULEMENT
435c========================
436      IF (debut) THEN
437         allocate(t_ancien(klon,klev),u_ancien(klon,klev))
438         allocate(swnet(klon,klevp1),lwnet(klon,klevp1))
439         allocate(radsol(klon),ftsol(klon),falbe(klon))
440         allocate(rlev(klon,klevp1),ftsoil(klon,nsoilmx))
441         allocate(zmea(klon),zstd(klon),zsig(klon),zgam(klon))
442         allocate(zthe(klon),zpic(klon),zval(klon),rugoro(klon))
443         allocate(zuthe(klon),zvthe(klon),dlw(klon),fder(klon))
444         allocate(heat(klon,klev),cool(klon,klev))
445         allocate(dtrad(klon,klev),topsw(klon),toplw(klon))
446         allocate(solsw(klon),sollw(klon),sollwdown(klon))
447         allocate(source(klon,nqmax))
448
449         CALL suphec ! initialiser constantes et parametres phys.
450
451         IF (if_ebil.ge.1) d_h_vcol_phy=0.
452c
453c appel a la lecture du physiq.def
454c
455         call conf_phys(ok_mensuel,ok_journe,ok_instan,if_ebil)
456
457c
458c Initialiser les compteurs:
459c
460         itap     = 0
461         itaprad  = 0
462         itapchim = 0
463
464c         
465c Lecture startphy.nc :
466c
467c REMETTRE TOUS LES PARAMETRES POUR OROGW...  A FAIRE POUR TITAN
468         CALL phyetat0 ("startphy.nc",dtime,
469     .       rlatd,rlond,ftsol,ftsoil,
470     .       falbe, solsw, sollw,
471     .       dlw,radsol,
472c     .      zmea,zstd,zsig,zgam,zthe,zpic,zval,
473     .       tabcntr0,
474     .       t_ancien, ancien_ok)
475
476         radpas  = NINT( RDAY/pdtphys/nbapp_rad)
477         chimpas =   radpas*nbapp_rad/nbapp_chim
478
479         CALL printflag( tabcntr0,radpas,chimpas,ok_mensuel,
480     .                             ok_journe, ok_instan )
481
482c
483c Initialiser les pas de temps:
484c
485      dtimerad = dtime*FLOAT(radpas)  ! pas de temps du rayonnement (s)
486c      PRINT*,'dtimerad,dtime,radpas',dtimerad,dtime,radpas
487           
488      dtimechim = dtime*FLOAT(chimpas)  ! pas de temps de la chimie (s)
489c      PRINT*,'dtimechim,dtime,chimpas',dtimechim,dtime,chimpas
490
491
492c INITIALISATION ORBITE
493
494         CALL iniorbit(aphelie,periheli,year_day,peri_day,obliquit)
495
496c---------
497c FLOTT
498c       IF (ok_orodr) THEN
499c         DO i=1,klon
500c         rugoro(i) = MAX(1.0e-05, zstd(i)*zsig(i)/2.0)
501c         ENDDO
502c         CALL SUGWD(klon,klev,paprs,pplay)
503c         DO i=1,klon
504c         zuthe(i)=0.
505c         zvthe(i)=0.
506c         if(zstd(i).gt.10.)then
507c           zuthe(i)=(1.-zgam(i))*cos(zthe(i))
508c           zvthe(i)=(1.-zgam(i))*sin(zthe(i))
509c         endif
510c         ENDDO
511c       ENDIF
512
513      if (bilansmc.eq.1) then
514C  OUVERTURE D'UN FICHIER FORMATTE POUR STOCKER LES COMPOSANTES
515C  DU BILAN DE MOMENT ANGULAIRE.
516      open(27,file='aaam_bud.out',form='formatted')
517      open(28,file='fields_2d.out',form='formatted')
518      write(*,*)'Ouverture de aaam_bud.out (FL Vous parle)'
519      write(*,*)'Ouverture de fields_2d.out (FL Vous parle)'
520      endif !bilansmc
521
522c--------------SLEBONNOIS
523C  OUVERTURE DES FICHIERS FORMATTES CONTENANT LES POSITIONS ET VITESSES
524C  DES BALLONS
525      if (ballons.eq.1) then
526      open(30,file='ballons-lat.out',form='formatted')
527      open(31,file='ballons-lon.out',form='formatted')
528      open(32,file='ballons-u.out',form='formatted')
529      open(33,file='ballons-v.out',form='formatted')
530      open(34,file='ballons-alt.out',form='formatted')
531      write(*,*)'Ouverture des ballons*.out'
532      endif !ballons
533c-------------
534
535c---------
536C TRACEURS
537C source dans couche limite
538          source = 0.0 ! pas de source, pour l'instant
539C
540c Si microphysique offline, pas besoin d'avoir de traceurs microphysiques
541c car on lit les profils verticaux des qaer dans une look-up table pour
542c le rayonnement.
543
544c  calcul de nmicro
545c !!!! Les traceurs microphysiques doivent etre toujours en premiers!!
546
547      nmicro = 0
548      do iq=1,nqmax
549         nom = tname(iq)
550c        print*,iq,"nom=",nom,"tname=",tname(iq)
551         print*,iq,"nom=",nom
552         if (nom(1:1).eq."q") then
553           nmicro = nmicro+1
554         endif
555      enddo
556      print*,"nmicro=",nmicro
557
558c
559c Verifications:
560c
561      if ((nmicro.eq.0).and.(microfi.eq.1)) then
562        print*,"MICROPHYSIQUE ONLINE, MAIS NMICRO=0..."
563        stop
564      endif
565
566         IF (ABS(dtime-pdtphys).GT.0.001) THEN
567            WRITE(lunout,*) 'Pas physique n est pas correct',dtime,
568     .                        pdtphys
569c           abort_message='Pas physique n est pas correct '
570c           call abort_gcm(modname,abort_message,1)
571            dtime=pdtphys
572         ENDIF
573         IF (nlon .NE. klon) THEN
574            WRITE(lunout,*)'nlon et klon ne sont pas coherents', nlon,
575     .                      klon
576            abort_message='nlon et klon ne sont pas coherents'
577            call abort_gcm(modname,abort_message,1)
578         ENDIF
579         IF (nlev .NE. klev) THEN
580            WRITE(lunout,*)'nlev et klev ne sont pas coherents', nlev,
581     .                       klev
582            abort_message='nlev et klev ne sont pas coherents'
583            call abort_gcm(modname,abort_message,1)
584         ENDIF
585c
586         IF (dtime*FLOAT(radpas).GT.(RDAY*0.25).AND.cycle_diurne)
587     $    THEN
588           WRITE(lunout,*)'Nbre d appels au rayonnement insuffisant'
589           WRITE(lunout,*)"Au minimum 4 appels par jour si cycle diurne"
590           abort_message='Nbre d appels au rayonnement insuffisant'
591           call abort_gcm(modname,abort_message,1)
592         ENDIF
593c
594         WRITE(lunout,*)"Clef pour la convection seche, iflag_ajs=",
595     .                   iflag_ajs
596c
597         ecrit_mth = NINT(RDAY/dtime) *nday  ! tous les nday jours
598         IF (ok_mensuel) THEN
599         WRITE(lunout,*)'La frequence de sortie mensuelle est de ',
600     .                   ecrit_mth
601         ENDIF
602
603         ecrit_day = NINT(RDAY/dtime *1.0)  ! tous les jours
604         IF (ok_journe) THEN
605         WRITE(lunout,*)'La frequence de sortie journaliere est de ',
606     .                   ecrit_day
607         ENDIF
608
609         ecrit_ins = NINT(RDAY/dtime*ecritphy)  ! Fraction de jour reglable
610         IF (ok_instan) THEN
611         WRITE(lunout,*)'La frequence de sortie instant. est de ',
612     .                   ecrit_ins
613         ENDIF
614
615c Initialisation des sorties
616c===========================
617
618#ifdef CPP_IOIPSL
619
620#ifdef histmth
621#include "ini_histmth.h"
622#endif
623
624#ifdef histday
625#include "ini_histday.h"
626#endif
627
628#ifdef histins
629#include "ini_histins.h"
630#endif
631
632#endif
633
634c
635c Initialiser les valeurs de u pour calculs tendances
636c (pour T, c'est fait dans phyetat0)
637c
638      DO k = 1, klev
639      DO i = 1, klon
640         u_ancien(i,k) = u(i,k)
641      ENDDO
642      ENDDO
643
644         
645      ENDIF ! debut
646c====================================================================
647c======================================================================
648
649c Mettre a zero des variables de sortie (pour securite)
650c
651      DO i = 1, klon
652         d_ps(i) = 0.0
653      ENDDO
654      DO k = 1, klev
655      DO i = 1, klon
656         d_t(i,k) = 0.0
657         d_u(i,k) = 0.0
658         d_v(i,k) = 0.0
659      ENDDO
660      ENDDO
661      DO iq = 1, nqmax
662      DO k = 1, klev
663      DO i = 1, klon
664         d_qx(i,k,iq) = 0.0
665      ENDDO
666      ENDDO
667      ENDDO
668c
669c Ne pas affecter les valeurs entrees de u, v, h, et q
670c
671      DO k = 1, klev
672      DO i = 1, klon
673         t_seri(i,k)  = t(i,k)
674         u_seri(i,k)  = u(i,k)
675         v_seri(i,k)  = v(i,k)
676      ENDDO
677      ENDDO
678      DO iq = 1, nqmax
679      DO  k = 1, klev
680      DO  i = 1, klon
681         tr_seri(i,k,iq) = qx(i,k,iq)
682      ENDDO
683      ENDDO
684      ENDDO
685C
686      DO i = 1, klon
687          ztsol(i) = ftsol(i)
688      ENDDO
689C
690      IF (if_ebil.ge.1) THEN
691        ztit='after dynamic'
692        CALL diagetpq(airephy,ztit,ip_ebil,1,1,dtime
693     e      , t_seri,zero_v2,zero_v2,zero_v2,u_seri,v_seri,paprs,pplay
694     s      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
695C     Comme les tendances de la physique sont ajoute dans la dynamique,
696C     on devrait avoir que la variation d'entalpie par la dynamique
697C     est egale a la variation de la physique au pas de temps precedent.
698C     Donc la somme de ces 2 variations devrait etre nulle.
699        call diagphy(airephy,ztit,ip_ebil
700     e      , zero_v, zero_v, zero_v, zero_v, zero_v
701     e      , zero_v, zero_v, zero_v, ztsol
702     e      , d_h_vcol+d_h_vcol_phy, d_qt, 0.
703     s      , fs_bound, fq_bound )
704      END IF
705
706c====================================================================
707c Diagnostiquer la tendance dynamique
708c
709      IF (ancien_ok) THEN
710         DO k = 1, klev
711         DO i = 1, klon
712            d_u_dyn(i,k) = (u_seri(i,k)-u_ancien(i,k))/dtime
713            d_t_dyn(i,k) = (t_seri(i,k)-t_ancien(i,k))/dtime
714         ENDDO
715         ENDDO
716
717! ADAPTATION GCM POUR CP(T)
718         do i=1,klon
719          flux_dyn(i,1) = 0.0
720          do j=2,klev
721            flux_dyn(i,j) = flux_dyn(i,j-1)
722     . +cpdet(t_seri(i,j-1))/RG*d_t_dyn(i,j-1)*(paprs(i,j-1)-paprs(i,j))
723          enddo
724         enddo
725         
726      ELSE
727         DO k = 1, klev
728         DO i = 1, klon
729            d_u_dyn(i,k) = 0.0
730            d_t_dyn(i,k) = 0.0
731         ENDDO
732         ENDDO
733         ancien_ok = .TRUE.
734      ENDIF
735c====================================================================
736c
737c Ajouter le geopotentiel du sol:
738c
739      DO k = 1, klev
740      DO i = 1, klon
741         zphi(i,k) = pphi(i,k) + pphis(i)
742      ENDDO
743      ENDDO
744
745c   calcul du geopotentiel aux niveaux intercouches
746c   ponderation des altitudes au niveau des couches en dp/p
747
748      DO l=1,klev
749         DO i=1,klon
750c           zzlay(i,l)=zphi(i,l)/RG
751c SI ON TIENT COMPTE DE LA VARIATION DE G AVEC L'ALTITUDE:
752            zzlay(i,l)=RG*RA*RA/(RG*RA-zphi(i,l))-RA
753         ENDDO
754      ENDDO
755      DO i=1,klon
756c        zzlev(i,1)=0.
757c CORRECTION 13/01/2011 
758c (correspond a la position de la surface en ce point vs RA)
759         zzlev(i,1)=pphis(i)/RG
760      ENDDO
761      DO l=2,klev
762         DO i=1,klon
763            z1=(pplay(i,l-1)+paprs(i,l))/(pplay(i,l-1)-paprs(i,l))
764            z2=(paprs(i,l)+pplay(i,l))/(paprs(i,l)-pplay(i,l))
765            zzlev(i,l)=(z1*zzlay(i,l-1)+z2*zzlay(i,l))/(z1+z2)
766         ENDDO
767      ENDDO
768      DO i=1,klon
769         zzlev(i,klev+1)=zzlay(i,klev)+(zzlay(i,klev)-zzlev(i,klev))
770      ENDDO
771
772c- - - - - - - - - - - - - - - -
773c DIAGNOSTIQUE GRILLE VERTICALE
774c- - - - - - - - - - - - - - - -
775c     print*,"DIAGNOSTIQUE GRILLE VERTICALE"
776c     i=klon/2
777c     print*,"Niveau  Pression  Altitude    (lev puis lay)"
778c     do l=1,klev
779c      print*,l,paprs(i,l),zzlev(i,l)
780c      print*,l,pplay(i,l),zzlay(i,l)
781c     enddo
782c     print*,klev+1,paprs(i,klev+1),zzlev(i,klev+1)
783c     stop
784
785c====================================================================
786c
787c Verifier les temperatures
788c
789      CALL hgardfou(t_seri,ftsol,'debutphy')
790c====================================================================
791c
792c Incrementer le compteur de la physique
793c
794      itap   = itap + 1
795
796c====================================================================
797c
798c Epaisseurs couches
799
800      DO k = 1, klev
801      DO i = 1, klon
802         delp(i,k) = paprs(i,k)-paprs(i,k+1)
803      ENDDO
804      ENDDO
805
806
807
808
809c====================================================================
810c ORBITE ET ECLAIREMENT
811c====================================================================
812
813
814c Pour TITAN:
815c  calcul de la longitude solaire
816          CALL solarlong(rjourvrai,zls)
817          print*,'Ls',zls*180./RPI      ! zls est en radians !!
818      CALL orbite(zls,dist,pdecli)
819
820c dans zenang, Ls en degres ; dans mucorr, Ls en radians
821      IF (cycle_diurne) THEN
822        zdtime=dtime*FLOAT(radpas) ! pas de temps du rayonnement (s)
823        CALL zenang(zls*180./RPI,gmtime,zdtime,rlatd,rlond,rmu0,fract)
824      ELSE
825        call mucorr(klon,zls,rlatd,rmu0,fract)
826      ENDIF
827
828
829
830     
831c====================================================================
832c COUCHE LIMITE
833c====================================================================
834
835c-------------------------------
836c TEST: on ne tient pas compte des calculs de clmain mais on force
837c l'equilibre radiatif du sol
838      if (1.eq.0) then
839              if (debut) then
840                print*,"ATTENTION, CLMAIN SHUNTEE..."
841              endif
842
843      DO i = 1, klon
844         sens(i) = 0.0e0 ! flux de chaleur sensible au sol
845         fder(i) = 0.0e0
846         dlw(i)  = 0.0e0
847      ENDDO
848
849c Incrementer la temperature du sol
850c
851      DO i = 1, klon
852         d_ts(i)  = dtime * radsol(i)/22000. !valeur calculee par GCM pour I=200
853         ftsol(i) = ftsol(i) + d_ts(i)
854         do j=1,nsoilmx
855           ftsoil(i,j)=ftsol(i)
856         enddo
857      ENDDO
858
859c-------------------------------
860      else
861c-------------------------------
862
863      fder = dlw
864
865c     print*,"radsol avant clmain=",radsol(klon/2)
866c     print*,"solsw avant clmain=",solsw(klon/2)
867c     print*,"sollw avant clmain=",sollw(klon/2)
868
869c  CLMAIN
870
871! ADAPTATION GCM POUR CP(T)
872      CALL clmain(dtime,itap,
873     e            t_seri,u_seri,v_seri,
874     e            rmu0,
875     e            ftsol,
876     $            ftsoil,
877     $            paprs,pplay,ppk,radsol,falbe,
878     e            solsw, sollw, sollwdown, fder,
879     e            rlond, rlatd, cuphy, cvphy,
880     e            debut, lafin,
881     s            d_t_vdf,d_u_vdf,d_v_vdf,d_ts,
882     s            fluxt,fluxu,fluxv,cdragh,cdragm,
883     s            dsens,
884     s            ycoefh,yu1,yv1)
885
886c     print*,"radsol apres clmain=",radsol(klon/2)
887c     print*,"solsw apres clmain=",solsw(klon/2)
888c     print*,"sollw apres clmain=",sollw(klon/2)
889
890CXXX Incrementation des flux
891      DO i = 1, klon
892         sens(i) = - fluxt(i,1) ! flux de chaleur sensible au sol
893         fder(i) = dlw(i) + dsens(i)
894      ENDDO
895CXXX
896
897      DO k = 1, klev
898      DO i = 1, klon
899         t_seri(i,k) = t_seri(i,k) + d_t_vdf(i,k)
900         d_t_vdf(i,k)= d_t_vdf(i,k)/dtime          ! K/s
901         u_seri(i,k) = u_seri(i,k) + d_u_vdf(i,k)
902         d_u_vdf(i,k)= d_u_vdf(i,k)/dtime          ! (m/s)/s
903         v_seri(i,k) = v_seri(i,k) + d_v_vdf(i,k)
904         d_v_vdf(i,k)= d_v_vdf(i,k)/dtime          ! (m/s)/s
905      ENDDO
906      ENDDO
907c
908c        print*,"d_t_vdf1=",d_t_vdf(1,:)*dtime
909c        print*,"d_t_vdf2=",d_t_vdf(klon/2,:)*dtime
910c        print*,"d_t_vdf3=",d_t_vdf(klon,:)*dtime
911c        print*,"d_u_vdf=",d_u_vdf(klon/2,:)*dtime
912c        print*,"d_v_vdf=",d_v_vdf(klon/2,:)*dtime
913
914C TRACEURS
915
916      d_tr_vdf = 0.
917      if (iflag_trac.eq.1) then
918      DO iq=1, nqmax
919          CALL cltrac(dtime,ycoefh,t_seri,
920     s               tr_seri(1,1,iq), source,
921     e               paprs, pplay, delp,
922     s               d_tr_vdf(1,1,iq))
923
924          tr_seri(:,:,iq) = tr_seri(:,:,iq) + d_tr_vdf(:,:,iq)
925          d_tr_vdf(:,:,iq)= d_tr_vdf(:,:,iq)/dtime          ! /s
926      ENDDO
927      endif
928     
929           
930      IF (if_ebil.ge.2) THEN
931        ztit='after clmain'
932        CALL diagetpq(airephy,ztit,ip_ebil,2,1,dtime
933     e      , t_seri,zero_v2,zero_v2,zero_v2,u_seri,v_seri,paprs,pplay
934     s      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
935         call diagphy(airephy,ztit,ip_ebil
936     e      , zero_v, zero_v, zero_v, zero_v, sens
937     e      , zero_v, zero_v, zero_v, ztsol
938     e      , d_h_vcol, d_qt, d_ec
939     s      , fs_bound, fq_bound )
940      END IF
941C
942c
943c Incrementer la temperature du sol
944c
945c     print*,'Tsol avant clmain:',ftsol(klon/2)
946      DO i = 1, klon
947         ftsol(i) = ftsol(i) + d_ts(i)
948      ENDDO
949c     print*,'DTsol apres clmain:',d_ts(klon/2)
950c     print*,'Tsol apres clmain:',ftsol(klon/2)
951
952c Calculer la derive du flux infrarouge
953c
954      DO i = 1, klon
955            dlw(i) = - 4.0*RSIGMA*ftsol(i)**3
956      ENDDO
957
958c-------------------------------
959      endif  ! fin du TEST
960
961c
962c Appeler l'ajustement sec
963c
964c===================================================================
965c Convection seche
966c===================================================================
967c
968      d_t_ajs(:,:)=0.
969      d_u_ajs(:,:)=0.
970      d_v_ajs(:,:)=0.
971      d_tr_ajs(:,:,:)=0.
972c
973      IF(prt_level>9)WRITE(lunout,*)
974     .    'AVANT LA CONVECTION SECHE , iflag_ajs='
975     s   ,iflag_ajs
976
977      if(iflag_ajs.eq.0) then
978c  Rien
979c  ====
980         IF(prt_level>9)WRITE(lunout,*)'pas de convection'
981
982      else if(iflag_ajs.eq.1) then
983
984c  Ajustement sec
985c  ==============
986         IF(prt_level>9)WRITE(lunout,*)'ajsec'
987
988! ADAPTATION GCM POUR CP(T)
989         CALL ajsec(paprs, pplay, ppk, t_seri, u_seri, v_seri, nqmax,
990     .              tr_seri, d_t_ajs, d_u_ajs, d_v_ajs, d_tr_ajs)
991
992! ADAPTATION GCM POUR CP(T)
993         do i=1,klon
994          flux_ajs(i,1) = 0.0
995          do j=2,klev
996            flux_ajs(i,j) = flux_ajs(i,j-1)
997     .        + cpdet(t_seri(i,j-1))/RG*d_t_ajs(i,j-1)/dtime
998     .                                 *delp(i,j-1)
999          enddo
1000         enddo
1001         
1002         t_seri(:,:) = t_seri(:,:) + d_t_ajs(:,:)
1003         d_t_ajs(:,:)= d_t_ajs(:,:)/dtime          ! K/s
1004         u_seri(:,:) = u_seri(:,:) + d_u_ajs(:,:)
1005         d_u_ajs(:,:)= d_u_ajs(:,:)/dtime          ! (m/s)/s
1006         v_seri(:,:) = v_seri(:,:) + d_v_ajs(:,:)
1007         d_v_ajs(:,:)= d_v_ajs(:,:)/dtime          ! (m/s)/s
1008      if (iflag_trac.eq.1) then
1009         tr_seri(:,:,:) = tr_seri(:,:,:) + d_tr_ajs(:,:,:)
1010         d_tr_ajs(:,:,:)= d_tr_ajs(:,:,:)/dtime          ! /s
1011      endif
1012     
1013c        print*,"d_t_ajs1=",d_t_ajs(1,:)*dtime
1014c        print*,"d_t_ajs2=",d_t_ajs(klon/2,:)*dtime
1015c        print*,"d_t_ajs3=",d_t_ajs(klon,:)*dtime
1016c        print*,"d_u_ajs=",d_u_ajs(klon/2,:)*dtime
1017c        print*,"d_v_ajs=",d_v_ajs(klon/2,:)*dtime
1018
1019      endif
1020c
1021      IF (if_ebil.ge.2) THEN
1022        ztit='after dry_adjust'
1023        CALL diagetpq(airephy,ztit,ip_ebil,2,2,dtime
1024     e      , t_seri,zero_v2,zero_v2,zero_v2,u_seri,v_seri,paprs,pplay
1025     s      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
1026        call diagphy(airephy,ztit,ip_ebil
1027     e      , zero_v, zero_v, zero_v, zero_v, sens
1028     e      , zero_v, zero_v, zero_v, ztsol
1029     e      , d_h_vcol, d_qt, d_ec
1030     s      , fs_bound, fq_bound )
1031      END IF
1032
1033c====================================================================
1034c   MICROPHYSIQUE ET CHIMIE
1035c====================================================================
1036
1037      d_tr_mph(:,:,:)=0.
1038      d_tr_kim(:,:,:)=0.
1039     
1040c on recupere tr_seri inchange, d_tr_micro, d_tr_chim, tous les trois sur nqmax
1041c on recupere aussi qaer pour le mettre dans les sorties
1042c  si microfi=1, sortie de qaer(1:nmicro)
1043c  si nmicro != nqmax et si chimi, sortie de tr_seri(nmicro+1:nqmax)
1044
1045c faire un test comme pour rayonnement, avec chimi en plus comme flag,
1046c pour voir si chimie appelee -> bouleen, qui passe dans phytrac.
1047c faut aussi le pas de temps chimique: dtimechim, a passer..
1048
1049      appel_chim = 0
1050      IF (MOD(itapchim,chimpas).EQ.0) THEN
1051c             print*,'CHIMIE ',
1052c    $             ' (itapchim=',itapchim,'/chimpas=',chimpas,')'
1053       appel_chim = 1
1054       itapchim = 0
1055      ENDIF
1056      itapchim = itapchim + 1
1057
1058
1059      if (iflag_trac.eq.1) then
1060         call phytrac (debut,lafin,
1061     .                   nqmax,nmicro,dtime,appel_chim,dtimechim,
1062     .                   paprs,pplay,delp,t,rmu0,fract,pdecli,zls,
1063     .                   tr_seri,qaer,d_tr_mph,d_tr_kim)
1064
1065        if (microfi.eq.1) then
1066         tr_seri(:,:,1:nmicro) = tr_seri(:,:,1:nmicro)
1067     .                        + d_tr_mph(:,:,1:nmicro)*dtime
1068        endif
1069        if ((chimi).and.(nqmax.gt.nmicro)) then
1070c chimie:
1071         tr_seri(:,:,:) = tr_seri(:,:,:) + d_tr_kim(:,:,:)*dtime
1072c condensation:
1073         tr_seri(:,:,nmicro+1:nqmax) = tr_seri(:,:,nmicro+1:nqmax)
1074     .                        + d_tr_mph(:,:,nmicro+1:nqmax)*dtime
1075        endif
1076      endif
1077
1078c------------------
1079c test condensation
1080c     do i=1,nqmax
1081c       if(tname(i).eq."HCN") then
1082c          print*,"HCN="
1083c          do k=1,klev
1084c           print*,k,tr_seri(klon/2,k,i),d_tr_mph(klon/2,k,i)*dtime
1085c    v      ,d_tr_kim(klon/2,k,i)*dtime
1086c          enddo
1087c          stop
1088c       endif
1089c     enddo
1090c------------------
1091
1092c====================================================================
1093c RAYONNEMENT
1094c====================================================================
1095
1096      IF (MOD(itaprad,radpas).EQ.0) THEN
1097c             print*,'RAYONNEMENT ',
1098c    $             ' (itaprad=',itaprad,'/radpas=',radpas,')'
1099
1100c ATTENTION, (klon/2) ne marche pas toujours............
1101c     print*,"radsol avant radlwsw=",radsol(klon/2)
1102c     print*,"solsw avant radlwsw=",solsw(klon/2)
1103c     print*,"sollw avant radlwsw=",sollw(klon/2)
1104c     print*,"avant radlwsw"
1105      CALL radlwsw
1106     e            (dist, rmu0, fract, dtimerad, zzlev,
1107     e             paprs, pplay,ftsol, t_seri, nqmax, nmicro,
1108     c             tr_seri, qaer,
1109     s             heat,cool,radsol,
1110     s             topsw,toplw,solsw,sollw,
1111     s             sollwdown,
1112     s             lwnet, swnet)
1113c     print*,"apres radlwsw"
1114
1115c     print*,"radsol apres radlwsw=",radsol(klon/2)
1116c     print*,"solsw apres radlwsw=",solsw(klon/2)
1117c     print*,"sollw apres radlwsw=",sollw(klon/2)
1118      itaprad = 0
1119      DO k = 1, klev
1120      DO i = 1, klon
1121         dtrad(i,k) = heat(i,k)-cool(i,k)     !K/s
1122      ENDDO
1123      ENDDO
1124c       print*,"heat (K/s) =",heat(klon/2,:)
1125c       print*,"cool (K/s) =",cool(klon/2,:)
1126c       print*,"dtrad1 (K/s) =",dtrad(1,:)
1127c       print*,"dtrad2 (K/s) =",dtrad(klon/2,:)
1128c       print*,"dtrad3 (K/s) =",dtrad(klon,:)
1129           
1130      ENDIF
1131      itaprad = itaprad + 1
1132c====================================================================
1133c
1134c Ajouter la tendance des rayonnements (tous les pas)
1135c
1136      DO k = 1, klev
1137      DO i = 1, klon
1138         t_seri(i,k) = t_seri(i,k) + dtrad(i,k) * dtime
1139      ENDDO
1140      ENDDO
1141 
1142      IF (if_ebil.ge.2) THEN
1143        ztit='after rad'
1144        CALL diagetpq(airephy,ztit,ip_ebil,2,2,dtime
1145     e      , t_seri,zero_v2,zero_v2,zero_v2,u_seri,v_seri,paprs,pplay
1146     s      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
1147        call diagphy(airephy,ztit,ip_ebil
1148     e      , topsw, toplw, solsw, sollw, zero_v
1149     e      , zero_v, zero_v, zero_v, ztsol
1150     e      , d_h_vcol, d_qt, d_ec
1151     s      , fs_bound, fq_bound )
1152      END IF
1153c
1154
1155c====================================================================
1156c+jld ec_conser
1157      DO k = 1, klev
1158      DO i = 1, klon
1159        d_t_ec(i,k)=0.5/cpdet(t_seri(i,k))
1160     $      *(u(i,k)**2+v(i,k)**2-u_seri(i,k)**2-v_seri(i,k)**2)
1161        t_seri(i,k)=t_seri(i,k)+d_t_ec(i,k)
1162        d_t_ec(i,k) = d_t_ec(i,k)/dtime
1163       END DO
1164      END DO
1165         do i=1,klon
1166          flux_ec(i,1) = 0.0
1167          do j=2,klev
1168            flux_ec(i,j) = flux_ec(i,j-1)
1169     . +cpdet(t_seri(i,j-1))/RG*d_t_ec(i,j-1)*delp(i,j-1)
1170          enddo
1171         enddo
1172         
1173c-jld ec_conser
1174c====================================================================
1175
1176      IF (if_ebil.ge.1) THEN
1177        ztit='after physic'
1178        CALL diagetpq(airephy,ztit,ip_ebil,1,1,dtime
1179     e      , t_seri,zero_v2,zero_v2,zero_v2,u_seri,v_seri,paprs,pplay
1180     s      , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
1181C     Comme les tendances de la physique sont ajoute dans la dynamique,
1182C     on devrait avoir que la variation d'entalpie par la dynamique
1183C     est egale a la variation de la physique au pas de temps precedent.
1184C     Donc la somme de ces 2 variations devrait etre nulle.
1185        call diagphy(airephy,ztit,ip_ebil
1186     e      , topsw, toplw, solsw, sollw, sens
1187     e      , zero_v, zero_v, zero_v, ztsol
1188     e      , d_h_vcol, d_qt, d_ec
1189     s      , fs_bound, fq_bound )
1190C
1191      d_h_vcol_phy=d_h_vcol
1192C
1193      END IF
1194C
1195c====================================================================
1196c   Calcul  des gravity waves  FLOTT
1197c====================================================================
1198c
1199c      if (ok_orodr.or.ok_gw_nonoro) then
1200cc  CALCUL DE N2
1201c       do i=1,klon
1202c        do k=2,klev
1203c         ztlev(i,k)  = (t_seri(i,k)+t_seri(i,k-1))/2.
1204c         zpklev(i,k) = sqrt(ppk(i,k)*ppk(i,k-1))
1205c       enddo
1206c       enddo
1207c       call t2tpot(klon*klev,ztlev, ztetalev,zpklev)
1208c       call t2tpot(klon*klev,t_seri,ztetalay,ppk)
1209c       do i=1,klon
1210c        do k=2,klev
1211c         zdtetalev(i,k) = ztetalay(i,k)-ztetalay(i,k-1)
1212c         zdzlev(i,k)    = (zphi(i,k)-zphi(i,k-1))/RG
1213c          zn2(i,k) = RG*zdtetalev(i,k)/(ztetalev(i,k)*zdzlev(i,k))
1214c          zn2(i,k) = max(zn2(i,k),1.e-12)  ! securite
1215c       enddo
1216c       enddo
1217c
1218c      endif
1219c     
1220cc ----------------------------ORODRAG
1221c      IF (ok_orodr) THEN
1222cc
1223cc  selection des points pour lesquels le shema est actif:
1224c        igwd=0
1225c        DO i=1,klon
1226c        itest(i)=0
1227cc        IF ((zstd(i).gt.10.0)) THEN
1228c        IF (((zpic(i)-zmea(i)).GT.100.).AND.(zstd(i).GT.10.0)) THEN
1229c          itest(i)=1
1230c          igwd=igwd+1
1231c          idx(igwd)=i
1232c        ENDIF
1233c        ENDDO
1234cc        igwdim=MAX(1,igwd)
1235cc
1236cc A ADAPTER POUR TITAN !!!
1237c        CALL drag_noro(klon,klev,dtime,paprs,pplay,zphi,zn2,
1238c     e                   zmea,zstd, zsig, zgam, zthe,zpic,zval,
1239c     e                   igwd,idx,itest,
1240c     e                   t_seri, u_seri, v_seri,
1241c     s                   zulow, zvlow, zustrdr, zvstrdr,
1242c     s                   d_t_oro, d_u_oro, d_v_oro)
1243c
1244cc  ajout des tendances
1245c           t_seri(:,:) = t_seri(:,:) + d_t_oro(:,:)
1246c           d_t_oro(:,:)= d_t_oro(:,:)/dtime          ! K/s
1247c           u_seri(:,:) = u_seri(:,:) + d_u_oro(:,:)
1248c           d_u_oro(:,:)= d_u_oro(:,:)/dtime          ! (m/s)/s
1249c           v_seri(:,:) = v_seri(:,:) + d_v_oro(:,:)
1250c           d_v_oro(:,:)= d_v_oro(:,:)/dtime          ! (m/s)/s
1251cc   
1252c      ELSE
1253c         d_t_oro = 0.
1254c         d_u_oro = 0.
1255c         d_v_oro = 0.
1256c        zustrdr = 0.
1257c        zvstrdr = 0.
1258cc
1259c      ENDIF ! fin de test sur ok_orodr
1260cc
1261cc ----------------------------OROLIFT
1262c      IF (ok_orolf) THEN
1263cc
1264cc  selection des points pour lesquels le shema est actif:
1265c        igwd=0
1266c        DO i=1,klon
1267c        itest(i)=0
1268c        IF ((zpic(i)-zmea(i)).GT.100.) THEN
1269c          itest(i)=1
1270c          igwd=igwd+1
1271c          idx(igwd)=i
1272c        ENDIF
1273c        ENDDO
1274cc        igwdim=MAX(1,igwd)
1275cc
1276cc A ADAPTER POUR VENUS!!!
1277cc            CALL lift_noro(klon,klev,dtime,paprs,pplay,
1278cc     e                   rlatd,zmea,zstd,zpic,zgam,zthe,zpic,zval,
1279cc     e                   igwd,idx,itest,
1280cc     e                   t_seri, u_seri, v_seri,
1281cc     s                   zulow, zvlow, zustrli, zvstrli,
1282cc     s                   d_t_lif, d_u_lif, d_v_lif               )
1283c
1284cc
1285cc  ajout des tendances
1286c           t_seri(:,:) = t_seri(:,:) + d_t_lif(:,:)
1287c           d_t_lif(:,:)= d_t_lif(:,:)/dtime          ! K/s
1288c           u_seri(:,:) = u_seri(:,:) + d_u_lif(:,:)
1289c           d_u_lif(:,:)= d_u_lif(:,:)/dtime          ! (m/s)/s
1290c           v_seri(:,:) = v_seri(:,:) + d_v_lif(:,:)
1291c           d_v_lif(:,:)= d_v_lif(:,:)/dtime          ! (m/s)/s
1292cc
1293c      ELSE
1294c         d_t_lif = 0.
1295c         d_u_lif = 0.
1296c         d_v_lif = 0.
1297c         zustrli = 0.
1298c         zvstrli = 0.
1299cc
1300c      ENDIF ! fin de test sur ok_orolf
1301c
1302cc ---------------------------- NON-ORO GRAVITY WAVES
1303c       IF(ok_gw_nonoro) then
1304c
1305c      call flott_gwd_ran(klon,klev,dtime,pplay,zn2,
1306c     e               t_seri, u_seri, v_seri,
1307c     o               zustrhi,zvstrhi,
1308c     o               d_t_hin, d_u_hin, d_v_hin)
1309c
1310cc  ajout des tendances
1311c
1312c         t_seri(:,:) = t_seri(:,:) + d_t_hin(:,:)
1313c         d_t_hin(:,:)= d_t_hin(:,:)/dtime          ! K/s
1314c         u_seri(:,:) = u_seri(:,:) + d_u_hin(:,:)
1315c         d_u_hin(:,:)= d_u_hin(:,:)/dtime          ! (m/s)/s
1316c         v_seri(:,:) = v_seri(:,:) + d_v_hin(:,:)
1317c         d_v_hin(:,:)= d_v_hin(:,:)/dtime          ! (m/s)/s
1318c
1319c      ELSE
1320c         d_t_hin = 0.
1321c         d_u_hin = 0.
1322c         d_v_hin = 0.
1323c         zustrhi = 0.
1324c         zvstrhi = 0.
1325c
1326c      ENDIF ! fin de test sur ok_gw_nonoro
1327c
1328c====================================================================
1329c Transport de ballons
1330c====================================================================
1331      if (ballons.eq.1) then
1332         CALL ballon(30,pdtphys,rjourvrai,gmtime,rlatd,rlond,
1333c    C               t,pplay,u,v,pphi)   ! alt above surface (smoothed for GCM)
1334     C               t,pplay,u,v,zphi)   ! alt above planet average radius
1335      endif !ballons
1336
1337c====================================================================
1338c Bilan de mmt angulaire
1339c====================================================================
1340      if (bilansmc.eq.1) then
1341CMODDEB FLOTT
1342C  CALCULER LE BILAN DE MOMENT ANGULAIRE (DIAGNOSTIQUE)
1343C STRESS NECESSAIRES: COUCHE LIMITE ET TOUTE LA PHYSIQUE
1344
1345      DO i = 1, klon
1346        zustrph(i)=0.
1347        zvstrph(i)=0.
1348        zustrcl(i)=0.
1349        zvstrcl(i)=0.
1350      ENDDO
1351      DO k = 1, klev
1352      DO i = 1, klon
1353       zustrph(i)=zustrph(i)+(u_seri(i,k)-u(i,k))/dtime*
1354     c            (paprs(i,k)-paprs(i,k+1))/rg
1355       zvstrph(i)=zvstrph(i)+(v_seri(i,k)-v(i,k))/dtime*
1356     c            (paprs(i,k)-paprs(i,k+1))/rg
1357       zustrcl(i)=zustrcl(i)+d_u_vdf(i,k)*
1358     c            (paprs(i,k)-paprs(i,k+1))/rg
1359       zvstrcl(i)=zvstrcl(i)+d_v_vdf(i,k)*
1360     c            (paprs(i,k)-paprs(i,k+1))/rg
1361      ENDDO
1362      ENDDO
1363
1364      CALL aaam_bud (27,klon,klev,rjourvrai,gmtime,
1365     C               ra,rg,romega,
1366     C               rlatd,rlond,pphis,
1367     C               zustrdr,zustrli,zustrcl,
1368     C               zvstrdr,zvstrli,zvstrcl,
1369     C               paprs,u,v)
1370                     
1371CCMODFIN FLOTT
1372      endif !bilansmc
1373
1374c=======================================================================
1375c   SORTIES
1376c=======================================================================
1377
1378c Convertir les incrementations en tendances
1379c
1380      DO k = 1, klev
1381      DO i = 1, klon
1382         d_u(i,k) = ( u_seri(i,k) - u(i,k) ) / dtime
1383         d_v(i,k) = ( v_seri(i,k) - v(i,k) ) / dtime
1384         d_t(i,k) = ( t_seri(i,k) - t(i,k) ) / dtime
1385      ENDDO
1386      ENDDO
1387c     print*,"vnatphy=",v(705,:)
1388c     print*,"unatphy=",u(705,:)
1389c
1390      DO iq = 1, nqmax
1391      DO  k = 1, klev
1392      DO  i = 1, klon
1393         d_qx(i,k,iq) = ( tr_seri(i,k,iq) - qx(i,k,iq) ) / dtime
1394      ENDDO
1395      ENDDO
1396      ENDDO
1397     
1398c------------------------
1399c Calcul moment cinetique
1400c------------------------
1401c TEST
1402c     mangtot = 0.0
1403c     DO k = 1, klev
1404c     DO i = 1, klon
1405c       mang(i,k) = RA*cos(rlatd(i)*RPI/180.)
1406c    .     *(u_seri(i,k)+RA*cos(rlatd(i)*RPI/180.)*ROMEGA)
1407c    .     *airephy(i)*delp(i,k)/RG
1408c       mangtot=mangtot+mang(i,k)
1409c     ENDDO
1410c     ENDDO
1411c     print*,"Moment cinetique total = ",mangtot
1412c
1413c------------------------
1414c
1415c Sauvegarder les valeurs de t et u a la fin de la physique:
1416c
1417      DO k = 1, klev
1418      DO i = 1, klon
1419         u_ancien(i,k) = u_seri(i,k)
1420         t_ancien(i,k) = t_seri(i,k)
1421      ENDDO
1422      ENDDO
1423c
1424c incrementation de la tendance (repassee en extensif) sur qaer pour sorties
1425      if (microfi.eq.1) then
1426      do iq=1,nmicro
1427         DO l=1,llm
1428          DO i = 1, klon
1429            qaer(i,l,iq) = qaer(i,l,iq) +
1430     .                (d_tr_mph(i,l,iq)*delp(i,l)/RG)*dtime
1431          ENDDO
1432         ENDDO
1433      enddo
1434      endif   ! microfi
1435c=============================================================
1436c   Ecriture des sorties
1437c=============================================================
1438     
1439#ifdef CPP_IOIPSL
1440
1441#ifdef histmth
1442#include "write_histmth.h"
1443#endif
1444
1445#ifdef histday
1446#include "write_histday.h"
1447#endif
1448
1449#ifdef histins
1450#include "write_histins.h"
1451#endif
1452             
1453#endif
1454
1455c ---------- Sorties testphys1d -------------
1456     
1457      if (klon.eq.1) then
1458        call writeg1d(klon,klev,t_seri,"Temp","Temperature")
1459        call writeg1d(klon,1,ftsol,"tsurf","Surface Temp")
1460      DO k = 1, klev
1461      DO i = 1, klon
1462c        tmpout(i,k) = real(heat(i,k))
1463         tmpout(i,k) = heat(i,k)
1464      ENDDO
1465      ENDDO
1466        call writeg1d(klon,klev,tmpout,
1467     .                 "heat","Solar heating")
1468      DO k = 1, klev
1469      DO i = 1, klon
1470c        tmpout(i,k) = real(dtrad(i,k))
1471         tmpout(i,k) = dtrad(i,k)
1472      ENDDO
1473      ENDDO
1474        call writeg1d(klon,klev,tmpout,
1475     .                 "dtrad","IR cooling")
1476        call writeg1d(klon,klev,lwnet,"lwnet","Net LW flux")
1477        call writeg1d(klon,klev,swnet,"swnet","Net SW flux")
1478        call writeg1d(klon,klev,fluxt,"flux_vdf","Turbulent flux")
1479        call writeg1d(klon,klev,flux_ajs,"flux_ajs","Dry adjust. flux")
1480        call writeg1d(klon,klev,flux_ec,"flux_ec","Ec flux")
1481c       call writeg1d(klon,1,solsw,"surfsw","Net SW flux at surface")
1482c       call writeg1d(klon,1,sollw,"surflw","Net LW flux at surface")
1483        call writeg1d(klon,1,radsol,"surfnet","Net flux at surface")
1484        call writeg1d(klon,klev,d_t_vdf,"dt_vdf","DT from clmain")
1485        call writeg1d(klon,klev,d_t_ajs,"dt_ajs","DT from ajsec")
1486        call writeg1d(klon,klev,d_t_ec,"dt_ec","DT from Ec")
1487      endif
1488     
1489c====================================================================
1490c Si c'est la fin, il faut conserver l'etat de redemarrage
1491c====================================================================
1492c
1493      IF (lafin) THEN
1494         itau_phy = itau_phy + itap
1495c REMETTRE TOUS LES PARAMETRES POUR OROGW... A FAIRE POUR TITAN
1496         CALL phyredem ("restartphy.nc",dtime,radpas,chimpas,
1497     .      rlatd, rlond, ftsol, ftsoil,
1498     .      falbe,
1499     .      solsw, sollw,dlw,
1500     .      radsol,
1501c     .      zmea,zstd,zsig,zgam,zthe,zpic,zval,
1502     .      t_ancien)
1503     
1504c--------------FLOTT
1505CMODEB LOTT
1506C  FERMETURE DU FICHIER FORMATTE CONTENANT LES COMPOSANTES
1507C  DU BILAN DE MOMENT ANGULAIRE.
1508      if (bilansmc.eq.1) then
1509        write(*,*)'Fermeture de aaam_bud.out (FL Vous parle)'
1510        close(27)                                     
1511        close(28)                                     
1512      endif !bilansmc
1513CMODFIN
1514c-------------
1515c--------------SLEBONNOIS
1516C  FERMETURE DES FICHIERS FORMATTES CONTENANT LES POSITIONS ET VITESSES
1517C  DES BALLONS
1518      if (ballons.eq.1) then
1519        write(*,*)'Fermeture des ballons*.out'
1520        close(30)                                     
1521        close(31)                                     
1522        close(32)                                     
1523        close(33)                                     
1524        close(34)                                     
1525      endif !ballons
1526c-------------
1527      ENDIF
1528     
1529
1530      RETURN
1531      END
1532
1533
1534
1535***********************************************************************
1536***********************************************************************
1537***********************************************************************
1538***********************************************************************
1539***********************************************************************
1540***********************************************************************
1541***********************************************************************
1542***********************************************************************
1543
1544      SUBROUTINE gr_fi_ecrit(nfield,nlon,iim,jjmp1,fi,ecrit)
1545      IMPLICIT none
1546c
1547c Tranformer une variable de la grille physique a
1548c la grille d'ecriture
1549c
1550      INTEGER nfield,nlon,iim,jjmp1, jjm
1551      REAL fi(nlon,nfield), ecrit(iim*jjmp1,nfield)
1552c
1553      INTEGER i, n, ig
1554c
1555      jjm = jjmp1 - 1
1556      DO n = 1, nfield
1557         DO i=1,iim
1558            ecrit(i,n) = fi(1,n)
1559            ecrit(i+jjm*iim,n) = fi(nlon,n)
1560         ENDDO
1561         DO ig = 1, nlon - 2
1562           ecrit(iim+ig,n) = fi(1+ig,n)
1563         ENDDO
1564      ENDDO
1565      RETURN
1566      END
Note: See TracBrowser for help on using the repository browser.