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

时间:2017-05-09 17:05:54

标签: fortran petsc

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

即:

  error #6405: The same named entity from different modules and/or program units cannot be referenced.   [MPI_DOUBLE_PRECISION]
  error #6405: The same named entity from different modules and/or program units cannot be referenced.   [MPI_SUM]
  error #6405: The same named entity from different modules and/or program units cannot be referenced.   [MPI_COMM_WORLD]
and so on.

(使用ics / composer_xe_2011_sp1.6.233和ics / impi / 4.0.3.008和petsc 3.6.0,也尝试过旧版本的宠物版本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标题时会直接发生这种情况,并在删除包含时消失。

1 个答案:

答案 0 :(得分:0)

好的,所以答案已经找到:

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

不在FORTRAN。

首先,对于FORTRAN,需要在/include/petsc/finclude/petscXXXdef.h中包含标题(如果PETSc与该标志一起编译,则需要包含.h90)。请注意,这些文件位于不同的包含文件夹中,并且为petscxxx def .h。

然后使用petscXXX'将与MPI一起工作而不会发生冲突。