34 #include "petscviewer.h"
35 #include "petscerror.h"
37 #include <boost/foreach.hpp>
82 namespace it = Input::Type;
86 .
add_value(NoMortar,
"None",
"Mortar space: P0 on elements of lower dimension.")
87 .
add_value(MortarP0,
"P0",
"Mortar space: P0 on elements of lower dimension.")
88 .
add_value(MortarP1,
"P1",
"Mortar space: P1 on intersections, using non-conforming pressures.");
103 "Number of Schur complements to perform when solving MH sytem.")
105 "Linear solver for MH problem.")
107 "Parameters of output form MH module.")
109 "Method for coupling Darcy flow between dimensions." );
113 =
it::Record(
"Steady_MH",
"Mixed-Hybrid solver for STEADY saturated Darcy flow.")
123 =
it::Record(
"Unsteady_MH",
"Mixed-Hybrid solver for unsteady saturated Darcy flow.")
126 "Time governor setting for the unsteady Darcy flow model.")
127 .
copy_keys(DarcyFlowMH_Steady::input_type);
131 =
it::Record(
"Unsteady_LMH",
"Lumped Mixed-Hybrid solver for unsteady saturated Darcy flow.")
134 "Time governor setting for the unsteady Darcy flow model.")
135 .
copy_keys(DarcyFlowMH_Steady::input_type);
149 ADD_FIELD(
cross_section,
"Complement dimension parameter (cross section for 1D, thickness for 2D).",
"1.0" );
151 ADD_FIELD(
sigma,
"Transition coefficient between dimensions.",
"1.0");
154 ADD_FIELD(
bc_type,
"Boundary condition type, possible values:",
"\"none\"" );
176 main_matrix_fields = this->subset({
"anisotropy",
"conductivity",
"cross_section",
"sigma",
"bc_type",
"bc_robin_sigma"});
177 rhs_fields = this->subset({
"water_source_density",
"bc_pressure",
"bc_flux"});
200 using namespace Input;
275 xprintf(
MsgLog,
"Linear solver ended with reason: %d \n", convergedReason );
276 ASSERT( convergedReason >= 0,
"Linear solver failed to converge. Convergence reason %d \n", convergedReason );
336 schur0 -> get_whole_solution( sol_disordered );
340 for (
int i = 0; i < this->
size; i++ ) {
347 ASSERT(vec != NULL,
"Requested solution is not allocated!\n");
361 ASSERT(vec != NULL,
"Requested solution is not allocated!\n");
407 int el_row, side_row, edge_row;
410 int side_rows[4], edge_rows[4];
415 for(
int i=0; i<1000; i++) zeros[i]=0.0;
417 double minus_ones[4] = { -1.0, -1.0, -1.0, -1.0 };
418 double loc_side_rhs[4];
421 for (
unsigned int i_loc = 0; i_loc <
el_ds->
lsize(); i_loc++) {
425 unsigned int nsides = ele->n_sides();
429 for (
unsigned int i = 0; i < nsides; i++) {
431 edge_row = edge_rows[i] =
row_4_edge[ele->side(i)->edge_idx()];
432 bcd=ele->side(i)->cond();
435 loc_side_rhs[i] = (ele->centre()[ 2 ] - ele->side(i)->centre()[ 2 ]);
449 loc_side_rhs[i] -= bc_pressure;
481 double val_side = (fe_values.
local_matrix())[i*nsides+i];
482 double val_edge = -1./ (fe_values.
local_matrix())[i*nsides+i];
484 static_cast<LinSys_BDDC*
>(ls)->diagonal_weights_set_value( side_row, val_side );
485 static_cast<LinSys_BDDC*
>(ls)->diagonal_weights_set_value( edge_row, val_edge );
520 static_cast<LinSys_BDDC*
>(ls)->diagonal_weights_set_value( el_row, val_ele );
525 for (
unsigned int i = 0; i < ele->n_neighs_vb; i++) {
528 ngh= ele->neigh_vb[i];
535 switch (ele_higher->dim()) {
550 double value =
data_.
sigma.
value( ele->centre(), ele->element_accessor()) *
559 local_vb[0] = -value; local_vb[1] = value;
560 local_vb[2] = value; local_vb[3] = -value;
566 int ind = tmp_rows[1];
568 double new_val = - value;
569 static_cast<LinSys_BDDC*
>(ls)->diagonal_weights_set_value( ind, new_val );
580 tmp_rows[2+i] = tmp_rows[1];
589 ASSERT(ele->n_neighs_vb*ele->n_neighs_vb<1000,
"Too many values in E block.");
591 ele->n_neighs_vb, tmp_rows+2, zeros);
629 vector<int> &dofs,
unsigned int &ele_type,
double &delta, arma::vec &dirichlet) {
633 if (i_ele == (
int)(ml_it_->size()) ) {
639 const Intersection &isect=intersections_[ (*ml_it_)[i_ele] ];
646 for(
unsigned int i_side=0; i_side < ele->
n_sides(); i_side++ ) {
647 dofs[i_side]=darcy_.row_4_edge[ele->
side(i_side)->
edge_idx()];
650 dirichlet.resize(ele->
n_sides());
656 dofs[i_side] = -dofs[i_side];
657 double bc_pressure = darcy_.data_.bc_pressure.value(b_ele.
centre(), b_ele);
658 dirichlet[i_side] = bc_pressure;
669 double delta_i, delta_j;
671 arma::vec dirichlet_i, dirichlet_j;
672 unsigned int ele_type_i, ele_type_j;
677 for(ml_it_ = master_list_.begin(); ml_it_ != master_list_.end(); ++ml_it_) {
679 if (ml_it_->size() == 0)
continue;
695 master_ = intersections_[ml_it_->front()].master_iter();
696 delta_0 = master_->measure();
698 double master_sigma=darcy_.data_.sigma.value( master_->centre(), master_->element_accessor());
701 for(i = 0; i <= ml_it_->size(); ++i) {
704 pressure_diff(i, dofs_i, ele_type_i, delta_i, dirichlet_i);
706 for (j = 0; j <= ml_it_->size(); ++j) {
707 pressure_diff(j, dofs_j, ele_type_j, delta_j, dirichlet_j);
709 double scale = -master_sigma * delta_i * delta_j / delta_0;
710 product = scale * tensor_average[ele_type_i][ele_type_j];
716 arma::vec rhs(dofs_i.size());
718 ls.
set_values( dofs_i, dofs_j, product, rhs, dirichlet_i, dirichlet_j);
729 for(
unsigned int i_side=0; i_side < ele->
n_sides(); i_side++ ) {
730 dofs[shift+i_side] = darcy_.row_4_edge[ele->
side(i_side)->
edge_idx()];
739 dofs[shift + i_side] = -dofs[shift + i_side];
740 double bc_pressure = darcy_.data_.bc_pressure.value(b_ele.
centre(), b_ele);
741 dirichlet[shift + i_side] = bc_pressure;
767 const Element * master = intersec.master_iter();
768 const Element * slave = intersec.slave_iter();
770 add_sides(master, 0, dofs, dirichlet);
771 add_sides(slave, 2, dofs, dirichlet);
798 arma::vec point_Y(1);
800 arma::vec point_2D_Y(intersec.map_to_slave(point_Y));
801 arma::vec point_1D_Y(intersec.map_to_master(point_Y));
803 arma::vec point_X(1);
805 arma::vec point_2D_X(intersec.map_to_slave(point_X));
806 arma::vec point_1D_X(intersec.map_to_master(point_X));
808 arma::mat base_2D(3, 3);
811 base_2D << 1.0 << 0.0 << -2.0 << arma::endr
812 << -1.0 << 2.0 << 2.0 << arma::endr
813 << 1.0 << -2.0 << 0.0 << arma::endr;
815 arma::mat base_1D(2, 2);
818 base_1D << 1.0 << -1.0 << arma::endr
819 << 0.0 << 1.0 << arma::endr;
827 arma::vec difference_in_Y(5);
828 arma::vec difference_in_X(5);
831 difference_in_Y.subvec(0, 2) = -base_2D * point_2D_Y;
832 difference_in_X.subvec(0, 2) = -base_2D * point_2D_X;
834 difference_in_Y.subvec(3, 4) = base_1D * point_1D_Y;
835 difference_in_X.subvec(3, 4) = base_1D * point_1D_X;
842 for (
int i = 0; i < 5; ++i) {
843 for (
int j = 0; j < 5; ++j) {
844 A(i, j) = -master_sigma * intersec.intersection_true_size() *
845 ( difference_in_Y[i] * difference_in_Y[j]
846 + difference_in_Y[i] * difference_in_X[j]/2
847 + difference_in_X[i] * difference_in_Y[j]/2
848 + difference_in_X[i] * difference_in_X[j]
857 ls.
set_values( dofs, dofs, A, rhs, dirichlet, dirichlet);
886 xprintf(
Warn,
"For BDDC is using no Schur complements.");
900 xprintf(
Err,
"Flow123d was not build with BDDCML support.\n");
906 xprintf(
Warn,
"Invalid number of Schur Complements. Using 2.");
919 ls->LinSys::set_from_input(in_rec);
930 ls->set_from_input(in_rec);
931 ls->set_solution( NULL );
932 ls->set_positive_definite();
940 ISCreateStride(PETSC_COMM_WORLD,
el_ds->
lsize(), ls->get_distribution()->begin(), 1, &is);
943 ls1->set_negative_definite();
946 schur2 =
new LinSys_PETSC( ls1->make_complement_distribution() );
947 ls1->set_complement( schur2 );
950 ls->set_complement( schur1 );
962 xprintf(
Err,
"Unknown solver type. Internal error.\n");
976 DBGMSG(
"Assembly linear system\n");
978 DBGMSG(
" Data changed\n");
991 DBGMSG(
" setup time term\n");
1002 xprintf(
PrgErr,
"Planned computation time for steady solver, but data are not changed.\n");
1045 for (
unsigned int i_loc = 0; i_loc <
el_ds->
lsize(); i_loc++ ) {
1048 int e_idx = el.
index();
1050 int elDim = el->dim();
1051 elDimMax = std::max( elDimMax, elDim );
1052 elDimMin = std::min( elDimMin, elDim );
1054 isegn.push_back( e_idx );
1062 localDofMap.insert( std::make_pair( side_row, coord ) );
1063 inet.push_back( side_row );
1070 localDofMap.insert( std::make_pair( el_row, coord ) );
1071 inet.push_back( el_row );
1078 int edge_row =
row_4_edge[ el->side(si)->edge_idx() ];
1081 localDofMap.insert( std::make_pair( edge_row, coord ) );
1082 inet.push_back( edge_row );
1087 for (
unsigned int i_neigh = 0; i_neigh < el->n_neighs_vb; i_neigh++) {
1088 int edge_row =
row_4_edge[ el->neigh_vb[i_neigh]->edge_idx() ];
1089 arma::vec3 coord = el->neigh_vb[i_neigh]->edge()->side(0)->centre();
1091 localDofMap.insert( std::make_pair( edge_row, coord ) );
1092 inet.push_back( edge_row );
1096 nnet.push_back( nne );
1107 for (
int i = 0; i < 3; i++) {
1108 coef = coef + aniso.at(i,i);
1111 coef = conduct*coef / 3;
1114 "Zero coefficient of hydrodynamic resistance %f . \n ", coef );
1115 element_permeability.push_back( 1. / coef );
1119 int numNodeSub = localDofMap.size();
1130 for ( ; itB != localDofMap.end(); ++itB ) {
1131 isngn[ind] = itB -> first;
1134 for (
int j = 0; j < 3; j++ ) {
1135 xyz[ j*numNodeSub + ind ] = coord[j];
1140 localDofMap.clear();
1148 Global2LocalMap_ global2LocalNodeMap;
1149 for (
unsigned ind = 0; ind < isngn.size(); ++ind ) {
1150 global2LocalNodeMap.insert( std::make_pair( static_cast<unsigned>( isngn[ind] ), ind ) );
1166 for (
unsigned int iEle = 0; iEle < isegn.size(); iEle++ ) {
1167 int nne = nnet[ iEle ];
1168 for (
int ien = 0; ien < nne; ien++ ) {
1170 int indGlob = inet[indInet];
1172 Global2LocalMap_::iterator pos = global2LocalNodeMap.find( indGlob );
1173 ASSERT( pos != global2LocalNodeMap.end(),
1174 "Cannot remap node index %d to local indices. \n ", indGlob );
1175 int indLoc =
static_cast<int> ( pos -> second );
1178 inet[ indInet++ ] = indLoc;
1182 int numNodes =
size;
1183 int numDofsInt =
size;
1185 int meshDim = elDimMax;
1188 bddc_ls -> load_mesh( spaceDim, numNodes, numDofsInt, inet, nnet, nndf, isegn, isngn, isngn, xyz, element_permeability, meshDim );
1358 int edge_shift[np], el_shift[np], side_shift[np];
1359 unsigned int rows_starts[np];
1367 for (i = 0; i < np; i++) {
1374 rows_starts[i] = shift;
1380 for (i = 0; i < side_n_id; i++) {
1385 for (i = 0; i < el_n_id; i++) {
1391 for (i = 0; i < edge_n_id; i++) {
1397 for (i = np - 1; i > 0; i--)
1398 rows_starts[i] -= rows_starts[i - 1];
1400 rows_ds = boost::make_shared<Distribution>(&(rows_starts[0]), PETSC_COMM_WORLD);
1412 VecCreateSeqWithArray(PETSC_COMM_SELF,1,
size,
solution,
1425 loc_idx[i++] =
row_4_el[ele.index()];
1427 for(
unsigned int i_edg=0; i_edg <
mesh_->
n_edges(); i_edg++) {
1430 ASSERT( i==
size,
"Size of array does not match number of fills.\n");
1432 ISCreateGeneral(PETSC_COMM_SELF,
size, loc_idx, PETSC_COPY_VALUES, &(is_loc));
1436 ISDestroy(&(is_loc));
1479 loc_part =
new int[init_edge_ds.lsize()];
1484 unsigned int i_edg = edg -
mesh_->
edges.begin();
1488 if (init_edge_ds.is_local(i_edg)) {
1490 loc_part[loc_i++] = el_ds->get_proc(
row_4_el[e_idx]);
1493 id_4_old[i_edg] = i_edg;
1504 loc_part =
new int[init_side_ds.lsize()];
1511 if (init_side_ds.is_local(is)) {
1513 loc_part[loc_i++] = el_ds->get_proc(
1552 int side_row, edge_row;
1562 for (
unsigned int i_loc = 0; i_loc < el_ds->lsize(); i_loc++) {
1564 int el_row =
row_4_el[el_4_loc[i_loc]];
1568 unsigned int nsides = el->
n_sides();
1569 for (
unsigned int i = 0; i < nsides; i++) {
1582 for (
unsigned int i_neigh = 0; i_neigh < el->
n_neighs_vb; i_neigh++) {
1590 #endif // HAVE_BDDCML
1603 unsigned int i_edg=0;
1616 const PetscInt *cols;
1622 MatGetOwnershipRange(m, &first, &last);
1623 for (
int row = first; row < last; row++) {
1624 MatGetRow(m, row, &n, &cols, PETSC_NULL);
1625 bool exists_off =
false;
1626 for (
int i = 0; i < n; i++)
1628 n_off++, exists_off =
true;
1633 MatRestoreRow(m, row, &n, &cols, PETSC_NULL);
1694 for (
unsigned int i_loc_el = 0; i_loc_el <
el_ds->
lsize(); i_loc_el++) {
1713 PetscScalar *local_diagonal;
1718 for (
unsigned int i_loc_el = 0; i_loc_el <
el_ds->
lsize(); i_loc_el++) {
1790 for (
unsigned int i_loc_el = 0; i_loc_el <
el_ds->
lsize(); i_loc_el++) {
1796 int edge_row =
row_4_edge[ele->side(i)->edge_idx()];
1821 for (
unsigned int i_loc_el = 0; i_loc_el <
el_ds->
lsize(); i_loc_el++) {
1827 int edge_row =
row_4_edge[ele->side(i)->edge_idx()];
1832 time_->
dt() / ele->n_sides(),ADD_VALUES);
1867 int side_row, loc_edge_row, i;
1870 double new_pressure, old_pressure, time_coef;
1872 PetscScalar *loc_prev_sol;
1877 for (
unsigned int i_loc = 0; i_loc <
edge_ds->
lsize(); i_loc++) {
1883 old_pressure = loc_prev_sol[loc_edge_row];
1887 time_coef = - ele->
measure() *
1891 VecSetValue(
schur0->
get_solution(), side_row, time_coef * (new_pressure - old_pressure), ADD_VALUES);
1908 for (
unsigned int i_loc = 0; i_loc <
el_ds->
lsize(); i_loc++) {
1912 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).
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
void get_partitioning_vector(int *&elem_part, unsigned &lelem_part)
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
std::vector< double > solution_
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.
#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()
std::vector< unsigned > solver_indices_
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