1 #include <petsc/private/ftnimpl.h> 2 #include <petsc/private/dmdaimpl.h> 3 4 #if defined(PETSC_HAVE_FORTRAN_CAPS) 5 #define dmdagetownershipranges_ DMDAGETOWNERSHIPRANGES 6 #define dmdarestoreownershipranges_ DMDARESTOREOWNERSHIPRANGES 7 #define dmdagetneighbors_ DMDAGETNEIGHBORS 8 #define dmdarestoreneighbors_ DMDARESTORENEIGHBORS 9 #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 10 #define dmdagetownershipranges_ dmdagetownershipranges 11 #define dmdarestoreownershipranges_ dmdarestoreownershipranges 12 #define dmdagetneighbors_ dmdagetneighbors 13 #define dmdarestoreneighbors_ dmdarestoreneighbors 14 #endif 15 16 PETSC_EXTERN void dmdagetneighbors_(DM *da, F90Array1d *ptr, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptrd)) 17 { 18 const PetscMPIInt *r; 19 PetscInt n, dim; 20 21 *ierr = DMDAGetNeighbors(*da, &r); 22 if (*ierr) return; 23 *ierr = DMGetDimension(*da, &dim); 24 if (*ierr) return; 25 if (dim == 2) n = 9; 26 else n = 27; 27 *ierr = F90Array1dCreate((PetscInt *)r, MPI_INT, 1, n, ptr PETSC_F90_2PTR_PARAM(ptrd)); 28 } 29 30 PETSC_EXTERN void dmdarestoreneighbors_(DM *da, F90Array1d *ptr, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptrd)) 31 { 32 *ierr = F90Array1dDestroy(ptr, MPI_INT PETSC_F90_2PTR_PARAM(ptrd)); 33 } 34 35 PETSC_EXTERN void dmdagetownershipranges_(DM *da, F90Array1d *lx, F90Array1d *ly, F90Array1d *lz, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(lxd) PETSC_F90_2PTR_PROTO(lyd) PETSC_F90_2PTR_PROTO(lzd)) 36 { 37 const PetscInt *gx, *gy, *gz; 38 PetscInt M, N, P; 39 40 *ierr = DMDAGetInfo(*da, NULL, NULL, NULL, NULL, &M, &N, &P, NULL, NULL, NULL, NULL, NULL, NULL); 41 if (*ierr) return; 42 *ierr = DMDAGetOwnershipRanges(*da, &gx, &gy, &gz); 43 if (*ierr) return; 44 if ((void *)lx != PETSC_NULL_INTEGER_POINTER_Fortran) { 45 *ierr = F90Array1dCreate((PetscInt *)gx, MPIU_INT, 1, M, lx PETSC_F90_2PTR_PARAM(lxd)); 46 if (*ierr) return; 47 } 48 if ((void *)ly != PETSC_NULL_INTEGER_POINTER_Fortran) { 49 *ierr = F90Array1dCreate((PetscInt *)gy, MPIU_INT, 1, N, ly PETSC_F90_2PTR_PARAM(lyd)); 50 if (*ierr) return; 51 } 52 if ((void *)lz != PETSC_NULL_INTEGER_POINTER_Fortran) *ierr = F90Array1dCreate((PetscInt *)gz, MPIU_INT, 1, P, lz PETSC_F90_2PTR_PARAM(lzd)); 53 } 54 55 PETSC_EXTERN void dmdarestoreownershipranges_(DM *da, F90Array1d *lx, F90Array1d *ly, F90Array1d *lz, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(lxd) PETSC_F90_2PTR_PROTO(lyd) PETSC_F90_2PTR_PROTO(lzd)) 56 { 57 if ((void *)lx != PETSC_NULL_INTEGER_POINTER_Fortran) { 58 *ierr = F90Array1dDestroy(lx, MPIU_INT PETSC_F90_2PTR_PARAM(lxd)); 59 if (*ierr) return; 60 } 61 if ((void *)ly != PETSC_NULL_INTEGER_POINTER_Fortran) { 62 *ierr = F90Array1dDestroy(ly, MPIU_INT PETSC_F90_2PTR_PARAM(lyd)); 63 if (*ierr) return; 64 } 65 if ((void *)lz != PETSC_NULL_INTEGER_POINTER_Fortran) *ierr = F90Array1dDestroy(lz, MPIU_INT PETSC_F90_2PTR_PARAM(lzd)); 66 } 67