OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
lag_direct.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!|| lag_direct ../engine/source/tools/lagmul/lag_direct.F
25!||--- called by ------------------------------------------------------
26!|| i2lagm ../engine/source/tools/lagmul/lag_i2main.F
27!|| lag_gjnt ../engine/source/tools/lagmul/lag_gjnt.F
28!||--- calls -----------------------------------------------------
29!|| ancmsg ../engine/source/output/message/message.F
30!|| arret ../engine/source/system/arret.F
31!||--- uses -----------------------------------------------------
32!|| message_mod ../engine/share/message_module/message_mod.F
33!||====================================================================
34 SUBROUTINE lag_direct(
35 1 IADLL ,LLL ,JLL ,XLL ,LTSM ,
36 2 V ,VR ,A ,AR ,MS ,
37 3 IN ,NC_INI ,NCL )
38C-----------------------------------------------
39C M o d u l e s
40C-----------------------------------------------
41 USE message_mod
42C-----------------------------------------------
43C I m p l i c i t T y p e s
44C-----------------------------------------------
45#include "implicit_f.inc"
46C-----------------------------------------------
47C C o m m o n B l o c k s
48C-----------------------------------------------
49#include "lagmult.inc"
50#include "com08_c.inc"
51C-----------------------------------------------
52C D u m m y A r g u m e n t s
53C-----------------------------------------------
54 INTEGER NC_INI, NCL, IADLL(*), LLL(*), JLL(*)
55C REAL
56 my_real
57 . ltsm(6,*),xll(*),ms(*),in(*),v(3,*),vr(3,*),a(3,*),ar(3,*)
58C-----------------------------------------------
59C L o c a l V a r i a b l e s
60C-----------------------------------------------
61 INTEGER I,J,K,L,IC,JC,IK
62 my_real
63 . HLOC(MXDLEN,MXDLEN),RLOC(MXDLEN),S,HIJ
64C======================================================================|
65 IF (ncl>mxdlen) THEN
66 CALL ancmsg(msgid=111,anmode=aninfo,
67 . i1=ncl)
68 CALL arret(2)
69 ENDIF
70C--- Local H matrix
71 DO k=1,ncl
72 rloc(k) = zero
73 ic = nc_ini + k
74 DO ik=iadll(ic),iadll(ic+1)-1
75 i = lll(ik)
76 j = jll(ik)
77 IF (j>3) THEN
78 ltsm(j,i) = xll(ik)/in(i)
79 ELSE
80 ltsm(j,i) = xll(ik)/ms(i)
81 ENDIF
82 ENDDO
83 DO l = 1,k
84 jc = nc_ini + l
85 hij = zero
86 DO ik=iadll(jc),iadll(jc+1)-1
87 hij = hij + xll(ik)*ltsm(jll(ik),lll(ik))
88 ENDDO
89 hloc(l,k) = hij
90 ENDDO
91 DO ik=iadll(ic),iadll(ic+1)-1
92 ltsm(jll(ik),lll(ik)) = zero
93 ENDDO
94 ENDDO
95 DO k = 2,ncl
96 DO l = 1,k
97 hloc(k,l) = hloc(l,k)
98 ENDDO
99 ENDDO
100C--- second membre
101 DO k = 1,ncl
102 ic = nc_ini + k
103 DO ik=iadll(ic),iadll(ic+1)-1
104 i = lll(ik)
105 j = jll(ik)
106 IF (j>3) THEN
107 j = j-3
108 rloc(k) = rloc(k) + xll(ik)*(vr(j,i)/dt12+ar(j,i))
109 ELSE
110 rloc(k) = rloc(k) + xll(ik)*(v(j,i)/dt12+a(j,i))
111 ENDIF
112 ENDDO
113 ENDDO
114C--- Factorise H (Full Cholesky)
115 DO j=1,ncl
116 IF (hloc(j,j)<=zero) THEN
117 CALL ancmsg(msgid=112,anmode=aninfo,
118 . i1=j)
119 CALL arret(2)
120 ENDIF
121 hloc(j,j) = sqrt(hloc(j,j))
122 DO k=1,j-1
123 DO i=j+1,ncl
124 hloc(i,j) = hloc(i,j) - hloc(i,k)*hloc(j,k)
125 ENDDO
126 ENDDO
127 DO i=j+1,ncl
128 hloc(i,j) = hloc(i,j)/hloc(j,j)
129 hloc(i,i) = hloc(i,i) - hloc(i,j)*hloc(i,j)
130 ENDDO
131 ENDDO
132C--- back subst Ly = r,
133 DO i=1,ncl
134 s = rloc(i)
135 DO j=1,i-1
136 s = s - hloc(i,j)*rloc(j)
137 ENDDO
138 rloc(i) = s / hloc(i,i)
139 ENDDO
140C--- back subst Lz = y
141 DO i=ncl,1,-1
142 s = rloc(i)
143 DO j=i+1,ncl
144 s = s - hloc(j,i)*rloc(j)
145 ENDDO
146 rloc(i) = s / hloc(i,i)
147 ENDDO
148C--- update accelerations
149 DO k=1,ncl
150 ic = nc_ini + k
151 DO ik=iadll(ic),iadll(ic+1)-1
152 i = lll(ik)
153 j = jll(ik)
154 IF(j>3) THEN
155 j = j-3
156 ar(j,i) = ar(j,i) - xll(ik)*rloc(k)/in(i)
157 ELSE
158 a(j,i) = a(j,i) - xll(ik)*rloc(k)/ms(i)
159 ENDIF
160 ENDDO
161 ENDDO
162C---
163 RETURN
164 END
subroutine lag_direct(iadll, lll, jll, xll, ltsm, v, vr, a, ar, ms, in, nc_ini, ncl)
Definition lag_direct.F:38
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 arret(nn)
Definition arret.F:87