📄 calreccatimat.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 + -