source: LMDZ6/trunk/libf/dyn3d/qminimum.f90 @ 5272

Last change on this file since 5272 was 5272, checked in by abarral, 2 days 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
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.2 KB
RevLine 
[524]1!
2! $Header$
3!
[5246]4SUBROUTINE qminimum( q,nqtot,deltap )
[524]5
[5246]6  USE infotrac, ONLY: niso, ntiso, iqIsoPha, tracers, addPhase
7  USE strings_mod, ONLY: strIdx
[5271]8  USE dimensions_mod, ONLY: iim, jjm, llm, ndm
[5272]9USE paramet_mod_h, ONLY: iip1, iip2, iip3, jjp1, llmp1, llmp2, llmm1, kftd, ip1jm, ip1jmp1, &
10          ip1jmi1, ijp1llm, ijmllm, mvar, jcfil, jcfllm
[5271]11IMPLICIT none
[5246]12  !
13  !  -- Objet : Traiter les valeurs trop petites (meme negatives)
14  !         pour l'eau vapeur et l'eau liquide
15  !
[5271]16
[5272]17
[5246]18  !
19  INTEGER :: nqtot
20  REAL :: q(ip1jmp1,llm,nqtot), deltap(ip1jmp1,llm)
21  !
22  LOGICAL, SAVE :: first=.TRUE.
23  INTEGER, SAVE :: iq_vap, iq_liq        ! indices pour l'eau vapeur/liquide
24  REAL, PARAMETER :: seuil_vap = 1.0e-10 ! seuil pour l'eau vapeur
25  REAL, PARAMETER :: seuil_liq = 1.0e-11 ! seuil pour l'eau liquide
26  !
27  !  NB. ....( Il est souhaitable mais non obligatoire que les valeurs des
28  !        parametres seuil_vap, seuil_liq soient pareilles a celles
29  !        qui  sont utilisees dans la routine    ADDFI       )
30  ! .................................................................
31  !
32  !DC iq_val and iq_liq are usable for q only, NOT for q_follow
33  !   and zx_defau_diag (crash if iq_val/liq==3) => vapor/liquid
34  !   water at hardcoded indices 1/2 in these variables
35  INTEGER :: i, k, iq
36  REAL :: zx_defau, zx_abc, zx_pump(ip1jmp1), pompe
[2270]37
[5246]38  real :: zx_defau_diag(ip1jmp1,llm,2)
39  real :: q_follow(ip1jmp1,llm,2)
40  !
41  REAL :: SSUM
42  !
43  INTEGER :: imprim
44  SAVE imprim
45  DATA imprim /0/
46  ! !INTEGER ijb,ije
47  ! !INTEGER Index_pump(ij_end-ij_begin+1)
48  ! !INTEGER nb_pump
49  INTEGER :: ixt
[4143]50
[5246]51  IF(first) THEN
52     iq_vap = strIdx(tracers(:)%name, addPhase('H2O', 'g'))
53     iq_liq = strIdx(tracers(:)%name, addPhase('H2O', 'l'))
54     first = .FALSE.
55  END IF
56  !
57  ! Quand l'eau liquide est trop petite (ou negative), on prend
58  ! l'eau vapeur de la meme couche et la convertit en eau liquide
59  ! (sans changer la temperature !)
60  !
[2270]61
[5246]62  call check_isotopes_seq(q,ip1jmp1,'qminimum 52')
[2270]63
[5246]64  zx_defau_diag(:,:,:)=0.0
65  q_follow(:,:,1)=q(:,:,iq_vap)
66  q_follow(:,:,2)=q(:,:,iq_liq)
67  DO k = 1, llm
68    DO i = 1, ip1jmp1
69      if (seuil_liq - q(i,k,iq_liq) .gt. 0.d0 ) then
[2270]70
[5246]71        if (niso > 0) zx_defau_diag(i,k,2)=AMAX1 &
72              ( seuil_liq - q(i,k,iq_liq), 0.0 )
[2270]73
[5246]74        q(i,k,iq_vap) = q(i,k,iq_vap) + q(i,k,iq_liq) - seuil_liq
75        q(i,k,iq_liq) = seuil_liq
76      endif
77    ENDDO
78  ENDDO
79  !
80  ! Quand l'eau vapeur est trop faible (ou negative), on complete
81  ! le defaut en prennant de l'eau vapeur de la couche au-dessous.
82  !
83  DO k = llm, 2, -1
84  !cc      zx_abc = dpres(k) / dpres(k-1)
85    DO i = 1, ip1jmp1
86      if ( seuil_vap - q(i,k,iq_vap) .gt. 0.d0 ) then
[2270]87
[5246]88        if (niso > 0) zx_defau_diag(i,k,1) &
89              = AMAX1( seuil_vap - q(i,k,iq_vap), 0.0 )
[2270]90
[5246]91        q(i,k-1,iq_vap) = q(i,k-1,iq_vap) - (seuil_vap &
92              -q(i,k,iq_vap)) * deltap(i,k)/deltap(i,k-1)
93        q(i,k,iq_vap)   =  seuil_vap
[5001]94
[5246]95      endif
96    ENDDO
97  ENDDO
[5001]98
[5246]99  !
100  ! Quand il s'agit de la premiere couche au-dessus du sol, on
101  ! doit imprimer un message d'avertissement (saturation possible).
102  !
103  DO i = 1, ip1jmp1
104     zx_pump(i) = AMAX1( 0.0, seuil_vap - q(i,1,iq_vap) )
105     q(i,1,iq_vap)  = AMAX1( q(i,1,iq_vap), seuil_vap )
106  ENDDO
107  pompe = SSUM(ip1jmp1,zx_pump,1)
108  IF (imprim.LE.500 .AND. pompe.GT.0.0) THEN
109     WRITE(6,'(1x,"ATT!:on pompe de l eau au sol",e15.7)') pompe
110     DO i = 1, ip1jmp1
111        IF (zx_pump(i).GT.0.0) THEN
112           imprim = imprim + 1
113           PRINT*,'QMINIMUM:  en ',i,zx_pump(i)
114        ENDIF
115     ENDDO
116  ENDIF
[2270]117
[5246]118  ! !write(*,*) 'qminimum 128'
119  if (niso > 0) then
120  ! ! CRisi: traiter de même les traceurs d'eau
121  ! ! Mais il faut les prendre à l'envers pour essayer de conserver la
122  ! ! masse.
123  ! ! 1) pompage dans le sol
124  ! ! On suppose que ce pompage se fait sans isotopes -> on ne modifie
125  ! ! rien ici et on croise les doigts pour que ça ne soit pas trop
126  ! ! génant
127  DO i = 1,ip1jmp1
128    if (zx_pump(i).gt.0.0) then
129      q_follow(i,1,1)=q_follow(i,1,1)+zx_pump(i)
130    endif !if (zx_pump(i).gt.0.0) then
131  enddo !DO i = 1,ip1jmp1
[2270]132
[5246]133  ! ! 2) transfert de vap vers les couches plus hautes
134  ! !write(*,*) 'qminimum 139'
135  do k=2,llm
136    DO i = 1,ip1jmp1
137      if (zx_defau_diag(i,k,1).gt.0.0) then
138          ! ! on ajoute la vapeur en k
139          do ixt=1,ntiso
140           q(i,k,iqIsoPha(ixt,iq_vap))=q(i,k,iqIsoPha(ixt,iq_vap)) &
141                 +zx_defau_diag(i,k,1) &
142                 *q(i,k-1,iqIsoPha(ixt,iq_vap))/q_follow(i,k-1,1)
[2270]143
[5246]144          ! ! et on la retranche en k-1
145           q(i,k-1,iqIsoPha(ixt,iq_vap))= &
146                 q(i,k-1,iqIsoPha(ixt,iq_vap)) &
147                 -zx_defau_diag(i,k,1) &
148                 *deltap(i,k)/deltap(i,k-1) &
149                 *q(i,k-1,iqIsoPha(ixt,iq_vap)) &
150                 /q_follow(i,k-1,1)
[2270]151
[5246]152          enddo !do ixt=1,niso
153          q_follow(i,k,1)=   q_follow(i,k,1) &
154                +zx_defau_diag(i,k,1)
155          q_follow(i,k-1,1)=   q_follow(i,k-1,1) &
156                -zx_defau_diag(i,k,1) &
157                *deltap(i,k)/deltap(i,k-1)
158      endif !if (zx_defau_diag(i,k,1).gt.0.0) then
159    enddo !DO i = 1, ip1jmp1
160   enddo !do k=2,llm
[2270]161
[5246]162   call check_isotopes_seq(q,ip1jmp1,'qminimum 168')
[2270]163
164
[5246]165    ! ! 3) transfert d'eau de la vapeur au liquide
166    ! !write(*,*) 'qminimum 164'
167    do k=1,llm
168    DO i = 1,ip1jmp1
169      if (zx_defau_diag(i,k,2).gt.0.0) then
170
171          ! ! on ajoute eau liquide en k en k
172          do ixt=1,ntiso
173           q(i,k,iqIsoPha(ixt,iq_liq))=q(i,k,iqIsoPha(ixt,iq_liq)) &
174                 +zx_defau_diag(i,k,2) &
175                 *q(i,k,iqIsoPha(ixt,iq_vap))/q_follow(i,k,1)
176          ! ! et on la retranche à la vapeur en k
177           q(i,k,iqIsoPha(ixt,iq_vap))=q(i,k,iqIsoPha(ixt,iq_vap)) &
178                 -zx_defau_diag(i,k,2) &
179                 *q(i,k,iqIsoPha(ixt,iq_vap))/q_follow(i,k,1)
180          enddo !do ixt=1,niso
181          q_follow(i,k,2)=   q_follow(i,k,2) &
182                +zx_defau_diag(i,k,2)
183          q_follow(i,k,1)=   q_follow(i,k,1) &
184                -zx_defau_diag(i,k,2)
185      endif !if (zx_defau_diag(i,k,1).gt.0.0) then
186    enddo !DO i = 1, ip1jmp1
187   enddo !do k=2,llm
188
189   call check_isotopes_seq(q,ip1jmp1,'qminimum 197')
190
191  endif !if (niso > 0) then
192  ! !write(*,*) 'qminimum 188'
193
194  !
195  RETURN
196END SUBROUTINE qminimum
Note: See TracBrowser for help on using the repository browser.