source: codes/icosagcm/branches/SATURN_DYNAMICO/LMDZ.COMMON/config/ppsrc/dyn/qminimum_p.f @ 224

Last change on this file since 224 was 224, checked in by ymipsl, 10 years ago
File size: 6.1 KB
Line 
1      SUBROUTINE qminimum_p( q,nq,deltap )
2      USE parallel_lmdz
3      IMPLICIT none
4c
5c  -- Objet : Traiter les valeurs trop petites (meme negatives)
6c             pour l'eau vapeur et l'eau liquide
7c
8!-----------------------------------------------------------------------
9!   INCLUDE 'dimensions.h'
10!
11!   dimensions.h contient les dimensions du modele
12!   ndm est tel que iim=2**ndm
13!-----------------------------------------------------------------------
14
15      INTEGER iim,jjm,llm,ndm
16
17      PARAMETER (iim= 128,jjm=96,llm=64,ndm=1)
18
19!-----------------------------------------------------------------------
20!
21! $Header$
22!
23!
24!  ATTENTION!!!!: ce fichier include est compatible format fixe/format libre
25!                 veillez  n'utiliser que des ! pour les commentaires
26!                 et  bien positionner les & des lignes de continuation
27!                 (les placer en colonne 6 et en colonne 73)
28!
29!
30!-----------------------------------------------------------------------
31!   INCLUDE 'paramet.h'
32
33      INTEGER  iip1,iip2,iip3,jjp1,llmp1,llmp2,llmm1
34      INTEGER  kftd,ip1jm,ip1jmp1,ip1jmi1,ijp1llm
35      INTEGER  ijmllm,mvar
36      INTEGER jcfil,jcfllm
37
38      PARAMETER( iip1= iim+1,iip2=iim+2,iip3=iim+3                       &
39     &    ,jjp1=jjm+1-1/jjm)
40      PARAMETER( llmp1 = llm+1,  llmp2 = llm+2, llmm1 = llm-1 )
41      PARAMETER( kftd  = iim/2 -ndm )
42      PARAMETER( ip1jm  = iip1*jjm,  ip1jmp1= iip1*jjp1 )
43      PARAMETER( ip1jmi1= ip1jm - iip1 )
44      PARAMETER( ijp1llm= ip1jmp1 * llm, ijmllm= ip1jm * llm )
45      PARAMETER( mvar= ip1jmp1*( 2*llm+1) + ijmllm )
46      PARAMETER( jcfil=jjm/2+5, jcfllm=jcfil*llm )
47
48!-----------------------------------------------------------------------
49!
50! $Id: comvert.h 1654 2012-09-24 15:07:18Z aslmd $
51!
52!-----------------------------------------------------------------------
53!   INCLUDE 'comvert.h'
54
55      COMMON/comvertr/ap(llm+1),bp(llm+1),presnivs(llm),dpres(llm),     &
56     &               pa,preff,nivsigs(llm),nivsig(llm+1),               &
57     &               aps(llm),bps(llm),scaleheight,pseudoalt(llm)
58
59      common/comverti/disvert_type, pressure_exner
60
61      real ap     ! hybrid pressure contribution at interlayers
62      real bp     ! hybrid sigma contribution at interlayer
63      real presnivs ! (reference) pressure at mid-layers
64      real dpres
65      real pa     ! reference pressure (Pa) at which hybrid coordinates
66                  ! become purely pressure
67      real preff  ! reference surface pressure (Pa)
68      real nivsigs
69      real nivsig
70      real aps    ! hybrid pressure contribution at mid-layers
71      real bps    ! hybrid sigma contribution at mid-layers
72      real scaleheight ! atmospheric (reference) scale height (km)
73      real pseudoalt ! pseudo-altitude of model levels (km), based on presnivs(),
74                     ! preff and scaleheight
75
76      integer disvert_type ! type of vertical discretization:
77                           ! 1: Earth (default for planet_type==earth),
78                           !     automatic generation
79                           ! 2: Planets (default for planet_type!=earth),
80                           !     using 'z2sig.def' (or 'esasig.def) file
81
82      logical pressure_exner
83!     compute pressure inside layers using Exner function, else use mean
84!     of pressure values at interfaces
85
86 !-----------------------------------------------------------------------
87c
88      INTEGER nq
89      REAL q(ip1jmp1,llm,nq), deltap(ip1jmp1,llm)
90c
91      INTEGER iq_vap, iq_liq
92      PARAMETER ( iq_vap = 1 ) ! indice pour l'eau vapeur
93      PARAMETER ( iq_liq = 2 ) ! indice pour l'eau liquide
94      REAL seuil_vap, seuil_liq
95      PARAMETER ( seuil_vap = 1.0e-10 ) ! seuil pour l'eau vapeur
96      PARAMETER ( seuil_liq = 1.0e-11 ) ! seuil pour l'eau liquide
97c
98c  NB. ....( Il est souhaitable mais non obligatoire que les valeurs des
99c            parametres seuil_vap, seuil_liq soient pareilles a celles 
100c            qui  sont utilisees dans la routine    ADDFI       )
101c     .................................................................
102c
103      INTEGER i, k, iq
104      REAL zx_defau, zx_abc, zx_pump(ip1jmp1), pompe
105c
106      REAL SSUM
107      EXTERNAL SSUM
108c
109      INTEGER imprim
110      SAVE imprim
111      DATA imprim /0/
112c$OMP THREADPRIVATE(imprim)
113      INTEGER ijb,ije
114      INTEGER Index_pump(ip1jmp1)
115      INTEGER nb_pump
116c
117c Quand l'eau liquide est trop petite (ou negative), on prend
118c l'eau vapeur de la meme couche et la convertit en eau liquide
119c (sans changer la temperature !)
120c
121
122      ijb=ij_begin
123      ije=ij_end
124
125c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)       
126      DO 1000 k = 1, llm
127      DO 1040 i = ijb, ije
128            if (seuil_liq - q(i,k,iq_liq) .gt. 0.d0 ) then
129               q(i,k,iq_vap) = q(i,k,iq_vap) + q(i,k,iq_liq) - seuil_liq
130               q(i,k,iq_liq) = seuil_liq
131            endif
132 1040 CONTINUE
133 1000 CONTINUE
134c$OMP END DO NOWAIT
135c$OMP BARRIER
136c --->  SYNCHRO OPENMP ICI
137
138c
139c Quand l'eau vapeur est trop faible (ou negative), on complete
140c le defaut en prennant de l'eau vapeur de la couche au-dessous.
141c
142      iq = iq_vap
143c
144      DO k = llm, 2, -1
145ccc      zx_abc = dpres(k) / dpres(k-1)
146c$OMP DO SCHEDULE(STATIC)
147      DO i = ijb, ije
148         if ( seuil_vap - q(i,k,iq) .gt. 0.d0 ) then
149            q(i,k-1,iq) =  q(i,k-1,iq) - ( seuil_vap - q(i,k,iq) ) *
150     &           deltap(i,k) / deltap(i,k-1)
151            q(i,k,iq)   =  seuil_vap 
152         endif
153      ENDDO
154c$OMP END DO NOWAIT
155      ENDDO
156c$OMP BARRIER
157c
158c Quand il s'agit de la premiere couche au-dessus du sol, on
159c doit imprimer un message d'avertissement (saturation possible).
160c
161      nb_pump=0
162c$OMP DO SCHEDULE(STATIC)
163      DO i = ijb, ije
164         zx_pump(i) = AMAX1( 0.0, seuil_vap - q(i,1,iq) )
165         q(i,1,iq)  = AMAX1( q(i,1,iq), seuil_vap )
166         IF (zx_pump(i) > 0.0) THEN
167            nb_pump = nb_pump+1
168            Index_pump(nb_pump)=i
169         ENDIF
170      ENDDO
171c$OMP END DO 
172!      pompe = SSUM(ije-ijb+1,zx_pump(ijb),1)
173
174      IF (imprim.LE.100 .AND. nb_pump .GT. 0 ) THEN
175         PRINT *, 'ATT!:on pompe de l eau au sol'
176         DO i = 1, nb_pump
177               imprim = imprim + 1
178               PRINT*,'  en ',index_pump(i),zx_pump(index_pump(i))
179         ENDDO
180      ENDIF
181c
182      RETURN
183      END
Note: See TracBrowser for help on using the repository browser.