首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过动态切片实现的纯Fortran子程序

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

Stack Overflow用户
提问于 2016-09-06 08:58:23
回答 1查看 100关注 0票数 0

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

代码语言:javascript
复制
 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 case?

任何帮助都是非常感谢的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-06 14:11:34

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

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

我不认为“动态切片”是相关的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39339249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档