The TELEMAC-MASCARET system  trunk
cvtrvf_nerd_2.f
Go to the documentation of this file.
1 ! ************************
2  SUBROUTINE cvtrvf_nerd_2
3 ! ************************
4 !
5  &(f1,f1n,f1scexp,f2,f2n,f2scexp,h,hn,hprop,udel,vdel,dm1,
6  & zconv,solsys,sm1,sm2,smh,yasmh,smi1,smi2,yasmi,
7  & f1bor,f2bor,masktr,mesh,t1,t2,t3,t4,t5,t6,t7,t8,ht,
8  & dt,entet,msk,maskel,optsou,
9  & limtra1,limtra2,kdir,kddl,nptfr,flbor,yaflbor,unsv2d,iopt,
10  & flbortra1,flbortra2,gloseg1,gloseg2,nbor,
11  & rain,pluie,train1,train2,nitmax)
12 !
13 !***********************************************************************
14 ! BIEF V7P1
15 !***********************************************************************
16 !
17 !brief FINITE VOLUMES, UPWIND, EXPLICIT AND MONOTONIC
18 !+ ADVECTOR EVEN WITH TIDAL FLATS.
19 !+ THIS IS A COPY OF CVTRVF_POS, WRITTEN FOR 2 VARIABLES.
20 !
21 !warning AFBOR AND BFBOR MUST BE 0 FOR THE BOUNDARY ELEMENTS
22 !+ WITH NO FRICTION
23 !warning DISCRETISATION OF VISC
24 !
25 !history J-M HERVOUET (LNHE)
26 !+ 19/11/2010
27 !+ V6P0
28 !+ OPTIMIZATION (2 ABS SUPPRESSED)
29 !
30 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
31 !+ 13/07/2010
32 !+ V6P0
33 !+ Translation of French comments within the FORTRAN sources into
34 !+ English comments
35 !
36 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
37 !+ 21/08/2010
38 !+ V6P0
39 !+ Creation of DOXYGEN tags for automated documentation and
40 !+ cross-referencing of the FORTRAN sources
41 !
42 !history J-M HERVOUET (LNHE)
43 !+ 12/07/2012
44 !+ V6P2
45 !+ T2 set to 0 to start with required in parallel
46 !
47 !history J-M HERVOUET (EDF R&D, LNHE)
48 !+ 16/04/2013
49 !+ V6P2
50 !+ Intent of FLBOR changed and conditional building of FLBOR added.
51 !
52 !history J-M HERVOUET (EDF R&D, LNHE)
53 !+ 30/05/2013
54 !+ V6P2
55 !+ Argument NITMAX added.
56 !
57 !history J-M HERVOUET (EDF LAB, LNHE)
58 !+ 12/06/2015
59 !+ V7P1
60 !+ Adaptation to the fact that MESH%FAC is now replaced by MESH%IFAC.
61 !
62 !history J,RIEHME (ADJOINTWARE)
63 !+ November 2016
64 !+ V7P2
65 !+ Replaced EXTERNAL statements to parallel functions / subroutines
66 !+ by the INTERFACE_PARALLEL
67 !
68 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
69 !| DM1 |-->| THE PIECE-WISE CONSTANT PART OF ADVECTION FIELD
70 !| | | IS DM1*GRAD(ZCONV), SEE SOLSYS.
71 !| DT |-->| TIME STEP
72 !| ENTET |-->| LOGICAL, IF YES INFORMATION IS GIVEN ON MASS
73 !| | | CONSERVATION.
74 !| F1 |<--| F1 AT TIME T(N+1)
75 !| F2 |<--| F2 AT TIME T(N+1)
76 !| F1BOR |-->| DIRICHLET CONDITIONS ON F1.
77 !| F2BOR |-->| DIRICHLET CONDITIONS ON F2.
78 !| FLBOR |-->| FLUXES AT BOUNDARIES
79 !| FLBORTRA |<->| TRACER FLUXES AT BOUNDARIES
80 !| F1N |-->| F1 AT TIME T(N)
81 !| F2N |-->| F2 AT TIME T(N)
82 !| F1SCEXP |-->| EXPLICIT PART OF THE F1 SOURCE TERM
83 !| | | EQUAL TO ZERO EVERYWHERE BUT ON SOURCES
84 !| | | WHERE THERE IS FSCE - (1-TETAT) FN
85 !| | | SEE DIFSOU
86 !| F2SCEXP |-->| EXPLICIT PART OF THE F1 SOURCE TERM
87 !| GLOSEG1 |-->| FIRST POINT OF SEGMENTS
88 !| GLOSEG2 |-->| SECOND POINT OF SEGMENTS
89 !| HT |<--| WORK ARRAYS (MODIFIED DEPTHS TO TAKE MASS-LUMPING
90 !| | | INTO ACCOUNT)
91 !| HPROP |-->| PROPAGATION DEPTH (DONE IN CVDFTR).
92 !| IOPT |-->| OPTIONS FOR COMPUTATION (NUMBER BETWEEN 0 AND 13)
93 !| | | THE TENS (IOPT2, I.E. 0 OR 1):
94 !| | | 0: UCONV OBEYS THE CONTINUITY EQUATION
95 !| | | 1: UCONV DOES NOT OBEY THE CONTINUITY EQUATION
96 !| | | THE UNITS (IOPT1, I.E. 0 TO 3): VARIANT FOR FLUXES
97 !| | | 0: CONSTANT PER ELEMENT = 0
98 !| | | 1: CHI-TUAN PHAM'S CONSTANT
99 !| | | 2: N SCHEME
100 !| | | 3: PSI SCHEME
101 !| KDDL |-->| CONVENTION FOR DEGREE OF FREEDOM
102 !| KDIR |-->| CONVENTION FOR DIRICHLET POINT
103 !| LIMTRA1 |-->| BOUNDARY CONDITIONS OF F1 ON BOUNDARY POINTS
104 !| LIMTRA2 |-->| BOUNDARY CONDITIONS OF F2 ON BOUNDARY POINTS
105 !| MASKEL |-->| MASKING OF ELEMENTS
106 !| | | =1. : NORMAL =0. : MASKED ELEMENT
107 !| MESH |-->| MESH STRUCTURE
108 !| MSK |-->| IF YES, THERE IS MASKED ELEMENTS.
109 !| NBOR |-->| GLOBAL NUMBERS OF BOUNDARY POINTS
110 !| NITMAX |-->| MAXIMUM NUMBER OF ITERATIONS
111 !| NPTFR |-->| NUMBER OF BOUNDARY POINTS
112 !| OPTSOU |-->| TYPE OF SOURCES
113 !| | | 1: NORMAL
114 !| PLUIE |-->| RAIN OR EVAPORATION IN MM/S IN A BIEF_OBJ
115 !| RAIN |-->| IF YES, RAIN OR EVAPORATION
116 !| SM1 |-->| SOURCE TERMS OF F1.
117 !| SM2 |-->| SOURCE TERMS OF F2.
118 !| SMH |-->| SOURCE TERM IN CONTINUITY EQUATION
119 !| SMI1 |-->| IMPLICIT SOURCE TERM OF F1.
120 !| SMI2 |-->| IMPLICIT SOURCE TERM OF F2.
121 !| SOLSYS |-->| 1 OR 2. IF 2 ADVECTION FIELD IS UCONV + DM1*GRAD(ZCONV)
122 !| T1 |<->| WORK BIEF_OBJ STRUCTURE
123 !| T2 |<->| WORK BIEF_OBJ STRUCTURE
124 !| T3 |<->| WORK BIEF_OBJ STRUCTURE
125 !| T4 |<->| WORK BIEF_OBJ STRUCTURE
126 !| T5 |<->| WORK BIEF_OBJ STRUCTURE
127 !| T6 |<->| WORK BIEF_OBJ STRUCTURE
128 !| T7 |<->| WORK BIEF_OBJ STRUCTURE
129 !| T8 |<->| WORK BIEF_OBJ STRUCTURE
130 !| TRAIN1 |-->| VALUE OF TRACER 1 IN THE RAIN
131 !| TRAIN2 |-->| VALUE OF TRACER 2 IN THE RAIN
132 !| UDEL |-->| X-COMPONENT OF ADVECTION VELOCITY
133 !| UNSV2D |-->| INVERSE OF V2DPAR
134 !| VDEL |-->| X-COMPONENT OF ADVECTION VELOCITY
135 !| YAFLBOR |-->| IF YES FLBOR IS GIVEN
136 !| YASMH |-->| IF YES, SMH MUST BE TAKEN INTO ACCOUNT
137 !| YASMI |-->| IF YES, SMI MUST BE TAKEN INTO ACCOUNT
138 !| ZCONV |-->| THE PIECE-WISE CONSTANT PART OF ADVECTION FIELD
139 !| | | IS DM1*GRAD(ZCONV), SEE SOLSYS.
140 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
141 !
142  USE bief, ex_cvtrvf_nerd_2 => cvtrvf_nerd_2
144 !
146  USE interface_parallel, ONLY : p_sum,p_min,p_max
147  IMPLICIT NONE
148 !
149 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
150 !
151  INTEGER, INTENT(IN) :: OPTSOU,KDIR,NPTFR,SOLSYS
152  INTEGER, INTENT(IN) :: KDDL,IOPT,NITMAX
153  INTEGER, INTENT(IN) :: GLOSEG1(*),GLOSEG2(*)
154  INTEGER, INTENT(IN) :: LIMTRA1(nptfr),NBOR(nptfr)
155  INTEGER, INTENT(IN) :: LIMTRA2(nptfr)
156  DOUBLE PRECISION, INTENT(IN) :: DT
157  DOUBLE PRECISION, INTENT(IN) :: TRAIN1,TRAIN2
158  LOGICAL, INTENT(IN) :: YASMH,YAFLBOR,RAIN
159  LOGICAL, INTENT(IN) :: MSK,ENTET,YASMI
160  TYPE(bief_obj), INTENT(IN) :: MASKEL,H,HN,DM1,ZCONV
161  TYPE(bief_obj), INTENT(IN) :: UNSV2D,HPROP
162  TYPE(bief_obj), INTENT(INOUT) :: F1,SM1,F2,SM2,HT
163  TYPE(bief_obj), INTENT(IN) :: F1BOR,UDEL,VDEL,F1N,SMI1,SMH
164  TYPE(bief_obj), INTENT(IN) :: F2BOR,F2N,SMI2
165  TYPE(bief_obj), INTENT(INOUT) :: FLBORTRA1,FLBORTRA2
166  TYPE(bief_obj), INTENT(INOUT) :: T1,T2,T3,T4,T5,T6,T7,T8
167  TYPE(bief_obj), INTENT(IN) :: F1SCEXP,F2SCEXP,MASKTR
168  TYPE(bief_obj), INTENT(INOUT) :: FLBOR
169  TYPE(bief_obj), INTENT(IN) :: PLUIE
170  TYPE(bief_mesh) :: MESH
171 !
172 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
173 !
174  INTEGER I,IOPT1,IOPT2,NPOIN,IPTFR,I1,I2,NITER,REMAIN_SEG,NEWREMAIN
175  INTEGER IR
176 !
177 !-----------------------------------------------------------------------
178 !
179  DOUBLE PRECISION C,CPREV,CINIT,HFL1,HFL2,TET
180  DOUBLE PRECISION HSEG1,HSEG2
181  CHARACTER(LEN=16) FORMUL
182  DOUBLE PRECISION, POINTER, DIMENSION(:) :: FXMAT
183  LOGICAL, PARAMETER :: TESTING = .false.
184  DOUBLE PRECISION, PARAMETER :: EPS_FLUX = 1.d-15
185 !
186 !-----------------------------------------------------------------------
187 !
188 ! INDIC_CPOS2 WILL BE A LIST OF SEGMENTS WITH NON ZERO FLUXES
189 !
190  IF(.NOT.deja_cpos2) THEN
191  ALLOCATE(indic_cpos2(mesh%NSEG))
192  deja_cpos2=.true.
193  ENDIF
194 !
195 !-----------------------------------------------------------------------
196 !
197  fxmat=>mesh%MSEG%X%R(1:mesh%NSEG)
198 !
199 !-----------------------------------------------------------------------
200 !
201  npoin=h%DIM1
202 !
203 ! EXTRACTING OPTIONS, AND CONTROL
204 !
205  iopt2=iopt/10
206  iopt1=iopt-10*iopt2
207  IF(iopt1.LT.0.OR.iopt1.GT.3) THEN
208  WRITE(lu,*) 'CVTRVF_NERD_2: OPTION IOPT1 UNKNOWN: ',iopt1
209  CALL plante(1)
210  stop
211  ENDIF
212  IF(iopt2.NE.0.AND.iopt2.NE.1) THEN
213  WRITE(lu,*) 'CVTRVF_NERD_2: OPTION IOPT2 UNKNOWN: ',iopt2
214  CALL plante(1)
215  stop
216  ENDIF
217 !
218 !-----------------------------------------------------------------------
219 !
220 ! STARTING AGAIN FROM NON CORRECTED DEPTH
221 !
222  IF(testing) THEN
223  c=1.d99
224  cinit=1.d99
225  DO i=1,npoin
226  c =min(c ,h%R(i))
227  cinit=min(cinit,hn%R(i))
228  ENDDO
229  IF(ncsize.GT.1) THEN
230  c=p_min(c)
231  cinit=p_min(cinit)
232  ENDIF
233  WRITE(lu,*) 'AVANT TRAITEMENT HAUTEURS NEGATIVES, H MIN=',c
234  WRITE(lu,*) 'AVANT TRAITEMENT HAUTEURS NEGATIVES, HN MIN=',cinit
235  ENDIF
236 !
237 ! CALCUL DES FLUX PAR NOEUDS
238 !
239  formul='HUGRADP '
240  IF(solsys.EQ.2) formul(8:8)='2'
241  CALL vector(t1,'=',formul,h%ELM,-1.d0,
242  & hprop,dm1,zconv,udel,vdel,vdel,mesh,msk,maskel)
243 ! T1 AS HUGRADP IS NOT USED AS AN ASSEMBLED VECTOR
244 ! BUT TO GET THE NON ASSEMBLED FORM MESH%W
245 ! CALCUL DES FLUX PAR SEGMENT (TE1 SUIVI DE FALSE NON UTILISE)
246 ! FXMAT IS NOT ASSEMBLED IN //
247 !
248 !----------------------------------------
249 ! DIFFERENT OPTIONS TO COMPUTE THE FLUXES
250 !----------------------------------------
251 !
252  CALL flux_ef_vf(fxmat,mesh%W%R,mesh%NSEG,mesh%NELEM,mesh%NELMAX,
253  & mesh%ELTSEG%I,mesh%ORISEG%I,
254  & mesh%IKLE%I,.true.,iopt1)
255 !
256 !----------------------------------------
257 !
258 ! AVERAGING FLUXES ON INTERFACE SEGMENTS BY ASSEMBLING AND
259 ! DIVIDING BY 2. THIS WILL GIVE THE UPWINDING INFORMATION
260 !
261  IF(ncsize.GT.1) THEN
262  CALL parcom2_seg(fxmat,fxmat,fxmat,mesh%NSEG,1,2,1,mesh,
263  & 1,11)
264  CALL mult_interface_seg(fxmat,mesh%NH_COM_SEG%I,
265  & mesh%NH_COM_SEG%DIM1,
266  & mesh%NB_NEIGHB_SEG,
267  & mesh%NB_NEIGHB_PT_SEG%I,
268  & mesh%LIST_SEND_SEG%I,mesh%NSEG)
269  ENDIF
270 !
271 !----------------------------------------
272 ! END OF THE OPTIONS
273 !----------------------------------------
274 !
275  CALL cpstvc(h,t2)
276 ! T2 WILL BE THE ASSEMBLED FLBOR, INITIALISATION HERE
277 ! IS USELESS EXCEPT THAT PARCOM MAY ADD UNDEFINED
278 ! NUMBERS (THAT WILL NOT BE USED BUT THAT WILL STOP
279 ! A COMPILER... TOO BAD!)
280  IF(ncsize.GT.1) CALL os('X=0 ',x=t2)
281 !
282 ! INITIALIZING F1 AND F2 AT THE OLD VALUE
283 !
284  CALL os('X=Y ',x=f1,y=f1n)
285  CALL os('X=Y ',x=f2,y=f2n)
286 !
287  cprev=0.d0
288  DO i=1,mesh%NSEG
289  cprev=cprev+abs(fxmat(i))
290  ENDDO
291  IF(ncsize.GT.1) cprev=p_sum(cprev)
292  cinit=cprev
293  IF(testing) WRITE(lu,*) 'SOMME INITIALE DES FLUX=',cprev
294 !
295 ! BOUCLE SUR LES SEGMENTS, POUR PRENDRE EN COMPTE LES FLUX
296 ! ADMISSIBLES
297 !
298 ! ADDING THE SOURCES (SMH IS NATURALLY ASSEMBLED IN //)
299  IF(yasmh) THEN
300  IF(optsou.EQ.1) THEN
301  DO i=1,npoin
302  ht%R(i)=hn%R(i)+dt*smh%R(i)
303  f1%R(i)=f1n%R(i)+dt/max(ht%R(i),1.d-4)*
304  & smh%R(i)*f1scexp%R(i)
305  f2%R(i)=f2n%R(i)+dt/max(ht%R(i),1.d-4)*
306  & smh%R(i)*f2scexp%R(i)
307  ENDDO
308  ELSEIF(optsou.EQ.2) THEN
309  DO i=1,npoin
310  ht%R(i)=hn%R(i)+dt*smh%R(i)*unsv2d%R(i)
311  f1%R(i)=f1n%R(i)+dt/max(ht%R(i),1.d-4)*
312  & unsv2d%R(i)*smh%R(i)*f1scexp%R(i)
313  f2%R(i)=f2n%R(i)+dt/max(ht%R(i),1.d-4)*
314  & unsv2d%R(i)*smh%R(i)*f2scexp%R(i)
315  ENDDO
316  ENDIF
317  ELSE
318  DO i=1,npoin
319  ht%R(i)=hn%R(i)
320  ENDDO
321  ENDIF
322 !
323 ! RAIN-EVAPORATION: RAIN FIRST, EVAPORATION IN THE END
324 !
325  IF(rain) THEN
326  DO i=1,npoin
327  c=max(pluie%R(i),0.d0)
328  ht%R(i)=ht%R(i)+dt*c
329  f1%R(i)=f1%R(i)+dt/max(ht%R(i),1.d-4)*c*(train1-f1%R(i))
330  f2%R(i)=f2%R(i)+dt/max(ht%R(i),1.d-4)*c*(train2-f2%R(i))
331  ENDDO
332  ENDIF
333 !
334  IF(.NOT.yaflbor) THEN
335 ! MASK=8 FOR LIQUID BOUNDARIES
336  CALL vector(flbor,'=','FLUBDF ',1,1.d0,
337  & hprop,hprop,hprop,
338  & udel , vdel, vdel,mesh,.true.,masktr%ADR(8)%P)
339  ENDIF
340 !
341 ! BOUNDARY FLUXES : ADDING THE ENTERING (NEGATIVE) FLUXES
342 ! FIRST PUTTING FLBOR (BOUNDARY) IN T2 (DOMAIN)
343  CALL osdb( 'X=Y ' ,t2,flbor,flbor,0.d0,mesh)
344 ! ASSEMBLING T2 (FLBOR IS NOT ASSEMBLED)
345  IF(ncsize.GT.1) CALL parcom(t2,2,mesh)
346  DO iptfr=1,nptfr
347  i=nbor(iptfr)
348  ht%R(i)=ht%R(i)-dt*unsv2d%R(i)*min(t2%R(i),0.d0)
349 ! ENTERING FLUXES OF TRACERS
350 ! THE FINAL DEPTH IS TAKEN
351  IF(limtra1(iptfr).EQ.kdir) THEN
352  f1%R(i)=f1n%R(i)-dt/max(ht%R(i),1.d-4)*
353  & unsv2d%R(i)*min(t2%R(i),0.d0)*(f1bor%R(iptfr)-f1n%R(i))
354  ELSEIF(limtra1(iptfr).EQ.kddl) THEN
355  IF(t2%R(i).LE.0.d0) THEN
356 ! FLBORTRA1 IS NOT ASSEMBLED
357  flbortra1%R(iptfr)=flbor%R(iptfr)*f1n%R(i)
358  ENDIF
359  ENDIF
360  IF(limtra2(iptfr).EQ.kdir) THEN
361  f2%R(i)=f2n%R(i)-dt/max(ht%R(i),1.d-4)*
362  & unsv2d%R(i)*min(t2%R(i),0.d0)*(f2bor%R(iptfr)-f2n%R(i))
363  ELSEIF(limtra2(iptfr).EQ.kddl) THEN
364  IF(t2%R(i).LE.0.d0) THEN
365 ! FLBORTRA2 IS NOT ASSEMBLED
366  flbortra2%R(iptfr)=flbor%R(iptfr)*f1n%R(i)
367  ENDIF
368  ENDIF
369  ENDDO
370 !
371 ! FOR OPTIMIZING THE LOOP ON SEGMENTS, ONLY SEGMENTS
372 ! WITH NON ZERO FLUXES WILL BE CONSIDERED, THIS LIST
373 ! WILL BE UPDATED. TO START WITH, ALL FLUXES ASSUMED NON ZERO
374 !
375  remain_seg=mesh%NSEG
376  DO i=1,remain_seg
377  indic_cpos2(i)=i
378  ENDDO
379 !
380  niter = 0
381 777 CONTINUE
382  niter = niter + 1
383 !
384 !
385 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
386 ! FOR DISTRIBUTING THE DEPTHS BETWEEN SEGMENTS
387 !
388 ! T1 : TOTAL FLUX REMOVED OF EACH POINT
389 ! T4 : DEPTH H SAVED
390 ! T5 : H*F1 SAVED
391 ! T6 : F1 SAVED
392 ! T7 : H*F2 SAVED
393 ! T8 : F2 SAVED
394 !
395  CALL cpstvc(h,t1)
396  IF(niter.EQ.1) THEN
397  DO i=1,npoin
398  t1%R(i)=0.d0
399  t4%R(i)=ht%R(i)
400  t6%R(i)=f1%R(i)
401  t8%R(i)=f2%R(i)
402  t5%R(i)=ht%R(i)*f1%R(i)
403  t7%R(i)=ht%R(i)*f2%R(i)
404  ENDDO
405  IF(ncsize.GT.1) THEN
406  DO iptfr=1,nptir
407  i=mesh%NACHB%I(nbmaxnshare*(iptfr-1)+1)
408 ! AVAILABLE DEPTH IS SHARED BETWEEN PROCESSORS
409  ht%R(i)=ht%R(i)*mesh%IFAC%I(i)
410  t5%R(i)=ht%R(i)*f1%R(i)
411  t7%R(i)=ht%R(i)*f2%R(i)
412  ENDDO
413  ENDIF
414  ELSE
415 ! NOT ALL THE POINTS NEED TO BE INITIALISED NOW
416  DO ir=1,remain_seg
417  i=indic_cpos2(ir)
418  i1=gloseg1(i)
419  i2=gloseg2(i)
420  t1%R(i1)=0.d0
421  t1%R(i2)=0.d0
422 ! SAVING THE DEPTH AND TRACER
423  t4%R(i1)=ht%R(i1)
424  t4%R(i2)=ht%R(i2)
425  t6%R(i1)=f1%R(i1)
426  t6%R(i2)=f1%R(i2)
427  t8%R(i1)=f2%R(i1)
428  t8%R(i2)=f2%R(i2)
429  t5%R(i1)=ht%R(i1)*f1%R(i1)
430  t5%R(i2)=ht%R(i2)*f1%R(i2)
431  t7%R(i1)=ht%R(i1)*f2%R(i1)
432  t7%R(i2)=ht%R(i2)*f2%R(i2)
433  ENDDO
434 ! CANCELLING INTERFACE POINTS (SOME MAY BE ISOLATED IN A SUBDOMAIN
435 ! AT THE TIP OF AN ACTIVE SEGMENT WHICH IS ELSEWHERE)
436  IF(ncsize.GT.1) THEN
437  DO iptfr=1,nptir
438  i=mesh%NACHB%I(nbmaxnshare*(iptfr-1)+1)
439  t1%R(i)=0.d0
440 ! SAVING THE DEPTH AND TRACER
441  t4%R(i)=ht%R(i)
442  t6%R(i)=f1%R(i)
443  t8%R(i)=f2%R(i)
444 ! AVAILABLE DEPTH IS SHARED BETWEEN PROCESSORS
445  ht%R(i)=ht%R(i)*mesh%IFAC%I(i)
446  t5%R(i)=ht%R(i)*f1%R(i)
447  t7%R(i)=ht%R(i)*f2%R(i)
448  ENDDO
449  ENDIF
450  ENDIF
451  DO ir=1,remain_seg
452  i=indic_cpos2(ir)
453  i1=gloseg1(i)
454  i2=gloseg2(i)
455  IF(fxmat(i).GT.eps_flux) THEN
456  t1%R(i1)=t1%R(i1)+fxmat(i)
457  ht%R(i1)=0.d0
458  t5%R(i1)=0.d0
459  t7%R(i1)=0.d0
460  ELSEIF(fxmat(i).LT.-eps_flux) THEN
461  t1%R(i2)=t1%R(i2)-fxmat(i)
462  ht%R(i2)=0.d0
463  t5%R(i2)=0.d0
464  t7%R(i2)=0.d0
465  ENDIF
466  ENDDO
467 !
468  IF(ncsize.GT.1) CALL parcom(t1,2,mesh)
469 !
470 ! FOR ISOLATED POINTS CONNECTED TO AN ACTIVE SEGMENT
471 ! THAT IS IN ANOTHER SUBDOMAIN
472  IF(ncsize.GT.1) THEN
473  DO iptfr=1,nptir
474  i=mesh%NACHB%I(nbmaxnshare*(iptfr-1)+1)
475  IF(t1%R(i).GT.eps_flux) THEN
476  ht%R(i)=0.d0
477  t5%R(i)=0.d0
478  t7%R(i)=0.d0
479  ENDIF
480  ENDDO
481  ENDIF
482 !
483 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
484 !
485  c=0.d0
486  newremain=0
487 !
488  DO ir=1,remain_seg
489  i=indic_cpos2(ir)
490  i1=gloseg1(i)
491  i2=gloseg2(i)
492  IF(fxmat(i).GT.eps_flux) THEN
493 ! SHARING ON DEMAND: FRACTION OF DEPTH TAKEN
494 ! T4 IS THE STORED DEPTH
495  IF(t4%R(i1).GT.1.d-20) THEN
496  hseg1=t4%R(i1)*fxmat(i)/t1%R(i1)
497 ! END OF SHARING ON DEMAND
498  hfl1= dt*unsv2d%R(i1)*fxmat(i)
499  IF(hfl1.GT.hseg1) THEN
500  tet=hseg1/hfl1
501 ! HSEG2 AND THUS HT WILL BE STRICTLY POSITIVE
502  hseg2=dt*unsv2d%R(i2)*fxmat(i)*tet
503  ht%R(i2)=ht%R(i2)+hseg2
504 ! GROUPING H*F
505  t5%R(i2)=t5%R(i2)+hseg2*t6%R(i1)
506  t7%R(i2)=t7%R(i2)+hseg2*t8%R(i1)
507 ! RECOMPUTING F (AS WEIGHTED AVERAGE)
508 ! THIS MAY BE DONE SEVERAL TIMES FOR THE SAME POINT
509 ! BUT THE LAST ONE WILL BE THE GOOD ONE
510  f1%R(i2)=t5%R(i2)/ht%R(i2)
511  f2%R(i2)=t7%R(i2)/ht%R(i2)
512  fxmat(i)=fxmat(i)*(1.d0-tet)
513  c=c+fxmat(i)
514  newremain=newremain+1
515  indic_cpos2(newremain)=i
516  ELSE
517  hseg1=hseg1-hfl1
518  hseg2=dt*unsv2d%R(i2)*fxmat(i)
519  ht%R(i2)=ht%R(i2)+hseg2
520  t5%R(i2)=t5%R(i2)+hseg2*t6%R(i1)
521  t7%R(i2)=t7%R(i2)+hseg2*t8%R(i1)
522 ! THE LAST ONE WILL BE THE GOOD ONE
523  f1%R(i2)=t5%R(i2)/ht%R(i2)
524  f2%R(i2)=t7%R(i2)/ht%R(i2)
525  IF(hseg1.GT.0.d0) THEN
526  ht%R(i1)=ht%R(i1)+hseg1
527  t5%R(i1)=t5%R(i1)+hseg1*t6%R(i1)
528  t7%R(i1)=t7%R(i1)+hseg1*t8%R(i1)
529 ! THE LAST ONE WILL BE THE GOOD ONE
530  f1%R(i1)=t5%R(i1)/ht%R(i1)
531  f2%R(i1)=t7%R(i1)/ht%R(i1)
532  ENDIF
533  ENDIF
534  ELSE
535 ! NO WATER NO FLUX TRANSMITTED, NOTHING CHANGED
536  c=c+fxmat(i)
537  newremain=newremain+1
538  indic_cpos2(newremain)=i
539  ENDIF
540  ELSEIF(fxmat(i).LT.-eps_flux) THEN
541 ! SHARING ON DEMAND
542  IF(t4%R(i2).GT.1.d-20) THEN
543  hseg2=-t4%R(i2)*fxmat(i)/t1%R(i2)
544 ! END OF SHARING ON DEMAND
545  hfl2=-dt*unsv2d%R(i2)*fxmat(i)
546  IF(hfl2.GT.hseg2) THEN
547  tet=hseg2/hfl2
548 ! HSEG1 AND THUS HT WILL BE STRICTLY POSITIVE
549  hseg1=-dt*unsv2d%R(i1)*fxmat(i)*tet
550  ht%R(i1)=ht%R(i1)+hseg1
551  t5%R(i1)=t5%R(i1)+hseg1*t6%R(i2)
552  t7%R(i1)=t7%R(i1)+hseg1*t8%R(i2)
553 ! THE LAST ONE WILL BE THE GOOD ONE
554  f1%R(i1)=t5%R(i1)/ht%R(i1)
555  f2%R(i1)=t7%R(i1)/ht%R(i1)
556  fxmat(i)=fxmat(i)*(1.d0-tet)
557  c=c-fxmat(i)
558  newremain=newremain+1
559  indic_cpos2(newremain)=i
560  ELSE
561  hseg1=-dt*unsv2d%R(i1)*fxmat(i)
562  hseg2=hseg2-hfl2
563  ht%R(i1)=ht%R(i1)+hseg1
564  t5%R(i1)=t5%R(i1)+hseg1*t6%R(i2)
565  t7%R(i1)=t7%R(i1)+hseg1*t8%R(i2)
566  f1%R(i1)=t5%R(i1)/ht%R(i1)
567  f2%R(i1)=t7%R(i1)/ht%R(i1)
568  IF(hseg2.GT.0.d0) THEN
569  ht%R(i2)=ht%R(i2)+hseg2
570  t5%R(i2)=t5%R(i2)+hseg2*t6%R(i2)
571  t7%R(i2)=t7%R(i2)+hseg2*t8%R(i2)
572 ! THE LAST ONE WILL BE THE GOOD ONE
573  f1%R(i2)=t5%R(i2)/ht%R(i2)
574  f2%R(i2)=t7%R(i2)/ht%R(i2)
575  ENDIF
576  ENDIF
577  ELSE
578 ! NO WATER NO FLUX TRANSMITTED, NOTHING CHANGED
579  c=c-fxmat(i)
580  newremain=newremain+1
581  indic_cpos2(newremain)=i
582  ENDIF
583  ENDIF
584  ENDDO
585 !
586  remain_seg=newremain
587 !
588 ! MERGING DEPTHS AND F AT INTERFACE POINTS
589 !
590  IF(ncsize.GT.1) THEN
591  DO iptfr=1,nptir
592 ! ARRAY WITH HT*F AT INTERFACE POINTS
593  i=mesh%NACHB%I(nbmaxnshare*(iptfr-1)+1)
594  t1%R(i)=ht%R(i)*f1%R(i)
595  t3%R(i)=ht%R(i)*f2%R(i)
596  ENDDO
597 ! SUMMING HT*F AT INTERFACE POINTS
598  CALL parcom(t1,2,mesh)
599  CALL parcom(t3,2,mesh)
600 ! SUMMING THE NEW POSITIVE PARTIAL DEPTHS OF INTERFACE POINTS
601  CALL parcom(ht,2,mesh)
602 ! AVERAGE F1 AND F2 AT INTERFACE POINTS
603  DO iptfr=1,nptir
604  i=mesh%NACHB%I(nbmaxnshare*(iptfr-1)+1)
605  IF(ht%R(i).GT.0.d0) THEN
606  f1%R(i)=t1%R(i)/ht%R(i)
607  f2%R(i)=t3%R(i)/ht%R(i)
608  ENDIF
609  ENDDO
610  ENDIF
611 !
612  IF(ncsize.GT.1) c=p_sum(c)
613  IF(testing) WRITE(lu,*) 'FLUX NON PRIS EN COMPTE=',c
614  IF(c.NE.cprev.AND.abs(c-cprev).GT.cinit*1.d-9
615  & .AND.c.NE.0.d0) THEN
616  cprev=c
617  IF(niter.LT.nitmax) GO TO 777
618  ENDIF
619 !
620 ! RAIN-EVAPORATION: RAIN DONE ABOVE, NOW EVAPORATION
621 !
622  IF(rain) THEN
623  DO i=1,npoin
624  c=min(pluie%R(i),0.d0)
625 ! POSITIVITY NOT TESTED HERE, WOULD REQUIRE C=MAX(C,-HT%R(I)/DT)
626 ! BUT THEN MASS-BALANCE WOULD NOT BE CORRECT,
627  ht%R(i)=ht%R(i)+dt*c
628 ! VALUE IN VAPOR
629 ! F1%R(I)=F1%R(I)+DT/MAX(HT%R(I),1.D-4)*C*(0.D0-F1%R(I))
630  f1%R(i)=f1%R(i)-dt/max(ht%R(i),1.d-4)*c*f1%R(i)
631 ! F2%R(I)=F2%R(I)+DT/MAX(HT%R(I),1.D-4)*C*(0.D0-F2%R(I))
632  f2%R(i)=f2%R(i)-dt/max(ht%R(i),1.d-4)*c*f2%R(i)
633  ENDDO
634  ENDIF
635 !
636 ! BOUNDARY FLUXES : ADDING THE EXITING (POSITIVE) FLUXES
637 ! WITH A POSSIBLE LIMITATION
638 !
639  DO iptfr=1,nptfr
640  i=nbor(iptfr)
641 ! T2 = // ASSEMBLED FLBOR
642  hfl1=dt*unsv2d%R(i)*max(t2%R(i),0.d0)
643  tet=1.d0
644 ! NEXT LINE SHOULD NEVER HAPPEN (DONE IN POSITIVE_DEPTHS)
645  IF(hfl1.GT.ht%R(i)) tet=ht%R(i)/hfl1
646 ! MAX IS ONLY TO PREVENT TRUNCATION ERROR
647  ht%R(i)=max(ht%R(i)-hfl1*tet,0.d0)
648 ! LIMITATION OF FLBOR (MUST HAVE BEEN DONE ALREADY
649 ! IN POSITIVE_DEPTHS)
650 ! FLBOR%R(IPTFR)=FLBOR%R(IPTFR)*TET
651 !
652  IF(limtra1(iptfr).EQ.kdir) THEN
653  f1%R(i)=f1%R(i)-hfl1*tet/max(ht%R(i),1.d-4)*
654  & (f1bor%R(iptfr)-f1%R(i))
655  flbortra1%R(iptfr)=flbor%R(iptfr)*f1bor%R(iptfr)
656  ELSEIF(limtra1(iptfr).EQ.kddl) THEN
657  IF(t2%R(i).GT.0.d0) THEN
658  flbortra1%R(iptfr)=flbor%R(iptfr)*f1%R(i)
659  ENDIF
660  ELSE
661  flbortra1%R(iptfr)=0.d0
662  ENDIF
663  IF(limtra2(iptfr).EQ.kdir) THEN
664  f2%R(i)=f2%R(i)-hfl1*tet/max(ht%R(i),1.d-4)*
665  & (f2bor%R(iptfr)-f2%R(i))
666  flbortra2%R(iptfr)=flbor%R(iptfr)*f2bor%R(iptfr)
667  ELSEIF(limtra2(iptfr).EQ.kddl) THEN
668  IF(t2%R(i).GT.0.d0) THEN
669  flbortra2%R(iptfr)=flbor%R(iptfr)*f2%R(i)
670  ENDIF
671  ELSE
672  flbortra2%R(iptfr)=0.d0
673  ENDIF
674  ENDDO
675 !
676  IF(testing) THEN
677  c=0.d0
678  DO i=1,npoin
679  c=c+(ht%R(i)-h%R(i))**2
680  ENDDO
681 ! FAUX MAIS PAS GRAVE SI 0.
682  IF(ncsize.GT.1) c=p_sum(c)
683  WRITE(lu,*) 'DIFFERENCE ENTRE H ET HT =',c
684 !
685  c=1.d99
686  DO i=1,npoin
687  c=min(c,f1%R(i))
688  ENDDO
689  IF(ncsize.GT.1) c=p_min(c)
690  WRITE(lu,*) 'APRES TRAITEMENT TRACEUR 1 MIN=',c
691  c=-1.d99
692  DO i=1,npoin
693  c=max(c,f1%R(i))
694  ENDDO
695  IF(ncsize.GT.1) c=p_max(c)
696  WRITE(lu,*) 'APRES TRAITEMENT TRACEUR 1 MAX=',c
697  ENDIF
698 !
699 !-----------------------------------------------------------------------
700 !
701 ! EXPLICIT SOURCE TERM
702 !
703  DO i = 1,mesh%NPOIN
704  f1%R(i) = f1%R(i)+dt*sm1%R(i)
705  f2%R(i) = f2%R(i)+dt*sm2%R(i)
706  ENDDO
707 !
708 ! IMPLICIT SOURCE TERM
709 !
710  IF(yasmi) THEN
711  DO i = 1,mesh%NPOIN
712  f1%R(i) = f1%R(i)/(1.d0-dt*smi1%R(i)/max(h%R(i),1.d-15))
713  f2%R(i) = f2%R(i)/(1.d0-dt*smi2%R(i)/max(h%R(i),1.d-15))
714  ENDDO
715  ENDIF
716 !
717 !-----------------------------------------------------------------------
718 !
719  IF(entet) THEN
720  WRITE(lu,102) niter
721  ENDIF
722 !
723  IF(niter.EQ.nitmax) THEN
724  WRITE(lu,103) niter
725  ENDIF
726 !
727 102 FORMAT(' CVTRVF_NERD_2 (SCHEME 13 OR 14): ',1i3,' ITERATIONS')
728 103 FORMAT(' CVTRVF_NERD_2 (SCHEME NERD, 13 OR 14): ',1i3,
729  & ' ITERATIONS = MAXIMUM',
730  & /,'INCREASE MAXIMUM NUMBER OF ITERATIONS FOR ADVECTION SCHEMES')
731 !
732 !-----------------------------------------------------------------------
733 !
734  RETURN
735  END
integer, dimension(:), allocatable indic_cpos2
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
subroutine cvtrvf_nerd_2(F1, F1N, F1SCEXP, F2, F2N, F2SCEXP, H, HN, HPROP, UDEL, VDEL, DM1, ZCONV, SOLSYS, SM1, SM2, SMH, YASMH, SMI1, SMI2, YASMI, F1BOR, F2BOR, MASKTR, MESH, T1, T2, T3, T4, T5, T6, T7, T8, HT, DT, ENTET, MSK, MASKEL, OPTSOU, LIMTRA1, LIMTRA2, KDIR, KDDL, NPTFR, FLBOR, YAFLBOR, UNSV2D, IOPT, FLBORTRA1, FLBORTRA2, GLOSEG1, GLOSEG2, NBOR, RAIN, PLUIE, TRAIN1, TRAIN2, NITMAX)
Definition: cvtrvf_nerd_2.f:13
Definition: bief.f:3