1 #include <petsc/private/fortranimpl.h> 2 #include <petscmat.h> 3 #include <petscviewer.h> 4 5 #if defined(PETSC_HAVE_FORTRAN_CAPS) 6 #define matsetvalues_ MATSETVALUES 7 #define matsetvaluesnnnn_ MATSETVALUESNNNN 8 #define matsetvalues0_ MATSETVALUES0 9 #define matsetvaluesnn1_ MATSETVALUESNN1 10 #define matsetvalues11_ MATSETVALUES11 11 #define matsetvalues1n_ MATSETVALUES1N 12 #define matsetvaluesn1_ MATSETVALUESN1 13 #define matsetvaluesblocked0_ MATSETVALUESBLOCKED0 14 #define matsetvaluesblocked11_ MATSETVALUESBLOCKED11 15 #define matsetvaluesblocked111_ MATSETVALUESBLOCKED111 16 #define matsetvaluesblocked1n_ MATSETVALUESBLOCKED1N 17 #define matsetvaluesblockedn1_ MATSETVALUESBLOCKEDN1 18 #define matsetvaluesblockedlocal_ MATSETVALUESBLOCKEDLOCAL 19 #define matsetvaluesblockedlocal0_ MATSETVALUESBLOCKEDLOCAL0 20 #define matsetvaluesblockedlocal11_ MATSETVALUESBLOCKEDLOCAL11 21 #define matsetvaluesblockedlocal111_ MATSETVALUESBLOCKEDLOCAL111 22 #define matsetvaluesblockedlocal1n_ MATSETVALUESBLOCKEDLOCAL1N 23 #define matsetvaluesblockedlocaln1_ MATSETVALUESBLOCKEDLOCALN1 24 #define matsetvalueslocal_ MATSETVALUESLOCAL 25 #define matsetvalueslocal0_ MATSETVALUESLOCAL0 26 #define matsetvalueslocal11_ MATSETVALUESLOCAL11 27 #define matsetvalueslocal11nn_ MATSETVALUESLOCAL11NN 28 #define matsetvalueslocal111_ MATSETVALUESLOCAL111 29 #define matsetvalueslocal1n_ MATSETVALUESLOCAL1N 30 #define matsetvalueslocaln1_ MATSETVALUESLOCALN1 31 #define matgetrowmin_ MATGETROWMIN 32 #define matgetrowminabs_ MATGETROWMINABS 33 #define matgetrowmax_ MATGETROWMAX 34 #define matgetrowmaxabs_ MATGETROWMAXABS 35 #define matdestroymatrices_ MATDESTROYMATRICES 36 #define matgetfactor_ MATGETFACTOR 37 #define matfactorgetsolverpackage_ MATFACTORGETSOLVERPACKAGE 38 #define matgetrowij_ MATGETROWIJ 39 #define matrestorerowij_ MATRESTOREROWIJ 40 #define matgetrow_ MATGETROW 41 #define matrestorerow_ MATRESTOREROW 42 #define matload_ MATLOAD 43 #define matview_ MATVIEW 44 #define matseqaijgetarray_ MATSEQAIJGETARRAY 45 #define matseqaijrestorearray_ MATSEQAIJRESTOREARRAY 46 #define matdensegetarray_ MATDENSEGETARRAY 47 #define matdenserestorearray_ MATDENSERESTOREARRAY 48 #define matconvert_ MATCONVERT 49 #define matgetsubmatrices_ MATGETSUBMATRICES 50 #define matzerorowscolumns_ MATZEROROWSCOLUMNS 51 #define matzerorowscolumnsis_ MATZEROROWSCOLUMNSIS 52 #define matzerorowsstencil_ MATZEROROWSSTENCIL 53 #define matzerorowscolumnsstencil_ MATZEROROWSCOLUMNSSTENCIL 54 #define matzerorows_ MATZEROROWS 55 #define matzerorowsis_ MATZEROROWSIS 56 #define matzerorowslocal_ MATZEROROWSLOCAL 57 #define matzerorowslocalis_ MATZEROROWSLOCALIS 58 #define matzerorowscolumnslocal_ MATZEROROWSCOLUMNSLOCAL 59 #define matzerorowscolumnslocalis_ MATZEROROWSCOLUMNSLOCALIS 60 #define matsetoptionsprefix_ MATSETOPTIONSPREFIX 61 #define matcreatevecs_ MATCREATEVECS 62 #define matnullspaceremove_ MATNULLSPACEREMOVE 63 #define matgetinfo_ MATGETINFO 64 #define matlufactor_ MATLUFACTOR 65 #define matilufactor_ MATILUFACTOR 66 #define matlufactorsymbolic_ MATLUFACTORSYMBOLIC 67 #define matlufactornumeric_ MATLUFACTORNUMERIC 68 #define matcholeskyfactor_ MATCHOLESKYFACTOR 69 #define matcholeskyfactorsymbolic_ MATCHOLESKYFACTORSYMBOLIC 70 #define matcholeskyfactornumeric_ MATCHOLESKYFACTORNUMERIC 71 #define matilufactorsymbolic_ MATILUFACTORSYMBOLIC 72 #define maticcfactorsymbolic_ MATICCFACTORSYMBOLIC 73 #define maticcfactor_ MATICCFACTOR 74 #define matfactorinfoinitialize_ MATFACTORINFOINITIALIZE 75 #define matnullspacesetfunction_ MATNULLSPACESETFUNCTION 76 #define matfindnonzerorows_ MATFINDNONZEROROWS 77 #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 78 #define matsetvalues_ matsetvalues 79 #define matsetvaluesnnnn_ matsetvaluesnnnn 80 #define matsetvalues0_ matsetvalues0 81 #define matsetvaluesnn1_ matsetvaluesnn1 82 #define matsetvalues11_ matsetvalues11 83 #define matsetvaluesn1_ matsetvaluesn1 84 #define matsetvalues1n_ matsetvalues1n 85 #define matsetvalueslocal_ matsetvalueslocal 86 #define matsetvalueslocal0_ matsetvalueslocal0 87 #define matsetvalueslocal11_ matsetvalueslocal11 88 #define matsetvalueslocal11nn_ matsetvalueslocal11nn 89 #define matsetvalueslocal111_ matsetvalueslocal111 90 #define matsetvalueslocal1n_ matsetvalueslocal1n 91 #define matsetvalueslocaln1_ matsetvalueslocaln1 92 #define matsetvaluesblocked_ matsetvaluesblocked 93 #define matsetvaluesblocked0_ matsetvaluesblocked0 94 #define matsetvaluesblocked11_ matsetvaluesblocked11 95 #define matsetvaluesblocked111_ matsetvaluesblocked111 96 #define matsetvaluesblocked1n_ matsetvaluesblocked1n 97 #define matsetvaluesblocked1n_ matsetvaluesblockedn1 98 #define matsetvaluesblockedlocal_ matsetvaluesblockedlocal 99 #define matsetvaluesblockedlocal0_ matsetvaluesblockedlocal0 100 #define matsetvaluesblockedlocal11_ matsetvaluesblockedlocal11 101 #define matsetvaluesblockedlocal111_ matsetvaluesblockedlocal111 102 #define matsetvaluesblockedlocal1n_ matsetvaluesblockedlocal1n 103 #define matsetvaluesblockedlocal1n_ matsetvaluesblockedlocaln1 104 #define matgetrowmin_ matgetrowmin 105 #define matgetrowminabs_ matgetrowminabs 106 #define matgetrowmax_ matgetrowmax 107 #define matgetrowmaxabs_ matgetrowmaxabs 108 #define matdestroymatrices_ matdestroymatrices 109 #define matgetfactor_ matgetfactor 110 #define matfactorgetsolverpackage_ matfactorgetsolverpackage 111 #define matcreatevecs_ matcreatevecs 112 #define matgetrowij_ matgetrowij 113 #define matrestorerowij_ matrestorerowij 114 #define matgetrow_ matgetrow 115 #define matrestorerow_ matrestorerow 116 #define matview_ matview 117 #define matload_ matload 118 #define matseqaijgetarray_ matseqaijgetarray 119 #define matseqaijrestorearray_ matseqaijrestorearray 120 #define matdensegetarray_ matdensegetarray 121 #define matdenserestorearray_ matdenserestorearray 122 #define matconvert_ matconvert 123 #define matgetsubmatrices_ matgetsubmatrices 124 #define matzerorowscolumns_ matzerorowscolumns 125 #define matzerorowscolumnsis_ matzerorowscolumnsis 126 #define matzerorowsstencil_ matzerorowsstencil 127 #define matzerorowscolumnsstencil_ matzerorowscolumnsstencil 128 #define matzerorows_ matzerorows 129 #define matzerorowsis_ matzerorowsis 130 #define matzerorowslocal_ matzerorowslocal 131 #define matzerorowslocalis_ matzerorowslocalis 132 #define matzerorowscolumnslocal_ matzerorowscolumnslocal 133 #define matzerorowscolumnslocalis_ matzerorowscolumnslocalis 134 #define matsetoptionsprefix_ matsetoptionsprefix 135 #define matnullspaceremove_ matnullspaceremove 136 #define matgetinfo_ matgetinfo 137 #define matlufactor_ matlufactor 138 #define matilufactor_ matilufactor 139 #define matlufactorsymbolic_ matlufactorsymbolic 140 #define matlufactornumeric_ matlufactornumeric 141 #define matcholeskyfactor_ matcholeskyfactor 142 #define matcholeskyfactorsymbolic_ matcholeskyfactorsymbolic 143 #define matcholeskyfactornumeric_ matcholeskyfactornumeric 144 #define matilufactorsymbolic_ matilufactorsymbolic 145 #define maticcfactorsymbolic_ maticcfactorsymbolic 146 #define maticcfactor_ maticcfactor 147 #define matfactorinfoinitialize_ matfactorinfoinitialize 148 #define matnullspacesetfunction_ matnullspacesetfunction 149 #define matfindnonzerorows_ matfindnonzerorows 150 #endif 151 152 PETSC_EXTERN void PETSC_STDCALL matsetvaluesblocked_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){ 153 *ierr = MatSetValuesBlocked(*mat,*m,idxm,*n,idxn,v,*addv); 154 } 155 156 PETSC_EXTERN void PETSC_STDCALL matsetvaluesblocked0_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){ 157 matsetvaluesblocked_(mat,m,idxm,n,idxn,v,addv,ierr); 158 } 159 160 PETSC_EXTERN void PETSC_STDCALL matsetvaluesblocked11_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){ 161 matsetvaluesblocked_(mat,m,idxm,n,idxn,v,addv,ierr); 162 } 163 164 PETSC_EXTERN void PETSC_STDCALL matsetvaluesblocked111_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){ 165 matsetvaluesblocked_(mat,m,idxm,n,idxn,v,addv,ierr); 166 } 167 168 PETSC_EXTERN void PETSC_STDCALL matsetvaluesblocked1n_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){ 169 matsetvaluesblocked_(mat,m,idxm,n,idxn,v,addv,ierr); 170 } 171 172 PETSC_EXTERN void PETSC_STDCALL matsetvaluesblockedn1_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){ 173 matsetvaluesblocked_(mat,m,idxm,n,idxn,v,addv,ierr); 174 } 175 176 PETSC_EXTERN void PETSC_STDCALL matsetvaluesblockedlocal_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr ) 177 { 178 *ierr = MatSetValuesBlockedLocal(*mat,*nrow,irow,*ncol,icol,y,*addv); 179 } 180 181 PETSC_EXTERN void PETSC_STDCALL matsetvaluesblockedlocal0_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){ 182 matsetvaluesblockedlocal_(mat,m,idxm,n,idxn,v,addv,ierr); 183 } 184 185 PETSC_EXTERN void PETSC_STDCALL matsetvaluesblockedlocal11_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){ 186 matsetvaluesblockedlocal_(mat,m,idxm,n,idxn,v,addv,ierr); 187 } 188 189 PETSC_EXTERN void PETSC_STDCALL matsetvaluesblockedlocal111_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){ 190 matsetvaluesblockedlocal_(mat,m,idxm,n,idxn,v,addv,ierr); 191 } 192 193 PETSC_EXTERN void PETSC_STDCALL matsetvaluesblockedlocal1n_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){ 194 matsetvaluesblockedlocal_(mat,m,idxm,n,idxn,v,addv,ierr); 195 } 196 197 PETSC_EXTERN void PETSC_STDCALL matsetvaluesblockedlocaln1_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ){ 198 matsetvaluesblockedlocal_(mat,m,idxm,n,idxn,v,addv,ierr); 199 } 200 201 PETSC_EXTERN void PETSC_STDCALL matsetvalues_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ) 202 { 203 *ierr = MatSetValues(*mat,*m,idxm,*n,idxn,v,*addv); 204 } 205 206 PETSC_EXTERN void PETSC_STDCALL matsetvaluesnnnn_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ) 207 { 208 matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr); 209 } 210 211 PETSC_EXTERN void PETSC_STDCALL matsetvalues0_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ) 212 { 213 matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr); 214 } 215 216 PETSC_EXTERN void PETSC_STDCALL matsetvaluesnn1_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ) 217 { 218 matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr); 219 } 220 221 PETSC_EXTERN void PETSC_STDCALL matsetvalues11_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ) 222 { 223 matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr); 224 } 225 226 PETSC_EXTERN void PETSC_STDCALL matsetvaluesn1_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ) 227 { 228 matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr); 229 } 230 231 PETSC_EXTERN void PETSC_STDCALL matsetvalues1n_(Mat *mat,PetscInt *m, PetscInt idxm[],PetscInt *n, PetscInt idxn[], PetscScalar v[],InsertMode *addv, int *ierr ) 232 { 233 matsetvalues_(mat,m,idxm,n,idxn,v,addv,ierr); 234 } 235 236 PETSC_EXTERN void PETSC_STDCALL matsetvalueslocal_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr ) 237 { 238 *ierr = MatSetValuesLocal(*mat,*nrow,irow,*ncol,icol,y,*addv); 239 } 240 241 PETSC_EXTERN void PETSC_STDCALL matsetvalueslocal0_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr ) 242 { 243 matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr); 244 } 245 246 PETSC_EXTERN void PETSC_STDCALL matsetvalueslocal11_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr ) 247 { 248 matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr); 249 } 250 251 PETSC_EXTERN void PETSC_STDCALL matsetvalueslocal11nn_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr ) 252 { 253 matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr); 254 } 255 256 PETSC_EXTERN void PETSC_STDCALL matsetvalueslocal111_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr ) 257 { 258 matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr); 259 } 260 261 PETSC_EXTERN void PETSC_STDCALL matsetvalueslocal1n_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr ) 262 { 263 matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr); 264 } 265 266 PETSC_EXTERN void PETSC_STDCALL matsetvalueslocaln1_(Mat *mat,PetscInt *nrow, PetscInt irow[],PetscInt *ncol, PetscInt icol[], PetscScalar y[],InsertMode *addv, int *ierr ) 267 { 268 matsetvalueslocal_(mat,nrow,irow,ncol,icol,y,addv,ierr); 269 } 270 271 PETSC_EXTERN void PETSC_STDCALL matgetrowmin_(Mat *mat,Vec *v,PetscInt idx[], int *ierr ) 272 { 273 CHKFORTRANNULLINTEGER(idx); 274 *ierr = MatGetRowMin(*mat,*v,idx); 275 } 276 277 PETSC_EXTERN void PETSC_STDCALL matgetrowminabs_(Mat *mat,Vec *v,PetscInt idx[], int *ierr ) 278 { 279 CHKFORTRANNULLINTEGER(idx); 280 *ierr = MatGetRowMinAbs(*mat,*v,idx); 281 } 282 283 PETSC_EXTERN void PETSC_STDCALL matgetrowmax_(Mat *mat,Vec *v,PetscInt idx[], int *ierr ) 284 { 285 CHKFORTRANNULLINTEGER(idx); 286 *ierr = MatGetRowMax(*mat,*v,idx); 287 } 288 289 PETSC_EXTERN void PETSC_STDCALL matgetrowmaxabs_(Mat *mat,Vec *v,PetscInt idx[], int *ierr ) 290 { 291 CHKFORTRANNULLINTEGER(idx); 292 *ierr = MatGetRowMaxAbs(*mat,*v,idx); 293 } 294 295 static PetscErrorCode ournullfunction(MatNullSpace sp,Vec x,void *ctx) 296 { 297 PetscErrorCode ierr = 0; 298 (*(void (PETSC_STDCALL *)(MatNullSpace*,Vec*,void*,PetscErrorCode*))(((PetscObject)sp)->fortran_func_pointers[0]))(&sp,&x,ctx,&ierr);CHKERRQ(ierr); 299 return 0; 300 } 301 302 PETSC_EXTERN void PETSC_STDCALL matnullspacesetfunction_(MatNullSpace *sp, PetscErrorCode (*rem)(MatNullSpace,Vec,void*),void *ctx,PetscErrorCode *ierr) 303 { 304 PetscObjectAllocateFortranPointers(*sp,1); 305 ((PetscObject)*sp)->fortran_func_pointers[0] = (PetscVoidFunction)rem; 306 307 *ierr = MatNullSpaceSetFunction(*sp,ournullfunction,ctx); 308 } 309 310 PETSC_EXTERN void PETSC_STDCALL matcreatevecs_(Mat *mat,Vec *right,Vec *left, int *ierr) 311 { 312 CHKFORTRANNULLOBJECT(right); 313 CHKFORTRANNULLOBJECT(left); 314 *ierr = MatCreateVecs(*mat,right,left); 315 } 316 317 PETSC_EXTERN void PETSC_STDCALL matgetrowij_(Mat *B,PetscInt *shift,PetscBool *sym,PetscBool *blockcompressed,PetscInt *n,PetscInt *ia,size_t *iia, 318 PetscInt *ja,size_t *jja,PetscBool *done,PetscErrorCode *ierr) 319 { 320 const PetscInt *IA,*JA; 321 *ierr = MatGetRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);if (*ierr) return; 322 *iia = PetscIntAddressToFortran(ia,(PetscInt*)IA); 323 *jja = PetscIntAddressToFortran(ja,(PetscInt*)JA); 324 } 325 326 PETSC_EXTERN void PETSC_STDCALL matrestorerowij_(Mat *B,PetscInt *shift,PetscBool *sym,PetscBool *blockcompressed, PetscInt *n,PetscInt *ia,size_t *iia, 327 PetscInt *ja,size_t *jja,PetscBool *done,PetscErrorCode *ierr) 328 { 329 const PetscInt *IA = PetscIntAddressFromFortran(ia,*iia),*JA = PetscIntAddressFromFortran(ja,*jja); 330 *ierr = MatRestoreRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done); 331 } 332 333 /* 334 This is a poor way of storing the column and value pointers 335 generated by MatGetRow() to be returned with MatRestoreRow() 336 but there is not natural,good place else to store them. Hence 337 Fortran programmers can only have one outstanding MatGetRows() 338 at a time. 339 */ 340 static PetscErrorCode matgetrowactive = 0; 341 static const PetscInt *my_ocols = 0; 342 static const PetscScalar *my_ovals = 0; 343 344 PETSC_EXTERN void PETSC_STDCALL matgetrow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr) 345 { 346 const PetscInt **oocols = &my_ocols; 347 const PetscScalar **oovals = &my_ovals; 348 349 if (matgetrowactive) { 350 PetscError(PETSC_COMM_SELF,__LINE__,"MatGetRow_Fortran",__FILE__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL, 351 "Cannot have two MatGetRow() active simultaneously\n\ 352 call MatRestoreRow() before calling MatGetRow() a second time"); 353 *ierr = 1; 354 return; 355 } 356 357 CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = NULL; 358 CHKFORTRANNULLSCALAR(vals); if (!vals) oovals = NULL; 359 360 *ierr = MatGetRow(*mat,*row,ncols,oocols,oovals); 361 if (*ierr) return; 362 363 if (oocols) { *ierr = PetscMemcpy(cols,my_ocols,(*ncols)*sizeof(PetscInt)); if (*ierr) return;} 364 if (oovals) { *ierr = PetscMemcpy(vals,my_ovals,(*ncols)*sizeof(PetscScalar)); if (*ierr) return;} 365 matgetrowactive = 1; 366 } 367 368 PETSC_EXTERN void PETSC_STDCALL matrestorerow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr) 369 { 370 const PetscInt **oocols = &my_ocols; 371 const PetscScalar **oovals = &my_ovals; 372 if (!matgetrowactive) { 373 PetscError(PETSC_COMM_SELF,__LINE__,"MatRestoreRow_Fortran",__FILE__,PETSC_ERR_ARG_WRONGSTATE,PETSC_ERROR_INITIAL, 374 "Must call MatGetRow() first"); 375 *ierr = 1; 376 return; 377 } 378 CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = NULL; 379 CHKFORTRANNULLSCALAR(vals); if (!vals) oovals = NULL; 380 381 *ierr = MatRestoreRow(*mat,*row,ncols,oocols,oovals); 382 matgetrowactive = 0; 383 } 384 385 PETSC_EXTERN void PETSC_STDCALL matview_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr) 386 { 387 PetscViewer v; 388 PetscPatchDefaultViewers_Fortran(vin,v); 389 *ierr = MatView(*mat,v); 390 } 391 392 PETSC_EXTERN void PETSC_STDCALL matload_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr) 393 { 394 PetscViewer v; 395 PetscPatchDefaultViewers_Fortran(vin,v); 396 *ierr = MatLoad(*mat,v); 397 } 398 399 PETSC_EXTERN void PETSC_STDCALL matseqaijgetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr) 400 { 401 PetscScalar *mm; 402 PetscInt m,n; 403 404 *ierr = MatSeqAIJGetArray(*mat,&mm); if (*ierr) return; 405 *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return; 406 *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return; 407 } 408 409 PETSC_EXTERN void PETSC_STDCALL matseqaijrestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr) 410 { 411 PetscScalar *lx; 412 PetscInt m,n; 413 414 *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return; 415 *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return; 416 *ierr = MatSeqAIJRestoreArray(*mat,&lx);if (*ierr) return; 417 } 418 419 PETSC_EXTERN void PETSC_STDCALL matdensegetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr) 420 { 421 PetscScalar *mm; 422 PetscInt m,n; 423 424 *ierr = MatDenseGetArray(*mat,&mm); if (*ierr) return; 425 *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return; 426 *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return; 427 } 428 429 PETSC_EXTERN void PETSC_STDCALL matdenserestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr) 430 { 431 PetscScalar *lx; 432 PetscInt m,n; 433 434 *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return; 435 *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return; 436 *ierr = MatDenseRestoreArray(*mat,&lx);if (*ierr) return; 437 } 438 439 PETSC_EXTERN void PETSC_STDCALL matfactorgetsolverpackage_(Mat *mat,CHAR name PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 440 { 441 const char *tname; 442 443 *ierr = MatFactorGetSolverPackage(*mat,&tname);if (*ierr) return; 444 if (name != PETSC_NULL_CHARACTER_Fortran) { 445 *ierr = PetscStrncpy(name,tname,len);if (*ierr) return; 446 } 447 FIXRETURNCHAR(PETSC_TRUE,name,len); 448 } 449 450 PETSC_EXTERN void PETSC_STDCALL matgetfactor_(Mat *mat,CHAR outtype PETSC_MIXED_LEN(len),MatFactorType *ftype,Mat *M,PetscErrorCode *ierr PETSC_END_LEN(len)) 451 { 452 char *t; 453 FIXCHAR(outtype,len,t); 454 *ierr = MatGetFactor(*mat,t,*ftype,M); 455 FREECHAR(outtype,t); 456 } 457 458 PETSC_EXTERN void PETSC_STDCALL matconvert_(Mat *mat,CHAR outtype PETSC_MIXED_LEN(len),MatReuse *reuse,Mat *M,PetscErrorCode *ierr PETSC_END_LEN(len)) 459 { 460 char *t; 461 FIXCHAR(outtype,len,t); 462 *ierr = MatConvert(*mat,t,*reuse,M); 463 FREECHAR(outtype,t); 464 } 465 466 /* 467 MatGetSubmatrices() is slightly different from C since the 468 Fortran provides the array to hold the submatrix objects,while in C that 469 array is allocated by the MatGetSubmatrices() 470 */ 471 PETSC_EXTERN void PETSC_STDCALL matgetsubmatrices_(Mat *mat,PetscInt *n,IS *isrow,IS *iscol,MatReuse *scall,Mat *smat,PetscErrorCode *ierr) 472 { 473 Mat *lsmat; 474 PetscInt i; 475 476 if (*scall == MAT_INITIAL_MATRIX) { 477 *ierr = MatGetSubMatrices(*mat,*n,isrow,iscol,*scall,&lsmat); 478 for (i=0; i<*n; i++) { 479 smat[i] = lsmat[i]; 480 } 481 *ierr = PetscFree(lsmat); 482 } else { 483 *ierr = MatGetSubMatrices(*mat,*n,isrow,iscol,*scall,&smat); 484 } 485 } 486 487 /* 488 MatDestroyMatrices() is slightly different from C since the 489 Fortran provides the array to hold the submatrix objects,while in C that 490 array is allocated by the MatGetSubmatrices() 491 */ 492 PETSC_EXTERN void PETSC_STDCALL matdestroymatrices_(Mat *mat,PetscInt *n,Mat *smat,PetscErrorCode *ierr) 493 { 494 PetscInt i; 495 496 for (i=0; i<*n; i++) { 497 *ierr = MatDestroy(&smat[i]);if (*ierr) return; 498 } 499 } 500 501 PETSC_EXTERN void PETSC_STDCALL matzerorowscolumns_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 502 { 503 CHKFORTRANNULLOBJECTDEREFERENCE(x); 504 CHKFORTRANNULLOBJECTDEREFERENCE(b); 505 *ierr = MatZeroRowsColumns(*mat,*numRows,rows,*diag,*x,*b); 506 } 507 508 PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnsis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 509 { 510 CHKFORTRANNULLOBJECTDEREFERENCE(x); 511 CHKFORTRANNULLOBJECTDEREFERENCE(b); 512 *ierr = MatZeroRowsColumnsIS(*mat,*is,*diag,*x,*b); 513 } 514 515 PETSC_EXTERN void PETSC_STDCALL matzerorowsstencil_(Mat *mat,PetscInt *numRows,MatStencil *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 516 { 517 CHKFORTRANNULLOBJECTDEREFERENCE(x); 518 CHKFORTRANNULLOBJECTDEREFERENCE(b); 519 *ierr = MatZeroRowsStencil(*mat,*numRows,rows,*diag,*x,*b); 520 } 521 522 PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnsstencil_(Mat *mat,PetscInt *numRows,MatStencil *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 523 { 524 CHKFORTRANNULLOBJECTDEREFERENCE(x); 525 CHKFORTRANNULLOBJECTDEREFERENCE(b); 526 *ierr = MatZeroRowsColumnsStencil(*mat,*numRows,rows,*diag,*x,*b); 527 } 528 529 PETSC_EXTERN void PETSC_STDCALL matzerorows_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 530 { 531 CHKFORTRANNULLOBJECTDEREFERENCE(x); 532 CHKFORTRANNULLOBJECTDEREFERENCE(b); 533 *ierr = MatZeroRows(*mat,*numRows,rows,*diag,*x,*b); 534 } 535 536 PETSC_EXTERN void PETSC_STDCALL matzerorowsis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 537 { 538 CHKFORTRANNULLOBJECTDEREFERENCE(x); 539 CHKFORTRANNULLOBJECTDEREFERENCE(b); 540 *ierr = MatZeroRowsIS(*mat,*is,*diag,*x,*b); 541 } 542 543 PETSC_EXTERN void PETSC_STDCALL matzerorowslocal_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 544 { 545 CHKFORTRANNULLOBJECTDEREFERENCE(x); 546 CHKFORTRANNULLOBJECTDEREFERENCE(b); 547 *ierr = MatZeroRowsLocal(*mat,*numRows,rows,*diag,*x,*b); 548 } 549 550 PETSC_EXTERN void PETSC_STDCALL matzerorowslocalis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 551 { 552 CHKFORTRANNULLOBJECTDEREFERENCE(x); 553 CHKFORTRANNULLOBJECTDEREFERENCE(b); 554 *ierr = MatZeroRowsLocalIS(*mat,*is,*diag,*x,*b); 555 } 556 557 PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnslocal_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 558 { 559 CHKFORTRANNULLOBJECTDEREFERENCE(x); 560 CHKFORTRANNULLOBJECTDEREFERENCE(b); 561 *ierr = MatZeroRowsColumnsLocal(*mat,*numRows,rows,*diag,*x,*b); 562 } 563 564 PETSC_EXTERN void PETSC_STDCALL matzerorowscolumnslocalis_(Mat *mat,IS *is,PetscScalar *diag,Vec *x,Vec *b,PetscErrorCode *ierr) 565 { 566 CHKFORTRANNULLOBJECTDEREFERENCE(x); 567 CHKFORTRANNULLOBJECTDEREFERENCE(b); 568 *ierr = MatZeroRowsColumnsLocalIS(*mat,*is,*diag,*x,*b); 569 } 570 571 PETSC_EXTERN void PETSC_STDCALL matsetoptionsprefix_(Mat *mat,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 572 { 573 char *t; 574 575 FIXCHAR(prefix,len,t); 576 *ierr = MatSetOptionsPrefix(*mat,t); 577 FREECHAR(prefix,t); 578 } 579 580 PETSC_EXTERN void PETSC_STDCALL matnullspaceremove_(MatNullSpace *sp,Vec *vec,PetscErrorCode *ierr) 581 { 582 *ierr = MatNullSpaceRemove(*sp,*vec); 583 } 584 585 PETSC_EXTERN void PETSC_STDCALL matgetinfo_(Mat *mat,MatInfoType *flag,MatInfo *info, int *ierr) 586 { 587 *ierr = MatGetInfo(*mat,*flag,info); 588 } 589 590 PETSC_EXTERN void PETSC_STDCALL matlufactor_(Mat *mat,IS *row,IS *col,const MatFactorInfo *info, int *ierr) 591 { 592 *ierr = MatLUFactor(*mat,*row,*col,info); 593 } 594 595 PETSC_EXTERN void PETSC_STDCALL matilufactor_(Mat *mat,IS *row,IS *col,const MatFactorInfo *info, int *ierr) 596 { 597 *ierr = MatILUFactor(*mat,*row,*col,info); 598 } 599 600 PETSC_EXTERN void PETSC_STDCALL matlufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col,const MatFactorInfo *info, int *ierr) 601 { 602 *ierr = MatLUFactorSymbolic(*fact,*mat,*row,*col,info); 603 } 604 605 PETSC_EXTERN void PETSC_STDCALL matlufactornumeric_(Mat *fact,Mat *mat,const MatFactorInfo *info, int *ierr) 606 { 607 *ierr = MatLUFactorNumeric(*fact,*mat,info); 608 } 609 610 PETSC_EXTERN void PETSC_STDCALL matcholeskyfactor_(Mat *mat,IS *perm,const MatFactorInfo *info, int *ierr) 611 { 612 *ierr = MatCholeskyFactor(*mat,*perm,info); 613 } 614 615 PETSC_EXTERN void PETSC_STDCALL matcholeskyfactorsymbolic_(Mat *fact,Mat *mat,IS *perm,const MatFactorInfo *info, int *ierr) 616 { 617 *ierr = MatCholeskyFactorSymbolic(*fact,*mat,*perm,info); 618 } 619 620 PETSC_EXTERN void PETSC_STDCALL matcholeskyfactornumeric_(Mat *fact,Mat *mat,const MatFactorInfo *info, int *ierr) 621 { 622 *ierr = MatCholeskyFactorNumeric(*fact,*mat,info); 623 } 624 625 PETSC_EXTERN void PETSC_STDCALL matilufactorsymbolic_(Mat *fact,Mat *mat,IS *row,IS *col,const MatFactorInfo *info, int *ierr) 626 { 627 *ierr = MatILUFactorSymbolic(*fact,*mat,*row,*col,info); 628 } 629 630 PETSC_EXTERN void PETSC_STDCALL maticcfactorsymbolic_(Mat *fact,Mat *mat,IS *perm,const MatFactorInfo *info, int *ierr) 631 { 632 *ierr = MatICCFactorSymbolic(*fact,*mat,*perm,info); 633 } 634 635 PETSC_EXTERN void PETSC_STDCALL maticcfactor_(Mat *mat,IS *row,const MatFactorInfo *info, int *ierr) 636 { 637 *ierr = MatICCFactor(*mat,*row,info); 638 } 639 640 PETSC_EXTERN void PETSC_STDCALL matfactorinfoinitialize_(MatFactorInfo *info, int *ierr) 641 { 642 *ierr = MatFactorInfoInitialize(info); 643 } 644