18af6ec1cSBarry Smith #include <petsc/private/f90impl.h> 2a6e9e4f7SMatthew G. Knepley #include <petsc/private/sfimpl.h> 3a6e9e4f7SMatthew G. Knepley 4a6e9e4f7SMatthew G. Knepley #if defined(PETSC_HAVE_FORTRAN_CAPS) 58d1b7334SBarry Smith #define petscsfgetgraph_ PETSCSFGETGRAPH 68af6ec1cSBarry Smith #define petscsfbcastbegin_ PETSCSFBCASTBEGIN 78af6ec1cSBarry Smith #define petscsfbcastend_ PETSCSFBCASTEND 89037d788SNicholas Arnold-Medabalimi #define petscsfreducebegin_ PETSCSFREDUCEBEGIN 99037d788SNicholas Arnold-Medabalimi #define petscsfreduceend_ PETSCSFREDUCEEND 107f139299SBarry Smith #define f90arraysfnodecreate_ F90ARRAYSFNODECREATE 1194a885e8SJunchao Zhang #define petscsfgetleafranks_ PETSCSFGETLEAFRANKS 1294a885e8SJunchao Zhang #define petscsfgetrootranks_ PETSCSFGETROOTRANKS 13a6e9e4f7SMatthew G. Knepley #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 145c87a30dSBarry Smith #define petscsfgetgraph_ petscsfgetgraph 158af6ec1cSBarry Smith #define petscsfbcastbegin_ petscsfbcastbegin 168af6ec1cSBarry Smith #define petscsfbcastend_ petscsfbcastend 179037d788SNicholas Arnold-Medabalimi #define petscsfreducebegin_ petscsfreducebegin 189037d788SNicholas Arnold-Medabalimi #define petscsfreduceend_ petscsfreduceend 197f139299SBarry Smith #define f90arraysfnodecreate_ f90arraysfnodecreate 2094a885e8SJunchao Zhang #define petscsfgetleafranks_ petscsfgetleafranks 2194a885e8SJunchao Zhang #define petscsfgetrootranks_ petscsfgetrootranks 22a6e9e4f7SMatthew G. Knepley #endif 23a6e9e4f7SMatthew G. Knepley 2419caf8f3SSatish Balay PETSC_EXTERN void f90arraysfnodecreate_(const PetscInt *, PetscInt *, void *PETSC_F90_2PTR_PROTO_NOVAR); 257f139299SBarry Smith 2661bf59e3SJunchao Zhang PETSC_EXTERN void petscsfgetgraph_(PetscSF *sf, PetscInt *nroots, PetscInt *nleaves, F90Array1d *ailocal, F90Array1d *airemote, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(pilocal) PETSC_F90_2PTR_PROTO(piremote)) 275c87a30dSBarry Smith { 285c87a30dSBarry Smith const PetscInt *ilocal; 295c87a30dSBarry Smith const PetscSFNode *iremote; 308dbb0df6SBarry Smith PetscInt nl; 315c87a30dSBarry Smith 325975b3b6SBarry Smith *ierr = PetscSFGetGraph(*sf, nroots, nleaves, &ilocal, &iremote); 335975b3b6SBarry Smith if (*ierr) return; 348dbb0df6SBarry Smith nl = *nleaves; 358dbb0df6SBarry Smith if (!ilocal) nl = 0; 368dbb0df6SBarry Smith *ierr = F90Array1dCreate((void *)ilocal, MPIU_INT, 1, nl, ailocal PETSC_F90_2PTR_PARAM(pilocal)); 377f139299SBarry Smith /* this creates a memory leak */ 388e383715SSatish Balay f90arraysfnodecreate_((PetscInt *)iremote, nleaves, airemote PETSC_F90_2PTR_PARAM(piremote)); 395c87a30dSBarry Smith } 405c87a30dSBarry Smith 41*6497c311SBarry Smith PETSC_EXTERN void petscsfgetleafranks_(PetscSF *sf, PetscMPIInt *niranks, F90Array1d *airanks, F90Array1d *aioffset, F90Array1d *airootloc, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(piranks) PETSC_F90_2PTR_PROTO(pioffset) PETSC_F90_2PTR_PROTO(pirootloc)) 4294a885e8SJunchao Zhang { 4394a885e8SJunchao Zhang const PetscMPIInt *iranks = NULL; 4494a885e8SJunchao Zhang const PetscInt *ioffset = NULL; 4594a885e8SJunchao Zhang const PetscInt *irootloc = NULL; 4694a885e8SJunchao Zhang 475975b3b6SBarry Smith *ierr = PetscSFGetLeafRanks(*sf, niranks, &iranks, &ioffset, &irootloc); 485975b3b6SBarry Smith if (*ierr) return; 495975b3b6SBarry Smith *ierr = F90Array1dCreate((void *)irootloc, MPIU_INT, 1, ioffset[*niranks], airootloc PETSC_F90_2PTR_PARAM(pirootloc)); 505975b3b6SBarry Smith if (*ierr) return; 515975b3b6SBarry Smith *ierr = F90Array1dCreate((void *)iranks, MPI_INT, 1, *niranks, airanks PETSC_F90_2PTR_PARAM(piranks)); 525975b3b6SBarry Smith if (*ierr) return; 535975b3b6SBarry Smith *ierr = F90Array1dCreate((void *)ioffset, MPIU_INT, 1, *niranks + 1, aioffset PETSC_F90_2PTR_PARAM(pioffset)); 545975b3b6SBarry Smith if (*ierr) return; 5594a885e8SJunchao Zhang } 5694a885e8SJunchao Zhang 57*6497c311SBarry Smith PETSC_EXTERN void petscsfgetrootranks_(PetscSF *sf, PetscMPIInt *nranks, F90Array1d *aranks, F90Array1d *aroffset, F90Array1d *armine, F90Array1d *arremote, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(pranks) PETSC_F90_2PTR_PROTO(proffset) PETSC_F90_2PTR_PROTO(prmine) PETSC_F90_2PTR_PROTO(prremote)) 5894a885e8SJunchao Zhang { 5994a885e8SJunchao Zhang const PetscMPIInt *ranks = NULL; 6094a885e8SJunchao Zhang const PetscInt *roffset = NULL; 6194a885e8SJunchao Zhang const PetscInt *rmine = NULL; 6294a885e8SJunchao Zhang const PetscInt *rremote = NULL; 6394a885e8SJunchao Zhang 645975b3b6SBarry Smith *ierr = PetscSFGetRootRanks(*sf, nranks, &ranks, &roffset, &rmine, &rremote); 655975b3b6SBarry Smith if (*ierr) return; 665975b3b6SBarry Smith *ierr = F90Array1dCreate((void *)ranks, MPI_INT, 1, *nranks, aranks PETSC_F90_2PTR_PARAM(pranks)); 675975b3b6SBarry Smith if (*ierr) return; 685975b3b6SBarry Smith *ierr = F90Array1dCreate((void *)roffset, MPIU_INT, 1, *nranks + 1, aroffset PETSC_F90_2PTR_PARAM(proffset)); 695975b3b6SBarry Smith if (*ierr) return; 705975b3b6SBarry Smith *ierr = F90Array1dCreate((void *)rmine, MPIU_INT, 1, roffset[*nranks], armine PETSC_F90_2PTR_PARAM(prmine)); 715975b3b6SBarry Smith if (*ierr) return; 725975b3b6SBarry Smith *ierr = F90Array1dCreate((void *)rremote, MPIU_INT, 1, roffset[*nranks], arremote PETSC_F90_2PTR_PARAM(prremote)); 735975b3b6SBarry Smith if (*ierr) return; 7494a885e8SJunchao Zhang } 7594a885e8SJunchao Zhang 766f7e44deSSatish Balay #if defined(PETSC_HAVE_F90_ASSUMED_TYPE_NOT_PTR) 77ad227feaSJunchao Zhang PETSC_EXTERN void petscsfbcastbegin_(PetscSF *sf, MPI_Fint *unit, const void *rptr, void *lptr, MPI_Fint *op, PetscErrorCode *ierr) 786f7e44deSSatish Balay { 796f7e44deSSatish Balay MPI_Datatype dtype; 80ad227feaSJunchao Zhang MPI_Op cop = MPI_Op_f2c(*op); 816f7e44deSSatish Balay 825975b3b6SBarry Smith *ierr = PetscMPIFortranDatatypeToC(*unit, &dtype); 835975b3b6SBarry Smith if (*ierr) return; 84ad227feaSJunchao Zhang *ierr = PetscSFBcastBegin(*sf, dtype, rptr, lptr, cop); 856f7e44deSSatish Balay } 866f7e44deSSatish Balay 87ad227feaSJunchao Zhang PETSC_EXTERN void petscsfbcastend_(PetscSF *sf, MPI_Fint *unit, const void *rptr, void *lptr, MPI_Fint *op, PetscErrorCode *ierr) 886f7e44deSSatish Balay { 896f7e44deSSatish Balay MPI_Datatype dtype; 90ad227feaSJunchao Zhang MPI_Op cop = MPI_Op_f2c(*op); 916f7e44deSSatish Balay 925975b3b6SBarry Smith *ierr = PetscMPIFortranDatatypeToC(*unit, &dtype); 935975b3b6SBarry Smith if (*ierr) return; 94ad227feaSJunchao Zhang *ierr = PetscSFBcastEnd(*sf, dtype, rptr, lptr, cop); 956f7e44deSSatish Balay } 966f7e44deSSatish Balay 979037d788SNicholas Arnold-Medabalimi PETSC_EXTERN void petscsfreducebegin_(PetscSF *sf, MPI_Fint *unit, const void *lptr, void *rptr, MPI_Fint *op, PetscErrorCode *ierr) 989037d788SNicholas Arnold-Medabalimi { 999037d788SNicholas Arnold-Medabalimi MPI_Datatype dtype; 1009037d788SNicholas Arnold-Medabalimi MPI_Op cop = MPI_Op_f2c(*op); 1019037d788SNicholas Arnold-Medabalimi 1025975b3b6SBarry Smith *ierr = PetscMPIFortranDatatypeToC(*unit, &dtype); 1035975b3b6SBarry Smith if (*ierr) return; 1049037d788SNicholas Arnold-Medabalimi *ierr = PetscSFReduceBegin(*sf, dtype, lptr, rptr, cop); 1059037d788SNicholas Arnold-Medabalimi } 1069037d788SNicholas Arnold-Medabalimi 1079037d788SNicholas Arnold-Medabalimi PETSC_EXTERN void petscsfreduceend_(PetscSF *sf, MPI_Fint *unit, const void *lptr, void *rptr, MPI_Fint *op, PetscErrorCode *ierr) 1089037d788SNicholas Arnold-Medabalimi { 1099037d788SNicholas Arnold-Medabalimi MPI_Datatype dtype; 1109037d788SNicholas Arnold-Medabalimi MPI_Op cop = MPI_Op_f2c(*op); 1119037d788SNicholas Arnold-Medabalimi 1125975b3b6SBarry Smith *ierr = PetscMPIFortranDatatypeToC(*unit, &dtype); 1135975b3b6SBarry Smith if (*ierr) return; 1149037d788SNicholas Arnold-Medabalimi *ierr = PetscSFReduceEnd(*sf, dtype, lptr, rptr, cop); 1159037d788SNicholas Arnold-Medabalimi } 1169037d788SNicholas Arnold-Medabalimi 1176f7e44deSSatish Balay #else 1186f7e44deSSatish Balay 119ad227feaSJunchao Zhang PETSC_EXTERN void petscsfbcastbegin_(PetscSF *sf, MPI_Fint *unit, F90Array1d *rptr, F90Array1d *lptr, MPI_Fint *op, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(rptrd) PETSC_F90_2PTR_PROTO(lptrd)) 1208af6ec1cSBarry Smith { 1218af6ec1cSBarry Smith MPI_Datatype dtype; 1228af6ec1cSBarry Smith const void *rootdata; 1238af6ec1cSBarry Smith void *leafdata; 124ad227feaSJunchao Zhang MPI_Op cop = MPI_Op_f2c(*op); 1258af6ec1cSBarry Smith 1265975b3b6SBarry Smith *ierr = PetscMPIFortranDatatypeToC(*unit, &dtype); 1275975b3b6SBarry Smith if (*ierr) return; 1285975b3b6SBarry Smith *ierr = F90Array1dAccess(rptr, dtype, (void **)&rootdata PETSC_F90_2PTR_PARAM(rptrd)); 1295975b3b6SBarry Smith if (*ierr) return; 1305975b3b6SBarry Smith *ierr = F90Array1dAccess(lptr, dtype, (void **)&leafdata PETSC_F90_2PTR_PARAM(lptrd)); 1315975b3b6SBarry Smith if (*ierr) return; 132ad227feaSJunchao Zhang *ierr = PetscSFBcastBegin(*sf, dtype, rootdata, leafdata, cop); 1338af6ec1cSBarry Smith } 1348af6ec1cSBarry Smith 135ad227feaSJunchao Zhang PETSC_EXTERN void petscsfbcastend_(PetscSF *sf, MPI_Fint *unit, F90Array1d *rptr, F90Array1d *lptr, MPI_Fint *op, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(rptrd) PETSC_F90_2PTR_PROTO(lptrd)) 1368af6ec1cSBarry Smith { 1378af6ec1cSBarry Smith MPI_Datatype dtype; 1388af6ec1cSBarry Smith const void *rootdata; 1398af6ec1cSBarry Smith void *leafdata; 140ad227feaSJunchao Zhang MPI_Op cop = MPI_Op_f2c(*op); 1418af6ec1cSBarry Smith 1425975b3b6SBarry Smith *ierr = PetscMPIFortranDatatypeToC(*unit, &dtype); 1435975b3b6SBarry Smith if (*ierr) return; 1445975b3b6SBarry Smith *ierr = F90Array1dAccess(rptr, dtype, (void **)&rootdata PETSC_F90_2PTR_PARAM(rptrd)); 1455975b3b6SBarry Smith if (*ierr) return; 1465975b3b6SBarry Smith *ierr = F90Array1dAccess(lptr, dtype, (void **)&leafdata PETSC_F90_2PTR_PARAM(lptrd)); 1475975b3b6SBarry Smith if (*ierr) return; 148ad227feaSJunchao Zhang *ierr = PetscSFBcastEnd(*sf, dtype, rootdata, leafdata, cop); 1498af6ec1cSBarry Smith } 1509037d788SNicholas Arnold-Medabalimi 1519037d788SNicholas Arnold-Medabalimi PETSC_EXTERN void petscsfreducebegin_(PetscSF *sf, MPI_Fint *unit, F90Array1d *lptr, F90Array1d *rptr, MPI_Fint *op, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(lptrd) PETSC_F90_2PTR_PROTO(rptrd)) 1529037d788SNicholas Arnold-Medabalimi { 1539037d788SNicholas Arnold-Medabalimi MPI_Datatype dtype; 1549037d788SNicholas Arnold-Medabalimi const void *leafdata; 1559037d788SNicholas Arnold-Medabalimi void *rootdata; 1569037d788SNicholas Arnold-Medabalimi MPI_Op cop = MPI_Op_f2c(*op); 1579037d788SNicholas Arnold-Medabalimi 1585975b3b6SBarry Smith *ierr = PetscMPIFortranDatatypeToC(*unit, &dtype); 1595975b3b6SBarry Smith if (*ierr) return; 1605975b3b6SBarry Smith *ierr = F90Array1dAccess(rptr, dtype, (void **)&rootdata PETSC_F90_2PTR_PARAM(rptrd)); 1615975b3b6SBarry Smith if (*ierr) return; 1625975b3b6SBarry Smith *ierr = F90Array1dAccess(lptr, dtype, (void **)&leafdata PETSC_F90_2PTR_PARAM(lptrd)); 1635975b3b6SBarry Smith if (*ierr) return; 1649037d788SNicholas Arnold-Medabalimi *ierr = PetscSFReduceBegin(*sf, dtype, leafdata, rootdata, cop); 1659037d788SNicholas Arnold-Medabalimi } 1669037d788SNicholas Arnold-Medabalimi 1679037d788SNicholas Arnold-Medabalimi PETSC_EXTERN void petscsfreduceend_(PetscSF *sf, MPI_Fint *unit, F90Array1d *lptr, F90Array1d *rptr, MPI_Fint *op, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(lptrd) PETSC_F90_2PTR_PROTO(rptrd)) 1689037d788SNicholas Arnold-Medabalimi { 1699037d788SNicholas Arnold-Medabalimi MPI_Datatype dtype; 1709037d788SNicholas Arnold-Medabalimi const void *leafdata; 1719037d788SNicholas Arnold-Medabalimi void *rootdata; 1729037d788SNicholas Arnold-Medabalimi MPI_Op cop = MPI_Op_f2c(*op); 1739037d788SNicholas Arnold-Medabalimi 1745975b3b6SBarry Smith *ierr = PetscMPIFortranDatatypeToC(*unit, &dtype); 1755975b3b6SBarry Smith if (*ierr) return; 1765975b3b6SBarry Smith *ierr = F90Array1dAccess(rptr, dtype, (void **)&rootdata PETSC_F90_2PTR_PARAM(rptrd)); 1775975b3b6SBarry Smith if (*ierr) return; 1785975b3b6SBarry Smith *ierr = F90Array1dAccess(lptr, dtype, (void **)&leafdata PETSC_F90_2PTR_PARAM(lptrd)); 1795975b3b6SBarry Smith if (*ierr) return; 1809037d788SNicholas Arnold-Medabalimi *ierr = PetscSFReduceEnd(*sf, dtype, leafdata, rootdata, cop); 1819037d788SNicholas Arnold-Medabalimi } 1826f7e44deSSatish Balay #endif 183