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

Last change on this file since 2270 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_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.