PetscErrorCode SetupProblem(DM dm, AppCtx *user) { PetscDS prob; Parameter *ctx; PetscInt id; PetscErrorCode ierr; PetscFunctionBeginUser; ierr = DMGetDS(dm, &prob);CHKERRQ(ierr); ierr = PetscDSSetResidual(prob, 0, NULL, f1_u);CHKERRQ(ierr); ierr = PetscDSSetResidual(prob, 1, f0_p, NULL);CHKERRQ(ierr); ierr = PetscDSSetBdResidual(prob, 0, f0_bd_u, NULL);CHKERRQ(ierr); ierr = PetscDSSetJacobian(prob, 0, 0, NULL, NULL, NULL, g3_uu);CHKERRQ(ierr); ierr = PetscDSSetJacobian(prob, 0, 1, NULL, NULL, g2_up, NULL);CHKERRQ(ierr); ierr = PetscDSSetJacobian(prob, 1, 0, NULL, g1_pu, NULL, NULL);CHKERRQ(ierr); /* Setup constants */ { Parameter *param; PetscScalar constants[4]; ierr = PetscBagGetData(user->bag, (void **) ¶m);CHKERRQ(ierr); constants[0] = param->Delta; constants[1] = param->nu; constants[2] = param->u_0; constants[3] = param->alpha; ierr = PetscDSSetConstants(prob, 4, constants);CHKERRQ(ierr); } /* Setup Boundary Conditions */ ierr = PetscBagGetData(user->bag, (void **) &ctx);CHKERRQ(ierr); id = 3; ierr = PetscDSAddBoundary(prob, DM_BC_ESSENTIAL, "top wall", "marker", 0, 0, NULL, (void (*)(void)) wall_velocity, 1, &id, ctx);CHKERRQ(ierr); id = 1; ierr = PetscDSAddBoundary(prob, DM_BC_ESSENTIAL, "bottom wall", "marker", 0, 0, NULL, (void (*)(void)) wall_velocity, 1, &id, ctx);CHKERRQ(ierr); id = 2; ierr = PetscDSAddBoundary(prob, DM_BC_NATURAL, "right wall", "marker", 0, 0, NULL, (void (*)(void)) NULL, 1, &id, ctx);CHKERRQ(ierr); /* Setup exact solution */ user->exactFuncs[0] = quadratic_u; user->exactFuncs[1] = linear_p; ierr = PetscDSSetExactSolution(prob, 0, user->exactFuncs[0], ctx);CHKERRQ(ierr); ierr = PetscDSSetExactSolution(prob, 1, user->exactFuncs[1], ctx);CHKERRQ(ierr); PetscFunctionReturn(0); }
static PetscErrorCode SetupPrimalProblem(DM dm, AppCtx *user) { PetscErrorCode (*exact)(PetscInt, PetscReal, const PetscReal[], PetscInt, PetscScalar *, void *); PetscDS prob; const PetscInt id = 1; PetscInt dim; PetscErrorCode ierr; PetscFunctionBeginUser; ierr = DMGetDS(dm, &prob);CHKERRQ(ierr); ierr = PetscDSGetSpatialDimension(prob, &dim);CHKERRQ(ierr); switch (user->solType) { case SOL_VLAP_QUADRATIC: ierr = PetscDSSetResidual(prob, 0, f0_vlap_quadratic_u, f1_vlap_u);CHKERRQ(ierr); ierr = PetscDSSetJacobian(prob, 0, 0, NULL, NULL, NULL, g3_vlap_uu);CHKERRQ(ierr); switch (dim) { case 2: exact = quadratic_2d_u;break; case 3: exact = quadratic_3d_u;break; default: SETERRQ1(PetscObjectComm((PetscObject) prob), PETSC_ERR_ARG_WRONG, "Invalid dimension: %D", dim); } break; case SOL_ELAS_QUADRATIC: ierr = PetscDSSetResidual(prob, 0, f0_elas_quadratic_u, f1_elas_u);CHKERRQ(ierr); ierr = PetscDSSetJacobian(prob, 0, 0, NULL, NULL, NULL, g3_elas_uu);CHKERRQ(ierr); switch (dim) { case 2: exact = quadratic_2d_u;break; case 3: exact = quadratic_3d_u;break; default: SETERRQ1(PetscObjectComm((PetscObject) prob), PETSC_ERR_ARG_WRONG, "Invalid dimension: %D", dim); } break; case SOL_VLAP_TRIG: ierr = PetscDSSetResidual(prob, 0, f0_vlap_trig_u, f1_vlap_u);CHKERRQ(ierr); ierr = PetscDSSetJacobian(prob, 0, 0, NULL, NULL, NULL, g3_vlap_uu);CHKERRQ(ierr); switch (dim) { case 2: exact = trig_2d_u;break; case 3: exact = trig_3d_u;break; default: SETERRQ1(PetscObjectComm((PetscObject) prob), PETSC_ERR_ARG_WRONG, "Invalid dimension: %D", dim); } break; case SOL_ELAS_TRIG: ierr = PetscDSSetResidual(prob, 0, f0_elas_trig_u, f1_elas_u);CHKERRQ(ierr); ierr = PetscDSSetJacobian(prob, 0, 0, NULL, NULL, NULL, g3_elas_uu);CHKERRQ(ierr); switch (dim) { case 2: exact = trig_2d_u;break; case 3: exact = trig_3d_u;break; default: SETERRQ1(PetscObjectComm((PetscObject) prob), PETSC_ERR_ARG_WRONG, "Invalid dimension: %D", dim); } break; default: SETERRQ2(PetscObjectComm((PetscObject) prob), PETSC_ERR_ARG_WRONG, "Invalid solution type: %s (%D)", solutionTypes[PetscMin(user->solType, NUM_SOLUTION_TYPES)], user->solType); } ierr = PetscDSSetExactSolution(prob, 0, exact);CHKERRQ(ierr); ierr = PetscDSAddBoundary(prob, DM_BC_ESSENTIAL, "wall", "marker", 0, 0, NULL, (void (*)(void)) exact, 1, &id, user);CHKERRQ(ierr); PetscFunctionReturn(0); }
static PetscErrorCode SetupPrimalProblem(DM dm, AppCtx *user) { PetscDS prob; const PetscInt id = 1; PetscErrorCode ierr; PetscFunctionBeginUser; ierr = DMGetDS(dm, &prob);CHKERRQ(ierr); ierr = PetscDSSetResidual(prob, 0, f0_trig_u, f1_u);CHKERRQ(ierr); ierr = PetscDSSetJacobian(prob, 0, 0, NULL, NULL, NULL, g3_uu);CHKERRQ(ierr); ierr = PetscDSAddBoundary(prob, DM_BC_ESSENTIAL, "wall", "marker", 0, 0, NULL, (void (*)(void)) trig_u, 1, &id, user);CHKERRQ(ierr); ierr = PetscDSSetExactSolution(prob, 0, trig_u, user);CHKERRQ(ierr); PetscFunctionReturn(0); }