source: LMDZ4/branches/LMDZ4_V3_patches/libf/dyn3dpar/gradiv2_p.F @ 2358

Last change on this file since 2358 was 764, checked in by Laurent Fairhead, 17 years ago

Merge entre la version V3_conv et le HEAD
YM, JG, LF

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 3.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
16      USE times
17      USE Write_field_p
18      IMPLICIT NONE
19c
20#include "dimensions.h"
21#include "paramet.h"
22#include "comgeom.h"
23#include "comdissipn.h"
24c
25c     ........    variables en arguments      ........
26
27      INTEGER klevel
28      REAL  xcov( ip1jmp1,klevel ), ycov( ip1jm,klevel )
29      REAL,SAVE ::  gdx( ip1jmp1,llm ),  gdy( ip1jm,llm )
30      REAL   gdx_out( ip1jmp1,klevel ), gdy_out( ip1jm,klevel )
31c
32c     ........       variables locales       .........
33c
34      REAL,SAVE :: div(ip1jmp1,llm)
35      REAL signe, nugrads
36      INTEGER l,ij,iter,ld
37      INTEGER :: ijb,ije,jjb,jje
38     
39c    ........................................................
40c
41c
42c      CALL SCOPY( ip1jmp1 * klevel, xcov, 1, gdx, 1 )
43c      CALL SCOPY(   ip1jm * klevel, ycov, 1, gdy, 1 )
44     
45      ijb=ij_begin
46      ije=ij_end
47     
48c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
49      DO   l = 1, klevel
50        gdx(ijb:ije,l)=xcov(ijb:ije,l)
51      ENDDO
52c$OMP END DO NOWAIT     
53     
54      ijb=ij_begin
55      ije=ij_end
56      if(pole_sud) ije=ij_end-iip1
57
58c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)     
59      DO   l = 1, klevel
60        gdy(ijb:ije,l)=ycov(ijb:ije,l)
61      ENDDO
62c$OMP END DO NOWAIT
63
64c$OMP BARRIER
65c$OMP MASTER     
66      call suspend_timer(timer_dissip)
67      call exchange_Hallo(gdy,ip1jm,llm,1,0)
68      call resume_timer(timer_dissip)
69c$OMP END MASTER
70c$OMP BARRIER
71c
72c
73      signe   = (-1.)**ld
74      nugrads = signe * cdivu
75c
76
77
78      CALL    divergf_p( klevel, gdx,   gdy , div )
79c      call write_field3d_p('div1',reshape(div,(/iip1,jjp1,llm/)))
80
81      IF( ld.GT.1 )   THEN
82c$OMP BARRIER
83c$OMP MASTER       
84        call suspend_timer(timer_dissip)
85        call exchange_Hallo(div,ip1jmp1,llm,1,1)
86        call resume_timer(timer_dissip)
87c$OMP END MASTER       
88c$OMP BARRIER
89        CALL laplacien_p ( klevel, div,  div     )
90
91c    ......  Iteration de l'operateur laplacien_gam   .......
92c         call write_field3d_p('div2',reshape(div,(/iip1,jjp1,llm/)))
93
94        DO iter = 1, ld -2
95c$OMP BARRIER
96c$OMP MASTER
97         call suspend_timer(timer_dissip)
98         call exchange_Hallo(div,ip1jmp1,llm,1,1)
99         call resume_timer(timer_dissip)
100c$OMP END MASTER
101c$OMP BARRIER
102         CALL laplacien_gam ( klevel,cuvscvgam1,cvuscugam1,unsair_gam1,
103     *                       unsapolnga1, unsapolsga1,  div, div       )
104        ENDDO
105c        call write_field3d_p('div3',reshape(div,(/iip1,jjp1,llm/)))
106      ENDIF
107
108       jjb=jj_begin
109       jje=jj_end
110       
111       CALL filtreg_p( div   ,jjb,jje, jjp1, klevel, 2, 1, .TRUE., 1 )
112c       call exchange_Hallo(div,ip1jmp1,llm,0,1)
113c$OMP BARRIER
114c$OMP MASTER       
115        call suspend_timer(timer_dissip)
116        call exchange_Hallo(div,ip1jmp1,llm,1,1)
117        call resume_timer(timer_dissip)
118c$OMP END MASTER
119c$OMP BARRIER
120c       call write_field3d_p('div4',reshape(div,(/iip1,jjp1,llm/)))
121       CALL  grad_p  ( klevel,  div,   gdx,  gdy             )
122
123c
124      ijb=ij_begin
125      ije=ij_end
126         
127c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)     
128       DO   l = 1, klevel
129         
130         if (pole_sud) ije=ij_end
131         DO  ij = ijb, ije
132          gdx_out( ij,l ) = gdx( ij,l ) * nugrads
133         ENDDO
134         
135         if (pole_sud) ije=ij_end-iip1
136         DO  ij = ijb, ije
137          gdy_out( ij,l ) = gdy( ij,l ) * nugrads
138         ENDDO
139       
140       ENDDO
141c$OMP END DO NOWAIT
142c
143       RETURN
144       END
Note: See TracBrowser for help on using the repository browser.