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

📄 print.f90

📁 边界元程序,供力学工作者参考,希望对大家有所帮助
💻 F90
📖 第 1 页 / 共 2 页
字号:
        SUBROUTINE PrntDsp( ipbeg, ipend, ipstp, iswth )
!........
!       模块功能
!           打印节点位移.
!........
        USE CtrlData
        USE GlobData
        USE EarthQuake
        USE ExtraMesh
        IMPLICIT DOUBLE PRECISION( a-h, o-z )
        DIMENSION vprin( 100 )

        IF( nerrc .GT. 0 ) RETURN
        IF( ipend .EQ. 0 ) ipend = ipbeg
        IF( ipbeg .EQ. 0 ) ipbeg = 1
        IF( ipstp .EQ. 0 ) ipstp = 1
        IF( ipend .EQ. 0 ) ipend = npoin

        IF( iswth .EQ. 0 ) THEN
          WRITE( 12, 2000 ) kload, timec, fctor
          DO ipoin = ipbeg, ipend, ipstp
            DO idofn = 1, mdofn
              idofs = ( ipoin - 1 ) * mdofn + idofn
              vprin( idofn ) = disps( idofs, kload )
            END DO
            WRITE( 12, 2200 ) ipoin, ( vprin( idofn ),                         &
                                   idofn = 1, mdofn )
          END DO
          IF( ( ipend - ipbeg ) / ipstp + 1 .EQ. npoin ) THEN
            DO inodx = 1, nnodx
              ipoin = inodx + npoin
              DO idofn = 1, mdofn
                idofx = ( inodx - 1 ) * mdofn + idofn
                vprin( idofn ) = dispx( idofx, kload )
              END DO
              WRITE( 12, 2200 ) ipoin, ( vprin( idofn ),                       &
                                     idofn = 1, mdofn )
            END DO
          END IF
        ELSE IF( iswth .EQ. 1 ) THEN
          WRITE( 12, 2001 ) kload, timec, fctor
          DO ipoin = ipbeg, ipend, ipstp
            DO idofn = 1, mdofn
              idofs = ( ipoin - 1 ) * mdofn + idofn
              vprin( idofn ) = veloc( idofs, kload )
            END DO
            WRITE( 12, 2200 ) ipoin, ( vprin( idofn ),                         &
                                   idofn = 1, mdofn )
          END DO
        ELSE IF( iswth .EQ. 2 ) THEN
          WRITE( 12, 2002 ) kload, timec, fctor
          DO ipoin = ipbeg, ipend, ipstp
            DO idofn = 1, mdofn
              idofs = ( ipoin - 1 ) * mdofn + idofn
              vprin( idofn ) = accel( idofs, kload )
            END DO
            IF( nearc .EQ. 1 ) THEN
              DO idofn = 1, mdofn
                vprin( idofn ) = vprin( idofn ) +                              &
                ampeq( idofn ) * acurp
              END DO
            END IF
            WRITE( 12, 2200 ) ipoin, ( vprin( idofn ),                         &
                                   idofn = 1, mdofn )
          END DO
        ELSE IF( iswth .EQ. 3 ) THEN
          WRITE( 12, 2003 ) kload, timec, fctor
          DO ipoin = ipbeg, ipend, ipstp
            idofs = ( ipoin - 1 ) * mdofn + 1
            jdofs = ipoin * mdofn
            WRITE( 12, 2200 ) ipoin, (-react( kdofs ),                         &
                              kdofs  = idofs, jdofs )
          END DO
        END IF
2000    FORMAT( //2x, 60('=')//2x, '节点位移(工况', I2, ')', 5x,               &
                '时间', E15.5, 2x, '载荷因子', E15.5 //2x, 60('=')// )
2001    FORMAT( //2x, 60('=')//2x, '节点速度(工况', I2, ')', 5x,               &
                '时间', E15.5, 2x, '载荷因子', E15.5 //2x, 60('=')// )
2002    FORMAT( //2x, 60('=')//2x, '节点加速度(工况', I2, ')', 5x,             &
                '时间', E15.5, 2x, '载荷因子', E15.5 //2x, 60('=')// )
2003    FORMAT( //2x, 60('=')//2x, '节点反力(工况', I2, ')', 5x,               &
                '时间', E15.5, 2x, '载荷因子', E15.5 //2x, 60('=')// )
2200    FORMAT( 2X, I5, 4E15.6 / ( 7X, 4E15.6 ) )
        RETURN
        END

        SUBROUTINE PrntStrs( npar1, npar2, npar3 )
        USE CtrlData
        USE GlobData
        USE MeshData
        USE ExtraMesh
        DO ipoin = npoin, 1, -1
          jpoin = llnks( ipoin )
          IF( strss( 7, ipoin ) .GT. 1.0D-16 ) THEN
            IF( jpoin .NE. ipoin ) THEN
              DO istrs = 1, 7
                strss( istrs, jpoin ) = strss( istrs, jpoin ) +                &
                                        strss( istrs, ipoin )
                strns( istrs, jpoin ) = strns( istrs, jpoin ) +                &
                                        strns( istrs, ipoin )
              END DO
            ELSE
              DO istrs = 1, 6
                strss( istrs, ipoin ) = strss( istrs, ipoin ) /                &
                                        strss(     7, ipoin )
                strns( istrs, ipoin ) = strns( istrs, ipoin ) /                &
                                        strns(     7, ipoin )
              END DO
            END IF
          END IF
        END DO
        DO ipoin = 1, npoin
          jpoin = llnks( ipoin )
          IF( ipoin .NE. jpoin ) THEN
            DO istrs = 1, 7
              strss( istrs, ipoin ) = strss( istrs, jpoin )
              strns( istrs, ipoin ) = strns( istrs, jpoin )
            END DO
          END IF
        END DO
        DO inodx = 1, nnodx
          IF( strsx( 7, inodx ) .GT. 1.0D-8 ) THEN
            DO istrs = 1, 6
              strsx( istrs, inodx ) = strsx( istrs, inodx ) /                  &
                                      strsx(     7, inodx )
              strnx( istrs, inodx ) = strnx( istrs, inodx ) /                  &
                                      strnx(     7, inodx )
            END DO
          END IF
        END DO
        WRITE( 12, 2000 )
        DO ipoin = npar1, npar2, npar3
          WRITE( 12, 2200 ) ipoin, ( strss( istrs, ipoin ),                    &
                            istrs = 1, 6 )
        END DO
        IF( ( npar2 - npar1 ) / npar3 + 1 .EQ. npoin ) THEN
          DO inodx = 1, nnodx
            ipoin = inodx + npoin
            WRITE( 12, 2200 ) ipoin, ( strsx( istrs, inodx ),                  &
                              istrs = 1, 6 )
            WRITE( 12, 2400 ) ( strnx( istrs, inodx ), istrs = 1, 6 )
          END DO
        END IF
2000    FORMAT( /// 10x, ' 节 点 应 力 '  //                                   &
                         ' Sigma-x  Sigma-y  Sigma-z  Tao-yz  ',               &
                         ' Tao-zx  Tao-xy' /                                   &
                         ' Epson-x  Epson-y  Epson-z  Gama-yz ',               &
                         ' Gama-zx  Gama-xy' )
2200    FORMAT( I5, 6E15.5 )
2400    FORMAT( 5X, 6E15.5 )
        RETURN
        END

        SUBROUTINE PrntPlt( iswth, ndofo )
!........
!       模块功能
!           输出图形数据文件.
!........
        USE CtrlData
        USE MeshData
        USE GlobData
        USE ExtraMesh
        IMPLICIT DOUBLE PRECISION( a-h, o-z )
        DIMENSION point( 6 ), lfixn( 6 ), ldofc( 6 )

        DO idime = 1, 6
          point( idime ) = 0.0D0
          ldofc( idime ) = idime
          IF( idime .GT. mdofn ) ldofc( idime ) = 0
        END DO
        DO idofn = 1, 6
          lfixn( idofn ) = 0
        END DO

        IF( ndofo .GT. 0 ) THEN
          nwork = 4
          nswth = 10
          IF( iswth .EQ. 0 ) nwork = 6
          IF( mdofn .GE. 10 ) nswth = 100
          DO idime = 1, nwork
            jdime = nwork - idime
            ldofc( idime ) = ndofo / nswth ** jdime
            ndofo = ndofo - ldofc( idime ) * nswth ** jdime
            IF( ldofc( idime ) .GT. mdofn ) nerrc = 24325
            IF( ldofc( idime ) .LT. 0 ) nerrc = 32435
          END DO
          IF( nerrc .GT. 0 ) RETURN
        END IF

        IF( iswth .EQ. 0 ) THEN
          DO ipoin = 1, npoin
            DO idime = 1, ndime
              point( idime ) = coord( idime, ipoin )
            END DO
            DO idofn = 1, 6
              lfixn( idofn ) = 0
              jdofn = ldofc( idofn )
              IF( jdofn .LT. mdofn .AND. jdofn .GT. 0 ) THEN
			    lfixn( idofn ) = lfixs( jdofn, ipoin )
              END IF
            END DO
            WRITE( 15, 2000 ) ipoin, lfixn, ( point( idime ),                  &
                              idime = 1, 3 )
          END DO

          DO idofn = 1, 6
            lfixn( idofn ) = 0
          END DO
          DO inodx = 1, nnodx
            ipoin = npoin + inodx
            DO idime = 1, ndime
              point( idime ) = coorx( idime, inodx )
            END DO
            WRITE( 15, 2000 ) ipoin, lfixn, ( point( idime ),                  &
                              idime = 1, 3 )
          END DO
          WRITE( 15, 2000 ) 0
          DO ielem = 1, nelem
            CALL ElmOpt( ielem, 9 )
          END DO
          WRITE( 15, 2000 ) 0
        ELSE IF( iswth .EQ. 1 ) THEN
          kmode = 1
          IF( ntypc .EQ. 1 ) kmode = nmode
          IF( ntypc .EQ. 3 ) kmode = nmode + 1
          DO imode = 1, kmode
            ctime = timec
            kpdis = kpdis + 1
            IF( ntypc .EQ. 1 ) THEN
              ctime = freqs( imode )
            ELSE IF( ntypc .EQ. 3 ) THEN
              IF( imode .EQ. 1 ) ctime = 0.0D0
              IF( imode .GT. 1 ) ctime = freqs( imode - 1 )
            END IF
            WRITE( 16, 2400 ) kpdis, ctime
            DO ipoin = 1, npoin
              DO idofn = 1, 4
                jdofn = ldofc( idofn )
                IF( jdofn .GT. 0 ) THEN
                  idofs = ( ipoin - 1 ) * mdofn + jdofn
                  IF( ntypc .EQ. 1 ) THEN
                    point( idofn ) = shmod( idofs, imode )
                  ELSE IF( ntypc .EQ. 3 ) THEN
                    IF( imode .EQ. 1 ) THEN
                      point( idofn ) = disps( idofs, kload )
                    ELSE
                      point( idofn ) = shmod( idofs, imode - 1 )
                    END IF
                  ELSE
                    point( idofn ) = disps( idofs, kload )
                  END IF
                ELSE
                  point( idofn ) = 0.0D0
                END IF
                IF( DABS( point( idofn ) ) .LT. 1.0D-10 )                      &
                          point( idofn ) = 0.0D0
              END DO
              WRITE( 16, 2400 ) ipoin, ( point( idime ), idime = 1, 4 )
            END DO
            DO inodx = 1, nnodx
              DO idofn = 1, 4
                jdofn = ldofc( idofn )
                IF( jdofn .GT. 0 ) THEN
                  idofx = ( inodx - 1 ) * mdofn + jdofn
                  IF( ntypc .EQ. 1 ) THEN
                    point( idofn ) = smodx( idofx, imode )
                  ELSE IF( ntypc .EQ. 3 ) THEN
                    IF( imode .EQ. 1 ) THEN
                      point( idofn ) = dispx( idofx, kload )
                    ELSE
                      point( idofn ) = smodx( idofx, imode - 1 )
                    END IF
                  ELSE
                    point( idofn ) = dispx( idofx, kload )
                  END IF
                ELSE
                  point( idofn ) = 0.0D0
                END IF
                IF( DABS( point( idofn ) ) .LT. 1.0D-16 )                      &
                          point( idofn ) = 0.0D0
              END DO
              WRITE( 16, 2400 ) inodx + npoin,                                 &
			       ( point( idime ), idime = 1, 4 )
            END DO
            WRITE( 16, 2000 ) 0
          END DO
        ELSE IF( iswth .EQ. 2 ) THEN
          kpstr = kpstr + 1
          WRITE( 17, 2400 ) kpstr, timec
          WRITE( 23, 2400 ) kpstr, timec
          DO ipoin = 1, npoin
            WRITE( 17, 2600 ) ipoin, ( strss( istrs, ipoin ),                  &
                                       istrs = 1, 6 )
            WRITE( 23, 2600 ) ipoin, ( strns( istrs, ipoin ),                  &
                                       istrs = 1, 6 )
          END DO
          DO inodx = 1, nnodx
            WRITE( 17, 2600 ) inodx + npoin, ( strsx( istrs, inodx ),          &
                                               istrs = 1, 6 )
            WRITE( 23, 2600 ) inodx + npoin, ( strnx( istrs, inodx ),          &
                                               istrs = 1, 6 )
          END DO
          WRITE( 17, 2600 ) 0
          WRITE( 23, 2600 ) 0
        END IF
2000    FORMAT( I5, 1X, 6I1, 2X, 3F15.5 )
2400    FORMAT( I5, 1X, 4E15.5 )
2600    FORMAT( I5, 1X, 6E15.5 )
        RETURN
        END

        SUBROUTINE PrntStat
        USE CtrlData
        USE GlobData
        nstat = nstat + 1
        WRITE( 12, 2000 ) timec
        WRITE( 12, 2200 ) ( ielem, lstat( ielem ), ielem = 1, nelem )
        WRITE( 12, 2200 ) 0
2000    FORMAT( //15x, '时间', F15.5, ',单元状态' // )
2200    FORMAT( 4( 2I5, 5X ) )
        RETURN
        END

        SUBROUTINE PlotStat
        USE CtrlData
        USE GlobData
        nstat = nstat + 1
        WRITE( 20, 2000 ) nstat, timec
        WRITE( 20, 2200 ) ( ielem, lstat( ielem ), ielem = 1, nelem )
        WRITE( 20, 2200 ) 0
2000    FORMAT( I5, F15.5 )
2200    FORMAT( 4( 2I5, 5X ) )
        RETURN
        END

        SUBROUTINE linkNode
        USE CtrlData
        USE GlobData
        USE SolvData
        USE MeshData
        IMPLICIT DOUBLE PRECISION( a-h, o-z )
!.......处理连接点
        DO ipoin = 1, npoin
          jpoin = llnks( ipoin )
          IF( ipoin .NE. jpoin ) THEN
            DO idofn = 1, mdofn
              idofs = ( ipoin - 1 ) * mdofn + idofn
              jdofs = ( jpoin - 1 ) * mdofn + idofn
              vslvs( idofs ) = vslvs( jdofs )
            END DO
          END IF
        END DO
        RETURN
        END

        SUBROUTINE Exchang( iswth )
!........
!       S U B R O U T I N E
!         To get displacement or accelerate from force( the right hand )
!........
        USE CtrlData
        USE GlobData
        USE SolvData
        USE MeshData
        IMPLICIT DOUBLE PRECISION( a-h, o-z )

        IF( iswth .EQ. 1 ) THEN
          dtolc = 0.0D0
          dmaxp = 0.0D0
!.........迭代步位移累加, 计算相对误差.
          IF( nincc .EQ. 2 ) THEN
            DO idofs = 1, ndofs
              vslvs( idofs ) = vslvs( idofs ) + disps( idofs, kload )
            END DO
          ELSE IF( nincc .EQ. 3 ) THEN
            DO idofs = 1, ndofs
              vslvs( idofs ) = vslvs( idofs ) + distm( idofs, kload )
            END DO
          END IF

          DO idofs = 1, ndofs
            disps( idofs, kload ) = vslvs( idofs )
          END DO

          IF( ntypc .EQ. 2 ) CALL DynSlv
          CALL Limit

		  idofs = 0
		  DO ipoin = 1, npoin
		    DO idofn = 1, mdofn
			  idofs = idofs + 1
              fwdof = wdofs( idofn )
              ftotl = disps( idofs, kload )
              fincr = disps( idofs, kload ) - dspis( idofs, kload )
              dtolc = dtolc + fincr * fincr * fwdof
              dmaxp = dmaxp + ftotl * ftotl * fwdof
            END DO
          END DO
          IF( dmaxp .LT. 1.0D-20 ) dtolc = DSQRT( dtolc )
          IF( dmaxp .GE. 1.0D-20 ) dtolc = DSQRT( dtolc / dmaxp )
        ELSE IF( iswth .EQ. 2 ) THEN
          DO idofs = 1, ndofs
            accel( idofs, kload ) = vslvs( idofs )
          END DO
        END IF
        RETURN
        END

        SUBROUTINE Trace( iswth, ipoin, idofn )
        USE CtrlData
        USE GlobData
        USE EarthQuake
        IMPLICIT DOUBLE PRECISION( a-h, o-z )
        CHARACTER * 256 filen

        jpoin = ipoin
        jdofn = idofn
        IF( ipoin .LE. 0 ) jpoin = npoin
        IF( ipoin .LE. 0 ) ipoin = 1
        IF( iswth .LE. 3 ) THEN
          IF( idofn .LE. 0 ) jdofn = mdofn

⌨️ 快捷键说明

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