The TELEMAC-MASCARET system  trunk
cvsp_integrate_volume.f
Go to the documentation of this file.
1 ! ***********************************************
2  DOUBLE PRECISION FUNCTION cvsp_integrate_volume
3 ! ***********************************************
4 !
5  &(j,i,z_high,z_low,a)
6 !
7 !***********************************************************************
8 ! SISYPHE V7P2 16/05/2017
9 !***********************************************************************
10 !
11 !brief INTEGRATES THE VOLUME OF A FRACTION WITHIN THE
12 !+ VERTICAL SORTING PROFIL BETWEEN 2 DEPTH Z-COORDINATES Z_HIGH & Z_LOW
13 !+
14 !
15 !history UWE MERKEL
16 !+ 2011
17 !+ V6P2
18 !+
19 !
20 !history P. A. TASSI (EDF R&D, LNHE)
21 !+ 12/03/2013
22 !+ V6P3
23 !+ Cleaning, cosmetic
24 !
25 !history UWE MERKEL, R. KOPMANN
26 !+ 2016, 2017
27 !+ V6P3, V7P2
28 !+ improved stability
29 !
30 !history R. KOPMANN
31 !+ 2018
32 !+ V7P2
33 !+ max. number of fractions
34 !
35 !history R. KOPMANN (BAW)
36 !+ 25/02/2019
37 !+ V7P2
38 !+ Removing 1/NSICLA
39 !+ no correction of truncation error moved to new subroutine cvsp_check_mass_bilan
40 !+ no check_f
41 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
42 !| J |<--| INDEX OF A POINT IN MESH
43 !| I |<--| INDEX OF A FRACTION IN VERTICAL SORTING PROFILE
44 !| Z_HIGH |<--| HIGHER DEPTH COORDINATE
45 !| Z_LOW |<--| LOWER DEPTH COORDINATE
46 !| A1...A_NSICLA |<--| INTEGRATED VOLUMES PER FRACTION
47 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
48 !
50  & ex_cvsp_integrate_volume => cvsp_integrate_volume
52  USE cvsp_outputfiles, ONLY: cp
53 !
55  IMPLICIT NONE
56 !
57 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
58 !
59  INTEGER, INTENT(IN) :: J
60  INTEGER, INTENT(IN) :: I
61  DOUBLE PRECISION, INTENT(IN) :: Z_HIGH
62  DOUBLE PRECISION, INTENT(IN) :: Z_LOW
63  DOUBLE PRECISION, INTENT(OUT) :: A(nsicla)
64 !
65 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
66 !
67  DOUBLE PRECISION TEMP,TEMPOLD, DHIG, DLOW, AT, SUMUP, FLOW, FHIG
68  DOUBLE PRECISION TEMP2, TEMP2MAX, SUMUP2,TEMP3, TEMP3MAX, SUMUP3
69  DOUBLE PRECISION CHSUM
70  INTEGER L_CNT, F_CNT, REVCNT, HELPER, LASTCASE, JG
71  INTEGER(KIND=K8) :: MYCASE
72 !
73 !-----------------------------------------------------------------------
74 !
75  jg = j
76  IF (ncsize.GT.1) jg = mesh%KNOLG%I(j)
77 !
78  at = dt*lt/percou
79  sumup = 0.d0
80  sumup2 = 0.d0
81  sumup3 = 0.d0
82  mycase = 0
83 !
84  DO f_cnt = 1, nsicla
85  a(f_cnt) = 0.d0
86  END DO
88  IF ((z_high-z_low).LT.zero) THEN
89  RETURN
90  ENDIF
91 !-----------------------------------------------------------------------
92 ! DOING ALL FRACTIONS
93 !-----------------------------------------------------------------------
94  DO f_cnt = 1, nsicla
95  temp = 0.d0
96  temp2 = 0.d0
97  temp2max = 0.d0
98  temp3 = 0.d0
99  temp3max = 0.d0
100  chsum = 0.d0
101 !-----------------------------------------------------------------------
102 ! GOING THROUGH ALL SECTIONS
103 !-----------------------------------------------------------------------
104  DO l_cnt = 0,(pro_max(j)-2)
105  tempold = temp
106  revcnt = pro_max(j)-l_cnt
107 !-----------------------------------------------------------------------
108 ! DEPTH COORDINATES OF THE SECTION TO CHECK
109 !-----------------------------------------------------------------------
110  dhig = pro_d(j,revcnt,f_cnt)
111  dlow = pro_d(j,revcnt-1,f_cnt)
112 !-----------------------------------------------------------------------
113 ! SORTING PROFILE SECTION TOTALLY INSIDE (CASE ZDDZ)
114 !-----------------------------------------------------------------------
115  IF ( (dhig <= z_high ) .AND.
116  & (dlow >= z_low ) ) THEN
117  flow = pro_f(j,revcnt-1,f_cnt)
118  fhig = pro_f(j,revcnt,f_cnt)
119  mycase = mycase + 1
120  lastcase = 1
121  temp2 = 0.5d0*(fhig+flow)*(dhig-dlow) + temp2
122  temp2max = z_high - dlow
123  DO helper = 1, nsicla
124  chsum = pro_f(j,revcnt, helper) + chsum
125  ENDDO
126  chsum = 1.d0 - chsum
127 !-----------------------------------------------------------------------
128 ! SORTING PROFILE SECTION PARTIALLY LOWER (CASE ZDZD)
129 !-----------------------------------------------------------------------
130  ELSEIF ((dhig <= z_high) .AND.
131  & (dhig > z_low ) .AND.
132  & (dlow < z_low ) ) THEN
133 
134  fhig = pro_f(j,revcnt,f_cnt)
135  flow = pro_f(j,revcnt-1,f_cnt)
136  flow = - ((fhig-flow)/(dhig-dlow))*(dhig-z_low) + fhig
137 !-----------------------------------------------------------------------
138 ! CUT THE SECTION
139 !-----------------------------------------------------------------------
140  dlow = z_low
141  mycase = mycase + 1000
142  lastcase = 2
143  temp3 = 0.5d0*(fhig+flow)*(dhig-dlow) + temp3
144  temp3max = dhig - dlow
145 !-----------------------------------------------------------------------
146 ! SORTING PROFILE SECTION PARTIALLY HIGHER (CASE DZDZ)
147 !-----------------------------------------------------------------------
148 !
149  ELSEIF ((dhig > z_high) .AND.
150  & (dlow >= z_low) .AND.
151  & (dlow < z_high) ) THEN
152  flow = pro_f(j,revcnt-1,f_cnt)
153  fhig = pro_f(j,revcnt,f_cnt)
154  fhig = ((fhig-flow)/(dhig-dlow))*(z_high-dlow) + flow
155 !-----------------------------------------------------------------------
156 !INSERT
157 !-----------------------------------------------------------------------
158 !CUT THE SECTION
159  dhig = z_high
160  mycase = mycase + 1000000
161  lastcase = 3
162 !-----------------------------------------------------------------------
163 ! LAYER TOTALLY INSIDE ONE SECTION (CASE DZZD)
164 !-----------------------------------------------------------------------
165  ELSEIF ((dhig >= z_high) .AND.
166  & (dlow <= z_low) ) THEN
167  fhig =
168  & - (pro_f(j,revcnt,f_cnt)-pro_f(j,revcnt-1,f_cnt)) /
169  & (dhig-dlow) *
170  & (dhig-z_high)
171  & + pro_f(j,revcnt,f_cnt)
172  flow =
173  & - (pro_f(j,revcnt,f_cnt)-pro_f(j,revcnt-1,f_cnt)) /
174  & (dhig-dlow) *
175  & (dhig-z_low)
176  & + pro_f(j,revcnt,f_cnt)
177 !-----------------------------------------------------------------------
178 ! CUT THE SECTION
179 !-----------------------------------------------------------------------
180  dhig = z_high
181  dlow = z_low
182  lastcase = 8
183  mycase = mycase + 100000000
184 !-----------------------------------------------------------------------
185 ! SECTION WITH 0 STRENGTH
186 !-----------------------------------------------------------------------
187  ELSEIF (dhig == dlow) THEN
188  flow = 0.d0
189  fhig = 0.d0
190  mycase = mycase + 1000000000
191  lastcase = 4
192 !A TRUE BUG!
193  ELSEIF (z_low.GE.z_high) THEN
194  flow = 0.d0
195  fhig = 0.d0
196  IF(cp)WRITE(lu,*)'Z_LOW>=Z_HIGH',dhig,dlow,z_high,z_low
197  CALL cvsp_p('./','ZLOHI',jg)
198  mycase = mycase + 1000000000
199  lastcase = 5
200 !A TRUE BUG!
201  ELSEIF (dhig < dlow) THEN
202  flow = 0.d0
203  fhig = 0.d0
204 
205  IF(cp)WRITE(lu,*)'DHIG<=DLOW',j,dhig,dlow,z_high,z_low
206  CALL cvsp_p('./','DLOHI',jg)
207  mycase = mycase + 1000000000
208  lastcase = 6
209 !A SECTION THAT IS NOT INVOLVED / NOT A BUG!!
210  ELSE
211  flow = 0.d0
212  fhig = 0.d0
213  mycase = mycase + 1000000000
214  lastcase = 7
215  ENDIF
216 !-----------------------------------------------------------------------
217 ! TRAPEZOID FORMULA
218 !-----------------------------------------------------------------------
219  temp = 0.5d0*(fhig+flow)*(dhig-dlow) + temp
220 !DEBUG
221  IF (0.5d0*(fhig+flow)*(dhig-dlow) < 0.d0) THEN
222  WRITE(lu,fmt='(A,1X,2(I11,1X),11(G20.10,1X),1X,I11)')
223  & 'INTEGRATE_VOL_ER_TMP:<0:'
224  & ,jg, i, at, fhig,flow,dhig,dlow, dhig-dlow, revcnt,
225  & pro_f(j,revcnt-1,f_cnt),pro_f(j,revcnt,f_cnt),
226  & pro_d(j,revcnt-1,f_cnt),pro_d(j,revcnt,f_cnt),
227  & lastcase
228  CALL cvsp_p('./','IVKT',jg)
229  CALL plante(1)
230  ENDIF
231 !
232  ENDDO !SECTION
233 !-----------------------------------------------------------------------
234 ! ADDING UP FRACTIONS FOR DEBUGGING PURPOSES
235 !-----------------------------------------------------------------------
236  sumup = temp + sumup
237  sumup2 = temp2 + sumup2
238  sumup3 = temp3 + sumup3
239  a(f_cnt) = temp
240  ENDDO !FRACTION
241  cvsp_integrate_volume = a(i)
242 !
243 ! DEBUG
244  IF (cvsp_integrate_volume < 0.d0) THEN
245  CALL cvsp_p('./','IVK0',jg)
246  WRITE(*,fmt='(A,2(I11),14(G20.10))')'INTEGRATE_VOL_ER:<0:'
247  & ,jg, i, at, cvsp_integrate_volume, mycase ,z_high,z_low,
248  & sumup,sumup2,sumup3,chsum,a(1),a(2),a(3),a(4),a(5)
249  CALL plante(1)
250  ENDIF
251 !-----------------------------------------------------------------------
252 ! CHECKSUM OVER ALL FRACTIONS AND LAYERS
253 !-----------------------------------------------------------------------
254  sumup = sumup - abs(z_high-z_low)
255  sumup2 = sumup2 - abs(temp2max)
256  sumup3 = sumup3 - abs(temp3max)
257  chsum = chsum / 5.d0
258 !-----------------------------------------------------------------------
259 ! BEWARE: 1.D-5 IS UP TO 10G OF A 1000KG BUT HIGHER ACCURACY
260 ! LEADS AGAIN TO FLOATING POINT TRUNCATION ERRORS ...
261 !-----------------------------------------------------------------------
262  IF (abs(sumup).GT.1.d-5) THEN
263  IF(cp) CALL cvsp_p('./','IV_E',jg)
264  IF(cp)WRITE(lu,*) 'INTEGRATE VOLUME ACCURRACY!!!',sumup,jg
265  ENDIF
266 !
267 !-----------------------------------------------------------------------
268 !
269  RETURN
270  END FUNCTION cvsp_integrate_volume
double precision function cvsp_integrate_volume(J, I, Z_HIGH, Z_LOW, A)
double precision, dimension(:,:,:), allocatable, target pro_f
double precision, target dt
subroutine cvsp_p(PATH_PRE, FILE_PRE, JG)
Definition: cvsp_p.f:7
integer, dimension(:), allocatable pro_max
double precision, dimension(:,:,:), allocatable, target pro_d
type(bief_mesh), target mesh