34 #include "petscviewer.h"
35 #include "petscerror.h"
37 #include <boost/foreach.hpp>
81 namespace it = Input::Type;
85 .
add_value(NoMortar,
"None",
"Mortar space: P0 on elements of lower dimension.")
86 .
add_value(MortarP0,
"P0",
"Mortar space: P0 on elements of lower dimension.")
87 .
add_value(MortarP1,
"P1",
"Mortar space: P1 on intersections, using non-conforming pressures.");
102 "Number of Schur complements to perform when solving MH sytem.")
104 "Linear solver for MH problem.")
106 "Parameters of output form MH module.")
108 "Method for coupling Darcy flow between dimensions." );
112 =
it::Record(
"Steady_MH",
"Mixed-Hybrid solver for STEADY saturated Darcy flow.")
122 =
it::Record(
"Unsteady_MH",
"Mixed-Hybrid solver for unsteady saturated Darcy flow.")
125 "Time governor setting for the unsteady Darcy flow model.")
126 .
copy_keys(DarcyFlowMH_Steady::input_type);
130 =
it::Record(
"Unsteady_LMH",
"Lumped Mixed-Hybrid solver for unsteady saturated Darcy flow.")
133 "Time governor setting for the unsteady Darcy flow model.")
134 .
copy_keys(DarcyFlowMH_Steady::input_type);
150 ADD_FIELD(
cross_section,
"Complement dimension parameter (cross section for 1D, thickness for 2D).",
"1.0" );
156 ADD_FIELD(
sigma,
"Transition coefficient between dimensions.",
"1.0");
162 ADD_FIELD(
bc_type,
"Boundary condition type, possible values:",
"\"none\"" );
190 main_matrix_fields = this->subset({
"anisotropy",
"conductivity",
"cross_section",
"sigma",
"bc_type",
"bc_robin_sigma"});
191 rhs_fields = this->subset({
"water_source_density",
"bc_pressure",
"bc_flux"});
214 using namespace Input;
287 xprintf(
MsgLog,
"Linear solver ended with reason: %d \n", convergedReason );
288 ASSERT( convergedReason >= 0,
"Linear solver failed to converge. Convergence reason %d \n", convergedReason );
348 vec_size = this->
size;
349 ASSERT(vec != NULL,
"Requested solution is not allocated!\n");
355 ASSERT(vec != NULL,
"Requested solution is not allocated!\n");
400 int el_row, side_row, edge_row;
402 int side_rows[4], edge_rows[4];
407 for(
int i=0; i<1000; i++) zeros[i]=0.0;
409 double minus_ones[4] = { -1.0, -1.0, -1.0, -1.0 };
410 double loc_side_rhs[4];
413 for (
unsigned int i_loc = 0; i_loc <
el_ds->
lsize(); i_loc++) {
417 unsigned int nsides = ele->n_sides();
421 for (
unsigned int i = 0; i < nsides; i++) {
423 edge_row = edge_rows[i] =
row_4_edge[ele->side(i)->edge_idx()];
424 bcd=ele->side(i)->cond();
427 loc_side_rhs[i] = (ele->centre()[ 2 ] - ele->side(i)->centre()[ 2 ]);
440 loc_side_rhs[i] -= bc_pressure;
471 double val_side = (fe_values.
local_matrix())[i*nsides+i];
472 double val_edge = -1./ (fe_values.
local_matrix())[i*nsides+i];
474 static_cast<LinSys_BDDC*
>(ls)->diagonal_weights_set_value( side_row, val_side );
475 static_cast<LinSys_BDDC*
>(ls)->diagonal_weights_set_value( edge_row, val_edge );
501 static_cast<LinSys_BDDC*
>(ls)->diagonal_weights_set_value( el_row, val_ele );
506 for (
unsigned int i = 0; i < ele->n_neighs_vb; i++) {
509 ngh= ele->neigh_vb[i];
516 switch (ele_higher->dim()) {
531 double value =
data_.
sigma.
value( ele->centre(), ele->element_accessor()) *
540 local_vb[0] = -value; local_vb[1] = value;
541 local_vb[2] = value; local_vb[3] = -value;
547 int ind = tmp_rows[1];
549 double new_val = - value;
550 static_cast<LinSys_BDDC*
>(ls)->diagonal_weights_set_value( ind, new_val );
561 tmp_rows[2+i] = tmp_rows[1];
570 ASSERT(ele->n_neighs_vb*ele->n_neighs_vb<1000,
"Too many values in E block.");
572 ele->n_neighs_vb, tmp_rows+2, zeros);
592 vector<int> &dofs,
unsigned int &ele_type,
double &delta, arma::vec &dirichlet) {
596 if (i_ele == (
int)(ml_it_->size()) ) {
602 const Intersection &isect=intersections_[ (*ml_it_)[i_ele] ];
609 for(
unsigned int i_side=0; i_side < ele->
n_sides(); i_side++ ) {
610 dofs[i_side]=darcy_.row_4_edge[ele->
side(i_side)->
edge_idx()];
613 dirichlet.resize(ele->
n_sides());
619 dofs[i_side] = -dofs[i_side];
620 double bc_pressure = darcy_.data_.bc_pressure.value(b_ele.
centre(), b_ele);
621 dirichlet[i_side] = bc_pressure;
632 double delta_i, delta_j;
634 arma::vec dirichlet_i, dirichlet_j;
635 unsigned int ele_type_i, ele_type_j;
640 for(ml_it_ = master_list_.begin(); ml_it_ != master_list_.end(); ++ml_it_) {
642 if (ml_it_->size() == 0)
continue;
658 master_ = intersections_[ml_it_->front()].master_iter();
659 delta_0 = master_->measure();
661 double master_sigma=darcy_.data_.sigma.value( master_->centre(), master_->element_accessor());
664 for(i = 0; i <= ml_it_->size(); ++i) {
665 pressure_diff(i, dofs_i, ele_type_i, delta_i, dirichlet_i);
667 for (j = 0; j <= ml_it_->size(); ++j) {
668 pressure_diff(j, dofs_j, ele_type_j, delta_j, dirichlet_j);
670 double scale = -master_sigma * delta_i * delta_j / delta_0;
671 product = scale * tensor_average[ele_type_i][ele_type_j];
673 arma::vec rhs(dofs_i.size());
675 ls.
set_values( dofs_i, dofs_j, product, rhs, dirichlet_i, dirichlet_j);
686 for(
unsigned int i_side=0; i_side < ele->
n_sides(); i_side++ ) {
687 dofs[shift+i_side] = darcy_.row_4_edge[ele->
side(i_side)->
edge_idx()];
696 dofs[shift + i_side] = -dofs[shift + i_side];
697 double bc_pressure = darcy_.data_.bc_pressure.value(b_ele.
centre(), b_ele);
698 dirichlet[shift + i_side] = bc_pressure;
724 const Element * master = intersec.master_iter();
725 const Element * slave = intersec.slave_iter();
727 add_sides(master, 0, dofs, dirichlet);
728 add_sides(slave, 2, dofs, dirichlet);
755 arma::vec point_Y(1);
757 arma::vec point_2D_Y(intersec.map_to_slave(point_Y));
758 arma::vec point_1D_Y(intersec.map_to_master(point_Y));
760 arma::vec point_X(1);
762 arma::vec point_2D_X(intersec.map_to_slave(point_X));
763 arma::vec point_1D_X(intersec.map_to_master(point_X));
765 arma::mat base_2D(3, 3);
768 base_2D << 1.0 << 0.0 << -2.0 << arma::endr
769 << -1.0 << 2.0 << 2.0 << arma::endr
770 << 1.0 << -2.0 << 0.0 << arma::endr;
772 arma::mat base_1D(2, 2);
775 base_1D << 1.0 << -1.0 << arma::endr
776 << 0.0 << 1.0 << arma::endr;
779 arma::vec difference_in_Y(5);
780 arma::vec difference_in_X(5);
783 difference_in_Y.subvec(0, 2) = -base_2D * point_2D_Y;
784 difference_in_X.subvec(0, 2) = -base_2D * point_2D_X;
786 difference_in_Y.subvec(3, 4) = base_1D * point_1D_Y;
787 difference_in_X.subvec(3, 4) = base_1D * point_1D_X;
791 for (
int i = 0; i < 5; ++i) {
792 for (
int j = 0; j < 5; ++j) {
793 A(i, j) = -master_sigma * intersec.intersection_true_size() *
794 ( difference_in_Y[i] * difference_in_Y[j]
795 + difference_in_Y[i] * difference_in_X[j]/2
796 + difference_in_X[i] * difference_in_Y[j]/2
797 + difference_in_X[i] * difference_in_X[j]
803 ls.
set_values( dofs, dofs, A, rhs, dirichlet, dirichlet);
824 xprintf(
Warn,
"For BDDC is using no Schur complements.");
838 xprintf(
Err,
"Flow123d was not build with BDDCML support.\n");
844 xprintf(
Warn,
"Invalid number of Schur Complements. Using 2.");
857 ls->LinSys::set_from_input(in_rec);
868 ls->set_from_input(in_rec);
869 ls->set_solution( NULL );
870 ls->set_positive_definite();
878 ISCreateStride(PETSC_COMM_WORLD,
el_ds->
lsize(), ls->get_distribution()->begin(), 1, &is);
881 ls1->set_negative_definite();
884 schur2 =
new LinSys_PETSC( ls1->make_complement_distribution() );
885 ls1->set_complement( schur2 );
888 ls->set_complement( schur1 );
900 xprintf(
Err,
"Unknown solver type. Internal error.\n");
917 DBGMSG(
"Assembly linear system\n");
919 DBGMSG(
" Data changed\n");
932 DBGMSG(
" setup time term\n");
943 xprintf(
PrgErr,
"Planned computation time for steady solver, but data are not changed.\n");
973 for (
unsigned int i_loc = 0; i_loc <
el_ds->
lsize(); i_loc++ ) {
976 int e_idx = el.
index();
978 int elDim = el->dim();
979 elDimMax = std::max( elDimMax, elDim );
980 elDimMin = std::min( elDimMin, elDim );
982 isegn.push_back( e_idx );
990 localDofMap.insert( std::make_pair( side_row, coord ) );
991 inet.push_back( side_row );
998 localDofMap.insert( std::make_pair( el_row, coord ) );
999 inet.push_back( el_row );
1004 int edge_row =
row_4_edge[ el->side(si)->edge_idx() ];
1007 localDofMap.insert( std::make_pair( edge_row, coord ) );
1008 inet.push_back( edge_row );
1013 for (
unsigned int i_neigh = 0; i_neigh < el->n_neighs_vb; i_neigh++) {
1014 int edge_row =
row_4_edge[ el->neigh_vb[i_neigh]->edge_idx() ];
1015 arma::vec3 coord = el->neigh_vb[i_neigh]->edge()->side(0)->centre();
1017 localDofMap.insert( std::make_pair( edge_row, coord ) );
1018 inet.push_back( edge_row );
1022 nnet.push_back( nne );
1032 for (
int i = 0; i < 3; i++) {
1033 coef = coef + aniso.at(i,i);
1036 coef = conduct*coef / 3;
1039 "Zero coefficient of hydrodynamic resistance %f . \n ", coef );
1040 element_permeability.push_back( 1. / coef );
1044 int numNodeSub = localDofMap.size();
1055 for ( ; itB != localDofMap.end(); ++itB ) {
1056 isngn[ind] = itB -> first;
1059 for (
int j = 0; j < 3; j++ ) {
1060 xyz[ j*numNodeSub + ind ] = coord[j];
1065 localDofMap.clear();
1073 Global2LocalMap_ global2LocalNodeMap;
1074 for (
unsigned ind = 0; ind < isngn.size(); ++ind ) {
1075 global2LocalNodeMap.insert( std::make_pair( static_cast<unsigned>( isngn[ind] ), ind ) );
1080 for (
unsigned int iEle = 0; iEle < isegn.size(); iEle++ ) {
1081 int nne = nnet[ iEle ];
1082 for (
int ien = 0; ien < nne; ien++ ) {
1084 int indGlob = inet[indInet];
1086 Global2LocalMap_::iterator pos = global2LocalNodeMap.find( indGlob );
1087 ASSERT( pos != global2LocalNodeMap.end(),
1088 "Cannot remap node index %d to local indices. \n ", indGlob );
1089 int indLoc =
static_cast<int> ( pos -> second );
1092 inet[ indInet++ ] = indLoc;
1096 int numNodes =
size;
1097 int numDofsInt =
size;
1099 int meshDim = elDimMax;
1101 bddc_ls -> load_mesh( spaceDim, numNodes, numDofsInt, inet, nnet, nndf, isegn, isngn, isngn, xyz, element_permeability, meshDim );
1149 int edge_shift[np], el_shift[np], side_shift[np];
1150 unsigned int rows_starts[np];
1158 for (i = 0; i < np; i++) {
1165 rows_starts[i] = shift;
1168 for (i = 0; i < side_n_id; i++) {
1173 for (i = 0; i < el_n_id; i++) {
1179 for (i = 0; i < edge_n_id; i++) {
1185 for (i = np - 1; i > 0; i--)
1186 rows_starts[i] -= rows_starts[i - 1];
1188 rows_ds = boost::make_shared<Distribution>(&(rows_starts[0]), PETSC_COMM_WORLD);
1200 VecCreateSeqWithArray(PETSC_COMM_SELF,1,
size,
solution,
1213 loc_idx[i++] =
row_4_el[ele.index()];
1215 for(
unsigned int i_edg=0; i_edg <
mesh_->
n_edges(); i_edg++) {
1218 ASSERT( i==
size,
"Size of array does not match number of fills.\n");
1220 ISCreateGeneral(PETSC_COMM_SELF,
size, loc_idx, PETSC_COPY_VALUES, &(is_loc));
1224 ISDestroy(&(is_loc));
1262 loc_part =
new int[init_edge_ds.lsize()];
1267 unsigned int i_edg = edg -
mesh_->
edges.begin();
1270 if (init_edge_ds.is_local(i_edg)) {
1272 loc_part[loc_i++] = el_ds->get_proc(
row_4_el[e_idx]);
1275 id_4_old[i_edg] = i_edg;
1286 loc_part =
new int[init_side_ds.lsize()];
1293 if (init_side_ds.is_local(is)) {
1295 loc_part[loc_i++] = el_ds->get_proc(
1317 int side_row, edge_row;
1325 for (
unsigned int i_loc = 0; i_loc < el_ds->lsize(); i_loc++) {
1327 int el_row =
row_4_el[el_4_loc[i_loc]];
1331 unsigned int nsides = el->
n_sides();
1332 for (
unsigned int i = 0; i < nsides; i++) {
1340 for (
unsigned int i_neigh = 0; i_neigh < el->
n_neighs_vb; i_neigh++) {
1348 #endif // HAVE_BDDCML
1356 const PetscInt *cols;
1362 MatGetOwnershipRange(m, &first, &last);
1363 for (
int row = first; row < last; row++) {
1364 MatGetRow(m, row, &n, &cols, PETSC_NULL);
1365 bool exists_off =
false;
1366 for (
int i = 0; i < n; i++)
1368 n_off++, exists_off =
true;
1373 MatRestoreRow(m, row, &n, &cols, PETSC_NULL);
1428 for (
unsigned int i_loc_el = 0; i_loc_el <
el_ds->
lsize(); i_loc_el++) {
1447 PetscScalar *local_diagonal;
1452 for (
unsigned int i_loc_el = 0; i_loc_el <
el_ds->
lsize(); i_loc_el++) {
1524 for (
unsigned int i_loc_el = 0; i_loc_el <
el_ds->
lsize(); i_loc_el++) {
1530 int edge_row =
row_4_edge[ele->side(i)->edge_idx()];
1555 for (
unsigned int i_loc_el = 0; i_loc_el <
el_ds->
lsize(); i_loc_el++) {
1561 int edge_row =
row_4_edge[ele->side(i)->edge_idx()];
1566 time_->
dt() / ele->n_sides(),ADD_VALUES);
1601 int side_row, loc_edge_row, i;
1604 double new_pressure, old_pressure, time_coef;
1606 PetscScalar *loc_prev_sol;
1611 for (
unsigned int i_loc = 0; i_loc <
edge_ds->
lsize(); i_loc++) {
1617 old_pressure = loc_prev_sol[loc_edge_row];
1621 time_coef = - ele->
measure() *
1625 VecSetValue(
schur0->
get_solution(), side_row, time_coef * (new_pressure - old_pressure), ADD_VALUES);
1639 for (
unsigned int i_loc = 0; i_loc <
el_ds->
lsize(); i_loc++) {
1643 values[i] = -1.0 * ele->
measure() *
void set_input_list(Input::Array input_list)
Class MappingP1 implements the affine transformation of the unit cell onto the actual cell...
unsigned int get_proc(unsigned int idx) const
get processor of the given index
void set_limit_side(LimitSide side)
Output class for darcy_flow_mh model.
virtual void postprocess()
postprocess velocity field (add sources)
virtual void get_solution_vector(double *&vec, unsigned int &vec_size)
SchurComplement SchurComplement
virtual void setup_time_term()
void set_symmetric(bool flag=true)
Solver based on the original PETSc solver using MPIAIJ matrix and succesive Schur complement construc...
void make_intersec_elements()
void id_maps(int n_ids, int *id_4_old, Distribution *&new_ds, int *&id_4_loc, int *&new_4_id)
static Input::Type::Record input_type
#define FOR_EDGE_SIDES(i, j)
#define FOR_ELEMENTS(_mesh_, __i)
unsigned int edge_idx() const
MortarMethod mortar_method_
virtual void start_add_assembly()
FieldBasePtr(* read_field_descriptor_hook)(Input::Record rec, const FieldCommon &field)
double fix_dt_until_mark()
Fixing time step until fixed time mark.
virtual PetscErrorCode mat_zero_entries()
Wrappers for linear systems based on MPIAIJ and MATIS format.
virtual void rhs_set_values(int nrow, int *rows, double *vals)=0
friend class P1_CouplingAssembler
void mat_count_off_proc_values(Mat m, Vec v)
bool is_end() const
Returns true if the actual time is greater than or equal to the end time.
static Input::Type::Selection mh_mortar_selection
void assembly(LinSys &ls)
void next_time()
Proceed to the next time according to current estimated time step.
bool solution_changed_for_scatter
const arma::vec::fixed< spacedim > normal_vector(unsigned int point_no)
Returns the normal vector to a side at given quadrature point.
arma::vec3 centre() const
friend class P0_CouplingAssembler
#define ELEMENT_FULL_ITER(_mesh_, i)
void assembly(LinSys &ls)
virtual void start_allocation()
static Input::Type::Record input_type
Class FEValues calculates finite element data on the actual cells such as shape function values...
#define FOR_ELEMENT_SIDES(i, j)
boost::shared_ptr< Distribution > rows_ds
virtual void finish_assembly()=0
virtual double get_solution_precision()=0
static Input::Type::Record input_type
BCField< 3, FieldValue< 3 >::Scalar > bc_flux
void pressure_diff(int i_ele, vector< int > &dofs, unsigned int &ele_type, double &delta, arma::vec &dirichlet)
static Input::Type::Record input_type
void set_from_input(const Input::Record in_rec)
BCField< 3, FieldValue< 3 >::Enum > bc_type
Field< 3, FieldValue< 3 >::Scalar > storativity
#define ADD_FIELD(name,...)
Basic time management functionality for unsteady (and steady) solvers (class Equation).
FieldCommon & units(const UnitSI &units)
Set basic units of the field.
Partitioning * get_part()
Basic time management class.
static arma::vec4 gravity_
void view(const char *name="") const
void modify_system() override
Symmetric Gauss-Legendre quadrature formulae on simplices.
BCField< 3, FieldValue< 3 >::Scalar > bc_pressure
Assembly explicit Schur complement for the given linear system. Provides method for resolution of the...
void mat_set_value(int row, int col, double val)
unsigned int size() const
Returns size of the container. This is independent of the allocated space.
virtual void update_solution()
unsigned int n_elements() const
virtual void get_parallel_solution_vector(Vec &vector)
virtual void modify_system()
static Input::Type::AbstractRecord input_type
double * get_solution_array()
void update(ElementFullIter ele, FieldType &cond_anisothropy, FieldType_Scalar &cross_section, FieldType_Scalar &conductivity)
#define ASSERT_EQUAL(a, b)
const Vec & get_solution()
Definitions of basic Lagrangean finite elements with polynomial shape functions.
Field< 3, FieldValue< 3 >::TensorFixed > anisotropy
unsigned int begin(int proc) const
get starting local index
void assembly_linear_system()
FieldCommon & input_selection(const Input::Type::Selection *element_selection)
void modify_system() override
unsigned int n_sides() const
static std::shared_ptr< FieldAlgorithmBase< 3, FieldValue< 3 >::Scalar > > bc_piezo_head_hook(Input::Record rec, const FieldCommon &field)
const Element * slave_iter() const
bool is_changed_dt() const
#define START_TIMER(tag)
Starts a timer with specified tag.
unsigned int index(const T *pointer) const
virtual Value::return_type const & value(const Point &p, const ElementAccessor< spacedim > &elm) const
void read_init_condition() override
unsigned int side_dof(const SideIter side) const
SideIter side(const unsigned int loc_index)
Mixed-hybrid model of linear Darcy flow, possibly unsteady.
void mark_input_times(TimeMark::Type mark_type)
static Input::Type::Record input_type
unsigned int np() const
get num of processors
double solution_precision() const
void set_solution(double *sol_array)
bool is_steady() const
Returns true if the time governor is used for steady problem.
virtual const Vec * get_rhs()
void * xmalloc(size_t size)
Memory allocation with checking.
void set_time(const TimeGovernor &time)
virtual PetscErrorCode rhs_zero_entries()
unsigned int myp() const
get my processor
Support classes for parallel programing.
Field< 3, FieldValue< 3 >::Scalar > conductivity
FieldSet main_matrix_fields
static Input::Type::AbstractRecord input_type
void set_values(int nrow, int *rows, int ncol, int *cols, PetscScalar *mat_vals, PetscScalar *rhs_vals)
Set values in the system matrix and values in the right-hand side vector on corresponding rows...
static Input::Type::Record input_type
Field< 3, FieldValue< 3 >::Scalar > sigma
double intersection_true_size() const
virtual void postprocess()
postprocess velocity field (add sources)
Input::Record input_record_
auto disable_where(const Field< spacedim, typename FieldValue< spacedim >::Enum > &control_field, const vector< FieldEnum > &value_list) -> Field &
ElementFullIter element() const
boost::shared_ptr< LocalToGlobalMap > global_row_4_sub_row
arma::vec3 centre() const
void reinit(ElementFullIter &cell, unsigned int sid)
Update cell-dependent data (gradients, Jacobians etc.)
void assembly_steady_mh_matrix()
std::vector< Edge > edges
Vector of MH edges, this should not be part of the geometrical mesh.
friend class DarcyFlowMHOutput
Distributed sparse graphs, partitioning.
FullIter full_iter(Iter it)
Abstract linear system class.
Mixed-hybrid of steady Darcy flow with sources and variable density.
Definitions of particular quadrature rules on simplices.
BCField< 3, FieldValue< 3 >::Scalar > bc_robin_sigma
#define END_TIMER(tag)
Ends a timer with specified tag.
static Input::Type::Record input_type
void make_row_numberings()
TimeMark::Type mark_type()
arma::vec::fixed< spacedim > centre() const
void set_mesh_data_for_bddc(LinSys_BDDC *bddc_ls)
void set_matrix_changed()
ElementAccessor< 3 > element_accessor() const
Gets ElementAccessor of this element.
mixed-hybrid model of linear Darcy flow, possibly unsteady.
unsigned int el_idx() const
void set_mesh(const Mesh &mesh)
void read_init_condition() override
void add_sides(const Element *ele, unsigned int shift, vector< int > &dofs, vector< double > &dirichlet)
virtual void output_data() override
Write computed fields.
Field< 3, FieldValue< 3 >::Scalar > cross_section
virtual void mat_set_values(int nrow, int *rows, int ncol, int *cols, double *vals)=0
unsigned int n_edges() const
static Input::Type::Selection bc_type_selection
Class for representation SI units of Fields.
Field< 3, FieldValue< 3 >::Scalar > init_pressure
virtual const Mat * get_matrix()
DarcyFlowMHOutput * output_object
DarcyFlowMH_Steady(Mesh &mesh, const Input::Record in_rec, bool make_tg=true)
CREATE AND FILL GLOBAL MH MATRIX OF THE WATER MODEL.
static UnitSI & dimensionless()
Returns dimensionless unit.
#define FOR_SIDES(_mesh_, it)
void set_from_input(const Input::Record in_rec)
EqData()
Collect all fields.
#define FOR_EDGES(_mesh_, __i)
SideIter side(const unsigned int i) const
void make_serial_scatter()
Field< 3, FieldValue< 3 >::Scalar > water_source_density
FieldSet time_term_fields
void prepare_parallel(const Input::AbstractRecord in_rec)
ElementAccessor< 3 > element_accessor()
void rhs_set_value(int row, double val)
void create_linear_system()
Solver based on Multilevel BDDC - using corresponding class of OpenFTL package.
ElementVector element
Vector of elements of the mesh.
void output()
Calculate values for output.
Calculates finite element data on a side.
unsigned int lsize(int proc) const
get local size