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

Last change on this file since 5123 was 5123, checked in by abarral, 8 weeks ago

Correct various minor mistakes from previous commits

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