1*6dd63270SBarry Smith #include <petsc/private/ftnimpl.h> 2*6dd63270SBarry Smith #include <petscsf.h> 3*6dd63270SBarry Smith #include <petscsection.h> 4*6dd63270SBarry Smith 5*6dd63270SBarry Smith #if defined(PETSC_HAVE_FORTRAN_CAPS) 6*6dd63270SBarry Smith #define petscsfdestroyremoteoffsets_ PETSCSFDESTROYREMOTEOFFSETS 7*6dd63270SBarry Smith #define petscsfdistributesection_ PETSCSFDISTRIBUTESECTION 8*6dd63270SBarry Smith #define petscsfcreateremoteoffsets_ PETSCSFCREATEREMOTEOFFSETS 9*6dd63270SBarry Smith #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 10*6dd63270SBarry Smith #define petscsfdestroyremoteoffsets_ petscsfdestroyremoteoffsets 11*6dd63270SBarry Smith #define petscsfdistributesection_ petscsfdistributesection 12*6dd63270SBarry Smith #define petscsfcreateremoteoffsets_ petscsfcreateremoteoffsets 13*6dd63270SBarry Smith #endif 14*6dd63270SBarry Smith 15*6dd63270SBarry Smith PETSC_EXTERN void petscsfdestroyremoteoffsets_(F90Array1d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd)) 16*6dd63270SBarry Smith { 17*6dd63270SBarry Smith PetscInt *fa; 18*6dd63270SBarry Smith *ierr = F90Array1dAccess(ptr, MPIU_INT, (void **)&fa PETSC_F90_2PTR_PARAM(ptrd)); 19*6dd63270SBarry Smith if (*ierr) return; 20*6dd63270SBarry Smith *ierr = F90Array1dDestroy(ptr, MPIU_INT PETSC_F90_2PTR_PARAM(ptrd)); 21*6dd63270SBarry Smith if (*ierr) return; 22*6dd63270SBarry Smith *ierr = PetscFree(fa); 23*6dd63270SBarry Smith } 24*6dd63270SBarry Smith 25*6dd63270SBarry Smith PETSC_EXTERN void petscsfdistributesection_(PetscSF *sf, PetscSection *rootSection, F90Array1d *ptr, PetscSection *leafSection, int *ierr PETSC_F90_2PTR_PROTO(ptrd)) 26*6dd63270SBarry Smith { 27*6dd63270SBarry Smith if (ptr == PETSC_NULL_INTEGER_POINTER_Fortran) { 28*6dd63270SBarry Smith *ierr = PetscSFDistributeSection(*sf, *rootSection, NULL, *leafSection); 29*6dd63270SBarry Smith } else { 30*6dd63270SBarry Smith PetscInt *fa; 31*6dd63270SBarry Smith PetscInt lpStart, lpEnd; 32*6dd63270SBarry Smith 33*6dd63270SBarry Smith *ierr = PetscSFDistributeSection(*sf, *rootSection, &fa, *leafSection); 34*6dd63270SBarry Smith if (*ierr) return; 35*6dd63270SBarry Smith *ierr = PetscSectionGetChart(*leafSection, &lpStart, &lpEnd); 36*6dd63270SBarry Smith if (*ierr) return; 37*6dd63270SBarry Smith *ierr = F90Array1dCreate((void *)fa, MPIU_INT, 1, lpEnd - lpStart, ptr PETSC_F90_2PTR_PARAM(ptrd)); 38*6dd63270SBarry Smith } 39*6dd63270SBarry Smith } 40*6dd63270SBarry Smith 41*6dd63270SBarry Smith PETSC_EXTERN void petscsfcreateremoteoffsets_(PetscSF *pointSF, PetscSection *rootSection, PetscSection *leafSection, F90Array1d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd)) 42*6dd63270SBarry Smith { 43*6dd63270SBarry Smith PetscInt *fa; 44*6dd63270SBarry Smith PetscInt lpStart, lpEnd; 45*6dd63270SBarry Smith 46*6dd63270SBarry Smith *ierr = PetscSFCreateRemoteOffsets(*pointSF, *rootSection, *leafSection, &fa); 47*6dd63270SBarry Smith if (*ierr) return; 48*6dd63270SBarry Smith *ierr = PetscSectionGetChart(*leafSection, &lpStart, &lpEnd); 49*6dd63270SBarry Smith if (*ierr) return; 50*6dd63270SBarry Smith *ierr = F90Array1dCreate((void *)fa, MPIU_INT, 1, lpEnd - lpStart, ptr PETSC_F90_2PTR_PARAM(ptrd)); 51*6dd63270SBarry Smith } 52