Fortran Coder

查看: 2974|回复: 4

[输入输出] Fortran外部文件数据读取

[复制链接]

2

帖子

1

主题

0

精华

新人

F 币
15 元
贡献
5 点
发表于 2022-11-27 17:04:03 | 显示全部楼层 |阅读模式
采用ABAQUS软件的UEXTERNALDB子程序,读取外部文件的GIRD_FI(4,9)和GIRD_LAMDA(4)值赋值给变量供其他子程序调用Q1:网上找的程序代码,里边所示的CREEP.IN和CREEP.OUP文件是fortran语言中的一种文件类型吗,还是也是txt文件?Q2:下边程序读写时先读的GIRD_LAMDA(4),为什么在COMMON中GIRD_FI(4,9)在GIRD_LAMDA(4)的前面?位置正确吗Q3:现有GIRD_LAMDA(4)的值分别为 0.5 , 0.06 , 0.007 , 0.0008
         GIRD_FI(4,9)的值
                                          0.1,0.6,0.96,0.19
                                          0.3,0.2,0.1,0.4
                                          0.51,0.1,0.9,0.08
                                          0.8,0.6,0.05,0.03
                                          0.1,0.01,0.0,0.2
                                          0.6,0.01,0.91,0.2
                                          0.6,0.01,0.06,0.5
                                          0.08,0.09,0.04,0.8
                                          0.09,0.02,0.05,0.2
这些数据该如何存入文件内部(按照什么顺序格式排列)才能准确把值赋予每个变量读取进入子程序?

1.png






1948

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1298 元
贡献
547 点

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

发表于 2022-11-27 17:48:55 | 显示全部楼层
Q1.
Fortran是一种编程语言,只要你理解文件的格式(存储方式,顺序,含义等),你可以用Fortran读取任何文件,比如mp3,avi,pdf,xls这些我们耳熟能详的文件。
Fortran本身并不规定任何文件格式
所以,CREEP.inCREEP.oup 可能是原来代码作者规定的文件格式。(而不是Fortran,因为Fortran不规定任何文件格式)
它们应该就是普通的txt纯文本文件。

Q2.
读写变量的顺序,不需要和变量的定义顺序相同。甚至读写的变量可以来自不同的定义位置(module,虚参,局部变量,common等)

Q3.
如果是用 READ(106,*) (GIRD_LAMDA(i),i=1,4) 语句来读取的话。
可以用比较自由的形式在文件中存储。比如
0.5 , 0.06 , 0.007 , 0.0008
这种逗号间隔,也可以用空格间隔。甚至2行,每行2个
0.5 0.06
0.007 0.0008

也可以第一行1个,第二行3个
0.5
0.06 0.007 0.0008

其他组合也可以,例如第一行2个,第二行1个,第三行1个。都可以

2

帖子

1

主题

0

精华

新人

F 币
15 元
贡献
5 点
 楼主| 发表于 2022-11-27 20:26:14 | 显示全部楼层
fcode 发表于 2022-11-27 17:48
Q1.
Fortran是一种编程语言,只要你理解文件的格式(存储方式,顺序,含义等),你可以用Fortran读取任何文 ...

非常感谢您的回答。

还有点疑惑再请教您一下,我想要把GIRD_LAMDA(4)和GIRD_FI(4,9)的数据放到一个文档里边;GIRD_FI(4,9)是二维数组,是不是我只要把GIRD_LAMDA(4)的数据放在GIRD_FI(4,9)数据之前,读取时先读GIRD_LAMDA(4)后读GIRD_FI(4,9)就可以上述顺序放入文件读取进去就可以了;

还有个问题是GIRD_LAMDA(4)是一维数组,GIRD_FI(4,9)是二维数组,他俩数据的存放方式一样吗?文件里应如何设置才能保证他们能够位置正确,例如我后边想要调取GIRD_FI(2,3)这个数,怎么能确定是我想要的数据呢?
还有就是您这边有相关的书籍资料推荐吗,我对这一块很困惑,想弄懂清晰一点,谢谢啦!

1948

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1298 元
贡献
547 点

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

发表于 2022-11-27 22:07:07 | 显示全部楼层
根据你给出的代码片段来看。GIRD_LAMDA 和 GIRD_FI 本来就都在一个文档(GREEP.in)里面。
读取时,先读的 GIRD_LAMDA,后读的 GIRD_FI,那么文件里就先放 GIRD_LAMDA后放 GIRD_FI 就可以了。

一维数组二维数组,是Fortran程序的概念。对于文件来说是一样的。read 语句会把文件里的数据,根据程序中对变量定义的维度重新排列。

比如文件里内容是
0.5 , 0.06 , 0.007 , 0.0008
0.1,0.6,0.96,0.19
0.3,0.2,0.1,0.4
0.51,0.1,0.9,0.08
0.8,0.6,0.05,0.03
0.1,0.01,0.0,0.2
0.6,0.01,0.91,0.2
0.6,0.01,0.06,0.5
0.08,0.09,0.04,0.8
0.09,0.02,0.05,0.2


你读取了 GIRD_LAMDA,它的大小是4。接着读取了 GIRD_FI,它的大小是9*4那么红色部分会赋予给 GIRD_LAMDA蓝色部分会赋予给 GIRD_FI

可以看彭国伦的《Fortran95程序设计》,本坛网盘里有。http://pan.fcode.cn

1948

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1298 元
贡献
547 点

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

发表于 2022-11-27 22:14:22 | 显示全部楼层
read(106,*) 变量列表
这种,read括号里第二个位置是 *,的读取方式叫做表控格式。全称变量列表控制格式(List-Directed format)
编译器产生的代码,执行过程是这样的:

先确定变量列表中有多少个变量。比如 read(106,*) GIRF_LAMDA(i),i=1,4 则需要读取4个变量。
从文件中读取一整行,根据顺序分别对应变量列表
如果这一整行的数据量大于变量列表,则丢弃这一行后面多余的数据。结束读取。
如果这一整行的数据量等于变量列表,则直接结束读取。
如果这一整行的数据量小于变量列表,则继续读取下一个一整行,分配到剩余的变量列表,重复上述步骤。
  直到读取到的数据量大于等于变量列表要求的数据量为止。

注意,编译器每次读取的单位是一整行。所以,如果文件中内容是:
1 2 3
4 5
那么 5 这个数据会被丢弃,而不会赋值给 GIRF_FI(1,1)。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-3-29 19:24

Powered by Tencent X3.4

© 2013-2024 Tencent

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