OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
split_pcyl.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!|| split_pcyl ../starter/source/loads/general/load_pcyl/split_pcyl.F
25!||--- called by ------------------------------------------------------
26!|| lectur ../starter/source/starter/lectur.F
27!||--- uses -----------------------------------------------------
28!||====================================================================
29 SUBROUTINE split_pcyl(TOTAL_NUMBER_PCYL,LOADS,LOADS_PER_PROC)
30!$comment
31! SPLIT_PCYL description
32! SPLIT_PCYL split the node/data of the /load option on the different processors
33!
34! SPLIT_PCYL organization :
35! loop over the nspmd processor :
36! * compute an index global load id --> local load id(local to the processor p)
37! * if the processor p has /load's nodes :
38! - save the data in a local structure LOADS_PER_PROC
39! - convert global node id into local node id
40!$ENDCOMMENT
41C-----------------------------------------------
42C M o d u l e s
43C-----------------------------------------------
44 USE loads_mod
45C-----------------------------------------------
46C I m p l i c i t T y p e s
47C-----------------------------------------------
48#include "implicit_f.inc"
49C-----------------------------------------------
50C C o m m o n B l o c k s
51C-----------------------------------------------
52! nspmd definition
53#include "com01_c.inc"
54C-----------------------------------------------
55C D u m m y A r g u m e n t s
56C-----------------------------------------------
57 INTEGER, INTENT(IN) :: TOTAL_NUMBER_PCYL ! total number of /load/pcyl
58 TYPE(loads_),INTENT(INOUT) :: LOADS ! initial structure of load cyl
59 TYPE(loads_),DIMENSION(NSPMD), INTENT(INOUT) :: LOADS_PER_PROC ! structure of load cyl for each processor
60C-----------------------------------------------
61C L o c a l V a r i a b l e s
62C-----------------------------------------------
63 INTEGER :: I,J,K
64 INTEGER :: IJK,OFFSET
65 INTEGER :: NODE_ID ! node id
66 INTEGER :: PCYL_ID ! id of the /load/cyl
67 INTEGER :: LOCAL_NUMBER_CYL ! local number of /load/cyl on the current proc
68 INTEGER :: LOCAL_SEGMENT_NUMBER ! local number of segment
69 INTEGER :: SEGMENT_ID ! segment id
70 INTEGER, DIMENSION(TOTAL_NUMBER_PCYL) :: OFFSET_CYL ! offset for the global segment id
71C-----------------------------------------------
72C E x t e r n a l F u n c t i o n s
73C-----------------------------------------------
74 loads%S_GLOBAL_SEGMENT_ID = 0
75 DO i=1,total_number_pcyl
76 loads%S_GLOBAL_SEGMENT_ID = loads%S_GLOBAL_SEGMENT_ID + loads%LOAD_CYL(i)%NSEG
77 ENDDO
78 ALLOCATE( loads%GLOBAL_SEGMENT_ID(loads%S_GLOBAL_SEGMENT_ID,3) )
79 offset = 0
80 DO i=1,total_number_pcyl
81 DO j=1,loads%LOAD_CYL(i)%NSEG
82 loads%GLOBAL_SEGMENT_ID(j+offset,1) = loads%CYL_RESTART(i)%SEGMENT_TO_PROC(j)
83 loads%GLOBAL_SEGMENT_ID(j+offset,3) = i
84 ENDDO
85 offset_cyl(i) = offset
86 offset = offset + loads%LOAD_CYL(i)%NSEG
87 ENDDO
88 ! -------------------
89 DO j=1,nspmd
90 local_number_cyl = 0
91 ! ------------
92 ! loop over the /LOAD/PCYL to count the number of load/pcyl on the processor J
93 ALLOCATE( loads_per_proc(j)%INDEX_LOAD( loads%NLOAD_CYL,2 ) )
94 DO i=1,loads%NLOAD_CYL
95 local_segment_number = loads%CYL_RESTART(i)%PROC(j)%LOCAL_SEGMENT_NUMBER
96 IF(local_segment_number>0) THEN
97 local_number_cyl = local_number_cyl + 1
98 loads_per_proc(j)%INDEX_LOAD(local_number_cyl,1) = i
99 loads_per_proc(j)%INDEX_LOAD(i,2) = local_number_cyl
100 ELSE
101 loads_per_proc(j)%INDEX_LOAD(i,2) = 0
102 ENDIF
103 ENDDO
104 ! ------------
105
106 loads_per_proc(j)%NLOAD_CYL = local_number_cyl ! save the number of /oad/pcyl on the current proc
107 ALLOCATE( loads_per_proc(j)%LOAD_CYL( local_number_cyl ) )
108 ! ------------
109 IF(local_number_cyl>0) THEN
110 DO i=1,local_number_cyl
111 pcyl_id = loads_per_proc(j)%INDEX_LOAD(i,1) ! get the id of the /load/cyl
112 offset = offset_cyl(pcyl_id)
113 loads_per_proc(j)%LOAD_CYL(i)%ID = loads%LOAD_CYL(pcyl_id)%ID ! option ID
114 loads_per_proc(j)%LOAD_CYL(i)%IFRAME = loads%LOAD_CYL(pcyl_id)%IFRAME ! moving frame
115 loads_per_proc(j)%LOAD_CYL(i)%ISENS = loads%LOAD_CYL(pcyl_id)%ISENS ! sensor number
116 loads_per_proc(j)%LOAD_CYL(i)%ITABLE = loads%LOAD_CYL(pcyl_id)%ITABLE ! table number
117
118 loads_per_proc(j)%LOAD_CYL(i)%XSCALE_R = loads%LOAD_CYL(pcyl_id)%XSCALE_R
119 loads_per_proc(j)%LOAD_CYL(i)%XSCALE_T = loads%LOAD_CYL(pcyl_id)%XSCALE_T
120 loads_per_proc(j)%LOAD_CYL(i)%YSCALE = loads%LOAD_CYL(pcyl_id)%YSCALE
121
122 loads_per_proc(j)%LOAD_CYL(i)%NSEG = loads%CYL_RESTART(pcyl_id)%PROC(j)%LOCAL_SEGMENT_NUMBER ! number of segment of processor j
123 local_segment_number = loads%CYL_RESTART(pcyl_id)%PROC(j)%LOCAL_SEGMENT_NUMBER
124 ALLOCATE( loads_per_proc(j)%LOAD_CYL(i)%SEGNOD(local_segment_number,4) )
125 ! ------------
126 DO k=1,local_segment_number
127 segment_id = loads%CYL_RESTART(pcyl_id)%PROC(j)%LOCAL_SEGMENT(k) ! get the segment id on the processor j
128 loads%GLOBAL_SEGMENT_ID(segment_id+offset,2) = k
129 DO ijk=1,4
130 node_id = loads%LOAD_CYL(pcyl_id)%SEGNOD(segment_id,ijk) ! get the node id of the segment id on the processor j
131 loads_per_proc(j)%LOAD_CYL(i)%SEGNOD(k,ijk) = node_id ! save the node id
132 ENDDO
133 ENDDO
134 ! ------------
135 loads_per_proc(j)%LOAD_CYL(i)%S_SEGMENT_ADRESS = local_segment_number
136 ALLOCATE( loads_per_proc(j)%LOAD_CYL(i)%SEGMENT_ADRESS(4,local_segment_number) )
137 loads_per_proc(j)%LOAD_CYL(i)%SEGMENT_ADRESS(1:4,1:local_segment_number) = 0
138 ENDDO
139 ! ------------
140 ENDIF
141 ! ------------
142 ENDDO
143 ! -------------------
144
145 RETURN
146 END SUBROUTINE split_pcyl
end diagonal values have been computed in the(sparse) matrix id.SOL
initmumps id
subroutine split_pcyl(total_number_pcyl, loads, loads_per_proc)
Definition split_pcyl.F:30