|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
subroutine newmark(count,WMM,WDM,WKM,WEF,U,DiffU,DiffDiffU)
use constant
use crank
use imsl
implicit none
integer i,j !下标
real(8) WMM(61,61), WDM(61,61), WKM(61,61),WEF(61) !输入
real(8) U(0:400,61),DiffU(0:400,61),DiffDiffU(0:400,61) !输出位移、速度、加速度
real(8) tempU(1:11,61),tempDiffU(1:11,61),tempDiffDiffU(1:11,61) !中间变量:位移、速度、加速度
real(8) temp1(61),temp2(61),TempWMM(61,61),TempWDM(61,61) !中间变量
real(8) K(61,61),P(61) !中间变量
integer count !代表所求时刻0.1、0.2、0.3**********
real(8)::a=5,b=0.25,dt=0.01
real(8) A0,A1,A2,A3,A4,A5,A6,A7,crankrad,temp !参数
A0=1/(b*dt**2)
A1=a/(b*dt)
A2=1/(b*dt)
A3=1/(2*b)-1
A4=a/b-1
A5=dt*a/(2*b)-dt
A6=(1-a)*dt
A7=a*dt
crankrad=crankspeed*2*pi/60
temp=crankrad*180/(9*pi)
WDM=WDM*temp !进行自变量的转换,与方法本身无关
WMM=WMM*temp**2 !进行自变量的转换,与方法本身无关
tempU(1,:)=U(count-1,:) !设定初始值
tempDiffU(1,:)=DiffU(count-1,:)
tempDiffDiffU(1,:)=DiffDiffU(count-1,:)
TempWMM=A0*WMM
TempWDM=A1*WDM
k=TempWMM+TempWDM+WKM
do i=2,11
temp1=A0*tempU(i-1,:)+A2*tempDiffU(i-1,:)+A3*tempDiffDiffU(i-1,:)
temp2=A1*tempU(i-1,:)+A4*tempDiffU(i-1,:)+A5*tempDiffDiffU(i-1,:)
temp1=WMM.x.temp1
temp2=WDM.x.temp2
p=WEF+temp1+temp2
tempU(i,:)=k.ix.p
tempDiffDiffU(i,:)=A0*(tempU(i,:)-tempU(i-1,:))-A2*tempDiffU(i-1,:)-A3*tempDiffDiffU(i-1,:)
tempDiffU(i,:)=tempU(i-1,:)+A6*tempDiffDiffU(i-1,:)+A7*tempDiffDiffU(i,:)
enddo
U(count,:)=tempU(11,:)
DiffU(count,:)=tempDiffU(11,:)
DiffDiffU(count,:)=tempDiffDiffU(11,:)
do i=1,11
write(8,"(61f60.8)")tempU(i,:)
enddo
return
end subroutine newmark |
|