OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
ruser35.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!|| ruser35 ../engine/source/elements/spring/ruser35.F
25!||--- called by ------------------------------------------------------
26!|| rforc3 ../engine/source/elements/spring/rforc3.F
27!||--- calls -----------------------------------------------------
28!|| get_u_func ../engine/source/user_interface/ufunc.F
29!|| get_u_mid ../engine/source/user_interface/upidmid.F
30!|| get_u_mnu ../engine/source/user_interface/upidmid.F
31!|| get_u_pid ../engine/source/user_interface/upidmid.F
32!|| get_u_pnu ../engine/source/user_interface/upidmid.F
33!||====================================================================
34 SUBROUTINE ruser35(
35 1 NEL ,IOUT ,IPROP ,UVAR ,NUVAR ,
36 2 FX ,FY ,FZ ,XMOM ,YMOM ,
37 3 ZMOM ,E ,OFF ,STIFM ,STIFR ,
38 4 VISCM ,VISCR ,MASS ,XINER ,DT ,
39 5 XL ,VX ,RY1 ,RZ1 ,RX ,
40 6 RY2 ,RZ2 ,FR_WAVE)
41C-------------------------------------------------------------------------
42C This subroutine compute springs forces and moments.
43C-------------------------------------------------------------------------
44C----------+---------+---+---+--------------------------------------------
45C VAR | SIZE |TYP| RW| DEFINITION
46C----------+---------+---+---+--------------------------------------------
47C IOUT | 1 | I | R | OUTPUT FILE UNIT (L00 file)
48C IPROP | 1 | I | R | PROPERTY NUMBER
49C----------+---------+---+---+--------------------------------------------
50C XL | NEL | F | R | ELEMENT LENGTH
51C----------+---------+---+---+--------------------------------------------
52C UVAR |NUVAR*NEL| F |R/W| USER ELEMENT VARIABLES
53C NUVAR | 1 | I | R | NUMBER OF USER ELEMENT VARIABLES
54C----------+---------+---+---+--------------------------------------------
55C The user routine does not need to return elements mass in vector MASS :
56C this vector is not used by RADIOSS since version 4.1E.
57C The mass which is used by RADIOSS for time step (and output) is the
58C initial mass which was returned by user routine RINI29 into starter.
59C utilisation de la version 4.1d ==> on recupere la masse
60C-------------------------------------------------------------------------
61C FUNCTION
62C-------------------------------------------------------------------------
63C INTEGER II = GET_U_PNU(I,IP,KK)
64C IFUNCI = GET_U_PNU(I,IP,KFUNC)
65C IPROPI = GET_U_PNU(I,IP,KFUNC)
66C IMATI = GET_U_PNU(I,IP,KMAT)
67C I : VARIABLE INDEX(1 for first variable,...)
68C IP : PROPERTY NUMBER
69C KK : PARAMETER KFUNC,KMAT,KPROP
70C THIS FUNCTION RETURN THE USER STORED FUNCTION(IF KK=KFUNC),
71C MATERIAL(IF KK=KMAT) OR PROPERTY(IF KK=KPROP) NUMBER.
72C SEE LECG29 FOR CORRESPONDING ID STORAGE.
73C-------------------------------------------------------------------------
74C INTEGER IFUNCI = GET_U_MNU(I,IM,KFUNC)
75C I : VARIABLE INDEX(1 for first function)
76C IM : MATERIAL NUMBER
77C KFUNC : ONLY FUNCTION ARE YET AVAILABLE.
78C THIS FUNCTION RETURN THE USER STORED FUNCTION NUMBER(function
79C referred by users materials).
80C SEE LECM29 FOR CORRESPONDING ID STORAGE.
81C-------------------------------------------------------------------------
82C my_real PARAMI = GET_U_GEO(I,IP)
83C I : PARAMETER INDEX(1 for first parameter,...)
84C IP : PROPERTY NUMBER
85C THIS FUNCTION RETURN THE USER GEOMETRY PARAMETERS
86C NOTE: IF(IP==IPROP) UPARAG(I) == GET_U_GEO(I,IPROP)
87C see lecg30 for storage
88C-------------------------------------------------------------------------
89C my_real PARAMI = GET_U_MAT(I,IM)
90C I : PARAMETER INDEX(1 for first parameter,...)
91C IM : MATERIAL NUMBER
92C THIS FUNCTION RETURN THE USER MATERIAL PARAMETERS
93C NOTE: GET_U_MAT(0,IMAT) RETURN THE DENSITY
94C see lecm29,30,31 for storage
95C-------------------------------------------------------------------------
96C INTEGER PID = GET_U_PID(IP)
97C IP : PROPERTY NUMBER
98C THIS FUNCTION RETURN THE USER PROPERTY ID CORRESPONDING TO
99C USER PROPERTY NUMBER IP.
100C-------------------------------------------------------------------------
101C INTEGER MID = GET_U_MID(IM)
102C IM : MATERIAL NUMBER
103C THIS FUNCTION RETURN THE USER MATERIAL ID CORRESPONDING TO
104C USER MATERIAL NUMBER IM.
105C-------------------------------------------------------------------------
106C my_real Y = GET_U_FUNC(IFUNC,X,DXDY)
107C IFUNC : function number obtained by
108C IFUNC = GET_U_MNU(I,IM,KFUNC) or IFUNC = GET_U_PNU(I,IP,KFUNC)
109C X : X value
110C DXDY : slope dX/dY
111C THIS FUNCTION RETURN Y(X)
112C-------------------------------------------------------------------------
113C-----------------------------------------------
114C I m p l i c i t T y p e s
115C-----------------------------------------------
116#include "implicit_f.inc"
117C----------------------------------------------------------
118C D u m m y A r g u m e n t s a n d F u n c t i o n
119C----------------------------------------------------------
120 INTEGER IOUT,NEL,NUVAR,IPROP,
121 . GET_U_PNU,GET_U_PID,GET_U_MID,GET_U_MNU,
122 . KFUNC,KMAT,KPROP
123 my_real
124 . UVAR(NUVAR,*),DT ,
125 . FX(*), FY(*), FZ(*), E(*), VX(*),MASS(*) ,XINER(*),
126 . ry1(*), rz1(*), off(*), xmom(*), ymom(*),
127 . zmom(*), rx(*), ry2(*), rz2(*),xl(*),
128 . stifm(*) ,stifr(*) , viscm(*) ,viscr(*) ,fr_wave(*) ,
129 . get_u_mat, get_u_geo, get_u_func
130 EXTERNAL get_u_mnu,get_u_pnu,get_u_mid,get_u_pid,
131 . get_u_mat,get_u_geo, get_u_func
132 parameter(kfunc=29)
133 parameter(kmat=31)
134 parameter(kprop=33)
135C-----------------------------------------------
136C L o c a l V a r i a b l e s
137C-----------------------------------------------
138 INTEGER I,IFUNC1,IFUNC2,IFUNC3,IFUNC4,ILOAD
139 my_real
140 . elastif,x,dxdy,xlim1,xlim2,fmx,fmn,dx,amas,d1,d2,fscal
141C-----------------------------------------------
142C
143 amas = get_u_geo(1,iprop)
144 elastif= get_u_geo(2,iprop)
145 xlim1 = get_u_geo(3,iprop)
146 xlim2 = get_u_geo(4,iprop)
147 d1 = get_u_geo(5,iprop)
148 d2 = get_u_geo(6,iprop)
149 fscal = get_u_geo(8,iprop)
150 iload = nint(get_u_geo(7,iprop))
151 ifunc1= get_u_pnu(1,iprop,kfunc)
152 ifunc2= get_u_pnu(2,iprop,kfunc)
153 ifunc3= get_u_pnu(3,iprop,kfunc)
154 ifunc4= get_u_pnu(4,iprop,kfunc)
155C
156 DO i=1,nel
157 mass(i) = amas
158 dx = dt * vx(i) / xl(i)
159 x = uvar(1,i) + dx
160c
161 IF (uvar(3,i) == zero) THEN
162 fmx = fscal*get_u_func(ifunc1,x,dxdy)
163 fmn = fscal*get_u_func(ifunc2,x,dxdy)
164 ELSE
165 fmx = uvar(2,i)*fscal*get_u_func(ifunc3,x,dxdy)
166 fmn = uvar(2,i)*fscal*get_u_func(ifunc4,x,dxdy)
167 ENDIF
168c
169 IF (uvar(3,i) >= one) THEN
170 fr_wave(i)=one
171c UVAR(2,I) = endommagement sur fonction yield et stiffness
172c par facteur 0 <= D1 < 1.
173 IF (iload == 0 .OR. dx > zero) uvar(2,i)=uvar(2,i)*(one-d1)
174 ELSEIF (fr_wave(i) == one) THEN
175 IF (iload == 0 .OR. dx > zero) uvar(3,i)=uvar(3,i)+d2
176c FR_WAVE est laisse a 1.
177 ENDIF
178C
179 IF (x >= xlim1) THEN
180 fr_wave(i)=one
181 IF (uvar(3,i) >= one .AND. off(i) == one) THEN
182C change I to global indice
183 WRITE(iout,*)'SPRING',i, 'REACHES LIMIT IN X : ',x
184 off(i)=zero
185 ENDIF
186 ELSE
187 fr_wave(i)=zero
188 ENDIF
189c
190 uvar(1,i) = x
191 fx(i) = fx(i) + elastif * dx * uvar(2,i)
192 fx(i) = min(fx(i),fmx)
193 fx(i) = max(fx(i),fmn)
194 fx(i) = fx(i) * off(i)
195C----------------
196C TIME STEP
197C----------------
198 stifm(i) = elastif / xl(i)
199 stifr(i) = zero
200 viscm(i) = zero
201 viscr(i) = zero
202 xiner(i) = zero
203 ENDDO
204C-------------------------------
205 RETURN
206 END
#define min(a, b)
Definition macros.h:20
#define max(a, b)
Definition macros.h:21
subroutine ruser35(nel, iout, iprop, uvar, nuvar, fx, fy, fz, xmom, ymom, zmom, e, off, stifm, stifr, viscm, viscr, mass, xiner, dt, xl, vx, ry1, rz1, rx, ry2, rz2, fr_wave)
Definition ruser35.F:41