通过 fftw_mpi_r2c_2d 和 fftw_mpi_c2r_2d 输出不正确

2024-01-08

我编写了一个简单的测试程序,以便在 2d 域(使用 Fortran)中使用 MPI 实现 FFTW。该域的宽度为“Ny x Nx”,并在第二个(“x”)索引中进行分区。

在正确(我相信?)声明和分配变量和计划之后,我调用 fftw_mpi r2c_2d 函数,接下来我用 fftw_mpi c2r_2d 转换回其输出,以检查是否获得原始输入。 r2c_2d 部分似乎工作正常。但是,在使用 c2r_2d 函数转换回输出(归一化除外)后,我没有得到原始输入:生成的向量在索引 (:,j) 处显示“零”,其中 j 对应于“Ny/2”的倍数。我究竟做错了什么?谢谢!

这是代码的摘录:

Program TEST

use, intrinsic :: iso_c_binding

Implicit none

include 'mpif.h'
include 'fftw3-mpi.f03'

Integer*8,parameter :: nx=16, ny=16

!MPI
integer*8 :: ipe,npe
integer*8 ::mpi_realtype,icomm=mpi_comm_world,istat(mpi_status_size),ierr

! FFTW VARIABLES DECLARATION
type(C_PTR)           :: p1, p2, cdatar, cdatac
integer(C_INTPTR_T)   :: alloc_local, local_L, local_L_offset, local_M, local_M_offset
real(C_DOUBLE), pointer :: faux(:,:)   ! real input 2d function
complex(C_DOUBLE), pointer :: gaux(:,:) ! complex output of 2d FFTW (transposed)


! MPI initialization
call mpi_init(ierr)

call mpi_comm_rank(icomm,ipe,ierr)
call mpi_comm_size(icomm,npe,ierr)


! FFTW ALLOCATIONS AND PLANS

call fftw_mpi_init()


alloc_local = fftw_mpi_local_size_2d(ny/2+1,nx &
    ,MPI_COMM_WORLD, local_L, local_L_offset)


cdatac = fftw_alloc_complex(alloc_local)

call c_f_pointer(cdatac, gaux, [nx,local_L]) !transposed

alloc_local = fftw_mpi_local_size_2d(nx,ny/2+1, MPI_COMM_WORLD, &
    local_M, local_M_offset)


cdatar = fftw_alloc_real(2*alloc_local)

call c_f_pointer(cdatar, faux, [ny,local_M])

! Create plans

p1 = fftw_mpi_plan_dft_r2c_2d(nx,ny,faux,gaux, MPI_COMM_WORLD, &
        ior(FFTW_MEASURE, FFTW_MPI_TRANSPOSED_OUT))


p2 = fftw_mpi_plan_dft_c2r_2d(nx,ny,gaux,faux, MPI_COMM_WORLD, &
        ior(FFTW_MEASURE, FFTW_MPI_TRANSPOSED_IN))

! EXECUTE FFTW

call random_number(faux)


print *, "real input:", real(faux(1,:))

call fftw_mpi_execute_dft_r2c(p1,faux,gaux)

call fftw_mpi_execute_dft_c2r(p2, gaux, faux)

print *, "real output:", real(faux(1,:))/(nx*ny)

call fftw_destroy_plan(p1)
call fftw_destroy_plan(p2)


call  mpi_finalize(ierr)


End Program TEST

该问题是由于padding http://fftw.org/doc/Multi_002ddimensional-MPI-DFTs-of-Real-Data.htmlfftw 需要:

虽然真实数据在概念上是 n0 × n1 × n2 × … × nd-1 ,但它在物理上存储为 n0 × n1 × n2 × … × [2 (nd-1/2 + 1)] 数组,其中最后一个维度已被填充以使其与复数输出的大小相同。这很像就地串行 r2c/c2r 接口(请参阅实际数据的多维 DFT),只不过在 MPI 中,即使对于异地数据也需要填充。

因此,16x16 变换的输入数组是 16x18 数组。每行末尾额外的两个数字的值在真实空间中是没有意义的。然而,当 c 指针被转换为 Fortran 2D 数组时,这些额外的数字一定不能被忘记:

call c_f_pointer(cdatar, faux, [2*(ny/2+1),local_M])

额外的数字仍然打印在每行的末尾。可以对数组进行切片以避免打印这些无价值的值:

print *, "real input:", real(faux(1:ny,:))
...
print *, "real output:", real(faux(1:ny,:))/(nx*ny)

这是完整的代码,基于您的代码和以下之一如果可能的话,如何进行 fftw3 MPI“转置”2D 变换? https://stackoverflow.com/questions/24290014/how-to-do-a-fftw3-mpi-transposed-2d-transform-if-possible-at-all可以通过以下方式编译mpif90 main.f90 -o main -I/usr/include -L/usr/lib -lfftw3_mpi -lfftw3 -lm并跑过mpirun -np 2 main.

Program TEST

use, intrinsic :: iso_c_binding

Implicit none

include 'mpif.h'
include 'fftw3-mpi.f03'

Integer*8,parameter :: nx=4, ny=8

!MPI
integer*8 :: ipe,npe
integer*8 ::mpi_realtype,icomm=mpi_comm_world,istat(mpi_status_size),ierr

! FFTW VARIABLES DECLARATION
type(C_PTR)           :: p1, p2, cdatar, cdatac
integer(C_INTPTR_T)   :: alloc_local, local_L, local_L_offset, local_M, local_M_offset
real(C_DOUBLE), pointer :: faux(:,:)   ! real input 2d function
complex(C_DOUBLE), pointer :: gaux(:,:) ! complex output of 2d FFTW (transposed)


! MPI initialization
call mpi_init(ierr)

call mpi_comm_rank(icomm,ipe,ierr)
call mpi_comm_size(icomm,npe,ierr)


! FFTW ALLOCATIONS AND PLANS

call fftw_mpi_init()


alloc_local = fftw_mpi_local_size_2d(ny/2+1,nx &
    ,MPI_COMM_WORLD, local_L, local_L_offset)


cdatac = fftw_alloc_complex(alloc_local)

call c_f_pointer(cdatac, gaux, [nx,local_L]) !transposed

alloc_local = fftw_mpi_local_size_2d(nx,ny/2+1, MPI_COMM_WORLD, &
    local_M, local_M_offset)


cdatar = fftw_alloc_real(2*alloc_local)

call c_f_pointer(cdatar, faux, [2*(ny/2+1),local_M])

! Create plans

p1 = fftw_mpi_plan_dft_r2c_2d(nx,ny,faux,gaux, MPI_COMM_WORLD, &
        ior(FFTW_MEASURE, FFTW_MPI_TRANSPOSED_OUT))


p2 = fftw_mpi_plan_dft_c2r_2d(nx,ny,gaux,faux, MPI_COMM_WORLD, &
        ior(FFTW_MEASURE, FFTW_MPI_TRANSPOSED_IN))

! EXECUTE FFTW

call random_number(faux)


print *, "real input:", real(faux(1:ny,:))

call fftw_mpi_execute_dft_r2c(p1,faux,gaux)

call fftw_mpi_execute_dft_c2r(p2, gaux, faux)

print *, "real output:", real(faux(1:ny,:))/(nx*ny)

call fftw_destroy_plan(p1)
call fftw_destroy_plan(p2)


call  mpi_finalize(ierr)


End Program TEST
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 fftw_mpi_r2c_2d 和 fftw_mpi_c2r_2d 输出不正确 的相关文章

  • 如何将mortran代码转换为fortran代码

    我有一些 Mortran 代码 来自 glmnet 我想阅读和编译 我知道在编译时 Mortran首先转换为Fortran 然后编译 如果有预处理器的话 如何安装 Mortran 预处理器 特别是 OS X 上的 Mortran3 我在以下
  • 如何在Fortran代码中将二维数组转换为一维数组?

    如何将 r i j 转换为一维数组以便可以轻松地对数字进行排序 program sort implicit none character CN 8 O 7 integer j iconf nconf integer i nbins t in
  • GProf 输出中缺少函数

    我正在尝试分析一些 C 代码 但最直观地成本最高的函数之一并未出现在 GProf 输出中 int main initialise haloSwap for functions propagate functions void propaga
  • Python 读取未格式化的直接访问 Fortran 90 给出不正确的输出

    这是数据的写入方式 它是一个二维浮点矩阵 我不确定大小 open unit 51 file rmsd nn output form unformatted access direct status replace recl Npoints
  • gfortran 支持尾调用消除吗?

    我编写了这个小程序来测试 gfortran 是否执行尾调用消除 program tailrec implicit none print tailrecsum 5 0 contains recursive function tailrecsu
  • 如何格式化整数以仅具有所需的大小?

    我一直在尝试以下代码 program hello write i9 10 end program hello 并改变格式字符串 尝试使写入输出的字符串大小恰好满足表示整数所需的大小 但到目前为止我无法管理它 如何在 Fortran 中编写
  • Fortran gfortran linux 中的“分段错误(核心转储)”错误

    我正在创建一个程序 该程序将分析目录中的文件 fits 然后它将在另一个目录中创建另一个文件 txt 它只是一个转换器 当我尝试执行该程序 编译正常 时 它给了我一条错误消息 程序收到信号 SIGSEGV 分段错误 无效的内存引用 此错误的
  • forrt1:严重(170):程序异常 - 堆栈溢出

    并提前感谢您的帮助 我已经编译了一个程序 不是我编写的 它在 Mac 上运行得很好 但是当我尝试在 Windows 上执行该程序时 在程序开始执行后不久 我收到以下错误消息 forrt1 严重 170 程序异常 堆栈溢出 我不是 ifort
  • MPI 从文本文件中读取

    我正在学习 MPI 编程 我遇到了这个问题 假设我有一个包含 100 000 行 行的 txt 文件 如何将它们分块以供 4 个处理器处理 即我想让处理器 0 负责第 0 25000 行的处理 让处理器 1 负责第 25001 50000
  • 使用 Fortran 进行数组问题的二分查找

    我正在使用 Schaum 的 Fortran 77 编程概要 一书 其中有一个关于使用括号值组方法进行二分搜索的示例 首先这是代码 INTEGER X 100 INTEGER RANGE INTEGER START FINISH PRINT
  • MPI_Type_Create_Hindexed_Block 生成派生数据类型的错误范围

    使用Fortran 我尝试为动态分配的结构构建派生数据类型 但它得到了新类型的错误范围 代码如下 PROGRAM MAIN IMPLICIT NONE INCLUDE mpif h INTEGER I INTEGER MYID NUMPRO
  • Fortran :: (1) 处 OPEN 语句中存在语法错误

    我试图通过 顽固测试 来测试我的密码算法 http stat fsu edu pub diehard http stat fsu edu pub diehard 我意识到我的输入文件必须是未格式化的直接访问文件 所以我尝试用 Fortran
  • 如何在fortran 90中生成[0,5]范围内的整数随机数?

    我对 Fortran 编程有点陌生 任何人都可以帮我解决问题吗 我在生成整数随机数时遇到问题 在 Fortran 随机数范围 0 5 中使用 random seed 和 rand 为了支持answer https stackoverflow
  • mpi4py:关闭 MPI Spawn?

    我有一些 python 代码 我经常在其中生成多个进程 我收到错误 ORTE ERROR LOG The system limit on number of pipes a process can open was reached in f
  • 将结构化数据类型从 Fortran 传递到 C++ [重复]

    这个问题在这里已经有答案了 我在 Fortran 中有一个结构化类型 其中包含大量数据 包括指针 real 8 指针数据类型 我正在为某些 Fortran 例程开发 C API 我需要在对 Fortran 例程的调用之间保留该结构的内容 我
  • 使用 DFT 的一维热方程产生不正确的结果 (FFTW)

    我正在尝试使用复数到复数 IDFT 求解一维热方程 问题在于单个时间步后的输出似乎不正确 我在下面提供了一个简单的示例来说明该问题 I initialize the temperature state as follows 频域中的初始模式
  • 用于稀疏矩阵的 Fortran 90/95 库?

    我正在寻找一个用于处理 Fortran 90 95 中稀疏矩阵的库 我只需要非常基本的运算 例如矩阵向量乘法 你建议我用什么 我搜索了一下 找到了 BLAS 的一个扩展 称为 稀疏 blas 记录在blast技术论坛规范的第 3 章中 ht
  • MPI_SEND 在 MPI_BARRIER 之后停止工作

    我正在 C MPI 中构建一个分布式 Web 服务器 在我的代码中的第一个 MPI BARRIER 之后 点对点通信似乎完全停止工作 标准 C 代码在屏障之后工作 因此我知道每个线程都可以通过屏障 点对点通信在障碍物之前也能正常工作 但是
  • 当输入字符而不是数字时,防止 FORTRAN 关闭

    我有一个读取语句需要一个数字 非常简单的示例代码 program test integer var read var end 问题是我通常输入一串字符 即 yes 因为分心 如何防止我的代码完全停止并显示以下类型的错误消息您输入了错误的值
  • Fortran 中的指针数组

    我已经编写一个用于热力学计算的大型 Fortran 程序近 10 年了 当我开始时 我对新的 Fortran 标准还很陌生 我很熟悉 F77 而且太老了 无法学习其他东西 我发现新的 TYPE 构造非常好并且经常使用它们 但我没有意识到一些

随机推荐

  • 在 Webfaction 上设置 Redis

    设置需要哪些步骤Redis http redis io 数据库上网派 http www webfaction com affiliate xeli共享托管帐户 介绍 由于 Webfaction 服务器的特殊环境限制 安装说明并不那么简单 尽
  • New 与 Malloc,当重载 New 时

    我超载了new and delete实现我自己的小对象 线程安全分配器 问题是当我超载时new 我不能使用new不破坏普遍因果关系或至少不破坏编译器 我发现的大多数例子都在哪里new超载 使用Malloc 进行实际分配 但根据我对 C 的理
  • 从所有表中删除外键关系

    我有一个包含多个表的数据库 许多表的字段具有外键约束 我想截断表 然后用新数据重新填充它们 并且我还想删除外键 因为某些关系已经改变 基本上 我想再次从头开始构建 FK 约束 如何从所有表中删除当前的 FK 约束 您可以使用 informa
  • PostgreSQL 9.2.1 中具有可序列化隔离的谓词锁定

    我已经仔细阅读了关于事务隔离的 postgres 文档 http www postgresql org docs current static transaction iso html建议在我的其他问题 https stackoverflo
  • 从 CompletableFuture 捕获未捕获的异常

    我正在尝试捕获像这样的期货中未捕获的异常CompletableFuture runAsync gt throw new RuntimeException 我的目标是当开发人员忘记处理这些异常时 让它们不再沉默 Calling get or
  • 如何从提交的 Spark 应用程序步骤中获取 AWS EMR 集群 id 和步骤 id

    设想 我正在 AWS EMR 中运行 Spark Scala 作业 现在我的工作转储该应用程序特有的一些元数据 现在 为了转储 我正在位置 s3 bucket key 写入 其中 ApplicationId 是 val APPLICATIO
  • 将 TableRowSorter 与 scala.swing.Table 一起使用

    我正在开发具有 scala swing Table 组件的简单 UI 我想使用 java swing table TableRowSorter 对表行进行排序 Table 类不提供任何使用行排序器的 API 因此我尝试直接在对等点上设置它
  • 了解会话中有关登录变量的行

    下面这行是什么意思 放置布尔变量isLogin到您的会话 以便您在用户每次访问安全站点时检查会话 我想知道如何将变量放入会话中 我知道在抽象层面上 会话是半永久性的 互动信息交换 也称为对话 两人之间的谈话或会议 或更多通信设备 或 计算机
  • 跨源子帧中表单控件的自动对焦被阻止

    使用 Chrome 当我尝试更改位于我们服务器上另一个应用程序的 IFrame 中的输入值时 我在 Chrome 中收到错误 在跨源子框架中阻止对表单控件的自动对焦 在生产中 当两个应用程序托管在同一域上时 它正在工作 但在本地主机开发中我
  • 如何发现 Spark 数据框中列格式的异常?

    正如问题所说 我想找到大型数据集中列中值格式的异常 例如 如果我在包含 5 亿行的数据集中有一个日期列 我想确保该列中所有行的日期格式为 MM DD YYYY 我想找到此格式中存在异常的计数和值 我该怎么做呢 我可以使用正则表达式吗 有人可
  • IOS Swift - 自定义相机覆盖

    你好 我想在我的应用程序中打开一个摄像头 如下所示 我想仅在该部分的中间打开相机 以便用户只能在矩形部分中拍摄快照 我正在使用的代码是这样的 import UIKit import AVFoundation class TakeProduc
  • python 中对象的 __init__() 方法做什么? [复制]

    这个问题在这里已经有答案了 在阅读 OpenStack 代码时 我遇到了这个问题 一个名为 Service 的类继承了基类 object 然后在Service的 init 方法 对象的 init 叫做 相关代码如下所示 类定义 class
  • 在 Selenium 2 中截取测试屏幕截图的最佳方式?

    我需要一种方法来截取功能测试的屏幕截图 现在我正在使用带有 C 绑定的 Selenium 2 我非常想在测试结束时截取屏幕截图 以确保显示所需的页面 你们知道有什么特定的工具可以合并到我的 C 代码中来触发屏幕截图吗 我找不到内置的 Sel
  • 检测 navigator.online 上的更改

    如何检测导航器是否将您的状态更改为在线 离线 就像是 var oldState navigator onLine window navigator onlinechange function evnt newState alert your
  • RPM 规范文件可以“包含”其他文件吗?

    RPM 规范中有一种 include 指令吗 我无法通过谷歌搜索找到答案 动机 我有一个 RPM 规范模板 构建过程会使用版本 修订版和其他特定于构建的数据对其进行修改 这是由sed现在 我认为如果规范会更干净 include特定于构建的定
  • 使用 javascript onClick 显示 Bootstrap Modal

    我需要能够使用以下命令打开 Twitter 引导模式窗口onClick 或类似的功能 只需要输入代码即可onClick 我正在尝试制作一个可点击的div打开模式 代码摘录 部门代码 div class span4 proj div 模态di
  • 如何在swift语言中使用CC_MD5方法

    在 Objective C 中 我们可以像这样对字符串进行哈希处理 const char cStr someString UTF8String unsigned char result 16 CC MD5 cStr strlen cStr
  • ASP.NET MVC 应用程序中的单例类或具有静态方法的类[重复]

    这个问题在这里已经有答案了 可能的重复 ASP NET 单例 https stackoverflow com questions 2134511 asp net singleton 我知道单例类和具有静态属性 方法的类之间的一般差异 但我想
  • UITextView字体为零

    我在故事板中创建了一个字体大小为 14 的 UITextView 并将其连接到 ViewController 的DetailDescriptionLabel 属性 这段代码在viewDidLoad中 self detailDescripti
  • 通过 fftw_mpi_r2c_2d 和 fftw_mpi_c2r_2d 输出不正确

    我编写了一个简单的测试程序 以便在 2d 域 使用 Fortran 中使用 MPI 实现 FFTW 该域的宽度为 Ny x Nx 并在第二个 x 索引中进行分区 在正确 我相信 声明和分配变量和计划之后 我调用 fftw mpi r2c 2