arrays - 将截断大小的数组传递给子例程
问题描述
我正在尝试使用幽灵单元在 PDE 上实现周期性边界条件。我已经用更详细的示例代码更新了帖子。
module Example
integer, parameter :: nx = 10, ny = 10
contains
subroutine Subrt(func)
implicit none
real, dimension(-nx:nx, -ny:ny), intent(inout) :: func
real, dimension(-nx:nx, -ny:ny) :: func1
real, dimension(-nx:nx, -ny:ny) :: Gfunc0, Gfunc1
Gfunc0 = Deriv(func)
func1 = func + Gfunc0
Gfunc1 = Deriv(func1)
end subroutine Subrt
function Deriv(func)
implicit none
integer :: i,j
real, dimension(-nx-1:nx,-ny-1:ny) :: func, Deriv
do j = -ny,ny-1
do i = -nx,nx-1
deriv(i,j) = func(i+1,j) + func(i-1,j)
end do
end do
!imposing periodicity on the gradient
deriv(-nx-1,:) = deriv(nx-1,:)
deriv(nx,:) = deriv(-nx,:)
deriv(:,-ny-1) = deriv(:,ny-1)
deriv(:,ny) = deriv(:,-ny)
end function Deriv
end module Example
!I now define the function func, initial and boundary conditions and run the code:
program MyTest
use Example
implicit none
real, dimension(-nx-1:nx,-ny-1:ny) :: func
integer :: i,j
do i = -nx,nx-1
do j = -ny,ny-1
func(i,j) = ...
end do
end do
!Impose periodicity
func(-nx-1,:) = func(nx-1,:)
func(nx,:) = func(-nx,:)
func(:,-ny-1) = func(:,ny-1)
func(:,ny) = func(:,-ny)
call Subrt(func) !problem arises when I call subroutine here
end program
所以“鬼细胞”是数组元素-nx-1
, -ny-1
。我使用这些点来连接以施加周期性。
我遇到的问题是当我使用这个函数func
传递给我的子程序时。我的求解微分方程的子程序只作用于物理系统的大小,从
(-nx:nx,-ny:ny)
所以当我调用函数func
传递给我的子程序时,
我收到以下警告和错误消息:
Actual argument contains too few elements for dummy argument
Different shape for array assignment
有没有办法func
通过截断数组元素将函数调用到子程序中(-nx-1,-ny-1)
?我只想将我的函数数组的一部分传递func
到(-nx:nx,-ny:ny)
子例程中,而不是调用包含产生此警告/错误消息的幽灵点的整个函数数组。但是,我不确定如何调用截断的数组。
解决方案
到目前为止,您的代码似乎没有意义......而且仍然不清楚您要实现什么。
在主程序中,您声明一个func
形状(-11:10, -11:10)
为 22x22 元素的数组,并将其作为实际参数传递给子例程Subrt
,该子例程声明一个也名为 的虚拟参数func
,但具有明确的形状(-10:10, -10:10)
(即 21x21 元素)。
到目前为止一切都很好,只有func
数组的前 21x21 个元素真正传递给子例程,并被反弹,以便(-11, -11)
实际参数的索引元素映射到虚拟参数的元素,(-10, -10)
依此类推,直到(9, 9)
实际参数映射到(10, 10)
虚拟参数的最后一个元素。
有没有办法通过截断数组元素(-nx-1,-ny-1)将函数func调用到子程序中?我只想将我的函数数组 func, (-nx:nx,-ny:ny) 的一部分传递到子例程 (...)
传递数组的一部分非常容易。以下将仅传递(-nx:nx,-ny:ny)
- 一个 21x21 元素子集 - 到子例程:
call Subrt(func(-nx:nx, -ny:ny))
并且映射将是(-10, 10)
实际参数到(-10, 10)
虚拟参数的映射,依此类推。
但这不会帮助您解决以下问题...在内部Subrt
,您尝试将此数组作为实际参数传递给Deriv
函数,即期待一个(-11:10, -11:10)
形状数组 - 即 22x22 元素。错误来自这里。
实际参数包含的虚拟参数元素太少。数组分配的不同形状
该过程Subrt
需要一个比您传递的数组更大的数组。
推荐阅读
- cmake - CMake 共享库:如何为 DLL 和 LIB 文件指定不同的输出目录?
- c++ - 逆时针排序二维点
- ruby-on-rails - 没有这样的文件或目录@ rb_sysopen - site/tmp/pids/puma.pid (Errno::ENOENT)
- cordova - React Native 与 WebView 对比 Cordova
- mysql - 基于多行的日期/时间范围选择记录
- ios - AVAssetExportSession 总是无法导出
- scripting - 这一段在这段 TCL 代码中做了什么
- c# - 在 Visual Studio 2017 中构建项目的权限问题
- git - 挑选多个时如何跳过补丁?
- bash - 如何使用 Bash 对给定列中匹配模式的所有行进行子集化?