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