24小时热门版块排行榜    

CyRhmU.jpeg
查看: 2778  |  回复: 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 ]
回复此楼

» 收录本帖的淘帖专辑推荐

fortran 原子距离

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

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

阿黛拉

银虫 (小有名气)


有能指点一二的本人不胜感激!
进退有度,才不至进退维谷;宠辱皆忘,方可以宠辱不惊。
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的回帖

阿黛拉

银虫 (小有名气)

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

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

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

5楼2011-02-22 11:15:16
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)


小木虫(金币+0.5):给个红包,谢谢回帖交流

你没有明白我的意思

我的问题有二:

1)你的每个原子是一行,还是有换行?你的这些数据是从哪里来的,别的软件输出的,还是你自己算的?

2)你的数据有固定的格式吗?比如 I2F6.2 之类的……

最好给一个原始格式的附件(一般应该是文本文件吧),这样可能更清楚地判断。
6楼2011-02-22 11:17:12
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

阿黛拉

银虫 (小有名气)

引用回帖:
Originally posted by snoopyzhao at 2011-02-22 03:17:12:
你没有明白我的意思

我的问题有二:

1)你的每个原子是一行,还是有换行?你的这些数据是从哪里来的,别的软件输出的,还是你自己算的?

2)你的数据有固定的格式吗?比如 I2F6.2 之类的……

最好给 ...

这是原始文件,搜nearest neighbor table你会看到我提供的数据。
原始文件是别的软件输出的。
进退有度,才不至进退维谷;宠辱皆忘,方可以宠辱不惊。
7楼2011-02-22 12:24:01
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)


小木虫(金币+0.5):给个红包,谢谢回帖交流

可能比较麻烦,回头写一个看看吧,呵呵
8楼2011-02-22 14:19:48
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

阿黛拉

银虫 (小有名气)

引用回帖:
Originally posted by snoopyzhao at 2011-02-22 06:19:48:
可能比较麻烦,回头写一个看看吧,呵呵

好的,谢谢啊,
进退有度,才不至进退维谷;宠辱皆忘,方可以宠辱不惊。
9楼2011-02-22 14:48:26
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)

★ ★ ★ ★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖交流
余泽成(金币+5): 辛苦了! 2011-02-27 15:11:23
CODE:
program ex

implicit none
character(len = 128) :: line, fm
integer :: ios, len_line, i, j
real, dimension(5000) :: table

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) exit
   len_line = len(trim(line(27:)))
   write(fm,'(a,i0,a)') '(', len_line/9,'(tr5,f4.2))'
   read (line(27:), fm) (table(i), i=j+1,j+len_line/9)
   j = j + len_line/9
end do

write (*,'(f4.2)') (table(i), i= 1, j)

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

end program ex

用 gfortran ex.f90 编译之后,获得可执行文件 a.exe,然后运行

a.exe < OUTCAR > re.txt

打开 re.txt 之后,最后一个数字就是平均值。当然,如果你只要最后一个数字,可以把第二个 write 注释掉(这一行是我用来看是不是正确读取了所需要的数据用的),然后

a.exe < OUTCAR

就可以了……
10楼2011-02-22 15:05:02
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 阿黛拉 的主题更新
普通表情 高级回复(可上传附件)
信息提示
请填处理意见