source: LMDZ6/branches/Amaury_dev/libf/dynphy_lonlat/calfis.F @ 5103

Last change on this file since 5103 was 5103, checked in by abarral, 8 weeks ago

Handle CPP_INLANDSIS in lmdz_cppkeys_wrapper.F90
Remove obsolete key wrgrads_thermcell, _ADV_HALO, _ADV_HALLO, isminmax
Remove redundant uses of CPPKEY_INCA (thanks acozic)
Remove obsolete misc/write_field.F90
Remove unused ioipsl_* wrappers
Remove calls to WriteField_u with wrong signature
Convert .F -> .[fF]90
(lint) uppercase fortran operators
[note: 1d and iso still broken - working on it]

  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 21.2 KB
Line 
1
2! $Id: calfis.F 5103 2024-07-23 13:29:36Z abarral $
3
4C
5C
6      SUBROUTINE calfis(lafin,
7     $                  jD_cur, jH_cur,
8     $                  pucov,
9     $                  pvcov,
10     $                  pteta,
11     $                  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)
28c
29c    Auteur :  P. Le Van, F. Hourdin
30c   .........
31      USE infotrac, ONLY: nqtot, tracers
32      USE control_mod, ONLY: planet_type, nsplit_phys
33      USE callphysiq_mod, ONLY: call_physiq
34      USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_PHYS
35      USE comconst_mod, ONLY: cpp, daysec, dtphys, dtvr, kappa, pi
36      USE comvert_mod, ONLY: preff, presnivs
37
38      IMPLICIT NONE
39c=======================================================================
40c
41c   1. rearrangement des tableaux et transformation
42c      variables dynamiques  >  variables physiques
43c   2. calcul des termes physiques
44c   3. retransformation des tendances physiques en tendances dynamiques
45c
46c   remarques:
47c   ----------
48c
49c    - les vents sont donnes dans la physique par leurs composantes
50c      naturelles.
51c    - la variable thermodynamique de la physique est une variable
52c      intensive :   T
53c      pour la dynamique on prend    T * ( preff / p(l) ) **kappa
54c    - les deux seules variables dependant de la geometrie necessaires
55c      pour la physique sont la latitude pour le rayonnement et
56c      l'aire de la maille quand on veut integrer une grandeur
57c      horizontalement.
58c    - les points de la physique sont les points scalaires de la
59c      la dynamique; numerotation:
60c          1 pour le pole nord
61c          (jjm-1)*iim pour l'interieur du domaine
62c          ngridmx pour le pole sud
63c      ---> ngridmx=2+(jjm-1)*iim
64c
65c     Input :
66c     -------
67c       pucov           covariant zonal velocity
68c       pvcov           covariant meridional velocity
69c       pteta           potential temperature
70c       pps             surface pressure
71c       pmasse          masse d'air dans chaque maille
72c       pts             surface temperature  (K)
73c       callrad         clef d'appel au rayonnement
74c
75c    Output :
76c    --------
77c        pdufi          tendency for the natural zonal velocity (ms-1)
78c        pdvfi          tendency for the natural meridional velocity
79c        pdhfi          tendency for the potential temperature
80c        pdtsfi         tendency for the surface temperature
81c
82c        pdtrad         radiative tendencies  \  both input
83c        pfluxrad       radiative fluxes      /  and output
84c
85c=======================================================================
86c
87c-----------------------------------------------------------------------
88c
89c    0.  Declarations :
90c    ------------------
91
92      include "dimensions.h"
93      include "paramet.h"
94
95      INTEGER ngridmx
96      PARAMETER( ngridmx = 2+(jjm-1)*iim - 1/jjm   )
97
98      include "comgeom2.h"
99      include "iniprint.h"
100
101c    Arguments :
102c    -----------
103      LOGICAL,INTENT(IN) ::  lafin ! .TRUE. for the very last CALL to physics
104      REAL,INTENT(IN):: jD_cur, jH_cur
105      REAL,INTENT(IN) :: pvcov(iip1,jjm,llm) ! covariant meridional velocity
106      REAL,INTENT(IN) :: pucov(iip1,jjp1,llm) ! covariant zonal velocity
107      REAL,INTENT(IN) :: pteta(iip1,jjp1,llm) ! potential temperature
108      REAL,INTENT(IN) :: pmasse(iip1,jjp1,llm) ! mass in each cell ! not used
109      REAL,INTENT(IN) :: pq(iip1,jjp1,llm,nqtot) ! tracers
110      REAL,INTENT(IN) :: pphis(iip1,jjp1) ! surface geopotential
111      REAL,INTENT(IN) :: pphi(iip1,jjp1,llm) ! geopotential
112
113      REAL,INTENT(IN) :: pdvcov(iip1,jjm,llm) ! dynamical tendency on vcov
114      REAL,INTENT(IN) :: pducov(iip1,jjp1,llm) ! dynamical tendency on ucov
115      REAL,INTENT(IN) :: pdteta(iip1,jjp1,llm) ! dynamical tendency on teta
116      ! NB: pdteta is used only to compute pcvgt which is in fact not used...
117      REAL,INTENT(IN) :: pdq(iip1,jjp1,llm,nqtot) ! dynamical tendency on tracers
118      ! NB: pdq is only used to compute pcvgq which is in fact not used...
119
120      REAL,INTENT(IN) :: pps(iip1,jjp1) ! surface pressure (Pa)
121      REAL,INTENT(IN) :: pp(iip1,jjp1,llmp1) ! pressure at mesh interfaces (Pa)
122      REAL,INTENT(IN) :: ppk(iip1,jjp1,llm) ! Exner at mid-layer
123      REAL,INTENT(IN) :: flxw(iip1,jjp1,llm) ! Vertical mass flux on lower mesh interfaces (kg/s) (on llm because flxw(:,:,llm+1)=0)
124
125      ! tendencies (in */s) from the physics
126      REAL,INTENT(OUT) :: pdvfi(iip1,jjm,llm) ! tendency on covariant meridional wind
127      REAL,INTENT(OUT) :: pdufi(iip1,jjp1,llm) ! tendency on covariant zonal wind
128      REAL,INTENT(OUT) :: pdhfi(iip1,jjp1,llm) ! tendency on potential temperature (K/s)
129      REAL,INTENT(OUT) :: pdqfi(iip1,jjp1,llm,nqtot) ! tendency on tracers
130      REAL,INTENT(OUT) :: pdpsfi(iip1,jjp1) ! tendency on surface pressure (Pa/s)
131
132
133c    Local variables :
134c    -----------------
135
136      INTEGER i,j,l,ig0,ig,iq,itr
137      REAL zpsrf(ngridmx)
138      REAL zplev(ngridmx,llm+1),zplay(ngridmx,llm)
139      REAL zphi(ngridmx,llm),zphis(ngridmx)
140c
141      REAL zrot(iip1,jjm,llm) ! AdlC May 2014
142      REAL zufi(ngridmx,llm), zvfi(ngridmx,llm)
143      REAL zrfi(ngridmx,llm) ! relative wind vorticity
144      REAL ztfi(ngridmx,llm),zqfi(ngridmx,llm,nqtot)
145      REAL zpk(ngridmx,llm)
146c
147      REAL pcvgu(ngridmx,llm), pcvgv(ngridmx,llm)
148      REAL pcvgt(ngridmx,llm), pcvgq(ngridmx,llm,2)
149c
150      REAL zdufi(ngridmx,llm),zdvfi(ngridmx,llm)
151      REAL zdtfi(ngridmx,llm),zdqfi(ngridmx,llm,nqtot)
152      REAL zdpsrf(ngridmx)
153c
154      REAL zdufic(ngridmx,llm),zdvfic(ngridmx,llm)
155      REAL zdtfic(ngridmx,llm),zdqfic(ngridmx,llm,nqtot)
156      REAL jH_cur_split,zdt_split
157      LOGICAL debut_split,lafin_split
158      INTEGER isplit
159
160      REAL zsin(iim),zcos(iim),z1(iim)
161      REAL zsinbis(iim),zcosbis(iim),z1bis(iim)
162      REAL unskap, pksurcp
163c
164      REAL flxwfi(ngridmx,llm)  ! Flux de masse verticale sur la grille physiq
165c
166
167      REAL SSUM
168
169      LOGICAL,SAVE :: firstcal=.TRUE., debut=.TRUE.
170!      REAL rdayvrai
171
172c
173c-----------------------------------------------------------------------
174c
175c    1. Initialisations :
176c    --------------------
177c
178c
179      IF ( firstcal )  THEN
180        debut = .TRUE.
181        IF (ngridmx/=2+(jjm-1)*iim) THEN
182         write(lunout,*) 'STOP dans calfis'
183         write(lunout,*)
184     &   'La dimension ngridmx doit etre egale a 2 + (jjm-1)*iim'
185         write(lunout,*) '  ngridmx  jjm   iim   '
186         write(lunout,*) ngridmx,jjm,iim
187         CALL abort_gcm("calfis", "", 1)
188        ENDIF
189      ELSE
190        debut = .FALSE.
191      ENDIF ! of IF (firstcal)
192
193c
194c
195c-----------------------------------------------------------------------
196c   40. transformation des variables dynamiques en variables physiques:
197c   ---------------------------------------------------------------
198
199c   41. pressions au sol (en Pascals)
200c   ----------------------------------
201
202
203      zpsrf(1) = pps(1,1)
204
205      ig0  = 2
206      DO j = 2,jjm
207         CALL SCOPY( iim,pps(1,j),1,zpsrf(ig0), 1 )
208         ig0 = ig0+iim
209      ENDDO
210
211      zpsrf(ngridmx) = pps(1,jjp1)
212
213
214c   42. pression intercouches et fonction d'Exner:
215c
216c   -----------------------------------------------------------------
217c     .... zplev  definis aux (llm +1) interfaces des couches  ....
218c     .... zplay  definis aux (  llm )    milieux des couches  ....
219c   -----------------------------------------------------------------
220
221c    ...    Exner = cp * ( p(l) / preff ) ** kappa     ....
222c
223       unskap   = 1./ kappa
224c
225      DO l = 1, llm
226        zpk(   1,l ) = ppk(1,1,l)
227        zplev( 1,l ) = pp(1,1,l)
228        ig0 = 2
229          DO j = 2, jjm
230             DO i =1, iim
231              zpk(   ig0,l ) = ppk(i,j,l)
232              zplev( ig0,l ) = pp(i,j,l)
233              ig0 = ig0 +1
234             ENDDO
235          ENDDO
236        zpk(   ngridmx,l ) = ppk(1,jjp1,l)
237        zplev( ngridmx,l ) = pp(1,jjp1,l)
238      ENDDO
239        zplev( 1,llmp1 ) = pp(1,1,llmp1)
240        ig0 = 2
241          DO j = 2, jjm
242             DO i =1, iim
243              zplev( ig0,llmp1 ) = pp(i,j,llmp1)
244              ig0 = ig0 +1
245             ENDDO
246          ENDDO
247        zplev( ngridmx,llmp1 ) = pp(1,jjp1,llmp1)
248c
249c
250
251c   43. temperature naturelle (en K) et pressions milieux couches .
252c   ---------------------------------------------------------------
253
254      DO l=1,llm
255
256         pksurcp     =  ppk(1,1,l) / cpp
257         zplay(1,l)  =  preff * pksurcp ** unskap
258         ztfi(1,l)   =  pteta(1,1,l) *  pksurcp
259         pcvgt(1,l)  =  pdteta(1,1,l) * pksurcp / pmasse(1,1,l)
260         ig0         = 2
261
262         DO j = 2, jjm
263            DO i = 1, iim
264              pksurcp        = ppk(i,j,l) / cpp
265              zplay(ig0,l)   = preff * pksurcp ** unskap
266              ztfi(ig0,l)    = pteta(i,j,l)  * pksurcp
267              pcvgt(ig0,l)   = pdteta(i,j,l) * pksurcp / pmasse(i,j,l)
268              ig0            = ig0 + 1
269            ENDDO
270         ENDDO
271
272         pksurcp       = ppk(1,jjp1,l) / cpp
273         zplay(ig0,l)  = preff * pksurcp ** unskap
274         ztfi (ig0,l)  = pteta(1,jjp1,l)  * pksurcp
275         pcvgt(ig0,l)  = pdteta(1,jjp1,l) * pksurcp/ pmasse(1,jjp1,l)
276
277      ENDDO
278
279c   43.bis traceurs
280c   ---------------
281c
282      itr=0
283      DO iq=1,nqtot
284         IF(.NOT.tracers(iq)%isAdvected) CYCLE
285         itr = itr + 1
286         DO l=1,llm
287            zqfi(1,l,itr) = pq(1,1,l,iq)
288            ig0           = 2
289            DO j=2,jjm
290               DO i = 1, iim
291                  zqfi(ig0,l,itr) = pq(i,j,l,iq)
292                  ig0             = ig0 + 1
293               ENDDO
294            ENDDO
295            zqfi(ig0,l,itr) = pq(1,jjp1,l,iq)
296         ENDDO
297      ENDDO
298
299c   convergence dynamique pour les traceurs "EAU"
300! Earth-specific treatment of first 2 tracers (water)
301       if (planet_type=="earth") then
302        DO iq=1,2
303         DO l=1,llm
304            pcvgq(1,l,iq)= pdq(1,1,l,iq) / pmasse(1,1,l)
305            ig0          = 2
306            DO j=2,jjm
307               DO i = 1, iim
308                  pcvgq(ig0,l,iq) = pdq(i,j,l,iq) / pmasse(i,j,l)
309                  ig0             = ig0 + 1
310               ENDDO
311            ENDDO
312            pcvgq(ig0,l,iq)= pdq(1,jjp1,l,iq) / pmasse(1,jjp1,l)
313         ENDDO
314        ENDDO
315       endif ! of if (planet_type=="earth")
316
317
318c   Geopotentiel calcule par rapport a la surface locale:
319c   -----------------------------------------------------
320
321      CALL gr_dyn_fi(llm,iip1,jjp1,ngridmx,pphi,zphi)
322      CALL gr_dyn_fi(1,iip1,jjp1,ngridmx,pphis,zphis)
323      DO l=1,llm
324         DO ig=1,ngridmx
325           zphi(ig,l)=zphi(ig,l)-zphis(ig)
326         ENDDO
327      ENDDO
328
329c   ....  Calcul de la vitesse  verticale  ( en Pa*m*s  ou Kg/s )  ....
330c JG : ancien calcule de omega utilise dans physiq.F. Maintenant le flux
331c    de masse est calclue dans advtrac.F
332c      DO l=1,llm
333c        pvervel(1,l)=pw(1,1,l) * g /apoln
334c        ig0=2
335c       DO j=2,jjm
336c           DO i = 1, iim
337c              pvervel(ig0,l) = pw(i,j,l) * g * unsaire(i,j)
338c              ig0 = ig0 + 1
339c           ENDDO
340c       ENDDO
341c        pvervel(ig0,l)=pw(1,jjp1,l) * g /apols
342c      ENDDO
343
344c
345c   45. champ u:
346c   ------------
347
348      DO l=1,llm
349
350         DO j=2,jjm
351            ig0 = 1+(j-2)*iim
352            zufi(ig0+1,l)= 0.5 *
353     $      ( pucov(iim,j,l)/cu(iim,j) + pucov(1,j,l)/cu(1,j) )
354            pcvgu(ig0+1,l)= 0.5 *
355     $      ( pducov(iim,j,l)/cu(iim,j) + pducov(1,j,l)/cu(1,j) )
356            DO i=2,iim
357               zufi(ig0+i,l)= 0.5 *
358     $         ( pucov(i-1,j,l)/cu(i-1,j) + pucov(i,j,l)/cu(i,j) )
359               pcvgu(ig0+i,l)= 0.5 *
360     $         ( pducov(i-1,j,l)/cu(i-1,j) + pducov(i,j,l)/cu(i,j) )
361      END DO
362      END DO
363
364      END DO
365
366
367C  Alvaro de la Camara (May 2014)
368C  46.1 Calcul de la vorticite et passage sur la grille physique
369C  --------------------------------------------------------------
370      DO l=1,llm
371        do i=1,iim
372          do j=1,jjm
373            zrot(i,j,l) = (pvcov(i+1,j,l) - pvcov(i,j,l)
374     $                   + pucov(i,j+1,l) - pucov(i,j,l))
375     $                   / (cu(i,j)+cu(i,j+1))
376     $                   / (cv(i+1,j)+cv(i,j)) *4
377          enddo
378        enddo
379      ENDDO
380
381c   46.champ v:
382c   -----------
383
384      DO l=1,llm
385         DO j=2,jjm
386            ig0=1+(j-2)*iim
387            DO i=1,iim
388               zvfi(ig0+i,l)= 0.5 *
389     $         ( pvcov(i,j-1,l)/cv(i,j-1) + pvcov(i,j,l)/cv(i,j) )
390               pcvgv(ig0+i,l)= 0.5 *
391     $         ( pdvcov(i,j-1,l)/cv(i,j-1) + pdvcov(i,j,l)/cv(i,j) )
392            ENDDO
393               zrfi(ig0 + 1,l)= 0.25 *(zrot(iim,j-1,l)+zrot(iim,j,l)
394     &                                +zrot(1,j-1,l)+zrot(1,j,l))
395            DO i=2,iim
396               zrfi(ig0 + i,l)= 0.25 *(zrot(i-1,j-1,l)+zrot(i-1,j,l)
397     $                   +zrot(i,j-1,l)+zrot(i,j,l))   !  AdlC MAY 2014
398            ENDDO
399         ENDDO
400      ENDDO
401
402
403c   47. champs de vents aux pole nord
404c   ------------------------------
405c        U = 1 / pi  *  integrale [ v * cos(long) * d long ]
406c        V = 1 / pi  *  integrale [ v * sin(long) * d long ]
407
408      DO l=1,llm
409
410         z1(1)   =(rlonu(1)-rlonu(iim)+2.*pi)*pvcov(1,1,l)/cv(1,1)
411         z1bis(1)=(rlonu(1)-rlonu(iim)+2.*pi)*pdvcov(1,1,l)/cv(1,1)
412         DO i=2,iim
413            z1(i)   =(rlonu(i)-rlonu(i-1))*pvcov(i,1,l)/cv(i,1)
414            z1bis(i)=(rlonu(i)-rlonu(i-1))*pdvcov(i,1,l)/cv(i,1)
415         ENDDO
416
417         DO i=1,iim
418            zcos(i)   = COS(rlonv(i))*z1(i)
419            zcosbis(i)= COS(rlonv(i))*z1bis(i)
420            zsin(i)   = SIN(rlonv(i))*z1(i)
421            zsinbis(i)= SIN(rlonv(i))*z1bis(i)
422         ENDDO
423
424         zufi(1,l)  = SSUM(iim,zcos,1)/pi
425         pcvgu(1,l) = SSUM(iim,zcosbis,1)/pi
426         zvfi(1,l)  = SSUM(iim,zsin,1)/pi
427         pcvgv(1,l) = SSUM(iim,zsinbis,1)/pi
428         zrfi(1, l) = 0.
429      ENDDO
430
431
432c   48. champs de vents aux pole sud:
433c   ---------------------------------
434c        U = 1 / pi  *  integrale [ v * cos(long) * d long ]
435c        V = 1 / pi  *  integrale [ v * sin(long) * d long ]
436
437      DO l=1,llm
438
439         z1(1)   =(rlonu(1)-rlonu(iim)+2.*pi)*pvcov(1,jjm,l)/cv(1,jjm)
440         z1bis(1)=(rlonu(1)-rlonu(iim)+2.*pi)*pdvcov(1,jjm,l)/cv(1,jjm)
441         DO i=2,iim
442            z1(i)   =(rlonu(i)-rlonu(i-1))*pvcov(i,jjm,l)/cv(i,jjm)
443            z1bis(i)=(rlonu(i)-rlonu(i-1))*pdvcov(i,jjm,l)/cv(i,jjm)
444         ENDDO
445
446         DO i=1,iim
447            zcos(i)    = COS(rlonv(i))*z1(i)
448            zcosbis(i) = COS(rlonv(i))*z1bis(i)
449            zsin(i)    = SIN(rlonv(i))*z1(i)
450            zsinbis(i) = SIN(rlonv(i))*z1bis(i)
451         ENDDO
452
453         zufi(ngridmx,l)  = SSUM(iim,zcos,1)/pi
454         pcvgu(ngridmx,l) = SSUM(iim,zcosbis,1)/pi
455         zvfi(ngridmx,l)  = SSUM(iim,zsin,1)/pi
456         pcvgv(ngridmx,l) = SSUM(iim,zsinbis,1)/pi
457         zrfi(ngridmx, l) = 0.
458      ENDDO
459c
460c On change de grille, dynamique vers physiq, pour le flux de masse verticale
461      CALL gr_dyn_fi(llm,iip1,jjp1,ngridmx,flxw,flxwfi)
462
463c-----------------------------------------------------------------------
464c   Appel de la physique:
465c   ---------------------
466
467
468
469!      write(lunout,*) 'PHYSIQUE AVEC NSPLIT_PHYS=',nsplit_phys
470      zdt_split=dtphys/nsplit_phys
471      zdufic(:,:)=0.
472      zdvfic(:,:)=0.
473      zdtfic(:,:)=0.
474      zdqfic(:,:,:)=0.
475
476       IF (CPPKEY_PHYS) THEN
477
478       do isplit=1,nsplit_phys
479
480         jH_cur_split=jH_cur+(isplit-1) * dtvr / (daysec *nsplit_phys)
481         debut_split=debut.and.isplit==1
482         lafin_split=lafin.and.isplit==nsplit_phys
483
484!      if (planet_type=="earth") then
485        CALL call_physiq(ngridmx,llm,nqtot,tracers(:)%name,
486     &                   debut_split,lafin_split,
487     &                   jD_cur,jH_cur_split,zdt_split,
488     &                   zplev,zplay,
489     &                   zpk,zphi,zphis,
490     &                   presnivs,
491     &                   zufi,zvfi,zrfi,ztfi,zqfi,
492     &                   flxwfi,pducov,
493     &                   zdufi,zdvfi,zdtfi,zdqfi,zdpsrf)
494
495!      else if ( planet_type=="generic" ) then
496
497!         CALL physiq (ngridmx,     !! ngrid
498!     .             llm,            !! nlayer
499!     .             nqtot,          !! nq
500!     .             tracers(:)%name,!! tracer names from dynamical core (given in infotrac)
501!     .             debut_split,    !! firstcall
502!     .             lafin_split,    !! lastcall
503!     .             jD_cur,         !! pday. see leapfrog
504!     .             jH_cur_split,   !! ptime "fraction of day"
505!     .             zdt_split,      !! ptimestep
506!     .             zplev,          !! pplev
507!     .             zplay,          !! pplay
508!     .             zphi,           !! pphi
509!     .             zufi,           !! pu
510!     .             zvfi,           !! pv
511!     .             ztfi,           !! pt
512!     .             zqfi,           !! pq
513!     .             flxwfi,         !! pw !! or 0. anyway this is for diagnostic. not used in physiq.
514!     .             zdufi,          !! pdu
515!     .             zdvfi,          !! pdv
516!     .             zdtfi,          !! pdt
517!     .             zdqfi,          !! pdq
518!     .             zdpsrf,         !! pdpsrf
519!     .             tracerdyn)      !! tracerdyn <-- utilite ???
520
521!      endif ! of if (planet_type=="earth")
522
523         zufi(:,:)=zufi(:,:)+zdufi(:,:)*zdt_split
524         zvfi(:,:)=zvfi(:,:)+zdvfi(:,:)*zdt_split
525         ztfi(:,:)=ztfi(:,:)+zdtfi(:,:)*zdt_split
526         zqfi(:,:,:)=zqfi(:,:,:)+zdqfi(:,:,:)*zdt_split
527
528         zdufic(:,:)=zdufic(:,:)+zdufi(:,:)
529         zdvfic(:,:)=zdvfic(:,:)+zdvfi(:,:)
530         zdtfic(:,:)=zdtfic(:,:)+zdtfi(:,:)
531         zdqfic(:,:,:)=zdqfic(:,:,:)+zdqfi(:,:,:)
532
533       enddo ! of do isplit=1,nsplit_phys
534
535       END IF
536
537      zdufi(:,:)=zdufic(:,:)/nsplit_phys
538      zdvfi(:,:)=zdvfic(:,:)/nsplit_phys
539      zdtfi(:,:)=zdtfic(:,:)/nsplit_phys
540      zdqfi(:,:,:)=zdqfic(:,:,:)/nsplit_phys
541
542c-----------------------------------------------------------------------
543c   transformation des tendances physiques en tendances dynamiques:
544c   ---------------------------------------------------------------
545
546c  tendance sur la pression :
547c  -----------------------------------
548
549      CALL gr_fi_dyn(1,ngridmx,iip1,jjp1,zdpsrf,pdpsfi)
550c
551c   62. enthalpie potentielle
552c   ---------------------
553
554      DO l=1,llm
555
556         DO i=1,iip1
557          pdhfi(i,1,l)    = cpp *  zdtfi(1,l)      / ppk(i, 1  ,l)
558          pdhfi(i,jjp1,l) = cpp *  zdtfi(ngridmx,l)/ ppk(i,jjp1,l)
559         ENDDO
560
561         DO j=2,jjm
562            ig0=1+(j-2)*iim
563            DO i=1,iim
564               pdhfi(i,j,l) = cpp * zdtfi(ig0+i,l) / ppk(i,j,l)
565            ENDDO
566               pdhfi(iip1,j,l) =  pdhfi(1,j,l)
567         ENDDO
568
569      ENDDO
570
571
572c   62. humidite specifique
573c   ---------------------
574! Ehouarn: removed this useless bit: was overwritten at step 63 anyways
575!      DO iq=1,nqtot
576!         DO l=1,llm
577!            DO i=1,iip1
578!               pdqfi(i,1,l,iq)    = zdqfi(1,l,iq)
579!               pdqfi(i,jjp1,l,iq) = zdqfi(ngridmx,l,iq)
580!            ENDDO
581!            DO j=2,jjm
582!               ig0=1+(j-2)*iim
583!               DO i=1,iim
584!                  pdqfi(i,j,l,iq) = zdqfi(ig0+i,l,iq)
585!               ENDDO
586!               pdqfi(iip1,j,l,iq) = pdqfi(1,j,l,iq)
587!            ENDDO
588!         ENDDO
589!      ENDDO
590
591c   63. traceurs
592c   ------------
593C     initialisation des tendances
594      pdqfi(:,:,:,:)=0.
595C
596      itr = 0
597      DO iq=1,nqtot
598         IF(.NOT.tracers(iq)%isAdvected) CYCLE
599         itr = itr + 1
600         DO l=1,llm
601            DO i=1,iip1
602               pdqfi(i,1,l,iq)    = zdqfi(1,l,itr)
603               pdqfi(i,jjp1,l,iq) = zdqfi(ngridmx,l,itr)
604            ENDDO
605            DO j=2,jjm
606               ig0=1+(j-2)*iim
607               DO i=1,iim
608                  pdqfi(i,j,l,iq) = zdqfi(ig0+i,l,itr)
609               ENDDO
610               pdqfi(iip1,j,l,iq) = pdqfi(1,j,l,itr)
611            ENDDO
612         ENDDO
613      ENDDO
614
615c   65. champ u:
616c   ------------
617
618      DO l=1,llm
619
620         DO i=1,iip1
621            pdufi(i,1,l)    = 0.
622            pdufi(i,jjp1,l) = 0.
623         ENDDO
624
625         DO j=2,jjm
626            ig0=1+(j-2)*iim
627            DO i=1,iim-1
628               pdufi(i,j,l)=
629     $         0.5*(zdufi(ig0+i,l)+zdufi(ig0+i+1,l))*cu(i,j)
630            ENDDO
631            pdufi(iim,j,l)=
632     $      0.5*(zdufi(ig0+1,l)+zdufi(ig0+iim,l))*cu(iim,j)
633            pdufi(iip1,j,l)=pdufi(1,j,l)
634         ENDDO
635
636      ENDDO
637
638
639c   67. champ v:
640c   ------------
641
642      DO l=1,llm
643
644         DO j=2,jjm-1
645            ig0=1+(j-2)*iim
646            DO i=1,iim
647               pdvfi(i,j,l)=
648     $         0.5*(zdvfi(ig0+i,l)+zdvfi(ig0+i+iim,l))*cv(i,j)
649            ENDDO
650            pdvfi(iip1,j,l) = pdvfi(1,j,l)
651         ENDDO
652      ENDDO
653
654
655c   68. champ v pres des poles:
656c   ---------------------------
657c      v = U * cos(long) + V * SIN(long)
658
659      DO l=1,llm
660
661         DO i=1,iim
662            pdvfi(i,1,l)=
663     $      zdufi(1,l)*COS(rlonv(i))+zdvfi(1,l)*SIN(rlonv(i))
664            pdvfi(i,jjm,l)=zdufi(ngridmx,l)*COS(rlonv(i))
665     $      +zdvfi(ngridmx,l)*SIN(rlonv(i))
666            pdvfi(i,1,l)=
667     $      0.5*(pdvfi(i,1,l)+zdvfi(i+1,l))*cv(i,1)
668            pdvfi(i,jjm,l)=
669     $      0.5*(pdvfi(i,jjm,l)+zdvfi(ngridmx-iip1+i,l))*cv(i,jjm)
670          ENDDO
671
672         pdvfi(iip1,1,l)  = pdvfi(1,1,l)
673         pdvfi(iip1,jjm,l)= pdvfi(1,jjm,l)
674
675      ENDDO
676
677c-----------------------------------------------------------------------
678      firstcal = .FALSE.
679
680      RETURN
681      END
Note: See TracBrowser for help on using the repository browser.