source: codes/icosagcm/branches/SATURN_DYNAMICO/LMDZ.COMMON/config/ppsrc/dyn/divgrad2_p.f @ 224

Last change on this file since 224 was 224, checked in by ymipsl, 10 years ago
File size: 7.1 KB
Line 
1      SUBROUTINE divgrad2_p ( klevel, h, deltapres, lh, divgra_out )
2c
3c     P. Le Van
4c
5c   ***************************************************************
6c
7c     .....   calcul de  (div( grad ))   de (  pext * h ) .....
8c   ****************************************************************
9c   h ,klevel,lh et pext  sont des arguments  d'entree pour le s-prg
10c         divgra     est  un argument  de sortie pour le s-prg
11c
12      USE parallel_lmdz
13      USE times
14      USE mod_hallo
15      IMPLICIT NONE
16c
17!-----------------------------------------------------------------------
18!   INCLUDE 'dimensions.h'
19!
20!   dimensions.h contient les dimensions du modele
21!   ndm est tel que iim=2**ndm
22!-----------------------------------------------------------------------
23
24      INTEGER iim,jjm,llm,ndm
25
26      PARAMETER (iim= 128,jjm=96,llm=64,ndm=1)
27
28!-----------------------------------------------------------------------
29!
30! $Header$
31!
32!
33!  ATTENTION!!!!: ce fichier include est compatible format fixe/format libre
34!                 veillez  n'utiliser que des ! pour les commentaires
35!                 et  bien positionner les & des lignes de continuation
36!                 (les placer en colonne 6 et en colonne 73)
37!
38!
39!-----------------------------------------------------------------------
40!   INCLUDE 'paramet.h'
41
42      INTEGER  iip1,iip2,iip3,jjp1,llmp1,llmp2,llmm1
43      INTEGER  kftd,ip1jm,ip1jmp1,ip1jmi1,ijp1llm
44      INTEGER  ijmllm,mvar
45      INTEGER jcfil,jcfllm
46
47      PARAMETER( iip1= iim+1,iip2=iim+2,iip3=iim+3                       &
48     &    ,jjp1=jjm+1-1/jjm)
49      PARAMETER( llmp1 = llm+1,  llmp2 = llm+2, llmm1 = llm-1 )
50      PARAMETER( kftd  = iim/2 -ndm )
51      PARAMETER( ip1jm  = iip1*jjm,  ip1jmp1= iip1*jjp1 )
52      PARAMETER( ip1jmi1= ip1jm - iip1 )
53      PARAMETER( ijp1llm= ip1jmp1 * llm, ijmllm= ip1jm * llm )
54      PARAMETER( mvar= ip1jmp1*( 2*llm+1) + ijmllm )
55      PARAMETER( jcfil=jjm/2+5, jcfllm=jcfil*llm )
56
57!-----------------------------------------------------------------------
58!
59! $Header$
60!
61!CDK comgeom2
62      COMMON/comgeom/                                                   &
63     & cu(iip1,jjp1),cv(iip1,jjm),unscu2(iip1,jjp1),unscv2(iip1,jjm)  , &
64     & aire(iip1,jjp1),airesurg(iip1,jjp1),aireu(iip1,jjp1)           , &
65     & airev(iip1,jjm),unsaire(iip1,jjp1),apoln,apols                 , &
66     & unsairez(iip1,jjm),airuscv2(iip1,jjm),airvscu2(iip1,jjm)       , &
67     & aireij1(iip1,jjp1),aireij2(iip1,jjp1),aireij3(iip1,jjp1)       , &
68     & aireij4(iip1,jjp1),alpha1(iip1,jjp1),alpha2(iip1,jjp1)         , &
69     & alpha3(iip1,jjp1),alpha4(iip1,jjp1),alpha1p2(iip1,jjp1)        , &
70     & alpha1p4(iip1,jjp1),alpha2p3(iip1,jjp1),alpha3p4(iip1,jjp1)    , &
71     & fext(iip1,jjm),constang(iip1,jjp1), rlatu(jjp1),rlatv(jjm),      &
72     & rlonu(iip1),rlonv(iip1),cuvsurcv(iip1,jjm),cvsurcuv(iip1,jjm)  , &
73     & cvusurcu(iip1,jjp1),cusurcvu(iip1,jjp1)                        , &
74     & cuvscvgam1(iip1,jjm),cuvscvgam2(iip1,jjm),cvuscugam1(iip1,jjp1), &
75     & cvuscugam2(iip1,jjp1),cvscuvgam(iip1,jjm),cuscvugam(iip1,jjp1) , &
76     & unsapolnga1,unsapolnga2,unsapolsga1,unsapolsga2                , &
77     & unsair_gam1(iip1,jjp1),unsair_gam2(iip1,jjp1)                  , &
78     & unsairz_gam(iip1,jjm),aivscu2gam(iip1,jjm),aiuscv2gam(iip1,jjm)  &
79     & , xprimu(iip1),xprimv(iip1)
80
81
82      REAL                                                               &
83     & cu,cv,unscu2,unscv2,aire,airesurg,aireu,airev,apoln,apols,unsaire &
84     & ,unsairez,airuscv2,airvscu2,aireij1,aireij2,aireij3,aireij4     , &
85     & alpha1,alpha2,alpha3,alpha4,alpha1p2,alpha1p4,alpha2p3,alpha3p4 , &
86     & fext,constang,rlatu,rlatv,rlonu,rlonv,cuvscvgam1,cuvscvgam2     , &
87     & cvuscugam1,cvuscugam2,cvscuvgam,cuscvugam,unsapolnga1           , &
88     & unsapolnga2,unsapolsga1,unsapolsga2,unsair_gam1,unsair_gam2     , &
89     & unsairz_gam,aivscu2gam,aiuscv2gam,cuvsurcv,cvsurcuv,cvusurcu    , &
90     & cusurcvu,xprimu,xprimv
91!
92! $Header$
93!
94!  Attention : ce fichier include est compatible format fixe/format libre
95!                 veillez à n'utiliser que des ! pour les commentaires
96!                 et à bien positionner les & des lignes de continuation
97!                 (les placer en colonne 6 et en colonne 73)
98!-----------------------------------------------------------------------
99! INCLUDE comdissipn.h
100
101      REAL  tetaudiv, tetaurot, tetah, cdivu, crot, cdivh
102!
103      COMMON/comdissipn/ tetaudiv(llm),tetaurot(llm),tetah(llm)   ,     &
104     &                        cdivu,      crot,         cdivh
105
106!
107!    Les parametres de ce common proviennent des calculs effectues dans
108!             Inidissip  .
109!
110!-----------------------------------------------------------------------
111
112c    .......    variables en arguments   .......
113c
114      INTEGER klevel
115      REAL h( ip1jmp1,klevel ), deltapres( ip1jmp1,klevel )
116      REAL divgra_out( ip1jmp1,klevel)
117      REAL,SAVE :: divgra( ip1jmp1,llm)
118
119c
120c    .......    variables  locales    ..........
121c
122      REAL     signe, nudivgrs, sqrtps( ip1jmp1,llm )
123      INTEGER  l,ij,iter,lh
124c    ...................................................................
125      Type(Request) :: request_dissip
126      INTEGER ijb,ije
127c
128      signe    = (-1.)**lh
129      nudivgrs = signe * cdivh
130
131c      CALL SCOPY ( ip1jmp1 * klevel, h, 1, divgra, 1 )
132      ijb=ij_begin
133      ije=ij_end
134c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
135      DO l = 1, klevel
136        divgra(ijb:ije,l)=h(ijb:ije,l)
137      ENDDO
138c$OMP END DO NOWAIT
139c
140c$OMP BARRIER
141       call Register_Hallo(divgra,ip1jmp1,llm,1,1,1,1,Request_dissip)
142       call SendRequest(Request_dissip)
143c$OMP BARRIER
144       call WaitRequest(Request_dissip)
145c$OMP BARRIER
146
147      CALL laplacien_p( klevel, divgra, divgra )
148
149c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)     
150      DO l = 1, klevel
151       DO ij = ijb, ije
152        sqrtps( ij,l ) = SQRT( deltapres(ij,l) )
153       ENDDO
154      ENDDO
155c$OMP END DO NOWAIT
156
157c
158c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)     
159      DO l = 1, klevel
160        DO ij = ijb, ije
161         divgra(ij,l) = divgra(ij,l) * sqrtps(ij,l)
162        ENDDO
163      ENDDO
164c$OMP END DO NOWAIT
165   
166c    ........    Iteration de l'operateur  laplacien_gam    ........
167c
168      DO  iter = 1, lh - 2
169c$OMP BARRIER
170       call Register_Hallo(divgra,ip1jmp1,llm,1,1,1,1,Request_dissip)
171       call SendRequest(Request_dissip)
172c$OMP BARRIER
173       call WaitRequest(Request_dissip)
174
175c$OMP BARRIER
176
177
178       CALL laplacien_gam_p ( klevel,cuvscvgam2,cvuscugam2,unsair_gam2,
179     *                     unsapolnga2, unsapolsga2,  divgra, divgra )
180      ENDDO
181c
182c    ...............................................................
183
184c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)     
185      DO l = 1, klevel
186        DO ij = ijb, ije
187          divgra(ij,l) = divgra(ij,l) * sqrtps(ij,l)
188        ENDDO
189      ENDDO
190c$OMP END DO NOWAIT
191c
192c$OMP BARRIER
193       call Register_Hallo(divgra,ip1jmp1,llm,1,1,1,1,Request_dissip)
194       call SendRequest(Request_dissip)
195c$OMP BARRIER
196       call WaitRequest(Request_dissip)
197c$OMP BARRIER
198
199      CALL laplacien_p ( klevel, divgra, divgra )
200c
201c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
202      DO l  = 1,klevel
203      DO ij = ijb,ije
204      divgra_out(ij,l) =  nudivgrs * divgra(ij,l) / deltapres(ij,l)
205      ENDDO
206      ENDDO
207c$OMP END DO NOWAIT
208
209      RETURN
210      END
Note: See TracBrowser for help on using the repository browser.