The TELEMAC-MASCARET system  trunk
positive_depths.f
Go to the documentation of this file.
1 ! **************************
2  SUBROUTINE positive_depths
3 ! **************************
4 !
5  &(t1,t2,t3,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,option,nitmax,doflulim,flulimebe,doflulimebe)
9 !
10 !***********************************************************************
11 ! BIEF V7P3
12 !***********************************************************************
13 !
14 !brief SUPPRESSES NEGATIVE DEPTHS BY A LIMITATION OF FLUXES.
15 !
16 !history J-M HERVOUET (LNHE)
17 !+ 12/03/2010
18 !+ V6P0
19 !+ ADDED COMPUTE_FLODEL
20 !
21 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
22 !+ 13/07/2010
23 !+ V6P0
24 !+ Translation of French comments within the FORTRAN sources into
25 !+ English comments
26 !
27 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
28 !+ 21/08/2010
29 !+ V6P0
30 !+ Creation of DOXYGEN tags for automated documentation and
31 !+ cross-referencing of the FORTRAN sources
32 !
33 !history J-M HERVOUET (LNHE)
34 !+ 16/07/2012
35 !+ V6P2
36 !+ The value of transmitted fluxes is given back in FLODEL in all
37 !+ cases, YAFLODEL no longer used (but left for compatibility)
38 !
39 !history J-M HERVOUET (EDF R&D, LNHE)
40 !+ 30/05/2013
41 !+ V6P2
42 !+ Argument NITMAX added.
43 !
44 !history J-M HERVOUET (LNHE)
45 !+ 30/12/2013
46 !+ V7P0
47 !+ Argument YAFLODEL removed.
48 !
49 !history J-M HERVOUET (LNHE)
50 !+ 18/09/2014
51 !+ V7P0
52 !+ Now positive sources are first added, then the transfers between
53 !+ points are done, then the negative sources are treated. In this way
54 !+ the transfers cannot be corrupted by an initial negative depth.
55 !+ + one NCSIZE.GT.0 changed into NCSISE.GT.1.
56 !
57 !history J-M HERVOUET (LNHE)
58 !+ 19/06/2015
59 !+ V7P1
60 !+ Adaptation to new coefficient IFAC instead of FAC.
61 !+ Option 1 removed. FLULIM now equal on either side of a segment
62 !+ in parallel. FLODEL differently shared at the exit.
63 !
64 !history J-M HERVOUET (LNHE)
65 !+ 25/03/2016
66 !+ V7P2
67 !+ OPTION has a new meaning (2 was the only previous possibility)
68 !+ Now : 1 : positive depths ensured with an EBE approach (new !)
69 !+ that is necessary for the ERIA advection scheme.
70 !+ 2 : positive depths ensured with an edge-based approach (old)
71 !+ Option 1 will be mandatory with the new advection scheme 15.
72 !
73 !history J-M HERVOUET (LNHE)
74 !+ 16/07/2016
75 !+ V7P2
76 !+ In ERIA scheme, now forbidding that two fluxes on either side of
77 !+ a segment be of opposite sign (one is cancelled and the other is
78 !+ reduced). The final flux limitation is thus in the range [0,1] and
79 !+ OPTION=1 (i.e. TREATMENT OF NEGATIVE DEPTHS=3) is now also possible
80 !+ for the LIPS scheme.
81 !
82 !history J-M HERVOUET (EDF LAB, LNHE)
83 !+ 09/09/2016
84 !+ V7P2
85 !+ Swapping rain and boundary fluxes at the end of the algorithm. It
86 !+ caused a wrong correction of FLBOR in case of evaporation.
87 !+ Adding rain (it was mixed before with sources).
88 !
89 !history J-M HERVOUET (EDF LAB, LNHE)
90 !+ 15/09/2016
91 !+ V7P2
92 !+ Limiting evaporation to avoid negative depths.
93 !
94 !history J-M HERVOUET (EDF LAB, LNHE)
95 !+ 06/11/2016
96 !+ V7P3
97 !+ This subroutine can now provide a flux limitation in the form of
98 !+ FLULIM(NSEG) or FLULIMEBE(NELMAX,3). This depends on OPTION
99 !+ However, FLULIMEBE can be produced only with OPTION 1.
100 !
101 !history J-M HERVOUET (EDF LAB, LNHE)
102 !+ 19/11/2016
103 !+ V7P3
104 !+ Subroutine split into POSITIVE_DEPTHS_ERIA and POSITIVE_DEPTHS_NERD
105 !+ The remaining part is just the bifurcation.
106 !
107 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
108 !| COMPUTE_FLODEL |-->| IF YES, COMPUTE FLODEL HERE
109 !| DOFLULIM |-->| OPTIONAL, IF YES DOES ARRAY FLULIM
110 !| DOFLULIMEBE |-->| OPTIONAL, IF YES DOES ARRAY FLULIMEBE
111 !| DT |-->| TIME STEP
112 !| FLBOR |<->| BOUNDARY FLUXES
113 !| FLODEL |<->| FLUXES GIVEN BY SEGMENT
114 !| | | MAY BE COMPUTED HERE (SEE COMPUTE-FLODEL)
115 !| | | OR SIMPLY GIVEN. AT THE EXIT, THE REAL FLUX
116 !| | | TRANSMITTED IS GIVEN BACK.
117 !| FLOPOINT |-->| FLUXES GIVEN BY POINTS (ELEMENT BY ELEMENT)
118 !| FLULIM |<--| PER SEGMENT: PERCENTAGE OF FLUX THAT HAS NOT
119 !| | | BEEN TRANSMITTED AT THE END OF THE ALGORITHM
120 !| FLULIMEBE |<--| AS FLULIM BUT GIVEN PER ELEMENT
121 !| | | HENCE FLULIMEBE(NELMAX,3)
122 !| GLOSEG1 |-->| FIRST POINT OF SEGMENTS
123 !| GLOSEG2 |-->| SECOND POINT OF SEGMENTS
124 !| H |<->| NEW DEPTH
125 !| HBOR |-->| PRESCRIBED DEPTHS AT BOUNDARIES
126 !| HN |-->| OLD DEPTH
127 !| INFO |-->| IF YES, PRINTING INFORMATION ON LISTING
128 !| KDIR |-->| CONVENTION FOR DIRICHLET BOUNDARY CONDITION
129 !| LIMPRO |-->| TYPE OF BOUNDARY CONDITIONS
130 !| | | IF EQUAL TO KDIR: PRESCRIBED DEPTH.
131 !| MESH |<->| MESH STRUCTURE
132 !| NAMECODE |-->| NAME OF CALLING CODE (SISYPHE, TELEMEC2D, ETC.)
133 !| NBOR |-->| GLOBAL NUMBERS OF BOUNDARY POINTS
134 !| NITMAX |-->| MAXIMUM NUMBER OF ITERATIONS
135 !| NPOIN |-->| NUMBER OF POINTS IN THE MESH
136 !| NPTFR |-->| NUMBER OF BOUNDARY POINTS
137 !| OPTION |-->| OPTION OF ALGORITHM FOR EDGE-BASED ADVECTION
138 !| | | 1: TRIANGLES, COMPATIBLE WITH ERIA
139 !| | | 2: SEGMENTS, COMPATIBLE WITH NERD
140 !| OPTSOU |-->| OPTION FOR SOURCES 1: NORMAL 2: DIRAC
141 !| PLUIE |-->| RAIN IN A BIEF_OBJ, IN M/S.
142 !| RAIN |-->| IF YES, THERE IS RAIN OR EVAPORATION
143 !| SMH |-->| SOURCE TERMS
144 !| T1 |-->| WORK ARRAY
145 !| T2 |-->| WORK ARRAY
146 !| T3 |-->| WORK ARRAY
147 !| T4 |-->| WORK ARRAY
148 !| UNSV2D |-->| INVERSE OF INTEGRAL OF BASIS FUNCTIONS
149 !| YASMH |-->| IF(YES) SMH MUST BE TAKEN INTO ACCOUNT
150 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
151 !
152  USE bief, ex_positive_depths => positive_depths
154 !
156  IMPLICIT NONE
157 !
158 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
159 !
160  INTEGER, INTENT(IN) :: NPOIN,NPTFR,OPTSOU,KDIR,OPTION
161  INTEGER, INTENT(IN) :: NITMAX
162  INTEGER, INTENT(IN) :: GLOSEG1(*),GLOSEG2(*)
163  INTEGER, INTENT(IN) :: NBOR(nptfr)
164  INTEGER, INTENT(IN) :: LIMPRO(nptfr)
165  DOUBLE PRECISION, INTENT(IN) :: DT,HBOR(nptfr)
166  DOUBLE PRECISION, INTENT(INOUT) :: FLULIM(*)
167  TYPE(bief_mesh),INTENT(INOUT) :: MESH
168  DOUBLE PRECISION, INTENT(INOUT) :: FLOPOINT(mesh%nelmax,3)
169  TYPE(bief_obj), INTENT(INOUT) :: T1,T2,T3,T4,FLODEL,H,FLBOR
170  TYPE(bief_obj), INTENT(INOUT) :: PLUIE
171  TYPE(bief_obj), INTENT(IN) :: UNSV2D,HN,SMH
172  LOGICAL, INTENT(IN) :: YASMH,INFO,RAIN,COMPUTE_FLODEL
173  CHARACTER(LEN=24) :: NAMECODE
174  LOGICAL, INTENT(IN), OPTIONAL :: DOFLULIM,DOFLULIMEBE
175  DOUBLE PRECISION, INTENT(INOUT),
176  & OPTIONAL, TARGET :: flulimebe(mesh%NELMAX,3)
177 !
178 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
179 !
180  LOGICAL MAKEFLULIM,MAKEFLULIMEBE
181  DOUBLE PRECISION, POINTER :: PT_FLULIMEBE(:,:)
182 !
183 !-----------------------------------------------------------------------
184 !
185  IF(PRESENT(doflulim)) THEN
186  makeflulim=doflulim
187  ELSE
188 ! DEFAULT VALUE (FLULIM WAS ALWAYS DONE BEFORE INTRODUCING DOFLULIM)
189  makeflulim=.true.
190  ENDIF
191  IF(PRESENT(doflulimebe)) THEN
192  makeflulimebe=doflulimebe
193  ELSE
194 ! DEFAULT VALUE (FLULIMEBE WAS NOT DONE BEFORE INTRODUCING DOFLULIMEBE)
195  makeflulimebe=.false.
196  ENDIF
197 !
198  IF(makeflulimebe.AND..NOT.PRESENT(flulimebe)) THEN
199  WRITE(lu,*) 'POSITIVE_DEPTHS: '
200  WRITE(lu,*) 'MISSING ARGUMENT FLULIMEBE'
201  CALL plante(1)
202  stop
203  ELSEIF(PRESENT(flulimebe)) THEN
204  pt_flulimebe=>flulimebe
205  ENDIF
206 !
207 !-----------------------------------------------------------------------
208 !
209  IF(option.EQ.1) THEN
210  CALL positive_depths_eria(t1,t2,t3,t4,h,hn,mesh,flodel,
211  & compute_flodel,flbor,dt,
212  & unsv2d,npoin,gloseg1,gloseg2,
213  & nbor,nptfr,smh,yasmh,pluie,rain,
214  & optsou,limpro,hbor,kdir,info,
215  & flopoint,namecode,nitmax,
216  & makeflulimebe,pt_flulimebe)
217  ELSEIF(option.EQ.2) THEN
218  CALL positive_depths_nerd(t1,t2,t4,h,hn,mesh,flodel,
219  & compute_flodel,flbor,dt,
220  & unsv2d,npoin,gloseg1,gloseg2,
221  & nbor,nptfr,smh,yasmh,pluie,rain,
222  & optsou,flulim,limpro,hbor,kdir,info,
223  & flopoint,namecode,nitmax,makeflulim)
224  ELSE
225  WRITE(lu,*) 'UNKNOWN OPTION IN POSITIVE_DEPTHS: ',option
226  CALL plante(1)
227  stop
228  ENDIF
229 !
230 !-----------------------------------------------------------------------
231 !
232  RETURN
233  END
234 
subroutine positive_depths_eria(T1, T2, T3, T4, H, HN, MESH, FLODEL, COMPUTE_FLODEL, FLBOR, DT, UNSV2D, NPOIN, GLOSEG1, GLOSEG2, NBOR, NPTFR, SMH, YASMH, PLUIE, RAIN, OPTSOU, LIMPRO, HBOR, KDIR, INFO, FLOPOINT, NAMECODE, NITMAX, MAKEFLULIMEBE, FLULIMEBE)
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 positive_depths(T1, T2, T3, 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, OPTION, NITMAX, DOFLULIM, FLULIMEBE, DOFLULIMEBE)
Definition: bief.f:3