1 #include <petsc/private/fortranimpl.h> 2 #include <petscmat.h> 3 #include <petscviewer.h> 4 5 #if defined(PETSC_HAVE_FORTRAN_CAPS) 6 #define matnullspacecreate0_ MATNULLSPACECREATE0 7 #define matnullspacecreate1_ MATNULLSPACECREATE1 8 #define matnullspacegetvecs_ MATNULLSPACEGETVECS 9 #define matnullspaceview_ MATNULLSPACEVIEW 10 #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 11 #define matnullspacecreate0_ matnullspacecreate0 12 #define matnullspacecreate1_ matnullspacecreate1 13 #define matnullspacegetvecs_ matnullspacegetvecs 14 #define matnullspaceview_ matnullspaceview 15 #endif 16 17 PETSC_EXTERN void PETSC_STDCALL matnullspacecreate0_(MPI_Fint * comm,PetscBool *has_cnst,PetscInt *n, Vec vecs[],MatNullSpace *SP, PetscErrorCode *ierr ) 18 { 19 CHKFORTRANNULLOBJECTDEREFERENCE(vecs); 20 *ierr = MatNullSpaceCreate(MPI_Comm_f2c(*(comm)),*has_cnst,*n,vecs,SP); 21 } 22 23 PETSC_EXTERN void PETSC_STDCALL matnullspacecreate1_(MPI_Fint * comm,PetscBool *has_cnst,PetscInt *n, Vec vecs[],MatNullSpace *SP, PetscErrorCode *ierr ) 24 { 25 CHKFORTRANNULLOBJECTDEREFERENCE(vecs); 26 *ierr = MatNullSpaceCreate(MPI_Comm_f2c(*(comm)),*has_cnst,*n,vecs,SP); 27 } 28 29 PETSC_EXTERN void PETSC_STDCALL matnullspacegetvecs_(MatNullSpace *sp,PetscBool *HAS_CNST,PetscInt *N, Vec *VECS,PetscErrorCode *ierr) 30 { 31 PetscBool has_cnst; 32 PetscInt i,n; 33 const Vec *vecs; 34 35 CHKFORTRANNULLBOOL(HAS_CNST); 36 CHKFORTRANNULLINTEGER(N); 37 CHKFORTRANNULLOBJECT(VECS); 38 39 *ierr = MatNullSpaceGetVecs(*sp, &has_cnst, &n, &vecs); 40 41 if (HAS_CNST) { 42 *HAS_CNST = has_cnst; 43 } 44 if (N) { 45 *N = n; 46 } 47 if (VECS) { 48 for (i=0; i<n; i++) { 49 VECS[i] = vecs[i]; 50 } 51 } 52 } 53 54 PETSC_EXTERN void PETSC_STDCALL matnullspaceview_(MatNullSpace *sp,PetscViewer *vin,PetscErrorCode *ierr) 55 { 56 PetscViewer v; 57 PetscPatchDefaultViewers_Fortran(vin,v); 58 *ierr = MatNullSpaceView(*sp,v); 59 } 60 61