source: LMDZ6/trunk/libf/dyn3dmem/dissip_loc.F90 @ 5267

Last change on this file since 5267 was 5258, checked in by abarral, 3 days ago

Wrap uses of cpp key DEBUG_IO

  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
File size: 5.0 KB
Line 
1!
2! $Id: $
3!
4SUBROUTINE dissip_loc( vcov,ucov,teta,p, dv,du,dh )
5  !
6  USE parallel_lmdz
7  USE write_field_loc
8  USE dissip_mod, ONLY: dissip_allocate
9  USE comconst_mod, ONLY: dtdiss
10  USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_DEBUGIO
11  IMPLICIT NONE
12
13
14  ! ..  Avec nouveaux operateurs star :  gradiv2 , divgrad2, nxgraro2  ...
15                              ! (  10/01/98  )
16
17  !=======================================================================
18  !
19  !   Auteur:  P. Le Van
20  !   -------
21  !
22  !   Objet:
23  !   ------
24  !
25  !   Dissipation horizontale
26  !
27  !=======================================================================
28  !-----------------------------------------------------------------------
29  !   Declarations:
30  !   -------------
31
32  include "dimensions.h"
33  include "paramet.h"
34  include "comgeom.h"
35  include "comdissnew.h"
36  include "comdissipn.h"
37
38  !   Arguments:
39  !   ----------
40
41  REAL,INTENT(IN) :: vcov(ijb_v:ije_v,llm) ! covariant meridional wind
42  REAL,INTENT(IN) :: ucov(ijb_u:ije_u,llm) ! covariant zonal wind
43  REAL,INTENT(IN) :: teta(ijb_u:ije_u,llm) ! potential temperature
44  REAL,INTENT(IN) :: p(ijb_u:ije_u,llmp1) ! interlayer pressure
45  ! ! tendencies (.../s) on covariant winds and potential temperature
46  REAL,INTENT(OUT) :: dv(ijb_v:ije_v,llm)
47  REAL,INTENT(OUT) :: du(ijb_u:ije_u,llm)
48  REAL,INTENT(OUT) :: dh(ijb_u:ije_u,llm)
49
50  !   Local:
51  !   ------
52
53  REAL :: gdx(ijb_u:ije_u,llm),gdy(ijb_v:ije_v,llm)
54  REAL :: grx(ijb_u:ije_u,llm),gry(ijb_v:ije_v,llm)
55  REAL :: te1dt(llm),te2dt(llm),te3dt(llm)
56  REAL :: deltapres(ijb_u:ije_u,llm)
57
58  INTEGER :: l,ij
59
60  REAL :: SSUM
61  integer :: ijb,ije
62
63  LOGICAl,SAVE :: first=.TRUE.
64!$OMP THREADPRIVATE(first)
65
66  IF (first) THEN
67    CALL dissip_allocate
68    first=.FALSE.
69  ENDIF
70  !-----------------------------------------------------------------------
71  !   initialisations:
72  !   ----------------
73
74!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
75  DO l=1,llm
76     te1dt(l) = tetaudiv(l) * dtdiss
77     te2dt(l) = tetaurot(l) * dtdiss
78     te3dt(l) = tetah(l)    * dtdiss
79  ENDDO
80!$OMP END DO NOWAIT
81   ! CALL initial0( ijp1llm, du )
82   ! CALL initial0( ijmllm , dv )
83   ! CALL initial0( ijp1llm, dh )
84
85  ijb=ij_begin
86  ije=ij_end
87
88!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
89  DO l=1,llm
90    du(ijb:ije,l)=0
91    dh(ijb:ije,l)=0
92  ENDDO
93!$OMP END DO NOWAIT
94
95  if (pole_sud) ije=ij_end-iip1
96
97!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
98  DO l=1,llm
99    dv(ijb:ije,l)=0
100  ENDDO
101!$OMP END DO NOWAIT
102
103  !-----------------------------------------------------------------------
104  !   Calcul de la dissipation:
105  !   -------------------------
106
107  !   Calcul de la partie   grad  ( div ) :
108  !   -------------------------------------
109
110
111
112  IF(lstardis) THEN
113   ! IF (.FALSE.) THEN
114     CALL gradiv2_loc( llm,ucov,vcov,nitergdiv,gdx,gdy )
115  ELSE
116      ! CALL gradiv_p ( llm,ucov,vcov,nitergdiv,gdx,gdy )
117  ENDIF
118
119IF (CPPKEY_DEBUGIO) THEN
120  call WriteField_u('gdx',gdx)
121  call WriteField_v('gdy',gdy)
122END IF
123
124  ijb=ij_begin
125  ije=ij_end
126  if (pole_sud) ije=ij_end-iip1
127
128!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
129  DO l=1,llm
130     if (pole_nord) then
131       DO ij = 1, iip1
132          gdx(     ij ,l) = 0.
133       ENDDO
134     endif
135
136     if (pole_sud) then
137       DO ij = 1, iip1
138          gdx(ij+ip1jm,l) = 0.
139       ENDDO
140     endif
141
142     if (pole_nord) ijb=ij_begin+iip1
143     DO ij = ijb,ije
144        du(ij,l) = du(ij,l) - te1dt(l) *gdx(ij,l)
145     ENDDO
146
147     if (pole_nord) ijb=ij_begin
148     DO ij = ijb,ije
149        dv(ij,l) = dv(ij,l) - te1dt(l) *gdy(ij,l)
150     ENDDO
151
152   ENDDO
153!$OMP END DO NOWAIT
154  !   calcul de la partie   n X grad ( rot ):
155  !   ---------------------------------------
156
157  IF(lstardis) THEN
158   ! IF (.FALSE.) THEN
159     CALL nxgraro2_loc( llm,ucov, vcov, nitergrot,grx,gry )
160  ELSE
161      ! CALL nxgrarot_p( llm,ucov, vcov, nitergrot,grx,gry )
162  ENDIF
163
164IF (CPPKEY_DEBUGIO) THEN
165  call WriteField_u('grx',grx)
166  call WriteField_v('gry',gry)
167END IF
168
169
170  ijb=ij_begin
171  ije=ij_end
172  if (pole_sud) ije=ij_end-iip1
173
174!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
175  DO l=1,llm
176
177     if (pole_nord) then
178       DO ij = 1, iip1
179          grx(ij,l) = 0.
180       ENDDO
181     endif
182
183     if (pole_nord) ijb=ij_begin+iip1
184     DO ij = ijb,ije
185        du(ij,l) = du(ij,l) - te2dt(l) * grx(ij,l)
186     ENDDO
187
188     if (pole_nord) ijb=ij_begin
189     DO ij =  ijb, ije
190        dv(ij,l) = dv(ij,l) - te2dt(l) * gry(ij,l)
191     ENDDO
192
193  ENDDO
194!$OMP END DO NOWAIT
195
196  !   calcul de la partie   div ( grad ):
197  !   -----------------------------------
198
199
200  IF(lstardis) THEN
201   ! IF (.FALSE.) THEN
202
203  ijb=ij_begin
204  ije=ij_end
205
206!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
207   DO l = 1, llm
208      DO ij = ijb, ije
209        deltapres(ij,l) = AMAX1( 0.,  p(ij,l) - p(ij,l+1) )
210      ENDDO
211   ENDDO
212!$OMP END DO NOWAIT
213     CALL divgrad2_loc( llm,teta, deltapres  ,niterh, gdx )
214  ELSE
215      ! CALL divgrad_p ( llm,teta, niterh, gdx        )
216  ENDIF
217
218IF (CPPKEY_DEBUGIO) THEN
219  call WriteField_u('gdx',gdx)
220END IF
221
222
223  ijb=ij_begin
224  ije=ij_end
225
226!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
227  DO l = 1,llm
228     DO ij = ijb,ije
229        dh( ij,l ) = dh( ij,l ) - te3dt(l) * gdx( ij,l )
230     ENDDO
231  ENDDO
232!$OMP END DO NOWAIT
233
234  RETURN
235END SUBROUTINE dissip_loc
Note: See TracBrowser for help on using the repository browser.