source: LMDZ6/trunk/libf/dyn3dmem/fluxstokenc_p.f90 @ 5254

Last change on this file since 5254 was 5246, checked in by abarral, 27 hours ago

Convert fixed-form to free-form sources .F -> .{f,F}90
(WIP: some .F remain, will be handled in subsequent commits)

File size: 3.7 KB
Line 
1!
2! $Id: caladvtrac_p.F 1299 2010-01-20 14:27:21Z fairhead $
3!
4!
5!
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
17  !
18  IMPLICIT NONE
19  !
20  ! Auteurs:   F.Hourdin , P.Le Van, F.Forget, F.Codron
21  !
22  !=======================================================================
23  !
24  !   Shema de  Van Leer
25  !
26  !=======================================================================
27
28
29  include "dimensions.h"
30  include "paramet.h"
31  include "tracstoke.h"
32
33  !   Arguments:
34  !   ----------
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
59!$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
66!$OMP END DO NOWAIT
67  ENDIF
68
69  !   accumulation des flux de masse horizontaux
70!$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
82!$OMP END DO NOWAIT
83
84  !   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
90!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
91  DO l=1,llm
92      massec(ijb:ije,l)=masse(ijb:ije,l)
93   ENDDO
94!$OMP END DO NOWAIT
95
96  ENDIF
97
98  pasflx   = pasflx+1
99
100
101  !   Test pour savoir si on advecte a ce pas de temps
102
103  IF ( pasflx.EQ.(iphysiq*istphy) ) THEN
104  ! !write(*,*) 'caladvtrac 133'
105!$OMP MASTER
106  call suspend_timer(timer_caldyn)
107!$OMP END MASTER
108
109  ijb=ij_begin
110  ije=ij_end
111
112
113!$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
119!$OMP ENDDO NOWAIT
120
121  if (pole_sud) ije=ij_end-iip1
122
123!$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
127!$OMP ENDDO NOWAIT
128
129
130!$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)
134!$OMP BARRIER
135    call WaitRequest(Request_vanleer)
136!$OMP BARRIER
137
138
139
140
141  !c   ..  Modif P.Le Van  ( 20/12/97 )  ....
142  !c
143
144  !   traitement des flux de masse avant advection.
145  ! 1. calcul de w
146  ! 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
155!$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
164!$OMP MASTER
165    call Set_Distrib(distrib_caldyn)
166    call VTe(VThallo)
167    call resume_timer(timer_caldyn)
168!$OMP END MASTER
169
170
171!$OMP BARRIER
172      pasflx=0
173   ENDIF ! if iadvtr.EQ.iapp_tracvl
174
175END SUBROUTINE fluxstokenc_p
Note: See TracBrowser for help on using the repository browser.