Fortran Coder

查看: 11905|回复: 7
打印 上一主题 下一主题

[求助] 求助!!!!调试程序时发现诡异现象!!!!

[复制链接]

9

帖子

3

主题

0

精华

入门

F 币
68 元
贡献
37 点
跳转到指定楼层
楼主
发表于 2014-9-10 21:42:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
首先我把大致情况介绍一下,编写了一个程序,包含两个文件main.f90和checklimts.f90,
在ubuntu平台上用gfortran编译成功,调试时,插入print *,'LXX=',LXX语句,观察LXX的值如何变化,
总共插入了两条print *,'LXX=',LXX语句,分别位于循环
do i=1,nptemp
lv(i)=0.0
lm(i)=0.0
enddo

的前边和后边,输出结果如图:图片挂了,字节要求传不上。
从图中可以看出,LXX的值相差很大,不知道是为什么?循环应该没有对LXX进行任何修改。


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

9

帖子

3

主题

0

精华

入门

F 币
68 元
贡献
37 点
沙发
 楼主| 发表于 2014-9-10 21:49:39 | 只看该作者
[Fortran] 纯文本查看 复制代码
001Subroutine checklimits
002  Use param
003  Implicit None
004  ni1 = ni + 1
005  niminx = -0.5*(lxx-llx) - 0.5*dx
006  nimaxx = -0.5*dx
007  niminz = -0.5*dz
008  nimaxz = llz - 0.5*dz
009  nominx = llx - 0.5*dx
010  nomaxx = 0.5*(lxx+llx) - 0.5*dx
011  nominz = -0.5*dz
012  nomaxz = llz - 0.5*dz
013  npminx = -0.5*dx
014  npmaxx = llx - 0.5*dx
015  npminz = -0.5*dz
016  npmaxz = llz - 0.5*dz
017  n2minx = -0.5*dx
018  n2maxx = -0.5*dx + 0.5*(lxx-llx)
019  n3minx = llx - 0.5*dx - 0.5*(lxx-llx)
020  n3maxx = llx - 0.5*dx
021  n5minxx = -0.5*dx + 0.5*(lxx-llx)
022  n5maxx = llx - 0.5*dx - 0.5*(lxx-llx)
023!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
024  Do k = 1, npmax
025    xptemp(k) = 0.0
026    zptemp(k) = 0.0
027    uptemp(k) = 0.0
028    wptemp(k) = 0.0
029    ctemp(k) = 0.0
030  End Do
031!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!check前,2,3,5三个区域各自的粒子数目分别为g2,g3,g5
032  qq = 0
033  no1 = no + 1 !!!!!此处修改过,9月9日
034  Do k = no1, np
035    If (xp(k)>=n2minx .And. xp(k)<=n2maxx) Then
036      qq = qq + 1
037    End If
038  End Do
039  g2 = qq
040  qq = 0
041  Do k = no1, np
042    If (xp(k)>=n3minx .And. xp(k)<=n3maxx) Then
043      qq = qq + 1
044    End If
045  End Do
046  g3 = qq
047  qq = 0
048  Do k = no1, np
049    If (xp(k)>=n5minxx .And. xp(k)<=n5maxx) Then
050      qq = qq + 1
051    End If
052  End Do
053  g5 = qq
054!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
055!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!更正出口粒子数no,更正流体粒子数np
056  notemp = no + g3 - r
057  nptemp = notemp + r + g5 + g3
058  n21 = notemp + 1
059  n22 = notemp + r
060  n51 = notemp + r + 1
061  n32 = notemp + r + g5 + g3
062  n41 = ni + 1
063  n42 = ni + g3
064!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
065!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!lv和lm的初始化
066  Print *, 'LXX=', lxx
067  Do i = 1, nptemp
068    lv(i) = 0.0
069    lm(i) = 0.0
070  End Do
071  Print *, 'LXX=', lxx
072!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!重新铺设2区域粒子,用临时转换标志temp表示!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
073  Do k = n21, n22
074    xptemp(k) = xp(k-g3-r) + 0.5*(lxx-llx) !!!!!!!!!!!!!!!!!
075    zptemp(k) = zp(k-g3-r)
076    uptemp(k) = up(k-g3-r)
077    wptemp(k) = wp(k-g3-r)
078    ctemp(k) = c(k-g3-r)
079  End Do
080!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
081!!!!!!!!!!!!!!!!!!!!!!!!!!!!重新铺设4区域粒子!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
082  b = n41
083  Do k = no1, np
084    If (xp(k)>=n3minx .And. xp(k)<=n3maxx) Then
085      lv(b) = k
086      xpp(k) = xp(k) + 0.5*(lxx-llx)
087      zpp(k) = zp(k)
088      upp(k) = up(k)
089      wpp(k) = wp(k)
090      cpp(k) = c(k)
091      b = b + 1
092    End If
093  End Do
094  Do k = n41, n42
095    xptemp(k) = xpp(lv(k))
096    zptemp(k) = zpp(lv(k))
097    uptemp(k) = upp(lv(k))
098    wptemp(k) = wpp(lv(k))
099    ctemp(k) = cpp(lv(k))
100  End Do
101!!!!!!!!!!!!!!!!!!!!!!!!!!!!
102!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!重新铺设53区域粒子!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
103  b = n51
104  Do k = no1, np
105    If (xp(k)>=n5minxx .And. xp(k)<=n3maxx) Then
106      lm(b) = k
107      xpp(k) = xp(k)
108      zpp(k) = zp(k)
109      upp(k) = up(k)
110      wpp(k) = wp(k)
111      cpp(k) = c(k)
112      b = b + 1
113    End If
114  End Do
115  Do k = n51, n32
116    xptemp(k) = xpp(lm(k))
117    zptemp(k) = zpp(lm(k))
118    uptemp(k) = upp(lm(k))
119    wptemp(k) = wpp(lm(k))
120    ctemp(k) = cpp(lm(k))
121  End Do
122!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
123  no = notemp
124  np = nptemp
125  Do k = ni1, np
126    xp(k) = xptemp(k)
127    zp(k) = zptemp(k)
128    up(k) = uptemp(k)
129    wp(k) = wptemp(k)
130    c(k) = ctemp(k)
131  End Do
132End Subroutine checklimits
checklimits.f90  的源代码

9

帖子

3

主题

0

精华

入门

F 币
68 元
贡献
37 点
板凳
 楼主| 发表于 2014-9-10 21:50:14 | 只看该作者
main.f90的源代码
[Fortran] 纯文本查看 复制代码
01Module param
02  Implicit None
03  Integer :: i, j, no1, np, kind_p2, lz, ncz, lx, ncx, lz2, nct, ii, jj, qq, no, g2, g3, g5, notemp, nptemp, r, nfile
04  Integer :: n21, n22, n51, n32, n41, n42, ni, k, b, icell, kcell, nn, nnx, nnz, nbfd, nnn, nbfu, jj_start, time1
05  Integer, Parameter :: npmax = 15000, kindp = 2, nct_max = 3000, nplink_max = 120, b1max = 100, b2max = 9940
06  Integer :: lv(b1max), lm(b2max), iflag(npmax), ibox(nct_max, 2, nplink_max), nc(nct_max, kindp)
07  Double Precision :: ax(npmax), az(npmax), ac(npmax), udot(npmax), wdot(npmax)
08  Double Precision :: cdot(npmax), xp(npmax), zp(npmax), up(npmax)
09  Double Precision :: wp(npmax), c(npmax), mass(npmax), xpp(b2max), zpp(b2max), upp(b2max), wpp(b2max)
10  Double Precision :: xptemp(npmax), zptemp(npmax), uptemp(npmax), wptemp(npmax), ctemp(npmax)
11  Double Precision :: cpp(b2max), xdot(npmax), zdot(npmax), xo(npmax), zo(npmax), uo(npmax), wo(npmax), co(npmax)
12  Double Precision :: etap, d, drx, drz, rr2, fourh2, dux, duz, dcij, rr, hsml, tdwdr, eta, rho, niminx, nimaxx, niminz, nimaxz, nominx
13  Double Precision :: nomaxx, nominz, nomaxz, npminx, npmaxx, npminz, npmaxz, n2minx, n2maxx, n3minx, n3maxx, n5minxx, n5maxx
14  Double Precision :: xmin_ini, zmin_ini, xmax_ini, zmax_ini, one_over_2h, one_over_h, tw, factor, pi, g, time, dt, dt2, tmax
15  Double Precision :: ncall11, ncall12, ncall13, h2
16  Integer :: j1, j2, kind_p1, ini_kind_p2, lx2, ni1, n_start, n_end, kind_p
17  Double Precision :: q
18  Double Precision :: llx, llz, dx, dz, lxx, lzz, ddx, ddz
19End Module param
20Program sph
21  Use param
22  Implicit None
23  ni = 4036
24  ni1 = 4037
25  llx = 2.5E-2
26  llz = 2.5E-4
27  lxx = 2.5E-2 + 4*2.5E-5
28  lzz = 2.5E-4 + 4*2.5E-5
29  dx = 2.5E-5
30  dz = 2.5E-5
31  no = 4056
32  np = 14056
33  r = 20
34  k = 0
35  Do i = 1, 14
36    Do j = 1, 1004
37      k = k + 1
38      xp(nn) = (j-1)*dx - 0.5*(lxx-llx)
39      zp(nn) = (i-1)*dz - 0.5*(lzz-llz)
40      up(nn) = 0.0
41      wp(nn) = 0.0
42      c(nn) = 0.0
43    End Do
44  End Do
45  Call checklimits
46End Program sph


2038

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1676 元
贡献
715 点

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

地板
发表于 2014-9-10 23:13:39 | 只看该作者
1.图片可以压缩后上传。2MB的要求应该挺宽裕。
2.你的程序里有很多的越界。建议开启 -fcheck 开关编译。
3.比如,主程序里的 nn 没有值。
4.比如,子程序里,nptemp 的值远远大于 lv 的上限 b1max=100
第四个问题可能是造成错误的根源。

9

帖子

3

主题

0

精华

入门

F 币
68 元
贡献
37 点
5#
 楼主| 发表于 2014-9-11 00:24:57 | 只看该作者
问题解决了,就是第四个的问题。真心感受到fcode的强大,纠结了一晚上的问题,就这样轻松的解决了。
我还有一点好奇的是,这个程序在ubuntu编译gfortran main.f90 chencklimits.f90 -o tes,  是编译成功了的,
是不是开启了-fcheck,编译就不会通过并且说明数组越界?是不是在windows上的ivf编译就会提示数组越界?

742

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
726 元
贡献
371 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

6#
发表于 2014-9-11 07:53:29 | 只看该作者
编译应该会通过,越界是属于运行时错误。
ivf 默认开启越界检查,而 gfortran 默认不开启。这只是默认行为。但是不得不说,ivf 的运行时错误提示,比gfortran清晰。

9

帖子

3

主题

0

精华

入门

F 币
68 元
贡献
37 点
7#
 楼主| 发表于 2014-10-12 15:13:10 | 只看该作者
fcode 发表于 2014-9-10 23:13
1.图片可以压缩后上传。2MB的要求应该挺宽裕。
2.你的程序里有很多的越界。建议开启 -fcheck 开关编译。
3. ...

-fcheck怎么开启??

742

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
726 元
贡献
371 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

8#
发表于 2014-10-12 17:19:53 | 只看该作者
在命令行里加入就可以了。

如果你用的 ide,则要看什么 ide ,进行什么操作了
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2025-4-28 16:40

Powered by Discuz! X3.4

© 2013-2025 Comsenz Inc.

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