The TELEMAC-MASCARET system  trunk
positive_depths_nerd.f
Go to the documentation of this file.
1 ! *******************************
2  SUBROUTINE positive_depths_nerd
3 ! *******************************
4 !
5  &(t1,t2,t4,h,hn,mesh,flodel,compute_flodel,flbor,dt,
6  & unsv2d,npoin,gloseg1,gloseg2,nbor,nptfr,
7  & smh,yasmh,pluie,rain,optsou,flulim,limpro,hbor,kdir,info,
8  & flopoint,namecode,nitmax,makeflulim)
9 !
10 !***********************************************************************
11 ! BIEF V7P3
12 !***********************************************************************
13 !
14 !brief Suppresses negative depths by a limitation of fluxes, with the
15 !+ NERD technique.
16 !
17 !history J-M HERVOUET (EDF LAB, LNHE)
18 !+ 19/11/2016
19 !+ V7P3
20 !+ First version, taken out of previous positive_depths.
21 !
22 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
23 !| COMPUTE_FLODEL |-->| IF YES, COMPUTE FLODEL HERE
24 !| DOFLULIM |-->| OPTIONAL, IF YES DOES ARRAY FLULIM
25 !| DT |-->| TIME STEP
26 !| FLBOR |<->| BOUNDARY FLUXES
27 !| FLODEL |<->| FLUXES GIVEN BY SEGMENT
28 !| | | MAY BE COMPUTED HERE (SEE COMPUTE-FLODEL)
29 !| | | OR SIMPLY GIVEN. AT THE EXIT, THE REAL FLUX
30 !| | | TRANSMITTED IS GIVEN BACK.
31 !| FLOPOINT |-->| FLUXES GIVEN BY POINTS (ELEMENT BY ELEMENT)
32 !| FLULIM |<--| PER SEGMENT: PERCENTAGE OF FLUX THAT HAS NOT
33 !| | | BEEN TRANSMITTED AT THE END OF THE ALGORITHM
34 !| GLOSEG1 |-->| FIRST POINT OF SEGMENTS
35 !| GLOSEG2 |-->| SECOND POINT OF SEGMENTS
36 !| H |<->| NEW DEPTH
37 !| HBOR |-->| PRESCRIBED DEPTHS AT BOUNDARIES
38 !| HN |-->| OLD DEPTH
39 !| INFO |-->| IF YES, PRINTING INFORMATION ON LISTING
40 !| KDIR |-->| CONVENTION FOR DIRICHLET BOUNDARY CONDITION
41 !| LIMPRO |-->| TYPE OF BOUNDARY CONDITIONS
42 !| | | IF EQUAL TO KDIR: PRESCRIBED DEPTH.
43 !| MESH |<->| MESH STRUCTURE
44 !| NAMECODE |-->| NAME OF CALLING CODE (SISYPHE, TELEMEC2D, ETC.)
45 !| NBOR |-->| GLOBAL NUMBERS OF BOUNDARY POINTS
46 !| NITMAX |-->| MAXIMUM NUMBER OF ITERATIONS
47 !| NPOIN |-->| NUMBER OF POINTS IN THE MESH
48 !| NPTFR |-->| NUMBER OF BOUNDARY POINTS
49 !| OPTSOU |-->| OPTION FOR SOURCES 1: NORMAL 2: DIRAC
50 !| PLUIE |-->| RAIN IN A BIEF_OBJ, IN M/S.
51 !| RAIN |-->| IF YES, THERE IS RAIN OR EVAPORATION
52 !| SMH |-->| SOURCE TERMS
53 !| T1 |-->| WORK ARRAY
54 !| T2 |-->| WORK ARRAY
55 !| T4 |-->| WORK ARRAY
56 !| UNSV2D |-->| INVERSE OF INTEGRAL OF BASIS FUNCTIONS
57 !| YASMH |-->| IF(YES) SMH MUST BE TAKEN INTO ACCOUNT
58 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
59 !
60  USE bief, ex_positive_depths_nerd => positive_depths_nerd
63 !
65  IMPLICIT NONE
66 !
67 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
68 !
69  INTEGER, INTENT(IN) :: NPOIN,NPTFR,OPTSOU,KDIR
70  INTEGER, INTENT(IN) :: NITMAX
71  INTEGER, INTENT(IN) :: GLOSEG1(*),GLOSEG2(*)
72  INTEGER, INTENT(IN) :: NBOR(nptfr)
73  INTEGER, INTENT(IN) :: LIMPRO(nptfr)
74  DOUBLE PRECISION, INTENT(IN) :: DT,HBOR(nptfr)
75  DOUBLE PRECISION, INTENT(INOUT) :: FLULIM(*)
76  TYPE(bief_mesh),INTENT(INOUT) :: MESH
77  DOUBLE PRECISION, INTENT(INOUT) :: FLOPOINT(mesh%nelem,3)
78  TYPE(bief_obj), INTENT(INOUT) :: T1,T2,T4,FLODEL,H,FLBOR
79  TYPE(bief_obj), INTENT(INOUT) :: PLUIE
80  TYPE(bief_obj), INTENT(IN) :: UNSV2D,HN,SMH
81  LOGICAL, INTENT(IN) :: YASMH,INFO,RAIN
82  LOGICAL, INTENT(IN) :: COMPUTE_FLODEL
83  CHARACTER(LEN=24) :: NAMECODE
84  LOGICAL, INTENT(IN) :: MAKEFLULIM
85 !
86 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
87 !
88  INTEGER I,I1,I2,IPTFR,REMAIN,NEWREMAIN,IR,NITER
89  INTEGER NELEM,NELMAX,NSEG
90  DOUBLE PRECISION C,CPREV,CINIT,HFL1
91  DOUBLE PRECISION SURDT,HSEG1,HSEG2,TET,HFL2
92  DOUBLE PRECISION, PARAMETER :: TIERS=1.d0/3.d0
93 !
94  DOUBLE PRECISION, PARAMETER :: EPS_FLUX = 1.d-15
95  LOGICAL, PARAMETER :: TESTING = .false.
96 !
97 !-----------------------------------------------------------------------
98 !
99 ! INDIC_PDEPT_NERD WILL BE A LIST OF SEGMENTS WITH NON ZERO FLUXES
100 ! HSEG IS THE DEPTH SHARED BETWEEN SEGMENTS
101 !
102 !-----------------------------------------------------------------------
103 !
104  surdt=1.d0/dt
105  nelem=mesh%NELEM
106  nelmax=mesh%NELMAX
107  nseg=mesh%NSEG
108 !
109  IF(.NOT.deja_pdept_nerd) THEN
110  ALLOCATE(indic_pdept_nerd(nseg))
111  deja_pdept_nerd=.true.
112  ENDIF
113 !
114 !-----------------------------------------------------------------------
115 !
116  IF(testing) THEN
117  c=1.d99
118  cinit=1.d99
119  DO i=1,npoin
120  c =min(c ,h%R(i))
121  cinit=min(cinit,hn%R(i))
122  ENDDO
123  IF(ncsize.GT.1) THEN
124  c=p_min(c)
125  cinit=p_min(cinit)
126  ENDIF
127  WRITE(lu,*) 'AVANT TRAITEMENT HAUTEURS NEGATIVES, H MIN=',c
128  WRITE(lu,*) 'AVANT TRAITEMENT HAUTEURS NEGATIVES, HN MIN=',cinit
129  c=0.d0
130  cinit=0.d0
131  IF(ncsize.GT.1) THEN
132  DO i=1,npoin
133  c =c +h%R(i) *mesh%IFAC%I(i)/unsv2d%R(i)
134  cinit=cinit+hn%R(i)*mesh%IFAC%I(i)/unsv2d%R(i)
135  ENDDO
136  c =p_sum(c )
137  cinit=p_sum(cinit)
138  ELSE
139  DO i=1,npoin
140  c =c +h%R(i) /unsv2d%R(i)
141  cinit=cinit+hn%R(i)/unsv2d%R(i)
142  ENDDO
143  ENDIF
144  WRITE(lu,*) 'AVANT TRAITEMENT MASSE INITIALE=',cinit
145  WRITE(lu,*) 'AVANT TRAITEMENT MASSE FINALE =',c
146  ENDIF
147 !
148 ! CALCUL DES FLUX PAR SEGMENT (T1 SUIVI DE FALSE NON UTILISE)
149 ! WHEN RECEIVED FLODEL IS NOT ASSEMBLED IN //
150 !
151  IF(compute_flodel) THEN
152 ! SO FAR HARDCODED OPTION 2
153  CALL flux_ef_vf(flodel%R,flopoint,nseg,nelem,nelmax,
154  & mesh%ELTSEG%I,mesh%ORISEG%I,
155  & mesh%IKLE%I,.true.,2)
156  ENDIF
157 !
158 ! ASSEMBLING FLODEL IN PARALLEL
159 !
160  IF(ncsize.GT.1) THEN
161  CALL parcom2_seg(flodel%R,flodel%R,flodel%R,
162  & nseg,1,2,1,mesh,1,11)
163  ENDIF
164 !
165 ! ON INTERFACE SEGMENTS, ONLY ONE OF THE TWO TWIN SEGMENTS
166 ! WILL RECEIVE THE TOTAL FLUX, THE OTHER WILL GET 0.
167 !
168  IF(ncsize.GT.1) THEN
169  CALL mult_interface_seg(flodel%R,mesh%NH_COM_SEG%I,
170  & mesh%NH_COM_SEG%DIM1,
171  & mesh%NB_NEIGHB_SEG,
172  & mesh%NB_NEIGHB_PT_SEG%I,
173  & mesh%LIST_SEND_SEG%I,nseg)
174  ENDIF
175 !
176  CALL cpstvc(h,t2)
177  CALL cpstvc(h,t4)
178  CALL cpstvc(h,t1)
179 !
180  IF(makeflulim) THEN
181  DO i=1,nseg
182 ! SAVING INITIAL FLODEL INTO FLULIM
183  flulim(i)=flodel%R(i)
184  ENDDO
185  ENDIF
186 !
187 ! ADDING THE SOURCES (SMH IS NATURALLY ASSEMBLED IN //)
188 ! FIRST THE POSITIVE SOURCES
189 !
190  IF(yasmh) THEN
191  IF(optsou.EQ.1) THEN
192  DO i=1,npoin
193  h%R(i)=hn%R(i)+dt*max(smh%R(i),0.d0)
194  ENDDO
195  ELSEIF(optsou.EQ.2) THEN
196  DO i=1,npoin
197  h%R(i)=hn%R(i)+dt*max(smh%R(i),0.d0)*unsv2d%R(i)
198  ENDDO
199  ENDIF
200  ELSE
201  DO i=1,npoin
202  h%R(i)=hn%R(i)
203  ENDDO
204  ENDIF
205 !
206 ! RAIN (POSITIVE PLUIE)
207 !
208  IF(rain) THEN
209  DO i=1,npoin
210  h%R(i)=h%R(i)+dt*max(pluie%R(i),0.d0)
211  ENDDO
212  ENDIF
213 !
214 ! BOUNDARY FLUXES : ADDING THE ENTERING (NEGATIVE) FLUXES
215 ! FIRST PUTTING FLBOR (BOUNDARY) IN T2 (DOMAIN)
216 !
217 ! T2 WILL BE THE ASSEMBLED FLBOR, INITIALISATION HERE
218 ! IS USELESS EXCEPT THAT PARCOM MAY ADD UNDEFINED
219 ! NUMBERS (THAT WILL NOT BE USED BUT THAT WILL STOP
220 ! A COMPILER... TOO BAD!)
221  IF(ncsize.GT.1) CALL os('X=0 ',x=t2)
222  CALL osdb( 'X=Y ' ,t2,flbor,flbor,0.d0,mesh)
223 ! ASSEMBLING T2 (FLBOR IS NOT ASSEMBLED)
224  IF(ncsize.GT.1) CALL parcom(t2,2,mesh)
225  DO iptfr=1,nptfr
226  i=nbor(iptfr)
227  h%R(i)=h%R(i)-dt*unsv2d%R(i)*min(t2%R(i),0.d0)
228  ENDDO
229 !
230 ! FOR OPTIMIZING THE LOOP ON ELEMENTS, ONLY ELEMENTS
231 ! WITH NON ZERO FLUXES WILL BE CONSIDERED, THIS LIST
232 ! WILL BE UPDATED. TO START WITH, ALL ELEMENTS IN THE LIST
233 !
234  remain=nseg
235 !
236  DO i=1,remain
237  indic_pdept_nerd(i)=i
238  ENDDO
239 !
240  cprev=0.d0
241 
242 ! INITIAL SUM OF FLUXES
243  DO i=1,nseg
244  cprev=cprev+abs(flodel%R(i))
245  ENDDO
246  IF(ncsize.GT.1) cprev=p_sum(cprev)
247  IF(testing) WRITE(lu,*) 'INITIAL SUM OF FLUXES=',cprev
248  cinit=cprev
249 !
250 ! LOOP OVER THE LOOP OVER THE ELEMENTS
251 !
252  niter = 0
253 777 CONTINUE
254  niter = niter + 1
255 !
256  IF(niter.EQ.1) THEN
257  DO i=1,npoin
258  t1%R(i)=0.d0
259  t4%R(i)=h%R(i)
260  ENDDO
261  ELSE
262 ! NOT ALL THE POINTS NEED TO BE INITIALISED NOW
263  DO ir=1,remain
264  i=indic_pdept_nerd(ir)
265  i1=gloseg1(i)
266  i2=gloseg2(i)
267  t1%R(i1)=0.d0
268  t1%R(i2)=0.d0
269 ! SAVING THE DEPTH
270  t4%R(i1)=h%R(i1)
271  t4%R(i2)=h%R(i2)
272  ENDDO
273 ! CANCELLING INTERFACE POINTS (SOME MAY BE ISOLATED IN A SUBDOMAIN
274 ! AT THE TIP OF AN ACTIVE SEGMENT WHICH IS ELSEWHERE)
275  IF(ncsize.GT.1) THEN
276  DO iptfr=1,nptir
277  i=mesh%NACHB%I(nbmaxnshare*(iptfr-1)+1)
278  t1%R(i)=0.d0
279 ! SAVING THE DEPTH
280  t4%R(i)=h%R(i)
281  ENDDO
282  ENDIF
283  ENDIF
284 !
285 ! COMPUTING THE DEMAND FOR EVERY POINT
286 ! CANCELLING DEPTHS THAT WILL BE DISTRIBUTED TO ACTIVE SEGMENTS
287 ! I.E. AS SOON AS THERE IS A DEMAND
288 ! ANYWAY THEY ARE STORED IN T4 THAT WILL BE USED INSTEAD
289 !
290  DO ir=1,remain
291  i=indic_pdept_nerd(ir)
292  i1=gloseg1(i)
293  i2=gloseg2(i)
294  IF(flodel%R(i).GT.eps_flux) THEN
295  t1%R(i1)=t1%R(i1)+flodel%R(i)
296  h%R(i1)=0.d0
297  ELSEIF(flodel%R(i).LT.-eps_flux) THEN
298  t1%R(i2)=t1%R(i2)-flodel%R(i)
299  h%R(i2)=0.d0
300  ENDIF
301  ENDDO
302 !
303  IF(ncsize.GT.1) THEN
304 ! DEMAND ASSEMBLED IN PARALLEL
305  CALL parcom(t1,2,mesh)
306 ! FOR ISOLATED POINTS CONNECTED TO AN ACTIVE
307 ! SEGMENT THAT IS IN ANOTHER SUBDOMAIN
308 ! H MUST BE CANCELLED, IF NOT, IT IS SHARED
309 ! SO THAT IT IS FOUND AGAIN ONCE ASSEMBLED
310  DO iptfr=1,nptir
311  i=mesh%NACHB%I(nbmaxnshare*(iptfr-1)+1)
312 ! AT THIS LEVEL H IS THE SAME AT INTERFACE POINTS
313 ! NOW H IS SHARED BETWEEN PROCESSORS TO ANTICIPATE
314 ! THE FINAL PARALLEL ASSEMBLY
315  IF(t1%R(i).GT.eps_flux) THEN
316 ! POINT THAT WILL GIVE
317  h%R(i)=0.d0
318  ELSE
319 ! POINT THAT WILL ONLY RECEIVE
320 ! IN THIS CASE THEIR DEPTH WILL NOT BE DISTRIBUTED
321 ! IN THE LOOP ON SEGMENTS, IT IS LEFT UNCHANGED
322 ! H IS SHARED TO ANTICIPATE THE FURTHER PARCOM
323  h%R(i)=h%R(i)*mesh%IFAC%I(i)
324  ENDIF
325  ENDDO
326  ENDIF
327 !
328  c=0.d0
329  newremain=0
330 !
331 ! TRANSFER OF FLUXES
332 !
333  DO ir=1,remain
334  i=indic_pdept_nerd(ir)
335  i1=gloseg1(i)
336  i2=gloseg2(i)
337  IF(flodel%R(i).GT.eps_flux) THEN
338 ! SHARING ON DEMAND
339  hseg1=t4%R(i1)*flodel%R(i)/t1%R(i1)
340 ! END OF SHARING ON DEMAND
341  hfl1= dt*unsv2d%R(i1)*flodel%R(i)
342  IF(hfl1.GT.hseg1) THEN
343  tet=hseg1/hfl1
344  h%R(i2)=h%R(i2)+dt*unsv2d%R(i2)*flodel%R(i)*tet
345  flodel%R(i)=flodel%R(i)*(1.d0-tet)
346  c=c+flodel%R(i)
347  newremain=newremain+1
348  indic_pdept_nerd(newremain)=i
349  ELSE
350  h%R(i1)=h%R(i1)+hseg1-hfl1
351  h%R(i2)=h%R(i2)+dt*unsv2d%R(i2)*flodel%R(i)
352  flodel%R(i)=0.d0
353  ENDIF
354  ELSEIF(flodel%R(i).LT.-eps_flux) THEN
355 ! SHARING ON DEMAND
356  hseg2=-t4%R(i2)*flodel%R(i)/t1%R(i2)
357 ! END OF SHARING ON DEMAND
358  hfl2=-dt*unsv2d%R(i2)*flodel%R(i)
359  IF(hfl2.GT.hseg2) THEN
360  tet=hseg2/hfl2
361 ! GATHERING DEPTHS
362  h%R(i1)=h%R(i1)-dt*unsv2d%R(i1)*flodel%R(i)*tet
363  flodel%R(i)=flodel%R(i)*(1.d0-tet)
364  c=c-flodel%R(i)
365  newremain=newremain+1
366  indic_pdept_nerd(newremain)=i
367  ELSE
368 ! GATHERING DEPTHS
369  h%R(i1)=h%R(i1)-dt*unsv2d%R(i1)*flodel%R(i)
370  h%R(i2)=h%R(i2)+hseg2-hfl2
371  flodel%R(i)=0.d0
372  ENDIF
373  ENDIF
374 !
375  ENDDO
376 !
377  remain=newremain
378 ! SUMMING THE NEW POSITIVE PARTIAL DEPTHS OF INTERFACE POINTS
379  IF(ncsize.GT.1) CALL parcom(h,2,mesh)
380  IF(ncsize.GT.1) c=p_sum(c)
381  IF(testing) WRITE(lu,*) 'FLUX NON PRIS EN COMPTE=',c
382 !
383 ! STOP CRITERION
384 !
385  IF(c.NE.cprev.AND.abs(c-cprev).GT.cinit*1.d-9
386  & .AND.c.NE.0.d0) THEN
387  cprev=c
388  IF(niter.LT.nitmax) GO TO 777
389  ENDIF
390 !
391 ! ADDING THE SOURCES (SMH IS NATURALLY ASSEMBLED IN //)
392 ! NOW THE NEGATIVE SOURCES
393 !
394  IF(yasmh) THEN
395  IF(optsou.EQ.1) THEN
396  DO i=1,npoin
397  h%R(i)=h%R(i)+dt*min(smh%R(i),0.d0)
398  ENDDO
399  ELSEIF(optsou.EQ.2) THEN
400  DO i=1,npoin
401  h%R(i)=h%R(i)+dt*min(smh%R(i),0.d0)*unsv2d%R(i)
402  ENDDO
403  ENDIF
404  ENDIF
405 !
406 ! EVAPORATION (NEGATIVE PLUIE), WITH A POSSIBLE LIMITATION
407 !
408  IF(rain) THEN
409  DO i=1,npoin
410  IF(-dt*pluie%R(i).LT.h%R(i)) THEN
411  h%R(i)=h%R(i)+dt*min(pluie%R(i),0.d0)
412  ELSE
413  pluie%R(i)=-h%R(i)/dt
414  h%R(i)=0.d0
415  ENDIF
416  ENDDO
417  ENDIF
418 !
419 ! BOUNDARY FLUXES : ADDING THE EXITING (POSITIVE) FLUXES
420 ! WITH A POSSIBLE LIMITATION
421 ! IMPORTANT: MUST BE DONE AFTER ALL OTHER SOURCES
422 !
423  DO iptfr=1,nptfr
424  i=nbor(iptfr)
425 ! T2 = // ASSEMBLED FLBOR
426  hfl1=dt*unsv2d%R(i)*max(t2%R(i),0.d0)
427  IF(hfl1.GT.h%R(i)) THEN
428 ! FLBOR ACTUALLY TAKEN INTO ACCOUNT
429  flbor%R(iptfr)=flbor%R(iptfr)*h%R(i)/hfl1
430  h%R(i)=0.d0
431  ELSE
432  h%R(i)=h%R(i)-hfl1
433  ENDIF
434  IF(limpro(iptfr).EQ.kdir) THEN
435  IF(hbor(iptfr).LT.0.d0) THEN
436  WRITE(lu,*) 'NEGATIVE DEPTH PRESCRIBED ON BOUNDARY'
437  WRITE(lu,*) 'CHECK YOUR SPECIFIC SUBROUTINE:'
438  IF(namecode(1:7).EQ.'SISYPHE') THEN
439  WRITE(lu,*) 'BEDLOAD_SOLVS_FE'
440  ELSEIF(namecode(1:4).EQ.'GAIA') THEN
441  WRITE(lu,*) 'BEDLOAD_SOLVS_FE'
442  ELSEIF(namecode(1:9).EQ.'TELEMAC2D') THEN
443  WRITE(lu,*) 'BORD'
444  ELSEIF(namecode(1:9).EQ.'TELEMAC3D') THEN
445  WRITE(lu,*) 'BORD3D'
446  ENDIF
447  CALL plante(1)
448  stop
449  ENDIF
450 ! HERE V2DPAR WOULD BE MORE CONVENIENT THAN UNSV2D...
451  flbor%R(iptfr)=flbor%R(iptfr)
452  & +(h%R(i)-hbor(iptfr))/(dt*unsv2d%R(i))
453  h%R(i)= hbor(iptfr)
454  ENDIF
455  ENDDO
456 !
457  IF(testing) THEN
458  c=1.d99
459  DO i=1,npoin
460  c=min(c,h%R(i))
461  ENDDO
462  IF(ncsize.GT.1) c=p_min(c)
463  WRITE(lu,*) 'APRES TRAITEMENT HAUTEURS NEGATIVES, HMIN=',c
464  c=0.d0
465  IF(ncsize.GT.1) THEN
466  DO i=1,npoin
467  c=c+h%R(i)*mesh%IFAC%I(i)/unsv2d%R(i)
468  ENDDO
469  c=p_sum(c)
470  ELSE
471  DO i=1,npoin
472  c=c+h%R(i)/unsv2d%R(i)
473  ENDDO
474  ENDIF
475  WRITE(lu,*) 'APRES TRAITEMENT MASSE FINALE =',c
476  ENDIF
477 !
478 !-----------------------------------------------------------------------
479 !
480 ! NOW WE WANT:
481 ! FLULIM TO BE THE PERCENTAGE OF FLUX THAT HAS BEEN TRANSMITTED
482 ! FLODEL TO BE THE ACTUAL FLUX THAT HAS BEEN TRANSMITTED
483 !
484 ! WE START WITH FLULIM=THE ORIGINAL FLODEL
485 !
486 ! WORKING ON ASSEMBLED VALUES TO FIND AN AVERAGE FLULIM
487 ! THAT WILL BE THE SAME AT INTERFACES
488 !
489 ! ASSEMBLING THE REMAINING FLUXES IN FLODEL
490 !
491 !
492 ! NOW WE WANT:
493 ! FLULIM TO BE THE PERCENTAGE OF FLUX THAT HAS BEEN TRANSMITTED
494 ! FLODEL TO BE THE ACTUAL FLUX THAT HAS BEEN TRANSMITTED
495 !
496 ! WE START WITH FLULIM=THE ORIGINAL FLODEL
497 !
498 ! WORKING ON ASSEMBLED VALUES TO FIND AN AVERAGE FLULIM
499 ! THAT WILL BE THE SAME AT INTERFACES
500 !
501  IF(ncsize.GT.1) THEN
502  CALL parcom2_seg(flodel%R,flodel%R,flodel%R,
503  & nseg,1,2,1,mesh,1,11)
504  CALL parcom2_seg(flulim,flulim,flulim,
505  & nseg,1,2,1,mesh,1,11)
506  ENDIF
507 !
508  DO i=1,nseg
509 ! ACTUAL FLUX TRANSMITTED (=ORIGINAL-REMAINING)
510  flodel%R(i)=flulim(i)-flodel%R(i)
511 ! PERCENTAGE OF ACTUAL FLUX WITH RESPECT TO ORIGINAL FLUX
512  IF(abs(flulim(i)).GT.eps_flux) THEN
513  flulim(i)=flodel%R(i)/flulim(i)
514  ELSE
515  flulim(i)=0.d0
516  ENDIF
517  ENDDO
518 !
519  IF(ncsize.GT.1) THEN
520 ! SHARING AGAIN FLODEL FOR FURTHER USES
521 ! ON INTERFACE SEGMENTS, ONLY ONE OF THE TWO TWIN SEGMENTS
522 ! WILL RECEIVE THE TOTAL FLUX, THE OTHER WILL GET 0.
523  CALL mult_interface_seg(flodel%R,mesh%NH_COM_SEG%I,
524  & mesh%NH_COM_SEG%DIM1,
525  & mesh%NB_NEIGHB_SEG,
526  & mesh%NB_NEIGHB_PT_SEG%I,
527  & mesh%LIST_SEND_SEG%I,nseg)
528  ENDIF
529 !
530 !-----------------------------------------------------------------------
531 !
532 ! CHECKING: COMPARING H(N+1) WITH H RECONSTRUCTED WITH THE FLUXES
533 ! SOURCES LACKING...
534 !
535  IF(testing) THEN
536  DO i=1,npoin
537  t1%R(i)=0.d0
538  ENDDO
539  DO i=1,nseg
540  i1=gloseg1(i)
541  i2=gloseg2(i)
542  t1%R(i1)=t1%R(i1)-dt*unsv2d%R(i1)*flodel%R(i)
543  t1%R(i2)=t1%R(i2)+dt*unsv2d%R(i2)*flodel%R(i)
544  ENDDO
545  DO iptfr=1,nptfr
546  i=nbor(iptfr)
547  t1%R(i)=t1%R(i)-dt*unsv2d%R(i)*flbor%R(iptfr)
548  ENDDO
549  IF(ncsize.GT.1) CALL parcom(t1,2,mesh)
550  DO i=1,npoin
551  t1%R(i)=t1%R(i)+hn%R(i)-h%R(i)
552  ENDDO
553  WRITE(lu,*) 'ERREUR POSITIVE_DEPTHS_NERD=',p_dots(t1,t1,mesh)
554  ENDIF
555 !
556 !-----------------------------------------------------------------------
557 !
558  IF(info) THEN
559  IF(namecode(1:7).EQ.'SISYPHE'.OR.namecode(1:4).EQ.'GAIA') THEN
560  WRITE(lu,102) niter
561  ELSE
562  WRITE(lu,202) niter
563  ENDIF
564  ENDIF
565 !
566  IF(niter.EQ.nitmax) THEN
567  IF(namecode(1:7).EQ.'SISYPHE'.OR.namecode(1:4).EQ.'GAIA') THEN
568  WRITE(lu,103) niter
569  ELSE
570  WRITE(lu,203) niter
571  ENDIF
572  ENDIF
573 !
574 102 FORMAT(' BEDLOAD EQUATION SOLVED IN ',1i5,' ITERATIONS')
575 202 FORMAT(' POSITIVE DEPTHS OBTAINED IN ',1i5,' ITERATIONS')
576 103 FORMAT(' BEDLOAD EQUATION SOLVED IN ',1i5,' ITERATIONS = MAXIMUM',
577  & /,'INCREASE MAXIMUM NUMBER OF ITERATIONS FOR ADVECTION SCHEMES')
578 203 FORMAT(' POSITIVE DEPTHS SOLVED IN ',1i5,' ITERATIONS = MAXIMUM',
579  & /,'INCREASE MAXIMUM NUMBER OF ITERATIONS FOR ADVECTION SCHEMES')
580 !
581 !-----------------------------------------------------------------------
582 !
583  RETURN
584  END
585 
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 positive_depths_nerd(T1, T2, T4, H, HN, MESH, FLODEL, COMPUTE_FLODEL, FLBOR, DT, UNSV2D, NPOIN, GLOSEG1, GLOSEG2, NBOR, NPTFR, SMH, YASMH, PLUIE, RAIN, OPTSOU, FLULIM, LIMPRO, HBOR, KDIR, INFO, FLOPOINT, NAMECODE, NITMAX, MAKEFLULIM)
subroutine cpstvc(X, Y)
Definition: cpstvc.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_pdept_nerd
double precision function p_dots(X, Y, MESH)
Definition: p_dots.f:7
Definition: bief.f:3