LMDZ
qminimum_p.F
Go to the documentation of this file.
1  SUBROUTINE qminimum_p( q,nq,deltap )
3  IMPLICIT none
4 c
5 c -- Objet : Traiter les valeurs trop petites (meme negatives)
6 c pour l'eau vapeur et l'eau liquide
7 c
8 #include "dimensions.h"
9 #include "paramet.h"
10 #include "comvert.h"
11 c
12  INTEGER nq
13  REAL q(ip1jmp1,llm,nq), deltap(ip1jmp1,llm)
14 c
15  INTEGER iq_vap, iq_liq
16  parameter( iq_vap = 1 ) ! indice pour l'eau vapeur
17  parameter( iq_liq = 2 ) ! indice pour l'eau liquide
18  REAL seuil_vap, seuil_liq
19  parameter( seuil_vap = 1.0e-10 ) ! seuil pour l'eau vapeur
20  parameter( seuil_liq = 1.0e-11 ) ! seuil pour l'eau liquide
21 c
22 c NB. ....( Il est souhaitable mais non obligatoire que les valeurs des
23 c parametres seuil_vap, seuil_liq soient pareilles a celles
24 c qui sont utilisees dans la routine ADDFI )
25 c .................................................................
26 c
27  INTEGER i, k, iq
28  REAL zx_defau, zx_abc, zx_pump(ip1jmp1), pompe
29 c
30  REAL SSUM
31  EXTERNAL ssum
32 c
33  INTEGER imprim
34  SAVE imprim
35  DATA imprim /0/
36 c$OMP THREADPRIVATE(imprim)
37  INTEGER ijb,ije
38  INTEGER Index_pump(ip1jmp1)
39  INTEGER nb_pump
40 c
41 c Quand l'eau liquide est trop petite (ou negative), on prend
42 c l'eau vapeur de la meme couche et la convertit en eau liquide
43 c (sans changer la temperature !)
44 c
45 
46  ijb=ij_begin
47  ije=ij_end
48 
49 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
50  DO 1000 k = 1, llm
51  DO 1040 i = ijb, ije
52  if (seuil_liq - q(i,k,iq_liq) .gt. 0.d0 ) then
53  q(i,k,iq_vap) = q(i,k,iq_vap) + q(i,k,iq_liq) - seuil_liq
54  q(i,k,iq_liq) = seuil_liq
55  endif
56  1040 CONTINUE
57  1000 CONTINUE
58 c$OMP END DO NOWAIT
59 c$OMP BARRIER
60 c ---> SYNCHRO OPENMP ICI
61 
62 c
63 c Quand l'eau vapeur est trop faible (ou negative), on complete
64 c le defaut en prennant de l'eau vapeur de la couche au-dessous.
65 c
66  iq = iq_vap
67 c
68  DO k = llm, 2, -1
69 ccc zx_abc = dpres(k) / dpres(k-1)
70 c$OMP DO SCHEDULE(STATIC)
71  DO i = ijb, ije
72  if ( seuil_vap - q(i,k,iq) .gt. 0.d0 ) then
73  q(i,k-1,iq) = q(i,k-1,iq) - ( seuil_vap - q(i,k,iq) ) *
74  & deltap(i,k) / deltap(i,k-1)
75  q(i,k,iq) = seuil_vap
76  endif
77  ENDDO
78 c$OMP END DO NOWAIT
79  ENDDO
80 c$OMP BARRIER
81 c
82 c Quand il s'agit de la premiere couche au-dessus du sol, on
83 c doit imprimer un message d'avertissement (saturation possible).
84 c
85  nb_pump=0
86 c$OMP DO SCHEDULE(STATIC)
87  DO i = ijb, ije
88  zx_pump(i) = amax1( 0.0, seuil_vap - q(i,1,iq) )
89  q(i,1,iq) = amax1( q(i,1,iq), seuil_vap )
90  IF (zx_pump(i) > 0.0) THEN
91  nb_pump = nb_pump+1
92  index_pump(nb_pump)=i
93  ENDIF
94  ENDDO
95 c$OMP END DO
96 ! pompe = SSUM(ije-ijb+1,zx_pump(ijb),1)
97 
98  IF (imprim.LE.100 .AND. nb_pump .GT. 0 ) THEN
99  print *, 'ATT!:on pompe de l eau au sol'
100  DO i = 1, nb_pump
101  imprim = imprim + 1
102  print*,' en ',index_pump(i),zx_pump(index_pump(i))
103  ENDDO
104  ENDIF
105 c
106  RETURN
107  END
!$Header llmm1 INTEGER ip1jmp1
Definition: paramet.h:14
subroutine qminimum_p(q, nq, deltap)
Definition: qminimum_p.F:2
integer, save ij_end
!$Id Turb_fcg_gcssold get_uvd hqturb_gcssold endif!large scale llm day day1 day day1 *dt_toga endif!time annee_ref dt_toga u_toga vq_toga w_prof vq_prof llm day day1 day day1 *dt_dice endif!time annee_ref dt_dice swup_dice vg_dice omega_dice tg_prof vg_profd w_profd omega_profd!do llm!print llm l llm
!$Header!integer nvarmx parameter(nfmx=10, imx=200, jmx=150, lmx=200, nvarmx=1000) real xd(imx
integer, save ij_begin