OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
hm_read_eref.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_eref ../starter/source/loads/reference_state/eref/hm_read_eref.F
25!||--- called by ------------------------------------------------------
26!|| lectur ../starter/source/starter/lectur.F
27!||--- calls -----------------------------------------------------
28!|| ancmsg ../starter/source/output/message/message.F
29!|| hm_get_int_array_index ../starter/source/devtools/hm_reader/hm_get_int_array_index.F
30!|| hm_get_intv ../starter/source/devtools/hm_reader/hm_get_intv.F
31!|| hm_option_read_key ../starter/source/devtools/hm_reader/hm_option_read_key.F
32!|| hm_option_start ../starter/source/devtools/hm_reader/hm_option_start.F
33!|| nintri ../starter/source/system/nintrr.F
34!|| r2r_sys ../starter/source/coupling/rad2rad/routines_r2r.F
35!|| usr2sys ../starter/source/system/sysfus.F
36!||--- uses -----------------------------------------------------
37!|| hm_option_read_mod ../starter/share/modules1/hm_option_read_mod.F
38!|| message_mod ../starter/share/message_module/message_mod.F
39!|| submodel_mod ../starter/share/modules1/submodel_mod.F
40!||====================================================================
41 SUBROUTINE hm_read_eref(ITABM1 ,IPART ,IPARTC ,IPARTG ,IPARTS,
42 . IXC ,IXTG ,IXS ,X ,XREFC ,
43 . XREFTG ,XREFS ,LSUBMODEL,IDDLEVEL,ITAB ,
44 . TAGXREF ,TAGREFSTA )
45C-----------------------------------------------
46C M o d u l e s
47C-----------------------------------------------
48 USE unitab_mod
49 USE submodel_mod
50 USE message_mod
53C-----------------------------------------------
54C I m p l i c i t T y p e s
55C-----------------------------------------------
56#include "implicit_f.inc"
57C-----------------------------------------------
58C C o m m o n B l o c k s
59C-----------------------------------------------
60#include "scr03_c.inc"
61#include "scr17_c.inc"
62#include "com04_c.inc"
63#include "units_c.inc"
64C-----------------------------------------------
65C G l o b a l V a r i a b l e s
66C-----------------------------------------------
67 INTEGER ITABM1(*),IPART(LIPART1,*),IPARTC(*),IPARTG(*),IPARTS(*)
68 INTEGER IXC(NIXC,*),IXTG(NIXTG,*),IXS(NIXS,*)
69 INTEGER IDDLEVEL,ITAB(NUMNOD),TAGXREF(*),TAGREFSTA(*)
71 . x(3,*),xrefc(4,3,*),xreftg(3,3,*),xrefs(8,3,*)
72 TYPE(submodel_data) LSUBMODEL(*)
73C-----------------------------------------------
74C L o c a l V a r i a b l e s
75C-----------------------------------------------
76 INTEGER, DIMENSION(:), ALLOCATABLE :: TAGELC,TAGELTG,TAGELS
77 INTEGER, DIMENSION(:), ALLOCATABLE :: TAGNOD
78 INTEGER I,IX(8),IE,J,IN,ID,IP,IR,NN,PARTID,UID,ITYP
79 INTEGER SUB_ID,MM, NEL
80 CHARACTER(LEN=NCHARLINE) :: TITLE
81 CHARACTER(LEN=NCHARKEY) :: KEY1,KEY
82 CHARACTER MESS*40
83 LOGICAL :: IS_AVAILABLE
84 DATA mess/'EREF ELEMENT REFERENCE GEOMETRY'/
85C-----------------------------------------------
86C E x t e r n a l F u n c t i o n s
87C-----------------------------------------------
88 INTEGER USR2SYS,R2R_SYS,NINTRI
89C=======================================================================
90
91 ALLOCATE(tagelc(numelc),tageltg(numeltg),tagels(numels8),tagnod(numnod))
92C
93 is_available = .false.
94C
95 IF(nxref == 0 .AND. irefsta == 0) THEN
96 DO ie=1,numelc
97 DO in = 1,4
98 nn = ixc(in+1,ie)
99 DO j = 1,3
100 xrefc(in,j,ie) = x(j,nn)
101 ENDDO
102 ENDDO
103 ENDDO
104 DO ie=1,numeltg
105 DO in = 1,3
106 nn = ixtg(in+1,ie)
107 DO j = 1,3
108 xreftg(in,j,ie) = x(j,nn)
109 ENDDO
110 ENDDO
111 ENDDO
112 DO ie=1,numels8
113 DO in = 1,8
114 nn = ixs(in+1,ie)
115 DO j = 1,3
116 xrefs(in,j,ie) = x(j,nn)
117 ENDDO
118 ENDDO
119 ENDDO
120 ENDIF
121C
122 IF(iddlevel == 0) WRITE(iout,1000)
123 nitrs = 100
124 tagnod(1:numnod) = 0
125C
126 CALL hm_option_start('/EREF')
127C
128 DO ir=1,neref
129C
130 CALL hm_option_read_key(lsubmodel,
131 . unit_id = uid,
132 . submodel_id = sub_id,
133 . option_titr = title,
134 . keyword1 = key1,
135 . keyword2 = key)
136C
137 CALL hm_get_intv('component',partid,is_available,lsubmodel)
138C
139 IF (key1(1:4) == 'EREF')THEN
140 IF(iddlevel == 0) WRITE(iout,1001) title,partid
141 ip = 0
142 DO i = 1,npart
143 IF (ipart(4,i) == partid) ip = i
144 ENDDO
145C
146 tagelc(1:numelc) = 0
147 tageltg(1:numeltg)= 0
148 tagels(1:numels8) = 0
149 ityp = 0
150C
151 DO ie=1,numelc
152 IF (ip == ipartc(ie).OR.ip==0) THEN
153 tagelc(ie) = 1
154 ityp = 1
155 ENDIF
156 ENDDO
157 DO ie=1,numeltg
158 IF (ip == ipartg(ie).OR.ip==0) THEN
159 tageltg(ie) = 1
160 ityp = 1
161 ENDIF
162 ENDDO
163 IF (ityp == 0) THEN
164 DO ie=1,numels8
165 IF (ip == iparts(ie).OR.ip==0) THEN
166 tagels(ie) = 1
167 ityp = 2
168 ENDIF
169 ENDDO
170 ENDIF
171C
172 SELECT CASE (ityp)
173 CASE (1)
174 IF(key(1:5)=='SHELL') THEN
175 IF(iddlevel == 0.AND.ipri >= 5) WRITE(iout,'(9X,A7,4(9X,A2))') 'ELEM-ID','N1','N2','N3','N4'
176 CALL hm_get_intv('table_count',nel,is_available,lsubmodel)
177C
178 DO i=1,nel
179C
180 CALL hm_get_int_array_index('elems_table_elem',id,i,is_available,lsubmodel)
181 CALL hm_get_int_array_index('elems_table_n1',ix(1),i,is_available,lsubmodel)
182 CALL hm_get_int_array_index('elems_table_n2',ix(2),i,is_available,lsubmodel)
183 CALL hm_get_int_array_index('elems_table_n3',ix(3),i,is_available,lsubmodel)
184 CALL hm_get_int_array_index('elems_table_n4',ix(4),i,is_available,lsubmodel)
185C
186 ie=nintri(id,ixc,nixc,numelc,nixc)
187 IF(id > 0 .AND. ie == 0) THEN
188 CALL ancmsg(msgid=1011,
189 . msgtype=msgerror,
190 . anmode=aninfo,
191 . c1='SHELL',i1=id)
192 ELSEIF (id > 0 .AND. tagelc(ie) == 1) THEN
193 DO in=1,4
194 nn = usr2sys(ix(in),itabm1,mess,id)
195 mm = ixc(in+1,ie)
196 tagnod(mm) = 1
197 xrefc(in,1,ie) = x(1,nn)
198 xrefc(in,2,ie) = x(2,nn)
199 xrefc(in,3,ie) = x(3,nn)
200 ENDDO
201 IF(iddlevel == 0.AND.ipri >= 5) WRITE(iout,'(5X,5(1X,I10))') id,(ix(in),in=1,4)
202 ENDIF
203 ENDDO
204 IF(iddlevel == 0.AND.ipri < 5) WRITE(iout,1010) nel
205C
206 ELSEIF(key(1:4)=='SH3N') THEN
207 IF(iddlevel == 0.AND.ipri >= 5) WRITE(iout,'(9X,A7,4(9X,A2))') 'ELEM-ID','N1','N2','N3'
208 CALL hm_get_intv('table_count',nel,is_available,lsubmodel)
209C
210 DO i=1,nel
211C
212 CALL hm_get_int_array_index('elems_table_elem',id,i,is_available,lsubmodel)
213 CALL hm_get_int_array_index('elems_table_n1',ix(1),i,is_available,lsubmodel)
214 CALL hm_get_int_array_index('elems_table_n2',ix(2),i,is_available,lsubmodel)
215 CALL hm_get_int_array_index('elems_table_n3',ix(3),i,is_available,lsubmodel)
216C
217 ie=nintri(id,ixtg,nixtg,numeltg,nixtg)
218 IF(id > 0 .AND. ie == 0) THEN
219 CALL ancmsg(msgid=1011,
220 . msgtype=msgerror,
221 . anmode=aninfo,
222 . c1='TRIANGLE',i1=id)
223 ELSEIF (id > 0 .AND. tageltg(ie) == 1) THEN
224 DO in=1,3
225 nn = usr2sys(ix(in),itabm1,mess,id)
226 mm = ixtg(in+1,ie)
227 tagnod(mm) = 1
228 xreftg(in,1,ie) = x(1,nn)
229 xreftg(in,2,ie) = x(2,nn)
230 xreftg(in,3,ie) = x(3,nn)
231 ENDDO
232 IF(iddlevel == 0.AND.ipri >= 5) WRITE(iout,'(5x,4(1x,i10))') ID,(IX(IN),IN=1,3)
233 ENDIF
234 ENDDO
235.AND. IF(IDDLEVEL == 0IPRI < 5) WRITE(IOUT,1020) NEL
236 ENDIF
237C
238 CASE (2)
239 IF(KEY(1:5)=='brick') THEN
240C
241.AND. IF(IDDLEVEL == 0IPRI >= 5)WRITE(IOUT,'(9x,a7,8(9x,a2))')'elem-id','n1','n2','n3','n4','n5','n6','n7','n8'
242 CALL HM_GET_INTV('table_count',NEL,IS_AVAILABLE,LSUBMODEL)
243C
244 DO I=1,NEL
245C
246 CALL HM_GET_INT_ARRAY_INDEX('elems_table_elem',ID,I,IS_AVAILABLE,LSUBMODEL)
247 CALL HM_GET_INT_ARRAY_INDEX('elems_table_n1',IX(1),I,IS_AVAILABLE,LSUBMODEL)
248 CALL HM_GET_INT_ARRAY_INDEX('elems_table_n2',IX(2),I,IS_AVAILABLE,LSUBMODEL)
249 CALL HM_GET_INT_ARRAY_INDEX('elems_table_n3',IX(3),I,IS_AVAILABLE,LSUBMODEL)
250 CALL HM_GET_INT_ARRAY_INDEX('elems_table_n4',IX(4),I,IS_AVAILABLE,LSUBMODEL)
251 CALL HM_GET_INT_ARRAY_INDEX('elems_table_n5',IX(5),I,IS_AVAILABLE,LSUBMODEL)
252 CALL HM_GET_INT_ARRAY_INDEX('elems_table_n6',IX(6),I,IS_AVAILABLE,LSUBMODEL)
253 CALL HM_GET_INT_ARRAY_INDEX('elems_table_n7',IX(7),I,IS_AVAILABLE,LSUBMODEL)
254 CALL HM_GET_INT_ARRAY_INDEX('elems_table_n8',IX(8),I,IS_AVAILABLE,LSUBMODEL)
255C
256 IE=NINTRI(ID,IXS,NIXS,NUMELS8,NIXS)
257.AND. IF(ID > 0 IE == 0) THEN
258 CALL ANCMSG(MSGID=1011,
259 . MSGTYPE=MSGERROR,
260 . ANMODE=ANINFO,
261 . C1='solid',I1=ID)
262.AND. ELSEIF (ID > 0 TAGELS(IE) == 1) THEN
263 DO IN=1,8
264 NN = USR2SYS(IX(IN),ITABM1,MESS,ID)
265 MM = IXS(IN+1,IE)
266 TAGNOD(MM) = 1
267 XREFS(IN,1,IE) = X(1,NN)
268 XREFS(IN,2,IE) = X(2,NN)
269 XREFS(IN,3,IE) = X(3,NN)
270 ENDDO
271.AND. IF(IDDLEVEL == 0IPRI >= 5) WRITE(IOUT,'(5x,9(1x,i10))') ID,(IX(IN),IN=1,8)
272 ENDIF
273 ENDDO
274.AND. IF(IDDLEVEL == 0IPRI < 5) WRITE(IOUT,1030) NEL
275 ELSEIF(KEY(1:6)=='tetra4') THEN
276.AND. IF(IDDLEVEL == 0IPRI >= 5) WRITE(IOUT,'(9x,a7,4(9x,a2))') 'elem-id','n1','n2','n3','n4'
277 CALL HM_GET_INTV('table_count',NEL,IS_AVAILABLE,LSUBMODEL)
278C
279 DO I=1,NEL
280C
281 CALL HM_GET_INT_ARRAY_INDEX('elems_table_elem',ID,I,IS_AVAILABLE,LSUBMODEL)
282 CALL HM_GET_INT_ARRAY_INDEX('elems_table_n1',IX(1),I,IS_AVAILABLE,LSUBMODEL)
283 CALL HM_GET_INT_ARRAY_INDEX('elems_table_n2',IX(3),I,IS_AVAILABLE,LSUBMODEL)
284 CALL HM_GET_INT_ARRAY_INDEX('elems_table_n3',IX(6),I,IS_AVAILABLE,LSUBMODEL)
285 CALL HM_GET_INT_ARRAY_INDEX('elems_table_n4',IX(5),I,IS_AVAILABLE,LSUBMODEL)
286C
287 IX(2)=IX(1)
288 IX(4)=IX(3)
289 IX(8)=IX(5)
290 IX(7)=IX(6)
291 IE=NINTRI(ID,IXS,NIXS,NUMELS8,NIXS)
292C
293.AND. IF(ID > 0 IE == 0) THEN
294 CALL ANCMSG(MSGID=1011,
295 . MSGTYPE=MSGERROR,
296 . ANMODE=ANINFO,
297 . C1='tetra4',I1=ID)
298.AND. ELSEIF (ID > 0 TAGELS(IE) == 1) THEN
299 DO IN=1,8
300 NN = USR2SYS(IX(IN),ITABM1,MESS,ID)
301 MM = IXS(IN+1,IE)
302 TAGNOD(MM) = 1
303 XREFS(IN,1,IE) = X(1,NN)
304 XREFS(IN,2,IE) = X(2,NN)
305 XREFS(IN,3,IE) = X(3,NN)
306 ENDDO
307.AND. IF(IDDLEVEL == 0IPRI >= 5) WRITE(IOUT,'(5x,5(1x,i10))') ID,IX(1),IX(3),IX(6),IX(5)
308 ENDIF
309 ENDDO
310.AND. IF(IDDLEVEL == 0IPRI < 5) WRITE(IOUT,1040) NEL
311 ENDIF
312 END SELECT
313C
314 ENDIF
315 ENDDO
316C------------------------------------------
317C CHECK COMPATIBILITY WITH XREF AND REFSTA
318
319C------------------------------------------
320
321 IF(IDDLEVEL == 1) THEN
322
323 ELSE
324 IF( NXREF /= 0) THEN
325 DO IN=1,NUMNOD
326 IF(TAGNOD(IN) == 0) CYCLE
327 IF(TAGXREF(IN) == 1) THEN
328 CALL ANCMSG(MSGID=1098,MSGTYPE=MSGERROR,ANMODE=ANINFO, I1=ITAB(IN))
329 ENDIF
330 ENDDO
331 ENDIF
332 IF( IREFSTA /= 0) THEN
333 DO IN=1,NUMNOD
334 IF(TAGNOD(IN) == 0) CYCLE
335 IF(TAGREFSTA(IN) == 1) THEN
336 CALL ANCMSG(MSGID=1099,MSGTYPE=MSGERROR,ANMODE=ANINFO,I1=ITAB(IN))
337 ENDIF
338 ENDDO
339 ENDIF
340 ENDIF
341C
342 DEALLOCATE(TAGELC,TAGELTG,TAGELS,TAGNOD)
343 RETURN
344 1000 FORMAT(//
345 & 5X,' reference state(eref) ',/
346 & 5X,' ---------------------- ' )
347 1001 FORMAT(/
348 & 5X, A ,/
349 & 5X,'part id . . . . . . . . . . . . =',I10)
350 1010 FORMAT(
351 & 5X,'number of 4-nodes shell . . . . =',I10)
352 1020 FORMAT(
353 & 5X,'number of 3-nodes shell . . . . =',I10)
354 1030 FORMAT(
355 & 5X,'number of 8-nodes brick . . . . =',I10)
356 1040 FORMAT(
357 & 5X,'number of 4-nodes tetra . . . . =',I10)
358 END SUBROUTINE HM_READ_EREF
#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_eref(itabm1, ipart, ipartc, ipartg, iparts, ixc, ixtg, ixs, x, xrefc, xreftg, xrefs, lsubmodel, iddlevel, itab, tagxref, tagrefsta)
integer, parameter nchartitle
integer, parameter ncharkey
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