23 boost::shared_ptr<ArcLengthCtx> arcptr)
25 PetscInt ghosts[1] = {0};
27 if (pcomm->rank() == 0) {
28 CHKERRABORT(PETSC_COMM_WORLD, VecCreateGhost(PETSC_COMM_WORLD, 1, 1, 0,
31 CHKERRABORT(PETSC_COMM_WORLD, VecCreateGhost(PETSC_COMM_WORLD, 0, 1, 1,
35 CHKERRABORT(PETSC_COMM_WORLD,
36 mOab.get_entities_by_type(0, MBPRISM, prisms,
false));
37 for (Range::iterator pit = prisms.begin(); pit != prisms.end(); pit++) {
39 CHKERRABORT(PETSC_COMM_WORLD,
mOab.side_element(*pit, 2, 3, f3));
40 CHKERRABORT(PETSC_COMM_WORLD,
mOab.side_element(*pit, 2, 4, f4));
45 CHKERRABORT(PETSC_COMM_WORLD,
47 CHKERRABORT(PETSC_COMM_WORLD,
56 double def_damaged = 0;
60 MB_TAG_CREAT | MB_TAG_SPARSE, &def_damaged));
72 CHKERR mOab.get_entities_by_type(0, MBPRISM, prisms,
false);
73 std::vector<int> is_prism_damaged(prisms.size());
75 &*is_prism_damaged.begin());
76 Range::iterator pit = prisms.begin();
77 std::vector<int>::iterator vit = is_prism_damaged.begin();
78 for (; pit != prisms.end(); pit++, vit++) {
81 CHKERR mOab.get_connectivity(&*pit, 1, nodes,
true);
82 for (Range::iterator nit = nodes.begin(); nit != nodes.end(); nit++) {
109 NumeredDofEntityByLocalIdx::iterator dit, hi_dit;
110 dit = problemPtr->getNumeredRowDofsPtr()
111 ->get<PetscLocalIdx_mi_tag>()
113 hi_dit = problemPtr->getNumeredRowDofsPtr()
114 ->get<PetscLocalIdx_mi_tag>()
115 .upper_bound(problemPtr->getNbLocalDofsRow());
117 double *array_int_lambda;
123 array_int_lambda[0] = 0;
124 for (; dit != hi_dit; dit++) {
125 if (dit->get()->getEntType() != MBVERTEX)
127 if (pcomm->rank() != dit->get()->getPart())
129 if (
Nodes3.find(dit->get()->getEnt()) !=
Nodes3.end()) {
130 array_int_lambda[0] += array[dit->get()->getPetscLocalDofIdx()];
132 if (
Nodes4.find(dit->get()->getEnt()) !=
Nodes4.end()) {
133 array_int_lambda[0] -= array[dit->get()->getPetscLocalDofIdx()];
143 _lambda_int_ =
arcPtr->alpha * array_int_lambda[0] +
152 CHKERR VecGhostUpdateBegin(
arcPtr->db, INSERT_VALUES, SCATTER_FORWARD);
153 CHKERR VecGhostUpdateEnd(
arcPtr->db, INSERT_VALUES, SCATTER_FORWARD);
154 NumeredDofEntityByLocalIdx::iterator dit, hi_dit;
155 dit = problemPtr->getNumeredRowDofsPtr()
156 ->get<PetscLocalIdx_mi_tag>()
158 hi_dit = problemPtr->getNumeredRowDofsPtr()
159 ->get<PetscLocalIdx_mi_tag>()
160 .upper_bound(problemPtr->getNbLocalDofsRow() +
161 problemPtr->getNbGhostDofsRow());
164 for (; dit != hi_dit; dit++) {
165 if (dit->get()->getEntType() != MBVERTEX) {
166 array[dit->get()->getPetscLocalDofIdx()] = 0;
169 if (
Nodes3.find(dit->get()->getEnt()) !=
Nodes3.end()) {
170 array[dit->get()->getPetscLocalDofIdx()] = +
arcPtr->alpha;
171 }
else if (
Nodes4.find(dit->get()->getEnt()) !=
Nodes4.end()) {
172 array[dit->get()->getPetscLocalDofIdx()] = -
arcPtr->alpha;
174 array[dit->get()->getPetscLocalDofIdx()] = 0;
210 case CTX_SNESSETJACOBIAN: {
211 CHKERR VecGhostUpdateBegin(
arcPtr->ghostDiag, INSERT_VALUES,
213 CHKERR VecGhostUpdateEnd(
arcPtr->ghostDiag, INSERT_VALUES,
216 CHKERR MatAssemblyBegin(snes_B, MAT_FLUSH_ASSEMBLY);
217 CHKERR MatAssemblyEnd(snes_B, MAT_FLUSH_ASSEMBLY);
273 if (
arcPtr->getPetscLocalDofIdx() != -1) {
275 CHKERR VecGetArray(x, &array);
276 double lambda_old = array[
arcPtr->getPetscLocalDofIdx()];
277 if (!(dlambda == dlambda)) {
278 std::ostringstream sss;
281 SETERRQ(PETSC_COMM_SELF, 1, sss.str().c_str());
283 array[
arcPtr->getPetscLocalDofIdx()] = lambda_old + dlambda;
285 "\tlambda = %6.4e, %6.4e (%6.4e)", lambda_old,
286 array[
arcPtr->getPetscLocalDofIdx()], dlambda);
287 CHKERR VecRestoreArray(x, &array);