| 1203 | //****************************************************************************** |
| 1204 | |
| 1205 | bool FGInitialCondition::Load_v2(Element* document) |
| 1206 | { |
| 1207 | FGColumnVector3 vOrient; |
| 1208 | bool result = true; |
| 1209 | |
| 1210 | // support both earth_position_angle and planet_position_angle, for now. |
| 1211 | if (document->FindElement("earth_position_angle")) |
| 1212 | epa = document->FindElementValueAsNumberConvertTo("earth_position_angle", "RAD"); |
| 1213 | if (document->FindElement("planet_position_angle")) |
| 1214 | epa = document->FindElementValueAsNumberConvertTo("planet_position_angle", "RAD"); |
| 1215 | |
| 1216 | // Calculate the inertial to ECEF matrices |
| 1217 | FGMatrix33 Ti2ec(cos(epa), sin(epa), 0.0, |
| 1218 | -sin(epa), cos(epa), 0.0, |
| 1219 | 0.0, 0.0, 1.0); |
| 1220 | FGMatrix33 Tec2i = Ti2ec.Transposed(); |
| 1221 | |
| 1222 | if (document->FindElement("planet_rotation_rate")) { |
| 1223 | fdmex->GetInertial()->SetOmegaPlanet(document->FindElementValueAsNumberConvertTo("planet_rotation_rate", "RAD")); |
| 1224 | fdmex->GetPropagate()->in.vOmegaPlanet = fdmex->GetInertial()->GetOmegaPlanet(); |
| 1225 | fdmex->GetAccelerations()->in.vOmegaPlanet = fdmex->GetInertial()->GetOmegaPlanet(); |
| 1226 | } |
| 1227 | FGColumnVector3 vOmegaEarth = fdmex->GetInertial()->GetOmegaPlanet(); |
| 1228 | |
| 1229 | if (document->FindElement("elevation")) { |
| 1230 | fdmex->GetInertial()->SetTerrainElevation(document->FindElementValueAsNumberConvertTo("elevation", "FT")); |
| 1231 | } |
| 1232 | |
| 1233 | // Initialize vehicle position |
| 1234 | // |
| 1235 | // Allowable frames: |
| 1236 | // - ECI (Earth Centered Inertial) |
| 1237 | // - ECEF (Earth Centered, Earth Fixed) |
| 1238 | |
| 1239 | Element* position_el = document->FindElement("position"); |
| 1240 | if (position_el) { |
| 1241 | string frame = position_el->GetAttributeValue("frame"); |
| 1242 | frame = to_lower(frame); |
| 1243 | if (frame == "eci") { // Need to transform vLoc to ECEF for storage and use in FGLocation. |
| 1244 | position = Ti2ec * position_el->FindElementTripletConvertTo("FT"); |
| 1245 | } else if (frame == "ecef") { |
| 1246 | if (!position_el->FindElement("x") && !position_el->FindElement("y") && !position_el->FindElement("z")) { |
| 1247 | if (position_el->FindElement("longitude")) { |
| 1248 | SetLongitudeRadIC(position_el->FindElementValueAsNumberConvertTo("longitude", "RAD")); |
| 1249 | } |
| 1250 | if (position_el->FindElement("radius")) { |
| 1251 | position.SetRadius(position_el->FindElementValueAsNumberConvertTo("radius", "FT")); |
| 1252 | } else if (position_el->FindElement("altitudeAGL")) { |
| 1253 | SetAltitudeAGLFtIC(position_el->FindElementValueAsNumberConvertTo("altitudeAGL", "FT")); |
| 1254 | } else if (position_el->FindElement("altitudeMSL")) { |
| 1255 | SetAltitudeASLFtIC(position_el->FindElementValueAsNumberConvertTo("altitudeMSL", "FT")); |
| 1256 | } else { |
| 1257 | FGXMLLogging log(position_el, LogLevel::ERROR); |
| 1258 | log << " No altitude or radius initial condition is given.\n"; |
| 1259 | result = false; |
| 1260 | } |
| 1261 | |
| 1262 | if (result) |
nothing calls this directly
no test coverage detected