source: LMDZ5/branches/IPSLCM5A2.1_ISO/libf/phyiso/add_phys_tend.F90 @ 4475

Last change on this file since 4475 was 3331, checked in by acozic, 7 years ago

Add modification for isotopes

  • Property svn:executable set to *
File size: 12.4 KB
Line 
1!
2! $Id: add_phys_tend.F90 2611 2016-08-03 15:41:26Z jyg $
3!
4SUBROUTINE add_phys_tend (zdu,zdv,zdt,zdq,zdql, &
5        zdqi,paprs,text,abortphy,flag_inhib_tend &
6#ifdef ISO
7        ,zdxt,zdxtl,zdxti &
8#endif
9        )
10!======================================================================
11! Ajoute les tendances des variables physiques aux variables
12! d'etat de la dynamique t_seri, q_seri ...
13! On en profite pour faire des tests sur les tendances en question.
14!======================================================================
15
16
17!======================================================================
18! Declarations
19!======================================================================
20
21USE dimphy, ONLY: klon, klev
22USE phys_local_var_mod, ONLY: u_seri, v_seri, ql_seri, qs_seri, q_seri, &
23#ifdef ISO
24                              xtl_seri, xts_seri, xt_seri, &
25#endif
26                              t_seri
27USE phys_state_var_mod, ONLY: ftsol
28USE geometry_mod, ONLY: longitude_deg, latitude_deg
29USE print_control_mod, ONLY: prt_level
30USE cmp_seri_mod
31#ifdef ISO
32  USE infotrac_phy, ONLY: ntraciso ! ajout C Risi pour isos 
33#ifdef ISOVERIF
34  USE isotopes_mod, ONLY: iso_eau
35  USE isotopes_verif_mod, ONLY: iso_verif_aberrant_enc_vect2D, &
36        iso_verif_egalite_vect2D
37#endif   
38#endif
39
40IMPLICIT none
41  include "YOMCST.h"
42  include "clesphys.h"
43
44! Arguments :
45!------------
46REAL zdu(klon,klev),zdv(klon,klev)
47REAL zdt(klon,klev),zdq(klon,klev),zdql(klon,klev),zdqi(klon,klev)
48#ifdef ISO
49REAL zdxt(ntraciso,klon,klev),zdxtl(ntraciso,klon,klev) &
50        ,zdxti(ntraciso,klon,klev)
51integer ixt
52#endif
53REAL paprs(klon,klev+1)
54CHARACTER*(*) text
55INTEGER abortphy
56INTEGER flag_inhib_tend ! if flag_inhib_tend != 0, tendencies are not added
57
58! Local :
59!--------
60REAL zt,zq
61#ifdef ISO
62REAL zxt(ntraciso)
63real qprec(klon,klev)
64REAL zxt_int(ntraciso), zxtp_int(ntraciso), zxtp(ntraciso,klev),zxt_new
65#endif
66REAL zq_int, zqp_int, zq_new
67
68REAL zqp(klev)
69
70INTEGER i, k,j
71INTEGER jadrs(klon*klev), jbad
72INTEGER jqadrs(klon*klev), jqbad
73INTEGER kadrs(klon*klev)
74INTEGER kqadrs(klon*klev)
75
76LOGICAL done(klon)
77
78integer debug_level
79logical, save :: first=.true.
80!$OMP THREADPRIVATE(first)
81INTEGER, SAVE :: itap
82!$OMP THREADPRIVATE(itap)
83!======================================================================
84! Initialisations
85
86     IF (prt_level >= 5) then
87        write (*,*) "In add_phys_tend, after ",text
88        call flush(0) ! C Risi: attention, on a rajouté (0)
89     end if
90
91     ! if flag_inhib_tend != 0, tendencies are not added
92     IF (flag_inhib_tend /= 0) then
93        ! If requiered, diagnostics are shown
94        IF (flag_inhib_tend > 0) then
95           ! print some diagnostics if xxx_seri have changed
96           call cmp_seri(flag_inhib_tend,text)
97        END IF
98        RETURN ! on n ajoute pas les tendance
99     END IF
100
101     IF (abortphy==1) RETURN ! on n ajoute pas les tendance si le modele
102                              ! a deja plante.
103
104     debug_level=10
105     if (first) then
106        itap=0
107        first=.false.
108     endif
109! Incrementer le compteur de la physique
110     itap   = itap + 1
111!======================================================================
112! Ajout des tendances sur le vent et l'eau liquide
113!======================================================================
114
115     u_seri(:,:)=u_seri(:,:)+zdu(:,:)
116     v_seri(:,:)=v_seri(:,:)+zdv(:,:)
117     ql_seri(:,:)=ql_seri(:,:)+zdql(:,:)
118     qs_seri(:,:)=qs_seri(:,:)+zdqi(:,:)
119#ifdef ISO
120     xtl_seri(:,:,:)=xtl_seri(:,:,:)+zdxtl(:,:,:)
121     xts_seri(:,:,:)=xts_seri(:,:,:)+zdxti(:,:,:) 
122#endif
123
124!======================================================================
125! On ajoute les tendances de la temperature et de la vapeur d'eau
126! en verifiant que ca ne part pas dans les choux
127!======================================================================
128
129      jbad=0
130      jqbad=0
131      DO k = 1, klev
132         DO i = 1, klon
133            zt=t_seri(i,k)+zdt(i,k)
134            zq=q_seri(i,k)+zdq(i,k)
135#ifdef ISO
136            do ixt=1,ntraciso   
137              zxt(ixt)=xt_seri(ixt,i,k)+zdxt(ixt,i,k)
138            enddo !do ixt=1,ntraciso
139            qprec(i,k)=q_seri(i,k)
140#endif
141            IF ( zt>370. .or. zt<130. .or. abs(zdt(i,k))>50. ) then
142            jbad = jbad + 1
143            jadrs(jbad) = i
144            kadrs(jbad) = k
145            ENDIF
146            IF ( zq<0. .or. zq>0.1 .or. abs(zdq(i,k))>1.e-2 ) then
147            jqbad = jqbad + 1
148            jqadrs(jqbad) = i
149            kqadrs(jqbad) = k
150            ENDIF
151            t_seri(i,k)=zt
152            q_seri(i,k)=zq
153#ifdef ISO           
154            do ixt=1,ntraciso   
155              xt_seri(ixt,i,k)=zxt(ixt)
156            enddo !do ixt=1,ntraciso
157#endif
158         ENDDO
159      ENDDO
160
161#ifdef ISO
162#ifdef ISOVERIF
163        if (iso_eau.gt.0) then
164          call iso_verif_egalite_vect2D( &
165                xt_seri,q_seri, &
166                'add_phys_tend 122'//text,ntraciso,klon,klev)
167          call iso_verif_egalite_vect2D( &
168                xtl_seri,ql_seri, &
169                'add_phys_tend 138'//text,ntraciso,klon,klev)
170         endif !if (iso_eau.gt.0) then
171#endif
172#endif
173
174!=====================================================================================
175! Impression et stop en cas de probleme important
176!=====================================================================================
177
178IF (jbad .GT. 0) THEN
179      DO j = 1, jbad
180         i=jadrs(j)
181         if(prt_level.ge.debug_level) THEN
182          print*,'PLANTAGE POUR LE POINT i lon lat =',&
183                 i,longitude_deg(i),latitude_deg(i),text
184          print*,'l    T     dT       Q     dQ    '
185          DO k = 1, klev
186             write(*,'(i3,2f14.4,2e14.2)') k,t_seri(i,k),zdt(i,k),q_seri(i,k),zdq(i,k)
187          ENDDO
188          call print_debug_phys(i,debug_level,text)
189         endif
190      ENDDO
191ENDIF
192!
193!=====================================================================================
194! Impression, warning et correction en cas de probleme moins important
195!=====================================================================================
196IF (jqbad .GT. 0) THEN
197      done(:) = .false.                         !jyg
198      DO j = 1, jqbad
199        i=jqadrs(j)
200          if(prt_level.ge.debug_level) THEN
201           print*,'WARNING  : EAU POUR LE POINT i lon lat =',&
202                  i,longitude_deg(i),latitude_deg(i),text
203           print*,'l    T     dT       Q     dQ    '
204           DO k = 1, klev
205              write(*,'(i3,2f14.4,2e14.2)') k,t_seri(i,k),zdt(i,k),q_seri(i,k),zdq(i,k)
206           ENDDO
207          endif
208          IF (ok_conserv_q) THEN
209!jyg<20140228 Corrections pour conservation de l'eau
210            IF (.NOT.done(i)) THEN                  !jyg
211              DO k = 1, klev
212                zqp(k) = max(q_seri(i,k),1.e-15)
213#ifdef ISO
214                do ixt=1,ntraciso
215                  zxtp(ixt,k)=xt_seri(ixt,i,k)*max(1.0,1.e-15/qprec(i,k))
216                enddo
217#endif
218              ENDDO
219              zq_int  = 0.
220              zqp_int = 0.
221              DO k = 1, klev
222                zq_int  = zq_int  + q_seri(i,k)*(paprs(i,k)-paprs(i,k+1))/Rg
223                zqp_int = zqp_int + zqp(k)     *(paprs(i,k)-paprs(i,k+1))/Rg
224              ENDDO
225#ifdef ISO
226              do ixt=1,ntraciso
227              zxt_int(ixt)  = 0.
228              zxtp_int(ixt) = 0.
229              DO k = 1, klev
230                zxt_int(ixt)  = zxt_int(ixt)  + xt_seri(ixt,i,k)*(paprs(i,k)-paprs(i,k+1))/Rg
231                zxtp_int(ixt) = zxtp_int(ixt) + zxtp(ixt,k)     *(paprs(i,k)-paprs(i,k+1))/Rg
232              ENDDO
233              enddo
234#endif
235
236              if(prt_level.ge.debug_level) THEN
237               print*,' cas q_seri<1.e-15 i k zq_int zqp_int zq_int/zqp_int :', &
238                                    i, kqadrs(j), zq_int, zqp_int, zq_int/zqp_int
239              endif
240              DO k = 1, klev
241                zq_new = zqp(k)*zq_int/zqp_int
242                zdq(i,k) = zdq(i,k) + zq_new - q_seri(i,k)
243                q_seri(i,k) = zq_new
244#ifdef ISO
245                do ixt=1,ntraciso
246                  zxt_new = zxtp(ixt,k)*zxt_int(ixt)/zxtp_int(ixt)
247                  zdxt(ixt,i,k) = zdxt(ixt,i,k) + zxt_new - xt_seri(ixt,i,k)
248                  xt_seri(ixt,i,k) = zxt_new
249                enddo !ixt=1,ntraciso
250#endif
251              ENDDO
252              done(i) = .true.
253            ENDIF !(.NOT.done(i))
254          ELSE
255!jyg>
256            DO k = 1, klev
257              zq=q_seri(i,k)+zdq(i,k)
258              if (zq.lt.1.e-15) then
259                 if (q_seri(i,k).lt.1.e-15) then
260                  if(prt_level.ge.debug_level) THEN
261                   print*,' cas q_seri<1.e-15 i k q_seri zq zdq :',i,k,q_seri(i,k),zq,zdq(i,k)
262                  endif
263                  q_seri(i,k)=1.e-15
264                  zdq(i,k)=(1.e-15-q_seri(i,k))
265#ifdef ISO
266               do ixt=1,ntraciso     
267                xt_seri(ixt,i,k)=1.e-15*(xt_seri(ixt,i,k)/qprec(i,k))
268                  ! xt_seri(ixt,i,k)=1.e-15*(Rdefault(index_iso(ixt)))
269                  ! zdxt(ixt,i,k)=0.0
270                zdxt(ixt,i,k)=xt_seri(ixt,i,k)*(1.e-15/qprec(i,k)-1)
271               enddo !do ixt=1,ntraciso   
272#endif
273                 endif
274              endif
275!              zq=q_seri(i,k)+zdq(i,k)
276!              if (zq.lt.1.e-15) then
277!                 zdq(i,k)=(1.e-15-q_seri(i,k))
278!              endif
279            ENDDO
280!jyg<20140228
281          ENDIF   !  (ok_conserv_q)
282!jyg>
283      ENDDO ! j = 1, jqbad
284ENDIF
285
286#ifdef ISO
287#ifdef ISOVERIF
288     if (iso_eau.gt.0) then
289        call iso_verif_egalite_vect2D( &
290                xt_seri,q_seri, &
291                        'add_phys_tend 173'//text,ntraciso,klon,klev)
292        call iso_verif_egalite_vect2D( &
293                zdxt,zdq, &
294                        'add_phys_tend 175'//text,ntraciso,klon,klev)
295      endif !if (iso_eau.gt.0) then
296#endif
297#endif
298!
299
300!IM ajout memes tests pour reverifier les jbad, jqbad beg
301      jbad=0
302      jqbad=0
303      DO k = 1, klev
304         DO i = 1, klon
305            IF ( t_seri(i,k)>370. .or. t_seri(i,k)<130. .or. abs(zdt(i,k))>50. ) then
306            jbad = jbad + 1
307            jadrs(jbad) = i
308!            if(prt_level.ge.debug_level) THEN
309!             print*,'cas2 i k t_seri zdt',i,k,t_seri(i,k),zdt(i,k)
310!            endif
311            ENDIF
312            IF ( q_seri(i,k)<0. .or. q_seri(i,k)>0.1 .or. abs(zdq(i,k))>1.e-2 ) then
313            jqbad = jqbad + 1
314            jqadrs(jqbad) = i
315            kqadrs(jqbad) = k
316!            if(prt_level.ge.debug_level) THEN
317!             print*,'cas2 i k q_seri zdq',i,k,q_seri(i,k),zdq(i,k)
318!            endif
319            ENDIF
320         ENDDO
321      ENDDO
322IF (jbad .GT. 0) THEN
323      DO j = 1, jbad
324         i=jadrs(j)
325         k=kadrs(j)
326         if(prt_level.ge.debug_level) THEN
327          print*,'PLANTAGE2 POUR LE POINT i itap lon lat txt jbad zdt t',&
328                 i,itap,longitude_deg(i),latitude_deg(i),text,jbad, &
329       &        zdt(i,k),t_seri(i,k)-zdt(i,k)
330!!!       if(prt_level.ge.10.and.itap.GE.229.and.i.EQ.3027) THEN
331          print*,'l    T     dT       Q     dQ    '
332          DO k = 1, klev
333             write(*,'(i3,2f14.4,2e14.2)') k,t_seri(i,k),zdt(i,k),q_seri(i,k),zdq(i,k)
334          ENDDO
335          call print_debug_phys(i,debug_level,text)
336         endif
337      ENDDO
338ENDIF
339!
340IF (jqbad .GT. 0) THEN
341      DO j = 1, jqbad
342         i=jqadrs(j)
343         k=kqadrs(j)
344         if(prt_level.ge.debug_level) THEN
345          print*,'WARNING  : EAU2 POUR LE POINT i itap lon lat txt jqbad zdq q zdql ql',&
346                 i,itap,longitude_deg(i),latitude_deg(i),text,jqbad,&
347       &        zdq(i,k), q_seri(i,k)-zdq(i,k), zdql(i,k), ql_seri(i,k)-zdql(i,k)
348!!!       if(prt_level.ge.10.and.itap.GE.229.and.i.EQ.3027) THEN
349          print*,'l    T     dT       Q     dQ    '
350          DO k = 1, klev
351            write(*,'(i3,2f14.4,2e14.2)') k,t_seri(i,k),zdt(i,k),q_seri(i,k),zdq(i,k)
352          ENDDO
353          call print_debug_phys(i,debug_level,text)
354         endif
355      ENDDO
356ENDIF
357
358
359!======================================================================
360! Contrôle des min/max pour arrêt du modèle
361! Si le modele est en mode abortphy, on retire les tendances qu'on
362! vient d'ajouter. Pas exactement parce qu'on ne tient pas compte des
363! seuils.
364!======================================================================
365
366      CALL hgardfou(t_seri,ftsol,text,abortphy)
367      IF (abortphy==1) THEN
368        Print*,'ERROR ABORT hgardfou dans ',text
369        u_seri(:,:)=u_seri(:,:)-zdu(:,:)
370        v_seri(:,:)=v_seri(:,:)-zdv(:,:)
371        ql_seri(:,:)=ql_seri(:,:)-zdql(:,:)
372        qs_seri(:,:)=qs_seri(:,:)-zdqi(:,:)
373      ENDIF
374
375
376  RETURN
377END SUBROUTINE add_phys_tend
Note: See TracBrowser for help on using the repository browser.