通过动态切片的纯 Fortran 子程序

Pure Fortran subroutine via dynamic slicing

我最近读到 () 纯子例程可以实现更好的并行化优化。假设这是真的,有没有办法让下面的例程变得纯粹?

 subroutine diff_stag(operator,dfdh,f,T,dir,pad,gt)
   implicit none
   procedure(stencils_stag) :: operator
   type(realField),intent(inout) :: dfdh
   type(realField),intent(in) :: f
   type(triDiag),intent(in) :: T
   integer,intent(in) :: dir,pad,gt
   integer :: i,j,k
   select case (dir)
   case (1)
   !$OMP PARALLEL DO SHARED(T,f,gt)
   do k=1+pad,f%s(3)-pad; do j=1+pad,f%s(2)-pad
     call operator(dfdh%f(:,j,k),f%f(:,j,k),T,f%s(dir),dfdh%s(dir),gt)
   enddo; enddo
   !$OMP END PARALLEL DO
   case (2)
   !$OMP PARALLEL DO SHARED(T,f,gt)
   do k=1+pad,f%s(3)-pad; do i=1+pad,f%s(1)-pad
     call operator(dfdh%f(i,:,k),f%f(i,:,k),T,f%s(dir),dfdh%s(dir),gt)
   enddo; enddo
   !$OMP END PARALLEL DO
   case (3)
   !$OMP PARALLEL DO SHARED(T,f,gt)
   do j=1+pad,f%s(2)-pad; do i=1+pad,f%s(1)-pad
     call operator(dfdh%f(i,j,:),f%f(i,j,:),T,f%s(dir),dfdh%s(dir),gt)
   enddo; enddo
   !$OMP END PARALLEL DO
   case default
   stop 'Error: dir must = 1,2,3 in delGen_T in ops_del.f90.'
   end select
 end subroutine

我认为问题在于 select 案例引入了副作用,这是不允许的。

有没有一种方法可以对字段 f%f(i,j,k)dfdh%f(i,j,k) 进行切片,从而不需要 select 的情况?

非常感谢任何帮助!

给定的子例程不能成为纯子例程,因为它包含一个 STOP 语句。

除此之外,子例程是否可以成为纯子例程将取决于 operator 子例程是否纯(或可以成为纯),也许派生类型是否具有指针组件。

我认为 "dynamic slicing" 不相关。