1b45d2f2cSJed Brown #include <petsc-private/fortranimpl.h> 2c6db04a5SJed Brown #include <petscmat.h> 3665c2dedSJed Brown #include <petscviewer.h> 4f4e70085SSatish Balay 5f4e70085SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS) 6*87bcf4e0SBarry Smith #define matgetrowmin_ MATGETROWMIN 7*87bcf4e0SBarry Smith #define matgetrowminabs_ MATGETROWMINABS 85928be6bSBarry Smith #define matgetrowmax_ MATGETROWMAX 95928be6bSBarry Smith #define matgetrowmaxabs_ MATGETROWMAXABS 107d6bfa3bSBarry Smith #define matdestroymatrices_ MATDESTROYMATRICES 115dffd610SBarry Smith #define matgetfactor_ MATGETFACTOR 1235bd34faSBarry Smith #define matfactorgetsolverpackage_ MATFACTORGETSOLVERPACKAGE 13f4e70085SSatish Balay #define matgetrowij_ MATGETROWIJ 14f4e70085SSatish Balay #define matrestorerowij_ MATRESTOREROWIJ 15f4e70085SSatish Balay #define matgetrow_ MATGETROW 16f4e70085SSatish Balay #define matrestorerow_ MATRESTOREROW 17f7e310deSShri Abhyankar #define matload_ MATLOAD 18f4e70085SSatish Balay #define matview_ MATVIEW 198c778c55SBarry Smith #define matseqaijgetarray_ MATSEQAIJGETARRAY 206778691eSSatish Balay #define matseqaijrestorearray_ MATSEQAIJRESTOREARRAY 218c778c55SBarry Smith #define matdensegetarray_ MATDENSEGETARRAY 228c778c55SBarry Smith #define matdenserestorearray_ MATDENSERESTOREARRAY 23f4e70085SSatish Balay #define matconvert_ MATCONVERT 24f4e70085SSatish Balay #define matgetsubmatrices_ MATGETSUBMATRICES 2517ede90eSSatish Balay #define matzerorowscolumns_ MATZEROROWSCOLUMNS 2617ede90eSSatish Balay #define matzerorowscolumnsis_ MATZEROROWSCOLUMNSIS 2717ede90eSSatish Balay #define matzerorowsstencil_ MATZEROROWSSTENCIL 28d25a37e1SJed Brown #define matzerorowscolumnsstencil_ MATZEROROWSCOLUMNSSTENCIL 29f4e70085SSatish Balay #define matzerorows_ MATZEROROWS 30f4e70085SSatish Balay #define matzerorowsis_ MATZEROROWSIS 31f4e70085SSatish Balay #define matzerorowslocal_ MATZEROROWSLOCAL 32f4e70085SSatish Balay #define matzerorowslocalis_ MATZEROROWSLOCALIS 3317ede90eSSatish Balay #define matzerorowscolumnslocal_ MATZEROROWSCOLUMNSLOCAL 3417ede90eSSatish Balay #define matzerorowscolumnslocalis_ MATZEROROWSCOLUMNSLOCALIS 351eea217eSSatish Balay #define matsetoptionsprefix_ MATSETOPTIONSPREFIX 367c54600cSBarry Smith #define matgetvecs_ MATGETVECS 37c9d5ca86SBarry Smith #define matnullspaceremove_ MATNULLSPACEREMOVE 385ba43861SSatish Balay #define matgetinfo_ MATGETINFO 3922688b47SSatish Balay #define matlufactor_ MATLUFACTOR 4022688b47SSatish Balay #define matilufactor_ MATILUFACTOR 4122688b47SSatish Balay #define matlufactorsymbolic_ MATLUFACTORSYMBOLIC 4222688b47SSatish Balay #define matlufactornumeric_ MATLUFACTORNUMERIC 4322688b47SSatish Balay #define matcholeskyfactor_ MATCHOLESKYFACTOR 4422688b47SSatish Balay #define matcholeskyfactorsymbolic_ MATCHOLESKYFACTORSYMBOLIC 4522688b47SSatish Balay #define matcholeskyfactornumeric_ MATCHOLESKYFACTORNUMERIC 4622688b47SSatish Balay #define matilufactorsymbolic_ MATILUFACTORSYMBOLIC 4722688b47SSatish Balay #define maticcfactorsymbolic_ MATICCFACTORSYMBOLIC 4822688b47SSatish Balay #define maticcfactor_ MATICCFACTOR 4922688b47SSatish Balay #define matfactorinfoinitialize_ MATFACTORINFOINITIALIZE 50b22b330cSBarry Smith #define matnullspacesetfunction_ MATNULLSPACESETFUNCTION 510905d9aaSJed Brown #define matfindnonzerorows_ MATFINDNONZEROROWS 52f4e70085SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 53*87bcf4e0SBarry Smith #define matgetrowmin_ matgetrowmin 54*87bcf4e0SBarry Smith #define matgetrowminabs_ matgetrowminabs 555928be6bSBarry Smith #define matgetrowmax_ matgetrowmax 565928be6bSBarry Smith #define matgetrowmaxabs_ matgetrowmaxabs 575928be6bSBarry Smith #define matdestroymatrices_ matdestroymatrices 585dffd610SBarry Smith #define matgetfactor_ matgetfactor 5935bd34faSBarry Smith #define matfactorgetsolverpackage_ matfactorgetsolverpackage 607c54600cSBarry Smith #define matgetvecs_ matgetvecs 61f4e70085SSatish Balay #define matgetrowij_ matgetrowij 62f4e70085SSatish Balay #define matrestorerowij_ matrestorerowij 63f4e70085SSatish Balay #define matgetrow_ matgetrow 64f4e70085SSatish Balay #define matrestorerow_ matrestorerow 65f4e70085SSatish Balay #define matview_ matview 66f7e310deSShri Abhyankar #define matload_ matload 678c778c55SBarry Smith #define matseqaijgetarray_ matseqaijgetarray 688c778c55SBarry Smith #define matseqaijrestorearray_ matseqaijrestorearray 698c778c55SBarry Smith #define matdensegetarray_ matdensegetarray 708c778c55SBarry Smith #define matdenserestorearray_ matdenserestorearray 71f4e70085SSatish Balay #define matconvert_ matconvert 72f4e70085SSatish Balay #define matgetsubmatrices_ matgetsubmatrices 7317ede90eSSatish Balay #define matzerorowscolumns_ matzerorowscolumns 7417ede90eSSatish Balay #define matzerorowscolumnsis_ matzerorowscolumnsis 7517ede90eSSatish Balay #define matzerorowsstencil_ matzerorowsstencil 76d25a37e1SJed Brown #define matzerorowscolumnsstencil_ matzerorowscolumnsstencil 77f4e70085SSatish Balay #define matzerorows_ matzerorows 78f4e70085SSatish Balay #define matzerorowsis_ matzerorowsis 79f4e70085SSatish Balay #define matzerorowslocal_ matzerorowslocal 80f4e70085SSatish Balay #define matzerorowslocalis_ matzerorowslocalis 8117ede90eSSatish Balay #define matzerorowscolumnslocal_ matzerorowscolumnslocal 8217ede90eSSatish Balay #define matzerorowscolumnslocalis_ matzerorowscolumnslocalis 831eea217eSSatish Balay #define matsetoptionsprefix_ matsetoptionsprefix 84812c3f48SMatthew Knepley #define matnullspaceremove_ matnullspaceremove 855ba43861SSatish Balay #define matgetinfo_ matgetinfo 8622688b47SSatish Balay #define matlufactor_ matlufactor 8722688b47SSatish Balay #define matilufactor_ matilufactor 8822688b47SSatish Balay #define matlufactorsymbolic_ matlufactorsymbolic 8922688b47SSatish Balay #define matlufactornumeric_ matlufactornumeric 9022688b47SSatish Balay #define matcholeskyfactor_ matcholeskyfactor 9122688b47SSatish Balay #define matcholeskyfactorsymbolic_ matcholeskyfactorsymbolic 9222688b47SSatish Balay #define matcholeskyfactornumeric_ matcholeskyfactornumeric 9322688b47SSatish Balay #define matilufactorsymbolic_ matilufactorsymbolic 9422688b47SSatish Balay #define maticcfactorsymbolic_ maticcfactorsymbolic 9522688b47SSatish Balay #define maticcfactor_ maticcfactor 9622688b47SSatish Balay #define matfactorinfoinitialize_ matfactorinfoinitialize 97b22b330cSBarry Smith #define matnullspacesetfunction_ matnullspacesetfunction 980905d9aaSJed Brown #define matfindnonzerorows_ matfindnonzerorows 99f4e70085SSatish Balay #endif 100f4e70085SSatish Balay 101*87bcf4e0SBarry Smith PETSC_EXTERN void PETSC_STDCALL matgetrowmin_(Mat *mat,Vec *v,PetscInt idx[], int *ierr ) 102*87bcf4e0SBarry Smith { 103*87bcf4e0SBarry Smith CHKFORTRANNULLINTEGER(idx); 104*87bcf4e0SBarry Smith *ierr = MatGetRowMin(*mat,*v,idx); 105*87bcf4e0SBarry Smith } 106*87bcf4e0SBarry Smith PETSC_EXTERN void PETSC_STDCALL matgetrowminabs_(Mat *mat,Vec *v,PetscInt idx[], int *ierr ) 107*87bcf4e0SBarry Smith { 108*87bcf4e0SBarry Smith CHKFORTRANNULLINTEGER(idx); 109*87bcf4e0SBarry Smith *ierr = MatGetRowMinAbs(*mat,*v,idx); 110*87bcf4e0SBarry Smith } 111*87bcf4e0SBarry Smith 1125928be6bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matgetrowmax_(Mat *mat,Vec *v,PetscInt idx[], int *ierr ) 1135928be6bSBarry Smith { 1145928be6bSBarry Smith CHKFORTRANNULLINTEGER(idx); 1155928be6bSBarry Smith *ierr = MatGetRowMax(*mat,*v,idx); 1165928be6bSBarry Smith } 1175928be6bSBarry Smith 1185928be6bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matgetrowmaxabs_(Mat *mat,Vec *v,PetscInt idx[], int *ierr ) 1195928be6bSBarry Smith { 1205928be6bSBarry Smith CHKFORTRANNULLINTEGER(idx); 1215928be6bSBarry Smith *ierr = MatGetRowMaxAbs(*mat,*v,idx); 1225928be6bSBarry Smith } 1235928be6bSBarry Smith 124b22b330cSBarry Smith static PetscErrorCode ournullfunction(MatNullSpace sp,Vec x,void *ctx) 125b22b330cSBarry Smith { 126b22b330cSBarry Smith PetscErrorCode ierr = 0; 127b22b330cSBarry Smith (*(void (PETSC_STDCALL *)(MatNullSpace*,Vec*,void*,PetscErrorCode*))(((PetscObject)sp)->fortran_func_pointers[0]))(&sp,&x,ctx,&ierr);CHKERRQ(ierr); 128b22b330cSBarry Smith return 0; 129b22b330cSBarry Smith } 130b22b330cSBarry Smith 1318cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matnullspacesetfunction_(MatNullSpace *sp, PetscErrorCode (*rem)(MatNullSpace,Vec,void*),void *ctx,PetscErrorCode *ierr) 132b22b330cSBarry Smith { 133b22b330cSBarry Smith PetscObjectAllocateFortranPointers(*sp,1); 134b22b330cSBarry Smith ((PetscObject)*sp)->fortran_func_pointers[0] = (PetscVoidFunction)rem; 13526fbe8dcSKarl Rupp 136b22b330cSBarry Smith *ierr = MatNullSpaceSetFunction(*sp,ournullfunction,ctx); 137b22b330cSBarry Smith } 138b22b330cSBarry Smith 1398cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matgetvecs_(Mat *mat,Vec *right,Vec *left, int *ierr) 1407c54600cSBarry Smith { 1417c54600cSBarry Smith CHKFORTRANNULLOBJECT(right); 1427c54600cSBarry Smith CHKFORTRANNULLOBJECT(left); 1437c54600cSBarry Smith *ierr = MatGetVecs(*mat,right,left); 1447c54600cSBarry Smith } 1457c54600cSBarry Smith 1468cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matgetrowij_(Mat *B,PetscInt *shift,PetscBool *sym,PetscBool *blockcompressed,PetscInt *n,PetscInt *ia,size_t *iia, 147ace3abfcSBarry Smith PetscInt *ja,size_t *jja,PetscBool *done,PetscErrorCode *ierr) 148f4e70085SSatish Balay { 1491a83f524SJed Brown const PetscInt *IA,*JA; 1508f7157efSSatish Balay *ierr = MatGetRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);if (*ierr) return; 1511a83f524SJed Brown *iia = PetscIntAddressToFortran(ia,(PetscInt*)IA); 1521a83f524SJed Brown *jja = PetscIntAddressToFortran(ja,(PetscInt*)JA); 153f4e70085SSatish Balay } 154f4e70085SSatish Balay 1558cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matrestorerowij_(Mat *B,PetscInt *shift,PetscBool *sym,PetscBool *blockcompressed, PetscInt *n,PetscInt *ia,size_t *iia, 156ace3abfcSBarry Smith PetscInt *ja,size_t *jja,PetscBool *done,PetscErrorCode *ierr) 157f4e70085SSatish Balay { 1581a83f524SJed Brown const PetscInt *IA = PetscIntAddressFromFortran(ia,*iia),*JA = PetscIntAddressFromFortran(ja,*jja); 1598f7157efSSatish Balay *ierr = MatRestoreRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done); 160f4e70085SSatish Balay } 161f4e70085SSatish Balay 162f4e70085SSatish Balay /* 163f4e70085SSatish Balay This is a poor way of storing the column and value pointers 164f4e70085SSatish Balay generated by MatGetRow() to be returned with MatRestoreRow() 165f4e70085SSatish Balay but there is not natural,good place else to store them. Hence 166f4e70085SSatish Balay Fortran programmers can only have one outstanding MatGetRows() 167f4e70085SSatish Balay at a time. 168f4e70085SSatish Balay */ 169f4e70085SSatish Balay static PetscErrorCode matgetrowactive = 0; 170f4e70085SSatish Balay static const PetscInt *my_ocols = 0; 171f4e70085SSatish Balay static const PetscScalar *my_ovals = 0; 172f4e70085SSatish Balay 1738cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matgetrow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr) 174f4e70085SSatish Balay { 175f4e70085SSatish Balay const PetscInt **oocols = &my_ocols; 176f4e70085SSatish Balay const PetscScalar **oovals = &my_ovals; 177f4e70085SSatish Balay 178f4e70085SSatish Balay if (matgetrowactive) { 179efca3c55SSatish Balay PetscError(PETSC_COMM_SELF,__LINE__,"MatGetRow_Fortran",__FILE__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL, 180f4e70085SSatish Balay "Cannot have two MatGetRow() active simultaneously\n\ 181f4e70085SSatish Balay call MatRestoreRow() before calling MatGetRow() a second time"); 182f4e70085SSatish Balay *ierr = 1; 183f4e70085SSatish Balay return; 184f4e70085SSatish Balay } 185f4e70085SSatish Balay 1860298fd71SBarry Smith CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = NULL; 1870298fd71SBarry Smith CHKFORTRANNULLSCALAR(vals); if (!vals) oovals = NULL; 188f4e70085SSatish Balay 189f4e70085SSatish Balay *ierr = MatGetRow(*mat,*row,ncols,oocols,oovals); 190f4e70085SSatish Balay if (*ierr) return; 191f4e70085SSatish Balay 192f4e70085SSatish Balay if (oocols) { *ierr = PetscMemcpy(cols,my_ocols,(*ncols)*sizeof(PetscInt)); if (*ierr) return;} 193f4e70085SSatish Balay if (oovals) { *ierr = PetscMemcpy(vals,my_ovals,(*ncols)*sizeof(PetscScalar)); if (*ierr) return;} 194f4e70085SSatish Balay matgetrowactive = 1; 195f4e70085SSatish Balay } 196f4e70085SSatish Balay 1978cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matrestorerow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr) 198f4e70085SSatish Balay { 199f4e70085SSatish Balay const PetscInt **oocols = &my_ocols; 200f4e70085SSatish Balay const PetscScalar **oovals = &my_ovals; 201f4e70085SSatish Balay if (!matgetrowactive) { 202efca3c55SSatish Balay PetscError(PETSC_COMM_SELF,__LINE__,"MatRestoreRow_Fortran",__FILE__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL, 203f4e70085SSatish Balay "Must call MatGetRow() first"); 204f4e70085SSatish Balay *ierr = 1; 205f4e70085SSatish Balay return; 206f4e70085SSatish Balay } 2070298fd71SBarry Smith CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = NULL; 2080298fd71SBarry Smith CHKFORTRANNULLSCALAR(vals); if (!vals) oovals = NULL; 209f4e70085SSatish Balay 210f4e70085SSatish Balay *ierr = MatRestoreRow(*mat,*row,ncols,oocols,oovals); 211f4e70085SSatish Balay matgetrowactive = 0; 212f4e70085SSatish Balay } 213f4e70085SSatish Balay 2148cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matview_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr) 215f4e70085SSatish Balay { 216f4e70085SSatish Balay PetscViewer v; 217f4e70085SSatish Balay PetscPatchDefaultViewers_Fortran(vin,v); 218f4e70085SSatish Balay *ierr = MatView(*mat,v); 219f4e70085SSatish Balay } 220f4e70085SSatish Balay 2218cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matload_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr) 222f7e310deSShri Abhyankar { 223f7e310deSShri Abhyankar PetscViewer v; 224f7e310deSShri Abhyankar PetscPatchDefaultViewers_Fortran(vin,v); 225112444f4SShri Abhyankar *ierr = MatLoad(*mat,v); 226f7e310deSShri Abhyankar } 227f7e310deSShri Abhyankar 2288cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matseqaijgetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr) 229f4e70085SSatish Balay { 230f4e70085SSatish Balay PetscScalar *mm; 231f4e70085SSatish Balay PetscInt m,n; 232f4e70085SSatish Balay 2338c778c55SBarry Smith *ierr = MatSeqAIJGetArray(*mat,&mm); if (*ierr) return; 234f4e70085SSatish Balay *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return; 235f91d1997SBarry Smith *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return; 236f4e70085SSatish Balay } 237f4e70085SSatish Balay 2388cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matseqaijrestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr) 239f4e70085SSatish Balay { 240f4e70085SSatish Balay PetscScalar *lx; 241f4e70085SSatish Balay PetscInt m,n; 242f4e70085SSatish Balay 243f4e70085SSatish Balay *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return; 244f4e70085SSatish Balay *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return; 2458c778c55SBarry Smith *ierr = MatSeqAIJRestoreArray(*mat,&lx);if (*ierr) return; 246f4e70085SSatish Balay } 247f4e70085SSatish Balay 2488cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matdensegetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr) 24973a71a0fSBarry Smith { 25073a71a0fSBarry Smith PetscScalar *mm; 25173a71a0fSBarry Smith PetscInt m,n; 25273a71a0fSBarry Smith 2538c778c55SBarry Smith *ierr = MatDenseGetArray(*mat,&mm); if (*ierr) return; 25473a71a0fSBarry Smith *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return; 25573a71a0fSBarry Smith *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return; 25673a71a0fSBarry Smith } 25773a71a0fSBarry Smith 2588cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matdenserestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr) 25973a71a0fSBarry Smith { 26073a71a0fSBarry Smith PetscScalar *lx; 26173a71a0fSBarry Smith PetscInt m,n; 26273a71a0fSBarry Smith 26373a71a0fSBarry Smith *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return; 26473a71a0fSBarry Smith *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return; 2658c778c55SBarry Smith *ierr = MatDenseRestoreArray(*mat,&lx);if (*ierr) return; 26673a71a0fSBarry Smith } 26773a71a0fSBarry Smith 2688cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matfactorgetsolverpackage_(Mat *mat,CHAR name PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 26935bd34faSBarry Smith { 27035bd34faSBarry Smith const char *tname; 27135bd34faSBarry Smith 27235bd34faSBarry Smith *ierr = MatFactorGetSolverPackage(*mat,&tname);if (*ierr) return; 27335bd34faSBarry Smith if (name != PETSC_NULL_CHARACTER_Fortran) { 27435bd34faSBarry Smith *ierr = PetscStrncpy(name,tname,len);if (*ierr) return; 27535bd34faSBarry Smith } 27635bd34faSBarry Smith FIXRETURNCHAR(PETSC_TRUE,name,len); 27735bd34faSBarry Smith } 27835bd34faSBarry Smith 2798cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matgetfactor_(Mat *mat,CHAR outtype PETSC_MIXED_LEN(len),MatFactorType *ftype,Mat *M,PetscErrorCode *ierr PETSC_END_LEN(len)) 2805dffd610SBarry Smith { 2815dffd610SBarry Smith char *t; 2825dffd610SBarry Smith FIXCHAR(outtype,len,t); 2839be81726SHong Zhang *ierr = MatGetFactor(*mat,t,*ftype,M); 2845dffd610SBarry Smith FREECHAR(outtype,t); 2855dffd610SBarry Smith } 2865dffd610SBarry Smith 2878cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matconvert_(Mat *mat,CHAR outtype PETSC_MIXED_LEN(len),MatReuse *reuse,Mat *M,PetscErrorCode *ierr PETSC_END_LEN(len)) 288f4e70085SSatish Balay { 289f4e70085SSatish Balay char *t; 290f4e70085SSatish Balay FIXCHAR(outtype,len,t); 291f4e70085SSatish Balay *ierr = MatConvert(*mat,t,*reuse,M); 292f4e70085SSatish Balay FREECHAR(outtype,t); 293f4e70085SSatish Balay } 294f4e70085SSatish Balay 295f4e70085SSatish Balay /* 296f4e70085SSatish Balay MatGetSubmatrices() is slightly different from C since the 297f4e70085SSatish Balay Fortran provides the array to hold the submatrix objects,while in C that 298f4e70085SSatish Balay array is allocated by the MatGetSubmatrices() 299f4e70085SSatish Balay */ 3008cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matgetsubmatrices_(Mat *mat,PetscInt *n,IS *isrow,IS *iscol,MatReuse *scall,Mat *smat,PetscErrorCode *ierr) 301f4e70085SSatish Balay { 302f4e70085SSatish Balay Mat *lsmat; 303f4e70085SSatish Balay PetscInt i; 304f4e70085SSatish Balay 305f4e70085SSatish Balay if (*scall == MAT_INITIAL_MATRIX) { 306f4e70085SSatish Balay *ierr = MatGetSubMatrices(*mat,*n,isrow,iscol,*scall,&lsmat); 307f4e70085SSatish Balay for (i=0; i<*n; i++) { 308f4e70085SSatish Balay smat[i] = lsmat[i]; 309f4e70085SSatish Balay } 310f4e70085SSatish Balay *ierr = PetscFree(lsmat); 311f4e70085SSatish Balay } else { 312f4e70085SSatish Balay *ierr = MatGetSubMatrices(*mat,*n,isrow,iscol,*scall,&smat); 313f4e70085SSatish Balay } 314f4e70085SSatish Balay } 315f4e70085SSatish Balay 3167d6bfa3bSBarry Smith /* 3177d6bfa3bSBarry Smith MatDestroyMatrices() is slightly different from C since the 3187d6bfa3bSBarry Smith Fortran provides the array to hold the submatrix objects,while in C that 3197d6bfa3bSBarry Smith array is allocated by the MatGetSubmatrices() 3207d6bfa3bSBarry Smith */ 3218cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matdestroymatrices_(Mat *mat,PetscInt *n,Mat *smat,PetscErrorCode *ierr) 3227d6bfa3bSBarry Smith { 3237d6bfa3bSBarry Smith PetscInt i; 3247d6bfa3bSBarry Smith 3257d6bfa3bSBarry Smith for (i=0; i<*n; i++) { 3266bf464f9SBarry Smith *ierr = MatDestroy(&smat[i]);if (*ierr) return; 3277d6bfa3bSBarry Smith } 3287d6bfa3bSBarry Smith } 3297d6bfa3bSBarry Smith 3308cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumns_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 33117ede90eSSatish Balay { 33217ede90eSSatish Balay CHKFORTRANNULLOBJECTDEREFERENCE(x); 33317ede90eSSatish Balay CHKFORTRANNULLOBJECTDEREFERENCE(b); 33417ede90eSSatish Balay *ierr = MatZeroRowsColumns(*mat,*numRows,rows,*diag,*x,*b); 33517ede90eSSatish Balay } 33617ede90eSSatish Balay 3378cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnsis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 33817ede90eSSatish Balay { 33917ede90eSSatish Balay CHKFORTRANNULLOBJECTDEREFERENCE(x); 34017ede90eSSatish Balay CHKFORTRANNULLOBJECTDEREFERENCE(b); 34117ede90eSSatish Balay *ierr = MatZeroRowsColumnsIS(*mat,*is,*diag,*x,*b); 34217ede90eSSatish Balay } 34317ede90eSSatish Balay 3448cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowsstencil_(Mat *mat,PetscInt *numRows,MatStencil *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 34517ede90eSSatish Balay { 34617ede90eSSatish Balay CHKFORTRANNULLOBJECTDEREFERENCE(x); 34717ede90eSSatish Balay CHKFORTRANNULLOBJECTDEREFERENCE(b); 34817ede90eSSatish Balay *ierr = MatZeroRowsStencil(*mat,*numRows,rows,*diag,*x,*b); 34917ede90eSSatish Balay } 35017ede90eSSatish Balay 3518cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnsstencil_(Mat *mat,PetscInt *numRows,MatStencil *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 352d25a37e1SJed Brown { 353d25a37e1SJed Brown CHKFORTRANNULLOBJECTDEREFERENCE(x); 354d25a37e1SJed Brown CHKFORTRANNULLOBJECTDEREFERENCE(b); 355d25a37e1SJed Brown *ierr = MatZeroRowsColumnsStencil(*mat,*numRows,rows,*diag,*x,*b); 356d25a37e1SJed Brown } 357d25a37e1SJed Brown 3588cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorows_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 359f4e70085SSatish Balay { 3602b40b63fSBarry Smith CHKFORTRANNULLOBJECTDEREFERENCE(x); 3612b40b63fSBarry Smith CHKFORTRANNULLOBJECTDEREFERENCE(b); 3622b40b63fSBarry Smith *ierr = MatZeroRows(*mat,*numRows,rows,*diag,*x,*b); 363f4e70085SSatish Balay } 364f4e70085SSatish Balay 3658cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowsis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 366f4e70085SSatish Balay { 3672b40b63fSBarry Smith CHKFORTRANNULLOBJECTDEREFERENCE(x); 3682b40b63fSBarry Smith CHKFORTRANNULLOBJECTDEREFERENCE(b); 3692b40b63fSBarry Smith *ierr = MatZeroRowsIS(*mat,*is,*diag,*x,*b); 370f4e70085SSatish Balay } 371f4e70085SSatish Balay 3728cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowslocal_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 373f4e70085SSatish Balay { 3742b40b63fSBarry Smith CHKFORTRANNULLOBJECTDEREFERENCE(x); 3752b40b63fSBarry Smith CHKFORTRANNULLOBJECTDEREFERENCE(b); 3762b40b63fSBarry Smith *ierr = MatZeroRowsLocal(*mat,*numRows,rows,*diag,*x,*b); 377f4e70085SSatish Balay } 378f4e70085SSatish Balay 3798cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowslocalis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 380f4e70085SSatish Balay { 3812b40b63fSBarry Smith CHKFORTRANNULLOBJECTDEREFERENCE(x); 3822b40b63fSBarry Smith CHKFORTRANNULLOBJECTDEREFERENCE(b); 3832b40b63fSBarry Smith *ierr = MatZeroRowsLocalIS(*mat,*is,*diag,*x,*b); 384f4e70085SSatish Balay } 385f4e70085SSatish Balay 3868cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnslocal_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 38717ede90eSSatish Balay { 38817ede90eSSatish Balay CHKFORTRANNULLOBJECTDEREFERENCE(x); 38917ede90eSSatish Balay CHKFORTRANNULLOBJECTDEREFERENCE(b); 39017ede90eSSatish Balay *ierr = MatZeroRowsColumnsLocal(*mat,*numRows,rows,*diag,*x,*b); 39117ede90eSSatish Balay } 39217ede90eSSatish Balay 3938cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnslocalis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 39417ede90eSSatish Balay { 39517ede90eSSatish Balay CHKFORTRANNULLOBJECTDEREFERENCE(x); 39617ede90eSSatish Balay CHKFORTRANNULLOBJECTDEREFERENCE(b); 39717ede90eSSatish Balay *ierr = MatZeroRowsColumnsLocalIS(*mat,*is,*diag,*x,*b); 39817ede90eSSatish Balay } 3991eea217eSSatish Balay 4008cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matsetoptionsprefix_(Mat *mat,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 4011eea217eSSatish Balay { 4021eea217eSSatish Balay char *t; 4031eea217eSSatish Balay 4041eea217eSSatish Balay FIXCHAR(prefix,len,t); 4051eea217eSSatish Balay *ierr = MatSetOptionsPrefix(*mat,t); 4061eea217eSSatish Balay FREECHAR(prefix,t); 4071eea217eSSatish Balay } 4081eea217eSSatish Balay 409d0195637SJed Brown PETSC_EXTERN void PETSC_STDCALL matnullspaceremove_(MatNullSpace *sp,Vec *vec,PetscErrorCode *ierr) 410812c3f48SMatthew Knepley { 411d0195637SJed Brown *ierr = MatNullSpaceRemove(*sp,*vec); 412812c3f48SMatthew Knepley } 4131eea217eSSatish Balay 4148cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matgetinfo_(Mat *mat,MatInfoType *flag,MatInfo *info, int *__ierr) 4155ba43861SSatish Balay { 4165ba43861SSatish Balay *__ierr = MatGetInfo(*mat,*flag,info); 4175ba43861SSatish Balay } 4185ba43861SSatish Balay 4198cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matlufactor_(Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr) 42022688b47SSatish Balay { 42122688b47SSatish Balay *__ierr = MatLUFactor(*mat,*row,*col,info); 42222688b47SSatish Balay } 42322688b47SSatish Balay 4248cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matilufactor_(Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr) 42522688b47SSatish Balay { 42622688b47SSatish Balay *__ierr = MatILUFactor(*mat,*row,*col,info); 42722688b47SSatish Balay } 42822688b47SSatish Balay 4298cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matlufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr) 43022688b47SSatish Balay { 43122688b47SSatish Balay *__ierr = MatLUFactorSymbolic(*fact,*mat,*row,*col,info); 43222688b47SSatish Balay } 43322688b47SSatish Balay 4348cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matlufactornumeric_(Mat *fact,Mat *mat, MatFactorInfo *info, int *__ierr) 43522688b47SSatish Balay { 43622688b47SSatish Balay *__ierr = MatLUFactorNumeric(*fact,*mat,info); 43722688b47SSatish Balay } 43822688b47SSatish Balay 4398cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matcholeskyfactor_(Mat *mat,IS *perm, MatFactorInfo *info, int *__ierr) 44022688b47SSatish Balay { 44122688b47SSatish Balay *__ierr = MatCholeskyFactor(*mat,*perm,info); 44222688b47SSatish Balay } 44322688b47SSatish Balay 4448cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matcholeskyfactorsymbolic_(Mat *fact,Mat *mat,IS *perm, MatFactorInfo *info, int *__ierr) 44522688b47SSatish Balay { 44622688b47SSatish Balay *__ierr = MatCholeskyFactorSymbolic(*fact,*mat,*perm,info); 44722688b47SSatish Balay } 44822688b47SSatish Balay 4498cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matcholeskyfactornumeric_(Mat *fact,Mat *mat, MatFactorInfo *info, int *__ierr) 45022688b47SSatish Balay { 45122688b47SSatish Balay *__ierr = MatCholeskyFactorNumeric(*fact,*mat,info); 45222688b47SSatish Balay } 45322688b47SSatish Balay 4548cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matilufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr) 45522688b47SSatish Balay { 45622688b47SSatish Balay *__ierr = MatILUFactorSymbolic(*fact,*mat,*row,*col,info); 45722688b47SSatish Balay } 45822688b47SSatish Balay 4598cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL maticcfactorsymbolic_(Mat *fact,Mat *mat,IS *perm, MatFactorInfo *info, int *__ierr) 46022688b47SSatish Balay { 46122688b47SSatish Balay *__ierr = MatICCFactorSymbolic(*fact,*mat,*perm,info); 46222688b47SSatish Balay } 46322688b47SSatish Balay 4648cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL maticcfactor_(Mat *mat,IS *row, MatFactorInfo *info, int *__ierr) 46522688b47SSatish Balay { 46622688b47SSatish Balay *__ierr = MatICCFactor(*mat,*row,info); 46722688b47SSatish Balay } 46822688b47SSatish Balay 4698cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matfactorinfoinitialize_(MatFactorInfo *info, int *__ierr) 47022688b47SSatish Balay { 47122688b47SSatish Balay *__ierr = MatFactorInfoInitialize(info); 47222688b47SSatish Balay } 473