OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
hm_read_rwall_paral.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_rwall_paral ../starter/source/constraints/general/rwall/hm_read_rwall_paral.F
25!||--- called by ------------------------------------------------------
26!|| read_rwall ../starter/source/constraints/general/rwall/read_rwall.F
27!||--- calls -----------------------------------------------------
28!|| ancmsg ../starter/source/output/message/message.F
29!|| anodset ../starter/source/output/analyse/analyse_node.c
30!|| fretitl ../starter/source/starter/freform.F
31!|| hm_get_floatv ../starter/source/devtools/hm_reader/hm_get_floatv.F
32!|| hm_get_intv ../starter/source/devtools/hm_reader/hm_get_intv.F
33!|| hm_option_read_key ../starter/source/devtools/hm_reader/hm_option_read_key.F
34!|| hm_option_start ../starter/source/devtools/hm_reader/hm_option_start.F
35!|| kinset ../starter/source/constraints/general/kinset.F
36!|| ngr2usr ../starter/source/system/nintrr.F
37!|| remove_nd ../starter/source/elements/solid/solide10/dim_s10edg.F
38!|| subrotpoint ../starter/source/model/submodel/subrot.F
39!|| subrotvect ../starter/source/model/submodel/subrot.F
40!|| usr2sys ../starter/source/system/sysfus.F
41!||--- uses -----------------------------------------------------
42!|| hm_option_read_mod ../starter/share/modules1/hm_option_read_mod.F
43!|| message_mod ../starter/share/message_module/message_mod.F
44!|| r2r_mod ../starter/share/modules1/r2r_mod.F
45!|| submodel_mod ../starter/share/modules1/submodel_mod.F
46!||====================================================================
47 SUBROUTINE hm_read_rwall_paral(RWL ,NPRW ,LPRW ,IFI ,MS ,
48 . V ,ITAB ,ITABM1 ,X ,IKINE ,
49 . IGRNOD ,MFI ,IMERGE ,UNITAB ,IDDLEVEL,
50 . LSUBMODEL,RTRANS ,NOM_OPT ,ITAGND ,NCHPARAL,
51 . K ,OFFS ,IKINE1 )
52C-------------------------------------
53C READING MUR RIGIDE
54C-----------------------------------------------
55C M o d u l e s
56C-----------------------------------------------
57 USE unitab_mod
59 USE message_mod
60 USE r2r_mod
61 USE groupdef_mod
64C-----------------------------------------------
65C I m p l i c i t T y p e s
66C-----------------------------------------------
67#include "implicit_f.inc"
68C-----------------------------------------------
69C A n a l y s e M o d u l e
70C-----------------------------------------------
71#include "analyse_name.inc"
72C-----------------------------------------------
73C C o m m o n B l o c k s
74C-----------------------------------------------
75#include "com04_c.inc"
76#include "units_c.inc"
77#include "scr03_c.inc"
78#include "scr17_c.inc"
79#include "param_c.inc"
80#include "tabsiz_c.inc"
81#include "r2r_c.inc"
82C-----------------------------------------------
83C D u m m y A r g u m e n t s
84C-----------------------------------------------
85 TYPE (UNIT_TYPE_),INTENT(IN) :: UNITAB
86 INTEGER :: IFI,MFI,IDDLEVEL,NCHPARAL,K,OFFS
87 INTEGER :: NPRW(*), LPRW(*), ITAB(*), ITABM1(*),IKINE(*), IMERGE(*),ITAGND(*),IKINE1(3*NUMNOD)
88 TYPE(SUBMODEL_DATA) :: LSUBMODEL(NSUBMOD)
89 my_real :: rwl(nrwlp,*), ms(*), v(3,*), x(3,*),rtrans(ntransf,*)
90 INTEGER NOM_OPT(LNOPT1,*)
91C-----------------------------------------------
92 TYPE (GROUP_) ,TARGET, DIMENSION(NGRNOD) :: IGRNOD
93C-----------------------------------------------
94C L o c a l V a r i a b l e s
95C-----------------------------------------------
96 INTEGER N, ITYP, ITIED, NSL, NUSER, MSR, J, I,L, IGU,IGU2, IGRS, NOSYS, IFQ, JC,UID,IFLAGUNIT,SUB_ID, SUB_INDEX
97 my_real :: DIST, FRIC, DIAM, XMAS, VX, VY, VZ, XM1, YM1, ZM1, XM2, YM2, VN
98 my_real :: ZM2, XN, X1, Y1, Z1, DISN, X2, X3, FREQ, ALPHA, FAC_M_R2R
99 CHARACTER MESS*40
100 CHARACTER(LEN=NCHARTITLE) :: TITR
101 LOGICAL :: IS_AVAILABLE
102 INTEGER :: IPEN
103C-----------------------------------------------
104C E x t e r n a l F u n c t i o n s
105C-----------------------------------------------
106 INTEGER USR2SYS, NGR2USR
107 INTEGER, DIMENSION(:), POINTER :: INGR2USR
108 DATA MESS/'STANDARD RIGID WALL DEFINITION '/
109C=======================================================================
110C-----------------------------------------------
111! ******************************** !
112! RWALL/PARAM read with hm reader !
113! ******************************** !
114C-----------------------------------------------
115 is_available = .false.
116 CALL hm_option_start('/RWALL/PARAL')
117 ! Flag for RWALL type PARAL
118 ityp = 4
119 !----------------------------------------------------------------------
120 ! Loop over NCHPARAL
121 !----------------------------------------------------------------------
122 DO n = 1+offs, nchparal+offs
123C
124 ! Reading the option
125 ! /RWALL/type/rwall_ID/node_ID
126 ! rwall_title
127 titr = ''
128 CALL hm_option_read_key(lsubmodel,
129 . option_id = nuser,
130 . unit_id = uid,
131 . submodel_index = sub_index,
132 . submodel_id = sub_id,
133 . option_titr = titr)
134C
135 nom_opt(1,n) = nuser
136 CALL fretitl(titr,nom_opt(lnopt1-ltitr+1,n),ltitr)
137C
138 ! Checking flag unit
139 iflagunit = 0
140 DO j=1,unitab%NUNITS
141 IF (unitab%UNIT_ID(j) == uid) THEN
142 iflagunit = 1
143 EXIT
144 ENDIF
145 ENDDO
146 IF (uid /= 0 .AND. iflagunit == 0) THEN
147 CALL ancmsg(msgid=659,anmode=aninfo,msgtype=msgerror,
148 . i2=uid,i1=nuser,c1='RIGID WALL',
149 . c2='RIGID WALL',
150 . c3=titr)
151 ENDIF
152C
153 ! node_ID Slide grnd_ID1 grnd_ID2
154 CALL hm_get_intv('Node1',nuser,is_available,lsubmodel)
155 CALL hm_get_intv('slidingflag',itied,is_available,lsubmodel)
156 CALL hm_get_intv('NodeSet_ID',igu,is_available,lsubmodel)
157 CALL hm_get_intv('excludeNodeSet_ID',igu2,is_available,lsubmodel)
158 CALL hm_get_intv('Iform',ipen,is_available,lsubmodel)
159C
160 IF(nuser /= 0) THEN
161 msr = usr2sys(nuser,itabm1,mess,nuser)
162 CALL anodset(msr, check_used)
163 DO jc = 1,nmerged
164 IF (msr == imerge(jc)) msr = imerge(numcnod+jc)
165 ENDDO
166 ELSE
167 msr = 0
168 ENDIF
169C
170 ! 2nd card
171 ! d fric Diameter ffac ifq
172 CALL hm_get_floatv('offset' ,dist ,is_available, lsubmodel, unitab)
173 CALL hm_get_floatv('fric' ,fric ,is_available, lsubmodel, unitab)
174 CALL hm_get_floatv('Diameter' ,diam ,is_available, lsubmodel, unitab)
175 CALL hm_get_floatv('filteringfactor',FREQ ,IS_AVAILABLE, LSUBMODEL, UNITAB)
176 CALL HM_GET_INTV('filteringflag' ,IFQ ,IS_AVAILABLE, LSUBMODEL)
177.AND. IF (FREQ == 0 IFQ /= 0) IFQ = 0
178 IF (IFQ == 0) FREQ = ONE
179 ALPHA = ZERO
180 IF (IFQ >= 0) THEN
181 IF (IFQ <= 1) ALPHA = FREQ
182 IF (IFQ == 2) ALPHA = FOUR*ATAN2(ONE,ZERO) / FREQ
183 IF (IFQ == 3) ALPHA = FOUR*ATAN2(ONE,ZERO) * FREQ
184 ENDIF
185.OR..AND. IF ((ALPHA < ZERO) ((ALPHA > ONE IFQ <= 2))) THEN
186 CALL ANCMSG(MSGID=350,ANMODE=ANINFO,MSGTYPE=MSGERROR,
187 . I1=NUSER,
188 . C1=TITR,
189 . R1=FREQ)
190 ENDIF
191 RWL(13,N) = FRIC
192 RWL(14,N) = ALPHA
193 RWL(15,N) = IFQ
194C
195 ! 3rd card
196 ! if node_ID == 0
197 IF (MSR == 0) THEN
198 ! XM YM ZM
199 CALL HM_GET_FLOATV('x' ,X1 ,IS_AVAILABLE, LSUBMODEL, UNITAB)
200 CALL HM_GET_FLOATV('y' ,X2 ,IS_AVAILABLE, LSUBMODEL, UNITAB)
201 CALL HM_GET_FLOATV('z' ,X3 ,IS_AVAILABLE, LSUBMODEL, UNITAB)
202 IF(SUB_ID /= 0) CALL SUBROTPOINT(X1,X2,X3,RTRANS,SUB_ID,LSUBMODEL)
203 RWL(4,N) = X1
204 RWL(5,N) = X2
205 RWL(6,N) = X3
206 VX = ZERO
207 VY = ZERO
208 VZ = ZERO
209 ! if node_ID > 0
210 ELSE IF (MSR /= 0)THEN
211 ! Mass VX0 VY0 VZ0
212 CALL HM_GET_FLOATV('mass' ,XMAS ,IS_AVAILABLE, LSUBMODEL, UNITAB)
213 CALL HM_GET_FLOATV('motionx' ,VX ,IS_AVAILABLE, LSUBMODEL, UNITAB)
214 CALL HM_GET_FLOATV('motiony' ,VY ,IS_AVAILABLE, LSUBMODEL, UNITAB)
215 CALL HM_GET_FLOATV('motionz' ,VZ ,IS_AVAILABLE, LSUBMODEL, UNITAB)
216 ! Multidomains : masse of the rwall splitted between 2 domains
217 FAC_M_R2R = ONE
218 IF (NSUBDOM > 0) THEN
219 IF(TAGNO(NPART+MSR) == 4) FAC_M_R2R = HALF
220 ENDIF
221 IF(SUB_ID /= 0) CALL SUBROTVECT(VX,VY,VZ,RTRANS,SUB_ID,LSUBMODEL)
222 RWL(4,N) = X(1,MSR)
223 RWL(5,N) = X(2,MSR)
224 RWL(6,N) = X(3,MSR)
225 MS(MSR) = MS(MSR) + XMAS*FAC_M_R2R
226 V(1,MSR) = VX
227 V(2,MSR) = VY
228 V(3,MSR) = VZ
229 ENDIF
230C
231 ! 4th card (only for PLANE, CYL and PARAL)
232 ! XM1 YM1 ZM1
233 CALL HM_GET_FLOATV('cnode1_x' ,XM1 ,IS_AVAILABLE, LSUBMODEL, UNITAB)
234 CALL HM_GET_FLOATV('cnode1_y' ,YM1 ,IS_AVAILABLE, LSUBMODEL, UNITAB)
235 CALL HM_GET_FLOATV('cnode1_z' ,ZM1 ,IS_AVAILABLE, LSUBMODEL, UNITAB)
236 IF(SUB_ID /= 0) CALL SUBROTPOINT(XM1,YM1,ZM1,RTRANS,SUB_ID,LSUBMODEL)
237C
238 ! 5th card (only for PARAL)
239 ! XM2 YM2 ZM2
240 CALL HM_GET_FLOATV('cnode2_x' ,XM2 ,IS_AVAILABLE, LSUBMODEL, UNITAB)
241 CALL HM_GET_FLOATV('cnode2_y' ,YM2 ,IS_AVAILABLE, LSUBMODEL, UNITAB)
242 CALL HM_GET_FLOATV('cnode2_z' ,ZM2 ,IS_AVAILABLE, LSUBMODEL, UNITAB)
243 IF(SUB_ID /= 0) CALL SUBROTPOINT(XM2,YM2,ZM2,RTRANS,SUB_ID,LSUBMODEL)
244C
245 ! Initialization depending on the type of interface
246C MM1 AND MM2 DEFINE THE PARALLELOGRAM
247 RWL(1,N) = (YM1-RWL(5,N))*(ZM2-RWL(6,N))
248 . - (ZM1-RWL(6,N))*(YM2-RWL(5,N))
249 RWL(2,N) = (ZM1-RWL(6,N))*(XM2-RWL(4,N))
250 . - (XM1-RWL(4,N))*(ZM2-RWL(6,N))
251 RWL(3,N) = (XM1-RWL(4,N))*(YM2-RWL(5,N))
252 . - (YM1-RWL(5,N))*(XM2-RWL(4,N))
253 XN = SQRT(RWL(1,N)**2+RWL(2,N)**2+RWL(3,N)**2)
254 IF (XN <= EM10) THEN
255 CALL ANCMSG(MSGID=168,ANMODE=ANINFO,MSGTYPE=MSGERROR,
256 . I1=NUSER,C2='paral',C1=TITR)
257 ELSE
258 RWL(1,N) = RWL(1,N)/XN
259 RWL(2,N) = RWL(2,N)/XN
260 RWL(3,N) = RWL(3,N)/XN
261 ENDIF
262 RWL(7,N) = XM1-RWL(4,N)
263 RWL(8,N) = YM1-RWL(5,N)
264 RWL(9,N) = ZM1-RWL(6,N)
265 RWL(10,N) = XM2-RWL(4,N)
266 RWL(11,N) = YM2-RWL(5,N)
267 RWL(12,N) = ZM2-RWL(6,N)
268C
269 ! Looking for SECONDARY nodes
270 DO I = 1,NUMNOD
271 LPRW(K+I) = 0
272 ENDDO
273C
274 ! SECONDARY nodes at DIST from the RWALL
275 IF (DIST /= ZERO) THEN
276 DO I = 1,NUMNOD
277 X1 = (X(1,I)-RWL(4,N))*RWL(1,N)
278 Y1 = (X(2,I)-RWL(5,N))*RWL(2,N)
279 Z1 = (X(3,I)-RWL(6,N))*RWL(3,N)
280 DISN = X1+Y1+Z1
281.AND..AND. IF (DISN >= ZERO DISN <= DIST I /= MSR) LPRW(K+I)=1
282 ENDDO
283 ENDIF
284C
285 ! Node group +
286 INGR2USR => IGRNOD(1:NGRNOD)%ID
287 IGRS = NGR2USR(IGU,INGR2USR,NGRNOD)
288 IF (IGRS /= 0) THEN
289 DO J = 1,IGRNOD(IGRS)%NENTITY
290 NOSYS = IGRNOD(IGRS)%ENTITY(J)
291 LPRW(K+NOSYS) = 1
292 IF (ITAB(NOSYS) == NUSER) THEN
293 CALL ANCMSG(MSGID=637,
294 . MSGTYPE=MSGERROR,
295 . ANMODE=ANINFO_BLIND_1,
296 . I1=NUSER,
297 . C1=TITR,
298 . I2=NUSER)
299 ENDIF
300 ENDDO
301 ENDIF
302C
303 ! Node group -
304 INGR2USR => IGRNOD(1:NGRNOD)%ID
305 IGRS = NGR2USR(IGU2,INGR2USR,NGRNOD)
306 IF (IGRS /= 0) THEN
307 DO J = 1,IGRNOD(IGRS)%NENTITY
308 NOSYS = IGRNOD(IGRS)%ENTITY(J)
309 LPRW(K+NOSYS) = 0
310 ENDDO
311 ENDIF
312C
313 ! Compaction
314 NSL = 0
315 DO I = 1,NUMNOD
316 IF (LPRW(K+I) > 0) THEN
317.AND. IF (NS10E > 0 IPEN==0) THEN
318 IF(ITAGND(I) /= 0) CYCLE
319 ENDIF
320 NSL = NSL+1
321 LPRW(K+NSL) = I
322.AND. IF (IDDLEVEL == 0 IPEN==0) THEN
323 CALL KINSET(4,ITAB(I),IKINE(I),1,N+NUMSKW+1,IKINE1(I))
324 ENDIF
325 ENDIF
326 ENDDO
327 ! Itet=2 of S10
328.AND. IF (NS10E > 0 IPEN==0) CALL REMOVE_ND(NSL,LPRW(K+1),ITAGND)
329 IFI=IFI+NSL
330 IF (IFQ > 0) THEN
331 MFI=MFI+3*NSL
332 SRWSAV = SRWSAV + 3 * NSL
333 ENDIF
334C
335 ! Printing
336 IF (MSR == 0) THEN
337 WRITE(IOUT,1100) N,ITYP,ITIED,NSL
338 ELSE
339 WRITE(IOUT,1150) N,ITYP,ITIED,NSL,NUSER,XMAS,VX,VY,VZ
340 ENDIF
341 IF (IPEN > 0) WRITE(IOUT,2500)
342C
343 WRITE(IOUT,2004)(RWL(L,N),L=4,6),(RWL(L,N),L=7,9),
344 . (RWL(L,N),L=10,12)
345C
346 IF (ITIED == 2) WRITE(IOUT,2101) FRIC,IFQ,FREQ
347 IF (IPRI >= 1) THEN
348 WRITE(IOUT,1200)
349 WRITE(IOUT,1201) (ITAB(LPRW(I+K)),I=1,NSL)
350 ENDIF
351C
352 NPRW(N) = NSL
353 NPRW(N+NRWALL) = ITIED
354 NPRW(N+2*NRWALL) = MSR
355 NPRW(N+3*NRWALL) = ITYP
356 NPRW(N+4*NRWALL) = 0
357 NPRW(N+5*NRWALL) = 0
358 NPRW(N+8*NRWALL) = IPEN
359 IF (MSR /= 0) THEN
360 VN = VX*RWL(1,N)+VY*RWL(2,N)+VZ*RWL(3,N)
361 RWL(4,N) = VN
362 RWL(5,N) = ZERO
363 RWL(6,N) = ZERO
364 ENDIF
365 K = K+NSL
366C
367 ENDDO
368C
369 ! Updating the OFFSET
370 OFFS = OFFS + NCHPARAL
371C---------------------------------
372 RETURN
373C
374 1100 FORMAT(/5X,'rigid wall number. . . . .',I10
375 . /10X,'rigid wall TYPE . . . . .',I10
376 . /10X,'type slide/tied/friction.',I10
377 . /10X,'number of nodes . . . . .',I10)
378 1150 FORMAT(/5X,'rigid wall number. . . . .',I10
379 . /10X,'rigid wall TYPE . . . . .',I10
380 . /10X,'type slide/tied/friction.',I10
381 . /10X,'number of nodes . . . . .',I10
382 . /10X,'wall node number. . . . .',I10
383 . /10X,'wall mass . . . . . . . .',1PG14.4
384 . /10X,'wall x-velocity . . . . .',1pg14.4
385 . /10x,'WALL Y-VELOCITY . . . . .',1pg14.4
386 . /10x,'WALL Z-VELOCITY . . . . .',1pg14.4)
387 1200 FORMAT(/10x,'SECONDARY NODES : ')
388 1201 FORMAT(/10x,10i10)
389 2004 FORMAT(/5x,'PARALLELOGRAMM WALL CHARACTERISTICS',
390 . /10x,'POINT M . . . . . . . . .',1p3g20.13
391 . /10x,'MM1 VECTOR. . . . . . . .',1p3g20.13
392 . /10x,'MM2 VECTOR. . . . . . . .',1p3g20.13)
393 2101 FORMAT(/5x,'COULOMB FRICTION CHARACTERISTICS',
394 . /10x,'FRICTION COEFFICIENT . . .',1pg14.4
395 . /10x,'FILTRATION FLAG. . . . . .',i10
396 . /10x,'FILTRATION FACTOR. . . . .',1pg14.4)
397 2500 FORMAT(/5x,'RIGID WALL FORMULATION : PENALTY'/)
398 END
void anodset(int *id, int *type)
#define my_real
Definition cppsort.cpp:32
subroutine hm_get_floatv(name, rval, is_available, lsubmodel, unitab)
subroutine hm_get_intv(name, ival, is_available, lsubmodel)
subroutine hm_option_start(entity_type)
subroutine hm_read_rwall_paral(rwl, nprw, lprw, ifi, ms, v, itab, itabm1, x, ikine, igrnod, mfi, imerge, unitab, iddlevel, lsubmodel, rtrans, nom_opt, itagnd, nchparal, k, offs, ikine1)
integer, parameter nchartitle
integer, parameter ncharkey
integer nsubmod
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:895
subroutine fretitl(titr, iasc, l)
Definition freform.F:615
subroutine velocity(a, ar, v, vr, fzero, itab, nale)
Definition velocity.F:29