Page MenuHomec4science

eqcurve_solid_transport.hpp
No OneTemporary

File Metadata

Created
Fri, Sep 13, 03:43

eqcurve_solid_transport.hpp

#ifndef SPECMICP_REACTMICP_EQCURVE_SOLIDTRANSPORT_HPP
#define SPECMICP_REACTMICP_EQCURVE_SOLIDTRANSPORT_HPP
#include <memory>
#include "common.hpp"
#include "dfpm/types.hpp"
#include "dfpmsolver/parabolic_program.hpp"
#include "dfpm/meshes/mesh1dfwd.hpp"
#include "eqcurve_extractor.hpp"
namespace specmicp {
namespace reactmicp {
namespace eqcurve {
class SolidDiffusion: public dfpmsolver::ParabolicProgram<SolidDiffusion>
{
public:
SolidDiffusion(
mesh::Mesh1DPtr the_mesh,
const Matrix& eqcurve,
std::vector<index_t> list_bcs
);
//! \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 1;}
//! \brief Return the total number of degrees of freedom
index_t get_tot_ndf() const {return m_tot_ndf;}
//! \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_id_equations(id_dof);}
void element_residuals(index_t element,
const Vector& displacement,
const Vector& velocity,
Vector& element_residual
);
//! \brief Compute the residuals
void compute_residuals(const Vector& displacement,
const Vector& velocity,
Vector& residual
);
//! \brief Compute the jacobian
void compute_jacobian(Vector& displacement,
Vector& velocity,
Eigen::SparseMatrix<scalar_t>& jacobian,
scalar_t alphadt
);
void element_jacobian(
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)
{}
//! \brief Return the value of the external flow for dof 'id_dof'
scalar_t external_flow(index_t id_dof) const {return m_external_flow(id_dof);}
//! \brief Return a reference to the value of the external flow for dof 'id_dof'
scalar_t& external_flow(index_t id_dof) {return m_external_flow(id_dof);}
//! \brief Return a reference to the vector of external flow
Vector& external_flow() {return m_external_flow;}
private:
void number_equations(std::vector<index_t> list_bcs);
index_t m_tot_ndf;
index_t m_neq;
Eigen::VectorXi m_id_equations;
mesh::Mesh1DPtr m_mesh;
EquilibriumCurveExtractor m_eqcurve;
Vector m_internal_flow;
Vector m_external_flow;
bool m_in_jac;
};
} // end namespace eqcurve
} // end namespace reactmicp
} // end namespace specmicp
#endif // SPECMICP_REACTMICP_EQCURVE_SOLIDTRANSPORT_HPP

Event Timeline