source: LMDZ6/branches/Ocean_skin/libf/dyn3d/qminimum.F @ 5435

Last change on this file since 5435 was 4368, checked in by lguez, 2 years ago

Sync latest trunk changes to Ocean_skin

  • 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.4 KB
RevLine 
[524]1!
2! $Header$
3!
[2270]4      SUBROUTINE qminimum( q,nqtot,deltap )
[524]5
[4368]6      USE infotrac, ONLY: niso, ntiso,iqIsoPha, tracers
7      USE strings_mod, ONLY: strIdx
8      USE readTracFiles_mod, ONLY: addPhase
[524]9      IMPLICIT none
10c
11c  -- Objet : Traiter les valeurs trop petites (meme negatives)
12c             pour l'eau vapeur et l'eau liquide
13c
[2600]14      include "dimensions.h"
15      include "paramet.h"
[524]16c
[2270]17      INTEGER nqtot
18      REAL q(ip1jmp1,llm,nqtot), deltap(ip1jmp1,llm)
[524]19c
[4368]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
[524]24c
25c  NB. ....( Il est souhaitable mais non obligatoire que les valeurs des
26c            parametres seuil_vap, seuil_liq soient pareilles a celles
27c            qui  sont utilisees dans la routine    ADDFI       )
28c     .................................................................
29c
30      INTEGER i, k, iq
31      REAL zx_defau, zx_abc, zx_pump(ip1jmp1), pompe
[2270]32
33      real zx_defau_diag(ip1jmp1,llm,2)
34      real q_follow(ip1jmp1,llm,2)
[524]35c
36      REAL SSUM
37c
38      INTEGER imprim
39      SAVE imprim
40      DATA imprim /0/
[2270]41      !INTEGER ijb,ije
42      !INTEGER Index_pump(ij_end-ij_begin+1)
43      !INTEGER nb_pump
44      INTEGER ixt
[4368]45
46      IF(first) THEN
47         iq_vap = strIdx(tracers(:)%name, addPhase('H2O', 'g'))
48         iq_liq = strIdx(tracers(:)%name, addPhase('H2O', 'l'))
49         first = .FALSE.
50      END IF
[524]51c
52c Quand l'eau liquide est trop petite (ou negative), on prend
53c l'eau vapeur de la meme couche et la convertit en eau liquide
54c (sans changer la temperature !)
55c
[2270]56
[4368]57      call check_isotopes_seq(q,ip1jmp1,'qminimum 52')   
[2270]58
59      zx_defau_diag(:,:,:)=0.0
[2286]60      q_follow(:,:,1:2)=q(:,:,1:2) 
[524]61      DO 1000 k = 1, llm
[1146]62        DO 1040 i = 1, ip1jmp1
63          if (seuil_liq - q(i,k,iq_liq) .gt. 0.d0 ) then
[2270]64
[4368]65              if (niso > 0) zx_defau_diag(i,k,iq_liq)=AMAX1
[2270]66     :               ( seuil_liq - q(i,k,iq_liq), 0.0 )
67
[1146]68             q(i,k,iq_vap) = q(i,k,iq_vap) + q(i,k,iq_liq) - seuil_liq
69             q(i,k,iq_liq) = seuil_liq
70           endif
71 1040   CONTINUE
[524]72 1000 CONTINUE
73c
74c Quand l'eau vapeur est trop faible (ou negative), on complete
75c le defaut en prennant de l'eau vapeur de la couche au-dessous.
76c
77      iq = iq_vap
78c
79      DO k = llm, 2, -1
80ccc      zx_abc = dpres(k) / dpres(k-1)
[1146]81        DO i = 1, ip1jmp1
82          if ( seuil_vap - q(i,k,iq) .gt. 0.d0 ) then
[2270]83
[4368]84            if (niso > 0)
85     &        zx_defau_diag(i,k,iq)=AMAX1( seuil_vap - q(i,k,iq), 0.0 )
[2270]86
[1146]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
[524]92      ENDDO
93c
94c Quand il s'agit de la premiere couche au-dessus du sol, on
95c doit imprimer un message d'avertissement (saturation possible).
96c
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
[2270]111
[2286]112      !write(*,*) 'qminimum 128'
[4368]113      if (niso > 0) then
[2270]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             
[4368]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)
[2270]137               
138              ! et on la retranche en k-1
[4368]139               q(i,k-1,iqIsoPha(ixt,iq_vap))=
140     :            q(i,k-1,iqIsoPha(ixt,iq_vap))
[2270]141     :              -zx_defau_diag(i,k,iq_vap)
142     :              *deltap(i,k)/deltap(i,k-1)
[4368]143     :              *q(i,k-1,iqIsoPha(ixt,iq_vap))
144     :              /q_follow(i,k-1,iq_vap)
[2270]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
[4368]156       call check_isotopes_seq(q,ip1jmp1,'qminimum 168')
[2270]157       
158     
159        ! 3) transfert d'eau de la vapeur au liquide
[2286]160        !write(*,*) 'qminimum 164'
[2270]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             
[4368]166              do ixt=1,ntiso
167               q(i,k,iqIsoPha(ixt,iq_liq))=q(i,k,iqIsoPha(ixt,iq_liq))
[2270]168     :              +zx_defau_diag(i,k,iq_liq)
[4368]169     :              *q(i,k,iqIsoPha(ixt,iq_vap))/q_follow(i,k,iq_vap)
[2270]170              ! et on la retranche à la vapeur en k
[4368]171               q(i,k,iqIsoPha(ixt,iq_vap))=q(i,k,iqIsoPha(ixt,iq_vap))
[2270]172     :              -zx_defau_diag(i,k,iq_liq)
[4368]173     :              *q(i,k,iqIsoPha(ixt,iq_vap))/q_follow(i,k,iq_vap)   
[2270]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
[4368]183       call check_isotopes_seq(q,ip1jmp1,'qminimum 197')
[2270]184
[4368]185      endif !if (niso > 0) then
[2286]186      !write(*,*) 'qminimum 188'
[2270]187     
[524]188c
189      RETURN
190      END
Note: See TracBrowser for help on using the repository browser.