Rheolef  7.2
an efficient C++ finite element environment
 
Loading...
Searching...
No Matches
navier_stokes_dg1.icc

The Navier-Stokes equations with the discontinuous Galerkin method – class body.

The Navier-Stokes equations with the discontinuous Galerkin method – class body

Float Re1, const geo& omega, string approx)
: Re(Re1), Xh(), Qh(), iopt(), a0(), b(), c(), mu(), mp(), lh0(), lh(), kh(),
pmu(), pmp(), a1(), stokes1()
{
Xh = space (omega, approx, "vector");
Qh = space (omega, approx);
iopt.set_family(integrate_option::gauss);
iopt.set_order(2*Xh.degree()+1);
stokes_dirichlet_dg (Xh, Qh, a0, b, c, mp, lh0, kh, iopt);
trial u (Xh); test v (Xh);
lh = lh0 + Re*inertia_fix_rhs (v, iopt);
mu = integrate (dot(u,v), iopt);
pmu = problem (mu);
pmp = problem (mp);
}
navier_stokes_dg::initial (string restart) const {
value_type xh = { field(Xh, 0), field(Qh, 0) };
Float Re0 = 0;
if (restart == "") {
problem_mixed stokes0 (a0, b, c);
stokes0.set_metric (mp);
stokes0.solve (lh0, kh, xh[0], xh[1]);
} else {
idiststream in (restart);
in >> catchmark("Re") >> Re0
>> catchmark("u") >> xh[0]
>> catchmark("p") >> xh[1];
check_macro (xh[1].get_space() == Qh, "unexpected "
<< xh[0].get_space().name() << " approximation in file \""
<< restart << "\" (" << Xh.name() << " expected)");
}
derr << "# continuation: from Re=" << Re0 << " to " << Re << endl;
return xh;
}
navier_stokes_dg::residue (const value_type& xh) const {
trial u (Xh); test v (Xh);
form a = a0 + Re*inertia(xh[0], u, v, iopt);
value_type mrh = { a*xh[0] + b.trans_mult(xh[1]) - lh,
b*xh[0] - c*xh[1] - kh};
return mrh;
}
void navier_stokes_dg::update_derivative (const value_type& xh) const {
trial u (Xh); test v (Xh);
a1 = a0 + Re*(inertia(xh[0], u, v, iopt) + inertia(u, xh[0], v, iopt));
stokes1.set_metric (mp);
}
navier_stokes_dg::derivative_solve (const value_type& mrh) const {
value_type delta_xh = { field(Xh, 0), field(Qh, 0) };
stokes1.solve (mrh[0], mrh[1], delta_xh[0], delta_xh[1]);
return delta_xh;
}
navier_stokes_dg::derivative_trans_mult (const value_type& mrh) const {
value_type rh = { field (Xh), field (Qh) };
pmu.solve (mrh[0], rh[0]);
pmp.solve (mrh[1], rh[1]);
value_type mgh = { a1.trans_mult(rh[0]) + b.trans_mult(rh[1]),
b*rh[0] - c*rh[1] };
return mgh;
}
field lh(Float epsilon, Float t, const test &v)
see the Float page for the full documentation
see the field page for the full documentation
see the form page for the full documentation
see the geo page for the full documentation
see the problem_mixed page for the full documentation
see the problem page for the full documentation
see the space page for the full documentation
see the test page for the full documentation
see the test page for the full documentation
check_macro(expr1.have_homogeneous_space(Xh1), "dual(expr1,expr2); expr1 should have homogeneous space. HINT: use dual(interpolate(Xh, expr1),expr2)")
form inertia(W w, U u, V v, integrate_option iopt=integrate_option())
Definition inertia.h:26
field inertia_fix_rhs(test v, integrate_option iopt=integrate_option())
Definition inertia.h:37
void stokes_dirichlet_dg(const space &Xh, const space &Qh, form &a, form &b, form &c, form &mp, field &lh, field &kh, integrate_option iopt=integrate_option())
void update_derivative(const value_type &uh) const
integrate_option iopt
problem_mixed stokes1
value_type derivative_solve(const value_type &mrh) const
value_type initial(string restart) const
navier_stokes_dg(Float Re, const geo &omega, string approx)
value_type residue(const value_type &uh) const
value_type derivative_trans_mult(const value_type &mrh) const
Eigen::Matrix< field, 2, 1 > value_type
Definition leveque.h:25