diff --git a/msgpi/csda.py b/msgpi/csda.py index 73207a9..629d815 100644 --- a/msgpi/csda.py +++ b/msgpi/csda.py @@ -1,17 +1,19 @@ import platform from msgpi.design_analysis import DesignAnalysis import msgpi.sg.cross_section as mcs -import msgpi.analysis as sga +import msgpi.sg.exec as sga import dakota.interfacing as di class CrossSectionDesignAnalysis(DesignAnalysis): - def __init__(self, cs: mcs.CrossSection, inputs={}, outputs={}, prepros=[], postpros=[], config={}, logger=None): - DesignAnalysis.__init__(self, cs, inputs, outputs, config, prepros, postpros, logger) + def __init__(self, name='', inputs={}, outputs={}, settings={}, prepros=[], postpros=[], analyses=[], logger=None): + DesignAnalysis.__init__(self, inputs, outputs, settings, prepros, postpros, analyses, logger) # self.cs = cs # self.job_args = job_args + self.name = name + # if logger is None: # self.logger = mlog.initLogger(__name__) # else: @@ -19,30 +21,33 @@ def __init__(self, cs: mcs.CrossSection, inputs={}, outputs={}, prepros=[], post # self.inputs = inputs # self.outputs = {} + self.settings['integrated'] = False + self.settings['timeout'] = 30 + self.settings['scrnout'] = False - + self.cs = mcs.CrossSection(self.name) def run(self): - self.logger.info(f'running design analysis for {self.cs.name}...') + self.logger.info(f'running design analysis for {self.name}...') - analysis = self.config['analysis'] + # analysis = self.settings['analysis'] if platform.system() == 'Windows': - ppcmd = self.config['prevabs_cmd_win'] + ppcmd = self.settings['prevabs_cmd_win'] elif platform.system() == 'Linux': - ppcmd = self.config['prevabs_cmd_linux'] + ppcmd = self.settings['prevabs_cmd_linux'] - solver = self.config['solver'] - integrated = False - if 'integrated' in self.config.keys(): - integrated = self.config['integrated'] - timeout = 30 - if 'timeout' in self.config.keys(): - timeout = self.config['timeout'] - scrnout = False - if 'scrnout' in self.config.keys(): - scrnout = self.config['scrnout'] + # solver = self.settings['solver'] + # integrated = False + # if 'integrated' in self.settings.keys(): + # integrated = self.settings['integrated'] + # timeout = 30 + # if 'timeout' in self.settings.keys(): + # timeout = self.settings['timeout'] + # scrnout = False + # if 'scrnout' in self.settings.keys(): + # scrnout = self.settings['scrnout'] # Pre-process data @@ -51,25 +56,33 @@ def run(self): # Substitute parameters # --------------------- - if self.sg.fn_design_xml == '': - self.sg.fn_design_xml = self.sg.name + '.xml' + try: di.dprepro( - template=self.sg.fn_design_tmp, output=self.sg.fn_design_xml, + template=self.inputs['template'], + output=self.inputs['input_file'], include=self.inputs ) + except KeyError: + pass # Solve # ----- - self.sg.props = sga.solve( - self.sg.fn_design_xml, analysis, ppcmd, solver, integrated, - timeout=timeout, scrnout=scrnout, logger=self.logger + self.cs.props = sga.solve( + self.inputs['input_file'], + self.settings['analysis'], + ppcmd, + self.settings['solver'], + self.settings['integrated'], + timeout=self.settings['timeout'], + scrnout=self.settings['scrnout'], + logger=self.logger ) # Extract beam properties # ----------------------- self.logger.debug('extracting beam properties...') - for n in self.job_args['beam_properties']: - self.outputs[n] = self.sg.props.get(n) + for n in self.outputs['beam_properties']: + self.outputs[n] = self.cs.props.get(n) # Post-process data diff --git a/msgpi/design_analysis.py b/msgpi/design_analysis.py index 48b5357..5c5aff6 100644 --- a/msgpi/design_analysis.py +++ b/msgpi/design_analysis.py @@ -1,14 +1,18 @@ import abc +import pprint import platform -import msgpi.cross_section as mcs -import msgpi.logger as mlog +import msgpi.sg.cross_section as mcs +import msgpi.utils.logger as mlog import dakota.interfacing as di class DesignAnalysis(metaclass=abc.ABCMeta): - def __init__(self, object=None, inputs={}, outputs={}, settings={}, prepros=[], postpros=[], analyses=[], logger=None): - self.object = object + def __init__(self, inputs={}, outputs={}, settings={}, prepros=[], postpros=[], analyses=[], logger=None): + # self.object = object + self.design = None + self.model = None + self.settings = settings self.inputs = inputs @@ -36,45 +40,86 @@ def __init__(self, object=None, inputs={}, outputs={}, settings={}, prepros=[], self.analyses = analyses - def updateData(self, data): + def summary(self, title=''): + pp = pprint.PrettyPrinter() + print('\n', title) + print('----------') + print('settings') + pp.pprint(self.settings) + print('\ninputs') + pp.pprint(self.inputs) + print('\noutputs') + pp.pprint(self.outputs) + print('\nprepros') + pp.pprint(self.prepros) + print('\npostpros') + pp.pprint(self.postpros) + print('\nanalyses') + for da in self.analyses: + if isinstance(da, DesignAnalysis): + da.summary() + print('\n----------') + + + def updateData(self, inputs={}, outputs={}, settings={}, prepros=[], postpros=[], analyses=[]): + + self.inputs.update(inputs) + self.outputs.update(outputs) + self.settings.update(settings) + self.prepros += prepros + self.postpros += postpros + self.analyses += analyses + + return + + + def updateDataAll(self, data): """ data = { 'inputs': {}, 'outputs': {}, 'settings': {}, - 'preprocessors': [], - 'postprocessors': [] + 'prepros': [], + 'postpros': [] } """ try: - self.inputs.update(data['inputs']) + # self.inputs.update(data['inputs']) + inputs = data['inputs'] except KeyError: - pass + inputs = {} try: - self.outputs.update(data['outputs']) + # self.outputs.update(data['outputs']) + outputs = data['outputs'] except KeyError: - pass + outputs = {} try: - self.settings.update(data['settings']) + # self.settings.update(data['settings']) + settings = data['settings'] except KeyError: - pass + settings = {} try: - self.prepros += data['preprocessors'] + # self.prepros += data['prepros'] + prepros = data['prepros'] except KeyError: - pass + prepros = [] try: - self.postpros += data['postprocessors'] + # self.postpros += data['postpros'] + postpros = data['postpros'] except KeyError: - pass + postpros = [] try: - self.analyses += data['analyses'] + # self.analyses += data['analyses'] + analyses = data['analyses'] except KeyError: - pass + analyses = [] + + self.updateData(inputs, outputs, settings, prepros, postpros, analyses) def initLogger(self): @@ -102,9 +147,9 @@ def initLogger(self): ) - @abc.abstractmethod - def analyze(self): - pass + # @abc.abstractmethod + # def analyze(self): + # pass def preprocess(self): @@ -122,7 +167,9 @@ def preprocess(self): except KeyError: kwargs = {} - func(self.object, self.inputs, self.outputs, self.settings, self.logger, *args, **kwargs) + module_name = self.settings['data_process_functions_file'] + exec(f'from {module_name} import {func}') + eval(f'{func}')(self.inputs, self.outputs, self.logger, *args, **kwargs) def postprocess(self): @@ -140,7 +187,9 @@ def postprocess(self): except KeyError: kwargs = {} - func(self.object, self.inputs, self.outputs, self.settings, self.logger, *args, **kwargs) + module_name = self.settings['data_process_functions_file'] + exec(f'from {module_name} import {func}') + eval(f'{func}')(self.inputs, self.outputs, self.logger, *args, **kwargs) def run(self):