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*5928be6bSBarry Smith #define matgetrowmax_ MATGETROWMAX 7*5928be6bSBarry Smith #define matgetrowmaxabs_ MATGETROWMAXABS 87d6bfa3bSBarry Smith #define matdestroymatrices_ MATDESTROYMATRICES 95dffd610SBarry Smith #define matgetfactor_ MATGETFACTOR 1035bd34faSBarry Smith #define matfactorgetsolverpackage_ MATFACTORGETSOLVERPACKAGE 11f4e70085SSatish Balay #define matgetrowij_ MATGETROWIJ 12f4e70085SSatish Balay #define matrestorerowij_ MATRESTOREROWIJ 13f4e70085SSatish Balay #define matgetrow_ MATGETROW 14f4e70085SSatish Balay #define matrestorerow_ MATRESTOREROW 15f7e310deSShri Abhyankar #define matload_ MATLOAD 16f4e70085SSatish Balay #define matview_ MATVIEW 178c778c55SBarry Smith #define matseqaijgetarray_ MATSEQAIJGETARRAY 186778691eSSatish Balay #define matseqaijrestorearray_ MATSEQAIJRESTOREARRAY 198c778c55SBarry Smith #define matdensegetarray_ MATDENSEGETARRAY 208c778c55SBarry Smith #define matdenserestorearray_ MATDENSERESTOREARRAY 21f4e70085SSatish Balay #define matconvert_ MATCONVERT 22f4e70085SSatish Balay #define matgetsubmatrices_ MATGETSUBMATRICES 2317ede90eSSatish Balay #define matzerorowscolumns_ MATZEROROWSCOLUMNS 2417ede90eSSatish Balay #define matzerorowscolumnsis_ MATZEROROWSCOLUMNSIS 2517ede90eSSatish Balay #define matzerorowsstencil_ MATZEROROWSSTENCIL 26d25a37e1SJed Brown #define matzerorowscolumnsstencil_ MATZEROROWSCOLUMNSSTENCIL 27f4e70085SSatish Balay #define matzerorows_ MATZEROROWS 28f4e70085SSatish Balay #define matzerorowsis_ MATZEROROWSIS 29f4e70085SSatish Balay #define matzerorowslocal_ MATZEROROWSLOCAL 30f4e70085SSatish Balay #define matzerorowslocalis_ MATZEROROWSLOCALIS 3117ede90eSSatish Balay #define matzerorowscolumnslocal_ MATZEROROWSCOLUMNSLOCAL 3217ede90eSSatish Balay #define matzerorowscolumnslocalis_ MATZEROROWSCOLUMNSLOCALIS 331eea217eSSatish Balay #define matsetoptionsprefix_ MATSETOPTIONSPREFIX 347c54600cSBarry Smith #define matgetvecs_ MATGETVECS 35c9d5ca86SBarry Smith #define matnullspaceremove_ MATNULLSPACEREMOVE 365ba43861SSatish Balay #define matgetinfo_ MATGETINFO 3722688b47SSatish Balay #define matlufactor_ MATLUFACTOR 3822688b47SSatish Balay #define matilufactor_ MATILUFACTOR 3922688b47SSatish Balay #define matlufactorsymbolic_ MATLUFACTORSYMBOLIC 4022688b47SSatish Balay #define matlufactornumeric_ MATLUFACTORNUMERIC 4122688b47SSatish Balay #define matcholeskyfactor_ MATCHOLESKYFACTOR 4222688b47SSatish Balay #define matcholeskyfactorsymbolic_ MATCHOLESKYFACTORSYMBOLIC 4322688b47SSatish Balay #define matcholeskyfactornumeric_ MATCHOLESKYFACTORNUMERIC 4422688b47SSatish Balay #define matilufactorsymbolic_ MATILUFACTORSYMBOLIC 4522688b47SSatish Balay #define maticcfactorsymbolic_ MATICCFACTORSYMBOLIC 4622688b47SSatish Balay #define maticcfactor_ MATICCFACTOR 4722688b47SSatish Balay #define matfactorinfoinitialize_ MATFACTORINFOINITIALIZE 48b22b330cSBarry Smith #define matnullspacesetfunction_ MATNULLSPACESETFUNCTION 490905d9aaSJed Brown #define matfindnonzerorows_ MATFINDNONZEROROWS 50f4e70085SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 51*5928be6bSBarry Smith #define matgetrowmax_ matgetrowmax 52*5928be6bSBarry Smith #define matgetrowmaxabs_ matgetrowmaxabs 53*5928be6bSBarry Smith #define matdestroymatrices_ matdestroymatrices 545dffd610SBarry Smith #define matgetfactor_ matgetfactor 5535bd34faSBarry Smith #define matfactorgetsolverpackage_ matfactorgetsolverpackage 567c54600cSBarry Smith #define matgetvecs_ matgetvecs 57f4e70085SSatish Balay #define matgetrowij_ matgetrowij 58f4e70085SSatish Balay #define matrestorerowij_ matrestorerowij 59f4e70085SSatish Balay #define matgetrow_ matgetrow 60f4e70085SSatish Balay #define matrestorerow_ matrestorerow 61f4e70085SSatish Balay #define matview_ matview 62f7e310deSShri Abhyankar #define matload_ matload 638c778c55SBarry Smith #define matseqaijgetarray_ matseqaijgetarray 648c778c55SBarry Smith #define matseqaijrestorearray_ matseqaijrestorearray 658c778c55SBarry Smith #define matdensegetarray_ matdensegetarray 668c778c55SBarry Smith #define matdenserestorearray_ matdenserestorearray 67f4e70085SSatish Balay #define matconvert_ matconvert 68f4e70085SSatish Balay #define matgetsubmatrices_ matgetsubmatrices 6917ede90eSSatish Balay #define matzerorowscolumns_ matzerorowscolumns 7017ede90eSSatish Balay #define matzerorowscolumnsis_ matzerorowscolumnsis 7117ede90eSSatish Balay #define matzerorowsstencil_ matzerorowsstencil 72d25a37e1SJed Brown #define matzerorowscolumnsstencil_ matzerorowscolumnsstencil 73f4e70085SSatish Balay #define matzerorows_ matzerorows 74f4e70085SSatish Balay #define matzerorowsis_ matzerorowsis 75f4e70085SSatish Balay #define matzerorowslocal_ matzerorowslocal 76f4e70085SSatish Balay #define matzerorowslocalis_ matzerorowslocalis 7717ede90eSSatish Balay #define matzerorowscolumnslocal_ matzerorowscolumnslocal 7817ede90eSSatish Balay #define matzerorowscolumnslocalis_ matzerorowscolumnslocalis 791eea217eSSatish Balay #define matsetoptionsprefix_ matsetoptionsprefix 80812c3f48SMatthew Knepley #define matnullspaceremove_ matnullspaceremove 815ba43861SSatish Balay #define matgetinfo_ matgetinfo 8222688b47SSatish Balay #define matlufactor_ matlufactor 8322688b47SSatish Balay #define matilufactor_ matilufactor 8422688b47SSatish Balay #define matlufactorsymbolic_ matlufactorsymbolic 8522688b47SSatish Balay #define matlufactornumeric_ matlufactornumeric 8622688b47SSatish Balay #define matcholeskyfactor_ matcholeskyfactor 8722688b47SSatish Balay #define matcholeskyfactorsymbolic_ matcholeskyfactorsymbolic 8822688b47SSatish Balay #define matcholeskyfactornumeric_ matcholeskyfactornumeric 8922688b47SSatish Balay #define matilufactorsymbolic_ matilufactorsymbolic 9022688b47SSatish Balay #define maticcfactorsymbolic_ maticcfactorsymbolic 9122688b47SSatish Balay #define maticcfactor_ maticcfactor 9222688b47SSatish Balay #define matfactorinfoinitialize_ matfactorinfoinitialize 93b22b330cSBarry Smith #define matnullspacesetfunction_ matnullspacesetfunction 940905d9aaSJed Brown #define matfindnonzerorows_ matfindnonzerorows 95f4e70085SSatish Balay #endif 96f4e70085SSatish Balay 97*5928be6bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matgetrowmax_(Mat *mat,Vec *v,PetscInt idx[], int *ierr ) 98*5928be6bSBarry Smith { 99*5928be6bSBarry Smith CHKFORTRANNULLINTEGER(idx); 100*5928be6bSBarry Smith *ierr = MatGetRowMax(*mat,*v,idx); 101*5928be6bSBarry Smith } 102*5928be6bSBarry Smith 103*5928be6bSBarry Smith PETSC_EXTERN void PETSC_STDCALL matgetrowmaxabs_(Mat *mat,Vec *v,PetscInt idx[], int *ierr ) 104*5928be6bSBarry Smith { 105*5928be6bSBarry Smith CHKFORTRANNULLINTEGER(idx); 106*5928be6bSBarry Smith *ierr = MatGetRowMaxAbs(*mat,*v,idx); 107*5928be6bSBarry Smith } 108*5928be6bSBarry Smith 109b22b330cSBarry Smith static PetscErrorCode ournullfunction(MatNullSpace sp,Vec x,void *ctx) 110b22b330cSBarry Smith { 111b22b330cSBarry Smith PetscErrorCode ierr = 0; 112b22b330cSBarry Smith (*(void (PETSC_STDCALL *)(MatNullSpace*,Vec*,void*,PetscErrorCode*))(((PetscObject)sp)->fortran_func_pointers[0]))(&sp,&x,ctx,&ierr);CHKERRQ(ierr); 113b22b330cSBarry Smith return 0; 114b22b330cSBarry Smith } 115b22b330cSBarry Smith 1168cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matnullspacesetfunction_(MatNullSpace *sp, PetscErrorCode (*rem)(MatNullSpace,Vec,void*),void *ctx,PetscErrorCode *ierr) 117b22b330cSBarry Smith { 118b22b330cSBarry Smith PetscObjectAllocateFortranPointers(*sp,1); 119b22b330cSBarry Smith ((PetscObject)*sp)->fortran_func_pointers[0] = (PetscVoidFunction)rem; 12026fbe8dcSKarl Rupp 121b22b330cSBarry Smith *ierr = MatNullSpaceSetFunction(*sp,ournullfunction,ctx); 122b22b330cSBarry Smith } 123b22b330cSBarry Smith 1248cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matgetvecs_(Mat *mat,Vec *right,Vec *left, int *ierr) 1257c54600cSBarry Smith { 1267c54600cSBarry Smith CHKFORTRANNULLOBJECT(right); 1277c54600cSBarry Smith CHKFORTRANNULLOBJECT(left); 1287c54600cSBarry Smith *ierr = MatGetVecs(*mat,right,left); 1297c54600cSBarry Smith } 1307c54600cSBarry Smith 1318cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matgetrowij_(Mat *B,PetscInt *shift,PetscBool *sym,PetscBool *blockcompressed,PetscInt *n,PetscInt *ia,size_t *iia, 132ace3abfcSBarry Smith PetscInt *ja,size_t *jja,PetscBool *done,PetscErrorCode *ierr) 133f4e70085SSatish Balay { 1341a83f524SJed Brown const PetscInt *IA,*JA; 1358f7157efSSatish Balay *ierr = MatGetRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);if (*ierr) return; 1361a83f524SJed Brown *iia = PetscIntAddressToFortran(ia,(PetscInt*)IA); 1371a83f524SJed Brown *jja = PetscIntAddressToFortran(ja,(PetscInt*)JA); 138f4e70085SSatish Balay } 139f4e70085SSatish Balay 1408cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matrestorerowij_(Mat *B,PetscInt *shift,PetscBool *sym,PetscBool *blockcompressed, PetscInt *n,PetscInt *ia,size_t *iia, 141ace3abfcSBarry Smith PetscInt *ja,size_t *jja,PetscBool *done,PetscErrorCode *ierr) 142f4e70085SSatish Balay { 1431a83f524SJed Brown const PetscInt *IA = PetscIntAddressFromFortran(ia,*iia),*JA = PetscIntAddressFromFortran(ja,*jja); 1448f7157efSSatish Balay *ierr = MatRestoreRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done); 145f4e70085SSatish Balay } 146f4e70085SSatish Balay 147f4e70085SSatish Balay /* 148f4e70085SSatish Balay This is a poor way of storing the column and value pointers 149f4e70085SSatish Balay generated by MatGetRow() to be returned with MatRestoreRow() 150f4e70085SSatish Balay but there is not natural,good place else to store them. Hence 151f4e70085SSatish Balay Fortran programmers can only have one outstanding MatGetRows() 152f4e70085SSatish Balay at a time. 153f4e70085SSatish Balay */ 154f4e70085SSatish Balay static PetscErrorCode matgetrowactive = 0; 155f4e70085SSatish Balay static const PetscInt *my_ocols = 0; 156f4e70085SSatish Balay static const PetscScalar *my_ovals = 0; 157f4e70085SSatish Balay 1588cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matgetrow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr) 159f4e70085SSatish Balay { 160f4e70085SSatish Balay const PetscInt **oocols = &my_ocols; 161f4e70085SSatish Balay const PetscScalar **oovals = &my_ovals; 162f4e70085SSatish Balay 163f4e70085SSatish Balay if (matgetrowactive) { 164efca3c55SSatish Balay PetscError(PETSC_COMM_SELF,__LINE__,"MatGetRow_Fortran",__FILE__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL, 165f4e70085SSatish Balay "Cannot have two MatGetRow() active simultaneously\n\ 166f4e70085SSatish Balay call MatRestoreRow() before calling MatGetRow() a second time"); 167f4e70085SSatish Balay *ierr = 1; 168f4e70085SSatish Balay return; 169f4e70085SSatish Balay } 170f4e70085SSatish Balay 1710298fd71SBarry Smith CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = NULL; 1720298fd71SBarry Smith CHKFORTRANNULLSCALAR(vals); if (!vals) oovals = NULL; 173f4e70085SSatish Balay 174f4e70085SSatish Balay *ierr = MatGetRow(*mat,*row,ncols,oocols,oovals); 175f4e70085SSatish Balay if (*ierr) return; 176f4e70085SSatish Balay 177f4e70085SSatish Balay if (oocols) { *ierr = PetscMemcpy(cols,my_ocols,(*ncols)*sizeof(PetscInt)); if (*ierr) return;} 178f4e70085SSatish Balay if (oovals) { *ierr = PetscMemcpy(vals,my_ovals,(*ncols)*sizeof(PetscScalar)); if (*ierr) return;} 179f4e70085SSatish Balay matgetrowactive = 1; 180f4e70085SSatish Balay } 181f4e70085SSatish Balay 1828cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matrestorerow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr) 183f4e70085SSatish Balay { 184f4e70085SSatish Balay const PetscInt **oocols = &my_ocols; 185f4e70085SSatish Balay const PetscScalar **oovals = &my_ovals; 186f4e70085SSatish Balay if (!matgetrowactive) { 187efca3c55SSatish Balay PetscError(PETSC_COMM_SELF,__LINE__,"MatRestoreRow_Fortran",__FILE__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL, 188f4e70085SSatish Balay "Must call MatGetRow() first"); 189f4e70085SSatish Balay *ierr = 1; 190f4e70085SSatish Balay return; 191f4e70085SSatish Balay } 1920298fd71SBarry Smith CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = NULL; 1930298fd71SBarry Smith CHKFORTRANNULLSCALAR(vals); if (!vals) oovals = NULL; 194f4e70085SSatish Balay 195f4e70085SSatish Balay *ierr = MatRestoreRow(*mat,*row,ncols,oocols,oovals); 196f4e70085SSatish Balay matgetrowactive = 0; 197f4e70085SSatish Balay } 198f4e70085SSatish Balay 1998cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matview_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr) 200f4e70085SSatish Balay { 201f4e70085SSatish Balay PetscViewer v; 202f4e70085SSatish Balay PetscPatchDefaultViewers_Fortran(vin,v); 203f4e70085SSatish Balay *ierr = MatView(*mat,v); 204f4e70085SSatish Balay } 205f4e70085SSatish Balay 2068cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matload_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr) 207f7e310deSShri Abhyankar { 208f7e310deSShri Abhyankar PetscViewer v; 209f7e310deSShri Abhyankar PetscPatchDefaultViewers_Fortran(vin,v); 210112444f4SShri Abhyankar *ierr = MatLoad(*mat,v); 211f7e310deSShri Abhyankar } 212f7e310deSShri Abhyankar 2138cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matseqaijgetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr) 214f4e70085SSatish Balay { 215f4e70085SSatish Balay PetscScalar *mm; 216f4e70085SSatish Balay PetscInt m,n; 217f4e70085SSatish Balay 2188c778c55SBarry Smith *ierr = MatSeqAIJGetArray(*mat,&mm); if (*ierr) return; 219f4e70085SSatish Balay *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return; 220f91d1997SBarry Smith *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return; 221f4e70085SSatish Balay } 222f4e70085SSatish Balay 2238cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matseqaijrestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr) 224f4e70085SSatish Balay { 225f4e70085SSatish Balay PetscScalar *lx; 226f4e70085SSatish Balay PetscInt m,n; 227f4e70085SSatish Balay 228f4e70085SSatish Balay *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return; 229f4e70085SSatish Balay *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return; 2308c778c55SBarry Smith *ierr = MatSeqAIJRestoreArray(*mat,&lx);if (*ierr) return; 231f4e70085SSatish Balay } 232f4e70085SSatish Balay 2338cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matdensegetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr) 23473a71a0fSBarry Smith { 23573a71a0fSBarry Smith PetscScalar *mm; 23673a71a0fSBarry Smith PetscInt m,n; 23773a71a0fSBarry Smith 2388c778c55SBarry Smith *ierr = MatDenseGetArray(*mat,&mm); if (*ierr) return; 23973a71a0fSBarry Smith *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return; 24073a71a0fSBarry Smith *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return; 24173a71a0fSBarry Smith } 24273a71a0fSBarry Smith 2438cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matdenserestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr) 24473a71a0fSBarry Smith { 24573a71a0fSBarry Smith PetscScalar *lx; 24673a71a0fSBarry Smith PetscInt m,n; 24773a71a0fSBarry Smith 24873a71a0fSBarry Smith *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return; 24973a71a0fSBarry Smith *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return; 2508c778c55SBarry Smith *ierr = MatDenseRestoreArray(*mat,&lx);if (*ierr) return; 25173a71a0fSBarry Smith } 25273a71a0fSBarry Smith 2538cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matfactorgetsolverpackage_(Mat *mat,CHAR name PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 25435bd34faSBarry Smith { 25535bd34faSBarry Smith const char *tname; 25635bd34faSBarry Smith 25735bd34faSBarry Smith *ierr = MatFactorGetSolverPackage(*mat,&tname);if (*ierr) return; 25835bd34faSBarry Smith if (name != PETSC_NULL_CHARACTER_Fortran) { 25935bd34faSBarry Smith *ierr = PetscStrncpy(name,tname,len);if (*ierr) return; 26035bd34faSBarry Smith } 26135bd34faSBarry Smith FIXRETURNCHAR(PETSC_TRUE,name,len); 26235bd34faSBarry Smith } 26335bd34faSBarry Smith 2648cc058d9SJed 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)) 2655dffd610SBarry Smith { 2665dffd610SBarry Smith char *t; 2675dffd610SBarry Smith FIXCHAR(outtype,len,t); 2689be81726SHong Zhang *ierr = MatGetFactor(*mat,t,*ftype,M); 2695dffd610SBarry Smith FREECHAR(outtype,t); 2705dffd610SBarry Smith } 2715dffd610SBarry Smith 2728cc058d9SJed 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)) 273f4e70085SSatish Balay { 274f4e70085SSatish Balay char *t; 275f4e70085SSatish Balay FIXCHAR(outtype,len,t); 276f4e70085SSatish Balay *ierr = MatConvert(*mat,t,*reuse,M); 277f4e70085SSatish Balay FREECHAR(outtype,t); 278f4e70085SSatish Balay } 279f4e70085SSatish Balay 280f4e70085SSatish Balay /* 281f4e70085SSatish Balay MatGetSubmatrices() is slightly different from C since the 282f4e70085SSatish Balay Fortran provides the array to hold the submatrix objects,while in C that 283f4e70085SSatish Balay array is allocated by the MatGetSubmatrices() 284f4e70085SSatish Balay */ 2858cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matgetsubmatrices_(Mat *mat,PetscInt *n,IS *isrow,IS *iscol,MatReuse *scall,Mat *smat,PetscErrorCode *ierr) 286f4e70085SSatish Balay { 287f4e70085SSatish Balay Mat *lsmat; 288f4e70085SSatish Balay PetscInt i; 289f4e70085SSatish Balay 290f4e70085SSatish Balay if (*scall == MAT_INITIAL_MATRIX) { 291f4e70085SSatish Balay *ierr = MatGetSubMatrices(*mat,*n,isrow,iscol,*scall,&lsmat); 292f4e70085SSatish Balay for (i=0; i<*n; i++) { 293f4e70085SSatish Balay smat[i] = lsmat[i]; 294f4e70085SSatish Balay } 295f4e70085SSatish Balay *ierr = PetscFree(lsmat); 296f4e70085SSatish Balay } else { 297f4e70085SSatish Balay *ierr = MatGetSubMatrices(*mat,*n,isrow,iscol,*scall,&smat); 298f4e70085SSatish Balay } 299f4e70085SSatish Balay } 300f4e70085SSatish Balay 3017d6bfa3bSBarry Smith /* 3027d6bfa3bSBarry Smith MatDestroyMatrices() is slightly different from C since the 3037d6bfa3bSBarry Smith Fortran provides the array to hold the submatrix objects,while in C that 3047d6bfa3bSBarry Smith array is allocated by the MatGetSubmatrices() 3057d6bfa3bSBarry Smith */ 3068cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matdestroymatrices_(Mat *mat,PetscInt *n,Mat *smat,PetscErrorCode *ierr) 3077d6bfa3bSBarry Smith { 3087d6bfa3bSBarry Smith PetscInt i; 3097d6bfa3bSBarry Smith 3107d6bfa3bSBarry Smith for (i=0; i<*n; i++) { 3116bf464f9SBarry Smith *ierr = MatDestroy(&smat[i]);if (*ierr) return; 3127d6bfa3bSBarry Smith } 3137d6bfa3bSBarry Smith } 3147d6bfa3bSBarry Smith 3158cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumns_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 31617ede90eSSatish Balay { 31717ede90eSSatish Balay CHKFORTRANNULLOBJECTDEREFERENCE(x); 31817ede90eSSatish Balay CHKFORTRANNULLOBJECTDEREFERENCE(b); 31917ede90eSSatish Balay *ierr = MatZeroRowsColumns(*mat,*numRows,rows,*diag,*x,*b); 32017ede90eSSatish Balay } 32117ede90eSSatish Balay 3228cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnsis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 32317ede90eSSatish Balay { 32417ede90eSSatish Balay CHKFORTRANNULLOBJECTDEREFERENCE(x); 32517ede90eSSatish Balay CHKFORTRANNULLOBJECTDEREFERENCE(b); 32617ede90eSSatish Balay *ierr = MatZeroRowsColumnsIS(*mat,*is,*diag,*x,*b); 32717ede90eSSatish Balay } 32817ede90eSSatish Balay 3298cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowsstencil_(Mat *mat,PetscInt *numRows,MatStencil *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 33017ede90eSSatish Balay { 33117ede90eSSatish Balay CHKFORTRANNULLOBJECTDEREFERENCE(x); 33217ede90eSSatish Balay CHKFORTRANNULLOBJECTDEREFERENCE(b); 33317ede90eSSatish Balay *ierr = MatZeroRowsStencil(*mat,*numRows,rows,*diag,*x,*b); 33417ede90eSSatish Balay } 33517ede90eSSatish Balay 3368cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnsstencil_(Mat *mat,PetscInt *numRows,MatStencil *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 337d25a37e1SJed Brown { 338d25a37e1SJed Brown CHKFORTRANNULLOBJECTDEREFERENCE(x); 339d25a37e1SJed Brown CHKFORTRANNULLOBJECTDEREFERENCE(b); 340d25a37e1SJed Brown *ierr = MatZeroRowsColumnsStencil(*mat,*numRows,rows,*diag,*x,*b); 341d25a37e1SJed Brown } 342d25a37e1SJed Brown 3438cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorows_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 344f4e70085SSatish Balay { 3452b40b63fSBarry Smith CHKFORTRANNULLOBJECTDEREFERENCE(x); 3462b40b63fSBarry Smith CHKFORTRANNULLOBJECTDEREFERENCE(b); 3472b40b63fSBarry Smith *ierr = MatZeroRows(*mat,*numRows,rows,*diag,*x,*b); 348f4e70085SSatish Balay } 349f4e70085SSatish Balay 3508cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowsis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 351f4e70085SSatish Balay { 3522b40b63fSBarry Smith CHKFORTRANNULLOBJECTDEREFERENCE(x); 3532b40b63fSBarry Smith CHKFORTRANNULLOBJECTDEREFERENCE(b); 3542b40b63fSBarry Smith *ierr = MatZeroRowsIS(*mat,*is,*diag,*x,*b); 355f4e70085SSatish Balay } 356f4e70085SSatish Balay 3578cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowslocal_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 358f4e70085SSatish Balay { 3592b40b63fSBarry Smith CHKFORTRANNULLOBJECTDEREFERENCE(x); 3602b40b63fSBarry Smith CHKFORTRANNULLOBJECTDEREFERENCE(b); 3612b40b63fSBarry Smith *ierr = MatZeroRowsLocal(*mat,*numRows,rows,*diag,*x,*b); 362f4e70085SSatish Balay } 363f4e70085SSatish Balay 3648cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowslocalis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 365f4e70085SSatish Balay { 3662b40b63fSBarry Smith CHKFORTRANNULLOBJECTDEREFERENCE(x); 3672b40b63fSBarry Smith CHKFORTRANNULLOBJECTDEREFERENCE(b); 3682b40b63fSBarry Smith *ierr = MatZeroRowsLocalIS(*mat,*is,*diag,*x,*b); 369f4e70085SSatish Balay } 370f4e70085SSatish Balay 3718cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnslocal_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 37217ede90eSSatish Balay { 37317ede90eSSatish Balay CHKFORTRANNULLOBJECTDEREFERENCE(x); 37417ede90eSSatish Balay CHKFORTRANNULLOBJECTDEREFERENCE(b); 37517ede90eSSatish Balay *ierr = MatZeroRowsColumnsLocal(*mat,*numRows,rows,*diag,*x,*b); 37617ede90eSSatish Balay } 37717ede90eSSatish Balay 3788cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnslocalis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 37917ede90eSSatish Balay { 38017ede90eSSatish Balay CHKFORTRANNULLOBJECTDEREFERENCE(x); 38117ede90eSSatish Balay CHKFORTRANNULLOBJECTDEREFERENCE(b); 38217ede90eSSatish Balay *ierr = MatZeroRowsColumnsLocalIS(*mat,*is,*diag,*x,*b); 38317ede90eSSatish Balay } 3841eea217eSSatish Balay 3858cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matsetoptionsprefix_(Mat *mat,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 3861eea217eSSatish Balay { 3871eea217eSSatish Balay char *t; 3881eea217eSSatish Balay 3891eea217eSSatish Balay FIXCHAR(prefix,len,t); 3901eea217eSSatish Balay *ierr = MatSetOptionsPrefix(*mat,t); 3911eea217eSSatish Balay FREECHAR(prefix,t); 3921eea217eSSatish Balay } 3931eea217eSSatish Balay 394d0195637SJed Brown PETSC_EXTERN void PETSC_STDCALL matnullspaceremove_(MatNullSpace *sp,Vec *vec,PetscErrorCode *ierr) 395812c3f48SMatthew Knepley { 396d0195637SJed Brown *ierr = MatNullSpaceRemove(*sp,*vec); 397812c3f48SMatthew Knepley } 3981eea217eSSatish Balay 3998cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matgetinfo_(Mat *mat,MatInfoType *flag,MatInfo *info, int *__ierr) 4005ba43861SSatish Balay { 4015ba43861SSatish Balay *__ierr = MatGetInfo(*mat,*flag,info); 4025ba43861SSatish Balay } 4035ba43861SSatish Balay 4048cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matlufactor_(Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr) 40522688b47SSatish Balay { 40622688b47SSatish Balay *__ierr = MatLUFactor(*mat,*row,*col,info); 40722688b47SSatish Balay } 40822688b47SSatish Balay 4098cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matilufactor_(Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr) 41022688b47SSatish Balay { 41122688b47SSatish Balay *__ierr = MatILUFactor(*mat,*row,*col,info); 41222688b47SSatish Balay } 41322688b47SSatish Balay 4148cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matlufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr) 41522688b47SSatish Balay { 41622688b47SSatish Balay *__ierr = MatLUFactorSymbolic(*fact,*mat,*row,*col,info); 41722688b47SSatish Balay } 41822688b47SSatish Balay 4198cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matlufactornumeric_(Mat *fact,Mat *mat, MatFactorInfo *info, int *__ierr) 42022688b47SSatish Balay { 42122688b47SSatish Balay *__ierr = MatLUFactorNumeric(*fact,*mat,info); 42222688b47SSatish Balay } 42322688b47SSatish Balay 4248cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matcholeskyfactor_(Mat *mat,IS *perm, MatFactorInfo *info, int *__ierr) 42522688b47SSatish Balay { 42622688b47SSatish Balay *__ierr = MatCholeskyFactor(*mat,*perm,info); 42722688b47SSatish Balay } 42822688b47SSatish Balay 4298cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matcholeskyfactorsymbolic_(Mat *fact,Mat *mat,IS *perm, MatFactorInfo *info, int *__ierr) 43022688b47SSatish Balay { 43122688b47SSatish Balay *__ierr = MatCholeskyFactorSymbolic(*fact,*mat,*perm,info); 43222688b47SSatish Balay } 43322688b47SSatish Balay 4348cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matcholeskyfactornumeric_(Mat *fact,Mat *mat, MatFactorInfo *info, int *__ierr) 43522688b47SSatish Balay { 43622688b47SSatish Balay *__ierr = MatCholeskyFactorNumeric(*fact,*mat,info); 43722688b47SSatish Balay } 43822688b47SSatish Balay 4398cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matilufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr) 44022688b47SSatish Balay { 44122688b47SSatish Balay *__ierr = MatILUFactorSymbolic(*fact,*mat,*row,*col,info); 44222688b47SSatish Balay } 44322688b47SSatish Balay 4448cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL maticcfactorsymbolic_(Mat *fact,Mat *mat,IS *perm, MatFactorInfo *info, int *__ierr) 44522688b47SSatish Balay { 44622688b47SSatish Balay *__ierr = MatICCFactorSymbolic(*fact,*mat,*perm,info); 44722688b47SSatish Balay } 44822688b47SSatish Balay 4498cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL maticcfactor_(Mat *mat,IS *row, MatFactorInfo *info, int *__ierr) 45022688b47SSatish Balay { 45122688b47SSatish Balay *__ierr = MatICCFactor(*mat,*row,info); 45222688b47SSatish Balay } 45322688b47SSatish Balay 4548cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matfactorinfoinitialize_(MatFactorInfo *info, int *__ierr) 45522688b47SSatish Balay { 45622688b47SSatish Balay *__ierr = MatFactorInfoInitialize(info); 45722688b47SSatish Balay } 458