Flow123d  release_3.0.0-1263-g7cf53c1
Classes | Public Member Functions | Static Public Member Functions | Protected Member Functions | Static Protected Attributes | Private Attributes | List of all members
RichardsLMH Class Reference

Edge lumped mixed-hybrid solution of unsteady Darcy flow. More...

#include <richards_lmh.hh>

Inheritance diagram for RichardsLMH:
Inheritance graph
[legend]
Collaboration diagram for RichardsLMH:
Collaboration graph
[legend]

Classes

class  EqData
 

Public Member Functions

 RichardsLMH (Mesh &mesh, const Input::Record in_rec)
 
- Public Member Functions inherited from DarcyMH
 TYPEDEF_ERR_INFO (EI_Reason, string)
 
 DECLARE_EXCEPTION (ExcSolverDiverge,<< "Diverged nonlinear solver. Reason: "<< EI_Reason::val)
 
 DECLARE_INPUT_EXCEPTION (ExcMissingTimeGovernor,<< "Missing the key 'time', obligatory for the transient problems.")
 
 DarcyMH (Mesh &mesh, const Input::Record in_rec)
 CREATE AND FILL GLOBAL MH MATRIX OF THE WATER MODEL. More...
 
const MH_DofHandlerget_mh_dofhandler () override
 
void init_eq_data ()
 
void initialize () override
 
void zero_time_step () override
 
void update_solution () override
 
void get_solution_vector (double *&vec, unsigned int &vec_size) override
 
void get_parallel_solution_vector (Vec &vector) override
 
virtual void output_data () override
 Write computed fields. More...
 
virtual ~DarcyMH () override
 
- Public Member Functions inherited from DarcyFlowInterface
 DarcyFlowInterface (Mesh &mesh, const Input::Record in_rec)
 
virtual ~DarcyFlowInterface ()
 
- Public Member Functions inherited from EquationBase
 EquationBase ()
 
 EquationBase (Mesh &mesh, const Input::Record in_rec)
 
virtual ~EquationBase ()
 
virtual void choose_next_time ()
 
virtual void set_time_upper_constraint (double dt, std::string message)
 
virtual void set_time_lower_constraint (double dt, std::string message)
 
TimeGovernortime ()
 
virtual void set_time_governor (TimeGovernor &time)
 
double planned_time ()
 
double solved_time ()
 
Meshmesh ()
 
TimeMark::Type mark_type ()
 
FieldSetdata ()
 
virtual void get_solution_vector (FMT_UNUSED double *&vector, FMT_UNUSED unsigned int &size)
 
virtual void get_parallel_solution_vector (FMT_UNUSED Vec &vector)
 

Static Public Member Functions

static const Input::Type::Recordget_input_type ()
 
- Static Public Member Functions inherited from DarcyMH
static const Input::Type::Selectionget_mh_mortar_selection ()
 Selection for enum MortarMethod. More...
 
static const Input::Type::Recordtype_field_descriptor ()
 
static const Input::Type::Recordget_input_type ()
 
- Static Public Member Functions inherited from DarcyFlowInterface
static Input::Type::Abstractget_input_type ()
 

Protected Member Functions

bool zero_time_term (bool time_global=false) override
 
void initialize_specific () override
 
void assembly_source_term () override
 Source term is implemented differently in LMH version. More...
 
void read_initial_condition () override
 
void assembly_linear_system () override
 
void setup_time_term () override
 
void prepare_new_time_step () override
 postprocess velocity field (add sources) More...
 
void postprocess () override
 
- Protected Member Functions inherited from DarcyMH
void solve_nonlinear ()
 Solve method common to zero_time_step and update solution. More...
 
void make_serial_scatter ()
 
void modify_system ()
 
void create_linear_system (Input::AbstractRecord rec)
 Initialize global_row_4_sub_row. More...
 
void allocate_mh_matrix ()
 
void assembly_mh_matrix (MultidimAssembly &assembler)
 
void set_mesh_data_for_bddc (LinSys_BDDC *bddc_ls)
 
virtual double solution_precision () const
 
void print_matlab_matrix (string matlab_file)
 Print darcy flow matrix in matlab format into a file. More...
 

Static Protected Attributes

static const int registrar
 Registrar of class to factory. More...
 

Private Attributes

std::shared_ptr< EqDatadata_
 
VecScatter solution_2_edge_scatter_
 PETSC scatter from the solution vector to the parallel edge vector with ghost values. More...
 

Additional Inherited Members

- Public Types inherited from DarcyMH
enum  MortarMethod { NoMortar = 0, MortarP0 = 1, MortarP1 = 2 }
 Type of experimental Mortar-like method for non-compatible 1d-2d interaction. More...
 
typedef std::vector< std::shared_ptr< AssemblyBase > > MultidimAssembly
 
- Public Types inherited from DarcyFlowInterface
typedef DarcyFlowInterface FactoryBaseType
 Typedef for usage of Input::Factory in child classes. More...
 
- Protected Attributes inherited from DarcyMH
bool solution_changed_for_scatter
 
MH_DofHandler mh_dh
 
std::shared_ptr< Balancebalance_
 
DarcyFlowMHOutputoutput_object
 
int size
 
int n_schur_compls
 
double * solution
 
bool use_steady_assembly_
 
bool data_changed_
 
double tolerance_
 
unsigned int min_n_it_
 
unsigned int max_n_it_
 
unsigned int nonlinear_iteration_
 
LinSysschur0
 
Vec sol_vec
 
VecScatter par_to_all
 
Vec steady_diagonal
 
Vec steady_rhs
 
Vec new_diagonal
 
Vec previous_solution
 
std::shared_ptr< EqDatadata_
 
- Protected Attributes inherited from EquationBase
bool equation_empty_
 flag is true if only default constructor was called More...
 
Meshmesh_
 
TimeGovernortime_
 
Input::Record input_record_
 
FieldSeteq_data_
 
std::shared_ptr< Balancebalance_
 object for calculation and writing the mass balance to file. More...
 

Detailed Description

Edge lumped mixed-hybrid solution of unsteady Darcy flow.

The time term and sources are evenly distributed form an element to its edges. This applies directly to the second Schur complement. After this system for pressure traces is solved we reconstruct pressures and side flows as follows:

  1. Element pressure is average of edge pressure. This is in fact same as the MH for steady case so we let SchurComplement class do its job.
  2. We let SchurComplement to reconstruct fluxes and then account time term and sources which are evenly distributed from an element to its sides. It can be proved, that this keeps continuity of the fluxes over the edges.

This lumping technique preserves discrete maximum principle for any time step provided one use acute mesh. But in practice even worse meshes are tractable.

Ideas how to unify steady and unsteady flow: zero_time_step:

  1. Set initial time.
  2. Read initial condition. Reconstruct pressures.
  3. Assembly system (possibly in matrix free way).
  4. Reconstruct velocities (schur complement resolve).
  5. Solve iteratively as regular time step if an input flag "steady_initial_time" is set.
  6. (Detect that there is no time term. I such case use arbitrary long time step up to next change of data. Some kind of time step estimator would be nice.

update solution:

  1. Move to the next time.
  2. Update fields
  3. Nonlinear solve.
  4. In case of slow convergence, use shorter time-step, within estimated limits. Otherwise there is a different problem.

Definition at line 61 of file richards_lmh.hh.

Constructor & Destructor Documentation

RichardsLMH::RichardsLMH ( Mesh mesh,
const Input::Record  in_rec 
)

Definition at line 107 of file richards_lmh.cc.

Member Function Documentation

void RichardsLMH::assembly_linear_system ( )
overrideprotectedvirtual

Assembly or update whole linear system.

Reimplemented from DarcyMH.

Definition at line 216 of file richards_lmh.cc.

Here is the caller graph for this function:

void RichardsLMH::assembly_source_term ( )
overrideprotectedvirtual

Source term is implemented differently in LMH version.

Reimplemented from DarcyMH.

Definition at line 153 of file richards_lmh.cc.

const it::Record & RichardsLMH::get_input_type ( )
static

Definition at line 70 of file richards_lmh.cc.

Here is the caller graph for this function:

void RichardsLMH::initialize_specific ( )
overrideprotectedvirtual

Reimplemented from DarcyMH.

Definition at line 116 of file richards_lmh.cc.

void RichardsLMH::postprocess ( )
overrideprotectedvirtual

Reimplemented from DarcyMH.

Definition at line 272 of file richards_lmh.cc.

Here is the caller graph for this function:

void RichardsLMH::prepare_new_time_step ( )
overrideprotectedvirtual

postprocess velocity field (add sources)

Reimplemented from DarcyMH.

Definition at line 195 of file richards_lmh.cc.

void RichardsLMH::read_initial_condition ( )
overrideprotectedvirtual

Read initial condition into solution vector. Must be called after create_linear_system.

For the LMH scheme we have to be able to save edge pressures in order to restart simulation or use results of one simulation as initial condition for other one.

Reimplemented from DarcyMH.

Definition at line 159 of file richards_lmh.cc.

void RichardsLMH::setup_time_term ( )
overrideprotectedvirtual

Reimplemented from DarcyMH.

Definition at line 263 of file richards_lmh.cc.

bool RichardsLMH::zero_time_term ( bool  time_global = false)
overrideprotectedvirtual

Returns true is the fields involved in the time term have values that makes the time term zero. For time_global==true, it returns true if there are no field descriptors in the input list, so the fields )of the time ter) have their default values for whole simulation. If time_global==false (default), only the actual values are considered.

Reimplemented from DarcyMH.

Definition at line 202 of file richards_lmh.cc.

Here is the caller graph for this function:

Member Data Documentation

std::shared_ptr<EqData> RichardsLMH::data_
private

Definition at line 114 of file richards_lmh.hh.

const int RichardsLMH::registrar
staticprotected
Initial value:
=
Input::register_class< RichardsLMH, Mesh &, const Input::Record >("Flow_Richards_LMH") +

Registrar of class to factory.

Definition at line 99 of file richards_lmh.hh.

VecScatter RichardsLMH::solution_2_edge_scatter_
private

PETSC scatter from the solution vector to the parallel edge vector with ghost values.

Definition at line 116 of file richards_lmh.hh.


The documentation for this class was generated from the following files: