⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 matdata.f90

📁 边界元程序,供力学工作者参考,希望对大家有所帮助
💻 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 + -