Fortran Coder

查看: 8067|回复: 2
打印 上一主题 下一主题

[流程控制] 关于循环数值传递

[复制链接]

67

帖子

16

主题

0

精华

专家

F 币
275 元
贡献
201 点
跳转到指定楼层
楼主
发表于 2017-9-21 15:29:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 wxy 于 2017-9-21 16:27 编辑

[Fortran] 纯文本查看 复制代码
Program hello
  Implicit None
  Real :: distance, row_3, k, dd(1,201801)
  Integer :: row_1, row_2, i, nn, mm, ii
  Real, Allocatable :: lonx(:), laty(:), ilon(:), ilat(:)
!--------------------------------------------------------------------------
!a文件坐标点
!--------------------------------------------------------------------------
  nn = 96232
  Allocate (lonx(nn), laty(nn))

  Open (Unit=11, File='D:\气象数据\tmin\pointmatch_all.txt')
  Do i = 1, nn
    Read (11, *) row_1, row_2, lonx(i), laty(i), row_3
!   write(*,*)lonx(i), laty(i)
  End Do

  Close (Unit=11)
!----------------------------------------------------------------------------
!b文件坐标点
!----------------------------------------------------------------------------
  mm = 201801
  Allocate (ilon(mm), ilat(mm))

  Open (Unit=12, File='D:\气象数据\tmin\test.txt')
  Do ii = 1, mm
    Read (12, *) ilon(ii), ilat(ii), row_3
!    write(*,*)ilon(ii), ilat(ii)
  End Do
  Close (Unit=12)
!----------------------------------------------------------------------------
!两个循环用来计算距离
!----------------------------------------------------------------------------
 !Allocate (dd(mm))!放入坐标点距离
  Open (Unit=13, File='D:\气象数据\tmin\test5.txt')

  Do i = 1, nn
    Do ii = 1, mm - 1

      dd( i,ii) = distance(lonx(i), laty(i), ilon(ii), ilat(ii))
! write (*, *) dd(i,ii)
    End Do
    Write (*, *) dd(i, ii)
!--------------------------------------------------------------------------
!输出B文件中最近点坐标
!--------------------------------------------------------------------------
    k = minloc(dd(i,1:ii), 1)
    If (ii/=k) Cycle
!Write (*,*) lonx(i), laty(i), ilon(ii), ilat(ii),kk(ii)
    Write (13, *) lonx(i), laty(i), ilon(ii), ilat(ii), dd(i, ii)

  End Do
  Deallocate (lonx, laty, ilon, ilat)
End Program hello
a文件有96232个坐标点,b有201801个点,我想把这两个文件的坐标点循环计算距离,然后把b中距离a中最近的坐标点(96232个)输出
现在第41行dd(II),print结果是对的而第43行(do循环外面)lonx(i), laty(i)部分是对的,而 ilon(ii), ilat(ii)部分只接收到了do循环最后一次的结果,怎样才能把do所有结果都传到循环外面呢
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

1958

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1341 元
贡献
565 点

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

沙发
发表于 2017-9-21 16:51:45 | 只看该作者
修改见下面代码以 !// 为注释的内容

[Fortran] 纯文本查看 复制代码
Program hello
  Implicit None
  Integer , parameter :: NN = 96232 , MM = 201801
  Real :: distance, row_3, k, dd(MM)!//dd用一维数组即可
  Integer :: row_1, row_2, i, ii
  Real, Allocatable :: lonx(:), laty(:), ilon(:), ilat(:)
!--------------------------------------------------------------------------
!a文件坐标点
!--------------------------------------------------------------------------
  Allocate (lonx(nn), laty(nn))

  Open (Unit=11, File='D:\气象数据\tmin\pointmatch_all.txt')
  Do i = 1, nn
    Read (11, *) row_1, row_2, lonx(i), laty(i), row_3
  End Do
  Close (Unit=11)
!----------------------------------------------------------------------------
!b文件坐标点
!----------------------------------------------------------------------------
  Allocate (ilon(mm), ilat(mm))
  Open (Unit=12, File='D:\气象数据\tmin\test.txt')
  Do ii = 1, mm
    Read (12, *) ilon(ii), ilat(ii), row_3
  End Do
  Close (Unit=12)
!----------------------------------------------------------------------------
!两个循环用来计算距离
!----------------------------------------------------------------------------
 !Allocate (dd(mm))!放入坐标点距离
  Open (Unit=13, File='D:\气象数据\tmin\test5.txt')

  Do i = 1, nn
    Do ii = 1, mm !//不减1
      dd(ii) = distance(lonx(i), laty(i), ilon(ii), ilat(ii))
    End Do
    Write (*, *) dd(mm)
!--------------------------------------------------------------------------
!输出B文件中最近点坐标
!--------------------------------------------------------------------------
    k = minloc(dd(:), 1) !//去掉1:ii
    !// 去掉If (ii/=k) Cycle
    Write (13, *) lonx(i), laty(i), ilon(k), ilat(k), dd(k)
  End Do
  Deallocate (lonx, laty, ilon, ilat)
End Program hello

67

帖子

16

主题

0

精华

专家

F 币
275 元
贡献
201 点
板凳
 楼主| 发表于 2017-9-21 17:17:38 | 只看该作者
fcode 发表于 2017-9-21 16:51
修改见下面代码以 !// 为注释的内容

[mw_shl_code=fortran,true]Program hello

非常感谢
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-4-25 07:02

Powered by Tencent X3.4

© 2013-2024 Tencent

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