PHengLEI-NCCR/API/Physics/include/SixDofManager.h

333 lines
16 KiB
C++
Raw Permalink Blame History

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// PPPPP H H EEEEE N N GGGGG L EEEEE III +
// P P H H E NN N G L E I +
// PPPPP HHHHH EEEEE N N N G GG L EEEEE I +
// P H H E N N N G G L E I +
// P H H EEEEE N N GGGGG LLLLL EEEEE III +
//------------------------------------------------------------------------+
// Platform for Hybrid Engineering Simulation of Flows +
// China Aerodynamics Research and Development Center +
// (C) Copyright, Since 2010 +
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//! @file SixDofManager.h
//! @brief Explain this file briefly.
//! @author xxx.
#pragma once
using namespace std;
namespace PHSPACE
{
namespace KINETIC_SCHEME
{
const int ADMAS_BASHFORTH_FIRST_ORDER = 0;
const int ADMAS_BASHFORTH_SECOND_ORDER = 1;
const int IMPLICIT_EULER_FIRST_ORDER = 2;
const int IMPLICIT_EULER_SECOND_ORDER = 3;
const int ADMAS_MOULTON_SECOND_ORDER = 4;
const int ADMAS_MOULTON_THIRD_ORDER = 5;
}
class MassCharacter
{
protected:
RDouble mass;
RDouble momentOfInertiaTensorXX, momentOfInertiaTensorYY, momentOfInertiaTensorZZ, momentOfInertiaTensorXY, momentOfInertiaTensorXZ, momentOfInertiaTensorYZ;
public:
MassCharacter() { mass = momentOfInertiaTensorXX = momentOfInertiaTensorYY = momentOfInertiaTensorZZ = momentOfInertiaTensorXY = momentOfInertiaTensorXZ = momentOfInertiaTensorYZ = 0.0; };
MassCharacter(RDouble mass, RDouble momentOfInertiaTensorXX, RDouble momentOfInertiaTensorYY, RDouble momentOfInertiaTensorZZ, RDouble momentOfInertiaTensorXY, RDouble momentOfInertiaTensorXZ, RDouble momentOfInertiaTensorYZ);
~MassCharacter() {};
void SetMassCharacter(RDouble mass, vector< RDouble > & massMatrix);
void SetMassCharacter(RDouble mass, RDouble momentOfInertiaTensorXX, RDouble momentOfInertiaTensorYY, RDouble momentOfInertiaTensorZZ, RDouble momentOfInertiaTensorXY, RDouble momentOfInertiaTensorXZ, RDouble momentOfInertiaTensorYZ);
void GetMassCharacter(RDouble & mass, RDouble & momentOfInertiaTensorXX, RDouble & momentOfInertiaTensorYY, RDouble & momentOfInertiaTensorZZ, RDouble & momentOfInertiaTensorXY, RDouble & momentOfInertiaTensorXZ, RDouble & momentOfInertiaTensorYZ);
void GetMomentInertia(RDouble & momentOfInertiaTensorXX, RDouble & momentOfInertiaTensorYY, RDouble & momentOfInertiaTensorZZ, RDouble & momentOfInertiaTensorXY,RDouble & momentOfInertiaTensorXZ,RDouble & momentOfInertiaTensorYZ);
void GetMomentInertia(vector< RDouble > & momentOfInertia);
RDouble GetMass(){ return mass; };
RDouble GetMomentOfInertiaTensorXX() { return momentOfInertiaTensorXX; };
RDouble GetMomentOfInertiaTensorYY() { return momentOfInertiaTensorYY; };
RDouble GetMomentOfInertiaTensorZZ() { return momentOfInertiaTensorZZ; };
RDouble GetMomentOfInertiaTensorXY() { return momentOfInertiaTensorXY; };
RDouble GetMomentOfInertiaTensorXZ() { return momentOfInertiaTensorXZ; };
RDouble GetMomentOfInertiaTensorYZ() { return momentOfInertiaTensorYZ; };
public:
RDouble ** GetMomentOfInertiaTensor();
RDouble ** GetInverseMomentOfInertiaTensor();
};
class SixDofParameter
{
protected:
RDouble referenceLength;
RDouble massCenterX, massCenterY, massCenterZ;
RDouble massCenterVelocityX, massCenterVelocityY, massCenterVelocityZ;
RDouble eulerAngleAlpha, eulerAngleBeta, eulerAngleGama;
RDouble angularVelocityX, angularVelocityY, angularVelocityZ;
public:
SixDofParameter();
~SixDofParameter() {};
void SetMassCenterX(RDouble massCenterX){ this->massCenterX = massCenterX; };
void SetMassCenterY(RDouble massCenterY){ this->massCenterY = massCenterY; };
void SetMassCenterZ(RDouble massCenterZ){ this->massCenterZ = massCenterZ; };
void SetMassCenter (RDouble massCenterX, RDouble massCenterY, RDouble massCenterZ)
{
this->massCenterX = massCenterX;
this->massCenterY = massCenterY;
this->massCenterZ = massCenterZ;
};
void SetMassCenterVelocityX(RDouble massCenterVelocityX){ this->massCenterVelocityX = massCenterVelocityX; };
void SetMassCenterVelocityY(RDouble massCenterVelocityY){ this->massCenterVelocityY = massCenterVelocityY; };
void SetMassCenterVelocityZ(RDouble massCenterVelocityZ){ this->massCenterVelocityZ = massCenterVelocityZ; };
void SetMassCenterVelocity (RDouble massCenterVelocityX, RDouble massCenterVelocityY, RDouble massCenterVelocityZ)
{
this->massCenterVelocityX = massCenterVelocityX;
this->massCenterVelocityY = massCenterVelocityY;
this->massCenterVelocityZ = massCenterVelocityZ;
};
void SetEulerAngleAlpha(RDouble eulerAngleAlpha) { this->eulerAngleAlpha = eulerAngleAlpha; };
void SetEulerAngleBeta (RDouble eulerAngleBeta) { this->eulerAngleBeta = eulerAngleBeta; };
void SetEulerAngleGama (RDouble eulerAngleGama) { this->eulerAngleGama = eulerAngleGama; };
void SetEulerAngle (RDouble eulerAngleGama, RDouble eulerAngleBeta, RDouble eulerAngleAlpha)
{
this->eulerAngleGama = eulerAngleGama;
this->eulerAngleBeta = eulerAngleBeta;
this->eulerAngleAlpha = eulerAngleAlpha;
};
void SetAngularVelocityX(RDouble angularVelocityX) { this->angularVelocityX = angularVelocityX; };
void SetAngularVelocityY(RDouble angularVelocityY) { this->angularVelocityY = angularVelocityY; };
void SetAngularVelocityZ(RDouble angularVelocityZ) { this->angularVelocityZ = angularVelocityZ; };
void SetAngularVelocity(RDouble angularVelocityX, RDouble angularVelocityY, RDouble angularVelocityZ)
{
this->angularVelocityX = angularVelocityX;
this->angularVelocityY = angularVelocityY;
this->angularVelocityZ = angularVelocityZ;
};
RDouble GetMassCenterX() { return massCenterX; };
RDouble GetMassCenterY() { return massCenterY; };
RDouble GetMassCenterZ() { return massCenterZ; };
void GetMassCenter(RDouble & massCenterX, RDouble & massCenterY, RDouble & massCenterZ)
{
massCenterX = this->massCenterX;
massCenterY = this->massCenterY;
massCenterZ = this->massCenterZ;
};
RDouble GetNondimensionalMassCenterX();
RDouble GetNondimensionalMassCenterY();
RDouble GetNondimensionalMassCenterZ();
void GetNondimensionalMassCenterVector(vector< RDouble > & nondimensionalMassCenterVector);
void GetNondimensionalMassCenter(RDouble & dimensionlessMassCenterX, RDouble & dimensionlessMassCenterY, RDouble & dimensionlessMassCenterZ);
RDouble GetMassCenterVelocityX() { return massCenterVelocityX; };
RDouble GetMassCenterVelocityY() { return massCenterVelocityY; };
RDouble GetMassCenterVelocityZ() { return massCenterVelocityZ; };
void GetMassCenterVelocity(RDouble & massCenterVelocityX, RDouble & massCenterVelocityY, RDouble & massCenterVelocityZ)
{
massCenterVelocityX = this->massCenterVelocityX;
massCenterVelocityY = this->massCenterVelocityY;
massCenterVelocityZ = this->massCenterVelocityZ;
};
RDouble GetEulerAngleAlpha() { return eulerAngleAlpha; };
RDouble GetEulerAngleBeta() { return eulerAngleBeta ; };
RDouble GetEulerAngleGama() { return eulerAngleGama ; };
void GetEulerAngle(RDouble & eulerAngleGama, RDouble & eulerAngleBeta, RDouble & eulerAngleAlpha)
{
eulerAngleGama = this->eulerAngleGama;
eulerAngleBeta = this->eulerAngleBeta;
eulerAngleAlpha = this->eulerAngleAlpha;
};
void GetEulerAngleContainer(vector< RDouble > & eulerAngleContainer)
{
return this->GetEulerAngle(eulerAngleContainer[ 0 ], eulerAngleContainer[ 1 ], eulerAngleContainer[ 2 ]);
};
RDouble GetAngularVelocityX() { return angularVelocityX; };
RDouble GetAngularVelocityY() { return angularVelocityY; };
RDouble GetAngularVelocityZ() { return angularVelocityZ; };
void GetAngularVelocity(RDouble & angularVelocityX, RDouble & angularVelocityY, RDouble & angularVelocityZ)
{
angularVelocityX = this->angularVelocityX;
angularVelocityY = this->angularVelocityY;
angularVelocityZ = this->angularVelocityZ;
};
void GetAngularVelocityContainer(vector< RDouble > & angularVelocityContainer)
{
return this->GetAngularVelocity(angularVelocityContainer[ 0 ], angularVelocityContainer[ 1 ], angularVelocityContainer[ 2 ]);
}
public:
void GetGeneralVariableContainer(vector< RDouble > & generalVariableContainer);
void SetGeneralVariableContainer(RDouble * generalVariableContainer);
void SetGeneralVariableContainer(vector< RDouble > & massCenter, vector< RDouble >& attitudeAngle,
vector< RDouble > &massCenterVelocity, vector< RDouble > &angularVelocity);
void UpdateEulerAngle (RDouble * eulerAngleVariationContainer);
void UpdateAngularVelocity (RDouble * angularVelocityVariationContainer);
};
class SixDofSolver;
class SixDofSolverManager
{
protected:
int numberOfMovingBodies;
SixDofSolver ** sixDofSolverContainer;
public:
SixDofSolverManager ();
~SixDofSolverManager();
public:
void Initialize();
void Restart();
void Run();
void Post();
void Dump();
void DumpRestart(fstream & file);
void ResetMassCenter();
protected:
void AllocateSixDofSolverContainer();
public:
MassCharacter * GetMassCharacter (int bodyIndex);
SixDofParameter * GetSixDofParameterN1(int bodyIndex);
SixDofParameter * GetSixDofParameterN (int bodyIndex);
SixDofParameter * GetSixDofParameter (int bodyIndex);
SixDofSolver * GetSixDofSolver(int bodyIndex) { return sixDofSolverContainer[ bodyIndex ]; }
};
class SixDofSolver
{
public:
SixDofSolver(SixDofSolverManager * sixDofSolverManager);
virtual ~SixDofSolver();
protected:
int bodyIndex;
int numberOfTimeLayers;
int resetMassCenter;
SixDofSolverManager * sixDofSolverManager;
vector< SixDofParameter * > sixDofParameterContainer;
vector< vector< RDouble > > sixDofForceContainer;
MassCharacter * massCharacter;
//<2F>ǶȻ<C7B6><C8BB>Ȼ<EFBFBD><C8BB><EFBFBD>
RDouble DegToRad, RadToDeg;
public:
virtual void Initialize(int bodyIndexIn);
void Restart();
void Run();
void Post();
void UpdateUnsteadyTerm();
protected:
void AllocateAllVariables();
void AllocateSixDofParameter();
void AllocateSixDofForceContainer();
void AllocateMassCharacter();
void InitializeMassCharacter();
void InitializeSixDofByParameter();
void DeallocateAllVariables();
public:
virtual void InitializeSixDofByFiles(fstream & file);
virtual void DumpRestartSixDofSolver(fstream & file);
virtual void ResetMassCenter();
public:
SixDofParameter * GetSixDofParameter(int iTimeLayer) { return sixDofParameterContainer[ iTimeLayer ]; };
vector< RDouble > & GetForceVector (int iTimeLayer) { return sixDofForceContainer [ iTimeLayer ]; }
MassCharacter * GetMassCharacter() { return massCharacter; };
int GetNumberOfTimeLayers() { return numberOfTimeLayers; }
void SetNumberOfTimeLayers(int numberOfTimeLayers) { this->numberOfTimeLayers = numberOfTimeLayers; }
protected:
void MovingByFile ();
void Stationary ();
void SolveSixDofEquation ();
void ModifyForceAndSixDofInformationForXYSymmetryCase();
void OscillatingInXDirection();
void OscillatingInYDirection();
void Pitching ();
void Yawing ();
void Rolling ();
void XDirectionOnly ();
void YDirectionOnly ();
void RotationInXDirection ();
void RotationInZDirection ();
void ModifyForceAndSixDofInformationForPitchingOnly ();
void ModifyForceAndSixDofInformationForRollingOnly ();
void ModifyForceAndSixDofInformationForPitchingAndRollingOnly();
void ReadSixDofParameterFromFile();
void Rotation_Rudder_Test1 ();
protected:
void GetSixDofFlux(SixDofParameter * sixDofParameter, MassCharacter * massCharacter, vector< RDouble > & force, vector< RDouble > & generalSixDofFlux);
void ComputeRightHandSideOfRigidBodyTranslationalMotionEquation (SixDofParameter * sixDofParameter, MassCharacter * massCharacter, vector< RDouble > & force, vector< RDouble > & generalSixDofFlux);
void ComputeRightHandSideOfRigidBodyTranslationalDynamicsEquation(SixDofParameter * sixDofParameter, MassCharacter * massCharacter, vector< RDouble > & force, vector< RDouble > & generalSixDofFlux);
void ComputeRightHandSideOfRigidBodyRotationalMotionEquation (SixDofParameter * sixDofParameter, MassCharacter * massCharacter, vector< RDouble > & force, vector< RDouble > & generalSixDofFlux);
void ComputeRightHandSideOfRigidBodyRotationalDynamicsEquation (SixDofParameter * sixDofParameter, MassCharacter * massCharacter, vector< RDouble > & force, vector< RDouble > & generalSixDofFlux);
void ComputeSixDofForceTimeSequenceContainer();
void GetDimensionalTotalForceAndMomentOfBody(vector< RDouble > & dimensionalGeneralForceContainer, int iTimeLayer);
void GetMassCenterAndEulerAngleContainer(vector< RDouble > & massCenterContainer, vector< RDouble > & eulerAngleContainer, int iTimeLayer);
void GetMomentAboutMassCenterInInertialFrame(vector< RDouble > & massCenterContainer, vector< RDouble > & totalForceVector, vector< RDouble > & momentVector, vector< RDouble > & momentAboutMassCenterInInertialFrame);
void GetDimensionalAdditionalForceAndMomentOfBody(vector< RDouble > & dimensionalGeneralForceContainer, int iTimeLayer);
void GetDimensionalAdditionalForceAndMomentOfBodyByParameter(vector< RDouble > & dimensionalGeneralForceContainer, int iTimeLayer);
void ComputeCurrentSixDofVariables(vector< vector< RDouble > > & qContainer, vector< vector< RDouble > > & fluxContainer, int numberOfEquations);
void ComputeCurrentSixDofVariables(RDouble * q, RDouble * qN, RDouble * qN1, RDouble * fluxM, RDouble * fluxN, RDouble * fluxN1, int numberOfEquations);
void GetDimensionalAerodynamicForceAndMoment(vector< RDouble > & dimensionalAerodynamicForce, vector< RDouble > & dimensionalAerodynamicMoment, int bodyIndex, int iTimeLayer);
public:
void GetDimensionalAerodynamicForceAndMomentOfBody (vector< RDouble > & dimensionalGeneralAerodynamicForceContainer, int iTimeLayer);
void GetDimensionalAerodynamicForceAndMomentBodyFrame(vector< RDouble > & dimensionalGeneralAerodynamicForceContainer, int iTimeLayer);
void GetDimensionalAerodynamicForceAndMomentInerFrame(vector< RDouble > & dimensionalGeneralAerodynamicForceContainer, int iTimeLayer);
public:
void DumpSixDofSolverInformation();
protected:
void DumpSixDofParameterInformation();
void DumpSixDofParameterInformation(fstream & file);
void DumpAleForceInformation();
void DumpAleForceInformationBodyFrame(fstream & file);
void DumpAleForceInformationInerFrame(fstream & file);
};
SixDofParameter * GetSixDofParameter (int bodyIndex);
void GetSixDofCoefficients(RDouble & a, RDouble & b, RDouble & c, RDouble & d, RDouble & e, RFloat & relaxParameter);
void ConvertVectorFromInertialCoordinateSystemToBodyCoordinateSystem(vector< RDouble > & vectorInInertialFrame, vector< RDouble > & angleVector, vector< RDouble > & massCenter, vector< RDouble > & vectorInBodyFrame);
void ConvertVectorFromBodyCoordinateSystemToInertialCoordinateSystem(vector< RDouble > & vectorInBodyFrame, vector< RDouble > & angleVector, vector< RDouble > & massCenter, vector< RDouble > & vectorInInertialFrame);
void ConvertVectorFromInertialCoordinateSystemToBodyCoordinateSystem(vector< RDouble > & vectorInInertialFrame, vector< RDouble > & angleVector, vector< RDouble > & vectorInBodyFrame);
void ConvertVectorFromBodyCoordinateSystemToInertialCoordinateSystem(vector< RDouble > & vectorInBodyFrame, vector< RDouble > & angleVector, vector< RDouble > & vectorInInertialFrame);
void RotateAboutAxisX(vector< RDouble > & vectorIn, RDouble rotateAngle, vector< RDouble > & vectorOut);
void RotateAboutAxisY(vector< RDouble > & vectorIn, RDouble rotateAngle, vector< RDouble > & vectorOut);
void RotateAboutAxisZ(vector< RDouble > & vectorIn, RDouble rotateAngle, vector< RDouble > & vectorOut);
}