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) 55c87a30dSBarry Smith #define petscsfview_ PETSCSFVIEW 68d1b7334SBarry Smith #define petscsfgetgraph_ PETSCSFGETGRAPH 78af6ec1cSBarry Smith #define petscsfbcastbegin_ PETSCSFBCASTBEGIN 88af6ec1cSBarry Smith #define petscsfbcastend_ PETSCSFBCASTEND 9*9037d788SNicholas Arnold-Medabalimi #define petscsfreducebegin_ PETSCSFREDUCEBEGIN 10*9037d788SNicholas Arnold-Medabalimi #define petscsfreduceend_ PETSCSFREDUCEEND 117f139299SBarry Smith #define f90arraysfnodecreate_ F90ARRAYSFNODECREATE 12fe2efc57SMark #define petscsfviewfromoptions_ PETSCSFVIEWFROMOPTIONS 131fb7b255SJunchao Zhang #define petscsfdestroy_ PETSCSFDESTROY 148dbb0df6SBarry Smith #define petscsfsetgraph_ PETSCSFSETGRAPH 1594a885e8SJunchao Zhang #define petscsfgetleafranks_ PETSCSFGETLEAFRANKS 1694a885e8SJunchao Zhang #define petscsfgetrootranks_ PETSCSFGETROOTRANKS 17a6e9e4f7SMatthew G. Knepley #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 185c87a30dSBarry Smith #define petscsfgetgraph_ petscsfgetgraph 195c87a30dSBarry Smith #define petscsfview_ petscsfview 208af6ec1cSBarry Smith #define petscsfbcastbegin_ petscsfbcastbegin 218af6ec1cSBarry Smith #define petscsfbcastend_ petscsfbcastend 22*9037d788SNicholas Arnold-Medabalimi #define petscsfreducebegin_ petscsfreducebegin 23*9037d788SNicholas Arnold-Medabalimi #define petscsfreduceend_ petscsfreduceend 247f139299SBarry Smith #define f90arraysfnodecreate_ f90arraysfnodecreate 25fe2efc57SMark #define petscsfviewfromoptions_ petscsfviewfromoptions 261fb7b255SJunchao Zhang #define petscsfdestroy_ petscsfdestroy 278dbb0df6SBarry Smith #define petscsfsetgraph_ petscsfsetgraph 2894a885e8SJunchao Zhang #define petscsfgetleafranks_ petscsfgetleafranks 2994a885e8SJunchao Zhang #define petscsfgetrootranks_ petscsfgetrootranks 30a6e9e4f7SMatthew G. Knepley #endif 31a6e9e4f7SMatthew G. Knepley 3219caf8f3SSatish Balay PETSC_EXTERN void f90arraysfnodecreate_(const PetscInt *,PetscInt *,void * PETSC_F90_2PTR_PROTO_NOVAR); 337f139299SBarry Smith 348dbb0df6SBarry Smith PETSC_EXTERN void petscsfsetgraph_(PetscSF *sf,PetscInt *nroots,PetscInt *nleaves, PetscInt *ilocal,PetscCopyMode *localmode, PetscSFNode *iremote,PetscCopyMode *remotemode, int *ierr) 358dbb0df6SBarry Smith { 368dbb0df6SBarry Smith if (ilocal == PETSC_NULL_INTEGER_Fortran) ilocal = NULL; 378dbb0df6SBarry Smith *ierr = PetscSFSetGraph(*sf,*nroots,*nleaves,ilocal,*localmode,iremote,*remotemode); 388dbb0df6SBarry Smith } 398dbb0df6SBarry Smith 4019caf8f3SSatish Balay PETSC_EXTERN void petscsfview_(PetscSF *sf, PetscViewer *vin, PetscErrorCode *ierr) 41a6e9e4f7SMatthew G. Knepley { 42a6e9e4f7SMatthew G. Knepley PetscViewer v; 43a6e9e4f7SMatthew G. Knepley 44a6e9e4f7SMatthew G. Knepley PetscPatchDefaultViewers_Fortran(vin, v); 45a6e9e4f7SMatthew G. Knepley *ierr = PetscSFView(*sf, v); 46a6e9e4f7SMatthew G. Knepley } 478af6ec1cSBarry Smith 4861bf59e3SJunchao 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)) 495c87a30dSBarry Smith { 505c87a30dSBarry Smith const PetscInt *ilocal; 515c87a30dSBarry Smith const PetscSFNode *iremote; 528dbb0df6SBarry Smith PetscInt nl; 535c87a30dSBarry Smith 545c87a30dSBarry Smith *ierr = PetscSFGetGraph(*sf,nroots,nleaves,&ilocal,&iremote);if (*ierr) return; 558dbb0df6SBarry Smith nl = *nleaves; 568dbb0df6SBarry Smith if (!ilocal) nl = 0; 578dbb0df6SBarry Smith *ierr = F90Array1dCreate((void*)ilocal,MPIU_INT,1,nl, ailocal PETSC_F90_2PTR_PARAM(pilocal)); 587f139299SBarry Smith /* this creates a memory leak */ 598e383715SSatish Balay f90arraysfnodecreate_((PetscInt*)iremote,nleaves, airemote PETSC_F90_2PTR_PARAM(piremote)); 605c87a30dSBarry Smith } 615c87a30dSBarry Smith 6294a885e8SJunchao Zhang PETSC_EXTERN void petscsfgetleafranks_(PetscSF *sf, PetscInt *niranks, F90Array1d *airanks, F90Array1d *aioffset, F90Array1d *airootloc, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(piranks) PETSC_F90_2PTR_PROTO(pioffset) PETSC_F90_2PTR_PROTO(pirootloc)) 6394a885e8SJunchao Zhang { 6494a885e8SJunchao Zhang const PetscMPIInt *iranks = NULL; 6594a885e8SJunchao Zhang const PetscInt *ioffset = NULL; 6694a885e8SJunchao Zhang const PetscInt *irootloc = NULL; 6794a885e8SJunchao Zhang 6894a885e8SJunchao Zhang *ierr = PetscSFGetLeafRanks(*sf, niranks, &iranks, &ioffset, &irootloc);if (*ierr) return; 6994a885e8SJunchao Zhang *ierr = F90Array1dCreate((void*)irootloc, MPIU_INT, 1, ioffset[*niranks], airootloc PETSC_F90_2PTR_PARAM(pirootloc));if (*ierr) return; 7094a885e8SJunchao Zhang *ierr = F90Array1dCreate((void*)iranks, MPI_INT, 1, *niranks, airanks PETSC_F90_2PTR_PARAM(piranks));if (*ierr) return; 7194a885e8SJunchao Zhang *ierr = F90Array1dCreate((void*)ioffset, MPIU_INT, 1, *niranks+1, aioffset PETSC_F90_2PTR_PARAM(pioffset));if (*ierr) return; 7294a885e8SJunchao Zhang } 7394a885e8SJunchao Zhang 7494a885e8SJunchao Zhang PETSC_EXTERN void petscsfgetrootranks_(PetscSF *sf, PetscInt *nranks, F90Array1d *aranks, F90Array1d *aroffset, F90Array1d *armine, F90Array1d *arremote, 7594a885e8SJunchao Zhang PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(pranks) PETSC_F90_2PTR_PROTO(proffset) PETSC_F90_2PTR_PROTO(prmine) PETSC_F90_2PTR_PROTO(prremote)) 7694a885e8SJunchao Zhang { 7794a885e8SJunchao Zhang const PetscMPIInt *ranks = NULL; 7894a885e8SJunchao Zhang const PetscInt *roffset = NULL; 7994a885e8SJunchao Zhang const PetscInt *rmine = NULL; 8094a885e8SJunchao Zhang const PetscInt *rremote = NULL; 8194a885e8SJunchao Zhang 8294a885e8SJunchao Zhang *ierr = PetscSFGetRootRanks(*sf, nranks, &ranks, &roffset, &rmine, &rremote);if (*ierr) return; 8394a885e8SJunchao Zhang *ierr = F90Array1dCreate((void*)ranks, MPI_INT, 1, *nranks, aranks PETSC_F90_2PTR_PARAM(pranks));if (*ierr) return; 8494a885e8SJunchao Zhang *ierr = F90Array1dCreate((void*)roffset, MPIU_INT, 1, *nranks+1, aroffset PETSC_F90_2PTR_PARAM(proffset));if (*ierr) return; 8594a885e8SJunchao Zhang *ierr = F90Array1dCreate((void*)rmine, MPIU_INT, 1, roffset[*nranks], armine PETSC_F90_2PTR_PARAM(prmine));if (*ierr) return; 8694a885e8SJunchao Zhang *ierr = F90Array1dCreate((void*)rremote, MPIU_INT, 1, roffset[*nranks], arremote PETSC_F90_2PTR_PARAM(prremote));if (*ierr) return; 8794a885e8SJunchao Zhang } 8894a885e8SJunchao Zhang 896f7e44deSSatish Balay #if defined(PETSC_HAVE_F90_ASSUMED_TYPE_NOT_PTR) 90ad227feaSJunchao Zhang PETSC_EXTERN void petscsfbcastbegin_(PetscSF *sf, MPI_Fint *unit, const void *rptr, void *lptr, MPI_Fint *op, PetscErrorCode *ierr) 916f7e44deSSatish Balay { 926f7e44deSSatish Balay MPI_Datatype dtype; 93ad227feaSJunchao Zhang MPI_Op cop = MPI_Op_f2c(*op); 946f7e44deSSatish Balay 956f7e44deSSatish Balay *ierr = PetscMPIFortranDatatypeToC(*unit,&dtype);if (*ierr) return; 96ad227feaSJunchao Zhang *ierr = PetscSFBcastBegin(*sf, dtype, rptr, lptr, cop); 976f7e44deSSatish Balay } 986f7e44deSSatish Balay 99ad227feaSJunchao Zhang PETSC_EXTERN void petscsfbcastend_(PetscSF *sf, MPI_Fint *unit, const void *rptr, void *lptr, MPI_Fint *op, PetscErrorCode *ierr) 1006f7e44deSSatish Balay { 1016f7e44deSSatish Balay MPI_Datatype dtype; 102ad227feaSJunchao Zhang MPI_Op cop = MPI_Op_f2c(*op); 1036f7e44deSSatish Balay 1046f7e44deSSatish Balay *ierr = PetscMPIFortranDatatypeToC(*unit,&dtype);if (*ierr) return; 105ad227feaSJunchao Zhang *ierr = PetscSFBcastEnd(*sf, dtype, rptr, lptr, cop); 1066f7e44deSSatish Balay } 1076f7e44deSSatish Balay 108*9037d788SNicholas Arnold-Medabalimi PETSC_EXTERN void petscsfreducebegin_(PetscSF *sf, MPI_Fint *unit, const void *lptr, void *rptr, MPI_Fint *op, PetscErrorCode *ierr) 109*9037d788SNicholas Arnold-Medabalimi { 110*9037d788SNicholas Arnold-Medabalimi MPI_Datatype dtype; 111*9037d788SNicholas Arnold-Medabalimi MPI_Op cop = MPI_Op_f2c(*op); 112*9037d788SNicholas Arnold-Medabalimi 113*9037d788SNicholas Arnold-Medabalimi *ierr = PetscMPIFortranDatatypeToC(*unit,&dtype);if (*ierr) return; 114*9037d788SNicholas Arnold-Medabalimi *ierr = PetscSFReduceBegin(*sf, dtype, lptr, rptr, cop); 115*9037d788SNicholas Arnold-Medabalimi } 116*9037d788SNicholas Arnold-Medabalimi 117*9037d788SNicholas Arnold-Medabalimi PETSC_EXTERN void petscsfreduceend_(PetscSF *sf, MPI_Fint *unit, const void *lptr, void *rptr, MPI_Fint *op, PetscErrorCode *ierr) 118*9037d788SNicholas Arnold-Medabalimi { 119*9037d788SNicholas Arnold-Medabalimi MPI_Datatype dtype; 120*9037d788SNicholas Arnold-Medabalimi MPI_Op cop = MPI_Op_f2c(*op); 121*9037d788SNicholas Arnold-Medabalimi 122*9037d788SNicholas Arnold-Medabalimi *ierr = PetscMPIFortranDatatypeToC(*unit,&dtype);if (*ierr) return; 123*9037d788SNicholas Arnold-Medabalimi *ierr = PetscSFReduceEnd(*sf, dtype, lptr, rptr, cop); 124*9037d788SNicholas Arnold-Medabalimi } 125*9037d788SNicholas Arnold-Medabalimi 1266f7e44deSSatish Balay #else 1276f7e44deSSatish Balay 128ad227feaSJunchao 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)) 1298af6ec1cSBarry Smith { 1308af6ec1cSBarry Smith MPI_Datatype dtype; 1318af6ec1cSBarry Smith const void *rootdata; 1328af6ec1cSBarry Smith void *leafdata; 133ad227feaSJunchao Zhang MPI_Op cop = MPI_Op_f2c(*op); 1348af6ec1cSBarry Smith 1355c87a30dSBarry Smith *ierr = PetscMPIFortranDatatypeToC(*unit,&dtype);if (*ierr) return; 1368af6ec1cSBarry Smith *ierr = F90Array1dAccess(rptr, dtype, (void**) &rootdata PETSC_F90_2PTR_PARAM(rptrd));if (*ierr) return; 1378af6ec1cSBarry Smith *ierr = F90Array1dAccess(lptr, dtype, (void**) &leafdata PETSC_F90_2PTR_PARAM(lptrd));if (*ierr) return; 138ad227feaSJunchao Zhang *ierr = PetscSFBcastBegin(*sf, dtype, rootdata, leafdata, cop); 1398af6ec1cSBarry Smith } 1408af6ec1cSBarry Smith 141ad227feaSJunchao 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)) 1428af6ec1cSBarry Smith { 1438af6ec1cSBarry Smith MPI_Datatype dtype; 1448af6ec1cSBarry Smith const void *rootdata; 1458af6ec1cSBarry Smith void *leafdata; 146ad227feaSJunchao Zhang MPI_Op cop = MPI_Op_f2c(*op); 1478af6ec1cSBarry Smith 1485c87a30dSBarry Smith *ierr = PetscMPIFortranDatatypeToC(*unit,&dtype);if (*ierr) return; 1498af6ec1cSBarry Smith *ierr = F90Array1dAccess(rptr, dtype, (void**) &rootdata PETSC_F90_2PTR_PARAM(rptrd));if (*ierr) return; 1508af6ec1cSBarry Smith *ierr = F90Array1dAccess(lptr, dtype, (void**) &leafdata PETSC_F90_2PTR_PARAM(lptrd));if (*ierr) return; 151ad227feaSJunchao Zhang *ierr = PetscSFBcastEnd(*sf, dtype, rootdata, leafdata, cop); 1528af6ec1cSBarry Smith } 153*9037d788SNicholas Arnold-Medabalimi 154*9037d788SNicholas 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)) 155*9037d788SNicholas Arnold-Medabalimi { 156*9037d788SNicholas Arnold-Medabalimi MPI_Datatype dtype; 157*9037d788SNicholas Arnold-Medabalimi const void *leafdata; 158*9037d788SNicholas Arnold-Medabalimi void *rootdata; 159*9037d788SNicholas Arnold-Medabalimi MPI_Op cop = MPI_Op_f2c(*op); 160*9037d788SNicholas Arnold-Medabalimi 161*9037d788SNicholas Arnold-Medabalimi *ierr = PetscMPIFortranDatatypeToC(*unit,&dtype);if (*ierr) return; 162*9037d788SNicholas Arnold-Medabalimi *ierr = F90Array1dAccess(rptr, dtype, (void**) &rootdata PETSC_F90_2PTR_PARAM(rptrd));if (*ierr) return; 163*9037d788SNicholas Arnold-Medabalimi *ierr = F90Array1dAccess(lptr, dtype, (void**) &leafdata PETSC_F90_2PTR_PARAM(lptrd));if (*ierr) return; 164*9037d788SNicholas Arnold-Medabalimi *ierr = PetscSFReduceBegin(*sf, dtype, leafdata, rootdata, cop); 165*9037d788SNicholas Arnold-Medabalimi } 166*9037d788SNicholas Arnold-Medabalimi 167*9037d788SNicholas 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)) 168*9037d788SNicholas Arnold-Medabalimi { 169*9037d788SNicholas Arnold-Medabalimi MPI_Datatype dtype; 170*9037d788SNicholas Arnold-Medabalimi const void *leafdata; 171*9037d788SNicholas Arnold-Medabalimi void *rootdata; 172*9037d788SNicholas Arnold-Medabalimi MPI_Op cop = MPI_Op_f2c(*op); 173*9037d788SNicholas Arnold-Medabalimi 174*9037d788SNicholas Arnold-Medabalimi *ierr = PetscMPIFortranDatatypeToC(*unit,&dtype);if (*ierr) return; 175*9037d788SNicholas Arnold-Medabalimi *ierr = F90Array1dAccess(rptr, dtype, (void**) &rootdata PETSC_F90_2PTR_PARAM(rptrd));if (*ierr) return; 176*9037d788SNicholas Arnold-Medabalimi *ierr = F90Array1dAccess(lptr, dtype, (void**) &leafdata PETSC_F90_2PTR_PARAM(lptrd));if (*ierr) return; 177*9037d788SNicholas Arnold-Medabalimi *ierr = PetscSFReduceEnd(*sf, dtype, leafdata, rootdata, cop); 178*9037d788SNicholas Arnold-Medabalimi } 179*9037d788SNicholas Arnold-Medabalimi 18019caf8f3SSatish Balay PETSC_EXTERN void petscsfviewfromoptions_(PetscSF *ao,PetscObject obj,char* type,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 181fe2efc57SMark { 182fe2efc57SMark char *t; 183fe2efc57SMark 184fe2efc57SMark FIXCHAR(type,len,t); 185b14c0cbaSBlaise Bourdin CHKFORTRANNULLOBJECT(obj); 186fe2efc57SMark *ierr = PetscSFViewFromOptions(*ao,obj,t);if (*ierr) return; 187fe2efc57SMark FREECHAR(type,t); 188fe2efc57SMark } 1896f7e44deSSatish Balay 1901fb7b255SJunchao Zhang PETSC_EXTERN void petscsfdestroy_(PetscSF *x,int *ierr) 1911fb7b255SJunchao Zhang { 1921fb7b255SJunchao Zhang PETSC_FORTRAN_OBJECT_F_DESTROYED_TO_C_NULL(x); 1931fb7b255SJunchao Zhang *ierr = PetscSFDestroy(x); if (*ierr) return; 1941fb7b255SJunchao Zhang PETSC_FORTRAN_OBJECT_C_NULL_TO_F_DESTROYED(x); 1951fb7b255SJunchao Zhang } 1961fb7b255SJunchao Zhang 1976f7e44deSSatish Balay #endif 198