关于循环数值传递
本帖最后由 wxy 于 2017-9-21 16:27 编辑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 helloa文件有96232个坐标点,b有201801个点,我想把这两个文件的坐标点循环计算距离,然后把b中距离a中最近的坐标点(96232个)输出
现在第41行dd(II),print结果是对的而第43行(do循环外面)lonx(i), laty(i)部分是对的,而 ilon(ii), ilat(ii)部分只接收到了do循环最后一次的结果,怎样才能把do所有结果都传到循环外面呢
修改见下面代码以 !// 为注释的内容
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 fcode 发表于 2017-9-21 16:51
修改见下面代码以 !// 为注释的内容
Program hello
非常感谢:-loveliness:
页:
[1]