JSBSim Flight Dynamics Model  1.1.11 (13 Feb 2022)
An Open Source Flight Dynamics and Control Software Library in C++
FGElectric.cpp
1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2 
3  Module: FGElectric.cpp
4  Author: David Culp
5  Date started: 04/07/2004
6  Purpose: This module models an electric motor
7 
8  --------- Copyright (C) 2004 David Culp (davidculp2@comcast.net) -------------
9 
10  This program is free software; you can redistribute it and/or modify it under
11  the terms of the GNU Lesser General Public License as published by the Free Software
12  Foundation; either version 2 of the License, or (at your option) any later
13  version.
14 
15  This program is distributed in the hope that it will be useful, but WITHOUT
16  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17  FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
18  details.
19 
20  You should have received a copy of the GNU Lesser General Public License along with
21  this program; if not, write to the Free Software Foundation, Inc., 59 Temple
22  Place - Suite 330, Boston, MA 02111-1307, USA.
23 
24  Further information about the GNU Lesser General Public License can also be found on
25  the world wide web at http://www.gnu.org.
26 
27 FUNCTIONAL DESCRIPTION
28 --------------------------------------------------------------------------------
29 
30 This class descends from the FGEngine class and models an electric motor based on
31 parameters given in the engine config file for this class
32 
33 HISTORY
34 --------------------------------------------------------------------------------
35 04/07/2004 DPC Created
36 01/06/2005 DPC Converted to new XML format
37 
38 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
39 INCLUDES
40 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
41 
42 #include <iostream>
43 #include <sstream>
44 
45 #include "FGFDMExec.h"
46 #include "FGElectric.h"
47 #include "FGPropeller.h"
48 #include "input_output/FGXMLElement.h"
49 
50 using namespace std;
51 
52 namespace JSBSim {
53 
54 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
55 CLASS IMPLEMENTATION
56 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
57 
58 FGElectric::FGElectric(FGFDMExec* exec, Element *el, int engine_number, struct FGEngine::Inputs& input)
59  : FGEngine(engine_number, input)
60 {
61  Load(exec,el);
62 
63  Type = etElectric;
64  PowerWatts = 745.7;
65  hptowatts = 745.7;
66 
67  if (el->FindElement("power"))
68  PowerWatts = el->FindElementValueAsNumberConvertTo("power","WATTS");
69 
70  string base_property_name = CreateIndexedPropertyName("propulsion/engine",
71  EngineNumber);
72  exec->GetPropertyManager()->Tie(base_property_name + "/power-hp", &HP);
73 
74  Debug(0); // Call Debug() routine from constructor if needed
75 }
76 
77 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
78 
80 {
81  Debug(1); // Call Debug() routine from constructor if needed
82 }
83 
84 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
85 
87 {
88  RunPreFunctions();
89 
90  if (Thruster->GetType() == FGThruster::ttPropeller) {
91  ((FGPropeller*)Thruster)->SetAdvance(in.PropAdvance[EngineNumber]);
92  ((FGPropeller*)Thruster)->SetFeather(in.PropFeather[EngineNumber]);
93  }
94 
95  RPM = Thruster->GetRPM() * Thruster->GetGearRatio();
96 
97  HP = PowerWatts * in.ThrottlePos[EngineNumber] / hptowatts;
98 
99  LoadThrusterInputs();
100  // Filters out negative powers when the propeller is not rotating.
101  double power = HP * hptoftlbssec;
102  if (RPM <= 0.1) power = max(power, 0.0);
103  Thruster->Calculate(power);
104 
105  RunPostFunctions();
106 }
107 
108 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
109 
110 double FGElectric::CalcFuelNeed(void)
111 {
112  return 0;
113 }
114 
115 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
116 
117 string FGElectric::GetEngineLabels(const string& delimiter)
118 {
119  std::ostringstream buf;
120 
121  buf << Name << " HP (engine " << EngineNumber << ")" << delimiter
122  << Thruster->GetThrusterLabels(EngineNumber, delimiter);
123 
124  return buf.str();
125 }
126 
127 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
128 
129 string FGElectric::GetEngineValues(const string& delimiter)
130 {
131  std::ostringstream buf;
132 
133  buf << HP << delimiter
134  << Thruster->GetThrusterValues(EngineNumber, delimiter);
135 
136  return buf.str();
137 }
138 
139 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
140 //
141 // The bitmasked value choices are as follows:
142 // unset: In this case (the default) JSBSim would only print
143 // out the normally expected messages, essentially echoing
144 // the config files as they are read. If the environment
145 // variable is not set, debug_lvl is set to 1 internally
146 // 0: This requests JSBSim not to output any messages
147 // whatsoever.
148 // 1: This value explicity requests the normal JSBSim
149 // startup messages
150 // 2: This value asks for a message to be printed out when
151 // a class is instantiated
152 // 4: When this value is set, a message is displayed when a
153 // FGModel object executes its Run() method
154 // 8: When this value is set, various runtime state variables
155 // are printed out periodically
156 // 16: When set various parameters are sanity checked and
157 // a message is printed out when they go out of bounds
158 
159 void FGElectric::Debug(int from)
160 {
161  if (debug_lvl <= 0) return;
162 
163  if (debug_lvl & 1) { // Standard console startup message output
164  if (from == 0) { // Constructor
165 
166  cout << "\n Engine Name: " << Name << endl;
167  cout << " Power Watts: " << PowerWatts << endl;
168 
169  }
170  }
171  if (debug_lvl & 2 ) { // Instantiation/Destruction notification
172  if (from == 0) cout << "Instantiated: FGElectric" << endl;
173  if (from == 1) cout << "Destroyed: FGElectric" << endl;
174  }
175  if (debug_lvl & 4 ) { // Run() method entry print for FGModel-derived objects
176  }
177  if (debug_lvl & 8 ) { // Runtime state variables
178  }
179  if (debug_lvl & 16) { // Sanity checking
180  }
181  if (debug_lvl & 64) {
182  if (from == 0) { // Constructor
183  }
184  }
185 }
186 
187 } // namespace JSBSim
JSBSim::FGFDMExec
Encapsulates the JSBSim simulation executive.
Definition: FGFDMExec.h:185
JSBSim::FGPropeller
FGPropeller models a propeller given the tabular data for Ct (thrust) and Cp (power),...
Definition: FGPropeller.h:169
JSBSim::Element::FindElement
Element * FindElement(const std::string &el="")
Searches for a specified element.
Definition: FGXMLElement.cpp:389
JSBSim::Element::FindElementValueAsNumberConvertTo
double FindElementValueAsNumberConvertTo(const std::string &el, const std::string &target_units)
Searches for the named element and converts and returns the data belonging to it.
Definition: FGXMLElement.cpp:480
JSBSim::FGFDMExec::GetPropertyManager
FGPropertyManager * GetPropertyManager(void)
Returns a pointer to the property manager object.
Definition: FGFDMExec.cpp:1121
JSBSim::FGElectric::~FGElectric
~FGElectric()
Destructor.
Definition: FGElectric.cpp:79
JSBSim::FGEngine::Inputs
Definition: FGEngine.h:106
JSBSim::FGEngine
Base class for all engines.
Definition: FGEngine.h:103
JSBSim::Element
Definition: FGXMLElement.h:143
JSBSim::FGElectric::Calculate
void Calculate(void)
Calculates the thrust of the engine, and other engine functions.
Definition: FGElectric.cpp:86
JSBSim::FGPropertyManager::Tie
void Tie(const std::string &name, T *pointer)
Tie a property to an external variable.
Definition: FGPropertyManager.h:449