xref: /petsc/src/ksp/pc/impls/fieldsplit/ftn-custom/zfieldsplitf.c (revision fbf9dbe564678ed6eff1806adbc4c4f01b9743f4)
1 #include <petsc/private/fortranimpl.h>
2 #include <petscksp.h>
3 
4 #if defined(PETSC_HAVE_FORTRAN_CAPS)
5   #define pcfieldsplitgetsubksp_      PCFIELDSPLITGETSUBKSP
6   #define pcfieldsplitschurgetsubksp_ PCFIELDSPLITSCHURGETSUBKSP
7   #define pcfieldsplitsetis_          PCFIELDSPLITSETIS
8   #define pcfieldsplitgetis_          PCFIELDSPLITGETIS
9   #define pcfieldsplitsetfields_      PCFIELDSPLITSETFIELDS
10 #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
11   #define pcfieldsplitgetsubksp_      pcfieldsplitgetsubksp
12   #define pcfieldsplitschurgetsubksp_ pcfieldsplitschurgetsubksp
13   #define pcfieldsplitsetis_          pcfieldsplitsetis
14   #define pcfieldsplitgetis_          pcfieldsplitgetis
15   #define pcfieldsplitsetfields_      pcfieldsplitsetfields
16 #endif
17 
18 PETSC_EXTERN void pcfieldsplitschurgetsubksp_(PC *pc, PetscInt *n_local, KSP *ksp, PetscErrorCode *ierr)
19 {
20   KSP     *tksp;
21   PetscInt i, nloc;
22   CHKFORTRANNULLINTEGER(n_local);
23   *ierr = PCFieldSplitSchurGetSubKSP(*pc, &nloc, &tksp);
24   if (*ierr) return;
25   if (n_local) *n_local = nloc;
26   CHKFORTRANNULLOBJECT(ksp);
27   if (ksp) {
28     for (i = 0; i < nloc; i++) ksp[i] = tksp[i];
29   }
30   *ierr = PetscFree(tksp);
31 }
32 
33 PETSC_EXTERN void pcfieldsplitgetsubksp_(PC *pc, PetscInt *n_local, KSP *ksp, PetscErrorCode *ierr)
34 {
35   KSP     *tksp;
36   PetscInt i, nloc;
37   CHKFORTRANNULLINTEGER(n_local);
38   *ierr = PCFieldSplitGetSubKSP(*pc, &nloc, &tksp);
39   if (*ierr) return;
40   if (n_local) *n_local = nloc;
41   CHKFORTRANNULLOBJECT(ksp);
42   if (ksp) {
43     for (i = 0; i < nloc; i++) ksp[i] = tksp[i];
44   }
45   *ierr = PetscFree(tksp);
46 }
47 
48 PETSC_EXTERN void pcfieldsplitsetis_(PC *pc, char *splitname, IS *is, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len)
49 {
50   char *t;
51   FIXCHAR(splitname, len, t);
52   *ierr = PCFieldSplitSetIS(*pc, t, *is);
53   if (*ierr) return;
54   FREECHAR(splitname, t);
55 }
56 
57 PETSC_EXTERN void pcfieldsplitgetis_(PC *pc, char *splitname, IS *is, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len)
58 {
59   char *t;
60   FIXCHAR(splitname, len, t);
61   *ierr = PCFieldSplitGetIS(*pc, t, is);
62   if (*ierr) return;
63   FREECHAR(splitname, t);
64 }
65 
66 PETSC_EXTERN void pcfieldsplitsetfields_(PC *pc, char *splitname, PetscInt *n, const PetscInt *fields, const PetscInt *fields_col, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len)
67 {
68   char *t;
69   FIXCHAR(splitname, len, t);
70   *ierr = PCFieldSplitSetFields(*pc, t, *n, fields, fields_col);
71   if (*ierr) return;
72   FREECHAR(splitname, t);
73 }
74