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

Last change on this file was 5324, checked in by abarral, 2 weeks ago

[WIP] Remove uses of DEBUGIO cpp key (deprecated)

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