6#include "ultraweak_dpg.h"
11 std::cout <<
"Convergence study 2: Ultraweak DPG method, smooth solution \n";
12 std::cout <<
"Exact solution: u(x,y) = sin(pi*x)sin(pi*y), homogenous "
14 std::cout <<
"BVP 1: epsilon_1=1.0, beta_1=[0.0,0.0] \n";
15 std::cout <<
"BVP 2: epsilon_2=1.0, beta_2=[2.0,1.0] \n ";
16 std::cout <<
"p = {0,1}";
21 auto u_exact = [PI](
const Eigen::Vector2d& x) ->
double {
22 return std::sin(PI * x[0]) * std::sin(PI * x[1]);
24 auto u_grad = [PI](
const Eigen::Vector2d& x) -> Eigen::Vector2d {
25 return (Eigen::VectorXd(2)
26 << PI * std::cos(PI * x[0]) * std::sin(PI * x[1]),
27 PI * std::sin(PI * x[0]) * std::cos(PI * x[1]))
32 auto epsilon_1 = [](
const Eigen::Vector2d & ) ->
double {
return 1.0; };
33 auto beta_1 = [](
const Eigen::Vector2d & ) -> Eigen::Vector2d {
34 return (Eigen::VectorXd(2) << 0.0, 0.0).finished();
36 auto f_1 = [PI](
const Eigen::Vector2d& x) ->
double {
37 return 2.0 * PI * PI * std::sin(PI * x[0]) * std::sin(PI * x[1]);
39 auto g_1 = [](
const Eigen::Vector2d & ) ->
double {
return 0.0; };
42 auto epsilon_2 = [](
const Eigen::Vector2d & ) ->
double {
return 1.0; };
43 auto beta_2 = [PI](
const Eigen::Vector2d & ) -> Eigen::Vector2d {
44 return (Eigen::VectorXd(2) << 2.0, 1.0).finished();
46 auto f_2 = [PI](
const Eigen::Vector2d& x) ->
double {
47 return 2.0 * PI * PI * std::sin(PI * x[0]) * std::sin(PI * x[1]) +
48 PI * (2.0 * std::cos(PI * x[0]) * std::sin(PI * x[1]) +
49 std::sin(PI * x[0]) * std::cos(PI * x[1]));
51 auto g_2 = [](
const Eigen::Vector2d & ) ->
double {
return 0.0; };
55 std::cout <<
"Running convergence tests for BVP 1 on a triangular mesh \n";
56 for (
int deg_p = 0; deg_p <= 1; deg_p++) {
58 auto errors = projects::dpg::test::
59 TestConververgenceUltraWeakDPGConvectionDiffusionDirichletBVP(
60 reflev, u_exact, u_grad, epsilon_1, beta_1, f_1, g_1, deg_p,
64 std::string file_name =
"cs2/triangular/bvp1_" + std::to_string(deg_p);
65 std::ofstream file(file_name);
66 for (
auto [dofs, erroru, errorsigma, errorestimate] : errors) {
67 file << dofs <<
", " << erroru <<
"," << errorsigma <<
","
68 << errorestimate << std::endl;
75 std::cout <<
"Running convergence tests for BVP 2 on a triangular mesh \n";
76 for (
int deg_p = 0; deg_p <= 1; deg_p++) {
78 auto errors = projects::dpg::test::
79 TestConververgenceUltraWeakDPGConvectionDiffusionDirichletBVP(
80 reflev, u_exact, u_grad, epsilon_2, beta_2, f_2, g_2, deg_p,
84 std::string file_name =
"cs2/triangular/bvp2_" + std::to_string(deg_p);
85 std::ofstream file(file_name);
86 for (
auto [dofs, erroru, errorsigma, errorestimate] : errors) {
87 file << dofs <<
", " << erroru <<
"," << errorsigma <<
","
88 << errorestimate << std::endl;
95 std::cout <<
"Running convergence tests for BVP 1 on a quadrilateral mesh \n";
96 for (
int deg_p = 0; deg_p <= 1; deg_p++) {
98 auto errors = projects::dpg::test::
99 TestConververgenceUltraWeakDPGConvectionDiffusionDirichletBVP(
100 reflev, u_exact, u_grad, epsilon_1, beta_1, f_1, g_1, deg_p,
104 std::string file_name =
"cs2/quadrilateral/bvp1_" + std::to_string(deg_p);
105 std::ofstream file(file_name);
106 for (
auto [dofs, erroru, errorsigma, errorestimate] : errors) {
107 file << dofs <<
", " << erroru <<
"," << errorsigma <<
","
108 << errorestimate << std::endl;
116 std::cout <<
"Running convergence tests for BVP 2 on a quadrilateral mesh \n";
117 for (
int deg_p = 0; deg_p <= 1; deg_p++) {
119 auto errors = projects::dpg::test::
120 TestConververgenceUltraWeakDPGConvectionDiffusionDirichletBVP(
121 reflev, u_exact, u_grad, epsilon_2, beta_2, f_2, g_2, deg_p,
125 std::string file_name =
"cs2/quadrilateral/bvp2_" + std::to_string(deg_p);
126 std::ofstream file(file_name);
127 for (
auto [dofs, erroru, errorsigma, errorestimate] : errors) {
128 file << dofs <<
", " << erroru <<
"," << errorsigma <<
","
129 << errorestimate << std::endl;
static constexpr RefEl kTria()
Returns the reference triangle.
static constexpr RefEl kQuad()
Returns the reference quadrilateral.