v0.14.0
Public Types | Public Member Functions | Static Public Attributes | Protected Member Functions | Protected Attributes | List of all members
MoFEM::OpSchurAssembleEndImpl Struct Reference

Assemble Schur complement (Implementation) More...

#include <src/finite_elements/Schur.hpp>

Inheritance diagram for MoFEM::OpSchurAssembleEndImpl:
[legend]
Collaboration diagram for MoFEM::OpSchurAssembleEndImpl:
[legend]

Public Types

using MatSetValuesRaw = boost::function< MoFEMErrorCode(Mat mat, PetscInt m, const PetscInt idxm[], PetscInt n, const PetscInt idxn[], const PetscScalar v[], InsertMode addv)>
 
- Public Types inherited from MoFEM::ForcesAndSourcesCore::UserDataOperator
enum  OpType {
  OPROW = 1 << 0, OPCOL = 1 << 1, OPROWCOL = 1 << 2, OPSPACE = 1 << 3,
  OPLAST = 1 << 3
}
 Controls loop over entities on element. More...
 
using AdjCache = std::map< EntityHandle, std::vector< boost::weak_ptr< NumeredEntFiniteElement > >>
 
- Public Types inherited from MoFEM::DataOperator
using DoWorkLhsHookFunType = boost::function< MoFEMErrorCode(DataOperator *op_ptr, int row_side, int col_side, EntityType row_type, EntityType col_type, EntitiesFieldData::EntData &row_data, EntitiesFieldData::EntData &col_data)>
 
using DoWorkRhsHookFunType = boost::function< MoFEMErrorCode(DataOperator *op_ptr, int side, EntityType type, EntitiesFieldData::EntData &data)>
 

Public Member Functions

 OpSchurAssembleEndImpl (std::vector< std::string > fields_name, std::vector< boost::shared_ptr< Range >> field_ents, std::vector< SmartPetscObj< AO >> sequence_of_aos, std::vector< SmartPetscObj< Mat >> sequence_of_mats, std::vector< bool > sym_schur, bool symm_op=true)
 Construct a new Op Schur Assemble End object. More...
 
 OpSchurAssembleEndImpl (std::vector< std::string > fields_name, std::vector< boost::shared_ptr< Range >> field_ents, std::vector< SmartPetscObj< AO >> sequence_of_aos, std::vector< SmartPetscObj< Mat >> sequence_of_mats, std::vector< bool > sym_schur, std::vector< double > diag_eps, bool symm_op=true)
 Construct a new Op Schur Assemble End object. More...
 
- Public Member Functions inherited from MoFEM::ForcesAndSourcesCore::UserDataOperator
 UserDataOperator (const FieldSpace space, const char type=OPSPACE, const bool symm=true)
 
 UserDataOperator (const std::string field_name, const char type, const bool symm=true)
 
 UserDataOperator (const std::string row_field_name, const std::string col_field_name, const char type, const bool symm=true)
 
boost::shared_ptr< const NumeredEntFiniteElementgetNumeredEntFiniteElementPtr () const
 Return raw pointer to NumeredEntFiniteElement. More...
 
EntityHandle getFEEntityHandle () const
 Return finite element entity handle. More...
 
int getFEDim () const
 Get dimension of finite element. More...
 
EntityType getFEType () const
 Get dimension of finite element. More...
 
boost::weak_ptr< SideNumbergetSideNumberPtr (const int side_number, const EntityType type)
 Get the side number pointer. More...
 
EntityHandle getSideEntity (const int side_number, const EntityType type)
 Get the side entity. More...
 
int getNumberOfNodesOnElement () const
 Get the number of nodes on finite element. More...
 
MoFEMErrorCode getProblemRowIndices (const std::string filed_name, const EntityType type, const int side, VectorInt &indices) const
 Get row indices. More...
 
MoFEMErrorCode getProblemColIndices (const std::string filed_name, const EntityType type, const int side, VectorInt &indices) const
 Get col indices. More...
 
const FEMethodgetFEMethod () const
 Return raw pointer to Finite Element Method object. More...
 
int getOpType () const
 Get operator types. More...
 
void setOpType (const OpType type)
 Set operator type. More...
 
void addOpType (const OpType type)
 Add operator type. More...
 
int getNinTheLoop () const
 get number of finite element in the loop More...
 
int getLoopSize () const
 get size of elements in the loop More...
 
std::string getFEName () const
 Get name of the element. More...
 
ForcesAndSourcesCoregetPtrFE () const
 
ForcesAndSourcesCoregetSidePtrFE () const
 
ForcesAndSourcesCoregetRefinePtrFE () const
 
const PetscData::SwitchesgetDataCtx () const
 
const KspMethod::KSPContext getKSPCtx () const
 
const SnesMethod::SNESContext getSNESCtx () const
 
const TSMethod::TSContext getTSCtx () const
 
Vec getKSPf () const
 
Mat getKSPA () const
 
Mat getKSPB () const
 
Vec getSNESf () const
 
Vec getSNESx () const
 
Mat getSNESA () const
 
Mat getSNESB () const
 
Vec getTSu () const
 
Vec getTSu_t () const
 
Vec getTSu_tt () const
 
Vec getTSf () const
 
Mat getTSA () const
 
Mat getTSB () const
 
int getTSstep () const
 
double getTStime () const
 
double getTStimeStep () const
 
double getTSa () const
 
double getTSaa () const
 
MatrixDoublegetGaussPts ()
 matrix of integration (Gauss) points for Volume Element More...
 
auto getFTensor0IntegrationWeight ()
 Get integration weights. More...
 
MatrixDoublegetCoordsAtGaussPts ()
 Gauss points and weight, matrix (nb. of points x 3) More...
 
auto getFTensor1CoordsAtGaussPts ()
 Get coordinates at integration points assuming linear geometry. More...
 
double getMeasure () const
 get measure of element More...
 
doublegetMeasure ()
 get measure of element More...
 
MoFEMErrorCode loopSide (const string &fe_name, ForcesAndSourcesCore *side_fe, const size_t dim, const EntityHandle ent_for_side=0, const int verb=QUIET, const LogManager::SeverityLevel sev=Sev::noisy, AdjCache *adj_cache=nullptr)
 User calls this function to loop over elements on the side of face. This function calls finite element with its operator to do calculations. More...
 
MoFEMErrorCode loopThis (const string &fe_name, ForcesAndSourcesCore *this_fe, const int verb=QUIET, const LogManager::SeverityLevel sev=Sev::noisy)
 User calls this function to loop over the same element using a different set of integration points. This function calls finite element with its operator to do calculations. More...
 
MoFEMErrorCode loopParent (const string &fe_name, ForcesAndSourcesCore *parent_fe, const int verb=QUIET, const LogManager::SeverityLevel sev=Sev::noisy)
 User calls this function to loop over parent elements. This function calls finite element with its operator to do calculations. More...
 
MoFEMErrorCode loopChildren (const string &fe_name, ForcesAndSourcesCore *child_fe, const int verb=QUIET, const LogManager::SeverityLevel sev=Sev::noisy)
 User calls this function to loop over parent elements. This function calls finite element with its operator to do calculations. More...
 
- Public Member Functions inherited from MoFEM::DataOperator
 DataOperator (const bool symm=true)
 
virtual ~DataOperator ()=default
 
virtual MoFEMErrorCode doWork (int row_side, int col_side, EntityType row_type, EntityType col_type, EntitiesFieldData::EntData &row_data, EntitiesFieldData::EntData &col_data)
 Operator for bi-linear form, usually to calculate values on left hand side. More...
 
virtual MoFEMErrorCode opLhs (EntitiesFieldData &row_data, EntitiesFieldData &col_data)
 
virtual MoFEMErrorCode doWork (int side, EntityType type, EntitiesFieldData::EntData &data)
 Operator for linear form, usually to calculate values on right hand side. More...
 
virtual MoFEMErrorCode opRhs (EntitiesFieldData &data, const bool error_if_no_base=false)
 
bool getSymm () const
 Get if operator uses symmetry of DOFs or not. More...
 
void setSymm ()
 set if operator is executed taking in account symmetry More...
 
void unSetSymm ()
 unset if operator is executed for non symmetric problem More...
 

Static Public Attributes

static MatSetValuesRaw matSetValuesSchurRaw = ::MatSetValues
 
- Static Public Attributes inherited from MoFEM::ForcesAndSourcesCore::UserDataOperator
static const char *const OpTypeNames []
 

Protected Member Functions

template<typename I >
MoFEMErrorCode doWorkImpl (int side, EntityType type, EntitiesFieldData::EntData &data)
 
- Protected Member Functions inherited from MoFEM::ForcesAndSourcesCore::UserDataOperator
virtual MoFEMErrorCode setPtrFE (ForcesAndSourcesCore *ptr)
 

Protected Attributes

std::vector< std::string > fieldsName
 
std::vector< boost::shared_ptr< Range > > fieldEnts
 
std::vector< SmartPetscObj< AO > > sequenceOfAOs
 
std::vector< SmartPetscObj< Mat > > sequenceOfMats
 
std::vector< boolsymSchur
 
std::vector< doublediagEps
 
MatrixDouble invMat
 
MatrixDouble invDiagOffMat
 
MatrixDouble offMatInvDiagOffMat
 
MatrixDouble transOffMatInvDiagOffMat
 
- Protected Attributes inherited from MoFEM::ForcesAndSourcesCore::UserDataOperator
ForcesAndSourcesCoreptrFE
 

Additional Inherited Members

- Public Attributes inherited from MoFEM::ForcesAndSourcesCore::UserDataOperator
char opType
 
std::string rowFieldName
 
std::string colFieldName
 
FieldSpace sPace
 
- Public Attributes inherited from MoFEM::DataOperator
DoWorkLhsHookFunType doWorkLhsHook
 
DoWorkRhsHookFunType doWorkRhsHook
 
bool sYmm
 If true assume that matrix is symmetric structure. More...
 
std::array< bool, MBMAXTYPE > doEntities
 If true operator is executed for entity. More...
 
booldoVertices
 \deprectaed If false skip vertices More...
 
booldoEdges
 \deprectaed If false skip edges More...
 
booldoQuads
 \deprectaed More...
 
booldoTris
 \deprectaed More...
 
booldoTets
 \deprectaed More...
 
booldoPrisms
 \deprectaed More...
 

Detailed Description

Assemble Schur complement (Implementation)

Definition at line 35 of file Schur.hpp.

Member Typedef Documentation

◆ MatSetValuesRaw

using MoFEM::OpSchurAssembleEndImpl::MatSetValuesRaw = boost::function<MoFEMErrorCode( Mat mat, PetscInt m, const PetscInt idxm[], PetscInt n, const PetscInt idxn[], const PetscScalar v[], InsertMode addv)>

Definition at line 39 of file Schur.hpp.

Constructor & Destructor Documentation

◆ OpSchurAssembleEndImpl() [1/2]

MoFEM::OpSchurAssembleEndImpl::OpSchurAssembleEndImpl ( std::vector< std::string >  fields_name,
std::vector< boost::shared_ptr< Range >>  field_ents,
std::vector< SmartPetscObj< AO >>  sequence_of_aos,
std::vector< SmartPetscObj< Mat >>  sequence_of_mats,
std::vector< bool sym_schur,
bool  symm_op = true 
)

Construct a new Op Schur Assemble End object.

Parameters
fields_namelist of fields
field_entslist of entities on which schur complement is applied (can be empty)
sequence_of_aoslist of maps from base problem to Schur complement matrix
sequence_of_matslist of Schur complement matrices
sym_schurtrue if Schur complement is symmetric
symm_optrue if block diagonal is symmetric

Definition at line 207 of file Schur.cpp.

214  fieldsName(fields_name), fieldEnts(field_ents),
215  sequenceOfAOs(sequence_of_aos), sequenceOfMats(sequence_of_mats),
216  symSchur(sym_schur), diagEps(fields_name.size(), 0) {}

◆ OpSchurAssembleEndImpl() [2/2]

MoFEM::OpSchurAssembleEndImpl::OpSchurAssembleEndImpl ( std::vector< std::string >  fields_name,
std::vector< boost::shared_ptr< Range >>  field_ents,
std::vector< SmartPetscObj< AO >>  sequence_of_aos,
std::vector< SmartPetscObj< Mat >>  sequence_of_mats,
std::vector< bool sym_schur,
std::vector< double diag_eps,
bool  symm_op = true 
)

Construct a new Op Schur Assemble End object.

Parameters
fields_namelist of fields
field_entslist of entities on which schur complement is applied (can be empty)
sequence_of_aoslist of maps from base problem to Schur complement matrix
sequence_of_matslist of Schur complement matrices
sym_schurtrue if Schur complement is symmetric
diag_epsadd epsilon on diagonal of inverted matrix
symm_optrue if block diagonal is symmetric

Definition at line 196 of file Schur.cpp.

203  fieldsName(fields_name), fieldEnts(field_ents),
204  sequenceOfAOs(sequence_of_aos), sequenceOfMats(sequence_of_mats),
205  symSchur(sym_schur), diagEps(diag_eps) {}

Member Function Documentation

◆ doWorkImpl()

template<typename I >
MoFEMErrorCode MoFEM::OpSchurAssembleEndImpl::doWorkImpl ( int  side,
EntityType  type,
EntitiesFieldData::EntData data 
)
protected

Definition at line 220 of file Schur.cpp.

221  {
222 
224 #ifndef NDEBUG
225  MOFEM_LOG("SELF", Sev::noisy) << "Schur assemble begin -> end";
226 #endif
227 
228  auto assemble = [&](SmartPetscObj<Mat> M, MatSetValuesRaw mat_set_values,
229  auto &storage) {
231  if (M) {
232  for (auto &s : storage) {
233  auto &m = s.getMat();
234  if (m.size1()) {
235  auto &row_ind = s.getRowInd();
236  auto &col_ind = s.getColInd();
237 
238  if (mat_set_values(M, row_ind.size(), &*row_ind.begin(),
239  col_ind.size(), &*col_ind.begin(),
240  &*m.data().begin(), ADD_VALUES)) {
241  auto field_ents = getPtrFE()->mField.get_field_ents();
242  auto row_ent_it = field_ents->find(s.uidRow);
243  auto col_ent_it = field_ents->find(s.uidCol);
244  MOFEM_LOG_CHANNEL("SELF");
245  if (row_ent_it != field_ents->end())
246  MOFEM_LOG("SELF", Sev::error)
247  << "Assemble row entity: " << (*row_ent_it)->getName() << " "
248  << (*col_ent_it)->getEntTypeName() << " side "
249  << (*row_ent_it)->getSideNumber();
250  if (col_ent_it != field_ents->end())
251  MOFEM_LOG("SELF", Sev::error)
252  << "Assemble col entity: " << (*col_ent_it)->getName() << " "
253  << (*col_ent_it)->getEntTypeName() << " side "
254  << (*col_ent_it)->getSideNumber();
255  CHK_THROW_MESSAGE(ierr, "MatSetValues");
256  }
257  }
258  }
259  }
261  };
262 
263  auto apply_schur = [&](auto &storage,
264 
265  const auto ss,
266 
267  auto lo_uid, auto hi_uid, double eps) {
269 
270  auto add_off_mat = [&](auto row_uid, auto col_uid, auto &row_ind,
271  auto &col_ind, auto &offMatInvDiagOffMat) {
273 
274  const auto idx = SchurL2Mats::schurL2Storage.size();
275  const auto size = SchurL2Mats::locMats.size();
276 
277  if (idx >= size) {
278  SchurL2Mats::locMats.push_back(new MatrixDouble());
279  SchurL2Mats::rowIndices.push_back(new VectorInt());
280  SchurL2Mats::colIndices.push_back(new VectorInt());
281  }
282 
283  auto it = storage.template get<SchurL2Mats::uid_mi_tag>().find(
284  boost::make_tuple(row_uid, col_uid));
285 
286  if (it == storage.template get<SchurL2Mats::uid_mi_tag>().end()) {
287 
288  auto p = SchurL2Mats::schurL2Storage.emplace(idx, row_uid, col_uid);
289  auto &mat = p.first->getMat();
290  auto &set_row_ind = p.first->getRowInd();
291  auto &set_col_ind = p.first->getColInd();
292 
293  set_row_ind.resize(row_ind.size(), false);
294  noalias(set_row_ind) = row_ind;
295  set_col_ind.resize(col_ind.size(), false);
296  noalias(set_col_ind) = col_ind;
297 
298  mat.swap(offMatInvDiagOffMat);
299 
300  } else {
301  auto &mat = it->getMat();
302 #ifndef NDEBUG
303  if (mat.size1() != offMatInvDiagOffMat.size1()) {
304  SETERRQ2(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
305  "Wrong size %d != %d", mat.size1(),
306  offMatInvDiagOffMat.size1());
307  }
308  if (mat.size2() != offMatInvDiagOffMat.size2()) {
309  SETERRQ2(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
310  "Wrong size %d != %d", mat.size2(),
311  offMatInvDiagOffMat.size2());
312  }
313 #endif // NDEBUG
314  mat += offMatInvDiagOffMat;
315  }
317  };
318 
319  auto get_row_view = [&]() {
320  auto row_it =
321  storage.template get<SchurL2Mats::row_mi_tag>().lower_bound(lo_uid);
322  auto hi_row_it =
323  storage.template get<SchurL2Mats::row_mi_tag>().upper_bound(hi_uid);
324  std::vector<const SchurL2Mats *> schur_row_ptr_view;
325  schur_row_ptr_view.reserve(std::distance(row_it, hi_row_it));
326  for (; row_it != hi_row_it; ++row_it) {
327  schur_row_ptr_view.push_back(&*row_it);
328  }
329  return schur_row_ptr_view;
330  };
331 
332  auto get_col_view = [&]() {
333  auto col_it =
334  storage.template get<SchurL2Mats::col_mi_tag>().lower_bound(lo_uid);
335  auto hi_col_it =
336  storage.template get<SchurL2Mats::col_mi_tag>().upper_bound(hi_uid);
337  std::vector<const SchurL2Mats *> schur_col_ptr_view;
338  schur_col_ptr_view.reserve(std::distance(col_it, hi_col_it));
339  for (; col_it != hi_col_it; ++col_it) {
340  schur_col_ptr_view.push_back(&*col_it);
341  }
342  return schur_col_ptr_view;
343  };
344 
345  auto schur_row_ptr_view = get_row_view();
346  auto schur_col_ptr_view = get_col_view();
347 
348  for (auto row_it : schur_row_ptr_view) {
349  if (row_it->uidRow == row_it->uidCol) {
350 
351  CHKERR I::invertMat(row_it->getMat(), invMat, eps);
352 
353  for (auto c_lo : schur_col_ptr_view) {
354 
355  auto &row_uid = c_lo->uidRow;
356  if (row_uid == row_it->uidRow)
357  continue;
358 
359  auto &cc_off_mat = c_lo->getMat();
360  invDiagOffMat.resize(cc_off_mat.size1(), invMat.size2(), false);
361 #ifndef NDEBUG
362  if (invMat.size1() != cc_off_mat.size2()) {
363  SETERRQ2(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
364  "Wrong size %d != %d", invMat.size1(), cc_off_mat.size2());
365  }
366 #endif // NDEBUG
367 
368  // noalias(invDiagOffMat) = prod(cc_off_mat, invMat);
369  cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,
370  cc_off_mat.size1(), invMat.size2(), cc_off_mat.size2(),
371  1., &*cc_off_mat.data().begin(), cc_off_mat.size2(),
372  &*invMat.data().begin(), invMat.size2(), 0.,
373  &*invDiagOffMat.data().begin(), invDiagOffMat.size2());
374 
375  for (auto r_lo : schur_row_ptr_view) {
376  auto &col_uid = r_lo->uidCol;
377 
378  // Skip diagonal
379  if (col_uid == row_it->uidRow)
380  continue;
381 
382  // If symmetry only run upper off diagonal terms
383  if (symSchur[ss] && row_uid > col_uid)
384  continue;
385 
386  auto &rr_off_mat = r_lo->getMat();
387  offMatInvDiagOffMat.resize(invDiagOffMat.size1(),
388  rr_off_mat.size2(), false);
389 #ifndef NDEBUG
390  if (rr_off_mat.size1() != invDiagOffMat.size2()) {
391  SETERRQ2(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
392  "Wrong size %d != %d", rr_off_mat.size1(),
393  invDiagOffMat.size2());
394  }
395 #endif // NDEBUG
396 
397  // noalias(offMatInvDiagOffMat) = prod(invDiagOffMat, rr_off_mat);
398  cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,
399  invDiagOffMat.size1(), rr_off_mat.size2(),
400  invDiagOffMat.size2(), 1.,
401  &*invDiagOffMat.data().begin(), invDiagOffMat.size2(),
402  &*rr_off_mat.data().begin(), rr_off_mat.size2(), 0.,
403  &*offMatInvDiagOffMat.data().begin(),
404  offMatInvDiagOffMat.size2());
405 
406  CHKERR add_off_mat(row_uid, col_uid, c_lo->getRowInd(),
407  r_lo->getColInd(), offMatInvDiagOffMat);
408 
409  if (symSchur[ss] && row_uid != col_uid) {
411  offMatInvDiagOffMat.size1(),
412  false);
414  CHKERR add_off_mat(col_uid, row_uid, r_lo->getColInd(),
415  c_lo->getRowInd(), transOffMatInvDiagOffMat);
416  }
417  }
418  }
419  }
420  }
421 
423  };
424 
425  auto erase_factored = [&](auto &storage,
426 
427  const auto ss, auto lo_uid, auto hi_uid) {
429 
430  auto r_lo =
431  storage.template get<SchurL2Mats::row_mi_tag>().lower_bound(lo_uid);
432  auto r_hi =
433  storage.template get<SchurL2Mats::row_mi_tag>().upper_bound(hi_uid);
434  storage.template get<SchurL2Mats::row_mi_tag>().erase(r_lo, r_hi);
435 
436  auto c_lo =
437  storage.template get<SchurL2Mats::col_mi_tag>().lower_bound(lo_uid);
438  auto c_hi =
439  storage.template get<SchurL2Mats::col_mi_tag>().upper_bound(hi_uid);
440  storage.template get<SchurL2Mats::col_mi_tag>().erase(c_lo, c_hi);
441 
443  };
444 
445  auto assemble_off_diagonal = [&](auto &storage, const auto ss) {
447 
448  // apply AO
449  for (auto &m : storage) {
450  if (auto ao = sequenceOfAOs[ss]) {
451  auto &ind_row = m.getRowInd();
452  CHKERR AOApplicationToPetsc(ao, ind_row.size(), &*ind_row.begin());
453  auto &ind_col = m.getColInd();
454  CHKERR AOApplicationToPetsc(ao, ind_col.size(), &*ind_col.begin());
455  }
456  }
457 
458  // assemble Schur
459  if (sequenceOfMats[ss]) {
460  CHKERR assemble(sequenceOfMats[ss], matSetValuesSchurRaw, storage);
461  }
462 
464  };
465 
466  auto &storage = SchurL2Mats::schurL2Storage;
467  // Assemble to global matrix
468 
469  // Assemble Schur complements
470  // Iterate complements
471  for (auto ss = 0; ss != fieldsName.size(); ++ss) {
472 
473  auto assemble = [&](auto &storage, auto ss, auto lo_uid, auto hi_uid) {
475 
476  CHKERR apply_schur(storage, ss, lo_uid, hi_uid, diagEps[ss]);
477  CHKERR erase_factored(storage, ss, lo_uid, hi_uid);
478  CHKERR assemble_off_diagonal(storage, ss);
480  };
481 
482  auto field_bit = getPtrFE()->mField.get_field_bit_number(fieldsName[ss]);
483  auto row_ents = fieldEnts[ss];
484 
485  if (row_ents) {
486  for (auto p = row_ents->pair_begin(); p != row_ents->pair_end(); ++p) {
487  auto lo_uid =
488  FieldEntity::getLoLocalEntityBitNumber(field_bit, p->first);
489  auto hi_uid =
490  FieldEntity::getHiLocalEntityBitNumber(field_bit, p->second);
491  CHKERR assemble(storage, ss, lo_uid, hi_uid);
492  }
493  } else {
494  // Iterate all entities (typically L2)
496  field_bit, get_id_for_min_type<MBVERTEX>());
498  field_bit, get_id_for_max_type<MBENTITYSET>());
499  CHKERR assemble(storage, ss, lo_uid, hi_uid);
500  }
501  }
502 
503 #ifndef NDEBUG
504  MOFEM_LOG("SELF", Sev::noisy) << "Schur assemble done";
505 #endif
506 
508 }

Member Data Documentation

◆ diagEps

std::vector<double> MoFEM::OpSchurAssembleEndImpl::diagEps
protected

Definition at line 88 of file Schur.hpp.

◆ fieldEnts

std::vector<boost::shared_ptr<Range> > MoFEM::OpSchurAssembleEndImpl::fieldEnts
protected

Definition at line 84 of file Schur.hpp.

◆ fieldsName

std::vector<std::string> MoFEM::OpSchurAssembleEndImpl::fieldsName
protected

Definition at line 83 of file Schur.hpp.

◆ invDiagOffMat

MatrixDouble MoFEM::OpSchurAssembleEndImpl::invDiagOffMat
protected

Definition at line 91 of file Schur.hpp.

◆ invMat

MatrixDouble MoFEM::OpSchurAssembleEndImpl::invMat
protected

Definition at line 90 of file Schur.hpp.

◆ matSetValuesSchurRaw

OpSchurAssembleEndImpl::MatSetValuesRaw MoFEM::OpSchurAssembleEndImpl::matSetValuesSchurRaw = ::MatSetValues
static

Definition at line 41 of file Schur.hpp.

◆ offMatInvDiagOffMat

MatrixDouble MoFEM::OpSchurAssembleEndImpl::offMatInvDiagOffMat
protected

Definition at line 92 of file Schur.hpp.

◆ sequenceOfAOs

std::vector<SmartPetscObj<AO> > MoFEM::OpSchurAssembleEndImpl::sequenceOfAOs
protected

Definition at line 85 of file Schur.hpp.

◆ sequenceOfMats

std::vector<SmartPetscObj<Mat> > MoFEM::OpSchurAssembleEndImpl::sequenceOfMats
protected

Definition at line 86 of file Schur.hpp.

◆ symSchur

std::vector<bool> MoFEM::OpSchurAssembleEndImpl::symSchur
protected

Definition at line 87 of file Schur.hpp.

◆ transOffMatInvDiagOffMat

MatrixDouble MoFEM::OpSchurAssembleEndImpl::transOffMatInvDiagOffMat
protected

Definition at line 93 of file Schur.hpp.


The documentation for this struct was generated from the following files:
NOSPACE
@ NOSPACE
Definition: definitions.h:83
MoFEM::OpSchurAssembleEndImpl::offMatInvDiagOffMat
MatrixDouble offMatInvDiagOffMat
Definition: Schur.hpp:92
MOFEM_LOG_CHANNEL
#define MOFEM_LOG_CHANNEL(channel)
Set and reset channel.
Definition: LogManager.hpp:284
MoFEM::ForcesAndSourcesCore::UserDataOperator::OPSPACE
@ OPSPACE
operator do Work is execute on space data
Definition: ForcesAndSourcesCore.hpp:570
MoFEM::OpSchurAssembleEndImpl::matSetValuesSchurRaw
static MatSetValuesRaw matSetValuesSchurRaw
Definition: Schur.hpp:41
MoFEM::FieldEntity::getLoLocalEntityBitNumber
static UId getLoLocalEntityBitNumber(const char bit_number, const EntityHandle ent)
Definition: FieldEntsMultiIndices.hpp:247
CHK_THROW_MESSAGE
#define CHK_THROW_MESSAGE(err, msg)
Check and throw MoFEM exception.
Definition: definitions.h:596
MoFEM::Types::MatrixDouble
UBlasMatrix< double > MatrixDouble
Definition: Types.hpp:77
MoFEM::CoreInterface::get_field_bit_number
virtual FieldBitNumber get_field_bit_number(const std::string name) const =0
get field bit number
PlasticOps::M
FTensor::Index< 'M', 3 > M
Definition: PlasticOps.hpp:117
CHKERR
#define CHKERR
Inline error check.
Definition: definitions.h:535
MoFEM::OpSchurAssembleEndImpl::fieldEnts
std::vector< boost::shared_ptr< Range > > fieldEnts
Definition: Schur.hpp:84
MoFEM::SchurL2Mats::schurL2Storage
static SchurL2Storage schurL2Storage
Definition: Schur.hpp:184
MoFEM::OpSchurAssembleEndImpl::diagEps
std::vector< double > diagEps
Definition: Schur.hpp:88
MoFEM::ForcesAndSourcesCore::UserDataOperator::getPtrFE
ForcesAndSourcesCore * getPtrFE() const
Definition: ForcesAndSourcesCore.hpp:1250
MoFEM::CoreInterface::get_field_ents
virtual const FieldEntity_multiIndex * get_field_ents() const =0
Get the field ents object.
MoFEM::OpSchurAssembleEndImpl::invMat
MatrixDouble invMat
Definition: Schur.hpp:90
MoFEM::OpSchurAssembleEndImpl::transOffMatInvDiagOffMat
MatrixDouble transOffMatInvDiagOffMat
Definition: Schur.hpp:93
MoFEM::ForcesAndSourcesCore::UserDataOperator
friend class UserDataOperator
Definition: ForcesAndSourcesCore.hpp:482
MOFEM_LOG
#define MOFEM_LOG(channel, severity)
Log.
Definition: LogManager.hpp:308
MoFEM::SchurL2Mats::rowIndices
static boost::ptr_vector< VectorInt > rowIndices
Definition: Schur.hpp:182
MoFEM::Types::VectorInt
UBlasVector< int > VectorInt
Definition: Types.hpp:67
eps
static const double eps
Definition: check_base_functions_derivatives_on_tet.cpp:11
MoFEM::SchurL2Mats::locMats
static boost::ptr_vector< MatrixDouble > locMats
Definition: Schur.hpp:181
MoFEM::OpSchurAssembleEndImpl::fieldsName
std::vector< std::string > fieldsName
Definition: Schur.hpp:83
MoFEM::Exceptions::ierr
static MoFEMErrorCodeGeneric< PetscErrorCode > ierr
Definition: Exceptions.hpp:76
MOFEM_DATA_INCONSISTENCY
@ MOFEM_DATA_INCONSISTENCY
Definition: definitions.h:31
MoFEM::OpSchurAssembleEndImpl::sequenceOfAOs
std::vector< SmartPetscObj< AO > > sequenceOfAOs
Definition: Schur.hpp:85
MoFEM::OpSchurAssembleEndImpl::MatSetValuesRaw
boost::function< MoFEMErrorCode(Mat mat, PetscInt m, const PetscInt idxm[], PetscInt n, const PetscInt idxn[], const PetscScalar v[], InsertMode addv)> MatSetValuesRaw
Definition: Schur.hpp:39
MoFEM::FieldEntity::getHiLocalEntityBitNumber
static UId getHiLocalEntityBitNumber(const char bit_number, const EntityHandle ent)
Definition: FieldEntsMultiIndices.hpp:258
MoFEM::OpSchurAssembleEndImpl::sequenceOfMats
std::vector< SmartPetscObj< Mat > > sequenceOfMats
Definition: Schur.hpp:86
m
FTensor::Index< 'm', 3 > m
Definition: shallow_wave.cpp:80
MoFEM::OpSchurAssembleEndImpl::symSchur
std::vector< bool > symSchur
Definition: Schur.hpp:87
MoFEM::SchurL2Mats::colIndices
static boost::ptr_vector< VectorInt > colIndices
Definition: Schur.hpp:183
MoFEMFunctionReturn
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
Definition: definitions.h:416
MoFEM::OpSchurAssembleEndImpl::invDiagOffMat
MatrixDouble invDiagOffMat
Definition: Schur.hpp:91
MoFEMFunctionBegin
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:346
MoFEM::ForcesAndSourcesCore::mField
Interface & mField
Definition: ForcesAndSourcesCore.hpp:24