1 #define BOOST_TEST_MAIN
2 #define BOOST_TEST_MODULE Aerodynamic_Device
3 #include <boost/test/unit_test.hpp>
4 #include <boost/test/floating_point_comparison.hpp>
5
6 #include "Aerodynamic_Device.h"
7
8 using namespace Vamos_Body;
9 using namespace Vamos_Geometry;
10
11 struct Drag_Fixture
12 {
Drag_FixtureDrag_Fixture13 Drag_Fixture ()
14 : drag (Three_Vector::ZERO, 4.0, 0.5)
15 {
16 Three_Vector wind;
17 drag.wind (wind, 0.1);
18 }
19 Drag drag;
20 };
21
BOOST_AUTO_TEST_CASE(drag_factor)22 BOOST_AUTO_TEST_CASE (drag_factor)
23 {
24 Drag_Fixture f;
25 BOOST_CHECK_EQUAL (f.drag.drag_factor (), 0.1);
26 }
27
BOOST_AUTO_TEST_CASE(staionary_drag)28 BOOST_AUTO_TEST_CASE (staionary_drag)
29 {
30 Drag_Fixture f;
31 f.drag.find_forces ();
32 BOOST_CHECK (f.drag.force ().null ());
33 }
34
BOOST_AUTO_TEST_CASE(forward_drag)35 BOOST_AUTO_TEST_CASE (forward_drag)
36 {
37 Drag_Fixture f;
38 Three_Vector wind (2.0, 0.0, 0.0);
39 f.drag.wind (wind, 0.1);
40 f.drag.find_forces ();
41 BOOST_CHECK_EQUAL (f.drag.force ().x, 0.4);
42 }
43
BOOST_AUTO_TEST_CASE(low_density)44 BOOST_AUTO_TEST_CASE (low_density)
45 {
46 Drag_Fixture f;
47 Three_Vector wind (2.0, 0.0, 0.0);
48 f.drag.wind (wind, 0.01);
49 f.drag.find_forces ();
50 BOOST_CHECK_EQUAL (f.drag.force ().x, 0.04);
51 }
52
BOOST_AUTO_TEST_CASE(vector_drag)53 BOOST_AUTO_TEST_CASE (vector_drag)
54 {
55 Drag_Fixture f;
56 Three_Vector wind (1.0, 2.0, -3.0);
57 f.drag.wind (wind, 0.1);
58 f.drag.find_forces ();
59 const double length = wind. magnitude ();
60 BOOST_CHECK_CLOSE (f.drag.force ().x, 0.1 * 1.0 * length, 1e-6);
61 BOOST_CHECK_CLOSE (f.drag.force ().y, 0.1 * 2.0 * length, 1e-6);
62 BOOST_CHECK_CLOSE (f.drag.force ().z, 0.1 * -3.0 * length, 1e-6);
63 }
64
65 struct Wing_Fixture
66 {
Wing_FixtureWing_Fixture67 Wing_Fixture ()
68 : up_wing (Three_Vector::ZERO, 4.0, 3.0, 0.5, 0.4),
69 down_wing (Three_Vector::ZERO, 4.0, 3.0, -0.5, 0.4)
70 {
71 Three_Vector wind;
72 up_wing.wind (wind, 0.1);
73 down_wing.wind (wind, 0.1);
74 }
75 Wing up_wing;
76 Wing down_wing;
77 };
78
BOOST_AUTO_TEST_CASE(wing_drag_factor)79 BOOST_AUTO_TEST_CASE (wing_drag_factor)
80 {
81 Wing_Fixture f;
82 BOOST_CHECK_EQUAL (f.up_wing.drag_factor (), 0.06);
83 BOOST_CHECK_EQUAL (f.down_wing.drag_factor (), 0.06);
84 }
85
BOOST_AUTO_TEST_CASE(wing_staionary_drag)86 BOOST_AUTO_TEST_CASE (wing_staionary_drag)
87 {
88 Wing_Fixture f;
89 f.up_wing.find_forces ();
90 f.down_wing.find_forces ();
91 BOOST_CHECK (f.up_wing.force ().null ());
92 BOOST_CHECK (f.down_wing.force ().null ());
93 }
94
BOOST_AUTO_TEST_CASE(wing_forward_force)95 BOOST_AUTO_TEST_CASE (wing_forward_force)
96 {
97 Wing_Fixture f;
98 Three_Vector wind (2.0, 0.0, 0.0);
99 f.up_wing.wind (wind, 0.1);
100 f.down_wing.wind (wind, 0.1);
101 f.up_wing.find_forces ();
102 f.down_wing.find_forces ();
103 BOOST_CHECK_CLOSE (f.up_wing.force ().x, 0.24, 1e-6);
104 BOOST_CHECK_CLOSE (f.up_wing.force ().y, 0.0, 1e-6);
105 BOOST_CHECK_CLOSE (f.up_wing.force ().z, 0.12, 1e-6);
106 BOOST_CHECK_CLOSE (f.down_wing.force ().x, 0.24, 1e-6);
107 BOOST_CHECK_CLOSE (f.down_wing.force ().y, 0.0, 1e-6);
108 BOOST_CHECK_CLOSE (f.down_wing.force ().z, -0.12, 1e-6);
109 }
110
BOOST_AUTO_TEST_CASE(wing_high_density)111 BOOST_AUTO_TEST_CASE (wing_high_density)
112 {
113 Wing_Fixture f;
114 Three_Vector wind (2.0, 0.0, 0.0);
115 f.up_wing.wind (wind, 1.0);
116 f.down_wing.wind (wind, 1.0);
117 f.up_wing.find_forces ();
118 f.down_wing.find_forces ();
119 BOOST_CHECK_CLOSE (f.up_wing.force ().x, 2.4, 1e-6);
120 BOOST_CHECK_CLOSE (f.up_wing.force ().y, 0.0, 1e-6);
121 BOOST_CHECK_CLOSE (f.up_wing.force ().z, 1.2, 1e-6);
122 BOOST_CHECK_CLOSE (f.down_wing.force ().x, 2.4, 1e-6);
123 BOOST_CHECK_CLOSE (f.down_wing.force ().y, 0.0, 1e-6);
124 BOOST_CHECK_CLOSE (f.down_wing.force ().z, -1.2, 1e-6);
125 }
126
BOOST_AUTO_TEST_CASE(wing_vector_drag)127 BOOST_AUTO_TEST_CASE (wing_vector_drag)
128 {
129 Wing_Fixture f;
130 Three_Vector wind (1.0, 2.0, -3.0);
131 f.up_wing.wind (wind, 0.1);
132 f.down_wing.wind (wind, 0.1);
133 f.up_wing.find_forces ();
134 f.down_wing.find_forces ();
135 const double length = wind. magnitude ();
136 const Three_Vector drag = 0.1 * 0.6 * length * wind;
137 const double lift = 0.03;
138 BOOST_CHECK_CLOSE (f.up_wing.force ().x, drag.x, 1e-6);
139 BOOST_CHECK_CLOSE (f.up_wing.force ().y, drag.y, 1e-6);
140 BOOST_CHECK_CLOSE (f.up_wing.force ().z, drag.z + lift, 1e-6);
141 BOOST_CHECK_CLOSE (f.down_wing.force ().x, drag.x, 1e-6);
142 BOOST_CHECK_CLOSE (f.down_wing.force ().y, drag.y, 1e-6);
143 BOOST_CHECK_CLOSE (f.down_wing.force ().z, drag.z - lift, 1e-6);
144 }
145