source: LMDZ5/trunk/libf/dyn3dmem/check_isotopes_loc.F @ 2277

Last change on this file since 2277 was 2270, checked in by crisi, 10 years ago

Adding isotopes in the dynamics and more generally tracers of tracers.
CRisi

File size: 7.3 KB
Line 
1        subroutine check_isotopes(q,ijb,ije,err_msg)
2        USE infotrac
3        USE parallel_lmdz
4        implicit none
5
6#include "dimensions.h"
7
8        ! inputs
9        integer ijb,ije ! peut être local et différent de ijb_u,ije_u, ex: dans qminimum
10        real q(ijb_u:ije_u,llm,nqtot)
11        character*(*) err_msg ! message d''erreur à afficher
12
13        ! locals
14        integer ixt,phase,k,i,iq,iiso,izone,ieau,iqeau
15        real xtractot,xiiso
16        real borne
17        real qmin
18        real errmax ! erreur maximale en absolu.
19        real errmaxrel ! erreur maximale en relatif autorisée
20        real deltaDmax,deltaDmin
21        real ridicule
22        parameter (borne=1e19)
23        parameter (errmax=1e-8)
24        parameter (errmaxrel=1e-3)
25        parameter (qmin=1e-11)
26        parameter (deltaDmax=200.0,deltaDmin=-999.9)
27        parameter (ridicule=1e-12)
28        real deltaD
29
30        if (ok_isotopes) then
31
32        ! verifier que rien n'est NaN
33        do ixt=1,ntraciso
34          do phase=1,nqo
35            iq=iqiso(ixt,phase)
36            do k=1,llm
37              DO i = ijb,ije
38                if ((q(i,k,iq).gt.-borne).and.
39     :            (q(i,k,iq).lt.borne)) then
40                else !if ((x(ixt,i,j).gt.-borne).and.
41                  write(*,*) 'erreur detectee par iso_verif_noNaN:'
42                  write(*,*) err_msg
43                  write(*,*) 'q,i,k,iq=',q(i,k,iq),i,k,iq
44                  write(*,*) 'borne=',borne
45                  stop
46                endif  !if ((x(ixt,i,j).gt.-borne).and.
47              enddo !DO i = ijb,ije
48            enddo !do k=1,llm
49          enddo !do phase=1,nqo
50        enddo !do ixt=1,ntraciso
51
52        ! verifier que l'eau normale est OK
53        if (use_iso(1)) then
54          ixt=indnum_fn_num(1)
55          do phase=1,nqo
56            iq=iqiso(ixt,phase)
57            do k=1,llm
58            DO i = ijb,ije 
59              if ((abs(q(i,k,phase)-q(i,k,iq)).gt.errmax).and.
60     :          (abs((q(i,k,phase)-q(i,k,iq))/
61     :           max(max(abs(q(i,k,phase)),abs(q(i,k,iq))),1e-18))
62     :           .gt.errmaxrel)) then
63                  write(*,*) 'erreur detectee par iso_verif_egalite:'
64                  write(*,*) err_msg
65                  write(*,*) 'ixt,phase=',ixt,phase
66                  write(*,*) 'q,iq,i,k=',q(i,k,iq),iq,i,k
67                  write(*,*) 'q(i,k,phase)=',q(i,k,phase)
68                  stop
69              endif !if ((abs(q(i,k,phase)-q(i,k,iq)).gt.errmax).and.
70              ! bidouille pour éviter divergence:
71              q(i,k,iq)= q(i,k,phase)
72            enddo ! DO i = ijb,ije
73            enddo !do k=1,llm
74          enddo ! do phase=1,nqo
75        endif !if (use_iso(1)) then
76       
77        ! verifier que HDO est raisonable
78        if (use_iso(2)) then
79          ixt=indnum_fn_num(2)
80          do phase=1,nqo
81            iq=iqiso(ixt,phase)
82            do k=1,llm
83            DO i = ijb,ije
84            if (q(i,k,iq).gt.qmin) then
85             deltaD=(q(i,k,iq)/q(i,k,phase)/tnat(2)-1)*1000
86             if ((deltaD.gt.deltaDmax).or.(deltaD.lt.deltaDmin)) then
87                  write(*,*) 'erreur detectee par iso_verif_aberrant:'
88                  write(*,*) err_msg
89                  write(*,*) 'ixt,phase=',ixt,phase
90                  write(*,*) 'q,iq,i,k,=',q(i,k,iq),iq,i,k
91                  write(*,*) 'q=',q(i,k,:)
92                  write(*,*) 'deltaD=',deltaD
93                  stop
94             endif !if ((deltaD.gt.deltaDmax).or.(deltaD.lt.deltaDmin)) then
95            endif !if (q(i,k,iq).gt.qmin) then
96            enddo !DO i = ijb,ije
97            enddo !do k=1,llm
98          enddo ! do phase=1,nqo
99        endif !if (use_iso(2)) then
100
101        ! verifier que O18 est raisonable
102        if (use_iso(3)) then
103          ixt=indnum_fn_num(3)
104          do phase=1,nqo
105            iq=iqiso(ixt,phase)
106            do k=1,llm
107            DO i = ijb,ije
108            if (q(i,k,iq).gt.qmin) then
109             deltaD=(q(i,k,iq)/q(i,k,phase)/tnat(3)-1)*1000
110             if ((deltaD.gt.deltaDmax).or.(deltaD.lt.deltaDmin)) then
111                  write(*,*) 'erreur detectee iso_verif_aberrant O18:'
112                  write(*,*) err_msg
113                  write(*,*) 'ixt,phase=',ixt,phase
114                  write(*,*) 'q,iq,i,k,=',q(i,k,phase),iq,i,k
115                  write(*,*) 'xt=',q(i,k,:)
116                  write(*,*) 'deltaO18=',deltaD
117                  stop
118             endif !if ((deltaD.gt.deltaDmax).or.(deltaD.lt.deltaDmin)) then
119            endif !if (q(i,k,iq).gt.qmin) then
120            enddo !DO i = ijb,ije
121            enddo !do k=1,llm
122          enddo ! do phase=1,nqo
123        endif !if (use_iso(2)) then
124
125
126        if (ok_isotrac) then
127
128          if (use_iso(2).and.use_iso(1)) then
129            do izone=1,ntraceurs_zone
130             ixt=index_trac(izone,indnum_fn_num(2))
131             ieau=index_trac(izone,indnum_fn_num(1))
132             do phase=1,nqo
133               iq=iqiso(ixt,phase)
134               iqeau=iqiso(ieau,phase)
135               do k=1,llm
136                DO i = ijb,ije
137                if (q(i,k,iq).gt.qmin) then
138                 deltaD=(q(i,k,iq)/q(i,k,iqeau)/tnat(2)-1)*1000
139                 if ((deltaD.gt.deltaDmax).or.
140     &                   (deltaD.lt.deltaDmin)) then
141                  write(*,*) 'erreur dans iso_verif_aberrant trac:'
142                  write(*,*) err_msg
143                  write(*,*) 'izone,phase=',izone,phase
144                  write(*,*) 'ixt,ieau=',ixt,ieau
145                  write(*,*) 'q,iq,i,k,=',q(i,k,iq),iq,i,k
146                  write(*,*) 'deltaD=',deltaD
147                  stop
148                 endif !if ((deltaD.gt.deltaDmax).or.
149                endif !if (q(i,k,iq).gt.qmin) then
150                enddo !DO i = ijb,ije
151                enddo  ! do k=1,llm
152              enddo ! do phase=1,nqo   
153            enddo !do izone=1,ntraceurs_zone
154          endif !if (use_iso(2).and.use_iso(1)) then
155
156          do iiso=1,niso
157           do phase=1,nqo
158              iq=iqiso(iiso,phase)
159              do k=1,llm
160                DO i = ijb,ije
161                   xtractot=0.0
162                   xiiso=q(i,k,iq)
163                   do izone=1,ntraceurs_zone
164                      iq=iqiso(index_trac(izone,iiso),phase)
165                      xtractot=xtractot+ q(i,k,iq)
166                   enddo !do izone=1,ntraceurs_zone
167                   if ((abs(xtractot-xiiso).gt.errmax).and.
168     :                  (abs(xtractot-xiiso)/
169     :                  max(max(abs(xtractot),abs(xiiso)),1e-18)
170     :                  .gt.errmaxrel)) then
171                  write(*,*) 'erreur detectee par iso_verif_traceurs:'
172                  write(*,*) err_msg
173                  write(*,*) 'iiso,phase=',iiso,phase
174                  write(*,*) 'i,k,=',i,k
175                  write(*,*) 'q(i,k,:)=',q(i,k,:)
176                  stop
177                 endif !if ((abs(q(i,k,phase)-q(i,k,iq)).gt.errmax).and.
178                 
179                 ! bidouille pour éviter divergence:
180                 if (abs(xtractot).gt.ridicule) then
181                   do izone=1,ntraceurs_zone
182                     ixt=index_trac(izone,iiso)
183                     q(i,k,iq)=q(i,k,iq)/xtractot*xiiso
184                   enddo !do izone=1,ntraceurs_zone               
185                  endif !if ((abs(xtractot).gt.ridicule) then
186                enddo !DO i = ijb,ije
187              enddo !do k=1,llm
188           enddo !do phase=1,nqo
189          enddo !do iiso=1,niso
190
191        endif !if (ok_isotrac) then
192
193        endif ! if (ok_isotopes)
194       
195        end
196
197
Note: See TracBrowser for help on using the repository browser.