From 6949dcab2625629a1ca6279f07558fa715f831d5 Mon Sep 17 00:00:00 2001 From: Su Tian Date: Sun, 4 Apr 2021 15:08:36 -0400 Subject: [PATCH] 0404 --- msgpi/ms/beam.py | 48 +++++- msgpi/ms/prebeam.py | 129 ++++++++++++++- msgpi/utils.py | 40 +++++ tests/test_prebeam/data_proc_funcs.py | 186 ++++++++++++++++++++++ tests/test_prebeam/interface_args.json | 63 ++++++++ tests/test_prebeam/params.in | 63 ++++++++ tests/test_prebeam/test_prebeam_2.py | 76 +++++++++ tests/test_prebeam/uh60a_blade.xml | 193 ++++++++++++++++++++++ tests/test_prebeam/uh60a_box.xml.tmp | 212 +++++++++++++++++++++++++ tests/test_prebeam/uh60a_box_2.xml.tmp | 212 +++++++++++++++++++++++++ tests/test_prebeam/uh60a_seg1_cs0.xml | 212 +++++++++++++++++++++++++ tests/test_prebeam/uh60a_seg1_cs1.xml | 212 +++++++++++++++++++++++++ tests/test_prebeam/uh60a_seg2_cs0.xml | 212 +++++++++++++++++++++++++ tests/test_prebeam/uh60a_seg2_cs1.xml | 212 +++++++++++++++++++++++++ 14 files changed, 2064 insertions(+), 6 deletions(-) create mode 100644 tests/test_prebeam/data_proc_funcs.py create mode 100644 tests/test_prebeam/interface_args.json create mode 100644 tests/test_prebeam/params.in create mode 100644 tests/test_prebeam/test_prebeam_2.py create mode 100644 tests/test_prebeam/uh60a_blade.xml create mode 100644 tests/test_prebeam/uh60a_box.xml.tmp create mode 100644 tests/test_prebeam/uh60a_box_2.xml.tmp create mode 100644 tests/test_prebeam/uh60a_seg1_cs0.xml create mode 100644 tests/test_prebeam/uh60a_seg1_cs1.xml create mode 100644 tests/test_prebeam/uh60a_seg2_cs0.xml create mode 100644 tests/test_prebeam/uh60a_seg2_cs1.xml diff --git a/msgpi/ms/beam.py b/msgpi/ms/beam.py index b2e2ab6..83dfb29 100644 --- a/msgpi/ms/beam.py +++ b/msgpi/ms/beam.py @@ -1,6 +1,8 @@ import numpy as np import msgpi.sg as sgi -import msgpi.io.utils as utl +import msgpi.io.utils as ioutil +import msgpi.utils as utils +import pprint class BeamSegment(object): @@ -18,6 +20,8 @@ def __init__(self): #: `[starting, ending]` self.css = [] + self.cs_template = [] + #: float: Rotation around a1. self.rotate_a1 = 0.0 #: float: Twist. @@ -34,6 +38,15 @@ def __init__(self): #: int: Number of division of the segment. self.num_divisions = 1 + self.cs_parameters = {} #: Parameter distributions + + def summary(self): + print(' points:', self.points) + print(' coords:', self.coords) + print(' cs names:', self.css) + print(' cs templates:', self.cs_template) + print(' cs parameters:', self.cs_parameters) + def calcLengthSq(self): """Calculate the square of the segment length. @@ -96,9 +109,34 @@ def __init__(self): self.timefunctions = [] #: Time functions self.initcurvatures = [] #: Initial curvatures + self.functions = {} #: Functions + self.distributions = {} #: Distributions + # Results # self.results = None #: Results of GEBT analysis + + def summary(self): + pp = pprint.PrettyPrinter(indent=1, width=80) + + print('\nPoints') + pp.pprint(self.points) + + print('\nDistributions') + pp.pprint(self.distributions) + + print('\nFunctions') + # pp.pprint(self.functions) + for k, v in self.functions.items(): + print(k, ':', v) + + print('\nSegments') + for k, v in self.segments.items(): + print('segment', k) + v.summary() + + + def echo(self): """Print the beam data. """ @@ -179,7 +217,7 @@ def writeGmshMsh(self): # Reference line for i, st in enumerate(self.stations): fout.write('{0:8d}'.format(i+1)) - utl.writeFormatFloats(fout, np.array(st['coordinates'])) + ioutil.writeFormatFloats(fout, np.array(st['coordinates'])) # Cross sections nnodes = len(self.stations) for st in self.stations: @@ -187,7 +225,7 @@ def writeGmshMsh(self): cs = st['cross_section'] for nid, coords in cs.nodes.items(): fout.write('{0:8d}'.format(nid+nnodes)) - utl.writeFormatFloats(fout, np.array(coords)+loc) + ioutil.writeFormatFloats(fout, np.array(coords)+loc) nnodes += cs.num_nodes fout.write('$EndNodes\n') fout.write('\n') @@ -198,7 +236,7 @@ def writeGmshMsh(self): # Reference line for i in range(len(self.stations) - 1): line = [i+1, 1, 2, 1, 1, i+1, i+2] - utl.writeFormatIntegers(fout, line) + ioutil.writeFormatIntegers(fout, line) # Cross sections nnodes = len(self.stations) nelems = len(self.stations) - 1 @@ -207,7 +245,7 @@ def writeGmshMsh(self): for eid, nodes in cs.elements.items(): line = np.array([eid+nelems, 2, 2, 1, 1]) line = np.concatenate([line, np.array(nodes)+nnodes]) - utl.writeFormatIntegers(fout, line) + ioutil.writeFormatIntegers(fout, line) nnodes += cs.num_nodes nelems += cs.num_elements fout.write('$EndElements\n') diff --git a/msgpi/ms/prebeam.py b/msgpi/ms/prebeam.py index b2560cb..2cbb7cd 100644 --- a/msgpi/ms/prebeam.py +++ b/msgpi/ms/prebeam.py @@ -4,7 +4,7 @@ import msgpi.ms.beam as msb import msgpi.sg as sgi import msgpi.cross_section as sgcs -import msgpi.utils as utl +import msgpi.utils as utils def preBeam(fn_beam, mode=1, sections=[]): @@ -477,3 +477,130 @@ def preBeam(fn_beam, mode=1, sections=[]): # self.divisions.append(int(np.ceil(dx1 / ms))) return beam + + + + + + + + + +def preBeam2(fn_beam): + + beam = msb.Beam() + + with open(fn_beam, 'r') as fo: + tree = et.parse(fo) + xr_beam = tree.getroot() + + # Read design + xe_design = xr_beam.find('design') + + + + + # Read points + # pn2l = {} # point name to label dictionary + # plabel = 0 + xe_points = xe_design.find('points') + for xe_point in xe_points.findall('point'): + # plabel += 1 + pname = xe_point.get('name') + pcoord = list(map(float, xe_point.text.strip().split())) + # pn2l[pname] = plabel + # beam.points[plabel] = pcoord + beam.points[pname] = pcoord + + + + + # Read functions + xe_functions = xr_beam.find('functions') + for xe_function in xe_functions.findall('function'): + fname = xe_function.get('name') + ftype = xe_function.get('type', default='polynomial') + fpointsx = [] + fpointsy = [] + + xe_coeffs = xe_function.find('coefficients') + if xe_coeffs is not None: + # print(xe_coeffs.text) + fcoeffs = list(map(float, xe_coeffs.text.strip().split())) + xe_points = xe_function.find('points') + if xe_points is not None: + for xe_point in xe_points.findall('point'): + x, y = list(map(float, xe_point.text.strip().split())) + fpointsx.append(x) + fpointsy.append(y) + + beam.functions[fname] = utils.PolynomialFunction( + coefficients=fcoeffs, x=fpointsx, y=fpointsy + ) + + + + + # Read distributions + xe_distributions = xe_design.find('distributions') + for xe_distribution in xe_distributions.findall('distribution'): + # distr_type = xe_distribution.get('type', default='function') + param_name = xe_distribution.find('parameter').text + + func_name = xe_distribution.find('function').text + m = 1.0 + if xe_distribution.find('multiplier'): + m = float(xe_distribution.find('multiplier').text) + beam.distributions[param_name] = [func_name, m] + + + + + # Read segments + xe_segments = xe_design.find('segments') + bslabel = 0 + for xe_sgm in xe_segments.findall('segment'): + bslabel += 1 + bs = msb.BeamSegment() + + # Beginning station + xe_start = xe_sgm.find('begin') + pn = xe_start.find('location').text.strip() + # bs.points.append(pn2l[pn]) + bs.points.append(pn) + # pc = beam.findPtCoordByName(pn2l[pn]) + pc = beam.findPtCoordByName(pn) + bs.coords.append(pc) + xe_cs = xe_start.find('cross_section') + fn_cs_template = xe_cs.get('template') + cs_name = xe_cs.text.strip() + # fn_cs = cs_name + '.xml' + bs.cs_template.append(fn_cs_template) + bs.css.append(cs_name) + + # Ending station + xe_stop = xe_sgm.find('end') + pn = xe_stop.find('location').text.strip() + # bs.points.append(pn2l[pn]) + bs.points.append(pn) + # pc = beam.findPtCoordByName(pn2l[pn]) + pc = beam.findPtCoordByName(pn) + bs.coords.append(pc) + xe_cs = xe_stop.find('cross_section') + fn_cs_template = xe_cs.get('template') + cs_name = xe_cs.text.strip() + # fn_cs = cs_name + '.xml' + bs.cs_template.append(fn_cs_template) + bs.css.append(cs_name) + + # Cross-section parameters + for xe_param in xe_sgm.findall('parameter'): + name = xe_param.find('name').text.strip() + value = float(xe_param.find('value').text.strip()) + bs.cs_parameters[name] = value + + + beam.segments[bslabel] = bs + + + return beam diff --git a/msgpi/utils.py b/msgpi/utils.py index 99c4099..b49cf4e 100644 --- a/msgpi/utils.py +++ b/msgpi/utils.py @@ -336,3 +336,43 @@ def __call__(self, x): basis = np.asarray(basis) return np.dot(self.coeffs, basis) + + + + + + + + + +class PolynomialFunction(object): + def __init__(self, coefficients=[], x=[], y=[]): + self.coefficients = coefficients + self.points = {} + if len(x) > 0: + # points = np.asarray(points) + ndof = len(x) + A = np.zeros((ndof, ndof)) + for i in range(ndof): + self.points[x[i]] = y[i] + for j in range(ndof): + A[i, j] = x[i]**j + # print(A) + self.coefficients = np.linalg.solve(A, y) + # print(self.coefficients) + + def __call__(self, x): + f = 0.0 + if x in self.points.keys(): + f = self.points[x] + else: + for i, c in enumerate(self.coefficients): + f += c * x**i + return f + + def __str__(self): + terms = [] + for i, c in enumerate(self.coefficients): + terms.append(f'({c})*x^{i}') + + return ' + '.join(terms) diff --git a/tests/test_prebeam/data_proc_funcs.py b/tests/test_prebeam/data_proc_funcs.py new file mode 100644 index 0000000..b1f1a12 --- /dev/null +++ b/tests/test_prebeam/data_proc_funcs.py @@ -0,0 +1,186 @@ +import numpy as np +import pprint + + +# Pre-processing + +def materialId2Name(dakota_params, interim_params): + mdb = { + 1: 'AS4 12k/E7K8_0.0054', + 2: 'T650-35 3k 976_fabric_0.0062', + 3: 'T650-35 12k/976_0.0052', + 4: 'E-Glass 7781/EA 9396_0.0083', + } + interim_params['mn_spar_1'] = mdb[dakota_params['mi_spar_1']] + interim_params['mn_spar_2'] = mdb[dakota_params['mi_spar_2']] + interim_params['mn_spar_3'] = mdb[dakota_params['mi_spar_3']] + interim_params['mn_spar_4'] = mdb[dakota_params['mi_spar_4']] + interim_params['mn_le'] = mdb[dakota_params['mi_le']] + interim_params['mn_te'] = mdb[dakota_params['mi_te']] + + return + + +def preProcessGeo(dakota_params, interim_params): + # Calculate the location of the trailing web + # params['wt_x2'] = params['wl_x2'] + (-1 - params['wl_x2']) * params['wt_x2_r'] + + # Calculate the radius of the non-structural mass + # params['nsmr'] = 0 - params['pnsmc_x2'] * params['nsmr_r'] + + # Calculate embedded points + interim_params['pfle1_x2'] = interim_params['pnsmc_x2'] - dakota_params['nsmr'] - 0.005 + interim_params['pfle2_x2'] = interim_params['wl_x2'] + 0.005 + interim_params['pfte1_x2'] = interim_params['wt_x2'] - 0.01 + + return + + +def calcLayupEndLocation(dakota_params, interim_params): + interim_params['le_bottom_begin_1'] = 1 - dakota_params['le_top_end_1'] + interim_params['le_bottom_begin_2'] = 1 - dakota_params['le_top_end_2'] + interim_params['le_bottom_begin_3'] = 1 - dakota_params['le_top_end_3'] + interim_params['le_bottom_begin_4'] = 1 - dakota_params['le_top_end_4'] + interim_params['te_bottom_begin_1'] = 1 - dakota_params['te_top_end_1'] + interim_params['te_bottom_begin_2'] = 1 - dakota_params['te_top_end_2'] + interim_params['te_bottom_begin_3'] = 1 - dakota_params['te_top_end_3'] + interim_params['te_bottom_begin_4'] = 1 - dakota_params['te_top_end_4'] + + + + + + + + + + + + + + + + + + + +# Post-processing + +def postProcess( + dakota_params, dakota_results, + interim_params, interim_results, interface_args, *args, **kwargs): + + pprt = pprint.PrettyPrinter(indent=4) + + bp_targets_all = interface_args['beam_properties_targets'] + + diffs = np.zeros(len(interim_params['cs_names'])) + for i, cs_name in enumerate(interim_params['cs_names']): + cs_params = interim_params[cs_name] + cs_results = interim_results[cs_name] + + r = cs_params['r'] + + diff = [] + pps = np.array(bp_targets_all[str(r)]) + for pp in pps: + fn = pp[0] # function name + rn = pp[1] # response name + # print(rn) + args = pp[1:] + if fn == 'self': + r = cs_results[args[1]] + else: + r = eval(fn)( + dakota_params, cs_params, cs_results, interim_results, interface_args, *args + ) + diff.append(r) + dakota_results[rn].function = r + + # print('\ndiff') + # pprt.pprint(diff) + # print('\n') + + # Infinity (maximum) norm + diffs[i] = np.linalg.norm(diff, ord=np.inf) + + + + # target_nd = np.ones(len(bp_names)) + + # analysis = np.zeros(len(bp_names)) + # for j, bpn in enumerate(bp_names): + # analysis[j] = cs_results[bpn] + + # diff = target_nd - analysis / target + + # for j, bpn in enumerate(bp_names): + # dakota_results[f'{bpn}_diff_{response_name_suffix[i]}'].function = diff[j] + + + + dakota_results['dist'].function = np.linalg.norm(diffs, ord=np.inf) + + + return + + +def calcOffsetLE(json_args, params, bps, inter, *args, **kwargs): + response_name = args[0] + bp_name = args[1] + rv = bps[bp_name] + xo2_le = params['chord'] * params['oa2'] + if response_name == 'sc2_le': + rv = xo2_le - bps['xo2'] + # rv = json_args['xo2_le'] - bps['xo2'] + bps['sc2_le'] = rv + elif response_name == 'mc2_le': + rv += bps['sc2_le'] + + return rv + + +def calcL2Norm(json_args, params, bps, inter, *args, **kwargs): + # print(inter) + response_name = args[0] + # rv = np.max(list(inter.values())) + v = list(inter.values()) + rv = np.linalg.norm(v) + # diff = [] + # for v, t in zip(values, targets): + # diff.append(np.abs((v - t) / t)) + # return np.max(diff) + inter[response_name] = rv + return rv + + +def calcRelDiff(dakota_params, cs_params, bps, inter, json_args, *args, **kwargs): + # print(args) + response_name = args[0] + bp_name = args[1] + target = args[2] + + value = bps[bp_name] + xo2_le = cs_params['chord'] * dakota_params['oa2'] + + if 'sc2_le_diff' in response_name: + value = xo2_le - bps['xo2'] + # value = json_args['xo2_le'] - bps['xo2'] + bps['sc2_le'] = value + elif 'mc2_le_diff' in response_name: + value += bps['sc2_le'] + target += args[3] + + # print(f'value = {value}') + # print(f'target = {target}') + rv = (value - target) / target + # print(f'diff = {rv}') + + inter[response_name] = rv + + return rv + + +def calcWebsDist(json_args, params, bps, inter, *args, **kwargs): + + return params['wl_x2'] - params['wt_x2'] diff --git a/tests/test_prebeam/interface_args.json b/tests/test_prebeam/interface_args.json new file mode 100644 index 0000000..19c9da2 --- /dev/null +++ b/tests/test_prebeam/interface_args.json @@ -0,0 +1,63 @@ +{ + "template_output": { + "uh60a_blade.xml.tmp": "uh60a_blade.xml" + }, + "fn_main": "uh60a_blade.xml", + "data_process_functions_file": "data_proc_funcs", + + + "prevabs_cmd_win": "prevabs1.3.0.exe", + "prevabs_cmd_linux": "prevabs1.3.0", + "solver": "vabs", + "analysis": "h", + "timeout": 10, + "scrnout": false, + + + "pre_process": { + "blade": [], + "cs": [ + "materialId2Name", + "preProcessGeo" + ] + }, + "post_process": [ + "postProcess" + ], + + + "ref_center": "sc", + "beam_properties": ["mpl", "ear", "gjr", "ei2r", "ei3r", "sc2", "mc2"], + "beam_properties_targets": { + "0.3": [ + ["calcRelDiff", "gj_diff_03", "gjr", 24.31e6], + ["calcRelDiff", "ei2_diff_03", "ei2r", 22.2e6], + ["calcRelDiff", "ei3_diff_03", "ei3r", 835e6], + ["calcRelDiff", "sc2_le_diff_03", "sc2", -5.19], + ["calcRelDiff", "mc2_le_diff_03", "mc2", -0.822, -5.19], + ["self", "mpl_03", "mpl"], + ["self", "ea_03", "ear"] + ], + "0.8": [ + ["calcRelDiff", "gj_diff_08", "gjr", 24.66e6], + ["calcRelDiff", "ei2_diff_08", "ei2r", 23.5e6], + ["calcRelDiff", "ei3_diff_08", "ei3r", 698e6], + ["calcRelDiff", "sc2_le_diff_08", "sc2", -5.8], + ["calcRelDiff", "mc2_le_diff_08", "mc2", 0.306, -5.8], + ["self", "mpl_08", "mpl"], + ["self", "ea_08", "ear"] + ] + }, + + + "_fail_replace": { + "dist": "inf", + "mpl": -1.0, + "ea": -1.0, + "gj_diff": -1.0, + "ei2_diff": -1.0, + "ei3_diff": -1.0, + "sc2_le_diff": -1.0, + "mc2_le_diff": -1.0 + } +} diff --git a/tests/test_prebeam/params.in b/tests/test_prebeam/params.in new file mode 100644 index 0000000..a59693c --- /dev/null +++ b/tests/test_prebeam/params.in @@ -0,0 +1,63 @@ + 36 variables + -1.896481215857418e-01 wl_x2_03 + -4.785393841364788e-01 wt_x2_03 + -3.113437299722282e-02 pnsmc_x2_03 + 3.303903317361980e-03 nsmr + -1.454969939268166e-01 wl_x2_08 + -4.140354625080111e-01 wt_x2_08 + -2.184789574877163e-02 pnsmc_x2_08 + 1 mi_spar_1 + 4 mi_le + 1 mi_te + 3 mi_spar_2 + 1 mi_spar_3 + 4 mi_spar_4 + 12 np_spar_1 + 4 np_le + 18 np_te + 16 np_spar_2 + 6 np_spar_3 + 10 np_spar_4 + 45 ff1_a0 + -14 ff5_a0 + -59 ff6_a0 + -44 fo_spar_2_03 + 25 fo_spar_2_08 + -45 fo_spar_3_03 + 25 fo_spar_3_08 + 41 fo_spar_4_03 + -10 fo_spar_4_08 + 2.076000000000000e+01 chord_03 + 2.232000000000000e+01 chord_08 + -2.500000000000000e-01 oa2 + 0.000000000000000e+00 oa3 + 5.000000000000000e-02 mesh_size + 3.000000000000000e-01 mesh_size_fill + 0.000000000000000e+00 pnsmc_x3 + -9.000000000000000e-01 pfte2_x2 + 15 functions + 1 ASV_1:dist + 1 ASV_2:mpl_03 + 1 ASV_3:ea_03 + 1 ASV_4:gj_diff_03 + 1 ASV_5:ei2_diff_03 + 1 ASV_6:ei3_diff_03 + 1 ASV_7:sc2_le_diff_03 + 1 ASV_8:mc2_le_diff_03 + 1 ASV_9:mpl_08 + 1 ASV_10:ea_08 + 1 ASV_11:gj_diff_08 + 1 ASV_12:ei2_diff_08 + 1 ASV_13:ei3_diff_08 + 1 ASV_14:sc2_le_diff_08 + 1 ASV_15:mc2_le_diff_08 + 7 derivative_variables + 1 DVV_1:wl_x2_03 + 2 DVV_2:wt_x2_03 + 3 DVV_3:pnsmc_x2_03 + 4 DVV_4:nsmr + 5 DVV_5:wl_x2_08 + 6 DVV_6:wt_x2_08 + 7 DVV_7:pnsmc_x2_08 + 0 analysis_components + 1 eval_id diff --git a/tests/test_prebeam/test_prebeam_2.py b/tests/test_prebeam/test_prebeam_2.py new file mode 100644 index 0000000..e6b9cbb --- /dev/null +++ b/tests/test_prebeam/test_prebeam_2.py @@ -0,0 +1,76 @@ +import copy +import json +import pprint +import msgpi.ms.prebeam as prebeam +import dakota.interfacing as di + +pprt = pprint.PrettyPrinter(indent=2) + +dakota_params, dakota_results = di.read_parameters_file( + 'params.in', 'results.out') +interim_params = {} + +fn_json_args = 'interface_args.json' +with open(fn_json_args, 'r') as fo: + interface_args = json.load(fo) + +# Load data processing module +if 'data_process_functions_file' in interface_args.keys(): + fn_dpf = interface_args['data_process_functions_file'] + if fn_dpf != '': + import_str = f'import {fn_dpf} as dpf' + exec(import_str) + +fn_beam = 'uh60a_blade.xml' + +beam = prebeam.preBeam2(fn_beam) + +beam.summary() + +ls_cs_name = [] +params_temp = copy.deepcopy(interim_params) +for k, bs in beam.segments.items(): + for i, cs in enumerate(bs.css): + ls_cs_name.append(cs) + + # 1. Copy all parameter in the interim_params + cs_params = copy.deepcopy(params_temp) + cs_params['r'] = bs.coords[i][0] + cs_params['fn_cs_temp'] = bs.cs_template[i] + cs_params['fn_cs_main'] = cs + '.xml' + + # 2. Add parameters calculated from distribution functions + for param, func in beam.distributions.items(): + fn = func[0] + cs_params[param] = beam.functions[fn](cs_params['r']) + # print(k, dakota_params_cs[k]) + + for param, value in bs.cs_parameters.items(): + cs_params[param] = value + + interim_params[cs] = cs_params + +interim_params['cs_names'] = ls_cs_name + +print('\ninterim_params') +pprt.pprint(interim_params) + + +for cs_name in ls_cs_name: + print(f' - {cs_name}') + + cs_params = interim_params[cs_name] + + cs_results = {} + if 'pre_process' in interface_args.keys(): + funcs = interface_args['pre_process']['cs'] + if len(funcs) > 0: + for func in funcs: + eval(f'dpf.{func}')(dakota_params, cs_params) + + + # Substitute parameters + di.dprepro( + template=cs_params['fn_cs_temp'], output=cs_params['fn_cs_main'], + parameters=dakota_params, include=cs_params + ) diff --git a/tests/test_prebeam/uh60a_blade.xml b/tests/test_prebeam/uh60a_blade.xml new file mode 100644 index 0000000..8587dfd --- /dev/null +++ b/tests/test_prebeam/uh60a_blade.xml @@ -0,0 +1,193 @@ + + + + + + + + + + + + 0 0 0 + 0.3 0 0 + 0.6 0 0 + 0.9 0 0 + + + + + + p1 + + uh60a_seg1_cs0 + + + + p2 + + uh60a_seg1_cs1 + + + + + chord + 20 + + + + + + + + p2 + + uh60a_seg2_cs0 + + + + p3 + + uh60a_seg2_cs1 + + + + + chord + 30 + + + + + + + + + + + chord + f2 + + + + wl_x2 + f3 + + + + wt_x2 + f4 + + + + pnsmc_x2 + f5 + + + + fo_spar_1 + ff1 + + + + fo_spar_2 + ff2 + + + + fo_spar_3 + ff3 + + + + fo_spar_4 + ff4 + + + + fo_le + ff5 + + + + fo_te + ff6 + + + + + + + + + + + + + 0 1 + + + + + 0.3 20.76 + 0.8 22.32 + + + + + + 0.3 -0.1896481216 + 0.8 -0.1454969939 + + + + + + 0.3 -0.4785393841 + 0.8 -0.4140354625 + + + + + + 0.3 -0.031134373 + 0.8 -0.02184789575 + + + + + 45 + + + + + 0.3 -44 + 0.8 25 + + + + + + 0.3 -45 + 0.8 25 + + + + + + 0.3 41 + 0.8 -10 + + + + + -14 + + + + -59 + + + + + diff --git a/tests/test_prebeam/uh60a_box.xml.tmp b/tests/test_prebeam/uh60a_box.xml.tmp new file mode 100644 index 0000000..41fffe6 --- /dev/null +++ b/tests/test_prebeam/uh60a_box.xml.tmp @@ -0,0 +1,212 @@ + + + material_database + + + 1 + + + {-1.0*oa2} {oa3} + {chord} + {mesh_size} + linear + + + + + + + sc1095 + + + + 1:71 + + + 72:141,1 + + + {wl_x2} + {wt_x2} + {wt_x2} + {wl_x2} + + -0.02 + -0.02 + + -0.8 + -0.8 + + + p1:p2 + + + p3:p4 + + + p2,p3 + + + p4,p1 + + + + p5:p1 + + + p6:141,1:p5 + + + p4:p6 + + + + p2:p7 + + + p7:71,72:p8 + + + p8:p3 + + + {pnsmc_x2} {pnsmc_x3} + +
pnsmc
+ {nsmr} + 9 +
+ + {pfle1_x2} 0 + {pfle2_x2} 0 + {pfte1_x2} 0 + {pfte2_x2} 0 + +
+ + + + + + + + + + + + 0:2 + + + 0:2 + + + 0:2 + + + + {fo_spar_1}:{np_spar_1} + {fo_spar_2}:{np_spar_2} + {fo_spar_3}:{np_spar_3} + {fo_spar_4}:{np_spar_4} + + + + {fo_le}:{np_le} + + + + {fo_te}:{np_te} + + + + + + + + + + + + + + + bsl_spar_top + lyp_skin_graphite + lyp_spar + + + bsl_spar_bottom + lyp_skin_graphite + lyp_spar + + + bsl_spar_web_le + lyp_skin_graphite + lyp_spar + + + bsl_spar_web_te + lyp_skin_graphite + lyp_spar + + + + + + bsl_le + lyp_steel + lyp_skin_graphite + lyp_le + + + bsl_le_top + lyp_steel + lyp_skin_graphite + lyp_le + + + bsl_le_bottom + lyp_steel + lyp_skin_graphite + lyp_le + + + + + + bsl_te_top + lyp_skin_graphite + lyp_te + + + bsl_te + lyp_skin_graphite + + + bsl_te_bottom + lyp_skin_graphite + lyp_te + + + + + bsl_nsm + pnsmc + lead + {mesh_size_fill} + + + + pfle1 + Rohacell 70 + {mesh_size_fill} + + + + pfte1 + Plascore PN2-3/16OX3.0 + {mesh_size_fill} + + + +
diff --git a/tests/test_prebeam/uh60a_box_2.xml.tmp b/tests/test_prebeam/uh60a_box_2.xml.tmp new file mode 100644 index 0000000..ac4e0f3 --- /dev/null +++ b/tests/test_prebeam/uh60a_box_2.xml.tmp @@ -0,0 +1,212 @@ + + + material_database + + + 1 + + + {-1.0*oa2} {oa3} + {chord} + {mesh_size} + linear + + + + + + + sc1094r8 + + + + 1:71 + + + 72:141,1 + + + {wl_x2} + {wt_x2} + {wt_x2} + {wl_x2} + + -0.02 + -0.02 + + -0.8 + -0.8 + + + p1:p2 + + + p3:p4 + + + p2,p3 + + + p4,p1 + + + + p5:p1 + + + p6:141,1:p5 + + + p4:p6 + + + + p2:p7 + + + p7:71,72:p8 + + + p8:p3 + + + {pnsmc_x2} {pnsmc_x3} + +
pnsmc
+ {nsmr} + 9 +
+ + {pfle1_x2} 0 + {pfle2_x2} 0 + {pfte1_x2} 0 + {pfte2_x2} 0 + +
+ + + + + + + + + + + + 0:2 + + + 0:2 + + + 0:2 + + + + {fo_spar_1}:{np_spar_1} + {fo_spar_2}:{np_spar_2} + {fo_spar_3}:{np_spar_3} + {fo_spar_4}:{np_spar_4} + + + + {fo_le}:{np_le} + + + + {fo_te}:{np_te} + + + + + + + + + + + + + + + bsl_spar_top + lyp_skin_graphite + lyp_spar + + + bsl_spar_bottom + lyp_skin_graphite + lyp_spar + + + bsl_spar_web_le + lyp_skin_graphite + lyp_spar + + + bsl_spar_web_te + lyp_skin_graphite + lyp_spar + + + + + + bsl_le + lyp_steel + lyp_skin_graphite + lyp_le + + + bsl_le_top + lyp_steel + lyp_skin_graphite + lyp_le + + + bsl_le_bottom + lyp_steel + lyp_skin_graphite + lyp_le + + + + + + bsl_te_top + lyp_skin_graphite + lyp_te + + + bsl_te + lyp_skin_graphite + + + bsl_te_bottom + lyp_skin_graphite + lyp_te + + + + + bsl_nsm + pnsmc + lead + {mesh_size_fill} + + + + pfle1 + Rohacell 70 + {mesh_size_fill} + + + + pfte1 + Plascore PN2-3/16OX3.0 + {mesh_size_fill} + + + +
diff --git a/tests/test_prebeam/uh60a_seg1_cs0.xml b/tests/test_prebeam/uh60a_seg1_cs0.xml new file mode 100644 index 0000000..2527fd0 --- /dev/null +++ b/tests/test_prebeam/uh60a_seg1_cs0.xml @@ -0,0 +1,212 @@ + + + material_database + + + 1 + + + 0.25 0 + 20 + 0.05 + linear + + + + + + + sc1095 + + + + 1:71 + + + 72:141,1 + + + -0.1896481216 + -0.4785393841 + -0.4785393841 + -0.1896481216 + + -0.02 + -0.02 + + -0.8 + -0.8 + + + p1:p2 + + + p3:p4 + + + p2,p3 + + + p4,p1 + + + + p5:p1 + + + p6:141,1:p5 + + + p4:p6 + + + + p2:p7 + + + p7:71,72:p8 + + + p8:p3 + + + -0.031134373 0 + +
pnsmc
+ 0.003303903317 + 9 +
+ + -0.03943827632 0 + -0.1846481216 0 + -0.4885393841 0 + -0.9 0 + +
+ + + + + + + + + + + + 0:2 + + + 0:2 + + + 0:2 + + + + 45:12 + -44:16 + -45:6 + 41:10 + + + + -14:4 + + + + -59:18 + + + + + + + + + + + + + + + bsl_spar_top + lyp_skin_graphite + lyp_spar + + + bsl_spar_bottom + lyp_skin_graphite + lyp_spar + + + bsl_spar_web_le + lyp_skin_graphite + lyp_spar + + + bsl_spar_web_te + lyp_skin_graphite + lyp_spar + + + + + + bsl_le + lyp_steel + lyp_skin_graphite + lyp_le + + + bsl_le_top + lyp_steel + lyp_skin_graphite + lyp_le + + + bsl_le_bottom + lyp_steel + lyp_skin_graphite + lyp_le + + + + + + bsl_te_top + lyp_skin_graphite + lyp_te + + + bsl_te + lyp_skin_graphite + + + bsl_te_bottom + lyp_skin_graphite + lyp_te + + + + + bsl_nsm + pnsmc + lead + 0.3 + + + + pfle1 + Rohacell 70 + 0.3 + + + + pfte1 + Plascore PN2-3/16OX3.0 + 0.3 + + + +
diff --git a/tests/test_prebeam/uh60a_seg1_cs1.xml b/tests/test_prebeam/uh60a_seg1_cs1.xml new file mode 100644 index 0000000..edcdf40 --- /dev/null +++ b/tests/test_prebeam/uh60a_seg1_cs1.xml @@ -0,0 +1,212 @@ + + + material_database + + + 1 + + + 0.25 0 + 20 + 0.05 + linear + + + + + + + sc1095 + + + + 1:71 + + + 72:141,1 + + + -0.163157445 + -0.4398370311 + -0.4398370311 + -0.163157445 + + -0.02 + -0.02 + + -0.8 + -0.8 + + + p1:p2 + + + p3:p4 + + + p2,p3 + + + p4,p1 + + + + p5:p1 + + + p6:141,1:p5 + + + p4:p6 + + + + p2:p7 + + + p7:71,72:p8 + + + p8:p3 + + + -0.02556248665 0 + +
pnsmc
+ 0.003303903317 + 9 +
+ + -0.03386638997 0 + -0.158157445 0 + -0.4498370311 0 + -0.9 0 + +
+ + + + + + + + + + + + 0:2 + + + 0:2 + + + 0:2 + + + + 45:12 + -2.6:16 + -3:6 + 10.4:10 + + + + -14:4 + + + + -59:18 + + + + + + + + + + + + + + + bsl_spar_top + lyp_skin_graphite + lyp_spar + + + bsl_spar_bottom + lyp_skin_graphite + lyp_spar + + + bsl_spar_web_le + lyp_skin_graphite + lyp_spar + + + bsl_spar_web_te + lyp_skin_graphite + lyp_spar + + + + + + bsl_le + lyp_steel + lyp_skin_graphite + lyp_le + + + bsl_le_top + lyp_steel + lyp_skin_graphite + lyp_le + + + bsl_le_bottom + lyp_steel + lyp_skin_graphite + lyp_le + + + + + + bsl_te_top + lyp_skin_graphite + lyp_te + + + bsl_te + lyp_skin_graphite + + + bsl_te_bottom + lyp_skin_graphite + lyp_te + + + + + bsl_nsm + pnsmc + lead + 0.3 + + + + pfle1 + Rohacell 70 + 0.3 + + + + pfte1 + Plascore PN2-3/16OX3.0 + 0.3 + + + +
diff --git a/tests/test_prebeam/uh60a_seg2_cs0.xml b/tests/test_prebeam/uh60a_seg2_cs0.xml new file mode 100644 index 0000000..cb14054 --- /dev/null +++ b/tests/test_prebeam/uh60a_seg2_cs0.xml @@ -0,0 +1,212 @@ + + + material_database + + + 1 + + + 0.25 0 + 30 + 0.05 + linear + + + + + + + sc1095 + + + + 1:71 + + + 72:141,1 + + + -0.163157445 + -0.4398370311 + -0.4398370311 + -0.163157445 + + -0.02 + -0.02 + + -0.8 + -0.8 + + + p1:p2 + + + p3:p4 + + + p2,p3 + + + p4,p1 + + + + p5:p1 + + + p6:141,1:p5 + + + p4:p6 + + + + p2:p7 + + + p7:71,72:p8 + + + p8:p3 + + + -0.02556248665 0 + +
pnsmc
+ 0.003303903317 + 9 +
+ + -0.03386638997 0 + -0.158157445 0 + -0.4498370311 0 + -0.9 0 + +
+ + + + + + + + + + + + 0:2 + + + 0:2 + + + 0:2 + + + + 45:12 + -2.6:16 + -3:6 + 10.4:10 + + + + -14:4 + + + + -59:18 + + + + + + + + + + + + + + + bsl_spar_top + lyp_skin_graphite + lyp_spar + + + bsl_spar_bottom + lyp_skin_graphite + lyp_spar + + + bsl_spar_web_le + lyp_skin_graphite + lyp_spar + + + bsl_spar_web_te + lyp_skin_graphite + lyp_spar + + + + + + bsl_le + lyp_steel + lyp_skin_graphite + lyp_le + + + bsl_le_top + lyp_steel + lyp_skin_graphite + lyp_le + + + bsl_le_bottom + lyp_steel + lyp_skin_graphite + lyp_le + + + + + + bsl_te_top + lyp_skin_graphite + lyp_te + + + bsl_te + lyp_skin_graphite + + + bsl_te_bottom + lyp_skin_graphite + lyp_te + + + + + bsl_nsm + pnsmc + lead + 0.3 + + + + pfle1 + Rohacell 70 + 0.3 + + + + pfte1 + Plascore PN2-3/16OX3.0 + 0.3 + + + +
diff --git a/tests/test_prebeam/uh60a_seg2_cs1.xml b/tests/test_prebeam/uh60a_seg2_cs1.xml new file mode 100644 index 0000000..b819dd2 --- /dev/null +++ b/tests/test_prebeam/uh60a_seg2_cs1.xml @@ -0,0 +1,212 @@ + + + material_database + + + 1 + + + 0.25 0 + 30 + 0.05 + linear + + + + + + + sc1095 + + + + 1:71 + + + 72:141,1 + + + -0.1366667684 + -0.4011346782 + -0.4011346782 + -0.1366667684 + + -0.02 + -0.02 + + -0.8 + -0.8 + + + p1:p2 + + + p3:p4 + + + p2,p3 + + + p4,p1 + + + + p5:p1 + + + p6:141,1:p5 + + + p4:p6 + + + + p2:p7 + + + p7:71,72:p8 + + + p8:p3 + + + -0.0199906003 0 + +
pnsmc
+ 0.003303903317 + 9 +
+ + -0.02829450362 0 + -0.1316667684 0 + -0.4111346782 0 + -0.9 0 + +
+ + + + + + + + + + + + 0:2 + + + 0:2 + + + 0:2 + + + + 45:12 + 38.8:16 + 39:6 + -20.2:10 + + + + -14:4 + + + + -59:18 + + + + + + + + + + + + + + + bsl_spar_top + lyp_skin_graphite + lyp_spar + + + bsl_spar_bottom + lyp_skin_graphite + lyp_spar + + + bsl_spar_web_le + lyp_skin_graphite + lyp_spar + + + bsl_spar_web_te + lyp_skin_graphite + lyp_spar + + + + + + bsl_le + lyp_steel + lyp_skin_graphite + lyp_le + + + bsl_le_top + lyp_steel + lyp_skin_graphite + lyp_le + + + bsl_le_bottom + lyp_steel + lyp_skin_graphite + lyp_le + + + + + + bsl_te_top + lyp_skin_graphite + lyp_te + + + bsl_te + lyp_skin_graphite + + + bsl_te_bottom + lyp_skin_graphite + lyp_te + + + + + bsl_nsm + pnsmc + lead + 0.3 + + + + pfle1 + Rohacell 70 + 0.3 + + + + pfte1 + Plascore PN2-3/16OX3.0 + 0.3 + + + +