source: LMDZ6/trunk/libf/dyn3dmem/fluxstokenc_p.F @ 5134

Last change on this file since 5134 was 4139, checked in by acozic, 3 years ago

added (and call) a routine for the calculation of mass flux used in offline mode

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