首页 > 解决方案 > 将截断大小的数组传递给子例程

问题描述

我正在尝试使用幽灵单元在 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)子例程中,而不是调用包含产生此警告/错误消息的幽灵点的整个函数数组。但是,我不确定如何调用截断的数组。

标签: arraysfortran

解决方案


到目前为止,您的代码似乎没有意义......而且仍然不清楚您要实现什么。

在主程序中,您声明一个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需要一个比您传递的数组更大的数组。


推荐阅读