GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: dynphy_lonlat/calfis.F Lines: 198 198 100.0 %
Date: 2023-06-30 12:51:15 Branches: 190 196 96.9 %

Line Branch Exec Source
1
!
2
! $Id: calfis.F 4464 2023-03-09 17:03:51Z lguez $
3
!
4
C
5
C
6
288
      SUBROUTINE calfis(lafin,
7
     $                  jD_cur, jH_cur,
8
     $                  pucov,
9
     $                  pvcov,
10
     $                  pteta,
11
288
     $                  pq,
12
     $                  pmasse,
13
     $                  pps,
14
     $                  pp,
15
     $                  ppk,
16
     $                  pphis,
17
     $                  pphi,
18
     $                  pducov,
19
     $                  pdvcov,
20
     $                  pdteta,
21
     $                  pdq,
22
     $                  flxw,
23
     $                  pdufi,
24
     $                  pdvfi,
25
     $                  pdhfi,
26
     $                  pdqfi,
27
     $                  pdpsfi)
28
c
29
c    Auteur :  P. Le Van, F. Hourdin
30
c   .........
31
      USE infotrac, ONLY: nqtot, tracers
32
      USE control_mod, ONLY: planet_type, nsplit_phys
33
#ifdef CPP_PHYS
34
      USE callphysiq_mod, ONLY: call_physiq
35
#endif
36
      USE comconst_mod, ONLY: cpp, daysec, dtphys, dtvr, kappa, pi
37
      USE comvert_mod, ONLY: preff, presnivs
38
39
      IMPLICIT NONE
40
c=======================================================================
41
c
42
c   1. rearrangement des tableaux et transformation
43
c      variables dynamiques  >  variables physiques
44
c   2. calcul des termes physiques
45
c   3. retransformation des tendances physiques en tendances dynamiques
46
c
47
c   remarques:
48
c   ----------
49
c
50
c    - les vents sont donnes dans la physique par leurs composantes
51
c      naturelles.
52
c    - la variable thermodynamique de la physique est une variable
53
c      intensive :   T
54
c      pour la dynamique on prend    T * ( preff / p(l) ) **kappa
55
c    - les deux seules variables dependant de la geometrie necessaires
56
c      pour la physique sont la latitude pour le rayonnement et
57
c      l'aire de la maille quand on veut integrer une grandeur
58
c      horizontalement.
59
c    - les points de la physique sont les points scalaires de la
60
c      la dynamique; numerotation:
61
c          1 pour le pole nord
62
c          (jjm-1)*iim pour l'interieur du domaine
63
c          ngridmx pour le pole sud
64
c      ---> ngridmx=2+(jjm-1)*iim
65
c
66
c     Input :
67
c     -------
68
c       pucov           covariant zonal velocity
69
c       pvcov           covariant meridional velocity
70
c       pteta           potential temperature
71
c       pps             surface pressure
72
c       pmasse          masse d'air dans chaque maille
73
c       pts             surface temperature  (K)
74
c       callrad         clef d'appel au rayonnement
75
c
76
c    Output :
77
c    --------
78
c        pdufi          tendency for the natural zonal velocity (ms-1)
79
c        pdvfi          tendency for the natural meridional velocity
80
c        pdhfi          tendency for the potential temperature
81
c        pdtsfi         tendency for the surface temperature
82
c
83
c        pdtrad         radiative tendencies  \  both input
84
c        pfluxrad       radiative fluxes      /  and output
85
c
86
c=======================================================================
87
c
88
c-----------------------------------------------------------------------
89
c
90
c    0.  Declarations :
91
c    ------------------
92
93
      include "dimensions.h"
94
      include "paramet.h"
95
96
      INTEGER ngridmx
97
      PARAMETER( ngridmx = 2+(jjm-1)*iim - 1/jjm   )
98
99
      include "comgeom2.h"
100
      include "iniprint.h"
101
102
c    Arguments :
103
c    -----------
104
      LOGICAL,INTENT(IN) ::  lafin ! .true. for the very last call to physics
105
      REAL,INTENT(IN):: jD_cur, jH_cur
106
      REAL,INTENT(IN) :: pvcov(iip1,jjm,llm) ! covariant meridional velocity
107
      REAL,INTENT(IN) :: pucov(iip1,jjp1,llm) ! covariant zonal velocity
108
      REAL,INTENT(IN) :: pteta(iip1,jjp1,llm) ! potential temperature
109
      REAL,INTENT(IN) :: pmasse(iip1,jjp1,llm) ! mass in each cell ! not used
110
      REAL,INTENT(IN) :: pq(iip1,jjp1,llm,nqtot) ! tracers
111
      REAL,INTENT(IN) :: pphis(iip1,jjp1) ! surface geopotential
112
      REAL,INTENT(IN) :: pphi(iip1,jjp1,llm) ! geopotential
113
114
      REAL,INTENT(IN) :: pdvcov(iip1,jjm,llm) ! dynamical tendency on vcov
115
      REAL,INTENT(IN) :: pducov(iip1,jjp1,llm) ! dynamical tendency on ucov
116
      REAL,INTENT(IN) :: pdteta(iip1,jjp1,llm) ! dynamical tendency on teta
117
      ! NB: pdteta is used only to compute pcvgt which is in fact not used...
118
      REAL,INTENT(IN) :: pdq(iip1,jjp1,llm,nqtot) ! dynamical tendency on tracers
119
      ! NB: pdq is only used to compute pcvgq which is in fact not used...
120
121
      REAL,INTENT(IN) :: pps(iip1,jjp1) ! surface pressure (Pa)
122
      REAL,INTENT(IN) :: pp(iip1,jjp1,llmp1) ! pressure at mesh interfaces (Pa)
123
      REAL,INTENT(IN) :: ppk(iip1,jjp1,llm) ! Exner at mid-layer
124
      REAL,INTENT(IN) :: flxw(iip1,jjp1,llm) ! Vertical mass flux on lower mesh interfaces (kg/s) (on llm because flxw(:,:,llm+1)=0)
125
126
      ! tendencies (in */s) from the physics
127
      REAL,INTENT(OUT) :: pdvfi(iip1,jjm,llm) ! tendency on covariant meridional wind
128
      REAL,INTENT(OUT) :: pdufi(iip1,jjp1,llm) ! tendency on covariant zonal wind
129
      REAL,INTENT(OUT) :: pdhfi(iip1,jjp1,llm) ! tendency on potential temperature (K/s)
130
      REAL,INTENT(OUT) :: pdqfi(iip1,jjp1,llm,nqtot) ! tendency on tracers
131
      REAL,INTENT(OUT) :: pdpsfi(iip1,jjp1) ! tendency on surface pressure (Pa/s)
132
133
134
c    Local variables :
135
c    -----------------
136
137
      INTEGER i,j,l,ig0,ig,iq,itr
138
      REAL zpsrf(ngridmx)
139
      REAL zplev(ngridmx,llm+1),zplay(ngridmx,llm)
140
      REAL zphi(ngridmx,llm),zphis(ngridmx)
141
c
142
      REAL zrot(iip1,jjm,llm) ! AdlC May 2014
143
      REAL zufi(ngridmx,llm), zvfi(ngridmx,llm)
144
      REAL zrfi(ngridmx,llm) ! relative wind vorticity
145
576
      REAL ztfi(ngridmx,llm),zqfi(ngridmx,llm,nqtot)
146
      REAL zpk(ngridmx,llm)
147
c
148
      REAL pcvgu(ngridmx,llm), pcvgv(ngridmx,llm)
149
      REAL pcvgt(ngridmx,llm), pcvgq(ngridmx,llm,2)
150
c
151
      REAL zdufi(ngridmx,llm),zdvfi(ngridmx,llm)
152
576
      REAL zdtfi(ngridmx,llm),zdqfi(ngridmx,llm,nqtot)
153
      REAL zdpsrf(ngridmx)
154
c
155
      REAL zdufic(ngridmx,llm),zdvfic(ngridmx,llm)
156
576
      REAL zdtfic(ngridmx,llm),zdqfic(ngridmx,llm,nqtot)
157
      REAL jH_cur_split,zdt_split
158
      LOGICAL debut_split,lafin_split
159
      INTEGER isplit
160
161
      REAL zsin(iim),zcos(iim),z1(iim)
162
      REAL zsinbis(iim),zcosbis(iim),z1bis(iim)
163
      REAL unskap, pksurcp
164
c
165
      REAL flxwfi(ngridmx,llm)  ! Flux de masse verticale sur la grille physiq
166
c
167
168
      REAL SSUM
169
170
      LOGICAL,SAVE :: firstcal=.true., debut=.true.
171
!      REAL rdayvrai
172
173
c
174
c-----------------------------------------------------------------------
175
c
176
c    1. Initialisations :
177
c    --------------------
178
c
179
c
180
288
      IF ( firstcal )  THEN
181
1
        debut = .TRUE.
182
        IF (ngridmx.NE.2+(jjm-1)*iim) THEN
183
         write(lunout,*) 'STOP dans calfis'
184
         write(lunout,*)
185
     &   'La dimension ngridmx doit etre egale a 2 + (jjm-1)*iim'
186
         write(lunout,*) '  ngridmx  jjm   iim   '
187
         write(lunout,*) ngridmx,jjm,iim
188
         call abort_gcm("calfis", "", 1)
189
        ENDIF
190
      ELSE
191
287
        debut = .FALSE.
192
      ENDIF ! of IF (firstcal)
193
194
c
195
c
196
c-----------------------------------------------------------------------
197
c   40. transformation des variables dynamiques en variables physiques:
198
c   ---------------------------------------------------------------
199
200
c   41. pressions au sol (en Pascals)
201
c   ----------------------------------
202
203
204
288
      zpsrf(1) = pps(1,1)
205
206
      ig0  = 2
207
9216
      DO j = 2,jjm
208
8928
         CALL SCOPY( iim,pps(1,j),1,zpsrf(ig0), 1 )
209
9216
         ig0 = ig0+iim
210
      ENDDO
211
212
288
      zpsrf(ngridmx) = pps(1,jjp1)
213
214
215
c   42. pression intercouches et fonction d'Exner:
216
c
217
c   -----------------------------------------------------------------
218
c     .... zplev  definis aux (llm +1) interfaces des couches  ....
219
c     .... zplay  definis aux (  llm )    milieux des couches  ....
220
c   -----------------------------------------------------------------
221
222
c    ...    Exner = cp * ( p(l) / preff ) ** kappa     ....
223
c
224
288
       unskap   = 1./ kappa
225
c
226
11520
      DO l = 1, llm
227
11232
        zpk(   1,l ) = ppk(1,1,l)
228
11232
        zplev( 1,l ) = pp(1,1,l)
229
        ig0 = 2
230
359424
          DO j = 2, jjm
231
11501568
             DO i =1, iim
232
11142144
              zpk(   ig0,l ) = ppk(i,j,l)
233
11142144
              zplev( ig0,l ) = pp(i,j,l)
234
11490336
              ig0 = ig0 +1
235
             ENDDO
236
          ENDDO
237
11232
        zpk(   ngridmx,l ) = ppk(1,jjp1,l)
238
11520
        zplev( ngridmx,l ) = pp(1,jjp1,l)
239
      ENDDO
240
288
        zplev( 1,llmp1 ) = pp(1,1,llmp1)
241
        ig0 = 2
242
9216
          DO j = 2, jjm
243
294912
             DO i =1, iim
244
285696
              zplev( ig0,llmp1 ) = pp(i,j,llmp1)
245
294624
              ig0 = ig0 +1
246
             ENDDO
247
          ENDDO
248
288
        zplev( ngridmx,llmp1 ) = pp(1,jjp1,llmp1)
249
c
250
c
251
252
c   43. temperature naturelle (en K) et pressions milieux couches .
253
c   ---------------------------------------------------------------
254
255
11520
      DO l=1,llm
256
257
11232
         pksurcp     =  ppk(1,1,l) / cpp
258
11232
         zplay(1,l)  =  preff * pksurcp ** unskap
259
11232
         ztfi(1,l)   =  pteta(1,1,l) *  pksurcp
260
11232
         pcvgt(1,l)  =  pdteta(1,1,l) * pksurcp / pmasse(1,1,l)
261
         ig0         = 2
262
263
359424
         DO j = 2, jjm
264
11501568
            DO i = 1, iim
265
11142144
              pksurcp        = ppk(i,j,l) / cpp
266
11142144
              zplay(ig0,l)   = preff * pksurcp ** unskap
267
11142144
              ztfi(ig0,l)    = pteta(i,j,l)  * pksurcp
268
11142144
              pcvgt(ig0,l)   = pdteta(i,j,l) * pksurcp / pmasse(i,j,l)
269
11490336
              ig0            = ig0 + 1
270
            ENDDO
271
         ENDDO
272
273
11232
         pksurcp       = ppk(1,jjp1,l) / cpp
274
11232
         zplay(ig0,l)  = preff * pksurcp ** unskap
275
11232
         ztfi (ig0,l)  = pteta(1,jjp1,l)  * pksurcp
276
11520
         pcvgt(ig0,l)  = pdteta(1,jjp1,l) * pksurcp/ pmasse(1,jjp1,l)
277
278
      ENDDO
279
280
c   43.bis traceurs
281
c   ---------------
282
c
283
      itr=0
284
1728
      DO iq=1,nqtot
285
1440
         IF(.NOT.tracers(iq)%isAdvected) CYCLE
286
1440
         itr = itr + 1
287
57888
         DO l=1,llm
288
56160
            zqfi(1,l,itr) = pq(1,1,l,iq)
289
            ig0           = 2
290
1797120
            DO j=2,jjm
291
57507840
               DO i = 1, iim
292
55710720
                  zqfi(ig0,l,itr) = pq(i,j,l,iq)
293
57451680
                  ig0             = ig0 + 1
294
               ENDDO
295
            ENDDO
296
57600
            zqfi(ig0,l,itr) = pq(1,jjp1,l,iq)
297
         ENDDO
298
      ENDDO
299
300
c   convergence dynamique pour les traceurs "EAU"
301
! Earth-specific treatment of first 2 tracers (water)
302
288
       if (planet_type=="earth") then
303
864
        DO iq=1,2
304
23328
         DO l=1,llm
305
22464
            pcvgq(1,l,iq)= pdq(1,1,l,iq) / pmasse(1,1,l)
306
            ig0          = 2
307
718848
            DO j=2,jjm
308
23003136
               DO i = 1, iim
309
22284288
                  pcvgq(ig0,l,iq) = pdq(i,j,l,iq) / pmasse(i,j,l)
310
22980672
                  ig0             = ig0 + 1
311
               ENDDO
312
            ENDDO
313
23040
            pcvgq(ig0,l,iq)= pdq(1,jjp1,l,iq) / pmasse(1,jjp1,l)
314
         ENDDO
315
        ENDDO
316
       endif ! of if (planet_type=="earth")
317
318
319
c   Geopotentiel calcule par rapport a la surface locale:
320
c   -----------------------------------------------------
321
322
288
      CALL gr_dyn_fi(llm,iip1,jjp1,ngridmx,pphi,zphi)
323
288
      CALL gr_dyn_fi(1,iip1,jjp1,ngridmx,pphis,zphis)
324
11520
      DO l=1,llm
325
11176128
         DO ig=1,ngridmx
326
11175840
           zphi(ig,l)=zphi(ig,l)-zphis(ig)
327
         ENDDO
328
      ENDDO
329
330
c   ....  Calcul de la vitesse  verticale  ( en Pa*m*s  ou Kg/s )  ....
331
c JG : ancien calcule de omega utilise dans physiq.F. Maintenant le flux
332
c    de masse est calclue dans advtrac.F
333
c      DO l=1,llm
334
c        pvervel(1,l)=pw(1,1,l) * g /apoln
335
c        ig0=2
336
c       DO j=2,jjm
337
c           DO i = 1, iim
338
c              pvervel(ig0,l) = pw(i,j,l) * g * unsaire(i,j)
339
c              ig0 = ig0 + 1
340
c           ENDDO
341
c       ENDDO
342
c        pvervel(ig0,l)=pw(1,jjp1,l) * g /apols
343
c      ENDDO
344
345
c
346
c   45. champ u:
347
c   ------------
348
349
11520
      DO 50 l=1,llm
350
351
359424
         DO 25 j=2,jjm
352
348192
            ig0 = 1+(j-2)*iim
353
            zufi(ig0+1,l)= 0.5 *
354
348192
     $      ( pucov(iim,j,l)/cu(iim,j) + pucov(1,j,l)/cu(1,j) )
355
            pcvgu(ig0+1,l)= 0.5 *
356
348192
     $      ( pducov(iim,j,l)/cu(iim,j) + pducov(1,j,l)/cu(1,j) )
357
11142144
            DO 10 i=2,iim
358
               zufi(ig0+i,l)= 0.5 *
359
10793952
     $         ( pucov(i-1,j,l)/cu(i-1,j) + pucov(i,j,l)/cu(i,j) )
360
               pcvgu(ig0+i,l)= 0.5 *
361
10793952
     $         ( pducov(i-1,j,l)/cu(i-1,j) + pducov(i,j,l)/cu(i,j) )
362
348192
10         CONTINUE
363
11232
25      CONTINUE
364
365
288
50    CONTINUE
366
367
368
C  Alvaro de la Camara (May 2014)
369
C  46.1 Calcul de la vorticite et passage sur la grille physique
370
C  --------------------------------------------------------------
371
11520
      DO l=1,llm
372
370944
        do i=1,iim
373
11872224
          do j=1,jjm
374
            zrot(i,j,l) = (pvcov(i+1,j,l) - pvcov(i,j,l)
375
     $                   + pucov(i,j+1,l) - pucov(i,j,l))
376
     $                   / (cu(i,j)+cu(i,j+1))
377
11860992
     $                   / (cv(i+1,j)+cv(i,j)) *4
378
          enddo
379
        enddo
380
      ENDDO
381
382
c   46.champ v:
383
c   -----------
384
385
11520
      DO l=1,llm
386
359712
         DO j=2,jjm
387
348192
            ig0=1+(j-2)*iim
388
11490336
            DO i=1,iim
389
               zvfi(ig0+i,l)= 0.5 *
390
11142144
     $         ( pvcov(i,j-1,l)/cv(i,j-1) + pvcov(i,j,l)/cv(i,j) )
391
               pcvgv(ig0+i,l)= 0.5 *
392
11490336
     $         ( pdvcov(i,j-1,l)/cv(i,j-1) + pdvcov(i,j,l)/cv(i,j) )
393
            ENDDO
394
               zrfi(ig0 + 1,l)= 0.25 *(zrot(iim,j-1,l)+zrot(iim,j,l)
395
348192
     &                                +zrot(1,j-1,l)+zrot(1,j,l))
396
11153376
            DO i=2,iim
397
               zrfi(ig0 + i,l)= 0.25 *(zrot(i-1,j-1,l)+zrot(i-1,j,l)
398
11142144
     $                   +zrot(i,j-1,l)+zrot(i,j,l))   !  AdlC MAY 2014
399
            ENDDO
400
         ENDDO
401
      ENDDO
402
403
404
c   47. champs de vents aux pole nord
405
c   ------------------------------
406
c        U = 1 / pi  *  integrale [ v * cos(long) * d long ]
407
c        V = 1 / pi  *  integrale [ v * sin(long) * d long ]
408
409
11520
      DO l=1,llm
410
411
11232
         z1(1)   =(rlonu(1)-rlonu(iim)+2.*pi)*pvcov(1,1,l)/cv(1,1)
412
11232
         z1bis(1)=(rlonu(1)-rlonu(iim)+2.*pi)*pdvcov(1,1,l)/cv(1,1)
413
359424
         DO i=2,iim
414
348192
            z1(i)   =(rlonu(i)-rlonu(i-1))*pvcov(i,1,l)/cv(i,1)
415
359424
            z1bis(i)=(rlonu(i)-rlonu(i-1))*pdvcov(i,1,l)/cv(i,1)
416
         ENDDO
417
418
370656
         DO i=1,iim
419
359424
            zcos(i)   = COS(rlonv(i))*z1(i)
420
359424
            zcosbis(i)= COS(rlonv(i))*z1bis(i)
421
359424
            zsin(i)   = SIN(rlonv(i))*z1(i)
422
370656
            zsinbis(i)= SIN(rlonv(i))*z1bis(i)
423
         ENDDO
424
425
11232
         zufi(1,l)  = SSUM(iim,zcos,1)/pi
426
11232
         pcvgu(1,l) = SSUM(iim,zcosbis,1)/pi
427
11232
         zvfi(1,l)  = SSUM(iim,zsin,1)/pi
428
11232
         pcvgv(1,l) = SSUM(iim,zsinbis,1)/pi
429
11520
         zrfi(1, l) = 0.
430
      ENDDO
431
432
433
c   48. champs de vents aux pole sud:
434
c   ---------------------------------
435
c        U = 1 / pi  *  integrale [ v * cos(long) * d long ]
436
c        V = 1 / pi  *  integrale [ v * sin(long) * d long ]
437
438
11520
      DO l=1,llm
439
440
11232
         z1(1)   =(rlonu(1)-rlonu(iim)+2.*pi)*pvcov(1,jjm,l)/cv(1,jjm)
441
11232
         z1bis(1)=(rlonu(1)-rlonu(iim)+2.*pi)*pdvcov(1,jjm,l)/cv(1,jjm)
442
359424
         DO i=2,iim
443
348192
            z1(i)   =(rlonu(i)-rlonu(i-1))*pvcov(i,jjm,l)/cv(i,jjm)
444
359424
            z1bis(i)=(rlonu(i)-rlonu(i-1))*pdvcov(i,jjm,l)/cv(i,jjm)
445
         ENDDO
446
447
370656
         DO i=1,iim
448
359424
            zcos(i)    = COS(rlonv(i))*z1(i)
449
359424
            zcosbis(i) = COS(rlonv(i))*z1bis(i)
450
359424
            zsin(i)    = SIN(rlonv(i))*z1(i)
451
370656
            zsinbis(i) = SIN(rlonv(i))*z1bis(i)
452
         ENDDO
453
454
11232
         zufi(ngridmx,l)  = SSUM(iim,zcos,1)/pi
455
11232
         pcvgu(ngridmx,l) = SSUM(iim,zcosbis,1)/pi
456
11232
         zvfi(ngridmx,l)  = SSUM(iim,zsin,1)/pi
457
11232
         pcvgv(ngridmx,l) = SSUM(iim,zsinbis,1)/pi
458
11520
         zrfi(ngridmx, l) = 0.
459
      ENDDO
460
c
461
c On change de grille, dynamique vers physiq, pour le flux de masse verticale
462
288
      CALL gr_dyn_fi(llm,iip1,jjp1,ngridmx,flxw,flxwfi)
463
464
c-----------------------------------------------------------------------
465
c   Appel de la physique:
466
c   ---------------------
467
468
469
470
!      write(lunout,*) 'PHYSIQUE AVEC NSPLIT_PHYS=',nsplit_phys
471
288
      zdt_split=dtphys/nsplit_phys
472
288
      zdufic(:,:)=0.
473
288
      zdvfic(:,:)=0.
474
288
      zdtfic(:,:)=0.
475

55880928
      zdqfic(:,:,:)=0.
476
477
#ifdef CPP_PHYS
478
479
576
       do isplit=1,nsplit_phys
480
481
288
         jH_cur_split=jH_cur+(isplit-1) * dtvr / (daysec *nsplit_phys)
482

288
         debut_split=debut.and.isplit==1
483

288
         lafin_split=lafin.and.isplit==nsplit_phys
484
485
!      if (planet_type=="earth") then
486
        CALL call_physiq(ngridmx,llm,nqtot,tracers(:)%name,
487
     &                   debut_split,lafin_split,
488
     &                   jD_cur,jH_cur_split,zdt_split,
489
     &                   zplev,zplay,
490
     &                   zpk,zphi,zphis,
491
     &                   presnivs,
492
     &                   zufi,zvfi,zrfi,ztfi,zqfi,
493
     &                   flxwfi,pducov,
494

1728
     &                   zdufi,zdvfi,zdtfi,zdqfi,zdpsrf)
495
!
496
!      else if ( planet_type=="generic" ) then
497
!
498
!         CALL physiq (ngridmx,     !! ngrid
499
!     .             llm,            !! nlayer
500
!     .             nqtot,          !! nq
501
!     .             tracers(:)%name,!! tracer names from dynamical core (given in infotrac)
502
!     .             debut_split,    !! firstcall
503
!     .             lafin_split,    !! lastcall
504
!     .             jD_cur,         !! pday. see leapfrog
505
!     .             jH_cur_split,   !! ptime "fraction of day"
506
!     .             zdt_split,      !! ptimestep
507
!     .             zplev,          !! pplev
508
!     .             zplay,          !! pplay
509
!     .             zphi,           !! pphi
510
!     .             zufi,           !! pu
511
!     .             zvfi,           !! pv
512
!     .             ztfi,           !! pt
513
!     .             zqfi,           !! pq
514
!     .             flxwfi,         !! pw !! or 0. anyway this is for diagnostic. not used in physiq.
515
!     .             zdufi,          !! pdu
516
!     .             zdvfi,          !! pdv
517
!     .             zdtfi,          !! pdt
518
!     .             zdqfi,          !! pdq
519
!     .             zdpsrf,         !! pdpsrf
520
!     .             tracerdyn)      !! tracerdyn <-- utilite ???
521
!
522
!      endif ! of if (planet_type=="earth")
523
524

11176128
         zufi(:,:)=zufi(:,:)+zdufi(:,:)*zdt_split
525

11176128
         zvfi(:,:)=zvfi(:,:)+zdvfi(:,:)*zdt_split
526

11176128
         ztfi(:,:)=ztfi(:,:)+zdtfi(:,:)*zdt_split
527

55880928
         zqfi(:,:,:)=zqfi(:,:,:)+zdqfi(:,:,:)*zdt_split
528
529

11176128
         zdufic(:,:)=zdufic(:,:)+zdufi(:,:)
530

11176128
         zdvfic(:,:)=zdvfic(:,:)+zdvfi(:,:)
531

11176128
         zdtfic(:,:)=zdtfic(:,:)+zdtfi(:,:)
532

55881216
         zdqfic(:,:,:)=zdqfic(:,:,:)+zdqfi(:,:,:)
533
534
       enddo ! of do isplit=1,nsplit_phys
535
536
#endif
537
! of #ifdef CPP_PHYS
538
539

11176128
      zdufi(:,:)=zdufic(:,:)/nsplit_phys
540

11176128
      zdvfi(:,:)=zdvfic(:,:)/nsplit_phys
541

11176128
      zdtfi(:,:)=zdtfic(:,:)/nsplit_phys
542

55880928
      zdqfi(:,:,:)=zdqfic(:,:,:)/nsplit_phys
543
544
545
500   CONTINUE
546
547
c-----------------------------------------------------------------------
548
c   transformation des tendances physiques en tendances dynamiques:
549
c   ---------------------------------------------------------------
550
551
c  tendance sur la pression :
552
c  -----------------------------------
553
554
288
      CALL gr_fi_dyn(1,ngridmx,iip1,jjp1,zdpsrf,pdpsfi)
555
c
556
c   62. enthalpie potentielle
557
c   ---------------------
558
559
11520
      DO l=1,llm
560
561
381888
         DO i=1,iip1
562
370656
          pdhfi(i,1,l)    = cpp *  zdtfi(1,l)      / ppk(i, 1  ,l)
563
381888
          pdhfi(i,jjp1,l) = cpp *  zdtfi(ngridmx,l)/ ppk(i,jjp1,l)
564
         ENDDO
565
566
359712
         DO j=2,jjm
567
348192
            ig0=1+(j-2)*iim
568
11490336
            DO i=1,iim
569
11490336
               pdhfi(i,j,l) = cpp * zdtfi(ig0+i,l) / ppk(i,j,l)
570
            ENDDO
571
359424
               pdhfi(iip1,j,l) =  pdhfi(1,j,l)
572
         ENDDO
573
574
      ENDDO
575
576
577
c   62. humidite specifique
578
c   ---------------------
579
! Ehouarn: removed this useless bit: was overwritten at step 63 anyways
580
!      DO iq=1,nqtot
581
!         DO l=1,llm
582
!            DO i=1,iip1
583
!               pdqfi(i,1,l,iq)    = zdqfi(1,l,iq)
584
!               pdqfi(i,jjp1,l,iq) = zdqfi(ngridmx,l,iq)
585
!            ENDDO
586
!            DO j=2,jjm
587
!               ig0=1+(j-2)*iim
588
!               DO i=1,iim
589
!                  pdqfi(i,j,l,iq) = zdqfi(ig0+i,l,iq)
590
!               ENDDO
591
!               pdqfi(iip1,j,l,iq) = pdqfi(1,j,l,iq)
592
!            ENDDO
593
!         ENDDO
594
!      ENDDO
595
596
c   63. traceurs
597
c   ------------
598
C     initialisation des tendances
599


63069408
      pdqfi(:,:,:,:)=0.
600
C
601
      itr = 0
602
1728
      DO iq=1,nqtot
603
1440
         IF(.NOT.tracers(iq)%isAdvected) CYCLE
604
1440
         itr = itr + 1
605
57888
         DO l=1,llm
606
1909440
            DO i=1,iip1
607
1853280
               pdqfi(i,1,l,iq)    = zdqfi(1,l,itr)
608
1909440
               pdqfi(i,jjp1,l,iq) = zdqfi(ngridmx,l,itr)
609
            ENDDO
610
1798560
            DO j=2,jjm
611
1740960
               ig0=1+(j-2)*iim
612
57451680
               DO i=1,iim
613
57451680
                  pdqfi(i,j,l,iq) = zdqfi(ig0+i,l,itr)
614
               ENDDO
615
1797120
               pdqfi(iip1,j,l,iq) = pdqfi(1,j,l,itr)
616
            ENDDO
617
         ENDDO
618
      ENDDO
619
620
c   65. champ u:
621
c   ------------
622
623
11520
      DO l=1,llm
624
625
381888
         DO i=1,iip1
626
370656
            pdufi(i,1,l)    = 0.
627
381888
            pdufi(i,jjp1,l) = 0.
628
         ENDDO
629
630
359712
         DO j=2,jjm
631
348192
            ig0=1+(j-2)*iim
632
11142144
            DO i=1,iim-1
633
               pdufi(i,j,l)=
634
11142144
     $         0.5*(zdufi(ig0+i,l)+zdufi(ig0+i+1,l))*cu(i,j)
635
            ENDDO
636
            pdufi(iim,j,l)=
637
348192
     $      0.5*(zdufi(ig0+1,l)+zdufi(ig0+iim,l))*cu(iim,j)
638
359424
            pdufi(iip1,j,l)=pdufi(1,j,l)
639
         ENDDO
640
641
      ENDDO
642
643
644
c   67. champ v:
645
c   ------------
646
647
11520
      DO l=1,llm
648
649
348480
         DO j=2,jjm-1
650
336960
            ig0=1+(j-2)*iim
651
11119680
            DO i=1,iim
652
               pdvfi(i,j,l)=
653
11119680
     $         0.5*(zdvfi(ig0+i,l)+zdvfi(ig0+i+iim,l))*cv(i,j)
654
            ENDDO
655
348192
            pdvfi(iip1,j,l) = pdvfi(1,j,l)
656
         ENDDO
657
      ENDDO
658
659
660
c   68. champ v pres des poles:
661
c   ---------------------------
662
c      v = U * cos(long) + V * SIN(long)
663
664
11520
      DO l=1,llm
665
666
370656
         DO i=1,iim
667
            pdvfi(i,1,l)=
668
359424
     $      zdufi(1,l)*COS(rlonv(i))+zdvfi(1,l)*SIN(rlonv(i))
669
            pdvfi(i,jjm,l)=zdufi(ngridmx,l)*COS(rlonv(i))
670
359424
     $      +zdvfi(ngridmx,l)*SIN(rlonv(i))
671
            pdvfi(i,1,l)=
672
359424
     $      0.5*(pdvfi(i,1,l)+zdvfi(i+1,l))*cv(i,1)
673
            pdvfi(i,jjm,l)=
674
370656
     $      0.5*(pdvfi(i,jjm,l)+zdvfi(ngridmx-iip1+i,l))*cv(i,jjm)
675
          ENDDO
676
677
11232
         pdvfi(iip1,1,l)  = pdvfi(1,1,l)
678
11520
         pdvfi(iip1,jjm,l)= pdvfi(1,jjm,l)
679
680
      ENDDO
681
682
c-----------------------------------------------------------------------
683
684
700   CONTINUE
685
686
288
      firstcal = .FALSE.
687
688
288
      RETURN
689
      END