OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
hm_read_rwall_lagmul.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_lagmul ../starter/source/constraints/general/rwall/hm_read_rwall_lagmul.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_lagmul(RWL ,NPRW ,LPRW ,IFI ,MS ,
48 . V ,ITAB ,ITABM1 ,X ,IKINE ,
49 . IGRNOD ,MFI ,IMERGE ,UNITAB ,IDDLEVEL,
50 . LSUBMODEL,RTRANS ,NOM_OPT ,ITAGND ,NCHLAGM ,
51 . K ,OFFS ,IKINE1LAG)
52C-------------------------------------
53C LECTURE MUR RIGIDE
54C-----------------------------------------------
55C M o d u l e s
56C-----------------------------------------------
57 USE unitab_mod
58 USE submodel_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 "lagmult.inc"
76#include "com04_c.inc"
77#include "units_c.inc"
78#include "scr03_c.inc"
79#include "scr17_c.inc"
80#include "param_c.inc"
81#include "tabsiz_c.inc"
82#include "r2r_c.inc"
83C-----------------------------------------------
84C D u m m y A r g u m e n t s
85C-----------------------------------------------
86 TYPE (UNIT_TYPE_),INTENT(IN) ::UNITAB
87 INTEGER IFI,MFI,IDDLEVEL,NCHLAGM,K,OFFS
88 INTEGER NPRW(*), LPRW(*), ITAB(*), ITABM1(*),
89 . IKINE(*), IMERGE(*),ITAGND(*),IKINE1LAG(*)
90 TYPE(submodel_data) LSUBMODEL(*)
92 . rwl(nrwlp,*), ms(*), v(3,*), x(3,*),
93 . rtrans(ntransf,*)
94 INTEGER NOM_OPT(LNOPT1,*)
95C-----------------------------------------------
96 TYPE (GROUP_) ,TARGET, DIMENSION(NGRNOD) :: IGRNOD
97C-----------------------------------------------
98C L o c a l V a r i a b l e s
99C-----------------------------------------------
100 INTEGER N, ITYP, ITIED, NSL, NUSER, MSR, J, I,L, IGU,IGU2, IGRS, NOSYS, IFQ, JC, UID,IFLAGUNIT,SUB_ID, SUB_INDEX
101 my_real :: DIST, FRIC, DIAM, XMAS, VX, VY, VZ, XM1, YM1, ZM1
102 my_real :: XN, X1, Y1, Z1, DISN, X2, X3, FREQ, ALPHA, FAC_M_R2R
103 CHARACTER MESS*40
104 CHARACTER(LEN=NCHARTITLE) :: TITR
105 LOGICAL :: IS_AVAILABLE
106C-----------------------------------------------
107C E x t e r n a l F u n c t i o n s
108C-----------------------------------------------
109 INTEGER USR2SYS, NGR2USR
110 INTEGER, DIMENSION(:), POINTER :: INGR2USR
111 DATA MESS/'STANDARD RIGID WALL DEFINITION '/
112C=======================================================================
113C-----------------------------------------------
114! ************************** !
115! RWALL/PLANE read with hm reader !
116! ************************** !
117C-----------------------------------------------
118 is_available = .false.
119 CALL hm_option_start('/RWALL/LAGMUL')
120 ! Flag for RWALL type PLANE
121 ityp = 1
122 !----------------------------------------------------------------------
123 ! Loop over HM_RWALLs
124 !----------------------------------------------------------------------
125 DO n = 1+offs, nchlagm+offs
126C
127 ! Reading the option
128 ! /RWALL/type/rwall_ID/node_ID
129 ! rwall_title
130 titr = ''
131 CALL hm_option_read_key(lsubmodel,
132 . option_id = nuser,
133 . unit_id = uid,
134 . submodel_index = sub_index,
135 . submodel_id = sub_id,
136 . option_titr = titr)
137C
138 nom_opt(1,n)=nuser
139 CALL fretitl(titr,nom_opt(lnopt1-ltitr+1,n),ltitr)
140C
141 ! Checking flag unit
142 iflagunit = 0
143 DO j=1,unitab%NUNITS
144 IF (unitab%UNIT_ID(j) == uid) THEN
145 iflagunit = 1
146 EXIT
147 ENDIF
148 ENDDO
149 IF (uid /= 0 .AND. iflagunit == 0) THEN
150 CALL ancmsg(msgid=659,anmode=aninfo,msgtype=msgerror,
151 . i2=uid,i1=nuser,c1='RIGID WALL',
152 . c2='RIGID WALL',
153 . c3=titr)
154 ENDIF
155C
156 ! node_ID Slide grnd_ID1 grnd_ID2
157 CALL hm_get_intv('Node1',nuser,is_available,lsubmodel)
158 CALL hm_get_intv('slidingflag',itied,is_available,lsubmodel)
159 CALL hm_get_intv('NodeSet_ID',igu,is_available,lsubmodel)
160 CALL hm_get_intv('excludeNodeSet_ID',igu2,is_available,lsubmodel)
161C
162 IF (nuser /= 0) THEN
163 msr = usr2sys(nuser,itabm1,mess,nuser)
164 CALL anodset(msr, check_used)
165 DO jc = 1,nmerged
166 IF (msr == imerge(jc)) msr = imerge(numcnod+jc)
167 ENDDO
168 ELSE
169 msr = 0
170 ENDIF
171C
172 ! 2nd card
173 ! d fric Diameter ffac ifq
174 CALL hm_get_floatv('offset' ,dist ,is_available, lsubmodel, unitab)
175 CALL hm_get_floatv('fric' ,fric ,is_available, lsubmodel, unitab)
176 CALL hm_get_floatv('Diameter' ,diam ,is_available, lsubmodel, unitab)
177 CALL hm_get_floatv('Filteringfactor',freq ,is_available, lsubmodel, unitab)
178 CALL hm_get_intv('Filteringflag' ,ifq ,is_available, lsubmodel)
179 IF (freq == 0 .AND. ifq /= 0) ifq = 0
180 IF (ifq == 0) freq = one
181 alpha = zero
182 IF (ifq >= 0) THEN
183 IF (ifq <= 1) alpha = freq
184 IF (ifq == 2) alpha = four*atan2(one,zero) / freq
185 IF (ifq == 3) alpha = four*atan2(one,zero) * freq
186 ENDIF
187 IF ((alpha < zero) .OR. ((alpha > one .AND. ifq <= 2))) THEN
188 CALL ancmsg(msgid=350,anmode=aninfo,msgtype=msgerror,
189 . i1=nuser,
190 . c1=titr,
191 . r1=freq)
192 ENDIF
193 rwl(13,n) = fric
194 rwl(14,n) = alpha
195 rwl(15,n) = ifq
196C
197 ! 3rd card
198 ! if node_ID == 0
199 IF (msr == 0) THEN
200 ! XM YM ZM
201 CALL hm_get_floatv('x' ,X1 ,IS_AVAILABLE, LSUBMODEL, UNITAB)
202 CALL HM_GET_FLOATV('y' ,X2 ,IS_AVAILABLE, LSUBMODEL, UNITAB)
203 CALL HM_GET_FLOATV('z' ,X3 ,IS_AVAILABLE, LSUBMODEL, UNITAB)
204 IF(SUB_ID /= 0) CALL SUBROTPOINT(X1,X2,X3,RTRANS,SUB_ID,LSUBMODEL)
205 RWL(4,N) = X1
206 RWL(5,N) = X2
207 RWL(6,N) = X3
208 ! if node_ID > 0
209 ELSE IF (MSR /= 0)THEN
210 ! Mass VX0 VY0 VZ0
211 CALL HM_GET_FLOATV('mass' ,XMAS ,IS_AVAILABLE, LSUBMODEL, UNITAB)
212 CALL HM_GET_FLOATV('motionx' ,VX ,IS_AVAILABLE, LSUBMODEL, UNITAB)
213 CALL HM_GET_FLOATV('motiony' ,VY ,IS_AVAILABLE, LSUBMODEL, UNITAB)
214 CALL HM_GET_FLOATV('motionz' ,VZ ,IS_AVAILABLE, LSUBMODEL, UNITAB)
215 ! Multidomains : masse of the rwall splitted between 2 domains
216 FAC_M_R2R = ONE
217 IF (NSUBDOM > 0) THEN
218 IF(TAGNO(NPART+MSR) == 4) FAC_M_R2R = HALF
219 ENDIF
220 IF(SUB_ID /= 0) CALL SUBROTVECT(VX,VY,VZ,RTRANS,SUB_ID,LSUBMODEL)
221 RWL(4,N) = X(1,MSR)
222 RWL(5,N) = X(2,MSR)
223 RWL(6,N) = X(3,MSR)
224 MS(MSR) = MS(MSR) + XMAS*FAC_M_R2R
225 V(1,MSR) = VX
226 V(2,MSR) = VY
227 V(3,MSR) = VZ
228 ENDIF
229C
230 ! 4th card (only for PLANE, CYL and PARAL)
231 ! XM1 YM1 ZM1
232 CALL HM_GET_FLOATV('xh' ,XM1 ,IS_AVAILABLE, LSUBMODEL, UNITAB)
233 CALL HM_GET_FLOATV('yh' ,YM1 ,IS_AVAILABLE, LSUBMODEL, UNITAB)
234 CALL HM_GET_FLOATV('zh' ,ZM1 ,IS_AVAILABLE, LSUBMODEL, UNITAB)
235 IF (SUB_ID /= 0) CALL SUBROTPOINT(XM1,YM1,ZM1,RTRANS,SUB_ID,LSUBMODEL)
236C
237 ! Initialization depending on the type of interface
238 ! PLANE
239C M MUR ET MM1 NORMALE
240 RWL(1,N) = XM1-RWL(4,N)
241 RWL(2,N) = YM1-RWL(5,N)
242 RWL(3,N) = ZM1-RWL(6,N)
243 XN = SQRT(RWL(1,N)**2+RWL(2,N)**2+RWL(3,N)**2)
244 IF (XN <= EM10) THEN
245 CALL ANCMSG(MSGID=167,ANMODE=ANINFO,MSGTYPE=MSGERROR,
246 . I1=NUSER,C2='plane',C1=TITR)
247 ELSE
248 RWL(1,N) = RWL(1,N)/XN
249 RWL(2,N) = RWL(2,N)/XN
250 RWL(3,N) = RWL(3,N)/XN
251 ENDIF
252C
253 ! Looking for SECONDARY nodes
254 DO I = 1,NUMNOD
255 LPRW(K+I) = 0
256 ENDDO
257C
258 ! SECONDARY nodes at DIST from the RWALL
259 IF (DIST /= ZERO) THEN
260 DO I = 1,NUMNOD
261 X1 = (X(1,I)-RWL(4,N))*RWL(1,N)
262 Y1 = (X(2,I)-RWL(5,N))*RWL(2,N)
263 Z1 = (X(3,I)-RWL(6,N))*RWL(3,N)
264 DISN = X1+Y1+Z1
265.AND..AND. IF (DISN >= ZERO DISN <= DIST I /= MSR) LPRW(K+I)=1
266 ENDDO
267 ENDIF
268C
269 ! Node group +
270 INGR2USR => IGRNOD(1:NGRNOD)%ID
271 IGRS = NGR2USR(IGU,INGR2USR,NGRNOD)
272 IF (IGRS /= 0) THEN
273 DO J = 1,IGRNOD(IGRS)%NENTITY
274 NOSYS = IGRNOD(IGRS)%ENTITY(J)
275 LPRW(K+NOSYS) = 1
276 IF (ITAB(NOSYS) == NUSER) THEN
277 CALL ANCMSG(MSGID=637,
278 . MSGTYPE=MSGERROR,
279 . ANMODE=ANINFO_BLIND_1,
280 . I1=NUSER,
281 . C1=TITR,
282 . I2=NUSER)
283 ENDIF
284 ENDDO
285 ENDIF
286C
287 ! Node group -
288 INGR2USR => IGRNOD(1:NGRNOD)%ID
289 IGRS = NGR2USR(IGU2,INGR2USR,NGRNOD)
290 IF (IGRS /= 0) THEN
291 DO J = 1,IGRNOD(IGRS)%NENTITY
292 NOSYS = IGRNOD(IGRS)%ENTITY(J)
293 LPRW(K+NOSYS) = 0
294 ENDDO
295 ENDIF
296C
297 ! Compaction
298 NSL = 0
299 DO I = 1,NUMNOD
300 IF (LPRW(K+I) > 0) THEN
301 IF (NS10E > 0) THEN
302 IF(ITAGND(I) /= 0) CYCLE
303 ENDIF
304 NSL = NSL+1
305 LPRW(K+NSL) = I
306 IF (IDDLEVEL == 0) THEN
307 CALL KINSET(512,ITAB(I),IKINE(I),7,0,IKINE1LAG(I))
308 ENDIF
309 ENDIF
310 ENDDO
311 ! Itet=2 of S10
312 IF (NS10E > 0 ) CALL REMOVE_ND(NSL,LPRW(K+1),ITAGND)
313 IFI=IFI+NSL
314 IF (IFQ > 0) THEN
315 MFI=MFI+3*NSL
316 SRWSAV = SRWSAV + 3 * NSL
317 ENDIF
318C
319 ! Printing
320 IF (MSR == 0) THEN
321 WRITE(IOUT,1100) N,ITYP,ITIED,NSL
322 ELSE
323 WRITE(IOUT,1150) N,ITYP,ITIED,NSL,NUSER,XMAS,VX,VY,VZ
324 ENDIF
325C
326 WRITE(IOUT,1160)
327 WRITE(IOUT,2001)(RWL(L,N),L=4,6),(RWL(L,N),L=1,3)
328
329 IF (ITIED == 2) WRITE(IOUT,2101)FRIC,IFQ,FREQ
330 IF (IPRI >= 1) THEN
331 WRITE(IOUT,1200)
332 WRITE(IOUT,1201) (ITAB(LPRW(I+K)),I=1,NSL)
333 ENDIF
334C
335 NPRW(N) = NSL
336 NPRW(N+NRWALL) = ITIED
337 NPRW(N+2*NRWALL) = MSR
338 NPRW(N+3*NRWALL) = ITYP
339 NPRW(N+4*NRWALL) = 0
340 NPRW(N+5*NRWALL) = 1
341 NRWLAG = MAX(NRWLAG,NSL)
342 IF (ITIED == 0) THEN
343 LAG_NCL=LAG_NCL+NSL
344 LAG_NKL=LAG_NKL+NSL*3
345 ELSE IF (ITIED == 1) THEN
346 LAG_NCL=LAG_NCL+NSL*3
347 LAG_NKL=LAG_NKL+NSL*3
348 ENDIF
349 IF (MSR /= 0) THEN
350 LAG_NKL=LAG_NKL+NSL*3
351 ENDIF
352 K = K+NSL
353C
354 ENDDO
355C
356 ! Updating the OFFSET
357 OFFS = OFFS + NCHLAGM
358C
359 RETURN
360C
361 1100 FORMAT(/5X,'rigid wall number. . . . .',I10
362 . /10X,'rigid wall TYPE . . . . .',I10
363 . /10X,'type slide/tied/friction.',I10
364 . /10X,'number of nodes . . . . .',I10)
365 1150 FORMAT(/5X,'rigid wall number. . . . .',I10
366 . /10X,'rigid wall TYPE . . . . .',I10
367 . /10X,'type slide/tied/friction.',I10
368 . /10X,'number of nodes . . . . .',I10
369 . /10X,'wall node number. . . . .',I10
370 . /10X,'wall mass . . . . . . . .',1PG14.4
371 . /10X,'wall x-velocity . . . . .',1PG14.4
372 . /10X,'wall y-velocity . . . . .',1PG14.4
373 . /10X,'wall z-velocity . . . . .',1PG14.4)
374 1160 FORMAT(10X,'lagrange multiplier option')
375 1200 FORMAT(/10X,'secondary nodes : ')
376 1201 FORMAT(/10X,10I10)
377 2001 FORMAT(/5X,'infinite wall characteristics',
378 . /10X,'point m . . . . . . . . .',1P3G20.13
379 . /10X,'normal vector . . . . . .',1P3G20.13)
380 2101 FORMAT(/5X,'coulomb friction characteristics',
381 . /10X,'friction coefficient . . .',1PG14.4
382 . /10X,'filtration flag. . . . . .',I10
383 . /10X,'filtration factor. . . . .',1PG14.4)
384 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_lagmul(rwl, nprw, lprw, ifi, ms, v, itab, itabm1, x, ikine, igrnod, mfi, imerge, unitab, iddlevel, lsubmodel, rtrans, nom_opt, itagnd, nchlagm, k, offs, ikine1lag)
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
subroutine fretitl(titr, iasc, l)
Definition freform.F:620