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

📄 后处理法程序pfl.f90.txt

📁 ! 平面框架结构静力分析程序(by fortran) ! 后处理法 ! ! 主要功能: ! 输入单元结点编号,自动生成结点位移编号; ! 总刚元素按上三角阵存储; ! 主1副0法引入位移约束条件 !
💻 TXT
📖 第 1 页 / 共 2 页
字号:
!----------------------------------------------------------------------------------------
!          STATIC ANALYSIS FOR PLANE FRAME   
!             (METHOD OF LATTER TREATMENT) 
!                          平面框架结构静力分析程序
!                                      后处理法
!
!         主要功能:
!                  输入单元结点编号,自动生成结点位移编号;
!                  总刚元素按上三角阵存储;
!                  主1副0法引入位移约束条件
!                  GAUSS消元法解线性代数方程组;
!        
!----------------------------------------------------------------------------------------

!   Define the interface of assumed-shape arrays   定义可调数组接口模块
	MODULE KECALL
	   INTERFACE
		SUBROUTINE ESM(M,NE,E,A,ZI,BL,EK)
			REAL::E,BL
			INTEGER::M,NE
			REAL::A(NE),ZI(NE),EK(:,:)
		END SUBROUTINE
		SUBROUTINE CTM(SI,CO,T)
			REAL::SI,CO
			REAL::T(:,:)
		END SUBROUTINE
		SUBROUTINE TTKT(EK,T)
			REAL::EK(:,:),T(:,:)
		END SUBROUTINE
	   END INTERFACE
	END MODULE



!    Main program reads the control parameters and organizes
!            the whole calculation by calling subroutines.
!               主程序
!       输入控制参数,实现子程序调用和组装.
	PROGRAM PFL
	implicit none
	INTEGER::iAl_Err=0   !  错误信息控制变量。若iAl_Err\=0,则输出出错信息。
	REAL::E
	INTEGER::NE,NJ,NR,NP,NF,N
	REAL,ALLOCATABLE::X(:),Y(:),A(:),ZI(:),PJ(:,:),PF(:,:),TK(:,:),P(:) !  定义可调数组
	INTEGER,ALLOCATABLE::IJ(:,:),JR(:,:)
	CHARACTER*12 INDAT,OUTDAT

	 WRITE(*,*) 'Please input primary data file name!'
	 READ(*,'(A12)') INDAT
	 WRITE(*,*) 'Please input calculation result file name!'
	 READ(*,'(A12)') OUTDAT
	 OPEN(1,FILE=INDAT,STATUS='OLD')
	 OPEN(2,FILE=OUTDAT,STATUS='NEW')
	 READ(1,*) NE,NJ,NR,NP,NF,E    ! 输入结构控制参数
!      NE: 单元总数,整型
!      NJ: 结点总数,整型
!      NR:  结点约束总数,整型
!      NP: 结点荷载总数,整型
!      NF: 非结点荷载总数,整型
!      E:  弹性模量,实型

	 N=NJ*3      !      结点位移总数=3×结点总数,整型
	 ALLOCATE(X(NJ),Y(NJ),A(NE),ZI(NE),PJ(NP,3),PF(NF,4),&
               &    TK(N,N),P(N),IJ(NE,2),JR(NR,4),STAT=iAl_Err )    !   指定可调数组大小

  	 IF (iAl_Err/=0) THEN      !     输出出错信息
		 WRITE(*,*) 'Inadequate heap RAM!'
		  WRITE(*,*) 'Program terminated!'
		  CLOSE(1)
		  CLOSE(2)
		STOP
	  ENDIF

	  WRITE(2,10) NE,NJ,NR,NP,NF,E
10                FORMAT(3X,'PLANE FRAME STRUCTURE ANALYSIS'/5X,'NE=',&
                                        &  I2,8X,'NJ=',I2,8X,'NR=',I2,/5X,'NP=',I2,8X,'NF=',I2,8X,'E=',E12.4)
	  CALL INPUT(NE,NJ,NR,NP,NF,X,Y,IJ,A,ZI,JR,PJ,PF)   !   输入、输出原始数据.
	  CALL TSM(NE,NJ,E,X,Y,IJ,A,ZI,TK,N)    !  形成结构总刚  
	  CALL JLP(NE,NJ,NP,NF,X,Y,IJ,PJ,PF,P,N)  !  计算结构综合结点荷载列阵
	  CALL ISC(NR,JR,TK,P,N)     !    引入支座约束条件
	  CALL GAUSS(TK,P,N)      ! GAUSS消元法计算结点位移
	  CALL MVN(NE,NJ,NF,E,X,Y,IJ,A,ZI,PF,P,N)    ! 计算并输出结点位移和单元杆端力
	  CLOSE(1)
	  CLOSE(2)
	END


!        Read and print primary data.
!              由数据文件输入、输出原始数据.
	SUBROUTINE INPUT(NE,NJ,NR,NP,NF,X,Y,IJ,A,ZI,JR,PJ,PF)
	implicit none
	INTEGER::NE,NJ,NR,NP,NF
	REAL::X(NJ),Y(NJ),A(NE),ZI(NE),PJ(NP,3),PF(NF,4)
	INTEGER::IJ(NE,2),JR(NR,4)
	INTEGER::I,J

	READ(1,*) (X(I),Y(I),I=1,NJ)      !  输入结点坐标
	READ(1,*) (IJ(I,1),IJ(I,2),A(I),ZI(I),I=1,NE)    !  输入单元始、末端结点编码及单元面积和惯性矩
	READ(1,*) ((JR(I,J),J=1,4),I=1,NR)  !  输入结点约束信息,
!                 JR(I,1):   支座结点码;
!                 JR(I,2):   支座结点沿整体坐标x轴方向约束信息,有=1,无=0;
!                 JR(I,1):   支座结点沿整体坐标y轴方向约束信息,有=1,无=0;
!                 JR(I,1):   支座结点沿转角方向约束信息,有=1,无=0;

	IF(NP>0) READ(1,*) ((PJ(I,J),J=1,3),I=1,NP)          !输入结点荷载,
!	      其中PJ(I,1)、PJ(I,2)、PJ(I,3)分别为第I个结点荷载作用的结点码、
!                    作用方向代码及荷载数值。
!	       作用方向代码沿整体坐标X方向为“1”,整体坐标Y方向为“2”,力偶为“3”。
!	        荷载数值输代数值,即结点力与整体坐标正向一致为正,结点力偶以顺时针为正。

	IF(NF>0) READ(1,*) ((PF(I,J),J=1,4),I=1,NF)            !输入非结点荷载
!	           其中PF(I,1) :  第I个非结点荷载作用的单元号;
!                   PF(I,2):   荷载类型号
!                   PF(I,3):   荷载参数q, 以与单元局部坐标正向一致为正,力偶以顺时针为正
!                   PF(I,4):   位置参数c(以上参见表2-1)


!       输出结构原始参数,以便检查数据
	WRITE(2,10) (I,X(I),Y(I),I=1,NJ)
	WRITE(2,20) (I,IJ(I,1),IJ(I,2),A(I),ZI(I),I=1,NE)
	WRITE(2,30) ((JR(I,J),J=1,4),I=1,NR)
	IF(NP>0) WRITE(2,40) ((PJ(I,J),J=1,3),I=1,NP) 
	IF(NF>0) WRITE(2,50) ((PF(I,J),J=1,4),I=1,NF)
10                FORMAT(/2X,'COORDINATES OF JOINT'/6X,'JOINT',12X,'X',&
                               &12X,'Y'/(6X,I4,5X,2F12.4))
20                FORMAT(/2X,'INFORMATION OF ELEMENTS'/6X,'ELEMENT',&
                              &4X,'JOINT-I',4X,'JOINT-J',10X,'A',12X,'ZI'/(2X,3I10,6X,2F12.6))
30                FORMAT(/2X,'INFORMATION OF RESTRICTION'/6X,'RES.-JOINT',&
                              &7X,'XR',8X,'YR',7X,'CETA'/(4X,4I10))
40                FORMAT(/2X,'JOINT LOAD'/6X,'JOINT'8X,'XYM',12X,'LOAD'/ &
                              &(6X,F5.0,6X,F5.0,6X,F12.4))
50               FORMAT(/2X,'NON-JOINT LOAD'/6X,'ELEMENT',8X,'TYPE',8X,&
                              &'LOAD',12X,'C'/(6X,F6.0,6X,F6.0,4X,2F12.4))
	END
	
!   Calculate length,sine and cosine of member. 
!     计算单元长度、方位角的sin和cos值.    
	SUBROUTINE LSC(M,NE,NJ,X,Y,IJ,BL,SI,CO)
	          implicit none
	          REAL::BL,SI,CO
	          INTEGER::M,NE,NJ
	          REAL::X(NJ),Y(NJ)
	          INTEGER::IJ(NE,2)
	          REAL::DX,DY
	          INTEGER::I,J
	          I=IJ(M,1);           J=IJ(M,2)
	          DX=X(J)-X(I);       DY=Y(J)-Y(I)
	          BL=SQRT(DX*DX+DY*DY)
	          SI=DY/BL;     CO=DX/BL
	END

! Calculate element stiffness matrix referred to element 	 
!   生成局部坐标下的单元刚度矩阵
	SUBROUTINE ESM(M,NE,E,A,ZI,BL,EK)
	    implicit none
	    REAL::E,BL
	    INTEGER::M,NE
   	    REAL::A(NE),ZI(NE),EK(:,:)
	    REAL::EA,EI
	    INTEGER::I,J
              EK=0.0
              EA=E*A(M)
              EI=E*ZI(M)
              EK(1,1)=EA/BL
	    EK(1,4)=-EK(1,1)
	    EK(2,2)=12.0*EI/BL/BL/BL
	    EK(2,3)=6.0*EI/BL/BL
    	    EK(2,5)=-EK(2,2)
	    EK(2,6)=EK(2,3)
	    EK(3,3)=4.0*EI/BL
	    EK(3,5)=-EK(2,3)
	    EK(3,6)=2.0*EI/BL
	    EK(4,4)=EK(1,1)
	    EK(5,5)=EK(2,2)
	    EK(5,6)=-EK(2,3)
	    EK(6,6)=EK(3,3)
	    FORALL(I=1:5,J=2:6,((J>I).AND.(EK(I,J)/=0.0))) EK(J,I)=EK(I,J)    !   给下三角元素赋值
	END


!   Form coordinate transformation matrix.	
!              形成单元坐标变换阵.
	SUBROUTINE CTM(SI,CO,T)
	          implicit none
	          REAL::SI,CO
	          REAL::T(:,:)
	          INTEGER::I,J
	          T=0.0
	          T(1,1)=CO
	          T(1,2)=SI
	          T(2,1)=-SI
	          T(2,2)=CO
	          T(3,3)=1.0
	          FORALL(I=1:3,J=1:3,T(I,J)/=0.0) T(I+3,J+3)=T(I,J)
	END
	
! Calculate element stiffness matrix referred  to global coordinate system.
!       生成整体坐标下的单元刚度阵
	SUBROUTINE TTKT(EK,T)
	          implicit none
	          REAL::EK(:,:),T(:,:)
	          REAL,ALLOCATABLE::TE(:,:)
	          INTEGER::iAl_Err=0
	          ALLOCATE(TE(UBOUND(EK,1),UBOUND(EK,2)),STAT=iAl_Err)
	          IF (iAl_Err/=0) THEN
		                    WRITE(*,*) 'Inadequate heap RAM!'
		                    WRITE(*,*) 'Program terminated!'
		                    CLOSE(1)
		                    CLOSE(2)
		                    STOP
	          ENDIF 
	          TE=0.0
	          TE=MATMUL(TRANSPOSE(T),EK)   !  调用FORTRAN库函数进行矩阵相乘
	          EK=0.0
	          EK=MATMUL(TE,T)
	END


!  Assemble total stiffness matrix.
!    组集总刚
	SUBROUTINE TSM(NE,NJ,E,X,Y,IJ,A,ZI,TK,N)
	          USE KECALL     ! 该处应用了可调数组,需调用模块KECALL   
	          implicit none
	          REAL::E
	          INTEGER::NE,NJ,N
	          REAL::X(NJ),Y(NJ),A(NE),ZI(NE),TK(N,N)
	          INTEGER::IJ(NE,2)
	          REAL::BL,SI,CO
	          INTEGER::I,J,K,L,M
	          REAL::EK(6,6),T(6,6)

⌨️ 快捷键说明

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