source: LMDZ6/branches/Amaury_dev/libf/dyn3dmem/dissip_loc.f90 @ 5208

Last change on this file since 5208 was 5159, checked in by abarral, 7 weeks ago

Put dimensions.h and paramet.h into modules

  • 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.3 KB
Line 
1! $Id: $
2
3SUBROUTINE dissip_loc(vcov, ucov, teta, p, dv, du, dh)
4
5  USE parallel_lmdz
6  USE write_field_loc
7  USE dissip_mod, ONLY: dissip_allocate
8  USE comconst_mod, ONLY: dtdiss
9  USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_DEBUGIO
10  USE lmdz_comdissipn, ONLY: tetaudiv, tetaurot, tetah, cdivu, crot, cdivh
11  USE lmdz_comdissnew, ONLY: lstardis, nitergdiv, nitergrot, niterh, tetagdiv, &
12          tetagrot, tetatemp, coefdis, vert_prof_dissip
13  USE lmdz_comgeom
14
15  USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm
16  USE lmdz_paramet
17  IMPLICIT NONE
18
19
20  ! ..  Avec nouveaux operateurs star :  gradiv2 , divgrad2, nxgraro2  ...
21  ! (  10/01/98  )
22
23  !=======================================================================
24
25  !   Auteur:  P. Le Van
26  !   -------
27
28  !   Objet:
29  !   ------
30
31  !   Dissipation horizontale
32
33  !=======================================================================
34  !-----------------------------------------------------------------------
35  !   Declarations:
36  !   -------------
37
38
39
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  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  IF(lstardis) THEN
112    ! IF (.FALSE.) THEN
113    CALL gradiv2_loc(llm, ucov, vcov, nitergdiv, gdx, gdy)
114  ELSE
115    ! CALL gradiv_p ( llm,ucov,vcov,nitergdiv,gdx,gdy )
116  ENDIF
117
118  IF (CPPKEY_DEBUGIO) THEN
119    CALL WriteField_u('gdx', gdx)
120    CALL WriteField_v('gdy', gdy)
121  END IF
122
123  ijb = ij_begin
124  ije = ij_end
125  IF (pole_sud) ije = ij_end - iip1
126
127  !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
128  DO l = 1, llm
129    IF (pole_nord) THEN
130      DO ij = 1, iip1
131        gdx(ij, l) = 0.
132      ENDDO
133    endif
134
135    IF (pole_sud) THEN
136      DO ij = 1, iip1
137        gdx(ij + ip1jm, l) = 0.
138      ENDDO
139    endif
140
141    IF (pole_nord) ijb = ij_begin + iip1
142    DO ij = ijb, ije
143      du(ij, l) = du(ij, l) - te1dt(l) * gdx(ij, l)
144    ENDDO
145
146    IF (pole_nord) ijb = ij_begin
147    DO ij = ijb, ije
148      dv(ij, l) = dv(ij, l) - te1dt(l) * gdy(ij, l)
149    ENDDO
150
151  ENDDO
152  !$OMP END DO NOWAIT
153  !   calcul de la partie   n X grad ( rot ):
154  !   ---------------------------------------
155
156  IF(lstardis) THEN
157    ! IF (.FALSE.) THEN
158    CALL nxgraro2_loc(llm, ucov, vcov, nitergrot, grx, gry)
159  ELSE
160    ! CALL nxgrarot_p( llm,ucov, vcov, nitergrot,grx,gry )
161  ENDIF
162
163  IF (CPPKEY_DEBUGIO) THEN
164    CALL WriteField_u('grx', grx)
165    CALL WriteField_v('gry', gry)
166  END IF
167
168  ijb = ij_begin
169  ije = ij_end
170  IF (pole_sud) ije = ij_end - iip1
171
172  !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
173  DO l = 1, llm
174
175    IF (pole_nord) THEN
176      DO ij = 1, iip1
177        grx(ij, l) = 0.
178      ENDDO
179    endif
180
181    IF (pole_nord) ijb = ij_begin + iip1
182    DO ij = ijb, ije
183      du(ij, l) = du(ij, l) - te2dt(l) * grx(ij, l)
184    ENDDO
185
186    IF (pole_nord) ijb = ij_begin
187    DO ij = ijb, ije
188      dv(ij, l) = dv(ij, l) - te2dt(l) * gry(ij, l)
189    ENDDO
190
191  ENDDO
192  !$OMP END DO NOWAIT
193
194  !   calcul de la partie   div ( grad ):
195  !   -----------------------------------
196
197  IF(lstardis) THEN
198    ! IF (.FALSE.) THEN
199
200    ijb = ij_begin
201    ije = ij_end
202
203    !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
204    DO l = 1, llm
205      DO ij = ijb, ije
206        deltapres(ij, l) = AMAX1(0., p(ij, l) - p(ij, l + 1))
207      ENDDO
208    ENDDO
209    !$OMP END DO NOWAIT
210    CALL divgrad2_loc(llm, teta, deltapres, niterh, gdx)
211  ELSE
212    ! CALL divgrad_p ( llm,teta, niterh, gdx        )
213  ENDIF
214
215  IF (CPPKEY_DEBUGIO) THEN
216    CALL WriteField_u('gdx', gdx)
217  END IF
218
219  ijb = ij_begin
220  ije = ij_end
221
222  !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
223  DO l = 1, llm
224    DO ij = ijb, ije
225      dh(ij, l) = dh(ij, l) - te3dt(l) * gdx(ij, l)
226    ENDDO
227  ENDDO
228  !$OMP END DO NOWAIT
229
230
231END SUBROUTINE dissip_loc
Note: See TracBrowser for help on using the repository browser.