source: LMDZ5/trunk/libf/dyn3d/check_isotopes.F @ 2270

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

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

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