51
52
53
59 use element_mod , only : nixc,nixtg
60
61
62
63#include "implicit_f.inc"
64
65
66
67
68#include "com04_c.inc"
69
70
71#include "param_c.inc"
72
73#include "units_c.inc"
74
75
76
77 TYPE(UNIT_TYPE_), INTENT(IN) :: UNITAB
78 INTEGER, INTENT(IN) :: NPC(*), ITAB(*), IXC(NIXC, *), IXTG(NIXTG, *)
79 my_real,
INTENT(IN) :: x(3, *), geo(npropg, *), pm(npropm, *)
80 TYPE (SURF_), INTENT(INOUT), DIMENSION(NSURF) :: IGRSURF
81 TYPE(MONVOL_STRUCT_), INTENT(INOUT) :: T_MONVOLN
82 TYPE(SUBMODEL_DATA), DIMENSION(NSUBMOD), INTENT(IN) :: LSUBMODEL
83
84
85
86 INTEGER :: II
87 INTEGER :: SURFID, IFUNCT_ID(6), IFBULK, IFMIN, IFMOUTT, IFMOUTP, IFP0, IFPMAX
90 my_real :: sa, rot, vol, vmin, veps, amu, sv
91 my_real :: rhoi, sfbulk, sfmin, sfmoutt, sfmoutp, sfp0, sfpmax
92 LOGICAL :: FOUND
93 LOGICAL :: IS_AVAILABLE
94
95
96
97
98
99
100
101 CALL hm_get_intv(
'surf_IDex', surfid, is_available, lsubmodel)
102
103 CALL hm_get_floatv(
'Ascalet', scal_t, is_available, lsubmodel, unitab)
104 CALL hm_get_floatv(
'AscaleP', scal_p, is_available, lsubmodel, unitab)
105
106 CALL hm_get_floatv(
'Rho', rhoi, is_available, lsubmodel, unitab)
107
108 CALL hm_get_intv(
'fct_K', ifbulk, is_available, lsubmodel)
109 CALL hm_get_intv(
'fct_Mtin', ifmin, is_available, lsubmodel)
110 CALL hm_get_floatv(
'Fscale_K', sfbulk, is_available, lsubmodel, unitab)
111 CALL hm_get_floatv(
'Fscale_Mtin', sfmin, is_available, lsubmodel, unitab)
112
113 CALL hm_get_intv(
'fct_Mtout', ifmoutt, is_available, lsubmodel)
114 CALL hm_get_intv(
'fct_Mpout', ifmoutp, is_available, lsubmodel)
115 CALL hm_get_floatv(
'Fscale_Mtout', sfmoutt, is_available, lsubmodel, unitab)
116 CALL hm_get_floatv(
'Fscale_Mpout', sfmoutp, is_available, lsubmodel, unitab)
117
118 CALL hm_get_intv(
'fct_Padd', ifp0, is_available, lsubmodel)
119 CALL hm_get_intv(
'fct_Pmax', ifpmax, is_available, lsubmodel)
120 CALL hm_get_floatv(
'Fscale_Padd', sfp0, is_available, lsubmodel, unitab)
121 CALL hm_get_floatv(
'Fscale_Pmax', sfpmax, is_available, lsubmodel, unitab)
122
123
124
125
126 t_monvoln%IVOLU(4) = 0
127 found = .false.
128 DO ii = 1, nsurf
129 IF (surfid == igrsurf(ii)%ID) THEN
130 t_monvoln%IVOLU(4) = ii
131 t_monvoln%EXT_SURFID = ii
132 found = .true.
133 EXIT
134 ENDIF
135 ENDDO
136 IF (.NOT. found) THEN
138 ELSEIF (igrsurf(t_monvoln%EXT_SURFID)%ISH4N3N == 0) THEN
139 CALL ancmsg(msgid = 18, anmode = aninfo, msgtype = msgerror,
140 . i1 = t_monvoln%ID, c1 = t_monvoln%TITLE, i2 = surfid)
142 ENDIF
143
144
146
148 . igrsurf(t_monvoln%EXT_SURFID),ixc, ixtg, x, 10)
149
150 CALL monvol_compute_volume(t_monvoln, t_monvoln%TITLE, t_monvoln%IVOLU, igrsurf(t_monvoln%EXT_SURFID),
151 . itab, x, pm, geo, ixc, ixtg,
152 . sa, rot, vol, vmin, veps, sv)
153
155 . igrsurf(t_monvoln%EXT_SURFID),ixc,ixtg,vol, x, 10)
156
157
158 ifunct_id(1:6) = 0
159 IF (ifbulk > 0) THEN
161 IF (.NOT. found) THEN
162 CALL ancmsg(msgid = 9, anmode = aninfo, msgtype = msgerror,
163 . i2 = ifbulk, i1 = t_monvoln%ID, c1 = t_monvoln%TITLE, c2 = 'BULK')
164 ENDIF
165 ENDIF
166 IF (ifmin > 0) THEN
168 IF (.NOT. found) THEN
169 CALL ancmsg(msgid = 9, anmode = aninfo, msgtype = msgerror,
170 . i2 = ifmin, i1 = t_monvoln%ID, c1 = t_monvoln%TITLE, c2 = 'MASS FLOW')
171 ENDIF
172 ENDIF
173 IF (ifmoutt > 0) THEN
175 IF (.NOT. found) THEN
176 CALL ancmsg(msgid = 9, anmode = aninfo, msgtype = msgerror,
177 . i2 = ifmoutt, i1 = t_monvoln%ID, c1 = t_monvoln%TITLE, c2 = 'MASS FLOW')
178 ENDIF
179 ENDIF
180 IF (ifmoutp > 0) THEN
182 IF (.NOT. found) THEN
183 CALL ancmsg(msgid = 9, anmode = aninfo, msgtype = msgerror,
184 . i2 = ifmoutp, i1 = t_monvoln%ID, c1 = t_monvoln%TITLE, c2 = 'MASS FLOW')
185 ENDIF
186 ENDIF
187 IF (ifp0 > 0) THEN
189 IF (.NOT. found) THEN
190 CALL ancmsg(msgid = 9, anmode = aninfo, msgtype = msgerror,
191 . i2 = ifp0, i1 = t_monvoln%ID, c1 = t_monvoln%TITLE, c2 = 'PRESSURE')
192 ENDIF
193 ENDIF
194 IF (ifpmax > 0) THEN
196 IF (.NOT. found) THEN
197 CALL ancmsg(msgid = 9, anmode = aninfo, msgtype = msgerror,
198 . i2 = ifpmax, i1 = t_monvoln%ID, c1 = t_monvoln%TITLE, c2 = 'PRESSURE')
199 ENDIF
200 ENDIF
201
202
203
204 IF (scal_t == zero) THEN
206 scal_t = one * fac_gen
207 ENDIF
208 IF (scal_p == zero) THEN
210 scal_p = one * fac_gen
211 ENDIF
212
213 IF (ifbulk > 0) THEN
214 IF (sfbulk == zero) THEN
216 sfbulk = one * fac_gen
217 ENDIF
218 ENDIF
219 IF (ifmin > 0) THEN
220 IF (sfmin == zero) THEN
222 sfmin = one * fac_gen
223 ENDIF
224 ENDIF
225 IF (ifmoutt > 0) THEN
226 IF (sfmoutt == zero) THEN
228 sfmoutt = one * fac_gen
229 ENDIF
230 ENDIF
231 IF (ifmoutp > 0) THEN
232 IF (sfmoutp == zero) THEN
234 sfmoutp = one * fac_gen
235 ENDIF
236 ENDIF
237 IF (ifp0 > 0) THEN
238 IF (sfp0 == zero) THEN
240 sfp0 = one * fac_gen
241 ENDIF
242 ENDIF
244 IF (ifpmax > 0) THEN
245 IF (sfpmax == zero) THEN
246 sfpmax = one * fac_gen
247 ENDIF
248 ELSE
249 sfpmax = infinity * fac_gen
250 ENDIF
251
252
253
254
255 t_monvoln%IVOLU(21) = ifunct_id(1)
256 t_monvoln%RVOLU(35) = sfbulk
257 t_monvoln%IVOLU(22) = ifunct_id(2)
258 t_monvoln%RVOLU(36) = sfmin
259 t_monvoln%IVOLU(23) = ifunct_id(3)
260 t_monvoln%RVOLU(37) = sfmoutt
261 t_monvoln%IVOLU(24) = ifunct_id(4)
262 t_monvoln%RVOLU(38) = sfmoutp
263 t_monvoln%IVOLU(25) = ifunct_id(5)
264 t_monvoln%RVOLU(39) = sfp0
265 t_monvoln%IVOLU(26) = ifunct_id(6)
266 t_monvoln%RVOLU(40) = sfpmax
267
268 t_monvoln%RVOLU(26) = one / scal_t
269 t_monvoln%RVOLU(27) = one / scal_p
270 t_monvoln%RVOLU(28) = one
271 t_monvoln%RVOLU(29) = one
272 t_monvoln%RVOLU(30) = one
273
274 t_monvoln%RVOLU(34) = rhoi
275
276 veps =
max(zero, vmin - vol)
277 t_monvoln%RVOLU(4) = vol + veps
278 t_monvoln%RVOLU(17) = veps
279 t_monvoln%RVOLU(20)= rhoi*vol
280
281 amu = zero
282 t_monvoln%RVOLU(2) = amu
283 t_monvoln%RVOLU(16) = vol + veps
284 t_monvoln%RVOLU(18) = sa
285 t_monvoln%RVOLU(21) = rot
286 t_monvoln%RVOLU(22:24) = zero
287
288
289
290
291 WRITE(iout, 1005) surfid
292 WRITE(iout, 1003) scal_t, scal_p
293 WRITE(iout, 1002) sa, sv, vol
294 WRITE(iout,1800) rhoi, ifbulk, sfbulk, ifmin, sfmin, ifmoutt, sfmoutt,
295 . ifmoutp, sfmoutp, ifp0, sfp0, ifpmax, sfpmax
296
297
298
299
300 RETURN
301 1002 FORMAT(
302 . /5x,'INITIAL SURFACE OF MONITORED VOLUME . .=',1pg20.13,
303 . /5x,'SURFACE ERROR(NE.0 FOR NON CLOSED SURF)=',1pg20.13,
304 . /5x,'INITIAL VOLUME OF MONITORED VOLUME. . .=',1pg20.13)
305 1003 FORMAT(
306 . 5x,'UNIT SCALE FOR TIME FUNCTIONS =',1pg20.13,
307 . /5x,'UNIT SCALE FOR PRESSURE FUNCTIONS =',1pg20.13)
308 1005 FORMAT( 5x,'EXTERNAL SURFACE ID . . . . . . . . . .=',i10)
309
310 1800 FORMAT(
311 . 5x,'FLUID DENSITY. . . . . . . . . . . . . . . . . . . . . =',1pg20.13,
312 . /5x,'BULK TIME FUNCTION. . . . . . . . . . . . . . . . . . .=',i10,
313 . /5x,'BULK TIME FUNCTION SCALE FACTOR. . . . . . . . . . . . =',1pg20.13,
314 . /5x,'INPUT MASS FLOW RATE TIME FUNCTION. . . . . . . . . . .=',i10,
315 . /5x,'INPUT MASS FLOW RATE TIME FUNCTION SCALE FACTOR. . . . =',1pg20.13,
316 . /5x,'OUTPUT MASS FLOW RATE TIME FUNCTION. . . . . . . . . . =',i10,
317 . /5x,'OUTPUT MASS FLOW RATE TIME FUNCTION SCALE FACTOR. . . .=',1pg20.13,
318 . /5x,'OUTPUT MASS FLOW RATE PRESSURE FUNCTION. . . . . . . . =',i10,
319 . /5x,'OUTPUT MASS FLOW RATE PRESSURE FUNCTION SCALE FACTOR. .=',1pg20.13,
320 . /5x,'ADDITIONAL PRESSURE TIME FUNCTION. . . . . . . . . . . =',i10,
321 . /5x,'ADDITIONAL PRESSURE TIME FUNCTION SCALE FACTOR. . . . .=',1pg20.13,
322 . /5x,'MAXIMUM PRESSURE TIME FUNCTION. . . . . . . . . . . . .=',i10,
323 . /5x,'MAXIMUM PRESSURE TIME FUNCTION SCALE FACTOR. . . . . . =',1pg20.13)
subroutine check_function_id(npc, nfunct, ifunct_in, ifunct_out, ifound)
subroutine hm_get_floatv(name, rval, is_available, lsubmodel, unitab)
subroutine hm_get_floatv_dim(name, dim_fac, is_available, lsubmodel, unitab)
subroutine hm_get_intv(name, ival, is_available, lsubmodel)
subroutine monvol_compute_volume(t_monvoln, title, ivolu, surf, itab, node_coord, pm, geo, ixc, ixtg, sa, rot, vol, vmin, veps, sv)
subroutine monvol_check_surfclose(t_monvoln, itab, surf, x)
subroutine monvol_orient_surf(t_monvoln, title, ivolu, itab, surf, ixc, ixtg, x, itype)
subroutine monvol_reverse_normals(t_monvoln, title, ivolu, itab, surf, ixc, ixtg, vol, x, itype)
subroutine ancmsg(msgid, msgtype, anmode, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, r1, r2, r3, r4, r5, r6, r7, r8, r9, c1, c2, c3, c4, c5, c6, c7, c8, c9, prmode)