The TELEMAC-MASCARET system  trunk
cvtrvf_nerd.f
Go to the documentation of this file.
1 ! **********************
2  SUBROUTINE cvtrvf_nerd
3 ! **********************
4 !
5  &(f,fn,fscexp,h,hn,hprop,udel,vdel,dm1,zconv,solsys,
6  & sm,smh,yasmh,smi,yasmi,fbor,masktr,mesh,
7  & t1,t2,t3,t4,t5,t6,t7,ht,dt,entet,
8  & msk,maskel,optsou,limtra,kdir,kddl,nptfr,flbor,
9  & yaflbor,unsv2d,iopt,flbortra,gloseg1,gloseg2,nbor,
10  & flulim,yaflulim,rain,pluie,train,given_flux,flux_given,
11  & nitmax)
12 !
13 !***********************************************************************
14 ! BIEF V7P2
15 !***********************************************************************
16 !
17 !brief NERD advection scheme in 2D.
18 !
19 !warning SEE BELOW FOR DEFINITION OF IOPT1 AND IOPT2, RETRIEVED FROM IOPT
20 !+ IOPT2=1 NOT TREATED HERE, MASS-CONSERVATION WILL BE DOWNGRADED
21 !+ IN THIS CASE (A CORRECT TREATMENT MAY RESULT IN INFINITE F)
22 !+ THE PROGRAM WILL NOT STOP IF IOPT2=1
23 !
24 !history J-M HERVOUET (LNHE)
25 !+ 16/07/2016
26 !+ V7P2
27 !+ First version. Actually the former cvtrvf_pos renamed cvtrvf_nerd.
28 !+ All the part with OPTION = 1 is removed and is now in cvtrvf_eria.
29 !
30 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
31 !| DIFT |-->| LOGICAL, IF YES THERE IS DIFFUSION OF F
32 !| DM1 |-->| THE PIECE-WISE CONSTANT PART OF ADVECTION FIELD
33 !| | | IS DM1*GRAD(ZCONV), SEE SOLSYS.
34 !| DT |-->| TIME STEP
35 !| ENTET |-->| LOGICAL, IF YES INFORMATION IS GIVEN ON MASS
36 !| | | CONSERVATION.
37 !| F |<--| F AT TIME T(N+1)
38 !| FBOR |-->| DIRICHLET CONDITIONS ON F.
39 !| FLBOR |-->| FLUXES AT BOUNDARIES
40 !| FLBORTRA |<->| TRACER FLUXES AT BOUNDARIES
41 !| FLUX_GIVEN |-->| IF GIVEN_FLUX=YES, THE FLUX IS GIVEN IN
42 !| | | GIVEN_FLUX
43 !| FN |-->| F AT TIME T(N)
44 !| FSCEXP |-->| EXPLICIT PART OF THE SOURCE TERM
45 !| | | EQUAL TO ZERO EVERYWHERE BUT ON SOURCES
46 !| | | WHERE THERE IS FSCE - (1-TETAT) FN
47 !| | | SEE DIFSOU
48 !| GIVEN_FLUX |-->| IF GIVEN_FLUX=YES, THE FLUX IS GIVEN IN
49 !| | | GIVEN_FLUX AND WILL NOT BE COMPUTED HERE
50 !| GLOSEG1 |-->| FIRST POINT OF SEGMENTS
51 !| GLOSEG2 |-->| SECOND POINT OF SEGMENTS
52 !| HT |<--| WORK ARRAY (DEPTH GOING FROM HN TO H)
53 !| HPROP |-->| PROPAGATION DEPTH (DONE IN CVDFTR).
54 !| IOPT |-->| OPTIONS FOR COMPUTATION (NUMBER BETWEEN 0 AND 13)
55 !| | | THE TENS (IOPT2, I.E. 0 OR 1):
56 !| | | 0: UCONV OBEYS THE CONTINUITY EQUATION
57 !| | | 1: UCONV DOES NOT OBEY THE CONTINUITY EQUATION
58 !| | | THE UNITS (IOPT1, I.E. 0 TO 3): VARIANT FOR FLUXES
59 !| | | 0: CONSTANT PER ELEMENT = 0
60 !| | | 1: CHI-TUAN PHAM'S CONSTANT
61 !| | | 2: N SCHEME
62 !| | | 3: PSI SCHEME
63 !| KDDL |-->| CONVENTION FOR DEGREE OF FREEDOM
64 !| KDIR |-->| CONVENTION FOR DIRICHLET POINT
65 !| LIMTRA |-->| BOUNDARY CONDITIONS ON BOOUNDARY POINTS
66 !| MASKEL |-->| MASKING OF ELEMENTS
67 !| | | =1. : NORMAL =0. : MASKED ELEMENT
68 !| MESH |-->| MESH STRUCTURE
69 !| MSK |-->| IF YES, THERE IS MASKED ELEMENTS.
70 !| NBOR |-->| GLOBAL NUMBERS OF BOUNDARY POINTS
71 !| NITMAX |-->| MAXIMUM NUMBER OF ITERATIONS
72 !| NPTFR |-->| NUMBER OF BOUNDARY POINTS
73 !| OPTSOU |-->| TYPE OF SOURCES
74 !| | | 1: NORMAL
75 !| | | 2: DIRAC
76 !| PLUIE |-->| RAIN OR EVAPORATION, IN M/S
77 !| RAIN |-->| IF YES: RAIN OR EVAPORATION
78 !| SM |-->| SOURCE TERMS.
79 !| SMH |-->| SOURCE TERM IN CONTINUITY EQUATION
80 !| SMI |-->| IMPLICIT SOURCE TERM
81 !| SOLSYS |-->| 1 OR 2. IF 2 ADVECTION FIELD IS UCONV + DM1*GRAD(ZCONV)
82 !| T1 |<->| WORK BIEF_OBJ STRUCTURE
83 !| T2 |<->| WORK BIEF_OBJ STRUCTURE
84 !| T3 |<->| WORK BIEF_OBJ STRUCTURE
85 !| T4 |<->| WORK BIEF_OBJ STRUCTURE
86 !| T5 |<->| WORK BIEF_OBJ STRUCTURE
87 !| T6 |<->| WORK BIEF_OBJ STRUCTURE
88 !| T7 |<->| WORK BIEF_OBJ STRUCTURE
89 !| TRAIN |-->| VALUE OF TRACER IN THE RAIN
90 !| UDEL |-->| X-COMPONENT OF ADVECTION VELOCITY
91 !| UNSV2D |-->| INVERSE OF V2DPAR
92 !| VDEL |-->| X-COMPONENT OF ADVECTION VELOCITY
93 !| YAFLBOR |-->| IF YES FLBOR IS GIVEN
94 !| YASMH |-->| IF YES, SMH MUST BE TAKEN INTO ACCOUNT
95 !| YASMI |-->| IF YES, SMI MUST BE TAKEN INTO ACCOUNT
96 !| ZCONV |-->| THE PIECE-WISE CONSTANT PART OF ADVECTION FIELD
97 !| | | IS DM1*GRAD(ZCONV), SEE SOLSYS.
98 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
99 !
100  USE bief, ex_cvtrvf_nerd => cvtrvf_nerd
102 !
105 !
106  IMPLICIT NONE
107 !
108 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
109 !
110  INTEGER, INTENT(IN) :: OPTSOU,KDIR,NPTFR,SOLSYS
111  INTEGER, INTENT(IN) :: KDDL,IOPT,NITMAX
112  INTEGER, INTENT(IN) :: GLOSEG1(*),GLOSEG2(*)
113  INTEGER, INTENT(IN) :: NBOR(nptfr)
114  INTEGER, INTENT(INOUT) :: LIMTRA(nptfr)
115 ! NSEG
116  DOUBLE PRECISION, INTENT(IN) :: DT,TRAIN,FLULIM(*)
117  LOGICAL, INTENT(IN) :: YASMH,YAFLBOR,RAIN
118  LOGICAL, INTENT(IN) :: MSK,ENTET,YASMI,YAFLULIM
119  LOGICAL, INTENT(IN) :: FLUX_GIVEN
120  TYPE(bief_obj), INTENT(IN) :: MASKEL,H,HN,DM1,ZCONV
121  TYPE(bief_obj), INTENT(IN) :: UNSV2D,HPROP
122  TYPE(bief_obj), INTENT(INOUT) :: F,SM,HT
123  TYPE(bief_obj), INTENT(IN) :: UDEL,VDEL,FN,SMI,SMH
124  TYPE(bief_obj), INTENT(INOUT) :: FLBORTRA,FBOR
125  TYPE(bief_obj), INTENT(INOUT) :: T1,T2,T3,T4,T5,T6,T7
126  TYPE(bief_obj), INTENT(IN) :: FSCEXP,MASKTR
127  TYPE(bief_obj), INTENT(INOUT) :: FLBOR
128  TYPE(bief_obj), INTENT(IN) :: PLUIE,GIVEN_FLUX
129  TYPE(bief_mesh) :: MESH
130 !
131 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
132 !
133  INTEGER I,IOPT1,IOPT2,NPOIN,IPTFR,I1,I2,NITER,NEWREMAIN
134  INTEGER IR,N,NELEM,NELMAX,REMAIN,NSEG
135 !
136 !-----------------------------------------------------------------------
137 !
138  DOUBLE PRECISION C,CPREV,CINIT,HFL1,HFL2,TET,HSEG1,HSEG2
139  CHARACTER(LEN=16) FORMUL
140  DOUBLE PRECISION, POINTER, DIMENSION(:) :: FXMAT
141  DOUBLE PRECISION, PARAMETER :: TIERS=1.d0/3.d0
142  LOGICAL, PARAMETER :: TESTING = .false.
143  DOUBLE PRECISION, PARAMETER :: EPS_FLUX = 1.d-15
144 !
145 !-----------------------------------------------------------------------
146 !
147  nelem=mesh%NELEM
148  nelmax=mesh%NELMAX
149  nseg=mesh%NSEG
150  npoin=h%DIM1
151 !
152 ! INDIC_CPOS WILL BE A LIST OF SEGMENTS WITH NON ZERO FLUXES
153 !
154  IF(.NOT.deja_cpos) THEN
155  ALLOCATE(indic_cpos(mesh%NSEG))
156  deja_cpos=.true.
157  ENDIF
158 !
159 !-----------------------------------------------------------------------
160 !
161 ! THERE IS PLENTY OF MEMORY AVAILABLE IN A BIEF_MESH STRUCTURE...
162 !
163  fxmat=>mesh%MSEG%X%R(1:nseg)
164 !
165 !-----------------------------------------------------------------------
166 !
167 ! EXTRACTING OPTIONS, AND CONTROL
168 !
169  iopt2=iopt/10
170  iopt1=iopt-10*iopt2
171  IF(iopt1.LT.0.OR.iopt1.GT.3) THEN
172  WRITE(lu,*) 'CVTRVF_NERD: OPTION IOPT1 UNKNOWN: ',iopt1
173  CALL plante(1)
174  stop
175  ENDIF
176  IF(iopt2.NE.0.AND.iopt2.NE.1) THEN
177  WRITE(lu,*) 'CVTRVF_NERD: OPTION IOPT2 UNKNOWN: ',iopt2
178  CALL plante(1)
179  stop
180  ENDIF
181 !
182 !-----------------------------------------------------------------------
183 !
184 ! STARTING AGAIN FROM NON CORRECTED DEPTH
185 !
186  IF(testing) THEN
187  c=1.d99
188  cinit=1.d99
189  DO i=1,npoin
190  c =min(c ,h%R(i))
191  cinit=min(cinit,hn%R(i))
192  ENDDO
193  IF(ncsize.GT.1) THEN
194  c=p_min(c)
195  cinit=p_min(cinit)
196  ENDIF
197  WRITE(lu,*) 'AVANT TRAITEMENT HAUTEURS NEGATIVES, H MIN=',c
198  WRITE(lu,*) 'AVANT TRAITEMENT HAUTEURS NEGATIVES, HN MIN=',cinit
199  ENDIF
200 !
201  CALL cpstvc(h,t1)
202  CALL cpstvc(h,t2)
203  CALL cpstvc(f,t3)
204  CALL cpstvc(h,t4)
205  CALL cpstvc(f,t5)
206  CALL cpstvc(f,t6)
207  CALL cpstvc(h,t7)
208 !
209 ! T2 WILL BE THE ASSEMBLED FLBOR, INITIALISATION TO 0 HERE
210 ! IS USELESS EXCEPT THAT PARCOM MAY ADD UNDEFINED
211 ! NUMBERS (THAT WILL NOT BE USED BUT THAT WILL STOP
212 ! A COMPILER... TOO BAD!)
213  IF(ncsize.GT.1) CALL os('X=0 ',x=t2)
214 !
215 ! OPTIONAL COMPUTATION OF FLUXES AT BOUNDARIES
216 !
217  IF(.NOT.yaflbor) THEN
218 ! MASK=8 FOR LIQUID BOUNDARIES
219  CALL vector(flbor,'=','FLUBDF ',1,1.d0,
220  & hprop,hprop,hprop,
221  & udel , vdel, vdel,mesh,.true.,masktr%ADR(8)%P)
222  ENDIF
223 !
224 ! BOUNDARY FLUXES : ADDING THE ENTERING (NEGATIVE) FLUXES
225 ! FIRST PUTTING FLBOR (BOUNDARY) IN T2 (DOMAIN)
226  CALL osdb( 'X=Y ' ,t2,flbor,flbor,0.d0,mesh)
227 ! ASSEMBLING T2 (FLBOR IS NOT ASSEMBLED)
228  IF(ncsize.GT.1) CALL parcom(t2,2,mesh)
229 ! POSSIBLE CORRECTION OF LIMTRA AND FBOR (LIMTRA HAS BEEN DONE BY
230 ! DIFFIN WITH U.N)
231  DO i=1,mesh%NPTFR
232  n=mesh%NBOR%I(i)
233  IF(limtra(i).EQ.kdir.AND.t2%R(n).GT.0.d0) THEN
234 ! DIRICHLET DECLARED FOR AN EXIT
235  limtra(i)=kddl
236  ELSEIF(limtra(i).EQ.kddl.AND.t2%R(n).LT.0.d0) THEN
237 ! DEGREE OF FREEDOM DECLARED FOR AN ENTRANCE
238 ! IN THIS CASE THE PRESCRIBED VALUE MAY NOT HAVE BEEN GIVEN
239 ! FN IS TAKEN HERE
240  limtra(i)=kdir
241  fbor%R(i)=fn%R(n)
242  ELSE
243 ! INITIALISING FLBORTRA FOR OTHER POINTS
244  flbortra%R(i)=0.d0
245  ENDIF
246  ENDDO
247 !
248 ! COMPUTING FLUXES
249 !
250  IF(.NOT.flux_given) THEN
251  formul='HUGRADP '
252  IF(solsys.EQ.2) formul(8:8)='2'
253 ! COMPUTING FLUXES LEAVING NODES
254  CALL vector(t1,'=',formul,h%ELM,-1.d0,
255  & hprop,dm1,zconv,udel,vdel,vdel,mesh,msk,maskel)
256 ! T1 AS HUGRADP IS NOT USED AS AN ASSEMBLED VECTOR
257 ! BUT TO GET THE NON ASSEMBLED FORM MESH%W
258 ! COMPUTING FLUXES BY SEGMENT (TE1 SUIVI DE FALSE NON UTILISE)
259 ! FXMAT IS NOT ASSEMBLED IN //
260  CALL flux_ef_vf(fxmat,mesh%W%R,mesh%NSEG,nelem,nelmax,
261  & mesh%ELTSEG%I,mesh%ORISEG%I,
262  & mesh%IKLE%I,.true.,iopt1)
263 ! LIMITATION OF FLUXES (IF REQUESTED, E.G. USED BY SISYPHE)
264  IF(yaflulim) THEN
265  DO i=1,mesh%NSEG
266  fxmat(i)=fxmat(i)*flulim(i)
267  ENDDO
268  ENDIF
269  ELSE
270  DO i=1,mesh%NSEG
271  fxmat(i)=given_flux%R(i)
272  ENDDO
273  ENDIF
274 ! INTERFACE SEGMENTS: ONLY ONE OF THE TWINS WILL RECEIVE
275 ! THE ASSEMBLED FLUX
276  IF(ncsize.GT.1) THEN
277  CALL parcom2_seg(fxmat,fxmat,fxmat,mesh%NSEG,1,2,1,mesh,
278  & 1,11)
279  CALL mult_interface_seg(fxmat,mesh%NH_COM_SEG%I,
280  & mesh%NH_COM_SEG%DIM1,
281  & mesh%NB_NEIGHB_SEG,
282  & mesh%NB_NEIGHB_PT_SEG%I,
283  & mesh%LIST_SEND_SEG%I,mesh%NSEG)
284  ENDIF
285 !
286 ! INITIALIZING F
287 !
288  CALL os('X=Y ',x=f,y=fn)
289  CALL os('X=Y ',x=ht,y=hn)
290 !
291 ! ADDING THE POSITIVE SOURCES (SMH IS NATURALLY ASSEMBLED IN //)
292 !
293  IF(yasmh) THEN
294  IF(optsou.EQ.1) THEN
295  DO i=1,npoin
296  IF(smh%R(i).GT.0.d0) THEN
297  ht%R(i)=ht%R(i)+dt*smh%R(i)
298  f%R(i)=f%R(i)+dt/max(ht%R(i),1.d-4)*smh%R(i)*fscexp%R(i)
299  ENDIF
300  ENDDO
301  ELSEIF(optsou.EQ.2) THEN
302  DO i=1,npoin
303  IF(smh%R(i).GT.0.d0) THEN
304  ht%R(i)=ht%R(i)+dt*smh%R(i)*unsv2d%R(i)
305  f%R(i)=f%R(i)+dt/max(ht%R(i),1.d-4)*
306  & unsv2d%R(i)*smh%R(i)*fscexp%R(i)
307  ENDIF
308  ENDDO
309  ENDIF
310  ENDIF
311 !
312 ! RAIN-EVAPORATION: RAIN FIRST, EVAPORATION IN THE END
313 !
314  IF(rain) THEN
315  DO i=1,npoin
316  c=max(pluie%R(i),0.d0)
317  ht%R(i)=ht%R(i)+dt*c
318 ! VALUE IN RAIN
319  f%R(i)=f%R(i)+dt/max(ht%R(i),1.d-4)*c*(train-f%R(i))
320  ENDDO
321  ENDIF
322 !
323  DO iptfr=1,nptfr
324  i=nbor(iptfr)
325  ht%R(i)=ht%R(i)-dt*unsv2d%R(i)*min(t2%R(i),0.d0)
326 ! ENTERING FLUXES OF TRACERS (T2<0)
327 ! THE FINAL DEPTH IS TAKEN
328  IF(limtra(iptfr).EQ.kdir) THEN
329  f%R(i)=f%R(i)-dt/max(ht%R(i),1.d-4)*
330  & unsv2d%R(i)*t2%R(i)*(fbor%R(iptfr)-f%R(i))
331 ! ELSEIF(LIMTRA(IPTFR).EQ.KDDL) THEN
332 ! NOTHING TO DO
333  ENDIF
334  ENDDO
335 !
336 ! FOR OPTIMIZING THE LOOP ON SEGMENTS, ONLY SEGMENTS
337 ! WITH NON ZERO FLUXES WILL BE CONSIDERED, THIS LIST
338 ! WILL BE UPDATED. TO START WITH, ALL FLUXES ASSUMED NON ZERO
339 !
340  remain=nseg
341 !
342  DO i=1,remain
343  indic_cpos(i)=i
344  ENDDO
345 !
346 ! MAXIMUM INITIAL FLUX
347 !
348  cprev=0.d0
349  DO i=1,mesh%NSEG
350  cprev=cprev+abs(fxmat(i))
351  ENDDO
352  IF(ncsize.GT.1) cprev=p_sum(cprev)
353  IF(testing) WRITE(lu,*) 'INITIAL SUM OF FLUXES=',cprev
354  cinit=cprev
355 !
356  niter = 0
357 777 CONTINUE
358  niter = niter + 1
359 !
360  IF(niter.EQ.1) THEN
361  DO i=1,npoin
362  t1%R(i)=0.d0
363  t4%R(i)=ht%R(i)
364  t6%R(i)=f%R(i)
365  t5%R(i)=ht%R(i)*f%R(i)
366  ENDDO
367  IF(ncsize.GT.1) THEN
368  DO iptfr=1,nptir
369  i=mesh%NACHB%I(nbmaxnshare*(iptfr-1)+1)
370 ! AVAILABLE DEPTH AND TRACER QUANTITY ARE SHARED BETWEEN PROCESSORS
371 ! FOR POINTS GIVING WATER, THEY WILL BE CANCELLED LATER
372  ht%R(i)=ht%R(i)*mesh%IFAC%I(i)
373  t5%R(i)=ht%R(i)*f%R(i)
374  ENDDO
375  ENDIF
376  ELSE
377 ! NOT ALL THE POINTS NEED TO BE INITIALISED NOW
378  DO ir=1,remain
379  i=indic_cpos(ir)
380  i1=gloseg1(i)
381  i2=gloseg2(i)
382  t1%R(i1)=0.d0
383  t1%R(i2)=0.d0
384 ! SAVING THE DEPTH AND TRACER
385  t4%R(i1)=ht%R(i1)
386  t4%R(i2)=ht%R(i2)
387  t6%R(i1)=f%R(i1)
388  t6%R(i2)=f%R(i2)
389  t5%R(i1)=ht%R(i1)*f%R(i1)
390  t5%R(i2)=ht%R(i2)*f%R(i2)
391  ENDDO
392 ! CANCELLING INTERFACE POINTS (SOME MAY BE ISOLATED IN A SUBDOMAIN
393 ! AT THE TIP OF AN ACTIVE SEGMENT WHICH IS ELSEWHERE)
394  IF(ncsize.GT.1) THEN
395  DO iptfr=1,nptir
396  i=mesh%NACHB%I(nbmaxnshare*(iptfr-1)+1)
397  t1%R(i)=0.d0
398 ! SAVING THE DEPTH AND TRACER
399  t4%R(i)=ht%R(i)
400  t6%R(i)=f%R(i)
401 ! AVAILABLE DEPTH AND TRACER QUANTITY ARE SHARED BETWEEN PROCESSORS
402 ! FOR POINTS GIVING WATER, THEY WILL BE CANCELLED LATER
403  ht%R(i)=ht%R(i)*mesh%IFAC%I(i)
404  t5%R(i)=ht%R(i)*f%R(i)
405  ENDDO
406  ENDIF
407  ENDIF
408  DO ir=1,remain
409  i=indic_cpos(ir)
410  i1=gloseg1(i)
411  i2=gloseg2(i)
412  IF(fxmat(i).GT.eps_flux) THEN
413  t1%R(i1)=t1%R(i1)+fxmat(i)
414  ht%R(i1)=0.d0
415  t5%R(i1)=0.d0
416  ELSEIF(fxmat(i).LT.-eps_flux) THEN
417  t1%R(i2)=t1%R(i2)-fxmat(i)
418  ht%R(i2)=0.d0
419  t5%R(i2)=0.d0
420  ENDIF
421  ENDDO
422 !
423  IF(ncsize.GT.1) CALL parcom(t1,2,mesh)
424 !
425 ! FOR ISOLATED POINTS CONNECTED TO AN ACTIVE SEGMENT
426 ! THAT IS IN ANOTHER SUBDOMAIN
427  IF(ncsize.GT.1) THEN
428  DO iptfr=1,nptir
429  i=mesh%NACHB%I(nbmaxnshare*(iptfr-1)+1)
430  IF(t1%R(i).GT.eps_flux) THEN
431  ht%R(i)=0.d0
432  t5%R(i)=0.d0
433  ENDIF
434  ENDDO
435  ENDIF
436 !
437  c=0.d0
438  newremain=0
439 !
440  DO ir=1,remain
441  i=indic_cpos(ir)
442  i1=gloseg1(i)
443  i2=gloseg2(i)
444  IF(fxmat(i).GT.eps_flux) THEN
445 ! SHARING ON DEMAND: FRACTION OF DEPTH TAKEN
446 ! T4 IS THE STORED DEPTH
447 ! 1.D-20 ADDED HERE OTHERWISE IT OCCURED THAT THE PRODUCT OF 2
448 ! STRICTLY POSITIVE NUMBERS GAVE 0.D0
449  IF(t4%R(i1).GT.1.d-20) THEN
450  hseg1=t4%R(i1)*fxmat(i)/t1%R(i1)
451 ! END OF SHARING ON DEMAND
452  hfl1= dt*unsv2d%R(i1)*fxmat(i)
453  IF(hfl1.GT.hseg1) THEN
454  tet=hseg1/hfl1
455 ! HSEG2 AND THUS HT WILL BE STRICTLY POSITIVE
456  hseg2=dt*unsv2d%R(i2)*fxmat(i)*tet
457  ht%R(i2)=ht%R(i2)+hseg2
458 ! GROUPING H*F
459  t5%R(i2)=t5%R(i2)+hseg2*t6%R(i1)
460 ! RECOMPUTING F (AS WEIGHTED AVERAGE)
461 ! THIS MAY BE DONE SEVERAL TIMES FOR THE SAME POINT
462 ! BUT THE LAST ONE WILL BE THE GOOD ONE
463  f%R(i2)=t5%R(i2)/ht%R(i2)
464  fxmat(i)=fxmat(i)*(1.d0-tet)
465  c=c+fxmat(i)
466  newremain=newremain+1
467  indic_cpos(newremain)=i
468  ELSE
469  hseg1=hseg1-hfl1
470  hseg2=dt*unsv2d%R(i2)*fxmat(i)
471  ht%R(i2)=ht%R(i2)+hseg2
472  t5%R(i2)=t5%R(i2)+hseg2*t6%R(i1)
473 ! THE LAST ONE WILL BE THE GOOD ONE
474  f%R(i2)=t5%R(i2)/ht%R(i2)
475  IF(hseg1.GT.0.d0) THEN
476  ht%R(i1)=ht%R(i1)+hseg1
477  t5%R(i1)=t5%R(i1)+hseg1*t6%R(i1)
478 ! THE LAST ONE WILL BE THE GOOD ONE
479  f%R(i1)=t5%R(i1)/ht%R(i1)
480  ENDIF
481  ENDIF
482  ELSE
483 ! NO WATER NO FLUX TRANSMITTED, NOTHING CHANGED
484  c=c+fxmat(i)
485  newremain=newremain+1
486  indic_cpos(newremain)=i
487  ENDIF
488  ELSEIF(fxmat(i).LT.-eps_flux) THEN
489 ! SHARING ON DEMAND
490  IF(t4%R(i2).GT.1.d-20) THEN
491 ! 1.D-20 ADDED HERE OTHERWISE IT OCCURED THAT THE PRODUCT OF 2
492 ! STRICTLY POSITIVE NUMBERS GAVE 0.D0
493  hseg2=-t4%R(i2)*fxmat(i)/t1%R(i2)
494 ! END OF SHARING ON DEMAND
495  hfl2=-dt*unsv2d%R(i2)*fxmat(i)
496  IF(hfl2.GT.hseg2) THEN
497  tet=hseg2/hfl2
498 ! HSEG1 AND THUS HT WILL BE STRICTLY POSITIVE
499  hseg1=-dt*unsv2d%R(i1)*fxmat(i)*tet
500  ht%R(i1)=ht%R(i1)+hseg1
501  t5%R(i1)=t5%R(i1)+hseg1*t6%R(i2)
502 ! THE LAST ONE WILL BE THE GOOD ONE
503  f%R(i1)=t5%R(i1)/ht%R(i1)
504  fxmat(i)=fxmat(i)*(1.d0-tet)
505  c=c-fxmat(i)
506  newremain=newremain+1
507  indic_cpos(newremain)=i
508  ELSE
509  hseg1=-dt*unsv2d%R(i1)*fxmat(i)
510  hseg2=hseg2-hfl2
511  ht%R(i1)=ht%R(i1)+hseg1
512  t5%R(i1)=t5%R(i1)+hseg1*t6%R(i2)
513  f%R(i1)=t5%R(i1)/ht%R(i1)
514  IF(hseg2.GT.0.d0) THEN
515  ht%R(i2)=ht%R(i2)+hseg2
516  t5%R(i2)=t5%R(i2)+hseg2*t6%R(i2)
517 ! THE LAST ONE WILL BE THE GOOD ONE
518  f%R(i2)=t5%R(i2)/ht%R(i2)
519  ENDIF
520  ENDIF
521  ELSE
522 ! NO WATER NO FLUX TRANSMITTED, NOTHING CHANGED
523  c=c-fxmat(i)
524  newremain=newremain+1
525  indic_cpos(newremain)=i
526  ENDIF
527  ENDIF
528  ENDDO
529 !
530 ! MERGING DEPTHS AND F AT INTERFACE POINTS
531 !
532  IF(ncsize.GT.1) THEN
533  DO iptfr=1,nptir
534 ! ARRAY WITH HT*F AT INTERFACE POINTS
535  i=mesh%NACHB%I(nbmaxnshare*(iptfr-1)+1)
536  t1%R(i)=ht%R(i)*f%R(i)
537  ENDDO
538 ! SUMMING HT*F AT INTERFACE POINTS
539  CALL parcom(t1,2,mesh)
540 ! SUMMING THE NEW POSITIVE PARTIAL DEPTHS OF INTERFACE POINTS
541  CALL parcom(ht,2,mesh)
542 ! AVERAGE F AT INTERFACE POINTS
543  DO iptfr=1,nptir
544  i=mesh%NACHB%I(nbmaxnshare*(iptfr-1)+1)
545  IF(ht%R(i).GT.0.d0) f%R(i)=t1%R(i)/ht%R(i)
546  ENDDO
547  ENDIF
548 !
549  IF(ncsize.GT.1) c=p_sum(c)
550  IF(testing) WRITE(lu,*) 'FLUX NON PRIS EN COMPTE=',c
551 !
552  remain=newremain
553 !
554  IF(c.NE.cprev.AND.abs(c-cprev).GT.cinit*1.d-9
555  & .AND.c.NE.0.d0) THEN
556  cprev=c
557  IF(niter.LT.nitmax) GO TO 777
558  ENDIF
559 !
560 ! ADDING THE NEGATIVE SOURCES
561 !
562  IF(yasmh) THEN
563  IF(optsou.EQ.1) THEN
564  DO i=1,npoin
565  IF(smh%R(i).LT.0.d0) THEN
566  ht%R(i)=ht%R(i)+dt*smh%R(i)
567  f%R(i)=f%R(i)+dt/max(ht%R(i),1.d-4)*smh%R(i)*fscexp%R(i)
568  ENDIF
569  ENDDO
570  ELSEIF(optsou.EQ.2) THEN
571  DO i=1,npoin
572  IF(smh%R(i).LT.0.d0) THEN
573  ht%R(i)=ht%R(i)+dt*smh%R(i)*unsv2d%R(i)
574  f%R(i)=f%R(i)+dt/max(ht%R(i),1.d-4)*
575  & unsv2d%R(i)*smh%R(i)*fscexp%R(i)
576  ENDIF
577  ENDDO
578  ENDIF
579  ENDIF
580 !
581 ! RAIN-EVAPORATION: RAIN DONE ABOVE, NOW EVAPORATION
582 !
583  IF(rain) THEN
584  DO i=1,npoin
585  c=min(pluie%R(i),0.d0)
586 ! POSITIVITY NOT TESTED HERE, WOULD REQUIRE C=MAX(C,-HT%R(I)/DT)
587 ! BUT THEN MASS-BALANCE WOULD NOT BE CORRECT,
588  ht%R(i)=ht%R(i)+dt*c
589 ! VALUE IN VAPOR
590  f%R(i)=f%R(i)+dt/max(ht%R(i),1.d-4)*c*(0.d0-f%R(i))
591  ENDDO
592  ENDIF
593 !
594 ! BOUNDARY FLUXES : ADDING THE EXITING (POSITIVE) FLUXES
595 ! WITH A POSSIBLE LIMITATION
596 !
597  DO iptfr=1,nptfr
598  i=nbor(iptfr)
599 ! T2 = // ASSEMBLED FLBOR
600  hfl1=dt*unsv2d%R(i)*max(t2%R(i),0.d0)
601  tet=1.d0
602  IF(hfl1.GT.ht%R(i)) tet=ht%R(i)/hfl1
603 ! MAX IS ONLY TO PREVENT TRUNCATION ERROR
604  ht%R(i)=max(ht%R(i)-hfl1*tet,0.d0)
605 ! LIMITATION OF FLBOR (MUST HAVE BEEN DONE ALREADY
606 ! IN POSITIVE_DEPTHS)
607 ! FLBOR%R(IPTFR)=FLBOR%R(IPTFR)*TET
608  IF(limtra(iptfr).EQ.kdir) THEN
609  f%R(i)=f%R(i)-hfl1*tet/max(ht%R(i),1.d-4)*
610  & (fbor%R(iptfr)-f%R(i))
611  flbortra%R(iptfr)=flbor%R(iptfr)*fbor%R(iptfr)
612  ELSEIF(limtra(iptfr).EQ.kddl) THEN
613  flbortra%R(iptfr)=flbor%R(iptfr)*f%R(i)
614  ENDIF
615  ENDDO
616 !
617  IF(testing) THEN
618  c=0.d0
619  DO i=1,npoin
620  c=c+(ht%R(i)-h%R(i))**2
621  ENDDO
622 ! FAUX MAIS PAS GRAVE SI 0.
623  IF(ncsize.GT.1) c=p_sum(c)
624  WRITE(lu,*) 'DIFFERENCE ENTRE H ET HT =',c
625 !
626  c=1.d99
627  DO i=1,npoin
628  c=min(c,f%R(i))
629  ENDDO
630  IF(ncsize.GT.1) c=p_min(c)
631  WRITE(lu,*) 'APRES TRAITEMENT TRACEUR MIN=',c
632  c=-1.d99
633  DO i=1,npoin
634  c=max(c,f%R(i))
635  ENDDO
636  IF(ncsize.GT.1) c=p_max(c)
637  WRITE(lu,*) 'APRES TRAITEMENT TRACEUR MAX=',c
638  ENDIF
639 !
640 !-----------------------------------------------------------------------
641 !
642 ! SOURCE TERMS (TREATED OUTSIDE THE SUB-ITERATION LOOP, HENCE
643 ! ORIGINAL TIME-STEP DT0)
644 !
645  IF(yasmi) THEN
646 !
647 ! IMPLICIT AND EXPLICIT SOURCE TERM
648 !
649  IF(iopt2.EQ.0) THEN
650  DO i = 1,mesh%NPOIN
651  f%R(i)=(f%R(i)+dt*sm%R(i))/
652  & (1.d0-dt*smi%R(i)/max(h%R(i),1.d-15))
653 ! COULD BE DONE LIKE THIS...
654 ! F%R(I)=H%R(I)*(F%R(I)+DT*SM%R(I))/(H%R(I)-DT0*SMI%R(I))
655  ENDDO
656  ELSEIF(iopt2.EQ.1) THEN
657 ! HERE WE ASSUME THAT SMI WILL PREVENT A DIVISION BY ZERO
658 ! THIS IS THE CASE WITH SETTLING VELOCITY IN SISYPHE
659  DO i = 1,mesh%NPOIN
660  f%R(i)=(f%R(i)*ht%R(i)+dt*sm%R(i)*h%R(i))/
661  & (h%R(i)-dt*smi%R(i))
662  ENDDO
663  ENDIF
664 !
665  ELSE
666 !
667 ! EXPLICIT SOURCE TERM ONLY (AND IOPT2=1 NOT TREATED !!!)
668 !
669  DO i = 1,mesh%NPOIN
670  f%R(i) = f%R(i)+dt*sm%R(i)
671  ENDDO
672 !
673  ENDIF
674 !
675 !-----------------------------------------------------------------------
676 !
677  IF(entet) THEN
678  WRITE(lu,202) niter
679  ENDIF
680 !
681  IF(niter.EQ.nitmax) THEN
682  WRITE(lu,203) niter
683  ENDIF
684 !
685 202 FORMAT('CVTRVF_NERD (SCHEME NERD, 13 OR 14): ',1i3,' ITERATIONS')
686 203 FORMAT(' CVTRVF_NERD (SCHEME NERD, 13 OR 14): ',1i3,' ITERATIONS',
687  & ' = MAXIMUM',
688  & /,'INCREASE MAXIMUM NUMBER OF ITERATIONS FOR ADVECTION SCHEMES')
689 !
690 !-----------------------------------------------------------------------
691 !
692  RETURN
693  END
subroutine mult_interface_seg(FSEG, NH_COM_SEG, DIM1NHCOM, NB_NEIGHB_SEG, NB_NEIGHB_PT_SEG, LIST_SEND, NSEG)
subroutine parcom2_seg(X1, X2, X3, NSEG, NPLAN, ICOM, IAN, MESH, OPT, IELM)
Definition: parcom2_seg.f:7
subroutine cpstvc(X, Y)
Definition: cpstvc.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 osdb(OP, X, Y, Z, C, MESH)
Definition: osdb.f:7
subroutine flux_ef_vf(FLOW, PHIEL, NSEG, NELEM, NELMAX, ELTSEG, ORISEG, IKLE, INIFLO, IOPT, FN, YAFLULIM, FLULIM, YAFLULIMEBE, FLULIMEBE)
Definition: flux_ef_vf.f:8
subroutine os(OP, X, Y, Z, C, IOPT, INFINI, ZERO)
Definition: os.f:7
subroutine parcom(X, ICOM, MESH)
Definition: parcom.f:7
integer, dimension(:), allocatable indic_cpos
subroutine cvtrvf_nerd(F, FN, FSCEXP, H, HN, HPROP, UDEL, VDEL, DM1, ZCONV, SOLSYS, SM, SMH, YASMH, SMI, YASMI, FBOR, MASKTR, MESH, T1, T2, T3, T4, T5, T6, T7, HT, DT, ENTET, MSK, MASKEL, OPTSOU, LIMTRA, KDIR, KDDL, NPTFR, FLBOR, YAFLBOR, UNSV2D, IOPT, FLBORTRA, GLOSEG1, GLOSEG2, NBOR, FLULIM, YAFLULIM, RAIN, PLUIE, TRAIN, GIVEN_FLUX, FLUX_GIVEN, NITMAX)
Definition: cvtrvf_nerd.f:13
Definition: bief.f:3