2424
2525! End MIT license text.
2626
27- SUBROUTINE QMEM1 ( OPT , IORD , RED_INT_SHEAR , AREA , XSD , YSD , BIG_BM )
27+ SUBROUTINE QMEM1 ( OPT , INT_ELEM_ID , IORD , RED_INT_SHEAR , AREA , XSD , YSD , BIG_BM )
2828
2929! Isoparametric membrane quadrilateral. Default iorq1s = 1 gives reduced integration for shear terms. User can override
3030! this with Bulk Data PARAM iorq1s 2. Element can be nonplanar. HBAR is the dist that the nodes are away from the mean
@@ -42,14 +42,16 @@ SUBROUTINE QMEM1 ( OPT, IORD, RED_INT_SHEAR, AREA, XSD, YSD, BIG_BM )
4242
4343 USE PENTIUM_II_KIND, ONLY : BYTE, LONG, DOUBLE
4444 USE IOUNT1, ONLY : ERR, F04, F06, WRT_ERR, WRT_LOG
45- USE SCONTR, ONLY : BLNK_SUB_NAM, FATAL_ERR, MAX_ORDER_GAUSS, MAX_STRESS_POINTS, MEFE, NSUB, NTSUB
45+ USE SCONTR, ONLY : BLNK_SUB_NAM, FATAL_ERR, MAX_ORDER_GAUSS, MAX_STRESS_POINTS, MEFE, NSUB, NTSUB, &
46+ MRPCOMP_PLIES, MRPCOMP0
4647 USE TIMDAT, ONLY : TSEC
4748 USE SUBR_BEGEND_LEVELS, ONLY : QMEM1_BEGEND
4849 USE CONSTANTS_1, ONLY : ZERO, FOUR
4950 USE NONLINEAR_PARAMS, ONLY : LOAD_ISTEP
5051 USE MODEL_STUF, ONLY : ALPVEC, BE1, BMEANT, DT, EID, ELDOF, ELGP, EM, ERR_SUB_NAM, HBAR, KE, KED, MXWARP, &
51- NUM_EMG_FATAL_ERRS, PCOMP_LAM, PCOMP_PROPS, PPE, PRESS, PTE, &
52- SE1, STE1, SHELL_AALP, SHELL_A, TREF, TYPE, FCONV, STRESS
52+ NUM_EMG_FATAL_ERRS, PCOMP_LAM, PCOMP_PROPS, RPCOMP, PPE, PRESS, PTE, &
53+ SE1, STE1, SHELL_AALP, SHELL_A, TREF, TYPE, FCONV, STRESS, NUM_PLIES, INTL_PID, TPLY, &
54+ EPROP, PLY_NUM
5355 USE DEBUG_PARAMETERS, ONLY : DEBUG
5456
5557 USE QMEM1_USE_IFs
@@ -61,9 +63,11 @@ SUBROUTINE QMEM1 ( OPT, IORD, RED_INT_SHEAR, AREA, XSD, YSD, BIG_BM )
6163 CHARACTER ( 1 * BYTE), INTENT (IN ) :: RED_INT_SHEAR ! If 'Y', use Gaussian weighted average of B matrices for shear terms
6264 CHARACTER (46 * BYTE) :: IORD_MSG ! Character name of the integration order (used for debug output)
6365
66+ INTEGER (LONG), INTENT (IN ) :: INT_ELEM_ID ! Internal element ID
6467 INTEGER (LONG), INTENT (IN ) :: IORD ! Gaussian integration order for element
6568 INTEGER (LONG) :: GAUSS_PT ! Gauss point number (used for output in subr SHP2DQ
6669 INTEGER (LONG) :: I,J,K,L,M ! DO loop indices
70+ INTEGER (LONG) :: JPLY ! PLY_NUM in a DO loop
6771 INTEGER (LONG), PARAMETER :: ID1( 8 ) = (/ 1 , & ! ID1(1) = 1 means virgin 8X8 elem DOF 1 is MYSTRAN 24X24 elem DOF 1
6872 2 , & ! ID1(2) = 2 means virgin 8X8 elem DOF 2 is MYSTRAN 24X24 elem DOF 2
6973 7 , & ! ID1(3) = 7 means virgin 8X8 elem DOF 3 is MYSTRAN 24X24 elem DOF 7
@@ -95,7 +99,8 @@ SUBROUTINE QMEM1 ( OPT, IORD, RED_INT_SHEAR, AREA, XSD, YSD, BIG_BM )
9599 INTEGER (LONG), PARAMETER :: NUM_NODES = 4 ! Quad has 4 nodes
96100 ! Indicator of no output of elem data to BUG file
97101 INTEGER (LONG), PARAMETER :: SUBR_BEGEND = QMEM1_BEGEND
98-
102+ INTEGER (LONG) :: PLY_RPCOMP_INDEX ! Index in array RPCOMP where data for ply K begins
103+
99104 REAL (DOUBLE) , INTENT (IN ) :: AREA ! Element area
100105 REAL (DOUBLE) , INTENT (IN ) :: XSD(4 ) ! Diffs in x coords of quad sides in local coords
101106 REAL (DOUBLE) , INTENT (IN ) :: YSD(4 ) ! Diffs in y coords of quad sides in local coords
@@ -138,16 +143,16 @@ SUBROUTINE QMEM1 ( OPT, IORD, RED_INT_SHEAR, AREA, XSD, YSD, BIG_BM )
138143 REAL (DOUBLE) :: NBAR(2 ,8 ) ! Matrix of shape functions (used in PPE calc)
139144 REAL (DOUBLE) :: PQ(8 ,NSUB) ! Element pressure load matrix for the 8 local emenent DOF's.
140145 REAL (DOUBLE) :: PSH(4 ) ! Output from subr SHP2DQ, called herein.
141- REAL (DOUBLE) :: FORCEx ! Engineering force in the elem x direction
142- REAL (DOUBLE) :: FORCEy ! Engineering force in the elem x direction
143- REAL (DOUBLE) :: FORCExy ! Engineering force in the elem xy direction
146+ REAL (DOUBLE) :: FORCEx(IORD_STRESS_Q4 * IORD_STRESS_Q4) ! Engineering force in the elem x direction at Gauss points
147+ REAL (DOUBLE) :: FORCEy(IORD_STRESS_Q4 * IORD_STRESS_Q4) ! Engineering force in the elem x direction at Gauss points
148+ REAL (DOUBLE) :: FORCExy(IORD_STRESS_Q4 * IORD_STRESS_Q4) ! Engineering force in the elem xy direction at Gauss points
144149 REAL (DOUBLE) :: QLOAD(2 ,NSUB) ! 2 components of the element pressure load (from PRESS) in 1 array
145150 REAL (DOUBLE) :: SSS(MAX_ORDER_GAUSS)
146151 ! An output from subr ORDER, called herein. Gauss abscissa's.
147152 REAL (DOUBLE) :: SUMB ! An intermediate variable used in calc B matrix for reduced integration
148153 REAL (DOUBLE) :: SUMD ! An intermediate variable used in calc B matrix for reduced integration
149154 REAL (DOUBLE) :: TBAR ! Average elem temperature
150-
155+
151156! **********************************************************************************************************************************
152157 IF (WRT_LOG >= SUBR_BEGEND) THEN
153158 CALL OURTIM
@@ -525,6 +530,65 @@ SUBROUTINE QMEM1 ( OPT, IORD, RED_INT_SHEAR, AREA, XSD, YSD, BIG_BM )
525530
526531 IF ((OPT(6 ) == ' Y' ) .AND. (LOAD_ISTEP > 1 )) THEN
527532
533+ ! Things not tested or properly coded for differential stiffness matrix yet:
534+ ! - Non-symmetric composite
535+ ! - Offset
536+ ! - Non-planar element
537+ ! - Thermal loading with composite
538+ ! - Differential stiffness solution type
539+
540+ ! Find membrane engineering forces at each Gauss point
541+ ! by summing the forces in each ply.
542+ DO GAUSS_PT= 1 ,IORD_STRESS_Q4* IORD_STRESS_Q4
543+ FORCEx(GAUSS_PT) = 0
544+ FORCEy(GAUSS_PT) = 0
545+ FORCExy(GAUSS_PT) = 0
546+ ENDDO
547+
548+ CALL GET_ELEM_NUM_PLIES ( INT_ELEM_ID ) ! Get NUM_PLIES
549+
550+ DO JPLY= 1 ,NUM_PLIES
551+ ! Get UEL, EM, TPLY for this ply.
552+ IF (PCOMP_PROPS == ' N' ) THEN
553+ ! EM is already set above.
554+
555+ TPLY = EPROP(1 ) ! Element thickness
556+ CALL ELMDIS
557+
558+ ELSE
559+
560+
561+ IF (PCOMP_LAM == ' NON' ) THEN ! Delete this IF block to allow the LAM field set to nonsymmetric.
562+ FATAL_ERR = FATAL_ERR + 1
563+ NUM_EMG_FATAL_ERRS = NUM_EMG_FATAL_ERRS + 1
564+ WRITE (ERR,* ) ' *ERROR: Code not written for non-symmetric composite buckling or differential stiffness.'
565+ WRITE (F06,* ) ' *ERROR: Code not written for non-symmetric composite buckling or differential stiffness.'
566+ CALL OUTA_HERE ( ' Y' )
567+ ENDIF
568+
569+ PLY_NUM = JPLY ! Used by SHELL_ABD_MATRICES
570+ CALL SHELL_ABD_MATRICES ( INT_ELEM_ID, ' N' ) ! Get EM, ZPLY, TPLY, ALPVEC for this ply
571+ CALL ELMDIS
572+ CALL ELMDIS_PLY ! Adjust UEL using ZPLY
573+
574+ ENDIF
575+
576+ GAUSS_PT = 0
577+ DO I= 1 ,IORD_STRESS_Q4
578+ DO J= 1 ,IORD_STRESS_Q4
579+ GAUSS_PT = GAUSS_PT + 1
580+
581+ CALL ELEM_STRE_STRN_ARRAYS ( GAUSS_PT+1 ) ! Stress at this Gauss point using UEL, BE1, EM, ALPVEC, DT
582+
583+ FORCEx(GAUSS_PT) = FORCEx(GAUSS_PT) + TPLY* STRESS(1 )
584+ FORCEy(GAUSS_PT) = FORCEy(GAUSS_PT) + TPLY* STRESS(2 )
585+ FORCExy(GAUSS_PT) = FORCExy(GAUSS_PT) + TPLY* STRESS(3 )
586+ ENDDO
587+ ENDDO
588+
589+ ENDDO
590+
591+
528592! Accoring to:
529593! Robert D. Cook, David S. Malkus, Michael E. Plesha Concepts and Applications of Finite Element Analysis, 3rd Edition 1989
530594! Section 14.3 Stress Stiffness Matrix Of A Plate Element
@@ -547,28 +611,21 @@ SUBROUTINE QMEM1 ( OPT, IORD, RED_INT_SHEAR, AREA, XSD, YSD, BIG_BM )
547611! [ σ] = ⌡ ⌡ DPSHX [ Nxy Ny ] DPSHX |J| dξ dη
548612! -1 -1
549613
550- CALL ELMDIS
551-
552- CALL ORDER_GAUSS ( IORD_STRESS_Q4, SSS, HHH )
553-
554614 DO K= 1 ,ELGP
555615 DO L= 1 ,ELGP
556616 KS(K,L) = ZERO
557617 ENDDO
558618 ENDDO
559619
620+ CALL ORDER_GAUSS ( IORD_STRESS_Q4, SSS, HHH )
621+
560622 GAUSS_PT = 0
561623 DO I= 1 ,IORD_STRESS_Q4
562624 DO J= 1 ,IORD_STRESS_Q4
563625 GAUSS_PT = GAUSS_PT + 1
564626
565- CALL ELEM_STRE_STRN_ARRAYS (GAUSS_PT+1 ) ! Stress at this Gauss point
566-
567- FORCEx = FCONV(1 )* STRESS(1 ) ! Engineering forces at this Gauss point
568- FORCEy = FCONV(1 )* STRESS(2 )
569- FORCExy = FCONV(1 )* STRESS(3 )
570- DUM11(1 ,1 ) = FORCEx ; DUM11(1 ,2 ) = FORCExy
571- DUM11(2 ,1 ) = FORCExy ; DUM11(2 ,2 ) = FORCEy
627+ DUM11(1 ,1 ) = FORCEx(GAUSS_PT) ; DUM11(1 ,2 ) = FORCExy(GAUSS_PT)
628+ DUM11(2 ,1 ) = FORCExy(GAUSS_PT) ; DUM11(2 ,2 ) = FORCEy(GAUSS_PT)
572629
573630 DO L= 1 ,ELGP ! Shape function derivatives at this Gauss point.
574631 DPSHX(1 ,L) = BE1(1 ,ID1(2 * (L-1 )+ 1 ),GAUSS_PT+1 )
@@ -589,6 +646,7 @@ SUBROUTINE QMEM1 ( OPT, IORD, RED_INT_SHEAR, AREA, XSD, YSD, BIG_BM )
589646
590647 ENDDO
591648 ENDDO
649+
592650 ! Copy KS into KED for each translational DOF.
593651 DO I= 1 ,6 * ELGP
594652 DO J= 1 ,6 * ELGP
@@ -603,7 +661,6 @@ SUBROUTINE QMEM1 ( OPT, IORD, RED_INT_SHEAR, AREA, XSD, YSD, BIG_BM )
603661 ENDDO
604662 ENDDO
605663
606-
607664 ENDIF
608665
609666! **********************************************************************************************************************************
0 commit comments