28 #include "petscviewer.h" 29 #include "petscerror.h" 78 .
add_value(
MortarP1,
"P1",
"Mortar space: P1 on intersections, using non-conforming pressures.")
86 "Homogeneous Neumann boundary condition. Zero flux")
88 "Dirichlet boundary condition. " 89 "Specify the pressure head through the ''bc_pressure'' field " 90 "or the piezometric head through the ''bc_piezo_head'' field.")
91 .
add_value(total_flux,
"total_flux",
"Flux boundary condition (combines Neumann and Robin type). " 92 "Water inflow equal to (($ \\delta_d(q_d^N + \\sigma_d (h_d^R - h_d) )$)). " 93 "Specify the water inflow by the 'bc_flux' field, the transition coefficient by 'bc_robin_sigma' " 94 "and the reference pressure head or pieozmetric head through ''bc_pressure'' or ''bc_piezo_head'' respectively.")
96 "Seepage face boundary condition. Pressure and inflow bounded from above. Boundary with potential seepage flow " 97 "is described by the pair of inequalities: " 98 "(($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. " 99 "Caution. Setting (($q_d^N$)) strictly negative " 100 "may lead to an ill posed problem since a positive outflow is enforced. " 101 "Parameters (($h_d^D$)) and (($q_d^N$)) are given by fields ``bc_switch_pressure`` (or ``bc_switch_piezo_head``) and ``bc_flux`` respectively." 104 "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: " 105 "(( $ \\delta_d(q_d^N + \\sigma_d(H_d^D - H_d) )$)). For the water level under the bedrock, constant infiltration is used: " 106 "(( $ \\delta_d(q_d^N + \\sigma_d(H_d^D - H_d^S) )$)). Parameters: ``bc_pressure``, ``bc_switch_pressure``, " 107 " ``bc_sigma, ``bc_flux``." 118 "Boundary piezometric head for BC types: dirichlet, robin, and river." )
120 "Boundary switch piezometric head for BC types: seepage, river." )
122 "Initial condition for the pressure given as the piezometric head." )
124 return field_descriptor;
131 "Linear solver for MH problem.")
133 "Residual tolerance.")
135 "Minimum number of iterations (linear solves) to use. This is usefull if the convergence criteria " 136 "does not characterize your goal well enough so it converges prematurely possibly without the single linear solve." 137 "If greater then 'max_it' the value is set to 'max_it'.")
139 "Maximum number of iterations (linear solves) of the non-linear solver.")
141 "If a stagnation of the nonlinear solver is detected the solver stops. " 142 "A divergence is reported by default forcing the end of the simulation. Setting this flag to 'true', the solver" 143 "ends with convergence success on stagnation, but report warning about it.")
146 return it::Record(
"Flow_Darcy_MH",
"Mixed-Hybrid solver for STEADY saturated Darcy flow.")
149 "Vector of the gravity force. Dimensionless.")
151 "Input data for Darcy flow model.")
153 "Non-linear solver for MH problem.")
155 "Parameters of output stream.")
158 "Parameters of output from MH module.")
160 "Parameters of output form MH module.")
162 "Settings for computing mass balance.")
164 "Time governor setting for the unsteady Darcy flow model.")
166 "Number of Schur complements to perform when solving MH system.")
168 "Method for coupling Darcy flow between dimensions." )
174 Input::register_class< DarcyMH, Mesh &, const Input::Record >(
"Flow_Darcy_MH") +
183 ADD_FIELD(anisotropy,
"Anisotropy of the conductivity tensor.",
"1.0" );
186 ADD_FIELD(cross_section,
"Complement dimension parameter (cross section for 1D, thickness for 2D).",
"1.0" );
187 cross_section.units(
UnitSI().m(3).md() );
189 ADD_FIELD(conductivity,
"Isotropic conductivity scalar.",
"1.0" );
190 conductivity.units(
UnitSI().m().s(-1) ).set_limits(0.0);
192 ADD_FIELD(sigma,
"Transition coefficient between dimensions.",
"1.0");
195 ADD_FIELD(water_source_density,
"Water source density.",
"0.0");
196 water_source_density.units(
UnitSI().s(-1) );
198 ADD_FIELD(bc_type,
"Boundary condition type, possible values:",
"\"none\"" );
200 bc_type.input_selection( get_bc_type_selection() );
203 ADD_FIELD(bc_pressure,
"Prescribed pressure value on the boundary. Used for all values of 'bc_type' except for 'none' and 'seepage'. " 204 "See documentation of 'bc_type' for exact meaning of 'bc_pressure' in individual boundary condition types.",
"0.0");
205 bc_pressure.disable_where(bc_type, {
none, seepage} );
206 bc_pressure.units(
UnitSI().m() );
208 ADD_FIELD(bc_flux,
"Incoming water boundary flux. Used for bc_types : 'total_flux', 'seepage', 'river'.",
"0.0");
209 bc_flux.disable_where(bc_type, {
none, dirichlet} );
210 bc_flux.units(
UnitSI().m(4).s(-1).md() );
212 ADD_FIELD(bc_robin_sigma,
"Conductivity coefficient in the 'total_flux' or the 'river' boundary condition type.",
"0.0");
213 bc_robin_sigma.disable_where(bc_type, {
none, dirichlet, seepage} );
214 bc_robin_sigma.units(
UnitSI().m(3).s(-1).md() );
217 "Critical switch pressure for 'seepage' and 'river' boundary conditions.",
"0.0");
218 bc_switch_pressure.disable_where(bc_type, {
none, dirichlet, total_flux} );
219 bc_switch_pressure.units(
UnitSI().m() );
222 ADD_FIELD(init_pressure,
"Initial condition for pressure",
"0.0" );
223 init_pressure.units(
UnitSI().m() );
225 ADD_FIELD(storativity,
"Storativity.",
"0.0" );
226 storativity.units(
UnitSI().m(-1) );
268 data_ = make_shared<EqData>();
271 data_->is_linear=
true;
302 gravity_array.copy_to(gvec);
304 data_->gravity_ = arma::vec(gvec);
305 data_->gravity_vec_ =
data_->gravity_.subvec(0,2);
307 data_->bc_pressure.add_factory(
309 (
data_->gravity_,
"bc_piezo_head") );
310 data_->bc_switch_pressure.add_factory(
312 (
data_->gravity_,
"bc_switch_piezo_head") );
313 data_->init_pressure.add_factory(
315 (
data_->gravity_,
"init_piezo_head") );
323 MessageOut() <<
"Missing the key 'time', obligatory for the transient problems." << endl;
345 .val<Input::AbstractRecord>(
"linear_solver");
364 data_->water_balance_idx =
balance_->add_quantity(
"water_volume");
394 if (zero_time_term_from_right) {
425 bool jump_time =
data_->storativity.is_jump_time();
426 if (! zero_time_term_from_left) {
436 WarningOut() <<
"Output of solution discontinuous in time not supported yet.\n";
445 if (! zero_time_term_from_left && ! jump_time)
output_data();
451 if (zero_time_term_from_right) {
456 }
else if (! zero_time_term_from_left && jump_time) {
457 WarningOut() <<
"Discontinuous time term not supported yet.\n";
468 return (
data_->storativity.input_list_size() == 0);
481 MessageOut().fmt(
"[nonlinear solver] norm of initial residual: {}\n", residual_norm);
484 int is_linear_common;
489 this->
max_n_it_ = nl_solver_rec.
val<
unsigned int>(
"max_it");
490 this->
min_n_it_ = nl_solver_rec.
val<
unsigned int>(
"min_it");
491 if (this->min_n_it_ > this->max_n_it_) this->min_n_it_ = this->
max_n_it_;
493 if (! is_linear_common) {
501 while (nonlinear_iteration_ < this->min_n_it_ ||
502 (residual_norm > this->tolerance_ && nonlinear_iteration_ < this->max_n_it_ )) {
504 convergence_history.push_back(residual_norm);
507 if (convergence_history.size() >= 5 &&
508 convergence_history[ convergence_history.size() - 1]/convergence_history[ convergence_history.size() - 2] > 0.9 &&
509 convergence_history[ convergence_history.size() - 1]/convergence_history[ convergence_history.size() - 5] > 0.8) {
515 THROW(ExcSolverDiverge() << EI_Reason(
"Stagnation."));
519 if (! is_linear_common)
525 if (is_linear_common){
528 MessageOut().fmt(
"[nonlinear solver] lin. it: {}, reason: {}, residual: {}\n",
529 si.n_iterations, si.converged_reason, residual_norm);
550 MessageOut().fmt(
"[nonlinear solver] it: {} lin. it: {}, reason: {}, residual: {}\n",
553 VecDestroy(&save_solution);
580 if(
data_->mortar_method_ != MortarMethod::NoMortar){
581 auto multidim_assembler = AssemblyBase::create< AssemblyMH >(
data_);
584 unsigned int dim = ele_ac.
dim();
585 multidim_assembler[dim-1]->fix_velocity(ele_ac);
643 vec_size = this->
size;
644 OLD_ASSERT(vec != NULL,
"Requested solution is not allocated!\n");
650 OLD_ASSERT(vec != NULL,
"Requested solution is not allocated!\n");
662 START_TIMER(
"DarcyFlowMH_Steady::assembly_steady_mh_matrix");
673 data_->local_boundary_index=0;
676 unsigned int dim = ele_ac.
dim();
677 assembler[dim-1]->assemble(ele_ac);
688 START_TIMER(
"DarcyFlowMH_Steady::allocate_mh_matrix");
699 double zeros[100000];
700 for(
int i=0; i<100000; i++) zeros[i] = 0.0;
703 tmp_rows.reserve(200);
705 unsigned int nsides, loc_size;
712 loc_size = 1 + 2*nsides;
713 unsigned int i_side = 0;
715 for (; i_side < nsides; i_side++) {
716 local_dofs[i_side] = ele_ac.side_row(i_side);
717 local_dofs[i_side+nsides] = ele_ac.edge_row(i_side);
719 local_dofs[i_side+nsides] = ele_ac.ele_row();
720 int * edge_rows = local_dofs + nsides;
724 ls->
mat_set_values(loc_size, local_dofs, loc_size, local_dofs, zeros);
728 unsigned int n_neighs = ele_ac.full_iter()->n_neighs_vb;
729 for (
unsigned int i = 0; i < n_neighs; i++) {
734 tmp_rows.push_back(neigh_edge_row);
747 for(
auto &isec : isec_list ) {
751 for(
unsigned int i_side=0; i_side < slave_ele.
n_sides(); i_side++) {
798 double cs =
data_->cross_section.value(ele_ac.centre(), ele_ac.element_accessor());
801 double source = ele_ac.measure() * cs *
802 data_->water_source_density.value(ele_ac.centre(), ele_ac.element_accessor());
805 balance_->add_source_vec_values(
data_->water_balance_idx, ele_ac.region().bulk_idx(), {(
IdxInt) ele_ac.ele_row()}, {source});
825 #ifdef FLOW123D_HAVE_BDDCML 826 WarningOut() <<
"For BDDC no Schur complements are used.";
841 xprintf(
Err,
"Flow123d was not build with BDDCML support.\n");
842 #endif // FLOW123D_HAVE_BDDCML 847 WarningOut() <<
"Invalid number of Schur Complements. Using 2.";
860 ls->LinSys::set_from_input(in_rec);
879 ISCreateStride(PETSC_COMM_WORLD,
mh_dh.
el_ds->
lsize(), ls->get_distribution()->begin(), 1, &is);
882 ls1->set_negative_definite();
885 schur2 =
new LinSys_PETSC( ls1->make_complement_distribution() );
887 ls1->set_complement( schur2 );
890 ls->set_complement( schur1 );
892 ls->set_solution( NULL );
906 xprintf(
Err,
"Unknown solver type. Internal error.\n");
920 START_TIMER(
"DarcyFlowMH_Steady::assembly_linear_system");
922 data_->is_linear=
true;
939 auto multidim_assembler = AssemblyBase::create< AssemblyMH >(
data_);
976 std::string output_file;
988 PetscViewerASCIIOpen(PETSC_COMM_WORLD, output_file.c_str(), &viewer);
989 PetscViewerSetFormat(viewer, PETSC_VIEWER_ASCII_MATLAB);
999 double d_max = std::numeric_limits<double>::max();
1000 double h1 = d_max, h2 = d_max, h3 = d_max;
1001 double he2 = d_max, he3 = d_max;
1004 case 1: h1 = std::min(h1,ele->measure());
break;
1005 case 2: h2 = std::min(h2,ele->measure());
break;
1006 case 3: h3 = std::min(h3,ele->measure());
break;
1011 case 2: he2 = std::min(he2, ele->side(j)->measure());
break;
1012 case 3: he3 = std::min(he3, ele->side(j)->measure());
break;
1016 if(h1 == d_max) h1 = 0;
1017 if(h2 == d_max) h2 = 0;
1018 if(h3 == d_max) h3 = 0;
1019 if(he2 == d_max) he2 = 0;
1020 if(he3 == d_max) he3 = 0;
1023 file = fopen(output_file.c_str(),
"a");
1027 fprintf(file,
"h1 = %e;\nh2 = %e;\nh3 = %e;\n", h1, h2, h3);
1028 fprintf(file,
"he2 = %e;\nhe3 = %e;\n", he2, he3);
1034 START_TIMER(
"DarcyFlowMH_Steady::set_mesh_data_for_bddc");
1055 for (
unsigned int i_loc = 0; i_loc <
mh_dh.
el_ds->
lsize(); i_loc++ ) {
1059 elDimMax = std::max( elDimMax, ele_ac.dim() );
1060 elDimMin = std::min( elDimMin, ele_ac.dim() );
1062 isegn.push_back( ele_ac.ele_global_idx() );
1067 int side_row = ele_ac.side_row(si);
1068 arma::vec3 coord = ele_ac.side(si)->centre();
1070 localDofMap.insert( std::make_pair( side_row, coord ) );
1071 inet.push_back( side_row );
1076 int el_row = ele_ac.ele_row();
1078 localDofMap.insert( std::make_pair( el_row, coord ) );
1079 inet.push_back( el_row );
1084 int edge_row = ele_ac.edge_row(si);
1085 arma::vec3 coord = ele_ac.side(si)->centre();
1087 localDofMap.insert( std::make_pair( edge_row, coord ) );
1088 inet.push_back( edge_row );
1093 for (
unsigned int i_neigh = 0; i_neigh < ele_ac.full_iter()->n_neighs_vb; i_neigh++) {
1094 int edge_row =
mh_dh.
row_4_edge[ ele_ac.full_iter()->neigh_vb[i_neigh]->edge_idx() ];
1095 arma::vec3 coord = ele_ac.full_iter()->neigh_vb[i_neigh]->edge()->side(0)->centre();
1097 localDofMap.insert( std::make_pair( edge_row, coord ) );
1098 inet.push_back( edge_row );
1102 nnet.push_back( nne );
1107 double conduct =
data_->conductivity.value( centre , ele_ac.element_accessor() );
1108 auto aniso =
data_->anisotropy.value( centre, ele_ac.element_accessor() );
1112 for (
int i = 0; i < 3; i++) {
1113 coef = coef + aniso.at(i,i);
1116 coef = conduct*coef / 3;
1119 "Zero coefficient of hydrodynamic resistance %f . \n ", coef );
1120 element_permeability.push_back( 1. / coef );
1124 int numNodeSub = localDofMap.size();
1135 for ( ; itB != localDofMap.end(); ++itB ) {
1136 isngn[ind] = itB -> first;
1139 for (
int j = 0; j < 3; j++ ) {
1140 xyz[ j*numNodeSub + ind ] = coord[j];
1145 localDofMap.clear();
1153 Global2LocalMap_ global2LocalNodeMap;
1154 for (
unsigned ind = 0; ind < isngn.size(); ++ind ) {
1155 global2LocalNodeMap.insert( std::make_pair( static_cast<unsigned>( isngn[ind] ), ind ) );
1160 for (
unsigned int iEle = 0; iEle < isegn.size(); iEle++ ) {
1161 int nne = nnet[ iEle ];
1162 for (
int ien = 0; ien < nne; ien++ ) {
1164 int indGlob = inet[indInet];
1166 Global2LocalMap_::iterator pos = global2LocalNodeMap.find( indGlob );
1167 OLD_ASSERT( pos != global2LocalNodeMap.end(),
1168 "Cannot remap node index %d to local indices. \n ", indGlob );
1169 int indLoc =
static_cast<int> ( pos -> second );
1172 inet[ indInet++ ] = indLoc;
1176 int numNodes =
size;
1177 int numDofsInt =
size;
1179 int meshDim = elDimMax;
1181 bddc_ls -> load_mesh( spaceDim, numNodes, numDofsInt, inet, nnet, nndf, isegn, isngn, isngn, xyz, element_permeability, meshDim );
1210 if(
time_ !=
nullptr)
1230 VecCreateSeqWithArray(PETSC_COMM_SELF,1,
size,
solution,
1235 loc_idx =
new int [
size];
1245 for(
unsigned int i_edg=0; i_edg <
mesh_->
n_edges(); i_edg++) {
1248 OLD_ASSERT( i==
size,
"Size of array does not match number of fills.\n");
1250 ISCreateGeneral(PETSC_COMM_SELF,
size, loc_idx, PETSC_COPY_VALUES, &(is_loc));
1254 ISDestroy(&(is_loc));
1306 for (
unsigned int i_loc_el = 0; i_loc_el <
mh_dh.
el_ds->
lsize(); i_loc_el++) {
1309 local_sol[ele_ac.ele_local_row()] =
data_->init_pressure.value(ele_ac.centre(),ele_ac.element_accessor());
1323 PetscScalar *local_diagonal;
1331 for (
unsigned int i_loc_el = 0; i_loc_el <
mh_dh.
el_ds->
lsize(); i_loc_el++) {
1335 double diagonal_coeff =
data_->cross_section.value(ele_ac.centre(), ele_ac.element_accessor())
1336 *
data_->storativity.value(ele_ac.centre(), ele_ac.element_accessor())
1338 local_diagonal[ele_ac.ele_local_row()]= - diagonal_coeff /
time_->
dt();
1342 ele_ac.region().bulk_idx(), {
IdxInt(ele_ac.ele_row()) }, {diagonal_coeff});
1357 if (scale_factor != 1.0) {
unsigned int size() const
get global size
void get_solution_vector(double *&vec, unsigned int &vec_size) override
void make_serial_scatter()
int IdxInt
Define integers that are indices into large arrays (elements, nodes, dofs etc.)
static const Input::Type::Record & get_input_type()
Main balance input record type.
Output class for darcy_flow_mh model.
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.
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.
#define FOR_ELEMENTS(_mesh_, __i)
void set_from_input(const Input::Record in_rec) override
unsigned int edge_idx() const
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.
static const Input::Type::Selection & get_mh_mortar_selection()
Selection for enum MortarMethod.
void initialize() override
RegionSet get_region_set(const string &set_name) const
static const Input::Type::Record & type_field_descriptor()
virtual void start_allocation()
#define FOR_ELEMENT_SIDES(i, j)
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_
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)
#define ADD_FIELD(name,...)
Basic time management functionality for unsteady (and steady) solvers (class Equation).
unsigned int bulk_ele_idx() const
Returns index of bulk element.
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
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...
void update_solution() override
unsigned int size() const
Returns size of the container. This is independent of the allocated space.
void set_from_input(const Input::Record in_rec) override
unsigned int n_elements() const
virtual void postprocess()
double * get_solution_array()
std::shared_ptr< Balance > balance_
FLOW123D_FORCE_LINK_IN_CHILD(darcy_flow_mh)
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()
ElementVector bc_elements
SideIter side(const unsigned int loc_index)
bool use_steady_assembly_
static const Input::Type::Record & get_input_type_specific()
void allocate_mh_matrix()
static const Input::Type::Selection & get_bc_type_selection()
Return a Selection corresponding to enum BC_Type.
void set_solution(double *sol_array)
virtual void assembly_linear_system()
virtual const Vec * get_rhs()
virtual PetscErrorCode rhs_zero_entries()
Dedicated class for storing path to input and output files.
DarcyMH(Mesh &mesh, const Input::Record in_rec)
CREATE AND FILL GLOBAL MH MATRIX OF THE WATER MODEL.
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.
void create_linear_system(Input::AbstractRecord rec)
Initialize global_row_4_sub_row.
MortarMethod
Type of experimental Mortar-like method for non-compatible 1d-2d interaction.
Input::Record input_record_
std::shared_ptr< Distribution > rows_ds
LocalElementAccessorBase< 3 > accessor(uint local_ele_idx)
static const Input::Type::Record & get_input_type()
#define WarningOut()
Macro defining 'warning' record of log.
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()
static Input::Type::Abstract & get_input_type()
virtual void mat_set_values(int nrow, int *rows, int ncol, int *cols, double *vals)=0
DarcyFlowMHOutput * output_object
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
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.
void rhs_set_value(int row, double val)
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)
ElementVector element
Vector of elements of the mesh.
void output()
Calculate values for output.
unsigned int lsize(int proc) const
get local size