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