📄 matdata.f90
字号:
SUBROUTINE StressState( strsg, ietyp, smean, varj2, varj3, &
thita, steff, qstrs )
! ===============================================================
! 单元功能:
! 计算单元应力不变量
! ===============================================================
USE CtrlData
IMPLICIT DOUBLE PRECISION( a-h, o-z )
DIMENSION strsg( 6 ), strsw( 6 )
!.......计算常量并调整应力
ROOT3 = DSQRT( 3.0D0 )
CALL ReorderStress( strsg, strsw, ietyp, 0 )
IF( nerrc .NE. 0 ) RETURN
!.......计算平均应力和应力偏量
smean = ( strsw(1) + strsw(2) + strsw(3) ) / 3.0D0
strsw(1) = strsw(1) - smean
strsw(2) = strsw(2) - smean
strsw(3) = strsw(3) - smean
!.......计算应力偏量的第二、第三不变量及其它常数
varj2 = 0.5D0 * strsw(1) * strsw(1) + strsw(4) * strsw(4) + &
0.5D0 * strsw(2) * strsw(2) + strsw(5) * strsw(5) + &
0.5D0 * strsw(3) * strsw(3) + strsw(6) * strsw(6)
varj3 = strsw(1) * strsw(2) * strsw(3) + &
strsw(4) * strsw(5) * strsw(6) * 2.0D0 - &
strsw(1) * strsw(4) * strsw(4) - &
strsw(2) * strsw(5) * strsw(5) - &
strsw(3) * strsw(6) * strsw(6)
IF( varj2 .LT. 0.0D0 .OR. varj2 .GE. 1.0D32 ) THEN
nerrc = 423523
RETURN
END IF
steff = DSQRT( varj2 )
qstrs = ROOT3 * steff
IF( steff .LE. 1.0D-8 ) THEN
sinth = 0.0D0
ELSE
sinth =-1.5D0 * ROOT3 * varj3 / ( varj2 * steff )
END IF
IF( sinth .LT. -1.0D0 ) sinth =-1.0D0
IF( sinth .GT. 1.0D0 ) sinth = 1.0D0
thita = DASIN( sinth ) / 3.0D0
END
SUBROUTINE ReorderStress( fstrs, tstrs, ietyp, iflag )
! ================================================================
! 单元功能:
! 根据单元的应力特点调整应力点位置
! iflag = 0 特定状态 -> 一般状态
! iflag = 1 一般状态 -> 特定状态
! ================================================================
USE CtrlData
IMPLICIT DOUBLE PRECISION( a-h, o-z )
DIMENSION fstrs( 6 ), tstrs( 6 )
INCLUDE 'Parameter.FD'
DO istre = 1, 6
tstrs( istre ) = 0.0D0
END DO
SELECT CASE( ietyp )
CASE( MAT_SIMPLE_TENSIL )
! 简单拉伸应力状态
tstrs(1) = fstrs(1)
CASE( MAT_SIMPLE_SHEAR )
! 简单剪切应力状态
IF( iflag .EQ. 0 ) THEN
tstrs(6) = fstrs(1)
ELSE
tstrs(1) = fstrs(6)
END IF
CASE( MAT_PLANE_STRESS_AXISYMETRIC )
! 平面应力轴对称应力状态
tstrs(1) = fstrs(1)
tstrs(2) = fstrs(2)
CASE( MAT_PLANE_STRAIN_AXISYMETRIC )
! 平面应变轴对称应力状态
tstrs(1) = fstrs(1)
tstrs(2) = fstrs(2)
tstrs(3) = fstrs(3)
CASE( MAT_PLANE_STRESS )
! 平面应力状态
tstrs(1) = fstrs(1)
tstrs(2) = fstrs(2)
IF( iflag .EQ. 0 ) THEN
tstrs(6) = fstrs(3)
ELSE
tstrs(3) = fstrs(6)
END IF
CASE( MAT_PLANE_STRAIN )
! 平面应变(空间轴对称)应力状态
tstrs(1) = fstrs(1)
tstrs(2) = fstrs(2)
IF( iflag .EQ. 0 ) THEN
tstrs(6) = fstrs(3)
tstrs(3) = fstrs(4)
ELSE
tstrs(3) = fstrs(6)
tstrs(4) = fstrs(3)
END IF
CASE( MAT_3D_PLATE_SHELL )
! 板壳应力状态
tstrs(1) = fstrs(1)
tstrs(2) = fstrs(2)
IF( iflag .EQ. 0 ) THEN
tstrs(4) = fstrs(3)
tstrs(5) = fstrs(4)
tstrs(6) = fstrs(5)
ELSE
tstrs(3) = fstrs(4)
tstrs(4) = fstrs(5)
tstrs(5) = fstrs(6)
END IF
CASE( MAT_3D_BLOCK )
! 一般复杂应力状态
tstrs(1) = fstrs(1)
tstrs(2) = fstrs(2)
tstrs(3) = fstrs(3)
tstrs(4) = fstrs(4)
tstrs(5) = fstrs(5)
tstrs(6) = fstrs(6)
CASE DEFAULT
WRITE( 12, 2000 )
nerrc = 230101
END SELECT
2000 FORMAT( //2x, '致命错误,调用了无效的选项!' )
END
SUBROUTINE ReorderStrain( fstrs, tstrs, ietyp, iflag )
! ================================================================
! 单元功能:
! 根据单元的应力特点调整应变点位置
! iflag = 0 特定状态 -> 一般状态
! iflag = 1 一般状态 -> 特定状态
! ================================================================
USE CtrlData
IMPLICIT DOUBLE PRECISION( a-h, o-z )
DIMENSION fstrs( 6 ), tstrs( 6 )
INCLUDE 'Parameter.FD'
DO istre = 1, 6
tstrs( istre ) = 0.0D0
END DO
SELECT CASE( ietyp )
CASE( MAT_SIMPLE_TENSIL )
! 简单拉伸应力状态
tstrs(1) = fstrs(1)
tstrs(2) = fstrs(2)
tstrs(3) = fstrs(3)
CASE( MAT_SIMPLE_SHEAR )
! 简单剪切应力状态
IF( iflag .EQ. 0 ) THEN
tstrs(6) = fstrs(1)
ELSE
tstrs(1) = fstrs(6)
END IF
CASE( MAT_PLANE_STRESS_AXISYMETRIC )
! 平面应力轴对称应力状态
tstrs(1) = fstrs(1)
tstrs(2) = fstrs(2)
tstrs(3) = fstrs(3)
CASE( MAT_PLANE_STRAIN_AXISYMETRIC )
! 平面应变轴对称应力状态
tstrs(1) = fstrs(1)
tstrs(2) = fstrs(2)
CASE( MAT_PLANE_STRESS )
! 平面应力状态
tstrs(1) = fstrs(1)
tstrs(2) = fstrs(2)
tstrs(3) = fstrs(4)
IF( iflag .EQ. 0 ) THEN
tstrs(6) = fstrs(3)
ELSE
tstrs(3) = fstrs(6)
END IF
CASE( MAT_PLANE_STRAIN )
! 平面应变(空间轴对称)应力状态
tstrs(1) = fstrs(1)
tstrs(2) = fstrs(2)
IF( iflag .EQ. 0 ) THEN
tstrs(6) = fstrs(3)
tstrs(3) = fstrs(4)
ELSE
tstrs(3) = fstrs(6)
tstrs(4) = fstrs(3)
END IF
CASE( MAT_3D_PLATE_SHELL )
! 板壳应力状态
tstrs(1) = fstrs(1)
tstrs(2) = fstrs(2)
IF( iflag .EQ. 0 ) THEN
tstrs(4) = fstrs(3)
tstrs(5) = fstrs(4)
tstrs(6) = fstrs(5)
ELSE
tstrs(3) = fstrs(4)
tstrs(4) = fstrs(5)
tstrs(5) = fstrs(6)
END IF
CASE( MAT_3D_BLOCK )
! 一般复杂应力状态
tstrs(1) = fstrs(1)
tstrs(2) = fstrs(2)
tstrs(3) = fstrs(3)
tstrs(4) = fstrs(4)
tstrs(5) = fstrs(5)
tstrs(6) = fstrs(6)
CASE DEFAULT
WRITE( 12, 2000 )
nerrc = 230101
END SELECT
2000 FORMAT( //2x, '致命错误,调用了无效的选项!' )
END
FUNCTION NumOfStress( ietyp, iflag )
! ==============================================================
! | 模块功能:
! | 获取单元类型对应的应力分量数。
! | iflag - 输入量,标记 0 - 非零应力分量数;
! | 1 - 独立的非零应力分量数
! ==============================================================
USE CtrlData
IMPLICIT DOUBLE PRECISION( a-h, o-z )
INCLUDE 'Parameter.FD'
IF( iflag .NE. 0 .AND. iflag .NE. 1 ) THEN
WRITE( 12, 2000 )
nerrc = 100501
END IF
SELECT CASE( ietyp )
CASE( MAT_SIMPLE_TENSIL ) !简单拉伸
NumOfStress = 1
CASE( MAT_SIMPLE_SHEAR ) !简单剪切
NumOfStress = 1
CASE( MAT_PLANE_STRESS_AXISYMETRIC ) !平面应力轴对称
NumOfStress = 2
CASE( MAT_PLANE_STRAIN_AXISYMETRIC ) !平面应变轴对称
NumOfStress = 2 + iflag
CASE( MAT_PLANE_STRESS ) !平面应力
NumOfStress = 3
CASE( MAT_PLANE_STRAIN ) !平面应变
NumOfStress = 3 + iflag
CASE( MAT_AXISYMETRIC ) !空间轴对称
NumOfStress = 4
CASE( MAT_3D_PLATE_SHELL ) !板壳应力状态
NumOfStress = 5
CASE( MAT_3D_BLOCK ) !一般复杂应力状态
NumOfStress = 6
END SELECT
2000 FORMAT( //2x, '输入标记只能为0或1!' )
END
FUNCTION NumOfStrain( ietyp, iflag )
! =============================================================
! | 模块功能:
! | 获取单元类型对应的应力分量数。
! | iflag - 输入量,标记 0 - 非零应力分量;
! | 1 - 独立的非零应力分量数
! =============================================================
USE CtrlData
IMPLICIT DOUBLE PRECISION( a-h, o-z )
INCLUDE 'Parameter.FD'
IF( iflag .NE. 0 .AND. iflag .NE. 1 ) THEN
WRITE( 12, 2000 )
nerrc = 100501
END IF
SELECT CASE( ietyp )
CASE( MAT_SIMPLE_TENSIL ) !简单拉伸
NumOfStrain = 1
CASE( MAT_SIMPLE_SHEAR ) !简单剪切
NumOfStrain = 1
CASE( MAT_PLANE_STRESS_AXISYMETRIC ) !平面应力轴对称
NumOfStrain = 2 + iflag
CASE( MAT_PLANE_STRAIN_AXISYMETRIC ) !平面应变轴对称
NumOfStrain = 2
CASE( MAT_PLANE_STRESS ) !平面应力
NumOfStrain = 3 + iflag
CASE( MAT_PLANE_STRAIN ) !平面应变
NumOfStrain = 3
CASE( MAT_AXISYMETRIC ) !空间轴对称
NumOfStrain = 4
CASE( MAT_3D_PLATE_SHELL ) !板壳应力状态
NumOfStrain = 5
CASE( MAT_3D_BLOCK ) !一般复杂应力状态
NumOfStrain = 6
END SELECT
2000 FORMAT( //2x, '输入标记只能为0或1!' )
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -