LMDZ
qminimum.F
Go to the documentation of this file.
1 !
2 ! $Header$
3 !
4  SUBROUTINE qminimum( q,nqtot,deltap )
5 
7  IMPLICIT none
8 c
9 c -- Objet : Traiter les valeurs trop petites (meme negatives)
10 c pour l'eau vapeur et l'eau liquide
11 c
12 #include "dimensions.h"
13 #include "paramet.h"
14 #include "comvert.h"
15 c
16  INTEGER nqtot
17  REAL q(ip1jmp1,llm,nqtot), deltap(ip1jmp1,llm)
18 c
19  INTEGER iq_vap, iq_liq
20  parameter( iq_vap = 1 ) ! indice pour l'eau vapeur
21  parameter( iq_liq = 2 ) ! indice pour l'eau liquide
22  REAL seuil_vap, seuil_liq
23  parameter( seuil_vap = 1.0e-10 ) ! seuil pour l'eau vapeur
24  parameter( seuil_liq = 1.0e-11 ) ! seuil pour l'eau liquide
25 c
26 c NB. ....( Il est souhaitable mais non obligatoire que les valeurs des
27 c parametres seuil_vap, seuil_liq soient pareilles a celles
28 c qui sont utilisees dans la routine ADDFI )
29 c .................................................................
30 c
31  INTEGER i, k, iq
32  REAL zx_defau, zx_abc, zx_pump(ip1jmp1), pompe
33 
34  real zx_defau_diag(ip1jmp1,llm,2)
35  real q_follow(ip1jmp1,llm,2)
36 c
37  REAL SSUM
38 c
39  INTEGER imprim
40  SAVE imprim
41  DATA imprim /0/
42  !INTEGER ijb,ije
43  !INTEGER Index_pump(ij_end-ij_begin+1)
44  !INTEGER nb_pump
45  INTEGER ixt
46 c
47 c Quand l'eau liquide est trop petite (ou negative), on prend
48 c l'eau vapeur de la meme couche et la convertit en eau liquide
49 c (sans changer la temperature !)
50 c
51 
52  if (ok_iso_verif) then
53  call check_isotopes_seq(q,ip1jmp1,'qminimum 52')
54  endif !if (ok_iso_verif) then
55 
56  zx_defau_diag(:,:,:)=0.0
57  q_follow(:,:,1:2)=q(:,:,1:2)
58  DO 1000 k = 1, llm
59  DO 1040 i = 1, ip1jmp1
60  if (seuil_liq - q(i,k,iq_liq) .gt. 0.d0 ) then
61 
62  if (ok_isotopes) then
63  zx_defau_diag(i,k,iq_liq)=amax1
64  : ( seuil_liq - q(i,k,iq_liq), 0.0 )
65  endif !if (ok_isotopes) then
66 
67  q(i,k,iq_vap) = q(i,k,iq_vap) + q(i,k,iq_liq) - seuil_liq
68  q(i,k,iq_liq) = seuil_liq
69  endif
70  1040 CONTINUE
71  1000 CONTINUE
72 c
73 c Quand l'eau vapeur est trop faible (ou negative), on complete
74 c le defaut en prennant de l'eau vapeur de la couche au-dessous.
75 c
76  iq = iq_vap
77 c
78  DO k = llm, 2, -1
79 ccc zx_abc = dpres(k) / dpres(k-1)
80  DO i = 1, ip1jmp1
81  if ( seuil_vap - q(i,k,iq) .gt. 0.d0 ) then
82 
83  if (ok_isotopes) then
84  zx_defau_diag(i,k,iq)=amax1( seuil_vap - q(i,k,iq), 0.0 )
85  endif !if (ok_isotopes) then
86 
87  q(i,k-1,iq) = q(i,k-1,iq) - ( seuil_vap - q(i,k,iq) ) *
88  & deltap(i,k) / deltap(i,k-1)
89  q(i,k,iq) = seuil_vap
90  endif
91  ENDDO
92  ENDDO
93 c
94 c Quand il s'agit de la premiere couche au-dessus du sol, on
95 c doit imprimer un message d'avertissement (saturation possible).
96 c
97  DO i = 1, ip1jmp1
98  zx_pump(i) = amax1( 0.0, seuil_vap - q(i,1,iq) )
99  q(i,1,iq) = amax1( q(i,1,iq), seuil_vap )
100  ENDDO
101  pompe = ssum(ip1jmp1,zx_pump,1)
102  IF (imprim.LE.500 .AND. pompe.GT.0.0) THEN
103  WRITE(6,'(1x,"ATT!:on pompe de l eau au sol",e15.7)') pompe
104  DO i = 1, ip1jmp1
105  IF (zx_pump(i).GT.0.0) THEN
106  imprim = imprim + 1
107  print*,'QMINIMUM: en ',i,zx_pump(i)
108  ENDIF
109  ENDDO
110  ENDIF
111 
112  !write(*,*) 'qminimum 128'
113  if (ok_isotopes) then
114  ! CRisi: traiter de même les traceurs d'eau
115  ! Mais il faut les prendre à l'envers pour essayer de conserver la
116  ! masse.
117  ! 1) pompage dans le sol
118  ! On suppose que ce pompage se fait sans isotopes -> on ne modifie
119  ! rien ici et on croise les doigts pour que ça ne soit pas trop
120  ! génant
121  DO i = 1,ip1jmp1
122  if (zx_pump(i).gt.0.0) then
123  q_follow(i,1,iq_vap)=q_follow(i,1,iq_vap)+zx_pump(i)
124  endif !if (zx_pump(i).gt.0.0) then
125  enddo !DO i = 1,ip1jmp1
126 
127  ! 2) transfert de vap vers les couches plus hautes
128  !write(*,*) 'qminimum 139'
129  do k=2,llm
130  DO i = 1,ip1jmp1
131  if (zx_defau_diag(i,k,iq_vap).gt.0.0) then
132  ! on ajoute la vapeur en k
133  do ixt=1,ntraciso
134  q(i,k,iqiso(ixt,iq_vap))=q(i,k,iqiso(ixt,iq_vap))
135  : +zx_defau_diag(i,k,iq_vap)
136  : *q(i,k-1,iqiso(ixt,iq_vap))/q_follow(i,k-1,iq_vap)
137 
138  ! et on la retranche en k-1
139  q(i,k-1,iqiso(ixt,iq_vap))=q(i,k-1,iqiso(ixt,iq_vap))
140  : -zx_defau_diag(i,k,iq_vap)
141  : *deltap(i,k)/deltap(i,k-1)
142  : *q(i,k-1,iqiso(ixt,iq_vap))/q_follow(i,k-1,iq_vap)
143 
144  enddo !do ixt=1,niso
145  q_follow(i,k,iq_vap)= q_follow(i,k,iq_vap)
146  : +zx_defau_diag(i,k,iq_vap)
147  q_follow(i,k-1,iq_vap)= q_follow(i,k-1,iq_vap)
148  : -zx_defau_diag(i,k,iq_vap)
149  : *deltap(i,k)/deltap(i,k-1)
150  endif !if (zx_defau_diag(i,k,iq_vap).gt.0.0) then
151  enddo !DO i = 1, ip1jmp1
152  enddo !do k=2,llm
153 
154  if (ok_iso_verif) then
155  call check_isotopes_seq(q,ip1jmp1,'qminimum 168')
156  endif !if (ok_iso_verif) then
157 
158 
159  ! 3) transfert d'eau de la vapeur au liquide
160  !write(*,*) 'qminimum 164'
161  do k=1,llm
162  DO i = 1,ip1jmp1
163  if (zx_defau_diag(i,k,iq_liq).gt.0.0) then
164 
165  ! on ajoute eau liquide en k en k
166  do ixt=1,ntraciso
167  q(i,k,iqiso(ixt,iq_liq))=q(i,k,iqiso(ixt,iq_liq))
168  : +zx_defau_diag(i,k,iq_liq)
169  : *q(i,k,iqiso(ixt,iq_vap))/q_follow(i,k,iq_vap)
170  ! et on la retranche à la vapeur en k
171  q(i,k,iqiso(ixt,iq_vap))=q(i,k,iqiso(ixt,iq_vap))
172  : -zx_defau_diag(i,k,iq_liq)
173  : *q(i,k,iqiso(ixt,iq_vap))/q_follow(i,k,iq_vap)
174  enddo !do ixt=1,niso
175  q_follow(i,k,iq_liq)= q_follow(i,k,iq_liq)
176  : +zx_defau_diag(i,k,iq_liq)
177  q_follow(i,k,iq_vap)= q_follow(i,k,iq_vap)
178  : -zx_defau_diag(i,k,iq_liq)
179  endif !if (zx_defau_diag(i,k,iq_vap).gt.0.0) then
180  enddo !DO i = 1, ip1jmp1
181  enddo !do k=2,llm
182 
183  if (ok_iso_verif) then
184  call check_isotopes_seq(q,ip1jmp1,'qminimum 197')
185  endif !if (ok_iso_verif) then
186 
187  endif !if (ok_isotopes) then
188  !write(*,*) 'qminimum 188'
189 
190 c
191  RETURN
192  END
!$Header llmm1 INTEGER ip1jmp1
Definition: paramet.h:14
logical, save ok_iso_verif
Definition: infotrac.F90:44
!$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
integer, dimension(:,:), allocatable, save iqiso
Definition: infotrac.F90:49
subroutine qminimum(q, nqtot, deltap)
Definition: qminimum.F:5
!$Header!integer nvarmx parameter(nfmx=10, imx=200, jmx=150, lmx=200, nvarmx=1000) real xd(imx
subroutine check_isotopes_seq(q, ip1jmp1, err_msg)
Definition: check_isotopes.F:2
logical, save ok_isotopes
Definition: infotrac.F90:44
integer, save ntraciso
Definition: infotrac.F90:56