OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
hm_read_surf.F
Go to the documentation of this file.
1Copyright> OpenRadioss
2Copyright> Copyright (C) 1986-2025 Altair Engineering Inc.
3Copyright>
4Copyright> This program is free software: you can redistribute it and/or modify
5Copyright> it under the terms of the GNU Affero General Public License as published by
6Copyright> the Free Software Foundation, either version 3 of the License, or
7Copyright> (at your option) any later version.
8Copyright>
9Copyright> This program is distributed in the hope that it will be useful,
10Copyright> but WITHOUT ANY WARRANTY; without even the implied warranty of
11Copyright> MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12Copyright> GNU Affero General Public License for more details.
13Copyright>
14Copyright> You should have received a copy of the GNU Affero General Public License
15Copyright> along with this program. If not, see <https://www.gnu.org/licenses/>.
16Copyright>
17Copyright>
18Copyright> Commercial Alternative: Altair Radioss Software
19Copyright>
20Copyright> As an alternative to this open-source version, Altair also offers Altair Radioss
21Copyright> software under a commercial license. Contact Altair to discuss further if the
22Copyright> commercial version may interest you: https://www.altair.com/radioss/.
23!||====================================================================
24!|| hm_read_surf ../starter/source/groups/hm_read_surf.F
25!||--- called by ------------------------------------------------------
26!|| lectur ../starter/source/starter/lectur.F
27!||--- calls -----------------------------------------------------
28!|| ancmsg ../starter/source/output/message/message.F
29!|| deallocate_surf_elm ../starter/source/groups/init_surf_elm.F
30!|| hm_bigsbox ../starter/source/groups/hm_bigsbox.F
31!|| hm_get_floatv ../starter/source/devtools/hm_reader/hm_get_floatv.F
32!|| hm_get_int_array_index ../starter/source/devtools/hm_reader/hm_get_int_array_index.F
33!|| hm_get_intv ../starter/source/devtools/hm_reader/hm_get_intv.F
34!|| hm_option_read_key ../starter/source/devtools/hm_reader/hm_option_read_key.F
35!|| hm_option_start ../starter/source/devtools/hm_reader/hm_option_start.F
36!|| hm_submodpart ../starter/source/groups/hm_submodpart.F
37!|| hm_surfgr2 ../starter/source/groups/hm_surfgr2.F
38!|| hm_tagpart2 ../starter/source/groups/hm_tagpart2.F
39!|| init_surf_elm ../starter/source/groups/init_surf_elm.F
40!|| qsurftag ../starter/source/groups/qsurftag.F
41!|| sboxboxsurf ../starter/source/model/box/bigbox.F
42!|| segsurf ../starter/source/groups/tsurftag.F
43!|| ssurftag ../starter/source/groups/ssurftag.F
44!|| ssurftagigeo ../starter/source/groups/ssurftagigeo.F
45!|| subrotpoint ../starter/source/model/submodel/subrot.F
46!|| surftag ../starter/source/groups/surftag.F
47!|| surftagadm ../starter/source/groups/surftag.F
48!|| surftage ../starter/source/groups/surftage.F
49!|| tsurftag ../starter/source/groups/tsurftag.F
50!|| udouble_igr ../starter/source/system/sysfus.F
51!|| usr2sys ../starter/source/system/sysfus.F
52!||--- uses -----------------------------------------------------
53!|| hm_option_read_mod ../starter/share/modules1/hm_option_read_mod.F
54!|| mapping_option_mod ../starter/share/modules1/dichotomy_mod.F
55!|| message_mod ../starter/share/message_module/message_mod.F
56!|| submodel_mod ../starter/share/modules1/submodel_mod.F
57!|| surf_mod ../starter/share/modules1/surf_mod.F
58!||====================================================================
59 SUBROUTINE hm_read_surf(
60 1 ITAB ,ITABM1 ,
61 2 IGRSURF ,IXS ,IXQ ,IXC ,IXT ,
62 3 IXP ,IXR ,IXTG
63 4 ,IPART ,IPARTS ,IPARTQ ,IPARTC ,
64 5 IPARTT ,IPARTP ,IPARTR ,IPARTTG ,X ,
65 6 MFI ,ISKN ,SKEW ,
66 7 BUFSF ,KNOD2ELS,NOD2ELS ,SH4TREE ,SH3TREE ,
67 8 ISUBMOD ,FLAG ,UNITAB ,IBOX ,
68 9 IXS10 ,IXS16 , IXS20 ,RTRANS ,
69 A LSUBMODEL,KNOD2ELC,NOD2ELC,KNOD2ELTG,NOD2ELTG,
70 B KXIG3D ,IXIG3D ,IPARTIG3D,
71 C KNOT ,IGEO ,WIGE ,KNOD2ELIG3D,NOD2ELIG3D,
72 D V ,NIGE ,RIGE ,XIGE ,
73 E VIGE ,IADTABIGE,DECALIGEO,IADBOXMAX,KNOD2ELQ,
74 F NOD2ELQ ,SUBSET ,IGRBRIC ,IGRSH4N ,IGRSH3N,
75 G KNOTLOCPC,KNOTLOCEL,NSETS,MAP_TABLES)
76C-----------------------------------------------
77C M o d u l e s
78C-----------------------------------------------
79 USE my_alloc_mod
80 USE unitab_mod
81 USE submodel_mod
82 USE message_mod
83 USE groupdef_mod
85 USE surf_mod
89C-----------------------------------------------
90C I m p l i c i t T y p e s
91C-----------------------------------------------
92#include "implicit_f.inc"
93C-----------------------------------------------
94C C o m m o n B l o c k s
95C-----------------------------------------------
96#include "scr17_c.inc"
97#include "com01_c.inc"
98#include "com04_c.inc"
99#include "param_c.inc"
100#include "remesh_c.inc"
101#include "ige3d_c.inc"
102#include "sphcom.inc"
103#include "tabsiz_c.inc"
104C-----------------------------------------------
105C D u m m y A r g u m e n t s
106C-----------------------------------------------
107 TYPE (UNIT_TYPE_),INTENT(IN) ::UNITAB
108 INTEGER ITABM1(SITABM1),
109 . IXS(NIXS,NUMELS),IXQ(NIXQ,NUMELQ),IXC(NIXC,NUMELX),IXT(NIXT,NUMELT),
110 . IXP(NIXP,NUMELP),IXR(NIXR,NUMELR),IXTG(NIXTG,nUMELTG),IPARTS(NUMELS),
111 . IPARTQ(NUMELQ),IPARTC(NUMELC),IPARTT(*),IPARTP(NUMELP),IPARTR(NUMELR),
112 . IPARTTG(NUMELTG),IPART(LIPART1,NPART+NTHPART),ITAB(NUMNOD),
113 . ISKN(LISKN,SISKWN/LISKN),MFI,KNOD2ELS(NUMNOD+1),
114 . NOD2ELS(8*NUMELS+6*NUMELS10+12*NUMELS20+8*NUMELS16),
115 . SH4TREE(KSH4TREE*NUMELC),SH3TREE(KSH3TREE*NUMELTG),ISUBMOD(NSUBMOD),
116 . IXS10(6,*),IXS16(8,*),IXS20(12,*),
117 . KNOD2ELC(NUMNOD+1),NOD2ELC(4*NUMELC),KNOD2ELTG(NUMNOD+1),NOD2ELTG(3*NUMELTG+3*NUMELTG6),
118 . KXIG3D(NIXIG3D,NUMELIG3D0+ADDELIG3D),IPARTIG3D(NUMELIG3D0+ADDELIG3D),IXIG3D(*),
119 . KNOD2ELIG3D(NUMNOD+1),NOD2ELIG3D(*),
120 . NIGE(*),IGEO(NPROPGI,NUMGEO),
121 . KNOD2ELQ(NUMNOD+1),NOD2ELQ(4*NUMELQ)
122 INTEGER FLAG,IADTABIGE,DECALIGEO,
123 . iadboxmax,nsets
124 my_real x(3,numnod),skew(lskew,sskew/lskew),bufsf(lisurf1*nsurf),
125 . rtrans(ntransf,nrtrans),v(3,numnod),rige(*),xige(*),vige(*),
126 . wige(*),knot(*),knotlocpc(*),knotlocel(*)
127 TYPE(submodel_data) LSUBMODEL(NSUBMOD)
128 TYPE(MAPPING_STRUCT_), INTENT(IN) :: MAP_TABLES
129C-----------------------------------------------
130 TYPE (SUBSET_) , DIMENSION(NSUBS) :: SUBSET
131 TYPE (GROUP_) , DIMENSION(NGRBRIC) :: IGRBRIC
132 TYPE (GROUP_) , DIMENSION(NGRSHEL) :: IGRSH4N
133 TYPE (GROUP_) , DIMENSION(NGRSH3N) :: IGRSH3N
134 TYPE (SURF_) , DIMENSION(NSURF+NSETS) :: IGRSURF
135 TYPE (BOX_) , DIMENSION(NBBOX) :: IBOX
136C-----------------------------------------------
137C L o c a l V a r i a b l e s
138C-----------------------------------------------
139 INTEGER J,JJ,I,K,L,II,KK,ISU,ID,NSEG,NOSYS,NTOT,
140 . iter,igs,igrs,nsu,cont,iad0,iadv,
141 . iadfin,it0,it1,it2,it3,it4,it5,it6,it7,ipp,n1,n2,
142 . nsegv,ne,ityp,iskew,mad,srftyp,refmad,dgr,dgr1,
143 . jc, iext,uid,iflagunit,
144 . isk,boxtype,j2(2),it8,sbufbox,it9,iadpl,sub_id,
145 . ifre,numel,intmax,ibufsiz,nindx,stat,nsegige,
146 . iadbox,n3,n4,nseg0,
147 . list_surf(nsurf),nseg_tot,nn,nentity,
148 . segid
149 my_real
150 . xmin,xmax,ymin,ymax,zmin,zmax,bid,
151 . s_a,s_b,s_c,xg,yg,zg,fac_l,diam,xp1,yp1,zp1,xp2,yp2,zp2
152 CHARACTER(LEN=NCHARTITLE) :: TITR,STRING
153 CHARACTER :: MESS*40
154 CHARACTER(LEN=NCHARKEY) :: KEY,KEY2,KEY3
155 INTEGER, DIMENSION(:),ALLOCATABLE :: BUFBOX, BUFTMP, INDX ,TAGSHELLBOXC,TAGSHELLBOXG
156 my_real :: VECTX,VECTY,VECTZ,VECT
157 DOUBLE PRECISION RSBUFBOX
158 CHARACTER(LEN=NCHARTITLE) :: TITR1
159 LOGICAL :: FLAG_GRBRIC, lFOUND, IS_AVAILABLE, IS_ENCRYPTED, lERROR, l1104
160 INTEGER :: ID_PART,MODE
161 INTEGER :: IBID
162 INTEGER :: NINDX_SOL, NINDX_SOL10
163 INTEGER, DIMENSION(:), ALLOCATABLE :: INDX_SOL, INDX_SOL10
164 TYPE(PART_TYPE), DIMENSION(:), ALLOCATABLE :: SURF_ELM
165! *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
166! FLAG_GRBRIC : flag to initialize the INDX_SOL(10) arrays
167! and optimize an old and expensive treatment in SSURFTAG
168! NINDX_SOL(10) : number of the tagged solid(10) element
169! --> need to split solid and solid10
170! for a treatment in the SSURFTAG routine
171! only useful for /SURF/GRBRIC
172! INDX_SOL(10) : ID of the tagged solid(10) element
173! --> need to split solid and solid10
174! for a treatment in the SSURFTAG routine
175! only useful for /SURF/GRBRIC
176! MODE : integer
177! switch to initialize solid/shell/shell3n or truss/beam/spring
178! SURF_ELM : PART_TYPE structure
179! %Nxxx : number of element per part
180! %xxx_PART : ID of the element
181! *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
182C-----------------------------------------------
183C E x t e r n a l F u n c t i o n s
184C-----------------------------------------------
185 INTEGER USR2SYS
186 DATA MESS/'SURFACE DEFINITION '/
187 DATA INTMAX /2147483647/
188C-----------------------------------------------
189! IGRSURF(IGS)%ID :: SURFACE identifier
190! IGRSURF(IGS)%TITLE :: SURF title
191! IGRSURF(IGS)%NSEG :: Number of surfaces within /SURF
192! IGRSURF(IGS)%NSEG_IGE :: Number of iso-surfaces
193! IGRSURF(IGS)%TYPE :: OPEN / CLOSED surface flag
194! SURF_TYPE = 0 : SEGMENTS
195! SURF_TYPE = 100 : HYPER-ELLIPSOIDE MADYMO.
196! SURF_TYPE = 101 : HYPER-ELLIPSOIDE RADIOSS.
197! SURF_TYPE = 200 : INFINITE PLANE
198! IGRSURF(IGS)%ID_MADYMO :: Coupled madimo surface identifier
199! (computed in Radioss Engine, when receiving Datas from MaDyMo).
200! ID MaDyMo - for entity type which impose surface movement:
201! No systeme MaDyMo for entity type which impose surface movement
202! IGRSURF(IGS)%NB_MADYMO :: No de l'entite qui impose le mvt de la surface.
203! --> No systeme Radioss ou MaDyMO.
204! IGRSURF(IGS)%TYPE_MADYMO :: Entity type which impose surface movement.
205! = 1 : Rigid Body.
206! = 2 : MADYMO Hyper-ellipsoide.
207! IGRSURF(IGS)%IAD_BUFR :: Analytical Surfaces address (reals BUFSF - temp)
208! IGRSURF(IGS)%LEVEL :: FLAG "SUBLEVEL DONE" FOR SURFACES OF SURFACES
209! = 0 ! initialized surface
210! = 1 ! uninitialized surface
211! IGRSURF(IGS)%TH_SURF :: FLAG for /TH/SURF
212! = 0 ! unsaved surface for /TH/SURF
213! = 1 ! saved surface for /TH/SURF
214! IGRSURF(IGS)%ISH4N3N :: FLAG = 1 (only SH4N and SH3N considered - for airbags)
215! IGRSURF(IGS)%NSEG_R2R_ALL :: Multidomaines -> number of segments before split
216! IGRSURF(IGS)%NSEG_R2R_SHARE :: shared on boundary subdomain segments
217! IGRSURF(IGS)%ELTYP(J) :: type of element attached to the segment of the surface
218! ITYP = 0 - surf of segments
219! ITYP = 1 - surf of solids
220! ITYP = 2 - surf of quads
221! ITYP = 3 - surf of SH4N
222! ITYP = 4 - line of trusses
223! ITYP = 5 - line of beams
224! ityp = 6 - line of springs
225! ITYP = 7 - surf of SH3N
226! ITYP = 8 - line of XELEM (nstrand element)
227! ITYP = 101 - ISOGEOMETRIQUE
228! IGRSURF(IGS)%ELEM(J) :: element attached to the segment(J) of the surface
229! IGRSURF(IGS)%NODES(J,4) :: 4 nodes of the segment for /SURF
230C=======================================================================
231 it0=0
232 it1=0
233 it2=0
234 it3=0
235 it4=0
236 it5=0
237 it6=0
238 it7=0
239 it8=0
240 it9=0
241 iext=0
242 ifre=0
243 ibufsiz=numelc+numeltg+6*numels+npart
244 ALLOCATE(buftmp(ibufsiz),indx(ibufsiz),stat=stat)
245 IF (stat /= 0) CALL ancmsg(msgid=268,anmode=aninfo,
246 . msgtype=msgerror,
247 . c1='BUFTMP')
248 nindx=0
249 buftmp(1:ibufsiz)=0 ! init to 0 only one time
250
251C=======================================================================
252C SURFACE TYPE SEGMENT + init ISURF(1,IGS)
253C=======================================================================
254 CALL hm_option_start('/SURF')
255 titr1='SURFACE'
256 DO igs=1,nsurf
257 lerror=.false.
258 CALL hm_option_read_key(lsubmodel,
259 . option_id = id,
260 . option_titr = titr ,
261 . unit_id = uid,
262 . keyword2 = key ,
263 . keyword3 = key2)
264 nseg = 0
265 ! initialized variables:
266 IF (flag == 0) THEN
267 igrsurf(igs)%ID = 0
268 igrsurf(igs)%NSEG = 0
269 igrsurf(igs)%NSEG_IGE = 0
270 igrsurf(igs)%IAD_IGE = 0
271 igrsurf(igs)%TYPE = 0
272 igrsurf(igs)%ID_MADYMO = 0
273 igrsurf(igs)%IAD_BUFR = 0
274 igrsurf(igs)%NB_MADYMO = 0
275 igrsurf(igs)%TYPE_MADYMO = 0
276 igrsurf(igs)%LEVEL = 0
277 igrsurf(igs)%TH_SURF = 0
278 igrsurf(igs)%ISH4N3N = 0
279 igrsurf(igs)%NSEG_R2R_ALL = 0
280 igrsurf(igs)%NSEG_R2R_SHARE = 0
281 ENDIF
282 igrsurf(igs)%ID=id
283 igrsurf(igs)%TYPE=0
284 igrsurf(igs)%TITLE=titr
285 IF(key(1:4)=='SURF' .OR. key(1:5)=='DSURF')THEN
286C tag for surfaces defined from surface list
287 igrsurf(igs)%NSEG=-1
288 igrsurf(igs)%LEVEL=0
289 it0=it0+1
290 ELSEIF(key(1:3)=='SEG')THEN
291 it1=it1+1
292 IF (flag == 0) igrsurf(igs)%NSEG=0
293 IF (flag == 1) THEN ! NSEG counted at FLAG = 0
294 nseg0 = igrsurf(igs)%NSEG
295 CALL my_alloc(igrsurf(igs)%NODES,nseg0,4)
296 igrsurf(igs)%NODES(1:nseg0,1:4) = 0
297 CALL my_alloc(igrsurf(igs)%ELTYP,nseg0)
298 igrsurf(igs)%ELTYP(1:nseg0) = 0
299 CALL my_alloc(igrsurf(igs)%ELEM,nseg0)
300 igrsurf(igs)%ELEM(1:nseg0) = 0
301 ENDIF
302 igrsurf(igs)%LEVEL=1
303 CALL hm_get_intv ('segmax' ,nentity,is_available,lsubmodel)
304 DO kk=1,nentity
305 CALL hm_get_int_array_index('SEGidArray',segid,kk,is_available,lsubmodel)
306 IF (flag == 1) THEN
307 CALL hm_get_int_array_index('n1',N1,KK,IS_AVAILABLE,LSUBMODEL)
308 CALL HM_GET_INT_ARRAY_INDEX('n2',N2,KK,IS_AVAILABLE,LSUBMODEL)
309 N1 = USR2SYS(N1,ITABM1,MESS,ID)
310 N2 = USR2SYS(N2,ITABM1,MESS,ID)
311 ENDIF
312.OR. IF(NUMELS10>0FLAG==1) THEN
313 CALL HM_GET_INT_ARRAY_INDEX('n3',N3,KK,IS_AVAILABLE,LSUBMODEL)
314 CALL HM_GET_INT_ARRAY_INDEX('n4',N4,KK,IS_AVAILABLE,LSUBMODEL)
315 IF(N2D == 0) THEN
316 N3 = USR2SYS(N3,ITABM1,MESS,ID)
317 IF(N4/=0) THEN
318 N4 = USR2SYS(N4,ITABM1,MESS,ID)
319 ELSE
320 N4 = N3
321 ENDIF
322 ELSE
323 N3 = 0
324 N4 = 0
325 ENDIF
326 ENDIF
327.AND..AND..AND. IF(NUMELS10 > 0N2D==0N3==N4N3/=0) THEN
328 NSEG0 = IGRSURF(IGS)%NSEG
329 IF (FLAG == 0) THEN
330 CALL HM_GET_INT_ARRAY_INDEX('n1',N1,KK,IS_AVAILABLE,LSUBMODEL)
331 CALL HM_GET_INT_ARRAY_INDEX('n2',N2,KK,IS_AVAILABLE,LSUBMODEL)
332 N1 = USR2SYS(N1,ITABM1,MESS,ID)
333 N2 = USR2SYS(N2,ITABM1,MESS,ID)
334 ENDIF
335 CALL TSURFTAG(IXS ,IXS10 ,IGRSURF(IGS),FLAG ,NSEG ,
336 2 KNOD2ELS,NOD2ELS ,N1 ,N2 ,N3 ,
337 3 NSEG0 )
338 ELSE
339 NSEG = NSEG +1
340 IF (FLAG == 1) THEN
341 NSEG0 = IGRSURF(IGS)%NSEG
342 CALL SEGSURF(
343 . N1 ,N2 ,N3 ,N4 ,NSEG0,
344 . NSEG,IGRSURF(IGS)%NODES,IGRSURF(IGS)%ELTYP,IGRSURF(IGS)%ELEM,0,0)
345 ENDIF
346 ENDIF
347 IF (FLAG == 0) THEN
348 IGRSURF(IGS)%NSEG = NSEG
349 ENDIF
350 ENDDO
351
352 ELSEIF(KEY(1:6)=='subset.OR.' KEY(1:4)=='part.OR.'
353 . KEY(1:3)=='mat.OR.' KEY(1:4)=='prop.OR.'
354 . KEY(1:6)=='grbric')THEN
355C surf de SUBSET PART MAT OU PROP
356 IT2=IT2+1
357 IF (FLAG == 0) IGRSURF(IGS)%NSEG=0
358 IGRSURF(IGS)%LEVEL=1
359 ELSEIF(KEY(1:3) == 'box.AND..AND.'NBBOX == 0
360 . (KEY2(1:5) /= 'recta.AND.'
361 . KEY2(1:5) /= 'cylin.AND.'KEY2(1:5) /= 'spher'))THEN
362C surf dans un box (old box)
363 lERROR=.TRUE.
364 ELSEIF(KEY(1:2)=='gr')THEN
365C surf d'un group d'elements
366 IT4=IT4+1
367 IF (FLAG == 0) IGRSURF(IGS)%NSEG=0
368 IGRSURF(IGS)%LEVEL=1
369 ELSEIF(KEY(1:6)=='ellips.OR.'KEY(1:8)=='mdellips')THEN
370C surface with formal equation (non-meshed).
371 IT5=IT5+1
372 IF (FLAG == 0) IGRSURF(IGS)%NSEG=1
373 IGRSURF(IGS)%LEVEL=1
374 IF (FLAG == 1) THEN
375 NSEG0 = IGRSURF(IGS)%NSEG
376 CALL MY_ALLOC(IGRSURF(IGS)%NODES,NSEG0,4)
377 IGRSURF(IGS)%NODES(1:NSEG0,1:4) = 0
378 CALL MY_ALLOC(IGRSURF(IGS)%ELTYP,NSEG0)
379 IGRSURF(IGS)%ELTYP(1:NSEG0) = 0
380 CALL MY_ALLOC(IGRSURF(IGS)%ELEM,NSEG0)
381 IGRSURF(IGS)%ELEM(1:NSEG0) = 0
382 ENDIF
383 ELSEIF(KEY(1:6)=='submod')THEN
384C une surface d'un submodel.
385 IT6=IT6+1
386 IF (FLAG == 0) IGRSURF(IGS)%NSEG=0
387 IGRSURF(IGS)%LEVEL=1
388 ELSEIF(KEY(1:3)=='box.AND.'(KEY2(1:5) == 'recta.OR.'
389 . KEY2(1:5) == 'cylin.OR.'KEY2(1:5) == 'spher'))THEN
390C old /grnod/box (not /BOX/BOX)
391C surf inside a box (classical box, parallelepiped (oriented), cylindrical, spherical)
392 lERROR=.TRUE.
393 ELSEIF(KEY(1:3) == 'box.AND.' NBBOX > 0)THEN
394C multi box (box of boxes)
395 IT8=IT8+1
396 IF (FLAG == 0) IGRSURF(IGS)%NSEG=0
397 IGRSURF(IGS)%LEVEL=1
398 ELSEIF(KEY(1:6)=='plane')THEN
399C infinite plane (non-meshed)
400 IT9=IT9+1
401 IF (FLAG == 0) IGRSURF(IGS)%NSEG=0
402 IGRSURF(IGS)%LEVEL=1
403 ELSE
404 lERROR=.TRUE.
405 ENDIF
406
407 IF(lERROR)THEN
408 !INVALID KEYWORD
409 STRING=' '
410 STRING = "/SURF/"//KEY(1:LEN_TRIM(KEY))
411 IF(LEN_TRIM(KEY2)>1)STRING = STRING//KEY2(1:LEN_TRIM(KEY2))
412 CALL ANCMSG(MSGID=686,ANMODE=ANINFO,MSGTYPE=MSGERROR,I1=ID, C1=TITR, C2=STRING)
413 ENDIF
414
415
416 ENDDO ! I=1,NLINE(KCUR)
417c----------------------------
418 NUMEL = NUMELC+NUMELTG
419C
420C-------------------------------------
421C Searching for double IDs
422C-------------------------------------
423 IF (FLAG == 0) THEN
424 DO IGS=1,NSURF
425 LIST_SURF(IGS) = IGRSURF(IGS)%ID
426 ENDDO
427 CALL UDOUBLE_IGR(LIST_SURF,NSURF,MESS,0,BID)
428 ENDIF
429C=======================================================================
430C BOX (OLD)
431C=======================================================================
432 IF (IT3/=0)THEN
433 !no longer supported with new reader based on CFG files
434 ENDIF
435C=======================================================================
436C BOX (parallelepiped, cylindrical, spherical) - old one (10SA1)
437C=======================================================================
438 IF (IT7/=0)THEN
439 !no longer supported with new reader based on CFG files
440 ENDIF
441C=======================================================================
442C NEW BOX OPTION (MULTI BOX COMBINATION)
443C=======================================================================
444 IF (IT8/=0) THEN
445 ALLOCATE(TAGSHELLBOXC(NUMELC),STAT=stat)
446 ALLOCATE(TAGSHELLBOXG(NUMELTG),STAT=stat)
447 TAGSHELLBOXC(1:NUMELC) = 0
448 TAGSHELLBOXG(1:NUMELTG) = 0
449 IADBOX = 1
450 IF (FLAG == 0) THEN
451 ALLOCATE(BUFBOX(1))
452 BUFBOX = 0
453 ELSEIF (FLAG == 1) THEN
454 ALLOCATE(BUFBOX(IADBOXMAX))
455 BUFBOX(1:IADBOXMAX) = 0
456 ENDIF
457 SBUFBOX = INT(INTMAX)
458C
459 CALL HM_OPTION_START('/surf')
460 DO IGS=1,NSURF
461 CALL HM_OPTION_READ_KEY(LSUBMODEL,
462 . OPTION_ID = ID,
463 . OPTION_TITR = TITR ,
464 . UNIT_ID = UID,
465 . KEYWORD2 = KEY ,
466 . KEYWORD3 = KEY2)
467 NN = 0
468 NSEG=0
469 IF(KEY(1:3) == 'box.AND.' NBBOX > 0)THEN
470 NSEG=0
471 IADBOX = 1
472 IFLAGUNIT = 0
473 DO J=1,UNITAB%NUNITS
474 IF (UNITAB%UNIT_ID(J) == UID) THEN
475 FAC_L = UNITAB%FAC_L(J)
476 IFLAGUNIT = 1
477 EXIT
478 ENDIF
479 ENDDO
480.AND. IF (UID/=0IFLAGUNIT==0) THEN
481 CALL ANCMSG(MSGID=659,ANMODE=ANINFO,MSGTYPE=MSGERROR,
482 . I2=UID,I1=ID,C1='surface',
483 . C2='surface',
484 . C3=TITR)
485 ENDIF
486!
487 IF (FLAG == 1) THEN ! NSEG counted at FLAG = 0
488 NSEG0 = IGRSURF(IGS)%NSEG
489 CALL MY_ALLOC(IGRSURF(IGS)%NODES,NSEG0,4)
490 IGRSURF(IGS)%NODES(1:NSEG0,1:4) = 0
491 CALL MY_ALLOC(IGRSURF(IGS)%ELTYP,NSEG0)
492 IGRSURF(IGS)%ELTYP(1:NSEG0) = 0
493 CALL MY_ALLOC(IGRSURF(IGS)%ELEM,NSEG0)
494 IGRSURF(IGS)%ELEM(1:NSEG0) = 0
495 ENDIF
496!
497 NUMEL = NUMELC
498 IF(NUMEL > 0)
499 . CALL HM_BIGSBOX(NUMEL ,IXC ,NIXC ,2 ,5 ,3 ,
500 . X , NSEG ,FLAG ,SKEW,
501 . ISKN ,1 ,ITABM1 ,IBOX ,
502 . ID ,BUFBOX,IGRSURF(IGS),IADBOX,KEY ,
503 . SBUFBOX,TITR ,MESS ,TAGSHELLBOXC,
504 . NN, LSUBMODEL )
505C---
506 IADBOXMAX = MAX(IADBOX,IADBOXMAX)
507C---
508.OR. IF (IADBOX>SBUFBOX IADBOX<0)
509 . CALL ANCMSG(MSGID=1007, MSGTYPE=MSGERROR,ANMODE=ANSTOP)
510C---
511 NUMEL = NUMELTG
512 IF(NUMEL > 0)
513 . CALL HM_BIGSBOX(NUMEL ,IXTG ,NIXTG ,2 ,4 ,7 ,
514 . X , NSEG ,FLAG ,SKEW,
515 . ISKN ,1 ,ITABM1 ,IBOX ,
516 . ID ,BUFBOX,IGRSURF(IGS),IADBOX,KEY ,
517 . SBUFBOX,TITR ,MESS ,TAGSHELLBOXG,
518 . NN, LSUBMODEL )
519.OR. IF (IADBOX>SBUFBOX IADBOX<0)
520 . CALL ANCMSG(MSGID=1007, MSGTYPE=MSGERROR,ANMODE=ANSTOP)
521C---
522 IADBOXMAX = MAX(IADBOX,IADBOXMAX)
523C---
524 IEXT=0
525 IF(KEY2(1:3)=='ext')THEN
526 IEXT=EXT_SURF
527 ELSEIF(KEY2(1:3)=='all')THEN
528 IEXT=ALL_SURF
529 END IF
530 IGRSURF(IGS)%EXT_ALL = IEXT
531C---
532 IF (NUMELS > 0) THEN
533 NSEG0 = IGRSURF(IGS)%NSEG
534 CALL SBOXBOXSURF(IXS ,X ,NSEG,
535 . KNOD2ELS ,NOD2ELS,IEXT ,FLAG,
536 . IXS10 ,IXS16 ,IXS20,SKEW ,IBOX,
537 . ID ,BUFBOX,IADBOX ,KEY ,
538 . SBUFBOX ,TITR ,KNOD2ELC,NOD2ELC ,IXC ,
539 . TAGSHELLBOXC ,KNOD2ELTG ,NOD2ELTG ,IXTG ,
540 . TAGSHELLBOXG,IGRSURF(IGS),NN,NSEG0,LSUBMODEL)
541 ENDIF
542C---
543 IADBOXMAX = MAX(IADBOX,IADBOXMAX)
544C---
545 IF (FLAG == 0) THEN
546 IGRSURF(IGS)%NSEG = NSEG
547 ELSEIF (FLAG == 1) THEN
548 IGRSURF(IGS)%NSEG = NSEG
549 ENDIF
550 ENDIF
551.OR. IF (IADBOX>SBUFBOX IADBOX<0)
552 . CALL ANCMSG(MSGID=1007, MSGTYPE=MSGERROR,ANMODE=ANSTOP)
553 ENDDO
554 IF(ALLOCATED(BUFBOX))DEALLOCATE(BUFBOX)
555 DEALLOCATE(TAGSHELLBOXC,TAGSHELLBOXG)
556 ENDIF ! IT8/=0
557C
558C=======================================================================
559C groups of SUBSETS,PART,MAT,PROP,BRIC
560C=======================================================================
561
562.OR. IF(IT2/=0IT6/=0)THEN
563 ALLOCATE( SURF_ELM(NPART) )
564 MODE = 1
565 CALL INIT_SURF_ELM(NUMELS ,NUMELS8,NUMELS10,NUMELC ,NUMELTG ,
566 1 IBID ,IBID ,IBID ,NPART ,IPARTS ,
567 2 IPARTC ,IPARTTG,IBID ,IBID ,IBID ,
568 3 SURF_ELM,MODE )
569 ENDIF
570
571 IF(IT2/=0)THEN
572 NINDX_SOL = 0
573 NINDX_SOL10 = 0
574 ALLOCATE( INDX_SOL(NUMELS) )
575 ALLOCATE( INDX_SOL10(NUMELS) )
576 CALL HM_OPTION_START('/surf')
577 DO IGS=1,NSURF
578 CALL HM_OPTION_READ_KEY(LSUBMODEL,
579 . OPTION_ID = ID,
580 . OPTION_TITR = TITR ,
581 . UNIT_ID = UID,
582 . KEYWORD2 = KEY ,
583 . KEYWORD3 = KEY2)
584 NSEG=0
585 NSEGIGE=0
586 IEXT=0
587 NSEG0 = IGRSURF(IGS)%NSEG
588 IF (KEY(1:6)=='grbric')THEN
589 IF(KEY2(1:3)=='ext')THEN
590 IFRE=0
591 IEXT=EXT_SURF
592 END IF
593 IF(KEY2(1:4)=='free')THEN
594 IFRE=1
595 IEXT=1
596 END IF
597.AND. IF(IEXT==0IFRE==0)THEN !only /grbric/ext is treated
598 CALL ANCMSG(MSGID=479,
599 . MSGTYPE=MSGERROR,
600 . ANMODE=ANINFO,
601 . I1=ID,
602 . C1=TITR)
603 ENDIF
604!
605 IF (FLAG == 1) THEN ! NSEG counted at FLAG = 0
606 NSEG0 = IGRSURF(IGS)%NSEG
607 CALL MY_ALLOC(IGRSURF(IGS)%NODES,NSEG0,4)
608 IGRSURF(IGS)%NODES(1:NSEG0,1:4) = 0
609 CALL MY_ALLOC(IGRSURF(IGS)%ELTYP,NSEG0)
610 IGRSURF(IGS)%ELTYP(1:NSEG0) = 0
611 CALL MY_ALLOC(IGRSURF(IGS)%ELEM,NSEG0)
612 IGRSURF(IGS)%ELEM(1:NSEG0) = 0
613 ENDIF
614!
615 NUMEL=NUMELS8+NUMELS10
616 FLAG_GRBRIC = .TRUE.
617 CALL HM_SURFGR2(NGRBRIC ,KEY(1:6),NUMEL ,IGRSURF(IGS)%ID,
618 2 IGRBRIC ,BUFTMP ,TITR ,TITR1 ,
619 3 INDX ,NINDX ,FLAG ,NINDX_SOL,NINDX_SOL10,
620 4 INDX_SOL,INDX_SOL10 ,FLAG_GRBRIC,LSUBMODEL)
621 CALL SSURFTAG(IXS ,IPARTS ,NSEG0 ,IGRSURF(IGS),BUFTMP,
622 2 NSEG ,KNOD2ELS,NOD2ELS ,IEXT ,FLAG ,
623 3 IXS10 ,IXS16 ,IXS20 ,IFRE ,KEY ,
624 4 KNOD2ELC,NOD2ELC ,KNOD2ELTG,NOD2ELTG,
625 5 IXC ,IXTG ,IPARTC ,IPARTTG ,NINDX,
626 6 NINDX_SOL, NINDX_SOL10, INDX, INDX_SOL, INDX_SOL10,
627 7 SURF_ELM)
628 IF (FLAG == 0) THEN
629 IGRSURF(IGS)%NSEG = NSEG
630 ENDIF
631 ENDIF
632
633 IF (KEY(1:4)=='part.OR.'KEY(1:6)=='subset.OR.'
634 . KEY(1:3)=='mat.OR.' KEY(1:4)=='prop') THEN
635 IF(KEY2(1:3)=='ext')THEN
636 IEXT=EXT_SURF
637 ELSEIF(KEY2(1:3)=='all')THEN
638 IEXT=ALL_SURF
639 END IF
640 IGRSURF(IGS)%EXT_ALL = IEXT
641 IF (FLAG == 1) THEN ! NSEG counted at FLAG = 0
642! ISOGEO
643 NSEG0 = IGRSURF(IGS)%NSEG_IGE
644 CALL MY_ALLOC(IGRSURF(IGS)%NODES_IGE,NSEG0,4)
645 IGRSURF(IGS)%NODES_IGE(1:NSEG0,1:4) = 0
646 CALL MY_ALLOC(IGRSURF(IGS)%ELTYP_IGE,NSEG0)
647 IGRSURF(IGS)%ELTYP_IGE(1:NSEG0) = 0
648 CALL MY_ALLOC(IGRSURF(IGS)%ELEM_IGE,NSEG0)
649 IGRSURF(IGS)%ELEM_IGE(1:NSEG0) = 0
650!
651 NSEG0 = IGRSURF(IGS)%NSEG
652 CALL MY_ALLOC(IGRSURF(IGS)%NODES,NSEG0,4)
653 IGRSURF(IGS)%NODES(1:NSEG0,1:4) = 0
654 CALL MY_ALLOC(IGRSURF(IGS)%ELTYP,NSEG0)
655 IGRSURF(IGS)%ELTYP(1:NSEG0) = 0
656 CALL MY_ALLOC(IGRSURF(IGS)%ELEM,NSEG0)
657 IGRSURF(IGS)%ELEM(1:NSEG0) = 0
658!
659 IF (NVOLU + NMONVOL > 0) THEN
660 NSEG0 = IGRSURF(IGS)%NSEG
661 !Keep track of the "reversed surface" -> when /SURF/PART comes
662 !with a negative part_id
663 CALL MY_ALLOC(IGRSURF(IGS)%REVERSED, NSEG0)
664 ENDIF
665 ENDIF
666!
667 CALL HM_TAGPART2(BUFTMP,IPART ,KEY ,
668 . IGRSURF(IGS)%ID,TITR,TITR1,INDX,NINDX ,
669 . FLAG ,SUBSET, LSUBMODEL,MAP_TABLES%IPARTM)
670 IF (NADMESH==0)THEN
671 NUMEL = NUMELC
672 CALL SURFTAG(NUMEL,IXC,NIXC,2,5,3,IPARTC,
673 . BUFTMP,IGRSURF(IGS),NSEG,FLAG,NINDX,
674 . INDX,SURF_ELM)
675 NUMEL = NUMELTG
676 CALL SURFTAG(NUMEL,IXTG,NIXTG,2,4,7,IPARTTG,
677 . BUFTMP,IGRSURF(IGS),NSEG,FLAG,NINDX,
678 . INDX,SURF_ELM)
679 ELSE
680 NUMEL = NUMELC
681 CALL SURFTAGADM(NUMEL,IXC,NIXC,2,5,3,IPARTC,
682 . BUFTMP,IGRSURF(IGS),NSEG,IPART,
683 . KSH4TREE,SH4TREE,FLAG)
684 NUMEL = NUMELTG
685 CALL SURFTAGADM(NUMEL,IXTG,NIXTG,2,4,7,IPARTTG,
686 . BUFTMP,IGRSURF(IGS),NSEG,IPART,
687 . KSH3TREE,SH3TREE,FLAG)
688 END IF
689 IF(IEXT==0)THEN
690 l1104=.FALSE.
691 DO II=1,NUMELS
692 IF (IABS(BUFTMP(IPARTS(II)))==1)THEN
693 l1104=.TRUE.
694 CALL ANCMSG(MSGID=1104,
695 . MSGTYPE=MSGERROR,
696 . ANMODE=ANINFO_BLIND_1,
697 . PRMOD=MSG_CUMU,
698 . I1=IPARTS(II),
699 . I2=IXS(11,II))
700 ENDIF
701 ENDDO
702 IF(l1104)CALL ANCMSG(MSGID=1104,
703 . MSGTYPE=MSGERROR,
704 . ANMODE=ANINFO_BLIND_1,
705 . PRMOD=MSG_PRINT,
706 . I1=ID,
707 . C1=TITR )
708
709 ELSE
710 DO II=NUMELS8+NUMELS10+1,NUMELS
711 IF (IABS(BUFTMP(IPARTS(II)))==1)THEN
712 TITR = IGRSURF(IGS)%TITLE
713 CALL ANCMSG(MSGID=651,
714 . MSGTYPE=MSGERROR,
715 . ANMODE=ANINFO,
716 . I1=ID,
717 . C1=TITR)
718 ENDIF
719 ENDDO
720 END IF
721!
722 NSEG0 = IGRSURF(IGS)%NSEG
723 CALL SSURFTAG(IXS ,IPARTS ,NSEG0 ,IGRSURF(IGS),BUFTMP ,
724 2 NSEG ,KNOD2ELS,NOD2ELS ,IEXT ,FLAG ,
725 3 IXS10 ,IXS16 ,IXS20 ,IFRE ,KEY ,
726 4 KNOD2ELC,NOD2ELC ,KNOD2ELTG,NOD2ELTG,
727 5 IXC ,IXTG ,IPARTC ,IPARTTG ,NINDX,
728 6 NINDX_SOL, NINDX_SOL10, INDX, INDX_SOL, INDX_SOL10,
729 7 SURF_ELM)
730 IF(NUMELIG3D/=0) THEN
731 CALL SSURFTAGIGEO(IXIG3D,IPARTIG3D,KXIG3D,
732 2 BUFTMP ,NSEG ,
733 3 IEXT ,FLAG ,IFRE ,KEY ,
734 4 NSEGIGE,KNOT ,IGEO ,WIGE ,
735 5 X ,V, KNOD2ELIG3D,NOD2ELIG3D ,
736 6 NIGE,RIGE,XIGE,VIGE,IADTABIGE,DECALIGEO,
737 7 IGRSURF(IGS),KNOTLOCPC,KNOTLOCEL)
738 ENDIF
739
740C------------/SURF/PART/EXT FOR QUADS --------------------
741 CALL QSURFTAG(IXQ ,IPARTQ , NSEG0 ,IGRSURF(IGS),BUFTMP ,
742 2 NSEG ,KNOD2ELQ,NOD2ELQ,IEXT ,FLAG ,
743 3 X)
744
745 IF (FLAG == 0) THEN
746 IGRSURF(IGS)%NSEG = NSEG
747 IGRSURF(IGS)%NSEG_IGE = NSEGIGE
748 NUMFAKENODIGEO=NUMFAKENODIGEO+16*NSEGIGE/9 ! same functionality as IADTABIGE
749 ENDIF
750 ENDIF
751C reset BUFTMP to 0 (only where it was set to 1/-1)
752 DO II=1,NINDX
753 BUFTMP(INDX(II))=0
754 END DO
755 NINDX=0
756 NINDX_SOL = 0
757 NINDX_SOL10 = 0
758 ENDDO
759
760 DEALLOCATE( INDX_SOL )
761 DEALLOCATE( INDX_SOL10 )
762 ENDIF
763C=======================================================================
764C surfaces from SUBMODELS
765C=======================================================================
766 IF (IT6 > 0)THEN
767 CALL HM_OPTION_START('/surf')
768 DO IGS=1,NSURF
769 CALL HM_OPTION_READ_KEY(LSUBMODEL,
770 . OPTION_ID = ID,
771 . OPTION_TITR = TITR ,
772 . UNIT_ID = UID,
773 . KEYWORD2 = KEY ,
774 . KEYWORD3 = KEY2)
775 NSEG=0
776 IEXT=0
777 IF (KEY(1:6)=='submod') THEN
778 IF(KEY2(1:3)=='ext')THEN
779 IEXT=EXT_SURF
780 ELSEIF(KEY2(1:3)=='all')THEN
781 IEXT=ALL_SURF
782 END IF
783 IGRSURF(IGS)%EXT_ALL = IEXT
784!
785 IF (FLAG == 1) THEN ! NSEG counted at FLAG = 0
786 NSEG0 = IGRSURF(IGS)%NSEG
787 CALL MY_ALLOC(IGRSURF(IGS)%NODES,NSEG0,4)
788 IGRSURF(IGS)%NODES(1:NSEG0,1:4) = 0
789 CALL MY_ALLOC(IGRSURF(IGS)%ELTYP,NSEG0)
790 IGRSURF(IGS)%ELTYP(1:NSEG0) = 0
791 CALL MY_ALLOC(IGRSURF(IGS)%ELEM,NSEG0)
792 IGRSURF(IGS)%ELEM(1:NSEG0) = 0
793 IF (NVOLU + NMONVOL > 0) THEN
794 NSEG0 = IGRSURF(IGS)%NSEG
795 !Keep track of the "reversed surface" -> when /SURF/PART comes
796 !with a negative part_id
797 CALL MY_ALLOC(IGRSURF(IGS)%REVERSED, NSEG0)
798 ENDIF
799 ENDIF
800!
801 CALL HM_SUBMODPART(ISUBMOD,BUFTMP ,IPART ,ID ,FLAG ,
802 . MESS ,TITR ,TITR1 ,INDX ,NINDX,
803 . LSUBMODEL)
804C----------------------- --
805 IF (NADMESH==0) THEN
806 NUMEL = NUMELC
807 CALL SURFTAG(NUMEL,IXC,NIXC,2,5,3,IPARTC,
808 . BUFTMP,IGRSURF(IGS),NSEG,FLAG,NINDX,
809 . INDX,SURF_ELM)
810 NUMEL = NUMELTG
811 CALL SURFTAG(NUMEL,IXTG,NIXTG,2,4,7,IPARTTG,
812 . BUFTMP,IGRSURF(IGS),NSEG,FLAG,NINDX,
813 . INDX,SURF_ELM)
814 ELSE
815 NUMEL = NUMELC
816 CALL SURFTAGADM(NUMEL,IXC,NIXC,2,5,3,IPARTC,
817 . BUFTMP,IGRSURF(IGS),NSEG,IPART,
818 . KSH4TREE,SH4TREE,FLAG)
819 NUMEL = NUMELTG
820 CALL SURFTAGADM(NUMEL,IXTG,NIXTG,2,4,7,IPARTTG,
821 . BUFTMP,IGRSURF(IGS),NSEG,IPART,
822 . KSH3TREE,SH3TREE,FLAG)
823 END IF
824C----------------------- --
825 IF(IEXT==0)THEN
826 l1104=.FALSE.
827 DO II=1,NUMELS
828 IF(IABS(BUFTMP(IPARTS(II)))==1)THEN
829 l1104=.TRUE.
830 CALL ANCMSG(MSGID=1104,
831 . MSGTYPE=MSGERROR,
832 . ANMODE=ANINFO_BLIND_1,
833 . PRMOD=MSG_CUMU,
834 . I1=IPARTS(II),
835 . I2=IXS(11,II))
836 ENDIF
837 ENDDO
838 IF(l1104)CALL ANCMSG(MSGID=1104,
839 . MSGTYPE=MSGERROR,
840 . ANMODE=ANINFO_BLIND_1,
841 . I1=ID,
842 . C1=TITR,
843 . PRMOD=MSG_PRINT)
844 ELSE
845 DO II=NUMELS8+NUMELS10+1,NUMELS
846 IF(IABS(BUFTMP(IPARTS(II)))==1)THEN
847 CALL ANCMSG(MSGID=651,
848 . MSGTYPE=MSGERROR,
849 . ANMODE=ANINFO,
850 . I1=ID,
851 . C1=TITR)
852 ENDIF
853 ENDDO
854 END IF
855C-------------------------
856 NSEG0 = IGRSURF(IGS)%NSEG
857 CALL SSURFTAG(IXS ,IPARTS ,NSEG0 ,IGRSURF(IGS),BUFTMP,
858 2 NSEG ,KNOD2ELS,NOD2ELS ,IEXT ,FLAG ,
859 3 IXS10 ,IXS16 ,IXS20 ,IFRE ,KEY ,
860 4 KNOD2ELC,NOD2ELC ,KNOD2ELTG,NOD2ELTG,
861 5 IXC ,IXTG ,IPARTC ,IPARTTG ,NINDX,
862 6 NINDX_SOL, NINDX_SOL10, INDX, INDX_SOL, INDX_SOL10,
863 7 SURF_ELM)
864 IF (FLAG == 0) THEN
865 IGRSURF(IGS)%NSEG = NSEG
866 ENDIF
867C-------------------------
868 ENDIF
869C reset BUFTMP to 0 (only where it was set to 1/-1)
870 DO II=1,NINDX
871 BUFTMP(INDX(II))=0
872 END DO
873 NINDX=0
874 ENDDO
875 ENDIF
876C=======================================================================
877C SURFACE FROM GROUP OF SHELLS (4N ET 3N)
878C=======================================================================
879 IF (IT4 /= 0) THEN
880 CALL HM_OPTION_START('/surf')
881 DO IGS=1,NSURF
882 CALL HM_OPTION_READ_KEY(LSUBMODEL,
883 . OPTION_ID = ID,
884 . OPTION_TITR = TITR ,
885 . UNIT_ID = UID,
886 . KEYWORD2 = KEY ,
887 . KEYWORD3 = KEY2)
888 NSEG=0
889 NSEG_TOT=0
890 CONT=1
891C----------- --
892 IF (KEY(1:6)=='grshel') THEN
893!
894 IF (FLAG == 1) THEN ! NSEG counted at FLAG = 0
895 NSEG0 = IGRSURF(IGS)%NSEG
896 CALL MY_ALLOC(IGRSURF(IGS)%NODES,NSEG0,4)
897 IGRSURF(IGS)%NODES(1:NSEG0,1:4) = 0
898 CALL MY_ALLOC(IGRSURF(IGS)%ELTYP,NSEG0)
899 IGRSURF(IGS)%ELTYP(1:NSEG0) = 0
900 CALL MY_ALLOC(IGRSURF(IGS)%ELEM,NSEG0)
901 IGRSURF(IGS)%ELEM(1:NSEG0) = 0
902!
903 IF (NVOLU + NMONVOL > 0) THEN
904 NSEG0 = IGRSURF(IGS)%NSEG
905 ! Keep track of the "reversed surface" -> when /SURF/PART comes
906 ! with a negative part_id
907 CALL MY_ALLOC(IGRSURF(IGS)%REVERSED, NSEG0)
908 ENDIF
909 ENDIF
910!
911 NUMEL=NUMELC
912 FLAG_GRBRIC=.FALSE.
913 CALL HM_SURFGR2(NGRSHEL ,KEY(1:6),NUMEL ,IGRSURF(IGS)%ID,
914 . IGRSH4N ,BUFTMP ,TITR ,TITR1 ,
915 . INDX ,NINDX ,FLAG ,NINDX_SOL,NINDX_SOL10,
916 . INDX_SOL,INDX_SOL10 ,FLAG_GRBRIC,LSUBMODEL)
917 CALL SURFTAGE(NUMEL,IXC,NIXC,2,5,3,
918 . BUFTMP,IGRSURF(IGS),NSEG,FLAG,
919 . INDX,NINDX,NSEG_TOT)
920 IF (FLAG == 0) THEN
921 IGRSURF(IGS)%NSEG = NSEG
922 ENDIF
923C---
924 ELSEIF (KEY(1:6)=='grsh3n.OR.' KEY(1:6)=='grtria') THEN
925!
926 IF (FLAG == 1) THEN ! NSEG counted at FLAG = 0
927 NSEG0 = IGRSURF(IGS)%NSEG
928 CALL MY_ALLOC(IGRSURF(IGS)%NODES,NSEG0,4)
929 IGRSURF(IGS)%NODES(1:NSEG0,1:4) = 0
930 CALL MY_ALLOC(IGRSURF(IGS)%ELTYP,NSEG0)
931 IGRSURF(IGS)%ELTYP(1:NSEG0) = 0
932 CALL MY_ALLOC(IGRSURF(IGS)%ELEM,NSEG0)
933 IGRSURF(IGS)%ELEM(1:NSEG0) = 0
934!
935 IF (NVOLU + NMONVOL > 0) THEN
936 NSEG0 = IGRSURF(IGS)%NSEG
937 ! Keep track of the "reversed surface" -> when /SURF/PART comes
938 ! with a negative part_id
939 CALL MY_ALLOC(IGRSURF(IGS)%REVERSED, NSEG0)
940 ENDIF
941 ENDIF
942!
943 NUMEL=NUMELTG
944 FLAG_GRBRIC=.FALSE.
945 CALL HM_SURFGR2(NGRSH3N ,KEY(1:6),NUMEL ,IGRSURF(IGS)%ID,
946 . IGRSH3N ,BUFTMP ,TITR ,TITR1 ,
947 . INDX ,NINDX ,FLAG ,NINDX_SOL,NINDX_SOL10,
948 . INDX_SOL,INDX_SOL10 ,FLAG_GRBRIC,LSUBMODEL)
949 CALL SURFTAGE(NUMEL,IXTG,NIXTG,2,4,7,
950 . BUFTMP,IGRSURF(IGS),NSEG,FLAG,
951 . INDX,NINDX,NSEG_TOT)
952 IF (FLAG == 0) THEN
953 IGRSURF(IGS)%NSEG = NSEG
954 ENDIF
955 ENDIF
956 !reset BUFTMP to 0 (only where it was set to 1/-1)
957 DO II=1,NINDX
958 BUFTMP(INDX(II))=0
959 END DO
960 NINDX=0
961C-----------
962 ENDDO!next IGS
963 ENDIF!(IT4 /= 0)
964
965C=======================================================================
966C SURFACE WITH FORMAL EQUATION (ETC).
967C=======================================================================
968 MAD=0
969.AND. IF (IT5 /= 0 FLAG == 1)THEN
970
971 CALL HM_OPTION_START('/surf')
972 DO IGS=1,NSURF
973 CALL HM_OPTION_READ_KEY(LSUBMODEL,
974 . OPTION_ID = ID,
975 . OPTION_TITR = TITR ,
976 . UNIT_ID = UID,
977 . KEYWORD2 = KEY ,
978 . KEYWORD3 = KEY2 ,
979 . SUBMODEL_ID = SUB_ID)
980 IGRSURF(IGS)%TITLE = TITR
981 IF(KEY(1:6)=='ellips')THEN
982 IGRSURF(IGS)%ID = ID
983 IGRSURF(IGS)%TYPE = 101
984 IGRSURF(IGS)%IAD_BUFR = MAD
985 MFI=MFI+36
986 DGR1=0
987 CALL HM_GET_INTV ('skew' ,ISKEW,IS_AVAILABLE,LSUBMODEL)
988 CALL HM_GET_INTV ('n' ,DGR1,IS_AVAILABLE,LSUBMODEL)
989 !skew:temporary storage of user id
990 IGRSURF(IGS)%ID_MADYMO = ISKEW
991 !get internal id from user id
992 lFOUND=.FALSE.
993 DO J=0,NUMSKW+MIN(1,NSPCOND)*NUMSPH+NSUBMOD
994 IF(ISKEW==ISKN(4,J+1)) THEN
995 ISKEW=J+1
996 lFOUND=.TRUE.
997 EXIT
998 ENDIF
999 END DO
1000.NOT. IF(lFOUND)THEN
1001 CALL ANCMSG(MSGID=184,
1002 . MSGTYPE=MSGERROR,
1003 . ANMODE=ANINFO,
1004 . C1='surface',
1005 . I1=ID,
1006 . C2='surface',
1007 . C3=TITR,
1008 . I2=ISKEW)
1009C
1010 ELSE
1011C Init surface rotation
1012 DO J=1,9
1013 BUFSF(MAD+7+J-1)=SKEW(J,ISKEW)
1014 END DO
1015 ENDIF
1016C
1017 CALL HM_GET_FLOATV ('xc' ,XG,IS_AVAILABLE,LSUBMODEL,UNITAB)
1018 CALL HM_GET_FLOATV ('yc' ,YG,IS_AVAILABLE,LSUBMODEL,UNITAB)
1019 CALL HM_GET_FLOATV ('zc' ,ZG,IS_AVAILABLE,LSUBMODEL,UNITAB)
1020 IF(SUB_ID /= 0)CALL SUBROTPOINT(XG,YG,ZG,RTRANS,SUB_ID,LSUBMODEL)
1021 BUFSF(MAD+4)=XG
1022 BUFSF(MAD+5)=YG
1023 BUFSF(MAD+6)=ZG
1024 !Init application point for force and momentum
1025 !/* ellipsoides : defining center ! */
1026 BUFSF(MAD+16)=XG
1027 BUFSF(MAD+17)=YG
1028 BUFSF(MAD+18)=ZG
1029 DGR=0
1030
1031 CALL HM_GET_FLOATV ('a' ,S_A,IS_AVAILABLE,LSUBMODEL,UNITAB)
1032 CALL HM_GET_FLOATV ('b' ,S_B,IS_AVAILABLE,LSUBMODEL,UNITAB)
1033 CALL HM_GET_FLOATV ('c' ,S_C,IS_AVAILABLE,LSUBMODEL,UNITAB)
1034 DGR = 0
1035.OR..OR. IF ( S_A==0. S_B==0. S_C==0.) THEN
1036 CALL ANCMSG(MSGID=185,
1037 . MSGTYPE=MSGERROR,
1038 . ANMODE=ANINFO,
1039 . I1=ID,
1040 . C1=TITR)
1041 ENDIF
1042.AND. IF (DGR==0DGR1==0) THEN
1043 DGR1=2
1044 ELSEIF (DGR1==0) THEN
1045 DGR1=DGR
1046 ENDIF
1047
1048 BUFSF(MAD+1)=S_A
1049 BUFSF(MAD+2)=S_B
1050 BUFSF(MAD+3)=S_C
1051 BUFSF(MAD+36)=DGR1
1052
1053 MAD=MAD+36
1054 ELSEIF (KEY(1:8)=='mdellips')THEN
1055 IGRSURF(IGS)%ID = ID
1056 IGRSURF(IGS)%TYPE = 100
1057 IGRSURF(IGS)%IAD_BUFR = MAD
1058 MFI=MFI+43
1059 CALL HM_GET_INTV ('mdellips' ,REFMAD,IS_AVAILABLE,LSUBMODEL)
1060 !ID MaDyMo of entity which imposes the surface movement
1061 IGRSURF(IGS)%ID_MADYMO = REFMAD
1062 !Madymo syst id of entity which imposes the surface movement
1063 !(computed in Radioss Engine, when receiving Datas from MaDyMo).
1064 IGRSURF(IGS)%NB_MADYMO = 0
1065 MAD=MAD+43
1066 ENDIF
1067 ENDDO
1068 ENDIF
1069C=======================================================================
1070C INFINITE PLANE
1071C=======================================================================
1072 IADPL = MAD
1073.AND. IF (IT9 /= 0 FLAG == 1)THEN
1074 CALL HM_OPTION_START('/surf')
1075 DO IGS=1,NSURF
1076 CALL HM_OPTION_READ_KEY(LSUBMODEL,
1077 . OPTION_ID = ID,
1078 . OPTION_TITR = TITR ,
1079 . UNIT_ID = UID,
1080 . KEYWORD2 = KEY ,
1081 . KEYWORD3 = KEY2,
1082 . SUBMODEL_ID = SUB_ID)
1083 IGRSURF(IGS)%TITLE = TITR
1084 IFLAGUNIT = 0
1085 DO J=1,UNITAB%NUNITS
1086 IF (UNITAB%UNIT_ID(J) == UID) THEN
1087 FAC_L = UNITAB%FAC_L(J)
1088 IFLAGUNIT = 1
1089 EXIT
1090 ENDIF
1091 ENDDO
1092.AND. IF (UID/=0IFLAGUNIT==0) THEN
1093 CALL ANCMSG(MSGID=659,ANMODE=ANINFO,MSGTYPE=MSGERROR,
1094 . I2=UID,I1=ID,C1='surface',
1095 . C2='surface',
1096 . C3=TITR)
1097 ENDIF
1098
1099 IF(KEY(1:6)=='plane')THEN
1100 IGRSURF(IGS)%ID = ID
1101 IGRSURF(IGS)%TYPE = 200
1102 IGRSURF(IGS)%IAD_BUFR = IADPL
1103 MFI=MFI+6
1104
1105 XP1 = ZERO
1106 YP1 = ZERO
1107 ZP1 = ZERO
1108 XP2 = ZERO
1109 YP2 = ZERO
1110 ZP2 = ZERO
1111
1112 CALL HM_GET_FLOATV ('x_a' ,XP1,IS_AVAILABLE,LSUBMODEL,UNITAB)
1113 CALL HM_GET_FLOATV ('y_a' ,YP1,IS_AVAILABLE,LSUBMODEL,UNITAB)
1114 CALL HM_GET_FLOATV ('z_a' ,ZP1,IS_AVAILABLE,LSUBMODEL,UNITAB)
1115 IF(SUB_ID /= 0)CALL SUBROTPOINT(XP1,YP1,ZP1,RTRANS,SUB_ID,LSUBMODEL)
1116
1117 CALL HM_GET_FLOATV ('x_b' ,XP2,IS_AVAILABLE,LSUBMODEL,UNITAB)
1118 CALL HM_GET_FLOATV ('y_b' ,YP2,IS_AVAILABLE,LSUBMODEL,UNITAB)
1119 CALL HM_GET_FLOATV ('z_b' ,ZP2,IS_AVAILABLE,LSUBMODEL,UNITAB)
1120 IF(SUB_ID /= 0)CALL SUBROTPOINT(XP2,YP2,ZP2,RTRANS,SUB_ID,LSUBMODEL)
1121
1122 VECTX = (XP2-XP1)*(XP2-XP1)
1123 VECTY = (YP2-YP1)*(YP2-YP1)
1124 VECTZ = (ZP2-ZP1)*(ZP2-ZP1)
1125 VECT = SQRT(VECTX+VECTY+VECTZ)
1126 IF(VECT <= EM10)THEN
1127 CALL ANCMSG(MSGID=891,
1128 . MSGTYPE=MSGERROR,
1129 . ANMODE=ANINFO,
1130 . I1=ID,
1131 . C1=TITR)
1132 ENDIF
1133C Normal Vector
1134 BUFSF(IADPL+1)=XP1
1135 BUFSF(IADPL+2)=YP1
1136 BUFSF(IADPL+3)=ZP1
1137 BUFSF(IADPL+4)=XP2
1138 BUFSF(IADPL+5)=YP2
1139 BUFSF(IADPL+6)=ZP2
1140C
1141 IADPL=IADPL+6
1142 ENDIF
1143 ENDDO
1144!
1145 MAD = IADPL
1146 ENDIF
1147C=======================================================================
1148 DEALLOCATE(BUFTMP,INDX)
1149.OR. IF(IT2/=0IT6/=0)THEN
1150 MODE = 1
1151 CALL DEALLOCATE_SURF_ELM(NPART,SURF_ELM,MODE)
1152 DEALLOCATE( SURF_ELM )
1153 ENDIF
1154 RETURN
1155
1156 CALL ANCMSG(MSGID=189,
1157 . MSGTYPE=MSGERROR,
1158 . ANMODE=ANINFO,
1159 . I1=IGRSURF(IGS)%ID)
1160 RETURN
1161 END
1162
#define my_real
Definition cppsort.cpp:32
subroutine hm_get_int_array_index(name, ival, index, is_available, lsubmodel)
subroutine hm_get_intv(name, ival, is_available, lsubmodel)
subroutine hm_option_start(entity_type)
subroutine hm_read_surf(itab, itabm1, igrsurf, ixs, ixq, ixc, ixt, ixp, ixr, ixtg, ipart, iparts, ipartq, ipartc, ipartt, ipartp, ipartr, iparttg, x, mfi, iskn, skew, bufsf, knod2els, nod2els, sh4tree, sh3tree, isubmod, flag, unitab, ibox, ixs10, ixs16, ixs20, rtrans, lsubmodel, knod2elc, nod2elc, knod2eltg, nod2eltg, kxig3d, ixig3d, ipartig3d, knot, igeo, wige, knod2elig3d, nod2elig3d, v, nige, rige, xige, vige, iadtabige, decaligeo, iadboxmax, knod2elq, nod2elq, subset, igrbric, igrsh4n, igrsh3n, knotlocpc, knotlocel, nsets, map_tables)
subroutine ymax(idn, fac, npc, pld, stiffmin, stiffmax, stiffini, stiffavg)
Definition law100_upd.F:272
integer, parameter nchartitle
integer, parameter ncharkey
subroutine jc(p, t, a, b, cm, cn, tref, tm, epsm, sigmam, jc_yield, tan_jc)
Definition sigeps106.F:339
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)
Definition message.F:889