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

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