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

📄 data.f90

📁 非线性有限元分析程序
💻 F90
📖 第 1 页 / 共 4 页
字号:
        MODULE CtrlData
!........
!       模块内容:
!           本模块包含程序运算过程中的所有控制参数,并负责对它们初始化。
!........
        IMPLICIT DOUBLE PRECISION( a-h, o-z )
        CHARACTER * 70 title
        INTEGER ntypc, nerrc, nlnkc, nprnc, nchkc, nuntc, mswth
        INTEGER npoin, nelem, ndime, mdofn, nmats, ndofs, nfmtc
        INTEGER nbufs, ndsks, nmode, mnode, nstat, nstrh
        INTEGER nprop, nhstr, mdofe, ndofg, ndofp, kaitk
        INTEGER nmssp, ndmpp, nstfp, mmssp, mdmpp, mstfp
        INTEGER nload, mnodf, medgf, mplnf, nnodg, nnodp
        INTEGER nslnt, mslnt, mnodg, mnodp, nexec, kload
        INTEGER nfrcc, ndync, nupdc, nrsdc, nearc, nsmts
        INTEGER narcc, nstfc, nmssc, ndmpc, necho, kpdis, kpstr
        INTEGER nstpc, kstpc, kdofc, nreac, nincc, nshfc

        DOUBLE PRECISION dtolc, ftolc, fcttm, fstep, tstep
        DOUBLE PRECISION timec, fctor, alpha, belta, theta
        DOUBLE PRECISION dstep

        DIMENSION lsavc( 3 ), ldecc(  3 )
        DIMENSION lsymc( 3 ), shift( 10 )

        ALLOCATABLE wdofs(:)

        SAVE title, dstep, lsavc, ldecc, lsymc, shift
        SAVE ntypc, nerrc, nlnkc, nprnc, nchkc, nuntc
        SAVE npoin, nelem, ndime, mdofn, nmats, ndofs
        SAVE nbufs, ndsks, nmode, mnode, nstat, nstrh
        SAVE nprop, nhstr, mdofe, ndofg, ndofp, kaitk
        SAVE nmssp, ndmpp, nstfp, mmssp, mdmpp, mstfp
        SAVE nload, mnodf, medgf, mplnf, nnodg, nnodp
        SAVE nslnt, mslnt, mnodg, mnodp, nexec, kload
        SAVE nfrcc, ndync, nupdc, nrsdc, nearc, nsmts
        SAVE narcc, nstfc, nmssc, ndmpc, necho, kpdis, kpstr
        SAVE nstpc, kstpc, kdofc, nreac, nincc, nshfc
        SAVE dtolc, ftolc, fcttm, fstep, tstep, nfmtc
        SAVE timec, fctor, alpha, belta, theta, wdofs

        CONTAINS
          SUBROUTINE InitMemory
            USE dfwin
            USE MSFLib
            USE VFEAPGlobals
	        POINTER( pGetDiskSize, GetDiskSize )
	        POINTER( pGetMemorySize, GetMemorySize )

            IF( ghInstVFEAPCom .NE. 0 ) THEN
              pGetDiskSize = GetProcAddress( ghInstVFEAPCom, "GetDiskSize"C )
              pGetMemorySize = GetProcAddress( ghInstVFEAPCom, "GetMemorySize"C )
			  IF( pGetMemorySize .NE. 0 ) nbufs = GetMemorySize()
			  IF( pGetDiskSize .NE. 0 ) ndsks = GetDiskSize()
            END IF
            IF( nbufs .LE. 0 ) nbufs = 128
            IF( ndsks .LE. 0 ) ndsks = 256
            nbufs = nbufs * 1024 * 1024 / 8
            ndsks = ndsks * 1024 * 1024 / 8
          END SUBROUTINE InitMemory

          SUBROUTINE InitCtrl
            kaitk = 0
            nfrcc = 0
            nincc = 0
            nreac = 0
            ndync = 0
            nupdc = 0
            nrsdc = 0
            kpdis = 0
            kpstr = 0
            ndofc = 0
            kstpc = 0
            nstat = 0
            nuntc = 0
            nexec = 1
            kload = 1
            narcc = 1
            nstfc = 1
            nmssc = 1
            ndmpc = 1
            necho = 1
            nshfc = 1
            nearc = 0
            nsmts = 0
            mswth = 100
            dtolc = 0.0D0
            ftolc = 0.0D0
            fcttm = 0.0D0
            fstep = 0.0D0
            timec = 0.0D0
            fctor = 1.0D0
            tstep = 1.0D0
            dstep = 0.0D0
            mmssp = nmssp
            mstfp = nstfp
            mdmpp = ndmpp
            mslnt = nslnt
            mnodg = nnodg + 1
            mnodp = nnodp + 1
            ndofg = nnodg * mdofn
            ndofp = nnodp * mdofn
            mdofe = mnode * mdofn

            alpha = 1.0D0 / 2.0D0
            belta = 1.0D0 / 4.0D0
            theta = 7.0D0 / 5.0D0
            IF( nload .EQ. 0 ) nload = 1
            IF( mnodf .EQ. 0 ) mnodf = 1
            IF( medgf .EQ. 0 ) medgf = 1
            IF( mplnf .EQ. 0 ) mplnf = 1
            IF( nmssp .EQ. 0 ) mmssp = 1
            IF( nstfp .EQ. 0 ) mstfp = 1
            IF( ndmpp .EQ. 0 ) mdmpp = 1
            IF( nslnt .EQ. 0 ) mslnt = 1
            IF( nnodg .EQ. 0 ) mnodg = 1
            IF( nnodp .EQ. 0 ) mnodp = 1
            ndofs = npoin * mdofn
            DO imatx = 1, 3
              lsavc( imatx ) = 0
              ldecc( imatx ) = 0
            END DO
            lsavc( 1 ) = 1
            IF( ntypc .GE. 1 ) lsavc( 2 ) = 1
            IF( ntypc .GE. 4 ) lsavc( 3 ) = 1
            IF( ntypc .GE. 4 ) ntypc = ntypc - 3

            ALLOCATE( wdofs( mdofn ), STAT = ierro )
			IF( ierro .GT. 0 ) nerrc = 6
            IF( nerrc .NE. 0 ) RETURN

            DO idofn = 1, mdofn
			  wdofs( idofn ) = 1.0D0
			END DO
          END SUBROUTINE InitCtrl

          SUBROUTINE DelCtrl
		  IF( ALLOCATED( wdofs ) ) DEALLOCATE( wdofs )
		  END SUBROUTINE DelCtrl
        END MODULE CtrlData

        MODULE MacroData
!.......
!       模块内容:
!           本模块包含所有宏命令所需的数据,负责对它们初始化,并读入对应的数据。
!.......
        IMPLICIT DOUBLE PRECISION( a-h, o-z )
        CHARACTER * 15 macro
        CHARACTER * 15 mrems
        INTEGER mmacr, nmacr, kmacr, mcmds, mvars
        ALLOCATABLE macro(:), mrems(:), lmacr(:,:), pmacr(:,:)

        SAVE mmacr, nmacr, kmacr, mcmds
        SAVE macro, mrems, lmacr, pmacr

        CONTAINS
          SUBROUTINE InitMacro
            USE dfwin
            USE MSFLib
            USE CtrlData
            USE VFEAPGlobals
            CHARACTER * 256 namef
            CHARACTER * 256 filen, direc
            CHARACTER * 256 drive, exten
            CHARACTER * 15  cmmnd, mcrem
	        POINTER( pGetMaxMacro, GetMaxMacro )
	        POINTER( pGetMaxVariable, GetMaxVariable )

            IF( ghInstVFEAPCom .NE. 0 ) THEN
              pGetMaxMacro = GetProcAddress( ghInstVFEAPCom, "GetMaxMacro"C )
              pGetMaxVariable = GetProcAddress( ghInstVFEAPCom, "GetMaxVariable"C )
			  IF( pGetMaxVariable .NE. 0 ) mvars = GetMaxVariable()
			  IF( pGetMaxMacro .NE. 0 ) mmacr = GetMaxMacro()
            END IF
			IF( mmacr .LT. 100 ) mmacr = 100
            IF( mvars .LT. 20 ) mvars = 20

            i = GetModuleFileName( NULL, filen, 256 )
            i = SplitPathQQ( filen, drive, direc, namef, exten )
            namef = TRIM( drive ) // TRIM( direc ) // 'Macro.Set'
            OPEN( 25, FILE = namef )
            READ( 25, 2000 ) ncmds, mcmds
            mcmds = mcmds + 2
            kmacr = 1
            ALLOCATE( macro( mcmds ), lmacr( 5, mmacr ),                       &
                      mrems( mcmds ), pmacr( 5, mmacr ), STAT = ierro )
            IF( ierro .GT. 0 ) nerrc = 6
            IF( nerrc .GT. 0 ) RETURN
            CALL InitInteger( lmacr, mmacr * 5, 0 )
            CALL InitFloat( pmacr, mmacr * 5, 0.0D0 )
            DO icmds = 1, mcmds
              macro( icmds ) = '               '
              mrems( icmds ) = '               '
            END DO
            DO icmds = 1, ncmds
              READ( 25, 2200 ) icomm, cmmnd, mcrem
              IF( icomm .LE.         0 ) nerrc = 3016
              IF( icomm .GT. mcmds - 2 ) nerrc = 3016
              IF( nerrc .GT.         0 ) RETURN
              macro( icomm ) = cmmnd
              mrems( icomm ) = mcrem
            END DO
            CLOSE( 25 )
            macro( mcmds - 1 ) = 'rem            '
            macro( mcmds     ) = 'endmacro       '
2000        FORMAT( 3I5 )
2200        FORMAT( I5, 1X, A15, A15 )
            RETURN
          END SUBROUTINE InitMacro

          SUBROUTINE ShowMacro
            USE CtrlData
            icmds = lmacr( 1, kmacr )
            IF( icmds .EQ. 0 ) THEN
              CALL ShowMessage( '分析完成' )
            ELSE
              IF( necho .NE. 0 ) CALL ShowMessage( mrems( icmds ) )
            END IF
            RETURN
          END SUBROUTINE ShowMacro

          SUBROUTINE DelMacro
            IF( ALLOCATED( macro ) ) DEALLOCATE( macro )
            IF( ALLOCATED( mrems ) ) DEALLOCATE( mrems )
            IF( ALLOCATED( lmacr ) ) DEALLOCATE( lmacr )
            IF( ALLOCATED( pmacr ) ) DEALLOCATE( pmacr )
          END SUBROUTINE DelMacro
        END MODULE MacroData

        MODULE MeshData
!........
!       模块内容:
!           本模块包含程序运算过程中的所有网格参数,并负责对它们初始化。
!........
        IMPLICIT DOUBLE PRECISION( a-h, o-z )
        ALLOCATABLE coord(:,:), lnods(:,:), basew(:)
        ALLOCATABLE lslnt(:,:), vslnt(:,:), temps(:)
        ALLOCATABLE lfixs(:,:), vfixs(:,:), llnks(:)
        ALLOCATABLE props(:,:), lprps(:,:), lmats(:)
        ALLOCATABLE axisw(:,:)

        SAVE coord, lnods, lslnt, vslnt, lprps, basew
        SAVE lfixs, vfixs, llnks, props, lmats, temps, axisw

        CONTAINS
          SUBROUTINE InitMesh
            USE CtrlData
            nmatp = mdofn + 3
            IF( nerrc .GT. 0 ) RETURN
            ALLOCATE( coord( ndime, npoin ), basew(        ndime ),            &
                      lfixs( mdofn, npoin ), lmats(        nelem ),            &
                      vfixs( mdofn, npoin ), temps(        npoin ),            &
                      props( nprop, nmats ), llnks(        npoin ),            &
                      vslnt( mdofn, mslnt ), lslnt(     2, mslnt ),            &
                      axisw( ndime, ndime ), lprps( nmatp, nmats ),            &
                      lnods( mnode, nelem ), STAT = ierro )
            IF( ierro .GT. 0 ) nerrc = 3
            IF( nerrc .GT. 0 ) RETURN

            CALL InitFloat( basew, ndime, 0.0D0 )
            CALL InitFloat( temps, npoin, 0.0D0 )
            CALL InitFloat( axisw, ndime * ndime, 0.0D0 )
            CALL InitFloat( coord, ndime * npoin, 9.9D9 )
            CALL InitFloat( vslnt, mdofn * mslnt, 0.0D0 )
            CALL InitFloat( vfixs, mdofn * npoin, 0.0D0 )
            CALL InitFloat( props, nprop * nmats, 0.0D0 )
            CALL InitInteger( lprps, nmatp * nmats, 0 )
            CALL InitInteger( lnods, mnode * nelem, 0 )
            CALL InitInteger( lslnt, 2     * mslnt, 0 )
            CALL InitInteger( lfixs, mdofn * npoin, 0 )
            CALL InitInteger( lmats, nelem, 0 )
            CALL InitInteger( llnks, npoin, 0 )
          END SUBROUTINE InitMesh

          SUBROUTINE DelMesh
            IF( ALLOCATED( coord ) ) DEALLOCATE( coord )
            IF( ALLOCATED( lnods ) ) DEALLOCATE( lnods )
            IF( ALLOCATED( lslnt ) ) DEALLOCATE( lslnt )
            IF( ALLOCATED( vslnt ) ) DEALLOCATE( vslnt )
            IF( ALLOCATED( lfixs ) ) DEALLOCATE( lfixs )
            IF( ALLOCATED( temps ) ) DEALLOCATE( temps )
            IF( ALLOCATED( vfixs ) ) DEALLOCATE( vfixs )
            IF( ALLOCATED( props ) ) DEALLOCATE( props )
            IF( ALLOCATED( lmats ) ) DEALLOCATE( lmats )
            IF( ALLOCATED( llnks ) ) DEALLOCATE( llnks )
            IF( ALLOCATED( lprps ) ) DEALLOCATE( lprps )
            IF( ALLOCATED( basew ) ) DEALLOCATE( basew )
            IF( ALLOCATED( axisw ) ) DEALLOCATE( axisw )
          END SUBROUTINE DelMesh
        END MODULE MeshData

        MODULE ExtraMesh

⌨️ 快捷键说明

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