gpt4 book ai didi

python - Fortran:以 Python 方式使用数组:派生类型、派生类型迭代

转载 作者:行者123 更新时间:2023-12-05 03:19:35 24 4
gpt4 key购买 nike

我目前正在尝试更详细地了解 Fortran。在此过程中,我正在尝试实现一种算法,我已经使用 python 实现了该算法。我有一个小数组,看起来像这样:

small_array = some_class(a, b, [x,y,z])

用 s 个小数组,创建一个中等数组。

medium_array = [small_array_1, small_array_2, ...]

用 m 个中型阵列,创建一个大阵列。

big_array = [medium_array_1, medium_array_2, ...]

我在 fortran 中使用派生类型,但这样我只能以更困难的方式获得所需的功能。

我想做的是获取 big_array 中 medium_array 的数量和 medium_array 中 small_array 的数量。我尝试使用 Extent(...) 但这不适用于派生类型。我还想以标准数组方式访问那些派生类型(或者无论如何这可以完成),例如big_array(1,1,:) 以访问第一个 big_array 和 middle_array 的所有 small_arrays。

有什么更好的方法吗?

编辑:这是我试图在 Fortran(Python 代码)中定义的内容:

H1_pg1a = primitive_gaussian(some values..) # These will be derive types in Fortran i suppose, in python these are implemented as class
H1_pg1b = primitive_gaussian(some values..)
H1_pg2a = primitive_gaussian(some values..)

H2_pg1a = primitive_gaussian(some values..)
H2_pg1b = primitive_gaussian(some values..)
H2_pg2a = primitive_gaussian(some values..)

H1_1s = [H1_pg1a, H1_pg1b] # These will be lists of derive types
H1_2s = [H1_pg2a]
H2_1s = [H2_pg1a, H2_pg1b]
H2_2s = [H2_pg2a]

molecule = [H1_1s, H1_2s, H2_1s, H2_2s] # These will be lists of lists of derive types

我需要做的是获取有关分子的一些信息:

nbasis = len(molecule)

这将像这样实现:

   for i in range(nbasis):  # iteration über spalten
for j in range(nbasis): # iteraion über zeilen

nprimitives_i = len(molecule[i])
nprimitives_j = len(molecule[j])

for k in range(nprimitives_i):
for l in range(nprimitives_j):
...

然后我想像这样访问类或派生类型的值

molecule[i][k].some_value

我开始将 primitive_gaussian 实现为派生类型,然后为派生类型列表和派生类型列表列表定义另一个派生类型。通过这样做,我只能访问具有 molecule%H1_1s&H1_pg1a%some_value 的值,我无法对其进行迭代。

最佳答案

Fortran 和 Python 处理数组的数组的方式非常不同。

python 片段

a = [1, 2]
b = [3, 4]
c = [a, b]

会产生类似这样的结构

c = [[1, 2], [3, 4]]

但是表面上相似的 Fortran 片段

integer, allocatable :: a(:)
integer, allocatable :: b(:)
integer, allocatable :: c(:)

a = [1, 2]
b = [3, 4]
c = [a, b]

将改为产生如下结构

c = [1, 2, 3, 4]

即Fortran 中 [a, b] 的结果是一个扁平数组,其中包含 ab 的内容,其中 的结果Python 中的 [a, b] 是一个包含 ab 作为单独对象的数组。

如果您想要 Fortran 中的数组数组,您要么必须使用多维数组,要么为每个子数组类型显式定义包装器类型。

关于python - Fortran:以 Python 方式使用数组:派生类型、派生类型迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73425071/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com