Flow123d
jenkins-Flow123d-linux-release-multijob-198
|
#include <mass_balance.hh>
Classes | |
class | Quantity |
Public Types | |
enum | OutputFormat { legacy, txt, gnuplot } |
Public Member Functions | |
Balance (const std::string &file_prefix, const Mesh *mesh, const Distribution *el_ds, const int *el_4_loc, const Input::Record &in_rec) | |
~Balance () | |
void | units (const UnitSI &unit) |
Setter for units of conserved quantities. More... | |
bool | cumulative () const |
Getter for cumulative_. More... | |
unsigned int | add_quantity (const string &name) |
std::vector< unsigned int > | add_quantities (const std::vector< string > &names) |
void | allocate (unsigned int n_loc_dofs, unsigned int max_dofs_per_boundary) |
void | start_mass_assembly (unsigned int quantity_idx) |
void | start_mass_assembly (std::vector< unsigned int > q_idx_vec) |
Variant of the start_mass_assembly() method for a set of quantities. More... | |
void | start_flux_assembly (unsigned int quantity_idx) |
void | start_flux_assembly (std::vector< unsigned int > q_idx_vec) |
Variant of the start_flux_assembly() method for a set of quantities. More... | |
void | start_source_assembly (unsigned int quantity_idx) |
void | start_source_assembly (std::vector< unsigned int > q_idx_vec) |
Variant of the start_source_assembly() method for a set of quantities. More... | |
void | add_mass_matrix_values (unsigned int quantity_idx, unsigned int region_idx, const std::vector< int > &dof_indices, const std::vector< double > &values) |
void | add_flux_matrix_values (unsigned int quantity_idx, unsigned int elem_idx, const std::vector< int > &dof_indices, const std::vector< double > &values) |
void | add_source_matrix_values (unsigned int quantity_idx, unsigned int region_idx, const std::vector< int > &dof_indices, const std::vector< double > &values) |
void | add_flux_vec_value (unsigned int quantity_idx, unsigned int elem_idx, double value) |
void | add_source_rhs_values (unsigned int quantity_idx, unsigned int region_idx, const std::vector< int > &dof_values, const std::vector< double > &values) |
void | finish_mass_assembly (unsigned int quantity_idx) |
This method must be called after assembling the matrix for computing mass. More... | |
void | finish_mass_assembly (std::vector< unsigned int > q_idx_vec) |
Variant of the finish_mass_assembly() method for a set of quantities. More... | |
void | finish_flux_assembly (unsigned int quantity_idx) |
This method must be called after assembling the matrix and vector for computing flux. More... | |
void | finish_flux_assembly (std::vector< unsigned int > q_idx_vec) |
Variant of the finish_flux_assembly() method for a set of quantities. More... | |
void | finish_source_assembly (unsigned int quantity_idx) |
This method must be called after assembling the matrix and vectors for computing source. More... | |
void | finish_source_assembly (std::vector< unsigned int > q_idx_vec) |
Variant of the finish_source_assembly() method for a set of quantities. More... | |
void | calculate_cumulative_sources (unsigned int quantity_idx, const Vec &solution, double dt) |
void | calculate_cumulative_fluxes (unsigned int quantity_idx, const Vec &solution, double dt) |
void | calculate_mass (unsigned int quantity_idx, const Vec &solution, vector< double > &output_array) |
void | calculate_mass (unsigned int quantity_idx, const Vec &solution) |
void | calculate_flux (unsigned int quantity_idx, const Vec &solution) |
void | calculate_source (unsigned int quantity_idx, const Vec &solution) |
void | add_cumulative_source (unsigned int quantity_idx, double source) |
void | output (double time) |
Perform output to file for given time instant. More... | |
Static Public Attributes | |
static Input::Type::Record | input_type |
Main balance input record type. More... | |
static Input::Type::Selection | format_selection_input_type |
Input selection for file format. More... | |
Private Member Functions | |
void | output_legacy (double time) |
Perform output in old format (for compatibility) More... | |
void | output_csv (double time, char delimiter, const std::string &comment_string, unsigned int repeat=0) |
Perform output in csv format. More... | |
std::string | csv_zero_vals (unsigned int cnt, char delimiter) |
Return part of output represented by zero values. Count of zero values is given by cnt parameter. More... | |
void | format_csv_output_header (char delimiter, const std::string &comment_string) |
Print output header. More... | |
std::string | format_csv_val (std::string val, char delimiter, bool initial=false) |
Format string value of csv output. Wrap string into quotes and if delimiter is space, align text to column. More... | |
std::string | format_csv_val (double val, char delimiter, bool initial=false) |
Format double value of csv output. If delimiter is space, align text to column. More... | |
Private Attributes | |
ofstream | output_ |
Handle for file for output of balance and total fluxes over individual regions and region sets. More... | |
OutputFormat | output_format_ |
Format of output file. More... | |
std::vector< Quantity > | quantities_ |
Names of conserved quantities. More... | |
const RegionDB & | regions_ |
Database of bulk and boundary regions. More... | |
UnitSI | units_ |
Units of conserved quantities. More... | |
Mat * | region_mass_matrix_ |
Matrices for calculation of mass (n_dofs x n_bulk_regions). More... | |
Mat * | be_flux_matrix_ |
Matrices for calculation of flux (n_boundary_edges x n_dofs). More... | |
Mat * | region_source_matrix_ |
Matrices for calculation of source (n_dofs x n_bulk_regions). More... | |
Mat * | region_source_rhs_ |
Matrices for calculation of signed source (n_dofs x n_bulk_regions). More... | |
Vec * | be_flux_vec_ |
Vectors for calculation of flux (n_boundary_edges). More... | |
Vec * | region_source_vec_ |
Vectors for calculation of source (n_bulk_regions). More... | |
Mat | region_be_matrix_ |
Vec | ones_ |
auxiliary vectors for summation of matrix columns More... | |
Vec | ones_be_ |
std::vector< unsigned int > | be_regions_ |
Number of boundary region for each local boundary edge. More... | |
int | be_offset_ |
Offset for local part of vector of boundary edges. More... | |
std::vector< std::vector < double > > | fluxes_ |
std::vector< std::vector < double > > | fluxes_in_ |
std::vector< std::vector < double > > | fluxes_out_ |
std::vector< std::vector < double > > | masses_ |
std::vector< std::vector < double > > | sources_ |
std::vector< std::vector < double > > | sources_in_ |
std::vector< std::vector < double > > | sources_out_ |
std::vector< double > | sum_fluxes_ |
std::vector< double > | sum_fluxes_in_ |
std::vector< double > | sum_fluxes_out_ |
std::vector< double > | sum_masses_ |
std::vector< double > | sum_sources_ |
std::vector< double > | sum_sources_in_ |
std::vector< double > | sum_sources_out_ |
std::vector< double > | initial_mass_ |
std::vector< double > | integrated_sources_ |
std::vector< double > | integrated_fluxes_ |
std::vector< double > | increment_fluxes_ |
std::vector< double > | increment_sources_ |
double | initial_time_ |
initial time More... | |
double | last_time_ |
time of last calculated balance More... | |
bool | initial_ |
true before calculating the mass at initial time, otherwise false More... | |
bool | cumulative_ |
if true then cumulative balance is computed More... | |
bool | allocation_done_ |
true before allocating necessary internal structures (Petsc matrices etc.) More... | |
int | rank_ |
MPI rank. More... | |
unsigned int | output_line_counter_ |
hold count of line printed into output_ More... | |
Static Private Attributes | |
static const unsigned int | output_column_width = 20 |
Size of column in output (used if delimiter is space) More... | |
Design of balance class - serves as storage and writer. Equations themselves call methods of Balance that add/modify mass, source and flux of various quantities and generate output.
One instance of Balance can handle several conservative quantities of the same type (e.g. mass of several substances or their phases).
The mass, flux and source are calculated as follows:
m(q,c,r) = ( M'(q,c) * solution )[r] f(q,c,r) = ( R' * ( F(q,c) * solution + fv(q,c) ) )[r] s(q,c,r) = ( S'(q,c) * solution + sv(q,c) )[r]
where M' stands for matrix transpose,
m(q,c,r)...mass of q-th substance's c-th component in region r f(q,c,r)...flux of q-th substance's c-th component in region r s(q,c,r)...source of q-th substance's c-th component in region r
and
M(q,c)...region_mass_matrix_[q*quantities_.size() + c] n_dofs x n_bulk_regions F(q,c)...be_flux_matrix_[q*quantities_.size() + c] n_boundary_edges x n_dofs S(q,c)...region_source_matrix_[q*quantities_.size() + c] n_dofs x n_bulk_regions SV(q,c)..region_source_rhs_[q*quantities_.size() + c] n_dofs x n_bulk_regions fv(q,c)..be_flux_vec_[q*quantities_.size() + c] n_boundary_edges sv(q,c)..region_source_vec_[q*quantities_.size() + c] n_bulk_regions R........region_be_matrix_ n_boundary_edges x n_boundary_regions
Note that it holds:
sv(q,c) = column sum of SV(q,c)
Except for that, we also provide information on positive/negative flux and source:
fp(q,c,r) = ( R' * EFP(q,c) )[r], EFP(q,c)[e] = max{ 0, ( F(q,c) * solution + fv(q,c) )[e] } fn(q,c,r) = ( R' * EFN(q,c) )[r], EFN(q,c)[e] = min{ 0, ( F(q,c) * solution + fv(q,c) )[e] } sp(q,c,r) = sum_{i in DOFS } max{ 0, ( S(q,c)[i,r] * solution[i] + SV(q,c)[i,r] ) } sn(q,c,r) = sum_{i in DOFS } min{ 0, ( S(q,c)[i,r] * solution[i] + SV(q,c)[i,r] ) }
where
fp(q,c,r)...positive (outward) flux of q-th quantity's c-th component in region r fn(q,c,r)...negative (inward) flux of q-th quantity's c-th component in region r sp(q,c,r)...positive source (spring) of q-th quantity's c-th component in region r sn(q,c,r)...negative source (sink) of q-th quantity's c-th component in region r
Remark: The matrix R is needed only for calculation of signed fluxes. The reason is that to determine sign, we decompose flux to sum of local contributions per each boundary element and check its sign. It is not possible to decompose flux using shape functions, since their normal derivatives may have any sign.
Output values (if not relevant, zero is supplied):
#time bulk_region quantity 0 0 0 mass source source_in source_out 0 0 0 #time boundary_region quantity flux flux_in flux_out 0 0 0 0 0 0 0 #time ALL quantity flux flux_in flux_out mass source source_in source_out integrated_flux integrated_source error
error = current_mass - (initial_mass + integrated_source - integrated_flux)
Definition at line 80 of file mass_balance.hh.
Possible formats of output file.
Enumerator | |
---|---|
legacy |
legacy |
txt |
csv |
gnuplot |
gnuplot |
Definition at line 107 of file mass_balance.hh.
Balance::Balance | ( | const std::string & | file_prefix, |
const Mesh * | mesh, | ||
const Distribution * | el_ds, | ||
const int * | el_4_loc, | ||
const Input::Record & | in_rec | ||
) |
Constructor.
file_prefix | Prefix of output file name. |
mesh | Mesh. |
el_ds | Distribution of elements. |
el_4_loc | Local to global element numbering. |
in_rec | Input record of balance. |
Definition at line 67 of file mass_balance.cc.
Balance::~Balance | ( | ) |
Definition at line 120 of file mass_balance.cc.
void Balance::add_cumulative_source | ( | unsigned int | quantity_idx, |
double | source | ||
) |
Adds provided values to the cumulative sources.
quantity_idx | Index of quantity. |
sources | Sources per region. |
dt | Actual time step. |
Definition at line 625 of file mass_balance.cc.
void Balance::add_flux_matrix_values | ( | unsigned int | quantity_idx, |
unsigned int | elem_idx, | ||
const std::vector< int > & | dof_indices, | ||
const std::vector< double > & | values | ||
) |
Adds elements into matrix for computing flux.
quantity_idx | Index of quantity. |
elem_idx | Local index of boundary edge. |
n_dofs | Number of dofs to be added. |
dof_indices | Dof indices to be added. |
values | Values to be added. |
Definition at line 387 of file mass_balance.cc.
void Balance::add_flux_vec_value | ( | unsigned int | quantity_idx, |
unsigned int | elem_idx, | ||
double | value | ||
) |
Adds element into vector for computing flux.
quantity_idx | Index of quantity. |
elem_idx | Local index of boundary edge. |
value | Value to be added. |
Definition at line 421 of file mass_balance.cc.
void Balance::add_mass_matrix_values | ( | unsigned int | quantity_idx, |
unsigned int | region_idx, | ||
const std::vector< int > & | dof_indices, | ||
const std::vector< double > & | values | ||
) |
Adds elements into matrix for computing mass.
quantity_idx | Index of quantity. |
region_idx | Index of bulk region. |
n_dofs | Number of dofs to be added. |
dof_indices | Dof indices to be added. |
values | Values to be added. |
Definition at line 370 of file mass_balance.cc.
std::vector< unsigned int > Balance::add_quantities | ( | const std::vector< string > & | names | ) |
Define a set of conservative quantities.
names | List of quantities' names. |
Definition at line 156 of file mass_balance.cc.
unsigned int Balance::add_quantity | ( | const string & | name | ) |
Define a single conservative quantity.
name | Name of the quantity. |
Definition at line 145 of file mass_balance.cc.
void Balance::add_source_matrix_values | ( | unsigned int | quantity_idx, |
unsigned int | region_idx, | ||
const std::vector< int > & | dof_indices, | ||
const std::vector< double > & | values | ||
) |
Adds elements into matrix for computing source.
quantity_idx | Index of quantity. |
region_idx | Index of bulk region. |
n_dofs | Number of dofs to be added. |
dof_indices | Dof indices to be added. |
values | Values to be added. |
Definition at line 404 of file mass_balance.cc.
void Balance::add_source_rhs_values | ( | unsigned int | quantity_idx, |
unsigned int | region_idx, | ||
const std::vector< int > & | dof_values, | ||
const std::vector< double > & | values | ||
) |
Adds elements into vector for computing source.
quantity_idx | Index of quantity. |
region_idx | Index of bulk region. |
n_dofs | Number of dofs to be added. |
dof_indices | Dof indices to be added. |
values | Values to be added. |
Definition at line 432 of file mass_balance.cc.
void Balance::allocate | ( | unsigned int | n_loc_dofs, |
unsigned int | max_dofs_per_boundary | ||
) |
Allocates matrices and vectors for balance.
n_loc_dofs | Number of solution dofs on the local process. |
max_dofs_per_boundary | Number of dofs contributing to one boundary edge. |
Definition at line 169 of file mass_balance.cc.
void Balance::calculate_cumulative_fluxes | ( | unsigned int | quantity_idx, |
const Vec & | solution, | ||
double | dt | ||
) |
Updates cumulative quantities for balance. This method can be called in substeps even if no output is generated. It calculates the sum of flux and source over time interval.
quantity_idx | Index of quantity. |
solution | Solution vector. |
dt | Actual time step. |
Definition at line 480 of file mass_balance.cc.
void Balance::calculate_cumulative_sources | ( | unsigned int | quantity_idx, |
const Vec & | solution, | ||
double | dt | ||
) |
Updates cumulative quantities for balance. This method can be called in substeps even if no output is generated. It calculates the sum of flux and source over time interval.
quantity_idx | Index of quantity. |
solution | Solution vector. |
dt | Actual time step. |
Definition at line 449 of file mass_balance.cc.
void Balance::calculate_flux | ( | unsigned int | quantity_idx, |
const Vec & | solution | ||
) |
Calculates actual flux.
quantity_idx | Index of quantity. |
solution | Solution vector. |
Definition at line 591 of file mass_balance.cc.
void Balance::calculate_mass | ( | unsigned int | quantity_idx, |
const Vec & | solution, | ||
vector< double > & | output_array | ||
) |
Calculates actual mass and save it to given vector.
quantity_idx | Index of quantity. |
solution | Solution vector. |
output_array | Vector of output masses per region. |
Definition at line 515 of file mass_balance.cc.
|
inline |
Calculates actual mass and save it to internal vector.
quantity_idx | Index of quantity. |
solution | Solution vector. |
Definition at line 333 of file mass_balance.hh.
void Balance::calculate_source | ( | unsigned int | quantity_idx, |
const Vec & | solution | ||
) |
Calculates actual source.
quantity_idx | Index of quantity. |
solution | Solution vector. |
Definition at line 536 of file mass_balance.cc.
|
private |
Return part of output represented by zero values. Count of zero values is given by cnt parameter.
Definition at line 909 of file mass_balance.cc.
|
inline |
Getter for cumulative_.
Definition at line 140 of file mass_balance.hh.
void Balance::finish_flux_assembly | ( | unsigned int | quantity_idx | ) |
This method must be called after assembling the matrix and vector for computing flux.
Definition at line 348 of file mass_balance.cc.
|
inline |
Variant of the finish_flux_assembly() method for a set of quantities.
Definition at line 278 of file mass_balance.hh.
void Balance::finish_mass_assembly | ( | unsigned int | quantity_idx | ) |
This method must be called after assembling the matrix for computing mass.
Definition at line 341 of file mass_balance.cc.
|
inline |
Variant of the finish_mass_assembly() method for a set of quantities.
Definition at line 268 of file mass_balance.hh.
void Balance::finish_source_assembly | ( | unsigned int | quantity_idx | ) |
This method must be called after assembling the matrix and vectors for computing source.
Definition at line 357 of file mass_balance.cc.
|
inline |
Variant of the finish_source_assembly() method for a set of quantities.
Definition at line 288 of file mass_balance.hh.
|
private |
Print output header.
Definition at line 998 of file mass_balance.cc.
|
private |
Format string value of csv output. Wrap string into quotes and if delimiter is space, align text to column.
Definition at line 1025 of file mass_balance.cc.
|
private |
Format double value of csv output. If delimiter is space, align text to column.
Definition at line 1042 of file mass_balance.cc.
void Balance::output | ( | double | time | ) |
Perform output to file for given time instant.
Definition at line 635 of file mass_balance.cc.
|
private |
Perform output in csv format.
Definition at line 917 of file mass_balance.cc.
|
private |
Perform output in old format (for compatibility)
Definition at line 764 of file mass_balance.cc.
void Balance::start_flux_assembly | ( | unsigned int | quantity_idx | ) |
This method must be called before assembling the matrix and vector for fluxes. It actually erases the matrix and vector.
Definition at line 324 of file mass_balance.cc.
|
inline |
Variant of the start_flux_assembly() method for a set of quantities.
Definition at line 183 of file mass_balance.hh.
void Balance::start_mass_assembly | ( | unsigned int | quantity_idx | ) |
This method must be called before assembling the matrix for computing mass. It actually erases the matrix.
Definition at line 317 of file mass_balance.cc.
|
inline |
Variant of the start_mass_assembly() method for a set of quantities.
Definition at line 170 of file mass_balance.hh.
void Balance::start_source_assembly | ( | unsigned int | quantity_idx | ) |
This method must be called before assembling the matrix and vectors for sources. It actually erases the matrix and vectors.
Definition at line 332 of file mass_balance.cc.
|
inline |
Variant of the start_source_assembly() method for a set of quantities.
Definition at line 196 of file mass_balance.hh.
|
inline |
Setter for units of conserved quantities.
Definition at line 137 of file mass_balance.hh.
|
private |
true before allocating necessary internal structures (Petsc matrices etc.)
Definition at line 478 of file mass_balance.hh.
|
private |
Matrices for calculation of flux (n_boundary_edges x n_dofs).
Definition at line 409 of file mass_balance.hh.
|
private |
Vectors for calculation of flux (n_boundary_edges).
Definition at line 418 of file mass_balance.hh.
|
private |
Offset for local part of vector of boundary edges.
Definition at line 436 of file mass_balance.hh.
|
private |
Number of boundary region for each local boundary edge.
Definition at line 433 of file mass_balance.hh.
|
private |
if true then cumulative balance is computed
Definition at line 475 of file mass_balance.hh.
|
private |
Definition at line 441 of file mass_balance.hh.
|
private |
Definition at line 442 of file mass_balance.hh.
|
private |
Definition at line 443 of file mass_balance.hh.
|
static |
Input selection for file format.
Definition at line 118 of file mass_balance.hh.
|
private |
Definition at line 462 of file mass_balance.hh.
|
private |
Definition at line 463 of file mass_balance.hh.
|
private |
true before calculating the mass at initial time, otherwise false
Definition at line 472 of file mass_balance.hh.
|
private |
Definition at line 457 of file mass_balance.hh.
|
private |
initial time
Definition at line 466 of file mass_balance.hh.
|
static |
Main balance input record type.
Definition at line 115 of file mass_balance.hh.
|
private |
Definition at line 461 of file mass_balance.hh.
|
private |
Definition at line 460 of file mass_balance.hh.
|
private |
time of last calculated balance
Definition at line 469 of file mass_balance.hh.
|
private |
Definition at line 444 of file mass_balance.hh.
|
private |
auxiliary vectors for summation of matrix columns
Definition at line 430 of file mass_balance.hh.
|
private |
Definition at line 430 of file mass_balance.hh.
|
private |
Handle for file for output of balance and total fluxes over individual regions and region sets.
Definition at line 390 of file mass_balance.hh.
|
staticprivate |
Size of column in output (used if delimiter is space)
Definition at line 368 of file mass_balance.hh.
|
private |
Format of output file.
Definition at line 393 of file mass_balance.hh.
|
private |
hold count of line printed into output_
Definition at line 484 of file mass_balance.hh.
|
private |
Names of conserved quantities.
Definition at line 396 of file mass_balance.hh.
|
private |
MPI rank.
Definition at line 481 of file mass_balance.hh.
|
private |
Auxiliary matrix for transfer of quantities between boundary edges and regions (n_boundary_edges x n_boundary_regions).
Definition at line 427 of file mass_balance.hh.
|
private |
Matrices for calculation of mass (n_dofs x n_bulk_regions).
Definition at line 406 of file mass_balance.hh.
|
private |
Matrices for calculation of source (n_dofs x n_bulk_regions).
Definition at line 412 of file mass_balance.hh.
|
private |
Matrices for calculation of signed source (n_dofs x n_bulk_regions).
Definition at line 415 of file mass_balance.hh.
|
private |
Vectors for calculation of source (n_bulk_regions).
Definition at line 421 of file mass_balance.hh.
|
private |
Database of bulk and boundary regions.
Definition at line 399 of file mass_balance.hh.
|
private |
Definition at line 445 of file mass_balance.hh.
|
private |
Definition at line 446 of file mass_balance.hh.
|
private |
Definition at line 447 of file mass_balance.hh.
|
private |
Definition at line 450 of file mass_balance.hh.
|
private |
Definition at line 451 of file mass_balance.hh.
|
private |
Definition at line 452 of file mass_balance.hh.
|
private |
Definition at line 453 of file mass_balance.hh.
|
private |
Definition at line 454 of file mass_balance.hh.
|
private |
Definition at line 455 of file mass_balance.hh.
|
private |
Definition at line 456 of file mass_balance.hh.
|
private |
Units of conserved quantities.
Definition at line 402 of file mass_balance.hh.