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

Last change on this file since 224 was 224, checked in by ymipsl, 10 years ago
File size: 5.7 KB
Line 
1       SUBROUTINE nxgraro2_p (klevel,xcov, ycov, lr, grx_out, gry_out )
2c
3c      P.Le Van .
4c   ***********************************************************
5c                                 lr
6c      calcul de  ( nxgrad (rot) )   du vect. v  ....
7c
8c       xcov et ycov  etant les compos. covariantes de  v
9c   ***********************************************************
10c     xcov , ycov et lr  sont des arguments  d'entree pour le s-prog
11c      grx   et  gry     sont des arguments de sortie pour le s-prog
12c
13c
14      USE write_Field_p
15      USE parallel_lmdz
16      USE times
17      USE mod_hallo
18      IMPLICIT NONE
19c
20!-----------------------------------------------------------------------
21!   INCLUDE 'dimensions.h'
22!
23!   dimensions.h contient les dimensions du modele
24!   ndm est tel que iim=2**ndm
25!-----------------------------------------------------------------------
26
27      INTEGER iim,jjm,llm,ndm
28
29      PARAMETER (iim= 128,jjm=96,llm=64,ndm=1)
30
31!-----------------------------------------------------------------------
32!
33! $Header$
34!
35!
36!  ATTENTION!!!!: ce fichier include est compatible format fixe/format libre
37!                 veillez  n'utiliser que des ! pour les commentaires
38!                 et  bien positionner les & des lignes de continuation
39!                 (les placer en colonne 6 et en colonne 73)
40!
41!
42!-----------------------------------------------------------------------
43!   INCLUDE 'paramet.h'
44
45      INTEGER  iip1,iip2,iip3,jjp1,llmp1,llmp2,llmm1
46      INTEGER  kftd,ip1jm,ip1jmp1,ip1jmi1,ijp1llm
47      INTEGER  ijmllm,mvar
48      INTEGER jcfil,jcfllm
49
50      PARAMETER( iip1= iim+1,iip2=iim+2,iip3=iim+3                       &
51     &    ,jjp1=jjm+1-1/jjm)
52      PARAMETER( llmp1 = llm+1,  llmp2 = llm+2, llmm1 = llm-1 )
53      PARAMETER( kftd  = iim/2 -ndm )
54      PARAMETER( ip1jm  = iip1*jjm,  ip1jmp1= iip1*jjp1 )
55      PARAMETER( ip1jmi1= ip1jm - iip1 )
56      PARAMETER( ijp1llm= ip1jmp1 * llm, ijmllm= ip1jm * llm )
57      PARAMETER( mvar= ip1jmp1*( 2*llm+1) + ijmllm )
58      PARAMETER( jcfil=jjm/2+5, jcfllm=jcfil*llm )
59
60!-----------------------------------------------------------------------
61!
62! $Header$
63!
64!  Attention : ce fichier include est compatible format fixe/format libre
65!                 veillez à n'utiliser que des ! pour les commentaires
66!                 et à bien positionner les & des lignes de continuation
67!                 (les placer en colonne 6 et en colonne 73)
68!-----------------------------------------------------------------------
69! INCLUDE comdissipn.h
70
71      REAL  tetaudiv, tetaurot, tetah, cdivu, crot, cdivh
72!
73      COMMON/comdissipn/ tetaudiv(llm),tetaurot(llm),tetah(llm)   ,     &
74     &                        cdivu,      crot,         cdivh
75
76!
77!    Les parametres de ce common proviennent des calculs effectues dans
78!             Inidissip  .
79!
80!-----------------------------------------------------------------------
81c
82c    ......  variables en arguments  .......
83c
84      INTEGER klevel
85      REAL xcov( ip1jmp1,klevel ), ycov( ip1jm,klevel )
86      REAL,SAVE ::  grx( ip1jmp1,llm ),  gry( ip1jm,llm )
87      REAL  grx_out( ip1jmp1,klevel ),  gry_out( ip1jm,klevel )
88c
89c    ......   variables locales     ........
90c
91      REAL,SAVE :: rot(ip1jm,llm)
92      REAL  signe, nugradrs
93      INTEGER l,ij,iter,lr
94      Type(Request) :: Request_dissip
95c    ........................................................
96c
97      INTEGER :: ijb,ije,jjb,jje
98     
99c
100c
101      signe    = (-1.)**lr
102      nugradrs = signe * crot
103c
104c      CALL SCOPY ( ip1jmp1* klevel, xcov, 1, grx, 1 )
105c      CALL SCOPY (  ip1jm * klevel, ycov, 1, gry, 1 )
106 
107      ijb=ij_begin
108      ije=ij_end
109
110c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
111      DO    l = 1, klevel
112        grx(ijb:ije,l)=xcov(ijb:ije,l)
113      ENDDO
114c$OMP END DO NOWAIT
115
116c$OMP BARRIER
117       call Register_Hallo(grx,ip1jmp1,llm,0,1,1,0,Request_dissip)
118       call SendRequest(Request_dissip)
119c$OMP BARRIER
120       call WaitRequest(Request_dissip)
121c$OMP BARRIER
122
123      ijb=ij_begin
124      ije=ij_end
125      if(pole_sud) ije=ij_end-iip1
126
127c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
128      DO    l = 1, klevel
129        gry(ijb:ije,l)=ycov(ijb:ije,l)
130      ENDDO
131c$OMP END DO NOWAIT
132 
133c
134      CALL     rotatf_p     ( klevel, grx, gry, rot )
135c      call write_field3d_p('rot1',reshape(rot,(/iip1,jjm,llm/)))
136
137c$OMP BARRIER
138       call Register_Hallo(rot,ip1jm,llm,1,1,1,1,Request_dissip)
139       call SendRequest(Request_dissip)
140c$OMP BARRIER
141       call WaitRequest(Request_dissip)
142c$OMP BARRIER
143     
144      CALL laplacien_rot_p ( klevel, rot, rot,grx,gry      )
145c       call write_field3d_p('rot2',reshape(rot,(/iip1,jjm,llm/)))
146c
147c    .....   Iteration de l'operateur laplacien_rotgam  .....
148c
149      DO  iter = 1, lr -2
150c$OMP BARRIER
151       call Register_Hallo(rot,ip1jm,llm,1,1,1,1,Request_dissip)
152       call SendRequest(Request_dissip)
153c$OMP BARRIER
154       call WaitRequest(Request_dissip)
155c$OMP BARRIER
156
157        CALL laplacien_rotgam_p ( klevel, rot, rot )
158      ENDDO
159     
160c       call write_field3d_p('rot3',reshape(rot,(/iip1,jjm,llm/)))
161     
162c
163c
164      jjb=jj_begin
165      jje=jj_end
166      if (pole_sud) jje=jj_end-1
167       
168      CALL filtreg_p( rot, jjb,jje,jjm, klevel, 2,1, .FALSE.,1)
169c$OMP BARRIER
170       call Register_Hallo(rot,ip1jm,llm,1,0,0,1,Request_dissip)
171       call SendRequest(Request_dissip)
172c$OMP BARRIER
173       call WaitRequest(Request_dissip)
174c$OMP BARRIER
175
176      CALL nxgrad_p ( klevel, rot, grx, gry )
177
178c
179      ijb=ij_begin
180      ije=ij_end
181     
182c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)   
183      DO    l = 1, klevel
184       
185         if(pole_sud) ije=ij_end-iip1
186         DO  ij = ijb, ije
187          gry_out( ij,l ) = gry( ij,l ) * nugradrs
188         ENDDO
189       
190         if(pole_sud) ije=ij_end
191         DO  ij = ijb, ije
192          grx_out( ij,l ) = grx( ij,l ) * nugradrs
193         ENDDO
194     
195      ENDDO
196c$OMP END DO NOWAIT
197c
198      RETURN
199      END
Note: See TracBrowser for help on using the repository browser.