source: trunk/LMDZ.COMMON/libf/dyn3d_common/interpre.F @ 1391

Last change on this file since 1391 was 1391, checked in by emillour, 10 years ago

Common dynamical core:
Updates in the dynamics to keeup up with updates in LMDZ5
(up to LMDZ5 trunk rev 2200):

  • compilation:
  • create_make_gcm : added processing of .f & .f90 files (not just .F and .F90)
  • makelmdz: add "mix" option for -io (ouptut with both IOIPSL and XIOS)
  • makelmdz_fcm: add "mix" option for -io
  • filtrez:
  • acc.F and eigen.F : add "implicit none" and variable declarations
  • bibio:
  • handle_err_m.F90: replace "stop" with call to abort_gcm()
  • i1mach.F, j4save.F: add "implicit none" and variable declarations
  • xercnt.F, xermsg.F, xerprn.F, xersve.F, xgetua.F: add "implicit none" and variable declarations
  • dyn3d_common:
  • disvert.F90 : added comments on meaning of "pa" variable
  • grid_atob.F : better control on level of default ouputs
  • infotrac.F90: update Earth-specific stuff (nqo water tracers)
  • interpre.F: correction on the size of input array w
  • juldate.F, massbar.F, ppm3d.F, ran1.F: add "implicit none" and variable declarations
  • sortvarc.F: code cleanup
  • iniacademic.F90: cleanup and extra sanity check.
  • dyn3d:
  • abort_gcm.F: additions for XIOS
  • conf_gcm.F90: transformed to free form from conf_gcm.F
  • gcm.F: added test to check that iphysiq is a multiple of iperiod
  • getparam.F90, guidz_mod.F: update from LMDZ5
  • integrd.F: replace stop with call_abort()
  • dyn3dpar:
  • abort_gcm.F: minor cleanup
  • gcm.F: added test to check that iphysiq is a multiple of iperiod
  • getparam.F90, guide_p_mod.F90: update from LMDZ5
  • integrd_p.F: abort with call_abort when there is negative surface pressure
  • leapfrog_p.F: add INCA specific stuff to keep up with current LMDZ5
  • conf_gcm.F90: transformed to free form from conf_gcm.F

EM

File size: 3.7 KB
Line 
1!
2! $Id: interpre.F 1403 2010-07-01 09:02:53Z fairhead $
3!
4       subroutine interpre(q,qppm,w,fluxwppm,masse,
5     s            apppm,bpppm,massebx,masseby,pbaru,pbarv,
6     s            unatppm,vnatppm,psppm)
7
8      USE control_mod
9
10       implicit none
11
12#include "dimensions.h"
13c#include "paramr2.h"
14#include "paramet.h"
15#include "comconst.h"
16#include "comdissip.h"
17#include "comvert.h"
18#include "comgeom2.h"
19#include "logic.h"
20#include "temps.h"
21#include "ener.h"
22#include "description.h"
23
24c---------------------------------------------------
25c Arguments     
26      real   apppm(llm+1),bpppm(llm+1)
27      real   q(iip1,jjp1,llm),qppm(iim,jjp1,llm)
28c---------------------------------------------------
29      real   masse(iip1,jjp1,llm)
30      real   massebx(iip1,jjp1,llm),masseby(iip1,jjm,llm)     
31      real   w(iip1,jjp1,llm)
32      real   fluxwppm(iim,jjp1,llm)
33      real   pbaru(iip1,jjp1,llm )
34      real   pbarv(iip1,jjm,llm)
35      real   unatppm(iim,jjp1,llm)
36      real   vnatppm(iim,jjp1,llm)
37      real   psppm(iim,jjp1)
38c---------------------------------------------------
39c Local
40      real   vnat(iip1,jjp1,llm)
41      real   unat(iip1,jjp1,llm)
42      real   fluxw(iip1,jjp1,llm)
43      real   smass(iip1,jjp1)
44c----------------------------------------------------
45      integer l,ij,i,j
46
47c       CALCUL DE LA PRESSION DE SURFACE
48c       Les coefficients ap et bp sont passés en common
49c       Calcul de la pression au sol en mb optimisée pour
50c       la vectorialisation
51                   
52         do j=1,jjp1
53             do i=1,iip1
54                smass(i,j)=0.
55             enddo
56         enddo
57
58         do l=1,llm
59             do j=1,jjp1
60                 do i=1,iip1
61                    smass(i,j)=smass(i,j)+masse(i,j,l)
62                 enddo
63             enddo
64         enddo
65     
66         do j=1,jjp1
67             do i=1,iim
68                 psppm(i,j)=smass(i,j)/aire(i,j)*g*0.01
69             end do
70         end do                       
71       
72c RECONSTRUCTION DES CHAMPS CONTRAVARIANTS
73c Le programme ppm3d travaille avec les composantes
74c de vitesse et pas les flux, on doit donc passer de l'un à l'autre
75c Dans le même temps, on fait le changement d'orientation du vent en v
76      do l=1,llm
77          do j=1,jjm
78              do i=1,iip1
79                  vnat(i,j,l)=-pbarv(i,j,l)/masseby(i,j,l)*cv(i,j)             
80              enddo
81          enddo
82          do  i=1,iim
83          vnat(i,jjp1,l)=0.
84          enddo
85          do j=1,jjp1
86              do i=1,iip1
87                  unat(i,j,l)=pbaru(i,j,l)/massebx(i,j,l)*cu(i,j)
88              enddo
89          enddo
90      enddo
91             
92c CALCUL DU FLUX MASSIQUE VERTICAL
93c Flux en l=1 (sol) nul
94      fluxw=0.       
95      do l=1,llm
96           do j=1,jjp1
97              do i=1,iip1             
98               fluxw(i,j,l)=w(i,j,l)*g*0.01/aire(i,j)
99C               print*,i,j,l,'fluxw(i,j,l)=',fluxw(i,j,l),
100C     c                      'w(i,j,l)=',w(i,j,l)
101              enddo
102           enddo
103      enddo
104     
105c INVERSION DES NIVEAUX
106c le programme ppm3d travaille avec une 3ème coordonnée inversée par rapport
107c de celle du LMDZ: z=1<=>niveau max, z=llm+1<=>surface
108c On passe donc des niveaux du LMDZ à ceux de Lin
109     
110      do l=1,llm+1
111          apppm(l)=ap(llm+2-l)
112          bpppm(l)=bp(llm+2-l)         
113      enddo
114     
115      do l=1,llm
116          do j=1,jjp1
117             do i=1,iim     
118                 unatppm(i,j,l)=unat(i,j,llm-l+1)
119                 vnatppm(i,j,l)=vnat(i,j,llm-l+1)
120                 fluxwppm(i,j,l)=fluxw(i,j,llm-l+1)
121                 qppm(i,j,l)=q(i,j,llm-l+1)                             
122             enddo
123          enddo                               
124      enddo
125   
126      return
127      end
128
129
130
131
132
133
Note: See TracBrowser for help on using the repository browser.