source: trunk/LMDZ.GENERIC/libf/dyn3d/gcm.F @ 223

Last change on this file since 223 was 135, checked in by aslmd, 14 years ago

CHANGEMENT ARBORESCENCE ETAPE 2 -- NON COMPLET

File size: 17.5 KB
Line 
1      PROGRAM gcm
2
3      IMPLICIT NONE
4
5c      ......   Version  du 10/01/98    ..........
6
7c             avec  coordonnees  verticales hybrides
8c   avec nouveaux operat. dissipation * ( gradiv2,divgrad2,nxgraro2 )
9
10c=======================================================================
11c
12c   Auteur:  P. Le Van /L. Fairhead/F.Hourdin
13c   -------
14c
15c   Objet:
16c   ------
17c
18c   GCM LMD nouvelle grille
19c
20c=======================================================================
21c
22c  ... Dans inigeom , nouveaux calculs pour les elongations  cu , cv
23c      et possibilite d'appeler une fonction f(y)  a derivee tangente
24c      hyperbolique a la  place de la fonction a derivee sinusoidale.
25
26c  ... Possibilite de choisir le shema de Van-leer pour l'advection de
27c        q  , en faisant iadv = 3  dans   traceur  (29/04/97) .
28c
29c      Pour Van-Leer + Vapeur d'eau saturee, iadv(1)=4. (F.Codron,10/99)
30c
31c-----------------------------------------------------------------------
32c   Declarations:
33c   -------------
34
35#include "dimensions.h"
36#include "paramet.h"
37#include "comconst.h"
38#include "comdissnew.h"
39#include "comvert.h"
40#include "comgeom.h"
41#include "logic.h"
42#include "temps.h"
43#include "control.h"
44#include "ener.h"
45#include "netcdf.inc"
46#include "description.h"
47#include "serre.h"
48#include "tracstoke.h"
49#include "sponge.h"
50#include"advtrac.h"
51
52      INTEGER*4  iday ! jour julien
53      REAL       time ! Heure de la journee en fraction d''1 jour
54      REAL zdtvr
55
56c   variables dynamiques
57      REAL vcov(ip1jm,llm),ucov(ip1jmp1,llm) ! vents covariants
58      real, dimension(ip1jmp1,llm) :: teta   ! temperature potentielle
59      REAL q(ip1jmp1,llm,nqmx)               ! champs advectes
60      REAL ps(ip1jmp1)                       ! pression  au sol
61      REAL pext(ip1jmp1)                     ! pression  extensive
62      REAL p (ip1jmp1,llmp1  )               ! pression aux interfac.des couches
63      REAL pks(ip1jmp1)                      ! exner au  sol
64      REAL pk(ip1jmp1,llm)                   ! exner au milieu des couches
65      REAL pkf(ip1jmp1,llm)                  ! exner filt.au milieu des couches
66      REAL masse(ip1jmp1,llm)                ! masse d''air
67      REAL phis(ip1jmp1)                     ! geopotentiel au sol
68      REAL phi(ip1jmp1,llm)                  ! geopotentiel
69      REAL w(ip1jmp1,llm)                    ! vitesse verticale
70
71c variables dynamiques intermediaire pour le transport
72      REAL pbaru(ip1jmp1,llm),pbarv(ip1jm,llm) !flux de masse
73
74c   variables dynamiques au pas -1
75      REAL vcovm1(ip1jm,llm),ucovm1(ip1jmp1,llm)
76
77      REAL tetam1(ip1jmp1,llm),psm1(ip1jmp1)
78      REAL massem1(ip1jmp1,llm)
79
80c   tendances dynamiques
81      REAL dv(ip1jm,llm),du(ip1jmp1,llm)
82      REAL dteta(ip1jmp1,llm),dq(ip1jmp1,llm,nqmx),dp(ip1jmp1)
83
84c   tendances de la dissipation
85      REAL dvdis(ip1jm,llm),dudis(ip1jmp1,llm)
86      REAL dhdis(ip1jmp1,llm)
87
88c   tendances physiques
89      REAL dvfi(ip1jm,llm),dufi(ip1jmp1,llm)
90      REAL dhfi(ip1jmp1,llm),dqfi(ip1jmp1,llm,nqmx),dpfi(ip1jmp1)
91
92c   variables pour le fichier histoire
93      REAL dtav      ! intervalle de temps elementaire
94
95      REAL tppn(iim),tpps(iim),tpn,tps
96c
97!      INTEGER iadv(nqmx) ! indice schema de transport pour le traceur iq
98
99      INTEGER itau,itaufinp1,iav
100
101
102      EXTERNAL caldyn, traceur
103      EXTERNAL dissip,geopot,iniconst,inifilr
104      EXTERNAL integrd,SCOPY
105      EXTERNAL inigeom
106      EXTERNAL exner_hyb,addit
107      EXTERNAL defrun_new, test_period
108      REAL  SSUM
109      REAL time_0 , finvmaold(ip1jmp1,llm)
110
111      LOGICAL lafin
112      INTEGER ij,iq,l,ierr,numvanle,iapp_tracvl
113
114      REAL rdayvrai,rdaym_ini,rday_ecri
115!      LOGICAL first
116      REAL beta(ip1jmp1,llm)
117
118      LOGICAL offline  ! Controle du stockage ds "fluxmass"
119      PARAMETER (offline=.false.)
120
121      character*20 modname
122      character*80 abort_message
123
124      LOGICAL tracer
125          data tracer/.true./
126      INTEGER nq
127
128C Calendrier
129      LOGICAL true_calendar
130      PARAMETER (true_calendar = .false.)
131
132! flag to set/remove calls to groupeun
133      logical callgroupeun
134      parameter (callgroupeun = .true.)
135
136!     added by RDW for tests without dynamics
137      logical calldyn
138      parameter (calldyn = .true.)
139
140
141c-----------------------------------------------------------------------
142c   Initialisations:
143c   ----------------
144
145      modname = 'gcm'
146      descript = 'Run GCM LMDZ'
147      lafin    = .FALSE.
148
149c-----------------------------------------------------------------------
150c  Initialize tracers using iniadvtrac (Ehouarn, oct 2008)
151      CALL iniadvtrac(nq,numvanle)
152
153      CALL dynetat0("start.nc",nqmx,vcov,ucov,
154     .              teta,q,masse,ps,phis, time_0)
155
156      CALL defrun_new( 99, .TRUE. )
157
158
159c  on recalcule eventuellement le pas de temps
160
161      IF(MOD(day_step,iperiod).NE.0)
162     * STOP'Il faut choisir un nb de pas par jour multiple de iperiod'
163
164      IF(MOD(day_step,iphysiq).NE.0)
165     * STOP'Il faut choisir un nb de pas par jour multiple de iphysiq'
166
167      zdtvr    = daysec/FLOAT(day_step)
168
169        IF(dtvr.NE.zdtvr) THEN
170         PRINT*,'WARNING!!! changement de pas de temps',dtvr,'>',zdtvr
171        ENDIF
172
173c  nombre d'etats dans les fichiers demarrage et histoire
174
175      dtvr = zdtvr
176      CALL iniconst
177      CALL inigeom
178
179      CALL inifilr
180
181c
182c   ......    P.Le Van    ( modif  le 29/04/97 )   ......... 
183c
184
185      CALL inidissip ( lstardis, nitergdiv, nitergrot, niterh   ,
186     *                tetagdiv, tetagrot , tetatemp              )
187c
188
189      CALL pression ( ip1jmp1, ap, bp, ps, p       )
190
191      call dump2d(iip1,jjp1,ps,'PRESSION SURFACE')
192      CALL exner_hyb( ip1jmp1, ps, p,beta, pks, pk, pkf )
193
194c
195c  numero de stockage pour les fichiers de redemarrage:
196
197c-----------------------------------------------------------------------
198c   temps de depart et de fin:
199c   --------------------------
200
201      itau = 0
202      iday = day_ini+itau/day_step
203      time = FLOAT(itau-(iday-day_ini)*day_step)/day_step+time_0
204
205
206         IF(time.GT.1.) THEN
207          time = time-1.
208          iday = iday+1
209         ENDIF
210      itaufin   = nday*day_step
211c ********************************
212c      itaufin = 120   ! temporaire !!
213c ********************************
214      itaufinp1 = itaufin +1
215
216      day_end = day_ini + nday
217      PRINT 300, itau,itaufin,day_ini,day_end
218 300  FORMAT('1'/,15x,'run du pas',i7,2x,'au pas',i7,2x, 
219     . 'c''est a dire du jour',i7,3x,'au jour',i7//)
220
221      CALL dynredem0("restart.nc",day_end,anne_ini,phis,nqmx)
222
223      ecripar = .TRUE.
224
225      dtav = iperiod*dtvr/daysec
226
227
228c   Quelques initialisations pour les traceurs
229      call initial0(ijp1llm*nqmx,dq)
230c     istdyn=day_step/4     ! stockage toutes les 6h=1jour/4
231c     istphy=istdyn/iphysiq
232
233      write(*,*) "gcm: callgroupeun set to:",callgroupeun
234c-----------------------------------------------------------------------
235c   Debut de l'integration temporelle:
236c   ----------------------------------
237
238   1  CONTINUE
239c
240      IF( MOD( itau, 10* day_step ).EQ.0 )  THEN
241        CALL test_period ( ucov,vcov,teta,q,p,phis )
242        PRINT *,' ----   Test_period apres continue   OK ! -----', itau
243      ENDIF
244
245      if (callgroupeun) then
246        call groupeun(jjp1,llm,ucov,.true.)
247        call groupeun(jjm,llm,vcov,.true.)
248        call groupeun(jjp1,llm,teta,.true.)
249        call groupeun(jjp1,llm,masse,.true.)
250        call groupeun(jjp1,1,ps,.false.)
251      endif
252
253      CALL SCOPY( ijmllm ,vcov , 1, vcovm1 , 1 )
254      CALL SCOPY( ijp1llm,ucov , 1, ucovm1 , 1 )
255      CALL SCOPY( ijp1llm,teta , 1, tetam1 , 1 )
256      CALL SCOPY( ijp1llm,masse, 1, massem1, 1 )
257      CALL SCOPY( ip1jmp1, ps  , 1,   psm1 , 1 )
258
259      forward = .TRUE.
260      leapf   = .FALSE.
261      dt      =  dtvr
262
263c   ...    P.Le Van .26/04/94  ....
264
265      CALL SCOPY   ( ijp1llm,   masse, 1, finvmaold,     1 )
266      CALL filtreg ( finvmaold ,jjp1, llm, -2,2, .TRUE., 1 )
267
268
269   2  CONTINUE
270
271c-----------------------------------------------------------------------
272
273c   date:
274c   -----
275
276!      write(*,*) 'GCM: itau=',itau
277
278c   gestion des appels de la physique et des dissipations:
279c   ------------------------------------------------------
280c
281c   ...    P.Le Van  ( 6/02/95 )  ....
282
283      apphys = .FALSE.
284      statcl = .FALSE.
285      conser = .FALSE.
286      apdiss = .FALSE.
287
288      IF( purmats ) THEN
289         IF( MOD(itau,iconser) .EQ.0.AND.  forward    ) conser = .TRUE.
290         IF( MOD(itau,idissip ).EQ.0.AND..NOT.forward ) apdiss = .TRUE.
291         IF( MOD(itau,iphysiq ).EQ.0.AND..NOT.forward
292     $                              .AND.   physic    ) apphys = .TRUE.
293      ELSE
294         IF( MOD(itau   ,iconser) .EQ. 0              ) conser = .TRUE.
295         IF( MOD(itau+1,idissip)  .EQ. 0              ) apdiss = .TRUE.
296         IF( MOD(itau+1,iphysiq).EQ.0. AND. physic    ) apphys = .TRUE.
297      END IF
298
299c-----------------------------------------------------------------------
300c   calcul des tendances dynamiques:
301c   --------------------------------
302
303      CALL geopot  ( ip1jmp1, teta  , pk , pks,  phis  , phi   )
304
305
306      if(calldyn)then
307         CALL caldyn
308     $        ( itau,ucov,vcov,teta,ps,masse,pk,pkf,phis ,
309     $        phi,conser,du,dv,dteta,dp,w,pbaru,pbarv,time+iday-day_ini)
310      endif
311
312c-----------------------------------------------------------------------
313c   calcul des tendances advection des traceurs (dont l'humidite)
314c   -------------------------------------------------------------
315
316      if (tracer) then
317       IF( forward. OR . leapf )  THEN
318
319        DO iq = 1, nqmx
320c
321         IF ( iadv(iq).EQ.1.OR.iadv(iq).EQ.2 )  THEN
322            CALL traceur( iq,iadv,q,teta,pk,w, pbaru, pbarv, dq )
323
324         ELSE IF( iq.EQ. nqmx )   THEN
325c
326            iapp_tracvl = 5
327c
328cccc     iapp_tracvl est la frequence en pas du groupement des flux
329cccc      de masse pour  Van-Leer dans la routine  tracvl  .
330c
331
332            CALL vanleer(numvanle,iapp_tracvl,nqmx,q,pbaru,pbarv,
333     *                      p, masse, dq,  iadv(1), teta, pk     )
334
335c
336c                   ...  Modif  F.Codron  ....
337c
338         ENDIF
339c
340        ENDDO
341C
342c        IF (offline) THEN
343C maf stokage du flux de masse pour traceurs OFF-LINE
344
345c           CALL fluxstokenc(pbaru,pbarv,masse,teta,phi,phis,
346c    .   time_step, itau)
347
348c        ENDIF
349c
350      ENDIF
351          END IF   ! tracer
352
353
354c-----------------------------------------------------------------------
355c   integrations dynamique et traceurs:
356c   ----------------------------------
357
358          if(calldyn)then
359             CALL integrd(2,vcovm1,ucovm1,tetam1,psm1,massem1,
360     $            dv,du,dteta,dq,dp,vcov,ucov,teta,q,ps,masse,phis,
361     $            finvmaold)
362          endif
363
364
365
366
367
368c .P.Le Van (26/04/94  ajout de  finvpold dans l'appel d'integrd)
369c
370c-----------------------------------------------------------------------
371c   calcul des tendances physiques:
372c   -------------------------------
373c    ########   P.Le Van ( Modif le  6/02/95 )   ###########
374c
375       IF( purmats )  THEN
376          IF( itau.EQ.itaufin.AND..NOT.forward ) lafin = .TRUE.
377       ELSE
378          IF( itau+1. EQ. itaufin )              lafin = .TRUE.
379       ENDIF
380c
381c
382       IF( apphys )  THEN
383c
384c     .......   Ajout   P.Le Van ( 17/04/96 )   ...........
385c
386
387         CALL pression (  ip1jmp1, ap, bp, ps,  p      )
388         CALL exner_hyb(  ip1jmp1, ps, p,beta,pks, pk, pkf )
389
390           rdaym_ini  = itau * dtvr / daysec
391           rdayvrai   = rdaym_ini  + day_ini
392
393           IF ( ecritphy.LT.1. )  THEN
394             rday_ecri = rdaym_ini
395           ELSE
396             rday_ecri = INT( rdayvrai )
397           ENDIF
398c
399
400
401
402        CALL calfis( nqmx, lafin ,rdayvrai,rday_ecri,time  ,
403     $                 ucov,vcov,teta,q,masse,ps,p,pk,phis,phi ,
404     $     du,dv,dteta,dq,w, dufi,dvfi,dhfi,dqfi,dpfi,tracer)
405
406
407c      ajout des tendances physiques:
408c      ------------------------------
409          CALL addfi( nqmx, dtphys, leapf, forward   ,
410     $                  ucov, vcov, teta , q   ,ps , masse,
411     $                 dufi, dvfi, dhfi , dqfi ,dpfi  )
412c
413       ENDIF
414
415       CALL pression ( ip1jmp1, ap, bp, ps, p                  )
416
417       CALL exner_hyb( ip1jmp1, ps, p,beta, pks, pk, pkf )
418c   ----------------------------------------------------------
419
420c
421c
422c   dissipation horizontale et verticale  des petites echelles:
423c   ----------------------------------------------------------
424
425      IF(apdiss) THEN
426
427c        Sponge layer
428c        ~~~~~~~~~~~~
429         DO ij=1, ip1jmp1
430            pext(ij)=ps(ij)*aire(ij)
431         ENDDO
432         IF (callsponge) THEN
433            CALL sponge(ucov,vcov,teta,pext,dtdiss,mode_sponge)
434         ENDIF
435
436c        Dissipation horizontale
437c        ~~~~~~~~~~~~~~~~~~~~~~~
438         CALL dissip(vcov,ucov,teta,p,dvdis,dudis,dhdis)
439
440         CALL addit( ijp1llm,ucov ,dudis,ucov )
441         CALL addit( ijmllm ,vcov ,dvdis,vcov )
442         CALL addit( ijp1llm,teta ,dhdis,teta )
443
444
445c    .......        P. Le Van (  ajout  le 17/04/96  )   ...........
446c   ...      Calcul de la valeur moyenne, unique de h aux poles  .....
447c
448
449        DO l  =  1, llm
450          DO ij =  1,iim
451           tppn(ij)  = aire(  ij    ) * teta(  ij    ,l)
452           tpps(ij)  = aire(ij+ip1jm) * teta(ij+ip1jm,l)
453          ENDDO
454
455           tpn  = SSUM(iim,tppn,1)/apoln
456           tps  = SSUM(iim,tpps,1)/apols
457
458          DO ij = 1, iip1
459           teta(  ij    ,l) = tpn
460           teta(ij+ip1jm,l) = tps
461          ENDDO
462        ENDDO
463
464        DO ij =  1,iim
465          tppn(ij)  = aire(  ij    ) * ps (  ij    )
466          tpps(ij)  = aire(ij+ip1jm) * ps (ij+ip1jm)
467        ENDDO
468          tpn  = SSUM(iim,tppn,1)/apoln
469
470          tps  = SSUM(iim,tpps,1)/apols
471
472        DO ij = 1, iip1
473          ps(  ij    ) = tpn
474          ps(ij+ip1jm) = tps
475        ENDDO
476
477
478
479
480
481
482
483      END IF
484       
485c   ********************************************************************
486c   ********************************************************************
487c   .... fin de l'integration dynamique  et physique pour le pas itau ..
488c   ********************************************************************
489c   ********************************************************************
490
491c   preparation du pas d'integration suivant  ......
492
493      IF ( .NOT.purmats ) THEN
494c       ........................................................
495c       ..............  schema matsuno + leapfrog  ..............
496c       ........................................................
497
498            IF(forward. OR. leapf) THEN
499              itau= itau + 1
500              iday= day_ini+itau/day_step
501              time= FLOAT(itau-(iday-day_ini)*day_step)/day_step+time_0
502                IF(time.GT.1.) THEN
503                  time = time-1.
504                  iday = iday+1
505                ENDIF
506            ENDIF
507
508
509            IF( itau. EQ. itaufinp1 ) then 
510              abort_message = 'Simulation finished'
511              call abort_gcm(modname,abort_message,0)
512            ENDIF
513c-----------------------------------------------------------------------
514c   ecriture du fichier histoire moyenne:
515c   -------------------------------------
516
517c           IF(MOD(itau,iperiod).EQ.0 .OR. itau.EQ.itaufin) THEN
518c              IF(itau.EQ.itaufin) THEN
519c                 iav=1
520c              ELSE
521c                 iav=0
522c              ENDIF
523c              CALL writedynav(histaveid, nqmx, itau,vcov ,
524c    ,                          ucov,teta,pk,phi,q,masse,ps,phis)
525c           ENDIF
526
527c-----------------------------------------------------------------------
528
529
530            IF(itau.EQ.itaufin) THEN
531
532
533       PRINT *,' Appel test_period avant redem ', itau
534       CALL test_period ( ucov,vcov,teta,q,p,phis )
535       CALL dynredem1("restart.nc",0.0,
536     .                     vcov,ucov,teta,q,nqmx,masse,ps)
537
538              CLOSE(99)
539            ENDIF
540
541c-----------------------------------------------------------------------
542c   gestion de l'integration temporelle:
543c   ------------------------------------
544
545            IF( MOD(itau,iperiod).EQ.0 )    THEN
546                    GO TO 1
547            ELSE IF ( MOD(itau-1,iperiod). EQ. 0 ) THEN
548
549                   IF( forward )  THEN
550c      fin du pas forward et debut du pas backward
551
552                      forward = .FALSE.
553                        leapf = .FALSE.
554                           GO TO 2
555
556                   ELSE
557c      fin du pas backward et debut du premier pas leapfrog
558
559                        leapf =  .TRUE.
560                        dt  =  2.*dtvr
561                        GO TO 2
562                   END IF
563            ELSE
564
565c      ......   pas leapfrog  .....
566
567                 leapf = .TRUE.
568                 dt  = 2.*dtvr
569                 GO TO 2
570            END IF
571
572      ELSE
573
574c       ........................................................
575c       ..............       schema  matsuno        ...............
576c       ........................................................
577            IF( forward )  THEN
578
579             itau =  itau + 1
580             iday = day_ini+itau/day_step
581             time = FLOAT(itau-(iday-day_ini)*day_step)/day_step+time_0
582
583                  IF(time.GT.1.) THEN
584                   time = time-1.
585                   iday = iday+1
586                  ENDIF
587
588               forward =  .FALSE.
589               IF( itau. EQ. itaufinp1 ) then 
590                 abort_message = 'Simulation finished'
591                 call abort_gcm(modname,abort_message,0)
592               ENDIF
593               GO TO 2
594
595            ELSE
596
597            IF(MOD(itau,iperiod).EQ.0 .OR. itau.EQ.itaufin) THEN
598               IF(itau.EQ.itaufin) THEN
599                  iav=1
600               ELSE
601                  iav=0
602               ENDIF
603c              CALL writedynav(histaveid, nqmx, itau,vcov ,
604c    ,                          ucov,teta,pk,phi,q,masse,ps,phis)
605
606            ENDIF
607
608
609                 IF(itau.EQ.itaufin)
610     . CALL dynredem1("restart.nc",0.0,
611     .                     vcov,ucov,teta,q,nqmx,masse,ps)
612
613                 forward = .TRUE.
614                 GO TO  1
615
616
617            ENDIF
618
619      END IF
620
621      STOP
622      END
Note: See TracBrowser for help on using the repository browser.