OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
check_skew.F File Reference
#include "implicit_f.inc"
#include "tabsiz_c.inc"
#include "com01_c.inc"
#include "com04_c.inc"
#include "param_c.inc"

Go to the source code of this file.

Functions/Subroutines

subroutine check_skew (ixr, igeo, iskn, cep, iskwp, nskwp, tag_skn, multiple_skew, r_skew, ipm, offset)

Function/Subroutine Documentation

◆ check_skew()

subroutine check_skew ( integer, dimension(nixr,numelr), intent(in) ixr,
integer, dimension(npropgi,numgeo), intent(in) igeo,
integer, dimension(liskn,siskwn/liskn), intent(in) iskn,
integer, dimension(scep), intent(in) cep,
integer, dimension(numskw+1), intent(inout) iskwp,
integer, dimension(nspmd), intent(inout) nskwp,
integer, dimension(numskw+nsubmod+1), intent(inout) tag_skn,
type(plist_skew_), dimension(numskw+1), intent(inout) multiple_skew,
integer, dimension(numelr), intent(inout) r_skew,
integer, dimension(npropmi,nummat), intent(in) ipm,
integer offset )

Definition at line 33 of file check_skew.F.

35C-----------------------------------------------
36C M o d u l e s
37C-----------------------------------------------
38 USE skew_mod
39 USE submodel_mod , ONLY : nsubmod
40 use element_mod , only : nixr
41C-----------------------------------------------
42C I m p l i c i t T y p e s
43C-----------------------------------------------
44#include "implicit_f.inc"
45C-----------------------------------------------
46C C o m m o n B l o c k s
47C-----------------------------------------------
48#include "tabsiz_c.inc"
49#include "com01_c.inc"
50#include "com04_c.inc"
51#include "param_c.inc"
52C-----------------------------------------------
53C D u m m y A r g u m e n t s
54C-----------------------------------------------
55 INTEGER, INTENT(INOUT) :: NSKWP(NSPMD),R_SKEW(NUMELR)
56 INTEGER, DIMENSION(NUMSKW+NSUBMOD+1), INTENT(INOUT) :: TAG_SKN
57 INTEGER, DIMENSION(SCEP), INTENT(IN) :: CEP
58 INTEGER, DIMENSION(NUMSKW+1), INTENT(INOUT) :: ISKWP
59 INTEGER, DIMENSION(NIXR,NUMELR), INTENT(IN) :: IXR
60 INTEGER, DIMENSION(NPROPGI,NUMGEO), INTENT(IN) :: IGEO
61 INTEGER, DIMENSION(LISKN,SISKWN/LISKN), INTENT(IN) :: ISKN
62 INTEGER, DIMENSION(NPROPMI,NUMMAT), INTENT(IN) :: IPM
63 TYPE(PLIST_SKEW_), DIMENSION(NUMSKW+1), INTENT(INOUT) :: MULTIPLE_SKEW
64 INTEGER :: OFFSET
65! -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*
66! NSKWP : integer ; dimension = NSPMD
67! number of skew per processor
68! TAG_SKN : integer ; dimension=NUMSKW+NSUBMOD+1
69! tag array --> tag the i SKEW if a SPRING uses it
70! tag array=0 --> the SKEW is not used by a SPRING
71! tag array=1 --> the SKEW is used by one SPRING
72! tag array>1 --> the SKEW is used by several SPRING
73! tag array <0 --> the SKEW is used by several options (has to be duplicated to all domains that have the nodes)
74! CEP : integer ; dimension=NUMNOD
75! gives the ID processor of the current i node
76! ISKWP : integer ; dimension=NUMSKW+1
77! gives the ID processir of the current i SKEW
78! ISKWP < 0 --> the SKEW is local on a processor
79! and we don't need to communicate the data
80! ISKWP > 0 --> the SKEW is global and the data must be
81! communicated
82! IXR : integer ; dimension=NIXR*number of SPRING
83! SPRING array
84! IGEO : integer ; dimension=NPROPGI*number of /PROP
85! PROP array
86! ISKN : integer ; dimension=LISKN*number of SKEW
87! SKEW array
88! MULTIPLE_SKEW : SKEW_TYPE ; dimension=NUMSKW+1
89! MULTIPLE_SKEW(I)%PLIST(:) is a list of processor
90! where the SKEW is stuck
91! OFFSET :: integer, offset to point to the good place in CEP array
92! -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*
93
94C-----------------------------------------------
95C L o c a l V a r i a b l e s
96C-----------------------------------------------
97 INTEGER :: I,J,II
98 INTEGER :: NUMBER_SKEW_SP,SPRING_TYPE
99 INTEGER :: N1,N2,N3,IMAIN,SUM_NI,SIZE_SKEW,MAT_TYPE
100 INTEGER :: NB
101 INTEGER, DIMENSION(:), ALLOCATABLE :: SKEW_PER_SP,LOCAL_P,P_SKEW
102 INTEGER, DIMENSION(NSPMD) :: PROC_SKEW
103C-----------------------------------------------
104C E x t e r n a l F u n c t i o n s
105C-----------------------------------------------
106C=======================================================================
107!$COMMENT
108! CHECK_SKEW description
109! CHECK_SKEW sticks a SKEW on a given processor in order to reduce
110! the SKEW communication in the engine.
111! A SKEW can be linked to a SPRING --> in this case, the SKEW is
112! stuck on the local SPRING processor
113! If a SKEW is used by several SPRING, the SKEW is stuck on each
114! processors that need it
115!
116! CHECK_SKEW organization :
117! - link every SPRING with theirs SKEW
118! - if several SPRING use a same SKEW, allocate MULTIPLE_SKEW(I)%PLIST
119! - stick a SKEW on a given processor, count the number of SKEW per
120! processor, initialize the MULTIPLE_SKEW(I)%PLIST array
121! - count the number of SKEW per processor in the case of multiple
122! SPRING per SKEW
123!$ENDCOMMENT
124C
125! compute adhoc size for local arrays
126 number_skew_sp = 0
127 tag_skn(1:numskw+nsubmod+1) = -1
128 nb = 0
129 DO i = 1,numskw
130 ! The optimization of restricting a skew to the domains having the corresponding spring nodes
131 ! works only for skew referenced by only one options
132 CALL hm_entity_reference_number("/skew",LEN_TRIM("/skew"),ISKN(4,I+1),NB)
133 IF(NB == 1) TAG_SKN(I+1) = 0
134 ENDDO
135
136
137 DO I=1,NUMELR
138 SPRING_TYPE = IGEO( 11,IXR(1,I) )
139 MAT_TYPE = 0
140 IF (IXR(5,I) > 0) MAT_TYPE = IPM(2,IXR(5,I))
141C
142 IF (R_SKEW(I) > 1) THEN
143 IF( TAG_SKN(R_SKEW(I)) >= 0 ) THEN
144.OR..AND. IF(SPRING_TYPE==8 (SPRING_TYPE== 23 MAT_TYPE == 108)) NUMBER_SKEW_SP = NUMBER_SKEW_SP + 1
145 ENDIF
146 ENDIF
147C
148 IF (IGEO(2,IXR(1,I) )>1) THEN
149 IF( TAG_SKN( IGEO(2,IXR(1,I))) >= 0 ) THEN
150.OR..OR. IF(SPRING_TYPE==8 SPRING_TYPE==13 SPRING_TYPE== 23) NUMBER_SKEW_SP = NUMBER_SKEW_SP + 1
151 ENDIF
152 ENDIF
153 ENDDO
154
155! allocation and initialization of local array
156 ALLOCATE(SKEW_PER_SP(NUMBER_SKEW_SP))
157 ALLOCATE(LOCAL_P(NUMBER_SKEW_SP))
158
159
160
161
162 SKEW_PER_SP(1:NUMBER_SKEW_SP) = 0
163 LOCAL_P(1:NUMBER_SKEW_SP) = 0
164 NUMBER_SKEW_SP = 0
165
166! link between SPRING and SKEW (only for SPRING type =8,13 or 23)
167 DO I=1,NUMELR
168 SPRING_TYPE = IGEO( 11,IXR(1,I) )
169 MAT_TYPE = 0
170 IF (IXR(5,I) > 0) MAT_TYPE = IPM(2,IXR(5,I))
171C
172 IF (R_SKEW(I) > 1) THEN
173 IF( TAG_SKN(R_SKEW(I)) >= 0) THEN
174.OR..AND. IF(SPRING_TYPE==8 (SPRING_TYPE== 23 MAT_TYPE == 108)) THEN
175 NUMBER_SKEW_SP = NUMBER_SKEW_SP + 1
176 SKEW_PER_SP( NUMBER_SKEW_SP ) = R_SKEW(I)
177 LOCAL_P(NUMBER_SKEW_SP) = CEP(OFFSET+I)+1
178 TAG_SKN( R_SKEW(I) ) = TAG_SKN( R_SKEW(I) ) + 1
179 ENDIF
180 ENDIF
181 ENDIF
182C
183 IF (IGEO( 2,IXR(1,I) )>1) THEN
184 IF( TAG_SKN(IGEO(2,IXR(1,I))) >=0 ) THEN
185.OR..OR. IF(SPRING_TYPE==8 SPRING_TYPE==13 SPRING_TYPE== 23) THEN
186 NUMBER_SKEW_SP = NUMBER_SKEW_SP + 1
187 SKEW_PER_SP( NUMBER_SKEW_SP ) = IGEO( 2,IXR(1,I) )
188 LOCAL_P(NUMBER_SKEW_SP) = CEP(OFFSET+I)+1
189 TAG_SKN( IGEO(2,IXR(1,I)) ) = TAG_SKN( IGEO(2,IXR(1,I)) ) + 1
190 ENDIF
191 ENDIF
192 ENDIF
193 ENDDO
194
195! allocation of MULTIPLE_SKEW
196 DO I=1,NUMSKW+1
197 SIZE_SKEW = TAG_SKN(I)
198 IF(SIZE_SKEW>1) THEN
199.NOT. IF(ALLOCATED(MULTIPLE_SKEW(I)%PLIST)) ALLOCATE( MULTIPLE_SKEW(I)%PLIST(SIZE_SKEW) )
200 MULTIPLE_SKEW(I)%PLIST(1:SIZE_SKEW) = 0
201 ENDIF
202 ENDDO
203
204 ALLOCATE(P_SKEW(NUMSKW+1))
205 P_SKEW(1:NUMSKW+1) = 0
206
207! stick a SKEW on a given processor
208 DO J=1,NUMBER_SKEW_SP
209 I = SKEW_PER_SP(J)
210 IMAIN = LOCAL_P(J)
211 N1=ISKN(1,I)
212 N2=ISKN(2,I)
213 N3=ISKN(3,I)
214 SUM_NI = N1+N2+N3
215 IF(SUM_NI/=0) THEN
216
217 CALL IFRONTPLUS(N1,IMAIN)
218 CALL IFRONTPLUS(N2,IMAIN)
219 CALL IFRONTPLUS(N3,IMAIN)
220 IF(ISKWP(I)==0) ISKWP(I) = -IMAIN
221 IF(TAG_SKN(I)>1) THEN
222 P_SKEW(I) = P_SKEW(I) + 1
223 MULTIPLE_SKEW(I)%PLIST(P_SKEW(I)) = IMAIN
224 ELSE
225 NSKWP(IMAIN) = NSKWP(IMAIN) + 1
226 ENDIF
227 ENDIF
228 ENDDO
229
230! count and add the number of SKEW per processor in the case of multiple SPRING per SKEW
231 DO I=1,NUMSKW+1
232 SIZE_SKEW = TAG_SKN(I)
233 IF(SIZE_SKEW>1) THEN
234 PROC_SKEW(1:NSPMD) = 0
235 DO II=1,SIZE_SKEW
236 IMAIN = MULTIPLE_SKEW(I)%PLIST(II)
237 IF(IMAIN>0) PROC_SKEW(IMAIN) = PROC_SKEW(IMAIN) + 1
238 ENDDO
239 DO II=1,NSPMD
240 IF(PROC_SKEW(II)>0) NSKWP(II) = NSKWP(II) + 1
241 ENDDO
242 ENDIF
243 ENDDO
244
245! deallocation of local arrais
246 DEALLOCATE(SKEW_PER_SP,LOCAL_P)
247 DEALLOCATE(P_SKEW)
248
249 RETURN
subroutine hm_entity_reference_number(name, sname, id, ref_number)
integer nsubmod