l3319799 发表于 2014-4-30 16:53:02

求助!!!防波堤设计计算,波浪折射算角度的程序

本帖最后由 l3319799 于 2014-4-30 17:08 编辑

这是我是程序,大体思路是把海图手工打上网格做成矩阵,再经行插值各点水深,求角度
现在问题就是每次运行最后都有个-COS:或者-MOD:domain error,求解释,无错误,无警告,头要炸了

program main
implicit none
integer::r,i,j,m,n,k,l,h
real::T0,s,g,pi,SL,dalpha1,dalpha2,depth,L1,L0,c0,c1,p,q,beta,gamma,Lsy,theta1,theta2,theta0
!!!!!导入水深矩阵
real,dimension(0:16,0:8)::d
real,dimension(0:1000)::x,y
real,dimension(1:1000)::ZZJG
open(1,file='matrix5.dat')
do j=0,8
    do i=0,16
read(1,*),d(i,j)
write (*,*) d(i,j)
enddo
enddo
close(1)
!!!!
!!!起点各种参数
print *,"please enter:T0,start position m=,n=,入射角theta0="
read *,T0,m,n,s
g=9.81
pi=3.1415926
SL=200.0
L0=g*(T0**2)/(2*pi)
c0=L0/T0
x(0)=m*400.0
y(0)=n*600.0
theta0=s
!!!从起点算至工程点
do r=0,1000
    theta0=theta0
    x(r+1)=x(r)+cosd(theta0)*SL                                                      !!!!!!!!!!!!!!!theta是角度
    y(r+1)=y(r)+sind(theta0)*SL
    p=x(r+1)/400.0
    q=y(r+1)/600.0
!!!!!判断区间
k=0
l=0
    do i=0,16
      k=k
   beta=p-k
    if (beta>m) then
       k=i+1
    else
    endif
    enddo
    do j=0,8
      l=l
   gamma=q-l
   if (gamma>n) then
       l=j+1
   else
endif
    enddo
!!!!!
         dalpha1=abs((d(k-1,l)-d(k-1,l-1)))*(q-(l-1))+min(d(k-1,l-1),d(k-1,l))
   dalpha2=abs((d(k,l)-d(k,l-1)))*(q-(l-1))+min(d(k,l-1),d(k,l))
   depth=abs(dalpha1-dalpha2)*(p-(k-1))+min(dalpha1,dalpha2)
   if (depth<=1.2) then
   go to 33
      else if (depth>1.2) then
!!!!!水深插值
!!!!!
                         L1=Lsy(depth)
                   c1=L1/T0
      !角度
                theta1=theta0+((y(r+1)-y(r))*2/(c1+c0))*((c1-c0)/(x(r+1)-x(r))-(1/tan(theta0))*((c1-c0)/(y(r+1)-y(r)))) !角度
                   ZZJG(r+1)=theta1 !角度
                theta0=theta1
       c0=c1
   ENDIF
   
!!!!!角度计算
enddo
33 do h=1,1000
print *,"各次角度",ZZJG(h)
enddo
endprogram

function Lsy(dd) result(finals)
implicit none
integer::t
real::eps,dd,temp,finals,L0,g,T0,pi
real,dimension(0:1000)::Lr
eps=0.01
Lr(0)=L0
do t=0,1000
Lr(t+1)=g*(T0**2)*tanh(2*pi*dd/L0)/(2*pi)
temp=Lr(t+1)-Lr(t)
if ((abs(temp))>=eps) then
L0=Lr(t+1)
else if (abs(temp)<eps) then
finals=Lr(t+1)
endif
end do
endfunction



fcode 发表于 2014-4-30 17:04:25

没有输入文件,无法帮你测试。

你的错误是定义域错误。也就是数据不满足数学函数的定义域。

l3319799 发表于 2014-4-30 17:07:43

fcode 发表于 2014-4-30 17:04
没有输入文件,无法帮你测试。

你的错误是定义域错误。也就是数据不满足数学函数的定义域。


恩,但是很奇怪我的程序里都没有MOD,但是它显示是-MOD:domain error...还有怎么发文件啊?不然QQ联系下?

fcode 发表于 2014-4-30 17:10:09

回复是有附件可以上传。你没调用 mod,也可能其他函数内部调用了。

另外,本站有QQ群:2338021

l3319799 发表于 2014-4-30 17:10:17

l3319799 发表于 2014-4-30 17:07
恩,但是很奇怪我的程序里都没有MOD,但是它显示是-MOD:domain error...还有怎么发文件啊?不然QQ联系下 ...

输入文件也发拉

l3319799 发表于 2014-4-30 17:15:30

fcode 发表于 2014-4-30 17:10
回复是有附件可以上传。你没调用 mod,也可能其他函数内部调用了。

另外,本站有QQ群:2338021 ...

噢,这个附件我上传了的,能帮忙看看么谢谢了

fcode 发表于 2014-4-30 17:15:33

我想,这可能是你的 LSY 函数中 L0 变量没有值导致的

l3319799 发表于 2014-4-30 17:34:35

fcode 发表于 2014-4-30 17:15
我想,这可能是你的 LSY 函数中 L0 变量没有值导致的

LSY函数中的L0不是直接会读取最开始的L0么?

fcode 发表于 2014-4-30 19:12:22

l3319799 发表于 2014-4-30 17:34
LSY函数中的L0不是直接会读取最开始的L0么?

主程序中的变量,子程序中无法直接使用。

你可以用以下几种方式来共享它们:
1.使用虚参传递。(常规方法)
2.使用common全局变量。(不推荐)
3.使用Module来公用。(推荐)
页: [1]
查看完整版本: 求助!!!防波堤设计计算,波浪折射算角度的程序