source: LMDZ6/trunk/libf/dyn3dmem/dissip_loc.f90 @ 5279

Last change on this file since 5279 was 5272, checked in by abarral, 33 hours ago

Turn paramet.h into a module

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