source: trunk/LMDZ.COMMON/libf/dyn3d/calfis.F @ 1113

Last change on this file since 1113 was 1107, checked in by emillour, 12 years ago

Common dynamics: Updates and modifications to enable running Mars physics with

LMDZ.COMMON dynamics:

  • For compilation: adapted makelmdz, create_make_gcm and makelmdz_fcm, bld.cfg to compile aeronomy routines in "aerono$physique" if it exists, and added "-P -traditional" preprocessing flags in "arch-linux-ifort*"
  • Added function "cbrt.F" (cubic root) in 'bibio'
  • Adapted the reading/writing of dynamics (re)start.nc files for Mars. The main issue is that different information (on time, reference and current) is stored and used differently, hence a few if (planet_type =="mars") here and there. Moreover in the martian case there is the possibility to store fields over multiple times. Some Mars-specific variables (ecritphy,ecritstart,timestart) added in control_mod.F and (hour_ini) in temps.h

EM

File size: 27.5 KB
Line 
1!
2! $Id: calfis.F 1407 2010-07-07 10:31:52Z fairhead $
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
32      USE control_mod
33      USE write_field
34      USE cpdet_mod, only: t2tpot,tpot2t
35 
36! used only for zonal averages
37      USE moyzon_mod
38
39      IMPLICIT NONE
40c=======================================================================
41c
42c   1. rearrangement des tableaux et transformation
43c      variables dynamiques  >  variables physiques
44c   2. calcul des termes physiques
45c   3. retransformation des tendances physiques en tendances dynamiques
46c
47c   remarques:
48c   ----------
49c
50c    - les vents sont donnes dans la physique par leurs composantes
51c      naturelles.
52c    - la variable thermodynamique de la physique est une variable
53c      intensive :   T
54c      pour la dynamique on prend    T * ( preff / p(l) ) **kappa
55c    - les deux seules variables dependant de la geometrie necessaires
56c      pour la physique sont la latitude pour le rayonnement et
57c      l'aire de la maille quand on veut integrer une grandeur
58c      horizontalement.
59c    - les points de la physique sont les points scalaires de la
60c      la dynamique; numerotation:
61c          1 pour le pole nord
62c          (jjm-1)*iim pour l'interieur du domaine
63c          ngridmx pour le pole sud
64c      ---> ngridmx=2+(jjm-1)*iim
65c
66c     Input :
67c     -------
68c       pucov           covariant zonal velocity
69c       pvcov           covariant meridional velocity
70c       pteta           potential temperature
71c       pps             surface pressure
72c       pmasse          masse d'air dans chaque maille
73c       pts             surface temperature  (K)
74c       callrad         clef d'appel au rayonnement
75c
76c    Output :
77c    --------
78c        pdufi          tendency for the natural zonal velocity (ms-1)
79c        pdvfi          tendency for the natural meridional velocity
80c        pdhfi          tendency for the potential temperature (K/s)
81c        pdtsfi         tendency for the surface temperature
82c
83c        pdtrad         radiative tendencies  \  both input
84c        pfluxrad       radiative fluxes      /  and output
85c
86c=======================================================================
87c
88c-----------------------------------------------------------------------
89c
90c    0.  Declarations :
91c    ------------------
92
93#include "dimensions.h"
94#include "paramet.h"
95#include "temps.h"
96#include "logic.h"
97
98      INTEGER ngridmx
99      PARAMETER( ngridmx = 2+(jjm-1)*iim - 1/jjm   )
100
101#include "comconst.h"
102#include "comvert.h"
103#include "comgeom2.h"
104#include "iniprint.h"
105
106c    Arguments :
107c    -----------
108      LOGICAL  lafin
109
110
111      REAL pvcov(iip1,jjm,llm)
112      REAL pucov(iip1,jjp1,llm)
113      REAL pteta(iip1,jjp1,llm)
114      REAL pmasse(iip1,jjp1,llm)
115      REAL pq(iip1,jjp1,llm,nqtot)
116      REAL pphis(iip1,jjp1)
117      REAL pphi(iip1,jjp1,llm)
118
119      REAL pdvcov(iip1,jjm,llm)
120      REAL pducov(iip1,jjp1,llm)
121      REAL pdteta(iip1,jjp1,llm)
122! commentaire SL: pdq ne sert que pour le calcul de pcvgq,
123! qui lui meme ne sert a rien dans la routine telle qu'elle est
124! ecrite, et que j'ai donc commente....
125      REAL pdq(iip1,jjp1,llm,nqtot)
126
127      REAL pps(iip1,jjp1)
128      REAL pp(iip1,jjp1,llmp1)
129      REAL ppk(iip1,jjp1,llm)
130
131c TENDENCIES in */s
132      REAL pdvfi(iip1,jjm,llm)
133      REAL pdufi(iip1,jjp1,llm)
134      REAL pdhfi(iip1,jjp1,llm)
135      REAL pdqfi(iip1,jjp1,llm,nqtot)
136      REAL pdpsfi(iip1,jjp1)
137
138
139c    Local variables :
140c    -----------------
141
142      INTEGER i,j,l,ig0,ig,iq,iiq
143      REAL zpsrf(ngridmx)
144      REAL zplev(ngridmx,llm+1),zplay(ngridmx,llm)
145      REAL zphi(ngridmx,llm),zphis(ngridmx)
146
147      REAL zufi(ngridmx,llm), zvfi(ngridmx,llm)
148      REAL ztfi(ngridmx,llm),zqfi(ngridmx,llm,nqtot)
149! ADAPTATION GCM POUR CP(T)
150      REAL zteta(ngridmx,llm)
151      REAL zpk(ngridmx,llm)
152
153! RQ SL 13/10/10:
154! Ces calculs ne servent pas.
155! Si necessaire, decommenter ces variables et les calculs...
156!      REAL pcvgu(ngridmx,llm), pcvgv(ngridmx,llm)
157!      REAL pcvgt(ngridmx,llm), pcvgq(ngridmx,llm,2)
158
159      REAL zdufi(ngridmx,llm),zdvfi(ngridmx,llm)
160      REAL zdtfi(ngridmx,llm),zdqfi(ngridmx,llm,nqtot)
161      REAL zdpsrf(ngridmx)
162
163      REAL zdufic(ngridmx,llm),zdvfic(ngridmx,llm)
164      REAL zdtfic(ngridmx,llm),zdqfic(ngridmx,llm,nqtot)
165      REAL jH_cur_split,zdt_split
166      LOGICAL debut_split,lafin_split
167      INTEGER isplit
168
169      REAL zsin(iim),zcos(iim),z1(iim)
170      REAL zsinbis(iim),zcosbis(iim),z1bis(iim)
171      REAL unskap, pksurcp
172      save unskap
173
174cIM diagnostique PVteta, Amip2
175      INTEGER ntetaSTD
176      PARAMETER(ntetaSTD=3)
177      REAL rtetaSTD(ntetaSTD)
178      DATA rtetaSTD/350., 380., 405./ ! Earth-specific values, beware !!
179      REAL PVteta(ngridmx,ntetaSTD)
180
181      REAL flxw(iip1,jjp1,llm)  ! Flux de masse verticale sur la grille dynamique
182      REAL flxwfi(ngridmx,llm)  ! Flux de masse verticale sur la grille physiq
183     
184      REAL SSUM
185
186      LOGICAL firstcal, debut
187      DATA firstcal/.true./
188      SAVE firstcal,debut
189!      REAL rdayvrai
190      REAL, intent(in):: jD_cur, jH_cur
191
192      LOGICAL tracerdyn ! for generic/mars physics call ; possibly to get rid of
193
194! For Titan only right now:
195! to allow for 2D computation of microphys and chemistry
196      LOGICAL,save :: flag_moyzon
197      REAL,allocatable,save :: tmpvar(:,:)
198      REAL,allocatable,save :: tmpvarp1(:,:)
199      REAL,allocatable,save :: tmpvarbar(:)
200      REAL,allocatable,save :: tmpvarbarp1(:)
201
202c-----------------------------------------------------------------------
203
204c    1. Initialisations :
205c    --------------------
206
207
208      IF ( firstcal )  THEN
209        debut = .TRUE.
210        IF (ngridmx.NE.2+(jjm-1)*iim) THEN
211         write(lunout,*) 'STOP dans calfis'
212         write(lunout,*)
213     &   'La dimension ngridmx doit etre egale a 2 + (jjm-1)*iim'
214         write(lunout,*) '  ngridmx  jjm   iim   '
215         write(lunout,*) ngridmx,jjm,iim
216         STOP
217        ENDIF
218
219        unskap   = 1./ kappa
220
221        flag_moyzon = .false.
222        if(moyzon_ch.or.moyzon_mu) then
223         flag_moyzon = .true.
224         allocate(tmpvar(iip1,llm))
225         allocate(tmpvarp1(iip1,llmp1))
226         allocate(tmpvarbar(llm))
227         allocate(tmpvarbarp1(llmp1))
228        endif
229
230        if (flag_moyzon) call moyzon_init
231
232c----------------------------------------------
233c moyennes globales pour le profil de pression
234      if(planet_type.eq."titan") then
235        ALLOCATE(plevmoy(llm+1))
236        ALLOCATE(playmoy(llm))
237        ALLOCATE(tmoy(llm))
238        ALLOCATE(tetamoy(llm))
239        ALLOCATE(pkmoy(llm))
240        plevmoy=0.
241        do l=1,llmp1
242         do i=1,iip1
243          do j=1,jjp1
244            plevmoy(l)=plevmoy(l)+pp(i,j,l)/(iip1*jjp1)
245          enddo
246         enddo
247        enddo
248        tetamoy=0.
249        pkmoy=0.
250        do l=1,llm
251         do i=1,iip1
252          do j=1,jjp1
253            tetamoy(l)=tetamoy(l)+pteta(i,j,l)/(iip1*jjp1)
254            pkmoy(l)=pkmoy(l)+ppk(i,j,l)/(iip1*jjp1)
255          enddo
256         enddo
257        enddo
258        playmoy = preff * (pkmoy/cpp) ** unskap
259        call tpot2t(llm,tetamoy,tmoy,pkmoy)
260c-------------------
261c + lat index
262        allocate(klat(ngridmx))
263        klat=0
264        klat(1)  = 1
265        ig0  = 2
266        DO j = 2,jjm
267           do i=0,iim-1
268            klat(ig0+i) = j
269           enddo
270           ig0 = ig0+iim
271        ENDDO
272        klat(ngridmx)  = jjp1
273      endif   ! planet_type=titan
274c----------------------------------------------
275      ELSE
276        debut = .FALSE.
277      ENDIF ! of IF (firstcal)
278
279
280c-----------------------------------------------------------------------
281c   40. transformation des variables dynamiques en variables physiques:
282c   ---------------------------------------------------------------
283
284c   41. pressions au sol (en Pascals)
285c   ----------------------------------
286       
287      zpsrf(1) = pps(1,1)
288
289      ig0  = 2
290      DO j = 2,jjm
291         CALL SCOPY( iim,pps(1,j),1,zpsrf(ig0), 1 )
292         ig0 = ig0+iim
293      ENDDO
294
295      zpsrf(ngridmx) = pps(1,jjp1)
296
297c   42. pression intercouches et fonction d'Exner:
298
299c   -----------------------------------------------------------------
300c     .... zplev  definis aux (llm +1) interfaces des couches  ....
301c     .... zplay  definis aux (  llm )    milieux des couches  ....
302c   -----------------------------------------------------------------
303
304c    ...    Exner = cp * ( p(l) / preff ) ** kappa     ....
305
306! ADAPTATION GCM POUR CP(T)
307      DO l = 1, llm
308        zpk(   1,l ) = ppk(1,1,l)
309        zteta( 1,l ) = pteta(1,1,l)
310        zplev( 1,l ) = pp(1,1,l)
311        ig0 = 2
312          DO j = 2, jjm
313             DO i =1, iim
314              zpk(   ig0,l ) = ppk(i,j,l)
315              zteta( ig0,l ) = pteta(i,j,l)
316              zplev( ig0,l ) = pp(i,j,l)
317              ig0 = ig0 +1
318             ENDDO
319          ENDDO
320        zpk(   ngridmx,l ) = ppk(1,jjp1,l)
321        zteta( ngridmx,l ) = pteta(1,jjp1,l)
322        zplev( ngridmx,l ) = pp(1,jjp1,l)
323      ENDDO
324        zplev( 1,llmp1 ) = pp(1,1,llmp1)
325        ig0 = 2
326          DO j = 2, jjm
327             DO i =1, iim
328              zplev( ig0,llmp1 ) = pp(i,j,llmp1)
329              ig0 = ig0 +1
330             ENDDO
331          ENDDO
332        zplev( ngridmx,llmp1 ) = pp(1,jjp1,llmp1)
333
334      if (flag_moyzon) then
335        tmpvarp1(:,:) = pp(:,1,:)
336        call moyzon(llmp1,tmpvarp1,tmpvarbarp1)
337        zplevbar(1,:) = tmpvarbarp1
338        tmpvar(:,:) = ppk(:,1,:)
339        call moyzon(llm,tmpvar,tmpvarbar)
340        zpkbar(1,:) = tmpvarbar
341        tmpvar(:,:) = pteta(:,1,:)
342        call moyzon(llm,tmpvar,tmpvarbar)
343        ztetabar(1,:) = tmpvarbar
344        call tpot2t(llm,ztetabar(1,:),ztfibar(1,:),zpkbar(1,:))
345        ig0 = 2
346         do j = 2, jjm
347          tmpvarp1(:,:) = pp(:,j,:)
348          call moyzon(llmp1,tmpvarp1,tmpvarbarp1)
349          zplevbar(ig0,:) = tmpvarbarp1
350          tmpvar(:,:) = ppk(:,j,:)
351          call moyzon(llm,tmpvar,tmpvarbar)
352          zpkbar(ig0,:) = tmpvarbar
353          tmpvar(:,:) = pteta(:,j,:)
354          call moyzon(llm,tmpvar,tmpvarbar)
355          ztetabar(ig0,:) = tmpvarbar
356          call tpot2t(llm,ztetabar(ig0,:),ztfibar(ig0,:),zpkbar(ig0,:))
357          ig0 = ig0+1
358          do i=2,iim
359            zplevbar(ig0,:) = zplevbar(ig0-1,:)
360            zpkbar(ig0,:)   = zpkbar(ig0-1,:)
361            ztetabar(ig0,:) = ztetabar(ig0-1,:)
362            ztfibar(ig0,:)  = ztfibar(ig0-1,:)
363            ig0 = ig0+1
364          enddo
365         enddo
366        tmpvarp1(:,:) = pp(:,jjp1,:)
367        call moyzon(llmp1,tmpvarp1,tmpvarbarp1)
368        zplevbar(ngridmx,:) = tmpvarbarp1
369        tmpvar(:,:) = ppk(:,jjp1,:)
370        call moyzon(llm,tmpvar,tmpvarbar)
371        zpkbar(ngridmx,:) = tmpvarbar
372        tmpvar(:,:) = pteta(:,jjp1,:)
373        call moyzon(llm,tmpvar,tmpvarbar)
374        ztetabar(ngridmx,:) = tmpvarbar
375        call tpot2t(llm,ztetabar(ngridmx,:),
376     .                  ztfibar(ngridmx,:),zpkbar(ngridmx,:))
377      endif
378
379c   43. temperature naturelle (en K) et pressions milieux couches .
380c   ---------------------------------------------------------------
381
382! ADAPTATION GCM POUR CP(T)
383         call tpot2t(ngridmx*llm,zteta,ztfi,zpk)
384
385      DO l=1,llm
386
387         pksurcp     =  ppk(1,1,l) / cpp
388         zplay(1,l)  =  preff * pksurcp ** unskap
389!         pcvgt(1,l)  =  pdteta(1,1,l) * pksurcp / pmasse(1,1,l)
390         ig0         = 2
391
392         DO j = 2, jjm
393            DO i = 1, iim
394              pksurcp        = ppk(i,j,l) / cpp
395              zplay(ig0,l)   = preff * pksurcp ** unskap
396!              pcvgt(ig0,l)   = pdteta(i,j,l) * pksurcp / pmasse(i,j,l)
397              ig0            = ig0 + 1
398            ENDDO
399         ENDDO
400
401         pksurcp       = ppk(1,jjp1,l) / cpp
402         zplay(ig0,l)  = preff * pksurcp ** unskap
403!         pcvgt(ig0,l)  = pdteta(1,jjp1,l) * pksurcp/ pmasse(1,jjp1,l)
404
405      ENDDO
406
407      if (flag_moyzon) then
408        zplaybar(:,:) = preff * (zpkbar(:,:)/cpp)**unskap
409      endif
410
411c   43.bis traceurs (tous intensifs)
412c   ---------------
413
414      DO iq=1,nqtot
415         DO l=1,llm
416            zqfi(1,l,iq) = pq(1,1,l,iq)
417            ig0          = 2
418            DO j=2,jjm
419               DO i = 1, iim
420                  zqfi(ig0,l,iq)  = pq(i,j,l,iq)
421                  ig0             = ig0 + 1
422               ENDDO
423            ENDDO
424            zqfi(ig0,l,iq) = pq(1,jjp1,l,iq)
425         ENDDO
426      ENDDO  ! boucle sur traceurs
427
428      if (flag_moyzon) then
429       DO iq=1,nqtot
430! RQ: REVOIR A QUOI CA SERT... ET VERIFIER...
431!       iiq=niadv(iq)
432! en fait, iiq=iq...
433! FIN RQ
434        tmpvar(:,:) = pq(:,1,:,iq)
435        call moyzon(llm,tmpvar,tmpvarbar)
436        zqfibar(1,:,iq) = tmpvarbar
437        ig0 = 2
438         do j = 2, jjm
439          tmpvar(:,:) = pq(:,j,:,iq)
440          call moyzon(llm,tmpvar,tmpvarbar)
441          zqfibar(ig0,:,iq) = tmpvarbar
442          ig0 = ig0+1
443          do i=2,iim
444            zqfibar(ig0,:,iq) = zqfibar(ig0-1,:,iq)
445            ig0 = ig0+1
446          enddo
447         enddo
448        tmpvar(:,:) = pq(:,jjp1,:,iq)
449        call moyzon(llm,tmpvar,tmpvarbar)
450        zqfibar(ngridmx,:,iq) = tmpvarbar
451       ENDDO ! of DO iq=1,nqtot
452      endif
453
454! DEBUG
455!     do ig0=1,ngridmx
456!       write(*,'(6(e13.5,1x))') zqfibar(ig0,1,10),zqfi(ig0,1,10),
457!    .                         zqfibar(ig0,llm/2,10),zqfi(ig0,llm/2,10),
458!    .                           zqfibar(ig0,llm,10),zqfi(ig0,llm,10)
459!     enddo
460!     stop
461
462!-----------------
463! RQ SL 13/10/10:
464! Ces calculs ne servent pas.
465! Si necessaire, decommenter ces variables et les calculs...
466!
467!   convergence dynamique pour les traceurs "EAU"
468! Earth-specific treatment of first 2 tracers (water)
469!      if (planet_type=="earth") then
470!       DO iq=1,2
471!        DO l=1,llm
472!           pcvgq(1,l,iq)= pdq(1,1,l,iq) / pmasse(1,1,l)
473!           ig0          = 2
474!           DO j=2,jjm
475!              DO i = 1, iim
476!                 pcvgq(ig0,l,iq) = pdq(i,j,l,iq) / pmasse(i,j,l)
477!                 ig0             = ig0 + 1
478!              ENDDO
479!           ENDDO
480!           pcvgq(ig0,l,iq)= pdq(1,jjp1,l,iq) / pmasse(1,jjp1,l)
481!        ENDDO
482!       ENDDO
483!      endif ! of if (planet_type=="earth")
484!----------------
485
486c   Geopotentiel calcule par rapport a la surface locale:
487c   -----------------------------------------------------
488
489      CALL gr_dyn_fi(llm,iip1,jjp1,ngridmx,pphi,zphi)
490      CALL gr_dyn_fi(1,iip1,jjp1,ngridmx,pphis,zphis)
491      DO l=1,llm
492         DO ig=1,ngridmx
493           zphi(ig,l)=zphi(ig,l)-zphis(ig)
494         ENDDO
495      ENDDO
496
497      if (flag_moyzon) then
498        tmpvar(:,1) = pphis(:,1)
499        call moyzon(1,tmpvar(:,1),tmpvarbar(1))
500        zphisbar(1) = tmpvarbar(1)
501        tmpvar(:,:) = pphi(:,1,:)
502        call moyzon(llm,tmpvar,tmpvarbar)
503        zphibar(1,:) = tmpvarbar
504        ig0 = 2
505         do j = 2, jjm
506          tmpvar(:,1) = pphis(:,j)
507          call moyzon(1,tmpvar(:,1),tmpvarbar(1))
508          zphisbar(ig0) = tmpvarbar(1)
509          tmpvar(:,:) = pphi(:,j,:)
510          call moyzon(llm,tmpvar,tmpvarbar)
511          zphibar(ig0,:) = tmpvarbar
512          ig0 = ig0+1
513          do i=2,iim
514            zphisbar(ig0)  = zphisbar(ig0-1)
515            zphibar(ig0,:) = zphibar(ig0-1,:)
516            ig0 = ig0+1
517          enddo
518         enddo
519        tmpvar(:,1) = pphis(:,jjp1)
520        call moyzon(1,tmpvar(:,1),tmpvarbar(1))
521        zphisbar(ngridmx) = tmpvarbar(1)
522        tmpvar(:,:) = pphi(:,jjp1,:)
523        call moyzon(llm,tmpvar,tmpvarbar)
524        zphibar(ngridmx,:) = tmpvarbar
525      endif
526
527c   ....  Calcul de la vitesse  verticale  ( en Pa*m*s  ou Kg/s )  ....
528c JG : ancien calcule de omega utilise dans physiq.F. Maintenant le flux
529c    de masse est calclue dans advtrac.F 
530c      DO l=1,llm
531c        pvervel(1,l)=pw(1,1,l) * g /apoln
532c        ig0=2
533c       DO j=2,jjm
534c           DO i = 1, iim
535c              pvervel(ig0,l) = pw(i,j,l) * g * unsaire(i,j)
536c              ig0 = ig0 + 1
537c           ENDDO
538c       ENDDO
539c        pvervel(ig0,l)=pw(1,jjp1,l) * g /apols
540c      ENDDO
541
542c
543c   45. champ u:
544c   ------------
545
546      DO 50 l=1,llm
547
548         DO 25 j=2,jjm
549            ig0 = 1+(j-2)*iim
550            zufi(ig0+1,l)= 0.5 *
551     $      ( pucov(iim,j,l)/cu(iim,j) + pucov(1,j,l)/cu(1,j) )
552!            pcvgu(ig0+1,l)= 0.5 *
553!     $      ( pducov(iim,j,l)/cu(iim,j) + pducov(1,j,l)/cu(1,j) )
554            DO 10 i=2,iim
555               zufi(ig0+i,l)= 0.5 *
556     $         ( pucov(i-1,j,l)/cu(i-1,j) + pucov(i,j,l)/cu(i,j) )
557!               pcvgu(ig0+i,l)= 0.5 *
558!     $         ( pducov(i-1,j,l)/cu(i-1,j) + pducov(i,j,l)/cu(i,j) )
55910         CONTINUE
56025      CONTINUE
561
56250    CONTINUE
563
564
565c   46.champ v:
566c   -----------
567
568      DO l=1,llm
569         DO j=2,jjm
570            ig0=1+(j-2)*iim
571            DO i=1,iim
572               zvfi(ig0+i,l)= 0.5 *
573     $         ( pvcov(i,j-1,l)/cv(i,j-1) + pvcov(i,j,l)/cv(i,j) )
574c               pcvgv(ig0+i,l)= 0.5 *
575c     $         ( pdvcov(i,j-1,l)/cv(i,j-1) + pdvcov(i,j,l)/cv(i,j) )
576            ENDDO
577         ENDDO
578      ENDDO
579
580
581c   47. champs de vents aux pole nord   
582c   ------------------------------
583c        U = 1 / pi  *  integrale [ v * cos(long) * d long ]
584c        V = 1 / pi  *  integrale [ v * sin(long) * d long ]
585
586      DO l=1,llm
587
588         z1(1)   =(rlonu(1)-rlonu(iim)+2.*pi)*pvcov(1,1,l)/cv(1,1)
589         z1bis(1)=(rlonu(1)-rlonu(iim)+2.*pi)*pdvcov(1,1,l)/cv(1,1)
590         DO i=2,iim
591            z1(i)   =(rlonu(i)-rlonu(i-1))*pvcov(i,1,l)/cv(i,1)
592            z1bis(i)=(rlonu(i)-rlonu(i-1))*pdvcov(i,1,l)/cv(i,1)
593         ENDDO
594
595         DO i=1,iim
596            zcos(i)   = COS(rlonv(i))*z1(i)
597            zcosbis(i)= COS(rlonv(i))*z1bis(i)
598            zsin(i)   = SIN(rlonv(i))*z1(i)
599            zsinbis(i)= SIN(rlonv(i))*z1bis(i)
600         ENDDO
601
602         zufi(1,l)  = SSUM(iim,zcos,1)/pi
603!         pcvgu(1,l) = SSUM(iim,zcosbis,1)/pi
604         zvfi(1,l)  = SSUM(iim,zsin,1)/pi
605!         pcvgv(1,l) = SSUM(iim,zsinbis,1)/pi
606
607      ENDDO
608
609
610c   48. champs de vents aux pole sud:
611c   ---------------------------------
612c        U = 1 / pi  *  integrale [ v * cos(long) * d long ]
613c        V = 1 / pi  *  integrale [ v * sin(long) * d long ]
614
615      DO l=1,llm
616
617         z1(1)   =(rlonu(1)-rlonu(iim)+2.*pi)*pvcov(1,jjm,l)/cv(1,jjm)
618         z1bis(1)=(rlonu(1)-rlonu(iim)+2.*pi)*pdvcov(1,jjm,l)/cv(1,jjm)
619         DO i=2,iim
620            z1(i)   =(rlonu(i)-rlonu(i-1))*pvcov(i,jjm,l)/cv(i,jjm)
621            z1bis(i)=(rlonu(i)-rlonu(i-1))*pdvcov(i,jjm,l)/cv(i,jjm)
622         ENDDO
623
624         DO i=1,iim
625            zcos(i)    = COS(rlonv(i))*z1(i)
626            zcosbis(i) = COS(rlonv(i))*z1bis(i)
627            zsin(i)    = SIN(rlonv(i))*z1(i)
628            zsinbis(i) = SIN(rlonv(i))*z1bis(i)
629         ENDDO
630
631         zufi(ngridmx,l)  = SSUM(iim,zcos,1)/pi
632!         pcvgu(ngridmx,l) = SSUM(iim,zcosbis,1)/pi
633         zvfi(ngridmx,l)  = SSUM(iim,zsin,1)/pi
634!         pcvgv(ngridmx,l) = SSUM(iim,zsinbis,1)/pi
635
636      ENDDO
637c
638      if (planet_type=="earth") then
639#ifdef CPP_EARTH
640! PVtheta calls tetalevel, which is in the (Earth) physics
641cIM calcul PV a teta=350, 380, 405K
642      CALL PVtheta(ngridmx,llm,pucov,pvcov,pteta,
643     $           ztfi,zplay,zplev,
644     $           ntetaSTD,rtetaSTD,PVteta)
645#endif
646      endif
647c
648c On change de grille, dynamique vers physiq, pour le flux de masse verticale
649      CALL gr_dyn_fi(llm,iip1,jjp1,ngridmx,flxw,flxwfi)
650
651c-----------------------------------------------------------------------
652c   Appel de la physique:
653c   ---------------------
654
655! Appel de la physique: pose probleme quand on tourne
656! SANS physique, car physiq.F est dans le repertoire phy[]...
657! Il faut une cle CPP_PHYS
658
659! Le fait que les arguments de physiq soient differents selon les planetes
660! ne pose pas de probleme a priori.
661
662!      write(lunout,*) 'PHYSIQUE AVEC NSPLIT_PHYS=',nsplit_phys
663      zdt_split=dtphys/nsplit_phys
664      zdufic(:,:)=0.
665      zdvfic(:,:)=0.
666      zdtfic(:,:)=0.
667      zdqfic(:,:,:)=0.
668
669#ifdef CPP_PHYS
670
671      do isplit=1,nsplit_phys
672
673         jH_cur_split=jH_cur+(isplit-1) * dtvr / (daysec *nsplit_phys)
674         debut_split=debut.and.isplit==1
675         lafin_split=lafin.and.isplit==nsplit_phys
676
677      if (planet_type.eq."earth") then
678         CALL physiq (ngridmx,
679     .             llm,
680     .             debut_split,
681     .             lafin_split,
682     .             jD_cur,
683     .             jH_cur_split,
684     .             zdt_split,
685     .             zplev,
686     .             zplay,
687     .             zphi,
688     .             zphis,
689     .             presnivs,
690     .             zufi,
691     .             zvfi,
692     .             ztfi,
693     .             zqfi,
694     .             flxwfi,
695     .             zdufi,
696     .             zdvfi,
697     .             zdtfi,
698     .             zdqfi,
699     .             zdpsrf,
700cIM diagnostique PVteta, Amip2         
701     .             pducov,
702     .             PVteta)
703
704      else if ( planet_type=="generic" ) then
705
706         CALL physiq (ngridmx,     !! ngrid
707     .             llm,            !! nlayer
708     .             nqtot,          !! nq
709     .             tname,          !! tracer names from dynamical core (given in infotrac)
710     .             debut_split,    !! firstcall
711     .             lafin_split,    !! lastcall
712     .             jD_cur,         !! pday. see leapfrog
713     .             jH_cur_split,   !! ptime "fraction of day"
714     .             zdt_split,      !! ptimestep
715     .             zplev,          !! pplev
716     .             zplay,          !! pplay
717     .             zphi,           !! pphi
718     .             zufi,           !! pu
719     .             zvfi,           !! pv
720     .             ztfi,           !! pt
721     .             zqfi,           !! pq
722     .             flxwfi,         !! pw !! or 0. anyway this is for diagnostic. not used in physiq.
723     .             zdufi,          !! pdu
724     .             zdvfi,          !! pdv
725     .             zdtfi,          !! pdt
726     .             zdqfi,          !! pdq
727     .             zdpsrf,         !! pdpsrf
728     .             tracerdyn)      !! tracerdyn <-- utilite ???
729
730      else if ( planet_type=="mars" ) then
731
732        CALL physiq (ngridmx,    ! ngrid
733     .             llm,          ! nlayer
734     .             nqtot,        ! nq
735     .             debut_split,  ! firstcall
736     .             lafin_split,  ! lastcall
737     .             jD_cur,       ! pday
738     .             jH_cur_split, ! ptime
739     .             zdt_split,    ! ptimestep
740     .             zplev,        ! pplev
741     .             zplay,        ! pplay
742     .             zphi,         ! pphi
743     .             zufi,         ! pu
744     .             zvfi,         ! pv
745     .             ztfi,         ! pt
746     .             zqfi,         ! pq
747     .             flxwfi,       ! pw
748     .             zdufi,        ! pdu
749     .             zdvfi,        ! pdv
750     .             zdtfi,        ! pdt
751     .             zdqfi,        ! pdq
752     .             zdpsrf,       ! pdpsrf
753     .             tracerdyn)    ! tracerdyn (somewhat obsolete)
754
755      else ! unknown "planet_type"
756
757        write(lunout,*) "calfis_p: error, unknown planet_type: ",
758     &                  trim(planet_type)
759        stop
760
761      endif ! planet_type
762
763         zufi(:,:)=zufi(:,:)+zdufi(:,:)*zdt_split
764         zvfi(:,:)=zvfi(:,:)+zdvfi(:,:)*zdt_split
765         ztfi(:,:)=ztfi(:,:)+zdtfi(:,:)*zdt_split
766         zqfi(:,:,:)=zqfi(:,:,:)+zdqfi(:,:,:)*zdt_split
767
768         zdufic(:,:)=zdufic(:,:)+zdufi(:,:)
769         zdvfic(:,:)=zdvfic(:,:)+zdvfi(:,:)
770         zdtfic(:,:)=zdtfic(:,:)+zdtfi(:,:)
771         zdqfic(:,:,:)=zdqfic(:,:,:)+zdqfi(:,:,:)
772
773      enddo ! of do isplit=1,nsplit_phys
774
775! ATTENTION...
776      if (flag_moyzon.and.(nsplit_phys.ne.1)) then
777       print*,"WARNING ! flag_moyzon + nsplit_phys"
778       print*,"zqfibar n'est pas implemente au cours des iterations"
779       print*,"Donc a revoir..."
780       stop
781      endif
782
783#endif
784! #endif of #ifdef CPP_PHYS
785
786      zdufi(:,:)=zdufic(:,:)/nsplit_phys
787      zdvfi(:,:)=zdvfic(:,:)/nsplit_phys
788      zdtfi(:,:)=zdtfic(:,:)/nsplit_phys
789      zdqfi(:,:,:)=zdqfic(:,:,:)/nsplit_phys
790
791
792500   CONTINUE
793
794c-----------------------------------------------------------------------
795c   transformation des tendances physiques en tendances dynamiques:
796c   ---------------------------------------------------------------
797
798c  tendance sur la pression :
799c  -----------------------------------
800
801      CALL gr_fi_dyn(1,ngridmx,iip1,jjp1,zdpsrf,pdpsfi)
802c
803c   62. enthalpie potentielle
804c   ---------------------
805
806! ADAPTATION GCM POUR CP(T)
807      call t2tpot(ngridmx*llm,ztfi,zteta,zpk)
808
809         DO i=1,iip1
810      pdhfi(i,1,:) = (zteta(1,:) - pteta(i,1,:))/dtphys
811      pdhfi(i,jjp1,:) = (zteta(ngridmx,:) - pteta(i,jjp1,:))/dtphys
812         ENDDO
813
814         DO j=2,jjm
815            ig0=1+(j-2)*iim
816            DO i=1,iim
817      pdhfi(i,j,:) = (zteta(ig0+i,:) - pteta(i,j,:))/dtphys
818            ENDDO
819               pdhfi(iip1,j,:) =  pdhfi(1,j,:)
820         ENDDO
821
822
823c   62. humidite specifique
824c   ---------------------
825! Ehouarn: removed this useless bit: was overwritten at step 63 anyways
826!      DO iq=1,nqtot
827!         DO l=1,llm
828!            DO i=1,iip1
829!               pdqfi(i,1,l,iq)    = zdqfi(1,l,iq)
830!               pdqfi(i,jjp1,l,iq) = zdqfi(ngridmx,l,iq)
831!            ENDDO
832!            DO j=2,jjm
833!               ig0=1+(j-2)*iim
834!               DO i=1,iim
835!                  pdqfi(i,j,l,iq) = zdqfi(ig0+i,l,iq)
836!               ENDDO
837!               pdqfi(iip1,j,l,iq) = pdqfi(1,j,l,iq)
838!            ENDDO
839!         ENDDO
840!      ENDDO
841
842c   63. traceurs (tous en intensifs)
843c   ------------
844C     initialisation des tendances
845      pdqfi(:,:,:,:)=0.
846C
847       DO iq=1,nqtot
848         iiq=niadv(iq)
849         DO l=1,llm
850            DO i=1,iip1
851               pdqfi(i,1,l,iiq)    = zdqfi(1,l,iq)
852               pdqfi(i,jjp1,l,iiq) = zdqfi(ngridmx,l,iq)
853            ENDDO
854            DO j=2,jjm
855               ig0=1+(j-2)*iim
856               DO i=1,iim
857                  pdqfi(i,j,l,iiq) = zdqfi(ig0+i,l,iq)
858               ENDDO
859               pdqfi(iip1,j,l,iiq) = pdqfi(1,j,l,iq)
860            ENDDO
861         ENDDO
862       ENDDO
863
864c   65. champ u:
865c   ------------
866
867      DO l=1,llm
868
869         DO i=1,iip1
870            pdufi(i,1,l)    = 0.
871            pdufi(i,jjp1,l) = 0.
872         ENDDO
873
874         DO j=2,jjm
875            ig0=1+(j-2)*iim
876            DO i=1,iim-1
877               pdufi(i,j,l)=
878     $         0.5*(zdufi(ig0+i,l)+zdufi(ig0+i+1,l))*cu(i,j)
879            ENDDO
880            pdufi(iim,j,l)=
881     $      0.5*(zdufi(ig0+1,l)+zdufi(ig0+iim,l))*cu(iim,j)
882            pdufi(iip1,j,l)=pdufi(1,j,l)
883         ENDDO
884
885      ENDDO
886
887
888c   67. champ v:
889c   ------------
890
891      DO l=1,llm
892
893         DO j=2,jjm-1
894            ig0=1+(j-2)*iim
895            DO i=1,iim
896               pdvfi(i,j,l)=
897     $         0.5*(zdvfi(ig0+i,l)+zdvfi(ig0+i+iim,l))*cv(i,j)
898            ENDDO
899            pdvfi(iip1,j,l) = pdvfi(1,j,l)
900         ENDDO
901      ENDDO
902
903
904c   68. champ v pres des poles:
905c   ---------------------------
906c      v = U * cos(long) + V * SIN(long)
907
908      DO l=1,llm
909
910         DO i=1,iim
911            pdvfi(i,1,l)=
912     $      zdufi(1,l)*COS(rlonv(i))+zdvfi(1,l)*SIN(rlonv(i))
913            pdvfi(i,jjm,l)=zdufi(ngridmx,l)*COS(rlonv(i))
914     $      +zdvfi(ngridmx,l)*SIN(rlonv(i))
915            pdvfi(i,1,l)=
916     $      0.5*(pdvfi(i,1,l)+zdvfi(i+1,l))*cv(i,1)
917            pdvfi(i,jjm,l)=
918     $      0.5*(pdvfi(i,jjm,l)+zdvfi(ngridmx-iip1+i,l))*cv(i,jjm)
919          ENDDO
920
921         pdvfi(iip1,1,l)  = pdvfi(1,1,l)
922         pdvfi(iip1,jjm,l)= pdvfi(1,jjm,l)
923
924      ENDDO
925
926c-----------------------------------------------------------------------
927
928700   CONTINUE
929 
930      firstcal = .FALSE.
931
932      RETURN
933      END
Note: See TracBrowser for help on using the repository browser.