PETSC_EXTERN PetscErrorCode ISCreate_Block(IS is) { PetscErrorCode ierr; IS_Block *sub; PetscFunctionBegin; ierr = PetscNewLog(is,IS_Block,&sub);CHKERRQ(ierr); is->data = sub; ierr = PetscObjectComposeFunction((PetscObject)is,"ISBlockSetIndices_C",ISBlockSetIndices_Block);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)is,"ISBlockGetIndices_C",ISBlockGetIndices_Block);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)is,"ISBlockRestoreIndices_C",ISBlockRestoreIndices_Block);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)is,"ISBlockGetSize_C",ISBlockGetSize_Block);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)is,"ISBlockGetLocalSize_C",ISBlockGetLocalSize_Block);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode ISDestroy_Block(IS is) { IS_Block *is_block = (IS_Block*)is->data; PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscFree(is_block->idx);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)is,"ISBlockSetIndices_C",0);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)is,"ISBlockGetIndices_C",0);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)is,"ISBlockRestoreIndices_C",0);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)is,"ISBlockGetSize_C",0);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)is,"ISBlockGetLocalSize_C",0);CHKERRQ(ierr); ierr = PetscFree(is->data);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode MatPartitioningDestroy_Party(MatPartitioning part) { MatPartitioning_Party *party = (MatPartitioning_Party*)part->data; PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscFree(party);CHKERRQ(ierr); /* clear composed functions */ ierr = PetscObjectComposeFunction((PetscObject)part,"MatPartitioningPartySetGlobal_C",NULL);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)part,"MatPartitioningPartySetLocal_C",NULL);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)part,"MatPartitioningPartySetCoarseLevel_C",NULL);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)part,"MatPartitioningPartySetMatchOptimization_C",NULL);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)part,"MatPartitioningPartySetBipart_C",NULL);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode KSPDestroy_CG(KSP ksp) { KSP_CG *cg = (KSP_CG*)ksp->data; PetscErrorCode ierr; PetscFunctionBegin; /* free space used for singular value calculations */ if (ksp->calc_sings) { ierr = PetscFree4(cg->e,cg->d,cg->ee,cg->dd);CHKERRQ(ierr); } ierr = KSPDestroyDefault(ksp);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)ksp,"KSPCGSetType_C",NULL);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)ksp,"KSPCGUseSingleReduction_C",NULL);CHKERRQ(ierr); PetscFunctionReturn(0); }
PETSC_EXTERN PetscErrorCode PCCreate_ICC(PC pc) { PetscErrorCode ierr; PC_ICC *icc; PetscFunctionBegin; ierr = PetscNewLog(pc,PC_ICC,&icc);CHKERRQ(ierr); ((PC_Factor*)icc)->fact = 0; ierr = PetscStrallocpy(MATORDERINGNATURAL,(char**)&((PC_Factor*)icc)->ordering);CHKERRQ(ierr); ierr = PetscStrallocpy(MATSOLVERPETSC,&((PC_Factor*)icc)->solvertype);CHKERRQ(ierr); ierr = MatFactorInfoInitialize(&((PC_Factor*)icc)->info);CHKERRQ(ierr); ((PC_Factor*)icc)->factortype = MAT_FACTOR_ICC; ((PC_Factor*)icc)->info.levels = 0.; ((PC_Factor*)icc)->info.fill = 1.0; icc->implctx = 0; ((PC_Factor*)icc)->info.dtcol = PETSC_DEFAULT; ((PC_Factor*)icc)->info.shifttype = (PetscReal) MAT_SHIFT_POSITIVE_DEFINITE; ((PC_Factor*)icc)->info.shiftamount = 100.0*PETSC_MACHINE_EPSILON; ((PC_Factor*)icc)->info.zeropivot = 100.0*PETSC_MACHINE_EPSILON; pc->data = (void*)icc; pc->ops->apply = PCApply_ICC; pc->ops->applytranspose = PCApply_ICC; pc->ops->setup = PCSetup_ICC; pc->ops->reset = PCReset_ICC; pc->ops->destroy = PCDestroy_ICC; pc->ops->setfromoptions = PCSetFromOptions_ICC; pc->ops->view = PCView_ICC; pc->ops->getfactoredmatrix = PCFactorGetMatrix_Factor; pc->ops->applysymmetricleft = PCApplySymmetricLeft_ICC; pc->ops->applysymmetricright = PCApplySymmetricRight_ICC; ierr = PetscObjectComposeFunction((PetscObject)pc,"PCFactorSetUpMatSolverPackage_C",PCFactorSetUpMatSolverPackage_Factor);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)pc,"PCFactorGetMatSolverPackage_C",PCFactorGetMatSolverPackage_Factor);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)pc,"PCFactorSetZeroPivot_C",PCFactorSetZeroPivot_Factor);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)pc,"PCFactorSetShiftType_C",PCFactorSetShiftType_Factor);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)pc,"PCFactorSetShiftAmount_C",PCFactorSetShiftAmount_Factor);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)pc,"PCFactorSetLevels_C",PCFactorSetLevels_Factor);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)pc,"PCFactorSetFill_C",PCFactorSetFill_Factor);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)pc,"PCFactorSetMatOrderingType_C",PCFactorSetMatOrderingType_Factor);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)pc,"PCFactorSetMatSolverPackage_C",PCFactorSetMatSolverPackage_Factor);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)pc,"PCFactorSetDropTolerance_C",PCFactorSetDropTolerance_ILU);CHKERRQ(ierr); PetscFunctionReturn(0); }
PETSC_EXTERN PetscErrorCode SNESCreate_NCG(SNES snes) { PetscErrorCode ierr; SNES_NCG * neP; PetscFunctionBegin; snes->ops->destroy = SNESDestroy_NCG; snes->ops->setup = SNESSetUp_NCG; snes->ops->setfromoptions = SNESSetFromOptions_NCG; snes->ops->view = SNESView_NCG; snes->ops->solve = SNESSolve_NCG; snes->ops->reset = SNESReset_NCG; snes->usesksp = PETSC_FALSE; snes->usespc = PETSC_TRUE; snes->pcside = PC_LEFT; if (!snes->tolerancesset) { snes->max_funcs = 30000; snes->max_its = 10000; snes->stol = 1e-20; } ierr = PetscNewLog(snes,&neP);CHKERRQ(ierr); snes->data = (void*) neP; neP->monitor = NULL; neP->type = SNES_NCG_PRP; ierr = PetscObjectComposeFunction((PetscObject)snes,"SNESNCGSetType_C", SNESNCGSetType_NCG);CHKERRQ(ierr); PetscFunctionReturn(0); }
PETSC_EXTERN PetscErrorCode MatCreate_HYPRESStruct(Mat B) { Mat_HYPRESStruct *ex; PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscNewLog(B,&ex);CHKERRQ(ierr); B->data = (void*)ex; B->rmap->bs = 1; B->assembled = PETSC_FALSE; B->insertmode = NOT_SET_VALUES; B->ops->assemblyend = MatAssemblyEnd_HYPRESStruct; B->ops->mult = MatMult_HYPRESStruct; B->ops->zeroentries = MatZeroEntries_HYPRESStruct; B->ops->destroy = MatDestroy_HYPRESStruct; ex->needsinitialization = PETSC_TRUE; ierr = MPI_Comm_dup(PetscObjectComm((PetscObject)B),&(ex->hcomm));CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)B,"MatSetupDM_C",MatSetupDM_HYPRESStruct);CHKERRQ(ierr); ierr = PetscObjectChangeTypeName((PetscObject)B,MATHYPRESSTRUCT);CHKERRQ(ierr); PetscFunctionReturn(0); }
PETSC_EXTERN PetscErrorCode MatGetFactor_seqsbaij_sbstrm(Mat A,MatFactorType ftype,Mat *F) { Mat B; PetscInt bs = A->rmap->bs; Mat_SeqSBSTRM *sbstrm; PetscErrorCode ierr; PetscFunctionBegin; if (A->cmap->N != A->rmap->N) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Must be square matrix, rows %D columns %D",A->rmap->n,A->cmap->n); ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr); ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,PETSC_DETERMINE,PETSC_DETERMINE);CHKERRQ(ierr); ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr); ierr = MatSeqSBAIJSetPreallocation_SeqSBAIJ(B,bs,MAT_SKIP_ALLOCATION,NULL);CHKERRQ(ierr); B->ops->iccfactorsymbolic = MatICCFactorSymbolic_sbstrm; B->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_sbstrm; B->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_sbstrm; B->ops->destroy = MatDestroy_SeqSBSTRM; B->factortype = ftype; B->assembled = PETSC_TRUE; /* required by -ksp_view */ B->preallocated = PETSC_TRUE; ierr = PetscNewLog(B,&sbstrm);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)B,"MatFactorGetSolverPackage_C",MatFactorGetSolverPackage_seqsbaij_sbstrm);CHKERRQ(ierr); B->spptr = sbstrm; *F = B; PetscFunctionReturn(0); }
PetscErrorCode KSPDestroy_Chebyshev(KSP ksp) { KSP_Chebyshev *cheb = (KSP_Chebyshev*)ksp->data; PetscErrorCode ierr; PetscFunctionBegin; ierr = KSPDestroy(&cheb->kspest);CHKERRQ(ierr); ierr = PCDestroy(&cheb->pcnone);CHKERRQ(ierr); ierr = PetscRandomDestroy(&cheb->random);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)ksp,"KSPChebyshevSetEigenvalues_C",NULL);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)ksp,"KSPChebyshevSetEstimateEigenvalues_C",NULL);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)ksp,"KSPChebyshevEstEigSetRandom_C",NULL);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)ksp,"KSPChebyshevSetNewMatrix_C",NULL);CHKERRQ(ierr); ierr = KSPDestroyDefault(ksp);CHKERRQ(ierr); PetscFunctionReturn(0); }
PETSC_EXTERN PetscErrorCode MatGetFactor_seqaij_lusol(Mat A,MatFactorType ftype,Mat *F) { Mat B; Mat_LUSOL *lusol; PetscErrorCode ierr; int m, n; PetscFunctionBegin; ierr = MatGetSize(A, &m, &n);CHKERRQ(ierr); ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr); ierr = MatSetSizes(B,PETSC_DECIDE,PETSC_DECIDE,m,n);CHKERRQ(ierr); ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr); ierr = MatSeqAIJSetPreallocation(B,0,NULL);CHKERRQ(ierr); ierr = PetscNewLog(B,&lusol);CHKERRQ(ierr); B->spptr = lusol; B->ops->lufactorsymbolic = MatLUFactorSymbolic_LUSOL; B->ops->destroy = MatDestroy_LUSOL; ierr = PetscObjectComposeFunction((PetscObject)B,"MatFactorGetSolverType_C",MatFactorGetSolverType_seqaij_lusol);CHKERRQ(ierr); B->factortype = MAT_FACTOR_LU; ierr = PetscFree(B->solvertype);CHKERRQ(ierr); ierr = PetscStrallocpy(MATSOLVERLUSOL,&B->solvertype);CHKERRQ(ierr); PetscFunctionReturn(0); }
PETSC_EXTERN PetscErrorCode SNESCreate_MS(SNES snes) { PetscErrorCode ierr; SNES_MS *ms; PetscFunctionBegin; ierr = SNESMSInitializePackage();CHKERRQ(ierr); snes->ops->setup = SNESSetUp_MS; snes->ops->solve = SNESSolve_MS; snes->ops->destroy = SNESDestroy_MS; snes->ops->setfromoptions = SNESSetFromOptions_MS; snes->ops->view = SNESView_MS; snes->ops->reset = SNESReset_MS; snes->usespc = PETSC_FALSE; snes->usesksp = PETSC_TRUE; ierr = PetscNewLog(snes,&ms);CHKERRQ(ierr); snes->data = (void*)ms; ms->damping = 0.9; ms->norms = PETSC_FALSE; ierr = PetscObjectComposeFunction((PetscObject)snes,"SNESMSSetType_C",SNESMSSetType_MS);CHKERRQ(ierr); PetscFunctionReturn(0); }
/* MatConvert_SeqAIJ_SeqAIJPERM converts a SeqAIJ matrix into a * SeqAIJPERM matrix. This routine is called by the MatCreate_SeqAIJPERM() * routine, but can also be used to convert an assembled SeqAIJ matrix * into a SeqAIJPERM one. */ PETSC_INTERN PetscErrorCode MatConvert_SeqAIJ_SeqAIJPERM(Mat A,MatType type,MatReuse reuse,Mat *newmat) { PetscErrorCode ierr; Mat B = *newmat; Mat_SeqAIJPERM *aijperm; PetscFunctionBegin; if (reuse == MAT_INITIAL_MATRIX) { ierr = MatDuplicate(A,MAT_COPY_VALUES,&B);CHKERRQ(ierr); } ierr = PetscNewLog(B,&aijperm);CHKERRQ(ierr); B->spptr = (void*) aijperm; /* Set function pointers for methods that we inherit from AIJ but override. */ B->ops->duplicate = MatDuplicate_SeqAIJPERM; B->ops->assemblyend = MatAssemblyEnd_SeqAIJPERM; B->ops->destroy = MatDestroy_SeqAIJPERM; B->ops->mult = MatMult_SeqAIJPERM; B->ops->multadd = MatMultAdd_SeqAIJPERM; /* If A has already been assembled, compute the permutation. */ if (A->assembled) { ierr = MatSeqAIJPERM_create_perm(B);CHKERRQ(ierr); } ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqaijperm_seqaij_C",MatConvert_SeqAIJPERM_SeqAIJ);CHKERRQ(ierr); ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQAIJPERM);CHKERRQ(ierr); *newmat = B; PetscFunctionReturn(0); }
PETSC_EXTERN PetscErrorCode MatConvert_MPISBAIJ_MPISBSTRM(Mat A,MatType type,MatReuse reuse,Mat *newmat) { PetscErrorCode ierr; Mat B = *newmat; Mat_SeqSBSTRM *sbstrm; PetscFunctionBegin; if (reuse == MAT_INITIAL_MATRIX) { ierr = MatDuplicate(A,MAT_COPY_VALUES,&B);CHKERRQ(ierr); } /* printf(" --- in MatConvert_MPISBAIJ_MPISBSTRM -- 1 \n"); */ ierr = PetscNewLog(B, Mat_SeqSBSTRM,&sbstrm);CHKERRQ(ierr); B->spptr = (void*)sbstrm; /* Set function pointers for methods that we inherit from AIJ but override. B->ops->duplicate = MatDuplicate_SBSTRM; B->ops->mult = MatMult_SBSTRM; B->ops->destroy = MatDestroy_MPISBSTRM; */ B->ops->assemblyend = MatAssemblyEnd_MPISBSTRM; /* If A has already been assembled, compute the permutation. */ if (A->assembled) { ierr = MPISBSTRM_create_sbstrm(B);CHKERRQ(ierr); } ierr = PetscObjectChangeTypeName((PetscObject) B, MATMPISBSTRM);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)B,"MatMPISBAIJSetPreallocation_C",MatMPISBAIJSetPreallocation_MPISBSTRM);CHKERRQ(ierr); *newmat = B; PetscFunctionReturn(0); }
PetscErrorCode MatDestroy_MPIAdj(Mat mat) { Mat_MPIAdj *a = (Mat_MPIAdj*)mat->data; PetscErrorCode ierr; PetscFunctionBegin; #if defined(PETSC_USE_LOG) PetscLogObjectState((PetscObject)mat,"Rows=%D, Cols=%D, NZ=%D",mat->rmap->n,mat->cmap->n,a->nz); #endif ierr = PetscFree(a->diag);CHKERRQ(ierr); if (a->freeaij) { if (a->freeaijwithfree) { if (a->i) free(a->i); if (a->j) free(a->j); } else { ierr = PetscFree(a->i);CHKERRQ(ierr); ierr = PetscFree(a->j);CHKERRQ(ierr); ierr = PetscFree(a->values);CHKERRQ(ierr); } } ierr = PetscFree(a);CHKERRQ(ierr); ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMPIAdjSetPreallocation_C","",PETSC_NULL);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode PCCreateGAMG_Classical(PC pc) { PetscErrorCode ierr; PC_MG *mg = (PC_MG*)pc->data; PC_GAMG *pc_gamg = (PC_GAMG*)mg->innerctx; PC_GAMG_Classical *pc_gamg_classical; PetscFunctionBegin; ierr = PCGAMGClassicalInitializePackage(); if (pc_gamg->subctx) { /* call base class */ ierr = PCDestroy_GAMG(pc);CHKERRQ(ierr); } /* create sub context for SA */ ierr = PetscNewLog(pc,&pc_gamg_classical);CHKERRQ(ierr); pc_gamg->subctx = pc_gamg_classical; pc->ops->setfromoptions = PCGAMGSetFromOptions_Classical; /* reset does not do anything; setup not virtual */ /* set internal function pointers */ pc_gamg->ops->destroy = PCGAMGDestroy_Classical; pc_gamg->ops->graph = PCGAMGGraph_Classical; pc_gamg->ops->coarsen = PCGAMGCoarsen_Classical; pc_gamg->ops->prolongator = PCGAMGProlongator_Classical; pc_gamg->ops->optprol = PCGAMGOptProl_Classical_Jacobi; pc_gamg->ops->setfromoptions = PCGAMGSetFromOptions_Classical; pc_gamg->ops->createdefaultdata = PCGAMGSetData_Classical; pc_gamg_classical->interp_threshold = 0.2; pc_gamg_classical->nsmooths = 0; ierr = PetscObjectComposeFunction((PetscObject)pc,"PCGAMGClassicalSetType_C",PCGAMGClassicalSetType_GAMG);CHKERRQ(ierr); ierr = PCGAMGClassicalSetType(pc,PCGAMGCLASSICALSTANDARD);CHKERRQ(ierr); PetscFunctionReturn(0); }
PETSC_EXTERN PetscErrorCode MatGetFactor_seqaij_matlab(Mat A,MatFactorType ftype,Mat *F) { PetscErrorCode ierr; PetscFunctionBegin; if (A->cmap->N != A->rmap->N) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"matrix must be square"); ierr = MatCreate(PetscObjectComm((PetscObject)A),F); CHKERRQ(ierr); ierr = MatSetSizes(*F,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n); CHKERRQ(ierr); ierr = PetscStrallocpy("matlab",&((PetscObject)*F)->type_name); CHKERRQ(ierr); ierr = MatSetUp(*F); CHKERRQ(ierr); (*F)->ops->destroy = MatDestroy_matlab; (*F)->ops->getinfo = MatGetInfo_External; (*F)->ops->lufactorsymbolic = MatLUFactorSymbolic_Matlab; (*F)->ops->ilufactorsymbolic = MatLUFactorSymbolic_Matlab; ierr = PetscObjectComposeFunction((PetscObject)(*F),"MatFactorGetSolverPackage_C",MatFactorGetSolverPackage_seqaij_matlab); CHKERRQ(ierr); (*F)->factortype = ftype; ierr = PetscFree((*F)->solvertype); CHKERRQ(ierr); ierr = PetscStrallocpy(MATSOLVERMATLAB,&(*F)->solvertype); CHKERRQ(ierr); PetscFunctionReturn(0); }
PETSC_EXTERN PetscErrorCode MatCreate_MPIAdj(Mat B) { Mat_MPIAdj *b; PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscNewLog(B,&b);CHKERRQ(ierr); B->data = (void*)b; ierr = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr); B->assembled = PETSC_FALSE; ierr = PetscObjectComposeFunction((PetscObject)B,"MatMPIAdjSetPreallocation_C",MatMPIAdjSetPreallocation_MPIAdj);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)B,"MatMPIAdjCreateNonemptySubcommMat_C",MatMPIAdjCreateNonemptySubcommMat_MPIAdj);CHKERRQ(ierr); ierr = PetscObjectChangeTypeName((PetscObject)B,MATMPIADJ);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@ MatCreateTranspose - Creates a new matrix object that behaves like A' Collective on Mat Input Parameter: . A - the (possibly rectangular) matrix Output Parameter: . N - the matrix that represents A' Level: intermediate Notes: The transpose A' is NOT actually formed! Rather the new matrix object performs the matrix-vector product by using the MatMultTranspose() on the original matrix .seealso: MatCreateNormal(), MatMult(), MatMultTranspose(), MatCreate() @*/ PetscErrorCode MatCreateTranspose(Mat A,Mat *N) { PetscErrorCode ierr; PetscInt m,n; Mat_Transpose *Na; PetscFunctionBegin; ierr = MatGetLocalSize(A,&m,&n);CHKERRQ(ierr); ierr = MatCreate(PetscObjectComm((PetscObject)A),N);CHKERRQ(ierr); ierr = MatSetSizes(*N,n,m,PETSC_DECIDE,PETSC_DECIDE);CHKERRQ(ierr); ierr = PetscLayoutSetUp((*N)->rmap);CHKERRQ(ierr); ierr = PetscLayoutSetUp((*N)->cmap);CHKERRQ(ierr); ierr = PetscObjectChangeTypeName((PetscObject)*N,MATTRANSPOSEMAT);CHKERRQ(ierr); ierr = PetscNewLog(*N,&Na);CHKERRQ(ierr); (*N)->data = (void*) Na; ierr = PetscObjectReference((PetscObject)A);CHKERRQ(ierr); Na->A = A; (*N)->ops->destroy = MatDestroy_Transpose; (*N)->ops->mult = MatMult_Transpose; (*N)->ops->multadd = MatMultAdd_Transpose; (*N)->ops->multtranspose = MatMultTranspose_Transpose; (*N)->ops->multtransposeadd = MatMultTransposeAdd_Transpose; (*N)->ops->duplicate = MatDuplicate_Transpose; (*N)->ops->getvecs = MatCreateVecs_Transpose; (*N)->ops->axpy = MatAXPY_Transpose; (*N)->assembled = PETSC_TRUE; ierr = PetscObjectComposeFunction((PetscObject)(*N),"MatTransposeGetMat_C",MatTransposeGetMat_Transpose);CHKERRQ(ierr); ierr = MatSetBlockSizes(*N,PetscAbs(A->cmap->bs),PetscAbs(A->rmap->bs));CHKERRQ(ierr); ierr = MatSetUp(*N);CHKERRQ(ierr); PetscFunctionReturn(0); }
PETSC_EXTERN PetscErrorCode MatGetFactor_seqaij_essl(Mat A,MatFactorType ftype,Mat *F) { Mat B; PetscErrorCode ierr; Mat_Essl *essl; PetscFunctionBegin; if (A->cmap->N != A->rmap->N) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"matrix must be square"); ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr); ierr = MatSetSizes(B,PETSC_DECIDE,PETSC_DECIDE,A->rmap->n,A->cmap->n);CHKERRQ(ierr); ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr); ierr = MatSeqAIJSetPreallocation(B,0,NULL);CHKERRQ(ierr); ierr = PetscNewLog(B,&essl);CHKERRQ(ierr); B->spptr = essl; B->ops->lufactorsymbolic = MatLUFactorSymbolic_Essl; ierr = PetscObjectComposeFunction((PetscObject)B,"MatFactorGetSolverPackage_C",MatFactorGetSolverPackage_essl);CHKERRQ(ierr); B->factortype = MAT_FACTOR_LU; ierr = PetscFree(B->solvertype);CHKERRQ(ierr); ierr = PetscStrallocpy(MATSOLVERESSL,&B->solvertype);CHKERRQ(ierr); *F = B; PetscFunctionReturn(0); }
PETSC_EXTERN PetscErrorCode MatGetFactor_seqsbaij_pastix(Mat A,MatFactorType ftype,Mat *F) { Mat B; PetscErrorCode ierr; Mat_Pastix *pastix; PetscFunctionBegin; if (ftype != MAT_FACTOR_CHOLESKY) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot use PETSc SBAIJ matrices with PaStiX LU, use AIJ matrix"); /* Create the factorization matrix */ ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr); ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr); ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr); ierr = MatSeqSBAIJSetPreallocation(B,1,0,NULL);CHKERRQ(ierr); ierr = MatMPISBAIJSetPreallocation(B,1,0,NULL,0,NULL);CHKERRQ(ierr); B->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SBAIJPASTIX; B->ops->view = MatView_PaStiX; ierr = PetscObjectComposeFunction((PetscObject)B,"MatFactorGetSolverPackage_C",MatFactorGetSolverPackage_pastix);CHKERRQ(ierr); B->factortype = MAT_FACTOR_CHOLESKY; ierr = PetscNewLog(B,&pastix);CHKERRQ(ierr); pastix->CleanUpPastix = PETSC_FALSE; pastix->isAIJ = PETSC_TRUE; pastix->scat_rhs = NULL; pastix->scat_sol = NULL; pastix->Destroy = B->ops->destroy; B->ops->destroy = MatDestroy_Pastix; B->spptr = (void*)pastix; *F = B; PetscFunctionReturn(0); }
PETSC_EXTERN PetscErrorCode MatCreate_Preallocator(Mat A) { Mat_Preallocator *p; PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscNewLog(A, &p);CHKERRQ(ierr); A->data = (void *) p; p->ht = NULL; p->dnz = NULL; p->onz = NULL; /* matrix ops */ ierr = PetscMemzero(A->ops, sizeof(struct _MatOps));CHKERRQ(ierr); A->ops->destroy = MatDestroy_Preallocator; A->ops->setup = MatSetUp_Preallocator; A->ops->setvalues = MatSetValues_Preallocator; A->ops->assemblybegin = MatAssemblyBegin_Preallocator; A->ops->assemblyend = MatAssemblyEnd_Preallocator; A->ops->view = MatView_Preallocator; A->ops->setoption = MatSetOption_Preallocator; /* special MATPREALLOCATOR functions */ ierr = PetscObjectComposeFunction((PetscObject) A, "MatPreallocatorPreallocate_C", MatPreallocatorPreallocate_Preallocator);CHKERRQ(ierr); ierr = PetscObjectChangeTypeName((PetscObject) A, MATPREALLOCATOR);CHKERRQ(ierr); PetscFunctionReturn(0); }
PETSC_EXTERN PetscErrorCode MatGetFactor_seqsbaij_cholmod(Mat A,MatFactorType ftype,Mat *F) { Mat B; Mat_CHOLMOD *chol; PetscErrorCode ierr; PetscInt m=A->rmap->n,n=A->cmap->n,bs; PetscFunctionBegin; if (ftype != MAT_FACTOR_CHOLESKY) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_SUP,"CHOLMOD cannot do %s factorization with SBAIJ, only %s", MatFactorTypes[ftype],MatFactorTypes[MAT_FACTOR_CHOLESKY]); ierr = MatGetBlockSize(A,&bs);CHKERRQ(ierr); if (bs != 1) SETERRQ1(PetscObjectComm((PetscObject)A),PETSC_ERR_SUP,"CHOLMOD only supports block size=1, given %D",bs); /* Create the factorization matrix F */ ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr); ierr = MatSetSizes(B,PETSC_DECIDE,PETSC_DECIDE,m,n);CHKERRQ(ierr); ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr); ierr = MatSeqSBAIJSetPreallocation(B,1,0,NULL);CHKERRQ(ierr); ierr = PetscNewLog(B,&chol);CHKERRQ(ierr); chol->Wrap = MatWrapCholmod_seqsbaij; chol->Destroy = MatDestroy_SeqSBAIJ; B->spptr = chol; B->ops->view = MatView_CHOLMOD; B->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_CHOLMOD; B->ops->destroy = MatDestroy_CHOLMOD; ierr = PetscObjectComposeFunction((PetscObject)B,"MatFactorGetSolverPackage_C",MatFactorGetSolverPackage_seqsbaij_cholmod);CHKERRQ(ierr); B->factortype = MAT_FACTOR_CHOLESKY; B->assembled = PETSC_TRUE; /* required by -ksp_view */ B->preallocated = PETSC_TRUE; ierr = CholmodStart(B);CHKERRQ(ierr); *F = B; PetscFunctionReturn(0); }
PETSC_EXTERN PetscErrorCode PCCreate_Jacobi(PC pc) { PC_Jacobi *jac; PetscErrorCode ierr; PetscFunctionBegin; /* Creates the private data structure for this preconditioner and attach it to the PC object. */ ierr = PetscNewLog(pc,&jac);CHKERRQ(ierr); pc->data = (void*)jac; /* Initialize the pointers to vectors to ZERO; these will be used to store diagonal entries of the matrix for fast preconditioner application. */ jac->diag = 0; jac->diagsqrt = 0; jac->userowmax = PETSC_FALSE; jac->userowsum = PETSC_FALSE; jac->useabs = PETSC_FALSE; /* Set the pointers for the functions that are provided above. Now when the user-level routines (such as PCApply(), PCDestroy(), etc.) are called, they will automatically call these functions. Note we choose not to provide a couple of these functions since they are not needed. */ pc->ops->apply = PCApply_Jacobi; pc->ops->applytranspose = PCApply_Jacobi; pc->ops->setup = PCSetUp_Jacobi; pc->ops->reset = PCReset_Jacobi; pc->ops->destroy = PCDestroy_Jacobi; pc->ops->setfromoptions = PCSetFromOptions_Jacobi; pc->ops->view = 0; pc->ops->applyrichardson = 0; pc->ops->applysymmetricleft = PCApplySymmetricLeftOrRight_Jacobi; pc->ops->applysymmetricright = PCApplySymmetricLeftOrRight_Jacobi; ierr = PetscObjectComposeFunction((PetscObject)pc,"PCJacobiSetType_C",PCJacobiSetType_Jacobi);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)pc,"PCJacobiGetType_C",PCJacobiGetType_Jacobi);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)pc,"PCJacobiSetUseAbs_C",PCJacobiSetUseAbs_Jacobi);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)pc,"PCJacobiGetUseAbs_C",PCJacobiGetUseAbs_Jacobi);CHKERRQ(ierr); PetscFunctionReturn(0); }
PETSC_EXTERN PetscErrorCode MatGetFactor_aij_mkl_pardiso(Mat A,MatFactorType ftype,Mat *F) { Mat B; PetscErrorCode ierr; Mat_MKL_PARDISO *mat_mkl_pardiso; PetscBool isSeqAIJ; PetscFunctionBegin; /* Create the factorization matrix */ ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQAIJ,&isSeqAIJ); CHKERRQ(ierr); ierr = MatCreate(PetscObjectComm((PetscObject)A),&B); CHKERRQ(ierr); ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N); CHKERRQ(ierr); ierr = MatSetType(B,((PetscObject)A)->type_name); CHKERRQ(ierr); if (isSeqAIJ) { ierr = MatSeqAIJSetPreallocation(B,0,NULL); CHKERRQ(ierr); } else { SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Is not allowed other types of matrices apart from MATSEQAIJ."); } B->ops->lufactorsymbolic = MatLUFactorSymbolic_AIJMKL_PARDISO; B->ops->destroy = MatDestroy_MKL_PARDISO; B->ops->view = MatView_MKL_PARDISO; B->factortype = ftype; B->ops->getinfo = MatGetInfo_MKL_PARDISO; B->assembled = PETSC_TRUE; /* required by -ksp_view */ ierr = PetscNewLog(B,&mat_mkl_pardiso); CHKERRQ(ierr); B->spptr = mat_mkl_pardiso; ierr = PetscObjectComposeFunction((PetscObject)B,"MatFactorGetSolverPackage_C",MatFactorGetSolverPackage_mkl_pardiso); CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)B,"MatMkl_PardisoSetCntl_C",MatMkl_PardisoSetCntl_MKL_PARDISO); CHKERRQ(ierr); ierr = PetscInitializeMKL_PARDISO(A, mat_mkl_pardiso); CHKERRQ(ierr); *F = B; PetscFunctionReturn(0); }
static PetscErrorCode PCDestroy_GAMG_GEO(PC pc) { PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscObjectComposeFunction((PetscObject)pc,"PCSetCoordinates_C",NULL);CHKERRQ(ierr); PetscFunctionReturn(0); }
PETSC_EXTERN PetscErrorCode SNESCreate_QN(SNES snes) { PetscErrorCode ierr; SNES_QN *qn; PetscFunctionBegin; snes->ops->setup = SNESSetUp_QN; snes->ops->solve = SNESSolve_QN; snes->ops->destroy = SNESDestroy_QN; snes->ops->setfromoptions = SNESSetFromOptions_QN; snes->ops->view = SNESView_QN; snes->ops->reset = SNESReset_QN; snes->pcside = PC_LEFT; snes->usespc = PETSC_TRUE; snes->usesksp = PETSC_FALSE; snes->alwayscomputesfinalresidual = PETSC_TRUE; if (!snes->tolerancesset) { snes->max_funcs = 30000; snes->max_its = 10000; } ierr = PetscNewLog(snes,&qn);CHKERRQ(ierr); snes->data = (void*) qn; qn->m = 10; qn->scaling = 1.0; qn->U = NULL; qn->V = NULL; qn->dXtdF = NULL; qn->dFtdX = NULL; qn->dXdFmat = NULL; qn->monitor = NULL; qn->singlereduction = PETSC_TRUE; qn->powell_gamma = 0.9999; qn->scale_type = SNES_QN_SCALE_DEFAULT; qn->restart_type = SNES_QN_RESTART_DEFAULT; qn->type = SNES_QN_LBFGS; ierr = PetscObjectComposeFunction((PetscObject)snes,"SNESQNSetScaleType_C",SNESQNSetScaleType_QN);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)snes,"SNESQNSetRestartType_C",SNESQNSetRestartType_QN);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)snes,"SNESQNSetType_C",SNESQNSetType_QN);CHKERRQ(ierr); PetscFunctionReturn(0); }
PETSC_EXTERN PetscErrorCode MatCreate_IS(Mat A) { PetscErrorCode ierr; Mat_IS *b; PetscFunctionBegin; ierr = PetscNewLog(A,&b);CHKERRQ(ierr); A->data = (void*)b; ierr = PetscMemzero(A->ops,sizeof(struct _MatOps));CHKERRQ(ierr); A->ops->mult = MatMult_IS; A->ops->multadd = MatMultAdd_IS; A->ops->multtranspose = MatMultTranspose_IS; A->ops->multtransposeadd = MatMultTransposeAdd_IS; A->ops->destroy = MatDestroy_IS; A->ops->setlocaltoglobalmapping = MatSetLocalToGlobalMapping_IS; A->ops->setvalues = MatSetValues_IS; A->ops->setvalueslocal = MatSetValuesLocal_IS; A->ops->setvaluesblockedlocal = MatSetValuesBlockedLocal_IS; A->ops->zerorows = MatZeroRows_IS; A->ops->zerorowslocal = MatZeroRowsLocal_IS; A->ops->assemblybegin = MatAssemblyBegin_IS; A->ops->assemblyend = MatAssemblyEnd_IS; A->ops->view = MatView_IS; A->ops->zeroentries = MatZeroEntries_IS; A->ops->scale = MatScale_IS; A->ops->getdiagonal = MatGetDiagonal_IS; A->ops->setoption = MatSetOption_IS; A->ops->ishermitian = MatIsHermitian_IS; A->ops->issymmetric = MatIsSymmetric_IS; A->ops->duplicate = MatDuplicate_IS; ierr = PetscLayoutSetUp(A->rmap);CHKERRQ(ierr); ierr = PetscLayoutSetUp(A->cmap);CHKERRQ(ierr); b->A = 0; b->ctx = 0; b->x = 0; b->y = 0; b->mapping = 0; ierr = PetscObjectComposeFunction((PetscObject)A,"MatISGetLocalMat_C",MatISGetLocalMat_IS);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)A,"MatISSetLocalMat_C",MatISSetLocalMat_IS);CHKERRQ(ierr); ierr = PetscObjectChangeTypeName((PetscObject)A,MATIS);CHKERRQ(ierr); PetscFunctionReturn(0); }
PETSC_EXTERN PetscErrorCode PetscViewerCreate_Binary(PetscViewer v) { PetscErrorCode ierr; PetscViewer_Binary *vbinary; #if defined(PETSC_HAVE_MPIIO) PetscBool useMPIIO = PETSC_FALSE; #endif PetscFunctionBegin; ierr = PetscNewLog(v,&vbinary);CHKERRQ(ierr); v->data = (void*)vbinary; v->ops->destroy = PetscViewerDestroy_Binary; v->ops->view = PetscViewerView_Binary; v->ops->flush = 0; vbinary->fdes_info = 0; vbinary->fdes = 0; vbinary->skipinfo = PETSC_FALSE; vbinary->skipoptions = PETSC_TRUE; vbinary->skipheader = PETSC_FALSE; v->ops->getsingleton = PetscViewerGetSingleton_Binary; v->ops->restoresingleton = PetscViewerRestoreSingleton_Binary; vbinary->btype = (PetscFileMode) -1; vbinary->storecompressed = PETSC_FALSE; vbinary->filename = 0; vbinary->flowcontrol = 256; /* seems a good number for Cray XT-5 */ ierr = PetscObjectComposeFunction((PetscObject)v,"PetscViewerBinaryGetFlowControl_C",PetscViewerBinaryGetFlowControl_Binary);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)v,"PetscViewerBinarySetFlowControl_C",PetscViewerBinarySetFlowControl_Binary);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)v,"PetscViewerBinarySetSkipHeader_C",PetscViewerBinarySetSkipHeader_Binary);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)v,"PetscViewerBinaryGetSkipHeader_C",PetscViewerBinaryGetSkipHeader_Binary);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)v,"PetscViewerBinaryGetInfoPointer_C",PetscViewerBinaryGetInfoPointer_Binary);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)v,"PetscViewerFileSetName_C",PetscViewerFileSetName_Binary);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)v,"PetscViewerFileSetMode_C",PetscViewerFileSetMode_Binary);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)v,"PetscViewerFileGetMode_C",PetscViewerFileGetMode_Binary);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)v,"PetscViewerFileGetName_C",PetscViewerFileGetName_Binary);CHKERRQ(ierr); #if defined(PETSC_HAVE_MPIIO) ierr = PetscObjectComposeFunction((PetscObject)v,"PetscViewerBinarySetMPIIO_C",PetscViewerBinarySetMPIIO_Binary);CHKERRQ(ierr); ierr = PetscOptionsGetBool(NULL,"-viewer_binary_mpiio",&useMPIIO,NULL);CHKERRQ(ierr); if (useMPIIO) { ierr = PetscViewerBinarySetMPIIO(v);CHKERRQ(ierr); } #endif PetscFunctionReturn(0); }
/*@C VecCreateNest - Creates a new vector containing several nested subvectors, each stored separately Collective on Vec Input Parameter: + comm - Communicator for the new Vec . nb - number of nested blocks . is - array of nb index sets describing each nested block, or NULL to pack subvectors contiguously - x - array of nb sub-vectors Output Parameter: . Y - new vector Level: advanced .seealso: VecCreate(), MatCreateNest(), DMSetVecType(), VECNEST @*/ PetscErrorCode VecCreateNest(MPI_Comm comm,PetscInt nb,IS is[],Vec x[],Vec *Y) { Vec V; Vec_Nest *s; PetscInt n,N; PetscErrorCode ierr; PetscFunctionBegin; ierr = VecCreate(comm,&V);CHKERRQ(ierr); ierr = PetscObjectChangeTypeName((PetscObject)V,VECNEST);CHKERRQ(ierr); /* allocate and set pointer for implememtation data */ ierr = PetscMalloc(sizeof(Vec_Nest),&s);CHKERRQ(ierr); ierr = PetscMemzero(s,sizeof(Vec_Nest));CHKERRQ(ierr); V->data = (void*)s; s->setup_called = PETSC_FALSE; s->nb = -1; s->v = NULL; ierr = VecSetUp_Nest_Private(V,nb,x);CHKERRQ(ierr); n = N = 0; ierr = VecSize_Nest_Recursive(V,PETSC_TRUE,&N);CHKERRQ(ierr); ierr = VecSize_Nest_Recursive(V,PETSC_FALSE,&n);CHKERRQ(ierr); ierr = PetscLayoutSetSize(V->map,N);CHKERRQ(ierr); ierr = PetscLayoutSetLocalSize(V->map,n);CHKERRQ(ierr); ierr = PetscLayoutSetBlockSize(V->map,1);CHKERRQ(ierr); ierr = PetscLayoutSetUp(V->map);CHKERRQ(ierr); ierr = VecSetUp_NestIS_Private(V,nb,is);CHKERRQ(ierr); ierr = VecNestSetOps_Private(V->ops);CHKERRQ(ierr); V->petscnative = PETSC_FALSE; /* expose block api's */ ierr = PetscObjectComposeFunction((PetscObject)V,"VecNestGetSubVec_C",VecNestGetSubVec_Nest);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)V,"VecNestGetSubVecs_C",VecNestGetSubVecs_Nest);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)V,"VecNestSetSubVec_C",VecNestSetSubVec_Nest);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)V,"VecNestSetSubVecs_C",VecNestSetSubVecs_Nest);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)V,"VecNestGetSize_C",VecNestGetSize_Nest);CHKERRQ(ierr); *Y = V; PetscFunctionReturn(0); }
PetscErrorCode ISDestroy_Stride(IS is) { PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscObjectComposeFunction((PetscObject)is,"ISStrideSetStride_C",0);CHKERRQ(ierr); ierr = PetscFree(is->data);CHKERRQ(ierr); PetscFunctionReturn(0); }