Fortran Coder

查看: 12488|回复: 8
打印 上一主题 下一主题

[数值问题] 求助!!!防波堤设计计算,波浪折射算角度的程序

[复制链接]

5

帖子

1

主题

0

精华

新人

F 币
22 元
贡献
12 点
跳转到指定楼层
楼主
发表于 2014-4-30 16:53:02 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 l3319799 于 2014-4-30 17:08 编辑

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

[Fortran] 纯文本查看 复制代码
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




新建文本文档.txt

700 Bytes, 下载次数: 1

分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

9#
发表于 2014-4-30 19:12:22 | 只看该作者
l3319799 发表于 2014-4-30 17:34
LSY函数中的L0不是直接会读取最开始的L0么?

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

你可以用以下几种方式来共享它们:
1.使用虚参传递。(常规方法)
2.使用common全局变量。(不推荐)
3.使用Module来公用。(推荐)

5

帖子

1

主题

0

精华

新人

F 币
22 元
贡献
12 点
8#
 楼主| 发表于 2014-4-30 17:34:35 | 只看该作者
fcode 发表于 2014-4-30 17:15
我想,这可能是你的 LSY 函数中 L0 变量没有值导致的

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

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

7#
发表于 2014-4-30 17:15:33 | 只看该作者
我想,这可能是你的 LSY 函数中 L0 变量没有值导致的

5

帖子

1

主题

0

精华

新人

F 币
22 元
贡献
12 点
6#
 楼主| 发表于 2014-4-30 17:15:30 | 只看该作者
fcode 发表于 2014-4-30 17:10
回复是有附件可以上传。你没调用 mod,也可能其他函数内部调用了。

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

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

5

帖子

1

主题

0

精华

新人

F 币
22 元
贡献
12 点
5#
 楼主| 发表于 2014-4-30 17:10:17 | 只看该作者
l3319799 发表于 2014-4-30 17:07
恩,但是很奇怪我的程序里都没有MOD,但是它显示是-MOD:domain error...还有怎么发文件啊?不然QQ联系下 ...

输入文件也发拉

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

地板
发表于 2014-4-30 17:10:09 | 只看该作者
回复是有附件可以上传。你没调用 mod,也可能其他函数内部调用了。

另外,本站有QQ群:2338021

5

帖子

1

主题

0

精华

新人

F 币
22 元
贡献
12 点
板凳
 楼主| 发表于 2014-4-30 17:07:43 | 只看该作者
fcode 发表于 2014-4-30 17:04
没有输入文件,无法帮你测试。

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

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

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2014-4-30 17:04:25 | 只看该作者
没有输入文件,无法帮你测试。

你的错误是定义域错误。也就是数据不满足数学函数的定义域。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-12-24 02:02

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表