source: LMDZ6/trunk/libf/dyn3d/qminimum.F @ 5187

Last change on this file since 5187 was 5183, checked in by dcugnet, 8 weeks ago
  • Remove INCA retro-compatibility with "traceur.def" (containing only water tracers but getting chemical species from an internal INCA routine).
  • The "trac_type" derived type internal to "readTracFiles_mod" is removed because a generic "keys_type" is enough: no explicit key ("%" operator) is needed, even %name.
  • The "trac_type" and "isot_type" derived types are now defined locally in "infotrac" and "infotrac_phy" (and more generally in each context: dynamic, lmdz dynamics, lmdz physics, etc.). The "readTracFiles_mod" module is now only used in these two routines:
    • few internal routines/variables (addPhase, delPhase, new2oldH2O, newHNO3, oldHNO3) are made available through "infotrac" and "infotrac_phy".
    • the "getKey" routine is only used in these two routines to define the explicit keys ("%" operator) of the local derived types "trac_type" and "isot_type". It could be in principle used outside this scope to get tracers parameters (read from "tracer.def") or isotopic parameters (read from "isotopes_params.def" - disabled for now).
  • The fortran parameters file "iso_params_mod.F90" is introduced so that "tnat" and "alpha_ideal" are defined in a single place but used in several. "ltnat1" is no longer hardcoded but defined with the *.def files parameter "tnat1"
  • Few minor changes:
    • use "infotrac_phy" instead of "infotrac" in calfis* because "tracers(:)%isAdvected" is defined in physics only.
    • "isotopes_mod" now ready for several isotopes classes (currently: only H2O)
    • isotopes class name (the name of the parent of the isotopes) is now %name and no longer %parent.
    • improvement of "getKey"
  • 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.5 KB
RevLine 
[524]1!
2! $Header$
3!
[2270]4      SUBROUTINE qminimum( q,nqtot,deltap )
[524]5
[5183]6      USE infotrac, ONLY: niso, ntiso, iqIsoPha, tracers, addPhase
[4143]7      USE strings_mod, ONLY: strIdx
[524]8      IMPLICIT none
9c
10c  -- Objet : Traiter les valeurs trop petites (meme negatives)
11c             pour l'eau vapeur et l'eau liquide
12c
[2600]13      include "dimensions.h"
14      include "paramet.h"
[524]15c
[2270]16      INTEGER nqtot
17      REAL q(ip1jmp1,llm,nqtot), deltap(ip1jmp1,llm)
[524]18c
[4143]19      LOGICAL, SAVE :: first=.TRUE.
20      INTEGER, SAVE :: iq_vap, iq_liq        ! indices pour l'eau vapeur/liquide
21      REAL, PARAMETER :: seuil_vap = 1.0e-10 ! seuil pour l'eau vapeur
22      REAL, PARAMETER :: seuil_liq = 1.0e-11 ! seuil pour l'eau liquide
[524]23c
24c  NB. ....( Il est souhaitable mais non obligatoire que les valeurs des
25c            parametres seuil_vap, seuil_liq soient pareilles a celles
26c            qui  sont utilisees dans la routine    ADDFI       )
27c     .................................................................
28c
[5001]29cDC iq_val and iq_liq are usable for q only, NOT for q_follow
30c   and zx_defau_diag (crash if iq_val/liq==3) => vapor/liquid
31c   water at hardcoded indices 1/2 in these variables
[524]32      INTEGER i, k, iq
33      REAL zx_defau, zx_abc, zx_pump(ip1jmp1), pompe
[2270]34
35      real zx_defau_diag(ip1jmp1,llm,2)
36      real q_follow(ip1jmp1,llm,2)
[524]37c
38      REAL SSUM
39c
40      INTEGER imprim
41      SAVE imprim
42      DATA imprim /0/
[2270]43      !INTEGER ijb,ije
44      !INTEGER Index_pump(ij_end-ij_begin+1)
45      !INTEGER nb_pump
46      INTEGER ixt
[4143]47
48      IF(first) THEN
49         iq_vap = strIdx(tracers(:)%name, addPhase('H2O', 'g'))
50         iq_liq = strIdx(tracers(:)%name, addPhase('H2O', 'l'))
51         first = .FALSE.
52      END IF
[524]53c
54c Quand l'eau liquide est trop petite (ou negative), on prend
55c l'eau vapeur de la meme couche et la convertit en eau liquide
56c (sans changer la temperature !)
57c
[2270]58
[4143]59      call check_isotopes_seq(q,ip1jmp1,'qminimum 52')   
[2270]60
61      zx_defau_diag(:,:,:)=0.0
[5001]62      q_follow(:,:,1)=q(:,:,iq_vap) 
63      q_follow(:,:,2)=q(:,:,iq_liq) 
64      DO k = 1, llm
65        DO i = 1, ip1jmp1
[1146]66          if (seuil_liq - q(i,k,iq_liq) .gt. 0.d0 ) then
[2270]67
[5001]68            if (niso > 0) zx_defau_diag(i,k,2)=AMAX1
[2270]69     :               ( seuil_liq - q(i,k,iq_liq), 0.0 )
70
[5001]71            q(i,k,iq_vap) = q(i,k,iq_vap) + q(i,k,iq_liq) - seuil_liq
72            q(i,k,iq_liq) = seuil_liq
73          endif
74        ENDDO
75      ENDDO
[524]76c
77c Quand l'eau vapeur est trop faible (ou negative), on complete
78c le defaut en prennant de l'eau vapeur de la couche au-dessous.
79c
80      DO k = llm, 2, -1
81ccc      zx_abc = dpres(k) / dpres(k-1)
[1146]82        DO i = 1, ip1jmp1
[5001]83          if ( seuil_vap - q(i,k,iq_vap) .gt. 0.d0 ) then
[2270]84
[5001]85            if (niso > 0) zx_defau_diag(i,k,1)
86     &           = AMAX1( seuil_vap - q(i,k,iq_vap), 0.0 )
[2270]87
[5001]88            q(i,k-1,iq_vap) = q(i,k-1,iq_vap) - (seuil_vap
89     &           -q(i,k,iq_vap)) * deltap(i,k)/deltap(i,k-1)
90            q(i,k,iq_vap)   =  seuil_vap 
91
[1146]92          endif
93        ENDDO
[524]94      ENDDO
[5001]95
[524]96c
97c Quand il s'agit de la premiere couche au-dessus du sol, on
98c doit imprimer un message d'avertissement (saturation possible).
99c
100      DO i = 1, ip1jmp1
[5001]101         zx_pump(i) = AMAX1( 0.0, seuil_vap - q(i,1,iq_vap) )
102         q(i,1,iq_vap)  = AMAX1( q(i,1,iq_vap), seuil_vap )
[524]103      ENDDO
104      pompe = SSUM(ip1jmp1,zx_pump,1)
105      IF (imprim.LE.500 .AND. pompe.GT.0.0) THEN
106         WRITE(6,'(1x,"ATT!:on pompe de l eau au sol",e15.7)') pompe
107         DO i = 1, ip1jmp1
108            IF (zx_pump(i).GT.0.0) THEN
109               imprim = imprim + 1
110               PRINT*,'QMINIMUM:  en ',i,zx_pump(i)
111            ENDIF
112         ENDDO
113      ENDIF
[2270]114
[2286]115      !write(*,*) 'qminimum 128'
[4124]116      if (niso > 0) then
[2270]117      ! CRisi: traiter de même les traceurs d'eau
118      ! Mais il faut les prendre à l'envers pour essayer de conserver la
119      ! masse.
120      ! 1) pompage dans le sol 
121      ! On suppose que ce pompage se fait sans isotopes -> on ne modifie
122      ! rien ici et on croise les doigts pour que ça ne soit pas trop
123      ! génant
124      DO i = 1,ip1jmp1
125        if (zx_pump(i).gt.0.0) then
[5001]126          q_follow(i,1,1)=q_follow(i,1,1)+zx_pump(i)
[2270]127        endif !if (zx_pump(i).gt.0.0) then
128      enddo !DO i = 1,ip1jmp1
129
130      ! 2) transfert de vap vers les couches plus hautes
131      !write(*,*) 'qminimum 139'
132      do k=2,llm
133        DO i = 1,ip1jmp1
[5001]134          if (zx_defau_diag(i,k,1).gt.0.0) then             
[2270]135              ! on ajoute la vapeur en k             
[4143]136              do ixt=1,ntiso
137               q(i,k,iqIsoPha(ixt,iq_vap))=q(i,k,iqIsoPha(ixt,iq_vap))
[5001]138     :           +zx_defau_diag(i,k,1)
139     :           *q(i,k-1,iqIsoPha(ixt,iq_vap))/q_follow(i,k-1,1)
[2270]140               
141              ! et on la retranche en k-1
[4143]142               q(i,k-1,iqIsoPha(ixt,iq_vap))=
143     :            q(i,k-1,iqIsoPha(ixt,iq_vap))
[5001]144     :              -zx_defau_diag(i,k,1)
[2270]145     :              *deltap(i,k)/deltap(i,k-1)
[4143]146     :              *q(i,k-1,iqIsoPha(ixt,iq_vap))
[5001]147     :              /q_follow(i,k-1,1)
[2270]148
149              enddo !do ixt=1,niso
[5001]150              q_follow(i,k,1)=   q_follow(i,k,1)
151     :               +zx_defau_diag(i,k,1)
152              q_follow(i,k-1,1)=   q_follow(i,k-1,1)
153     :               -zx_defau_diag(i,k,1)
[2270]154     :              *deltap(i,k)/deltap(i,k-1)
[5001]155          endif !if (zx_defau_diag(i,k,1).gt.0.0) then
[2270]156        enddo !DO i = 1, ip1jmp1       
157       enddo !do k=2,llm
158
[4143]159       call check_isotopes_seq(q,ip1jmp1,'qminimum 168')
[2270]160       
161     
162        ! 3) transfert d'eau de la vapeur au liquide
[2286]163        !write(*,*) 'qminimum 164'
[2270]164        do k=1,llm
165        DO i = 1,ip1jmp1
[5001]166          if (zx_defau_diag(i,k,2).gt.0.0) then
[2270]167
168              ! on ajoute eau liquide en k en k             
[4143]169              do ixt=1,ntiso
170               q(i,k,iqIsoPha(ixt,iq_liq))=q(i,k,iqIsoPha(ixt,iq_liq))
[5001]171     :              +zx_defau_diag(i,k,2)
172     :              *q(i,k,iqIsoPha(ixt,iq_vap))/q_follow(i,k,1)
[2270]173              ! et on la retranche à la vapeur en k
[4143]174               q(i,k,iqIsoPha(ixt,iq_vap))=q(i,k,iqIsoPha(ixt,iq_vap))
[5001]175     :              -zx_defau_diag(i,k,2)
176     :              *q(i,k,iqIsoPha(ixt,iq_vap))/q_follow(i,k,1)   
[2270]177              enddo !do ixt=1,niso
[5001]178              q_follow(i,k,2)=   q_follow(i,k,2)
179     :               +zx_defau_diag(i,k,2)
180              q_follow(i,k,1)=   q_follow(i,k,1)
181     :               -zx_defau_diag(i,k,2)
182          endif !if (zx_defau_diag(i,k,1).gt.0.0) then
[2270]183        enddo !DO i = 1, ip1jmp1
184       enddo !do k=2,llm 
185
[4143]186       call check_isotopes_seq(q,ip1jmp1,'qminimum 197')
[2270]187
[4124]188      endif !if (niso > 0) then
[2286]189      !write(*,*) 'qminimum 188'
[2270]190     
[524]191c
192      RETURN
193      END
Note: See TracBrowser for help on using the repository browser.