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

📄 vfeap.f90

📁 边界元程序,供力学工作者参考,希望对大家有所帮助
💻 F90
字号:
!       ================================================================
!                      通用结构分析程序——VFEAP v3.0
!           程序以中文Windows3.1和Fortran90(Fortran Power Station V4)
!       为平台, 采用波阵解法求解方程;采用波阵逆迭代法求解特征值问题. 求
!       解规模受内外存限制. 可调数组的使用使得内存空间得到充分利用, 动态
!       连接库的使用使得程序模块化, 宏命令有效地组织各种有限元算法. 浙江
!       大学岩土工程研究所凌道盛对本程序拥有所有权. 版权所有, 不得复制.
!       ================================================================
        INTEGER * 4 FUNCTION WinMain( hInstance, hPrevInstance, lpszCmdLine, nCmdShow )
        !DEC$ IF DEFINED(_X86_)
        !DEC$ ATTRIBUTES STDCALL, ALIAS : '_WinMain@16' :: WinMain
        !DEC$ ELSE
        !DEC$ ATTRIBUTES STDCALL, ALIAS : 'WinMain' :: WinMain
        !DEC$ END IF

        USE USEr32
        USE kernel32
        USE dflogm
        USE dfcom
        USE dfauto
        USE VFEAPGlobals

        IMPLICIT NONE

        INTEGER * 4 hInstance
        INTEGER * 4 hPrevInstance
        INTEGER * 4 lpszCmdLine
        INTEGER * 4 nCmdShow

        INCLUDE 'resource.fd'

        ! Variables
        TYPE (T_MSG)              mesg
        INTEGER * 4               ret
        LOGICAL * 4               lret

        gpSetRunFlag = 0
        ghInstance = hInstance
        ghModule = GetModuleHandle(NULL)
        ghInstVFEAPCom = LoadLibrary( "VFEAPCom.dll" )
		ret = GetLastError()

        ghWndMain = NULL
        CALL COMINITIALIZE(ret)
        lret = DlgInit(IDD_VFEAP_DIALOG, gdlg)

        IF( lret == .TRUE. ) THEN
          lret = DlgModeless( gdlg, nCmdShow )
          IF( lret == .TRUE. ) THEN
            ghWndMain = gDlg%hWnd
            CALL ShowMessage( '欢迎使用VFEAP...' )
            IF( gpSetRunFlag .EQ. 0 .AND. ghInstVFEAPCom .NE. 0 ) THEN
              gpSetRunFlag = GetProcAddress( ghInstVFEAPCom, "SetRunFlag"C )
            END IF
            IF( gpSetRunFlag .NE. 0 ) CALL SetRunFlag( 1 )
            CALL VFEAP
            IF( gpSetRunFlag .NE. 0 ) CALL SetRunFlag( 0 )
            IF( ghInstVFEAPCom .NE. 0 ) THEN
              lRet = FreeLibrary( ghInstVFEAPCom )
            END IF
		    CALL PostQuitMessage( 0 )
            DO WHILE( GetMessage( mesg, NULL, 0, 0 ) ) 
              IF( DlgIsDlgMessage(mesg) .EQV. .FALSE. ) THEN
                lret = TranslateMessage( mesg )
                ret  = DispatchMessage( mesg )
              END IF
            END DO
            CALL DlgUninit(gdlg)
            CALL COMUNINITIALIZE()
            WinMain = mesg.wParam
            RETURN
          END IF
        END IF
        ret = MessageBox( ghwndMain, "VFEAP初始化错误!"C, "错误"C, MB_OK )
        CALL COMUNINITIALIZE()
        WinMain = 0
        END

        SUBROUTINE VFEAP
        USE CtrlData
        USE MeshData
        USE CentData
        USE LoadData
        USE FrontData
        USE ResolveData
        USE AutoMeshData
        IMPLICIT DOUBLE PRECISION( a-h, o-z )

        nerrc = 0
        CALL RunTime( 1 )
        CALL OpenFile
        CALL InitCtrl
        CALL InitMesh
        CALL InitCent
        CALL InitLoad
        CALL InitFront
        CALL InitAutoMesh
        CALL InitReSolve
        CALL InitMemory

        CALL Input
        CALL Execute
        CALL ErrorMsg
        CALL RunTime( 2 )
        CALL CloseFile

        CALL DelMesh
        CALL DelCent
        CALL DelLoad
        CALL DelFront
        CALL DelReSolve
        CALL DelAutoMesh
        CALL DelCtrl
        RETURN
        END

        SUBROUTINE OpenFile
!........
!       模块功能
!           打开输入,输出文件,读入控制信息.
!........
        USE CtrlData
        USE FileData
        IMPLICIT DOUBLE PRECISION( a-h, o-z )
!.......
        CALL FileName
!.......打开文件.
        OPEN( 11, FILE = sdatf, STATUS = 'OLD' )
        OPEN( 12, FILE = soutf, STATUS = 'UNKNOWN' )
        OPEN( 13, FILE = smacf, STATUS = 'OLD' )
        OPEN( 14, FILE = sinif, STATUS = 'UNKNOWN' )
        OPEN( 15, FILE = smshf, STATUS = 'UNKNOWN' )
        OPEN( 16, FILE = sdisf, STATUS = 'UNKNOWN' )
        OPEN( 17, FILE = sstrf, STATUS = 'UNKNOWN' )
        OPEN( 18, FILE = ssavf, FORM   = 'UNFORMATTED' )
        OPEN( 19, FILE = sdsvf, FORM   = 'UNFORMATTED' )
        OPEN( 20, FILE = sstaf, STATUS = 'UNKNOWN' )
        OPEN( 21, FILE = shisf, STATUS = 'UNKNOWN' )
        OPEN( 22, FILE = spref, STATUS = 'UNKNOWN' )
        OPEN( 23, FILE = strnf, STATUS = 'UNKNOWN' )
        CALL ShowMessage( '读入网格数据...' )
        CALL ShowMessage( '读控制信息...' )
        WRITE( 12, 2000 )
        READ(  11, 2200 ) title
        WRITE( 12, 2400 ) title
        CALL ShowTitle( title )
        READ(  11, 2600 ) ntypc, npoin, nelem, ndime,                          &
                          mdofn, nmats, nload, nslnt
        READ(  11, 2600 ) mnode, nnodp, nnodg, nprop,                          &
                          mnodf, medgf, mplnf, nprnc
        READ(  11, 2600 ) nmssp, nstfp, ndmpp, nmode,                          &
                          nlnkc, nfmtc
        IF( ntypc .LE. 6 .AND. ntypc .GE. 0 ) THEN
          WRITE( 15, 2600 ) ntypc
          IF( nprnc .NE. 0 .AND. ntypc .EQ. 0 ) WRITE( 12, 2800 )
          IF( nprnc .NE. 0 .AND. ntypc .EQ. 1 ) WRITE( 12, 2801 )
          IF( nprnc .NE. 0 .AND. ntypc .EQ. 2 ) WRITE( 12, 2802 )
          IF( nprnc .NE. 0 .AND. ntypc .EQ. 3 ) WRITE( 12, 2803 )
          IF( nprnc .NE. 0 .AND. ntypc .EQ. 4 ) WRITE( 12, 2804 )
          IF( nprnc .NE. 0 .AND. ntypc .EQ. 5 ) WRITE( 12, 2805 )
          IF( nprnc .NE. 0 .AND. ntypc .EQ. 6 ) WRITE( 12, 2806 )
        ELSE
          nerrc = 1
          RETURN
        END IF
        IF( nprnc .NE. 0 ) THEN
          WRITE( 12, 3200 ) npoin, nelem, ndime, mdofn
          WRITE( 12, 3400 ) nmats, nload, mnode, nslnt
          WRITE( 12, 3600 ) nnodp, nnodg, nprop, mnodf
          WRITE( 12, 3800 ) medgf, mplnf, nmssp, nstfp
          WRITE( 12, 4000 ) ndmpp, nmode
          IF( nlnkc .EQ. 0 ) WRITE( 12, 4200 )
          IF( nlnkc .NE. 0 ) WRITE( 12, 4201 )
        END IF
        RETURN
200     nerrc = 5235
        RETURN
2000    FORMAT( // 30x, '通用结构分析程序'//                                   &
        10x, '                  ____          ____         _____  ' /          &
        10x, ' ||      ||      /    \        /    \       /     \ ' /          &
        10x, ' ||      ||    ||             /      \     ||     ||' /          &
        10x, ' ||      ||     \____        ||______||    ||_____/ ' /          &
        10x, ' ||      ||          \       ||      ||    ||       ' /          &
        10x, ' ||      ||          ||      ||      ||    ||       ' /          &
        10x, '  \______/      \____/       ||      ||    ||       ' / )
2200    FORMAT( a70  )
2400    FORMAT( //2x, 70( '=' ) // 2x, a70 // 2x, 70( '=' ) // )
2600    FORMAT( 10I5 )
2800    FORMAT( 2x, '问题类型  : 静力分析' )
2801    FORMAT( 2x, '问题类型  : 动特性分析' )
2802    FORMAT( 2x, '问题类型  : 动响应分析' )
2803    FORMAT( 2x, '问题类型  : 稳定性分析' )
2804    FORMAT( 2x, '问题类型  : 阻尼动特性分析' )
2805    FORMAT( 2x, '问题类型  : 阻尼动响应分析' )
2806    FORMAT( 2x, '问题类型  : 阻尼动稳定性分析' )
3200    FORMAT( 2x, '节点总数  : ', I5, 10x, '单元总数:   ', I5 /              &
                2x, '问题维数  : ', I5, 10x, '节点自由度: ', I5 )
3400    FORMAT( 2x, '材料总数  : ', I5, 10x, '载荷工况数: ', I5 /              &
                2x, '单元节点数: ', I5, 10x, '斜自由度数: ', I5 )
3600    FORMAT( 2x, '面载节点数: ', I5, 10x, '线载节点数: ', I5 /              &
                2x, '材性参数数: ', I5, 10x, '集中载荷数: ', i5 )
3800    FORMAT( 2x, '线布载荷数: ', I5, 10x, '面布载荷数: ', i5 /              &
                2x, '集中质量数: ', I5, 10x, '集中刚度数: ', I5 )
4000    FORMAT( 2x, '集中阻尼数: ', I5, 10x, '最大模态数: ', I5 )
4200    FORMAT(/2x, '注意: @坐标相同或相近的节点将不被自动连接@' / )
4201    FORMAT(/2x, '注意: @坐标相同或相近的节点将被自动连接@' / )
        RETURN
        END

        SUBROUTINE CloseFile
        WRITE( 16, 2000 ) 0
        WRITE( 17, 2000 ) 0
        WRITE( 20, 2000 ) 0
        WRITE( 23, 2000 ) 0
        CLOSE( 11 )
        CLOSE( 12 )
        CLOSE( 13 )
        CLOSE( 14 )
        CLOSE( 15 )
        CLOSE( 16 )
        CLOSE( 17 )
        CLOSE( 18 )
        CLOSE( 19 )
        CLOSE( 20 )
        CLOSE( 21 )
        CLOSE( 22 )
        CLOSE( 23 )
2000    FORMAT( I5 )
        RETURN
        END

        SUBROUTINE ErrorMsg
!.......
!       模块功能
!           输出错误信息.
!........
        USE CtrlData
        CHARACTER * 20 strng
        IF( nerrc .LE. 0 ) RETURN
        WRITE( strng, '( "错误:序号", I10 )' ) nerrc
        CALL ShowMessage( strng )
        RETURN
        END

        SUBROUTINE RunTime( iswth )
!........
!       模块功能
!           确定当时时刻.
!........
        CHARACTER * 26 ctime
        INTEGER * 2 year, month, date
        INTEGER * 2 hour, minute, second, hundred
        COMMON /rtime/ ctime
        IF( iswth .EQ. 2 ) THEN
          WRITE( 12, * )
          WRITE( 12, * ) '  ==========================================='
          WRITE( 12, * )
          WRITE( 12, * ) '              运   行   时   间'
          WRITE( 12, * )
          WRITE( 12, * ) '  ==========================================='
          WRITE( 12, * )
          WRITE( 12, '( 2X, A20, A26 )' ) '本程序工作起始时刻: ', ctime
        END IF
        CALL GETDAT( year, month, date )
        CALL GETTIM( hour, minute, second,hundred )
        WRITE( ctime(  1:4  ), '( I4 )' ) year
        WRITE( ctime(  5:6  ), '( A2 )' ) '年'
        WRITE( ctime(  7:8  ), '( I2 )' ) month
        WRITE( ctime(  9:10 ), '( A2 )' ) '月'
        WRITE( ctime( 11:12 ), '( I2 )' ) date
        WRITE( ctime( 13:14 ), '( A2 )' ) '日'
        WRITE( ctime( 15:16 ), '( I2 )' ) hour
        WRITE( ctime( 17:18 ), '( A2 )' ) '时'
        WRITE( ctime( 19:20 ), '( I2 )' ) minute
        WRITE( ctime( 21:22 ), '( A2 )' ) '分'
        WRITE( ctime( 23:24 ), '( I2 )' ) second
        WRITE( ctime( 25:26 ), '( A2 )' ) '秒'
        IF( month  .LT. 10 ) ctime(  7:7  ) = '0'
        IF( date   .LT. 10 ) ctime( 11:11 ) = '0'
        IF( hour   .LT. 10 ) ctime( 15:15 ) = '0'
        IF( minute .LT. 10 ) ctime( 19:19 ) = '0'
        IF( second .LT. 10 ) ctime( 23:23 ) = '0'
        IF( iswth .EQ. 2 )                                                     &
        WRITE( 12, '( 2X, A20, A26 )' ) '本程序工作终止时刻: ', ctime
        RETURN
        END

        SUBROUTINE ChangeToWorkDir
        USE DFPort
        USE Kernel32
        USE FileData
        IMPLICIT DOUBLE PRECISION( a-h, o-z )
        CHARACTER * 64  lpszDrive, lpszExt
        CHARACTER * 256 lpszFileName, lpszDir
        CHARACTER * 256 lpszExecFile
        IF( GetFileName( lpszFileName, 1 ) .EQ. 0 ) i = GetModuleFileName( NULL, lpszFileName, 256 )
        i = SplitPathQQ( lpszFileName, lpszDrive, lpszDir, lpszExecFile, lpszExt )
        i = ChDir( TRIM( lpszDrive ) // TRIM( lpszDir ) )
        END

⌨️ 快捷键说明

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