Page MenuHomec4science

transport_program.hpp
No OneTemporary

File Metadata

Created
Fri, Nov 15, 03:57

transport_program.hpp

#ifndef SPECMICP_REACTMICP_SYSTEMS_SATURATED_TRANSPORTPROGRAM_HPP
#define SPECMICP_REACTMICP_SYSTEMS_SATURATED_TRANSPORTPROGRAM_HPP
#include "dfpmsolver/parabolic_program.hpp"
#include "variablesfwd.hpp"
#include "dfpm/meshes/mesh1dfwd.hpp"
#include "dfpm/types.hpp"
namespace specmicp {
namespace reactmicp {
namespace systems {
namespace satdiff {
class SaturatedDiffusion: public dfpmsolver::ParabolicProgram<SaturatedDiffusion>
{
public:
SaturatedDiffusion(SaturatedVariablesPtr variables,
std::vector<index_t> list_fixed_nodes,
std::map<index_t, index_t> list_slave_nodes,
std::vector<index_t> list_immobile_components);
SaturatedDiffusion(SaturatedVariablesPtr variables,
std::vector<index_t> list_fixed_nodes);
//! \brief Return the number of equations
index_t get_neq() const {return m_neq;}
//! \brief Return the number of degrees of freedom per node
index_t get_ndf() const {return m_ndf;}
//! \brief Return the total number of degrees of freedom
index_t get_tot_ndf() const {return m_tot_ndf;}
//! \brief Method to update the variables
void set_variables(SaturatedVariablesPtr variables) {m_variables = variables;}
//! \brief Return the id of the equation corresponding to the degree of freedom 'id_dof'
//!
//! Return 'no_equation' if no equation exist
index_t id_equation(index_t id_dof) const {return m_ideq(id_dof);}
//! \brief Compute the residuals
void compute_residuals(const Vector& displacement,
const Vector& velocity,
Vector& residual
);
//! Compute the residuals inside 'element' for 'component'
void residuals_element_component(
index_t element,
index_t component,
const Vector& displacement,
const Vector& velocity,
Eigen::Vector2d& element_residual
);
//! \brief Compute the jacobian
void compute_jacobian(Vector& displacement,
Vector& velocity,
Eigen::SparseMatrix<scalar_t>& jacobian,
scalar_t alphadt
);
//! \brief Compute the contribution of 'element' in the jacobian
void jacobian_element(
index_t element,
Vector& displacement,
Vector& velocity,
dfpm::list_triplet_t& jacobian,
scalar_t alphadt);
//! \brief Update the solutions
void update_solution(const Vector& update,
scalar_t lambda,
scalar_t alpha_dt,
Vector& predictor,
Vector& displacement,
Vector& velocity);
//! \brief Apply boundary conditions to the velocity vector
//!
//! by default do nothing.
void apply_bc(scalar_t dt,
const Vector& displacement,
Vector& velocity)
{}
private:
// number the equations
void number_equations(std::vector<index_t> list_fixed_nodes,
std::map<index_t, index_t> list_slave_nodes, std::vector<index_t> list_immobile_components);
index_t m_neq;
index_t m_ndf;
index_t m_tot_ndf;
Eigen::Matrix<index_t, Eigen::Dynamic, 1> m_ideq;
mesh::Mesh1DPtr m_mesh;
SaturatedVariablesPtr m_variables;
bool m_is_in_residual_computation;
};
} // end namespace satdiff
} // end namespace systems
} // end namespace reactmicp
} // end namespace specmicp
#endif // SPECMICP_REACTMICP_SYSTEMS_SATURATED_TRANSPORTPROGRAM_HPP

Event Timeline