source: LMDZ6/branches/Amaury_dev/libf/dynphy_lonlat/calfis.f90 @ 5182

Last change on this file since 5182 was 5182, checked in by abarral, 10 days ago

(WIP) Replace REPROBUS CPP KEY by logical
properly name modules

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