2017-05-09 3 views
0

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.

+2

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

+1

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

+2

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

Répondre

0

Bon, la réponse a été trouvée:

PETSc ne favorise pas beaucoup Fortran et, par conséquent, ne fonctionne pas de la même manière comme il le fait avec C/C++ et utilise des définitions différentes. Pour C/C++ on utiliserait les en-têtes /include/petscXXX.h et tout ira bien, de plus la structure hiérarchique inclut déjà des fichiers .h dépendants (c'est-à-dire dont petscksp.h inclura petscsys.h, petscvec.h et ainsi de suite).

PAS DANS FORTRAN. Tout d'abord, pour FORTRAN, il faut d'abord inclure les en-têtes /include/petsc/finclude/petscXXXdef.h (ou .h90 si PETSc est compilé avec ce drapeau). Notez que les fichiers sont situés dans un dossier d'inclusion différent et sont petscxxx def .h.

Ensuite, 'petscXXX' fonctionnera avec MPI sans conflit.