-
imcovangent authored
Changed mdo_data in SSBJ to normalized_data Former-commit-id: fd8ef285cdc18cff41584d9f717371d387e7beb6
imcovangent authoredChanged mdo_data in SSBJ to normalized_data Former-commit-id: fd8ef285cdc18cff41584d9f717371d387e7beb6
ssbj_mdo.py 11.17 KiB
# Imports
import os
import logging
from kadmos.graph import FundamentalProblemGraph, load
# Settings for logging
from kadmos.graph.mixin_vistoms import vistoms_start
logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.DEBUG)
# List of MDAO definitions that can be wrapped around the problem
mdao_definitions = ['MDF-GS', # 0
'MDF-J', # 1
'IDF', # 2
'CO', # 3
'BLISS-2000'] # 4
all_graphs = []
# Settings for scripting
mdao_definitions_loop_all = True # Option for looping through all MDAO definitions
mdao_definition_id = 2 # Option for selecting a MDAO definition (in case mdao_definitions_loop_all=False)
start_interactive_vistoms = False # Option to start an interactive VISTOMS at the end
# Settings for loading and saving
kb_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../knowledgebases')
pdf_dir = 'ssbj/(X)DSM'
cmdows_dir = 'ssbj/CMDOWS'
kdms_dir = 'ssbj/KDMS'
vistoms_dir = 'ssbj/VISTOMS_mdo'
logging.info('Loading repository connectivity graph...')
rcg = load(os.path.join(kb_dir, 'ssbj', '__cmdows__SSBJ.xml'),
check_list=['consistent_root', 'invalid_leaf_elements', 'schemas'])
logging.info('Scripting RCG...')
# A name and a description are added to the graph
rcg.graph['name'] = 'RCG'
rcg.graph['description'] = 'Repository of the super-sonic business jet test case optimization problem'
function_order = ['Structures', 'Aerodynamics', 'Propulsion', 'Performance']
rcg.create_dsm('RCG_basic', include_system_vars=True, destination_folder=pdf_dir, function_order=function_order)
# Add the constraint functions
# Sigmas
sigmas = [node for node in rcg.find_all_nodes(category='variable') if 'sigma' in node]
sigmas.sort()
sigma_labels = [sigma.split('/')[-1] for sigma in sigmas]
c_sigma_prefix = '/data_schema/normalized_data/sigmas'
c_sigmas = ['{}/sigma{}'.format(c_sigma_prefix, idx+1) for (idx, _) in enumerate(sigmas)]
rcg.add_mathematical_function([[item[0], item[1]] for item in zip(sigmas, sigma_labels)],
'C[sigmas]',
[[item[0], '{}/1.0'.format(item[1]), 'Python'] for item in zip(c_sigmas, sigma_labels)])
# Theta
theta = [node for node in rcg.find_all_nodes(category='variable') if node.endswith('/Theta')]
theta_label = theta[0].split('/')[-1]
c_theta = '/data_schema/normalized_data/Theta'
rcg.add_mathematical_function([[theta[0], theta_label]],
'C[Theta]',
[[c_theta, '{}/1.0'.format(theta_label), 'Python']])
# dpdx
dpdx = [node for node in rcg.find_all_nodes(category='variable') if node.endswith('/dpdx')]
dpdx_label = dpdx[0].split('/')[-1]
c_dpdx = '/data_schema/normalized_data/dpdx'
rcg.add_mathematical_function([[dpdx[0], dpdx_label]],
'C[dpdx]',
[[c_dpdx, '{}/1.0'.format(dpdx_label), 'Python']])
# prop
ESF = [node for node in rcg.find_all_nodes(category='variable') if node.endswith('/ESF')]
DT = [node for node in rcg.find_all_nodes(category='variable') if node.endswith('/DT')]
Temp = [node for node in rcg.find_all_nodes(category='variable') if node.endswith('/Temp')]
prop_nodes = ESF + DT + Temp
prop_labels = [prop.split('/')[-1] for prop in prop_nodes]
c_prop_prefix = '/data_schema/normalized_data/propulsion'
c_props = ['{}/{}'.format(c_prop_prefix, prop_label) for prop_label in prop_labels]
rcg.add_mathematical_function([[item[0], item[1]] for item in zip(prop_nodes, prop_labels)],
'C[prop]',
[[item[0], '{}/1.0'.format(item[1]), 'Python'] for item in zip(c_props, prop_labels)])
# Add the objective
R = [node for node in rcg.find_all_nodes(category='variable') if node.endswith('/R')]
R_label = R[0].split('/')[-1]
f_R = '/data_schema/normalized_data/R'
rcg.add_mathematical_function([[R[0], R_label]], 'F[R]', [[f_R, '-{}'.format(R_label), 'Python']])
# Add default values of the variables based on a reference file
rcg.add_variable_default_values(os.path.join(kb_dir, 'ssbj', 'SSBJ-base.xml'))
function_order = ['Structures', 'Aerodynamics', 'Propulsion', 'Performance',
'C[sigmas]', 'C[Theta]', 'C[dpdx]', 'C[prop]', 'F[R]']
# Add some (optional) organization information
rcg.add_contact('Imco van Gent', 'i.vangent@tudelft.nl', 'ivangent', company='TU Delft', roles=['architect',
'integrator'])
rcg.add_contact('Lukas Muller', 'l.muller@student.tudelft.nl', 'lmuller', company='TU Delft', roles='architect')
rcg.add_contact_roles('lmuller', roles='integrator')
# Create a DSM and a VISTOMS visualization of the RCG
rcg.create_dsm('RCG_extended', include_system_vars=True, destination_folder=pdf_dir, function_order=function_order)
rcg.vistoms_create(vistoms_dir, function_order=function_order)
# Save CMDOWS and KDMS file
rcg.save('RCG', destination_folder=kdms_dir)
rcg.save('RCG',
file_type='cmdows',
description='RCG CMDOWS file of the super-sonic business jet test case optimization problem',
creator='Lukas Mueller',
version='0.1',
destination_folder=cmdows_dir,
pretty_print=True,
integrity=True)
all_graphs.append(rcg)
# On to the wrapping of the MDAO architectures
# Get iterator (all or single one)
if not mdao_definitions_loop_all:
mdao_definitions = [mdao_definitions[mdao_definition_id]]
# Reset FPG
mdao_definition_fpg = 'MDF-GS'
architecture_type = 'MDO'
fpg = FundamentalProblemGraph(rcg)
fpg.graph['name'] = 'FPG - {}'.format(architecture_type)
fpg.graph['description'] = 'Fundamental problem graph to solve the super-sonic business jet test case optimization ' \
'problem for the architecture type: {}'.format(architecture_type)
# Define settings of the problem formulation
fpg.add_problem_formulation(mdao_definition_fpg, function_order)
fpg.graph['problem_formulation']['coupled_functions_groups'] = [['Structures'], ['Aerodynamics'], ['Propulsion']]
# Assign design variables
des_vars = [('/data_schema/aircraft/geometry/tc', 0.01, 0.05, 0.09),
('/data_schema/reference/h', 30000, 45000, 60000),
('/data_schema/reference/M', 1.4, 1.6, 1.8),
('/data_schema/aircraft/geometry/AR', 2.5, 5.5, 8.5),
('/data_schema/aircraft/geometry/Lambda', 40, 55, 70),
('/data_schema/aircraft/geometry/Sref', 500, 1000, 1500),
('/data_schema/aircraft/geometry/lambda', 0.1, 0.25, 0.4),
('/data_schema/aircraft/geometry/section', 0.75, 1.00, 1.25),
('/data_schema/aircraft/other/Cf', 0.75, 1.00, 1.25),
('/data_schema/aircraft/other/T', 0.1, 0.55, 1.00)]
fpg.mark_as_design_variables([ds_vr[0] for ds_vr in des_vars],
lower_bounds=[ds_vr[1] for ds_vr in des_vars],
nominal_values=[ds_vr[2] for ds_vr in des_vars],
upper_bounds=[ds_vr[3] for ds_vr in des_vars])
# Assign objective
fpg.mark_as_objective([nd for nd in rcg.find_all_nodes(category='variable') if nd.endswith('normalized_data/R')][0])
# Assign constraints
fpg.mark_as_constraints([nd for nd in rcg.find_all_nodes(category='variable') if
'/normalized_data/sigmas' in nd], '<=', 1.09)
fpg.mark_as_constraint([nd for nd in rcg.find_all_nodes(category='variable') if
'/normalized_data/Theta' in nd][0], ['>=', '<='], [0.96, 1.04])
fpg.mark_as_constraints([nd for nd in rcg.find_all_nodes(category='variable') if
'/normalized_data/dpdx' in nd], '<=', 1.04)
fpg.mark_as_constraint([nd for nd in rcg.find_all_nodes(category='variable') if
'/normalized_data/propulsion/ESF' in nd][0], ['>=', '<='], [0.5, 1.5])
fpg.mark_as_constraints([nd for nd in rcg.find_all_nodes(category='variable') if
'/normalized_data/propulsion/DT' in nd], '<=', 0.0) # TODO: Check for two bounds.
fpg.mark_as_constraints([nd for nd in rcg.find_all_nodes(category='variable') if
'/normalized_data/propulsion/Temp' in nd], '<=', 1.02) # TODO: Check for two bounds.
# Search for problem roles
fpg.add_function_problem_roles()
# Create a DSM visualization of the FPG
fpg.create_dsm(file_name='FPG_{}'.format(architecture_type), function_order=function_order, include_system_vars=True,
destination_folder=pdf_dir)
# Create a VISTOMS visualization of the FPG (and add it to the existing directory)
fpg.vistoms_add(vistoms_dir, function_order=function_order)
# Save the FPG as kdms
fpg.save('FPG_{}'.format(architecture_type), destination_folder=kdms_dir)
# Save the FPG as cmdows (and do an integrity check)
fpg.save('FPG_{}'.format(architecture_type), file_type='cmdows', destination_folder=cmdows_dir,
description='FPG CMDOWS file of the super-sonic business jet test case optimization problem',
creator='Imco van Gent',
version='0.1',
pretty_print=True,
integrity=True)
for mdao_definition in mdao_definitions:
logging.info('Scripting {}...'.format(mdao_definition))
# Change the problem formulation of the FPG based on the MDAO definition
fpg.add_problem_formulation(mdao_definition, function_order,
doe_settings=None if mdao_definition is not 'BLISS-2000' else
{'doe_method': 'Latin hypercube design', 'doe_seed': 5, 'doe_runs': 50})
all_graphs.append(fpg)
# Get Mdao graphs
mdg, mpg = fpg.impose_mdao_architecture()
mdg.graph['name'] = 'XDSM - {}'.format(mdao_definition)
mdg.graph['description'] = 'Solution strategy to solve the super-sonic business jet test case optimization ' \
'problem using the strategy: {}.'.format(mdao_definition)
mpg.graph['name'] = 'XDSM - {}'.format(mdao_definition)
mpg.graph['description'] = 'Solution strategy to solve the super-sonic business jet test case optimization ' \
'problem using the strategy: {}.'.format(mdao_definition)
logging.info('Scripting {}...'.format(mdao_definition))
# Create a DSM visualization of the Mdao
mdg.create_dsm(file_name='Mdao_{}'.format(mdao_definition), include_system_vars=True, destination_folder=pdf_dir,
mpg=mpg)
# Create a VISTOMS visualization of the Mdao (and add it to the existing directory)
mdg.vistoms_add(vistoms_dir, mpg=mpg)
# Save the Mdao as kdms
mdg.save('Mdao_{}'.format(mdao_definition), destination_folder=kdms_dir, mpg=mpg)
# Save the Mdao as cmdows (and do an integrity check)
# TODO: Add integrity check and update writer+schema for distributed architectures
mdg.save('Mdao_{}'.format(mdao_definition), file_type='cmdows', destination_folder=cmdows_dir,
mpg=mpg,
description='Mdao CMDOWS file of the super-sonic business jet test case optimization problem',
creator='Imco van Gent',
version='0.1',
pretty_print=True,
integrity=True)
all_graphs.append((mdg,mpg))
logging.info('Done!')
if start_interactive_vistoms:
vistoms_start(all_graphs, file_dir='ssbj/VISTOMS_mdo_interactive')