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
+
+
+
+