GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: dyn3d/qminimum.F Lines: 27 58 46.6 %
Date: 2023-06-30 12:51:15 Branches: 31 64 48.4 %

Line Branch Exec Source
1
!
2
! $Header$
3
!
4
2017
      SUBROUTINE qminimum( q,nqtot,deltap )
5
6
      USE infotrac, ONLY: niso, ntiso,iqIsoPha, tracers
7
      USE strings_mod, ONLY: strIdx
8
      USE readTracFiles_mod, ONLY: addPhase
9
      IMPLICIT none
10
c
11
c  -- Objet : Traiter les valeurs trop petites (meme negatives)
12
c             pour l'eau vapeur et l'eau liquide
13
c
14
      include "dimensions.h"
15
      include "paramet.h"
16
c
17
      INTEGER nqtot
18
      REAL q(ip1jmp1,llm,nqtot), deltap(ip1jmp1,llm)
19
c
20
      LOGICAL, SAVE :: first=.TRUE.
21
      INTEGER, SAVE :: iq_vap, iq_liq        ! indices pour l'eau vapeur/liquide
22
      REAL, PARAMETER :: seuil_vap = 1.0e-10 ! seuil pour l'eau vapeur
23
      REAL, PARAMETER :: seuil_liq = 1.0e-11 ! seuil pour l'eau liquide
24
c
25
c  NB. ....( Il est souhaitable mais non obligatoire que les valeurs des
26
c            parametres seuil_vap, seuil_liq soient pareilles a celles
27
c            qui  sont utilisees dans la routine    ADDFI       )
28
c     .................................................................
29
c
30
      INTEGER i, k, iq
31
      REAL zx_defau, zx_abc, zx_pump(ip1jmp1), pompe
32
33
      real zx_defau_diag(ip1jmp1,llm,2)
34
      real q_follow(ip1jmp1,llm,2)
35
c
36
      REAL SSUM
37
c
38
      INTEGER imprim
39
      SAVE imprim
40
      DATA imprim /0/
41
      !INTEGER ijb,ije
42
      !INTEGER Index_pump(ij_end-ij_begin+1)
43
      !INTEGER nb_pump
44
      INTEGER ixt
45
46
2017
      IF(first) THEN
47

6
         iq_vap = strIdx(tracers(:)%name, addPhase('H2O', 'g'))
48

6
         iq_liq = strIdx(tracers(:)%name, addPhase('H2O', 'l'))
49
1
         first = .FALSE.
50
      END IF
51
c
52
c Quand l'eau liquide est trop petite (ou negative), on prend
53
c l'eau vapeur de la meme couche et la convertit en eau liquide
54
c (sans changer la temperature !)
55
c
56
57
2017
      call check_isotopes_seq(q,ip1jmp1,'qminimum 52')
58
59
2017
      zx_defau_diag(:,:,:)=0.0
60

171491391
      q_follow(:,:,1:2)=q(:,:,1:2)
61
80680
      DO 1000 k = 1, llm
62
85742670
        DO 1040 i = 1, ip1jmp1
63
85664007
          if (seuil_liq - q(i,k,iq_liq) .gt. 0.d0 ) then
64
65
14094201
              if (niso > 0) zx_defau_diag(i,k,iq_liq)=AMAX1
66
     :               ( seuil_liq - q(i,k,iq_liq), 0.0 )
67
68
14094201
             q(i,k,iq_vap) = q(i,k,iq_vap) + q(i,k,iq_liq) - seuil_liq
69
14094201
             q(i,k,iq_liq) = seuil_liq
70
           endif
71
78663
 1040   CONTINUE
72
2017
 1000 CONTINUE
73
c
74
c Quand l'eau vapeur est trop faible (ou negative), on complete
75
c le defaut en prennant de l'eau vapeur de la couche au-dessous.
76
c
77
2017
      iq = iq_vap
78
c
79
78663
      DO k = llm, 2, -1
80
ccc      zx_abc = dpres(k) / dpres(k-1)
81
83546157
        DO i = 1, ip1jmp1
82
83544140
          if ( seuil_vap - q(i,k,iq) .gt. 0.d0 ) then
83
84
            if (niso > 0)
85
     &        zx_defau_diag(i,k,iq)=AMAX1( seuil_vap - q(i,k,iq), 0.0 )
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
2198530
      DO i = 1, ip1jmp1
98
2196513
         zx_pump(i) = AMAX1( 0.0, seuil_vap - q(i,1,iq) )
99
2198530
         q(i,1,iq)  = AMAX1( q(i,1,iq), seuil_vap )
100
      ENDDO
101
2017
      pompe = SSUM(ip1jmp1,zx_pump,1)
102

2017
      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
2017
      if (niso > 0) 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,ntiso
134
               q(i,k,iqIsoPha(ixt,iq_vap))=q(i,k,iqIsoPha(ixt,iq_vap))
135
     :           +zx_defau_diag(i,k,iq_vap)
136
     :           *q(i,k-1,iqIsoPha(ixt,iq_vap))/q_follow(i,k-1,iq_vap)
137
138
              ! et on la retranche en k-1
139
               q(i,k-1,iqIsoPha(ixt,iq_vap))=
140
     :            q(i,k-1,iqIsoPha(ixt,iq_vap))
141
     :              -zx_defau_diag(i,k,iq_vap)
142
     :              *deltap(i,k)/deltap(i,k-1)
143
     :              *q(i,k-1,iqIsoPha(ixt,iq_vap))
144
     :              /q_follow(i,k-1,iq_vap)
145
146
              enddo !do ixt=1,niso
147
              q_follow(i,k,iq_vap)=   q_follow(i,k,iq_vap)
148
     :               +zx_defau_diag(i,k,iq_vap)
149
              q_follow(i,k-1,iq_vap)=   q_follow(i,k-1,iq_vap)
150
     :               -zx_defau_diag(i,k,iq_vap)
151
     :              *deltap(i,k)/deltap(i,k-1)
152
          endif !if (zx_defau_diag(i,k,iq_vap).gt.0.0) then
153
        enddo !DO i = 1, ip1jmp1
154
       enddo !do k=2,llm
155
156
       call check_isotopes_seq(q,ip1jmp1,'qminimum 168')
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,ntiso
167
               q(i,k,iqIsoPha(ixt,iq_liq))=q(i,k,iqIsoPha(ixt,iq_liq))
168
     :              +zx_defau_diag(i,k,iq_liq)
169
     :              *q(i,k,iqIsoPha(ixt,iq_vap))/q_follow(i,k,iq_vap)
170
              ! et on la retranche à la vapeur en k
171
               q(i,k,iqIsoPha(ixt,iq_vap))=q(i,k,iqIsoPha(ixt,iq_vap))
172
     :              -zx_defau_diag(i,k,iq_liq)
173
     :              *q(i,k,iqIsoPha(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
       call check_isotopes_seq(q,ip1jmp1,'qminimum 197')
184
185
      endif !if (niso > 0) then
186
      !write(*,*) 'qminimum 188'
187
188
c
189
2017
      RETURN
190
      END