Skip to content

Commit

Permalink
Merge pull request #572 from suavecode/feature-const_throttle_const_a…
Browse files Browse the repository at this point in the history
…lt_improve_convergence

Improve constant throttle constant altitude convergence
  • Loading branch information
AaronBlau committed Apr 8, 2022
2 parents 830a060 + e0ef6a5 commit 0f6e82c
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 25 deletions.
2 changes: 2 additions & 0 deletions regression/scripts/segments/segment_test.py
Expand Up @@ -485,6 +485,8 @@ def mission_setup(analyses):
segment.throttle = 0.6
segment.distance = 500 * Units.km
segment.state.numerics.number_control_points = 16
segment.state.unknowns.accel_x = -1. * ones_row(1)
segment.state.unknowns.time = 10.

# add to misison
mission.append_segment(segment)
Expand Down
Expand Up @@ -5,6 +5,7 @@
# Modified: Feb 2016, Andrew Wendorff
# Mar 2020, M. Clarke
# Aug 2021, R. Erhard
# Apr 2022, A. Blaufox

# ----------------------------------------------------------------------
# Imports
Expand Down Expand Up @@ -78,7 +79,7 @@ def __defaults__(self):
# initials and unknowns
ones_row = self.state.ones_row
self.state.unknowns.body_angle = ones_row(1) * 0.0
self.state.unknowns.velocity_x = ones_row(1) * 0.0
self.state.unknowns.accel_x = ones_row(1) * 1.
self.state.unknowns.time = 100.
self.state.residuals.final_velocity_error = 0.0
self.state.residuals.forces = ones_row(2) * 0.0
Expand Down Expand Up @@ -122,6 +123,7 @@ def __defaults__(self):
# Update Conditions
iterate.conditions = Process()
iterate.conditions.differentials = Methods.Common.Numerics.update_differentials_time
iterate.conditions.velocity = Methods.Cruise.Constant_Throttle_Constant_Altitude.integrate_velocity
iterate.conditions.altitude = Methods.Common.Aerodynamics.update_altitude
iterate.conditions.atmosphere = Methods.Common.Aerodynamics.update_atmosphere
iterate.conditions.gravity = Methods.Common.Weights.update_gravity
Expand Down
Expand Up @@ -5,14 +5,13 @@
# Modified: Jan 2016, E. Botero
# May 2019, T. MacDonald
# Mar 2020, M. Clarke
# Apr 2022, A. Blaufox

# ----------------------------------------------------------------------
# Imports
# ----------------------------------------------------------------------

import numpy as np
from SUAVE.Methods.Geometry.Three_Dimensional \
import angles_to_dcms, orientation_product, orientation_transpose

# ----------------------------------------------------------------------
# Unpack Unknowns
Expand All @@ -23,27 +22,49 @@ def unpack_unknowns(segment):

# unpack unknowns
unknowns = segment.state.unknowns
velocity_x = unknowns.velocity_x
time = unknowns.time
theta = unknowns.body_angle
accel_x = unknowns.accel_x
time = unknowns.time

# unpack givens
v0 = segment.air_speed_start
vf = segment.air_speed_end
# rescale time
t_initial = segment.state.conditions.frames.inertial.time[0,0]
t_nondim = segment.state.numerics.dimensionless.control_points

# time
t_final = t_initial + time
t_nondim = segment.state.numerics.dimensionless.control_points
time = t_nondim * (t_final-t_initial) + t_initial

#apply unknowns
# build acceleration
N = segment.state.numerics.number_control_points
a = np.zeros((N, 3))
a[:, 0] = accel_x[:,0]

# apply unknowns
conditions = segment.state.conditions
conditions.frames.inertial.velocity_vector[:,0] = velocity_x
conditions.frames.inertial.velocity_vector[0,0] = v0
conditions.frames.body.inertial_rotations[:,1] = theta[:,0]
conditions.frames.inertial.acceleration_vector = a
conditions.frames.inertial.time[:,0] = time[:,0]

return

# ----------------------------------------------------------------------
# Integrate Velocity
# ----------------------------------------------------------------------

def integrate_velocity(segment):

# unpack
conditions = segment.state.conditions
v0 = segment.air_speed_start
I = segment.state.numerics.time.integrate
a = conditions.frames.inertial.acceleration_vector

# compute x-velocity
velocity_x = v0 + np.dot(I, a)[:,0]

# pack velocity
conditions.frames.inertial.velocity_vector[:,0] = velocity_x

return

# ----------------------------------------------------------------------
# Initialize Conditions
# ----------------------------------------------------------------------
Expand Down Expand Up @@ -104,9 +125,6 @@ def initialize_conditions(segment):
segment.air_speed_start = v0
segment.air_speed_end = vf

# Initialize the x velocity unknowns to speed convergence:
segment.state.unknowns.velocity_x = np.linspace(v0,vf,N)

# pack conditions
segment.state.conditions.propulsion.throttle[:,0] = throttle
segment.state.conditions.freestream.altitude[:,0] = alt
Expand Down Expand Up @@ -148,17 +166,11 @@ def solve_residuals(segment):
FT = conditions.frames.inertial.total_force_vector
vf = segment.air_speed_end
v = conditions.frames.inertial.velocity_vector
D = segment.state.numerics.time.differentiate
m = conditions.weights.total_mass

# process and pack
acceleration = np.dot(D , v)
conditions.frames.inertial.acceleration_vector = acceleration

a = segment.state.conditions.frames.inertial.acceleration_vector
a = conditions.frames.inertial.acceleration_vector

segment.state.residuals.forces[:,0] = FT[:,0]/m[:,0] - a[:,0]
segment.state.residuals.forces[:,1] = FT[:,2]/m[:,0] #- a[:,2]
segment.state.residuals.forces[:,1] = FT[:,2]/m[:,0]
segment.state.residuals.final_velocity_error = (v[-1,0] - vf)

return

0 comments on commit 0f6e82c

Please sign in to comment.