The TELEMAC-MASCARET system  trunk
init_avai.f
Go to the documentation of this file.
1 ! ********************
2  SUBROUTINE init_avai
3 ! ********************
4 !
5 !
6 !***********************************************************************
7 ! SISYPHE V6P2 21/07/2011
8 !***********************************************************************
9 !
10 !brief INITIAL FRACTION DISTRIBUTION AND LAYER THICKNESS.
11 !
12 !note PHILOSOPHY: INIT_COMPO DEFINES THE STRATIFICATION CORRESPONDING
13 !+ TO THE BOTTOM INITIAL COMPOSITION; NCOUCHES CORRESPONDS
14 !+ TO THE NUMBER OF REAL INITIAL LAYERS.
15 !note INIT_AVAI CORRECTS AND SUPPLEMENTS THIS STRATIFICATION
16 !+ IF PROBLEMS, AND ADDS THE ACTIVE LAYER; NLAYER CORRESPONDS
17 !+ TO THE NUMBER OF LAYERS USED IN THE COMPUTATION.
18 !
19 !history BUI MINH DUC
20 !+ 2002
21 !+
22 !+ INITIAL FRACTION DISTRIBUTION FOR NON-UNIFORM BED MATERIALS
23 !
24 !history MATTHIEU GONZALES DE LINARES
25 !+ 2002/2003
26 !+
27 !+
28 !
29 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
30 !+ 13/07/2010
31 !+ V6P0
32 !+ Translation of French comments within the FORTRAN sources into
33 !+ English comments
34 !
35 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
36 !+ 21/08/2010
37 !+ V6P0
38 !+ Creation of DOXYGEN tags for automated documentation and
39 !+ cross-referencing of the FORTRAN sources
40 !
41 !history J.RIEHME (ADJOINTWARE)
42 !+ November 2016
43 !+ V7P2
44 !+ Replaced EXTERNAL statements to parallel functions / subroutines
45 !+ by the INTERFACE_PARALLEL
46 !
47 !!history R.KOPMANN (BAW)
48 !+ Januar 2018
49 !+ V7P3
50 !+ Checks for bad layer thicknesses and fractions
51 !
52 !history R.KOPMANN (BAW)
53 !+ 15/02/2019
54 !+ V7P2
55 !+ Adding initial volume for mass balance
56 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
57 !
58  USE bief
61  USE interface_sisyphe, ex_init_avai=> init_avai
62 !
64  USE interface_parallel, ONLY : p_dsum
65  IMPLICIT NONE
66 !
67 !
68 !-----------------------------------------------------------------------
69 !
70  INTEGER I,J,K,NMAXI
71 !
72  DOUBLE PRECISION HAUTSED,TEST1
73 !
74 !-----------------------------------------------------------------------
75 !
76  nmaxi = 0
77 !
78 ! THE INITIAL NUMBER OF LAYERS, THEIR THICKNESS AND THEIR COMPOSITION
79 ! ARE SET BY THE USER
80 !
81 ! NOTE: WHEN COMPUTATION CONTINUED INIT_COMPO MUST NOT
82 ! CHANGE ES AND AVAIL
83 !
84  IF(debu) THEN
85 ! TODO: TENTATIVE VALUE, THIS IS TO CHECK
86  DO j=1,npoin
87  i=1
88  IF(nomblay.GE.2) THEN
89  DO k=2,nomblay
90  IF(es(j,k).GT.0.d0) i = i + 1
91  ENDDO
92  ENDIF
93  nlayer%I(j)=i
94 ! CHECKING ALL LAYERS AND CORRECTING AVAIL
95 ! DUE TO POSSIBLE SHIFT OF SINGLE PRECISION STORAGE
96  DO k=1,nlayer%I(j)
97  test1=0.d0
98  DO i=1,nsicla
99  test1=test1+avail(j,k,i)
100  ENDDO
101  IF(test1.GT.1.d-10.AND.(test1-1.d0)**2.GT.1.d-10) THEN
102  DO i=1,nsicla
103  avail(j,k,i)=avail(j,k,i)/test1
104  ENDDO
105  ENDIF
106  ENDDO
107  ENDDO
108  ELSE
109 !
110  CALL init_compo(it1%I)
111 !
112  DO j=1,npoin
113 !
114 ! NOMBLAY IS THE MAXIMUM NUMBER OF LAYERS ALLOWED
115 !
116  nlayer%I(j) = it1%I(j)
117  IF(nlayer%I(j).GT.nomblay) THEN
118  WRITE(lu,1815) nomblay
119  CALL plante(1)
120  stop
121  ENDIF
122 !
123 ! THE HEIGHT OF SEDIMENT (SUM OF ES) MUST NOT BE MORE THAN ZF-ZR
124 ! IF SO, THE HEIGHT OF THE LAST LAYER IS REDUCED
125 ! IF THERE ARE LAYERS UNDER ZR, THEY ARE NOT TAKEN INTO ACCOUNT
126  hautsed = 0.d0
127  DO k=1,it1%I(j)
128  IF(hautsed + es(j,k) .GE. zf%R(j) - zr%R(j)) THEN
129  es(j,k) = zf%R(j) - zr%R(j) - hautsed
130  nlayer%I(j) = k
131  hautsed = hautsed + es(j,k)
132  EXIT
133  ENDIF
134  hautsed = hautsed + es(j,k)
135  ENDDO
136 !
137 ! OTHER LAYERS SET TO 0.D0
138 !
139  IF(nlayer%I(j).LT.nomblay) THEN
140  DO k=nlayer%I(j)+1,nomblay
141  es(j,k) = 0.d0
142  ENDDO
143  ENDIF
144 !
145 ! THE THICKNESS OF THE LAST LAYER IS ENLARGED SO THAT
146 ! THE HEIGHT OF SEDIMENT (SUM OF ES) IS EQUAL TO ZF-ZR
147 !
148  IF(hautsed.LT.zf%R(j)-zr%R(j)) THEN
149  es(j,nlayer%I(j))=es(j,nlayer%I(j))+zf%R(j)-zr%R(j)-hautsed
150  ENDIF
151 !
152  IF(nlayer%I(j).GT.1) THEN
153 ! IT IS ASSUMED THAT ELAY0 IS SMALLER THAN THE FIRST STRATUM
154 ! NEED TO ADD THE CASE WHERE ELAY0 IS LARGER
155  IF(elay0.GT.es(j,1)) THEN
156  WRITE(lu,*) ' ACTIVE LAYER TOO BIG/STRATIFICATION'
157  CALL plante(1)
158  stop
159  ENDIF
160  ENDIF
161 !
162 ! THE FIRST STRATUM IS SEPARATED BETWEEN ACTIVE LAYER + ACTIVE STRATUM
163 !
164  IF(elay0.LT.es(j,1)) THEN
165  nlayer%I(j) = nlayer%I(j) + 1
166  IF(nlayer%I(j).GT.nomblay) THEN
167  WRITE(lu,1815) nomblay
168  CALL plante(1)
169  stop
170  ENDIF
171 ! INDICES FOR ES AND AVAIL NEED TO BE OFFSET
172  IF(nlayer%I(j).GT.2) THEN
173  DO k=nlayer%I(j),3,-1
174  es(j,k) = es(j,k-1)
175  ENDDO
176  ENDIF
177  es(j,2) = es(j,1) - elay0
178  es(j,1) = elay0
179  DO i=1,nsicla
180  DO k=nlayer%I(j),2,-1
181  avail(j,k,i) = avail(j,k-1,i)
182  ENDDO
183  ENDDO
184  ENDIF
185 !
186  ENDDO !J
187 !
188  ENDIF
189 !
190  nmaxi=0
191  DO j=1,npoin
192 !
193 ! CHECKS FOR BAD LAYER THICKNESSES
194  DO k=1,nomblay
195  IF(es(j,k).LT.0.d0) THEN
196  WRITE(lu,*)'BAD LAYER THICKNESS',j,k ,' :',es(j,k)
197  CALL plante(1)
198  stop
199  ENDIF
200 ! CHECKS FOR BAD AVAI
201  DO i=1,nsicla
202  IF(avail(j,k,i).LT.0.d0.OR.avail(j,k,i).GT.1.d0) THEN
203  WRITE(lu,*)'BAD FRACTIONS',j,k,i ,' :',avail(j,k,i)
204  CALL plante(1)
205  stop
206  ENDIF
207  END DO
208  END DO
209 !
210  elay%R(j) = es(j,1)
211  IF(nlayer%I(j).GT.1) THEN
212  estrat%R(j) = es(j,2)
213  ENDIF
214 !
215 ! UNUSED AVAIL ARE FILLED WITH ZEROS (IS IT USEFUL ???)
216 !
217  IF(nlayer%I(j).LT.nomblay) THEN
218  DO i = 1, nsicla
219  DO k = nlayer%I(j)+1,nomblay
220  avail(j,k,i) = 0.d0
221  ENDDO
222  ENDDO
223  ENDIF
224  IF(nlayer%I(j).GT.nmaxi) nmaxi = nlayer%I(j)
225  ENDDO
226 !
227 ! COMPUTES THE TOTAL VOLUME OF SEDIMENTS IN EACH CLASS
228 !
229  DO i=1,nsicla
230  voltot(i)=0.d0
231  DO j=1,npoin
232  DO k=1,nlayer%I(j)
233  voltot(i) = voltot(i) + es(j,k)*avail(j,k,i)*volu2d%R(j)
234  ENDDO
235  ENDDO
236  ENDDO
237 !
238  IF(ncsize.GT.1) THEN
239  DO i=1,nsicla
240  voltot(i) = p_dsum(voltot(i))
241  ENDDO
242  ENDIF
243  volini = voltot
244 !
245  WRITE(lu,*) 'MAXIMUM INITIAL NUMBER OF LAYERS :',nmaxi
246  DO i=1,nsicla
247  WRITE(lu,*)'TOTAL VOLUME OF CLASS ',i ,' :',voltot(i)
248  ENDDO
249 !
250 !-----------------------------------------------------------------------
251 !
252 1815 FORMAT(1x,'THERE ARE MORE THAN ',1i3,' LAYERS IN STRATIFICATION')
253 !
254 !-----------------------------------------------------------------------
255 !
256  RETURN
257  END
type(bief_obj), target zr
type(bief_obj), target nlayer
type(bief_obj), target zf
type(bief_obj), target it1
type(bief_obj), target estrat
double precision, dimension(nsiclm) volini
double precision, dimension(:), pointer x
double precision, dimension(nsiclm) voltot
subroutine init_compo(NCOUCHES)
Definition: init_compo.f:7
double precision function p_dsum(MYPART)
Definition: p_dsum.F:7
double precision, dimension(:,:,:), allocatable, target avail
type(bief_obj), target volu2d
subroutine init_avai
Definition: init_avai.f:4
type(bief_obj), target elay
double precision, dimension(:,:), allocatable, target es
Definition: bief.f:3