v0.14.0
LoopMethods.cpp
Go to the documentation of this file.
1 /** \file LoopMethods.cpp
2 \brief methods for managing loops
3 */
4 
5 
6 #include <MoFEM.hpp>
7 
8 namespace MoFEM {
9 
18 
19 // PetscData
21 PetscData::query_interface(boost::typeindex::type_index type_index,
22  UnknownInterface **iface) const {
23  *iface = const_cast<PetscData *>(this);
24  return 0;
25 }
26 
28  : data_ctx(PetscData::CtxSetNone), f(PETSC_NULL), A(PETSC_NULL),
29  B(PETSC_NULL), x(PETSC_NULL), dx(PETSC_NULL), x_t(PETSC_NULL),
30  x_tt(PETSC_NULL) {}
31 
33  this->data_ctx = petsc_data.data_ctx;
34  this->f = petsc_data.f;
35  this->A = petsc_data.A;
36  this->B = petsc_data.B;
37  this->x = petsc_data.x;
38  this->dx = petsc_data.dx;
39  this->x_t = petsc_data.x_t;
40  this->x_tt = petsc_data.x_tt;
41  return 0;
42 }
43 
44 // KSP
46 KspMethod::query_interface(boost::typeindex::type_index type_index,
47  UnknownInterface **iface) const {
48  *iface = const_cast<KspMethod *>(this);
49  return 0;
50 };
51 
53  : ksp_ctx(CTX_KSPNONE), ksp(PETSC_NULL), ksp_f(PetscData::f),
54  ksp_A(PetscData::A), ksp_B(PetscData::B) {}
55 
59  this->ksp_ctx = ksp.ksp_ctx;
60  this->ksp = ksp.ksp;
62 }
63 
64 // SNES
66 SnesMethod::query_interface(boost::typeindex::type_index type_index,
67  UnknownInterface **iface) const {
68  *iface = const_cast<SnesMethod *>(this);
69  return 0;
70 }
71 
73  : snes_ctx(CTX_SNESNONE), snes_x(PetscData::x), snes_dx(PetscData::dx),
74  snes_f(PetscData::f), snes_A(PetscData::A), snes_B(PetscData::B) {}
75 
79  this->snes_ctx = snes.snes_ctx;
80  this->snes = snes.snes;
82 }
83 
84 // TS
86 TSMethod::query_interface(boost::typeindex::type_index type_index,
87  UnknownInterface **iface) const {
88  *iface = const_cast<TSMethod *>(this);
89  return 0;
90 }
91 
93  : ts_ctx(CTX_TSNONE), ts_step(-1), ts_a(0), ts_t(0), ts_u(PetscData::x),
94  ts_u_t(PetscData::x_t), ts_u_tt(PetscData::x_tt), ts_F(PetscData::f),
95  ts_A(PetscData::A), ts_B(PetscData::B) {}
96 
100  this->ts_ctx = ts.ts_ctx;
101  this->ts = ts.ts;
102  this->ts_step = ts.ts_step;
103  this->ts_a = ts.ts_a;
104  this->ts_t = ts.ts_t;
105  this->ts_dt = ts.ts_dt;
107 }
108 
109 // BasicMethod
111  : PetscData(), KspMethod(), SnesMethod(), TSMethod(), nInTheLoop(0),
112  loopSize(0), rAnk(-1), sIze(-1), refinedEntitiesPtr(nullptr),
113  refinedFiniteElementsPtr(nullptr), problemPtr(nullptr),
114  fieldsPtr(nullptr), entitiesPtr(nullptr), dofsPtr(nullptr),
115  finiteElementsPtr(nullptr), finiteElementsEntitiesPtr(nullptr),
116  adjacenciesPtr(nullptr) {}
117 
120 
121  this->nInTheLoop = basic.nInTheLoop;
122  this->loopSize = basic.loopSize;
123  this->rAnk = basic.rAnk;
124  this->sIze = basic.sIze;
127  this->problemPtr = basic.problemPtr;
128  this->fieldsPtr = basic.fieldsPtr;
129  this->entitiesPtr = basic.entitiesPtr;
130  this->dofsPtr = basic.dofsPtr;
131  this->finiteElementsPtr = basic.finiteElementsPtr;
133  this->adjacenciesPtr = basic.adjacenciesPtr;
134  this->cacheWeakPtr = basic.cacheWeakPtr;
135 
137 }
138 
141  if (preProcessHook) {
142  ierr = preProcessHook();
143  CHKERRG(ierr);
144  } else {
145  SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
146  "should be implemented by user in derived class (preProcess)");
147  }
149 }
152  if (postProcessHook) {
153  ierr = postProcessHook();
154  CHKERRG(ierr);
155  } else {
156  SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
157  "should be implemented by user in derived class (postProcess)");
158  }
160 }
163  if (operatorHook) {
164  ierr = operatorHook();
165  CHKERRG(ierr);
166  } else {
167  SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
168  "should be implemented by user in derived class (operator)");
169  }
171 }
172 
174  VectorDouble &data,
175  const bool reset_dofs) {
177 
178  // TODO: [CORE-60] Fix implementation not to use DOFs
179 
180  auto get_nodes_field_data =
181  [&](boost::shared_ptr<FEDofEntity_multiIndex> &&dofs,
182  VectorDouble &nodes_data) {
184 
185  auto bit_number = getFieldBitNumber(field_name);
186  auto &dofs_by_uid = dofs->get<Unique_mi_tag>();
187  auto dit =
188  dofs_by_uid.lower_bound(FieldEntity::getLocalUniqueIdCalculate(
189  bit_number, get_id_for_min_type<MBVERTEX>()));
190  auto hi_dit =
191  dofs_by_uid.upper_bound(FieldEntity::getLocalUniqueIdCalculate(
192  bit_number, get_id_for_max_type<MBVERTEX>()));
193 
194  if (dit != hi_dit) {
195  auto &first_dof = **dit;
196  const int num_nodes = getNumberOfNodes();
197  const int nb_dof_idx = first_dof.getNbOfCoeffs();
198  const int max_nb_dofs = nb_dof_idx * num_nodes;
199  nodes_data.resize(max_nb_dofs, false);
200  nodes_data.clear();
201 
202  for (; dit != hi_dit;) {
203  const auto &dof_ptr = *dit;
204  const auto &dof = *dof_ptr;
205  const auto &sn = *dof.getSideNumberPtr();
206  const int side_number = sn.side_number;
207 
208  int pos = side_number * nb_dof_idx;
209  auto ent_filed_data_vec = dof.getEntFieldData();
210  for (int ii = 0; ii != nb_dof_idx; ++ii) {
211  nodes_data[pos] = ent_filed_data_vec[ii];
212  ++pos;
213  ++dit;
214  }
215  }
216 
217  } else if (reset_dofs) {
218  nodes_data.resize(0, false);
219  }
220 
222  };
223 
224  return get_nodes_field_data(getDataDofsPtr(), data);
225 
227 }
228 
229 } // namespace MoFEM
MoFEMFunctionReturnHot
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
Definition: definitions.h:460
MoFEM::SnesMethod::query_interface
MoFEMErrorCode query_interface(boost::typeindex::type_index type_index, UnknownInterface **iface) const
Definition: LoopMethods.cpp:66
MoFEM::PetscData::Switches
std::bitset< 8 > Switches
Definition: LoopMethods.hpp:34
MoFEM::TSMethod::TSMethod
TSMethod()
Definition: LoopMethods.cpp:92
MoFEM::BasicMethod::refinedEntitiesPtr
const RefEntity_multiIndex * refinedEntitiesPtr
container of mofem dof entities
Definition: LoopMethods.hpp:249
MoFEM::TSMethod::ts_a
PetscReal ts_a
shift for U_t (see PETSc Time Solver)
Definition: LoopMethods.hpp:164
MoFEM::PetscData::x
Vec x
Definition: LoopMethods.hpp:53
MoFEM::BasicMethod::nInTheLoop
int nInTheLoop
number currently of processed method
Definition: LoopMethods.hpp:202
MoFEM::BasicMethod::finiteElementsEntitiesPtr
const EntFiniteElement_multiIndex * finiteElementsEntitiesPtr
Definition: LoopMethods.hpp:267
MoFEM::PetscData::CtxSetB
static constexpr Switches CtxSetB
Definition: LoopMethods.hpp:39
MoFEM::FEMethod::getDataDofsPtr
auto getDataDofsPtr() const
Definition: LoopMethods.hpp:408
MoFEM::PetscData::CtxSetA
static constexpr Switches CtxSetA
Definition: LoopMethods.hpp:38
MoFEM::PetscData::copyPetscData
MoFEMErrorCode copyPetscData(const PetscData &petsc_data)
Definition: LoopMethods.cpp:32
MoFEM::SnesMethod::snes_ctx
SNESContext snes_ctx
Definition: LoopMethods.hpp:121
MoFEM::Exceptions::MoFEMErrorCode
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
Definition: Exceptions.hpp:56
MoFEM::SnesMethod
data structure for snes (nonlinear solver) context
Definition: LoopMethods.hpp:105
MoFEM::PetscData::x_tt
Vec x_tt
Definition: LoopMethods.hpp:56
MoFEM::BasicMethod::BasicMethod
BasicMethod()
Definition: LoopMethods.cpp:110
MoFEM::PetscData::B
Mat B
Definition: LoopMethods.hpp:52
MoFEM.hpp
A
constexpr AssemblyType A
Definition: operators_tests.cpp:30
MoFEM::BasicMethod::preProcessHook
boost::function< MoFEMErrorCode()> preProcessHook
Hook function for pre-processing.
Definition: LoopMethods.hpp:298
MoFEM::PetscData
Definition: LoopMethods.hpp:13
ts_ctx
MoFEM::TsCtx * ts_ctx
Definition: level_set.cpp:1932
MoFEM::FEMethod::getNodeData
MoFEMErrorCode getNodeData(const std::string field_name, VectorDouble &data, const bool reset_dofs=true)
Definition: LoopMethods.cpp:173
MoFEM::BasicMethod::fieldsPtr
const Field_multiIndex * fieldsPtr
raw pointer to fields container
Definition: LoopMethods.hpp:256
MoFEM::TSMethod::query_interface
MoFEMErrorCode query_interface(boost::typeindex::type_index type_index, UnknownInterface **iface) const
Definition: LoopMethods.cpp:86
MoFEM::PetscData::dx
Vec dx
Definition: LoopMethods.hpp:54
MoFEM::BasicMethod::adjacenciesPtr
const FieldEntityEntFiniteElementAdjacencyMap_multiIndex * adjacenciesPtr
Definition: LoopMethods.hpp:271
MoFEM::SnesMethod::snes
SNES snes
snes solver
Definition: LoopMethods.hpp:123
MoFEM::BasicMethod::sIze
int sIze
number of processors in communicator
Definition: LoopMethods.hpp:246
CHKERR
#define CHKERR
Inline error check.
Definition: definitions.h:548
MoFEM::BasicMethod::entitiesPtr
const FieldEntity_multiIndex * entitiesPtr
raw pointer to container of field entities
Definition: LoopMethods.hpp:259
MoFEM
implementation of Data Operators for Forces and Sources
Definition: Common.hpp:10
MoFEM::KspMethod
data structure for ksp (linear solver) context
Definition: LoopMethods.hpp:67
MoFEM::PetscData::PetscData
PetscData()
Definition: LoopMethods.cpp:27
MoFEM::PetscData::data_ctx
Switches data_ctx
Definition: LoopMethods.hpp:46
MoFEM::FEMethod::getNumberOfNodes
auto getNumberOfNodes() const
Definition: LoopMethods.hpp:460
MoFEM::TSMethod::ts
TS ts
time solver
Definition: LoopMethods.hpp:159
MoFEM::FieldEntity::getLocalUniqueIdCalculate
UId getLocalUniqueIdCalculate()
Get the Local Unique Id Calculate object.
Definition: FieldEntsMultiIndices.hpp:136
MoFEM::BasicMethod::rAnk
int rAnk
processor rank
Definition: LoopMethods.hpp:244
MoFEM::SnesMethod::copySnes
MoFEMErrorCode copySnes(const SnesMethod &snes)
Copy snes data.
Definition: LoopMethods.cpp:76
MoFEM::PetscData::A
Mat A
Definition: LoopMethods.hpp:51
MoFEM::PetscData::CtxSetX_T
static constexpr Switches CtxSetX_T
Definition: LoopMethods.hpp:42
MoFEM::BasicMethod::preProcess
virtual MoFEMErrorCode preProcess()
function is run at the beginning of loop
Definition: LoopMethods.cpp:139
MoFEM::BasicMethod::postProcessHook
boost::function< MoFEMErrorCode()> postProcessHook
Hook function for post-processing.
Definition: LoopMethods.hpp:303
MoFEM::KspMethod::KspMethod
KspMethod()
Definition: LoopMethods.cpp:52
MoFEM::BasicMethod::refinedFiniteElementsPtr
const RefElement_multiIndex * refinedFiniteElementsPtr
container of mofem finite element entities
Definition: LoopMethods.hpp:252
MoFEM::TSMethod::ts_ctx
TSContext ts_ctx
Definition: LoopMethods.hpp:161
MoFEM::PetscData::CtxSetTime
static constexpr Switches CtxSetTime
Definition: LoopMethods.hpp:44
MOFEM_OPERATION_UNSUCCESSFUL
@ MOFEM_OPERATION_UNSUCCESSFUL
Definition: definitions.h:34
MoFEM::PetscData::CtxSetNone
static constexpr Switches CtxSetNone
Definition: LoopMethods.hpp:36
MoFEM::BasicMethod
Data structure to exchange data between mofem and User Loop Methods.
Definition: LoopMethods.hpp:187
MoFEM::BasicMethod::loopSize
int loopSize
local number oe methods to process
Definition: LoopMethods.hpp:207
MoFEM::KspMethod::ksp
KSP ksp
KSP solver.
Definition: LoopMethods.hpp:90
field_name
constexpr auto field_name
Definition: poisson_2d_homogeneous.cpp:13
MoFEM::PetscData::f
Vec f
Definition: LoopMethods.hpp:50
MoFEM::PetscData::CtxSetX_TT
static constexpr Switches CtxSetX_TT
Definition: LoopMethods.hpp:43
MoFEM::BasicMethod::copyBasicMethod
MoFEMErrorCode copyBasicMethod(const BasicMethod &basic)
Copy data from other base method to this base method.
Definition: LoopMethods.cpp:118
MoFEM::PetscData::CtxSetX
static constexpr Switches CtxSetX
Definition: LoopMethods.hpp:40
MoFEM::TSMethod::ts_step
PetscInt ts_step
time step number
Definition: LoopMethods.hpp:163
MoFEM::UnknownInterface
base class for all interface classes
Definition: UnknownInterface.hpp:34
MoFEM::BasicMethod::finiteElementsPtr
const FiniteElement_multiIndex * finiteElementsPtr
raw pointer to container finite elements
Definition: LoopMethods.hpp:264
MoFEM::BasicMethod::operatorHook
boost::function< MoFEMErrorCode()> operatorHook
Hook function for operator.
Definition: LoopMethods.hpp:308
MoFEM::TSMethod::ts_t
PetscReal ts_t
time
Definition: LoopMethods.hpp:166
MoFEM::BasicMethod::getFieldBitNumber
unsigned int getFieldBitNumber(std::string field_name) const
Definition: LoopMethods.hpp:274
MoFEM::BasicMethod::dofsPtr
const DofEntity_multiIndex * dofsPtr
raw pointer container of dofs
Definition: LoopMethods.hpp:261
HenckyOps::f
auto f
Definition: HenckyOps.hpp:15
MoFEM::SnesMethod::SnesMethod
SnesMethod()
Definition: LoopMethods.cpp:72
MoFEM::TSMethod::copyTs
MoFEMErrorCode copyTs(const TSMethod &ts)
Copy TS solver data.
Definition: LoopMethods.cpp:97
MoFEM::TSMethod
data structure for TS (time stepping) context
Definition: LoopMethods.hpp:138
UBlasVector< double >
MoFEM::Exceptions::ierr
static MoFEMErrorCodeGeneric< PetscErrorCode > ierr
Definition: Exceptions.hpp:76
MoFEM::BasicMethod::cacheWeakPtr
boost::weak_ptr< CacheTuple > cacheWeakPtr
Definition: LoopMethods.hpp:355
MoFEM::KspMethod::copyKsp
MoFEMErrorCode copyKsp(const KspMethod &ksp)
copy data form another method
Definition: LoopMethods.cpp:56
MoFEM::BasicMethod::problemPtr
const Problem * problemPtr
raw pointer to problem
Definition: LoopMethods.hpp:254
MoFEM::PetscData::x_t
Vec x_t
Definition: LoopMethods.hpp:55
MoFEM::PetscData::query_interface
MoFEMErrorCode query_interface(boost::typeindex::type_index type_index, UnknownInterface **iface) const
Definition: LoopMethods.cpp:21
MoFEM::BasicMethod::postProcess
virtual MoFEMErrorCode postProcess()
function is run at the end of loop
Definition: LoopMethods.cpp:150
MoFEM::PetscData::CtxSetF
static constexpr Switches CtxSetF
Definition: LoopMethods.hpp:37
MoFEMFunctionBeginHot
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:453
MoFEM::Unique_mi_tag
Definition: TagMultiIndices.hpp:18
MoFEM::TSMethod::ts_dt
PetscReal ts_dt
time step size
Definition: LoopMethods.hpp:167
MoFEM::KspMethod::query_interface
MoFEMErrorCode query_interface(boost::typeindex::type_index type_index, UnknownInterface **iface) const
Definition: LoopMethods.cpp:46
MoFEMFunctionReturn
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
Definition: definitions.h:429
CHKERRG
#define CHKERRG(n)
Check error code of MoFEM/MOAB/PETSc function.
Definition: definitions.h:496
MoFEMFunctionBegin
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:359
MoFEM::BasicMethod::operator()
virtual MoFEMErrorCode operator()()
function is run for every finite element
Definition: LoopMethods.cpp:161
MoFEM::KspMethod::ksp_ctx
KSPContext ksp_ctx
Context.
Definition: LoopMethods.hpp:89