1 #include <petsc-private/fortranimpl.h> 2 #include <petscmat.h> 3 #include <petscviewer.h> 4 5 #if defined(PETSC_HAVE_FORTRAN_CAPS) 6 #define matdestroymatrices_ MATDESTROYMATRICES 7 #define matgetfactor_ MATGETFACTOR 8 #define matfactorgetsolverpackage_ MATFACTORGETSOLVERPACKAGE 9 #define matgetrowij_ MATGETROWIJ 10 #define matrestorerowij_ MATRESTOREROWIJ 11 #define matgetrow_ MATGETROW 12 #define matrestorerow_ MATRESTOREROW 13 #define matload_ MATLOAD 14 #define matview_ MATVIEW 15 #define matseqaijgetarray_ MATSEQAIJGETARRAY 16 #define matseqaijrestorearray_ MATSEQAIJRESTOREARRAY 17 #define matdensegetarray_ MATDENSEGETARRAY 18 #define matdenserestorearray_ MATDENSERESTOREARRAY 19 #define matconvert_ MATCONVERT 20 #define matgetsubmatrices_ MATGETSUBMATRICES 21 #define matzerorowscolumns_ MATZEROROWSCOLUMNS 22 #define matzerorowscolumnsis_ MATZEROROWSCOLUMNSIS 23 #define matzerorowsstencil_ MATZEROROWSSTENCIL 24 #define matzerorowscolumnsstencil_ MATZEROROWSCOLUMNSSTENCIL 25 #define matzerorows_ MATZEROROWS 26 #define matzerorowsis_ MATZEROROWSIS 27 #define matzerorowslocal_ MATZEROROWSLOCAL 28 #define matzerorowslocalis_ MATZEROROWSLOCALIS 29 #define matzerorowscolumnslocal_ MATZEROROWSCOLUMNSLOCAL 30 #define matzerorowscolumnslocalis_ MATZEROROWSCOLUMNSLOCALIS 31 #define matsetoptionsprefix_ MATSETOPTIONSPREFIX 32 #define matcreatevecs_ MATCREATEVECS 33 #define matnullspaceremove_ MATNULLSPACEREMOVE 34 #define matgetinfo_ MATGETINFO 35 #define matlufactor_ MATLUFACTOR 36 #define matilufactor_ MATILUFACTOR 37 #define matlufactorsymbolic_ MATLUFACTORSYMBOLIC 38 #define matlufactornumeric_ MATLUFACTORNUMERIC 39 #define matcholeskyfactor_ MATCHOLESKYFACTOR 40 #define matcholeskyfactorsymbolic_ MATCHOLESKYFACTORSYMBOLIC 41 #define matcholeskyfactornumeric_ MATCHOLESKYFACTORNUMERIC 42 #define matilufactorsymbolic_ MATILUFACTORSYMBOLIC 43 #define maticcfactorsymbolic_ MATICCFACTORSYMBOLIC 44 #define maticcfactor_ MATICCFACTOR 45 #define matfactorinfoinitialize_ MATFACTORINFOINITIALIZE 46 #define matnullspacesetfunction_ MATNULLSPACESETFUNCTION 47 #define matfindnonzerorows_ MATFINDNONZEROROWS 48 #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 49 #define matdestroymatrices_ matdestroymatrices_ 50 #define matgetfactor_ matgetfactor 51 #define matfactorgetsolverpackage_ matfactorgetsolverpackage 52 #define matcreatevecs_ matcreatevecs 53 #define matgetrowij_ matgetrowij 54 #define matrestorerowij_ matrestorerowij 55 #define matgetrow_ matgetrow 56 #define matrestorerow_ matrestorerow 57 #define matview_ matview 58 #define matload_ matload 59 #define matseqaijgetarray_ matseqaijgetarray 60 #define matseqaijrestorearray_ matseqaijrestorearray 61 #define matdensegetarray_ matdensegetarray 62 #define matdenserestorearray_ matdenserestorearray 63 #define matconvert_ matconvert 64 #define matgetsubmatrices_ matgetsubmatrices 65 #define matzerorowscolumns_ matzerorowscolumns 66 #define matzerorowscolumnsis_ matzerorowscolumnsis 67 #define matzerorowsstencil_ matzerorowsstencil 68 #define matzerorowscolumnsstencil_ matzerorowscolumnsstencil 69 #define matzerorows_ matzerorows 70 #define matzerorowsis_ matzerorowsis 71 #define matzerorowslocal_ matzerorowslocal 72 #define matzerorowslocalis_ matzerorowslocalis 73 #define matzerorowscolumnslocal_ matzerorowscolumnslocal 74 #define matzerorowscolumnslocalis_ matzerorowscolumnslocalis 75 #define matsetoptionsprefix_ matsetoptionsprefix 76 #define matnullspaceremove_ matnullspaceremove 77 #define matgetinfo_ matgetinfo 78 #define matlufactor_ matlufactor 79 #define matilufactor_ matilufactor 80 #define matlufactorsymbolic_ matlufactorsymbolic 81 #define matlufactornumeric_ matlufactornumeric 82 #define matcholeskyfactor_ matcholeskyfactor 83 #define matcholeskyfactorsymbolic_ matcholeskyfactorsymbolic 84 #define matcholeskyfactornumeric_ matcholeskyfactornumeric 85 #define matilufactorsymbolic_ matilufactorsymbolic 86 #define maticcfactorsymbolic_ maticcfactorsymbolic 87 #define maticcfactor_ maticcfactor 88 #define matfactorinfoinitialize_ matfactorinfoinitialize 89 #define matnullspacesetfunction_ matnullspacesetfunction 90 #define matfindnonzerorows_ matfindnonzerorows 91 #endif 92 93 static PetscErrorCode ournullfunction(MatNullSpace sp,Vec x,void *ctx) 94 { 95 PetscErrorCode ierr = 0; 96 (*(void (PETSC_STDCALL *)(MatNullSpace*,Vec*,void*,PetscErrorCode*))(((PetscObject)sp)->fortran_func_pointers[0]))(&sp,&x,ctx,&ierr);CHKERRQ(ierr); 97 return 0; 98 } 99 100 PETSC_EXTERN void PETSC_STDCALL matnullspacesetfunction_(MatNullSpace *sp, PetscErrorCode (*rem)(MatNullSpace,Vec,void*),void *ctx,PetscErrorCode *ierr) 101 { 102 PetscObjectAllocateFortranPointers(*sp,1); 103 ((PetscObject)*sp)->fortran_func_pointers[0] = (PetscVoidFunction)rem; 104 105 *ierr = MatNullSpaceSetFunction(*sp,ournullfunction,ctx); 106 } 107 108 PETSC_EXTERN void PETSC_STDCALL matcreatevecs_(Mat *mat,Vec *right,Vec *left, int *ierr) 109 { 110 CHKFORTRANNULLOBJECT(right); 111 CHKFORTRANNULLOBJECT(left); 112 *ierr = MatCreateVecs(*mat,right,left); 113 } 114 115 PETSC_EXTERN void PETSC_STDCALL matgetrowij_(Mat *B,PetscInt *shift,PetscBool *sym,PetscBool *blockcompressed,PetscInt *n,PetscInt *ia,size_t *iia, 116 PetscInt *ja,size_t *jja,PetscBool *done,PetscErrorCode *ierr) 117 { 118 const PetscInt *IA,*JA; 119 *ierr = MatGetRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);if (*ierr) return; 120 *iia = PetscIntAddressToFortran(ia,(PetscInt*)IA); 121 *jja = PetscIntAddressToFortran(ja,(PetscInt*)JA); 122 } 123 124 PETSC_EXTERN void PETSC_STDCALL matrestorerowij_(Mat *B,PetscInt *shift,PetscBool *sym,PetscBool *blockcompressed, PetscInt *n,PetscInt *ia,size_t *iia, 125 PetscInt *ja,size_t *jja,PetscBool *done,PetscErrorCode *ierr) 126 { 127 const PetscInt *IA = PetscIntAddressFromFortran(ia,*iia),*JA = PetscIntAddressFromFortran(ja,*jja); 128 *ierr = MatRestoreRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done); 129 } 130 131 /* 132 This is a poor way of storing the column and value pointers 133 generated by MatGetRow() to be returned with MatRestoreRow() 134 but there is not natural,good place else to store them. Hence 135 Fortran programmers can only have one outstanding MatGetRows() 136 at a time. 137 */ 138 static PetscErrorCode matgetrowactive = 0; 139 static const PetscInt *my_ocols = 0; 140 static const PetscScalar *my_ovals = 0; 141 142 PETSC_EXTERN void PETSC_STDCALL matgetrow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr) 143 { 144 const PetscInt **oocols = &my_ocols; 145 const PetscScalar **oovals = &my_ovals; 146 147 if (matgetrowactive) { 148 PetscError(PETSC_COMM_SELF,__LINE__,"MatGetRow_Fortran",__FILE__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL, 149 "Cannot have two MatGetRow() active simultaneously\n\ 150 call MatRestoreRow() before calling MatGetRow() a second time"); 151 *ierr = 1; 152 return; 153 } 154 155 CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = NULL; 156 CHKFORTRANNULLSCALAR(vals); if (!vals) oovals = NULL; 157 158 *ierr = MatGetRow(*mat,*row,ncols,oocols,oovals); 159 if (*ierr) return; 160 161 if (oocols) { *ierr = PetscMemcpy(cols,my_ocols,(*ncols)*sizeof(PetscInt)); if (*ierr) return;} 162 if (oovals) { *ierr = PetscMemcpy(vals,my_ovals,(*ncols)*sizeof(PetscScalar)); if (*ierr) return;} 163 matgetrowactive = 1; 164 } 165 166 PETSC_EXTERN void PETSC_STDCALL matrestorerow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr) 167 { 168 const PetscInt **oocols = &my_ocols; 169 const PetscScalar **oovals = &my_ovals; 170 if (!matgetrowactive) { 171 PetscError(PETSC_COMM_SELF,__LINE__,"MatRestoreRow_Fortran",__FILE__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL, 172 "Must call MatGetRow() first"); 173 *ierr = 1; 174 return; 175 } 176 CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = NULL; 177 CHKFORTRANNULLSCALAR(vals); if (!vals) oovals = NULL; 178 179 *ierr = MatRestoreRow(*mat,*row,ncols,oocols,oovals); 180 matgetrowactive = 0; 181 } 182 183 PETSC_EXTERN void PETSC_STDCALL matview_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr) 184 { 185 PetscViewer v; 186 PetscPatchDefaultViewers_Fortran(vin,v); 187 *ierr = MatView(*mat,v); 188 } 189 190 PETSC_EXTERN void PETSC_STDCALL matload_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr) 191 { 192 PetscViewer v; 193 PetscPatchDefaultViewers_Fortran(vin,v); 194 *ierr = MatLoad(*mat,v); 195 } 196 197 PETSC_EXTERN void PETSC_STDCALL matseqaijgetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr) 198 { 199 PetscScalar *mm; 200 PetscInt m,n; 201 202 *ierr = MatSeqAIJGetArray(*mat,&mm); if (*ierr) return; 203 *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return; 204 *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return; 205 } 206 207 PETSC_EXTERN void PETSC_STDCALL matseqaijrestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr) 208 { 209 PetscScalar *lx; 210 PetscInt m,n; 211 212 *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return; 213 *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return; 214 *ierr = MatSeqAIJRestoreArray(*mat,&lx);if (*ierr) return; 215 } 216 217 PETSC_EXTERN void PETSC_STDCALL matdensegetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr) 218 { 219 PetscScalar *mm; 220 PetscInt m,n; 221 222 *ierr = MatDenseGetArray(*mat,&mm); if (*ierr) return; 223 *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return; 224 *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return; 225 } 226 227 PETSC_EXTERN void PETSC_STDCALL matdenserestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr) 228 { 229 PetscScalar *lx; 230 PetscInt m,n; 231 232 *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return; 233 *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return; 234 *ierr = MatDenseRestoreArray(*mat,&lx);if (*ierr) return; 235 } 236 237 PETSC_EXTERN void PETSC_STDCALL matfactorgetsolverpackage_(Mat *mat,CHAR name PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 238 { 239 const char *tname; 240 241 *ierr = MatFactorGetSolverPackage(*mat,&tname);if (*ierr) return; 242 if (name != PETSC_NULL_CHARACTER_Fortran) { 243 *ierr = PetscStrncpy(name,tname,len);if (*ierr) return; 244 } 245 FIXRETURNCHAR(PETSC_TRUE,name,len); 246 } 247 248 PETSC_EXTERN void PETSC_STDCALL matgetfactor_(Mat *mat,CHAR outtype PETSC_MIXED_LEN(len),MatFactorType *ftype,Mat *M,PetscErrorCode *ierr PETSC_END_LEN(len)) 249 { 250 char *t; 251 FIXCHAR(outtype,len,t); 252 *ierr = MatGetFactor(*mat,t,*ftype,M); 253 FREECHAR(outtype,t); 254 } 255 256 PETSC_EXTERN void PETSC_STDCALL matconvert_(Mat *mat,CHAR outtype PETSC_MIXED_LEN(len),MatReuse *reuse,Mat *M,PetscErrorCode *ierr PETSC_END_LEN(len)) 257 { 258 char *t; 259 FIXCHAR(outtype,len,t); 260 *ierr = MatConvert(*mat,t,*reuse,M); 261 FREECHAR(outtype,t); 262 } 263 264 /* 265 MatGetSubmatrices() is slightly different from C since the 266 Fortran provides the array to hold the submatrix objects,while in C that 267 array is allocated by the MatGetSubmatrices() 268 */ 269 PETSC_EXTERN void PETSC_STDCALL matgetsubmatrices_(Mat *mat,PetscInt *n,IS *isrow,IS *iscol,MatReuse *scall,Mat *smat,PetscErrorCode *ierr) 270 { 271 Mat *lsmat; 272 PetscInt i; 273 274 if (*scall == MAT_INITIAL_MATRIX) { 275 *ierr = MatGetSubMatrices(*mat,*n,isrow,iscol,*scall,&lsmat); 276 for (i=0; i<*n; i++) { 277 smat[i] = lsmat[i]; 278 } 279 *ierr = PetscFree(lsmat); 280 } else { 281 *ierr = MatGetSubMatrices(*mat,*n,isrow,iscol,*scall,&smat); 282 } 283 } 284 285 /* 286 MatDestroyMatrices() is slightly different from C since the 287 Fortran provides the array to hold the submatrix objects,while in C that 288 array is allocated by the MatGetSubmatrices() 289 */ 290 PETSC_EXTERN void PETSC_STDCALL matdestroymatrices_(Mat *mat,PetscInt *n,Mat *smat,PetscErrorCode *ierr) 291 { 292 PetscInt i; 293 294 for (i=0; i<*n; i++) { 295 *ierr = MatDestroy(&smat[i]);if (*ierr) return; 296 } 297 } 298 299 PETSC_EXTERN void PETSC_STDCALL matzerorowscolumns_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 300 { 301 CHKFORTRANNULLOBJECTDEREFERENCE(x); 302 CHKFORTRANNULLOBJECTDEREFERENCE(b); 303 *ierr = MatZeroRowsColumns(*mat,*numRows,rows,*diag,*x,*b); 304 } 305 306 PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnsis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 307 { 308 CHKFORTRANNULLOBJECTDEREFERENCE(x); 309 CHKFORTRANNULLOBJECTDEREFERENCE(b); 310 *ierr = MatZeroRowsColumnsIS(*mat,*is,*diag,*x,*b); 311 } 312 313 PETSC_EXTERN void PETSC_STDCALL matzerorowsstencil_(Mat *mat,PetscInt *numRows,MatStencil *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 314 { 315 CHKFORTRANNULLOBJECTDEREFERENCE(x); 316 CHKFORTRANNULLOBJECTDEREFERENCE(b); 317 *ierr = MatZeroRowsStencil(*mat,*numRows,rows,*diag,*x,*b); 318 } 319 320 PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnsstencil_(Mat *mat,PetscInt *numRows,MatStencil *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 321 { 322 CHKFORTRANNULLOBJECTDEREFERENCE(x); 323 CHKFORTRANNULLOBJECTDEREFERENCE(b); 324 *ierr = MatZeroRowsColumnsStencil(*mat,*numRows,rows,*diag,*x,*b); 325 } 326 327 PETSC_EXTERN void PETSC_STDCALL matzerorows_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 328 { 329 CHKFORTRANNULLOBJECTDEREFERENCE(x); 330 CHKFORTRANNULLOBJECTDEREFERENCE(b); 331 *ierr = MatZeroRows(*mat,*numRows,rows,*diag,*x,*b); 332 } 333 334 PETSC_EXTERN void PETSC_STDCALL matzerorowsis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 335 { 336 CHKFORTRANNULLOBJECTDEREFERENCE(x); 337 CHKFORTRANNULLOBJECTDEREFERENCE(b); 338 *ierr = MatZeroRowsIS(*mat,*is,*diag,*x,*b); 339 } 340 341 PETSC_EXTERN void PETSC_STDCALL matzerorowslocal_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 342 { 343 CHKFORTRANNULLOBJECTDEREFERENCE(x); 344 CHKFORTRANNULLOBJECTDEREFERENCE(b); 345 *ierr = MatZeroRowsLocal(*mat,*numRows,rows,*diag,*x,*b); 346 } 347 348 PETSC_EXTERN void PETSC_STDCALL matzerorowslocalis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 349 { 350 CHKFORTRANNULLOBJECTDEREFERENCE(x); 351 CHKFORTRANNULLOBJECTDEREFERENCE(b); 352 *ierr = MatZeroRowsLocalIS(*mat,*is,*diag,*x,*b); 353 } 354 355 PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnslocal_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 356 { 357 CHKFORTRANNULLOBJECTDEREFERENCE(x); 358 CHKFORTRANNULLOBJECTDEREFERENCE(b); 359 *ierr = MatZeroRowsColumnsLocal(*mat,*numRows,rows,*diag,*x,*b); 360 } 361 362 PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnslocalis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 363 { 364 CHKFORTRANNULLOBJECTDEREFERENCE(x); 365 CHKFORTRANNULLOBJECTDEREFERENCE(b); 366 *ierr = MatZeroRowsColumnsLocalIS(*mat,*is,*diag,*x,*b); 367 } 368 369 PETSC_EXTERN void PETSC_STDCALL matsetoptionsprefix_(Mat *mat,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 370 { 371 char *t; 372 373 FIXCHAR(prefix,len,t); 374 *ierr = MatSetOptionsPrefix(*mat,t); 375 FREECHAR(prefix,t); 376 } 377 378 PETSC_EXTERN void PETSC_STDCALL matnullspaceremove_(MatNullSpace *sp,Vec *vec,PetscErrorCode *ierr) 379 { 380 *ierr = MatNullSpaceRemove(*sp,*vec); 381 } 382 383 PETSC_EXTERN void PETSC_STDCALL matgetinfo_(Mat *mat,MatInfoType *flag,MatInfo *info, int *__ierr) 384 { 385 *__ierr = MatGetInfo(*mat,*flag,info); 386 } 387 388 PETSC_EXTERN void PETSC_STDCALL matlufactor_(Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr) 389 { 390 *__ierr = MatLUFactor(*mat,*row,*col,info); 391 } 392 393 PETSC_EXTERN void PETSC_STDCALL matilufactor_(Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr) 394 { 395 *__ierr = MatILUFactor(*mat,*row,*col,info); 396 } 397 398 PETSC_EXTERN void PETSC_STDCALL matlufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr) 399 { 400 *__ierr = MatLUFactorSymbolic(*fact,*mat,*row,*col,info); 401 } 402 403 PETSC_EXTERN void PETSC_STDCALL matlufactornumeric_(Mat *fact,Mat *mat, MatFactorInfo *info, int *__ierr) 404 { 405 *__ierr = MatLUFactorNumeric(*fact,*mat,info); 406 } 407 408 PETSC_EXTERN void PETSC_STDCALL matcholeskyfactor_(Mat *mat,IS *perm, MatFactorInfo *info, int *__ierr) 409 { 410 *__ierr = MatCholeskyFactor(*mat,*perm,info); 411 } 412 413 PETSC_EXTERN void PETSC_STDCALL matcholeskyfactorsymbolic_(Mat *fact,Mat *mat,IS *perm, MatFactorInfo *info, int *__ierr) 414 { 415 *__ierr = MatCholeskyFactorSymbolic(*fact,*mat,*perm,info); 416 } 417 418 PETSC_EXTERN void PETSC_STDCALL matcholeskyfactornumeric_(Mat *fact,Mat *mat, MatFactorInfo *info, int *__ierr) 419 { 420 *__ierr = MatCholeskyFactorNumeric(*fact,*mat,info); 421 } 422 423 PETSC_EXTERN void PETSC_STDCALL matilufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col, MatFactorInfo *info, int *__ierr) 424 { 425 *__ierr = MatILUFactorSymbolic(*fact,*mat,*row,*col,info); 426 } 427 428 PETSC_EXTERN void PETSC_STDCALL maticcfactorsymbolic_(Mat *fact,Mat *mat,IS *perm, MatFactorInfo *info, int *__ierr) 429 { 430 *__ierr = MatICCFactorSymbolic(*fact,*mat,*perm,info); 431 } 432 433 PETSC_EXTERN void PETSC_STDCALL maticcfactor_(Mat *mat,IS *row, MatFactorInfo *info, int *__ierr) 434 { 435 *__ierr = MatICCFactor(*mat,*row,info); 436 } 437 438 PETSC_EXTERN void PETSC_STDCALL matfactorinfoinitialize_(MatFactorInfo *info, int *__ierr) 439 { 440 *__ierr = MatFactorInfoInitialize(info); 441 } 442