Arrays 将截断大小的数组传递到子例程
我尝试在PDE上使用ghost单元实现周期性边界条件。我用更详细的示例代码更新了这篇文章Arrays 将截断大小的数组传递到子例程,arrays,fortran,Arrays,Fortran,我尝试在PDE上使用ghost单元实现周期性边界条件。我用更详细的示例代码更新了这篇文章 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) :
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
是否有办法通过截断数组元素
(-nx-1,-ny-1)
,将函数func
调用到子例程中?我只想将函数数组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
需要一个比您正在传递的数组大的数组。到目前为止,您的代码似乎没有意义。。。现在还不清楚你想要实现什么
在主程序中,声明一个数组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
需要一个比您正在传递的数组大的数组。正如罗德里戈·罗德里格斯所指出的,主程序Subrt
和Deriv
操作的数组的尺寸不一致
一个简单的解决方法是在子RT
中更改变量声明:
subroutine Subrt(func)
implicit none
real, dimension(-nx-1:nx, -ny-1:ny), intent(inout) :: func
real, dimension(-nx-1:nx, -ny-1:ny) :: func1
real, dimension(-nx-1:nx, -ny-1:ny) :: Gfunc0, Gfunc1
代码现在编译并运行
在我看来,在程序的不同元素中一致地传递完整数组(并忽略某些元素)比作为可变大小的参数数组传递更容易。(特别是,如果只截断一行或一列,我看不到任何好处可以补偿切片所产生的簿记。)正如罗德里戈·罗德里格斯所指出的,主程序、Subrt和Deriv操作的数组的尺寸不一致 一个简单的解决方法是在
子RT
中更改变量声明:
subroutine Subrt(func)
implicit none
real, dimension(-nx-1:nx, -ny-1:ny), intent(inout) :: func
real, dimension(-nx-1:nx, -ny-1:ny) :: func1
real, dimension(-nx-1:nx, -ny-1:ny) :: Gfunc0, Gfunc1
代码现在编译并运行
在我看来,在程序的不同元素中一致地传递完整数组(并忽略某些元素)比作为可变大小的参数数组传递更容易