OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
compute_connect_partelm.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!|| compute_connect_partelm ../starter/source/model/sets/compute_connect_partelm.F
25!||--- called by ------------------------------------------------------
26!|| lectur ../starter/source/starter/lectur.F
27!||--- calls -----------------------------------------------------
28!|| inverted_group_alloc ../starter/source/model/sets/inverted_group_alloc.F
29!|| inverted_group_init ../starter/source/model/sets/inverted_group_init.F
30!||--- uses -----------------------------------------------------
31!|| inverted_group_mod ../starter/share/modules1/inverted_group_mod.F
32!||====================================================================
33 SUBROUTINE compute_connect_partelm( IPARTS,IPARTQ,IPARTC,IPARTT,IPARTP,
34 . IPARTTG,IPARTR ,IPARTSP, INV_GROUP,NUMSPH,
35 . NISP ,KXSP )
36!$COMMENT
37! COMPUTE_CONNECT_PARTELM description
38! computation of the inverted connectivity between part and element
39!
40! COMPUTE_CONNECT_PARTELM organization :
41! for each kind of element :
42! - compute an index array based on the number of
43! element in each part
44! - fill the INV_GROUP%PARTxxx array with the part ID
45!
46!$ENDCOMMENT
47C-----------------------------------------------
48C M o d u l e s
49C-----------------------------------------------
51C-----------------------------------------------
52C I m p l i c i t T y p e s
53C-----------------------------------------------
54#include "implicit_f.inc"
55#include "com04_c.inc"
56C-----------------------------------------------
57C D u m m y A r g u m e n t s
58C-----------------------------------------------
59C
60 INTEGER, INTENT(IN) :: NUMSPH,NISP
61 INTEGER, INTENT(IN) :: KXSP(NISP,NUMSPH)
62 INTEGER, INTENT(IN),DIMENSION(NUMELS) :: IPARTS
63 INTEGER, INTENT(IN),DIMENSION(NUMELQ) :: IPARTQ
64 INTEGER, INTENT(IN),DIMENSION(NUMELC) :: IPARTC
65 INTEGER, INTENT(IN),DIMENSION(NUMELTG):: IPARTTG
66 INTEGER, INTENT(IN),DIMENSION(NUMELR) :: IPARTR
67 INTEGER, INTENT(IN),DIMENSION(NUMELT) :: IPARTT
68 INTEGER, INTENT(IN),DIMENSION(NUMELP) :: IPARTP
69 INTEGER, INTENT(IN),DIMENSION(NUMSPH) :: IPARTSP
70
71 TYPE(invertgroup_struct_) :: INV_GROUP
72
73C-----------------------------------------------
74C L o c a l V a r i a b l e s
75C-----------------------------------------------
76 INTEGER I,J,EL,NCOUNT,PART,IND,FIRST,LAST
77 INTEGER, DIMENSION (:), ALLOCATABLE :: PART_COUNT
78C-----------------------------------------------
79 ! allocation of INV_GROUP% array
80 IF( .NOT.(inv_group%ALREADY_ALLOC) ) CALL inverted_group_alloc(inv_group)
81 ! check INV_GROUP% array was already computed, if already computed, flush to 0
82 IF( inv_group%ALREADY_DONE ) CALL inverted_group_init(1,inv_group,numsph)
83
84 ALLOCATE(part_count(npart))
85
86
87C ------------------------------------------------
88C Solid elements
89C ------------------------------------------------
90 part_count(1:npart)=0
91
92 DO i=1,numels
93 part=iparts(i)
94 part_count(part)=part_count(part)+1
95 ENDDO
96
97 inv_group%INDPARTS(1)=1
98 DO i=2,npart+1
99 inv_group%INDPARTS(i)=inv_group%INDPARTS(i-1)+part_count(i-1)
100 ENDDO
101
102 part_count(1:npart)=0
103 DO i=1,numels
104 part=iparts(i)
105
106 ind=inv_group%INDPARTS(part) + part_count(part)
107 inv_group%PARTS(ind)=i
108 part_count(part)=part_count(part)+1
109 ENDDO
110C ------------------------------------------------
111C Sph particles (cells)
112C ------------------------------------------------
113 part_count(1:npart)=0
114
115 DO i=1,numsph
116 part=ipartsp(i)
117 part_count(part)=part_count(part)+1
118 ENDDO
119
120 inv_group%INDPARTSPH(1)=1
121 DO i=2,npart+1
122 inv_group%INDPARTSPH(i)=inv_group%INDPARTSPH(i-1)+part_count(i-1)
123 ENDDO
124
125 part_count(1:npart)=0
126 DO i=1,numsph
127 part=ipartsp(i)
128 ind=inv_group%INDPARTSPH(part) + part_count(part)
129 inv_group%PARTSPH(ind)=kxsp(3,i)
130 part_count(part)=part_count(part)+1
131 ENDDO
132C ------------------------------------------------
133C Quad elements
134C ------------------------------------------------
135 part_count(1:npart)=0
136
137 DO i=1,numelq
138 part=ipartq(i)
139 part_count(part)=part_count(part)+1
140 ENDDO
141
142 inv_group%INDPARTQ(1)=1
143 DO i=2,npart+1
144 inv_group%INDPARTQ(i)=inv_group%INDPARTQ(i-1)+part_count(i-1)
145 ENDDO
146
147 part_count(1:npart)=0
148 DO i=1,numelq
149 part=ipartq(i)
150
151 ind=inv_group%INDPARTQ(part) + part_count(part)
152 inv_group%PARTQ(ind)=i
153 part_count(part)=part_count(part)+1
154 ENDDO
155C ------------------------------------------------
156C Shell elements
157C ------------------------------------------------
158 part_count(1:npart)=0
159
160 DO i=1,numelc
161 part=ipartc(i)
162 part_count(part)=part_count(part)+1
163 ENDDO
164
165 inv_group%INDPARTC(1)=1
166 DO i=2,npart+1
167 inv_group%INDPARTC(i)=inv_group%INDPARTC(i-1)+part_count(i-1)
168 ENDDO
169
170 part_count(1:npart)=0
171 DO i=1,numelc
172 part=ipartc(i)
173
174 ind=inv_group%INDPARTC(part) + part_count(part)
175 inv_group%PARTC(ind)=i
176 part_count(part)=part_count(part)+1
177 ENDDO
178C ------------------------------------------------
179C TRUSS elements
180C ------------------------------------------------
181 part_count(1:npart)=0
182
183 DO i=1,numelt
184 part=ipartt(i)
185 part_count(part)=part_count(part)+1
186 ENDDO
187
188 inv_group%INDPARTT(1)=1
189 DO i=2,npart+1
190 inv_group%INDPARTT(i)=inv_group%INDPARTT(i-1)+part_count(i-1)
191 ENDDO
192
193 part_count(1:npart)=0
194 DO i=1,numelt
195 part=ipartt(i)
196
197 ind=inv_group%INDPARTT(part) + part_count(part)
198 inv_group%PARTT(ind)=i
199 part_count(part)=part_count(part)+1
200 ENDDO
201C ------------------------------------------------
202C Beam elements
203C ------------------------------------------------
204 part_count(1:npart)=0
205
206 DO i=1,numelp
207 part=ipartp(i)
208 part_count(part)=part_count(part)+1
209 ENDDO
210
211 inv_group%INDPARTP(1)=1
212 DO i=2,npart+1
213 inv_group%INDPARTP(i)=inv_group%INDPARTP(i-1)+part_count(i-1)
214 ENDDO
215
216 part_count(1:npart)=0
217 DO i=1,numelp
218 part=ipartp(i)
219 ind=inv_group%INDPARTP(part) + part_count(part)
220 inv_group%PARTP(ind)=i
221 part_count(part)=part_count(part)+1
222 ENDDO
223C ------------------------------------------------
224C Triangle elements
225C ------------------------------------------------
226 part_count(1:npart)=0
227
228 DO i=1,numeltg
229 part=iparttg(i)
230 part_count(part)=part_count(part)+1
231 ENDDO
232
233 inv_group%INDPARTTG(1)=1
234 DO i=2,npart+1
235 inv_group%INDPARTTG(i)=inv_group%INDPARTTG(i-1)+part_count(i-1)
236 ENDDO
237
238 part_count(1:npart)=0
239 DO i=1,numeltg
240 part=iparttg(i)
241
242 ind=inv_group%INDPARTTG(part) + part_count(part)
243 inv_group%PARTTG(ind)=i
244 part_count(part)=part_count(part)+1
245 ENDDO
246C ------------------------------------------------
247C TRIA ELTs
248C ------------------------------------------------
249 part_count(1:npart)=0
250
251 DO i=1,numeltria
252 part=iparttg(i)
253 part_count(part)=part_count(part)+1
254 ENDDO
255
256 inv_group%INDPARTTRIA(1)=1
257 DO i=2,npart+1
258 inv_group%INDPARTTRIA(i)=inv_group%INDPARTTRIA(i-1)+part_count(i-1)
259 ENDDO
260
261 part_count(1:npart)=0
262 DO i=1,numeltria
263 part=iparttg(i)
264
265 ind=inv_group%INDPARTTRIA(part) + part_count(part)
266 inv_group%PARTTRIA(ind)=i
267 part_count(part)=part_count(part)+1
268 ENDDO
269
270C ------------------------------------------------
271C Spring elements
272C ------------------------------------------------
273 part_count(1:npart)=0
274
275 DO i=1,numelr
276 part=ipartr(i)
277 part_count(part)=part_count(part)+1
278 ENDDO
279
280 inv_group%INDPARTR(1)=1
281 DO i=2,npart+1
282 inv_group%INDPARTR(i)=inv_group%INDPARTR(i-1)+part_count(i-1)
283 ENDDO
284 part_count(1:npart)=0
285 DO i=1,numelr
286 part=ipartr(i)
287
288 ind=inv_group%INDPARTR(part) + part_count(part)
289 inv_group%PARTR(ind)=i
290 part_count(part)=part_count(part)+1
291 ENDDO
292
293 DEALLOCATE(part_count)
294
295 inv_group%ALREADY_DONE = .true.
296 RETURN
297 END SUBROUTINE compute_connect_partelm
298C-----------------------------------------------
subroutine compute_connect_partelm(iparts, ipartq, ipartc, ipartt, ipartp, iparttg, ipartr, ipartsp, inv_group, numsph, nisp, kxsp)
subroutine inverted_group_alloc(inv_group)
subroutine inverted_group_init(mode, inv_group, numsph)