The TELEMAC-MASCARET system  trunk
bilant.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE bilant
3 ! *****************
4 !
5  &(h,work2,work3,dt,lt,nit,info,
6  & t,agglot,massou,mastr0,mastr2,masten,
7  & mastou,msk,maskel,mesh,
8  & numliq,nfrliq,nptfr,nametrac,flbortra,mass_rain,train,
9  & mastrain)
10 !
11 !***********************************************************************
12 ! BIEF V7P0
13 !***********************************************************************
14 !
15 !brief COMPUTES THE MASS BALANCE FOR THE TRACER.
16 !
17 !history J-M HERVOUET (LNHE) ; C MOULIN (LNH)
18 !+ 10/06/08
19 !+ V5P9
20 !+
21 !
22 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
23 !+ 13/07/2010
24 !+ V6P0
25 !+ Translation of French comments within the FORTRAN sources into
26 !+ English comments
27 !
28 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
29 !+ 21/08/2010
30 !+ V6P0
31 !+ Creation of DOXYGEN tags for automated documentation and
32 !+ cross-referencing of the FORTRAN sources
33 !
34 !history J-M HERVOUET (EDF LAB, LNHE)
35 !+ 30/09/20148
36 !+ V7P0
37 !+ Some ABS put in the relative accuracy formulas because the mass of
38 !+ a tracer can be negative (case of vorticity).
39 !
40 !history J,RIEHME (ADJOINTWARE)
41 !+ November 2016
42 !+ V7P2
43 !+ Replaced EXTERNAL statements to parallel functions / subroutines
44 !+ by the INTERFACE_PARALLEL
45 !
46 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
47 !| AGGLOT |-->| MASS-LUMPING ON TRACER
48 !| DT |-->| TIME-STEP
49 !| FLBORTRA |-->| TRACER FLUXES AT BOUNDARIES
50 !| H |-->| DEPTH AT TIME N+1.
51 !| INFO |-->| LOGICAL, IF YES, PRINTING INFORMATION ON LISTING
52 !| LT,NIT |-->| TIME STEP NUMBER, TOTAL NUMBER OF STEPS.
53 !| MASKEL |-->| MASKING OF ELEMENTS
54 !| | | =1. : NORMAL =0. : MASKED ELEMENT
55 !| MASS_RAIN |<--| MASS OF WATER ADDED BY RAIN OR EVAPORATION
56 !| MASSOU |-->| MASS OF TRACER BROUGTH BY SOURCE TERM
57 !| MASTEN |<--| WATER MASS ENTERED THROUGH BOUNDARIES
58 !| MASTRAIN |<->| TOTAL WATER MASS ENTERED THROUGH BOUNDARIES
59 !| MASTOU |<--| WATER MASS CREATED BY SOURCE TERMS
60 !| MASTR0 |<--| INITIAL TRACER MASS
61 !| MASTR2 |<--| CURRENT TRACER MASS
62 !| MESH |-->| MESH STRUCTURE
63 !| MSK |-->| IF YES, THERE IS MASKED ELEMENTS.
64 !| NAMETRAC |-->| NAMES OF TRACERS
65 !| NFRLIQ |-->| NUMBER OF LIQUID BOUNDARIES
66 !| NPTFR |-->| NUMBER OF BOUNDARY POINTS
67 !| NUMLIQ |-->| NUMBER OF LIQUID BOUNDARIES
68 !| T |-->| TRACER AT TIME T(N+1)
69 !| TRAIN |-->| VALUE OF TRACER IN THE RAIN
70 !| WORK2 |<->| WORK ARRAY
71 !| WORK3 |<->| WORK ARRAY
72 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
73 !
74  USE bief, ex_bilant => bilant
75 !
77  USE interface_parallel, ONLY : p_sum
78  IMPLICIT NONE
79 !
80 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
81 !
82  INTEGER, INTENT(IN) :: LT,NIT,NFRLIQ,NPTFR
83  INTEGER, INTENT(IN) :: NUMLIQ(nptfr)
84  DOUBLE PRECISION, INTENT(IN) :: DT,MASSOU,AGGLOT,MASS_RAIN,TRAIN
85  DOUBLE PRECISION, INTENT(INOUT):: MASTRAIN
86  LOGICAL, INTENT(IN) :: INFO,MSK
87  TYPE(bief_obj), INTENT(INOUT) :: WORK2,WORK3
88  TYPE(bief_obj), INTENT(IN) :: H,T,MASKEL
89  TYPE(bief_obj), INTENT(IN) :: FLBORTRA
90  TYPE(bief_mesh), INTENT(INOUT) :: MESH
91  DOUBLE PRECISION, INTENT(INOUT):: MASTR0,MASTR2,MASTEN,MASTOU
92  CHARACTER(LEN=32), INTENT(IN) :: NAMETRAC
93 !
94 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
95 !
96  INTEGER I,IFRLIQ,IELMT,IELMH
97 !
98  DOUBLE PRECISION ERREUT,PERDUE,FLUXT,MASBOR,RELATI,DENOM,MASTR1
99  DOUBLE PRECISION MASRAI
100 ! 300 IS HERE MAXFRO, THE MAXIMUM NUMBER OF LIQUID BOUNDARIES
101  DOUBLE PRECISION FLT_BOUND(300)
102 !
103  INTRINSIC abs,max
104 !
105 !-----------------------------------------------------------------------
106 !
107  ielmt = t%ELM
108  ielmh = h%ELM
109 !
110 !-----------------------------------------------------------------------
111 !
112 ! COMPATIBLE COMPUTATION OF THE TRACER QUANTITY AT TIME N+1:
113 ! TAKES MASS-LUMPING INTO ACCOUNT BUT REQUIRES AGGLOC=AGGLOT
114 !
115  IF(lt.NE.0) mastr1 = mastr2
116 !
117  CALL vector(work2,'=','MASVEC ',ielmt,
118  & 1.d0-agglot,t,t,t,t,t,t,mesh,msk,maskel)
119 ! H IS GIVEN HERE FOR A DUMMY STRUCTURE
120  CALL vector(work3,'=','MASBAS ',ielmt,
121  & agglot,h,h,h,h,h,h,mesh,msk,maskel)
122 !
123  CALL os('X=X+YZ ',x=work2,y=work3,z=t)
124 !
125  mastr2 = dots(work2,h)
126  IF(ncsize.GT.1) mastr2=p_sum(mastr2)
127 !
128  IF(lt.EQ.0) THEN
129  mastr0 = mastr2
130  mastr1 = mastr2
131  masten = 0.d0
132  mastou = 0.d0
133  mastrain = 0.d0
134  ENDIF
135 !
136 !=======================================================================
137 !
138 ! COMPUTES THE FLUXES (MISSES THE DIFFUSION FLUX,... INVESTIGATE)
139 !
140 !=======================================================================
141 !
142  fluxt=0.d0
143 !
144  IF(lt.GT.0.AND.nfrliq.GT.0) THEN
145  DO ifrliq=1,nfrliq
146  flt_bound(ifrliq)=0.d0
147  ENDDO
148  IF(nptfr.GT.0) THEN
149  DO i=1,nptfr
150 ! NOTE: COULD DEFINE FLUX_BOUNDARIES BETWEEN 0 AND NFRLIQ
151  ifrliq=numliq(i)
152  IF(ifrliq.GT.0) THEN
153 ! FLBORTRA MUST NOT BE ASSEMBLED IN PARALLEL MODE
154  flt_bound(ifrliq)=flt_bound(ifrliq)+flbortra%R(i)
155  ENDIF
156  ENDDO
157  ENDIF
158  IF(ncsize.GT.1) THEN
159  DO ifrliq=1,nfrliq
160  flt_bound(ifrliq)=p_sum(flt_bound(ifrliq))
161  ENDDO
162  ENDIF
163  DO ifrliq=1,nfrliq
164  fluxt=fluxt+flt_bound(ifrliq)
165  ENDDO
166  ENDIF
167 !
168 !=======================================================================
169 !
170 ! COMPUTES THE FLUXES AT THE LIQUID BOUNDARIES
171 !
172  masten = masten - fluxt * dt
173  mastou = mastou + massou
174 !
175 !=======================================================================
176 !
177 ! COMPUTES THE TRACER FLUXES THRU THE WALLS (FLUX LAW)
178 !
179 ! TEMPORARY, TO BE CODED UP
180  masbor = 0.d0
181 !
182 !=======================================================================
183 !
184 ! COMPUTES THE TRACER MASS BROUGHT BY THE RAIN
185 ! MAX(...,0.D0) BECAUSE EVAPORATION IS NOT TAKEN INTO ACCOUNT
186 !
187 ! WILL WORK ONLY IF TRAIN AND RAIN CONSTANT ON ALL THE DOMAIN...
188  masrai = max(mass_rain,0.d0) * train
189  IF(ncsize.GT.1) masrai=p_sum(masrai)
190  mastrain = mastrain + masrai
191 !
192 !=======================================================================
193 !
194 ! COMPUTES THE ERROR ON THE MASS FOR THIS TIMESTEP
195 !
196  erreut = mastr1 + massou + masrai - mastr2 - dt*fluxt
197 !
198 !=======================================================================
199 !
200 ! PRINTOUTS :
201 !
202  IF(info) THEN
203 !
204 !-----------------------------------------------------------------------
205 !
206 ! PRINTOUTS FOR THE TRACER
207 !
208  WRITE(lu,*)
209  WRITE(lu,*) ' BALANCE OF ',
210  & trim(nametrac(1:16)),' (UNIT: ',trim(nametrac(17:32)),' * M3)'
211 !
212  IF(lt.EQ.0) THEN
213  WRITE(lu,2090) mastr0
214  ELSE
215  WRITE(lu,2160) mastr1,mastr2
216  IF(nfrliq.GT.0) THEN
217  DO ifrliq=1,nfrliq
218  WRITE(lu,2110) ifrliq,-flt_bound(ifrliq)
219  ENDDO
220  ENDIF
221  IF(abs(massou).GT.1.d-8) THEN
222  WRITE(lu,2113) massou
223  ENDIF
224  IF(abs(masrai).GT.1.d-8) THEN
225  WRITE(lu,2166) masrai
226  ENDIF
227  WRITE(lu,2165) erreut
228 ! ABS BECAUSE THE MASS OF A TRACER CAN BE NEGATIVE
229 ! EXAMPLE : VORTICITY
230  denom = max(abs(mastr1),abs(mastr2),abs(fluxt*dt),
231  & abs(masrai),abs(massou))
232  IF(denom.GT.1.d-8) THEN
233  erreut = erreut / denom
234  WRITE(lu,2120) erreut
235  ENDIF
236  ENDIF
237 !
238  ENDIF
239 !
240 !-----------------------------------------------------------------------
241 !
242 ! FINAL MASS BALANCE
243 !
244  IF(lt.EQ.nit) THEN
245 !
246  WRITE(lu,*)
247  WRITE(lu,*) ' FINAL BALANCE OF ',
248  & trim(nametrac(1:16)),' (UNIT: ',trim(nametrac(17:32)),' * M3)'
249 !
250  perdue = mastr0+masten+masbor+mastou+mastrain-mastr2
251  denom = max(abs(mastr0),abs(mastr2),abs(masten),
252  & abs(mastou),abs(mastrain))
253  WRITE(lu,2160) mastr0,mastr2
254  IF(abs(masten).GT.1.d-8) WRITE(lu,2161) masten
255  IF(abs(mastou).GT.1.d-8) WRITE(lu,2164) mastou
256  IF(abs(mastrain).GT.1.d-8) WRITE(lu,2166) mastrain
257  WRITE(lu,2165) perdue
258  IF(denom.GT.1.d-8) THEN
259  relati = perdue / denom
260  WRITE(lu,2120) relati
261  ENDIF
262  WRITE(lu,*)
263 !
264  ENDIF
265 !
266 ! END OF THE PRINTOUTS :
267 !
268 !=======================================================================
269 !
270 ! FORMATS :
271 !
272 2090 FORMAT( 5x,'INITIAL QUANTITY OF TRACER :',g16.7)
273 2110 FORMAT( 5x,'BOUNDARY ',1i3,' FLUX: ',g16.7,
274  & ' ( >0 : ENTERING <0 : EXITING )')
275 2113 FORMAT( 5x,'QUANTITY CREATED BY SOURCE TERM : ' , g16.7 )
276 2120 FORMAT( 5x,'RELATIVE ERROR : ',g16.7)
277 2160 FORMAT(/,5x,'INITIAL QUANTITY : ',g16.7,
278  & /,5x,'FINAL QUANTITY : ',g16.7)
279 2161 FORMAT( 5x,'QUANTITY ENTERED THROUGH LIQ. BND.: ',g16.7,
280  & ' ( IF <0 EXIT )')
281 2164 FORMAT( 5x,'QUANTITY CREATED BY SOURCE TERM : ',g16.7)
282 2166 FORMAT( 5x,'MASS BROUGHT BY THE RAIN : ',g16.7)
283 2165 FORMAT( 5x,'TOTAL QUANTITY LOST : ',g16.7)
284 !
285 !=======================================================================
286 !
287  RETURN
288  END
289 
subroutine bilant(H, WORK2, WORK3, DT, LT, NIT, INFO, T, AGGLOT, MASSOU, MASTR0, MASTR2, MASTEN, MASTOU, MSK, MASKEL, MESH, NUMLIQ, NFRLIQ, NPTFR, NAMETRAC, FLBORTRA, MASS_RAIN, TRAIN, MASTRAIN)
Definition: bilant.f:11
double precision function dots(X, Y)
Definition: dots.f:7
subroutine vector(VEC, OP, FORMUL, IELM1, XMUL, F, G, H, U, V, W, MESH, MSK, MASKEL, LEGO, ASSPAR)
Definition: vector.f:7
subroutine os(OP, X, Y, Z, C, IOPT, INFINI, ZERO)
Definition: os.f:7
Definition: bief.f:3