64 ConvectionTransport::get_input_type().size();
66 const
IT::Record &ConvectionTransport::get_input_type()
77 "Specification of output fields and output times.")
85 .
description(
"Boundary condition for concentration of substances.")
90 .
description(
"Initial values for concentration of substances.")
106 .
description(
"Subdomain ids of the domain decomposition.");
131 dh_ = make_shared<DOFHandlerMultiDim>(init_mesh);
132 shared_ptr<DiscreteSpace> ds = make_shared<EqualOrderDiscreteSpace>( &init_mesh, &fe0, &fe1, &fe2, &fe3);
133 dh_->distribute_dofs(ds);
275 unsigned int i, sbi, n_subst;
279 tm_diag =
new double*[n_subst];
281 for (sbi = 0; sbi < n_subst; sbi++) {
287 conc =
new double*[n_subst];
292 for (sbi = 0; sbi < n_subst; sbi++) {
314 vconc =
new Vec[n_subst];
315 vpconc =
new Vec[n_subst];
322 for (sbi = 0; sbi < n_subst; sbi++) {
329 VecZeroEntries(
vconc[sbi]);
330 VecZeroEntries(
vpconc[sbi]);
343 VecZeroEntries(
out_conc[sbi].petsc_vec());
366 unsigned int sbi, loc_el;
373 for (loc_el = 0; loc_el <
el_ds->
lsize(); loc_el++) {
378 for (
unsigned int si=0; si<elm->
n_sides(); si++) {
383 double aij = -(flux / elm.
measure() );
389 VecSetValue(
bcvcorr[sbi], new_i, value * aij, ADD_VALUES);
398 VecSetValue(
bcvcorr[sbi], new_i, 0, ADD_VALUES);
429 unsigned int loc_el, sbi;
430 double csection, source, diag;
446 for (loc_el = 0; loc_el <
el_ds->
lsize(); loc_el++)
462 diag = src_sigma * csection;
466 max_cfl = std::max(max_cfl, fabs(diag));
469 {- src_sigma * ele_acc.
measure() * csection},
490 std::stringstream ss;
516 bool cfl_changed =
false;
524 DebugOut() <<
"CFL changed - flow.\n";
531 DebugOut() <<
"CFL changed - mass matrix.\n";
541 DebugOut() <<
"CFL changed - source.\n";
549 VecCreateMPI(PETSC_COMM_WORLD,
el_ds->
lsize(),PETSC_DETERMINE, &cfl);
602 DebugOut() <<
"SRC - rescale dt.\n";
636 for (
unsigned int sbi = 0; sbi <
n_substances(); sbi++) {
707 for (
unsigned int loc_el = 0; loc_el <
el_ds->
lsize(); loc_el++) {
744 double flux, flux2, edg_flux;
748 unsigned int loc_el = 0;
750 new_i =
row_4_el[ dh_cell.elm_idx() ];
751 for(
DHCellSide cell_side : dh_cell.side_range() ) {
753 if (! cell_side.side().is_boundary()) {
757 if ( flux2 > 0) edg_flux+= flux2;
760 if (edge_side != cell_side) {
761 j = edge_side.element().idx();
765 if ( flux2 > 0.0 && flux <0.0)
766 aij = -(flux * flux2 / ( edg_flux * dh_cell.elm().measure() ) );
768 MatSetValue(
tm, new_i, new_j, aij, INSERT_VALUES);
772 aii -= (flux / dh_cell.elm().measure() );
775 for(
DHCellSide neighb_side : dh_cell.neighb_sides() )
777 ASSERT( neighb_side.elem_idx() != dh_cell.elm_idx() ).error(
"Elm. same\n");
778 new_j =
row_4_el[ neighb_side.elem_idx() ];
782 if (flux > 0.0) aij = flux / dh_cell.elm().measure();
784 MatSetValue(
tm, new_i, new_j, aij, INSERT_VALUES);
789 aii -= (-flux) / dh_cell.elm().measure();
790 aij = (-flux) / neighb_side.element().measure();
792 MatSetValue(
tm, new_j, new_i, aij, INSERT_VALUES);
795 MatSetValue(
tm, new_i, new_i, aii, INSERT_VALUES);
801 MatAssemblyBegin(
tm, MAT_FINAL_ASSEMBLY);
802 MatAssemblyEnd(
tm, MAT_FINAL_ASSEMBLY);
839 el_distribution_out = this->
el_ds;
860 for (
unsigned int sbi = 0; sbi <
n_substances(); sbi++) {
void output_type(OutputTime::DiscreteSpace rt)
int LongIdx
Define type that represents indices of large arrays (elements, nodes, dofs etc.)
unsigned int size() const
get global size
static auto subdomain(Mesh &mesh) -> IndexField
bool is_mass_diag_changed
Flag indicates that porosity or cross_section changed during last time.
double time_changed() const
void update_solution() override
double end_time() const
End time.
unsigned int * boundary_idx_
LongIdx * get_row_4_el() const
double transport_matrix_time
const std::vector< std::string > & names()
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()
void next_time()
Proceed to the next time according to current estimated time step.
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.
MultiField< 3, FieldValue< 3 >::Scalar > sources_density
Concentration sources - density of substance source, only positive part is used.
void set_boundary_conditions()
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.
MultiField< 3, FieldValue< 3 >::Scalar > sources_conc
BCMultiField< 3, FieldValue< 3 >::Scalar > bc_conc
void chkerr(unsigned int ierr)
Replacement of new/delete operator in the spirit of xmalloc.
std::vector< std::shared_ptr< FieldFE< 3, FieldValue< 3 >::Scalar > > > output_field_ptr
Fields correspond with out_conc.
SideIter side(const unsigned int loc_index)
void fill_output_data(VectorMPI &vec_seq, std::shared_ptr< FieldFE< spacedim, Value > > field_ptr)
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...
double ** conc
Concentrations for phase, substance, element.
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
static TimeMarks & marks()
void output_vector_gather()
Basic time management class.
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.
static constexpr bool value
Field< 3, FieldValue< 3 >::Scalar > subdomain
const string _equation_name
const MH_DofHandler * mh_dh
arma::vec::fixed< spacedim > centre() const
Computes the barycenter.
bool is_local(unsigned int idx) const
identify local index
static constexpr Mask equation_result
Match result fields. These are never given by input or copy of input.
bool is_boundary() const
Returns true for side on the boundary.
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
MultiField< 3, FieldValue< 3 >::Scalar > sources_sigma
Concentration sources - Robin type, in_flux = sources_sigma * (sources_conc - mobile_conc) ...
static constexpr Mask equation_external_output
Match an output field, that can be also copy of other field.
unsigned int begin(int proc) const
get starting local index
unsigned int n_sides() const
static auto region_id(Mesh &mesh) -> IndexField
ConvectionTransport(Mesh &init_mesh, const Input::Record in_rec)
bool is_changed_dt() const
#define START_TIMER(tag)
Starts a timer with specified tag.
std::vector< VectorMPI > out_conc
SubstanceList substances_
Transported substances.
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
double ** get_concentration_matrix() override
Getter for array of concentrations per element.
Field< 3, FieldValue< 3 >::Scalar > porosity
Mobile porosity - usually saturated water content in the case of unsaturated flow model...
std::shared_ptr< Balance > balance_
object for calculation and writing the mass balance to file.
virtual Range< ElementAccessor< 3 > > elements_range() const
Returns range of bulk elements.
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.
Distribution * get_el_ds() const
Field< 3, FieldValue< 3 >::Scalar > water_content
Water content - result of unsaturated water flow model or porosity.
Vec * vconc
Concentration vectors for mobile phase.
void mark_input_times(const TimeGovernor &tg)
TimeMark add(const TimeMark &mark)
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.
double side_flux(const Side &side) const
temporary replacement for DofHandler accessor, flux through given side
FieldCommon & description(const string &description)
bool is_convection_matrix_scaled
void set_input_list(Input::Array input_list, const TimeGovernor &tg)
virtual unsigned int n_elements(bool boundary=false) const
Returns count of boundary or bulk elements.
void initialize(std::shared_ptr< OutputTime > stream, Mesh *mesh, Input::Record in_rec, const TimeGovernor &tg)
void set_components(const std::vector< string > &names)
void compute_concentration_sources()
Assembles concentration sources for each substance. note: the source of concentration is multiplied b...
bool evaluate_time_constraint(double &time_constraint) override
VecScatter vconc_out_scatter
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.
#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.
FieldCommon & flags(FieldFlag::Flags::Mask mask)
Field< 3, FieldValue< 3 >::Scalar > cross_section
Pointer to DarcyFlow field cross_section.
Class for representation SI units of Fields.
#define MPI_Barrier(comm)
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)
unsigned int idx() const
Return local idx of element in boundary / bulk part of element vector.
Other possible transformation of coordinates:
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)
ElementAccessor< 3 > element_accessor()
void make_transport_partitioning()
double cfl_max_step
Time step constraint coming from CFL condition.
unsigned int lsize(int proc) const
get local size