2017-05-09 8 views
0

パラレル作業にMPIを使用する既存のFortranコードがあります。 関連する.hまたは.h90ファイル(petsc、petscsys、petsckspなど​​)を含めると、一部のPETScソルバー(KSP具体的)を追加することに興味がありますが、同じ名前を持つ変数MPIのものとして。PETScと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を使用しても、古いpetscバージョン3.5.4を試してみました) MPIとPETScの両方で同じように定義されています - この競合を解決し、両方を使用する方法はありますか?

私は、PETScとは独立して実行するオプションが必要であるため、MPI呼び出しをPETSc呼び出しと置き換えたくないことを指摘します。最小限のコードについては

、巨大なコードをきれいにすることは明らかに問題であるので、私は関連する部分を含み、以下の簡単な例を作った: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 

これは直接的に起こり、インクルードが削除されると消えます。

+2

fortranとfortran90の両方のタグは必要ありません。fortranだけで十分です(*任意の*コードは表示されません。実際にfortran90指定のソリューションが必要な場合は、コード/理由を説明してください)。 [petscsys.h](https://www.mcs.anl.gov/petsc/petsc-dev/include/petscsys.h.html)には、おそらく持っている 'include '行(L130)があることに注意してください。もしそうでなければ、モジュールレベルで 'include petscsys'行をどこかに持っていて、' only'修飾子なしで 'MODULENAME'文をどこかに持っていれば、これらのdefをもう一度持ち込むことになります。 –

+1

あなたは実際に何が起こっているのかを理解できるように[mcve]を表示しようとするべきです。私の前のコメントの提案は、これが起こる可能性がある方法のほんの数例にすぎないので、コードを示すことが不可欠です。 –

+2

考慮すべきさまざまな側面がありますが、我々はさらに多くのことを言うためにもっと完全な例が必要です。名前の変更、モジュールの処理方法(https://stackoverflow.com/q/22209818)を検討することができます。 – francescalus

答えて

0

さてさて、答えが見つかったので:

PETScは、C/C++で行い、異なる定義を使用して、したがって、同じように機能していない、多くのFortranのを支持していません。 C/C++の場合、/include/petscXXX.hのヘッダーを使用し、すべてが正常で、さらに階層構造に依存する.hファイルがすでに含まれています(petscksp.hにはpetscsys.h、petscvec.hなどが含まれます)。

NOT IN FORTRAN。

まず、FORTRANでは、/include/petsc/finclude/petscXXXdef.h(または、PETScがそのフラグでコンパイルされる場合は.h90)にヘッダーを含める必要があります。ファイルは別のインクルードフォルダにあり、petscxxx def .hです。

それから、 'use petscXXX'はMPIと矛盾することなく動作します。

関連する問題