source: LMDZ6/trunk/libf/dyn3dmem/vlspltgen_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: 12.5 KB
Line 
1
2!
3! $Header$
4!
5 SUBROUTINE vlspltgen_loc( q,pente_max,masse,w,pbaru,pbarv, &
6         pdt, p,pk,teta                 )
7
8  !
9  ! Auteurs:   P.Le Van, F.Hourdin, F.Forget, F.Codron
10  !
11  !    ********************************************************************
12  !      Schema  d'advection " pseudo amont " .
13  !  + test sur humidite specifique: Q advecte< Qsat aval
14  !               (F. Codron, 10/99)
15  !    ********************************************************************
16  ! q,pbaru,pbarv,w sont des arguments d'entree  pour le s-pg ....
17  !
18  ! pente_max facteur de limitation des pentes: 2 en general
19  !                                            0 pour un schema amont
20  ! pbaru,pbarv,w flux de masse en u ,v ,w
21  ! pdt pas de temps
22  !
23  ! teta temperature potentielle, p pression aux interfaces,
24  ! pk exner au milieu des couches necessaire pour calculer Qsat
25  !   --------------------------------------------------------------------
26  USE parallel_lmdz
27  USE mod_hallo
28  USE Write_Field_loc
29  USE VAMPIR
30  ! ! CRisi: on rajoute variables utiles d'infotrac
31  USE infotrac, ONLY : nqtot, tracers, isoCheck
32  USE vlspltgen_mod
33  USE comconst_mod, ONLY: cpp
34  USE logic_mod, ONLY: adv_qsat_liq
35  USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_DEBUGIO
36  USE dimensions_mod, ONLY: iim, jjm, llm, ndm
37USE paramet_mod_h, ONLY: iip1, iip2, iip3, jjp1, llmp1, llmp2, llmm1, kftd, ip1jm, ip1jmp1, &
38          ip1jmi1, ijp1llm, ijmllm, mvar, jcfil, jcfllm
39IMPLICIT NONE
40
41  !
42
43
44
45  !
46  !   Arguments:
47  !   ----------
48  REAL :: masse(ijb_u:ije_u,llm),pente_max
49  REAL :: pbaru( ijb_u:ije_u,llm ),pbarv( ijb_v:ije_v,llm)
50  REAL :: q(ijb_u:ije_u,llm,nqtot)
51  REAL :: w(ijb_u:ije_u,llm),pdt
52  REAL :: p(ijb_u:ije_u,llmp1),teta(ijb_u:ije_u,llm)
53  REAL :: pk(ijb_u:ije_u,llm)
54  !
55  !  Local
56  !   ---------
57  !
58  INTEGER :: ij,l
59  !
60  REAL :: zzpbar, zzw
61
62  REAL :: qmin,qmax
63  DATA qmin,qmax/0.,1.e33/
64
65  !--pour rapport de melange saturant--
66
67  REAL :: rtt,retv,r2es,r3les,r3ies,r4les,r4ies,play
68  REAL :: ptarg,pdelarg,foeew,zdelta
69  REAL :: tempe(ijb_u:ije_u)
70  INTEGER :: ijb,ije,iq,iq2,ifils
71  LOGICAL, SAVE :: firstcall=.TRUE.
72!$OMP THREADPRIVATE(firstcall)
73  type(request),SAVE :: MyRequest1
74!$OMP THREADPRIVATE(MyRequest1)
75  type(request),SAVE :: MyRequest2
76!$OMP THREADPRIVATE(MyRequest2)
77  !    fonction psat(T)
78
79   FOEEW ( PTARG,PDELARG ) = EXP ( &
80         (R3LES*(1.-PDELARG)+R3IES*PDELARG) * (PTARG-RTT) &
81         / (PTARG-(R4LES*(1.-PDELARG)+R4IES*PDELARG)) )
82
83    r2es  = 380.11733
84    r3les = 17.269
85    r3ies = 21.875
86    r4les = 35.86
87    r4ies = 7.66
88    retv = 0.6077667
89    rtt  = 273.16
90
91  ! Allocate variables depending on dynamic variable nqtot
92
93     IF (firstcall) THEN
94        firstcall=.FALSE.
95     END IF
96  !-- Calcul de Qsat en chaque point
97  !-- approximation: au milieu des couches play(l)=(p(l)+p(l+1))/2
98  !   pour eviter une exponentielle.
99
100  call SetTag(MyRequest1,100)
101  call SetTag(MyRequest2,101)
102
103
104    ijb=ij_begin-iip1
105    ije=ij_end+iip1
106    if (pole_nord) ijb=ij_begin
107    if (pole_sud) ije=ij_end
108
109!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
110    DO l = 1, llm
111     DO ij = ijb, ije
112      tempe(ij) = teta(ij,l) * pk(ij,l) /cpp
113     ENDDO
114     DO ij = ijb, ije
115      IF (adv_qsat_liq) THEN
116         zdelta = 0.
117      ELSE
118         zdelta = MAX( 0., SIGN(1., rtt - tempe(ij)) )
119      ENDIF
120      play   = 0.5*(p(ij,l)+p(ij,l+1))
121      qsat(ij,l) = MIN(0.5, r2es* FOEEW(tempe(ij),zdelta) / play )
122      qsat(ij,l) = qsat(ij,l) / ( 1. - retv * qsat(ij,l) )
123     ENDDO
124    ENDDO
125!$OMP END DO NOWAIT
126   ! PRINT*,'Debut vlsplt version debug sans vlyqs'
127
128    zzpbar = 0.5 * pdt
129    zzw    = pdt
130
131  ijb=ij_begin
132  ije=ij_end
133  if (pole_nord) ijb=ijb+iip1
134  if (pole_sud)  ije=ije-iip1
135
136!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
137  DO l=1,llm
138    DO ij = ijb,ije
139        mu(ij,l)=pbaru(ij,l) * zzpbar
140     ENDDO
141  ENDDO
142!$OMP END DO NOWAIT
143
144  ijb=ij_begin-iip1
145  ije=ij_end
146  if (pole_nord) ijb=ij_begin
147  if (pole_sud)  ije=ij_end-iip1
148
149!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
150  DO l=1,llm
151     DO ij=ijb,ije
152        mv(ij,l)=pbarv(ij,l) * zzpbar
153     ENDDO
154  ENDDO
155!$OMP END DO NOWAIT
156
157  ijb=ij_begin
158  ije=ij_end
159
160  DO iq=1,nqtot
161!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
162  DO l=1,llm
163     DO ij=ijb,ije
164        mw(ij,l,iq)=w(ij,l) * zzw
165     ENDDO
166  ENDDO
167!$OMP END DO NOWAIT
168  ENDDO
169
170  DO iq=1,nqtot
171!$OMP MASTER
172  DO ij=ijb,ije
173     mw(ij,llm+1,iq)=0.
174  ENDDO
175!$OMP END MASTER
176  ENDDO
177
178   ! CALL SCOPY(ijp1llm,q,1,zq,1)
179   ! CALL SCOPY(ijp1llm,masse,1,zm,1)
180
181   ijb=ij_begin
182   ije=ij_end
183
184  DO iq=1,nqtot
185!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
186    DO l=1,llm
187      zq(ijb:ije,l,iq)=q(ijb:ije,l,iq)
188      zm(ijb:ije,l,iq)=masse(ijb:ije,l)
189    ENDDO
190!$OMP END DO NOWAIT
191  ENDDO
192
193  ! ! verif temporaire
194  ijb=ij_begin
195  ije=ij_end
196  call check_isotopes(zq,ijb,ije,'vlspltgen_loc 191')
197
198!$OMP BARRIER
199  DO iq=1,nqtot
200    ! ! CRisi: on ne boucle que sur les pères= ceux qui sont transportés directement par l'air
201    IF(tracers(iq)%parent /= 'air') CYCLE
202    ! !write(*,*) 'vlspltgen 192: iq,iadv=',iq,tracers(iq)%iadv
203    SELECT CASE(tracers(iq)%iadv)
204      CASE(0); CYCLE
205      CASE(10)
206#ifdef _ADV_HALO
207  ! CRisi: on ajoute les nombres de fils et tableaux des fils
208  ! On suppose qu'on ne peut advecter les fils que par le schéma 10.
209      call vlx_loc(zq,pente_max,zm,mu, &
210            ij_begin,ij_begin+2*iip1-1,iq)
211      call vlx_loc(zq,pente_max,zm,mu, &
212            ij_end-2*iip1+1,ij_end,iq)
213#else
214      call vlx_loc(zq,pente_max,zm,mu, &
215            ij_begin,ij_end,iq)
216#endif
217
218!$OMP MASTER
219      call VTb(VTHallo)
220!$OMP END MASTER
221      call Register_Hallo_u(zq(:,:,iq),llm,2,2,2,2,MyRequest1)
222      call Register_Hallo_u(zm(:,:,iq),llm,1,1,1,1,MyRequest1)
223  ! CRisi
224      do ifils=1,tracers(iq)%nqDescen
225        iq2=tracers(iq)%iqDescen(ifils)
226        call Register_Hallo_u(zq(:,:,iq2),llm,2,2,2,2,MyRequest1)
227        call Register_Hallo_u(zm(:,:,iq2),llm,1,1,1,1,MyRequest1)
228      enddo
229
230!$OMP MASTER
231      call VTe(VTHallo)
232!$OMP END MASTER
233      CASE(14)
234#ifdef _ADV_HALO
235      call vlxqs_loc(zq,pente_max,zm,mu, &
236            qsat,ij_begin,ij_begin+2*iip1-1,iq)
237      call vlxqs_loc(zq,pente_max,zm,mu, &
238            qsat,ij_end-2*iip1+1,ij_end,iq)
239#else
240      call vlxqs_loc(zq,pente_max,zm,mu, &
241            qsat,ij_begin,ij_end,iq)
242#endif
243
244!$OMP MASTER
245      call VTb(VTHallo)
246!$OMP END MASTER
247
248      call Register_Hallo_u(zq(:,:,iq),llm,2,2,2,2,MyRequest1)
249      call Register_Hallo_u(zm(:,:,iq),llm,1,1,1,1,MyRequest1)
250      do ifils=1,tracers(iq)%nqDescen
251        iq2=tracers(iq)%iqDescen(ifils)
252        call Register_Hallo_u(zq(:,:,iq2),llm,2,2,2,2,MyRequest1)
253        call Register_Hallo_u(zm(:,:,iq2),llm,1,1,1,1,MyRequest1)
254      enddo
255
256!$OMP MASTER
257      call VTe(VTHallo)
258!$OMP END MASTER
259      CASE DEFAULT
260         CALL abort_gcm("vlspltgen_loc","schema non parallelise",1)
261    END SELECT
262
263  enddo !DO iq=1,nqtot
264
265
266!$OMP BARRIER
267!$OMP MASTER
268  call VTb(VTHallo)
269!$OMP END MASTER
270
271  call SendRequest(MyRequest1)
272
273!$OMP MASTER
274  call VTe(VTHallo)
275!$OMP END MASTER
276!$OMP BARRIER
277
278  ! ! verif temporaire
279  ijb=ij_begin-2*iip1
280  ije=ij_end+2*iip1
281  if (pole_nord) ijb=ij_begin
282  if (pole_sud)  ije=ij_end
283  call check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 280')
284
285  do iq=1,nqtot
286    IF(tracers(iq)%parent /= 'air') CYCLE
287    ! !write(*,*) 'vlspltgen 279: iq=',iq
288
289    SELECT CASE(tracers(iq)%iadv)
290      CASE(0); CYCLE
291      CASE(10)
292#ifdef _ADV_HALLO
293      call vlx_loc(zq,pente_max,zm,mu, &
294            ij_begin+2*iip1,ij_end-2*iip1,iq)
295#endif
296      CASE(14)
297#ifdef _ADV_HALLO
298      call vlxqs_loc(zq,pente_max,zm,mu, &
299            qsat,ij_begin+2*iip1,ij_end-2*iip1,iq)
300#endif
301      CASE DEFAULT
302      CALL abort_gcm("vlspltgen_p","schema non parallelise",1)
303    END SELECT
304
305  enddo
306!$OMP BARRIER
307!$OMP MASTER
308  call VTb(VTHallo)
309!$OMP END MASTER
310
311   ! call WaitRecvRequest(MyRequest1)
312   ! call WaitSendRequest(MyRequest1)
313!$OMP BARRIER
314   call WaitRequest(MyRequest1)
315
316
317!$OMP MASTER
318  call VTe(VTHallo)
319!$OMP END MASTER
320!$OMP BARRIER
321
322
323  IF(isoCheck) THEN
324       call check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 326')
325       ijb=ij_begin-2*iip1
326       ije=ij_end+2*iip1
327       if (pole_nord) ijb=ij_begin
328       if (pole_sud)  ije=ij_end
329       call check_isotopes(zq,ijb,ije,'vlspltgen_loc 336')
330  END IF
331
332  do iq = 1, nqtot
333   IF(tracers(iq)%parent /= 'air') CYCLE
334   ! !write(*,*) 'vlspltgen 321: iq=',iq
335
336    SELECT CASE(tracers(iq)%iadv)
337      CASE(0); CYCLE
338      CASE(10); call   vly_loc(zq,pente_max,zm,mv,     iq)
339      CASE(14); call vlyqs_loc(zq,pente_max,zm,mv,qsat,iq)
340      CASE DEFAULT
341      CALL abort_gcm("vlspltgen_p","schema non parallelise",1)
342    END SELECT
343
344   enddo
345
346  call check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 357')
347
348  do iq = 1, nqtot
349   IF(tracers(iq)%parent /= 'air') CYCLE
350  ! !write(*,*) 'vlspltgen 349: iq=',iq
351    SELECT CASE(tracers(iq)%iadv)
352      CASE(0); CYCLE
353      CASE(10,14)
354!$OMP BARRIER
355#ifdef _ADV_HALLO
356      call vlz_loc(zq,pente_max,zm,mw, &
357            ij_begin,ij_begin+2*iip1-1,iq)
358      call vlz_loc(zq,pente_max,zm,mw, &
359            ij_end-2*iip1+1,ij_end,iq)
360#else
361      call vlz_loc(zq,pente_max,zm,mw, &
362            ij_begin,ij_end,iq)
363#endif
364!$OMP BARRIER
365
366!$OMP MASTER
367      call VTb(VTHallo)
368!$OMP END MASTER
369
370      call Register_Hallo_u(zq(:,:,iq),llm,2,2,2,2,MyRequest2)
371      call Register_Hallo_u(zm(:,:,iq),llm,1,1,1,1,MyRequest2)
372      ! ! CRisi
373      do ifils=1,tracers(iq)%nqDescen
374        iq2=tracers(iq)%iqDescen(ifils)
375        call Register_Hallo_u(zq(:,:,iq2),llm,2,2,2,2,MyRequest2)
376        call Register_Hallo_u(zm(:,:,iq2),llm,1,1,1,1,MyRequest2)
377      enddo
378!$OMP MASTER
379      call VTe(VTHallo)
380!$OMP END MASTER
381!$OMP BARRIER
382      CASE DEFAULT
383
384        CALL abort_gcm("vlspltgen_p","schema non parallelise",1)
385     END SELECT
386
387  enddo
388!$OMP BARRIER
389
390!$OMP MASTER
391  call VTb(VTHallo)
392!$OMP END MASTER
393
394  call SendRequest(MyRequest2)
395
396!$OMP MASTER
397  call VTe(VTHallo)
398!$OMP END MASTER
399
400
401  call check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 429')
402
403!$OMP BARRIER
404  do iq=1,nqtot
405    IF(tracers(iq)%parent /= 'air') CYCLE
406  ! !write(*,*) 'vlspltgen 409: iq=',iq
407
408    SELECT CASE(tracers(iq)%iadv)
409      CASE(0); CYCLE
410      CASE(10,14)
411!$OMP BARRIER
412
413#ifdef _ADV_HALLO
414      call vlz_loc(zq,pente_max,zm,mw, &
415            ij_begin+2*iip1,ij_end-2*iip1,iq)
416#endif
417
418!$OMP BARRIER
419      CASE DEFAULT
420      CALL abort_gcm("vlspltgen_p","schema non parallelise",1)
421    END SELECT
422
423  enddo
424  ! !write(*,*) 'vlspltgen_loc 476'
425
426!$OMP BARRIER
427  ! !write(*,*) 'vlspltgen_loc 477'
428!$OMP MASTER
429  call VTb(VTHallo)
430!$OMP END MASTER
431
432   ! call WaitRecvRequest(MyRequest2)
433   ! call WaitSendRequest(MyRequest2)
434!$OMP BARRIER
435   CALL WaitRequest(MyRequest2)
436
437!$OMP MASTER
438  call VTe(VTHallo)
439!$OMP END MASTER
440!$OMP BARRIER
441
442
443  ! !write(*,*) 'vlspltgen_loc 494'
444  call check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 461')
445
446  do iq=1,nqtot
447    IF(tracers(iq)%parent /= 'air') CYCLE
448  ! !write(*,*) 'vlspltgen 449: iq=',iq
449    SELECT CASE(tracers(iq)%iadv)
450      CASE(0); CYCLE
451      CASE(10); call   vly_loc(zq,pente_max,zm,mv,     iq)
452      CASE(14); call vlyqs_loc(zq,pente_max,zm,mv,qsat,iq)
453      CASE DEFAULT
454         CALL abort_gcm("vlspltgen_p","schema non parallelise",1)
455    END SELECT
456
457   enddo !do iq=1,nqtot
458
459  call check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 493')
460
461  do iq=1,nqtot
462    IF(tracers(iq)%parent /= 'air') CYCLE
463  ! !write(*,*) 'vlspltgen 477: iq=',iq
464    SELECT CASE(tracers(iq)%iadv)
465      CASE(0); CYCLE
466      CASE(10); call   vlx_loc(zq,pente_max,zm,mu, &
467            ij_begin,ij_end,iq)
468      CASE(14); call vlxqs_loc(zq,pente_max,zm,mu, &
469            qsat, ij_begin,ij_end,iq)
470      CASE DEFAULT
471      CALL abort_gcm("vlspltgen_p","schema non parallelise",1)
472    END SELECT
473
474   enddo !do iq=1,nqtot
475
476  ! !write(*,*) 'vlspltgen 550: apres derniere serie de call vlx'
477  call check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 521')
478
479  ijb=ij_begin
480  ije=ij_end
481  ! !write(*,*) 'vlspltgen_loc 557'
482!$OMP BARRIER
483
484  ! !write(*,*) 'vlspltgen_loc 559'
485  DO iq=1,nqtot
486   ! !write(*,*) 'vlspltgen_loc 561, iq=',iq
487!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
488    DO l=1,llm
489       DO ij=ijb,ije
490          ! print *,'zq-->',ij,l,iq,zq(ij,l,iq)
491          ! print *,'q-->',ij,l,iq,q(ij,l,iq)
492         q(ij,l,iq)=zq(ij,l,iq)
493       ENDDO
494    ENDDO
495!$OMP END DO NOWAIT
496  ! !write(*,*) 'vlspltgen_loc 575'
497
498!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
499    DO l=1,llm
500       DO ij=ijb,ije-iip1+1,iip1
501          q(ij+iim,l,iq)=q(ij,l,iq)
502       ENDDO
503    ENDDO
504!$OMP END DO NOWAIT
505  ! !write(*,*) 'vlspltgen_loc 583'
506  ENDDO !DO iq=1,nqtot
507
508  call check_isotopes(q,ij_begin,ij_end,'vlspltgen_loc 557')
509
510!$OMP BARRIER
511
512  !c$OMP MASTER
513   ! call WaitSendRequest(MyRequest1)
514   ! call WaitSendRequest(MyRequest2)
515  !c$OMP END MASTER
516  !c$OMP BARRIER
517
518  ! !write(*,*) 'vlspltgen 597: sortie'
519  RETURN
520END SUBROUTINE vlspltgen_loc
Note: See TracBrowser for help on using the repository browser.