Недавно я прочитал (здесь), что чистые подпрограммы могут обеспечить лучшую оптимизацию параллелизма. . Предполагая, что это правда, есть ли способ сделать следующую процедуру чистой?
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
Я считаю, что проблема заключается в том, что случай выбора вводит побочный эффект, который недопустим.
Есть ли способ, которым я могу нарезать поля f%f(i,j,k)
и dfdh%f(i,j,k)
, чтобы случай выбора не требовался?
Любая помощь приветствуется!