71 ConvectionTransport::get_input_type().size();
73 const
IT::Record &ConvectionTransport::get_input_type()
84 "Specification of output fields and output times.")
92 .
description(
"Boundary condition for concentration of substances.")
97 .
description(
"Initial values for concentration of substances.")
113 .
description(
"Subdomain ids of the domain decomposition.");
121 : q_(
QGauss::make_array(0))
160 is_mass_diag_changed(false),
175 dh_ = make_shared<DOFHandlerMultiDim>(init_mesh);
176 shared_ptr<DiscreteSpace> ds = make_shared<EqualOrderDiscreteSpace>( &init_mesh, fe);
177 dh_->distribute_dofs(ds);
300 DebugOut() <<
"ConvectionTransport::set_initial_condition()\n";
307 LongIdx index = dh_cell.local_idx();
321 unsigned int sbi, n_subst;
324 tm_diag =
new double*[n_subst];
326 for (sbi = 0; sbi < n_subst; sbi++) {
347 vpconc =
new Vec[n_subst];
353 for (sbi = 0; sbi < n_subst; sbi++) {
358 VecZeroEntries(
vpconc[sbi]);
392 double csection, source, diag;
412 ASSERT_DBG(dh_cell.get_loc_dof_indices().size() == 1);
413 IntIdx local_p0_dof = dh_cell.get_loc_dof_indices()[0];
414 LongIdx glob_p0_dof =
dh_->get_local_to_global_map()[local_p0_dof];
421 if (sources_changed) {
431 corr_vec[sbi].set(local_p0_dof, source);
433 diag = src_sigma * csection;
434 tm_diag[sbi][local_p0_dof] = - diag;
437 max_cfl = std::max(max_cfl, fabs(diag));
440 {- src_sigma * elm.
measure() * csection},
449 for(
DHCellSide dh_side: dh_cell.side_range()) {
450 if (dh_side.side().is_boundary()) {
454 double aij = -(flux / elm.
measure() );
460 VecSetValue(
bcvcorr[sbi], glob_p0_dof, value * aij, ADD_VALUES);
465 {local_p0_dof}, {0.0}, flux*
value);
469 VecSetValue(
bcvcorr[sbi], glob_p0_dof, 0, ADD_VALUES);
473 {local_p0_dof}, {flux}, 0.0);
499 std::stringstream ss;
526 bool cfl_changed =
false;
534 DebugOut() <<
"CFL changed - flow.\n";
541 DebugOut() <<
"CFL changed - mass matrix.\n";
557 DebugOut() <<
"CFL changed - source.\n";
565 VecCreateMPI(PETSC_COMM_WORLD,
el_ds->
lsize(),PETSC_DETERMINE, &cfl);
608 DebugOut() <<
"SRC - rescale dt.\n";
613 VecScale(
corr_vec[sbi].petsc_vec(), dt);
642 for (
unsigned int sbi = 0; sbi <
n_substances(); sbi++) {
660 VecCopy(vconc,
vpconc[sbi]);
664 MatMultAdd(
tm,
vpconc[sbi], vconc, vconc);
666 VecPointwiseDivide(vconc, vconc,
mass_diag);
669 VecPointwiseDivide(vconc, vconc,
mass_diag);
670 VecAXPY(vconc, 1,
vpconc[sbi]);
717 ASSERT_DBG(dh_cell.get_loc_dof_indices().size() == 1);
718 IntIdx local_p0_dof = dh_cell.get_loc_dof_indices()[0];
725 balance_->add_mass_values(
subst_idx[sbi], dh_cell, {local_p0_dof}, {csection*por_m*elm.measure()}, 0);
727 VecSetValue(
mass_diag,
dh_->get_local_to_global_map()[local_p0_dof], csection*por_m, INSERT_VALUES);
754 double flux, flux2, edg_flux;
758 unsigned int loc_el = 0;
760 new_i =
row_4_el[ dh_cell.elm_idx() ];
762 for(
DHCellSide cell_side : dh_cell.side_range() ) {
764 if (! cell_side.side().is_boundary()) {
769 if ( flux2 > 0) edg_flux+= flux2;
772 if (edge_side != cell_side) {
773 j = edge_side.element().idx();
778 if ( flux2 > 0.0 && flux <0.0)
779 aij = -(flux * flux2 / ( edg_flux * dh_cell.elm().measure() ) );
781 MatSetValue(
tm, new_i, new_j, aij, INSERT_VALUES);
785 aii -= (flux / dh_cell.elm().measure() );
788 for(
DHCellSide neighb_side : dh_cell.neighb_sides() )
790 ASSERT( neighb_side.elem_idx() != dh_cell.elm_idx() ).error(
"Elm. same\n");
791 new_j =
row_4_el[ neighb_side.elem_idx() ];
796 if (flux > 0.0) aij = flux / dh_cell.elm().measure();
798 MatSetValue(
tm, new_i, new_j, aij, INSERT_VALUES);
803 aii -= (-flux) / dh_cell.elm().measure();
804 aij = (-flux) / neighb_side.element().measure();
806 MatSetValue(
tm, new_j, new_i, aij, INSERT_VALUES);
809 MatSetValue(
tm, new_i, new_i, aii, INSERT_VALUES);
815 MatAssemblyBegin(
tm, MAT_FINAL_ASSEMBLY);
816 MatAssemblyEnd(
tm, MAT_FINAL_ASSEMBLY);
831 el_distribution_out = this->
el_ds;
865 if (cell_side.
dim()==3)
return calculate_side_flux<3>(cell_side);
866 else if (cell_side.
dim()==2)
return calculate_side_flux<2>(cell_side);
867 else return calculate_side_flux<1>(cell_side);
870 template<
unsigned int dim>
873 ASSERT_EQ(cell_side.
dim(), dim).error(
"Element dimension mismatch!");
void output_type(OutputTime::DiscreteSpace rt)
MultiField< 3, FieldValue< 3 >::Scalar > sources_conc
const Element * element() const
static auto subdomain(Mesh &mesh) -> IndexField
Quadrature & q(unsigned int dim)
bool is_mass_diag_changed
Flag indicates that porosity or cross_section changed during last time.
Transformed quadrature weight for cell sides.
void update_solution() override
double end_time() const
End time.
LongIdx * get_row_4_el() const
double transport_matrix_time
Field< 3, FieldValue< 3 >::VectorFixed > flow_flux
Flow flux, can be result of water flow model.
double calculate_side_flux(const DHCellSide &cell)
Calculate flux on side of given element specified by dimension.
unsigned int dim() const
Return dimension of element appropriate to the side.
Field< 3, FieldValue< 3 >::Scalar > water_content
Water content - result of unsaturated water flow model or porosity.
const std::vector< std::string > & names()
QGauss::array q_
Quadratures used in assembling methods.
void alloc_transport_vectors()
unsigned int n_substances() override
Returns number of transported substances.
void output(TimeStep step)
double fix_dt_until_mark()
Fixing time step until fixed time mark.
MultiField< 3, FieldValue< 3 >::Scalar > conc_mobile
Calculated concentrations in the mobile zone.
void create_mass_matrix()
MultiField< 3, FieldValue< 3 >::Scalar > sources_sigma
Concentration sources - Robin type, in_flux = sources_sigma * (sources_conc - mobile_conc) ...
void next_time()
Proceed to the next time according to current estimated time step.
virtual unsigned int n_elements() const
Returns count of boundary or bulk elements.
void initialize() override
std::shared_ptr< OutputTime > output_stream_
TimeMark::Type target_mark_type
TimeMark type for time marks denoting end of every time interval where transport matrix remains const...
void set_initial_condition()
Field< 3, FieldValue< 3 >::Scalar > region_id
double transport_bc_time
Time of the last update of the boundary condition terms.
Fields computed from the mesh data.
EquationOutput output_fields
Fields indended for output, i.e. all input fields plus those representing solution.
Cell accessor allow iterate over DOF handler cells.
Class FEValues calculates finite element data on the actual cells such as shape function values...
BCMultiField< 3, FieldValue< 3 >::Scalar > bc_conc
void chkerr(unsigned int ierr)
Replacement of new/delete operator in the spirit of xmalloc.
double side_flux(const DHCellSide &cell_side)
Wrapper of following method, call side_flux with correct template parameter.
void set_balance_object(std::shared_ptr< Balance > balance) override
#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
virtual ~ConvectionTransport()
static Input::Type::Abstract & get_input_type()
Common specification of the input record for secondary equations.
MultiField< 3, FieldValue< 3 >::Scalar > init_conc
Initial concentrations.
FieldCommon & units(const UnitSI &units)
Set basic units of the field.
void zero_time_step() override
Side side() const
Return Side of given cell and side_idx.
void reinit(const ElementAccessor< spacedim > &cell)
Update cell-dependent data (gradients, Jacobians etc.)
static TimeMarks & marks()
void set(std::vector< typename Field< spacedim, Value >::FieldBasePtr > field_vec, double time, std::vector< std::string > region_set_names={"ALL"})
Basic time management class.
FieldFEScalarVec & get_p0_interpolation() override
Getter for P0 interpolation by FieldFE.
virtual ElementAccessor< 3 > element_accessor(unsigned int idx) const
Create and return ElementAccessor to element of given idx.
const Input::Record input_rec
Record with input specification.
Base class for quadrature rules on simplices in arbitrary dimensions.
static constexpr bool value
Symmetric Gauss-Legendre quadrature formulae on simplices.
Field< 3, FieldValue< 3 >::Scalar > subdomain
const string _equation_name
FieldFEScalarVec conc_mobile_fe
Underlaying FieldFE for each substance of conc_mobile.
arma::vec::fixed< spacedim > centre() const
Computes the barycenter.
vector< VectorMPI > corr_vec
Discontinuous Lagrangean finite element on dim dimensional simplex.
Transformed quadrature points.
static constexpr Mask equation_result
Match result fields. These are never given by input or copy of input.
RangeConvert< DHEdgeSide, DHCellSide > edge_sides() const
Returns range of all sides looped over common Edge.
FieldCommon & input_default(const string &input_default)
TimeMark::Type equation_fixed_mark_type() const
Definitions of basic Lagrangean finite elements with polynomial shape functions.
static constexpr Mask equation_external_output
Match an output field, that can be also copy of other field.
ElementAccessor< 3 > element() const
static auto region_id(Mesh &mesh) -> IndexField
ConvectionTransport(Mesh &init_mesh, const Input::Record in_rec)
void initialize(Quadrature &_quadrature, FiniteElement< DIM > &_fe, UpdateFlags _flags)
Initialize structures and calculates cell-independent data.
bool is_changed_dt() const
#define START_TIMER(tag)
Starts a timer with specified tag.
SubstanceList substances_
Transported substances.
Vec get_component_vec(unsigned int sbi) override
Return PETSc vector with solution for sbi-th substance.
LongIdx * get_row_4_el() override
Return global array of order of elements within parallel vector.
virtual Value::return_type const & value(const Point &p, const ElementAccessor< spacedim > &elm) const
FEValues< 3 > & fe_values(unsigned int dim)
std::shared_ptr< Balance > balance_
object for calculation and writing the mass balance to file.
std::shared_ptr< DOFHandlerMultiDim > dh_
double measure() const
Computes the measure of the element.
vector< unsigned int > subst_idx
List of indices used to call balance methods for a set of quantities.
Shape function gradients.
Distribution * get_el_ds() const
std::shared_ptr< Balance > balance() const
FEValues< 3 > fe_values_[3]
FESideValues objects for side flux calculating.
void mark_input_times(const TimeGovernor &tg)
TimeMark add(const TimeMark &mark)
Field< 3, FieldValue< 3 >::Scalar > porosity
Mobile porosity - usually saturated water content in the case of unsaturated flow model...
void create_transport_matrix_mpi()
Support classes for parallel programing.
void alloc_transport_structs_mpi()
int set_upper_constraint(double upper, std::string message)
Sets upper constraint for the next time step estimating.
int LongIdx
Define type that represents indices of large arrays (elements, nodes, dofs etc.)
FieldCommon & description(const string &description)
bool is_convection_matrix_scaled
void set_input_list(Input::Array input_list, const TimeGovernor &tg)
void initialize(std::shared_ptr< OutputTime > stream, Mesh *mesh, Input::Record in_rec, const TimeGovernor &tg)
#define ASSERT_PTR(ptr)
Definition of assert macro checking non-null pointer (PTR)
void set_components(const std::vector< string > &names)
bool evaluate_time_constraint(double &time_constraint) override
FiniteElement< 1 > * fe1_
Vec vcfl_flow_
Parallel vector for flow contribution to CFL condition.
void set_target_time(double target_time) override
virtual void output_data() override
Write computed fields.
bool set_time(const TimeStep &time, LimitSide limit_side)
void get_par_info(LongIdx *&el_4_loc, Distribution *&el_ds) override
Return array of indices of local elements and parallel distribution of elements.
Distributed sparse graphs, partitioning.
Vec vcfl_source_
Parallel vector for source term contribution to CFL condition.
unsigned int bulk_idx() const
Returns index of the region in the bulk set.
Definitions of particular quadrature rules on simplices.
#define WarningOut()
Macro defining 'warning' record of log.
FieldCommon & name(const string &name)
#define END_TIMER(tag)
Ends a timer with specified tag.
#define OLD_ASSERT_EQUAL(a, b)
double ** cumulative_corr
void set_mesh(const Mesh &mesh)
Class used for marking specified times at which some events occur.
FETransportObjects feo_
Finite element objects.
FieldCommon & flags(FieldFlag::Flags::Mask mask)
double JxW(const unsigned int point_no)
Return the product of Jacobian determinant and the quadrature weight at given quadrature point...
Class for representation SI units of Fields.
#define MPI_Barrier(comm)
void conc_sources_bdr_conditions()
Assembles concentration sources for each substance and set boundary conditions. note: the source of c...
static UnitSI & dimensionless()
Returns dimensionless unit.
#define DebugOut()
Macro defining 'debug' record of log.
static bool print_message_table(ostream &stream, std::string equation_name)
Other possible transformation of coordinates:
FiniteElement< 3 > * fe3_
FiniteElement< 0 > * fe0_
Finite elements for the solution of the advection-diffusion equation.
LongIdx * get_el_4_loc() const
Implementation of range helper class.
Side accessor allows to iterate over sides of DOF handler cell.
#define FLOW123D_FORCE_LINK_IN_CHILD(x)
#define ASSERT_EQ(a, b)
Definition of comparative assert macro (EQual)
void make_transport_partitioning()
double cfl_max_step
Time step constraint coming from CFL condition.
FiniteElement< 2 > * fe2_
Field< 3, FieldValue< 3 >::Scalar > cross_section
Pointer to DarcyFlow field cross_section.
MultiField< 3, FieldValue< 3 >::Scalar > sources_density
Concentration sources - density of substance source, only positive part is used.
unsigned int lsize(int proc) const
get local size
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
Side centre.