OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
imp_dt.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!|| imp_dt2 ../engine/source/implicit/imp_dt.F
25!||--- called by ------------------------------------------------------
26!|| resol ../engine/source/engine/resol.F
27!||====================================================================
28 SUBROUTINE imp_dt2(DT_E)
29C-----------------------------------------------
30C I m p l i c i t T y p e s
31C-----------------------------------------------
32#include "implicit_f.inc"
33C-----------------------------------------------
34C C o m m o n B l o c k s
35C-----------------------------------------------
36#include "com01_c.inc"
37#include "com08_c.inc"
38#include "impl1_c.inc"
39#include "impl2_c.inc"
40C-----------------------------------------------
41C D u m m y A r g u m e n t s
42C-----------------------------------------------
43C REAL
45 . dt_e
46C-----------------------------------------------
47C L o c a l V a r i a b l e s
48C-----------------------------------------------
50 . trest
51C--------------------------------------------
52C DT_MIN=MAX(DT_E,DT_MIN)
53 trest=tstop-tt
54 IF (imconv==1.AND.trest>em10) THEN
55 dt_e = min(dt_imp,trest)
56 IF (idyna>0) dt_e = dt_imp
57 dt1_imp= dt_e
58 IF (ncycle==0.AND.inconv==1) dt0_imp= dt_e
59 ELSE
60 dt_e = dt1
61 dt0_imp= dt_e
62 ENDIF
63 IF (ncycle==0) THEN
64 dt1= dt_e
65 dt1_imp= dt_e
66 ENDIF
67C
68 RETURN
69 END
70!||====================================================================
71!|| imp_dtn ../engine/source/implicit/imp_dt.F
72!||--- called by ------------------------------------------------------
73!|| imp_solv ../engine/source/implicit/imp_solv.F
74!||--- calls -----------------------------------------------------
75!|| imp_dtf ../engine/source/implicit/imp_dt.F
76!||====================================================================
77 SUBROUTINE imp_dtn(IT,UL2,FAC,CUMUL_ALEN)
78C-----------------------------------------------
79C I m p l i c i t T y p e s
80C-----------------------------------------------
81#include "implicit_f.inc"
82C-----------------------------------------------
83C C o m m o n B l o c k s
84C-----------------------------------------------
85#include "com01_c.inc"
86#include "units_c.inc"
87#include "impl1_c.inc"
88#include "impl2_c.inc"
89#include "task_c.inc"
90#include "com08_c.inc"
91C-----------------------------------------------
92C D u m m y A r g u m e n t s
93C-----------------------------------------------
94C REAL
95 INTEGER IT
97 . fac,ul2,cumul_alen
98C-----------------------------------------------
99C L o c a l V a r i a b l e s
100C-----------------------------------------------
101 INTEGER IFIX0
102 my_real
103 . tmp,facl,lu,fact,trest
104C-----------------------------------
105 fac=one
106 IF (it==0.AND.imconv>0) RETURN
107 IF (imconv<0) THEN
108 IF (dt_imp>dt_min) THEN
109 fac=scal_dtn
110 tmp=dt_imp
111 dt_imp=dt_imp*fac
112 dt_imp=max(dt_imp,dt_min)
113 fac=dt_imp/tmp
114 IF (idtc==2.AND.alen0/=zero)alen=alen*scal_dtn
115 IF (idtc==3) THEN
116 alen=alen*scal_dtn
117 fact = one
118 END IF
119 ENDIF
120 ELSEIF (imconv==1) THEN
121 IF (idtfix>0) THEN
122 dt_imp = dtimpf(101)
123 ELSEIF (idtc==1) THEN
124 IF (it<=nl_dtp.AND.dt_imp<dt_max) THEN
125C--------increase----------------------
126 fac=scal_dtp
127 tmp=dt_imp
128 dt_imp=dt_imp*fac
129 dt_imp=min(dt_imp,dt_max)
130 fac=dt_imp/tmp
131 ENDIF
132 ELSEIF (idtc==2) THEN
133 lu=sqrt(ul2)
134 IF (ncycle==1) THEN
135 alen=lu
136 IF (alen0>zero) alen=alen0
137 ELSE
138 IF (alen<=em20) alen=lu
139 IF (alen0>zero) alen=alen0
140 tmp=one*nl_dtp/it
141 IF (it>nl_dtp.AND.scal_dtn/=one) THEN
142 IF (alen0==zero) THEN
143 tmp=(nl_dtn-nl_dtp)/(one-scal_dtn)
144 facl=(tmp-it+nl_dtp)/tmp
145 alen=alen*facl
146 alen=max(alen,em01*lu)
147 alen=min(alen,lu)
148 ENDIF
149 fac=alen/max(em20,lu)
150 fac=min(one,fac)
151 ELSEIF (it<nl_dtp.AND.nl_dtp/=1) THEN
152 IF (alen0==zero) THEN
153 facl=one+(nl_dtp-it)/(nl_dtp-one)
154 alen=alen*facl
155 alen=min(alen,lu*two)
156 ENDIF
157 fac=alen/max(em20,lu)
158 fac=max(one,fac)
159 ELSEIF (it==nl_dtp.AND.alen0==zero) THEN
160 alen=lu
161 ENDIF
162 ENDIF
163 tmp=dt_imp
164 IF (fac>one) THEN
165 fac=min(scal_dtp,fac)
166 dt_imp=dt_imp*fac
167 dt_imp=min(dt_imp,dt_max)
168 fac=dt_imp/tmp
169 ELSEIF (fac<one) THEN
170 fac=max(scal_dtn,fac)
171 dt_imp=dt_imp*fac
172 dt_imp=max(dt_imp,dt_min)
173 fac=dt_imp/tmp
174 ENDIF
175 ELSEIF (idtc==3) THEN
176 ilast=0
177 IF (ncycle==1) THEN
178 IF (alen0>zero) THEN
179 alen=alen0
180 fac = alen0/sqrt(ul2)
181 dt_imp=dt_imp*fac
182 ELSE
183 alen=sqrt(ul2)
184 ENDIF
185 fact = one
186 ELSE !(NCYCLE>1)
187C----------time correction ------
188 tt = tt + dla_riks
189 fact = one+dla_riks/dt2
190C------last step-------
191 IF (tt>tstop) THEN
192 ilast=1
193 tmp=dt_imp
194 dt_imp = max(dt_min,tmp*em3)
195 fac=dt_imp/tmp
196 tt =tstop-dt_imp
197 ELSE
198 trest=tstop-tt
199 IF (alen0>zero) THEN
200 alen=alen0
201 fac = one
202 ELSE
203 facl=sqrt(one*nl_dtp/it)
204 tmp=dt_imp
205 IF (facl>one) THEN
206 facl=min(scal_dtp,facl)
207 dt_imp=dt_imp*facl
208 dt_imp=min(dt_imp,dt_max)
209 facl=min(dt_imp/tmp,facl)
210 dt_imp=min(dt_imp,trest)
211 fac=dt_imp/tmp
212 ELSEIF (facl<one) THEN
213 facl=max(scal_dtn,facl)
214 dt_imp=dt_imp*facl
215 dt_imp=max(dt_imp,dt_min)
216 dt_imp=min(dt_imp,trest)
217 fac=dt_imp/tmp
218 ENDIF
219 alen=facl*alen
220 END IF !IF (ALEN0>ZERO)
221 ENDIF !IF (TT>TSTOP) THEN
222 ENDIF !(NCYCLE>1)
223 dla_riks = fact*dt2
224 ENDIF
225 ENDIF
226C----------reput old dt du to fix_p ------
227 ifix0 = idtfix
228 IF (ifix0>0) THEN
229 idtfix = 0
230 ELSE
231 CALL imp_dtf(fac)
232 ENDIF
233 IF (ispmd==0) THEN
234 IF (nprint/=0) THEN
235 WRITE(iout,*)
236 IF(nprint<0)WRITE(istdo,*)
237 IF (idtc==3) THEN
238 IF (fact/=one) THEN
239 WRITE(iout,1005) dla_riks
240 IF (nprint<0)WRITE(istdo,1005) dla_riks
241 END IF
242 ENDIF
243 IF (ifix0>0.AND.imconv==1) THEN
244 WRITE(iout,1004)
245 IF(nprint<0)WRITE(istdo,1004)
246 ELSE
247 IF (idtfix>0) THEN
248 WRITE(iout,1003)
249 IF(nprint<0)WRITE(istdo,1003)
250 ENDIF
251 IF (fac>one) THEN
252 WRITE(iout,1001) fac
253 IF(nprint<0)WRITE(istdo,1001) fac
254 ELSEIF (fac<one) THEN
255 WRITE(iout,1002) fac
256 IF(nprint<0)WRITE(istdo,1002) fac
257 ENDIF
258 ENDIF
259 ENDIF
260 ENDIF
261 IF (idtc==3.AND.ilast>0) dla_riks=fac
262 IF (imconv<0) fac=one
263 cumul_alen = cumul_alen + alen
264C---------------------------
265 1001 FORMAT(5x,'--NEXT TIMESTEP IS INCREASED BY--',e11.4/)
266 1002 FORMAT(5x,'--NEXT TIMESTEP IS DECREASED BY--',e11.4/)
267 1003 FORMAT(5x,'--NEXT TIMESTEP IS DETERMINED BY INPUT FIX POINT--')
268 1004 FORMAT(5x,'--RESET TIMESTEP DUE TO INPUT FIX POINT--')
269 1005 FORMAT(5x,'--TIMESTEP IS ADJUSTED BY RIKS METHOD TO:',e11.4/)
270 1006 FORMAT(5x,'--terminal loading time by riks method is:',E11.4/)
271 RETURN
272 END
273!||====================================================================
274!|| imp_dtf ../engine/source/implicit/imp_dt.F
275!||--- called by ------------------------------------------------------
276!|| imp_dtn ../engine/source/implicit/imp_dt.F
277!||====================================================================
278 SUBROUTINE IMP_DTF(FAC)
279C-----------------------------------------------
280C I m p l i c i t T y p e s
281C-----------------------------------------------
282#include "implicit_f.inc"
283C-----------------------------------------------
284C C o m m o n B l o c k s
285C-----------------------------------------------
286#include "com08_c.inc"
287#include "impl1_c.inc"
288#include "impl2_c.inc"
289C-----------------------------------------------
290C D u m m y A r g u m e n t s
291C-----------------------------------------------
292 INTEGER IFIX
293C REAL
294 my_real
295 . FAC
296C-----------------------------------------------
297C L o c a l V a r i a b l e s
298C-----------------------------------------------
299 INTEGER I,K
300 my_real
301 . TMP,TOLD,TREST
302C-----------------------------------------------
303 IDTFIX = 0
304 K = 0
305 DO I=1,NDTFIX
306 IF (TT<DTIMPF(I)) THEN
307 K = I
308 GOTO 100
309 ENDIF
310 ENDDO
311 100 IF (K==0) RETURN
312 TREST= TT+DT_IMP- DTIMPF(K)
313 TMP = DT_IMP*EM02
314 IF (ABS(TREST)<=TMP) THEN
315 FAC = FAC*(DTIMPF(K)-TT)/DT_IMP
316 DT_IMP = DTIMPF(K)-TT
317 ELSEIF (TREST>0) THEN
318 DTIMPF(101)=DT_IMP
319 FAC = FAC*(DTIMPF(K)-TT)/DT_IMP
320 DT_IMP = DTIMPF(K)-TT
321 IDTFIX = 1
322 ENDIF
323C
324 RETURN
325 END
#define my_real
Definition cppsort.cpp:32
subroutine imp_dt2(dt_e)
Definition imp_dt.F:29
subroutine imp_dtn(it, ul2, fac, cumul_alen)
Definition imp_dt.F:78
subroutine imp_dtf(fac)
Definition imp_dt.F:279
#define min(a, b)
Definition macros.h:20
#define max(a, b)
Definition macros.h:21