source: LMDZ6/trunk/libf/dyn3dmem/caladvtrac_loc.f90 @ 5282

Last change on this file since 5282 was 5272, checked in by abarral, 7 weeks 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.3 KB
Line 
1!
2! $Id: caladvtrac_p.F 1299 2010-01-20 14:27:21Z fairhead $
3!
4!
5!
6      SUBROUTINE caladvtrac_loc(q,pbaru,pbarv , &
7              p ,masse, dq ,  teta, &
8              flxw, pk, iapptrac)
9  USE parallel_lmdz
10  USE infotrac, ONLY : nqtot
11  USE control_mod, ONLY : iapp_tracvl,planet_type
12  USE caladvtrac_mod
13  USE mod_hallo
14  USE bands
15  USE times
16  USE Vampir
17  USE write_field_loc
18  USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_DEBUGIO
19  USE dimensions_mod, ONLY: iim, jjm, llm, ndm
20USE paramet_mod_h, ONLY: iip1, iip2, iip3, jjp1, llmp1, llmp2, llmm1, kftd, ip1jm, ip1jmp1, &
21          ip1jmi1, ijp1llm, ijmllm, mvar, jcfil, jcfllm
22IMPLICIT NONE
23  !
24  ! Auteurs:   F.Hourdin , P.Le Van, F.Forget, F.Codron
25  !
26  ! F.Codron (10/99) : ajout humidite specifique pour eau vapeur
27  !=======================================================================
28  !
29  !   Shema de  Van Leer
30  !
31  !=======================================================================
32
33
34
35
36
37  !   Arguments:
38  !   ----------
39  REAL :: pbaru( ijb_u:ije_u,llm ),pbarv( ijb_v:ije_v,llm)
40  REAL :: masse(ijb_u:ije_u,llm)
41  REAL :: p( ijb_u:ije_u,llmp1)
42  REAL :: q( ijb_u:ije_u,llm,nqtot),dq( ijb_u:ije_u,llm, nqtot )
43  REAL :: teta( ijb_u:ije_u,llm),pk( ijb_u:ije_u,llm)
44  REAL :: flxw(ijb_u:ije_u,llm)
45  INTEGER :: iapptrac
46  !   Local:
47  !   ------
48   ! REAL :: pbarug(ijb_u:ije_u,llm)
49   ! REAL :: pbarvg(ijb_v:ije_v,llm)
50  !      REAL :: wg(ijb_u:ije_u,llm)
51
52  REAL :: flxw_adv(distrib_vanleer%ijb_u:distrib_vanleer%ije_u,llm)
53  INTEGER,SAVE :: iadvtr=0
54!$OMP THREADPRIVATE(iadvtr)
55  INTEGER ::  ijb,ije,ijbu,ijbv,ijeu,ijev,j
56  INTEGER :: ij,l
57  TYPE(Request),SAVE :: Request_vanleer
58!$OMP THREADPRIVATE(Request_vanleer)
59
60  ! !write(*,*) 'caladvtrac 58: entree'
61  ijbu=ij_begin
62  ijeu=ij_end
63
64  ijbv=ij_begin-iip1
65  ijev=ij_end
66  if (pole_nord) ijbv=ij_begin
67  if (pole_sud)  ijev=ij_end-iip1
68
69  IF(iadvtr.EQ.0) THEN
70!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
71    DO l=1,llm
72      pbaruc(ijbu:ijeu,l)=0.
73      pbarvc(ijbv:ijev,l)=0.
74    ENDDO
75!$OMP END DO NOWAIT
76  ENDIF
77
78  !   accumulation des flux de masse horizontaux
79!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
80  DO l=1,llm
81     DO ij = ijbu,ijeu
82        pbaruc(ij,l) = pbaruc(ij,l) + pbaru(ij,l)
83     ENDDO
84     DO ij = ijbv,ijev
85        pbarvc(ij,l) = pbarvc(ij,l) + pbarv(ij,l)
86     ENDDO
87  ENDDO
88!$OMP END DO NOWAIT
89
90  !   selection de la masse instantannee des mailles avant le transport.
91  IF(iadvtr.EQ.0) THEN
92
93      ijb=ij_begin
94      ije=ij_end
95
96!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
97   DO l=1,llm
98      massem(ijb:ije,l)=masse(ijb:ije,l)
99   ENDDO
100!$OMP END DO NOWAIT
101
102  ENDIF
103
104  iadvtr   = iadvtr+1
105
106!$OMP MASTER
107  iapptrac = iadvtr
108!$OMP END MASTER
109
110  !   Test pour savoir si on advecte a ce pas de temps
111
112  IF ( iadvtr.EQ.iapp_tracvl ) THEN
113  ! !write(*,*) 'caladvtrac 133'
114!$OMP MASTER
115    call suspend_timer(timer_caldyn)
116!$OMP END MASTER
117
118  ijb=ij_begin
119  ije=ij_end
120
121  !c   ..  Modif P.Le Van  ( 20/12/97 )  ....
122  !c
123
124  !   traitement des flux de masse avant advection.
125  ! 1. calcul de w
126  ! 2. groupement des mailles pres du pole.
127
128    CALL groupe_loc( massem, pbaruc,pbarvc, pbarug,pbarvg,wg )
129
130!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
131  DO l=1,llm
132    flxw(ijb:ije,l)=wg(ijb:ije,l)/REAL(iapp_tracvl)
133  ENDDO
134!$OMP ENDDO NOWAIT
135
136IF (CPPKEY_DEBUGIO) THEN
137     CALL WriteField_u('pbarug1',pbarug)
138     CALL WriteField_v('pbarvg1',pbarvg)
139     CALL WriteField_u('wg1',wg)
140END IF
141
142!$OMP BARRIER
143
144
145!$OMP MASTER
146  call VTb(VTHallo)
147!$OMP END MASTER
148
149  call Register_SwapField_u(pbarug,pbarug_adv, distrib_vanleer, &
150        Request_vanleer)
151  call Register_SwapField_v(pbarvg,pbarvg_adv, distrib_vanleer, &
152        Request_vanleer,up=1)
153  call Register_SwapField_u(massem,massem_adv, distrib_vanleer, &
154        Request_vanleer)
155  call Register_SwapField_u(wg,wg_adv,distrib_vanleer, &
156        Request_vanleer)
157  call Register_SwapField_u(teta,teta_adv, distrib_vanleer, &
158        Request_vanleer,up=1,down=1)
159  call Register_SwapField_u(p,p_adv, distrib_vanleer, &
160        Request_vanleer,up=1,down=1)
161  call Register_SwapField_u(pk,pk_adv, distrib_vanleer, &
162        Request_vanleer,up=1,down=1)
163  call Register_SwapField_u(q,q_adv, distrib_vanleer, &
164        Request_vanleer)
165
166  call SendRequest(Request_vanleer)
167!$OMP BARRIER
168  call WaitRequest(Request_vanleer)
169
170
171!$OMP BARRIER
172!$OMP MASTER
173  call Set_Distrib(distrib_vanleer)
174  call VTe(VTHallo)
175  call VTb(VTadvection)
176  call start_timer(timer_vanleer)
177!$OMP END MASTER
178!$OMP BARRIER
179   ! CALL WriteField_u('pbarug_adv',pbarug_adv)
180   ! CALL WriteField_u('',)
181
182
183IF (CPPKEY_DEBUGIO) THEN
184     CALL WriteField_u('pbarug1',pbarug_adv)
185     CALL WriteField_v('pbarvg1',pbarvg_adv)
186     CALL WriteField_u('wg1',wg_adv)
187END IF
188  ! !write(*,*) 'caladvtrac 185'
189  CALL advtrac_loc( pbarug_adv,pbarvg_adv,wg_adv, &
190        p_adv,  massem_adv,q_adv, teta_adv, &
191        pk_adv)
192  ! !write(*,*) 'caladvtrac 189'
193
194
195!$OMP MASTER
196    call VTe(VTadvection)
197    call stop_timer(timer_vanleer)
198    call VTb(VThallo)
199!$OMP END MASTER
200
201    call Register_SwapField_u(q_adv,q,distrib_caldyn, &
202          Request_vanleer)
203
204    call SendRequest(Request_vanleer)
205!$OMP BARRIER
206    call WaitRequest(Request_vanleer)
207
208!$OMP BARRIER
209!$OMP MASTER
210    call Set_Distrib(distrib_caldyn)
211    call VTe(VThallo)
212    call resume_timer(timer_caldyn)
213!$OMP END MASTER
214!$OMP BARRIER
215      iadvtr=0
216   ENDIF ! if iadvtr.EQ.iapp_tracvl
217
218END SUBROUTINE caladvtrac_loc
219
220
Note: See TracBrowser for help on using the repository browser.