/[lmdze]/trunk/Sources/dyn3d/leapfrog.f
ViewVC logotype

Diff of /trunk/Sources/dyn3d/leapfrog.f

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

revision 28 by guez, Fri Mar 26 18:33:04 2010 UTC revision 29 by guez, Tue Mar 30 10:44:42 2010 UTC
# Line 12  contains Line 12  contains
12      USE calfis_m, ONLY: calfis      USE calfis_m, ONLY: calfis
13      USE com_io_dyn, ONLY: histaveid      USE com_io_dyn, ONLY: histaveid
14      USE comconst, ONLY: daysec, dtphys, dtvr      USE comconst, ONLY: daysec, dtphys, dtvr
15      USE comgeom, ONLY: aire, apoln, apols      USE comgeom, ONLY: aire_2d, apoln, apols
16      USE comvert, ONLY: ap, bp      USE comvert, ONLY: ap, bp
17      USE conf_gcm_m, ONLY: day_step, iconser, iperiod, iphysiq, nday, offline, &      USE conf_gcm_m, ONLY: day_step, iconser, iperiod, iphysiq, nday, offline, &
18           periodav           periodav
19      USE dimens_m, ONLY: iim, llm, nqmx      USE dimens_m, ONLY: iim, jjm, llm, nqmx
20      USE dynetat0_m, ONLY: day_ini      USE dynetat0_m, ONLY: day_ini
21      use dynredem1_m, only: dynredem1      use dynredem1_m, only: dynredem1
22      USE exner_hyb_m, ONLY: exner_hyb      USE exner_hyb_m, ONLY: exner_hyb
# Line 24  contains Line 24  contains
24      USE guide_m, ONLY: guide      USE guide_m, ONLY: guide
25      use inidissip_m, only: idissip      use inidissip_m, only: idissip
26      USE logic, ONLY: iflag_phys, ok_guide      USE logic, ONLY: iflag_phys, ok_guide
27      USE paramet_m, ONLY: iip1, ip1jm, ip1jmp1, jjp1      USE paramet_m, ONLY: ip1jmp1
28      USE pression_m, ONLY: pression      USE pression_m, ONLY: pression
29      USE pressure_var, ONLY: p3d      USE pressure_var, ONLY: p3d
30      USE temps, ONLY: itau_dyn      USE temps, ONLY: itau_dyn
31    
32      ! Variables dynamiques:      ! Variables dynamiques:
33      REAL vcov(ip1jm, llm), ucov(ip1jmp1, llm) ! vents covariants      REAL vcov((iim + 1) * jjm, llm), ucov(ip1jmp1, llm) ! vents covariants
34      REAL teta(ip1jmp1, llm) ! temperature potentielle      REAL, intent(inout):: teta(iim + 1, jjm + 1, llm) ! potential temperature
35      REAL ps(ip1jmp1) ! pression au sol, en Pa      REAL ps(iim + 1, jjm + 1) ! pression au sol, en Pa
36    
37      REAL masse(ip1jmp1, llm) ! masse d'air      REAL masse(ip1jmp1, llm) ! masse d'air
38      REAL phis(ip1jmp1) ! geopotentiel au sol      REAL phis(ip1jmp1) ! geopotentiel au sol
# Line 44  contains Line 44  contains
44      ! Variables dynamiques:      ! Variables dynamiques:
45    
46      REAL pks(ip1jmp1) ! exner au sol      REAL pks(ip1jmp1) ! exner au sol
47      REAL pk(ip1jmp1, llm) ! exner au milieu des couches      REAL pk(iim + 1, jjm + 1, llm) ! exner au milieu des couches
48      REAL pkf(ip1jmp1, llm) ! exner filt.au milieu des couches      REAL pkf(ip1jmp1, llm) ! exner filt.au milieu des couches
49      REAL phi(ip1jmp1, llm) ! geopotential      REAL phi(ip1jmp1, llm) ! geopotential
50      REAL w(ip1jmp1, llm) ! vitesse verticale      REAL w(ip1jmp1, llm) ! vitesse verticale
51    
52      ! variables dynamiques intermediaire pour le transport      ! variables dynamiques intermediaire pour le transport
53      REAL pbaru(ip1jmp1, llm), pbarv(ip1jm, llm) !flux de masse      REAL pbaru(ip1jmp1, llm), pbarv((iim + 1) * jjm, llm) !flux de masse
54    
55      ! variables dynamiques au pas - 1      ! variables dynamiques au pas - 1
56      REAL vcovm1(ip1jm, llm), ucovm1(ip1jmp1, llm)      REAL vcovm1((iim + 1) * jjm, llm), ucovm1(ip1jmp1, llm)
57      REAL tetam1(ip1jmp1, llm), psm1(ip1jmp1)      REAL tetam1(iim + 1, jjm + 1, llm), psm1(iim + 1, jjm + 1)
58      REAL massem1(ip1jmp1, llm)      REAL massem1(ip1jmp1, llm)
59    
60      ! tendances dynamiques      ! tendances dynamiques
61      REAL dv(ip1jm, llm), du(ip1jmp1, llm)      REAL dv((iim + 1) * jjm, llm), du(ip1jmp1, llm)
62      REAL dteta(ip1jmp1, llm), dq(ip1jmp1, llm, nqmx), dp(ip1jmp1)      REAL dteta(ip1jmp1, llm), dq(ip1jmp1, llm, nqmx), dp(ip1jmp1)
63    
64      ! tendances de la dissipation      ! tendances de la dissipation
65      REAL dvdis(ip1jm, llm), dudis(ip1jmp1, llm)      REAL dvdis((iim + 1) * jjm, llm), dudis(ip1jmp1, llm)
66      REAL dtetadis(ip1jmp1, llm)      REAL dtetadis(iim + 1, jjm + 1, llm)
67    
68      ! tendances physiques      ! tendances physiques
69      REAL dvfi(ip1jm, llm), dufi(ip1jmp1, llm)      REAL dvfi((iim + 1) * jjm, llm), dufi(ip1jmp1, llm)
70      REAL dtetafi(ip1jmp1, llm), dqfi(ip1jmp1, llm, nqmx), dpfi(ip1jmp1)      REAL dtetafi(ip1jmp1, llm), dqfi(ip1jmp1, llm, nqmx), dpfi(ip1jmp1)
71    
72      ! variables pour le fichier histoire      ! variables pour le fichier histoire
73    
     REAL tppn(iim), tpps(iim), tpn, tps  
   
74      INTEGER itau ! index of the time step of the dynamics, starts at 0      INTEGER itau ! index of the time step of the dynamics, starts at 0
75      INTEGER itaufin      INTEGER itaufin
76      INTEGER iday ! jour julien      INTEGER iday ! jour julien
77      REAL time ! time of day, as a fraction of day length      REAL time ! time of day, as a fraction of day length
78      real finvmaold(ip1jmp1, llm)      real finvmaold(ip1jmp1, llm)
79      LOGICAL:: lafin=.false.      LOGICAL:: lafin=.false.
80      INTEGER ij, l      INTEGER l
81    
82      REAL rdayvrai, rdaym_ini      REAL rdayvrai, rdaym_ini
83    
84      ! Variables test conservation energie      ! Variables test conservation energie
85      REAL ecin(ip1jmp1, llm), ecin0(ip1jmp1, llm)      REAL ecin(iim + 1, jjm + 1, llm), ecin0(iim + 1, jjm + 1, llm)
86      ! Tendance de la temp. potentiel d (theta) / d t due a la      ! Tendance de la temp. potentiel d (theta) / d t due a la
87      ! tansformation d'energie cinetique en energie thermique      ! tansformation d'energie cinetique en energie thermique
88      ! cree par la dissipation      ! cree par la dissipation
89      REAL dtetaecdt(ip1jmp1, llm)      REAL dtetaecdt(iim + 1, jjm + 1, llm)
90      REAL vcont(ip1jm, llm), ucont(ip1jmp1, llm)      REAL vcont((iim + 1) * jjm, llm), ucont(ip1jmp1, llm)
91      logical forward, leapf      logical forward, leapf
92      REAL dt      REAL dt
93    
# Line 119  contains Line 117  contains
117         leapf = .FALSE.         leapf = .FALSE.
118         dt = dtvr         dt = dtvr
119         finvmaold = masse         finvmaold = masse
120         CALL filtreg(finvmaold, jjp1, llm, - 2, 2, .TRUE., 1)         CALL filtreg(finvmaold, jjm + 1, llm, - 2, 2, .TRUE., 1)
121    
122         do         do
123            ! Calcul des tendances dynamiques:            ! Calcul des tendances dynamiques:
# Line 158  contains Line 156  contains
156                    dufi, dvfi, dtetafi, dqfi, dpfi)                    dufi, dvfi, dtetafi, dqfi, dpfi)
157    
158               ! ajout des tendances physiques:               ! ajout des tendances physiques:
159               CALL addfi(nqmx, dtphys, &               CALL addfi(nqmx, dtphys, ucov, vcov, teta, q, ps, dufi, dvfi, &
160                    ucov, vcov, teta, q, ps, &                    dtetafi, dqfi, dpfi)
                   dufi, dvfi, dtetafi, dqfi, dpfi)  
161            ENDIF            ENDIF
162    
163            CALL pression(ip1jmp1, ap, bp, ps, p3d)            CALL pression(ip1jmp1, ap, bp, ps, p3d)
# Line 187  contains Line 184  contains
184               teta=teta + dtetadis               teta=teta + dtetadis
185    
186               ! Calcul de la valeur moyenne unique de h aux pôles               ! Calcul de la valeur moyenne unique de h aux pôles
187               DO l = 1, llm               forall (l = 1: llm)
188                  DO ij = 1, iim                  teta(:, 1, l) = SUM(aire_2d(:iim, 1) * teta(:iim, 1, l)) &
189                     tppn(ij) = aire(ij) * teta(ij, l)                       / apoln
190                     tpps(ij) = aire(ij + ip1jm) * teta(ij + ip1jm, l)                  teta(:, jjm + 1, l) = SUM(aire_2d(:iim, jjm+1) &
191                  ENDDO                       * teta(:iim, jjm + 1, l)) / apols
192                  tpn = SUM(tppn) / apoln               END forall
193                  tps = SUM(tpps) / apols  
194                 ps(:, 1) = SUM(aire_2d(:iim, 1) * ps(:iim, 1)) / apoln
195                  DO ij = 1, iip1               ps(:, jjm + 1) = SUM(aire_2d(:iim, jjm+1) * ps(:iim, jjm + 1)) &
196                     teta(ij, l) = tpn                    / apols
                    teta(ij + ip1jm, l) = tps  
                 ENDDO  
              ENDDO  
   
              DO ij = 1, iim  
                 tppn(ij) = aire(ij) * ps(ij)  
                 tpps(ij) = aire(ij + ip1jm) * ps(ij + ip1jm)  
              ENDDO  
              tpn = SUM(tppn) / apoln  
              tps = SUM(tpps) / apols  
   
              DO ij = 1, iip1  
                 ps(ij) = tpn  
                 ps(ij + ip1jm) = tps  
              ENDDO  
197            END IF            END IF
198    
199            ! fin de l'intégration dynamique et physique pour le pas "itau"            ! fin de l'intégration dynamique et physique pour le pas "itau"
# Line 239  contains Line 221  contains
221                    ps, masse, pk, pbaru, pbarv, teta, phi, ucov, vcov, q)                    ps, masse, pk, pbaru, pbarv, teta, phi, ucov, vcov, q)
222            ENDIF            ENDIF
223    
224            IF (itau == itaufin) THEN            IF (itau == itaufin) CALL dynredem1("restart.nc", vcov, ucov, teta, &
225               CALL dynredem1("restart.nc", vcov, ucov, teta, q, masse, ps, &                 q, masse, ps, itau=itau_dyn+itaufin)
                   itau=itau_dyn+itaufin)  
           ENDIF  
226    
227            ! gestion de l'integration temporelle:            ! gestion de l'integration temporelle:
228            IF (MOD(itau, iperiod) == 0) exit            IF (MOD(itau, iperiod) == 0) exit

Legend:
Removed from v.28  
changed lines
  Added in v.29

  ViewVC Help
Powered by ViewVC 1.1.21