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

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

Serie de modifs SL pour homogeneisation des phytitan et phyvenus
Ca touche aussi aux liens phy/dyn (surtout a propos de clesphy0),
a verifier avec les autres, donc...

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