23 Eigen::MatrixXd &pressure,
26 assert(
assembler->name() ==
"OperatorSplitting" &&
problem->is_time_dependent());
28 Eigen::MatrixXd local_pts;
30 if (
mesh->dimension() == 2)
32 if (gbases[0].
bases.size() == 3)
39 if (gbases[0].
bases.size() == 4)
45 std::vector<int> bnd_nodes;
49 if (node %
mesh->dimension() == 0)
51 bnd_nodes.push_back(node /
mesh->dimension());
54 const int n_el = int(
bases.size());
55 const int shape = gbases[0].bases.size();
56 auto fluid_assembler = std::dynamic_pointer_cast<assembler::OperatorSplitting>(
assembler);
59 const double viscosity = fluid_assembler->viscosity()(0, 0, 0, 0, 0);
60 assert(viscosity >= 0);
62 logger().info(
"Matrices assembly...");
63 StiffnessMatrix stiffness_viscosity, mixed_stiffness, velocity_mass, stiffness;
79 mixed_stiffness = mixed_stiffness.transpose();
80 logger().info(
"Matrices assembly ends!");
85 stiffness_viscosity, stiffness, velocity_mass,
86 dt, viscosity,
args[
"solver"][
"linear"]);
90 user_post_step(0, *
this, sol,
nullptr, &pressure);
93 for (
int step = 1; step <= time_steps; ++step)
95 const double time = step * dt;
96 logger().info(
"{}/{} steps, t={}s", step, time_steps, time);
98 if (
args[
"space"][
"advanced"][
"use_particle_advection"])
122 user_post_step(step, *
this, sol,
nullptr, &pressure);
virtual void set_size(const int size)
Eigen::Matrix< double, Eigen::Dynamic, 1, 0, 9, 1 > assemble(const LinearAssemblerData &data) const override
computes local stiffness matrix (1x1) for bases i,j where i,j is passed in through data ie integral o...
std::shared_ptr< assembler::Problem > problem
current problem, it contains rhs and bc
const std::vector< basis::ElementBases > & geom_bases() const
Get a constant reference to the geometry mapping bases.
StiffnessMatrix mass
Mass matrix, it is computed only for time dependent problems.
std::vector< mesh::LocalBoundary > local_boundary
mapping from elements to nodes for dirichlet boundary conditions
std::shared_ptr< assembler::Mass > mass_matrix_assembler
std::vector< int > pressure_boundary_nodes
list of neumann boundary nodes
std::unique_ptr< mesh::Mesh > mesh
current mesh, it can be a Mesh2D or Mesh3D
json args
main input arguments containing all defaults
void solve_transient_navier_stokes_split(const int time_steps, const double dt, Eigen::MatrixXd &sol, Eigen::MatrixXd &pressure, UserPostStepCallback user_post_step={})
solves transient navier stokes with operator splitting
int n_pressure_bases
number of pressure bases
assembler::AssemblyValsCache pressure_ass_vals_cache
used to store assembly values for pressure for small problems
int n_bases
number of bases
void build_stiffness_mat(StiffnessMatrix &stiffness)
utility that builds the stiffness matrix and collects stats, used only for linear problems
std::vector< basis::ElementBases > pressure_bases
FE pressure bases for mixed elements, the size is #elements.
assembler::AssemblyValsCache ass_vals_cache
used to store assembly values for small problems
assembler::AssemblyValsCache mass_ass_vals_cache
QuadratureOrders n_boundary_samples() const
quadrature used for projecting boundary conditions
std::shared_ptr< assembler::Assembler > assembler
assemblers
std::vector< basis::ElementBases > bases
FE bases, the size is #elements.
void save_timestep(const double time, const int t, const double t0, const double dt, const Eigen::MatrixXd &sol, const Eigen::MatrixXd &pressure)
saves a timestep
std::vector< mesh::LocalBoundary > local_neumann_boundary
mapping from elements to nodes for neumann boundary conditions
std::vector< int > boundary_nodes
list of boundary nodes
solver::SolveData solve_data
timedependent stuff cached
std::shared_ptr< assembler::MixedAssembler > mixed_assembler
void solve_pressure(const StiffnessMatrix &mixed_stiffness, const std::vector< int > &pressure_boundary_nodes, Eigen::MatrixXd &sol, Eigen::MatrixXd &pressure)
void projection(const StiffnessMatrix &velocity_mass, const StiffnessMatrix &mixed_stiffness, const std::vector< int > &boundary_nodes_, Eigen::MatrixXd &sol, const Eigen::MatrixXd &pressure)
void external_force(const mesh::Mesh &mesh, const assembler::Assembler &assembler, const std::vector< basis::ElementBases > &gbases, const std::vector< basis::ElementBases > &bases, const double dt, Eigen::MatrixXd &sol, const Eigen::MatrixXd &local_pts, const std::shared_ptr< assembler::Problem > problem, const double time)
void advection(const mesh::Mesh &mesh, const std::vector< basis::ElementBases > &gbases, const std::vector< basis::ElementBases > &bases, Eigen::MatrixXd &sol, const double dt, const Eigen::MatrixXd &local_pts, const int order=1, const int RK=1)
void advection_FLIP(const mesh::Mesh &mesh, const std::vector< basis::ElementBases > &gbases, const std::vector< basis::ElementBases > &bases, Eigen::MatrixXd &sol, const double dt, const Eigen::MatrixXd &local_pts, const int order=1)
void solve_diffusion_1st(const StiffnessMatrix &mass, const std::vector< int > &bnd_nodes, Eigen::MatrixXd &sol)
std::shared_ptr< assembler::RhsAssembler > rhs_assembler
void q_nodes_2d(const int q, Eigen::MatrixXd &val)
void p_nodes_2d(const int p, Eigen::MatrixXd &val)
void p_nodes_3d(const int p, Eigen::MatrixXd &val)
void q_nodes_3d(const int q, Eigen::MatrixXd &val)
std::function< void(int step, State &state, const Eigen::MatrixXd &sol, const Eigen::MatrixXd *disp_grad, const Eigen::MatrixXd *pressure)> UserPostStepCallback
User callback at the end of every solver step.
spdlog::logger & logger()
Retrieves the current logger.
std::array< int, 2 > QuadratureOrders
void log_and_throw_error(const std::string &msg)
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix