24小时热门版块排行榜    

查看: 2904  |  回复: 34
本帖产生 1 个 程序强帖 ,点击这里进行查看
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

阿黛拉

银虫 (小有名气)

[交流] 【求助】如何写FORTRAN程序实现求平均最近邻距离 已有2人参与

请问会用FORTRAN写程序的高手:比如我有5个原子的图形坐标和最近邻距离的表格如下               
                   1 # # #  2¥ 3¥ 4¥ 5¥
                   2 # # #  1¥ 3¥ 4¥ 5¥
                   3 # # #  1¥ 2¥ 4¥ 5¥
                   4 # # #  1¥ 2¥ 3¥ 5¥
                   5 # # #  1¥ 2¥ 3¥ 4¥
#代表原子坐标,¥代表原子与最近邻原子的距离(这里的最近邻我写的是除了本身所有的,当然也有情况最近邻并不是除了本身剩余的原子)请问我如何通过程序实现平均最近邻距离的计算??
我想要的是平均距离,也就是所有的¥加和平均。 我这举得是5个的,也可以手动实现,但是我想处理的是60  70 80 诸如这种的,这样的话最近邻可能就得是几百个数,请问如何实现?

实例如下(原格式如第二三行,下面的在复制粘贴时出现了换行,15-38是正常的格式)
ion  position               nearest neighbor table
   1  0.332  0.445  0.489-  25 2.79  21 2.80  20 2.80  31 2.80  35 2.80  28  2.80  
                                         10 2.89  12 2.89 14 2.90
   2  0.501  0.393  0.386-  20 2.79  29 2.79  16 2.80  38 2.80  30 2.80  28 2.80  10 2.89  14 2.90
                             9 2.90
   3  0.610  0.411  0.558-  37 2.79  34 2.80  17 2.80  16 2.80  30 2.80  24 2.80  14 2.89  13 2.90
                             9 2.90
   4  0.645  0.608  0.515-  17 2.80  36 2.80  22 2.80  34 2.80  32 2.80  19 2.80   9 2.90  13 2.90
                            11 2.90
   5  0.366  0.641  0.446-  31 2.80  26 2.80  23 2.80  18 2.80  33 2.80  25 2.80  11 2.88  10 2.89
                            12 2.89
   6  0.441  0.463  0.661-  35 2.79  37 2.80  21 2.80  27 2.80  15 2.80  24 2.80  12 2.89  14 2.89
                            13 2.90
   7  0.535  0.590  0.344-  38 2.79  26 2.80  32 2.80  18 2.80  29 2.80  19 2.80   9 2.89  10 2.89
                            11 2.89
   8  0.476  0.660  0.618-  23 2.79  22 2.80  15 2.80  36 2.80  33 2.80  27 2.80  12 2.90  11 2.90
                            13 2.90
   9  0.568  0.502  0.454-  11 2.72  13 2.72  10 2.72  14 2.72  19 2.83  34 2.83  16 2.83  38 2.84
                             7 2.89   4 2.90   2 2.90   3 2.90
  10  0.437  0.518  0.421-   9 2.72  11 2.72  14 2.72  12 2.73  26 2.83  28 2.83  29 2.83  25 2.84
                             1 2.89   2 2.89   5 2.89   7 2.89
  11  0.504  0.619  0.482-   9 2.72  12 2.72  13 2.72  10 2.72  22 2.83  32 2.83  18 2.83  33 2.83
                             5 2.88   7 2.89   8 2.90   4 2.90
  12  0.409  0.551  0.551-  13 2.72  11 2.72  14 2.72  10 2.73  27 2.83  21 2.83  23 2.83  31 2.83
                             1 2.89   5 2.89   6 2.89   8 2.90
  13  0.540  0.535  0.583-  14 2.72  12 2.72   9 2.72  11 2.72  15 2.83  17 2.83  37 2.83  36 2.83
                             4 2.90   3 2.90   8 2.90   6 2.90
  14  0.472  0.434  0.522-  13 2.72  10 2.72   9 2.72  12 2.72  24 2.83  30 2.83  20 2.83  35 2.83
                             3 2.89   6 2.89   2 2.90   1 2.90
  15  0.512  0.569  0.717-  27 2.79  36 2.79  37 2.79   8 2.80   6 2.80  13 2.83
  16  0.635  0.381  0.424-  34 2.79  38 2.80  30 2.80   2 2.80   3 2.80   9 2.83
  17  0.676  0.519  0.618-  34 2.79  36 2.80  37 2.80   4 2.80   3 2.80  13 2.83
  18  0.468  0.708  0.378-  33 2.79  32 2.80  26 2.80   5 2.80   7 2.80  11 2.83
  19  0.668  0.571  0.382-  32 2.79  34 2.79  38 2.79   7 2.80   4 2.80   9 2.83
  20  0.402  0.328  0.460-  35 2.79  28 2.79   2 2.79  30 2.80   1 2.80  14 2.83
  21  0.308  0.481  0.622-  27 2.79  31 2.79  35 2.80   1 2.80   6 2.80  12 2.83
  22  0.574  0.725  0.544-  36 2.79  32 2.79  33 2.80   8 2.80   4 2.80  11 2.83
  23  0.341  0.672  0.581-  31 2.79   8 2.79  33 2.79  27 2.80   5 2.80  12 2.83
  24  0.508  0.344  0.626-  30 2.79  35 2.80  37 2.80   3 2.80   6 2.80  14 2.83
  25  0.300  0.534  0.386-  26 2.79   1 2.79  28 2.79  31 2.80   5 2.80  10 2.84
  26  0.399  0.604  0.316-  25 2.79  29 2.79   7 2.80  18 2.80   5 2.80  10 2.83
  27  0.378  0.585  0.684-  15 2.79  21 2.79  23 2.80   6 2.80   8 2.80  12 2.83
  28  0.365  0.414  0.357-  29 2.79  20 2.79  25 2.79   2 2.80   1 2.80  10 2.83
  29  0.464  0.484  0.287-  28 2.79  26 2.79  38 2.79   2 2.79   7 2.80  10 2.83
  30  0.537  0.311  0.494-  24 2.79  16 2.80  20 2.80   2 2.80   3 2.80  14 2.83
  31  0.272  0.568  0.518-  23 2.79  21 2.79   5 2.80  25 2.80   1 2.80  12 2.83
  32  0.603  0.692  0.411-  19 2.79  22 2.79  18 2.80   7 2.80   4 2.80  11 2.83
  33  0.440  0.742  0.510-  23 2.79  18 2.79  22 2.80   5 2.80   8 2.80  11 2.83
  34  0.705  0.485  0.486-  16 2.79  19 2.79  17 2.79   3 2.80   4 2.80   9 2.83
  35  0.373  0.361  0.593-  20 2.79   6 2.79  21 2.80  24 2.80   1 2.80  14 2.83
  36  0.611  0.639  0.647-  22 2.79  15 2.79  17 2.80   4 2.80   8 2.80  13 2.83
  37  0.577  0.449  0.688-   3 2.79  15 2.79  17 2.80  24 2.80   6 2.80  13 2.83
  38  0.599  0.468  0.320-   7 2.79  29 2.79  19 2.79  16 2.80   2 2.80   9 2.84

[ Last edited by 阿黛拉 on 2011-2-22 at 09:10 ]
回复此楼

» 猜你喜欢

进退有度,才不至进退维谷;宠辱皆忘,方可以宠辱不惊。
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)


小木虫(金币+0.5):给个红包,谢谢回帖交流
引用回帖:
在这段话中,你的意思好象不那么明确,呵呵……如果我们把情况弄得更复杂的话,现在我们有 38 个 ion,1-10 为一组,11-27 为一组,28-38 为一组。假定我们需要算第 1 组与第 3 组的情况,按你最新的意思进行计算,便与前面的意思矛盾了。按你最新的意思,我们需要定义四个数, ion_pos_1 = 1、ion_pos_2=10、ion_pos_3=28、ion_pos_4=38。首先在 1-10 这组中,读取后面的整数 1-10 后面的数,求平均值,此乃第一种情况;在28-38这一组中,读取后面整数28-38的数,求平均值,此乃第二种情况;在1-10这一组中,读取后面整数为 28-38后面的数,加上28-38这一组中,后面整数为1-10后面的数,加和,求平均值。

应该是这样的吧……

根据上面的意思,重新整理了一下:
CODE:
program ex

implicit none
character(len = 128) :: line, fm
integer :: ios, len_line, i, j, ion_num, ion_tmp
real, dimension(5000) :: table
integer, dimension(5000) :: ion
integer, dimension(5000) :: ion_table ! ion in table
integer, parameter :: ion_pos_1 = 1
integer, parameter :: ion_pos_2 = 10
integer, parameter :: ion_pos_3 = 28
integer, parameter :: ion_pos_4 = 38
real :: sum_1, sum_2, sum_3
integer :: i_1, i_2, i_3

do
   read (*,'(a)', iostat = ios) line
   if (ios < 0) exit
   if (index(line, 'nearest neighbor table') /= 0) exit
end do

j = 0

do
   read (*,'(a)', iostat = ios) line
   if (ios < 0) exit
   if (index(line, 'LATTYP') /= 0) exit
   if (len(trim(line)) == 0) cycle
   len_line = len(trim(line(27:)))
   write(fm,'(a,i0,a)') '(', len_line/9,'(tr1,i3,tr1,f4.2))'
   read (line(27:), fm) (ion_table(i), table(i), i=j+1,j+len_line/9)
   read(line, '(tr1,i3)') ion_tmp
   if (ion_tmp /= 0) ion_num = ion_tmp
   do i=j+1, j+len_line/9
      ion(i) = ion_num
   end do
   j = j + len_line/9
end do

write (*,'(i3,tr2,i3,tr2,f4.2)') (ion(i), ion_table(i), table(i), i= 1, j)

sum_1 = 0.0
sum_2 = 0.0
sum_3 = 0.0
i_1 =0
i_2 =0
i_3 =0

do i=1,j
   if (ion(i) >= ion_pos_1 .and. ion(i) <= ion_pos_2) then
      if (ion_table(i) >= ion_pos_1 .and. ion_table(i) <= ion_pos_2) then
         sum_1 = sum_1 + table(i)
         i_1 = i_1 + 1
         write(1,'(i3,tr2,i3,tr2,f4.2)') ion(i), ion_table(i), table(i)
      else if (ion_table(i) >= ion_pos_3 .and. ion_table(i) <= ion_pos_4) then
         sum_3 = sum_3 + table(i)
         i_3 = i_3 + 1
         write(3,'(i3,tr2,i3,tr2,f4.2)') ion(i), ion_table(i), table(i)
      end if
   else if (ion(i) >= ion_pos_3 .and. ion(i) <= ion_pos_4) then
      if (ion_table(i) >= ion_pos_3 .and. ion_table(i) <= ion_pos_4) then
         sum_2 = sum_2 + table(i)
         i_2 = i_2 + 1
         write(2,'(i3,tr2,i3,tr2,f4.2)') ion(i), ion_table(i), table(i)
! the following four lines could be deleted, for they give same result as the above sum_3...
      else if (ion_table(i) >= ion_pos_1 .and. ion_table(i) <= ion_pos_2) then
         sum_3 = sum_3 + table(i)
         i_3 = i_3 + 1
         write(3,'(i3,tr2,i3,tr2,f4.2)') ion(i), ion_table(i), table(i)
      end if
   end if
end do

write(*,*) sum(table(1:j))/j

write(*,*), sum_1, i_1, sum_2, i_2, sum_3, i_3

write(*,*) sum_1/i_1, sum_2/i_2, sum_3/i_3

end program ex

29楼2011-02-26 10:13:17
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 35 个回答

阿黛拉

银虫 (小有名气)


有能指点一二的本人不胜感激!
进退有度,才不至进退维谷;宠辱皆忘,方可以宠辱不惊。
2楼2011-02-22 09:40:26
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)

★ ★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖交流
余泽成(金币+3): 谢谢参与应助! 2011-02-27 15:10:56

你的问题是如何把这些数都读入,呵呵……

另外,你的每个原子就一行,还是有很多行?

你的数据有相应的格式规范吗?
3楼2011-02-22 10:55:14
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

阿黛拉

银虫 (小有名气)

引用回帖:
Originally posted by snoopyzhao at 2011-02-22 02:55:14:
你的问题是如何把这些数都读入,呵呵……

另外,你的每个原子就一行,还是有很多行?

你的数据有相应的格式规范吗?

非常感谢您的回复。我的数据格式如下。请问如何才能实现将2.78   2.89 这样的数读出来,因为中间夹杂者整数。我学过C语言,对于C的简单的程序还是明白什么意思的。没有学过编程,所以在处理问题方面不知如何下手?FORTRAN编程听别人讲过一点,但是没有系统的学过。如果您能帮写一下,那是更好或者你提供这方面的相关知识,我自己摸索也可以。总之非常感谢您。我现在也就是针对问题解决问题。没有大量的时间系统的学习。



进退有度,才不至进退维谷;宠辱皆忘,方可以宠辱不惊。
4楼2011-02-22 11:13:11
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
普通表情 高级回复 (可上传附件)
信息提示
请填处理意见