1 // =============================================================================
2 // PROJECT CHRONO - http://projectchrono.org
3 //
4 // Copyright (c) 2014 projectchrono.org
5 // All rights reserved.
6 //
7 // Use of this source code is governed by a BSD-style license that can be found
8 // in the LICENSE file at the top level of the distribution and at
9 // http://projectchrono.org/license-chrono.txt.
10 //
11 // =============================================================================
12 // Authors: Radu Serban
13 // =============================================================================
14 //
15 // HMMWV ANCF tire subsystem
16 //
17 // =============================================================================
18 
19 #ifndef HMMWV_ANCF_TIRE_H
20 #define HMMWV_ANCF_TIRE_H
21 
22 #include "chrono/fea/ChElementShellANCF_3423.h"
23 #include "chrono_models/ChApiModels.h"
24 #include "chrono_vehicle/wheeled_vehicle/tire/ChANCFTire.h"
25 
26 namespace chrono {
27 namespace vehicle {
28 namespace hmmwv {
29 
30 /// @addtogroup vehicle_models_hmmwv
31 /// @{
32 
33 /// Deformable tire model for the HMMWV vehicle (using ANCF shell FEA elements)
34 class CH_MODELS_API HMMWV_ANCFTire : public ChANCFTire {
35   public:
36     HMMWV_ANCFTire(const std::string& name);
~HMMWV_ANCFTire()37     ~HMMWV_ANCFTire() {}
38 
39     /// Get the tire radius.
GetRadius()40     virtual double GetRadius() const override { return m_tire_radius; }
41     /// Get the rim radius (inner tire radius).
GetRimRadius()42     virtual double GetRimRadius() const override { return m_rim_radius; }
43     /// Get the tire width.
GetWidth()44     virtual double GetWidth() const override { return m_rim_width; }
45     /// Get the default tire pressure.
GetDefaultPressure()46     virtual double GetDefaultPressure() const override { return m_default_pressure; }
47 
48     /// Return list of nodes connected to the rim.
49     virtual std::vector<std::shared_ptr<fea::ChNodeFEAbase>> GetConnectedNodes() const override;
50 
51     /// Create the FEA nodes and elements.
52     /// The wheel rotational axis is assumed to be the Y axis.
53     virtual void CreateMesh(const ChFrameMoving<>& wheel_frame,  ///< frame of associated wheel
54                             VehicleSide side                     ///< left/right vehicle side
55                             ) override;
56 
57   private:
58     virtual void CreateContactMaterial() override;
59 
60     static const double m_tire_radius;
61     static const double m_rim_radius;
62     static const double m_rim_width;
63 
64     static const int m_div_circumference;
65     int m_div_width;
66 
67     static const double m_alpha;
68     static const double m_default_pressure;
69 
70     static const double m_rho_0;
71     static const ChVector<> m_E_0;
72     static const ChVector<> m_nu_0;
73     static const ChVector<> m_G_0;
74     static const double m_rho_1;
75     static const ChVector<> m_E_1;
76     static const ChVector<> m_nu_1;
77     static const ChVector<> m_G_1;
78     static const double m_rho_2;
79     static const ChVector<> m_E_2;
80     static const ChVector<> m_nu_2;
81     static const ChVector<> m_G_2;
82     std::vector<std::shared_ptr<fea::ChMaterialShellANCF>> m_materials;
83 
84     static const unsigned int m_num_elements_bead;
85     static const unsigned int m_num_layers_bead;
86     static const std::vector<double> m_layer_thickness_bead;
87     static const std::vector<double> m_ply_angle_bead;
88     static const std::vector<int> m_material_id_bead;
89 
90     static const unsigned int m_num_elements_sidewall;
91     static const unsigned int m_num_layers_sidewall;
92     static const std::vector<double> m_layer_thickness_sidewall;
93     static const std::vector<double> m_ply_angle_sidewall;
94     static const std::vector<int> m_material_id_sidewall;
95 
96     static const unsigned int m_num_elements_tread;
97     static const unsigned int m_num_layers_tread;
98     static const std::vector<double> m_layer_thickness_tread;
99     static const std::vector<double> m_ply_angle_tread;
100     static const std::vector<int> m_material_id_tread;
101 
102     static const float m_friction;
103     static const float m_restitution;
104     static const float m_Young;
105     static const float m_Poisson;
106     static const float m_kn;
107     static const float m_gn;
108     static const float m_kt;
109     static const float m_gt;
110 
111     static const unsigned int m_num_points;
112     static const double m_profile[71][3];
113     std::vector<double> m_profile_t;
114     std::vector<double> m_profile_x;
115     std::vector<double> m_profile_y;
116 };
117 
118 /// @} vehicle_models_hmmwv
119 
120 }  // end namespace hmmwv
121 }  // end namespace vehicle
122 }  // end namespace chrono
123 
124 #endif
125