Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 将截断大小的数组传递到子例程_Arrays_Fortran - Fatal编程技术网

Arrays 将截断大小的数组传递到子例程

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) :

我尝试在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) :: 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
代码现在编译并运行

在我看来,在程序的不同元素中一致地传递完整数组(并忽略某些元素)比作为可变大小的参数数组传递更容易