Hello Chrono Team,
I am attempting to model a rotor system with blades, but I am currently having issues capturing correct gyroscopic and inertial effects. To validate my approach, I am attempting to replicate a relatively simple system consisting of a “flapping blade”. The blade is rotating about its end and has one free DOF, \beta, as illustrated below.
The only force in this system is the centrifugal force as illustrated. Integrating that force over the length of the blade results in the following equation of motion I_b \Omega^2 \beta + I_b \ddot{\beta} = 0, where I_b is the moment of inertia of the beam about its end. Thus, the natural frequency of the flapping mode is exactly equal to the rotation speed of the blade, \Omega. I am attempting to model this system in Project Chrono, but the modal solver continues to return a natural frequency of zero regardless of the rotation speed of the blade. I am assuming this issue can be fixed by properly initializing ChLoadBodyInertia, but I cannot find the solution. I have attached my code and corresponding output for reference. Please let me know if there is any additional information that would be helpful. Thanks!
Code:
int main(int argc, char* argv[]) {
// Create a Chrono::Engine physical system
ChSystemSMC sys;
auto load_container = chrono_types::make_shared<ChLoadContainer>();
sys.Add(load_container);
// Define solver
auto solver = chrono_types::make_shared<ChSolverPardisoMKL>();
sys.SetSolver(solver);
// Create ground
auto ground = chrono_types::make_shared<ChBody>();
ground->SetFixed(true);
sys.Add(ground);
// Create Rigid Body
auto blade = chrono_types::make_shared<ChBodyEasyBox>(1., 0.1, 0.1, 0.0, true);
blade->SetPos(ChVector3d(0.5, 0., 0.));
blade->SetInertiaXX(ChVector3d(0., 0., 0.));
blade->SetMass(0.);
sys.Add(blade);
// Add ChLoadBodyInertia to blade for gyroscopic effects
auto gyro = chrono_types::make_shared<ChLoadBodyInertia>(blade, ChVector3d(0., 0., 0.), 1., ChVector3d(0.1, 1., 1.), ChVector3d(0., 0., 0.));
// ChLoadBodyInertia(rigid body, CG offset, mass, InertiaXX, InertiaXY)
load_container->Add(gyro);
// Attach motor to spin blade about origin allowing it to "flap" about y axis
auto motor = chrono_types::make_shared<ChLinkMotorRotationSpeed>();
motor->Initialize(ground, blade, ChFrame<>(ChVector3d(0., 0., 0.)));
std::shared_ptr<chrono::ChFunctionSetpoint> motor_speed = std::make_unique<chrono::ChFunctionSetpoint>();
double speed = 10.; // [rad/s]
motor_speed->SetSetpoint(speed, 0.);
motor->SetSpeedFunction(motor_speed); // Apply the angular velocity
motor->SetSpindleConstraint(true, true, true, true, false); // allowing blade to rotate about y axis
sys.AddLink(motor);
// Perform static analysis
ChStaticNonLinearRheonomicAnalysis static_solver;
static_solver.SetIncrementalSteps(1);
static_solver.SetMaxIterations(2);
static_solver.SetResidualTolerance(1e-10);
static_solver.SetVerbose(true);
static_solver.SetAutomaticSpeedAndAccelerationComputation(true);
sys.DoStaticAnalysis(static_solver);
// Perform modal analysis
chrono::ChMatrixDynamic<std::complex<double>> eigvects;
chrono::ChVectorDynamic<std::complex<double>> eigvals;
chrono::ChVectorDynamic<> freq;
chrono::ChVectorDynamic<> damping_ratios;
auto factorization = chrono_types::make_shared<ChSolverSparseComplexQR>();
auto eig_solver = chrono_types::make_shared<ChUnsymGenEigenvalueSolverKrylovSchur>(factorization);
ChModalSolverDamped modal_solver(4, 1e-5, true, false, eig_solver);
modal_solver.Solve(sys.GetAssembly(), eigvects, eigvals, freq, damping_ratios);
// Print out natural frequency
std::cout << "Expected Natural Frequency: " << speed << "\n Predicted Natural Frequency: " << freq[0] * CH_2PI
<< std::endl;
return 0;
}
Output:
--
You received this message because you are subscribed to the Google Groups "ProjectChrono" group.
To unsubscribe from this group and stop receiving emails from it, send an email to projectchron...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/projectchrono/c63d9283-7baa-4e13-8a1b-04d3d079bfc3n%40googlegroups.com.
You received this message because you are subscribed to a topic in the Google Groups "ProjectChrono" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/projectchrono/MvCd3juUJnE/unsubscribe.
To unsubscribe from this group and all its topics, send an email to projectchron...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/projectchrono/d7fe3538-cdd6-4214-8c93-5d495afd00fan%40googlegroups.com.