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

📄 elmt400.f90

📁 边界元程序,供力学工作者参考,希望对大家有所帮助
💻 F90
字号:
        SUBROUTINE Elmt400( ielem, imats, iswth, iuses )
!.......
!       模块功能
!           4-8节点弹性地基单元(两参数Winkler地基模型).
!.......
        USE CtrlData
        USE MeshData
        USE ElmtData
        USE GlobData
        USE FactorData
        IMPLICIT DOUBLE PRECISION( a-h, o-z )
        DIMENSION vnorm( 3 )
        DIMENSION pygas( 6 ), wygas( 6 ), crden( 2, 8 )
        DIMENSION pxgas( 6 ), wxgas( 6 ), shape( 3, 8 )

        IF( iswth .EQ. 0 ) THEN
          CALL RdMat400( imats )
          RETURN
        ELSE IF( iswth .EQ. 8 ) THEN
          nnode = 8
          ndofn = ndime
          RETURN
        ELSE IF( iswth .EQ. 9 ) THEN
          knode = MIN0( nnode, 8 )
          IF( iuses .EQ. 0 ) RETURN
          WRITE( 15, 2000 ) 4, ielem, imats, knode,                            &
                ( lnode( inode ), inode = 1, knode )
          RETURN
        ELSE IF( iswth .EQ. 21 ) THEN
          WRITE( 25 ) 0
          RETURN
        END IF

        iflag = 2
        mdime = 2
        epara = props( 2, imats )
        spara = props( 3, imats )
        nxgas = props( 7, imats ) + 0.5D0
        nygas = props( 8, imats ) + 0.5D0
        vnorm( 1 ) = props( 4, imats )
        vnorm( 2 ) = props( 5, imats )
        vnorm( 3 ) = props( 6, imats )

        CALL Trans400( crden, vnorm )
        CALL Gauss( pxgas, wxgas, nxgas, nerrc )
        CALL Gauss( pygas, wygas, nygas, nerrc )
        IF( nerrc .GT. 0 ) RETURN

        DO idofe = 1, ndofe
          DO jdofe = 1, ndofe
            stife( idofe, jdofe ) = 0.0D0
          END DO
          force( idofe ) = 0.0D0
        END DO
        IF( iuses .EQ. 0 ) RETURN

        IF( iswth .EQ. 1 .OR. iswth .EQ. 5 .OR. iswth .EQ. 10 ) THEN
!.........计算单元刚度矩阵.
          DO ixgas = 1, nxgas
            DO iygas = 1, nygas
              xloca = pxgas( ixgas )
              yloca = pygas( iygas )
              CALL Shap2D( shape, crden, xloca, yloca, lnode, xjaco,           &
                           mdime, mdime, nnode, ielem, iflag, nerrc )
              IF( nerrc .GT. 0 ) RETURN
              dvolu = wxgas( ixgas ) * wygas( iygas ) * xjaco
              DO inode = 1, nnode
                DO jnode = 1, nnode
                  const = epara * shape(3, inode) * shape(3, jnode) +          &
                          spara * shape(1, inode) * shape(1, jnode) +          &
                          spara * shape(2, inode) * shape(2, jnode)
                  DO idofn = 1, ndofn
                    DO jdofn = 1, ndofn
                      iloca = ( inode - 1 ) * ndofn + idofn
                      jloca = ( jnode - 1 ) * ndofn + jdofn
                      stife( iloca, jloca ) = stife( iloca, jloca ) +          &
                      vnorm( idofn ) * vnorm( jdofn ) * const * dvolu
                    END DO
                  END DO
                END DO
              END DO
            END DO
          END DO
!.........计算内力等效节点力
          IF( nincc .EQ. 2 .OR. iswth .EQ. 10 ) THEN
            DO idofe = 1, ndofe
              DO jdofe = 1, ndofe
                force( idofe        ) = force( idofe ) -                       &
                stife( idofe, jdofe ) * dispe( jdofe )
              END DO
            END DO
          END IF
        ELSE IF( iswth .EQ. 2 ) THEN
        ELSE IF( iswth .EQ. 3 ) THEN
        ELSE IF( iswth .EQ. 4 ) THEN
        ELSE IF( iswth .EQ. 5 ) THEN
        ELSE IF( iswth .EQ. 6 ) THEN
        ELSE IF( MOD( iswth, mswth ) .EQ. 7 ) THEN
        END IF
2000    FORMAT( 20I5 )
2200    FORMAT( /' 致命错误:单元', I5, '为不可压缩材料' /                     &
                 '           单元类型20-24只适用可压缩材料!' )
3800    FORMAT( /20x, ' 单  元 ', i5                                           &
                / 7x, 'x', 10x, 'y', 10x,                                      &
                                   'S-xx', 10x, 'S-yy', 10x, 'S-zz'            &
                / 5x, 'z(h)', 20x, 'S-yz', 10x, 'S-zx', 10x, 'S-xy ' )
        RETURN
        END

        SUBROUTINE RdMat400( imats )
        USE CtrlData
        USE MeshData
        IMPLICIT DOUBLE PRECISION( a-h, o-z )

        IF( nprop .LT. 8 ) THEN
          WRITE( 12, 2000 ) 8
          nerrc = 56450
          RETURN
        END IF
        READ( 11, 2200 ) epara, spara, xnorm, ynorm, znorm,                    &
                         nxgas, nygas
        vnorm = xnorm * xnorm + ynorm * ynorm + znorm * znorm
        xnorm = xnorm / DSQRT( vnorm )
        ynorm = ynorm / DSQRT( vnorm )
        znorm = znorm / DSQRT( vnorm )
        IF( nxgas .LE. 0 ) nxgas = 3
        IF( nygas .LE. 0 ) nxgas = nxgas
        props( 2, imats ) = epara
        props( 3, imats ) = spara
        props( 4, imats ) = xnorm
        props( 5, imats ) = ynorm
        props( 6, imats ) = znorm
        props( 7, imats ) = nxgas
        props( 8, imats ) = nygas

        IF( nprnc .NE. 0 ) THEN
          WRITE( 12, 2400 )
          WRITE( 12, 2600 ) epara, spara, nxgas, nygas,                        &
                            xnorm, ynorm, znorm
        END IF
2000    FORMAT( 2x, "致命错误:材料参数数目至少为", I5 )
2200    FORMAT( 4E15.5 / E15.5, 2I5 )
2400    FORMAT( 2x, "单元类型:   文克尔地基单元" )
2600    FORMAT( 2x, '基床系数:', E15.5/2x, '剪切模量:', E15.5 /                &
                2x, 'x-高斯点:', I15  /2x, 'y-高斯点:', I15 /                  &
                2x, '法向矢量:', 5x, 3F10.5 )
        RETURN
        END

        SUBROUTINE Trans400( crden, vnorm )
        USE CtrlData
        USE ElmtData
        IMPLICIT DOUBLE PRECISION( a-h, o-z )
        DIMENSION crden( 2, 8 ), vnorm( 3 )
        DIMENSION fwork( 3, 8 ), vaxis( 3, 2 )

        IF( ndime .EQ. 2 ) THEN
          DO inode = 1, nnode
            DO idime = 1, ndime
              crden( idime, inode ) = coren( idime, inode )
            END DO
          END DO
        ELSE
          DO inode = 1, nnode
            DO idime = 1, ndime
              fwork( idime, inode ) = coren( idime, inode ) -                  &
              coren( idime,     1 )
            END DO
          END DO
          xaxis = fwork( 1, 2 ) * vnorm( 1 ) +                                 &
                  fwork( 2, 2 ) * vnorm( 2 ) +                                 &
                  fwork( 3, 2 ) * vnorm( 3 )
          vaxis( 1, 1 ) = fwork( 1, 2 ) - xaxis * vnorm( 1 )
          vaxis( 2, 1 ) = fwork( 2, 2 ) - xaxis * vnorm( 2 )
          vaxis( 3, 1 ) = fwork( 3, 2 ) - xaxis * vnorm( 3 )
          xaxis = DSQRT( vaxis( 1, 1 ) * vaxis( 1, 1 ) +                       &
                         vaxis( 2, 1 ) * vaxis( 2, 1 ) +                       &
                         vaxis( 3, 1 ) * vaxis( 3, 1 ) )
          vaxis( 1, 1 ) = vaxis( 1, 1 ) / xaxis
          vaxis( 2, 1 ) = vaxis( 2, 1 ) / xaxis
          vaxis( 3, 1 ) = vaxis( 3, 1 ) / xaxis
          vaxis( 1, 2 ) = vnorm( 2 ) * vaxis( 3, 1 ) -                         &
                          vnorm( 3 ) * vaxis( 2, 1 )
          vaxis( 2, 2 ) = vnorm( 3 ) * vaxis( 1, 1 ) -                         &
                          vnorm( 1 ) * vaxis( 3, 1 )
          vaxis( 3, 2 ) = vnorm( 1 ) * vaxis( 2, 1 ) -                         &
                          vnorm( 2 ) * vaxis( 1, 1 )
          yaxis = DSQRT( vaxis( 1, 2 ) * vaxis( 1, 2 ) +                       &
                         vaxis( 2, 2 ) * vaxis( 2, 2 ) +                       &
                         vaxis( 3, 2 ) * vaxis( 3, 2 ) )
          vaxis( 1, 2 ) = vaxis( 1, 2 ) / yaxis
          vaxis( 2, 2 ) = vaxis( 2, 2 ) / yaxis
          vaxis( 3, 2 ) = vaxis( 3, 2 ) / yaxis
          DO inode = 1, nnode
            crden( 1, inode ) = 0.0D0
            crden( 2, inode ) = 0.0D0
            DO idime = 1, ndime
              crden( 1, inode ) = crden(     1, inode ) +                      &
              vaxis( idime, 1 ) * coren( idime, inode )
              crden( 2, inode ) = crden(     2, inode ) +                      &
              vaxis( idime, 2 ) * coren( idime, inode )
            END DO
          END DO
        END IF
        RETURN
        END

⌨️ 快捷键说明

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