37 SUBROUTINE iniebcs(ALE_CONNECTIVITY, IFLAG,IGRSURF, IXS, IXQ, IXTG,
38 . PM, IGEO, X, SENSORS, IVOLU, MULTI_FVM_IS_USED, EBCS_TAB, EBCS_TAG_CELL_SPMD,ITAB)
48 use element_mod ,
only : nixs,nixc,nixq,nixtg
49 USE ebcs_cyclic_surface_matching_mod,
ONLY : ebcs_cyclic_surface_matching
53#include "implicit_f.inc"
60#include "tabsiz_c.inc"
65 INTEGER,
INTENT(IN) :: ITAB(NUMNOD)
66 INTEGER,
INTENT(IN),
TARGET :: IXS(NIXS,NUMELS),IXQ(NIXQ,NUMELQ),IXTG(NIXTG,NUMELTG)
67 INTEGER,
INTENT(IN) :: IVOLU(NIMV,*)
68 LOGICAL,
INTENT(IN) :: MULTI_FVM_IS_USED
69 INTEGER,
INTENT(INOUT) :: EBCS_TAG_CELL_SPMD(NUMELQ+NUMELTG+NUMELS)
70 my_real,
INTENT(IN) :: pm(npropm,nummat),x(sx)
71 TYPE (SURF_) ,
DIMENSION(NSURF) :: IGRSURF
72 TYPE(t_ebcs_tab),
TARGET,
INTENT(INOUT) :: EBCS_TAB
73 INTEGER,
INTENT(IN) :: IFLAG, IGEO(NPROPGI,NUMGEO)
74 TYPE (SENSORS_) ,
INTENT(IN) :: SENSORS
78 INTEGER,
DIMENSION(:),
ALLOCATABLE :: MWA
79 INTEGER I,TYP,ID,ISU,NSEG,IDSU,K1,SENS,VOLU,J,KK,LENMWA,ERR,ICELL
81 class(t_ebcs),
POINTER :: ebcs
82 INTEGER :: JALE_FROM_MAT, JALE_FROM_PROP, IS_ALE_EULER
84 INTEGER,
DIMENSION(:, :),
POINTER :: IX
86 INTEGER :: ISU2, IDSU2
88 integer,
target :: nothing(1,1)
90 ebcs_tag_cell_spmd(1:numelq+numeltg+numels)=0
95 lenmwa = numnod+2+8*numels
96 ALLOCATE(mwa(lenmwa), stat=err)
98 CALL ancmsg(msgid=268,anmode=aninfo,msgtype=msgerror,c1=
'EBCS')
100 CALL icinvs(8, numels, nixs, ixs, mwa, mwa(1+(2+numnod)))
101 ix => ixs(1:nixs, 1:numels)
104 ELSEIF (numelq /= 0)
THEN
105 lenmwa = numnod + 2 + 4 * numelq
106 ALLOCATE(mwa(lenmwa), stat=err)
108 CALL ancmsg(msgid=268,anmode=aninfo,msgtype=msgerror,c1=
'EBCS')
110 CALL icinvs(4, numelq, nixq, ixq, mwa, mwa(1+(2+numnod)))
111 ix => ixq(1:nixq, 1:numelq)
114 ELSEIF (numeltg /= 0 .AND. multi_fvm_is_used)
THEN
115 lenmwa = numnod + 2 + 3 * numeltg
116 ALLOCATE(mwa(lenmwa), stat=err)
118 CALL ancmsg(msgid=268,anmode=aninfo,msgtype=msgerror,c1=
'EBCS')
120 CALL icinvs(3, numeltg, nixtg, ixtg, mwa, mwa(1+(2+numnod)))
121 ix => ixtg(1:nixtg, 1:numeltg)
127 ebcs => ebcs_tab%tab(i)%poly
133 TYPE IS (t_ebcs_gradp0)
135 ebcs%has_vold = .true.
136 IF(iflag==0)
ALLOCATE(ebcs%vold(ebcs%nb_node))
137 ebcs%vold(1:ebcs%nb_node) = zero
140 IF(iflag==0)
ALLOCATE(ebcs%pold(ebcs%nb_node))
141 ebcs%pold(1:ebcs%nb_node) = zero
145 ebcs%p0(1:ebcs%nb_node) = zero
147 ebcs%has_iface = .true.
148 IF(iflag==0)
ALLOCATE(ebcs%iface(ebcs%nb_elem))
149 ebcs%iface(1:ebcs%nb_elem) = 0
152 IF(iflag==0)
ALLOCATE(ebcs%la(3, ebcs%nb_node))
153 ebcs%la(1:3, 1:ebcs%nb_node) = zero
154 TYPE IS (t_ebcs_iniv)
156 ebcs%has_reso = .true.
157 IF(iflag==0)
ALLOCATE(ebcs%reso(3, ebcs%nb_node))
158 ebcs%reso(1:3, 1:ebcs%nb_node) = zero
160 ebcs%has_ro0 = .true.
161 IF(iflag==0)
ALLOCATE(ebcs%ro0(ebcs%nb_elem))
162 ebcs%ro0(1:ebcs%nb_elem) = zero
164 ebcs%has_en0 = .true.
165 IF(iflag==0)
ALLOCATE(ebcs%en0(ebcs%nb_elem))
166 ebcs%en0(1:ebcs%nb_elem) = zero
169 IF(iflag==0)
ALLOCATE(ebcs%v0(3, ebcs%nb_node))
170 ebcs%v0(1:3, 1:ebcs%nb_node) = zero
173 IF(iflag==0)
ALLOCATE(ebcs%la(3, ebcs%nb_node))
174 ebcs%la(1:3, 1:ebcs%nb_node) = zero
175 TYPE IS (t_ebcs_pres)
177 ebcs%has_vold = .true.
178 IF(iflag==0)
ALLOCATE(ebcs%vold(ebcs%nb_node))
179 ebcs%vold(1:ebcs%nb_node) = zero
181 ebcs%has_pold = .true.
182 IF(iflag==0)
ALLOCATE(ebcs%pold(ebcs%nb_node))
183 ebcs%pold(1:ebcs%nb_node) = zero
186 IF(iflag==0)
ALLOCATE(ebcs%la(3, ebcs%nb_node))
187 ebcs%la(1:3, 1:ebcs%nb_node) = zero
188 TYPE IS (t_ebcs_valvin)
190 ebcs%has_vold = .true.
191 IF(iflag==0)
ALLOCATE(ebcs%vold(ebcs%nb_node))
192 ebcs%vold(1:ebcs%nb_node) = zero
194 ebcs%has_pold = .true.
195 IF(iflag==0)
ALLOCATE(ebcs%pold(ebcs%nb_node))
196 ebcs%pold(1:ebcs%nb_node) = zero
199 IF(iflag==0)
ALLOCATE(ebcs%la(3, ebcs%nb_node))
200 ebcs%la(1:3, 1:ebcs%nb_node) = zero
201 TYPE IS (t_ebcs_valvout)
203 ebcs%has_vold = .true.
204 IF(iflag==0)
ALLOCATE(ebcs%vold(ebcs%nb_node))
205 ebcs%vold(1:ebcs%nb_node) = zero
208 IF(iflag==0)
ALLOCATE(ebcs%pold(ebcs%nb_node))
209 ebcs%pold(1:ebcs%nb_node) = zero
212 IF(iflag==0)
ALLOCATE(ebcs%la(3, ebcs%nb_node))
213 ebcs%la(1:3, 1:ebcs%nb_node) = zero
216 ebcs%has_reso = .true.
217 IF(iflag==0)
ALLOCATE(ebcs%reso(3, ebcs%nb_node))
218 ebcs%reso(1:3, 1:ebcs%nb_node) = zero
221 IF(iflag==0)
ALLOCATE(ebcs%la(3, ebcs%nb_node))
222 ebcs%la(1:3, 1:ebcs%nb_node) = zero
223 TYPE IS(t_ebcs_normv)
225 ebcs%has_reso = .true.
226 IF(iflag==0)
ALLOCATE(ebcs%reso(3, ebcs%nb_node))
227 ebcs%reso(1:3, 1:ebcs%nb_node) = zero
230 IF(iflag==0)
ALLOCATE(ebcs%la(3, ebcs%nb_node))
231 ebcs%la(1:3, 1:ebcs%nb_node) = zero
232 TYPE IS (t_ebcs_inip)
234 ebcs%has_ro0 = .true.
235 IF(iflag==0)
ALLOCATE(ebcs%ro0(ebcs%nb_elem))
236 ebcs%ro0(1:ebcs%nb_elem) = zero
238 ebcs%has_en0 = .true.
239 IF(iflag==0)
ALLOCATE(ebcs%en0(ebcs%nb_elem))
240 ebcs%en0(1:ebcs%nb_elem) = zero
243 IF(iflag==0)
ALLOCATE(ebcs%p0(ebcs%nb_node))
244 ebcs%p0(1:ebcs%nb_node) = zero
246 ebcs%has_vold = .true.
247 IF(iflag==0)
ALLOCATE(ebcs%vold(ebcs%nb_node))
248 ebcs%vold(1:ebcs%nb_node) = zero
250 ebcs%has_pold = .true.
251 IF(iflag==0)
ALLOCATE(ebcs%pold(ebcs%nb_node))
252 ebcs%pold(1:ebcs%nb_node) = zero
255 IF(iflag==0)
ALLOCATE(ebcs%la(3, ebcs%nb_node
256 ebcs%la(1:3, 1:ebcs%nb_node) = zero
257 TYPE IS (t_ebcs_monvol)
258 volu = ebcs%monvol_id
259 sens = ebcs%sensor_id
261 IF (volu == ivolu(1,j))
THEN
263 ebcs%monvol_id = volu
267 DO j = 1, sensors%NSENSOR
268 IF (sens == sensors%SENSOR_TAB(j)%SENS_ID)
THEN
269 ebcs%monvol_id = sens
273 TYPE IS (t_ebcs_inlet)
274 ebcs%has_iface = .true.
275 IF(iflag==0)
ALLOCATE(ebcs%iface(ebcs%nb_elem))
276 ebcs%iface(1:ebcs%nb_elem) = 0
277 IF(.NOT. multi_fvm_is_used)
THEN
280 IF(iflag==0)
ALLOCATE(ebcs%la(3, ebcs%nb_node))
281 ebcs%la(1:3, 1:ebcs%nb_node) = zero
283 ebcs%has_area = .true.
284 IF(iflag==0)
ALLOCATE(ebcs%area(ebcs%nb_elem))
285 ebcs%area(1:ebcs%nb_elem) = zero
287 ebcs%has_dvnf = .true.
288 IF(iflag==0)
ALLOCATE(ebcs%dvnf(ebcs%nb_elem))
289 ebcs%dvnf(1:ebcs%nb_elem) = zero
292 IF(iflag==0)
ALLOCATE(ebcs%ng(ebcs%nb_elem))
293 ebcs%ng(1:ebcs%nb_elem) = 0
295 ebcs%has_iloc = .true.
296 IF(iflag==0)
ALLOCATE(ebcs%iloc(ebcs%nb_elem))
297 ebcs%iloc(1:ebcs%nb_elem) = 0
299 TYPE IS (t_ebcs_fluxout)
300 ebcs%has_iface = .true.
301 IF(iflag==0)
ALLOCATE(ebcs%iface(ebcs%nb_elem))
302 ebcs%iface(1:ebcs%nb_elem) = 0
304 IF(ebcs%is_multifluid)
THEN
310 ebcs%has_iface = .true.
311 IF(iflag==0)
ALLOCATE(ebcs%iface(nseg))
312 ebcs%iface(1:nseg) = 0
314 ebcs%has_vold = .true.
315 IF(iflag==0)
ALLOCATE(ebcs%vold(siz))
318 ebcs%has_Pold = .true.
319 IF(iflag==0)
ALLOCATE(ebcs%Pold(siz))
323 IF(iflag==0)
ALLOCATE(ebcs%la(3, ebcs%nb_node))
324 ebcs%la(1:3, 1:ebcs%nb_node) = zero
326 ebcs%has_dp0 = .true.
327 IF(iflag==0)
ALLOCATE(ebcs%dp0(nseg))
328 ebcs%dp0(1:nseg) = zero
330 TYPE IS (t_ebcs_propellant)
332 ebcs%has_iface = .true.
333 IF(iflag==0)
ALLOCATE(ebcs%iface(nseg))
334 ebcs%iface(1:nseg) = 0
337 IF(iflag==0)
ALLOCATE(ebcs%la(3, ebcs%nb_node))
338 ebcs%la(1:3, 1:ebcs%nb_node) = zero
340 ebcs%has_dp0 = .true.
341 IF(iflag==0)
ALLOCATE(ebcs%dp0(nseg))
342 ebcs%dp0(1:nseg) = zero
344 TYPE IS (t_ebcs_cyclic)
346 ebcs%has_iface = .true.
347 IF(iflag==0)
ALLOCATE(ebcs%iface(2*nseg))
348 ebcs%iface(1:2*nseg) = 0
351 IF(iflag==0)
ALLOCATE(ebcs%la(3, 2*ebcs%nb_node))
352 ebcs%la(1:3, 1:2*ebcs%nb_node) = zero
355 IF(iflag==0)
ALLOCATE(ebcs%ng(2*ebcs%nb_elem))
356 ebcs%ng(1:2*ebcs%nb_elem) = 0
358 ebcs%has_iloc = .true.
359 IF(iflag==0)
ALLOCATE(ebcs%iloc(2*ebcs%nb_elem))
360 ebcs%iloc(1:2*ebcs%nb_elem) = 0
365 idsu = igrsurf(isu)%ID
367 CALL findele(ale_connectivity, 8, nixs, idsu,id,nseg,nelem,ixs,
368 . ebcs%iseg, ebcs%ielem, ebcs%itype,ebcs%iface,
369 . igrsurf(isu)%NODES,mwa,mwa(1+(2+numnod)),pm,x,typ,igeo,itab)
370 ELSEIF (numelq /= 0)
THEN
371 CALL findele(ale_connectivity, 4, nixq, idsu,id,nseg,nelem,ixq,
372 . ebcs%iseg, ebcs%ielem,ebcs%itype, ebcs%iface,
373 . igrsurf(isu)%NODES,mwa,mwa(1+(2+numnod)),pm,x,typ,igeo,itab)
374 ELSEIF (numeltg /= 0)
THEN
375 CALL findele(ale_connectivity, 3, nixtg, idsu,id,nseg,nelem,ixtg,
376 . ebcs%iseg, ebcs%ielem,ebcs%itype, ebcs%iface,
377 . igrsurf(isu)%NODES,mwa,mwa(1+(2+numnod)),pm,x,typ,igeo,itab)
382 IF(ebcs%TYPE == 12)
THEN
383 select type (twf => ebcs_tab%tab(i)%poly)
384 TYPE IS (t_ebcs_cyclic)
387 idsu2 = igrsurf(isu2)%ID
389 CALL findele(ale_connectivity, 8, nixs, idsu2,id,nseg,nelem,ixs,
390 . ebcs%iseg(nseg+1), ebcs%ielem(nseg+1), ebcs%itype(nseg+1),ebcs%iface(nseg+1),
391 . igrsurf(isu2)%NODES,mwa,mwa(1+(2+numnod)),pm,x,typ,igeo,itab)
392 ELSEIF (numelq /= 0)
THEN
393 CALL findele(ale_connectivity, 4, nixq, idsu2,id,nseg,nelem,ixq,
394 . ebcs%iseg(nseg+1), ebcs%ielem(nseg+1),ebcs%itype(nseg+1), ebcs%iface(nseg+1),
395 . igrsurf(isu2)%NODES,mwa,mwa(1+(2+numnod)),pm,x,typ,igeo,itab)
396 ELSEIF (numeltg /= 0)
THEN
397 CALL findele(ale_connectivity, 3, nixtg, idsu2,id,nseg,nelem,ixtg,
398 . ebcs%iseg(nseg+1), ebcs%ielem(nseg+1),ebcs%itype(nseg+1), ebcs%iface(nseg+1),
399 . igrsurf(isu2)%NODES,mwa,mwa(1+(2+numnod)),pm,x,typ,igeo,itab)
402 CALL ebcs_cyclic_surface_matching(twf, ebcs, n2d, numnod, x)
404 ebcs%NB_ELEM = 2*ebcs%NB_ELEM
405 ebcs%NB_NODE = 2*ebcs%NB_NODE
413 IF(.NOT.ebcs%is_multifluid .AND. (typ == 0 .OR. typ == 8 .OR. typ == 10 .OR. typ == 11))
THEN
417 icell = ebcs%ielem(kk)
419 IF (ebcs%itype(kk)==4)k1=0
420 IF (ebcs%itype(kk)==3)k1=numelq
421 IF (ebcs%itype(kk)==8)k1=numelq+numeltg
422 IF(typ/=10 .AND. typ /= 11) ebcs_tag_cell_spmd(k1+icell)=1
430 icell = ebcs%IELEM(kk)
433 jale_from_mat = int(pm(72,imid))
434 jale_from_prop = igeo(62,ipid)
435 is_ale_euler = jale_from_mat + jale_from_prop
436 IF(is_ale_euler == 0 .AND. iflag == 0)
THEN
438 CALL ancmsg(msgid=1602,msgtype=msgerror,anmode=aninfo,i1 = ebcs%ebcs_id,c1 = trim(ebcs%title),
439 . c2 =
"EBCS ARE ONLY COMPATIBLE WITH ALE OR EULER FRAMEWORK")
449 IF (
ALLOCATED(mwa))
DEALLOCATE(mwa)