2017-05-09 2 views
0

Ich habe eine Fortran-Code mit MPI für parallele Arbeit. Ich bin daran interessiert einige der PETSc Solver hinzuzufügen (KSP speziell), aber wenn ich die relevanten .h oder .h90 Dateien (petsc, petscsys, purescksp, etc ...) einschließe, bekomme ich ein Problem mit Variablen, die den gleichen Namen haben wie die MPI.Die gleiche benannte Entität in PETSc und MPI - Konflikt

dh:

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 und ics/impi/4.0.3.008 und PETSc 3.6.0, versuchte auch ältere PETSc Version 3.5.4 verwenden)

Alle diese sind gleichermaßen in MPI und PETSc definiert - gibt es eine Möglichkeit, diesen Konflikt zu lösen und beides zu nutzen?

Ich werde darauf hinweisen, dass ich nicht MPI Anrufe mit PETSc Anrufe ersetzen möchte, da der Code eine Option haben sollte, unabhängig von PETSc zu laufen.

Wie bei minimalen Code, den riesigen Code Reinigung ist ein Problem offenbar, also habe ich das folgende einfache Beispiel hergestellt, die die relevanten Teile umfasst:

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 

Dies geschieht direkt, wenn PETSc Header enthalten sind und verschwindet, wenn das Include entfernt wird.

+2

Sie brauchen wahrscheinlich nicht beide Fortran und Fortran90 Tags - nur Fortran sollte genug sein (Sie zeigen * keine * Code, wenn Sie wirklich eine Anforderung für Fortran90 spezifische Lösungen haben, dann müssen Sie wahrscheinlich einige zeigen Code/erklären warum). Beachten Sie, dass [petscsys.h] (https://www.mcs.anl.gov/petsc/petsc-dev/include/petscsys.h.html) eine 'include ' Zeile (L130) hat, die Sie vermutlich auch haben? Wenn nicht, dann nehme ich an, dass Sie irgendwo auf der Modulebene die 'include petscsys'-Zeile haben und irgendwo ein 'MODULENAME'-Statement verwenden, ohne das' einzige' Qualifikationsmerkmal, das bedeutet, dass Sie diese Defs wieder einspielen. –

+1

Sie sollten wirklich versuchen, ein [mcve] zu zeigen, damit wir herausfinden können, was genau vor sich geht. Die Vorschläge in meinem vorherigen Kommentar sind nur ein paar der möglichen Wege, wie dies auftreten könnte, also ist es wichtig, Ihren Code zu zeigen. –

+2

Es gibt verschiedene Aspekte zu beachten, aber wir brauchen ein vollständigeres Beispiel, um mehr zu sagen. Sie könnten in Erwägung ziehen, umzubenennen oder wie [Module mit Dingen umgehen können] (https://stackoverflow.com/q/22209818). – francescalus

Antwort

0

Okay, so die Antwort ist gefunden worden:

PETSc nicht Fortran bevorzugen viel und daher nicht die gleiche Art und Weise funktionieren, wie sie mit C/C++ und verschiedene Definitionen verwendet. Für C/C++ würde man die Header in /include/petscXXX.h verwenden und alles wird gut, außerdem enthält die hierarchische Struktur bereits abhängige .h-Dateien (d. H. Einschließlich petscksp.h wird petscsys.h, petscvec.h und so weiter enthalten).

NICHT IN FORTRAN.

In erster Linie, für FORTRAN muss man Header in /include/petsc/finclude/petscXXXdef.h (oder .h90, wenn PETSc kompiliert mit diesem Flag) enthalten. Beachten Sie, dass sich die Dateien in einem anderen Include-Ordner befinden und petscxxx def .h sind.

Dann 'petscXXX verwenden' wird mit MPI ohne Konflikte arbeiten.

Verwandte Themen