arrays - 使用 C 指针时,Fortran 数组中的更改会导致另一个数组的更改

标签 arrays fortran fftw

我使用两个数组 fg 的 FFTW3 使用相同的计划进行 C 类型 SIMD 分配。我只是将 f 设置为 1,然后将 g 设置为 f,然后将 f 归零>。这也最终将 g 归零。

为什么会出现这种情况以及我可以通过哪些方法来确保任何通过切片(例如)派生的数组不会被修改。

我希望fg指向二维 double 内存的两个不同 block 。我没有使用通常的显式形状( double ,维度(n,n))定义作为 FFTW3 documentation指出以这种方式分配的数组处理起来更快。

program main

use,intrinsic::iso_c_binding
implicit none
include 'fftw3.f03'

integer,parameter::n=16
real(C_DOUBLE),pointer::f(:,:),g(:,:)
type(C_PTR)::p

p=fftw_alloc_real(int(n**2,C_SIZE_T))
!i am thinking of these as FFTW plans that store only the stencil to
!allocate space starting from addresses given by real(C_DOUBLE),pointers above.

call c_f_pointer(p,f,[n,n])
call c_f_pointer(p,g,[n,n])

f=1.0d0
print*,sum(f)
g=f

f=0.0d0
print*,sum(g)

call fftw_free(p)
end program

输出为

256.00000000000000     
0.0000000000000000

最佳答案

内存的分配是由fftw_alloc_real完成的。您只调用一次,因此只分配一个内存块。 c_f_pointer 不执行任何分配。

c_f_pointer 采用 C 指针,指针将 Fortran 指针与 C 指针的目标相关联。当你

call c_f_pointer(p,f,[n,n])
call c_f_pointer(p,g,[n,n])

您将 fgp 指向的同一 block 内存关联起来。

只需分配两个不同的部分,通过两次调用 fftw_alloc_real 并将 f 指向一个部分,将 g 指向另一个部分。

关于arrays - 使用 C 指针时,Fortran 数组中的更改会导致另一个数组的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51347628/

相关文章:

c - FFTW 单精度库在使用 SIMD 优化时输出不正确的 DFT

ios - 无法快速访问 JSON 数组

arrays - 遍历对象数组。如果找到正确的方法,则访问对象方法。否则在数组中创建一个新对象

fortran - fortran 中的并行错误

python - 通过 Cython 调用依赖 MPI 的 Fortran 模块

python - 根据相邻值替换二维数组中的值

javascript - FormArray - 如何将字符串数组传递给它?

save - fortran 保存整数

c++ - 使用 FFTW3 和 C++ 评估高斯的傅里叶变换