28 #include "petscviewer.h" 29 #include "petscerror.h" 77 const
it::Selection &
DarcyMH::get_mh_mortar_selection() {
79 .
add_value(NoMortar,
"None",
"No Mortar method is applied.")
80 .
add_value(MortarP0,
"P0",
"Mortar space: P0 on elements of lower dimension.")
81 .
add_value(MortarP1,
"P1",
"Mortar space: P1 on intersections, using non-conforming pressures.")
89 "Homogeneous Neumann boundary condition\n(zero normal flux over the boundary).")
91 "Dirichlet boundary condition. " 92 "Specify the pressure head through the ``bc_pressure`` field " 93 "or the piezometric head through the ``bc_piezo_head`` field.")
94 .
add_value(
total_flux,
"total_flux",
"Flux boundary condition (combines Neumann and Robin type). " 95 "Water inflow equal to (($ \\delta_d(q_d^N + \\sigma_d (h_d^R - h_d) )$)). " 96 "Specify the water inflow by the ``bc_flux`` field, the transition coefficient by ``bc_robin_sigma`` " 97 "and the reference pressure head or piezometric head through ``bc_pressure`` or ``bc_piezo_head`` respectively.")
99 "Seepage face boundary condition. Pressure and inflow bounded from above. Boundary with potential seepage flow " 100 "is described by the pair of inequalities: " 101 "(($h_d \\le h_d^D$)) and (($ -\\boldsymbol q_d\\cdot\\boldsymbol n \\le \\delta q_d^N$)), where the equality holds in at least one of them. " 102 "Caution: setting (($q_d^N$)) strictly negative " 103 "may lead to an ill posed problem since a positive outflow is enforced. " 104 "Parameters (($h_d^D$)) and (($q_d^N$)) are given by the fields ``bc_switch_pressure`` (or ``bc_switch_piezo_head``) and ``bc_flux`` respectively." 107 "River boundary condition. For the water level above the bedrock, (($H_d > H_d^S$)), the Robin boundary condition is used with the inflow given by: " 108 "(( $ \\delta_d(q_d^N + \\sigma_d(H_d^D - H_d) )$)). For the water level under the bedrock, constant infiltration is used: " 109 "(( $ \\delta_d(q_d^N + \\sigma_d(H_d^D - H_d^S) )$)). Parameters: ``bc_pressure``, ``bc_switch_pressure``, " 110 " ``bc_sigma``, ``bc_flux``." 121 "Boundary piezometric head for BC types: dirichlet, robin, and river." )
123 "Boundary switch piezometric head for BC types: seepage, river." )
125 "Initial condition for the pressure given as the piezometric head." )
127 return field_descriptor;
134 "Linear solver for MH problem.")
136 "Residual tolerance.")
138 "Minimum number of iterations (linear solutions) to use.\nThis is usefull if the convergence criteria " 139 "does not characterize your goal well enough so it converges prematurely, possibly even without a single linear solution." 140 "If greater then 'max_it' the value is set to 'max_it'.")
142 "Maximum number of iterations (linear solutions) of the non-linear solver.")
144 "If a stagnation of the nonlinear solver is detected the solver stops. " 145 "A divergence is reported by default, forcing the end of the simulation. By setting this flag to 'true', the solver " 146 "ends with convergence success on stagnation, but it reports warning about it.")
149 return it::Record(
"Flow_Darcy_MH",
"Mixed-Hybrid solver for saturated Darcy flow.")
152 "Vector of the gravity force. Dimensionless.")
154 "Input data for Darcy flow model.")
156 "Non-linear solver for MH problem.")
158 "Output stream settings.\n Specify file format, precision etc.")
161 "Specification of output fields and output times.")
163 "Output settings specific to Darcy flow model.\n" 164 "Includes raw output and some experimental functionality.")
166 "Settings for computing mass balance.")
168 "Time governor settings for the unsteady Darcy flow model.")
170 "Number of Schur complements to perform when solving MH system.")
172 "Method for coupling Darcy flow between dimensions on incompatible meshes. [Experimental]" )
178 Input::register_class< DarcyMH, Mesh &, const Input::Record >(
"Flow_Darcy_MH") +
188 .
description(
"Anisotropy of the conductivity tensor.")
193 .
description(
"Complement dimension parameter (cross section for 1D, thickness for 2D).")
204 .
description(
"Transition coefficient between dimensions.")
222 .description(
"Prescribed pressure value on the boundary. Used for all values of ``bc_type`` except ``none`` and ``seepage``. " 223 "See documentation of ``bc_type`` for exact meaning of ``bc_pressure`` in individual boundary condition types.")
224 .input_default(
"0.0")
230 .description(
"Incoming water boundary flux. Used for bc_types : ``total_flux``, ``seepage``, ``river``.")
231 .input_default(
"0.0")
232 .units(
UnitSI().m().s(-1) );
236 .name(
"bc_robin_sigma")
237 .description(
"Conductivity coefficient in the ``total_flux`` or the ``river`` boundary condition type.")
238 .input_default(
"0.0")
243 .name(
"bc_switch_pressure")
244 .description(
"Critical switch pressure for ``seepage`` and ``river`` boundary conditions.")
245 .input_default(
"0.0")
251 .
description(
"Initial condition for pressure in time dependent problems.")
256 .
description(
"Storativity (in time dependent problems).")
261 .
description(
"Storativity added from upstream equation.")
267 .
description(
"Water source density added from upstream equation.")
318 MessageOut() <<
"Duplicate key 'time', time in flow equation is already initialized from parent class!";
325 data_ = make_shared<EqData>();
328 data_->is_linear=
true;
359 gravity_array.copy_to(gvec);
362 data_->gravity_vec_ =
data_->gravity_.subvec(0,2);
364 data_->bc_pressure.add_factory(
366 (
data_->gravity_,
"bc_piezo_head") );
367 data_->bc_switch_pressure.add_factory(
369 (
data_->gravity_,
"bc_switch_piezo_head") );
370 data_->init_pressure.add_factory(
372 (
data_->gravity_,
"init_piezo_head") );
380 MessageOut() <<
"Missing the key 'time', obligatory for the transient problems." << endl;
402 .val<Input::AbstractRecord>(
"linear_solver");
421 data_->water_balance_idx =
balance_->add_quantity(
"water_volume");
451 if (zero_time_term_from_right) {
490 bool jump_time =
data_->storativity.is_jump_time();
491 if (! zero_time_term_from_left) {
500 WarningOut() <<
"Output of solution discontinuous in time not supported yet.\n";
509 if (! zero_time_term_from_left && ! jump_time && output)
output_data();
515 if (zero_time_term_from_right) {
520 }
else if (! zero_time_term_from_left && jump_time) {
521 WarningOut() <<
"Discontinuous time term not supported yet.\n";
533 return (
data_->storativity.input_list_size() == 0);
546 MessageOut().fmt(
"[nonlinear solver] norm of initial residual: {}\n", residual_norm);
549 int is_linear_common;
554 this->
max_n_it_ = nl_solver_rec.
val<
unsigned int>(
"max_it");
555 this->
min_n_it_ = nl_solver_rec.
val<
unsigned int>(
"min_it");
556 if (this->min_n_it_ > this->max_n_it_) this->min_n_it_ = this->
max_n_it_;
558 if (! is_linear_common) {
566 while (nonlinear_iteration_ < this->min_n_it_ ||
567 (residual_norm > this->tolerance_ && nonlinear_iteration_ < this->max_n_it_ )) {
569 convergence_history.push_back(residual_norm);
572 if (convergence_history.size() >= 5 &&
573 convergence_history[ convergence_history.size() - 1]/convergence_history[ convergence_history.size() - 2] > 0.9 &&
574 convergence_history[ convergence_history.size() - 1]/convergence_history[ convergence_history.size() - 5] > 0.8) {
580 THROW(ExcSolverDiverge() << EI_Reason(
"Stagnation."));
584 if (! is_linear_common)
590 if (is_linear_common){
593 MessageOut().fmt(
"[nonlinear solver] lin. it: {}, reason: {}, residual: {}\n",
594 si.n_iterations, si.converged_reason, residual_norm);
615 MessageOut().fmt(
"[nonlinear solver] it: {} lin. it: {}, reason: {}, residual: {}\n",
618 chkerr(VecDestroy(&save_solution));
646 if(
data_->mortar_method_ != MortarMethod::NoMortar){
647 auto multidim_assembler = AssemblyBase::create< AssemblyMH >(
data_);
650 unsigned int dim = ele_ac.
dim();
651 multidim_assembler[dim-1]->fix_velocity(ele_ac);
711 vec_size = this->
size;
712 OLD_ASSERT(vec != NULL,
"Requested solution is not allocated!\n");
718 OLD_ASSERT(vec != NULL,
"Requested solution is not allocated!\n");
730 START_TIMER(
"DarcyFlowMH_Steady::assembly_steady_mh_matrix");
743 unsigned int dim = ele_ac.
dim();
744 assembler[dim-1]->assemble(ele_ac);
755 START_TIMER(
"DarcyFlowMH_Steady::allocate_mh_matrix");
766 double zeros[100000];
767 for(
int i=0; i<100000; i++) zeros[i] = 0.0;
770 tmp_rows.reserve(200);
772 unsigned int nsides, loc_size;
779 loc_size = 1 + 2*nsides;
780 unsigned int i_side = 0;
782 for (; i_side < nsides; i_side++) {
783 local_dofs[i_side] = ele_ac.side_row(i_side);
784 local_dofs[i_side+nsides] = ele_ac.edge_row(i_side);
786 local_dofs[i_side+nsides] = ele_ac.ele_row();
787 int * edge_rows = local_dofs + nsides;
791 ls->
mat_set_values(loc_size, local_dofs, loc_size, local_dofs, zeros);
795 unsigned int n_neighs = ele_ac.element_accessor()->n_neighs_vb();
796 for (
unsigned int i = 0; i < n_neighs; i++) {
799 Neighbour *ngh = ele_ac.element_accessor()->neigh_vb[i];
801 tmp_rows.push_back(neigh_edge_row);
814 for(
auto &isec : isec_list ) {
818 for(
unsigned int i_side=0; i_side < slave_ele->
n_sides(); i_side++) {
865 double cs =
data_->cross_section.value(ele_ac.centre(), ele_ac.element_accessor());
868 double source = ele_ac.measure() * cs *
869 (
data_->water_source_density.value(ele_ac.centre(), ele_ac.element_accessor())
870 +
data_->extra_source.value(ele_ac.centre(), ele_ac.element_accessor()));
873 balance_->add_source_values(
data_->water_balance_idx, ele_ac.region().bulk_idx(), {(
LongIdx) ele_ac.ele_local_row()}, {0}, {source});
893 #ifdef FLOW123D_HAVE_BDDCML 894 WarningOut() <<
"For BDDC no Schur complements are used.";
909 xprintf(
Err,
"Flow123d was not build with BDDCML support.\n");
910 #endif // FLOW123D_HAVE_BDDCML 915 WarningOut() <<
"Invalid number of Schur Complements. Using 2.";
928 ls->LinSys::set_from_input(in_rec);
947 ISCreateStride(PETSC_COMM_WORLD,
mh_dh.
el_ds->
lsize(), ls->get_distribution()->begin(), 1, &is);
950 ls1->set_negative_definite();
953 schur2 =
new LinSys_PETSC( ls1->make_complement_distribution() );
955 ls1->set_complement( schur2 );
958 ls->set_complement( schur1 );
974 xprintf(
Err,
"Unknown solver type. Internal error.\n");
988 START_TIMER(
"DarcyFlowMH_Steady::assembly_linear_system");
990 data_->is_linear=
true;
1007 auto multidim_assembler = AssemblyBase::create< AssemblyMH >(
data_);
1044 std::string output_file;
1056 PetscViewerASCIIOpen(PETSC_COMM_WORLD, output_file.c_str(), &viewer);
1057 PetscViewerSetFormat(viewer, PETSC_VIEWER_ASCII_MATLAB);
1067 double d_max = std::numeric_limits<double>::max();
1068 double h1 = d_max, h2 = d_max, h3 = d_max;
1069 double he2 = d_max, he3 = d_max;
1072 case 1: h1 = std::min(h1,ele.measure());
break;
1073 case 2: h2 = std::min(h2,ele.measure());
break;
1074 case 3: h3 = std::min(h3,ele.measure());
break;
1077 for (
unsigned int j=0; j<ele->n_sides(); j++) {
1079 case 2: he2 = std::min(he2, ele.side(j)->measure());
break;
1080 case 3: he3 = std::min(he3, ele.side(j)->measure());
break;
1084 if(h1 == d_max) h1 = 0;
1085 if(h2 == d_max) h2 = 0;
1086 if(h3 == d_max) h3 = 0;
1087 if(he2 == d_max) he2 = 0;
1088 if(he3 == d_max) he3 = 0;
1091 file = fopen(output_file.c_str(),
"a");
1095 fprintf(file,
"h1 = %e;\nh2 = %e;\nh3 = %e;\n", h1, h2, h3);
1096 fprintf(file,
"he2 = %e;\nhe3 = %e;\n", he2, he3);
1102 START_TIMER(
"DarcyFlowMH_Steady::set_mesh_data_for_bddc");
1123 for (
unsigned int i_loc = 0; i_loc <
mh_dh.
el_ds->
lsize(); i_loc++ ) {
1127 elDimMax = std::max( elDimMax, ele_ac.dim() );
1128 elDimMin = std::min( elDimMin, ele_ac.dim() );
1130 isegn.push_back( ele_ac.ele_global_idx() );
1133 for (
unsigned int si=0; si<ele_ac.element_accessor()->n_sides(); si++) {
1135 int side_row = ele_ac.side_row(si);
1136 arma::vec3 coord = ele_ac.side(si)->centre();
1138 localDofMap.insert( std::make_pair( side_row, coord ) );
1139 inet.push_back( side_row );
1144 int el_row = ele_ac.ele_row();
1146 localDofMap.insert( std::make_pair( el_row, coord ) );
1147 inet.push_back( el_row );
1150 for (
unsigned int si=0; si<ele_ac.element_accessor()->n_sides(); si++) {
1152 int edge_row = ele_ac.edge_row(si);
1153 arma::vec3 coord = ele_ac.side(si)->centre();
1155 localDofMap.insert( std::make_pair( edge_row, coord ) );
1156 inet.push_back( edge_row );
1161 for (
unsigned int i_neigh = 0; i_neigh < ele_ac.element_accessor()->n_neighs_vb(); i_neigh++) {
1162 int edge_row =
mh_dh.
row_4_edge[ ele_ac.element_accessor()->neigh_vb[i_neigh]->edge_idx() ];
1163 arma::vec3 coord = ele_ac.element_accessor()->neigh_vb[i_neigh]->edge().side(0)->centre();
1165 localDofMap.insert( std::make_pair( edge_row, coord ) );
1166 inet.push_back( edge_row );
1170 nnet.push_back( nne );
1175 double conduct =
data_->conductivity.value( centre , ele_ac.element_accessor() );
1176 auto aniso =
data_->anisotropy.value( centre, ele_ac.element_accessor() );
1180 for (
int i = 0; i < 3; i++) {
1181 coef = coef + aniso.at(i,i);
1184 coef = conduct*coef / 3;
1187 "Zero coefficient of hydrodynamic resistance %f . \n ", coef );
1188 element_permeability.push_back( 1. / coef );
1192 int numNodeSub = localDofMap.size();
1203 for ( ; itB != localDofMap.end(); ++itB ) {
1204 isngn[ind] = itB -> first;
1207 for (
int j = 0; j < 3; j++ ) {
1208 xyz[ j*numNodeSub + ind ] = coord[j];
1213 localDofMap.clear();
1221 Global2LocalMap_ global2LocalNodeMap;
1222 for (
unsigned ind = 0; ind < isngn.size(); ++ind ) {
1223 global2LocalNodeMap.insert( std::make_pair( static_cast<unsigned>( isngn[ind] ), ind ) );
1228 for (
unsigned int iEle = 0; iEle < isegn.size(); iEle++ ) {
1229 int nne = nnet[ iEle ];
1230 for (
int ien = 0; ien < nne; ien++ ) {
1232 int indGlob = inet[indInet];
1234 Global2LocalMap_::iterator pos = global2LocalNodeMap.find( indGlob );
1235 OLD_ASSERT( pos != global2LocalNodeMap.end(),
1236 "Cannot remap node index %d to local indices. \n ", indGlob );
1237 int indLoc =
static_cast<int> ( pos -> second );
1240 inet[ indInet++ ] = indLoc;
1244 int numNodes =
size;
1245 int numDofsInt =
size;
1247 int meshDim = elDimMax;
1249 bddc_ls -> load_mesh( spaceDim, numNodes, numDofsInt, inet, nnet, nndf, isegn, isngn, isngn, xyz, element_permeability, meshDim );
1277 if(
time_ !=
nullptr)
1297 VecCreateSeqWithArray(PETSC_COMM_SELF,1,
size,
solution,
1302 loc_idx =
new int [
size];
1305 for (
unsigned int si=0; si<ele->n_sides(); si++) {
1312 for(
unsigned int i_edg=0; i_edg <
mesh_->
n_edges(); i_edg++) {
1315 OLD_ASSERT( i==
size,
"Size of array does not match number of fills.\n");
1317 ISCreateGeneral(PETSC_COMM_SELF,
size, loc_idx, PETSC_COPY_VALUES, &(is_loc));
1321 chkerr(ISDestroy(&(is_loc)));
1373 for (
unsigned int i_loc_el = 0; i_loc_el <
mh_dh.
el_ds->
lsize(); i_loc_el++) {
1376 local_sol[ele_ac.ele_local_row()] =
data_->init_pressure.value(ele_ac.centre(),ele_ac.element_accessor());
1390 PetscScalar *local_diagonal;
1398 for (
unsigned int i_loc_el = 0; i_loc_el <
mh_dh.
el_ds->
lsize(); i_loc_el++) {
1402 double diagonal_coeff =
data_->cross_section.value(ele_ac.centre(), ele_ac.element_accessor())
1403 * (
data_->storativity.value(ele_ac.centre(), ele_ac.element_accessor())
1404 +
data_->extra_storativity.value(ele_ac.centre(), ele_ac.element_accessor())
1407 local_diagonal[ele_ac.ele_local_row()]= - diagonal_coeff /
time_->
dt();
1411 ele_ac.region().bulk_idx(), {
LongIdx(ele_ac.ele_row()) }, {diagonal_coeff});
1426 if (scale_factor != 1.0) {
int LongIdx
Define type that represents indices of large arrays (elements, nodes, dofs etc.)
unsigned int size() const
get global size
void get_solution_vector(double *&vec, unsigned int &vec_size) override
Field< 3, FieldValue< 3 >::Scalar > extra_source
Externally added storativity.
void make_serial_scatter()
static const Input::Type::Record & get_input_type()
Main balance input record type.
Output class for darcy_flow_mh model.
Field< 3, FieldValue< 3 >::Scalar > init_pressure
RegionSet get_region_set(const std::string &set_name) const
virtual void initialize_specific()
void get_parallel_solution_vector(Vec &vector) override
SchurComplement SchurComplement
void assembly_mh_matrix(MultidimAssembly &assembler)
void set_symmetric(bool flag=true)
Classes with algorithms for computation of intersections of meshes.
FieldCommon & input_selection(Input::Type::Selection element_selection)
Solver based on the original PETSc solver using MPIAIJ matrix and succesive Schur complement construc...
virtual ~DarcyMH() override
MixedMeshIntersections & mixed_intersections()
static const Input::Type::Record & get_input_type()
The specification of output stream.
Common base for intersection object.
void set_from_input(const Input::Record in_rec) override
unsigned int edge_idx() const
Returns global index of the edge connected to the side.
virtual void assembly_source_term()
Source term is implemented differently in LMH version.
friend class DarcyFlowMHOutput
#define MessageOut()
Macro defining 'message' record of log.
virtual void start_add_assembly()
virtual void output_data() override
Write computed fields.
virtual PetscErrorCode mat_zero_entries()
Wrappers for linear systems based on MPIAIJ and MATIS format.
bool is_end() const
Returns true if the actual time is greater than or equal to the end time.
void next_time()
Proceed to the next time according to current estimated time step.
static const int registrar
Registrar of class to factory.
Field< 3, FieldValue< 3 >::Scalar > extra_storativity
Field< 3, FieldValue< 3 >::Scalar > sigma
static const Input::Type::Selection & get_mh_mortar_selection()
Selection for enum MortarMethod.
void initialize() override
static const Input::Type::Record & type_field_descriptor()
virtual void start_allocation()
void chkerr(unsigned int ierr)
Replacement of new/delete operator in the spirit of xmalloc.
virtual void finish_assembly()=0
virtual double get_solution_precision()=0
std::vector< std::vector< ILpair > > element_intersections_
SideIter side(const unsigned int loc_index)
const RegionDB & region_db() const
#define ASSERT(expr)
Allow use shorter versions of macro names if these names is not used with external library...
const TimeStep & step(int index=-1) const
static const std::string field_descriptor_record_description(const string &record_name)
Basic time management functionality for unsteady (and steady) solvers (class Equation).
unsigned int bulk_ele_idx() const
Returns index of bulk element.
FieldCommon & units(const UnitSI &units)
Set basic units of the field.
bool solution_changed_for_scatter
void solve_nonlinear()
Solve method common to zero_time_step and update solution.
static const Input::Type::Record & get_input_type()
std::shared_ptr< EqData > data_
Basic time management class.
virtual void set_tolerances(double r_tol, double a_tol, unsigned int max_it)=0
virtual ElementAccessor< 3 > element_accessor(unsigned int idx) const
Create and return ElementAccessor to element of given idx.
void view(const char *name="") const
std::shared_ptr< LocalToGlobalMap > global_row_4_sub_row
Necessary only for BDDC solver.
unsigned int nonlinear_iteration_
void set_mesh_data_for_bddc(LinSys_BDDC *bddc_ls)
Assembly explicit Schur complement for the given linear system. Provides method for resolution of the...
BCField< 3, FieldValue< 3 >::Scalar > bc_flux
void update_solution() override
void solve_time_step(bool output=true)
Solve the problem without moving to next time and without output.
void set_from_input(const Input::Record in_rec) override
BCField< 3, FieldValue< 3 >::Scalar > bc_pressure
virtual void postprocess()
Field< 3, FieldValue< 3 >::Scalar > water_source_density
static const Input::Type::Instance & get_input_type_specific()
double * get_solution_array()
BCField< 3, FieldValue< 3 >::Scalar > bc_switch_pressure
Field< 3, FieldValue< 3 >::Scalar > storativity
static constexpr Mask input_copy
std::shared_ptr< Balance > balance_
FieldCommon & input_default(const string &input_default)
const Vec & get_solution()
FMT_FUNC int fprintf(std::ostream &os, CStringRef format, ArgList args)
unsigned int n_sides() const
bool is_changed_dt() const
#define START_TIMER(tag)
Starts a timer with specified tag.
static const Input::Type::Instance & get_input_type()
unsigned int side_dof(const SideIter side) const
static Input::Type::Abstract & get_input_type()
virtual Range< ElementAccessor< 3 > > elements_range() const
Returns range of bulk elements.
bool use_steady_assembly_
unsigned int n_sides() const
void allocate_mh_matrix()
static const Input::Type::Selection & get_bc_type_selection()
Return a Selection corresponding to enum BC_Type.
virtual void assembly_linear_system()
virtual const Vec * get_rhs()
virtual PetscErrorCode rhs_zero_entries()
void set_solution(Vec sol_vec)
Dedicated class for storing path to input and output files.
Support classes for parallel programing.
#define MPI_Allreduce(sendbuf, recvbuf, count, datatype, op, comm)
int set_upper_constraint(double upper, std::string message)
Sets upper constraint for the next time step estimating.
FieldCommon & description(const string &description)
void create_linear_system(Input::AbstractRecord rec)
Initialize global_row_4_sub_row.
virtual unsigned int n_elements(bool boundary=false) const
Returns count of boundary or bulk elements.
MortarMethod
Type of experimental Mortar-like method for non-compatible 1d-2d interaction.
Input::Record input_record_
auto disable_where(const Field< spacedim, typename FieldValue< spacedim >::Enum > &control_field, const vector< FieldEnum > &value_list) -> Field &
std::shared_ptr< Distribution > rows_ds
LocalElementAccessorBase< 3 > accessor(uint local_ele_idx)
Field< 3, FieldValue< 3 >::TensorFixed > anisotropy
DarcyMH(Mesh &mesh, const Input::Record in_rec, TimeGovernor *tm=nullptr)
CREATE AND FILL GLOBAL MH MATRIX OF THE WATER MODEL.
static const Input::Type::Record & get_input_type()
#define WarningOut()
Macro defining 'warning' record of log.
FieldCommon & name(const string &name)
virtual SolveInfo solve()=0
#define END_TIMER(tag)
Ends a timer with specified tag.
#define OLD_ASSERT_EQUAL(a, b)
EqData()
Creation of all fields.
void set_matrix_changed()
static const Input::Type::Record & get_input_type()
void print_matlab_matrix(string matlab_file)
Print darcy flow matrix in matlab format into a file.
mixed-hybrid model of linear Darcy flow, possibly unsteady.
unsigned int index() const
void zero_time_step() override
void set_positive_definite(bool flag=true)
virtual void read_initial_condition()
void prepare_parallel_bddc()
FieldCommon & set_limits(double min, double max=std::numeric_limits< double >::max())
Field< 3, FieldValue< 3 >::Scalar > cross_section
static Input::Type::Abstract & get_input_type()
virtual void mat_set_values(int nrow, int *rows, int ncol, int *cols, double *vals)=0
BCField< 3, FieldValue< 3 >::Enum > bc_type
DarcyFlowMHOutput * output_object
Field< 3, FieldValue< 3 >::Scalar > conductivity
FieldCommon & flags(FieldFlag::Flags::Mask mask)
unsigned int n_edges() const
virtual void prepare_new_time_step()
postprocess velocity field (add sources)
Class for representation SI units of Fields.
virtual const Mat * get_matrix()
virtual double solution_precision() const
BCField< 3, FieldValue< 3 >::Scalar > bc_robin_sigma
virtual void setup_time_term()
static UnitSI & dimensionless()
Returns dimensionless unit.
#define DebugOut()
Macro defining 'debug' record of log.
virtual double compute_residual()=0
#define THROW(whole_exception_expr)
Wrapper for throw. Saves the throwing point.
Implementation of range helper class.
MortarMethod mortar_method_
#define FLOW123D_FORCE_LINK_IN_CHILD(x)
void rhs_set_value(int row, double val)
Input::Type::Record make_field_descriptor_type(const std::string &equation_name) const
static const Input::Type::Record & get_input_type()
Solver based on Multilevel BDDC - using corresponding class of OpenFTL package.
virtual bool zero_time_term(bool time_global=false)
void output()
Calculate values for output.
Mixed-hybrid model of linear Darcy flow, possibly unsteady.
unsigned int lsize(int proc) const
get local size