LMDZ
check_isotopes.F
Go to the documentation of this file.
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  write(*,*) 'check_isotopes 31: err_msg=',err_msg
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 = 1,ip1jmp1
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 = 1,ip1jmp1
48  enddo !do k=1,llm
49  enddo !do phase=1,nqo
50  enddo !do ixt=1,ntraciso
51 
52  !write(*,*) 'check_isotopes 52'
53  ! verifier que l'eau normale est OK
54  if (use_iso(1)) then
55  ixt=indnum_fn_num(1)
56  do phase=1,nqo
57  iq=iqiso(ixt,phase)
58  do k=1,llm
59  DO i = 1,ip1jmp1
60  if ((abs(q(i,k,phase)-q(i,k,iq)).gt.errmax).and.
61  : (abs((q(i,k,phase)-q(i,k,iq))/
62  : max(max(abs(q(i,k,phase)),abs(q(i,k,iq))),1e-18))
63  : .gt.errmaxrel)) then
64  write(*,*) 'erreur detectee par iso_verif_egalite:'
65  write(*,*) err_msg
66  write(*,*) 'ixt,phase=',ixt,phase
67  write(*,*) 'q,iq,i,k=',q(i,k,iq),iq,i,k
68  write(*,*) 'q(i,k,phase)=',q(i,k,phase)
69  stop
70  endif !if ((abs(q(i,k,phase)-q(i,k,iq)).gt.errmax).and.
71  ! bidouille pour éviter divergence:
72  q(i,k,iq)= q(i,k,phase)
73  enddo ! DO i = 1,ip1jmp1
74  enddo !do k=1,llm
75  enddo ! do phase=1,nqo
76  endif !if (use_iso(1)) then
77 
78  !write(*,*) 'check_isotopes 78'
79  ! verifier que HDO est raisonable
80  if (use_iso(2)) then
81  ixt=indnum_fn_num(2)
82  do phase=1,nqo
83  iq=iqiso(ixt,phase)
84  do k=1,llm
85  DO i = 1,ip1jmp1
86  if (q(i,k,iq).gt.qmin) then
87  deltad=(q(i,k,iq)/q(i,k,phase)/tnat(2)-1)*1000
88  if ((deltad.gt.deltadmax).or.(deltad.lt.deltadmin)) then
89  write(*,*) 'erreur detectee par iso_verif_aberrant:'
90  write(*,*) err_msg
91  write(*,*) 'ixt,phase=',ixt,phase
92  write(*,*) 'q,iq,i,k,=',q(i,k,iq),iq,i,k
93  write(*,*) 'q=',q(i,k,:)
94  write(*,*) 'deltaD=',deltad
95  stop
96  endif !if ((deltaD.gt.deltaDmax).or.(deltaD.lt.deltaDmin)) then
97  endif !if (q(i,k,iq).gt.qmin) then
98  enddo !DO i = 1,ip1jmp1
99  enddo !do k=1,llm
100  enddo ! do phase=1,nqo
101  endif !if (use_iso(2)) then
102 
103  !write(*,*) 'check_isotopes 103'
104  ! verifier que O18 est raisonable
105  if (use_iso(3)) then
106  ixt=indnum_fn_num(3)
107  do phase=1,nqo
108  iq=iqiso(ixt,phase)
109  do k=1,llm
110  DO i = 1,ip1jmp1
111  if (q(i,k,iq).gt.qmin) then
112  deltad=(q(i,k,iq)/q(i,k,phase)/tnat(3)-1)*1000
113  if ((deltad.gt.deltadmax).or.(deltad.lt.deltadmin)) then
114  write(*,*) 'erreur detectee iso_verif_aberrant O18:'
115  write(*,*) err_msg
116  write(*,*) 'ixt,phase=',ixt,phase
117  write(*,*) 'q,iq,i,k,=',q(i,k,phase),iq,i,k
118  write(*,*) 'xt=',q(i,k,:)
119  write(*,*) 'deltaO18=',deltad
120  stop
121  endif !if ((deltaD.gt.deltaDmax).or.(deltaD.lt.deltaDmin)) then
122  endif !if (q(i,k,iq).gt.qmin) then
123  enddo !DO i = 1,ip1jmp1
124  enddo !do k=1,llm
125  enddo ! do phase=1,nqo
126  endif !if (use_iso(2)) then
127 
128 
129  !write(*,*) 'check_isotopes 129'
130  if (ok_isotrac) then
131 
132  if (use_iso(2).and.use_iso(1)) then
133  do izone=1,ntraceurs_zone
134  ixt=index_trac(izone,indnum_fn_num(2))
135  ieau=index_trac(izone,indnum_fn_num(1))
136  do phase=1,nqo
137  iq=iqiso(ixt,phase)
138  iqeau=iqiso(ieau,phase)
139  do k=1,llm
140  DO i = 1,ip1jmp1
141  if (q(i,k,iq).gt.qmin) then
142  deltad=(q(i,k,iq)/q(i,k,iqeau)/tnat(2)-1)*1000
143  if ((deltad.gt.deltadmax).or.
144  & (deltad.lt.deltadmin)) then
145  write(*,*) 'erreur dans iso_verif_aberrant trac:'
146  write(*,*) err_msg
147  write(*,*) 'izone,phase=',izone,phase
148  write(*,*) 'ixt,ieau=',ixt,ieau
149  write(*,*) 'q,iq,i,k,=',q(i,k,iq),iq,i,k
150  write(*,*) 'deltaD=',deltad
151  stop
152  endif !if ((deltaD.gt.deltaDmax).or.
153  endif !if (q(i,k,iq).gt.qmin) then
154  enddo !DO i = 1,ip1jmp1
155  enddo ! do k=1,llm
156  enddo ! do phase=1,nqo
157  enddo !do izone=1,ntraceurs_zone
158  endif !if (use_iso(2).and.use_iso(1)) then
159 
160  do iiso=1,niso
161  do phase=1,nqo
162  iq=iqiso(iiso,phase)
163  do k=1,llm
164  DO i = 1,ip1jmp1
165  xtractot=0.0
166  xiiso=q(i,k,iq)
167  do izone=1,ntraceurs_zone
168  iq=iqiso(index_trac(izone,iiso),phase)
169  xtractot=xtractot+ q(i,k,iq)
170  enddo !do izone=1,ntraceurs_zone
171  if ((abs(xtractot-xiiso).gt.errmax).and.
172  : (abs(xtractot-xiiso)/
173  : max(max(abs(xtractot),abs(xiiso)),1e-18)
174  : .gt.errmaxrel)) then
175  write(*,*) 'erreur detectee par iso_verif_traceurs:'
176  write(*,*) err_msg
177  write(*,*) 'iiso,phase=',iiso,phase
178  write(*,*) 'i,k,=',i,k
179  write(*,*) 'q(i,k,:)=',q(i,k,:)
180  stop
181  endif !if ((abs(q(i,k,phase)-q(i,k,iq)).gt.errmax).and.
182 
183  ! bidouille pour éviter divergence:
184  if (abs(xtractot).gt.ridicule) then
185  do izone=1,ntraceurs_zone
186  ixt=index_trac(izone,iiso)
187  q(i,k,iq)=q(i,k,iq)/xtractot*xiiso
188  enddo !do izone=1,ntraceurs_zone
189  endif !if ((abs(xtractot).gt.ridicule) then
190  enddo !DO i = 1,ip1jmp1
191  enddo !do k=1,llm
192  enddo !do phase=1,nqo
193  enddo !do iiso=1,niso
194 
195  endif !if (ok_isotrac) then
196 
197  endif ! if (ok_isotopes)
198  !write(*,*) 'check_isotopes 198'
199 
200  end
201 
logical, save ok_isotrac
Definition: infotrac.F90:44
integer, save ntraceurs_zone
Definition: infotrac.F90:56
real, dimension(niso_possibles), save tnat
Definition: infotrac.F90:47
!$Id Turb_fcg_gcssold get_uvd hqturb_gcssold endif!large scale llm day day1 day day1 *dt_toga endif!time annee_ref dt_toga u_toga vq_toga w_prof vq_prof llm day day1 day day1 *dt_dice endif!time annee_ref dt_dice swup_dice vg_dice omega_dice tg_prof vg_profd w_profd omega_profd!do llm!print llm l llm
integer, dimension(:,:), allocatable, save index_trac
Definition: infotrac.F90:55
integer, save nqtot
Definition: infotrac.F90:6
integer, dimension(:,:), allocatable, save iqiso
Definition: infotrac.F90:49
integer, save nqo
Definition: infotrac.F90:8
integer, dimension(niso_possibles), save indnum_fn_num
Definition: infotrac.F90:54
!$Header!integer nvarmx parameter(nfmx=10, imx=200, jmx=150, lmx=200, nvarmx=1000) real xd(imx
logical, dimension(niso_possibles), save use_iso
Definition: infotrac.F90:48
subroutine check_isotopes_seq(q, ip1jmp1, err_msg)
Definition: check_isotopes.F:2
logical, save ok_isotopes
Definition: infotrac.F90:44
integer, save niso
Definition: infotrac.F90:56
integer, save ntraciso
Definition: infotrac.F90:56