OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
lecstack_ply.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!|| lecstack_ply ../starter/source/properties/composite_options/stack/lecstack_ply.F
25!||--- called by ------------------------------------------------------
26!|| lectur ../starter/source/starter/lectur.F
27!||--- calls -----------------------------------------------------
28!|| ancmsg ../starter/source/output/message/message.F
29!|| arret ../starter/source/system/arret.F
30!|| bidon2 ../starter/source/system/machine.F
31!|| fretitl ../starter/source/starter/freform.F
32!|| fretitl2 ../starter/source/starter/freform.F
33!|| hm_option_read_key ../starter/source/devtools/hm_reader/hm_option_read_key.F
34!|| hm_option_start ../starter/source/devtools/hm_reader/hm_option_start.F
35!|| hm_read_stack ../starter/source/stack/hm_read_stack.F
36!|| lcgeo19 ../starter/source/elements/shell/coque/lcgeo19.F
37!|| vdouble ../starter/source/system/sysfus.F
38!||--- uses -----------------------------------------------------
39!|| defaults_mod ../starter/source/modules/defaults_mod.F90
40!|| elbuftag_mod ../starter/share/modules1/elbuftag_mod.F
41!|| hm_option_read_mod ../starter/share/modules1/hm_option_read_mod.F
42!|| message_mod ../starter/share/message_module/message_mod.F
43!|| stack_mod ../starter/share/modules1/stack_mod.F
44!|| submodel_mod ../starter/share/modules1/submodel_mod.F
45!||====================================================================
46 SUBROUTINE lecstack_ply(GEO_STACK ,X ,IX ,PM ,ITABM1 ,
47 . ISKN ,IGEO_STACK ,IPM ,NPC ,PLD ,
48 . UNITAB ,RTRANS ,LSUBMODEL ,IPART ,IDRAPEID,
49 . PLY_INFO ,STACK_INFO ,NUMGEO_STACK ,NPROP_STACK,DEFAULTS)
50C============================================================================
51C M o d u l e s
52C-----------------------------------------------
53 USE unitab_mod
54 USE elbuftag_mod
55 USE submodel_mod
56 USE message_mod
57 USE stack_mod
59 USE submodel_mod
61 USE defaults_mod
62C-----------------------------------------------
63C I m p l i c i t T y p e s
64C-----------------------------------------------
65#include "implicit_f.inc"
66C-----------------------------------------------
67C C o m m o n B l o c k s
68C-----------------------------------------------
69#include "units_c.inc"
70#include "com04_c.inc"
71#include "param_c.inc"
72#include "scr17_c.inc"
73C-----------------------------------------------
74C D u m m y A r g u m e n t s
75C-----------------------------------------------
76 TYPE (UNIT_TYPE_),INTENT(IN) ::UNITAB
77 INTEGER IX(*),ITABM1(*),ISKN(LISKN,*),
78 . IGEO_STACK(NPROPGI,NUMSTACK + NUMPLY),IPM(NPROPMI,NUMMAT),NPC(*),
79 . ipart(lipart1,*),idrapeid(*),ply_info(3,numply),
80 . nprop_stack,numgeo_stack(numgeo+numstack)
81 my_real geo_stack(npropg,numstack+numply), x(*), pm(npropm,nummat),pld(*),rtrans(ntransf,*)
82 TYPE(stack_info_ ) , DIMENSION (1:NPROP_STACK) :: STACK_INFO
83 TYPE(SUBMODEL_DATA), DIMENSION(NSUBMOD), INTENT(IN) :: LSUBMODEL
84 TYPE(defaults_) , INTENT(IN) :: DEFAULTS
85C-----------------------------------------------
86C L o c a l V a r i a b l e s
87C-----------------------------------------------
88 LOGICAL lFOUND
89 CHARACTER(LEN=NCHARTITLE) :: IDTITL,TITR1
90 CHARACTER MESS*40
91 INTEGER I, IG, IGTYP, J, IHBE, K, IDS, IUNIT, UID, ISORTH
92 INTEGER NSTACK, ISTACK, NUMS, IFLAGUNIT, JPID, N1, SUB_ID, JPID1, JPID2, NISUB, II, IPOS
93 my_real rbid, fac_l, zshift
94C-----------------------------------------------
95C E x t e r n a l F u n c t i o n s
96C-----------------------------------------------
97 DATA mess/'PID DEFINITION '/
98C----------------------
99C GEO(3) : ISMSTR
100C GEO(5) : DT (ISMSTR=3 expect for solid elems)
101C GEO(7) : VX shell/solids ortho - reference vector
102C GEO(8) : VY
103C GEO(9) : VZ
104C GEO(11): ISTRAIN (shell)
105C GEO(12): IGTYP -> IGEO(11)
106C GEO(35): ITHK
107C GEO(37): ISHEAR
108C GEO(38): FSHEAR
109C GEO(39): IPLAST
110C GEO(40): IG v50 -> IGEO(1)
111C GEO (20:34): porous medium (bricks)
112C GEO(129): HCLOS (bricks)
113C GEO(130): HTEST (bricks)
114C GEO(131:170): FREE
115C GEO(171): IHBE
116C GEO(212): ANGLE BETWEEN two orthotropy directions (DIR1,DIR2) for
117C the PID52 with LAW58
118C-------------------
119C IGEO(1) : IG
120C IGEO(2) : ISK
121C IGEO(3) : ISEN
122C IGEO(4) : NIP
123C IGEO(5) : ISMSTR
124C IGEO(6) : IREP
125C IGEO(7) : ITHK
126C IGEO(8) : ISHEAR
127C IGEO(9) : IPLAST
128C IGEO(10) : IHBE
129C IGEO(11) : IGTYP
130C IGEO(12) :
131C IGEO(13) : ICPRE
132C IGEO(14) : ICSTR
133C IGEO(15) : IINT
134C IGEO(16) : IFRAM
135C IGEO(17) : ISORTH
136C IGEO(18) : ISH3N
137C IGEO(19) : ICXFEM
138C IGEO(20) : ISROT
139C IGEO(40) : IAD_KNOT
140C IGEO(41) : POLYNOMIAL DEGREE in 1st direction
141C IGEO(42) : POLYNOMIAL DEGREE in 2nd direction
142C IGEO(43) : POLYNOMIAL DEGREE in 3rd direction
143C IGEO(44) : NUMBER OF CONTROL POINTS in 1st direction
144C IGEO(45) : NUMBER OF CONTROL POINTS in 2nd direction
145C IGEO(46) : NUMBER OF CONTROL POINTS in 3rd direction
146C IGEO(47) : INTEGRATION FORMULATION FLAG for PID51 (UNIFORM / GAUSS distribution)
147C IGEO(48) : DRAPE IDENTIFICATION NUMBER
148C IGEO(49) : =1 ORTHOTROPY ANGLE DEFINED AT ELEMENT LEVEL ( /PROP/TYPE19/51/52 )
149C =2 ORTHOTROPY ANGLE DEFINED AT STACK LEVEL ( /PROP/TYPE19/51/52 )
150C=======================================================================
151 WRITE(iout,1000)
152C----------------------
153 sub_id = 0
154 rbid=zero
155c----------
156 CALL hm_option_start('/STACK')
157 DO i=1,numstack
158 CALL hm_option_read_key(lsubmodel, option_id=ig, unit_id=uid, option_titr=idtitl)
159 isorth = 0
160 iflagunit = 0
161
162 DO iunit=1,unitab%NUNITS
163 IF (unitab%UNIT_ID(iunit) == uid) THEN
164 iflagunit = 1
165 EXIT
166 ENDIF
167 ENDDO
168
169 IF (uid /= 0 .AND. iflagunit == 0) THEN
170 CALL ancmsg(msgid=659,anmode=aninfo,msgtype=msgerror,
171 . i1=ig, i2=uid,
172 . c1='STACK', c2='stack', C3=IDTITL)
173 ENDIF
174
175! Stack + ply are belong to /PROP/PCOMPP
176 IGTYP = 52 ! belong to /PROP/PCOMP - TYPE52
177C
178C new shell property (stack based with multi NPT through one layer
179C---------------
180C GENERIC SHELL
181C----------------------
182C
183C----------------------------------------------------------------
184C COMPOSITE LAYERED SHELL (NEW)
185C LAYERS WITH : -VARIABLE THICKNESS
186C -VARIABLE MATERIAL (BUT LAW 25 OR 27 ONLY)
187C -VARIABLE NUMBER OF INTEGRATION POINTS THROUGH ONE LAYER
188C----------------------------------------------------------------
189 CALL FRETITL(IDTITL,IGEO_STACK(NPROPGI-LTITR+1,I),LTITR)
190 NUMS = NUMGEO_STACK(NUMGEO + I)
191 CALL HM_READ_STACK(
192 . GEO_STACK(1,I) ,IGEO_STACK(1,I) ,IPM ,ISKN ,
193 . IG ,RTRANS ,SUB_ID ,STACK_INFO(NUMS) ,
194 . IDTITL ,UNITAB ,LSUBMODEL,DEFAULTS%SHELL )
195
196C-------- Variables stored in element buffer
197c---- Shells
198C should be done for pccomp
199C-------------------------------
200C temporary double storage : GEO() / IGEO() : may be optimized & deleted later
201!!! ---------------------
202 IGEO_STACK(17,I)=ISORTH
203.AND. IF(GEO_STACK(39,I) /= ZERO IGEO_STACK(9,I) == 0) IGEO_STACK( 9,I)=NINT(GEO_STACK(39,I))
204.AND. IF(GEO_STACK(171,I) /= ZERO IGEO_STACK(10,I) == 0) IGEO_STACK(10,I)=NINT(GEO_STACK(171,I))
205C
206 END DO!next I
207C
208C-------------------------------
209C Objet /PLY
210C-------------------------------
211 I = NUMSTACK
212 CALL HM_OPTION_START('/ply')
213 DO II = 1, NUMPLY
214 CALL HM_OPTION_READ_KEY(LSUBMODEL, OPTION_ID = IG, UNIT_ID = UID, OPTION_TITR = IDTITL)
215 ISORTH = 0
216 IFLAGUNIT = 0
217 DO IUNIT=1,UNITAB%NUNITS
218 IF (UNITAB%UNIT_ID(IUNIT) == UID) THEN
219 IFLAGUNIT = 1
220 EXIT
221 ENDIF
222 ENDDO
223c call BIDON2 to avoid optimization issue on FAC_L variable from compiler (issue
224c observed after global code compilation with -openmp flag
225 CALL BIDON2(FAC_L)
226.AND. IF (UID /=0 IFLAGUNIT == 0) THEN
227 CALL ANCMSG(MSGID=659,ANMODE=ANINFO,MSGTYPE=MSGERROR,
228 . I1=IG, I2=UID,
229 . C1='ply',C2='ply',C3=IDTITL)
230 ENDIF
231 IGTYP = 19
232 I = I + 1
233 IHBE = 0
234 IGEO_STACK( 1,I) = IG
235 ISTACK = 1
236C
237 CALL FRETITL(IDTITL,IGEO_STACK(NPROPGI-LTITR+1,I),LTITR)
238C
239 CALL LCGEO19(GEO_STACK(1,I), IGEO_STACK(1,I), PM, IPM, UNITAB, IUNIT, ISTACK,IDRAPEID, LSUBMODEL)
240 IF(IGEO_STACK(4,I) > 10) THEN
241 CALL ANCMSG(MSGID=1146,MSGTYPE=MSGERROR,ANMODE=ANINFO,I1=IG,C1=IDTITL)
242 CALL ARRET(2)
243 ENDIF
244 PLY_INFO(1,II) = IG
245 PLY_INFO(2,II) = IGEO_STACK(4,I)
246 PLY_INFO(3,II) = IGEO_STACK(101,I)
247 IGEO_STACK(1,I) =IG
248 ENDDO
249C
250C-------------------------------cy
251 NPLYMAX = MAX(NPLYMAX,NUMPLY)
252C------------------------------
253 DO I = 1, NUMSTACK
254 GEO_STACK(100,I) = SQRT(GEO_STACK(38,I)) ! SHFSR
255 END DO
256C------------------------------
257C
258 DO I = 1,NUMSTACK
259 IGTYP=IGEO_STACK(11,I)
260 NUMS= NUMGEO_STACK(NUMGEO + I)
261 IF(IGTYP == 52) THEN
262 ! Initialization of stack thickness
263 GEO_STACK(1,I) = ZERO
264 !--- generalizing ZSHIFT ! keep only IPOS= 2 as before
265 IPOS =IGEO_STACK(99,I)
266 ZSHIFT = GEO_STACK(199, I)
267 IF(IPOS == 0 )THEN
268 ZSHIFT = - HALF
269 ELSEIF(IPOS == 3) THEN
270 ZSHIFT = -ONE
271 ELSEIF(IPOS == 4) THEN
272 ZSHIFT = ZERO
273 ENDIF
274 GEO_STACK(199, I) = ZSHIFT
275 N1 = IGEO_STACK(4,I)
276 DO J =1 , N1
277C ply of stack JPID
278 JPID = STACK_INFO(NUMS)%PID(J)
279 lFOUND = .FALSE.
280 IF(JPID > 0)THEN
281 DO K=1,NUMPLY
282 IF (IGEO_STACK(1,NUMSTACK + K) == JPID) THEN
283 STACK_INFO(NUMS)%PID(J) = NUMSTACK + K
284C tag if the ply is in the stack
285 IDS = IGEO_STACK(42,NUMSTACK + K)
286 IGEO_STACK(42 ,NUMSTACK + K) = I
287.AND. IF(IDS > 0 IDS /= I) THEN
288 CALL FRETITL2(TITR1,IGEO_STACK(NPROPGI-LTITR+1,NUMSTACK+K),LTITR)
289 CALL ANCMSG(MSGID=1148,MSGTYPE=MSGERROR,ANMODE=ANINFO_BLIND_1,
290 . I1=IGEO_STACK(1,NUMSTACK + K), I2= IGEO_STACK(1,IDS), I3= IGEO_STACK(1,I),
291 . C1=TITR1, C2='ply')
292 ENDIF
293C update stack thicness
294 GEO_STACK(1,I) = GEO_STACK(1,I) + GEO_STACK(1,NUMSTACK + K)
295 lFOUND = .TRUE.
296 EXIT
297 ENDIF
298 ENDDO
299.NOT. IF(lFOUND)THEN
300 CALL FRETITL2(TITR1,IGEO_STACK(NPROPGI-LTITR+1,I),LTITR)
301 CALL ANCMSG(MSGID=1149,MSGTYPE=MSGERROR,ANMODE=ANINFO_BLIND_1,
302 . I1=IGEO_STACK(1,I), I2=JPID,
303 . C1=TITR1, C2='stack')
304 ENDIF
305 ENDIF!(JPID > 0)
306 END DO!next J
307C interface substack
308 NISUB = IGEO_STACK(44,I)
309 IF (NISUB > 0) THEN
310 DO J =1 , NISUB
311 JPID1 = STACK_INFO(NUMS)%ISUB( 3*(J-1) + 1 )
312 JPID2 = STACK_INFO(NUMS)%ISUB( 3*(J-1) + 2 )
313.OR. IF (JPID1 > 0 JPID2 > 0) THEN
314 DO K=1,NUMPLY
315 NSTACK = 0
316 lFOUND=.FALSE.
317 IF (IGEO_STACK(1,NUMSTACK + K) == JPID1) THEN
318 STACK_INFO(NUMS)%ISUB (3*(J-1) + 1) = NUMSTACK + K
319 lFOUND=.TRUE.
320 EXIT !next J
321 ELSEIF (IGEO_STACK(1,NUMSTACK + K) == JPID2) THEN
322 STACK_INFO(NUMS)%ISUB (3*(J-1) + 2) = NUMSTACK + K
323 lFOUND=.TRUE.
324 EXIT !next J
325 ENDIF
326 ENDDO
327.NOT. IF(lFOUND)THEN
328 CALL FRETITL2(TITR1,IGEO_STACK(NPROPGI-LTITR+1,I),LTITR)
329 CALL ANCMSG(MSGID=1149,MSGTYPE=MSGERROR,ANMODE=ANINFO_BLIND_1,
330 . I1=IGEO_STACK(1,I), I2=JPID1,
331 . C1=TITR1, C2='stack')
332 CALL FRETITL2(TITR1,IGEO_STACK(NPROPGI-LTITR+1,I),LTITR)
333 CALL ANCMSG(MSGID=1149,MSGTYPE=MSGERROR,ANMODE=ANINFO_BLIND_1,
334 . I1=IGEO_STACK(1,I), I2=JPID2,
335 . C1=TITR1, C2='stack')
336 ENDIF
337.OR. ENDIF ! IF (JPID1 > 0 JPID2 > 0)
338 ENDDO !next J
339 ENDIF ! IF (NISUB > 0)
340C
341 DO J=1,N1
342 JPID = STACK_INFO(NUMS)%PID(J)
343 STACK_INFO(NUMS)%THK(J) = GEO_STACK(1,JPID)
344 STACK_INFO(NUMS)%DIR(J) = GEO_STACK(212,JPID) ! angle (DIR1,DIR2) - for compatibility of law58 with PID51)
345 STACK_INFO(NUMS)%MID(J) = IGEO_STACK(101,JPID)
346 ENDDO
347!
348 ENDIF
349 ENDDO ! DO I = 1, NUMSTACK
350C-------------------------------------
351C Search for double IDs
352C-------------------------------------
353 IDS = 79
354 I = 0
355 J = 0
356c CALL ANCNTS(IDS,I)
357 CALL VDOUBLE(IGEO_STACK(1,1),NPROPGI,NUMSTACK,MESS,0,RBID)
358 CALL VDOUBLE(IGEO_STACK(1,NUMSTACK+1),NPROPGI,NUMPLY,MESS,0,RBID)
359C
360C-----------
361 RETURN
362C-----------
363 1000 FORMAT(//
364 & 5X,' stack object for ply-based shell element sets'/,
365 & 5X,' ----------------------------------------------'//)
366 END
#define my_real
Definition cppsort.cpp:32
subroutine hm_option_start(entity_type)
subroutine lecstack_ply(geo_stack, x, ix, pm, itabm1, iskn, igeo_stack, ipm, npc, pld, unitab, rtrans, lsubmodel, ipart, idrapeid, ply_info, stack_info, numgeo_stack, nprop_stack, defaults)
for(i8=*sizetab-1;i8 >=0;i8--)
integer, parameter nchartitle
integer, dimension(:,:), allocatable ply_info
Definition stack_mod.F:133
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:895