本文整理汇总了C++中DMSetFromOptions函数的典型用法代码示例。如果您正苦于以下问题:C++ DMSetFromOptions函数的具体用法?C++ DMSetFromOptions怎么用?C++ DMSetFromOptions使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了DMSetFromOptions函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: DMCreateLibMesh
void PetscDMNonlinearSolver<T>::init()
{
PetscErrorCode ierr;
DM dm;
this->PetscNonlinearSolver<T>::init();
// Attaching a DM with the function and Jacobian callbacks to SNES.
ierr = DMCreateLibMesh(libMesh::COMM_WORLD, this->system(), &dm); CHKERRABORT(libMesh::COMM_WORLD, ierr);
ierr = DMSetFromOptions(dm); CHKERRABORT(libMesh::COMM_WORLD, ierr);
ierr = DMSetUp(dm); CHKERRABORT(libMesh::COMM_WORLD, ierr);
ierr = SNESSetDM(this->_snes, dm); CHKERRABORT(libMesh::COMM_WORLD, ierr);
// SNES now owns the reference to dm.
ierr = DMDestroy(&dm); CHKERRABORT(libMesh::COMM_WORLD, ierr);
KSP ksp;
ierr = SNESGetKSP (this->_snes, &ksp); CHKERRABORT(libMesh::COMM_WORLD,ierr);
// Set the tolerances for the iterative solver. Use the user-supplied
// tolerance for the relative residual & leave the others at default values
ierr = KSPSetTolerances (ksp, this->initial_linear_tolerance, PETSC_DEFAULT,PETSC_DEFAULT, this->max_linear_iterations); CHKERRABORT(libMesh::COMM_WORLD,ierr);
// Set the tolerances for the non-linear solver.
ierr = SNESSetTolerances(this->_snes,
this->absolute_residual_tolerance,
this->relative_residual_tolerance,
this->absolute_step_tolerance,
this->max_nonlinear_iterations,
this->max_function_evaluations);
CHKERRABORT(libMesh::COMM_WORLD,ierr);
//Pull in command-line options
KSPSetFromOptions(ksp);
SNESSetFromOptions(this->_snes);
}
示例2: CreateMesh
PetscErrorCode CreateMesh(MPI_Comm comm, AppCtx *user, DM *dm)
{
PetscInt dim = user->dim;
PetscBool interpolate = user->interpolate;
PetscReal refinementLimit = user->refinementLimit;
const char *partitioner = user->partitioner;
PetscErrorCode ierr;
PetscFunctionBeginUser;
ierr = PetscLogEventBegin(user->createMeshEvent,0,0,0,0);CHKERRQ(ierr);
ierr = DMPlexCreateBoxMesh(comm, dim, interpolate, dm);CHKERRQ(ierr);
{
DM refinedMesh = NULL;
DM distributedMesh = NULL;
/* Refine mesh using a volume constraint */
ierr = DMPlexSetRefinementLimit(*dm, refinementLimit);CHKERRQ(ierr);
ierr = DMRefine(*dm, comm, &refinedMesh);CHKERRQ(ierr);
if (refinedMesh) {
ierr = DMDestroy(dm);CHKERRQ(ierr);
*dm = refinedMesh;
}
/* Distribute mesh over processes */
ierr = DMPlexDistribute(*dm, partitioner, 0, &distributedMesh);CHKERRQ(ierr);
if (distributedMesh) {
ierr = DMDestroy(dm);CHKERRQ(ierr);
*dm = distributedMesh;
}
}
ierr = DMSetFromOptions(*dm);CHKERRQ(ierr);
ierr = PetscLogEventEnd(user->createMeshEvent,0,0,0,0);CHKERRQ(ierr);
user->dm = *dm;
PetscFunctionReturn(0);
}
示例3: main
int main(int argc, char **argv)
{
DM dm;
char typeString[256] = {'\0'};
PetscViewer viewer = NULL;
PetscBool flg;
PetscErrorCode ierr;
ierr = PetscInitialize(&argc, &argv, NULL,help);if (ierr) return ierr;
ierr = DMCreate(PETSC_COMM_WORLD, &dm);CHKERRQ(ierr);
ierr = PetscStrncpy(typeString,DMFOREST,256);CHKERRQ(ierr);
ierr = PetscOptionsBegin(PETSC_COMM_WORLD,NULL,"DM Forest example options",NULL);CHKERRQ(ierr);
ierr = PetscOptionsString("-dm_type","The type of the dm",NULL,DMFOREST,typeString,sizeof(typeString),NULL);CHKERRQ(ierr);
ierr = PetscOptionsEnd();CHKERRQ(ierr);
ierr = DMSetType(dm,(DMType) typeString);CHKERRQ(ierr);
ierr = DMSetFromOptions(dm);CHKERRQ(ierr);
ierr = DMSetUp(dm);CHKERRQ(ierr);
ierr = PetscOptionsGetViewer(PETSC_COMM_WORLD,NULL,"-dm_view",&viewer,NULL,&flg);CHKERRQ(ierr);
if (flg) {
ierr = DMView(dm,viewer);CHKERRQ(ierr);
}
ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
ierr = DMDestroy(&dm);CHKERRQ(ierr);
ierr = PetscFinalize();
return ierr;
}
示例4: petscSetupDM
void petscSetupDM (NonlinearSystem & nl) {
#if !PETSC_VERSION_LESS_THAN(3,3,0)
PetscErrorCode ierr;
// Initialize the part of the DM package that's packaged with Moose; in the PETSc source tree this call would be in DMInitializePackage()
ierr = DMMooseRegisterAll();
CHKERRABORT(nl.comm().get(),ierr);
// Create and set up the DM that will consume the split options and deal with block matrices.
PetscNonlinearSolver<Number> *petsc_solver = dynamic_cast<PetscNonlinearSolver<Number> *>(nl.sys().nonlinear_solver.get());
SNES snes = petsc_solver->snes();
/* FIXME: reset the DM, do not recreate it anew every time? */
DM dm = PETSC_NULL;
ierr = DMCreateMoose(nl.comm().get(), nl, &dm);
CHKERRABORT(nl.comm().get(),ierr);
ierr = DMSetFromOptions(dm);
CHKERRABORT(nl.comm().get(),ierr);
ierr = DMSetUp(dm);
CHKERRABORT(nl.comm().get(),ierr);
ierr = SNESSetDM(snes,dm);
CHKERRABORT(nl.comm().get(),ierr);
ierr = DMDestroy(&dm);
CHKERRABORT(nl.comm().get(),ierr);
ierr = SNESSetUpdate(snes,SNESUpdateDMMoose);
CHKERRABORT(nl.comm().get(),ierr);
#endif
}
示例5: main
int main(int argc,char **argv)
{
DM dm;
Vec X,Y;
PetscErrorCode ierr;
PetscInt dof = 10;
ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr;
ierr = PetscOptionsGetInt(NULL,NULL,"-dof",&dof,NULL);CHKERRQ(ierr);
ierr = DMDACreate3d(PETSC_COMM_WORLD,DM_BOUNDARY_NONE,DM_BOUNDARY_NONE,DM_BOUNDARY_NONE,DMDA_STENCIL_STAR,-128,-128,-128,PETSC_DECIDE,PETSC_DECIDE,PETSC_DECIDE,dof,1,NULL,NULL,NULL,&dm);CHKERRQ(ierr);
ierr = DMSetFromOptions(dm);CHKERRQ(ierr);
ierr = DMSetUp(dm);CHKERRQ(ierr);
ierr = PetscMemoryTrace("DMDACreate3d ");CHKERRQ(ierr);
ierr = DMCreateGlobalVector(dm,&X);CHKERRQ(ierr);
ierr = PetscMemoryTrace("DMCreateGlobalVector");
ierr = DMCreateGlobalVector(dm,&Y);CHKERRQ(ierr);
ierr = PetscMemoryTrace("DMCreateGlobalVector");CHKERRQ(ierr);
ierr = VecDestroy(&X);CHKERRQ(ierr);
ierr = VecDestroy(&Y);CHKERRQ(ierr);
ierr = DMDestroy(&dm);CHKERRQ(ierr);
ierr = PetscFinalize();
return ierr;
}
示例6: main
int main(int argc, char **argv)
{
Mat A;
KSP ksp;
DM shell;
Vec *left, *right;
MPI_Comm c;
PetscErrorCode ierr;
ierr = PetscInitialize(&argc, &argv, NULL, NULL);if (ierr) return ierr;
c = PETSC_COMM_WORLD;
ierr = MatCreate(c, &A); CHKERRQ(ierr);
ierr = MatSetSizes(A, 1, 1, PETSC_DECIDE, PETSC_DECIDE); CHKERRQ(ierr);
ierr = MatSetFromOptions(A); CHKERRQ(ierr);
ierr = MatSetUp(A); CHKERRQ(ierr);
ierr = KSPCreate(c, &ksp); CHKERRQ(ierr);
ierr = KSPSetOperators(ksp, A, A); CHKERRQ(ierr);
ierr = KSPSetFromOptions(ksp); CHKERRQ(ierr);
ierr = DMShellCreate(c, &shell); CHKERRQ(ierr);
ierr = DMSetFromOptions(shell); CHKERRQ(ierr);
ierr = DMSetUp(shell); CHKERRQ(ierr);
ierr = KSPSetDM(ksp, shell); CHKERRQ(ierr);
ierr = KSPCreateVecs(ksp, 1, &right, 1, &left); CHKERRQ(ierr);
ierr = VecView(right[0], PETSC_VIEWER_STDOUT_(c));CHKERRQ(ierr);
ierr = VecDestroyVecs(1,&right); CHKERRQ(ierr);
ierr = VecDestroyVecs(1,&left); CHKERRQ(ierr);
ierr = DMDestroy(&shell); CHKERRQ(ierr);
ierr = KSPDestroy(&ksp); CHKERRQ(ierr);
ierr = MatDestroy(&A); CHKERRQ(ierr);
PetscFinalize();
return 0;
}
示例7: CreateMesh
PetscErrorCode CreateMesh(MPI_Comm comm, AppCtx *user, DM *dm)
{
const char *filename = user->filename;
PetscInt dim = user->dim;
size_t len;
PetscErrorCode ierr;
PetscFunctionBegin;
ierr = PetscStrlen(filename, &len);CHKERRQ(ierr);
if (!len) {ierr = DMPlexCreateBoxMesh(comm, dim, PETSC_TRUE, dm);CHKERRQ(ierr);}
else {ierr = DMPlexCreateFromFile(comm, filename, PETSC_TRUE, dm);CHKERRQ(ierr);}
ierr = DMViewFromOptions(*dm, NULL, "-orig_dm_view");CHKERRQ(ierr);
{
DM distributedMesh = NULL;
ierr = DMPlexDistribute(*dm, 0, NULL, &distributedMesh);CHKERRQ(ierr);
if (distributedMesh) {
ierr = DMDestroy(dm);CHKERRQ(ierr);
*dm = distributedMesh;
ierr = DMViewFromOptions(*dm, NULL, "-dist_dm_view");CHKERRQ(ierr);
}
}
ierr = DMSetFromOptions(*dm);CHKERRQ(ierr);
if (user->uninterpolate) {
DM udm = NULL;
ierr = DMPlexUninterpolate(*dm, &udm);CHKERRQ(ierr);
ierr = DMDestroy(dm);CHKERRQ(ierr);
*dm = udm;
ierr = DMViewFromOptions(*dm, NULL, "-un_dm_view");CHKERRQ(ierr);
}
ierr = PetscObjectSetName((PetscObject) *dm, "Test Mesh");CHKERRQ(ierr);
ierr = DMViewFromOptions(*dm, NULL, "-dm_view");CHKERRQ(ierr);
PetscFunctionReturn(0);
}
示例8: CreateMesh
static PetscErrorCode CreateMesh(MPI_Comm comm, AppCtx *ctx, DM *dm)
{
PetscInt dim = ctx->dim;
PetscBool cellSimplex = ctx->cellSimplex;
const char *filename = ctx->filename;
const PetscInt cells[3] = {1, 1, 1};
size_t len;
PetscMPIInt rank, size;
PetscErrorCode ierr;
PetscFunctionBegin;
ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr);
ierr = MPI_Comm_size(comm, &size);CHKERRQ(ierr);
ierr = PetscStrlen(filename, &len);CHKERRQ(ierr);
if (len) {ierr = DMPlexCreateFromFile(comm, filename, PETSC_TRUE, dm);CHKERRQ(ierr);}
else {ierr = DMPlexCreateBoxMesh(comm, dim, cellSimplex, cells, NULL, NULL, NULL, PETSC_TRUE, dm);CHKERRQ(ierr);}
{
DM distributedMesh = NULL;
PetscPartitioner part;
ierr = DMPlexGetPartitioner(*dm, &part);CHKERRQ(ierr);
ierr = PetscPartitionerSetFromOptions(part);CHKERRQ(ierr);
/* Distribute mesh over processes */
ierr = DMPlexDistribute(*dm, 0, NULL, &distributedMesh);CHKERRQ(ierr);
if (distributedMesh) {
ierr = DMDestroy(dm);CHKERRQ(ierr);
*dm = distributedMesh;
}
}
ierr = PetscObjectSetName((PetscObject) *dm, "Mesh");CHKERRQ(ierr);
ierr = DMSetFromOptions(*dm);CHKERRQ(ierr);
ierr = DMViewFromOptions(*dm, NULL, "-dm_view");CHKERRQ(ierr);
PetscFunctionReturn(0);
}
示例9: CreateMesh
PetscErrorCode CreateMesh(MPI_Comm comm, AppCtx *user, DM *dm)
{
PetscInt dim = user->dim;
PetscBool interpolate = user->interpolate;
PetscReal refinementLimit = user->refinementLimit;
PetscErrorCode ierr;
PetscFunctionBegin;
ierr = PetscLogEventBegin(user->createMeshEvent,0,0,0,0);CHKERRQ(ierr);
ierr = DMMeshCreateBoxMesh(comm, dim, interpolate, dm);CHKERRQ(ierr);
{
DM refinedMesh = PETSC_NULL;
/* Refine mesh using a volume constraint */
ierr = DMMeshRefine(*dm, refinementLimit, interpolate, &refinedMesh);CHKERRQ(ierr);
if (refinedMesh) {
ierr = DMDestroy(dm);CHKERRQ(ierr);
*dm = refinedMesh;
}
}
ierr = PetscObjectSetName((PetscObject) *dm, "Serial Mesh");CHKERRQ(ierr);
ierr = DMSetFromOptions(*dm);CHKERRQ(ierr);
ierr = PetscLogEventEnd(user->createMeshEvent,0,0,0,0);CHKERRQ(ierr);
user->dm = *dm;
PetscFunctionReturn(0);
}
示例10: CreateMesh
PetscErrorCode CreateMesh(MPI_Comm comm, AppCtx *user, DM *dm)
{
PetscInt dim = user->dim;
PetscBool refinementUniform = user->refinementUniform;
PetscBool cellSimplex = user->cellSimplex;
const char *partitioner = "chaco";
PetscMPIInt rank;
PetscErrorCode ierr;
PetscFunctionBegin;
ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr);
ierr = DMCreate(comm, dm);CHKERRQ(ierr);
ierr = DMSetType(*dm, DMPLEX);CHKERRQ(ierr);
ierr = DMPlexSetDimension(*dm, dim);CHKERRQ(ierr);
switch(dim) {
case 2:
if (cellSimplex) {
ierr = CreateSimplexHybrid_2D(comm, *dm);CHKERRQ(ierr);
} else {
SETERRQ(comm, PETSC_ERR_ARG_OUTOFRANGE, "Cannot make hybrid meshes for quadrilaterals");
}
break;
default:
SETERRQ1(comm, PETSC_ERR_ARG_OUTOFRANGE, "Cannot make hybrid meshes for dimension %d", dim);
}
{
DM refinedMesh = PETSC_NULL;
DM distributedMesh = PETSC_NULL;
/* Distribute mesh over processes */
ierr = DMPlexDistribute(*dm, partitioner, 0, &distributedMesh);CHKERRQ(ierr);
if (distributedMesh) {
PetscInt cMax = PETSC_DETERMINE, fMax = PETSC_DETERMINE;
/* Do not know how to preserve this after distribution */
if (rank) {
cMax = 1;
fMax = 11;
}
ierr = DMPlexSetHybridBounds(distributedMesh, cMax, PETSC_DETERMINE, fMax, PETSC_DETERMINE);CHKERRQ(ierr);
ierr = DMDestroy(dm);CHKERRQ(ierr);
*dm = distributedMesh;
}
if (refinementUniform) {
ierr = DMPlexSetRefinementUniform(*dm, refinementUniform);CHKERRQ(ierr);
ierr = DMRefine(*dm, comm, &refinedMesh);CHKERRQ(ierr);
if (refinedMesh) {
ierr = DMDestroy(dm);CHKERRQ(ierr);
*dm = refinedMesh;
}
}
}
ierr = PetscObjectSetName((PetscObject) *dm, "Hybrid Mesh");CHKERRQ(ierr);
ierr = DMSetFromOptions(*dm);CHKERRQ(ierr);
user->dm = *dm;
PetscFunctionReturn(0);
}
示例11: CreateTensorProductHybrid_2D
PetscErrorCode CreateTensorProductHybrid_2D(MPI_Comm comm, PetscInt testNum, DM *dm)
{
DM idm, hdm = NULL;
DMLabel faultLabel, hybridLabel;
PetscInt p;
PetscMPIInt rank;
PetscErrorCode ierr;
PetscFunctionBegin;
ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr);
if (!rank) {
PetscInt numPoints[2] = {6, 2};
PetscInt coneSize[8] = {4, 4, 0, 0, 0, 0, 0, 0};
PetscInt cones[8] = {2, 3, 4, 5, 3, 6, 7, 4,};
PetscInt coneOrientations[8] = {0, 0, 0, 0, 0, 0, 0, 0};
PetscScalar vertexCoords[12] = {-1.0, -0.5, 0.0, -0.5, 0.0, 0.5, -1.0, 0.5, 1.0, -0.5, 1.0, 0.5};
PetscInt faultPoints[2] = {3, 4};
ierr = DMPlexCreateFromDAG(*dm, 1, numPoints, coneSize, cones, coneOrientations, vertexCoords);CHKERRQ(ierr);
for(p = 0; p < 2; ++p) {ierr = DMSetLabelValue(*dm, "fault", faultPoints[p], 1);CHKERRQ(ierr);}
ierr = PetscObjectSetOptionsPrefix((PetscObject) *dm, "orig_");CHKERRQ(ierr);
ierr = DMSetFromOptions(*dm);CHKERRQ(ierr);
ierr = DMPlexInterpolate(*dm, &idm);CHKERRQ(ierr);
ierr = PetscObjectSetOptionsPrefix((PetscObject) idm, "in_");CHKERRQ(ierr);
ierr = DMSetFromOptions(idm);CHKERRQ(ierr);
ierr = DMViewFromOptions(idm, NULL, "-dm_view");CHKERRQ(ierr);
ierr = DMGetLabel(*dm, "fault", &faultLabel);CHKERRQ(ierr);
ierr = DMPlexCreateHybridMesh(idm, faultLabel, NULL, &hybridLabel, NULL, NULL, &hdm);CHKERRQ(ierr);
ierr = DMLabelDestroy(&hybridLabel);CHKERRQ(ierr);
} else {
PetscInt numPoints[3] = {0, 0, 0};
ierr = DMPlexCreateFromDAG(*dm, 1, numPoints, NULL, NULL, NULL, NULL);CHKERRQ(ierr);
ierr = DMPlexInterpolate(*dm, &idm);CHKERRQ(ierr);
ierr = DMViewFromOptions(idm, NULL, "-in_dm_view");CHKERRQ(ierr);
ierr = DMPlexCreateHybridMesh(idm, NULL, NULL, NULL, NULL, NULL, &hdm);CHKERRQ(ierr);
}
ierr = DMDestroy(&idm);CHKERRQ(ierr);
ierr = DMDestroy(dm);CHKERRQ(ierr);
*dm = hdm;
PetscFunctionReturn(0);
}
示例12: CreateMesh
static PetscErrorCode CreateMesh(MPI_Comm comm, AppCtx *user, DM *dm)
{
PetscErrorCode ierr;
PetscFunctionBeginUser;
/* Create box mesh */
ierr = DMPlexCreateBoxMesh(comm, user->dim, user->simplex, user->cells, NULL, NULL, NULL, PETSC_TRUE, dm);CHKERRQ(ierr);
/* Distribute mesh over processes */
{
DM dmDist = NULL;
PetscPartitioner part;
ierr = DMPlexGetPartitioner(*dm, &part);CHKERRQ(ierr);
ierr = PetscPartitionerSetFromOptions(part);CHKERRQ(ierr);
ierr = DMPlexDistribute(*dm, 0, NULL, &dmDist);CHKERRQ(ierr);
if (dmDist) {
ierr = DMDestroy(dm);CHKERRQ(ierr);
*dm = dmDist;
}
}
/* TODO: This should be pulled into the library */
{
char convType[256];
PetscBool flg;
ierr = PetscOptionsBegin(comm, "", "Mesh conversion options", "DMPLEX");CHKERRQ(ierr);
ierr = PetscOptionsFList("-dm_plex_convert_type","Convert DMPlex to another format","ex12",DMList,DMPLEX,convType,256,&flg);CHKERRQ(ierr);
ierr = PetscOptionsEnd();
if (flg) {
DM dmConv;
ierr = DMConvert(*dm,convType,&dmConv);CHKERRQ(ierr);
if (dmConv) {
ierr = DMDestroy(dm);CHKERRQ(ierr);
*dm = dmConv;
}
}
}
/* TODO: This should be pulled into the library */
ierr = DMLocalizeCoordinates(*dm);CHKERRQ(ierr);
ierr = PetscObjectSetName((PetscObject) *dm, "Mesh");CHKERRQ(ierr);
ierr = DMSetApplicationContext(*dm, user);CHKERRQ(ierr);
ierr = DMSetFromOptions(*dm);CHKERRQ(ierr);
ierr = DMViewFromOptions(*dm, NULL, "-dm_view");CHKERRQ(ierr);
/* TODO: Add a hierachical viewer */
if (user->spectral) {
PetscInt planeDir[2] = {0, 1};
PetscReal planeCoord[2] = {0., 1.};
ierr = CreateSpectralPlanes(*dm, 2, planeDir, planeCoord, user);CHKERRQ(ierr);
}
PetscFunctionReturn(0);
}
示例13: PETScExternalSolverCreate
PetscErrorCode
PETScExternalSolverCreate(MPI_Comm comm, TS * ts)
{
DM da;
PetscErrorCode ierr;
PetscFunctionBeginUser;
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Create distributed array (DMDA) to manage parallel grid and vectors
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
ierr = DMDACreate2d(comm,
DM_BOUNDARY_NONE,
DM_BOUNDARY_NONE,
DMDA_STENCIL_STAR,
11,
11,
PETSC_DECIDE,
PETSC_DECIDE,
1,
1,
NULL,
NULL,
&da);
CHKERRQ(ierr);
ierr = DMSetFromOptions(da);
CHKERRQ(ierr);
ierr = DMSetUp(da);
CHKERRQ(ierr);
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Create timestepping solver context
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
ierr = TSCreate(comm, ts);
CHKERRQ(ierr);
ierr = TSSetProblemType(*ts, TS_NONLINEAR);
CHKERRQ(ierr);
ierr = TSSetType(*ts, TSBEULER);
CHKERRQ(ierr);
ierr = TSSetDM(*ts, da);
CHKERRQ(ierr);
ierr = DMDestroy(&da);
CHKERRQ(ierr);
ierr = TSSetIFunction(*ts, NULL, FormIFunction, nullptr);
CHKERRQ(ierr);
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Set Jacobian evaluation routine
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
ierr = TSSetIJacobian(*ts, NULL, NULL, FormIJacobian, NULL);
CHKERRQ(ierr);
PetscFunctionReturn(0);
}
示例14: CreateMesh
static PetscErrorCode CreateMesh(MPI_Comm comm, AppCtx *user, DM *newdm)
{
PetscInt dim = user->dim;
PetscBool cellSimplex = user->cellSimplex;
PetscErrorCode ierr;
PetscFunctionBegin;
switch (dim) {
case 2:
if (cellSimplex) {
ierr = CreateSimplex_2D(comm, newdm);CHKERRQ(ierr);
} else {
ierr = CreateQuad_2D(comm, newdm);CHKERRQ(ierr);
}
break;
case 3:
if (cellSimplex) {
ierr = CreateSimplex_3D(comm, newdm);CHKERRQ(ierr);
} else {
ierr = CreateHex_3D(comm, newdm);CHKERRQ(ierr);
}
break;
default:
SETERRQ1(comm, PETSC_ERR_ARG_OUTOFRANGE, "Cannot make meshes for dimension %d", dim);
}
if (user->refinementLimit > 0.0) {
DM rdm;
const char *name;
ierr = DMPlexSetRefinementUniform(*newdm, PETSC_FALSE);CHKERRQ(ierr);
ierr = DMPlexSetRefinementLimit(*newdm, user->refinementLimit);CHKERRQ(ierr);
ierr = DMRefine(*newdm, PETSC_COMM_SELF, &rdm);CHKERRQ(ierr);
ierr = PetscObjectGetName((PetscObject) *newdm, &name);CHKERRQ(ierr);
ierr = PetscObjectSetName((PetscObject) rdm, name);CHKERRQ(ierr);
ierr = DMDestroy(newdm);CHKERRQ(ierr);
*newdm = rdm;
}
if (user->interpolate) {
DM idm = NULL;
const char *name;
ierr = DMPlexInterpolate(*newdm, &idm);CHKERRQ(ierr);
ierr = PetscObjectGetName((PetscObject) *newdm, &name);CHKERRQ(ierr);
ierr = PetscObjectSetName((PetscObject) idm, name);CHKERRQ(ierr);
ierr = DMPlexCopyCoordinates(*newdm, idm);CHKERRQ(ierr);
ierr = DMDestroy(newdm);CHKERRQ(ierr);
*newdm = idm;
}
ierr = DMSetFromOptions(*newdm);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
示例15: DMLibMeshCreateDomainDecompositionDM
PetscErrorCode DMLibMeshCreateDomainDecompositionDM(DM dm, PetscInt dnumber, PetscInt* dsizes, char*** dblocklists, DM* ddm)
{
PetscErrorCode ierr;
PetscBool islibmesh;
PetscFunctionBegin;
PetscValidHeaderSpecific(dm,DM_CLASSID,1);
ierr = PetscObjectTypeCompare((PetscObject)dm, DMLIBMESH,&islibmesh);
if(!islibmesh) SETERRQ2(((PetscObject)dm)->comm, PETSC_ERR_ARG_WRONG, "Got DM oftype %s, not of type %s", ((PetscObject)dm)->type_name, DMLIBMESH);
if(dnumber < 0) SETERRQ1(((PetscObject)dm)->comm, PETSC_ERR_ARG_WRONG, "Negative number %D of decomposition parts", dnumber);
PetscValidPointer(ddm,5);
DM_libMesh *dlm = (DM_libMesh *)(dm->data);
ierr = DMCreate(((PetscObject)dm)->comm, ddm); CHKERRQ(ierr);
ierr = DMSetType(*ddm, DMLIBMESH); CHKERRQ(ierr);
DM_libMesh *ddlm = (DM_libMesh *)((*ddm)->data);
ddlm->sys = dlm->sys;
ddlm->varids = dlm->varids;
ddlm->varnames = dlm->varnames;
ddlm->blockids = dlm->blockids;
ddlm->blocknames = dlm->blocknames;
ddlm->decomposition = new(std::vector<std::set<unsigned int> >);
ddlm->decomposition_type = DMLIBMESH_DOMAIN_DECOMPOSITION;
if(dnumber) {
for(PetscInt d = 0; d < dnumber; ++d) {
if(dsizes[d] < 0) SETERRQ2(((PetscObject)dm)->comm, PETSC_ERR_ARG_WRONG, "Negative size %D of decomposition part %D", dsizes[d],d);
ddlm->decomposition->push_back(std::set<unsigned int>());
for(PetscInt b = 0; b < dsizes[d]; ++b) {
std::string bname(dblocklists[d][b]);
std::map<std::string, unsigned int>::const_iterator bit = dlm->blockids->find(bname);
if(bit == dlm->blockids->end())
SETERRQ3(((PetscObject)dm)->comm, PETSC_ERR_ARG_WRONG, "Block %D on the %D-th list with name %s is not owned by this DM", b, d, dblocklists[d][b]);
unsigned int bid = bit->second;
(*ddlm->decomposition)[d].insert(bid);
}
}
}
else { /* Empty splits indicate default: split all blocks with one per split. */
PetscInt d = 0;
for(std::map<std::string, unsigned int>::const_iterator bit = ddlm->blockids->begin(); bit != ddlm->blockids->end(); ++bit) {
ddlm->decomposition->push_back(std::set<unsigned int>());
unsigned int bid = bit->second;
std::string bname = bit->first;
(*ddlm->decomposition)[d].insert(bid);
++d;
}
}
ierr = DMLibMeshSetUpName_Private(*ddm); CHKERRQ(ierr);
ierr = DMSetFromOptions(*ddm); CHKERRQ(ierr);
ierr = DMSetUp(*ddm); CHKERRQ(ierr);
PetscFunctionReturn(0);
}