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

📄 calreccatimat.f90

📁 传递矩阵计算程序,传递矩阵计算程序,传递矩阵计算程序
💻 F90
字号:
	!根据边界条件构造Reccati传递矩阵数组
	SUBROUTINE calReccatiMat(trialFreq)
	USE nrtype; USE global
	IMPLICIT NONE
	REAL(DP) trialFreq
	INTEGER i,j,k,m
	REAL(DP) :: mass,len,yModu,momIner,cArea
	REAL(DP) :: factSupt,polMomIner,diaMomIner,secCoef,shearModu
	REAL(DP), DIMENSION(4,4) :: mat
	LOGICAL :: shear	
	REAL(DP), DIMENSION(2,2) :: u11,u12,u21,u22
	REAL(DP), DIMENSION(2,2) :: mat1,mat2
	INTERFACE
		SUBROUTINE calComTransMatrix(mass,len,yModu,momIner,&
							factSupt,polMomIner,diaMomIner,&
							secCoef,shearModu,crossArea,omega,shear,mat)
		USE nrtype; USE nrutil
		IMPLICIT NONE
		REAL(DP), INTENT(INOUT) :: mass,len,yModu,momIner,omega,crossArea
		REAL(DP), INTENT(INOUT) :: factSupt,polMomIner,diaMomIner,secCoef,shearModu
		REAL(DP), DIMENSION(4,4), INTENT(INOUT) :: mat
		LOGICAL, INTENT(INOUT) :: shear
		END SUBROUTINE calComTransMatrix
		FUNCTION determinant_2X2(mat)
		USE nrtype
		USE global
		IMPLICIT NONE
		REAL(DP) determinant_2X2,mat(2,2)
		END FUNCTION determinant_2X2
	END INTERFACE
	CALL calTransMatArray(trialFreq)
	sign=1.0
	k=0
	m=1
	riccatiMat(:,:,k)=0.0
	!根据具体边界条件选择相应的计算方法
	select case(boundaryCond)
	case("两端刚性简支")
		!构建转子各轴段组合单元传递矩阵:transMatArray
		do i=1,noOfSections
			!构建各轴段左端Riccati矩阵
			u11(1,1)=transMatArray(1,1,m)
			u11(1,2)=transMatArray(1,3,m)
			u11(2,1)=transMatArray(3,1,m)
			u11(2,2)=transMatArray(3,3,m)

			u12(1,1)=transMatArray(1,2,m)
			u12(1,2)=transMatArray(1,4,m)
			u12(2,1)=transMatArray(3,2,m)
			u12(2,2)=transMatArray(3,4,m)

			u21(1,1)=transMatArray(2,1,m)
			u21(1,2)=transMatArray(2,3,m)
			u21(2,1)=transMatArray(4,1,m)
			u21(2,2)=transMatArray(4,3,m)

			u22(1,1)=transMatArray(2,2,m)
			u22(1,2)=transMatArray(2,4,m)
			u22(2,1)=transMatArray(4,2,m)
			u22(2,2)=transMatArray(4,4,m)
			mat1=matmul(u11,riccatiMat(:,:,k))+u12
			mat2=matmul(u21,riccatiMat(:,:,k))+u22
			if(determinant_2X2(mat2)<0.0) sign=-1.0*sign
			k=k+1
			call invmatrix(mat2)
				tempMat(:,:,k)=mat2(:,:)
			riccatiMat(:,:,k)=matmul(mat1,mat2)
			m=m+1
			!构建各轴段中间组合单元Riccati矩阵
			do j=1,noOfSegments(i)-1
				u11(1,1)=transMatArray(1,1,m)
				u11(1,2)=transMatArray(1,3,m)
				u11(2,1)=transMatArray(3,1,m)
				u11(2,2)=transMatArray(3,3,m)

				u12(1,1)=transMatArray(1,2,m)
				u12(1,2)=transMatArray(1,4,m)
				u12(2,1)=transMatArray(3,2,m)
				u12(2,2)=transMatArray(3,4,m)

				u21(1,1)=transMatArray(2,1,m)
				u21(1,2)=transMatArray(2,3,m)
				u21(2,1)=transMatArray(4,1,m)
				u21(2,2)=transMatArray(4,3,m)

				u22(1,1)=transMatArray(2,2,m)
				u22(1,2)=transMatArray(2,4,m)
				u22(2,1)=transMatArray(4,2,m)
				u22(2,2)=transMatArray(4,4,m)
				mat1=matmul(u11,riccatiMat(:,:,k))+u12
				mat2=matmul(u21,riccatiMat(:,:,k))+u22
			if(determinant_2X2(mat2)<0.0) sign=-1.0*sign
				k=k+1
				call invmatrix(mat2)
				tempMat(:,:,k)=mat2(:,:)
				riccatiMat(:,:,k)=matmul(mat1,mat2)
			end do
			m=m+1
		end do
		!构建构建转子末端Riccati矩阵
		u11(1,1)=transMatArray(1,1,m)
		u11(1,2)=transMatArray(1,3,m)
		u11(2,1)=transMatArray(3,1,m)
		u11(2,2)=transMatArray(3,3,m)

		u12(1,1)=transMatArray(1,2,m)
		u12(1,2)=transMatArray(1,4,m)
		u12(2,1)=transMatArray(3,2,m)
		u12(2,2)=transMatArray(3,4,m)

		u21(1,1)=transMatArray(2,1,m)
		u21(1,2)=transMatArray(2,3,m)
		u21(2,1)=transMatArray(4,1,m)
		u21(2,2)=transMatArray(4,3,m)

		u22(1,1)=transMatArray(2,2,m)
		u22(1,2)=transMatArray(2,4,m)
		u22(2,1)=transMatArray(4,2,m)
		u22(2,2)=transMatArray(4,4,m)
		mat1=matmul(u11,riccatiMat(:,:,k))+u12
		mat2=matmul(u21,riccatiMat(:,:,k))+u22
			if(determinant_2X2(mat2)<0.0) sign=-1.0*sign
		k=k+1
		call invmatrix(mat2)
				tempMat(:,:,k)=mat2(:,:)
		riccatiMat(:,:,k)=matmul(mat1,mat2)
	case("两端自由")
		!构建转子各轴段组合单元传递矩阵:transMatArray
		do i=1,noOfSections
			!构建各轴段左端Riccati矩阵
			u11(1,1)=transMatArray(3,3,m)
			u11(1,2)=transMatArray(3,4,m)
			u11(2,1)=transMatArray(4,3,m)
			u11(2,2)=transMatArray(4,4,m)

			u12(1,1)=transMatArray(3,1,m)
			u12(1,2)=transMatArray(3,2,m)
			u12(2,1)=transMatArray(4,1,m)
			u12(2,2)=transMatArray(4,2,m)

			u21(1,1)=transMatArray(1,3,m)
			u21(1,2)=transMatArray(1,4,m)
			u21(2,1)=transMatArray(2,3,m)
			u21(2,2)=transMatArray(2,4,m)

			u22(1,1)=transMatArray(1,1,m)
			u22(1,2)=transMatArray(1,2,m)
			u22(2,1)=transMatArray(2,1,m)
			u22(2,2)=transMatArray(2,2,m)
			mat1=matmul(u11,riccatiMat(:,:,k))+u12
			mat2=matmul(u21,riccatiMat(:,:,k))+u22
			if(determinant_2X2(mat2)<0.0) sign=-1.0*sign
			k=k+1
			call invmatrix(mat2)
			tempMat(:,:,k)=mat2(:,:)
			riccatiMat(:,:,k)=matmul(mat1,mat2)
			m=m+1
			!构建各轴段中间组合单元Riccati矩阵
			do j=1,noOfSegments(i)-1
				u11(1,1)=transMatArray(3,3,m)
				u11(1,2)=transMatArray(3,4,m)
				u11(2,1)=transMatArray(4,3,m)
				u11(2,2)=transMatArray(4,4,m)

				u12(1,1)=transMatArray(3,1,m)
				u12(1,2)=transMatArray(3,2,m)
				u12(2,1)=transMatArray(4,1,m)
				u12(2,2)=transMatArray(4,2,m)

				u21(1,1)=transMatArray(1,3,m)
				u21(1,2)=transMatArray(1,4,m)
				u21(2,1)=transMatArray(2,3,m)
				u21(2,2)=transMatArray(2,4,m)

				u22(1,1)=transMatArray(1,1,m)
				u22(1,2)=transMatArray(1,2,m)
				u22(2,1)=transMatArray(2,1,m)
				u22(2,2)=transMatArray(2,2,m)
				mat1=matmul(u11,riccatiMat(:,:,k))+u12
				mat2=matmul(u21,riccatiMat(:,:,k))+u22
				if(determinant_2X2(mat2)<0.0) sign=-1.0*sign
				k=k+1
				call invmatrix(mat2)
				tempMat(:,:,k)=mat2(:,:)
				riccatiMat(:,:,k)=matmul(mat1,mat2)
			end do
			m=m+1
		end do
		!构建构建转子末端Riccati矩阵
		u11(1,1)=transMatArray(3,3,m)
		u11(1,2)=transMatArray(3,4,m)
		u11(2,1)=transMatArray(4,3,m)
		u11(2,2)=transMatArray(4,4,m)

		u12(1,1)=transMatArray(3,1,m)
		u12(1,2)=transMatArray(3,2,m)
		u12(2,1)=transMatArray(4,1,m)
		u12(2,2)=transMatArray(4,2,m)

		u21(1,1)=transMatArray(1,3,m)
		u21(1,2)=transMatArray(1,4,m)
		u21(2,1)=transMatArray(2,3,m)
		u21(2,2)=transMatArray(2,4,m)

		u22(1,1)=transMatArray(1,1,m)
		u22(1,2)=transMatArray(1,2,m)
		u22(2,1)=transMatArray(2,1,m)
		u22(2,2)=transMatArray(2,2,m)
		mat1=matmul(u11,riccatiMat(:,:,k))+u12
		mat2=matmul(u21,riccatiMat(:,:,k))+u22
		if(determinant_2X2(mat2)<0.0) sign=-1.0*sign
		k=k+1
		call invmatrix(mat2)
	tempMat(:,:,k)=mat2(:,:)
		riccatiMat(:,:,k)=matmul(mat1,mat2)

	end select 
	
	END SUBROUTINE calReccatiMat

⌨️ 快捷键说明

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