Fortran PETSc和MPI中的同一命名实体-冲突

Fortran PETSc和MPI中的同一命名实体-冲突,fortran,petsc,Fortran,Petsc,我有一个使用MPI进行并行工作的现有Fortran代码。 我对添加一些PETSc解算器(特别是KSP)感兴趣,但是当包含相关的.h或.h90文件(PETSc、petscsys、petscksp等)时,我会遇到与MPI文件同名的变量问题 i、 e: (使用ics/composer_xe_2011_sp1.6.233和ics/impi/4.0.3.008和petsc 3.6.0,也尝试了较旧的petsc版本3.5.4) 所有这些在MPI和PETSc中都有相同的定义-是否有办法解决此冲突并同时使用两者

我有一个使用MPI进行并行工作的现有Fortran代码。 我对添加一些PETSc解算器(特别是KSP)感兴趣,但是当包含相关的.h或.h90文件(PETSc、petscsys、petscksp等)时,我会遇到与MPI文件同名的变量问题

i、 e:

(使用ics/composer_xe_2011_sp1.6.233和ics/impi/4.0.3.008和petsc 3.6.0,也尝试了较旧的petsc版本3.5.4)

所有这些在MPI和PETSc中都有相同的定义-是否有办法解决此冲突并同时使用两者

我要指出,我不想用PETSc调用替换MPI调用,因为代码应该有一个独立于PETSc运行的选项

至于最小代码,清理庞大的代码显然是一个问题,因此我制作了以下简单示例,其中包括相关部分:

program mpitest


implicit none
use mpi

! Try any of the following:
!!!#include "petsc.h"
!!!#include "petsc.h90"
!!!#include "petscsys.h"
! etc'


integer :: ierr, error
integer :: ni=256, nj=192, nk=256
integer :: i,j,k

real, allocatable :: phi(:,:,:)


integer :: mp_rank, mp_size
real :: sum_phi,max_div,max_div_final,sum_div_final,sum_div


  call mpi_init(ierr)
  call mpi_comm_rank(mpi_comm_world,mp_rank,ierr)
  call mpi_comm_size(mpi_comm_world,mp_size,ierr)




allocate(phi(nj,nk,0:ni/mp_size+1))

        sum_phi = 0.0
        do i=1,ni/mp_size
           do k=1,nk
              do j=1,nj
                 sum_phi = sum_phi + phi(j,k,i)
              enddo
           enddo
        enddo


sum_phi = sum_phi / real(ni/mp_size*nk*nj)
        call mpi_allreduce(sum_div,sum_div_final,1,mpi_double_precision,mpi_sum, &
             mpi_comm_world,ierr)
        call mpi_allreduce(max_div,max_div_final,1,mpi_double_precision,mpi_max, &
             mpi_comm_world,ierr)


call mpi_finalize(error)

deallocate(phi)


WRITE(*,*) 'Done'

end program mpitest

当包含PETSc头文件时,这种情况会直接发生,当删除包含文件时,这种情况会消失。

好的,因此找到了答案:

PETSc不太喜欢Fortran,因此,它的功能与C/C++不同,并且使用不同的定义。 对于C/C++来说,可以使用
/include/petscXXX.h
中的头文件,一切都会很好,而且层次结构已经包括dependent.h文件(即包括petscksp.h将包括petscsys.h、petscvec.h等等)

不是用FORTRAN

首先也是最重要的是,对于FORTRAN,需要在
/include/petsc/finclude/petscXXXdef.h
(或者.h90,如果petsc使用该标志编译)。请注意,这些文件位于不同的include文件夹中,它们是petscxxxdef.h


然后“use petscXXX”将与MPI一起工作而不会产生冲突。

您可能不需要fortran和fortran90标记——只需要fortran就足够了(您不显示任何代码,如果您确实需要fortran90特定的解决方案,那么您可能需要显示一些代码/解释原因)。请注意,有一个
include
行(L130),您大概也有这个行?如果没有,那么我猜你在模块级的某个地方有了
include petscsys
行,并且在某个地方有一个
use MODULENAME
语句,没有
only
限定符,这意味着你再次引入了这些def。你应该真正尝试显示一个,以便我们能够了解到底发生了什么。我以前的评论中的建议只是一些可能出现的方式,所以显示你的代码是至关重要的。有不同的方面需要考虑,但是我们确实需要一个更完整的例子来说明更多。你可以考虑重命名,或者如何。重命名和只可能帮助,但是你应该显示代码。把它当作一个讲座,如果你展示了重要的细节,你可能会在几分钟或一个小时内得到一个好的答案…@VladimirF,我很抱歉没有在前面包括这个例子,但这是由于极度缺乏时间,而不是缺乏所需的知识。
program mpitest


implicit none
use mpi

! Try any of the following:
!!!#include "petsc.h"
!!!#include "petsc.h90"
!!!#include "petscsys.h"
! etc'


integer :: ierr, error
integer :: ni=256, nj=192, nk=256
integer :: i,j,k

real, allocatable :: phi(:,:,:)


integer :: mp_rank, mp_size
real :: sum_phi,max_div,max_div_final,sum_div_final,sum_div


  call mpi_init(ierr)
  call mpi_comm_rank(mpi_comm_world,mp_rank,ierr)
  call mpi_comm_size(mpi_comm_world,mp_size,ierr)




allocate(phi(nj,nk,0:ni/mp_size+1))

        sum_phi = 0.0
        do i=1,ni/mp_size
           do k=1,nk
              do j=1,nj
                 sum_phi = sum_phi + phi(j,k,i)
              enddo
           enddo
        enddo


sum_phi = sum_phi / real(ni/mp_size*nk*nj)
        call mpi_allreduce(sum_div,sum_div_final,1,mpi_double_precision,mpi_sum, &
             mpi_comm_world,ierr)
        call mpi_allreduce(max_div,max_div_final,1,mpi_double_precision,mpi_max, &
             mpi_comm_world,ierr)


call mpi_finalize(error)

deallocate(phi)


WRITE(*,*) 'Done'

end program mpitest