LMDZ
gradiv2_p.F
Go to the documentation of this file.
1  SUBROUTINE gradiv2_p(klevel, xcov, ycov, ld, gdx_out, gdy_out )
2 c
3 c P. Le Van
4 c
5 c **********************************************************
6 c ld
7 c calcul de (grad (div) ) du vect. v ....
8 c
9 c xcov et ycov etant les composant.covariantes de v
10 c **********************************************************
11 c xcont , ycont et ld sont des arguments d'entree pour le s-prog
12 c gdx et gdy sont des arguments de sortie pour le s-prog
13 c
14 c
15  USE parallel_lmdz
16  USE times
17  USE write_field_p
18  USE mod_hallo
19  IMPLICIT NONE
20 c
21 #include "dimensions.h"
22 #include "paramet.h"
23 #include "comgeom.h"
24 #include "comdissipn.h"
25 c
26 c ........ variables en arguments ........
27 
28  INTEGER klevel
29  REAL xcov( ip1jmp1,klevel ), ycov( ip1jm,klevel )
30  REAL,SAVE :: gdx( ip1jmp1,llm ), gdy( ip1jm,llm )
31  REAL gdx_out( ip1jmp1,klevel ), gdy_out( ip1jm,klevel )
32 c
33 c ........ variables locales .........
34 c
35  REAL,SAVE :: div(ip1jmp1,llm)
36  REAL :: tmp_div2(ip1jmp1,llm)
37  REAL signe, nugrads
38  INTEGER l,ij,iter,ld
39  INTEGER :: ijb,ije,jjb,jje
40  Type(request) :: request_dissip
41 
42 c ........................................................
43 c
44 c
45 c CALL SCOPY( ip1jmp1 * klevel, xcov, 1, gdx, 1 )
46 c CALL SCOPY( ip1jm * klevel, ycov, 1, gdy, 1 )
47 
48  ijb=ij_begin
49  ije=ij_end
50 
51 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
52  DO l = 1, klevel
53  gdx(ijb:ije,l)=xcov(ijb:ije,l)
54  ENDDO
55 c$OMP END DO NOWAIT
56 
57  ijb=ij_begin
58  ije=ij_end
59  if(pole_sud) ije=ij_end-iip1
60 
61 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
62  DO l = 1, klevel
63  gdy(ijb:ije,l)=ycov(ijb:ije,l)
64  ENDDO
65 c$OMP END DO NOWAIT
66 
67 c$OMP BARRIER
68  call register_hallo(gdy,ip1jm,llm,1,0,0,1,request_dissip)
69  call sendrequest(request_dissip)
70 c$OMP BARRIER
71  call waitrequest(request_dissip)
72 c$OMP BARRIER
73 c
74 c
75  signe = (-1.)**ld
76  nugrads = signe * cdivu
77 c
78 
79 
80  CALL divergf_p( klevel, gdx, gdy , div )
81 c call write_field3d_p('div1',reshape(div,(/iip1,jjp1,llm/)))
82 
83  IF( ld.GT.1 ) THEN
84 c$OMP BARRIER
85  call register_hallo(div,ip1jmp1,llm,1,1,1,1,request_dissip)
86  call sendrequest(request_dissip)
87 c$OMP BARRIER
88  call waitrequest(request_dissip)
89 c$OMP BARRIER
90  CALL laplacien_p ( klevel, div, div )
91 
92 c ...... Iteration de l'operateur laplacien_gam .......
93 c call write_field3d_p('div2',reshape(div,(/iip1,jjp1,llm/)))
94 
95  DO iter = 1, ld -2
96 c$OMP BARRIER
97  call register_hallo(div,ip1jmp1,llm,1,1,1,1,request_dissip)
98  call sendrequest(request_dissip)
99 c$OMP BARRIER
100  call waitrequest(request_dissip)
101 
102 c$OMP BARRIER
103 
105  * unsapolnga1, unsapolsga1, div, div )
106  ENDDO
107 c call write_field3d_p('div3',reshape(div,(/iip1,jjp1,llm/)))
108  ENDIF
109 
110  jjb=jj_begin
111  jje=jj_end
112 
113  CALL filtreg_p( div ,jjb,jje, jjp1, klevel, 2, 1, .true., 1 )
114 c call exchange_Hallo(div,ip1jmp1,llm,0,1)
115 c$OMP BARRIER
116  call register_hallo(div,ip1jmp1,llm,1,1,1,1,request_dissip)
117  call sendrequest(request_dissip)
118 c$OMP BARRIER
119  call waitrequest(request_dissip)
120 
121 c$OMP BARRIER
122 
123 
124  CALL grad_p ( klevel, div, gdx, gdy )
125 
126 c
127  ijb=ij_begin
128  ije=ij_end
129 
130 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
131  DO l = 1, klevel
132 
133  if (pole_sud) ije=ij_end
134  DO ij = ijb, ije
135  gdx_out( ij,l ) = gdx( ij,l ) * nugrads
136  ENDDO
137 
138  if (pole_sud) ije=ij_end-iip1
139  DO ij = ijb, ije
140  gdy_out( ij,l ) = gdy( ij,l ) * nugrads
141  ENDDO
142 
143  ENDDO
144 c$OMP END DO NOWAIT
145 c
146  RETURN
147  END
!$Header llmm1 INTEGER ip1jmp1
Definition: paramet.h:14
subroutine register_hallo(Field, ij, ll, RUp, Rdown, SUp, SDown, a_request)
Definition: mod_hallo.F90:875
subroutine filtreg_p(champ, ibeg, iend, nlat, nbniv, ifiltre, iaire, griscal, iter)
Definition: filtreg_p.F:5
integer, save jj_end
integer, save jj_begin
integer, save ij_end
logical, save pole_sud
!$Header cdivu
Definition: comdissipn.h:11
!$Id Turb_fcg_gcssold get_uvd hqturb_gcssold endif!large scale llm day day1 day day1 *dt_toga endif!time annee_ref dt_toga u_toga vq_toga w_prof vq_prof llm day day1 day day1 *dt_dice endif!time annee_ref dt_dice swup_dice vg_dice omega_dice tg_prof vg_profd w_profd omega_profd!do llm!print llm l llm
subroutine divergf_p(klevel, x, y, div)
Definition: divergf_p.F:2
!$Header!CDK comgeom COMMON comgeom && cvuscugam1
Definition: comgeom.h:25
!$Header llmm1 INTEGER ip1jm
Definition: paramet.h:14
!$Header!CDK comgeom COMMON comgeom && unsapolnga1
Definition: comgeom.h:19
!$Header!CDK comgeom COMMON comgeom unsapolnga2 unsair_gam1
Definition: comgeom.h:25
!$Header jjp1
Definition: paramet.h:14
!$Header!CDK comgeom COMMON comgeom cuvscvgam1
Definition: comgeom.h:25
subroutine gradiv2_p(klevel, xcov, ycov, ld, gdx_out, gdy_out)
Definition: gradiv2_p.F:2
Definition: times.F90:1
subroutine sendrequest(a_Request)
Definition: mod_hallo.F90:1072
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL true
integer, save ij_begin
!$Header!CDK comgeom COMMON comgeom unsapolsga1
Definition: comgeom.h:19
subroutine grad_p(klevel, pg, pgx, pgy)
Definition: grad_p.F:2
subroutine laplacien_p(klevel, teta, divgra)
Definition: laplacien_p.F:2
subroutine laplacien_gam(klevel, cuvsga, cvusga, unsaigam, unsapolnga, unsapolsga, teta, divgra)
Definition: laplacien_gam.F:6
subroutine waitrequest(a_Request)
Definition: mod_hallo.F90:1196