29 {
30
32
33 try {
34
35 PetscOptionsBegin(PETSC_COMM_WORLD, "", "Mesh cut options", "none");
36 CHKERR PetscOptionsString(
"-my_file",
"mesh file name",
"",
"mesh.h5m",
38 CHKERR PetscOptionsInt(
"-edges_block_set",
"edges side set",
"",
40 CHKERR PetscOptionsInt(
"-vertex_block_set",
"vertex side set",
"",
42 CHKERR PetscOptionsBool(
"-output_vtk",
"if true outout vtk file",
"",
44 CHKERR PetscOptionsScalar(
"-quality_reduction_tol",
"",
45 "Tolerance of quality reduction",
tol, &
tol,
46 PETSC_NULLPTR);
47 CHKERR PetscOptionsScalar(
"-gamma_factor",
"",
49 PETSC_NULLPTR);
50 PetscOptionsEnd();
51
52
53 moab::Core moab_core;
54 moab::Interface &moab = moab_core;
55
58
60
61
62
64
66
67
68 {
69
71
73
74
75
78
81
82
84 1);
86 1);
87
90
91
92 {
95
101 true);
103 "LAMBDA_EDGE");
105 ->synchroniseFieldEntities("LAMBDA_EDGE");
107
110 "EDGE_SLIDING", "MESH_NODE_POSITIONS");
112 "EDGE_SLIDING", "MESH_NODE_POSITIONS");
114 "EDGE_SLIDING", "MESH_NODE_POSITIONS");
116 "LAMBDA_EDGE");
118 "LAMBDA_EDGE");
120 "LAMBDA_EDGE");
122 "EDGE_SLIDING");
124 }
125 }
126
130
139 }
142 }
143
144 struct ElementsAndOperators {
145
148 double *minQualityPtr;
149
152 &minQualityVec);
153 CHKERRABORT(PETSC_COMM_WORLD,
ierr);
154 ierr = VecGetArray(minQualityVec, &minQualityPtr);
155 CHKERRABORT(PETSC_COMM_WORLD,
ierr);
156 }
157
158 virtual ~ElementsAndOperators() {
159 ierr = VecRestoreArray(minQualityVec, &minQualityPtr);
160 CHKERRABORT(PETSC_COMM_WORLD,
ierr);
161 ierr = VecDestroy(&minQualityVec);
162 CHKERRABORT(PETSC_COMM_WORLD,
ierr);
163 }
164
165 double getMinQuality() const { return *minQualityPtr; }
166
167 enum Tags {
168 SMOOTHING_TAG = 1,
169 SURFACE_CONSTRAINS_TAG,
170 EDGE_CONSTRAINS_TAG
171 };
172
173 boost::shared_ptr<Smoother> smootherFe;
174 boost::shared_ptr<Smoother::MyVolumeFE>
175 feSmootherRhs;
176 boost::shared_ptr<Smoother::MyVolumeFE>
177 feSmootherLhs;
178 boost::shared_ptr<VolumeLengthQuality<double> > volumeLengthDouble;
179 boost::shared_ptr<VolumeLengthQuality<adouble> > volumeLengthAdouble;
180
181 boost::shared_ptr<SurfaceSlidingConstrains> surfaceConstrain;
182 boost::shared_ptr<SurfaceSlidingConstrains::DriverElementOrientation>
183 skinOrientation;
184 boost::shared_ptr<EdgeSlidingConstrains> edgeConstrain;
185
186 boost::shared_ptr<DirichletFixFieldAtEntitiesBc> fixMaterialEnts;
187
188 boost::shared_ptr<MoFEM::VolumeElementForcesAndSourcesCore> minQualityFe;
189
191 double *minQualityPtr;
192 MinQualityOp(double *min_quality_ptr)
195 minQualityPtr(min_quality_ptr) {}
199 if (type != MBVERTEX)
202 *minQualityPtr = fmin(*minQualityPtr, q);
204 }
205 };
206
209 smootherFe = boost::shared_ptr<Smoother>(
new Smoother(mField));
210 volumeLengthAdouble = boost::shared_ptr<VolumeLengthQuality<adouble> >(
212 volumeLengthDouble = boost::shared_ptr<VolumeLengthQuality<double> >(
214
217 smootherFe->setOfBlocks[0].tEts.merge(tets);
218
219 smootherFe->setOfBlocks[0].materialDoublePtr = volumeLengthDouble;
220 smootherFe->setOfBlocks[0].materialAdoublePtr = volumeLengthAdouble;
221
222
223 smootherFe->commonData.spatialPositions = "MESH_NODE_POSITIONS";
224 smootherFe->commonData.meshPositions = "NONE";
225
226 smootherFe->feRhs.meshPositionsFieldName = "NONE";
227 smootherFe->feLhs.meshPositionsFieldName = "NONE";
228 smootherFe->feRhs.addToRule = 0;
229 smootherFe->feLhs.addToRule = 0;
230
231 feSmootherRhs = smootherFe->feRhsPtr;
232 feSmootherLhs = smootherFe->feLhsPtr;
233
234
235 feSmootherRhs->getOpPtrVector().push_back(
237 "MESH_NODE_POSITIONS", smootherFe->commonData));
238 feSmootherRhs->getOpPtrVector().push_back(
240 "MESH_NODE_POSITIONS", smootherFe->setOfBlocks.at(0),
241 smootherFe->commonData, SMOOTHING_TAG, false));
243 "MESH_NODE_POSITIONS", smootherFe->setOfBlocks[0],
244 smootherFe->commonData, smootherFe->smootherData));
245
246
247 feSmootherLhs->getOpPtrVector().push_back(
249 "MESH_NODE_POSITIONS", smootherFe->commonData));
250 feSmootherLhs->getOpPtrVector().push_back(
252 "MESH_NODE_POSITIONS", smootherFe->setOfBlocks.at(0),
253 smootherFe->commonData, SMOOTHING_TAG, true));
255 "MESH_NODE_POSITIONS", "MESH_NODE_POSITIONS",
256 smootherFe->setOfBlocks.at(0), smootherFe->commonData,
257 smootherFe->smootherData, "LAMBDA_CRACKFRONT_AREA_TANGENT"));
258
259 minQualityFe =
260 boost::shared_ptr<MoFEM::VolumeElementForcesAndSourcesCore>(
262 minQualityFe->getOpPtrVector().push_back(
263 new MinQualityOp(minQualityPtr));
264
270 }
271 fixMaterialEnts = boost::shared_ptr<DirichletFixFieldAtEntitiesBc>(
273 fixed_vertex));
274 fixMaterialEnts->fieldNames.push_back("LAMBDA_SURFACE");
275 fixMaterialEnts->fieldNames.push_back("LAMBDA_EDGE");
276
278 }
279
282 skinOrientation = boost::shared_ptr<
285 surfaceConstrain = boost::shared_ptr<SurfaceSlidingConstrains>(
286 skinOrientation,
288 surfaceConstrain->setOperators(SURFACE_CONSTRAINS_TAG, "LAMBDA_SURFACE",
289 "MESH_NODE_POSITIONS");
290
296 true);
297
302 CHKERR skin.find_skin(0, tets,
false, skin_faces);
303
304 edgeConstrain = boost::shared_ptr<EdgeSlidingConstrains>(
306 CHKERR edgeConstrain->setOperators(EDGE_CONSTRAINS_TAG, edges,
307 skin_faces, "LAMBDA_EDGE",
308 "MESH_NODE_POSITIONS");
309
310
311
312
313 }
315 }
316
319 boost::shared_ptr<ForcesAndSourcesCore> null;
320
322 null);
324 null);
326 surfaceConstrain->feRhsPtr, null, null);
328 edgeConstrain->feRhsPtr, null, null);
330 fixMaterialEnts);
331
333 null);
335 null);
337 surfaceConstrain->feLhsPtr, null, null);
339 edgeConstrain->feLhsPtr, null, null);
341 fixMaterialEnts);
342
343
344
345
346
348 }
349
352 *minQualityPtr = 1;
354 CHKERR VecMin(minQualityVec, PETSC_NULLPTR, minQualityPtr);
356 }
357 };
358
359 ElementsAndOperators elements_and_operators(m_field);
360 CHKERR elements_and_operators.createSmoothingFE();
361 CHKERR elements_and_operators.createConstrians();
362
363 DM dm;
365 CHKERR elements_and_operators.addFEtoDM(dm);
366
367 struct Solve {
368
371
372
374 CHKERR DMCreateGlobalVector(dm, &
F);
375
376
378
379 CHKERR zeroLambdaFields(dm);
381
382
383 SNES solver;
384 CHKERR SNESCreate(PETSC_COMM_WORLD, &solver);
385 CHKERR SNESSetFromOptions(solver);
386 CHKERR SNESSetDM(solver, dm);
387
389
390
391
393
394
395
397
398 CHKERR SNESDestroy(&solver);
401
403 }
404
410 "MESH_NODE_POSITIONS", it)) {
411 if (it->get()->getEntType() != MBVERTEX)
412 continue;
414 for(
int dd = 0;
dd!=3;++
dd)
415 coords[dd] = it->get()->getEntFieldData()[
dd];
417 CHKERR m_field_ptr->
get_moab().set_coords(&ent, 1, &*coords.begin());
418 }
420 }
421
427 "MESH_NODE_POSITIONS", it)) {
428 if (it->get()->getEntType() != MBVERTEX)
429 continue;
432 CHKERR m_field_ptr->
get_moab().get_coords(&ent, 1, &*coords.begin());
433 for(
int dd = 0;
dd!=3;++
dd)
434 it->get()->getEntFieldData()[
dd] = coords[
dd];
435 }
437 }
438
439 private:
445 0, MBVERTEX, "LAMBDA_SURFACE");
447 }
448
449 };
450
453
454 CHKERR elements_and_operators.calcuteMinQuality(dm);
455 double min_quality = elements_and_operators.getMinQuality();
456 PetscPrintf(PETSC_COMM_WORLD, "Min quality = %4.3f\n", min_quality);
457
458 double gamma = min_quality > 0 ?
gamma_factor * min_quality
460 elements_and_operators.volumeLengthDouble->gAmma = gamma;
461 elements_and_operators.volumeLengthAdouble->gAmma = gamma;
462
463 double min_quality_p,
eps;
464 do {
465
466 min_quality_p = min_quality;
467
469
471 CHKERR elements_and_operators.calcuteMinQuality(dm);
472 min_quality = elements_and_operators.getMinQuality();
473
474 eps = (min_quality - min_quality_p) / min_quality;
475 PetscPrintf(PETSC_COMM_WORLD, "Min quality = %4.3f eps = %4.3f\n",
477
478 double gamma = min_quality > 0 ?
gamma_factor * min_quality
480 elements_and_operators.volumeLengthDouble->gAmma = gamma;
481 elements_and_operators.volumeLengthAdouble->gAmma = gamma;
482
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
506 "");
507 }
509
511}
ForcesAndSourcesCore::UserDataOperator UserDataOperator
#define CATCH_ERRORS
Catch errors.
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base .
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
PetscErrorCode DMMoFEMSNESSetFunction(DM dm, const char fe_name[], MoFEM::FEMethod *method, MoFEM::BasicMethod *pre_only, MoFEM::BasicMethod *post_only)
set SNES residual evaluation function
PetscErrorCode DMoFEMMeshToLocalVector(DM dm, Vec l, InsertMode mode, ScatterMode scatter_mode)
set local (or ghosted) vector values on mesh for partition only
PetscErrorCode DMMoFEMSNESSetJacobian(DM dm, const char fe_name[], MoFEM::FEMethod *method, MoFEM::BasicMethod *pre_only, MoFEM::BasicMethod *post_only)
set SNES Jacobian evaluation function
PetscErrorCode DMRegister_MoFEM(const char sname[])
Register MoFEM problem.
PetscErrorCode DMoFEMLoopFiniteElements(DM dm, const char fe_name[], MoFEM::FEMethod *method, CacheTupleWeakPtr cache_ptr=CacheTupleSharedPtr())
Executes FEMethod for finite elements in DM.
PetscErrorCode DMoFEMGetInterfacePtr(DM dm, MoFEM::Interface **m_field_ptr)
Get pointer to MoFEM::Interface.
PetscErrorCode DMoFEMMeshToGlobalVector(DM dm, Vec g, InsertMode mode, ScatterMode scatter_mode)
set ghosted vector values on all existing mesh entities
#define _IT_GET_ENT_FIELD_BY_NAME_FOR_LOOP_(MFIELD, NAME, IT)
loop over all dofs from a moFEM field and particular field
virtual MoFEMErrorCode add_finite_element(const std::string &fe_name, enum MoFEMTypes bh=MF_EXCL, int verb=DEFAULT_VERBOSITY)=0
add finite element
virtual MoFEMErrorCode modify_finite_element_add_field_col(const std::string &fe_name, const std::string name_row)=0
set field col which finite element use
virtual MoFEMErrorCode add_ents_to_finite_element_by_type(const EntityHandle entities, const EntityType type, const std::string name, const bool recursive=true)=0
add entities to finite element
virtual MoFEMErrorCode modify_finite_element_add_field_row(const std::string &fe_name, const std::string name_row)=0
set field row which finite element use
virtual MoFEMErrorCode modify_finite_element_add_field_data(const std::string &fe_name, const std::string name_field)=0
set finite element field data
virtual MoFEMErrorCode set_field_order(const EntityHandle meshset, const EntityType type, const std::string &name, const ApproximationOrder order, int verb=DEFAULT_VERBOSITY)=0
Set order approximation of the entities in the field.
virtual MoFEMErrorCode add_ents_to_field_by_type(const Range &ents, const EntityType type, const std::string &name, int verb=DEFAULT_VERBOSITY)=0
Add entities to field meshset.
virtual MoFEMErrorCode remove_ents_from_field(const std::string name, const EntityHandle meshset, const EntityType type, int verb=DEFAULT_VERBOSITY)=0
remove entities from field
bool checkMeshset(const int ms_id, const CubitBCType cubit_bc_type) const
check for CUBIT Id and CUBIT type
const FTensor::Tensor2< T, Dim, Dim > Vec
const Tensor2_symmetric_Expr< const ddTensor0< T, Dim, i, j >, typename promote< T, double >::V, Dim, i, j > dd(const Tensor0< T * > &a, const Index< i, Dim > index1, const Index< j, Dim > index2, const Tensor1< int, Dim > &d_ijk, const Tensor1< double, Dim > &d_xyz)
static MoFEMErrorCodeGeneric< PetscErrorCode > ierr
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
VectorBoundedArray< double, 3 > VectorDouble3
std::bitset< BITREFLEVEL_SIZE > BitRefLevel
Bit structure attached to each entity identifying to what mesh entity is attached.
implementation of Data Operators for Forces and Sources
static PetscErrorCode solve(Mat mat, Vec x, Vec y)
virtual int get_comm_size() const =0
virtual moab::Interface & get_moab()=0
virtual MoFEMErrorCode add_field(const std::string name, const FieldSpace space, const FieldApproximationBase base, const FieldCoefficientsNumber nb_of_coefficients, const TagType tag_type=MB_TAG_SPARSE, const enum MoFEMTypes bh=MF_EXCL, int verb=DEFAULT_VERBOSITY)=0
Add field.
static MoFEMErrorCode Initialize(int *argc, char ***args, const char file[], const char help[])
Initializes the MoFEM database PETSc, MOAB and MPI.
static MoFEMErrorCode Finalize()
Checks for options to be called at the conclusion of the program.
Deprecated interface functions.
Data on single entity (This is passed as argument to DataOperator::doWork)
const VectorDouble & getFieldData() const
get dofs values
structure to get information form mofem into EntitiesFieldData
Interface for managing meshsets containing materials and boundary conditions.
Simple interface for fast problem set-up.
MoFEMErrorCode buildProblem()
Build problem.
MoFEMErrorCode addDomainField(const std::string name, const FieldSpace space, const FieldApproximationBase base, const FieldCoefficientsNumber nb_of_coefficients, const TagType tag_type=MB_TAG_SPARSE, const enum MoFEMTypes bh=MF_ZERO, int verb=-1)
Add field on domain.
const std::string getBoundaryFEName() const
Get the Boundary FE Name.
MoFEMErrorCode defineFiniteElements()
Define finite elements.
MoFEMErrorCode loadFile(const std::string options, const std::string mesh_file_name, LoadFileFunc loadFunc=defaultLoadFileFunc)
Load mesh file.
MoFEMErrorCode buildFiniteElements()
Build finite elements.
MoFEMErrorCode addBoundaryField(const std::string name, const FieldSpace space, const FieldApproximationBase base, const FieldCoefficientsNumber nb_of_coefficients, const TagType tag_type=MB_TAG_SPARSE, const enum MoFEMTypes bh=MF_ZERO, int verb=-1)
Add field on boundary.
std::vector< std::string > & getOtherFiniteElements()
Get the Other Finite Elements.
MoFEMErrorCode getOptions()
get options
MoFEMErrorCode getDM(DM *dm)
Get DM.
MoFEMErrorCode buildFields()
Build fields.
MoFEMErrorCode setFieldOrder(const std::string field_name, const int order, const Range *ents=NULL)
Set field order.
MoFEMErrorCode defineProblem(const PetscBool is_partitioned=PETSC_TRUE)
define problem
const std::string getDomainFEName() const
Get the Domain FE Name.
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.
Volume finite element base.
Class implemented by user to detect face orientation.
Shape preserving constrains, i.e. nodes sliding on body surface.