xref: /petsc/src/vec/is/sf/interface/ftn-custom/zsf.c (revision 6497c311e7b976d467be1503c1effce92a60525c)
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