source: LMDZ6/branches/Amaury_dev/libf/dyn3dmem/fluxstokenc_p.f90 @ 5153

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

Put gradsdef.h, tracstoke.h, clesphys.h into modules

File size: 3.9 KB
Line 
1! $Id: caladvtrac_p.F 1299 2010-01-20 14:27:21Z fairhead $
2
3!
4!
5SUBROUTINE fluxstokenc_p(pbaru, pbarv, masse, teta, phi)
6  USE parallel_lmdz
7  USE control_mod, ONLY: iapp_tracvl, planet_type, iphysiq
8  USE caladvtrac_mod
9  USE mod_hallo
10  USE bands
11  USE times
12  USE lmdz_vampir
13  USE write_field_loc
14  USE lmdz_tracstoke
15
16  IMPLICIT NONE
17  !
18  ! Auteurs:   F.Hourdin , P.Le Van, F.Forget, F.Codron
19  !
20  !=======================================================================
21  !
22  !   Shema de  Van Leer
23  !
24  !=======================================================================
25
26  INCLUDE "dimensions.h"
27  INCLUDE "paramet.h"
28
29  !   Arguments:
30  !   ----------
31  REAL :: pbaru(ijb_u:ije_u, llm), pbarv(ijb_v:ije_v, llm)
32  REAL :: masse(ijb_u:ije_u, llm)
33  REAL :: teta(ijb_u:ije_u, llm)
34  REAL :: phi(ijb_u:ije_u, llm)
35
36  INTEGER, SAVE :: pasflx = 0
37  !$OMP THREADPRIVATE(pasflx)
38  INTEGER :: ijb, ije, ijbu, ijbv, ijeu, ijev, j
39  INTEGER :: ij, l
40  TYPE(Request), SAVE :: Request_vanleer
41  !$OMP THREADPRIVATE(Request_vanleer)
42
43
44
45  !WRITE(*,*) 'caladvtrac 58: entree'
46  ijbu = ij_begin
47  ijeu = ij_end
48
49  ijbv = ij_begin - iip1
50  ijev = ij_end
51  IF (pole_nord) ijbv = ij_begin
52  IF (pole_sud)  ijev = ij_end - iip1
53
54  IF(pasflx==0) THEN
55    !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
56    DO l = 1, llm
57      tetac(ijbu:ijeu, l) = 0.
58      phic(ijbu:ijeu, l) = 0.
59      pbarucc(ijbu:ijeu, l) = 0.
60      pbarvcc(ijbv:ijev, l) = 0.
61    ENDDO
62    !$OMP END DO NOWAIT
63  ENDIF
64
65  !   accumulation des flux de masse horizontaux
66  !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
67  DO l = 1, llm
68    DO ij = ijbu, ijeu
69      pbarucc(ij, l) = pbarucc(ij, l) + pbaru(ij, l)
70      tetac(ij, l) = tetac(ij, l) + teta(ij, l)
71      phic(ij, l) = phic(ij, l) + phi(ij, l)
72
73    ENDDO
74    DO ij = ijbv, ijev
75      pbarvcc(ij, l) = pbarvcc(ij, l) + pbarv(ij, l)
76    ENDDO
77  ENDDO
78  !$OMP END DO NOWAIT
79
80  !   selection de la masse instantannee des mailles avant le transport.
81  IF(pasflx==0) THEN
82
83    ijb = ij_begin
84    ije = ij_end
85
86    !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
87    DO l = 1, llm
88      massec(ijb:ije, l) = masse(ijb:ije, l)
89    ENDDO
90    !$OMP END DO NOWAIT
91
92  ENDIF
93
94  pasflx = pasflx + 1
95
96
97  !   Test pour savoir si on advecte a ce pas de temps
98
99  IF (pasflx==(iphysiq * istphy)) THEN
100    !WRITE(*,*) 'caladvtrac 133'
101    !$OMP MASTER
102    CALL suspend_timer(timer_caldyn)
103    !$OMP END MASTER
104
105    ijb = ij_begin
106    ije = ij_end
107
108
109    !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
110    DO l = 1, llm
111      pbarucc(ijb:ije, l) = pbarucc(ijb:ije, l) / REAL(iphysiq * istphy)
112      tetac(ijb:ije, l) = tetac(ijb:ije, l) / REAL(iphysiq * istphy)
113      phic(ijb:ije, l) = phic(ijb:ije, l) / REAL(iphysiq * istphy)
114    ENDDO
115    !$OMP ENDDO NOWAIT
116
117    IF (pole_sud) ije = ij_end - iip1
118
119    !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
120    DO l = 1, llm
121      pbarvcc(ijb:ije, l) = pbarvcc(ijb:ije, l) / REAL(iphysiq * istphy)
122    ENDDO
123    !$OMP ENDDO NOWAIT
124
125
126    !$OMP BARRIER
127    CALL Register_Hallo_u(pbarucc, llm, 1, 1, 1, 1, Request_vanleer)
128    CALL Register_Hallo_v(pbarvcc, llm, 1, 1, 1, 1, Request_vanleer)
129    CALL SendRequest(Request_vanleer)
130    !$OMP BARRIER
131    CALL WaitRequest(Request_vanleer)
132    !$OMP BARRIER
133
134    !c   ..  Modif P.Le Van  ( 20/12/97 )  ....
135    !c
136
137    !   traitement des flux de masse avant advection.
138    ! 1. calcul de w
139    ! 2. groupement des mailles pres du pole.
140
141    CALL groupe_loc(massec, pbarucc, pbarvcc, pbarugg, pbarvgg, wgg)
142
143    ijb = ij_begin
144    ije = ij_end
145
146    !$OMP BARRIER
147    CALL WriteField_u('pbarug', pbarugg)
148    CALL WriteField_v('pbarvg', pbarvgg)
149    CALL WriteField_u('wg', wgg)
150    CALL WriteField_u('tetag', tetac)
151    CALL WriteField_u('phig', phic)
152    CALL WriteField_u('masseg', massec)
153
154
155    !$OMP MASTER
156    CALL Set_Distrib(distrib_caldyn)
157    CALL VTe(VThallo)
158    CALL resume_timer(timer_caldyn)
159    !$OMP END MASTER
160
161
162    !$OMP BARRIER
163    pasflx = 0
164  ENDIF ! if iadvtr.EQ.iapp_tracvl
165
166END SUBROUTINE fluxstokenc_p
Note: See TracBrowser for help on using the repository browser.