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

📄 execute.f90

📁 边界元程序,供力学工作者参考,希望对大家有所帮助
💻 F90
📖 第 1 页 / 共 3 页
字号:
        END IF
        RETURN
2000    FORMAT( '第', I5, '节点第', I2, '自由度位移为', G15.6 )
2200    FORMAT( '第', I5, '节点第', I2, '自由度速度为', G15.6 )
2400    FORMAT( '第', I5, '节点第', I2, '自由度加速度为', G15.6 )
2600    FORMAT( '当步时间为:', G15.6 )
2800    FORMAT( '载荷因子为:', G15.6 )
3000    FORMAT( '位移增量二模', E15.6, ',内力残差二模', E15.6 )
8000    FORMAT( //2x, '致命错误: 没有开发的宏命令', I5 )
        END

        SUBROUTINE Exec120
!........
!       模块功能
!           本模块负责执行命令编号在81-120之间的各条宏命令.
!........
        USE CtrlData
        USE MeshData
        USE CentData
        USE LoadData
        USE GlobData
        USE MacroData
        USE FactorData
        USE EarthQuake
        IMPLICIT DOUBLE PRECISION( a-h, o-z )

        ncomm = lmacr( 1, kmacr )
        para1 = pmacr( 1, kmacr )
        para2 = pmacr( 2, kmacr )
        para3 = pmacr( 3, kmacr )
        para4 = pmacr( 4, kmacr )
        para5 = pmacr( 5, kmacr )
        npar1 = pmacr( 1, kmacr ) + 0.5D0
        npar2 = pmacr( 2, kmacr ) + 0.5D0
        npar3 = pmacr( 3, kmacr ) + 0.5D0
        npar4 = pmacr( 4, kmacr ) + 0.5D0
        npar5 = pmacr( 5, kmacr ) + 0.5D0
        SELECT CASE( ncomm )
          CASE( 81 )
!...........宏命令timestep
            kmacr = lmacr( 2, kmacr )
            tstep = para1
          CASE( 82 )
!...........宏命令loadcase
            kload = npar1
            CALL ShowPhase( kload )
            kmacr = lmacr( 2, kmacr )
          CASE( 83 )
!...........宏命令nextload
            kload = kload + 1
            CALL ShowPhase( kload )
            kmacr = lmacr( 2, kmacr )
          CASE( 84 )
!...........宏命令alpha
            kmacr = lmacr( 2, kmacr )
            alpha = para1
          CASE( 85 )
!...........宏命令belta
            kmacr = lmacr( 2, kmacr )
            belta = para1
          CASE( 86 )
!...........宏命令theta
            kmacr = lmacr( 2, kmacr )
            theta = para1
          CASE( 87 )
!...........宏命令dispstep
            kmacr = lmacr( 2, kmacr )
            dstep = para1
          CASE( 88 )
!...........宏命令lockdof
            kmacr = lmacr( 2, kmacr )
!            CALL LckDOF( npar2, kdofc, npar1 )
          CASE( 89 )
!...........宏命令lockpromp
            kmacr = lmacr( 2, kmacr )
            CALL LockPromp( npar1 )
          CASE( 90 )
!...........宏命令prompt
            kmacr = lmacr( 2, kmacr )
            CALL SetPromp( npar1, para2 )
          CASE( 91 )
!...........宏命令quake
            CALL ReadQuake
            kmacr = lmacr( 2, kmacr )
          CASE( 92 )
!...........宏命令normalize
            nuntc = 1
            kmacr = lmacr( 2, kmacr )
          CASE( 93 )
!...........宏命令lowlimit
            IF( npar1 .GT. mdofn ) nerrc = 35345
            IF( npar1 .LT. 0 ) nerrc = 35345
            IF( nerrc .GT. 0 ) RETURN
            llmts( 1, npar1 ) = 1
            kmacr = lmacr( 2, kmacr )
            vlmts( 1, npar1 ) = para2
          CASE( 94 )
!...........宏命令uplimit
            IF( npar1 .GT. mdofn ) nerrc = 35345
            IF( npar1 .LT. 0 ) nerrc = 35345
            IF( nerrc .GT. 0 ) RETURN
            llmts( 2, npar1 ) = 1
            kmacr = lmacr( 2, kmacr )
            vlmts( 2, npar1 ) = para2
          CASE( 95 )
!...........宏命令smooth
            IF( npar1 .GT. mdofn ) nerrc = 35345
            IF( npar1 .LE. 0 ) nerrc = 35345
            IF( nerrc .GT. 0 ) RETURN
            lsmts( npar1 ) = 1
            nsmts = 1
            kmacr = lmacr( 2, kmacr )
          CASE( 96 )
!...........宏命令construct
            kmacr = lmacr( 2, kmacr )
            CALL UpdateStructure
            IF( nerrc .NE. 0 ) RETURN
            IF( npar1 .EQ. 0 ) RETURN
            IF( npar3 .EQ. 0 ) npar3 = 1
            IF( npar2 .EQ. 0 ) npar2 = npar1
            DO ielem = npar1, npar2, npar3
              luses( ielem ) = 1
            END DO
          CASE( 97 )
!...........宏命令destruct
            kmacr = lmacr( 2, kmacr )
            CALL UpdateStructure
            IF( nerrc .NE. 0 ) RETURN
            IF( npar1 .EQ. 0 ) RETURN
            IF( npar3 .EQ. 0 ) npar3 = 1
            IF( npar2 .LE. 0 ) npar2 = npar1
            DO ielem = npar1, npar2, npar3
              luses( ielem ) = 0
              DO ipres = 1, nstrh
                strsh( ipres, ielem ) = 0.0D0
              END DO
            END DO
          CASE( 98 )
!...........宏命令free
            kmacr = lmacr( 2, kmacr )
            CALL UpdateStructure
            IF( nerrc .NE. 0 ) RETURN
            IF( npar2 .EQ. 0 ) RETURN
            IF( npar1 .LE. 0 .OR. npar1 .GT. mdofn ) RETURN
            IF( npar3 .EQ. 0 ) npar3 = npar2
            IF( npar4 .EQ. 0 ) npar4 = 1
            DO ipoin = npar2, npar3, npar4
              lfixs( npar1, ipoin ) = 0
            END DO
          CASE( 99 )
!...........宏命令fix
            kmacr = lmacr( 2, kmacr )
            CALL UpdateStructure
            IF( nerrc .NE. 0 ) RETURN
            IF( npar2 .EQ. 0 ) RETURN
            IF( npar1 .LE. 0 .OR. npar1 .GT. mdofn ) RETURN
            IF( npar3 .EQ. 0 ) npar3 = npar2
            IF( npar4 .EQ. 0 ) npar4 = 1
            DO ipoin = npar2, npar3, npar4
              lfixs( npar1, ipoin ) = 1
            END DO
          CASE( 100 )
!...........宏命令setmat
            kmacr = lmacr( 2, kmacr )
            CALL UpdateStructure
            IF( nerrc .NE. 0 ) RETURN
          CASE( 101 )
!...........宏命令time
            kmacr = lmacr( 2, kmacr )
            timec = para1
          CASE( 102 )
!...........宏命令DOFWeight
            kmacr = lmacr( 2, kmacr )
            IF( npar1 .GE. 1 .AND. npar1 .LE. mdofn ) THEN
			  wdofs( npar1 ) = para2
            ELSE
			  nerrc = 565677
			END IF
          CASE DEFAULT
            WRITE( 12, 8000 ) ncomm
            nerrc = 45496
        END SELECT
        RETURN
8000    FORMAT( //2x, '致命错误: 没有开发的宏命令', I5 )
        END

        SUBROUTINE Exec140
!........
!       模块功能
!           本模块负责执行命令编号在121-140之间的各条宏命令.
!........
        USE CtrlData
        USE MeshData
        USE CentData
        USE LoadData
        USE GlobData
        USE SolvData
        USE FrontData
        USE MacroData
        IMPLICIT DOUBLE PRECISION( a-h, o-z )

        ncomm = lmacr( 1, kmacr )
        para1 = pmacr( 1, kmacr )
        para2 = pmacr( 2, kmacr )
        para3 = pmacr( 3, kmacr )
        para4 = pmacr( 4, kmacr )
        para5 = pmacr( 5, kmacr )
        npar1 = pmacr( 1, kmacr ) + 0.5D0
        npar2 = pmacr( 2, kmacr ) + 0.5D0
        npar3 = pmacr( 3, kmacr ) + 0.5D0
        npar4 = pmacr( 4, kmacr ) + 0.5D0
        npar5 = pmacr( 5, kmacr ) + 0.5D0
        IF( ncomm .EQ. 121 ) THEN
!.........宏命令backup
          kmacr = lmacr( 2, kmacr )
          CALL Backup
        ELSE IF( ncomm .EQ. 122 ) THEN
!.........宏命令restore
          kmacr = lmacr( 2, kmacr )
          CALL Restore
        ELSE IF( ncomm .EQ. 123 ) THEN
          kmacr = lmacr( 2, kmacr )
          CALL SaveDisp
        ELSE IF( ncomm .EQ. 124 ) THEN
          kmacr = lmacr( 2, kmacr )
          CALL ReadDisp
        ELSE IF( ncomm .EQ. 125 ) THEN
          kmacr = lmacr( 2, kmacr )
          CALL SaveHistory()
        ELSE IF( ncomm .EQ. 126 ) THEN
          kmacr = lmacr( 2, kmacr )
          CALL ReadHistory()
        ELSE IF( ncomm .EQ. 127 ) THEN
          kmacr = lmacr( 2, kmacr )
          CALL ReadPrestress
        ELSE IF( ncomm .EQ. 128 ) THEN
!.........宏命令savepres
          kmacr = lmacr( 2, kmacr )
          CALL UpdateStructure
          CALL SaveAsPrestress
        ELSE
          WRITE( 12, 8000 ) ncomm
          nerrc = 45496
        END IF
        RETURN
8000    FORMAT( //2x, '致命错误: 没有开发的宏命令', I5 )
        END

        SUBROUTINE AddCnt( iswth )
        USE CtrlData
        USE CentData
        USE SolvData
        USE MeshData
        IMPLICIT DOUBLE PRECISION( a-h, o-z )

        IF( iswth .EQ. 1 ) THEN
          DO istfp = 1, nstfp
            ipoin = lstfp( 1, istfp )
            idofn = lstfp( 2, istfp )
            ipoin = llnks(    ipoin )
            idofs = ipoin * mdofn + idofn - mdofn
            diagk( idofs ) = diagk( idofs ) + vstfp( istfp )
          END DO
        ELSE IF( iswth .EQ. 2 ) THEN
          DO imssp = 1, nmssp
            ipoin = lmssp( 1, imssp )
            idofn = lmssp( 2, imssp )
            ipoin = llnks(    ipoin )
            idofs = ipoin * mdofn + idofn - mdofn
            diagm( idofs ) = diagm( idofs ) + vmssp( imssp )
          END DO
        ELSE IF( iswth .EQ. 3 ) THEN
          DO idmpp = 1, ndmpp
            ipoin = ldmpp( 1, idmpp )
            idofn = ldmpp( 2, idmpp )
            ipoin = llnks(    ipoin )
            idofs = ipoin * mdofn + idofn - mdofn
            diagd( idofs ) = diagd( idofs ) + vdmpp( idmpp )
          END DO
        END IF
        RETURN
        END

        SUBROUTINE Aitken( vslvs )
        USE CtrlData
        USE MeshData
        USE GlobData
        IMPLICIT DOUBLE PRECISION( a-h, o-z )
        DIMENSION vslvs( ndofs )
        kaitk = kaitk + 1
        IF( kaitk .EQ. 1 ) THEN
          DO idofs = 1, ndofs
            aitkn( idofs ) = vslvs( idofs )
          END DO
        ELSE IF( kaitk .EQ. 2 ) THEN
          kaitk = 0
          cnst1 = 0.0D0
          cnst2 = 0.0D0
          DO ipoin = 1, npoin
            DO idofn = 1, mdofn
              idofs = ipoin * mdofn - mdofn + idofn
              ifixs = lfixs( idofn, ipoin )
              IF( ifixs .EQ. 0 ) THEN
                const = aitkn( idofs ) - vslvs( idofs )
                cnst1 = cnst1 + const * const
                cnst2 = cnst2 + const * aitkn( idofs )
              END IF
            END DO
          END DO
          const = cnst2 / cnst1
          DO ipoin = 1, npoin
            DO idofn = 1, mdofn
              idofs = ipoin * mdofn - mdofn + idofn
              ifixs = lfixs( idofn, ipoin )
              IF( ifixs .EQ. 0 ) vslvs( idofs ) =                              &
                         const * vslvs( idofs )
            END DO
          END DO
        END IF
        RETURN
        END

        FUNCTION GetError()
        USE CtrlData
        USE GlobData
        USE SolvData
        IMPLICIT DOUBLE PRECISION( a-h, o-z )

		idofs = 0
        twrkc = 0.0D0
        dwrkc = 0.0D0
		DO ipoin = 1, npoin
		  DO idofn = 1, mdofn
		    idofs = idofs + 1
            twrkc = twrkc + forcs( idofs ) * disps( idofs, kload ) * wdofs( idofn )
            dwrkc = dwrkc + forcs( idofs ) * dspis( idofs, kload ) * wdofs( idofn )
          END DO
        END DO
        IF( DABS( twrkc ) + DABS( dwrkc ) .LT. 1.0D-10 ) THEN
          GetError = DABS( dwrkc - twrkc )
        ELSE IF( DABS( twrkc ) .LT. 1.0D-10 ) THEN
          GetError = DABS( ( twrkc - dwrkc ) / dwrkc )
        ELSE
          GetError = DABS( ( twrkc - dwrkc ) / twrkc )
        END IF
	    END

        SUBROUTINE BackSolveResult( iflag )
        USE CtrlData
        USE SolvData
		IMPLICIT DOUBLE PRECISION( a-h, o-z )
        IF( iflag .EQ. 1 ) THEN
          DO idofs = 1, ndofs
            vslvi( idofs ) = vslvs( idofs )
          END DO
        ELSE
          DO idofs = 1, ndofs
            vslvt( idofs ) = vslvi( idofs )
          END DO
        END IF
        END

⌨️ 快捷键说明

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