an efficient C++ finite element environment
|
|
The Navier-Stokes equations with the method of characteristics – solver function
using namespace std;
size_t& max_iter,
Float& tol, odiststream *p_derr=0) {
const space& Xh = uh.get_space();
const space& Qh = ph.get_space();
string label = "navier-stokes-" + Xh.get_geo().name();
integrate_option iopt;
iopt.set_family(integrate_option::gauss_lobatto);
iopt.set_order(Xh.degree());
if (p_derr != 0) *p_derr << "[" << label << "] #n |du/dt|" << endl;
for (
size_t n = 0;
true;
n++) {
uh1 = uh;
field uh_star = 2.0*uh1 - uh2;
field lh = l0h + (Re/delta_t)*(2*l1h - 0.5*l2h);
stokes.solve (
lh,
field(Qh,0), uh, ph);
field duh_dt = (3*uh - 4*uh1 + uh2)/(2*delta_t);
Float residual = sqrt(
m(duh_dt,duh_dt));
if (p_derr != 0) *p_derr <<
"[" << label <<
"] "<<
n <<
" " << residual << endl;
if (residual < tol) {
tol = residual;
return 0;
}
tol = residual;
return 1;
}
}
}
std::enable_if< details::is_field_convertible< Expr >::value,details::field_expr_v2_nonlinear_terminal_field< typename Expr::scalar_type,typename Expr::memory_type,details::differentiate_option::divergence >>::type div(const Expr &expr)
div(uh): see the expression page for the full documentation
see the field page for the full documentation
std::enable_if< details::is_field_expr_v2_nonlinear_arg< Expr >::value &&! is_undeterminated< Result >::value, Result >::type integrate(const geo_basic< T, M > &omega, const Expr &expr, const integrate_option &iopt, Result dummy=Result())
see the integrate page for the full documentation
see the problem_mixed page for the full documentation
see the space page for the full documentation
class rheolef::details::field_expr_v2_nonlinear_node_unary compose
int navier_stokes_solve(Float Re, Float delta_t, field l0h, field &uh, field &ph, size_t &max_iter, Float &tol, odiststream *p_derr=0)
T ddot(const tensor_basic< T > &a, const tensor_basic< T > &b)
ddot(x,y): see the expression page for the full documentation
field lh(Float epsilon, Float t, const test &v)
see the characteristic page for the full documentation
see the test page for the full documentation
see the Float page for the full documentation
std::enable_if< details::is_field_convertible< Expr >::value,details::field_expr_v2_nonlinear_terminal_field< typename Expr::scalar_type,typename Expr::memory_type,details::differentiate_option::gradient >>::type D(const Expr &expr)
D(uh): see the expression page for the full documentation.
see the test page for the full documentation
rheolef::details::is_vec dot