计算化学公社

标题: Fortran有快速识别文件内容的工具吗? [打印本页]

作者
Author:
wxhwbh    时间: 2019-10-6 15:57
标题: Fortran有快速识别文件内容的工具吗?
比如说写一个电子结构程序,想利用基组库下的基组文件生成GTO数组。也就是打开基组文件后,识别文件里面的字符,如果元素字母对应上的话就可以读取这个元素以下几行的数据(也就是GTO指数和系数),读到*号(也就是这个元素结束的位置)就停止。然后下一个元素继续重新搜索文件,读取数据。这样就不用生成一个很大的储存所有元素GTO信息的数组,且想用什么基组只要有基组文件就行了。但我不知道Fortran是否有这样的识别文件内容的功能,搜了下C或者Python好像是可以用正则表达式匹配的,但Fortran好像不支持。想问问大家Fortran有类似的功能吗?非常感谢!

作者
Author:
一颗赛艇    时间: 2019-10-7 06:12
这年代写新程序还要死磕fortran……
作者
Author:
sobereva    时间: 2019-10-7 06:49
一颗赛艇 发表于 2019-10-7 06:12
这年代写新程序还要死磕fortran……

Fortran在写科学计算程序上有着极大的便利和优越性
很多不很懂Fortran的人总是对Fortran抱有极大的偏见
话说Grimme的xtb开发也才没几年,Grimme懂C也懂Python,xtb照样是99.9%的代码靠fortran编写,里面还利用了很多Fortran较新规范定义的新特征


作者
Author:
sobereva    时间: 2019-10-7 06:53
用Multiwfn的util.f90里的subroutine loclabel,可以直接定位,比如call loclabel(10,"nico")就会从10号文件里从头开始定位到含有nico的字符串。loclabel还有更多可选参数,见代码的注释。

定位之后,就可以用do进行循环。每载入一行都可以用比如read(10,"(a)") c200这样载入到长度为200的字符串里,可以通过index(c200,'*')的返回值来判断这行是否有星号,如果无星号,就read(c200,*) ...从这行读信息

作者
Author:
wxhwbh    时间: 2019-10-7 15:20
sobereva 发表于 2019-10-7 06:53
用Multiwfn的util.f90里的subroutine loclabel,可以直接定位,比如call loclabel(10,"nico")就会从10号文 ...

谢谢社长。再请教一个问题,BSE基组库的基组文件系数是已经归一化的呢还是需要自己归一化?

作者
Author:
sobereva    时间: 2019-10-8 07:12
wxhwbh 发表于 2019-10-7 15:20
谢谢社长。再请教一个问题,BSE基组库的基组文件系数是已经归一化的呢还是需要自己归一化?

一般是归一化过的
但建议自己再归做一化一次,这样系数的精度更高(基组库里系数一般来自于原文,但一些原文里小数位保留得比较有限),这也避免某些基组的系数没有归一化的可能性




欢迎光临 计算化学公社 (http://bbs.keinsci.com/) Powered by Discuz! X3.3