X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FFDM%2FJSBSim%2Fmodels%2FFGMassBalance.cpp;h=fd067ab5160817aca07f4662c372c379fc78fd38;hb=4a817a63079733469d76905902509a40af019535;hp=fd2fad3d5348d967742b82e975ea1cf37acf9876;hpb=cf25f69d3639c2e4c821ff7f8ed62b80e8ff495b;p=flightgear.git diff --git a/src/FDM/JSBSim/models/FGMassBalance.cpp b/src/FDM/JSBSim/models/FGMassBalance.cpp index fd2fad3d5..fd067ab51 100644 --- a/src/FDM/JSBSim/models/FGMassBalance.cpp +++ b/src/FDM/JSBSim/models/FGMassBalance.cpp @@ -5,7 +5,7 @@ Date started: 09/12/2000 Purpose: This module models weight and balance - ------------- Copyright (C) 2000 Jon S. Berndt (jsb@hal-pc.org) -------------- + ------------- Copyright (C) 2000 Jon S. Berndt (jon@jsbsim.org) -------------- This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software @@ -40,12 +40,18 @@ INCLUDES #include "FGMassBalance.h" #include "FGPropulsion.h" +#include "propulsion/FGTank.h" #include "FGBuoyantForces.h" -#include +#include "input_output/FGPropertyManager.h" +#include +#include +#include + +using namespace std; namespace JSBSim { -static const char *IdSrc = "$Id$"; +static const char *IdSrc = "$Id: FGMassBalance.cpp,v 1.34 2010/11/18 12:38:06 jberndt Exp $"; static const char *IdHdr = ID_MASSBALANCE; /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -120,7 +126,9 @@ bool FGMassBalance::Load(Element* el) SetAircraftBaseInertias(FGMatrix33( bixx, -bixy, bixz, -bixy, biyy, -biyz, bixz, -biyz, bizz )); - EmptyWeight = el->FindElementValueAsNumberConvertTo("emptywt", "LBS"); + if (el->FindElement("emptywt")) { + EmptyWeight = el->FindElementValueAsNumberConvertTo("emptywt", "LBS"); + } element = el->FindElement("location"); while (element) { @@ -143,11 +151,13 @@ bool FGMassBalance::Load(Element* el) if (FDMExec->GetChildFDM(fdm)->mated) ChildFDMWeight += FDMExec->GetChildFDM(fdm)->exec->GetMassBalance()->GetWeight(); } - Weight = EmptyWeight + Propulsion->GetTanksWeight() + GetTotalPointMassWeight() - + BuoyantForces->GetGasMass()*slugtolb + ChildFDMWeight; + Weight = EmptyWeight + FDMExec->GetPropulsion()->GetTanksWeight() + GetTotalPointMassWeight() + + FDMExec->GetBuoyantForces()->GetGasMass()*slugtolb + ChildFDMWeight; Mass = lbtoslug*Weight; + PostLoad(el, PropertyManager); + Debug(2); return true; } @@ -162,21 +172,23 @@ bool FGMassBalance::Run(void) if (FGModel::Run()) return true; if (FDMExec->Holding()) return false; + RunPreFunctions(); + double ChildFDMWeight = 0.0; for (int fdm=0; fdmGetFDMCount(); fdm++) { if (FDMExec->GetChildFDM(fdm)->mated) ChildFDMWeight += FDMExec->GetChildFDM(fdm)->exec->GetMassBalance()->GetWeight(); } - Weight = EmptyWeight + Propulsion->GetTanksWeight() + GetTotalPointMassWeight() - + BuoyantForces->GetGasMass()*slugtolb + ChildFDMWeight; + Weight = EmptyWeight + FDMExec->GetPropulsion()->GetTanksWeight() + GetTotalPointMassWeight() + + FDMExec->GetBuoyantForces()->GetGasMass()*slugtolb + ChildFDMWeight; Mass = lbtoslug*Weight; // Calculate new CG - vXYZcg = (Propulsion->GetTanksMoment() + EmptyWeight*vbaseXYZcg + vXYZcg = (FDMExec->GetPropulsion()->GetTanksMoment() + EmptyWeight*vbaseXYZcg + GetPointMassMoment() - + BuoyantForces->GetGasMassMoment()) / Weight; + + FDMExec->GetBuoyantForces()->GetGasMassMoment()) / Weight; // Track frame-by-frame delta CG, and move the EOM-tracked location // by this amount. @@ -184,7 +196,7 @@ bool FGMassBalance::Run(void) vDeltaXYZcg = vXYZcg - vLastXYZcg; vDeltaXYZcgBody = StructuralToBody(vLastXYZcg) - StructuralToBody(vXYZcg); vLastXYZcg = vXYZcg; - Propagate->NudgeBodyLocation(vDeltaXYZcgBody); + FDMExec->GetPropagate()->NudgeBodyLocation(vDeltaXYZcgBody); // Calculate new total moments of inertia @@ -194,8 +206,8 @@ bool FGMassBalance::Run(void) mJ += GetPointmassInertia( lbtoslug * EmptyWeight, vbaseXYZcg ); // Then add the contributions from the additional pointmasses. mJ += CalculatePMInertias(); - mJ += Propulsion->CalculateTankInertias(); - mJ += BuoyantForces->GetGasMassInertia(); + mJ += FDMExec->GetPropulsion()->CalculateTankInertias(); + mJ += FDMExec->GetBuoyantForces()->GetGasMassInertia(); Ixx = mJ(1,1); Iyy = mJ(2,2); @@ -222,6 +234,8 @@ bool FGMassBalance::Run(void) k2, k4, k5, k3, k5, k6 ); + RunPostFunctions(); + Debug(0); return false; @@ -231,6 +245,7 @@ bool FGMassBalance::Run(void) void FGMassBalance::AddPointMass(Element* el) { + double radius=0, length=0; Element* loc_element = el->FindElement("location"); string pointmass_name = el->GetAttributeValue("name"); if (!loc_element) { @@ -241,8 +256,40 @@ void FGMassBalance::AddPointMass(Element* el) double w = el->FindElementValueAsNumberConvertTo("weight", "LBS"); FGColumnVector3 vXYZ = loc_element->FindElementTripletConvertTo("IN"); - PointMasses.push_back(new PointMass(w, vXYZ)); - PointMasses.back()->bind(PropertyManager, PointMasses.size()-1); + PointMass *pm = new PointMass(w, vXYZ); + pm->SetName(pointmass_name); + + Element* form_element = el->FindElement("form"); + if (form_element) { + string shape = form_element->GetAttributeValue("shape"); + Element* radius_element = form_element->FindElement("radius"); + Element* length_element = form_element->FindElement("length"); + if (radius_element) radius = form_element->FindElementValueAsNumberConvertTo("radius", "FT"); + if (length_element) length = form_element->FindElementValueAsNumberConvertTo("length", "FT"); + if (shape == "tube") { + pm->SetPointMassShapeType(PointMass::esTube); + pm->SetRadius(radius); + pm->SetLength(length); + pm->CalculateShapeInertia(); + } else if (shape == "cylinder") { + pm->SetPointMassShapeType(PointMass::esCylinder); + pm->SetRadius(radius); + pm->SetLength(length); + pm->CalculateShapeInertia(); + } else if (shape == "sphere") { + pm->SetPointMassShapeType(PointMass::esSphere); + pm->SetRadius(radius); + pm->CalculateShapeInertia(); + } else if (shape == "ball") { + pm->SetPointMassShapeType(PointMass::esBall); + pm->SetRadius(radius); + pm->CalculateShapeInertia(); + } else { + } + } + + pm->bind(PropertyManager, PointMasses.size()); + PointMasses.push_back(pm); } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -280,8 +327,10 @@ FGMatrix33& FGMassBalance::CalculatePMInertias(void) pmJ = FGMatrix33(); - for (unsigned int i=0; iWeight, PointMasses[i]->Location ); + pmJ += PointMasses[i]->GetPointMassInertia(); + } return pmJ; } @@ -329,7 +378,7 @@ void FGMassBalance::bind(void) PropertyManager->Tie("inertia/weight-lbs", this, &FGMassBalance::GetWeight); PropertyManager->Tie("inertia/empty-weight-lbs", this, - &FGMassBalance::GetWeight, &FGMassBalance::SetEmptyWeight); + &FGMassBalance::GetEmptyWeight); PropertyManager->Tie("inertia/cg-x-in", this,1, (PMF)&FGMassBalance::GetXYZcg); PropertyManager->Tie("inertia/cg-y-in", this,2, @@ -338,6 +387,83 @@ void FGMassBalance::bind(void) (PMF)&FGMassBalance::GetXYZcg); } +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// +// This function binds properties for each pointmass object created. +// +void FGMassBalance::PointMass::bind(FGPropertyManager* PropertyManager, int num) { + string tmp = CreateIndexedPropertyName("inertia/pointmass-weight-lbs", num); + PropertyManager->Tie( tmp.c_str(), this, &PointMass::GetPointMassWeight, + &PointMass::SetPointMassWeight); + + tmp = CreateIndexedPropertyName("inertia/pointmass-location-X-inches", num); + PropertyManager->Tie( tmp.c_str(), this, eX, &PointMass::GetPointMassLocation, + &PointMass::SetPointMassLocation); + tmp = CreateIndexedPropertyName("inertia/pointmass-location-Y-inches", num); + PropertyManager->Tie( tmp.c_str(), this, eY, &PointMass::GetPointMassLocation, + &PointMass::SetPointMassLocation); + tmp = CreateIndexedPropertyName("inertia/pointmass-location-Z-inches", num); + PropertyManager->Tie( tmp.c_str(), this, eZ, &PointMass::GetPointMassLocation, + &PointMass::SetPointMassLocation); +} + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +void FGMassBalance::GetMassPropertiesReport(void) const +{ + cout << endl << fgblue << highint + << " Mass Properties Report (English units: lbf, in, slug-ft^2)" + << reset << endl; + cout << " " << underon << " Weight CG-X CG-Y" + << " CG-Z Ixx Iyy Izz" << underoff << endl; + cout.precision(1); + cout << highint << setw(34) << left << " Base Vehicle " << normint + << right << setw(10) << EmptyWeight << setw(8) << vbaseXYZcg(eX) << setw(8) + << vbaseXYZcg(eY) << setw(8) << vbaseXYZcg(eZ) << setw(12) << baseJ(1,1) + << setw(12) << baseJ(2,2) << setw(12) << baseJ(3,3) << endl; + + for (unsigned int i=0;iGetPointMassWeight(); + cout << highint << left << setw(4) << i << setw(30) << pm->GetName() << normint + << right << setw(10) << pmweight << setw(8) << pm->GetLocation()(eX) + << setw(8) << pm->GetLocation()(eY) << setw(8) << pm->GetLocation()(eZ) + << setw(12) << pm->GetPointMassMoI(1,1) << setw(12) << pm->GetPointMassMoI(2,2) + << setw(12) << pm->GetPointMassMoI(3,3) << endl; + } + + for (unsigned int i=0;iGetPropulsion()->GetNumTanks() ;i++) { + FGTank* tank = FDMExec->GetPropulsion()->GetTank(i); + string tankname=""; + if (tank->GetType() == FGTank::ttFUEL && tank->GetGrainType() != FGTank::gtUNKNOWN) { + tankname = "Solid Fuel"; + } else if (tank->GetType() == FGTank::ttFUEL) { + tankname = "Fuel"; + } else if (tank->GetType() == FGTank::ttOXIDIZER) { + tankname = "Oxidizer"; + } else { + tankname = "(Unknown tank type)"; + } + cout << highint << left << setw(4) << i << setw(30) << tankname << normint + << right << setw(10) << tank->GetContents() << setw(8) << tank->GetXYZ(eX) + << setw(8) << tank->GetXYZ(eY) << setw(8) << tank->GetXYZ(eZ) + << setw(12) << "*" << setw(12) << "*" + << setw(12) << "*" << endl; + } + + cout << underon << setw(104) << " " << underoff << endl; + cout << highint << left << setw(30) << " Total: " << right << setw(14) << Weight + << setw(8) << vXYZcg(eX) + << setw(8) << vXYZcg(eY) + << setw(8) << vXYZcg(eZ) + << setw(12) << mJ(1,1) + << setw(12) << mJ(2,2) + << setw(12) << mJ(3,3) + << normint << endl; + + cout.setf(ios_base::fixed); +} + //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // The bitmasked value choices are as follows: // unset: In this case (the default) JSBSim would only print @@ -370,7 +496,7 @@ void FGMassBalance::Debug(int from) cout << " baseIxy: " << baseJ(1,2) << " slug-ft2" << endl; cout << " baseIxz: " << baseJ(1,3) << " slug-ft2" << endl; cout << " baseIyz: " << baseJ(2,3) << " slug-ft2" << endl; - cout << " EmptyWeight: " << EmptyWeight << " lbm" << endl; + cout << " Empty Weight: " << EmptyWeight << " lbm" << endl; cout << " CG (x, y, z): " << vbaseXYZcg << endl; // ToDo: Need to add point mass outputs here for (unsigned int i=0; i