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.
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. –
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. –
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