From 4ae36cc01677904665102466b3d3f36d10263676 Mon Sep 17 00:00:00 2001 From: Su Tian Date: Mon, 27 Sep 2021 17:40:06 -0400 Subject: [PATCH] 0927 --- msgpi/csda.py | 47 ++++++++++++++++++++++++--------------- msgpi/dakota/interface.py | 37 +++++++++++++++++++++--------- msgpi/design_analysis.py | 47 +++++++++++++++++++++++++++++++++------ msgpi/ms/bda.py | 9 ++++---- msgpi/sg/cross_section.py | 3 +++ 5 files changed, 104 insertions(+), 39 deletions(-) diff --git a/msgpi/csda.py b/msgpi/csda.py index 0acc426..06605f1 100644 --- a/msgpi/csda.py +++ b/msgpi/csda.py @@ -10,8 +10,8 @@ class CrossSectionDesignAnalysis(DesignAnalysis): class_name = 'cs' - 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) + def __init__(self, name='', inputs={}, outputs={}, settings={}, prepros=[], postpros=[], analyses=[], logger=None, parent=None, debug=None): + DesignAnalysis.__init__(self, inputs, outputs, settings, prepros, postpros, analyses, logger, parent, debug) # self.cs = cs # self.job_args = job_args @@ -27,6 +27,7 @@ def __init__(self, name='', inputs={}, outputs={}, settings={}, prepros=[], post self.settings['integrated'] = False self.settings['timeout'] = 30 self.settings['scrnout'] = False + self.settings['substitution'] = True self.cs = mcs.CrossSection(self.name) @@ -67,20 +68,21 @@ def run(self): # ---------------- self.preprocess() - # Substitute parameters - # --------------------- - try: - di.dprepro( - template=self.inputs['template'], - output=self.inputs['input_file'], - include=self.inputs - ) - except KeyError: - pass + if self.settings['substitution']: + # Substitute parameters + # --------------------- + try: + di.dprepro( + template=self.inputs['template'], + output=self.inputs['input_file'], + include=self.inputs + ) + except KeyError: + pass # Solve # ----- - self.cs.props = sga.solve( + results = sga.solve( self.inputs['input_file'], self.settings['analysis'], ppcmd, @@ -91,11 +93,20 @@ def run(self): logger=self.logger ) - # Extract beam properties - # ----------------------- - self.logger.debug('extracting beam properties...') - for n in self.outputs['beam_properties']: - self.outputs[n] = self.cs.props.get(n) + if self.settings['analysis'] == 0 or self.settings['analysis'] == 'h' or self.settings['analysis'] == '': + # Extract beam properties + # ----------------------- + self.cs.props = results + self.logger.debug('extracting beam properties...') + for n in self.outputs['beam_properties']: + self.outputs[n] = self.cs.props.get(n) + + elif self.settings['analysis'] == 3 or self.settings['analysis'] == 'fi': + # Initial failure indices and strength ratios + self.cs.fis = results[0] + self.cs.srs = results[1] + self.cs.sr = results[2] + self.outputs['sr'] = self.cs.sr # Post-process data diff --git a/msgpi/dakota/interface.py b/msgpi/dakota/interface.py index d1350f2..684e911 100644 --- a/msgpi/dakota/interface.py +++ b/msgpi/dakota/interface.py @@ -10,24 +10,22 @@ class DakotaDesignAnalysis(mda.DesignAnalysis): + + class_name = 'dakota' + def __init__(self): mda.DesignAnalysis.__init__(self) self.evid = 0 - self.inputs = {} self.outputs = { "interim": {}, "final": [] } - self.settings = {} self.interface_args = {} - self.analyses = [] self.classes = [] self.objects = [] self.log_prompt = '' - self.logger = None self.das = {} self.sgs = {} - self.sg_names = [] def initialize(self, fn_json_args): @@ -39,6 +37,11 @@ def initialize(self, fn_json_args): self.updateDataAll(self.interface_args) + try: + self.debug = self.settings['debug'] + except KeyError: + pass + # ------------------------------------------------------------ # FROM DAKOTA # ------------------------------------------------------------ @@ -186,15 +189,21 @@ def analysis(self): if bld_name in ['class', 'all']: continue else: - bda = mbda.BladeDesignAnalysis(bld_name, logger=self.logger, parent=self) + try: + bda = self.children[bld_name] + except KeyError: + bda = mbda.BladeDesignAnalysis(bld_name, logger=self.logger, parent=self, debug=self.debug) + bda.addExtraData(bld_all) bda.addExtraData(bld_data) - # bda.summary('BLADE') + # if self.settings['debug']: + # bda.summary('summary before run') bda.run() - # bda.summary('BLADE') + if self.settings['debug']: + bda.summary('summary after run') # dda.summary('DAKOTA') @@ -211,14 +220,22 @@ def analysis(self): except KeyError: cs_data = {} - csda = mcsda.CrossSectionDesignAnalysis(cs_name, logger=self.logger, parent=self) + try: + csda = self.children[cs_name] + except KeyError: + csda = mcsda.CrossSectionDesignAnalysis(cs_name, logger=self.logger, parent=self, debug=self.debug) + csda.addExtraData(cs_all) csda.addExtraData(cs_data) - # csda.summary(f'CSDA {cs_name}') + # if self.settings['debug']: + # csda.summary('summary before run') csda.run() + if self.settings['debug']: + csda.summary('summary after run') + return diff --git a/msgpi/design_analysis.py b/msgpi/design_analysis.py index 4771d88..2485299 100644 --- a/msgpi/design_analysis.py +++ b/msgpi/design_analysis.py @@ -11,7 +11,7 @@ class DesignAnalysis(metaclass=abc.ABCMeta): class_name = '' - def __init__(self, inputs={}, outputs={}, settings={}, prepros=[], postpros=[], analyses=[], logger=None, parent=None): + def __init__(self, inputs={}, outputs={}, settings={}, prepros=[], postpros=[], analyses=[], logger=None, parent=None, debug=False): # self.object = object self.name = '' self.design = None @@ -48,12 +48,18 @@ def __init__(self, inputs={}, outputs={}, settings={}, prepros=[], postpros=[], self.parent: DesignAnalysis = parent self.sg_names = [] self.sgs = {} + self.children = {} + self.debug = debug - def summary(self, title=''): + + def summary(self, title='SUMARY'): pp = pprint.PrettyPrinter(indent=1, width=-1) - print('\n', title) - print('----------') + print() + print('========================================') + print(title) + print(self.class_name, ':', self.name) + print('----------------------------------------') print('settings') pp.pprint(self.settings) print('\ninputs') @@ -66,11 +72,16 @@ def summary(self, title=''): pp.pprint(self.postpros) print('\nsg names') pp.pprint(self.sg_names) + print('\nchildren') + pp.pprint(self.children) + print('\nparent:') + print(self.parent) # print('\nanalyses') # for da in self.analyses: # if isinstance(da, DesignAnalysis): # da.summary() - print('\n----------') + print('========================================') + print() def addExtraData(self, data): @@ -82,8 +93,30 @@ def updateData(self, inputs={}, outputs={}, settings={}, prepros=[], postpros=[] self.inputs.update(inputs) self.outputs.update(outputs) self.settings.update(settings) - self.prepros += prepros - self.postpros += postpros + # self.prepros += prepros + for new_pp in prepros: + found_old = False + for old_pp in self.prepros: + if old_pp['function'] == new_pp['function']: + found_old = True + break + if found_old: + old_pp.update(new_pp) + else: + self.prepros.append(new_pp) + + # self.postpros += postpros + for new_pp in postpros: + found_old = False + for old_pp in self.postpros: + if old_pp['function'] == new_pp['function']: + found_old = True + break + if found_old: + old_pp.update(new_pp) + else: + self.postpros.append(new_pp) + self.analyses += analyses return diff --git a/msgpi/ms/bda.py b/msgpi/ms/bda.py index a2e5c42..ed8ce28 100644 --- a/msgpi/ms/bda.py +++ b/msgpi/ms/bda.py @@ -8,15 +8,13 @@ class BladeDesignAnalysis(DesignAnalysis): class_name = 'blade' - 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) + def __init__(self, name='', inputs={}, outputs={}, settings={}, prepros=[], postpros=[], analyses=[], logger=None, parent=None, debug=False): + DesignAnalysis.__init__(self, inputs, outputs, settings, prepros, postpros, analyses, logger, parent=parent, debug=debug) self.name = name self.blade = None - self.sg_names = [] - def generateDesign(self): return @@ -38,6 +36,9 @@ def run(self): # ---------------- self.preprocess() + if self.debug: + self.summary() + # Substitute parameters # --------------------- try: diff --git a/msgpi/sg/cross_section.py b/msgpi/sg/cross_section.py index a85d0dd..cede529 100644 --- a/msgpi/sg/cross_section.py +++ b/msgpi/sg/cross_section.py @@ -86,6 +86,9 @@ def __init__(self, name): self.sg = None #: :obj:`msgpi.sg.StructureGene`: Structure gene self.props = None #: :obj:`msgpi.sg.BeamProperty`: Beam property + self.fis = None #: float: Element failure indices + self.srs = None #: float: Element strength ratios + self.sr = None #: float: Sectional strength ratio # Design self.params = {}