Source code for CADRE.CADRE_mdp
import os.path
import numpy as np
from openmdao.main.api import Assembly
from openmdao.lib.drivers.api import CONMINdriver
import warnings
try:
from pyopt_driver import pyopt_driver
except ImportError:
warnings.warn(
"pyopt_driver must be installed to run the full CADRE optimization",
ImportWarning)
from .CADRE_assembly import CADRE
[docs]class CADRE_Optimization(Assembly):
def __init__(self, n=1500, m=300, npts=6):
super(CADRE_Optimization, self).__init__()
# add SNOPT driver
self.add("driver", pyopt_driver.pyOptDriver())
self.driver.optimizer = "SNOPT"
self.driver.options = {'Major optimality tolerance': 1e-3,
'Iterations limit': 500000000,
"New basis file": 10}
if os.path.exists("fort.10"):
self.driver.options["Old basis file"] = 10
#driver = self.add("driver", CONMINdriver())
# Raw data to load
fpath = os.path.dirname(os.path.realpath(__file__))
fpath = os.path.join(fpath, 'data')
solar_raw1 = np.genfromtxt(fpath + '/Solar/Area10.txt')
solar_raw2 = np.loadtxt(fpath + '/Solar/Area_all.txt')
comm_rawGdata = np.genfromtxt(fpath + '/Comm/Gain.txt')
comm_raw = (10 ** (comm_rawGdata / 10.0)
).reshape((361, 361), order='F')
power_raw = np.genfromtxt(fpath + '/Power/curve.dat')
# Load launch data
launch_data = np.loadtxt(fpath + '/Launch/launch1.dat')
# orbit position and velocity data for each design point
r_e2b_I0s = launch_data[1::2, 1:]
# number of days since launch for each design point
LDs = launch_data[1::2, 0] - 2451545
# build design points
names = ['pt%s' % i for i in range(npts)]
for i, name in enumerate(names):
comp = self.add(name, CADRE(n, m, solar_raw1, solar_raw2,
comm_raw, power_raw))
comp.set("LD", LDs[i])
comp.set("r_e2b_I0", r_e2b_I0s[i])
# add parameters to driver
self.driver.add_parameter("%s.CP_Isetpt" % name, low=0., high=0.4)
self.driver.add_parameter("%s.CP_gamma" %
name, low=0, high=np.pi / 2.)
self.driver.add_parameter("%s.CP_P_comm" % name, low=0., high=25.)
self.driver.add_parameter("%s.iSOC[0]" % name, low=0.2, high=1.)
# add constraints
self.driver.add_constraint("%s.ConCh <= 0" % name)
self.driver.add_constraint("%s.ConDs <= 0" % name)
self.driver.add_constraint("%s.ConS0 <= 0" % name)
self.driver.add_constraint("%s.ConS1 <= 0" % name)
self.driver.add_constraint(
"%s.SOC[0][0] = %s.SOC[0][-1]" % (name, name))
# add parameter groups
cell_param = ["%s.cellInstd" % name for name in names]
self.driver.add_parameter(cell_param, low=0, high=1)
finangles = ["%s.finAngle" % name for name in names]
self.driver.add_parameter(finangles, low=0, high=np.pi / 2.)
antangles = ["%s.antAngle" % name for name in names]
self.driver.add_parameter(antangles, low=-np.pi / 4, high=np.pi / 4)
# add objective
obj = ''.join(["-%s.Data[0][-1]" % name for name in names])
self.driver.add_objective(obj)