source: LMDZ5/trunk/libf/dyn3dmem/exner_hyb_loc.F @ 1632

Last change on this file since 1632 was 1632, checked in by Laurent Fairhead, 12 years ago

Import initial du répertoire dyn3dmem

Attention! ceci n'est qu'une version préliminaire du code "basse mémoire":
le code contenu dans ce répertoire est basé sur la r1320 et a donc besoin
d'être mis à jour par rapport à la dynamique parallèle d'aujourd'hui.
Ce code est toutefois mis à disposition pour circonvenir à des problèmes
de mémoire que certaines configurations du modèle pourraient rencontrer.
Dans l'état, il compile et tourne sur vargas et au CCRT


Initial import of dyn3dmem

Warning! this is just a preliminary version of the memory light code:
it is based on r1320 of the code and thus needs to be updated before
it can replace the present dyn3dpar code. It is nevertheless put at your
disposal to circumvent some memory problems some LMDZ configurations may
encounter. In its present state, it will compile and run on vargas and CCRT

File size: 4.4 KB
Line 
1      SUBROUTINE  exner_hyb_loc(ngrid, ps, p,alpha,beta, pks,pk,pkf)
2c
3c     Auteurs :  P.Le Van  , Fr. Hourdin  .
4c    ..........
5c
6c    ....  ngrid, ps,p             sont des argum.d'entree  au sous-prog ...
7c    .... alpha,beta, pks,pk,pkf   sont des argum.de sortie au sous-prog ...
8c
9c   ************************************************************************
10c    Calcule la fonction d'Exner pk = Cp * p ** kappa , aux milieux des
11c    couches .   Pk(l) sera calcule aux milieux  des couches l ,entre les
12c    pressions p(l) et p(l+1) ,definis aux interfaces des llm couches .
13c   ************************************************************************
14c  .. N.B : Au sommet de l'atmosphere,  p(llm+1) = 0. , et ps et pks sont
15c    la pression et la fonction d'Exner  au  sol  .
16c
17c                                 -------- z                                   
18c    A partir des relations  ( 1 ) p*dz(pk) = kappa *pk*dz(p)      et
19c                            ( 2 ) pk(l) = alpha(l)+ beta(l)*pk(l-1)
20c    ( voir note de Fr.Hourdin )  ,
21c
22c    on determine successivement , du haut vers le bas des couches, les
23c    coef. alpha(llm),beta(llm) .,.,alpha(l),beta(l),,,alpha(2),beta(2),
24c    puis pk(ij,1). Ensuite ,on calcule,du bas vers le haut des couches, 
25c     pk(ij,l)  donne  par la relation (2),  pour l = 2 a l = llm .
26c
27c
28      USE parallel
29      USE mod_filtreg_p
30      USE write_field_loc
31      IMPLICIT NONE
32c
33#include "dimensions.h"
34#include "paramet.h"
35#include "comconst.h"
36#include "comgeom.h"
37#include "comvert.h"
38#include "serre.h"
39
40      INTEGER  ngrid
41      REAL p(ijb_u:ije_u,llmp1),pk(ijb_u:ije_u,llm)
42      REAL pkf(ijb_u:ije_u,llm)
43      REAL ps(ijb_u:ije_u),pks(ijb_u:ije_u)
44      REAL alpha(ijb_u:ije_u,llm),beta(ijb_u:ije_u,llm)
45
46c    .... variables locales   ...
47
48      INTEGER l, ij
49      REAL unpl2k,dellta
50
51      REAL ppn(iim),pps(iim)
52      REAL xpn, xps
53      REAL SSUM
54      EXTERNAL SSUM
55      INTEGER ije,ijb,jje,jjb
56c
57c$OMP BARRIER           
58      unpl2k    = 1.+ 2.* kappa
59c
60      ijb=ij_begin
61      ije=ij_end
62
63c$OMP DO SCHEDULE(STATIC)
64      DO   ij  = ijb, ije
65        pks(ij) = cpp * ( ps(ij)/preff ) ** kappa
66      ENDDO
67c$OMP ENDDO
68c Synchro OPENMP ici
69
70c$OMP MASTER
71      if (pole_nord) then
72        DO  ij   = 1, iim
73          ppn(ij) = aire(   ij   ) * pks(  ij     )
74        ENDDO
75        xpn      = SSUM(iim,ppn,1) /apoln
76 
77        DO ij   = 1, iip1
78          pks(   ij     )  =  xpn
79        ENDDO
80      endif
81     
82      if (pole_sud) then
83        DO  ij   = 1, iim
84          pps(ij) = aire(ij+ip1jm) * pks(ij+ip1jm )
85        ENDDO
86        xps      = SSUM(iim,pps,1) /apols
87 
88        DO ij   = 1, iip1
89          pks( ij+ip1jm )  =  xps
90        ENDDO
91      endif
92c$OMP END MASTER
93c$OMP BARRIER
94c
95c
96c    .... Calcul des coeff. alpha et beta  pour la couche l = llm ..
97c
98c$OMP DO SCHEDULE(STATIC)
99      DO     ij      = ijb,ije
100       alpha(ij,llm) = 0.
101       beta (ij,llm) = 1./ unpl2k
102      ENDDO
103c$OMP ENDDO NOWAIT
104c
105c     ... Calcul des coeff. alpha et beta  pour l = llm-1  a l = 2 ...
106c
107      DO l = llm -1 , 2 , -1
108c
109c$OMP DO SCHEDULE(STATIC)
110        DO ij = ijb, ije
111        dellta = p(ij,l)* unpl2k + p(ij,l+1)* ( beta(ij,l+1)-unpl2k )
112        alpha(ij,l)  = - p(ij,l+1) / dellta * alpha(ij,l+1)
113        beta (ij,l)  =   p(ij,l  ) / dellta   
114        ENDDO
115c$OMP ENDDO NOWAIT
116c
117      ENDDO
118
119c
120c  ***********************************************************************
121c     .....  Calcul de pk pour la couche 1 , pres du sol  ....
122c
123c$OMP DO SCHEDULE(STATIC)
124      DO   ij   = ijb, ije
125       pk(ij,1) = ( p(ij,1)*pks(ij) - 0.5*alpha(ij,2)*p(ij,2) )  /
126     *    (  p(ij,1)* (1.+kappa) + 0.5*( beta(ij,2)-unpl2k )* p(ij,2) )
127      ENDDO
128c$OMP ENDDO NOWAIT
129c
130c    ..... Calcul de pk(ij,l) , pour l = 2 a l = llm  ........
131c
132      DO l = 2, llm
133c$OMP DO SCHEDULE(STATIC)
134        DO   ij   = ijb, ije
135         pk(ij,l) = alpha(ij,l) + beta(ij,l) * pk(ij,l-1)
136        ENDDO
137c$OMP ENDDO NOWAIT       
138      ENDDO
139c
140c
141c      CALL SCOPY   ( ngrid * llm, pk, 1, pkf, 1 )
142      DO l = 1, llm
143c$OMP DO SCHEDULE(STATIC)
144         DO   ij   = ijb, ije
145           pkf(ij,l)=pk(ij,l)
146         ENDDO
147c$OMP ENDDO NOWAIT             
148      ENDDO
149
150c$OMP BARRIER
151     
152      jjb=jj_begin
153      jje=jj_end
154#ifdef DEBUG_IO   
155      call WriteField_u('pkf',pkf)
156#endif
157      CALL filtreg_p ( pkf,jjb_u,jje_u,jjb,jje, jmp1, llm,
158     &                 2, 1, .TRUE., 1 )
159#ifdef DEBUG_IO   
160      call WriteField_u('pkf',pkf)
161#endif     
162
163      RETURN
164      END
Note: See TracBrowser for help on using the repository browser.