J'ai un code Fortran existant en utilisant MPI pour le travail en parallèle. Je suis intéressé par l'ajout de certains solveurs PETSc (KSP en particulier), mais en incluant les fichiers .h ou .h90 pertinents (petsc, petscsys, petscksp, etc ...) je rencontre un problème avec les variables qui partagent le même nom comme les MPI.La même entité nommée dans PETSc et MPI - conflit
-à-dire:
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.
(en utilisant ics/composer_xe_2011_sp1.6.233 et ics/IMPI/4.0.3.008 et PETSc 3.6.0, ont également essayé une version plus ancienne de PETSc 3.5.4)
Tous ces sont définis de manière égale à la fois dans MPI et PETSc - existe-t-il un moyen de résoudre ce conflit et d'utiliser les deux?
Je tiens à souligner que je ne veux pas remplacer les appels MPI avec des appels PETSc, car le code devrait avoir une option pour fonctionner indépendamment de PETSc.
En ce qui concerne un minimum de code, le nettoyage du code énorme est un problème apparemment, donc je l'ai fait l'exemple simple suivant qui comprend les parties pertinentes:
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
Cela se produit directement en-têtes PETSc sont inclus et disparaît lorsque l'inclusion est supprimée.
Vous n'avez probablement pas besoin de tags fortran et fortran90 - juste fortran devrait suffire (vous ne montrez * aucun * code, si vous avez vraiment besoin de fortran90 solutions spécifiques, alors vous devez probablement montrer quelques code/expliquer pourquoi). Notez que [petscsys.h] (https://www.mcs.anl.gov/petsc/petsc-dev/include/petscsys.h.html) a une ligne 'include' (L130) que vous avez probablement aussi? Si ce n'est pas le cas, je suppose que vous avez la ligne 'include petscsys' au niveau du module quelque part et que vous avez une instruction' use MODULENAME' quelque part sans le qualificatif 'only' qui signifie que vous rapportez ces defs. –
Vous devriez vraiment essayer de montrer un [mcve] afin que nous puissions savoir ce qui se passe exactement. Les suggestions dans mon commentaire précédent ne sont que quelques-unes des façons possibles cela pourrait se produire, montrant votre code est vital. –
Il y a différents aspects à considérer, mais nous avons besoin d'un exemple plus complet pour en dire beaucoup plus. Vous pouvez envisager de renommer, ou comment [les modules peuvent gérer les choses] (https://stackoverflow.com/q/22209818). – francescalus