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

Last change on this file since 5308 was 5285, checked in by abarral, 4 days ago

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