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

📄 elmt300.f90

📁 边界元程序,供力学工作者参考,希望对大家有所帮助
💻 F90
📖 第 1 页 / 共 5 页
字号:
          props( 15, imats ) = nbody
          props( 16, imats ) = imtyp
          IF( imtyp .EQ. 1 ) THEN
            IF( nincc .EQ. 1 .OR. nincc .EQ. 3 ) nerrc = 38556
            IF( ngaus .LT. 1 ) ngaus = 27
            IF( nerrc .NE. 0 ) RETURN
            khstr = ngaus * 8
            nincc = 2
            IF( nhstr .LT. khstr ) nhstr = khstr
          END IF
          IF( nprnc .NE. 0 ) THEN
            WRITE( 12, 5400 )
        IF( imtyp .EQ. 0 ) WRITE( 12, 5600 )
            IF( imtyp .EQ. 1 ) WRITE( 12, 5601 )
            IF( imtyp .EQ. 0 ) THEN
              IF( qmt33 .LT. 1.0D-20 ) THEN
                WRITE( 12, 5800 ) qmt11, qmt22
              ELSE
                WRITE( 12, 6000 ) qmt11, qmt22, qmt33, qmt12, qmt23,           &
                                  qmt13, qmt44, qmt55, qmt66
              END IF
            ELSE IF( imtyp .EQ. 1 ) THEN
              WRITE( 12, 6200 ) qmt11, qmt22, qmt33, qmt12, qmt23,             &
                                qmt13
            END IF
            WRITE( 12, 6400 ) denst, xbody, ybody, zbody, nbody
          END IF
        END IF
2000    FORMAT( 12I5 )
2200    FORMAT( 2x, '分块数目:     ', I5 )
2400    FORMAT( 2x, '几何特性:     几何线性' )
2401    FORMAT( 2x, '几何特性:     几何非线性' )
2600    FORMAT( 2x, '致命错误:     材料性质参数数至少为', I15 )
2800    FORMAT( 2x, '各块特性: 序号    几何    材料' )
3000    FORMAT(10x, I4, 4x, I4, 4x, I4 )
3200    FORMAT( 2x, '错误:输入了无效的几何类型序号', I5 )
3400    FORMAT( 2x, '错误:输入了无效的材料类型序号', I5 )
3600    FORMAT( 2x, '单元类型:     三维实体元(板壳元)分域几何' )
3800    FORMAT( 2x, '单元类型:     三维实体元' )
3801    FORMAT( 2x, '单元类型:     一般壳单元' )
3802    FORMAT( 2x, '单元类型:     薄板壳单元' )
3803    FORMAT( 2x, '单元类型:     三维梁单元' )
3804    FORMAT( 2x, '单元类型:     三维细长梁单元' )
3805    FORMAT( 2x, '单元类型:     三维杆件单元' )
4000    FORMAT( 2x, 'x-高斯点:', I15 / 2x, 'y-高斯点:', I15 /                  &
                2x, 'z-高斯点:', I15 )
4200    FORMAT( 3F15.5 )
4400    FORMAT( 2X, '节点坐标:', I15, 3F10.5 )
4600    FORMAT( 12I5 )
4800    FORMAT( 2X, '分块定义:', 10X, 10I5 / 22X, 10I5 )
5000    FORMAT( 2x, '错误:输入了无效的内部节点序号', I5 )
5200    FORMAT( 4F15.5 / 4F15.5 / 4F15.5 / F15.5, 4I5 )
5400    FORMAT( 2x, '单元类型: 三维实体元(板壳元)分层材料' )
5600    FORMAT( 2x, '单元材料:     线弹性材料' )
5601    FORMAT( 2x, '单元材料:     蠕变材料' )
5800    FORMAT( 2x, '弹性模量:', E15.5/2X, '泊松比  :', F15.5 )
6000    FORMAT( 2X, '模量 D11:', E15.5/2X, '模量 D22:', E15.5/                 &
                2X, '模量 D33:', E15.5/2X, '模量 D12:', E15.5/                 &
                2X, '模量 D23:', E15.5/2X, '模量 D13:', E15.5/                 &
                2X, '模量 D44:', E15.5/2X, '模量 D55:', E15.5/                 &
                2X, '模量 D66:', E15.5 )
6200    FORMAT( 2X, '短期体积模量:', E15.5/2X, '长期体积模量:', E15.5/         &
                2X, '体积粘性系数:', E15.5/2X, '短期剪切模量:', E15.5/         &
                2X, '长期剪切模量:', E15.5/2X, '剪切粘性系数:', E15.5 )
6400    FORMAT( 2X, '质量密度:', E15.5/2X, 'x-体积力:', E15.5/                 &
                2X, 'y-体积力:', E15.5/2X, 'z-体积力:', E15.5/                 &
                2X, '动载类型:', I15 )
        RETURN
        END

        SUBROUTINE MidPln300( coreb, corep, lnodb, ielem, nnodb )
        USE CtrlData
        USE ElmtData
        IMPLICIT DOUBLE PRECISION( a-h, o-z )
        DIMENSION xloct( 8 ), corep( 3,  8 ), coreb( 3, 20 )
        DIMENSION yloct( 8 ), shape( 4, 21 ), lnodb(    20 )
        DATA xloct / -1.0D0, 1.0D0, 1.0D0,-1.0D0,                              &
                      0.0D0, 1.0D0, 0.0D0,-1.0D0 /
        DATA yloct / -1.0D0,-1.0D0, 1.0D0, 1.0D0,                              &
                     -1.0D0, 0.0D0, 1.0D0, 0.0D0 /
        iflag = 1
        DO inode = 1, 8
          xloca = xloct( inode )
          yloca = yloct( inode )
          zloca = 0.0D0
          CALL Shap3D( xloca, yloca, zloca, coreb, shape, xjaco,               &
                           3, nnodb, lnodb, ielem, iflag, nerrc )
          IF( nerrc .NE. 0 ) RETURN
          xloca = 0.0D0
          yloca = 0.0D0
          zloca = 0.0D0
          DO inodb = 1, nnodb
            xloca = xloca + shape( 4, inodb ) * coreb( 1, inodb )
            yloca = yloca + shape( 4, inodb ) * coreb( 2, inodb )
            zloca = zloca + shape( 4, inodb ) * coreb( 3, inodb )
          END DO
          CALL Shap3D( xloca, yloca, zloca, coren, shape, xjaco,               &
                       ndime, nnode, lnode, ielem, iflag, nerrc )
          IF( nerrc .NE. 0 ) RETURN
          DO idime = 1, ndime
            corep( idime, inode ) = 0.0D0
            DO jnode = 1, nnode
              corep( idime, inode ) = corep( idime, inode ) +                  &
              shape(     4, jnode ) * coren( idime, jnode )
            END DO
          END DO
        END DO
        RETURN
        END

        SUBROUTINE Bloc300( coreb, lnodb, igeob, nnodb )
        USE CtrlData
        USE MeshData
        IMPLICIT DOUBLE PRECISION( a-h, o-z )
        DIMENSION coreb( 3, 20 ), lnodb( 20 )

        DO inodb = 1, 20
          lnodb(    inodb ) = 0
          coreb( 1, inodb ) = 0.0D0
          coreb( 2, inodb ) = 0.0D0
          coreb( 3, inodb ) = 0.0D0
        END DO
        npntb = props( 3, igeob ) + 0.5D0
        nnodb = props( 4, igeob ) + 0.5D0
        DO inodb = 1, nnodb
          iloca = 3 * npntb + inodb + 7
          ipntb = props( iloca, igeob ) + 0.5D0
          lnodb( inodb ) = ipntb
          IF( ipntb .GT. 0 ) THEN
            coreb( 1, inodb ) = props( ipntb * 3 + 5, igeob )
            coreb( 2, inodb ) = props( ipntb * 3 + 6, igeob )
            coreb( 3, inodb ) = props( ipntb * 3 + 7, igeob )
          END IF
        END DO
        RETURN
        END

        SUBROUTINE Shape300( shape, coreb, lnodb, xloca, yloca,                &
                            zloca, xjaco, nnodb, ielem, iflag )
        USE CtrlData
        USE ElmtData
        IMPLICIT DOUBLE PRECISION( a-h, o-z )
        DIMENSION shape( 4, 21 )
        DIMENSION coreb( 3, 20 ), lnodb( 20 )
        CALL Shap3D( xloca, yloca, zloca, coreb, shape, trans,                 &
                     ndime, nnodb, lnodb, ielem, iflag, nerrc )
        IF( nerrc .GT. 0 ) RETURN
        xloca = 0.0D0
        yloca = 0.0D0
        zloca = 0.0D0
        DO inodb = 1, nnodb
          xloca = xloca + shape( 4, inodb ) * coreb( 1, inodb )
          yloca = yloca + shape( 4, inodb ) * coreb( 2, inodb )
          zloca = zloca + shape( 4, inodb ) * coreb( 3, inodb )
        END DO
        CALL Shap3D( xloca, yloca, zloca, coren, shape, xjaco,                 &
                     ndime, nnode, lnode, ielem, iflag, nerrc )
        xjaco = xjaco * trans
        RETURN
        END

        SUBROUTINE BMat300( shape, bmatx, nlinc, iswth )
!........
!       模块功能
!           计算B矩阵
!                     nlinc			不等于零时考虑几何非线性
!			          iswth == 1	计算应变的B矩阵;
!			                == 2	计算切线刚度阵的B矩阵;
!........
        USE ElmtData
        IMPLICIT DOUBLE PRECISION ( a-h , o-z )
        DIMENSION shape( 4, 21 ), bmatx( 6, 63 )
        DIMENSION amatx( 6,  9 ), gmatx( 9, 63 ), agmat( 6, 63 )

        DO idofe = 1, 63
          DO istre = 1, 6
            bmatx( istre, idofe ) = 0.0D0
          END DO
        END DO
        DO inode = 1, nnode
          locat = ( inode - 1 ) * 3
          bmatx( 1, locat + 1 ) = shape( 1, inode )
          bmatx( 2, locat + 2 ) = shape( 2, inode )
          bmatx( 3, locat + 3 ) = shape( 3, inode )
          bmatx( 4, locat + 2 ) = shape( 3, inode )
          bmatx( 4, locat + 3 ) = shape( 2, inode )
          bmatx( 5, locat + 1 ) = shape( 3, inode )
          bmatx( 5, locat + 3 ) = shape( 1, inode )
          bmatx( 6, locat + 1 ) = shape( 2, inode )
          bmatx( 6, locat + 2 ) = shape( 1, inode )
        END DO
        IF( nlinc .NE. 0 ) THEN
          const = 0.5D0 * iswth
          CALL AMat300(  amatx, shape )
          CALL GMat300(  gmatx, shape, nnode )
          CALL AGmat300( amatx, agmat, gmatx, ndofe )
          DO istre = 1, 6
            DO idofe = 1, ndofe
              bmatx( istre, idofe ) = bmatx( istre, idofe ) +                  &
              agmat( istre, idofe ) * const
            END DO
          END DO
        END IF
        RETURN
        END

        SUBROUTINE DMat300( dmatx, imats, corep, xloca, yloca,                 &
                            ielem, igeob, imatb, iswth )
        USE CtrlData
        USE MeshData
        IMPLICIT DOUBLE PRECISION ( a-h , o-z )
        DIMENSION dmatx( 6, 6 ), corep( 3, 8 )

        IF( iswth .EQ. 0 ) pcons = 0.0D0
        IF( iswth .NE. 0 ) pcons = 1.0D3

        DO istre = 1, 6
          DO jstre = 1, 6
            dmatx( istre, jstre ) = 0.0D0
          END DO
        END DO

        qmt11 = props(  2, imatb )
        qmt22 = props(  3, imatb )
        qmt33 = props(  4, imatb )
        qmt12 = props(  5, imatb )
        qmt23 = props(  6, imatb )
        qmt13 = props(  7, imatb )
        qmt44 = props(  8, imatb )
        qmt55 = props(  9, imatb )
        qmt66 = props( 10, imatb )
        imtyp = props( 16, imatb ) + 0.5D0
        ietyp = props(  2, igeob ) + 0.5D0
        IF( imtyp .EQ. 1 .OR. qmt33 .LT. 1.0D-10 ) THEN
          IF( imtyp .EQ. 1 ) THEN
            CALL Vsel300( imatb, elast, shear, poiss, vnorm )
          ELSE IF( qmt33 .LT. 1.0D-20 ) THEN
            elast = qmt11
            poiss = qmt22
            vnorm = elast
            shear = elast / ( 1.0D0 + poiss ) / 2.0D0
          END IF
          IF( ietyp .EQ. 0 ) THEN
            const = 2.0D0 * shear / ( 1.0D0 - 2.0D0 * poiss )
            qmt11 = ( 1.0D0 - poiss ) * const
            qmt22 = ( 1.0D0 - poiss ) * const
            qmt33 = ( 1.0D0 - poiss ) * const
            qmt12 = poiss * const
            qmt13 = poiss * const
            qmt23 = poiss * const
            qmt44 = shear
            qmt55 = shear
            qmt66 = shear
          ELSE IF( ietyp .EQ. 1 .OR. ietyp .EQ. 2 ) THEN
            qmt11 = elast / ( 1.0D0 - poiss * poiss )
            qmt22 = elast / ( 1.0D0 - poiss * poiss )
            qmt33 = vnorm * pcons
            qmt12 = elast * poiss / ( 1.0D0 - poiss * poiss )
            qmt13 = 0.0D0
            qmt23 = 0.0D0
            qmt44 = shear
            qmt55 = shear
            qmt66 = shear
          ELSE IF( ietyp .EQ. 3 .OR. ietyp .EQ. 4 ) THEN
            qmt11 = elast
            qmt22 = vnorm * pcons
            qmt33 = vnorm * pcons
            qmt12 = 0.0D0
            qmt13 = 0.0D0
            qmt23 = 0.0D0
            qmt44 = shear
            qmt55 = shear
            qmt66 = shear
          ELSE IF( ietyp .EQ. 5 ) THEN
            qmt11 = elast
            qmt22 = elast * pcons
            qmt33 = elast * pcons
            qmt12 = 0.0D0
            qmt13 = 0.0D0
            qmt23 = 0.0D0
            qmt44 = 0.0D0
            qmt55 = 0.0D0
            qmt66 = 0.0D0
          END IF
        END IF

        IF( ietyp .EQ. 2 ) THEN
          qmt44 = qmt44 * pcons
          qmt55 = qmt55 * pcons
        ELSE IF( ietyp .EQ. 4 ) THEN
          qmt55 = qmt55 * pcons
          qmt66 = qmt66 * pcons
        END IF

        dmatx( 1, 1 ) = qmt11
        dmatx( 2, 2 ) = qmt22
        dmatx( 3, 3 ) = qmt33
        dmatx( 1, 2 ) = qmt12
        dmatx( 2, 1 ) = qmt12
        dmatx( 2, 3 ) = qmt23
        dmatx( 3, 2 ) = qmt23
        dmatx( 1, 3 ) = qmt13
        dmatx( 3, 1 ) = qmt13
        dmatx( 4, 4 ) = qmt44
        dmatx( 5, 5 ) = qmt55
        dmatx( 6, 6 ) = qmt66
        IF( ietyp .EQ. 0 ) RETURN
        CALL Trans300( dmatx, corep, xloca, yloca, ielem )
        RETURN
        END

        SUBROUTINE Trans300( dmatx, corep, xloca, yloca, ielem )
        IMPLICIT DOUBLE PRECISION( a-h, o-z )

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -