From 1ae2605e7ca806fbfc3c4f1c09e7ccc60606e60b Mon Sep 17 00:00:00 2001 From: Su Tian Date: Sun, 26 Sep 2021 15:35:24 -0400 Subject: [PATCH] 0926 --- msgpi/csda.py | 27 ++++++++- msgpi/dakota/interface.py | 60 ++++++++++++++++++++ msgpi/design_analysis.py | 112 ++++++++++++++++++++++---------------- msgpi/ms/bda.py | 22 +++++++- 4 files changed, 170 insertions(+), 51 deletions(-) diff --git a/msgpi/csda.py b/msgpi/csda.py index fcce600..0acc426 100644 --- a/msgpi/csda.py +++ b/msgpi/csda.py @@ -2,6 +2,7 @@ from msgpi.design_analysis import DesignAnalysis import msgpi.sg.cross_section as mcs import msgpi.sg.exec as sga +import msgpi.utils.container as utcnt import dakota.interfacing as di @@ -9,8 +10,8 @@ class CrossSectionDesignAnalysis(DesignAnalysis): class_name = 'cs' - def __init__(self, name='', inputs={}, outputs={}, settings={}, prepros=[], postpros=[], analyses=[], logger=None): - DesignAnalysis.__init__(self, inputs, outputs, settings, prepros, postpros, analyses, logger) + def __init__(self, name='', inputs={}, outputs={}, settings={}, prepros=[], postpros=[], analyses=[], logger=None, parent=None): + DesignAnalysis.__init__(self, inputs, outputs, settings, prepros, postpros, analyses, logger, parent) # self.cs = cs # self.job_args = job_args @@ -33,6 +34,16 @@ def __init__(self, name='', inputs={}, outputs={}, settings={}, prepros=[], post def run(self): self.logger.info(f'running design analysis for {self.name}...') + # Pull and update data + # -------------------- + utcnt.updateDict(source=self.parent.settings, target=self.settings) + utcnt.updateDict(source=self.parent.inputs, target=self.inputs, ignore=self.parent.classes+self.parent.objects) + utcnt.updateDict(source=self.parent.inputs['cs'][self.name], target=self.inputs) + # self.updateDataAll(bld_all) + # self.updateDataAll(bld_data) + for data in self.extra_data: + self.updateDataAll(data) + # analysis = self.settings['analysis'] if platform.system() == 'Windows': @@ -91,3 +102,15 @@ def run(self): # ----------------- self.postprocess() + + # Push data back to parent + # ------------------------ + if not self.name in self.parent.inputs['cs'].keys(): + self.parent.inputs['cs'][self.name] = {} + utcnt.updateDict(source=self.inputs, target=self.parent.inputs['cs'][self.name]) + if not self.name in self.parent.outputs['cs'].keys(): + self.parent.outputs['cs'][self.name] = {} + utcnt.updateDict(source=self.outputs, target=self.parent.outputs['cs'][self.name]) + + + return diff --git a/msgpi/dakota/interface.py b/msgpi/dakota/interface.py index 1d58684..d1350f2 100644 --- a/msgpi/dakota/interface.py +++ b/msgpi/dakota/interface.py @@ -3,6 +3,8 @@ from typing import KeysView import msgpi.design_analysis as mda +import msgpi.ms.bda as mbda +import msgpi.csda as mcsda import msgpi.utils.logger as mlog import dakota.interfacing as di @@ -104,6 +106,10 @@ def initialize(self, fn_json_args): if not obj in self.objects: self.objects.append(obj) + if cls == 'cs': + if not obj in self.sg_names: + self.sg_names.append(obj) + # Logger initialization # --------------------- @@ -166,6 +172,60 @@ def writeOutput(self, status): + def analysis(self): + + for analysis in self.analyses: + + if analysis['class'] == 'blade': + try: + bld_all = analysis['all'] + except KeyError: + bld_all = {} + + for bld_name, bld_data in analysis.items(): + if bld_name in ['class', 'all']: + continue + else: + bda = mbda.BladeDesignAnalysis(bld_name, logger=self.logger, parent=self) + bda.addExtraData(bld_all) + bda.addExtraData(bld_data) + + # bda.summary('BLADE') + + bda.run() + + # bda.summary('BLADE') + + # dda.summary('DAKOTA') + + elif analysis['class'] == 'cs': + + try: + cs_all = analysis['all'] + except KeyError: + cs_all = {} + + for cs_name in self.sg_names: + try: + cs_data = analysis[cs_name] + except KeyError: + cs_data = {} + + csda = mcsda.CrossSectionDesignAnalysis(cs_name, logger=self.logger, parent=self) + csda.addExtraData(cs_all) + csda.addExtraData(cs_data) + + # csda.summary(f'CSDA {cs_name}') + + csda.run() + + return + + + + + + # ============== # LEGACY SCRIPTS # ============== diff --git a/msgpi/design_analysis.py b/msgpi/design_analysis.py index 4d6c127..4771d88 100644 --- a/msgpi/design_analysis.py +++ b/msgpi/design_analysis.py @@ -43,6 +43,8 @@ def __init__(self, inputs={}, outputs={}, settings={}, prepros=[], postpros=[], self.analyses = analyses + self.extra_data = [] + self.parent: DesignAnalysis = parent self.sg_names = [] self.sgs = {} @@ -71,6 +73,10 @@ def summary(self, title=''): print('\n----------') + def addExtraData(self, data): + self.extra_data.append(data) + + def updateData(self, inputs={}, outputs={}, settings={}, prepros=[], postpros=[], analyses=[]): self.inputs.update(inputs) @@ -83,8 +89,58 @@ def updateData(self, inputs={}, outputs={}, settings={}, prepros=[], postpros=[] return - # def updateData(self, to, data, ignore=[]): + def updateDataAll(self, data): + """ + data = { + 'inputs': {}, + 'outputs': {}, + 'settings': {}, + 'prepros': [], + 'postpros': [] + } + """ + try: + # self.inputs.update(data['inputs']) + inputs = data['inputs'] + except KeyError: + inputs = {} + + try: + # self.outputs.update(data['outputs']) + outputs = data['outputs'] + except KeyError: + outputs = {} + + try: + # self.settings.update(data['settings']) + settings = data['settings'] + except KeyError: + settings = {} + + try: + # self.prepros += data['prepros'] + prepros = data['prepros'] + except KeyError: + prepros = [] + + try: + # self.postpros += data['postpros'] + postpros = data['postpros'] + except KeyError: + postpros = [] + + try: + # self.analyses += data['analyses'] + analyses = data['analyses'] + except KeyError: + analyses = [] + + self.updateData(inputs, outputs, settings, prepros, postpros, analyses) + + def updateDataList(self, datalist=[]): + for data in datalist: + self.updateDataAll(data) def pullInputs(self, other_da, ignore_keywords=[]): @@ -113,9 +169,6 @@ def pullInputs(self, other_da, ignore_keywords=[]): # def pushData(self, source, target, depth=-1, ignore=[]): # assert (type(source).__name__ == type(target).__name__) - - - def pushInputs(self, other_da, structured=True): assert isinstance(other_da, DesignAnalysis) @@ -138,53 +191,16 @@ def pushOutputs(self, other_da, structured=True): other_da.outputs[k] = v - def updateDataAll(self, data): - """ - data = { - 'inputs': {}, - 'outputs': {}, - 'settings': {}, - 'prepros': [], - 'postpros': [] - } - """ - try: - # self.inputs.update(data['inputs']) - inputs = data['inputs'] - except KeyError: - inputs = {} + def pullInputsFromParent(self, ignore_keywords=[]): + ignore_keywords += self.parent.classes + ignore_keywords += self.parent.objects - try: - # self.outputs.update(data['outputs']) - outputs = data['outputs'] - except KeyError: - outputs = {} + utcnt.updateDict(self.parent.inputs, self.inputs, ignore_keywords) + utcnt.updateDict(self.parent.inputs[self.class_name], self.inputs, ignore_keywords) + utcnt.updateDict(self.parent.inputs[self.class_name][self.name], self.inputs, ignore_keywords) - try: - # self.settings.update(data['settings']) - settings = data['settings'] - except KeyError: - settings = {} - - try: - # self.prepros += data['prepros'] - prepros = data['prepros'] - except KeyError: - prepros = [] - - try: - # self.postpros += data['postpros'] - postpros = data['postpros'] - except KeyError: - postpros = [] - try: - # self.analyses += data['analyses'] - analyses = data['analyses'] - except KeyError: - analyses = [] - - self.updateData(inputs, outputs, settings, prepros, postpros, analyses) + # def pushOutputsToParent(self, ignore_keywords=[]): def initLogger(self): diff --git a/msgpi/ms/bda.py b/msgpi/ms/bda.py index e227229..a2e5c42 100644 --- a/msgpi/ms/bda.py +++ b/msgpi/ms/bda.py @@ -1,5 +1,6 @@ import msgpi.ms.blade as msb from msgpi.design_analysis import DesignAnalysis +import msgpi.utils.container as utcnt import dakota.interfacing as di @@ -24,6 +25,15 @@ def generateDesign(self): def run(self): self.logger.info(f'running design analysis for {self.name}...') + # Pull and update data + # -------------------- + self.updateData(settings=self.parent.settings) + self.pullInputs(self.parent, ignore_keywords=self.parent.classes+self.parent.objects) + # self.updateDataAll(bld_all) + # self.updateDataAll(bld_data) + for data in self.extra_data: + self.updateDataAll(data) + # Pre-process data # ---------------- self.preprocess() @@ -56,10 +66,20 @@ def run(self): self.sg_names.append(cs_name) - # Post-process data # ----------------- self.postprocess() + + # Push data back to parent + # ------------------------ + utcnt.updateDict(source=self.inputs, target=self.parent.inputs['blade'][self.name], ignore=['cs']) + utcnt.updateDict(source=self.inputs['cs'], target=self.parent.inputs['cs']) + # self.parent.sg_names = self.sg_names + for sg_name in self.sg_names: + if not sg_name in self.parent.sg_names: + self.parent.sg_names.append(sg_name) + + return