|
| v0.14.0
|
Definition at line 12 of file electrostatics.cpp.
◆ VecElements
◆ Electrostatics()
◆ assembleSystem()
[Set integration rules]
[Assemble system]
Definition at line 324 of file electrostatics.cpp.
330 auto add_base_ops = [&](
auto &pipeline) {
337 add_base_ops(pipeline_mng->getOpDomainLhsPipeline());
343 pipeline_mng->getOpDomainLhsPipeline().push_back(
348 auto set_values_to_bc_dofs = [&](
auto &fe) {
349 auto get_bc_hook = [&]() {
353 fe->preProcessHook = get_bc_hook();
356 auto calculate_residual_from_set_values_on_bc = [&](
auto &pipeline) {
361 auto grad_u_ptr = boost::make_shared<MatrixDouble>();
362 pipeline_mng->getOpDomainRhsPipeline().push_back(
366 add_base_ops(pipeline_mng->getOpDomainRhsPipeline());
371 pipeline_mng->getOpDomainRhsPipeline().push_back(
372 new OpInternal(
domainField, grad_u_ptr, minus_epsilon));
375 set_values_to_bc_dofs(pipeline_mng->getDomainRhsFE());
376 calculate_residual_from_set_values_on_bc(
377 pipeline_mng->getOpDomainRhsPipeline());
381 pipeline_mng->getOpDomainRhsPipeline().push_back(
◆ boundaryCondition()
◆ getElectrodeCharge()
[Get Total Energy]
[Get Charges]
Definition at line 606 of file electrostatics.cpp.
612 op_loop_side->getOpPtrVector(), {H1});
614 auto grad_u_ptr_charge = boost::make_shared<MatrixDouble>();
615 auto e_ptr_charge = boost::make_shared<MatrixDouble>();
617 op_loop_side->getOpPtrVector().push_back(
621 op_loop_side->getOpPtrVector().push_back(
623 auto d_jump = boost::make_shared<MatrixDouble>();
647 double aLpha = array[0];
648 double bEta = array[1];
651 "CHARGE_ELEC_1: %6.15f , CHARGE_ELEC_2: %6.15f",
aLpha,
bEta);
657 double cal_charge_elec1;
658 double cal_charge_elec2;
659 double cal_total_energy;
660 const double *c_ptr, *te_ptr;
667 double ref_charge_elec1 = 50.0;
668 double ref_charge_elec2 = -50.0;
670 double ref_tot_energy = 500.0;
674 cal_charge_elec1 = c_ptr[0];
675 cal_charge_elec2 = c_ptr[1];
676 cal_total_energy = te_ptr[0];
680 "atom test %d does not exist",
atomTest);
684 if (std::abs(ref_charge_elec1 - cal_charge_elec1) > 1e-10 ||
685 std::abs(ref_charge_elec2 - cal_charge_elec2) > 1e-10 ||
686 std::abs(ref_tot_energy - cal_total_energy) > 1e-10) {
689 "atom test %d failed! Calculated values do not match expected values",
◆ getTotalEnergy()
[Output results]
[Get Total Energy]
Definition at line 539 of file electrostatics.cpp.
543 pip_energy->getDomainLhsFE().reset();
544 pip_energy->getBoundaryLhsFE().reset();
545 pip_energy->getBoundaryRhsFE().reset();
546 pip_energy->getOpDomainRhsPipeline().clear();
547 pip_energy->getOpDomainLhsPipeline().clear();
551 boost::shared_ptr<std::map<int, BlockData>> intrnlDomnBlckSetPtr =
552 boost::make_shared<std::map<int, BlockData>>();
553 Range internal_domain;
555 if (
bit->getName().compare(0, 10,
"DOMAIN_INT") == 0) {
556 const int id =
bit->getMeshsetId();
557 auto &block_data = (*intrnlDomnBlckSetPtr)[id];
560 bit->getMeshset(),
SPACE_DIM, block_data.internalDomainEnts,
true);
561 internal_domain.merge(block_data.internalDomainEnts);
569 pip_energy->getOpDomainRhsPipeline(), {H1});
572 auto grad_u_ptr = boost::make_shared<MatrixDouble>();
573 auto e_field_ptr = boost::make_shared<MatrixDouble>();
575 pip_energy->getOpDomainRhsPipeline().push_back(
577 pip_energy->getOpDomainRhsPipeline().push_back(
582 pip_energy->getOpDomainRhsPipeline().push_back(
586 pip_energy->loopFiniteElements();
590 double total_energy = 0.0;
595 total_energy = array[
ZERO];
597 MOFEM_LOG_C(
"SELF", Sev::inform,
"Total Energy: %6.15f", total_energy);
◆ outputResults()
[Solve system]
[Output results]
Definition at line 449 of file electrostatics.cpp.
453 pipeline_mng->getBoundaryLhsFE().reset();
454 pipeline_mng->getBoundaryRhsFE().reset();
455 pipeline_mng->getDomainLhsFE().reset();
456 auto post_proc_fe = boost::make_shared<PostProcEle>(
mField);
457 auto u_ptr = boost::make_shared<VectorDouble>();
458 auto grad_u_ptr = boost::make_shared<MatrixDouble>();
459 auto e_field_ptr = boost::make_shared<MatrixDouble>();
461 auto add_efield_ops = [&](
auto &pipeline) {
473 add_efield_ops(post_proc_fe->getOpPtrVector());
475 auto e_field_times_perm_ptr = boost::make_shared<MatrixDouble>();
476 auto energy_density_ptr = boost::make_shared<VectorDouble>();
478 post_proc_fe->getOpPtrVector().push_back(
481 post_proc_fe->getOpPtrVector().push_back(
486 post_proc_fe->getOpPtrVector().push_back(
new OpPPMap(
487 post_proc_fe->getPostProcMesh(), post_proc_fe->getMapGaussPts(),
490 {
"ENERGY_DENSITY", energy_density_ptr}},
492 {
"ELECTRIC_FIELD", e_field_ptr},
493 {
"ELECTRIC_DISPLACEMENT", e_field_times_perm_ptr},
501 pipeline_mng->getDomainRhsFE() = post_proc_fe;
502 CHKERR pipeline_mng->loopFiniteElements();
503 CHKERR post_proc_fe->writeFile(
"out.h5m");
506 auto post_proc_skin = boost::make_shared<PostProcFaceEle>(
mField);
510 add_efield_ops(op_loop_skin->getOpPtrVector());
512 op_loop_skin->getOpPtrVector().push_back(
515 op_loop_skin->getOpPtrVector().push_back(
520 post_proc_skin->getOpPtrVector().push_back(op_loop_skin);
522 post_proc_skin->getOpPtrVector().push_back(
new OpPPMap(
523 post_proc_skin->getPostProcMesh(), post_proc_skin->getMapGaussPts(),
525 {
"ENERGY_DENSITY", energy_density_ptr}},
527 {
"ELECTRIC_DISPLACEMENT", e_field_times_perm_ptr}},
532 CHKERR post_proc_skin->writeFile(
"out_skin.h5m");
◆ readMesh()
◆ runProgram()
◆ setIntegrationRules()
[Boundary condition]
[Set integration rules]
Definition at line 309 of file electrostatics.cpp.
312 auto rule_lhs = [](
int,
int,
int p) ->
int {
return 2 * p; };
313 auto rule_rhs = [](
int,
int,
int p) ->
int {
return p; };
316 CHKERR pipeline_mng->setDomainLhsIntegrationRule(rule_lhs);
317 CHKERR pipeline_mng->setDomainRhsIntegrationRule(rule_rhs);
◆ setupProblem()
[Read mesh]
[Setup problem]
Definition at line 72 of file electrostatics.cpp.
78 auto get_ents_by_dim = [&](
const auto dim) {
92 auto get_base = [&]() {
93 auto domain_ents = get_ents_by_dim(
SPACE_DIM);
94 if (domain_ents.empty())
112 auto base = get_base();
125 Range mat_electr_ents;
127 if (
bit->getName().compare(0, 12,
"MAT_ELECTRIC") == 0) {
128 const int id =
bit->getMeshsetId();
129 auto &block_data = (*permBlockSetsPtr)[id];
132 bit->getMeshset(),
SPACE_DIM, block_data.domainEnts,
true);
133 mat_electr_ents.merge(block_data.domainEnts);
135 std::vector<double> attributes;
136 bit->getAttributes(attributes);
137 if (attributes.size() < 1) {
139 " At least one permittivity attributes should be given but "
144 block_data.epsPermit = attributes[0];
150 Range int_electr_ents;
152 if (
bit->getName().compare(0, 12,
"INT_ELECTRIC") == 0) {
153 const int id =
bit->getMeshsetId();
154 auto &block_data = (*intBlockSetsPtr)[id];
157 bit->getMeshset(),
SPACE_DIM - 1, block_data.interfaceEnts,
true);
158 int_electr_ents.merge(block_data.interfaceEnts);
160 std::vector<double> attributes;
161 bit->getAttributes(attributes);
162 if (attributes.size() < 1) {
164 "At least one charge attributes should be given but found %d",
169 block_data.chargeDensity = attributes[0];
174 Range electrode_ents;
175 int electrodeCount = 0;
177 if (
bit->getName().compare(0, 9,
"ELECTRODE") == 0) {
178 const int id =
bit->getMeshsetId();
179 auto &block_data = (*electrodeBlockSetsPtr)[id];
183 bit->getMeshset(),
SPACE_DIM - 1, block_data.electrodeEnts,
true);
184 electrode_ents.merge(block_data.electrodeEnts);
186 auto print_range_on_procs = [&](
const std::string &name,
int meshsetId,
187 const Range &range) {
189 << name <<
" in meshID: " <<
id <<
" with range "
190 << block_data.electrodeEnts <<
" on proc ["
194 print_range_on_procs(
bit->getName(),
id, electrode_ents);
195 if (electrodeCount > 2) {
197 "Three or more electrode blocksets found");
218 CHKERR skinner.find_skin(0, mat_electr_ents,
false, skin_tris);
220 ParallelComm *pcomm =
223 CHKERR pcomm->filter_pstatus(skin_tris,
224 PSTATUS_SHARED | PSTATUS_MULTISHARED,
225 PSTATUS_NOT, -1, &proc_skin);
227 proc_skin = skin_tris;
266 DMType dm_name =
"DMMOFEM";
273 CHKERR DMSetType(dm, dm_name);
◆ solveSystem()
[Assemble system]
[Solve system]
< Null element does
Definition at line 406 of file electrostatics.cpp.
411 auto ksp_solver = pipeline_mng->
createKSP();
413 boost::shared_ptr<ForcesAndSourcesCore>
null;
417 CHKERR KSPSetFromOptions(ksp_solver);
418 CHKERR KSPSetUp(ksp_solver);
427 CHKERR VecGhostUpdateBegin(
F, INSERT_VALUES, SCATTER_FORWARD);
428 CHKERR VecGhostUpdateEnd(
F, INSERT_VALUES, SCATTER_FORWARD);
431 CHKERR VecNorm(
F, NORM_2, &fnorm);
432 CHKERR PetscPrintf(PETSC_COMM_WORLD,
"F norm = %9.8e\n", fnorm);
435 CHKERR VecGhostUpdateBegin(
D, INSERT_VALUES, SCATTER_FORWARD);
436 CHKERR VecGhostUpdateEnd(
D, INSERT_VALUES, SCATTER_FORWARD);
439 CHKERR VecNorm(
D, NORM_2, &dnorm);
440 CHKERR PetscPrintf(PETSC_COMM_WORLD,
"D norm = %9.8e\n", dnorm);
◆ aLpha
double Electrostatics::aLpha = 0.0 |
|
private |
◆ atomTest
int Electrostatics::atomTest = 0 |
|
private |
◆ bEta
double Electrostatics::bEta = 0.0 |
|
private |
◆ commonDataPtr
◆ domainField
std::string Electrostatics::domainField |
|
private |
◆ electrodeBlockSetsPtr
boost::shared_ptr<std::map<int, BlockData> > Electrostatics::electrodeBlockSetsPtr |
|
private |
◆ electrodeRhsFe
◆ intBlockSetsPtr
boost::shared_ptr<std::map<int, BlockData> > Electrostatics::intBlockSetsPtr |
|
private |
◆ interFaceRhsFe
◆ is_partitioned
PetscBool Electrostatics::is_partitioned = PETSC_FALSE |
|
private |
◆ mField
◆ oRder
int Electrostatics::oRder |
|
private |
◆ out_skin
PetscBool Electrostatics::out_skin = PETSC_FALSE |
|
private |
◆ permBlockSetsPtr
boost::shared_ptr<std::map<int, BlockData> > Electrostatics::permBlockSetsPtr |
|
private |
◆ petscVec
◆ petscVecEnergy
◆ simpleInterface
Simple* Electrostatics::simpleInterface |
|
private |
The documentation for this struct was generated from the following file:
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.
MoFEMErrorCode readMesh()
[Read mesh]
boost::shared_ptr< FEMethod > & getDomainRhsFE()
#define MYPCOMM_INDEX
default communicator number PCOMM
PetscErrorCode DMMoFEMKSPSetComputeRHS(DM dm, const char fe_name[], MoFEM::FEMethod *method, MoFEM::BasicMethod *pre_only, MoFEM::BasicMethod *post_only)
set KSP right hand side evaluation function
#define MOFEM_LOG_CHANNEL(channel)
Set and reset channel.
std::map< std::string, boost::shared_ptr< VectorDouble > > DataMapVec
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::LinearForm< GAUSS >::OpSource< BASE_DIM, FIELD_DIM > OpBodySourceVectorb
virtual MPI_Comm & get_comm() const =0
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
#define CHK_THROW_MESSAGE(err, msg)
Check and throw MoFEM exception.
intPostProc< SPACE_DIM >::intEle IntElementForcesAndSourcesCore
MoFEMErrorCode buildProblem()
Build problem.
FormsIntegrators< IntEleOp >::Assembly< PETSC >::LinearForm< GAUSS >::OpSource< BASE_DIM, FIELD_DIM > OpInterfaceRhsVectorF
virtual int get_comm_rank() const =0
MoFEMErrorCode loadFile(const std::string options, const std::string mesh_file_name, LoadFileFunc loadFunc=defaultLoadFileFunc)
Load mesh file.
PipelineManager interface.
boost::shared_ptr< DataAtIntegrationPts > commonDataPtr
boost::shared_ptr< std::map< int, BlockData > > permBlockSetsPtr
PetscErrorCode DMoFEMMeshToLocalVector(DM dm, Vec l, InsertMode mode, ScatterMode scatter_mode)
set local (or ghosted) vector values on mesh for partition only
MoFEMErrorCode outputResults()
[Solve system]
SmartPetscObj< Vec > petscVecEnergy
PetscErrorCode DMMoFEMAddElement(DM dm, std::string fe_name)
add element to dm
MoFEMErrorCode getTotalEnergy()
[Output results]
Get field gradients at integration pts for scalar filed rank 0, i.e. vector field.
MoFEMErrorCode getOptions()
get options
bool & getAddSkeletonFE()
Get the addSkeletonFE.
MoFEMErrorCode getDM(DM *dm)
Get DM.
#define CHKERR
Inline error check.
MoFEM::Interface & mField
auto createDMVector(DM dm)
Get smart vector from DM.
virtual MoFEMErrorCode add_finite_element(const std::string &fe_name, enum MoFEMTypes bh=MF_EXCL, int verb=DEFAULT_VERBOSITY)=0
add finite element
virtual moab::Interface & get_moab()=0
PetscErrorCode DMoFEMLoopFiniteElementsUpAndLowRank(DM dm, const char fe_name[], MoFEM::FEMethod *method, int low_rank, int up_rank, CacheTupleWeakPtr cache_ptr=CacheTupleSharedPtr())
Executes FEMethod for finite elements in DM.
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
MoFEMErrorCode boundaryCondition()
[Setup problem]
boost::shared_ptr< ForcesAndSourcesCore > electrodeRhsFe
auto createDM(MPI_Comm comm, const std::string dm_type_name)
Creates smart DM object.
Simple interface for fast problem set-up.
virtual MoFEMErrorCode build_finite_elements(int verb=DEFAULT_VERBOSITY)=0
Build finite elements.
#define MOFEM_LOG_C(channel, severity, format,...)
OpPostProcMapInMoab< SPACE_DIM, SPACE_DIM > OpPPMap
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpGradGrad< BASE_DIM, FIELD_DIM, SPACE_DIM > OpDomainLhsMatrixK
#define MOFEM_LOG_SYNCHRONISE(comm)
Synchronise "SYNC" channel.
Get value at integration points for scalar field.
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.
SmartPetscObj< KSP > createKSP(SmartPetscObj< DM > dm=nullptr)
Create KSP (linear) solver.
PetscErrorCode DMRegister_MoFEM(const char sname[])
Register MoFEM problem.
const std::string getDomainFEName() const
Get the Domain FE Name.
auto type_from_handle(const EntityHandle h)
get type from entity handle
boost::shared_ptr< std::map< int, BlockData > > intBlockSetsPtr
virtual MoFEMErrorCode add_ents_to_finite_element_by_dim(const EntityHandle entities, const int dim, const std::string &name, const bool recursive=true)=0
add entities to finite element
virtual MoFEMErrorCode modify_finite_element_add_field_data(const std::string &fe_name, const std::string name_field)=0
set finite element field data
std::map< std::string, boost::shared_ptr< MatrixDouble > > DataMapMat
FormsIntegrators< DomainEleOp >::Assembly< A >::LinearForm< I >::OpGradTimesTensor< 1, FIELD_DIM, SPACE_DIM > OpGradTimesTensor
MoFEMErrorCode setFieldOrder(const std::string field_name, const int order, const Range *ents=NULL)
Set field order.
MoFEMErrorCode buildFiniteElements()
Build finite elements.
Add operators pushing bases from local to physical configuration.
Specialization for TemperatureCubitBcData.
#define MOFEM_LOG(channel, severity)
Log.
SmartPetscObj< Vec > vectorDuplicate(Vec vec)
Create duplicate vector of smart vector.
#define _IT_CUBITMESHSETS_BY_SET_TYPE_FOR_LOOP_(MESHSET_MANAGER, CUBITBCTYPE, IT)
Iterator that loops over a specific Cubit MeshSet having a particular BC meshset in a moFEM field.
MoFEMErrorCode setIntegrationRules()
[Boundary condition]
MoFEMErrorCode solveSystem()
[Assemble system]
MoFEMErrorCode setupProblem()
[Read mesh]
SmartPetscObj< Vec > petscVec
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base .
@ MOFEM_DATA_INCONSISTENCY
MoFEMErrorCode defineFiniteElements()
Define finite elements.
auto createVectorMPI(MPI_Comm comm, PetscInt n, PetscInt N)
Create MPI Vector.
MoFEMErrorCode buildFields()
Build fields.
boost::shared_ptr< ForcesAndSourcesCore > interFaceRhsFe
MoFEMErrorCode getElectrodeCharge()
[Get Total Energy]
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.
const double D
diffusivity
MoFEMErrorCode assembleSystem()
[Set integration rules]
@ MOFEM_ATOM_TEST_INVALID
MoFEMErrorCode defineProblem(const PetscBool is_partitioned=PETSC_TRUE)
define problem
boost::shared_ptr< std::map< int, BlockData > > electrodeBlockSetsPtr
const std::string getProblemName() const
Get the Problem Name.
PetscErrorCode DMoFEMLoopFiniteElements(DM dm, const char fe_name[], MoFEM::FEMethod *method, CacheTupleWeakPtr cache_ptr=CacheTupleSharedPtr())
Executes FEMethod for finite elements in DM.
PetscErrorCode PetscOptionsGetInt(PetscOptions *, const char pre[], const char name[], PetscInt *ivalue, PetscBool *set)
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
Element used to execute operators on side of the element.
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
PetscErrorCode PetscOptionsGetBool(PetscOptions *, const char pre[], const char name[], PetscBool *bval, PetscBool *set)
Post post-proc data at points from hash maps.