xref: /petsc/src/vec/is/utils/ftn-custom/zisltogf.c (revision 66af8762ec03dbef0e079729eb2a1734a35ed7ff)
1 #include <petsc/private/fortranimpl.h>
2 #include <petscis.h>
3 #include <petscviewer.h>
4 
5 #if defined(PETSC_HAVE_FORTRAN_CAPS)
6   #define islocaltoglobalmappingview_     ISLOCALTOGLOBALMAPPINGVIEW
7   #define islocaltoglobalmpnggetinfosize_ ISLOCALTOGLOBALMPNGGETINFOSIZE
8   #define islocaltoglobalmappinggetinfo_  ISLOCALTOGLOBALMAPPINGGETINFO
9 #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
10   #define islocaltoglobalmappingview_     islocaltoglobalmappingview
11   #define islocaltoglobalmpnggetinfosize_ islocaltoglobalmpnggetinfosize
12   #define islocaltoglobalmappinggetinfo_  islocaltoglobalmappinggetinfo
13 #endif
14 
15 PETSC_EXTERN void islocaltoglobalmappingview_(ISLocalToGlobalMapping *mapping, PetscViewer *viewer, PetscErrorCode *ierr)
16 {
17   PetscViewer v;
18   PetscPatchDefaultViewers_Fortran(viewer, v);
19   *ierr = ISLocalToGlobalMappingView(*mapping, v);
20 }
21 
22 static PetscInt  *sprocs, *snumprocs, **sindices;
23 static PetscBool  called;
24 PETSC_EXTERN void islocaltoglobalmpnggetinfosize_(ISLocalToGlobalMapping *mapping, PetscInt *size, PetscInt *maxnumprocs, PetscErrorCode *ierr)
25 {
26   PetscInt i;
27   if (called) {
28     *ierr = PETSC_ERR_ARG_WRONGSTATE;
29     return;
30   }
31   *ierr = ISLocalToGlobalMappingGetInfo(*mapping, size, &sprocs, &snumprocs, &sindices);
32   if (*ierr) return;
33   *maxnumprocs = 0;
34   for (i = 0; i < *size; i++) *maxnumprocs = PetscMax(*maxnumprocs, snumprocs[i]);
35   called = PETSC_TRUE;
36 }
37 
38 PETSC_EXTERN void islocaltoglobalmappinggetinfo_(ISLocalToGlobalMapping *mapping, PetscInt *size, PetscInt *procs, PetscInt *numprocs, PetscInt *indices, PetscErrorCode *ierr)
39 {
40   PetscInt i, j;
41   if (!called) {
42     *ierr = PETSC_ERR_ARG_WRONGSTATE;
43     return;
44   }
45   *ierr = PetscArraycpy(procs, sprocs, *size);
46   if (*ierr) return;
47   *ierr = PetscArraycpy(numprocs, snumprocs, *size);
48   if (*ierr) return;
49   for (i = 0; i < *size; i++) {
50     for (j = 0; j < numprocs[i]; j++) indices[i + (*size) * j] = sindices[i][j];
51   }
52   *ierr = ISLocalToGlobalMappingRestoreInfo(*mapping, size, &sprocs, &snumprocs, &sindices);
53   if (*ierr) return;
54   called = PETSC_FALSE;
55 }
56 
57 PETSC_EXTERN void islocaltoglobalmappingviewfromoptions_(ISLocalToGlobalMapping *ao, PetscObject obj, char *type, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len)
58 {
59   char *t;
60 
61   FIXCHAR(type, len, t);
62   CHKFORTRANNULLOBJECT(obj);
63   *ierr = ISLocalToGlobalMappingViewFromOptions(*ao, obj, t);
64   if (*ierr) return;
65   FREECHAR(type, t);
66 }
67