diff --git a/examples/stiffened_plate/generate_plate.py b/examples/stiffened_plate/generate_plate.py new file mode 100755 index 000000000..5a7d4ea95 --- /dev/null +++ b/examples/stiffened_plate/generate_plate.py @@ -0,0 +1,146 @@ +from __future__ import print_function +import numpy as np +import matplotlib.pyplot as plt +import argparse +from pprint import pprint +from scipy.spatial.transform import Rotation + +parser = argparse.ArgumentParser() +parser.add_argument("--nex", type=int, default=20, help="# elements from top to bottom") +parser.add_argument( + "--ney", type=int, default=40, help="# elements around circumference" +) +parser.add_argument("--pinEdges", action="store_true", help="Pin edges of plate") +args = parser.parse_args() + +# Overall dimensions +width = 0.75 +length = 1.5 + +# Number of elements along each edge of a single panel +nex = args.nex +ney = args.ney + +np1 = 1 +np2 = 1 + +# Nodes +n1 = nex + 1 +n2 = ney + 1 +x = np.linspace(0, width, n1) +y = np.linspace(0, length, n2) +X, Y = np.meshgrid(x, y) +Z = np.zeros_like(X) + +# Node numbering +nid = np.zeros((n2, n1), dtype="intc") +bcnodes = [] +count = 1 +for i in range(n2): + isYmin = i == 0 + isYmax = i == n2 - 1 + for j in range(n1): + isXmin = j == 0 + isXmax = j == n1 - 1 + nid[i, j] = count + # Fix bottom left corner in x,y, z + if isYmin and isXmin: + bcnodes.append({"nodenum": count, "fixedDOF": "123"}) + # fix bottom right corner in y + elif isYmin and isXmax: + bcnodes.append({"nodenum": count, "fixedDOF": "23"}) + # Fix top left corner in z + elif isYmax and isXmin: + bcnodes.append({"nodenum": count, "fixedDOF": "3"}) + # Fix all other edge nodes in z + elif args.pinEdges and (isYmax or isYmin or isXmin or isXmax): + bcnodes.append({"nodenum": count, "fixedDOF": "3"}) + count += 1 +nodes = np.stack((X, Y, Z), axis=2) +nmat = nodes.reshape((n1 * n2, 3)) + +# Connectivity +nex = n1 - 1 +ney = n2 - 1 +ne = nex * ney +ncomp = 1 +conn = {i + 1: [] for i in range(ncomp)} +ie = 1 +for i in range(ney): + for j in range(nex): + compID = i // ney * np1 + j // nex + 1 + conn[compID].append( + [ie, nid[i, j], nid[i + 1, j], nid[i + 1, j + 1], nid[i, j + 1]] + ) + ie += 1 + + +# Write BDF +output_file = "plate.bdf" if not args.pinEdges else "plate_pinned_edges.bdf" +fout = open(output_file, "w") + + +def write_80(line): + newline = "{:80s}\n".format(line.strip("\n")) + fout.write(newline) + + +write_80("SOL 103") +write_80("CEND") +write_80("BEGIN BULK") + +# Make component names +compNames = {} +compID = 1 +for i in range(np2): + for j in range(np1): + compNames[compID] = "PLATE.{:03d}/SEG.{:02d}".format(i, j) + compID += 1 + + +def write_bulk_line(key, items, format="small"): + if format == "small": + width = 8 + writekey = key + elif format == "large": + width = 16 + writekey = key + "*" + line = "{:8s}".format(writekey) + for item in items: + if type(item) in [int, np.int64, np.int32]: + line += "{:{width}d}".format(item, width=width)[:width] + elif type(item) in [float, np.float64]: + line += "{: {width}f}".format(item, width=width)[:width] + elif type(item) is str: + line += "{:{width}s}".format(item, width=width)[:width] + else: + print(type(item), item) + if len(line) == 72: + write_80(line) + line = " " * 8 + if len(line) > 8: + write_80(line) + + +# Write nodes +for i in range(n1 * n2): + write_bulk_line("GRID", [i + 1, 0, nmat[i, 0], nmat[i, 1], nmat[i, 2], 0, 0, 0]) + +# Write elements +compID = 1 +for key in conn: + famPrefix = "$ Shell element data for family " + famString = "{}{:39s}".format(famPrefix, compNames[compID]) + write_80(famString) + compID += 1 + for element in conn[key]: + element.insert(1, key) + write_bulk_line("CQUAD4", element) + +# Write boundary conditions +for node in bcnodes: + write_bulk_line("SPC", [1, node["nodenum"], node["fixedDOF"], 0.0]) + +write_80("ENDDATA") + +fout.close() diff --git a/examples/stiffened_plate/optimize_stiffened_plate.py b/examples/stiffened_plate/optimize_stiffened_plate.py new file mode 100644 index 000000000..f138df62d --- /dev/null +++ b/examples/stiffened_plate/optimize_stiffened_plate.py @@ -0,0 +1,687 @@ +""" +============================================================================== +Optimization of a stiffened plate +============================================================================== +@File : optimize_stiffened_plate.py +@Date : 2024/07/09 +@Author : Alasdair Christison Gray +@Description : A simple example of optimising a stiffened panel using the +blade-stiffened shell constitutive model. We will optimise the sizing of the +plate and its stiffeners to minimise mass subject to the material and buckling +failure criteria included in the TACSBladeStiffenedShell class. + +This example is based on the composite panel design example example in section +13.2 of "Design and Analysis of Composite Structures with Applications to +Aerospace Structures" by Christos Kassapoglou. The task is to size a 0.75 x +1.5m stiffened panel based on 2 loadcases: +(a) Uniform pressure of 12,500 Pa +(b) Applied in-plane loads Nx = − 350 N/mm, Nxy = 175 N/mm + +The panel should not fail in either case and the out-of-plane deflection +should be less than 2mm in case (a). + +We should not expect to achieve exactly the same result as in the book as +there are a number of modelling differences between the two cases, including +but not limited to the following: +- The textbook case does not present an optimum sizing, just a reasonable +sizing that has a sufficient margin of safety. +- The textbook case uses J stiffeners, whereas the TACSBladeStiffenedShell +class uses T stiffeners. +- The textbook case computes the laminate stiffness properties using classical +lamination theory and a discrete stacking sequence, whereas the +TACSBladeStiffenedShell class uses smeared stiffness approach that ignores the +stacking sequence. +- The buckling analysis of the skin and stiffener in the textbook accounts for +load redistribution from the skin to the stiffeners when the skin buckles, the +TACSBladeStiffenedShell class does not account for this effect. +- The textbook case uses two different types of ply within the skin, whereas +the TACSBladeStiffenedShell class uses a single ply type for the skin and +stiffener laminates +""" + +# ============================================================================== +# Standard Python modules +# ============================================================================== +import os +import argparse + +# ============================================================================== +# External Python modules +# ============================================================================== +import numpy as np +import openmdao.api as om +from mphys import Multipoint +from mphys.scenario_structural import ScenarioStructural +import matplotlib.pyplot as plt +import matplotlib.patches as mpatches + +# ============================================================================== +# Extension modules +# ============================================================================== +from tacs import elements, constitutive, functions +from tacs.mphys import TacsBuilder + +# ============================================================================== +# Process some command line arguments +# ============================================================================== +parser = argparse.ArgumentParser() +parser.add_argument( + "--useStiffPitchDV", + action="store_true", + help="Use stiffener pitch as a design variable", +) +parser.add_argument( + "--usePlyFracDV", + action="store_true", + help="Use ply fractions as design variables", +) +parser.add_argument( + "--includeStiffenerBuckling", + action="store_true", + help="Include stiffener buckling in the failure criteria", +) +parser.add_argument( + "--opt", + default="slsqp", + choices=["slsqp", "snopt", "ipopt", "nlpqlp", "psqp"], + help="Optimizer to use", +) +args = parser.parse_args() + + +# Overall plate dimensions +width = 0.75 +length = 1.5 + +# Material properties (UD tape properties from textbook case) +rho = 1609.0 +E1 = 137.9e9 +E2 = 11.7e9 +nu12 = 0.29 +G12 = 4.82e9 +G13 = 4.82e9 +Xt = 2068e6 +Xc = 1723e6 +Yt = 96.5e6 +Yc = 338e6 +S12 = 124e6 + +# Baseline panel sizing +panelLength = length + +stiffenerPitch = 0.125 +stiffenerPitchMin = 0.1 +stiffenerPitchMax = width / 2 + +panelThickness = 2.1717e-3 +panelThicknessMin = 0.6e-3 +panelThicknessMax = 0.1 + +stiffenerHeight = 57e-3 +stiffenerHeightMin = 25e-3 +stiffenerHeightMax = 0.15 + +stiffenerThickness = stiffenerHeight / 8.8 +stiffenerThicknessMin = 0.6e-3 +stiffenerThicknessMax = 0.1 + +# Ply angles/initial ply fractions +ply_angles = np.deg2rad([0.0, -45.0, 45.0, 90.0]) +skin_ply_fractions = np.array([0.13953, 0.36047, 0.36047, 0.13953]) +stiffener_ply_fractions = np.array([0.59402, 0.16239, 0.16239, 0.0812]) + +# Shear and compressive traction loads +Ny = 350e3 # N/m +Nxy = 175e3 # N/m + + +def element_callback(dvNum, compID, compDescript, elemDescripts, specialDVs, **kwargs): + # Create ply object + ortho_prop = constitutive.MaterialProperties( + rho=rho, + E1=E1, + E2=E2, + nu12=nu12, + G12=G12, + G13=G13, + G23=G13, + Xt=Xt, + Xc=Xc, + Yt=Yt, + Yc=Yc, + S12=S12, + ) + ply = constitutive.OrthotropicPly(0.1, ortho_prop) + + # --- Define skin/stiffener design variables --- + currentDVNum = dvNum + + panelLengthNum = -1 + + if args.useStiffPitchDV: + stiffenerPitchNum = currentDVNum + currentDVNum = currentDVNum + 1 + else: + stiffenerPitchNum = -1 + + panelThicknessNum = currentDVNum + currentDVNum = currentDVNum + 1 + + # Assign each ply fraction a unique DV + if args.usePlyFracDV: + skin_ply_fraction_dv_nums = np.array( + [ + currentDVNum, + currentDVNum + 1, + currentDVNum + 2, + currentDVNum + 3, + ], + dtype=np.intc, + ) + currentDVNum = currentDVNum + 4 + + stiffenerHeightNum = currentDVNum + currentDVNum = currentDVNum + 1 + + stiffenerThicknessNum = currentDVNum + currentDVNum = currentDVNum + 1 + + # Assign each ply fraction a unique DV + if args.usePlyFracDV: + stiffener_ply_fraction_dv_nums = np.array( + [ + currentDVNum, + currentDVNum + 1, + currentDVNum + 2, + currentDVNum + 3, + ], + dtype=np.intc, + ) + else: + skin_ply_fraction_dv_nums = -np.ones(len(ply_angles), dtype=np.intc) + stiffener_ply_fraction_dv_nums = -np.ones(len(ply_angles), dtype=np.intc) + + con = constitutive.BladeStiffenedShellConstitutive( + panelPly=ply, + stiffenerPly=ply, + panelLength=panelLength, + stiffenerPitch=stiffenerPitch, + panelThick=panelThickness, + panelPlyAngles=ply_angles, + panelPlyFracs=skin_ply_fractions, + stiffenerHeight=stiffenerHeight, + stiffenerThick=stiffenerThickness, + stiffenerPlyAngles=ply_angles, + stiffenerPlyFracs=stiffener_ply_fractions, + panelLengthNum=panelLengthNum, + stiffenerPitchNum=stiffenerPitchNum, + panelThickNum=panelThicknessNum, + panelPlyFracNums=skin_ply_fraction_dv_nums, + stiffenerHeightNum=stiffenerHeightNum, + stiffenerThickNum=stiffenerThicknessNum, + stiffenerPlyFracNums=stiffener_ply_fraction_dv_nums, + ) + con.setStiffenerPitchBounds(stiffenerPitchMin, stiffenerPitchMax) + con.setPanelThicknessBounds(panelThicknessMin, panelThicknessMax) + con.setStiffenerThicknessBounds(stiffenerThicknessMin, stiffenerThicknessMax) + con.setPanelPlyFractionBounds( + np.array([0.05, 0.05, 0.05, 0.05]), np.array([1.0, 1.0, 1.0, 1.0]) + ) + con.setStiffenerPlyFractionBounds( + np.array([0.25, 0.125, 0.125, 0.05]), np.array([1.0, 1.0, 1.0, 1.0]) + ) + + # We need to enforce that stiffenerHeight <= stiffenerPitch, if we are not + # using a stiffener pitch DV we can simply enforce this as an upper bound + # on the stiffener height, otherwise we need to enforce this using a + # linear constraint in the constraint_setup function + if args.useStiffPitchDV: + con.setStiffenerHeightBounds(stiffenerHeightMin, stiffenerHeightMax) + else: + con.setStiffenerHeightBounds(stiffenerHeightMin, stiffenerPitch - 10e-3) + + con.setFailureModes( + includePanelMaterialFailure=True, + includeStiffenerMaterialFailure=True, + includeLocalBuckling=True, + includeGlobalBuckling=True, + includeStiffenerColumnBuckling=args.includeStiffenerBuckling, + includeStiffenerCrippling=args.includeStiffenerBuckling, + ) + + # stiffeners and 0 degree plies are oriented with the y direction + refAxis = np.array([0.0, 1.0, 0.0]) + transform = elements.ShellRefAxisTransform(refAxis) + + # Pass back the appropriate tacs element object + elem = elements.Quad4Shell(transform, con) + + # Design variable scaling factors + stiffPitchScale = 10.0 + panelThicknessScale = 1e2 + stiffenerHeightScale = 1e1 + stiffenerThicknessScale = 1e2 + DVScales = [] + if args.useStiffPitchDV: + DVScales.append(stiffPitchScale) + DVScales.append(panelThicknessScale) + if args.usePlyFracDV: + DVScales += [1.0] * 4 + DVScales += [stiffenerHeightScale, stiffenerThicknessScale] + if args.usePlyFracDV: + DVScales += [1.0] * 4 + + return elem, DVScales + + +def addForceToEdge(problem, edgeNodeIDs, cornerNodes, totalForce): + numNodes = len(edgeNodeIDs) + F = np.zeros((numNodes, 6)) + for ii in range(numNodes): + if edgeNodeIDs[ii] in cornerNodes: + F[ii, :] = 0.5 + else: + F[ii, :] = 1.0 + for jj in range(6): + F[:, jj] *= totalForce[jj] / np.sum(F[:, jj]) + + problem.addLoadToNodes(edgeNodeIDs, F, nastranOrdering=True) + + +def problem_setup(scenario_name, fea_assembler, problem): + """ + Helper function to add fixed forces and eval functions + to structural problems used in tacs builder + """ + problem.setOption("outputDir", scenario_name) + + # Add TACS Functions + problem.addFunction( + "KSFailure", + functions.KSFailure, + safetyFactor=1.5, + ksWeight=100.0, + ) + problem.addFunction("Mass", functions.StructuralMass) + + # ============================================================================== + # Add forces + # ============================================================================== + if scenario_name == "CompAndShear": + # We have only applied the minimum necessary boundary conditions to + # restrict rigid body motion of the plate we will therefore apply the + # compressive forces on both the min and max x edges, and shear forces on + # all 4 edges + + # First we need to get the node coordinates + bdfInfo = fea_assembler.getBDFInfo() + # cross-reference bdf object to use some of pynastrans advanced features + bdfInfo.cross_reference() + nastranNodeNums = list(bdfInfo.node_ids) + nodeCoords = bdfInfo.get_xyz_in_coord() + xMinNodes = np.nonzero( + np.abs(np.min(nodeCoords[:, 0]) - nodeCoords[:, 0]) <= 1e-6 + )[0] + xMinNodeIDs = [nastranNodeNums[ii] for ii in xMinNodes] + + xMaxNodes = np.nonzero( + np.abs(np.max(nodeCoords[:, 0]) - nodeCoords[:, 0]) <= 1e-6 + )[0] + xMaxNodeIDs = [nastranNodeNums[ii] for ii in xMaxNodes] + + yMinNodes = np.nonzero( + np.abs(np.min(nodeCoords[:, 1]) - nodeCoords[:, 1]) <= 1e-6 + )[0] + yMinNodeIDs = [nastranNodeNums[ii] for ii in yMinNodes] + + yMaxNodes = np.nonzero( + np.abs(np.max(nodeCoords[:, 1]) - nodeCoords[:, 1]) <= 1e-6 + )[0] + yMaxNodeIDs = [nastranNodeNums[ii] for ii in yMaxNodes] + + # Find the corner nodes because we need to apply smaller point forces to them + cornerNodes = list(set(yMinNodeIDs) & set(xMinNodeIDs)) + cornerNodes.extend(list(set(yMinNodeIDs) & set(xMaxNodeIDs))) + cornerNodes.extend(list(set(yMaxNodeIDs) & set(xMinNodeIDs))) + cornerNodes.extend(list(set(yMaxNodeIDs) & set(xMaxNodeIDs))) + + # yMin face, compressive load in +y direction, shear in -x direction + addForceToEdge( + problem, + yMinNodeIDs, + cornerNodes, + [-Nxy * width, Ny * width, 0.0, 0.0, 0.0, 0.0], + ) + # yMax face, compressive load in -y direction, shear in +x direction + addForceToEdge( + problem, + yMaxNodeIDs, + cornerNodes, + [Nxy * width, -Ny * width, 0.0, 0.0, 0.0, 0.0], + ) + # xMin face shear in -y direction + addForceToEdge( + problem, + xMinNodeIDs, + cornerNodes, + [0.0, -Nxy * length, 0.0, 0.0, 0.0, 0.0], + ) + # xMax face shear in +y direction + addForceToEdge( + problem, + xMaxNodeIDs, + cornerNodes, + [0.0, Nxy * length, 0.0, 0.0, 0.0, 0.0], + ) + elif scenario_name == "Pressure": + allComponents = fea_assembler.selectCompIDs() + problem.addPressureToComponents(allComponents, 12.5e3) + + # We need to limit the max Z displacement to < 2mm + problem.addFunction( + "MaxDispZ", + functions.KSDisplacement, + ksWeight=100.0, + direction=[0.0, 0.0, -1.0], + ) + + +def constraint_setup(scenario_name, fea_assembler, constraint_list): + """ + Helper function to setup tacs constraint classes + """ + if scenario_name == "CompAndShear": + allComponents = fea_assembler.selectCompIDs() + if args.usePlyFracDV or args.useStiffPitchDV: + constr = fea_assembler.createDVConstraint("DVCon") + else: + constr = None + + if args.usePlyFracDV: + # Skin ply fractions must add up to 1 + firstSkinPlyFracNum = 2 if args.useStiffPitchDV else 1 + constr.addConstraint( + "SkinPlyFracSum", + allComponents, + dvIndices=list(range(firstSkinPlyFracNum, firstSkinPlyFracNum + 4)), + dvWeights=[1.0, 1.0, 1.0, 1.0], + lower=1.0, + upper=1.0, + ) + # Fractions of + and -45 degree plies should be equal + constr.addConstraint( + "SkinLaminateBalance", + allComponents, + dvIndices=[firstSkinPlyFracNum + 1, firstSkinPlyFracNum + 2], + dvWeights=[1.0, -1.0], + lower=0.0, + upper=0.0, + ) + + firstStiffenerPlyFracNum = 8 if args.useStiffPitchDV else 7 + constr.addConstraint( + "StiffenerPlyFracSum", + allComponents, + dvIndices=list( + range(firstStiffenerPlyFracNum, firstStiffenerPlyFracNum + 4) + ), + dvWeights=[1.0, 1.0, 1.0, 1.0], + lower=1.0, + upper=1.0, + ) + # Fractions of + and -45 degree plies should be equal + constr.addConstraint( + "StiffenerLaminateBalance", + allComponents, + dvIndices=[ + firstStiffenerPlyFracNum + 1, + firstStiffenerPlyFracNum + 2, + ], + dvWeights=[1.0, -1.0], + lower=0.0, + upper=0.0, + ) + + # There must be at least 10mm between adjacent stiffner flanges, the flange width is equal to the stiffener height so the constraint is + # stiffPitch - stiffHeight >= 10mm + if args.useStiffPitchDV: + stiffenerHeightInd = 2 if not args.usePlyFracDV else 6 + constr.addConstraint( + "StiffenerOverlap", + allComponents, + dvIndices=[0, stiffenerHeightInd], + dvWeights=[1.0, -1.0], + lower=10e-3, + ) + + if constr is not None: + constraint_list.append(constr) + + +scenarioNames = ["CompAndShear", "Pressure"] +meshNames = {"CompAndShear": "plate.bdf", "Pressure": "plate_pinned_edges.bdf"} + +# BDF file containing mesh +bdfFile = os.path.join(os.path.dirname(__file__), "plate.bdf") + + +class PlateModel(Multipoint): + def setup(self): + for ii, scenarioName in enumerate(scenarioNames): + struct_builder = TacsBuilder( + mesh_file=os.path.join( + os.path.dirname(__file__), meshNames[scenarioName] + ), + element_callback=element_callback, + problem_setup=problem_setup, + constraint_setup=constraint_setup, + coupled=False, + check_partials=True, + ) + struct_builder.initialize(self.comm) + + # We only need to setup the design variable and mesh components once as both scenarios will use the same design variables and mesh coordinates. + if ii == 0: + init_dvs = struct_builder.get_initial_dvs() + dvs = self.add_subsystem("dvs", om.IndepVarComp(), promotes=["*"]) + dvs.add_output("dv_struct", init_dvs) + lb, ub = struct_builder.get_dv_bounds() + structDVScaling = np.array(struct_builder.fea_assembler.scaleList) + self.add_design_var( + "dv_struct", lower=lb, upper=ub, scaler=structDVScaling + ) + + self.add_subsystem( + "mesh", struct_builder.get_mesh_coordinate_subsystem() + ) + + self.mphys_add_scenario( + scenarioName, ScenarioStructural(struct_builder=struct_builder) + ) + self.mphys_connect_scenario_coordinate_source( + "mesh", scenarioName, "struct" + ) + + self.connect("dv_struct", f"{scenarioName}.dv_struct") + + os.makedirs(scenarioName, exist_ok=True) + + def configure(self): + # Add TACS constraints + firstScenario = self.__getattribute__(scenarioNames[0]) + if hasattr(firstScenario.struct_post, "constraints"): + for system in firstScenario.struct_post.constraints.system_iter(): + constraint = system.constr + constraintFuncNames = constraint.getConstraintKeys() + bounds = {} + constraint.getConstraintBounds(bounds) + for conName in constraintFuncNames: + if self.comm.rank == 0: + print("Adding constraint: ", conName) + name = f"{scenarioNames[0]}.{system.name}.{conName}" + lb = bounds[f"{system.name}_{conName}"][0] + ub = bounds[f"{system.name}_{conName}"][1] + if all(lb == ub): + self.add_constraint(name, equals=lb, linear=True) + else: + self.add_constraint(name, lower=lb, upper=ub, linear=True) + + +# ============================================================================== +# OpenMDAO setup +# ============================================================================== + +prob = om.Problem() +prob.model = PlateModel() +model = prob.model + +# Declare design variables, objective, and constraint +model.add_objective("CompAndShear.Mass") +for scenarioName in scenarioNames: + model.add_constraint(f"{scenarioName}.KSFailure", upper=1.0, linear=False) + +model.add_constraint("Pressure.MaxDispZ", upper=2e-3, scaler=1e3) + +# Configure optimizer +debug_print = ["objs", "nl_cons", "ln_cons", "desvars"] +if args.opt == "slsqp": + prob.driver = om.ScipyOptimizeDriver(debug_print=debug_print, maxiter=100) + prob.driver.options["optimizer"] = "SLSQP" +else: + prob.driver = om.pyOptSparseDriver( + optimizer=args.opt.upper(), print_opt_prob=True, debug_print=debug_print + ) + prob.driver.options["hist_file"] = "structOpt.hst" + + +# Setup OpenMDAO problem +prob.setup(mode="rev") + +prob.run_model() + +# Output N2 representation of OpenMDAO model +om.n2(prob, show_browser=False, outfile="tacs_struct.html") + +# Run optimization +prob.run_driver() + +# --- Print out optimal values --- +dv_struct = prob.get_val("dv_struct") + + +currentDVNum = 0 +if args.useStiffPitchDV: + optStiffPitch = dv_struct[currentDVNum] + currentDVNum += 1 +else: + optStiffPitch = stiffenerPitch +optSkinThickness = dv_struct[currentDVNum] +currentDVNum += 1 +if args.usePlyFracDV: + optSkinPlyFrac = dv_struct[currentDVNum : currentDVNum + 4] + currentDVNum += 4 +else: + optSkinPlyFrac = skin_ply_fractions +optStiffHeight = dv_struct[currentDVNum] +currentDVNum += 1 +optStiffThickness = dv_struct[currentDVNum] +currentDVNum += 1 +if args.usePlyFracDV: + optStiffPlyFrac = dv_struct[currentDVNum : currentDVNum + 4] + currentDVNum += 4 +else: + optStiffPlyFrac = stiffener_ply_fractions + +print("Optimal sizing:") +print("================================") +print(f"Stiffener pitch: {optStiffPitch*1e3} mm") +print(f"Panel thickness: {optSkinThickness*1e3} mm") +print("Skin ply fractions:") +print(optSkinPlyFrac) +print(f"Stiffener height: {optStiffHeight*1e3} mm") +print(f"Stiffener thickness: {optStiffThickness*1e3} mm") +print("Stiffener ply fractions:") +print(optStiffPlyFrac) + + +def plotDesign(ax, stiffPitch, skinThickness, stiffenerHeight, stiffThickness): + """Plot a stiffened panel cross section + + Parameters + ---------- + ax : matplotlib axis + Axis to plot on + stiffPitch : float + Stiffener pitch + skinThickness : float + Panel skin thickness + stiffenerHeight : float + Stiffener height + stiffThickness : float + Stiffener thickness + """ + + totalWidth = stiffPitch + stiffenerHeight + + # Plot skin + skin = mpatches.Rectangle( + (-stiffenerHeight / 2, 0), totalWidth, skinThickness, color="blue" + ) + ax.add_artist(skin) + + # Stiffeners + for xCentre in [0, stiffPitch]: + flange = mpatches.Rectangle( + (xCentre - stiffenerHeight / 2, skinThickness), + stiffenerHeight, + stiffThickness, + color="orange", + ) + web = mpatches.Rectangle( + (xCentre - stiffThickness / 2, skinThickness + stiffThickness), + stiffThickness, + stiffenerHeight, + color="orange", + ) + ax.add_artist(flange) + ax.add_artist(web) + + xMargin = 0.05 * totalWidth + yMargin = 0.05 * stiffenerHeight + ax.set_xlim( + -stiffenerHeight / 2 - xMargin, -stiffenerHeight / 2 + totalWidth + xMargin + ) + ax.set_ylim(-yMargin, skinThickness + stiffThickness + stiffenerHeight + yMargin) + + +fig, axes = plt.subplots(2, 1, sharex=True, sharey=True, figsize=(16, 12)) + +# First axes, baseline design +ax = axes[0] +ax.set_aspect("equal") +ax.set_title("Baseline design") +plotDesign( + ax, + stiffenerPitch * 1e3, + panelThickness * 1e3, + stiffenerHeight * 1e3, + stiffenerThickness * 1e3, +) +ax.set_xlim() + +# Second axes, optimal design +ax = axes[1] +ax.set_aspect("equal") +ax.set_title("Optimal design") +plotDesign( + ax, + optStiffPitch * 1e3, + optSkinThickness * 1e3, + optStiffHeight * 1e3, + optStiffThickness * 1e3, +) +ax.autoscale() +plt.tight_layout() + +plt.savefig("CrossSection.pdf") +plt.savefig("CrossSection.png") diff --git a/examples/stiffened_plate/plate.bdf b/examples/stiffened_plate/plate.bdf new file mode 100644 index 000000000..8c8c881e6 --- /dev/null +++ b/examples/stiffened_plate/plate.bdf @@ -0,0 +1,1669 @@ +SOL 103 +CEND +BEGIN BULK +GRID 1 0 0.00000 0.00000 0.00000 0 0 0 +GRID 2 0 0.03750 0.00000 0.00000 0 0 0 +GRID 3 0 0.07500 0.00000 0.00000 0 0 0 +GRID 4 0 0.11250 0.00000 0.00000 0 0 0 +GRID 5 0 0.15000 0.00000 0.00000 0 0 0 +GRID 6 0 0.18750 0.00000 0.00000 0 0 0 +GRID 7 0 0.22500 0.00000 0.00000 0 0 0 +GRID 8 0 0.26250 0.00000 0.00000 0 0 0 +GRID 9 0 0.30000 0.00000 0.00000 0 0 0 +GRID 10 0 0.33750 0.00000 0.00000 0 0 0 +GRID 11 0 0.37500 0.00000 0.00000 0 0 0 +GRID 12 0 0.41250 0.00000 0.00000 0 0 0 +GRID 13 0 0.45000 0.00000 0.00000 0 0 0 +GRID 14 0 0.48750 0.00000 0.00000 0 0 0 +GRID 15 0 0.52500 0.00000 0.00000 0 0 0 +GRID 16 0 0.56250 0.00000 0.00000 0 0 0 +GRID 17 0 0.60000 0.00000 0.00000 0 0 0 +GRID 18 0 0.63750 0.00000 0.00000 0 0 0 +GRID 19 0 0.67500 0.00000 0.00000 0 0 0 +GRID 20 0 0.71250 0.00000 0.00000 0 0 0 +GRID 21 0 0.75000 0.00000 0.00000 0 0 0 +GRID 22 0 0.00000 0.03750 0.00000 0 0 0 +GRID 23 0 0.03750 0.03750 0.00000 0 0 0 +GRID 24 0 0.07500 0.03750 0.00000 0 0 0 +GRID 25 0 0.11250 0.03750 0.00000 0 0 0 +GRID 26 0 0.15000 0.03750 0.00000 0 0 0 +GRID 27 0 0.18750 0.03750 0.00000 0 0 0 +GRID 28 0 0.22500 0.03750 0.00000 0 0 0 +GRID 29 0 0.26250 0.03750 0.00000 0 0 0 +GRID 30 0 0.30000 0.03750 0.00000 0 0 0 +GRID 31 0 0.33750 0.03750 0.00000 0 0 0 +GRID 32 0 0.37500 0.03750 0.00000 0 0 0 +GRID 33 0 0.41250 0.03750 0.00000 0 0 0 +GRID 34 0 0.45000 0.03750 0.00000 0 0 0 +GRID 35 0 0.48750 0.03750 0.00000 0 0 0 +GRID 36 0 0.52500 0.03750 0.00000 0 0 0 +GRID 37 0 0.56250 0.03750 0.00000 0 0 0 +GRID 38 0 0.60000 0.03750 0.00000 0 0 0 +GRID 39 0 0.63750 0.03750 0.00000 0 0 0 +GRID 40 0 0.67500 0.03750 0.00000 0 0 0 +GRID 41 0 0.71250 0.03750 0.00000 0 0 0 +GRID 42 0 0.75000 0.03750 0.00000 0 0 0 +GRID 43 0 0.00000 0.07500 0.00000 0 0 0 +GRID 44 0 0.03750 0.07500 0.00000 0 0 0 +GRID 45 0 0.07500 0.07500 0.00000 0 0 0 +GRID 46 0 0.11250 0.07500 0.00000 0 0 0 +GRID 47 0 0.15000 0.07500 0.00000 0 0 0 +GRID 48 0 0.18750 0.07500 0.00000 0 0 0 +GRID 49 0 0.22500 0.07500 0.00000 0 0 0 +GRID 50 0 0.26250 0.07500 0.00000 0 0 0 +GRID 51 0 0.30000 0.07500 0.00000 0 0 0 +GRID 52 0 0.33750 0.07500 0.00000 0 0 0 +GRID 53 0 0.37500 0.07500 0.00000 0 0 0 +GRID 54 0 0.41250 0.07500 0.00000 0 0 0 +GRID 55 0 0.45000 0.07500 0.00000 0 0 0 +GRID 56 0 0.48750 0.07500 0.00000 0 0 0 +GRID 57 0 0.52500 0.07500 0.00000 0 0 0 +GRID 58 0 0.56250 0.07500 0.00000 0 0 0 +GRID 59 0 0.60000 0.07500 0.00000 0 0 0 +GRID 60 0 0.63750 0.07500 0.00000 0 0 0 +GRID 61 0 0.67500 0.07500 0.00000 0 0 0 +GRID 62 0 0.71250 0.07500 0.00000 0 0 0 +GRID 63 0 0.75000 0.07500 0.00000 0 0 0 +GRID 64 0 0.00000 0.11250 0.00000 0 0 0 +GRID 65 0 0.03750 0.11250 0.00000 0 0 0 +GRID 66 0 0.07500 0.11250 0.00000 0 0 0 +GRID 67 0 0.11250 0.11250 0.00000 0 0 0 +GRID 68 0 0.15000 0.11250 0.00000 0 0 0 +GRID 69 0 0.18750 0.11250 0.00000 0 0 0 +GRID 70 0 0.22500 0.11250 0.00000 0 0 0 +GRID 71 0 0.26250 0.11250 0.00000 0 0 0 +GRID 72 0 0.30000 0.11250 0.00000 0 0 0 +GRID 73 0 0.33750 0.11250 0.00000 0 0 0 +GRID 74 0 0.37500 0.11250 0.00000 0 0 0 +GRID 75 0 0.41250 0.11250 0.00000 0 0 0 +GRID 76 0 0.45000 0.11250 0.00000 0 0 0 +GRID 77 0 0.48750 0.11250 0.00000 0 0 0 +GRID 78 0 0.52500 0.11250 0.00000 0 0 0 +GRID 79 0 0.56250 0.11250 0.00000 0 0 0 +GRID 80 0 0.60000 0.11250 0.00000 0 0 0 +GRID 81 0 0.63750 0.11250 0.00000 0 0 0 +GRID 82 0 0.67500 0.11250 0.00000 0 0 0 +GRID 83 0 0.71250 0.11250 0.00000 0 0 0 +GRID 84 0 0.75000 0.11250 0.00000 0 0 0 +GRID 85 0 0.00000 0.15000 0.00000 0 0 0 +GRID 86 0 0.03750 0.15000 0.00000 0 0 0 +GRID 87 0 0.07500 0.15000 0.00000 0 0 0 +GRID 88 0 0.11250 0.15000 0.00000 0 0 0 +GRID 89 0 0.15000 0.15000 0.00000 0 0 0 +GRID 90 0 0.18750 0.15000 0.00000 0 0 0 +GRID 91 0 0.22500 0.15000 0.00000 0 0 0 +GRID 92 0 0.26250 0.15000 0.00000 0 0 0 +GRID 93 0 0.30000 0.15000 0.00000 0 0 0 +GRID 94 0 0.33750 0.15000 0.00000 0 0 0 +GRID 95 0 0.37500 0.15000 0.00000 0 0 0 +GRID 96 0 0.41250 0.15000 0.00000 0 0 0 +GRID 97 0 0.45000 0.15000 0.00000 0 0 0 +GRID 98 0 0.48750 0.15000 0.00000 0 0 0 +GRID 99 0 0.52500 0.15000 0.00000 0 0 0 +GRID 100 0 0.56250 0.15000 0.00000 0 0 0 +GRID 101 0 0.60000 0.15000 0.00000 0 0 0 +GRID 102 0 0.63750 0.15000 0.00000 0 0 0 +GRID 103 0 0.67500 0.15000 0.00000 0 0 0 +GRID 104 0 0.71250 0.15000 0.00000 0 0 0 +GRID 105 0 0.75000 0.15000 0.00000 0 0 0 +GRID 106 0 0.00000 0.18750 0.00000 0 0 0 +GRID 107 0 0.03750 0.18750 0.00000 0 0 0 +GRID 108 0 0.07500 0.18750 0.00000 0 0 0 +GRID 109 0 0.11250 0.18750 0.00000 0 0 0 +GRID 110 0 0.15000 0.18750 0.00000 0 0 0 +GRID 111 0 0.18750 0.18750 0.00000 0 0 0 +GRID 112 0 0.22500 0.18750 0.00000 0 0 0 +GRID 113 0 0.26250 0.18750 0.00000 0 0 0 +GRID 114 0 0.30000 0.18750 0.00000 0 0 0 +GRID 115 0 0.33750 0.18750 0.00000 0 0 0 +GRID 116 0 0.37500 0.18750 0.00000 0 0 0 +GRID 117 0 0.41250 0.18750 0.00000 0 0 0 +GRID 118 0 0.45000 0.18750 0.00000 0 0 0 +GRID 119 0 0.48750 0.18750 0.00000 0 0 0 +GRID 120 0 0.52500 0.18750 0.00000 0 0 0 +GRID 121 0 0.56250 0.18750 0.00000 0 0 0 +GRID 122 0 0.60000 0.18750 0.00000 0 0 0 +GRID 123 0 0.63750 0.18750 0.00000 0 0 0 +GRID 124 0 0.67500 0.18750 0.00000 0 0 0 +GRID 125 0 0.71250 0.18750 0.00000 0 0 0 +GRID 126 0 0.75000 0.18750 0.00000 0 0 0 +GRID 127 0 0.00000 0.22500 0.00000 0 0 0 +GRID 128 0 0.03750 0.22500 0.00000 0 0 0 +GRID 129 0 0.07500 0.22500 0.00000 0 0 0 +GRID 130 0 0.11250 0.22500 0.00000 0 0 0 +GRID 131 0 0.15000 0.22500 0.00000 0 0 0 +GRID 132 0 0.18750 0.22500 0.00000 0 0 0 +GRID 133 0 0.22500 0.22500 0.00000 0 0 0 +GRID 134 0 0.26250 0.22500 0.00000 0 0 0 +GRID 135 0 0.30000 0.22500 0.00000 0 0 0 +GRID 136 0 0.33750 0.22500 0.00000 0 0 0 +GRID 137 0 0.37500 0.22500 0.00000 0 0 0 +GRID 138 0 0.41250 0.22500 0.00000 0 0 0 +GRID 139 0 0.45000 0.22500 0.00000 0 0 0 +GRID 140 0 0.48750 0.22500 0.00000 0 0 0 +GRID 141 0 0.52500 0.22500 0.00000 0 0 0 +GRID 142 0 0.56250 0.22500 0.00000 0 0 0 +GRID 143 0 0.60000 0.22500 0.00000 0 0 0 +GRID 144 0 0.63750 0.22500 0.00000 0 0 0 +GRID 145 0 0.67500 0.22500 0.00000 0 0 0 +GRID 146 0 0.71250 0.22500 0.00000 0 0 0 +GRID 147 0 0.75000 0.22500 0.00000 0 0 0 +GRID 148 0 0.00000 0.26250 0.00000 0 0 0 +GRID 149 0 0.03750 0.26250 0.00000 0 0 0 +GRID 150 0 0.07500 0.26250 0.00000 0 0 0 +GRID 151 0 0.11250 0.26250 0.00000 0 0 0 +GRID 152 0 0.15000 0.26250 0.00000 0 0 0 +GRID 153 0 0.18750 0.26250 0.00000 0 0 0 +GRID 154 0 0.22500 0.26250 0.00000 0 0 0 +GRID 155 0 0.26250 0.26250 0.00000 0 0 0 +GRID 156 0 0.30000 0.26250 0.00000 0 0 0 +GRID 157 0 0.33750 0.26250 0.00000 0 0 0 +GRID 158 0 0.37500 0.26250 0.00000 0 0 0 +GRID 159 0 0.41250 0.26250 0.00000 0 0 0 +GRID 160 0 0.45000 0.26250 0.00000 0 0 0 +GRID 161 0 0.48750 0.26250 0.00000 0 0 0 +GRID 162 0 0.52500 0.26250 0.00000 0 0 0 +GRID 163 0 0.56250 0.26250 0.00000 0 0 0 +GRID 164 0 0.60000 0.26250 0.00000 0 0 0 +GRID 165 0 0.63750 0.26250 0.00000 0 0 0 +GRID 166 0 0.67500 0.26250 0.00000 0 0 0 +GRID 167 0 0.71250 0.26250 0.00000 0 0 0 +GRID 168 0 0.75000 0.26250 0.00000 0 0 0 +GRID 169 0 0.00000 0.30000 0.00000 0 0 0 +GRID 170 0 0.03750 0.30000 0.00000 0 0 0 +GRID 171 0 0.07500 0.30000 0.00000 0 0 0 +GRID 172 0 0.11250 0.30000 0.00000 0 0 0 +GRID 173 0 0.15000 0.30000 0.00000 0 0 0 +GRID 174 0 0.18750 0.30000 0.00000 0 0 0 +GRID 175 0 0.22500 0.30000 0.00000 0 0 0 +GRID 176 0 0.26250 0.30000 0.00000 0 0 0 +GRID 177 0 0.30000 0.30000 0.00000 0 0 0 +GRID 178 0 0.33750 0.30000 0.00000 0 0 0 +GRID 179 0 0.37500 0.30000 0.00000 0 0 0 +GRID 180 0 0.41250 0.30000 0.00000 0 0 0 +GRID 181 0 0.45000 0.30000 0.00000 0 0 0 +GRID 182 0 0.48750 0.30000 0.00000 0 0 0 +GRID 183 0 0.52500 0.30000 0.00000 0 0 0 +GRID 184 0 0.56250 0.30000 0.00000 0 0 0 +GRID 185 0 0.60000 0.30000 0.00000 0 0 0 +GRID 186 0 0.63750 0.30000 0.00000 0 0 0 +GRID 187 0 0.67500 0.30000 0.00000 0 0 0 +GRID 188 0 0.71250 0.30000 0.00000 0 0 0 +GRID 189 0 0.75000 0.30000 0.00000 0 0 0 +GRID 190 0 0.00000 0.33750 0.00000 0 0 0 +GRID 191 0 0.03750 0.33750 0.00000 0 0 0 +GRID 192 0 0.07500 0.33750 0.00000 0 0 0 +GRID 193 0 0.11250 0.33750 0.00000 0 0 0 +GRID 194 0 0.15000 0.33750 0.00000 0 0 0 +GRID 195 0 0.18750 0.33750 0.00000 0 0 0 +GRID 196 0 0.22500 0.33750 0.00000 0 0 0 +GRID 197 0 0.26250 0.33750 0.00000 0 0 0 +GRID 198 0 0.30000 0.33750 0.00000 0 0 0 +GRID 199 0 0.33750 0.33750 0.00000 0 0 0 +GRID 200 0 0.37500 0.33750 0.00000 0 0 0 +GRID 201 0 0.41250 0.33750 0.00000 0 0 0 +GRID 202 0 0.45000 0.33750 0.00000 0 0 0 +GRID 203 0 0.48750 0.33750 0.00000 0 0 0 +GRID 204 0 0.52500 0.33750 0.00000 0 0 0 +GRID 205 0 0.56250 0.33750 0.00000 0 0 0 +GRID 206 0 0.60000 0.33750 0.00000 0 0 0 +GRID 207 0 0.63750 0.33750 0.00000 0 0 0 +GRID 208 0 0.67500 0.33750 0.00000 0 0 0 +GRID 209 0 0.71250 0.33750 0.00000 0 0 0 +GRID 210 0 0.75000 0.33750 0.00000 0 0 0 +GRID 211 0 0.00000 0.37500 0.00000 0 0 0 +GRID 212 0 0.03750 0.37500 0.00000 0 0 0 +GRID 213 0 0.07500 0.37500 0.00000 0 0 0 +GRID 214 0 0.11250 0.37500 0.00000 0 0 0 +GRID 215 0 0.15000 0.37500 0.00000 0 0 0 +GRID 216 0 0.18750 0.37500 0.00000 0 0 0 +GRID 217 0 0.22500 0.37500 0.00000 0 0 0 +GRID 218 0 0.26250 0.37500 0.00000 0 0 0 +GRID 219 0 0.30000 0.37500 0.00000 0 0 0 +GRID 220 0 0.33750 0.37500 0.00000 0 0 0 +GRID 221 0 0.37500 0.37500 0.00000 0 0 0 +GRID 222 0 0.41250 0.37500 0.00000 0 0 0 +GRID 223 0 0.45000 0.37500 0.00000 0 0 0 +GRID 224 0 0.48750 0.37500 0.00000 0 0 0 +GRID 225 0 0.52500 0.37500 0.00000 0 0 0 +GRID 226 0 0.56250 0.37500 0.00000 0 0 0 +GRID 227 0 0.60000 0.37500 0.00000 0 0 0 +GRID 228 0 0.63750 0.37500 0.00000 0 0 0 +GRID 229 0 0.67500 0.37500 0.00000 0 0 0 +GRID 230 0 0.71250 0.37500 0.00000 0 0 0 +GRID 231 0 0.75000 0.37500 0.00000 0 0 0 +GRID 232 0 0.00000 0.41250 0.00000 0 0 0 +GRID 233 0 0.03750 0.41250 0.00000 0 0 0 +GRID 234 0 0.07500 0.41250 0.00000 0 0 0 +GRID 235 0 0.11250 0.41250 0.00000 0 0 0 +GRID 236 0 0.15000 0.41250 0.00000 0 0 0 +GRID 237 0 0.18750 0.41250 0.00000 0 0 0 +GRID 238 0 0.22500 0.41250 0.00000 0 0 0 +GRID 239 0 0.26250 0.41250 0.00000 0 0 0 +GRID 240 0 0.30000 0.41250 0.00000 0 0 0 +GRID 241 0 0.33750 0.41250 0.00000 0 0 0 +GRID 242 0 0.37500 0.41250 0.00000 0 0 0 +GRID 243 0 0.41250 0.41250 0.00000 0 0 0 +GRID 244 0 0.45000 0.41250 0.00000 0 0 0 +GRID 245 0 0.48750 0.41250 0.00000 0 0 0 +GRID 246 0 0.52500 0.41250 0.00000 0 0 0 +GRID 247 0 0.56250 0.41250 0.00000 0 0 0 +GRID 248 0 0.60000 0.41250 0.00000 0 0 0 +GRID 249 0 0.63750 0.41250 0.00000 0 0 0 +GRID 250 0 0.67500 0.41250 0.00000 0 0 0 +GRID 251 0 0.71250 0.41250 0.00000 0 0 0 +GRID 252 0 0.75000 0.41250 0.00000 0 0 0 +GRID 253 0 0.00000 0.45000 0.00000 0 0 0 +GRID 254 0 0.03750 0.45000 0.00000 0 0 0 +GRID 255 0 0.07500 0.45000 0.00000 0 0 0 +GRID 256 0 0.11250 0.45000 0.00000 0 0 0 +GRID 257 0 0.15000 0.45000 0.00000 0 0 0 +GRID 258 0 0.18750 0.45000 0.00000 0 0 0 +GRID 259 0 0.22500 0.45000 0.00000 0 0 0 +GRID 260 0 0.26250 0.45000 0.00000 0 0 0 +GRID 261 0 0.30000 0.45000 0.00000 0 0 0 +GRID 262 0 0.33750 0.45000 0.00000 0 0 0 +GRID 263 0 0.37500 0.45000 0.00000 0 0 0 +GRID 264 0 0.41250 0.45000 0.00000 0 0 0 +GRID 265 0 0.45000 0.45000 0.00000 0 0 0 +GRID 266 0 0.48750 0.45000 0.00000 0 0 0 +GRID 267 0 0.52500 0.45000 0.00000 0 0 0 +GRID 268 0 0.56250 0.45000 0.00000 0 0 0 +GRID 269 0 0.60000 0.45000 0.00000 0 0 0 +GRID 270 0 0.63750 0.45000 0.00000 0 0 0 +GRID 271 0 0.67500 0.45000 0.00000 0 0 0 +GRID 272 0 0.71250 0.45000 0.00000 0 0 0 +GRID 273 0 0.75000 0.45000 0.00000 0 0 0 +GRID 274 0 0.00000 0.48750 0.00000 0 0 0 +GRID 275 0 0.03750 0.48750 0.00000 0 0 0 +GRID 276 0 0.07500 0.48750 0.00000 0 0 0 +GRID 277 0 0.11250 0.48750 0.00000 0 0 0 +GRID 278 0 0.15000 0.48750 0.00000 0 0 0 +GRID 279 0 0.18750 0.48750 0.00000 0 0 0 +GRID 280 0 0.22500 0.48750 0.00000 0 0 0 +GRID 281 0 0.26250 0.48750 0.00000 0 0 0 +GRID 282 0 0.30000 0.48750 0.00000 0 0 0 +GRID 283 0 0.33750 0.48750 0.00000 0 0 0 +GRID 284 0 0.37500 0.48750 0.00000 0 0 0 +GRID 285 0 0.41250 0.48750 0.00000 0 0 0 +GRID 286 0 0.45000 0.48750 0.00000 0 0 0 +GRID 287 0 0.48750 0.48750 0.00000 0 0 0 +GRID 288 0 0.52500 0.48750 0.00000 0 0 0 +GRID 289 0 0.56250 0.48750 0.00000 0 0 0 +GRID 290 0 0.60000 0.48750 0.00000 0 0 0 +GRID 291 0 0.63750 0.48750 0.00000 0 0 0 +GRID 292 0 0.67500 0.48750 0.00000 0 0 0 +GRID 293 0 0.71250 0.48750 0.00000 0 0 0 +GRID 294 0 0.75000 0.48750 0.00000 0 0 0 +GRID 295 0 0.00000 0.52500 0.00000 0 0 0 +GRID 296 0 0.03750 0.52500 0.00000 0 0 0 +GRID 297 0 0.07500 0.52500 0.00000 0 0 0 +GRID 298 0 0.11250 0.52500 0.00000 0 0 0 +GRID 299 0 0.15000 0.52500 0.00000 0 0 0 +GRID 300 0 0.18750 0.52500 0.00000 0 0 0 +GRID 301 0 0.22500 0.52500 0.00000 0 0 0 +GRID 302 0 0.26250 0.52500 0.00000 0 0 0 +GRID 303 0 0.30000 0.52500 0.00000 0 0 0 +GRID 304 0 0.33750 0.52500 0.00000 0 0 0 +GRID 305 0 0.37500 0.52500 0.00000 0 0 0 +GRID 306 0 0.41250 0.52500 0.00000 0 0 0 +GRID 307 0 0.45000 0.52500 0.00000 0 0 0 +GRID 308 0 0.48750 0.52500 0.00000 0 0 0 +GRID 309 0 0.52500 0.52500 0.00000 0 0 0 +GRID 310 0 0.56250 0.52500 0.00000 0 0 0 +GRID 311 0 0.60000 0.52500 0.00000 0 0 0 +GRID 312 0 0.63750 0.52500 0.00000 0 0 0 +GRID 313 0 0.67500 0.52500 0.00000 0 0 0 +GRID 314 0 0.71250 0.52500 0.00000 0 0 0 +GRID 315 0 0.75000 0.52500 0.00000 0 0 0 +GRID 316 0 0.00000 0.56250 0.00000 0 0 0 +GRID 317 0 0.03750 0.56250 0.00000 0 0 0 +GRID 318 0 0.07500 0.56250 0.00000 0 0 0 +GRID 319 0 0.11250 0.56250 0.00000 0 0 0 +GRID 320 0 0.15000 0.56250 0.00000 0 0 0 +GRID 321 0 0.18750 0.56250 0.00000 0 0 0 +GRID 322 0 0.22500 0.56250 0.00000 0 0 0 +GRID 323 0 0.26250 0.56250 0.00000 0 0 0 +GRID 324 0 0.30000 0.56250 0.00000 0 0 0 +GRID 325 0 0.33750 0.56250 0.00000 0 0 0 +GRID 326 0 0.37500 0.56250 0.00000 0 0 0 +GRID 327 0 0.41250 0.56250 0.00000 0 0 0 +GRID 328 0 0.45000 0.56250 0.00000 0 0 0 +GRID 329 0 0.48750 0.56250 0.00000 0 0 0 +GRID 330 0 0.52500 0.56250 0.00000 0 0 0 +GRID 331 0 0.56250 0.56250 0.00000 0 0 0 +GRID 332 0 0.60000 0.56250 0.00000 0 0 0 +GRID 333 0 0.63750 0.56250 0.00000 0 0 0 +GRID 334 0 0.67500 0.56250 0.00000 0 0 0 +GRID 335 0 0.71250 0.56250 0.00000 0 0 0 +GRID 336 0 0.75000 0.56250 0.00000 0 0 0 +GRID 337 0 0.00000 0.60000 0.00000 0 0 0 +GRID 338 0 0.03750 0.60000 0.00000 0 0 0 +GRID 339 0 0.07500 0.60000 0.00000 0 0 0 +GRID 340 0 0.11250 0.60000 0.00000 0 0 0 +GRID 341 0 0.15000 0.60000 0.00000 0 0 0 +GRID 342 0 0.18750 0.60000 0.00000 0 0 0 +GRID 343 0 0.22500 0.60000 0.00000 0 0 0 +GRID 344 0 0.26250 0.60000 0.00000 0 0 0 +GRID 345 0 0.30000 0.60000 0.00000 0 0 0 +GRID 346 0 0.33750 0.60000 0.00000 0 0 0 +GRID 347 0 0.37500 0.60000 0.00000 0 0 0 +GRID 348 0 0.41250 0.60000 0.00000 0 0 0 +GRID 349 0 0.45000 0.60000 0.00000 0 0 0 +GRID 350 0 0.48750 0.60000 0.00000 0 0 0 +GRID 351 0 0.52500 0.60000 0.00000 0 0 0 +GRID 352 0 0.56250 0.60000 0.00000 0 0 0 +GRID 353 0 0.60000 0.60000 0.00000 0 0 0 +GRID 354 0 0.63750 0.60000 0.00000 0 0 0 +GRID 355 0 0.67500 0.60000 0.00000 0 0 0 +GRID 356 0 0.71250 0.60000 0.00000 0 0 0 +GRID 357 0 0.75000 0.60000 0.00000 0 0 0 +GRID 358 0 0.00000 0.63750 0.00000 0 0 0 +GRID 359 0 0.03750 0.63750 0.00000 0 0 0 +GRID 360 0 0.07500 0.63750 0.00000 0 0 0 +GRID 361 0 0.11250 0.63750 0.00000 0 0 0 +GRID 362 0 0.15000 0.63750 0.00000 0 0 0 +GRID 363 0 0.18750 0.63750 0.00000 0 0 0 +GRID 364 0 0.22500 0.63750 0.00000 0 0 0 +GRID 365 0 0.26250 0.63750 0.00000 0 0 0 +GRID 366 0 0.30000 0.63750 0.00000 0 0 0 +GRID 367 0 0.33750 0.63750 0.00000 0 0 0 +GRID 368 0 0.37500 0.63750 0.00000 0 0 0 +GRID 369 0 0.41250 0.63750 0.00000 0 0 0 +GRID 370 0 0.45000 0.63750 0.00000 0 0 0 +GRID 371 0 0.48750 0.63750 0.00000 0 0 0 +GRID 372 0 0.52500 0.63750 0.00000 0 0 0 +GRID 373 0 0.56250 0.63750 0.00000 0 0 0 +GRID 374 0 0.60000 0.63750 0.00000 0 0 0 +GRID 375 0 0.63750 0.63750 0.00000 0 0 0 +GRID 376 0 0.67500 0.63750 0.00000 0 0 0 +GRID 377 0 0.71250 0.63750 0.00000 0 0 0 +GRID 378 0 0.75000 0.63750 0.00000 0 0 0 +GRID 379 0 0.00000 0.67500 0.00000 0 0 0 +GRID 380 0 0.03750 0.67500 0.00000 0 0 0 +GRID 381 0 0.07500 0.67500 0.00000 0 0 0 +GRID 382 0 0.11250 0.67500 0.00000 0 0 0 +GRID 383 0 0.15000 0.67500 0.00000 0 0 0 +GRID 384 0 0.18750 0.67500 0.00000 0 0 0 +GRID 385 0 0.22500 0.67500 0.00000 0 0 0 +GRID 386 0 0.26250 0.67500 0.00000 0 0 0 +GRID 387 0 0.30000 0.67500 0.00000 0 0 0 +GRID 388 0 0.33750 0.67500 0.00000 0 0 0 +GRID 389 0 0.37500 0.67500 0.00000 0 0 0 +GRID 390 0 0.41250 0.67500 0.00000 0 0 0 +GRID 391 0 0.45000 0.67500 0.00000 0 0 0 +GRID 392 0 0.48750 0.67500 0.00000 0 0 0 +GRID 393 0 0.52500 0.67500 0.00000 0 0 0 +GRID 394 0 0.56250 0.67500 0.00000 0 0 0 +GRID 395 0 0.60000 0.67500 0.00000 0 0 0 +GRID 396 0 0.63750 0.67500 0.00000 0 0 0 +GRID 397 0 0.67500 0.67500 0.00000 0 0 0 +GRID 398 0 0.71250 0.67500 0.00000 0 0 0 +GRID 399 0 0.75000 0.67500 0.00000 0 0 0 +GRID 400 0 0.00000 0.71250 0.00000 0 0 0 +GRID 401 0 0.03750 0.71250 0.00000 0 0 0 +GRID 402 0 0.07500 0.71250 0.00000 0 0 0 +GRID 403 0 0.11250 0.71250 0.00000 0 0 0 +GRID 404 0 0.15000 0.71250 0.00000 0 0 0 +GRID 405 0 0.18750 0.71250 0.00000 0 0 0 +GRID 406 0 0.22500 0.71250 0.00000 0 0 0 +GRID 407 0 0.26250 0.71250 0.00000 0 0 0 +GRID 408 0 0.30000 0.71250 0.00000 0 0 0 +GRID 409 0 0.33750 0.71250 0.00000 0 0 0 +GRID 410 0 0.37500 0.71250 0.00000 0 0 0 +GRID 411 0 0.41250 0.71250 0.00000 0 0 0 +GRID 412 0 0.45000 0.71250 0.00000 0 0 0 +GRID 413 0 0.48750 0.71250 0.00000 0 0 0 +GRID 414 0 0.52500 0.71250 0.00000 0 0 0 +GRID 415 0 0.56250 0.71250 0.00000 0 0 0 +GRID 416 0 0.60000 0.71250 0.00000 0 0 0 +GRID 417 0 0.63750 0.71250 0.00000 0 0 0 +GRID 418 0 0.67500 0.71250 0.00000 0 0 0 +GRID 419 0 0.71250 0.71250 0.00000 0 0 0 +GRID 420 0 0.75000 0.71250 0.00000 0 0 0 +GRID 421 0 0.00000 0.75000 0.00000 0 0 0 +GRID 422 0 0.03750 0.75000 0.00000 0 0 0 +GRID 423 0 0.07500 0.75000 0.00000 0 0 0 +GRID 424 0 0.11250 0.75000 0.00000 0 0 0 +GRID 425 0 0.15000 0.75000 0.00000 0 0 0 +GRID 426 0 0.18750 0.75000 0.00000 0 0 0 +GRID 427 0 0.22500 0.75000 0.00000 0 0 0 +GRID 428 0 0.26250 0.75000 0.00000 0 0 0 +GRID 429 0 0.30000 0.75000 0.00000 0 0 0 +GRID 430 0 0.33750 0.75000 0.00000 0 0 0 +GRID 431 0 0.37500 0.75000 0.00000 0 0 0 +GRID 432 0 0.41250 0.75000 0.00000 0 0 0 +GRID 433 0 0.45000 0.75000 0.00000 0 0 0 +GRID 434 0 0.48750 0.75000 0.00000 0 0 0 +GRID 435 0 0.52500 0.75000 0.00000 0 0 0 +GRID 436 0 0.56250 0.75000 0.00000 0 0 0 +GRID 437 0 0.60000 0.75000 0.00000 0 0 0 +GRID 438 0 0.63750 0.75000 0.00000 0 0 0 +GRID 439 0 0.67500 0.75000 0.00000 0 0 0 +GRID 440 0 0.71250 0.75000 0.00000 0 0 0 +GRID 441 0 0.75000 0.75000 0.00000 0 0 0 +GRID 442 0 0.00000 0.78750 0.00000 0 0 0 +GRID 443 0 0.03750 0.78750 0.00000 0 0 0 +GRID 444 0 0.07500 0.78750 0.00000 0 0 0 +GRID 445 0 0.11250 0.78750 0.00000 0 0 0 +GRID 446 0 0.15000 0.78750 0.00000 0 0 0 +GRID 447 0 0.18750 0.78750 0.00000 0 0 0 +GRID 448 0 0.22500 0.78750 0.00000 0 0 0 +GRID 449 0 0.26250 0.78750 0.00000 0 0 0 +GRID 450 0 0.30000 0.78750 0.00000 0 0 0 +GRID 451 0 0.33750 0.78750 0.00000 0 0 0 +GRID 452 0 0.37500 0.78750 0.00000 0 0 0 +GRID 453 0 0.41250 0.78750 0.00000 0 0 0 +GRID 454 0 0.45000 0.78750 0.00000 0 0 0 +GRID 455 0 0.48750 0.78750 0.00000 0 0 0 +GRID 456 0 0.52500 0.78750 0.00000 0 0 0 +GRID 457 0 0.56250 0.78750 0.00000 0 0 0 +GRID 458 0 0.60000 0.78750 0.00000 0 0 0 +GRID 459 0 0.63750 0.78750 0.00000 0 0 0 +GRID 460 0 0.67500 0.78750 0.00000 0 0 0 +GRID 461 0 0.71250 0.78750 0.00000 0 0 0 +GRID 462 0 0.75000 0.78750 0.00000 0 0 0 +GRID 463 0 0.00000 0.82500 0.00000 0 0 0 +GRID 464 0 0.03750 0.82500 0.00000 0 0 0 +GRID 465 0 0.07500 0.82500 0.00000 0 0 0 +GRID 466 0 0.11250 0.82500 0.00000 0 0 0 +GRID 467 0 0.15000 0.82500 0.00000 0 0 0 +GRID 468 0 0.18750 0.82500 0.00000 0 0 0 +GRID 469 0 0.22500 0.82500 0.00000 0 0 0 +GRID 470 0 0.26250 0.82500 0.00000 0 0 0 +GRID 471 0 0.30000 0.82500 0.00000 0 0 0 +GRID 472 0 0.33750 0.82500 0.00000 0 0 0 +GRID 473 0 0.37500 0.82500 0.00000 0 0 0 +GRID 474 0 0.41250 0.82500 0.00000 0 0 0 +GRID 475 0 0.45000 0.82500 0.00000 0 0 0 +GRID 476 0 0.48750 0.82500 0.00000 0 0 0 +GRID 477 0 0.52500 0.82500 0.00000 0 0 0 +GRID 478 0 0.56250 0.82500 0.00000 0 0 0 +GRID 479 0 0.60000 0.82500 0.00000 0 0 0 +GRID 480 0 0.63750 0.82500 0.00000 0 0 0 +GRID 481 0 0.67500 0.82500 0.00000 0 0 0 +GRID 482 0 0.71250 0.82500 0.00000 0 0 0 +GRID 483 0 0.75000 0.82500 0.00000 0 0 0 +GRID 484 0 0.00000 0.86250 0.00000 0 0 0 +GRID 485 0 0.03750 0.86250 0.00000 0 0 0 +GRID 486 0 0.07500 0.86250 0.00000 0 0 0 +GRID 487 0 0.11250 0.86250 0.00000 0 0 0 +GRID 488 0 0.15000 0.86250 0.00000 0 0 0 +GRID 489 0 0.18750 0.86250 0.00000 0 0 0 +GRID 490 0 0.22500 0.86250 0.00000 0 0 0 +GRID 491 0 0.26250 0.86250 0.00000 0 0 0 +GRID 492 0 0.30000 0.86250 0.00000 0 0 0 +GRID 493 0 0.33750 0.86250 0.00000 0 0 0 +GRID 494 0 0.37500 0.86250 0.00000 0 0 0 +GRID 495 0 0.41250 0.86250 0.00000 0 0 0 +GRID 496 0 0.45000 0.86250 0.00000 0 0 0 +GRID 497 0 0.48750 0.86250 0.00000 0 0 0 +GRID 498 0 0.52500 0.86250 0.00000 0 0 0 +GRID 499 0 0.56250 0.86250 0.00000 0 0 0 +GRID 500 0 0.60000 0.86250 0.00000 0 0 0 +GRID 501 0 0.63750 0.86250 0.00000 0 0 0 +GRID 502 0 0.67500 0.86250 0.00000 0 0 0 +GRID 503 0 0.71250 0.86250 0.00000 0 0 0 +GRID 504 0 0.75000 0.86250 0.00000 0 0 0 +GRID 505 0 0.00000 0.90000 0.00000 0 0 0 +GRID 506 0 0.03750 0.90000 0.00000 0 0 0 +GRID 507 0 0.07500 0.90000 0.00000 0 0 0 +GRID 508 0 0.11250 0.90000 0.00000 0 0 0 +GRID 509 0 0.15000 0.90000 0.00000 0 0 0 +GRID 510 0 0.18750 0.90000 0.00000 0 0 0 +GRID 511 0 0.22500 0.90000 0.00000 0 0 0 +GRID 512 0 0.26250 0.90000 0.00000 0 0 0 +GRID 513 0 0.30000 0.90000 0.00000 0 0 0 +GRID 514 0 0.33750 0.90000 0.00000 0 0 0 +GRID 515 0 0.37500 0.90000 0.00000 0 0 0 +GRID 516 0 0.41250 0.90000 0.00000 0 0 0 +GRID 517 0 0.45000 0.90000 0.00000 0 0 0 +GRID 518 0 0.48750 0.90000 0.00000 0 0 0 +GRID 519 0 0.52500 0.90000 0.00000 0 0 0 +GRID 520 0 0.56250 0.90000 0.00000 0 0 0 +GRID 521 0 0.60000 0.90000 0.00000 0 0 0 +GRID 522 0 0.63750 0.90000 0.00000 0 0 0 +GRID 523 0 0.67500 0.90000 0.00000 0 0 0 +GRID 524 0 0.71250 0.90000 0.00000 0 0 0 +GRID 525 0 0.75000 0.90000 0.00000 0 0 0 +GRID 526 0 0.00000 0.93750 0.00000 0 0 0 +GRID 527 0 0.03750 0.93750 0.00000 0 0 0 +GRID 528 0 0.07500 0.93750 0.00000 0 0 0 +GRID 529 0 0.11250 0.93750 0.00000 0 0 0 +GRID 530 0 0.15000 0.93750 0.00000 0 0 0 +GRID 531 0 0.18750 0.93750 0.00000 0 0 0 +GRID 532 0 0.22500 0.93750 0.00000 0 0 0 +GRID 533 0 0.26250 0.93750 0.00000 0 0 0 +GRID 534 0 0.30000 0.93750 0.00000 0 0 0 +GRID 535 0 0.33750 0.93750 0.00000 0 0 0 +GRID 536 0 0.37500 0.93750 0.00000 0 0 0 +GRID 537 0 0.41250 0.93750 0.00000 0 0 0 +GRID 538 0 0.45000 0.93750 0.00000 0 0 0 +GRID 539 0 0.48750 0.93750 0.00000 0 0 0 +GRID 540 0 0.52500 0.93750 0.00000 0 0 0 +GRID 541 0 0.56250 0.93750 0.00000 0 0 0 +GRID 542 0 0.60000 0.93750 0.00000 0 0 0 +GRID 543 0 0.63750 0.93750 0.00000 0 0 0 +GRID 544 0 0.67500 0.93750 0.00000 0 0 0 +GRID 545 0 0.71250 0.93750 0.00000 0 0 0 +GRID 546 0 0.75000 0.93750 0.00000 0 0 0 +GRID 547 0 0.00000 0.97500 0.00000 0 0 0 +GRID 548 0 0.03750 0.97500 0.00000 0 0 0 +GRID 549 0 0.07500 0.97500 0.00000 0 0 0 +GRID 550 0 0.11250 0.97500 0.00000 0 0 0 +GRID 551 0 0.15000 0.97500 0.00000 0 0 0 +GRID 552 0 0.18750 0.97500 0.00000 0 0 0 +GRID 553 0 0.22500 0.97500 0.00000 0 0 0 +GRID 554 0 0.26250 0.97500 0.00000 0 0 0 +GRID 555 0 0.30000 0.97500 0.00000 0 0 0 +GRID 556 0 0.33750 0.97500 0.00000 0 0 0 +GRID 557 0 0.37500 0.97500 0.00000 0 0 0 +GRID 558 0 0.41250 0.97500 0.00000 0 0 0 +GRID 559 0 0.45000 0.97500 0.00000 0 0 0 +GRID 560 0 0.48750 0.97500 0.00000 0 0 0 +GRID 561 0 0.52500 0.97500 0.00000 0 0 0 +GRID 562 0 0.56250 0.97500 0.00000 0 0 0 +GRID 563 0 0.60000 0.97500 0.00000 0 0 0 +GRID 564 0 0.63750 0.97500 0.00000 0 0 0 +GRID 565 0 0.67500 0.97500 0.00000 0 0 0 +GRID 566 0 0.71250 0.97500 0.00000 0 0 0 +GRID 567 0 0.75000 0.97500 0.00000 0 0 0 +GRID 568 0 0.00000 1.01250 0.00000 0 0 0 +GRID 569 0 0.03750 1.01250 0.00000 0 0 0 +GRID 570 0 0.07500 1.01250 0.00000 0 0 0 +GRID 571 0 0.11250 1.01250 0.00000 0 0 0 +GRID 572 0 0.15000 1.01250 0.00000 0 0 0 +GRID 573 0 0.18750 1.01250 0.00000 0 0 0 +GRID 574 0 0.22500 1.01250 0.00000 0 0 0 +GRID 575 0 0.26250 1.01250 0.00000 0 0 0 +GRID 576 0 0.30000 1.01250 0.00000 0 0 0 +GRID 577 0 0.33750 1.01250 0.00000 0 0 0 +GRID 578 0 0.37500 1.01250 0.00000 0 0 0 +GRID 579 0 0.41250 1.01250 0.00000 0 0 0 +GRID 580 0 0.45000 1.01250 0.00000 0 0 0 +GRID 581 0 0.48750 1.01250 0.00000 0 0 0 +GRID 582 0 0.52500 1.01250 0.00000 0 0 0 +GRID 583 0 0.56250 1.01250 0.00000 0 0 0 +GRID 584 0 0.60000 1.01250 0.00000 0 0 0 +GRID 585 0 0.63750 1.01250 0.00000 0 0 0 +GRID 586 0 0.67500 1.01250 0.00000 0 0 0 +GRID 587 0 0.71250 1.01250 0.00000 0 0 0 +GRID 588 0 0.75000 1.01250 0.00000 0 0 0 +GRID 589 0 0.00000 1.05000 0.00000 0 0 0 +GRID 590 0 0.03750 1.05000 0.00000 0 0 0 +GRID 591 0 0.07500 1.05000 0.00000 0 0 0 +GRID 592 0 0.11250 1.05000 0.00000 0 0 0 +GRID 593 0 0.15000 1.05000 0.00000 0 0 0 +GRID 594 0 0.18750 1.05000 0.00000 0 0 0 +GRID 595 0 0.22500 1.05000 0.00000 0 0 0 +GRID 596 0 0.26250 1.05000 0.00000 0 0 0 +GRID 597 0 0.30000 1.05000 0.00000 0 0 0 +GRID 598 0 0.33750 1.05000 0.00000 0 0 0 +GRID 599 0 0.37500 1.05000 0.00000 0 0 0 +GRID 600 0 0.41250 1.05000 0.00000 0 0 0 +GRID 601 0 0.45000 1.05000 0.00000 0 0 0 +GRID 602 0 0.48750 1.05000 0.00000 0 0 0 +GRID 603 0 0.52500 1.05000 0.00000 0 0 0 +GRID 604 0 0.56250 1.05000 0.00000 0 0 0 +GRID 605 0 0.60000 1.05000 0.00000 0 0 0 +GRID 606 0 0.63750 1.05000 0.00000 0 0 0 +GRID 607 0 0.67500 1.05000 0.00000 0 0 0 +GRID 608 0 0.71250 1.05000 0.00000 0 0 0 +GRID 609 0 0.75000 1.05000 0.00000 0 0 0 +GRID 610 0 0.00000 1.08750 0.00000 0 0 0 +GRID 611 0 0.03750 1.08750 0.00000 0 0 0 +GRID 612 0 0.07500 1.08750 0.00000 0 0 0 +GRID 613 0 0.11250 1.08750 0.00000 0 0 0 +GRID 614 0 0.15000 1.08750 0.00000 0 0 0 +GRID 615 0 0.18750 1.08750 0.00000 0 0 0 +GRID 616 0 0.22500 1.08750 0.00000 0 0 0 +GRID 617 0 0.26250 1.08750 0.00000 0 0 0 +GRID 618 0 0.30000 1.08750 0.00000 0 0 0 +GRID 619 0 0.33750 1.08750 0.00000 0 0 0 +GRID 620 0 0.37500 1.08750 0.00000 0 0 0 +GRID 621 0 0.41250 1.08750 0.00000 0 0 0 +GRID 622 0 0.45000 1.08750 0.00000 0 0 0 +GRID 623 0 0.48750 1.08750 0.00000 0 0 0 +GRID 624 0 0.52500 1.08750 0.00000 0 0 0 +GRID 625 0 0.56250 1.08750 0.00000 0 0 0 +GRID 626 0 0.60000 1.08750 0.00000 0 0 0 +GRID 627 0 0.63750 1.08750 0.00000 0 0 0 +GRID 628 0 0.67500 1.08750 0.00000 0 0 0 +GRID 629 0 0.71250 1.08750 0.00000 0 0 0 +GRID 630 0 0.75000 1.08750 0.00000 0 0 0 +GRID 631 0 0.00000 1.12500 0.00000 0 0 0 +GRID 632 0 0.03750 1.12500 0.00000 0 0 0 +GRID 633 0 0.07500 1.12500 0.00000 0 0 0 +GRID 634 0 0.11250 1.12500 0.00000 0 0 0 +GRID 635 0 0.15000 1.12500 0.00000 0 0 0 +GRID 636 0 0.18750 1.12500 0.00000 0 0 0 +GRID 637 0 0.22500 1.12500 0.00000 0 0 0 +GRID 638 0 0.26250 1.12500 0.00000 0 0 0 +GRID 639 0 0.30000 1.12500 0.00000 0 0 0 +GRID 640 0 0.33750 1.12500 0.00000 0 0 0 +GRID 641 0 0.37500 1.12500 0.00000 0 0 0 +GRID 642 0 0.41250 1.12500 0.00000 0 0 0 +GRID 643 0 0.45000 1.12500 0.00000 0 0 0 +GRID 644 0 0.48750 1.12500 0.00000 0 0 0 +GRID 645 0 0.52500 1.12500 0.00000 0 0 0 +GRID 646 0 0.56250 1.12500 0.00000 0 0 0 +GRID 647 0 0.60000 1.12500 0.00000 0 0 0 +GRID 648 0 0.63750 1.12500 0.00000 0 0 0 +GRID 649 0 0.67500 1.12500 0.00000 0 0 0 +GRID 650 0 0.71250 1.12500 0.00000 0 0 0 +GRID 651 0 0.75000 1.12500 0.00000 0 0 0 +GRID 652 0 0.00000 1.16250 0.00000 0 0 0 +GRID 653 0 0.03750 1.16250 0.00000 0 0 0 +GRID 654 0 0.07500 1.16250 0.00000 0 0 0 +GRID 655 0 0.11250 1.16250 0.00000 0 0 0 +GRID 656 0 0.15000 1.16250 0.00000 0 0 0 +GRID 657 0 0.18750 1.16250 0.00000 0 0 0 +GRID 658 0 0.22500 1.16250 0.00000 0 0 0 +GRID 659 0 0.26250 1.16250 0.00000 0 0 0 +GRID 660 0 0.30000 1.16250 0.00000 0 0 0 +GRID 661 0 0.33750 1.16250 0.00000 0 0 0 +GRID 662 0 0.37500 1.16250 0.00000 0 0 0 +GRID 663 0 0.41250 1.16250 0.00000 0 0 0 +GRID 664 0 0.45000 1.16250 0.00000 0 0 0 +GRID 665 0 0.48750 1.16250 0.00000 0 0 0 +GRID 666 0 0.52500 1.16250 0.00000 0 0 0 +GRID 667 0 0.56250 1.16250 0.00000 0 0 0 +GRID 668 0 0.60000 1.16250 0.00000 0 0 0 +GRID 669 0 0.63750 1.16250 0.00000 0 0 0 +GRID 670 0 0.67500 1.16250 0.00000 0 0 0 +GRID 671 0 0.71250 1.16250 0.00000 0 0 0 +GRID 672 0 0.75000 1.16250 0.00000 0 0 0 +GRID 673 0 0.00000 1.20000 0.00000 0 0 0 +GRID 674 0 0.03750 1.20000 0.00000 0 0 0 +GRID 675 0 0.07500 1.20000 0.00000 0 0 0 +GRID 676 0 0.11250 1.20000 0.00000 0 0 0 +GRID 677 0 0.15000 1.20000 0.00000 0 0 0 +GRID 678 0 0.18750 1.20000 0.00000 0 0 0 +GRID 679 0 0.22500 1.20000 0.00000 0 0 0 +GRID 680 0 0.26250 1.20000 0.00000 0 0 0 +GRID 681 0 0.30000 1.20000 0.00000 0 0 0 +GRID 682 0 0.33750 1.20000 0.00000 0 0 0 +GRID 683 0 0.37500 1.20000 0.00000 0 0 0 +GRID 684 0 0.41250 1.20000 0.00000 0 0 0 +GRID 685 0 0.45000 1.20000 0.00000 0 0 0 +GRID 686 0 0.48750 1.20000 0.00000 0 0 0 +GRID 687 0 0.52500 1.20000 0.00000 0 0 0 +GRID 688 0 0.56250 1.20000 0.00000 0 0 0 +GRID 689 0 0.60000 1.20000 0.00000 0 0 0 +GRID 690 0 0.63750 1.20000 0.00000 0 0 0 +GRID 691 0 0.67500 1.20000 0.00000 0 0 0 +GRID 692 0 0.71250 1.20000 0.00000 0 0 0 +GRID 693 0 0.75000 1.20000 0.00000 0 0 0 +GRID 694 0 0.00000 1.23750 0.00000 0 0 0 +GRID 695 0 0.03750 1.23750 0.00000 0 0 0 +GRID 696 0 0.07500 1.23750 0.00000 0 0 0 +GRID 697 0 0.11250 1.23750 0.00000 0 0 0 +GRID 698 0 0.15000 1.23750 0.00000 0 0 0 +GRID 699 0 0.18750 1.23750 0.00000 0 0 0 +GRID 700 0 0.22500 1.23750 0.00000 0 0 0 +GRID 701 0 0.26250 1.23750 0.00000 0 0 0 +GRID 702 0 0.30000 1.23750 0.00000 0 0 0 +GRID 703 0 0.33750 1.23750 0.00000 0 0 0 +GRID 704 0 0.37500 1.23750 0.00000 0 0 0 +GRID 705 0 0.41250 1.23750 0.00000 0 0 0 +GRID 706 0 0.45000 1.23750 0.00000 0 0 0 +GRID 707 0 0.48750 1.23750 0.00000 0 0 0 +GRID 708 0 0.52500 1.23750 0.00000 0 0 0 +GRID 709 0 0.56250 1.23750 0.00000 0 0 0 +GRID 710 0 0.60000 1.23750 0.00000 0 0 0 +GRID 711 0 0.63750 1.23750 0.00000 0 0 0 +GRID 712 0 0.67500 1.23750 0.00000 0 0 0 +GRID 713 0 0.71250 1.23750 0.00000 0 0 0 +GRID 714 0 0.75000 1.23750 0.00000 0 0 0 +GRID 715 0 0.00000 1.27500 0.00000 0 0 0 +GRID 716 0 0.03750 1.27500 0.00000 0 0 0 +GRID 717 0 0.07500 1.27500 0.00000 0 0 0 +GRID 718 0 0.11250 1.27500 0.00000 0 0 0 +GRID 719 0 0.15000 1.27500 0.00000 0 0 0 +GRID 720 0 0.18750 1.27500 0.00000 0 0 0 +GRID 721 0 0.22500 1.27500 0.00000 0 0 0 +GRID 722 0 0.26250 1.27500 0.00000 0 0 0 +GRID 723 0 0.30000 1.27500 0.00000 0 0 0 +GRID 724 0 0.33750 1.27500 0.00000 0 0 0 +GRID 725 0 0.37500 1.27500 0.00000 0 0 0 +GRID 726 0 0.41250 1.27500 0.00000 0 0 0 +GRID 727 0 0.45000 1.27500 0.00000 0 0 0 +GRID 728 0 0.48750 1.27500 0.00000 0 0 0 +GRID 729 0 0.52500 1.27500 0.00000 0 0 0 +GRID 730 0 0.56250 1.27500 0.00000 0 0 0 +GRID 731 0 0.60000 1.27500 0.00000 0 0 0 +GRID 732 0 0.63750 1.27500 0.00000 0 0 0 +GRID 733 0 0.67500 1.27500 0.00000 0 0 0 +GRID 734 0 0.71250 1.27500 0.00000 0 0 0 +GRID 735 0 0.75000 1.27500 0.00000 0 0 0 +GRID 736 0 0.00000 1.31250 0.00000 0 0 0 +GRID 737 0 0.03750 1.31250 0.00000 0 0 0 +GRID 738 0 0.07500 1.31250 0.00000 0 0 0 +GRID 739 0 0.11250 1.31250 0.00000 0 0 0 +GRID 740 0 0.15000 1.31250 0.00000 0 0 0 +GRID 741 0 0.18750 1.31250 0.00000 0 0 0 +GRID 742 0 0.22500 1.31250 0.00000 0 0 0 +GRID 743 0 0.26250 1.31250 0.00000 0 0 0 +GRID 744 0 0.30000 1.31250 0.00000 0 0 0 +GRID 745 0 0.33750 1.31250 0.00000 0 0 0 +GRID 746 0 0.37500 1.31250 0.00000 0 0 0 +GRID 747 0 0.41250 1.31250 0.00000 0 0 0 +GRID 748 0 0.45000 1.31250 0.00000 0 0 0 +GRID 749 0 0.48750 1.31250 0.00000 0 0 0 +GRID 750 0 0.52500 1.31250 0.00000 0 0 0 +GRID 751 0 0.56250 1.31250 0.00000 0 0 0 +GRID 752 0 0.60000 1.31250 0.00000 0 0 0 +GRID 753 0 0.63750 1.31250 0.00000 0 0 0 +GRID 754 0 0.67500 1.31250 0.00000 0 0 0 +GRID 755 0 0.71250 1.31250 0.00000 0 0 0 +GRID 756 0 0.75000 1.31250 0.00000 0 0 0 +GRID 757 0 0.00000 1.35000 0.00000 0 0 0 +GRID 758 0 0.03750 1.35000 0.00000 0 0 0 +GRID 759 0 0.07500 1.35000 0.00000 0 0 0 +GRID 760 0 0.11250 1.35000 0.00000 0 0 0 +GRID 761 0 0.15000 1.35000 0.00000 0 0 0 +GRID 762 0 0.18750 1.35000 0.00000 0 0 0 +GRID 763 0 0.22500 1.35000 0.00000 0 0 0 +GRID 764 0 0.26250 1.35000 0.00000 0 0 0 +GRID 765 0 0.30000 1.35000 0.00000 0 0 0 +GRID 766 0 0.33750 1.35000 0.00000 0 0 0 +GRID 767 0 0.37500 1.35000 0.00000 0 0 0 +GRID 768 0 0.41250 1.35000 0.00000 0 0 0 +GRID 769 0 0.45000 1.35000 0.00000 0 0 0 +GRID 770 0 0.48750 1.35000 0.00000 0 0 0 +GRID 771 0 0.52500 1.35000 0.00000 0 0 0 +GRID 772 0 0.56250 1.35000 0.00000 0 0 0 +GRID 773 0 0.60000 1.35000 0.00000 0 0 0 +GRID 774 0 0.63750 1.35000 0.00000 0 0 0 +GRID 775 0 0.67500 1.35000 0.00000 0 0 0 +GRID 776 0 0.71250 1.35000 0.00000 0 0 0 +GRID 777 0 0.75000 1.35000 0.00000 0 0 0 +GRID 778 0 0.00000 1.38750 0.00000 0 0 0 +GRID 779 0 0.03750 1.38750 0.00000 0 0 0 +GRID 780 0 0.07500 1.38750 0.00000 0 0 0 +GRID 781 0 0.11250 1.38750 0.00000 0 0 0 +GRID 782 0 0.15000 1.38750 0.00000 0 0 0 +GRID 783 0 0.18750 1.38750 0.00000 0 0 0 +GRID 784 0 0.22500 1.38750 0.00000 0 0 0 +GRID 785 0 0.26250 1.38750 0.00000 0 0 0 +GRID 786 0 0.30000 1.38750 0.00000 0 0 0 +GRID 787 0 0.33750 1.38750 0.00000 0 0 0 +GRID 788 0 0.37500 1.38750 0.00000 0 0 0 +GRID 789 0 0.41250 1.38750 0.00000 0 0 0 +GRID 790 0 0.45000 1.38750 0.00000 0 0 0 +GRID 791 0 0.48750 1.38750 0.00000 0 0 0 +GRID 792 0 0.52500 1.38750 0.00000 0 0 0 +GRID 793 0 0.56250 1.38750 0.00000 0 0 0 +GRID 794 0 0.60000 1.38750 0.00000 0 0 0 +GRID 795 0 0.63750 1.38750 0.00000 0 0 0 +GRID 796 0 0.67500 1.38750 0.00000 0 0 0 +GRID 797 0 0.71250 1.38750 0.00000 0 0 0 +GRID 798 0 0.75000 1.38750 0.00000 0 0 0 +GRID 799 0 0.00000 1.42500 0.00000 0 0 0 +GRID 800 0 0.03750 1.42500 0.00000 0 0 0 +GRID 801 0 0.07500 1.42500 0.00000 0 0 0 +GRID 802 0 0.11250 1.42500 0.00000 0 0 0 +GRID 803 0 0.15000 1.42500 0.00000 0 0 0 +GRID 804 0 0.18750 1.42500 0.00000 0 0 0 +GRID 805 0 0.22500 1.42500 0.00000 0 0 0 +GRID 806 0 0.26250 1.42500 0.00000 0 0 0 +GRID 807 0 0.30000 1.42500 0.00000 0 0 0 +GRID 808 0 0.33750 1.42500 0.00000 0 0 0 +GRID 809 0 0.37500 1.42500 0.00000 0 0 0 +GRID 810 0 0.41250 1.42500 0.00000 0 0 0 +GRID 811 0 0.45000 1.42500 0.00000 0 0 0 +GRID 812 0 0.48750 1.42500 0.00000 0 0 0 +GRID 813 0 0.52500 1.42500 0.00000 0 0 0 +GRID 814 0 0.56250 1.42500 0.00000 0 0 0 +GRID 815 0 0.60000 1.42500 0.00000 0 0 0 +GRID 816 0 0.63750 1.42500 0.00000 0 0 0 +GRID 817 0 0.67500 1.42500 0.00000 0 0 0 +GRID 818 0 0.71250 1.42500 0.00000 0 0 0 +GRID 819 0 0.75000 1.42500 0.00000 0 0 0 +GRID 820 0 0.00000 1.46250 0.00000 0 0 0 +GRID 821 0 0.03750 1.46250 0.00000 0 0 0 +GRID 822 0 0.07500 1.46250 0.00000 0 0 0 +GRID 823 0 0.11250 1.46250 0.00000 0 0 0 +GRID 824 0 0.15000 1.46250 0.00000 0 0 0 +GRID 825 0 0.18750 1.46250 0.00000 0 0 0 +GRID 826 0 0.22500 1.46250 0.00000 0 0 0 +GRID 827 0 0.26250 1.46250 0.00000 0 0 0 +GRID 828 0 0.30000 1.46250 0.00000 0 0 0 +GRID 829 0 0.33750 1.46250 0.00000 0 0 0 +GRID 830 0 0.37500 1.46250 0.00000 0 0 0 +GRID 831 0 0.41250 1.46250 0.00000 0 0 0 +GRID 832 0 0.45000 1.46250 0.00000 0 0 0 +GRID 833 0 0.48750 1.46250 0.00000 0 0 0 +GRID 834 0 0.52500 1.46250 0.00000 0 0 0 +GRID 835 0 0.56250 1.46250 0.00000 0 0 0 +GRID 836 0 0.60000 1.46250 0.00000 0 0 0 +GRID 837 0 0.63750 1.46250 0.00000 0 0 0 +GRID 838 0 0.67500 1.46250 0.00000 0 0 0 +GRID 839 0 0.71250 1.46250 0.00000 0 0 0 +GRID 840 0 0.75000 1.46250 0.00000 0 0 0 +GRID 841 0 0.00000 1.50000 0.00000 0 0 0 +GRID 842 0 0.03750 1.50000 0.00000 0 0 0 +GRID 843 0 0.07500 1.50000 0.00000 0 0 0 +GRID 844 0 0.11250 1.50000 0.00000 0 0 0 +GRID 845 0 0.15000 1.50000 0.00000 0 0 0 +GRID 846 0 0.18750 1.50000 0.00000 0 0 0 +GRID 847 0 0.22500 1.50000 0.00000 0 0 0 +GRID 848 0 0.26250 1.50000 0.00000 0 0 0 +GRID 849 0 0.30000 1.50000 0.00000 0 0 0 +GRID 850 0 0.33750 1.50000 0.00000 0 0 0 +GRID 851 0 0.37500 1.50000 0.00000 0 0 0 +GRID 852 0 0.41250 1.50000 0.00000 0 0 0 +GRID 853 0 0.45000 1.50000 0.00000 0 0 0 +GRID 854 0 0.48750 1.50000 0.00000 0 0 0 +GRID 855 0 0.52500 1.50000 0.00000 0 0 0 +GRID 856 0 0.56250 1.50000 0.00000 0 0 0 +GRID 857 0 0.60000 1.50000 0.00000 0 0 0 +GRID 858 0 0.63750 1.50000 0.00000 0 0 0 +GRID 859 0 0.67500 1.50000 0.00000 0 0 0 +GRID 860 0 0.71250 1.50000 0.00000 0 0 0 +GRID 861 0 0.75000 1.50000 0.00000 0 0 0 +$ Shell element data for family PLATE.000/SEG.00 +CQUAD4 1 1 1 22 23 2 +CQUAD4 2 1 2 23 24 3 +CQUAD4 3 1 3 24 25 4 +CQUAD4 4 1 4 25 26 5 +CQUAD4 5 1 5 26 27 6 +CQUAD4 6 1 6 27 28 7 +CQUAD4 7 1 7 28 29 8 +CQUAD4 8 1 8 29 30 9 +CQUAD4 9 1 9 30 31 10 +CQUAD4 10 1 10 31 32 11 +CQUAD4 11 1 11 32 33 12 +CQUAD4 12 1 12 33 34 13 +CQUAD4 13 1 13 34 35 14 +CQUAD4 14 1 14 35 36 15 +CQUAD4 15 1 15 36 37 16 +CQUAD4 16 1 16 37 38 17 +CQUAD4 17 1 17 38 39 18 +CQUAD4 18 1 18 39 40 19 +CQUAD4 19 1 19 40 41 20 +CQUAD4 20 1 20 41 42 21 +CQUAD4 21 1 22 43 44 23 +CQUAD4 22 1 23 44 45 24 +CQUAD4 23 1 24 45 46 25 +CQUAD4 24 1 25 46 47 26 +CQUAD4 25 1 26 47 48 27 +CQUAD4 26 1 27 48 49 28 +CQUAD4 27 1 28 49 50 29 +CQUAD4 28 1 29 50 51 30 +CQUAD4 29 1 30 51 52 31 +CQUAD4 30 1 31 52 53 32 +CQUAD4 31 1 32 53 54 33 +CQUAD4 32 1 33 54 55 34 +CQUAD4 33 1 34 55 56 35 +CQUAD4 34 1 35 56 57 36 +CQUAD4 35 1 36 57 58 37 +CQUAD4 36 1 37 58 59 38 +CQUAD4 37 1 38 59 60 39 +CQUAD4 38 1 39 60 61 40 +CQUAD4 39 1 40 61 62 41 +CQUAD4 40 1 41 62 63 42 +CQUAD4 41 1 43 64 65 44 +CQUAD4 42 1 44 65 66 45 +CQUAD4 43 1 45 66 67 46 +CQUAD4 44 1 46 67 68 47 +CQUAD4 45 1 47 68 69 48 +CQUAD4 46 1 48 69 70 49 +CQUAD4 47 1 49 70 71 50 +CQUAD4 48 1 50 71 72 51 +CQUAD4 49 1 51 72 73 52 +CQUAD4 50 1 52 73 74 53 +CQUAD4 51 1 53 74 75 54 +CQUAD4 52 1 54 75 76 55 +CQUAD4 53 1 55 76 77 56 +CQUAD4 54 1 56 77 78 57 +CQUAD4 55 1 57 78 79 58 +CQUAD4 56 1 58 79 80 59 +CQUAD4 57 1 59 80 81 60 +CQUAD4 58 1 60 81 82 61 +CQUAD4 59 1 61 82 83 62 +CQUAD4 60 1 62 83 84 63 +CQUAD4 61 1 64 85 86 65 +CQUAD4 62 1 65 86 87 66 +CQUAD4 63 1 66 87 88 67 +CQUAD4 64 1 67 88 89 68 +CQUAD4 65 1 68 89 90 69 +CQUAD4 66 1 69 90 91 70 +CQUAD4 67 1 70 91 92 71 +CQUAD4 68 1 71 92 93 72 +CQUAD4 69 1 72 93 94 73 +CQUAD4 70 1 73 94 95 74 +CQUAD4 71 1 74 95 96 75 +CQUAD4 72 1 75 96 97 76 +CQUAD4 73 1 76 97 98 77 +CQUAD4 74 1 77 98 99 78 +CQUAD4 75 1 78 99 100 79 +CQUAD4 76 1 79 100 101 80 +CQUAD4 77 1 80 101 102 81 +CQUAD4 78 1 81 102 103 82 +CQUAD4 79 1 82 103 104 83 +CQUAD4 80 1 83 104 105 84 +CQUAD4 81 1 85 106 107 86 +CQUAD4 82 1 86 107 108 87 +CQUAD4 83 1 87 108 109 88 +CQUAD4 84 1 88 109 110 89 +CQUAD4 85 1 89 110 111 90 +CQUAD4 86 1 90 111 112 91 +CQUAD4 87 1 91 112 113 92 +CQUAD4 88 1 92 113 114 93 +CQUAD4 89 1 93 114 115 94 +CQUAD4 90 1 94 115 116 95 +CQUAD4 91 1 95 116 117 96 +CQUAD4 92 1 96 117 118 97 +CQUAD4 93 1 97 118 119 98 +CQUAD4 94 1 98 119 120 99 +CQUAD4 95 1 99 120 121 100 +CQUAD4 96 1 100 121 122 101 +CQUAD4 97 1 101 122 123 102 +CQUAD4 98 1 102 123 124 103 +CQUAD4 99 1 103 124 125 104 +CQUAD4 100 1 104 125 126 105 +CQUAD4 101 1 106 127 128 107 +CQUAD4 102 1 107 128 129 108 +CQUAD4 103 1 108 129 130 109 +CQUAD4 104 1 109 130 131 110 +CQUAD4 105 1 110 131 132 111 +CQUAD4 106 1 111 132 133 112 +CQUAD4 107 1 112 133 134 113 +CQUAD4 108 1 113 134 135 114 +CQUAD4 109 1 114 135 136 115 +CQUAD4 110 1 115 136 137 116 +CQUAD4 111 1 116 137 138 117 +CQUAD4 112 1 117 138 139 118 +CQUAD4 113 1 118 139 140 119 +CQUAD4 114 1 119 140 141 120 +CQUAD4 115 1 120 141 142 121 +CQUAD4 116 1 121 142 143 122 +CQUAD4 117 1 122 143 144 123 +CQUAD4 118 1 123 144 145 124 +CQUAD4 119 1 124 145 146 125 +CQUAD4 120 1 125 146 147 126 +CQUAD4 121 1 127 148 149 128 +CQUAD4 122 1 128 149 150 129 +CQUAD4 123 1 129 150 151 130 +CQUAD4 124 1 130 151 152 131 +CQUAD4 125 1 131 152 153 132 +CQUAD4 126 1 132 153 154 133 +CQUAD4 127 1 133 154 155 134 +CQUAD4 128 1 134 155 156 135 +CQUAD4 129 1 135 156 157 136 +CQUAD4 130 1 136 157 158 137 +CQUAD4 131 1 137 158 159 138 +CQUAD4 132 1 138 159 160 139 +CQUAD4 133 1 139 160 161 140 +CQUAD4 134 1 140 161 162 141 +CQUAD4 135 1 141 162 163 142 +CQUAD4 136 1 142 163 164 143 +CQUAD4 137 1 143 164 165 144 +CQUAD4 138 1 144 165 166 145 +CQUAD4 139 1 145 166 167 146 +CQUAD4 140 1 146 167 168 147 +CQUAD4 141 1 148 169 170 149 +CQUAD4 142 1 149 170 171 150 +CQUAD4 143 1 150 171 172 151 +CQUAD4 144 1 151 172 173 152 +CQUAD4 145 1 152 173 174 153 +CQUAD4 146 1 153 174 175 154 +CQUAD4 147 1 154 175 176 155 +CQUAD4 148 1 155 176 177 156 +CQUAD4 149 1 156 177 178 157 +CQUAD4 150 1 157 178 179 158 +CQUAD4 151 1 158 179 180 159 +CQUAD4 152 1 159 180 181 160 +CQUAD4 153 1 160 181 182 161 +CQUAD4 154 1 161 182 183 162 +CQUAD4 155 1 162 183 184 163 +CQUAD4 156 1 163 184 185 164 +CQUAD4 157 1 164 185 186 165 +CQUAD4 158 1 165 186 187 166 +CQUAD4 159 1 166 187 188 167 +CQUAD4 160 1 167 188 189 168 +CQUAD4 161 1 169 190 191 170 +CQUAD4 162 1 170 191 192 171 +CQUAD4 163 1 171 192 193 172 +CQUAD4 164 1 172 193 194 173 +CQUAD4 165 1 173 194 195 174 +CQUAD4 166 1 174 195 196 175 +CQUAD4 167 1 175 196 197 176 +CQUAD4 168 1 176 197 198 177 +CQUAD4 169 1 177 198 199 178 +CQUAD4 170 1 178 199 200 179 +CQUAD4 171 1 179 200 201 180 +CQUAD4 172 1 180 201 202 181 +CQUAD4 173 1 181 202 203 182 +CQUAD4 174 1 182 203 204 183 +CQUAD4 175 1 183 204 205 184 +CQUAD4 176 1 184 205 206 185 +CQUAD4 177 1 185 206 207 186 +CQUAD4 178 1 186 207 208 187 +CQUAD4 179 1 187 208 209 188 +CQUAD4 180 1 188 209 210 189 +CQUAD4 181 1 190 211 212 191 +CQUAD4 182 1 191 212 213 192 +CQUAD4 183 1 192 213 214 193 +CQUAD4 184 1 193 214 215 194 +CQUAD4 185 1 194 215 216 195 +CQUAD4 186 1 195 216 217 196 +CQUAD4 187 1 196 217 218 197 +CQUAD4 188 1 197 218 219 198 +CQUAD4 189 1 198 219 220 199 +CQUAD4 190 1 199 220 221 200 +CQUAD4 191 1 200 221 222 201 +CQUAD4 192 1 201 222 223 202 +CQUAD4 193 1 202 223 224 203 +CQUAD4 194 1 203 224 225 204 +CQUAD4 195 1 204 225 226 205 +CQUAD4 196 1 205 226 227 206 +CQUAD4 197 1 206 227 228 207 +CQUAD4 198 1 207 228 229 208 +CQUAD4 199 1 208 229 230 209 +CQUAD4 200 1 209 230 231 210 +CQUAD4 201 1 211 232 233 212 +CQUAD4 202 1 212 233 234 213 +CQUAD4 203 1 213 234 235 214 +CQUAD4 204 1 214 235 236 215 +CQUAD4 205 1 215 236 237 216 +CQUAD4 206 1 216 237 238 217 +CQUAD4 207 1 217 238 239 218 +CQUAD4 208 1 218 239 240 219 +CQUAD4 209 1 219 240 241 220 +CQUAD4 210 1 220 241 242 221 +CQUAD4 211 1 221 242 243 222 +CQUAD4 212 1 222 243 244 223 +CQUAD4 213 1 223 244 245 224 +CQUAD4 214 1 224 245 246 225 +CQUAD4 215 1 225 246 247 226 +CQUAD4 216 1 226 247 248 227 +CQUAD4 217 1 227 248 249 228 +CQUAD4 218 1 228 249 250 229 +CQUAD4 219 1 229 250 251 230 +CQUAD4 220 1 230 251 252 231 +CQUAD4 221 1 232 253 254 233 +CQUAD4 222 1 233 254 255 234 +CQUAD4 223 1 234 255 256 235 +CQUAD4 224 1 235 256 257 236 +CQUAD4 225 1 236 257 258 237 +CQUAD4 226 1 237 258 259 238 +CQUAD4 227 1 238 259 260 239 +CQUAD4 228 1 239 260 261 240 +CQUAD4 229 1 240 261 262 241 +CQUAD4 230 1 241 262 263 242 +CQUAD4 231 1 242 263 264 243 +CQUAD4 232 1 243 264 265 244 +CQUAD4 233 1 244 265 266 245 +CQUAD4 234 1 245 266 267 246 +CQUAD4 235 1 246 267 268 247 +CQUAD4 236 1 247 268 269 248 +CQUAD4 237 1 248 269 270 249 +CQUAD4 238 1 249 270 271 250 +CQUAD4 239 1 250 271 272 251 +CQUAD4 240 1 251 272 273 252 +CQUAD4 241 1 253 274 275 254 +CQUAD4 242 1 254 275 276 255 +CQUAD4 243 1 255 276 277 256 +CQUAD4 244 1 256 277 278 257 +CQUAD4 245 1 257 278 279 258 +CQUAD4 246 1 258 279 280 259 +CQUAD4 247 1 259 280 281 260 +CQUAD4 248 1 260 281 282 261 +CQUAD4 249 1 261 282 283 262 +CQUAD4 250 1 262 283 284 263 +CQUAD4 251 1 263 284 285 264 +CQUAD4 252 1 264 285 286 265 +CQUAD4 253 1 265 286 287 266 +CQUAD4 254 1 266 287 288 267 +CQUAD4 255 1 267 288 289 268 +CQUAD4 256 1 268 289 290 269 +CQUAD4 257 1 269 290 291 270 +CQUAD4 258 1 270 291 292 271 +CQUAD4 259 1 271 292 293 272 +CQUAD4 260 1 272 293 294 273 +CQUAD4 261 1 274 295 296 275 +CQUAD4 262 1 275 296 297 276 +CQUAD4 263 1 276 297 298 277 +CQUAD4 264 1 277 298 299 278 +CQUAD4 265 1 278 299 300 279 +CQUAD4 266 1 279 300 301 280 +CQUAD4 267 1 280 301 302 281 +CQUAD4 268 1 281 302 303 282 +CQUAD4 269 1 282 303 304 283 +CQUAD4 270 1 283 304 305 284 +CQUAD4 271 1 284 305 306 285 +CQUAD4 272 1 285 306 307 286 +CQUAD4 273 1 286 307 308 287 +CQUAD4 274 1 287 308 309 288 +CQUAD4 275 1 288 309 310 289 +CQUAD4 276 1 289 310 311 290 +CQUAD4 277 1 290 311 312 291 +CQUAD4 278 1 291 312 313 292 +CQUAD4 279 1 292 313 314 293 +CQUAD4 280 1 293 314 315 294 +CQUAD4 281 1 295 316 317 296 +CQUAD4 282 1 296 317 318 297 +CQUAD4 283 1 297 318 319 298 +CQUAD4 284 1 298 319 320 299 +CQUAD4 285 1 299 320 321 300 +CQUAD4 286 1 300 321 322 301 +CQUAD4 287 1 301 322 323 302 +CQUAD4 288 1 302 323 324 303 +CQUAD4 289 1 303 324 325 304 +CQUAD4 290 1 304 325 326 305 +CQUAD4 291 1 305 326 327 306 +CQUAD4 292 1 306 327 328 307 +CQUAD4 293 1 307 328 329 308 +CQUAD4 294 1 308 329 330 309 +CQUAD4 295 1 309 330 331 310 +CQUAD4 296 1 310 331 332 311 +CQUAD4 297 1 311 332 333 312 +CQUAD4 298 1 312 333 334 313 +CQUAD4 299 1 313 334 335 314 +CQUAD4 300 1 314 335 336 315 +CQUAD4 301 1 316 337 338 317 +CQUAD4 302 1 317 338 339 318 +CQUAD4 303 1 318 339 340 319 +CQUAD4 304 1 319 340 341 320 +CQUAD4 305 1 320 341 342 321 +CQUAD4 306 1 321 342 343 322 +CQUAD4 307 1 322 343 344 323 +CQUAD4 308 1 323 344 345 324 +CQUAD4 309 1 324 345 346 325 +CQUAD4 310 1 325 346 347 326 +CQUAD4 311 1 326 347 348 327 +CQUAD4 312 1 327 348 349 328 +CQUAD4 313 1 328 349 350 329 +CQUAD4 314 1 329 350 351 330 +CQUAD4 315 1 330 351 352 331 +CQUAD4 316 1 331 352 353 332 +CQUAD4 317 1 332 353 354 333 +CQUAD4 318 1 333 354 355 334 +CQUAD4 319 1 334 355 356 335 +CQUAD4 320 1 335 356 357 336 +CQUAD4 321 1 337 358 359 338 +CQUAD4 322 1 338 359 360 339 +CQUAD4 323 1 339 360 361 340 +CQUAD4 324 1 340 361 362 341 +CQUAD4 325 1 341 362 363 342 +CQUAD4 326 1 342 363 364 343 +CQUAD4 327 1 343 364 365 344 +CQUAD4 328 1 344 365 366 345 +CQUAD4 329 1 345 366 367 346 +CQUAD4 330 1 346 367 368 347 +CQUAD4 331 1 347 368 369 348 +CQUAD4 332 1 348 369 370 349 +CQUAD4 333 1 349 370 371 350 +CQUAD4 334 1 350 371 372 351 +CQUAD4 335 1 351 372 373 352 +CQUAD4 336 1 352 373 374 353 +CQUAD4 337 1 353 374 375 354 +CQUAD4 338 1 354 375 376 355 +CQUAD4 339 1 355 376 377 356 +CQUAD4 340 1 356 377 378 357 +CQUAD4 341 1 358 379 380 359 +CQUAD4 342 1 359 380 381 360 +CQUAD4 343 1 360 381 382 361 +CQUAD4 344 1 361 382 383 362 +CQUAD4 345 1 362 383 384 363 +CQUAD4 346 1 363 384 385 364 +CQUAD4 347 1 364 385 386 365 +CQUAD4 348 1 365 386 387 366 +CQUAD4 349 1 366 387 388 367 +CQUAD4 350 1 367 388 389 368 +CQUAD4 351 1 368 389 390 369 +CQUAD4 352 1 369 390 391 370 +CQUAD4 353 1 370 391 392 371 +CQUAD4 354 1 371 392 393 372 +CQUAD4 355 1 372 393 394 373 +CQUAD4 356 1 373 394 395 374 +CQUAD4 357 1 374 395 396 375 +CQUAD4 358 1 375 396 397 376 +CQUAD4 359 1 376 397 398 377 +CQUAD4 360 1 377 398 399 378 +CQUAD4 361 1 379 400 401 380 +CQUAD4 362 1 380 401 402 381 +CQUAD4 363 1 381 402 403 382 +CQUAD4 364 1 382 403 404 383 +CQUAD4 365 1 383 404 405 384 +CQUAD4 366 1 384 405 406 385 +CQUAD4 367 1 385 406 407 386 +CQUAD4 368 1 386 407 408 387 +CQUAD4 369 1 387 408 409 388 +CQUAD4 370 1 388 409 410 389 +CQUAD4 371 1 389 410 411 390 +CQUAD4 372 1 390 411 412 391 +CQUAD4 373 1 391 412 413 392 +CQUAD4 374 1 392 413 414 393 +CQUAD4 375 1 393 414 415 394 +CQUAD4 376 1 394 415 416 395 +CQUAD4 377 1 395 416 417 396 +CQUAD4 378 1 396 417 418 397 +CQUAD4 379 1 397 418 419 398 +CQUAD4 380 1 398 419 420 399 +CQUAD4 381 1 400 421 422 401 +CQUAD4 382 1 401 422 423 402 +CQUAD4 383 1 402 423 424 403 +CQUAD4 384 1 403 424 425 404 +CQUAD4 385 1 404 425 426 405 +CQUAD4 386 1 405 426 427 406 +CQUAD4 387 1 406 427 428 407 +CQUAD4 388 1 407 428 429 408 +CQUAD4 389 1 408 429 430 409 +CQUAD4 390 1 409 430 431 410 +CQUAD4 391 1 410 431 432 411 +CQUAD4 392 1 411 432 433 412 +CQUAD4 393 1 412 433 434 413 +CQUAD4 394 1 413 434 435 414 +CQUAD4 395 1 414 435 436 415 +CQUAD4 396 1 415 436 437 416 +CQUAD4 397 1 416 437 438 417 +CQUAD4 398 1 417 438 439 418 +CQUAD4 399 1 418 439 440 419 +CQUAD4 400 1 419 440 441 420 +CQUAD4 401 1 421 442 443 422 +CQUAD4 402 1 422 443 444 423 +CQUAD4 403 1 423 444 445 424 +CQUAD4 404 1 424 445 446 425 +CQUAD4 405 1 425 446 447 426 +CQUAD4 406 1 426 447 448 427 +CQUAD4 407 1 427 448 449 428 +CQUAD4 408 1 428 449 450 429 +CQUAD4 409 1 429 450 451 430 +CQUAD4 410 1 430 451 452 431 +CQUAD4 411 1 431 452 453 432 +CQUAD4 412 1 432 453 454 433 +CQUAD4 413 1 433 454 455 434 +CQUAD4 414 1 434 455 456 435 +CQUAD4 415 1 435 456 457 436 +CQUAD4 416 1 436 457 458 437 +CQUAD4 417 1 437 458 459 438 +CQUAD4 418 1 438 459 460 439 +CQUAD4 419 1 439 460 461 440 +CQUAD4 420 1 440 461 462 441 +CQUAD4 421 1 442 463 464 443 +CQUAD4 422 1 443 464 465 444 +CQUAD4 423 1 444 465 466 445 +CQUAD4 424 1 445 466 467 446 +CQUAD4 425 1 446 467 468 447 +CQUAD4 426 1 447 468 469 448 +CQUAD4 427 1 448 469 470 449 +CQUAD4 428 1 449 470 471 450 +CQUAD4 429 1 450 471 472 451 +CQUAD4 430 1 451 472 473 452 +CQUAD4 431 1 452 473 474 453 +CQUAD4 432 1 453 474 475 454 +CQUAD4 433 1 454 475 476 455 +CQUAD4 434 1 455 476 477 456 +CQUAD4 435 1 456 477 478 457 +CQUAD4 436 1 457 478 479 458 +CQUAD4 437 1 458 479 480 459 +CQUAD4 438 1 459 480 481 460 +CQUAD4 439 1 460 481 482 461 +CQUAD4 440 1 461 482 483 462 +CQUAD4 441 1 463 484 485 464 +CQUAD4 442 1 464 485 486 465 +CQUAD4 443 1 465 486 487 466 +CQUAD4 444 1 466 487 488 467 +CQUAD4 445 1 467 488 489 468 +CQUAD4 446 1 468 489 490 469 +CQUAD4 447 1 469 490 491 470 +CQUAD4 448 1 470 491 492 471 +CQUAD4 449 1 471 492 493 472 +CQUAD4 450 1 472 493 494 473 +CQUAD4 451 1 473 494 495 474 +CQUAD4 452 1 474 495 496 475 +CQUAD4 453 1 475 496 497 476 +CQUAD4 454 1 476 497 498 477 +CQUAD4 455 1 477 498 499 478 +CQUAD4 456 1 478 499 500 479 +CQUAD4 457 1 479 500 501 480 +CQUAD4 458 1 480 501 502 481 +CQUAD4 459 1 481 502 503 482 +CQUAD4 460 1 482 503 504 483 +CQUAD4 461 1 484 505 506 485 +CQUAD4 462 1 485 506 507 486 +CQUAD4 463 1 486 507 508 487 +CQUAD4 464 1 487 508 509 488 +CQUAD4 465 1 488 509 510 489 +CQUAD4 466 1 489 510 511 490 +CQUAD4 467 1 490 511 512 491 +CQUAD4 468 1 491 512 513 492 +CQUAD4 469 1 492 513 514 493 +CQUAD4 470 1 493 514 515 494 +CQUAD4 471 1 494 515 516 495 +CQUAD4 472 1 495 516 517 496 +CQUAD4 473 1 496 517 518 497 +CQUAD4 474 1 497 518 519 498 +CQUAD4 475 1 498 519 520 499 +CQUAD4 476 1 499 520 521 500 +CQUAD4 477 1 500 521 522 501 +CQUAD4 478 1 501 522 523 502 +CQUAD4 479 1 502 523 524 503 +CQUAD4 480 1 503 524 525 504 +CQUAD4 481 1 505 526 527 506 +CQUAD4 482 1 506 527 528 507 +CQUAD4 483 1 507 528 529 508 +CQUAD4 484 1 508 529 530 509 +CQUAD4 485 1 509 530 531 510 +CQUAD4 486 1 510 531 532 511 +CQUAD4 487 1 511 532 533 512 +CQUAD4 488 1 512 533 534 513 +CQUAD4 489 1 513 534 535 514 +CQUAD4 490 1 514 535 536 515 +CQUAD4 491 1 515 536 537 516 +CQUAD4 492 1 516 537 538 517 +CQUAD4 493 1 517 538 539 518 +CQUAD4 494 1 518 539 540 519 +CQUAD4 495 1 519 540 541 520 +CQUAD4 496 1 520 541 542 521 +CQUAD4 497 1 521 542 543 522 +CQUAD4 498 1 522 543 544 523 +CQUAD4 499 1 523 544 545 524 +CQUAD4 500 1 524 545 546 525 +CQUAD4 501 1 526 547 548 527 +CQUAD4 502 1 527 548 549 528 +CQUAD4 503 1 528 549 550 529 +CQUAD4 504 1 529 550 551 530 +CQUAD4 505 1 530 551 552 531 +CQUAD4 506 1 531 552 553 532 +CQUAD4 507 1 532 553 554 533 +CQUAD4 508 1 533 554 555 534 +CQUAD4 509 1 534 555 556 535 +CQUAD4 510 1 535 556 557 536 +CQUAD4 511 1 536 557 558 537 +CQUAD4 512 1 537 558 559 538 +CQUAD4 513 1 538 559 560 539 +CQUAD4 514 1 539 560 561 540 +CQUAD4 515 1 540 561 562 541 +CQUAD4 516 1 541 562 563 542 +CQUAD4 517 1 542 563 564 543 +CQUAD4 518 1 543 564 565 544 +CQUAD4 519 1 544 565 566 545 +CQUAD4 520 1 545 566 567 546 +CQUAD4 521 1 547 568 569 548 +CQUAD4 522 1 548 569 570 549 +CQUAD4 523 1 549 570 571 550 +CQUAD4 524 1 550 571 572 551 +CQUAD4 525 1 551 572 573 552 +CQUAD4 526 1 552 573 574 553 +CQUAD4 527 1 553 574 575 554 +CQUAD4 528 1 554 575 576 555 +CQUAD4 529 1 555 576 577 556 +CQUAD4 530 1 556 577 578 557 +CQUAD4 531 1 557 578 579 558 +CQUAD4 532 1 558 579 580 559 +CQUAD4 533 1 559 580 581 560 +CQUAD4 534 1 560 581 582 561 +CQUAD4 535 1 561 582 583 562 +CQUAD4 536 1 562 583 584 563 +CQUAD4 537 1 563 584 585 564 +CQUAD4 538 1 564 585 586 565 +CQUAD4 539 1 565 586 587 566 +CQUAD4 540 1 566 587 588 567 +CQUAD4 541 1 568 589 590 569 +CQUAD4 542 1 569 590 591 570 +CQUAD4 543 1 570 591 592 571 +CQUAD4 544 1 571 592 593 572 +CQUAD4 545 1 572 593 594 573 +CQUAD4 546 1 573 594 595 574 +CQUAD4 547 1 574 595 596 575 +CQUAD4 548 1 575 596 597 576 +CQUAD4 549 1 576 597 598 577 +CQUAD4 550 1 577 598 599 578 +CQUAD4 551 1 578 599 600 579 +CQUAD4 552 1 579 600 601 580 +CQUAD4 553 1 580 601 602 581 +CQUAD4 554 1 581 602 603 582 +CQUAD4 555 1 582 603 604 583 +CQUAD4 556 1 583 604 605 584 +CQUAD4 557 1 584 605 606 585 +CQUAD4 558 1 585 606 607 586 +CQUAD4 559 1 586 607 608 587 +CQUAD4 560 1 587 608 609 588 +CQUAD4 561 1 589 610 611 590 +CQUAD4 562 1 590 611 612 591 +CQUAD4 563 1 591 612 613 592 +CQUAD4 564 1 592 613 614 593 +CQUAD4 565 1 593 614 615 594 +CQUAD4 566 1 594 615 616 595 +CQUAD4 567 1 595 616 617 596 +CQUAD4 568 1 596 617 618 597 +CQUAD4 569 1 597 618 619 598 +CQUAD4 570 1 598 619 620 599 +CQUAD4 571 1 599 620 621 600 +CQUAD4 572 1 600 621 622 601 +CQUAD4 573 1 601 622 623 602 +CQUAD4 574 1 602 623 624 603 +CQUAD4 575 1 603 624 625 604 +CQUAD4 576 1 604 625 626 605 +CQUAD4 577 1 605 626 627 606 +CQUAD4 578 1 606 627 628 607 +CQUAD4 579 1 607 628 629 608 +CQUAD4 580 1 608 629 630 609 +CQUAD4 581 1 610 631 632 611 +CQUAD4 582 1 611 632 633 612 +CQUAD4 583 1 612 633 634 613 +CQUAD4 584 1 613 634 635 614 +CQUAD4 585 1 614 635 636 615 +CQUAD4 586 1 615 636 637 616 +CQUAD4 587 1 616 637 638 617 +CQUAD4 588 1 617 638 639 618 +CQUAD4 589 1 618 639 640 619 +CQUAD4 590 1 619 640 641 620 +CQUAD4 591 1 620 641 642 621 +CQUAD4 592 1 621 642 643 622 +CQUAD4 593 1 622 643 644 623 +CQUAD4 594 1 623 644 645 624 +CQUAD4 595 1 624 645 646 625 +CQUAD4 596 1 625 646 647 626 +CQUAD4 597 1 626 647 648 627 +CQUAD4 598 1 627 648 649 628 +CQUAD4 599 1 628 649 650 629 +CQUAD4 600 1 629 650 651 630 +CQUAD4 601 1 631 652 653 632 +CQUAD4 602 1 632 653 654 633 +CQUAD4 603 1 633 654 655 634 +CQUAD4 604 1 634 655 656 635 +CQUAD4 605 1 635 656 657 636 +CQUAD4 606 1 636 657 658 637 +CQUAD4 607 1 637 658 659 638 +CQUAD4 608 1 638 659 660 639 +CQUAD4 609 1 639 660 661 640 +CQUAD4 610 1 640 661 662 641 +CQUAD4 611 1 641 662 663 642 +CQUAD4 612 1 642 663 664 643 +CQUAD4 613 1 643 664 665 644 +CQUAD4 614 1 644 665 666 645 +CQUAD4 615 1 645 666 667 646 +CQUAD4 616 1 646 667 668 647 +CQUAD4 617 1 647 668 669 648 +CQUAD4 618 1 648 669 670 649 +CQUAD4 619 1 649 670 671 650 +CQUAD4 620 1 650 671 672 651 +CQUAD4 621 1 652 673 674 653 +CQUAD4 622 1 653 674 675 654 +CQUAD4 623 1 654 675 676 655 +CQUAD4 624 1 655 676 677 656 +CQUAD4 625 1 656 677 678 657 +CQUAD4 626 1 657 678 679 658 +CQUAD4 627 1 658 679 680 659 +CQUAD4 628 1 659 680 681 660 +CQUAD4 629 1 660 681 682 661 +CQUAD4 630 1 661 682 683 662 +CQUAD4 631 1 662 683 684 663 +CQUAD4 632 1 663 684 685 664 +CQUAD4 633 1 664 685 686 665 +CQUAD4 634 1 665 686 687 666 +CQUAD4 635 1 666 687 688 667 +CQUAD4 636 1 667 688 689 668 +CQUAD4 637 1 668 689 690 669 +CQUAD4 638 1 669 690 691 670 +CQUAD4 639 1 670 691 692 671 +CQUAD4 640 1 671 692 693 672 +CQUAD4 641 1 673 694 695 674 +CQUAD4 642 1 674 695 696 675 +CQUAD4 643 1 675 696 697 676 +CQUAD4 644 1 676 697 698 677 +CQUAD4 645 1 677 698 699 678 +CQUAD4 646 1 678 699 700 679 +CQUAD4 647 1 679 700 701 680 +CQUAD4 648 1 680 701 702 681 +CQUAD4 649 1 681 702 703 682 +CQUAD4 650 1 682 703 704 683 +CQUAD4 651 1 683 704 705 684 +CQUAD4 652 1 684 705 706 685 +CQUAD4 653 1 685 706 707 686 +CQUAD4 654 1 686 707 708 687 +CQUAD4 655 1 687 708 709 688 +CQUAD4 656 1 688 709 710 689 +CQUAD4 657 1 689 710 711 690 +CQUAD4 658 1 690 711 712 691 +CQUAD4 659 1 691 712 713 692 +CQUAD4 660 1 692 713 714 693 +CQUAD4 661 1 694 715 716 695 +CQUAD4 662 1 695 716 717 696 +CQUAD4 663 1 696 717 718 697 +CQUAD4 664 1 697 718 719 698 +CQUAD4 665 1 698 719 720 699 +CQUAD4 666 1 699 720 721 700 +CQUAD4 667 1 700 721 722 701 +CQUAD4 668 1 701 722 723 702 +CQUAD4 669 1 702 723 724 703 +CQUAD4 670 1 703 724 725 704 +CQUAD4 671 1 704 725 726 705 +CQUAD4 672 1 705 726 727 706 +CQUAD4 673 1 706 727 728 707 +CQUAD4 674 1 707 728 729 708 +CQUAD4 675 1 708 729 730 709 +CQUAD4 676 1 709 730 731 710 +CQUAD4 677 1 710 731 732 711 +CQUAD4 678 1 711 732 733 712 +CQUAD4 679 1 712 733 734 713 +CQUAD4 680 1 713 734 735 714 +CQUAD4 681 1 715 736 737 716 +CQUAD4 682 1 716 737 738 717 +CQUAD4 683 1 717 738 739 718 +CQUAD4 684 1 718 739 740 719 +CQUAD4 685 1 719 740 741 720 +CQUAD4 686 1 720 741 742 721 +CQUAD4 687 1 721 742 743 722 +CQUAD4 688 1 722 743 744 723 +CQUAD4 689 1 723 744 745 724 +CQUAD4 690 1 724 745 746 725 +CQUAD4 691 1 725 746 747 726 +CQUAD4 692 1 726 747 748 727 +CQUAD4 693 1 727 748 749 728 +CQUAD4 694 1 728 749 750 729 +CQUAD4 695 1 729 750 751 730 +CQUAD4 696 1 730 751 752 731 +CQUAD4 697 1 731 752 753 732 +CQUAD4 698 1 732 753 754 733 +CQUAD4 699 1 733 754 755 734 +CQUAD4 700 1 734 755 756 735 +CQUAD4 701 1 736 757 758 737 +CQUAD4 702 1 737 758 759 738 +CQUAD4 703 1 738 759 760 739 +CQUAD4 704 1 739 760 761 740 +CQUAD4 705 1 740 761 762 741 +CQUAD4 706 1 741 762 763 742 +CQUAD4 707 1 742 763 764 743 +CQUAD4 708 1 743 764 765 744 +CQUAD4 709 1 744 765 766 745 +CQUAD4 710 1 745 766 767 746 +CQUAD4 711 1 746 767 768 747 +CQUAD4 712 1 747 768 769 748 +CQUAD4 713 1 748 769 770 749 +CQUAD4 714 1 749 770 771 750 +CQUAD4 715 1 750 771 772 751 +CQUAD4 716 1 751 772 773 752 +CQUAD4 717 1 752 773 774 753 +CQUAD4 718 1 753 774 775 754 +CQUAD4 719 1 754 775 776 755 +CQUAD4 720 1 755 776 777 756 +CQUAD4 721 1 757 778 779 758 +CQUAD4 722 1 758 779 780 759 +CQUAD4 723 1 759 780 781 760 +CQUAD4 724 1 760 781 782 761 +CQUAD4 725 1 761 782 783 762 +CQUAD4 726 1 762 783 784 763 +CQUAD4 727 1 763 784 785 764 +CQUAD4 728 1 764 785 786 765 +CQUAD4 729 1 765 786 787 766 +CQUAD4 730 1 766 787 788 767 +CQUAD4 731 1 767 788 789 768 +CQUAD4 732 1 768 789 790 769 +CQUAD4 733 1 769 790 791 770 +CQUAD4 734 1 770 791 792 771 +CQUAD4 735 1 771 792 793 772 +CQUAD4 736 1 772 793 794 773 +CQUAD4 737 1 773 794 795 774 +CQUAD4 738 1 774 795 796 775 +CQUAD4 739 1 775 796 797 776 +CQUAD4 740 1 776 797 798 777 +CQUAD4 741 1 778 799 800 779 +CQUAD4 742 1 779 800 801 780 +CQUAD4 743 1 780 801 802 781 +CQUAD4 744 1 781 802 803 782 +CQUAD4 745 1 782 803 804 783 +CQUAD4 746 1 783 804 805 784 +CQUAD4 747 1 784 805 806 785 +CQUAD4 748 1 785 806 807 786 +CQUAD4 749 1 786 807 808 787 +CQUAD4 750 1 787 808 809 788 +CQUAD4 751 1 788 809 810 789 +CQUAD4 752 1 789 810 811 790 +CQUAD4 753 1 790 811 812 791 +CQUAD4 754 1 791 812 813 792 +CQUAD4 755 1 792 813 814 793 +CQUAD4 756 1 793 814 815 794 +CQUAD4 757 1 794 815 816 795 +CQUAD4 758 1 795 816 817 796 +CQUAD4 759 1 796 817 818 797 +CQUAD4 760 1 797 818 819 798 +CQUAD4 761 1 799 820 821 800 +CQUAD4 762 1 800 821 822 801 +CQUAD4 763 1 801 822 823 802 +CQUAD4 764 1 802 823 824 803 +CQUAD4 765 1 803 824 825 804 +CQUAD4 766 1 804 825 826 805 +CQUAD4 767 1 805 826 827 806 +CQUAD4 768 1 806 827 828 807 +CQUAD4 769 1 807 828 829 808 +CQUAD4 770 1 808 829 830 809 +CQUAD4 771 1 809 830 831 810 +CQUAD4 772 1 810 831 832 811 +CQUAD4 773 1 811 832 833 812 +CQUAD4 774 1 812 833 834 813 +CQUAD4 775 1 813 834 835 814 +CQUAD4 776 1 814 835 836 815 +CQUAD4 777 1 815 836 837 816 +CQUAD4 778 1 816 837 838 817 +CQUAD4 779 1 817 838 839 818 +CQUAD4 780 1 818 839 840 819 +CQUAD4 781 1 820 841 842 821 +CQUAD4 782 1 821 842 843 822 +CQUAD4 783 1 822 843 844 823 +CQUAD4 784 1 823 844 845 824 +CQUAD4 785 1 824 845 846 825 +CQUAD4 786 1 825 846 847 826 +CQUAD4 787 1 826 847 848 827 +CQUAD4 788 1 827 848 849 828 +CQUAD4 789 1 828 849 850 829 +CQUAD4 790 1 829 850 851 830 +CQUAD4 791 1 830 851 852 831 +CQUAD4 792 1 831 852 853 832 +CQUAD4 793 1 832 853 854 833 +CQUAD4 794 1 833 854 855 834 +CQUAD4 795 1 834 855 856 835 +CQUAD4 796 1 835 856 857 836 +CQUAD4 797 1 836 857 858 837 +CQUAD4 798 1 837 858 859 838 +CQUAD4 799 1 838 859 860 839 +CQUAD4 800 1 839 860 861 840 +SPC 1 1123 0.00000 +SPC 1 2123 0.00000 +SPC 1 8413 0.00000 +ENDDATA diff --git a/examples/stiffened_plate/plate_pinned_edges.bdf b/examples/stiffened_plate/plate_pinned_edges.bdf new file mode 100644 index 000000000..8e7d04cec --- /dev/null +++ b/examples/stiffened_plate/plate_pinned_edges.bdf @@ -0,0 +1,1786 @@ +SOL 103 +CEND +BEGIN BULK +GRID 1 0 0.00000 0.00000 0.00000 0 0 0 +GRID 2 0 0.03750 0.00000 0.00000 0 0 0 +GRID 3 0 0.07500 0.00000 0.00000 0 0 0 +GRID 4 0 0.11250 0.00000 0.00000 0 0 0 +GRID 5 0 0.15000 0.00000 0.00000 0 0 0 +GRID 6 0 0.18750 0.00000 0.00000 0 0 0 +GRID 7 0 0.22500 0.00000 0.00000 0 0 0 +GRID 8 0 0.26250 0.00000 0.00000 0 0 0 +GRID 9 0 0.30000 0.00000 0.00000 0 0 0 +GRID 10 0 0.33750 0.00000 0.00000 0 0 0 +GRID 11 0 0.37500 0.00000 0.00000 0 0 0 +GRID 12 0 0.41250 0.00000 0.00000 0 0 0 +GRID 13 0 0.45000 0.00000 0.00000 0 0 0 +GRID 14 0 0.48750 0.00000 0.00000 0 0 0 +GRID 15 0 0.52500 0.00000 0.00000 0 0 0 +GRID 16 0 0.56250 0.00000 0.00000 0 0 0 +GRID 17 0 0.60000 0.00000 0.00000 0 0 0 +GRID 18 0 0.63750 0.00000 0.00000 0 0 0 +GRID 19 0 0.67500 0.00000 0.00000 0 0 0 +GRID 20 0 0.71250 0.00000 0.00000 0 0 0 +GRID 21 0 0.75000 0.00000 0.00000 0 0 0 +GRID 22 0 0.00000 0.03750 0.00000 0 0 0 +GRID 23 0 0.03750 0.03750 0.00000 0 0 0 +GRID 24 0 0.07500 0.03750 0.00000 0 0 0 +GRID 25 0 0.11250 0.03750 0.00000 0 0 0 +GRID 26 0 0.15000 0.03750 0.00000 0 0 0 +GRID 27 0 0.18750 0.03750 0.00000 0 0 0 +GRID 28 0 0.22500 0.03750 0.00000 0 0 0 +GRID 29 0 0.26250 0.03750 0.00000 0 0 0 +GRID 30 0 0.30000 0.03750 0.00000 0 0 0 +GRID 31 0 0.33750 0.03750 0.00000 0 0 0 +GRID 32 0 0.37500 0.03750 0.00000 0 0 0 +GRID 33 0 0.41250 0.03750 0.00000 0 0 0 +GRID 34 0 0.45000 0.03750 0.00000 0 0 0 +GRID 35 0 0.48750 0.03750 0.00000 0 0 0 +GRID 36 0 0.52500 0.03750 0.00000 0 0 0 +GRID 37 0 0.56250 0.03750 0.00000 0 0 0 +GRID 38 0 0.60000 0.03750 0.00000 0 0 0 +GRID 39 0 0.63750 0.03750 0.00000 0 0 0 +GRID 40 0 0.67500 0.03750 0.00000 0 0 0 +GRID 41 0 0.71250 0.03750 0.00000 0 0 0 +GRID 42 0 0.75000 0.03750 0.00000 0 0 0 +GRID 43 0 0.00000 0.07500 0.00000 0 0 0 +GRID 44 0 0.03750 0.07500 0.00000 0 0 0 +GRID 45 0 0.07500 0.07500 0.00000 0 0 0 +GRID 46 0 0.11250 0.07500 0.00000 0 0 0 +GRID 47 0 0.15000 0.07500 0.00000 0 0 0 +GRID 48 0 0.18750 0.07500 0.00000 0 0 0 +GRID 49 0 0.22500 0.07500 0.00000 0 0 0 +GRID 50 0 0.26250 0.07500 0.00000 0 0 0 +GRID 51 0 0.30000 0.07500 0.00000 0 0 0 +GRID 52 0 0.33750 0.07500 0.00000 0 0 0 +GRID 53 0 0.37500 0.07500 0.00000 0 0 0 +GRID 54 0 0.41250 0.07500 0.00000 0 0 0 +GRID 55 0 0.45000 0.07500 0.00000 0 0 0 +GRID 56 0 0.48750 0.07500 0.00000 0 0 0 +GRID 57 0 0.52500 0.07500 0.00000 0 0 0 +GRID 58 0 0.56250 0.07500 0.00000 0 0 0 +GRID 59 0 0.60000 0.07500 0.00000 0 0 0 +GRID 60 0 0.63750 0.07500 0.00000 0 0 0 +GRID 61 0 0.67500 0.07500 0.00000 0 0 0 +GRID 62 0 0.71250 0.07500 0.00000 0 0 0 +GRID 63 0 0.75000 0.07500 0.00000 0 0 0 +GRID 64 0 0.00000 0.11250 0.00000 0 0 0 +GRID 65 0 0.03750 0.11250 0.00000 0 0 0 +GRID 66 0 0.07500 0.11250 0.00000 0 0 0 +GRID 67 0 0.11250 0.11250 0.00000 0 0 0 +GRID 68 0 0.15000 0.11250 0.00000 0 0 0 +GRID 69 0 0.18750 0.11250 0.00000 0 0 0 +GRID 70 0 0.22500 0.11250 0.00000 0 0 0 +GRID 71 0 0.26250 0.11250 0.00000 0 0 0 +GRID 72 0 0.30000 0.11250 0.00000 0 0 0 +GRID 73 0 0.33750 0.11250 0.00000 0 0 0 +GRID 74 0 0.37500 0.11250 0.00000 0 0 0 +GRID 75 0 0.41250 0.11250 0.00000 0 0 0 +GRID 76 0 0.45000 0.11250 0.00000 0 0 0 +GRID 77 0 0.48750 0.11250 0.00000 0 0 0 +GRID 78 0 0.52500 0.11250 0.00000 0 0 0 +GRID 79 0 0.56250 0.11250 0.00000 0 0 0 +GRID 80 0 0.60000 0.11250 0.00000 0 0 0 +GRID 81 0 0.63750 0.11250 0.00000 0 0 0 +GRID 82 0 0.67500 0.11250 0.00000 0 0 0 +GRID 83 0 0.71250 0.11250 0.00000 0 0 0 +GRID 84 0 0.75000 0.11250 0.00000 0 0 0 +GRID 85 0 0.00000 0.15000 0.00000 0 0 0 +GRID 86 0 0.03750 0.15000 0.00000 0 0 0 +GRID 87 0 0.07500 0.15000 0.00000 0 0 0 +GRID 88 0 0.11250 0.15000 0.00000 0 0 0 +GRID 89 0 0.15000 0.15000 0.00000 0 0 0 +GRID 90 0 0.18750 0.15000 0.00000 0 0 0 +GRID 91 0 0.22500 0.15000 0.00000 0 0 0 +GRID 92 0 0.26250 0.15000 0.00000 0 0 0 +GRID 93 0 0.30000 0.15000 0.00000 0 0 0 +GRID 94 0 0.33750 0.15000 0.00000 0 0 0 +GRID 95 0 0.37500 0.15000 0.00000 0 0 0 +GRID 96 0 0.41250 0.15000 0.00000 0 0 0 +GRID 97 0 0.45000 0.15000 0.00000 0 0 0 +GRID 98 0 0.48750 0.15000 0.00000 0 0 0 +GRID 99 0 0.52500 0.15000 0.00000 0 0 0 +GRID 100 0 0.56250 0.15000 0.00000 0 0 0 +GRID 101 0 0.60000 0.15000 0.00000 0 0 0 +GRID 102 0 0.63750 0.15000 0.00000 0 0 0 +GRID 103 0 0.67500 0.15000 0.00000 0 0 0 +GRID 104 0 0.71250 0.15000 0.00000 0 0 0 +GRID 105 0 0.75000 0.15000 0.00000 0 0 0 +GRID 106 0 0.00000 0.18750 0.00000 0 0 0 +GRID 107 0 0.03750 0.18750 0.00000 0 0 0 +GRID 108 0 0.07500 0.18750 0.00000 0 0 0 +GRID 109 0 0.11250 0.18750 0.00000 0 0 0 +GRID 110 0 0.15000 0.18750 0.00000 0 0 0 +GRID 111 0 0.18750 0.18750 0.00000 0 0 0 +GRID 112 0 0.22500 0.18750 0.00000 0 0 0 +GRID 113 0 0.26250 0.18750 0.00000 0 0 0 +GRID 114 0 0.30000 0.18750 0.00000 0 0 0 +GRID 115 0 0.33750 0.18750 0.00000 0 0 0 +GRID 116 0 0.37500 0.18750 0.00000 0 0 0 +GRID 117 0 0.41250 0.18750 0.00000 0 0 0 +GRID 118 0 0.45000 0.18750 0.00000 0 0 0 +GRID 119 0 0.48750 0.18750 0.00000 0 0 0 +GRID 120 0 0.52500 0.18750 0.00000 0 0 0 +GRID 121 0 0.56250 0.18750 0.00000 0 0 0 +GRID 122 0 0.60000 0.18750 0.00000 0 0 0 +GRID 123 0 0.63750 0.18750 0.00000 0 0 0 +GRID 124 0 0.67500 0.18750 0.00000 0 0 0 +GRID 125 0 0.71250 0.18750 0.00000 0 0 0 +GRID 126 0 0.75000 0.18750 0.00000 0 0 0 +GRID 127 0 0.00000 0.22500 0.00000 0 0 0 +GRID 128 0 0.03750 0.22500 0.00000 0 0 0 +GRID 129 0 0.07500 0.22500 0.00000 0 0 0 +GRID 130 0 0.11250 0.22500 0.00000 0 0 0 +GRID 131 0 0.15000 0.22500 0.00000 0 0 0 +GRID 132 0 0.18750 0.22500 0.00000 0 0 0 +GRID 133 0 0.22500 0.22500 0.00000 0 0 0 +GRID 134 0 0.26250 0.22500 0.00000 0 0 0 +GRID 135 0 0.30000 0.22500 0.00000 0 0 0 +GRID 136 0 0.33750 0.22500 0.00000 0 0 0 +GRID 137 0 0.37500 0.22500 0.00000 0 0 0 +GRID 138 0 0.41250 0.22500 0.00000 0 0 0 +GRID 139 0 0.45000 0.22500 0.00000 0 0 0 +GRID 140 0 0.48750 0.22500 0.00000 0 0 0 +GRID 141 0 0.52500 0.22500 0.00000 0 0 0 +GRID 142 0 0.56250 0.22500 0.00000 0 0 0 +GRID 143 0 0.60000 0.22500 0.00000 0 0 0 +GRID 144 0 0.63750 0.22500 0.00000 0 0 0 +GRID 145 0 0.67500 0.22500 0.00000 0 0 0 +GRID 146 0 0.71250 0.22500 0.00000 0 0 0 +GRID 147 0 0.75000 0.22500 0.00000 0 0 0 +GRID 148 0 0.00000 0.26250 0.00000 0 0 0 +GRID 149 0 0.03750 0.26250 0.00000 0 0 0 +GRID 150 0 0.07500 0.26250 0.00000 0 0 0 +GRID 151 0 0.11250 0.26250 0.00000 0 0 0 +GRID 152 0 0.15000 0.26250 0.00000 0 0 0 +GRID 153 0 0.18750 0.26250 0.00000 0 0 0 +GRID 154 0 0.22500 0.26250 0.00000 0 0 0 +GRID 155 0 0.26250 0.26250 0.00000 0 0 0 +GRID 156 0 0.30000 0.26250 0.00000 0 0 0 +GRID 157 0 0.33750 0.26250 0.00000 0 0 0 +GRID 158 0 0.37500 0.26250 0.00000 0 0 0 +GRID 159 0 0.41250 0.26250 0.00000 0 0 0 +GRID 160 0 0.45000 0.26250 0.00000 0 0 0 +GRID 161 0 0.48750 0.26250 0.00000 0 0 0 +GRID 162 0 0.52500 0.26250 0.00000 0 0 0 +GRID 163 0 0.56250 0.26250 0.00000 0 0 0 +GRID 164 0 0.60000 0.26250 0.00000 0 0 0 +GRID 165 0 0.63750 0.26250 0.00000 0 0 0 +GRID 166 0 0.67500 0.26250 0.00000 0 0 0 +GRID 167 0 0.71250 0.26250 0.00000 0 0 0 +GRID 168 0 0.75000 0.26250 0.00000 0 0 0 +GRID 169 0 0.00000 0.30000 0.00000 0 0 0 +GRID 170 0 0.03750 0.30000 0.00000 0 0 0 +GRID 171 0 0.07500 0.30000 0.00000 0 0 0 +GRID 172 0 0.11250 0.30000 0.00000 0 0 0 +GRID 173 0 0.15000 0.30000 0.00000 0 0 0 +GRID 174 0 0.18750 0.30000 0.00000 0 0 0 +GRID 175 0 0.22500 0.30000 0.00000 0 0 0 +GRID 176 0 0.26250 0.30000 0.00000 0 0 0 +GRID 177 0 0.30000 0.30000 0.00000 0 0 0 +GRID 178 0 0.33750 0.30000 0.00000 0 0 0 +GRID 179 0 0.37500 0.30000 0.00000 0 0 0 +GRID 180 0 0.41250 0.30000 0.00000 0 0 0 +GRID 181 0 0.45000 0.30000 0.00000 0 0 0 +GRID 182 0 0.48750 0.30000 0.00000 0 0 0 +GRID 183 0 0.52500 0.30000 0.00000 0 0 0 +GRID 184 0 0.56250 0.30000 0.00000 0 0 0 +GRID 185 0 0.60000 0.30000 0.00000 0 0 0 +GRID 186 0 0.63750 0.30000 0.00000 0 0 0 +GRID 187 0 0.67500 0.30000 0.00000 0 0 0 +GRID 188 0 0.71250 0.30000 0.00000 0 0 0 +GRID 189 0 0.75000 0.30000 0.00000 0 0 0 +GRID 190 0 0.00000 0.33750 0.00000 0 0 0 +GRID 191 0 0.03750 0.33750 0.00000 0 0 0 +GRID 192 0 0.07500 0.33750 0.00000 0 0 0 +GRID 193 0 0.11250 0.33750 0.00000 0 0 0 +GRID 194 0 0.15000 0.33750 0.00000 0 0 0 +GRID 195 0 0.18750 0.33750 0.00000 0 0 0 +GRID 196 0 0.22500 0.33750 0.00000 0 0 0 +GRID 197 0 0.26250 0.33750 0.00000 0 0 0 +GRID 198 0 0.30000 0.33750 0.00000 0 0 0 +GRID 199 0 0.33750 0.33750 0.00000 0 0 0 +GRID 200 0 0.37500 0.33750 0.00000 0 0 0 +GRID 201 0 0.41250 0.33750 0.00000 0 0 0 +GRID 202 0 0.45000 0.33750 0.00000 0 0 0 +GRID 203 0 0.48750 0.33750 0.00000 0 0 0 +GRID 204 0 0.52500 0.33750 0.00000 0 0 0 +GRID 205 0 0.56250 0.33750 0.00000 0 0 0 +GRID 206 0 0.60000 0.33750 0.00000 0 0 0 +GRID 207 0 0.63750 0.33750 0.00000 0 0 0 +GRID 208 0 0.67500 0.33750 0.00000 0 0 0 +GRID 209 0 0.71250 0.33750 0.00000 0 0 0 +GRID 210 0 0.75000 0.33750 0.00000 0 0 0 +GRID 211 0 0.00000 0.37500 0.00000 0 0 0 +GRID 212 0 0.03750 0.37500 0.00000 0 0 0 +GRID 213 0 0.07500 0.37500 0.00000 0 0 0 +GRID 214 0 0.11250 0.37500 0.00000 0 0 0 +GRID 215 0 0.15000 0.37500 0.00000 0 0 0 +GRID 216 0 0.18750 0.37500 0.00000 0 0 0 +GRID 217 0 0.22500 0.37500 0.00000 0 0 0 +GRID 218 0 0.26250 0.37500 0.00000 0 0 0 +GRID 219 0 0.30000 0.37500 0.00000 0 0 0 +GRID 220 0 0.33750 0.37500 0.00000 0 0 0 +GRID 221 0 0.37500 0.37500 0.00000 0 0 0 +GRID 222 0 0.41250 0.37500 0.00000 0 0 0 +GRID 223 0 0.45000 0.37500 0.00000 0 0 0 +GRID 224 0 0.48750 0.37500 0.00000 0 0 0 +GRID 225 0 0.52500 0.37500 0.00000 0 0 0 +GRID 226 0 0.56250 0.37500 0.00000 0 0 0 +GRID 227 0 0.60000 0.37500 0.00000 0 0 0 +GRID 228 0 0.63750 0.37500 0.00000 0 0 0 +GRID 229 0 0.67500 0.37500 0.00000 0 0 0 +GRID 230 0 0.71250 0.37500 0.00000 0 0 0 +GRID 231 0 0.75000 0.37500 0.00000 0 0 0 +GRID 232 0 0.00000 0.41250 0.00000 0 0 0 +GRID 233 0 0.03750 0.41250 0.00000 0 0 0 +GRID 234 0 0.07500 0.41250 0.00000 0 0 0 +GRID 235 0 0.11250 0.41250 0.00000 0 0 0 +GRID 236 0 0.15000 0.41250 0.00000 0 0 0 +GRID 237 0 0.18750 0.41250 0.00000 0 0 0 +GRID 238 0 0.22500 0.41250 0.00000 0 0 0 +GRID 239 0 0.26250 0.41250 0.00000 0 0 0 +GRID 240 0 0.30000 0.41250 0.00000 0 0 0 +GRID 241 0 0.33750 0.41250 0.00000 0 0 0 +GRID 242 0 0.37500 0.41250 0.00000 0 0 0 +GRID 243 0 0.41250 0.41250 0.00000 0 0 0 +GRID 244 0 0.45000 0.41250 0.00000 0 0 0 +GRID 245 0 0.48750 0.41250 0.00000 0 0 0 +GRID 246 0 0.52500 0.41250 0.00000 0 0 0 +GRID 247 0 0.56250 0.41250 0.00000 0 0 0 +GRID 248 0 0.60000 0.41250 0.00000 0 0 0 +GRID 249 0 0.63750 0.41250 0.00000 0 0 0 +GRID 250 0 0.67500 0.41250 0.00000 0 0 0 +GRID 251 0 0.71250 0.41250 0.00000 0 0 0 +GRID 252 0 0.75000 0.41250 0.00000 0 0 0 +GRID 253 0 0.00000 0.45000 0.00000 0 0 0 +GRID 254 0 0.03750 0.45000 0.00000 0 0 0 +GRID 255 0 0.07500 0.45000 0.00000 0 0 0 +GRID 256 0 0.11250 0.45000 0.00000 0 0 0 +GRID 257 0 0.15000 0.45000 0.00000 0 0 0 +GRID 258 0 0.18750 0.45000 0.00000 0 0 0 +GRID 259 0 0.22500 0.45000 0.00000 0 0 0 +GRID 260 0 0.26250 0.45000 0.00000 0 0 0 +GRID 261 0 0.30000 0.45000 0.00000 0 0 0 +GRID 262 0 0.33750 0.45000 0.00000 0 0 0 +GRID 263 0 0.37500 0.45000 0.00000 0 0 0 +GRID 264 0 0.41250 0.45000 0.00000 0 0 0 +GRID 265 0 0.45000 0.45000 0.00000 0 0 0 +GRID 266 0 0.48750 0.45000 0.00000 0 0 0 +GRID 267 0 0.52500 0.45000 0.00000 0 0 0 +GRID 268 0 0.56250 0.45000 0.00000 0 0 0 +GRID 269 0 0.60000 0.45000 0.00000 0 0 0 +GRID 270 0 0.63750 0.45000 0.00000 0 0 0 +GRID 271 0 0.67500 0.45000 0.00000 0 0 0 +GRID 272 0 0.71250 0.45000 0.00000 0 0 0 +GRID 273 0 0.75000 0.45000 0.00000 0 0 0 +GRID 274 0 0.00000 0.48750 0.00000 0 0 0 +GRID 275 0 0.03750 0.48750 0.00000 0 0 0 +GRID 276 0 0.07500 0.48750 0.00000 0 0 0 +GRID 277 0 0.11250 0.48750 0.00000 0 0 0 +GRID 278 0 0.15000 0.48750 0.00000 0 0 0 +GRID 279 0 0.18750 0.48750 0.00000 0 0 0 +GRID 280 0 0.22500 0.48750 0.00000 0 0 0 +GRID 281 0 0.26250 0.48750 0.00000 0 0 0 +GRID 282 0 0.30000 0.48750 0.00000 0 0 0 +GRID 283 0 0.33750 0.48750 0.00000 0 0 0 +GRID 284 0 0.37500 0.48750 0.00000 0 0 0 +GRID 285 0 0.41250 0.48750 0.00000 0 0 0 +GRID 286 0 0.45000 0.48750 0.00000 0 0 0 +GRID 287 0 0.48750 0.48750 0.00000 0 0 0 +GRID 288 0 0.52500 0.48750 0.00000 0 0 0 +GRID 289 0 0.56250 0.48750 0.00000 0 0 0 +GRID 290 0 0.60000 0.48750 0.00000 0 0 0 +GRID 291 0 0.63750 0.48750 0.00000 0 0 0 +GRID 292 0 0.67500 0.48750 0.00000 0 0 0 +GRID 293 0 0.71250 0.48750 0.00000 0 0 0 +GRID 294 0 0.75000 0.48750 0.00000 0 0 0 +GRID 295 0 0.00000 0.52500 0.00000 0 0 0 +GRID 296 0 0.03750 0.52500 0.00000 0 0 0 +GRID 297 0 0.07500 0.52500 0.00000 0 0 0 +GRID 298 0 0.11250 0.52500 0.00000 0 0 0 +GRID 299 0 0.15000 0.52500 0.00000 0 0 0 +GRID 300 0 0.18750 0.52500 0.00000 0 0 0 +GRID 301 0 0.22500 0.52500 0.00000 0 0 0 +GRID 302 0 0.26250 0.52500 0.00000 0 0 0 +GRID 303 0 0.30000 0.52500 0.00000 0 0 0 +GRID 304 0 0.33750 0.52500 0.00000 0 0 0 +GRID 305 0 0.37500 0.52500 0.00000 0 0 0 +GRID 306 0 0.41250 0.52500 0.00000 0 0 0 +GRID 307 0 0.45000 0.52500 0.00000 0 0 0 +GRID 308 0 0.48750 0.52500 0.00000 0 0 0 +GRID 309 0 0.52500 0.52500 0.00000 0 0 0 +GRID 310 0 0.56250 0.52500 0.00000 0 0 0 +GRID 311 0 0.60000 0.52500 0.00000 0 0 0 +GRID 312 0 0.63750 0.52500 0.00000 0 0 0 +GRID 313 0 0.67500 0.52500 0.00000 0 0 0 +GRID 314 0 0.71250 0.52500 0.00000 0 0 0 +GRID 315 0 0.75000 0.52500 0.00000 0 0 0 +GRID 316 0 0.00000 0.56250 0.00000 0 0 0 +GRID 317 0 0.03750 0.56250 0.00000 0 0 0 +GRID 318 0 0.07500 0.56250 0.00000 0 0 0 +GRID 319 0 0.11250 0.56250 0.00000 0 0 0 +GRID 320 0 0.15000 0.56250 0.00000 0 0 0 +GRID 321 0 0.18750 0.56250 0.00000 0 0 0 +GRID 322 0 0.22500 0.56250 0.00000 0 0 0 +GRID 323 0 0.26250 0.56250 0.00000 0 0 0 +GRID 324 0 0.30000 0.56250 0.00000 0 0 0 +GRID 325 0 0.33750 0.56250 0.00000 0 0 0 +GRID 326 0 0.37500 0.56250 0.00000 0 0 0 +GRID 327 0 0.41250 0.56250 0.00000 0 0 0 +GRID 328 0 0.45000 0.56250 0.00000 0 0 0 +GRID 329 0 0.48750 0.56250 0.00000 0 0 0 +GRID 330 0 0.52500 0.56250 0.00000 0 0 0 +GRID 331 0 0.56250 0.56250 0.00000 0 0 0 +GRID 332 0 0.60000 0.56250 0.00000 0 0 0 +GRID 333 0 0.63750 0.56250 0.00000 0 0 0 +GRID 334 0 0.67500 0.56250 0.00000 0 0 0 +GRID 335 0 0.71250 0.56250 0.00000 0 0 0 +GRID 336 0 0.75000 0.56250 0.00000 0 0 0 +GRID 337 0 0.00000 0.60000 0.00000 0 0 0 +GRID 338 0 0.03750 0.60000 0.00000 0 0 0 +GRID 339 0 0.07500 0.60000 0.00000 0 0 0 +GRID 340 0 0.11250 0.60000 0.00000 0 0 0 +GRID 341 0 0.15000 0.60000 0.00000 0 0 0 +GRID 342 0 0.18750 0.60000 0.00000 0 0 0 +GRID 343 0 0.22500 0.60000 0.00000 0 0 0 +GRID 344 0 0.26250 0.60000 0.00000 0 0 0 +GRID 345 0 0.30000 0.60000 0.00000 0 0 0 +GRID 346 0 0.33750 0.60000 0.00000 0 0 0 +GRID 347 0 0.37500 0.60000 0.00000 0 0 0 +GRID 348 0 0.41250 0.60000 0.00000 0 0 0 +GRID 349 0 0.45000 0.60000 0.00000 0 0 0 +GRID 350 0 0.48750 0.60000 0.00000 0 0 0 +GRID 351 0 0.52500 0.60000 0.00000 0 0 0 +GRID 352 0 0.56250 0.60000 0.00000 0 0 0 +GRID 353 0 0.60000 0.60000 0.00000 0 0 0 +GRID 354 0 0.63750 0.60000 0.00000 0 0 0 +GRID 355 0 0.67500 0.60000 0.00000 0 0 0 +GRID 356 0 0.71250 0.60000 0.00000 0 0 0 +GRID 357 0 0.75000 0.60000 0.00000 0 0 0 +GRID 358 0 0.00000 0.63750 0.00000 0 0 0 +GRID 359 0 0.03750 0.63750 0.00000 0 0 0 +GRID 360 0 0.07500 0.63750 0.00000 0 0 0 +GRID 361 0 0.11250 0.63750 0.00000 0 0 0 +GRID 362 0 0.15000 0.63750 0.00000 0 0 0 +GRID 363 0 0.18750 0.63750 0.00000 0 0 0 +GRID 364 0 0.22500 0.63750 0.00000 0 0 0 +GRID 365 0 0.26250 0.63750 0.00000 0 0 0 +GRID 366 0 0.30000 0.63750 0.00000 0 0 0 +GRID 367 0 0.33750 0.63750 0.00000 0 0 0 +GRID 368 0 0.37500 0.63750 0.00000 0 0 0 +GRID 369 0 0.41250 0.63750 0.00000 0 0 0 +GRID 370 0 0.45000 0.63750 0.00000 0 0 0 +GRID 371 0 0.48750 0.63750 0.00000 0 0 0 +GRID 372 0 0.52500 0.63750 0.00000 0 0 0 +GRID 373 0 0.56250 0.63750 0.00000 0 0 0 +GRID 374 0 0.60000 0.63750 0.00000 0 0 0 +GRID 375 0 0.63750 0.63750 0.00000 0 0 0 +GRID 376 0 0.67500 0.63750 0.00000 0 0 0 +GRID 377 0 0.71250 0.63750 0.00000 0 0 0 +GRID 378 0 0.75000 0.63750 0.00000 0 0 0 +GRID 379 0 0.00000 0.67500 0.00000 0 0 0 +GRID 380 0 0.03750 0.67500 0.00000 0 0 0 +GRID 381 0 0.07500 0.67500 0.00000 0 0 0 +GRID 382 0 0.11250 0.67500 0.00000 0 0 0 +GRID 383 0 0.15000 0.67500 0.00000 0 0 0 +GRID 384 0 0.18750 0.67500 0.00000 0 0 0 +GRID 385 0 0.22500 0.67500 0.00000 0 0 0 +GRID 386 0 0.26250 0.67500 0.00000 0 0 0 +GRID 387 0 0.30000 0.67500 0.00000 0 0 0 +GRID 388 0 0.33750 0.67500 0.00000 0 0 0 +GRID 389 0 0.37500 0.67500 0.00000 0 0 0 +GRID 390 0 0.41250 0.67500 0.00000 0 0 0 +GRID 391 0 0.45000 0.67500 0.00000 0 0 0 +GRID 392 0 0.48750 0.67500 0.00000 0 0 0 +GRID 393 0 0.52500 0.67500 0.00000 0 0 0 +GRID 394 0 0.56250 0.67500 0.00000 0 0 0 +GRID 395 0 0.60000 0.67500 0.00000 0 0 0 +GRID 396 0 0.63750 0.67500 0.00000 0 0 0 +GRID 397 0 0.67500 0.67500 0.00000 0 0 0 +GRID 398 0 0.71250 0.67500 0.00000 0 0 0 +GRID 399 0 0.75000 0.67500 0.00000 0 0 0 +GRID 400 0 0.00000 0.71250 0.00000 0 0 0 +GRID 401 0 0.03750 0.71250 0.00000 0 0 0 +GRID 402 0 0.07500 0.71250 0.00000 0 0 0 +GRID 403 0 0.11250 0.71250 0.00000 0 0 0 +GRID 404 0 0.15000 0.71250 0.00000 0 0 0 +GRID 405 0 0.18750 0.71250 0.00000 0 0 0 +GRID 406 0 0.22500 0.71250 0.00000 0 0 0 +GRID 407 0 0.26250 0.71250 0.00000 0 0 0 +GRID 408 0 0.30000 0.71250 0.00000 0 0 0 +GRID 409 0 0.33750 0.71250 0.00000 0 0 0 +GRID 410 0 0.37500 0.71250 0.00000 0 0 0 +GRID 411 0 0.41250 0.71250 0.00000 0 0 0 +GRID 412 0 0.45000 0.71250 0.00000 0 0 0 +GRID 413 0 0.48750 0.71250 0.00000 0 0 0 +GRID 414 0 0.52500 0.71250 0.00000 0 0 0 +GRID 415 0 0.56250 0.71250 0.00000 0 0 0 +GRID 416 0 0.60000 0.71250 0.00000 0 0 0 +GRID 417 0 0.63750 0.71250 0.00000 0 0 0 +GRID 418 0 0.67500 0.71250 0.00000 0 0 0 +GRID 419 0 0.71250 0.71250 0.00000 0 0 0 +GRID 420 0 0.75000 0.71250 0.00000 0 0 0 +GRID 421 0 0.00000 0.75000 0.00000 0 0 0 +GRID 422 0 0.03750 0.75000 0.00000 0 0 0 +GRID 423 0 0.07500 0.75000 0.00000 0 0 0 +GRID 424 0 0.11250 0.75000 0.00000 0 0 0 +GRID 425 0 0.15000 0.75000 0.00000 0 0 0 +GRID 426 0 0.18750 0.75000 0.00000 0 0 0 +GRID 427 0 0.22500 0.75000 0.00000 0 0 0 +GRID 428 0 0.26250 0.75000 0.00000 0 0 0 +GRID 429 0 0.30000 0.75000 0.00000 0 0 0 +GRID 430 0 0.33750 0.75000 0.00000 0 0 0 +GRID 431 0 0.37500 0.75000 0.00000 0 0 0 +GRID 432 0 0.41250 0.75000 0.00000 0 0 0 +GRID 433 0 0.45000 0.75000 0.00000 0 0 0 +GRID 434 0 0.48750 0.75000 0.00000 0 0 0 +GRID 435 0 0.52500 0.75000 0.00000 0 0 0 +GRID 436 0 0.56250 0.75000 0.00000 0 0 0 +GRID 437 0 0.60000 0.75000 0.00000 0 0 0 +GRID 438 0 0.63750 0.75000 0.00000 0 0 0 +GRID 439 0 0.67500 0.75000 0.00000 0 0 0 +GRID 440 0 0.71250 0.75000 0.00000 0 0 0 +GRID 441 0 0.75000 0.75000 0.00000 0 0 0 +GRID 442 0 0.00000 0.78750 0.00000 0 0 0 +GRID 443 0 0.03750 0.78750 0.00000 0 0 0 +GRID 444 0 0.07500 0.78750 0.00000 0 0 0 +GRID 445 0 0.11250 0.78750 0.00000 0 0 0 +GRID 446 0 0.15000 0.78750 0.00000 0 0 0 +GRID 447 0 0.18750 0.78750 0.00000 0 0 0 +GRID 448 0 0.22500 0.78750 0.00000 0 0 0 +GRID 449 0 0.26250 0.78750 0.00000 0 0 0 +GRID 450 0 0.30000 0.78750 0.00000 0 0 0 +GRID 451 0 0.33750 0.78750 0.00000 0 0 0 +GRID 452 0 0.37500 0.78750 0.00000 0 0 0 +GRID 453 0 0.41250 0.78750 0.00000 0 0 0 +GRID 454 0 0.45000 0.78750 0.00000 0 0 0 +GRID 455 0 0.48750 0.78750 0.00000 0 0 0 +GRID 456 0 0.52500 0.78750 0.00000 0 0 0 +GRID 457 0 0.56250 0.78750 0.00000 0 0 0 +GRID 458 0 0.60000 0.78750 0.00000 0 0 0 +GRID 459 0 0.63750 0.78750 0.00000 0 0 0 +GRID 460 0 0.67500 0.78750 0.00000 0 0 0 +GRID 461 0 0.71250 0.78750 0.00000 0 0 0 +GRID 462 0 0.75000 0.78750 0.00000 0 0 0 +GRID 463 0 0.00000 0.82500 0.00000 0 0 0 +GRID 464 0 0.03750 0.82500 0.00000 0 0 0 +GRID 465 0 0.07500 0.82500 0.00000 0 0 0 +GRID 466 0 0.11250 0.82500 0.00000 0 0 0 +GRID 467 0 0.15000 0.82500 0.00000 0 0 0 +GRID 468 0 0.18750 0.82500 0.00000 0 0 0 +GRID 469 0 0.22500 0.82500 0.00000 0 0 0 +GRID 470 0 0.26250 0.82500 0.00000 0 0 0 +GRID 471 0 0.30000 0.82500 0.00000 0 0 0 +GRID 472 0 0.33750 0.82500 0.00000 0 0 0 +GRID 473 0 0.37500 0.82500 0.00000 0 0 0 +GRID 474 0 0.41250 0.82500 0.00000 0 0 0 +GRID 475 0 0.45000 0.82500 0.00000 0 0 0 +GRID 476 0 0.48750 0.82500 0.00000 0 0 0 +GRID 477 0 0.52500 0.82500 0.00000 0 0 0 +GRID 478 0 0.56250 0.82500 0.00000 0 0 0 +GRID 479 0 0.60000 0.82500 0.00000 0 0 0 +GRID 480 0 0.63750 0.82500 0.00000 0 0 0 +GRID 481 0 0.67500 0.82500 0.00000 0 0 0 +GRID 482 0 0.71250 0.82500 0.00000 0 0 0 +GRID 483 0 0.75000 0.82500 0.00000 0 0 0 +GRID 484 0 0.00000 0.86250 0.00000 0 0 0 +GRID 485 0 0.03750 0.86250 0.00000 0 0 0 +GRID 486 0 0.07500 0.86250 0.00000 0 0 0 +GRID 487 0 0.11250 0.86250 0.00000 0 0 0 +GRID 488 0 0.15000 0.86250 0.00000 0 0 0 +GRID 489 0 0.18750 0.86250 0.00000 0 0 0 +GRID 490 0 0.22500 0.86250 0.00000 0 0 0 +GRID 491 0 0.26250 0.86250 0.00000 0 0 0 +GRID 492 0 0.30000 0.86250 0.00000 0 0 0 +GRID 493 0 0.33750 0.86250 0.00000 0 0 0 +GRID 494 0 0.37500 0.86250 0.00000 0 0 0 +GRID 495 0 0.41250 0.86250 0.00000 0 0 0 +GRID 496 0 0.45000 0.86250 0.00000 0 0 0 +GRID 497 0 0.48750 0.86250 0.00000 0 0 0 +GRID 498 0 0.52500 0.86250 0.00000 0 0 0 +GRID 499 0 0.56250 0.86250 0.00000 0 0 0 +GRID 500 0 0.60000 0.86250 0.00000 0 0 0 +GRID 501 0 0.63750 0.86250 0.00000 0 0 0 +GRID 502 0 0.67500 0.86250 0.00000 0 0 0 +GRID 503 0 0.71250 0.86250 0.00000 0 0 0 +GRID 504 0 0.75000 0.86250 0.00000 0 0 0 +GRID 505 0 0.00000 0.90000 0.00000 0 0 0 +GRID 506 0 0.03750 0.90000 0.00000 0 0 0 +GRID 507 0 0.07500 0.90000 0.00000 0 0 0 +GRID 508 0 0.11250 0.90000 0.00000 0 0 0 +GRID 509 0 0.15000 0.90000 0.00000 0 0 0 +GRID 510 0 0.18750 0.90000 0.00000 0 0 0 +GRID 511 0 0.22500 0.90000 0.00000 0 0 0 +GRID 512 0 0.26250 0.90000 0.00000 0 0 0 +GRID 513 0 0.30000 0.90000 0.00000 0 0 0 +GRID 514 0 0.33750 0.90000 0.00000 0 0 0 +GRID 515 0 0.37500 0.90000 0.00000 0 0 0 +GRID 516 0 0.41250 0.90000 0.00000 0 0 0 +GRID 517 0 0.45000 0.90000 0.00000 0 0 0 +GRID 518 0 0.48750 0.90000 0.00000 0 0 0 +GRID 519 0 0.52500 0.90000 0.00000 0 0 0 +GRID 520 0 0.56250 0.90000 0.00000 0 0 0 +GRID 521 0 0.60000 0.90000 0.00000 0 0 0 +GRID 522 0 0.63750 0.90000 0.00000 0 0 0 +GRID 523 0 0.67500 0.90000 0.00000 0 0 0 +GRID 524 0 0.71250 0.90000 0.00000 0 0 0 +GRID 525 0 0.75000 0.90000 0.00000 0 0 0 +GRID 526 0 0.00000 0.93750 0.00000 0 0 0 +GRID 527 0 0.03750 0.93750 0.00000 0 0 0 +GRID 528 0 0.07500 0.93750 0.00000 0 0 0 +GRID 529 0 0.11250 0.93750 0.00000 0 0 0 +GRID 530 0 0.15000 0.93750 0.00000 0 0 0 +GRID 531 0 0.18750 0.93750 0.00000 0 0 0 +GRID 532 0 0.22500 0.93750 0.00000 0 0 0 +GRID 533 0 0.26250 0.93750 0.00000 0 0 0 +GRID 534 0 0.30000 0.93750 0.00000 0 0 0 +GRID 535 0 0.33750 0.93750 0.00000 0 0 0 +GRID 536 0 0.37500 0.93750 0.00000 0 0 0 +GRID 537 0 0.41250 0.93750 0.00000 0 0 0 +GRID 538 0 0.45000 0.93750 0.00000 0 0 0 +GRID 539 0 0.48750 0.93750 0.00000 0 0 0 +GRID 540 0 0.52500 0.93750 0.00000 0 0 0 +GRID 541 0 0.56250 0.93750 0.00000 0 0 0 +GRID 542 0 0.60000 0.93750 0.00000 0 0 0 +GRID 543 0 0.63750 0.93750 0.00000 0 0 0 +GRID 544 0 0.67500 0.93750 0.00000 0 0 0 +GRID 545 0 0.71250 0.93750 0.00000 0 0 0 +GRID 546 0 0.75000 0.93750 0.00000 0 0 0 +GRID 547 0 0.00000 0.97500 0.00000 0 0 0 +GRID 548 0 0.03750 0.97500 0.00000 0 0 0 +GRID 549 0 0.07500 0.97500 0.00000 0 0 0 +GRID 550 0 0.11250 0.97500 0.00000 0 0 0 +GRID 551 0 0.15000 0.97500 0.00000 0 0 0 +GRID 552 0 0.18750 0.97500 0.00000 0 0 0 +GRID 553 0 0.22500 0.97500 0.00000 0 0 0 +GRID 554 0 0.26250 0.97500 0.00000 0 0 0 +GRID 555 0 0.30000 0.97500 0.00000 0 0 0 +GRID 556 0 0.33750 0.97500 0.00000 0 0 0 +GRID 557 0 0.37500 0.97500 0.00000 0 0 0 +GRID 558 0 0.41250 0.97500 0.00000 0 0 0 +GRID 559 0 0.45000 0.97500 0.00000 0 0 0 +GRID 560 0 0.48750 0.97500 0.00000 0 0 0 +GRID 561 0 0.52500 0.97500 0.00000 0 0 0 +GRID 562 0 0.56250 0.97500 0.00000 0 0 0 +GRID 563 0 0.60000 0.97500 0.00000 0 0 0 +GRID 564 0 0.63750 0.97500 0.00000 0 0 0 +GRID 565 0 0.67500 0.97500 0.00000 0 0 0 +GRID 566 0 0.71250 0.97500 0.00000 0 0 0 +GRID 567 0 0.75000 0.97500 0.00000 0 0 0 +GRID 568 0 0.00000 1.01250 0.00000 0 0 0 +GRID 569 0 0.03750 1.01250 0.00000 0 0 0 +GRID 570 0 0.07500 1.01250 0.00000 0 0 0 +GRID 571 0 0.11250 1.01250 0.00000 0 0 0 +GRID 572 0 0.15000 1.01250 0.00000 0 0 0 +GRID 573 0 0.18750 1.01250 0.00000 0 0 0 +GRID 574 0 0.22500 1.01250 0.00000 0 0 0 +GRID 575 0 0.26250 1.01250 0.00000 0 0 0 +GRID 576 0 0.30000 1.01250 0.00000 0 0 0 +GRID 577 0 0.33750 1.01250 0.00000 0 0 0 +GRID 578 0 0.37500 1.01250 0.00000 0 0 0 +GRID 579 0 0.41250 1.01250 0.00000 0 0 0 +GRID 580 0 0.45000 1.01250 0.00000 0 0 0 +GRID 581 0 0.48750 1.01250 0.00000 0 0 0 +GRID 582 0 0.52500 1.01250 0.00000 0 0 0 +GRID 583 0 0.56250 1.01250 0.00000 0 0 0 +GRID 584 0 0.60000 1.01250 0.00000 0 0 0 +GRID 585 0 0.63750 1.01250 0.00000 0 0 0 +GRID 586 0 0.67500 1.01250 0.00000 0 0 0 +GRID 587 0 0.71250 1.01250 0.00000 0 0 0 +GRID 588 0 0.75000 1.01250 0.00000 0 0 0 +GRID 589 0 0.00000 1.05000 0.00000 0 0 0 +GRID 590 0 0.03750 1.05000 0.00000 0 0 0 +GRID 591 0 0.07500 1.05000 0.00000 0 0 0 +GRID 592 0 0.11250 1.05000 0.00000 0 0 0 +GRID 593 0 0.15000 1.05000 0.00000 0 0 0 +GRID 594 0 0.18750 1.05000 0.00000 0 0 0 +GRID 595 0 0.22500 1.05000 0.00000 0 0 0 +GRID 596 0 0.26250 1.05000 0.00000 0 0 0 +GRID 597 0 0.30000 1.05000 0.00000 0 0 0 +GRID 598 0 0.33750 1.05000 0.00000 0 0 0 +GRID 599 0 0.37500 1.05000 0.00000 0 0 0 +GRID 600 0 0.41250 1.05000 0.00000 0 0 0 +GRID 601 0 0.45000 1.05000 0.00000 0 0 0 +GRID 602 0 0.48750 1.05000 0.00000 0 0 0 +GRID 603 0 0.52500 1.05000 0.00000 0 0 0 +GRID 604 0 0.56250 1.05000 0.00000 0 0 0 +GRID 605 0 0.60000 1.05000 0.00000 0 0 0 +GRID 606 0 0.63750 1.05000 0.00000 0 0 0 +GRID 607 0 0.67500 1.05000 0.00000 0 0 0 +GRID 608 0 0.71250 1.05000 0.00000 0 0 0 +GRID 609 0 0.75000 1.05000 0.00000 0 0 0 +GRID 610 0 0.00000 1.08750 0.00000 0 0 0 +GRID 611 0 0.03750 1.08750 0.00000 0 0 0 +GRID 612 0 0.07500 1.08750 0.00000 0 0 0 +GRID 613 0 0.11250 1.08750 0.00000 0 0 0 +GRID 614 0 0.15000 1.08750 0.00000 0 0 0 +GRID 615 0 0.18750 1.08750 0.00000 0 0 0 +GRID 616 0 0.22500 1.08750 0.00000 0 0 0 +GRID 617 0 0.26250 1.08750 0.00000 0 0 0 +GRID 618 0 0.30000 1.08750 0.00000 0 0 0 +GRID 619 0 0.33750 1.08750 0.00000 0 0 0 +GRID 620 0 0.37500 1.08750 0.00000 0 0 0 +GRID 621 0 0.41250 1.08750 0.00000 0 0 0 +GRID 622 0 0.45000 1.08750 0.00000 0 0 0 +GRID 623 0 0.48750 1.08750 0.00000 0 0 0 +GRID 624 0 0.52500 1.08750 0.00000 0 0 0 +GRID 625 0 0.56250 1.08750 0.00000 0 0 0 +GRID 626 0 0.60000 1.08750 0.00000 0 0 0 +GRID 627 0 0.63750 1.08750 0.00000 0 0 0 +GRID 628 0 0.67500 1.08750 0.00000 0 0 0 +GRID 629 0 0.71250 1.08750 0.00000 0 0 0 +GRID 630 0 0.75000 1.08750 0.00000 0 0 0 +GRID 631 0 0.00000 1.12500 0.00000 0 0 0 +GRID 632 0 0.03750 1.12500 0.00000 0 0 0 +GRID 633 0 0.07500 1.12500 0.00000 0 0 0 +GRID 634 0 0.11250 1.12500 0.00000 0 0 0 +GRID 635 0 0.15000 1.12500 0.00000 0 0 0 +GRID 636 0 0.18750 1.12500 0.00000 0 0 0 +GRID 637 0 0.22500 1.12500 0.00000 0 0 0 +GRID 638 0 0.26250 1.12500 0.00000 0 0 0 +GRID 639 0 0.30000 1.12500 0.00000 0 0 0 +GRID 640 0 0.33750 1.12500 0.00000 0 0 0 +GRID 641 0 0.37500 1.12500 0.00000 0 0 0 +GRID 642 0 0.41250 1.12500 0.00000 0 0 0 +GRID 643 0 0.45000 1.12500 0.00000 0 0 0 +GRID 644 0 0.48750 1.12500 0.00000 0 0 0 +GRID 645 0 0.52500 1.12500 0.00000 0 0 0 +GRID 646 0 0.56250 1.12500 0.00000 0 0 0 +GRID 647 0 0.60000 1.12500 0.00000 0 0 0 +GRID 648 0 0.63750 1.12500 0.00000 0 0 0 +GRID 649 0 0.67500 1.12500 0.00000 0 0 0 +GRID 650 0 0.71250 1.12500 0.00000 0 0 0 +GRID 651 0 0.75000 1.12500 0.00000 0 0 0 +GRID 652 0 0.00000 1.16250 0.00000 0 0 0 +GRID 653 0 0.03750 1.16250 0.00000 0 0 0 +GRID 654 0 0.07500 1.16250 0.00000 0 0 0 +GRID 655 0 0.11250 1.16250 0.00000 0 0 0 +GRID 656 0 0.15000 1.16250 0.00000 0 0 0 +GRID 657 0 0.18750 1.16250 0.00000 0 0 0 +GRID 658 0 0.22500 1.16250 0.00000 0 0 0 +GRID 659 0 0.26250 1.16250 0.00000 0 0 0 +GRID 660 0 0.30000 1.16250 0.00000 0 0 0 +GRID 661 0 0.33750 1.16250 0.00000 0 0 0 +GRID 662 0 0.37500 1.16250 0.00000 0 0 0 +GRID 663 0 0.41250 1.16250 0.00000 0 0 0 +GRID 664 0 0.45000 1.16250 0.00000 0 0 0 +GRID 665 0 0.48750 1.16250 0.00000 0 0 0 +GRID 666 0 0.52500 1.16250 0.00000 0 0 0 +GRID 667 0 0.56250 1.16250 0.00000 0 0 0 +GRID 668 0 0.60000 1.16250 0.00000 0 0 0 +GRID 669 0 0.63750 1.16250 0.00000 0 0 0 +GRID 670 0 0.67500 1.16250 0.00000 0 0 0 +GRID 671 0 0.71250 1.16250 0.00000 0 0 0 +GRID 672 0 0.75000 1.16250 0.00000 0 0 0 +GRID 673 0 0.00000 1.20000 0.00000 0 0 0 +GRID 674 0 0.03750 1.20000 0.00000 0 0 0 +GRID 675 0 0.07500 1.20000 0.00000 0 0 0 +GRID 676 0 0.11250 1.20000 0.00000 0 0 0 +GRID 677 0 0.15000 1.20000 0.00000 0 0 0 +GRID 678 0 0.18750 1.20000 0.00000 0 0 0 +GRID 679 0 0.22500 1.20000 0.00000 0 0 0 +GRID 680 0 0.26250 1.20000 0.00000 0 0 0 +GRID 681 0 0.30000 1.20000 0.00000 0 0 0 +GRID 682 0 0.33750 1.20000 0.00000 0 0 0 +GRID 683 0 0.37500 1.20000 0.00000 0 0 0 +GRID 684 0 0.41250 1.20000 0.00000 0 0 0 +GRID 685 0 0.45000 1.20000 0.00000 0 0 0 +GRID 686 0 0.48750 1.20000 0.00000 0 0 0 +GRID 687 0 0.52500 1.20000 0.00000 0 0 0 +GRID 688 0 0.56250 1.20000 0.00000 0 0 0 +GRID 689 0 0.60000 1.20000 0.00000 0 0 0 +GRID 690 0 0.63750 1.20000 0.00000 0 0 0 +GRID 691 0 0.67500 1.20000 0.00000 0 0 0 +GRID 692 0 0.71250 1.20000 0.00000 0 0 0 +GRID 693 0 0.75000 1.20000 0.00000 0 0 0 +GRID 694 0 0.00000 1.23750 0.00000 0 0 0 +GRID 695 0 0.03750 1.23750 0.00000 0 0 0 +GRID 696 0 0.07500 1.23750 0.00000 0 0 0 +GRID 697 0 0.11250 1.23750 0.00000 0 0 0 +GRID 698 0 0.15000 1.23750 0.00000 0 0 0 +GRID 699 0 0.18750 1.23750 0.00000 0 0 0 +GRID 700 0 0.22500 1.23750 0.00000 0 0 0 +GRID 701 0 0.26250 1.23750 0.00000 0 0 0 +GRID 702 0 0.30000 1.23750 0.00000 0 0 0 +GRID 703 0 0.33750 1.23750 0.00000 0 0 0 +GRID 704 0 0.37500 1.23750 0.00000 0 0 0 +GRID 705 0 0.41250 1.23750 0.00000 0 0 0 +GRID 706 0 0.45000 1.23750 0.00000 0 0 0 +GRID 707 0 0.48750 1.23750 0.00000 0 0 0 +GRID 708 0 0.52500 1.23750 0.00000 0 0 0 +GRID 709 0 0.56250 1.23750 0.00000 0 0 0 +GRID 710 0 0.60000 1.23750 0.00000 0 0 0 +GRID 711 0 0.63750 1.23750 0.00000 0 0 0 +GRID 712 0 0.67500 1.23750 0.00000 0 0 0 +GRID 713 0 0.71250 1.23750 0.00000 0 0 0 +GRID 714 0 0.75000 1.23750 0.00000 0 0 0 +GRID 715 0 0.00000 1.27500 0.00000 0 0 0 +GRID 716 0 0.03750 1.27500 0.00000 0 0 0 +GRID 717 0 0.07500 1.27500 0.00000 0 0 0 +GRID 718 0 0.11250 1.27500 0.00000 0 0 0 +GRID 719 0 0.15000 1.27500 0.00000 0 0 0 +GRID 720 0 0.18750 1.27500 0.00000 0 0 0 +GRID 721 0 0.22500 1.27500 0.00000 0 0 0 +GRID 722 0 0.26250 1.27500 0.00000 0 0 0 +GRID 723 0 0.30000 1.27500 0.00000 0 0 0 +GRID 724 0 0.33750 1.27500 0.00000 0 0 0 +GRID 725 0 0.37500 1.27500 0.00000 0 0 0 +GRID 726 0 0.41250 1.27500 0.00000 0 0 0 +GRID 727 0 0.45000 1.27500 0.00000 0 0 0 +GRID 728 0 0.48750 1.27500 0.00000 0 0 0 +GRID 729 0 0.52500 1.27500 0.00000 0 0 0 +GRID 730 0 0.56250 1.27500 0.00000 0 0 0 +GRID 731 0 0.60000 1.27500 0.00000 0 0 0 +GRID 732 0 0.63750 1.27500 0.00000 0 0 0 +GRID 733 0 0.67500 1.27500 0.00000 0 0 0 +GRID 734 0 0.71250 1.27500 0.00000 0 0 0 +GRID 735 0 0.75000 1.27500 0.00000 0 0 0 +GRID 736 0 0.00000 1.31250 0.00000 0 0 0 +GRID 737 0 0.03750 1.31250 0.00000 0 0 0 +GRID 738 0 0.07500 1.31250 0.00000 0 0 0 +GRID 739 0 0.11250 1.31250 0.00000 0 0 0 +GRID 740 0 0.15000 1.31250 0.00000 0 0 0 +GRID 741 0 0.18750 1.31250 0.00000 0 0 0 +GRID 742 0 0.22500 1.31250 0.00000 0 0 0 +GRID 743 0 0.26250 1.31250 0.00000 0 0 0 +GRID 744 0 0.30000 1.31250 0.00000 0 0 0 +GRID 745 0 0.33750 1.31250 0.00000 0 0 0 +GRID 746 0 0.37500 1.31250 0.00000 0 0 0 +GRID 747 0 0.41250 1.31250 0.00000 0 0 0 +GRID 748 0 0.45000 1.31250 0.00000 0 0 0 +GRID 749 0 0.48750 1.31250 0.00000 0 0 0 +GRID 750 0 0.52500 1.31250 0.00000 0 0 0 +GRID 751 0 0.56250 1.31250 0.00000 0 0 0 +GRID 752 0 0.60000 1.31250 0.00000 0 0 0 +GRID 753 0 0.63750 1.31250 0.00000 0 0 0 +GRID 754 0 0.67500 1.31250 0.00000 0 0 0 +GRID 755 0 0.71250 1.31250 0.00000 0 0 0 +GRID 756 0 0.75000 1.31250 0.00000 0 0 0 +GRID 757 0 0.00000 1.35000 0.00000 0 0 0 +GRID 758 0 0.03750 1.35000 0.00000 0 0 0 +GRID 759 0 0.07500 1.35000 0.00000 0 0 0 +GRID 760 0 0.11250 1.35000 0.00000 0 0 0 +GRID 761 0 0.15000 1.35000 0.00000 0 0 0 +GRID 762 0 0.18750 1.35000 0.00000 0 0 0 +GRID 763 0 0.22500 1.35000 0.00000 0 0 0 +GRID 764 0 0.26250 1.35000 0.00000 0 0 0 +GRID 765 0 0.30000 1.35000 0.00000 0 0 0 +GRID 766 0 0.33750 1.35000 0.00000 0 0 0 +GRID 767 0 0.37500 1.35000 0.00000 0 0 0 +GRID 768 0 0.41250 1.35000 0.00000 0 0 0 +GRID 769 0 0.45000 1.35000 0.00000 0 0 0 +GRID 770 0 0.48750 1.35000 0.00000 0 0 0 +GRID 771 0 0.52500 1.35000 0.00000 0 0 0 +GRID 772 0 0.56250 1.35000 0.00000 0 0 0 +GRID 773 0 0.60000 1.35000 0.00000 0 0 0 +GRID 774 0 0.63750 1.35000 0.00000 0 0 0 +GRID 775 0 0.67500 1.35000 0.00000 0 0 0 +GRID 776 0 0.71250 1.35000 0.00000 0 0 0 +GRID 777 0 0.75000 1.35000 0.00000 0 0 0 +GRID 778 0 0.00000 1.38750 0.00000 0 0 0 +GRID 779 0 0.03750 1.38750 0.00000 0 0 0 +GRID 780 0 0.07500 1.38750 0.00000 0 0 0 +GRID 781 0 0.11250 1.38750 0.00000 0 0 0 +GRID 782 0 0.15000 1.38750 0.00000 0 0 0 +GRID 783 0 0.18750 1.38750 0.00000 0 0 0 +GRID 784 0 0.22500 1.38750 0.00000 0 0 0 +GRID 785 0 0.26250 1.38750 0.00000 0 0 0 +GRID 786 0 0.30000 1.38750 0.00000 0 0 0 +GRID 787 0 0.33750 1.38750 0.00000 0 0 0 +GRID 788 0 0.37500 1.38750 0.00000 0 0 0 +GRID 789 0 0.41250 1.38750 0.00000 0 0 0 +GRID 790 0 0.45000 1.38750 0.00000 0 0 0 +GRID 791 0 0.48750 1.38750 0.00000 0 0 0 +GRID 792 0 0.52500 1.38750 0.00000 0 0 0 +GRID 793 0 0.56250 1.38750 0.00000 0 0 0 +GRID 794 0 0.60000 1.38750 0.00000 0 0 0 +GRID 795 0 0.63750 1.38750 0.00000 0 0 0 +GRID 796 0 0.67500 1.38750 0.00000 0 0 0 +GRID 797 0 0.71250 1.38750 0.00000 0 0 0 +GRID 798 0 0.75000 1.38750 0.00000 0 0 0 +GRID 799 0 0.00000 1.42500 0.00000 0 0 0 +GRID 800 0 0.03750 1.42500 0.00000 0 0 0 +GRID 801 0 0.07500 1.42500 0.00000 0 0 0 +GRID 802 0 0.11250 1.42500 0.00000 0 0 0 +GRID 803 0 0.15000 1.42500 0.00000 0 0 0 +GRID 804 0 0.18750 1.42500 0.00000 0 0 0 +GRID 805 0 0.22500 1.42500 0.00000 0 0 0 +GRID 806 0 0.26250 1.42500 0.00000 0 0 0 +GRID 807 0 0.30000 1.42500 0.00000 0 0 0 +GRID 808 0 0.33750 1.42500 0.00000 0 0 0 +GRID 809 0 0.37500 1.42500 0.00000 0 0 0 +GRID 810 0 0.41250 1.42500 0.00000 0 0 0 +GRID 811 0 0.45000 1.42500 0.00000 0 0 0 +GRID 812 0 0.48750 1.42500 0.00000 0 0 0 +GRID 813 0 0.52500 1.42500 0.00000 0 0 0 +GRID 814 0 0.56250 1.42500 0.00000 0 0 0 +GRID 815 0 0.60000 1.42500 0.00000 0 0 0 +GRID 816 0 0.63750 1.42500 0.00000 0 0 0 +GRID 817 0 0.67500 1.42500 0.00000 0 0 0 +GRID 818 0 0.71250 1.42500 0.00000 0 0 0 +GRID 819 0 0.75000 1.42500 0.00000 0 0 0 +GRID 820 0 0.00000 1.46250 0.00000 0 0 0 +GRID 821 0 0.03750 1.46250 0.00000 0 0 0 +GRID 822 0 0.07500 1.46250 0.00000 0 0 0 +GRID 823 0 0.11250 1.46250 0.00000 0 0 0 +GRID 824 0 0.15000 1.46250 0.00000 0 0 0 +GRID 825 0 0.18750 1.46250 0.00000 0 0 0 +GRID 826 0 0.22500 1.46250 0.00000 0 0 0 +GRID 827 0 0.26250 1.46250 0.00000 0 0 0 +GRID 828 0 0.30000 1.46250 0.00000 0 0 0 +GRID 829 0 0.33750 1.46250 0.00000 0 0 0 +GRID 830 0 0.37500 1.46250 0.00000 0 0 0 +GRID 831 0 0.41250 1.46250 0.00000 0 0 0 +GRID 832 0 0.45000 1.46250 0.00000 0 0 0 +GRID 833 0 0.48750 1.46250 0.00000 0 0 0 +GRID 834 0 0.52500 1.46250 0.00000 0 0 0 +GRID 835 0 0.56250 1.46250 0.00000 0 0 0 +GRID 836 0 0.60000 1.46250 0.00000 0 0 0 +GRID 837 0 0.63750 1.46250 0.00000 0 0 0 +GRID 838 0 0.67500 1.46250 0.00000 0 0 0 +GRID 839 0 0.71250 1.46250 0.00000 0 0 0 +GRID 840 0 0.75000 1.46250 0.00000 0 0 0 +GRID 841 0 0.00000 1.50000 0.00000 0 0 0 +GRID 842 0 0.03750 1.50000 0.00000 0 0 0 +GRID 843 0 0.07500 1.50000 0.00000 0 0 0 +GRID 844 0 0.11250 1.50000 0.00000 0 0 0 +GRID 845 0 0.15000 1.50000 0.00000 0 0 0 +GRID 846 0 0.18750 1.50000 0.00000 0 0 0 +GRID 847 0 0.22500 1.50000 0.00000 0 0 0 +GRID 848 0 0.26250 1.50000 0.00000 0 0 0 +GRID 849 0 0.30000 1.50000 0.00000 0 0 0 +GRID 850 0 0.33750 1.50000 0.00000 0 0 0 +GRID 851 0 0.37500 1.50000 0.00000 0 0 0 +GRID 852 0 0.41250 1.50000 0.00000 0 0 0 +GRID 853 0 0.45000 1.50000 0.00000 0 0 0 +GRID 854 0 0.48750 1.50000 0.00000 0 0 0 +GRID 855 0 0.52500 1.50000 0.00000 0 0 0 +GRID 856 0 0.56250 1.50000 0.00000 0 0 0 +GRID 857 0 0.60000 1.50000 0.00000 0 0 0 +GRID 858 0 0.63750 1.50000 0.00000 0 0 0 +GRID 859 0 0.67500 1.50000 0.00000 0 0 0 +GRID 860 0 0.71250 1.50000 0.00000 0 0 0 +GRID 861 0 0.75000 1.50000 0.00000 0 0 0 +$ Shell element data for family PLATE.000/SEG.00 +CQUAD4 1 1 1 22 23 2 +CQUAD4 2 1 2 23 24 3 +CQUAD4 3 1 3 24 25 4 +CQUAD4 4 1 4 25 26 5 +CQUAD4 5 1 5 26 27 6 +CQUAD4 6 1 6 27 28 7 +CQUAD4 7 1 7 28 29 8 +CQUAD4 8 1 8 29 30 9 +CQUAD4 9 1 9 30 31 10 +CQUAD4 10 1 10 31 32 11 +CQUAD4 11 1 11 32 33 12 +CQUAD4 12 1 12 33 34 13 +CQUAD4 13 1 13 34 35 14 +CQUAD4 14 1 14 35 36 15 +CQUAD4 15 1 15 36 37 16 +CQUAD4 16 1 16 37 38 17 +CQUAD4 17 1 17 38 39 18 +CQUAD4 18 1 18 39 40 19 +CQUAD4 19 1 19 40 41 20 +CQUAD4 20 1 20 41 42 21 +CQUAD4 21 1 22 43 44 23 +CQUAD4 22 1 23 44 45 24 +CQUAD4 23 1 24 45 46 25 +CQUAD4 24 1 25 46 47 26 +CQUAD4 25 1 26 47 48 27 +CQUAD4 26 1 27 48 49 28 +CQUAD4 27 1 28 49 50 29 +CQUAD4 28 1 29 50 51 30 +CQUAD4 29 1 30 51 52 31 +CQUAD4 30 1 31 52 53 32 +CQUAD4 31 1 32 53 54 33 +CQUAD4 32 1 33 54 55 34 +CQUAD4 33 1 34 55 56 35 +CQUAD4 34 1 35 56 57 36 +CQUAD4 35 1 36 57 58 37 +CQUAD4 36 1 37 58 59 38 +CQUAD4 37 1 38 59 60 39 +CQUAD4 38 1 39 60 61 40 +CQUAD4 39 1 40 61 62 41 +CQUAD4 40 1 41 62 63 42 +CQUAD4 41 1 43 64 65 44 +CQUAD4 42 1 44 65 66 45 +CQUAD4 43 1 45 66 67 46 +CQUAD4 44 1 46 67 68 47 +CQUAD4 45 1 47 68 69 48 +CQUAD4 46 1 48 69 70 49 +CQUAD4 47 1 49 70 71 50 +CQUAD4 48 1 50 71 72 51 +CQUAD4 49 1 51 72 73 52 +CQUAD4 50 1 52 73 74 53 +CQUAD4 51 1 53 74 75 54 +CQUAD4 52 1 54 75 76 55 +CQUAD4 53 1 55 76 77 56 +CQUAD4 54 1 56 77 78 57 +CQUAD4 55 1 57 78 79 58 +CQUAD4 56 1 58 79 80 59 +CQUAD4 57 1 59 80 81 60 +CQUAD4 58 1 60 81 82 61 +CQUAD4 59 1 61 82 83 62 +CQUAD4 60 1 62 83 84 63 +CQUAD4 61 1 64 85 86 65 +CQUAD4 62 1 65 86 87 66 +CQUAD4 63 1 66 87 88 67 +CQUAD4 64 1 67 88 89 68 +CQUAD4 65 1 68 89 90 69 +CQUAD4 66 1 69 90 91 70 +CQUAD4 67 1 70 91 92 71 +CQUAD4 68 1 71 92 93 72 +CQUAD4 69 1 72 93 94 73 +CQUAD4 70 1 73 94 95 74 +CQUAD4 71 1 74 95 96 75 +CQUAD4 72 1 75 96 97 76 +CQUAD4 73 1 76 97 98 77 +CQUAD4 74 1 77 98 99 78 +CQUAD4 75 1 78 99 100 79 +CQUAD4 76 1 79 100 101 80 +CQUAD4 77 1 80 101 102 81 +CQUAD4 78 1 81 102 103 82 +CQUAD4 79 1 82 103 104 83 +CQUAD4 80 1 83 104 105 84 +CQUAD4 81 1 85 106 107 86 +CQUAD4 82 1 86 107 108 87 +CQUAD4 83 1 87 108 109 88 +CQUAD4 84 1 88 109 110 89 +CQUAD4 85 1 89 110 111 90 +CQUAD4 86 1 90 111 112 91 +CQUAD4 87 1 91 112 113 92 +CQUAD4 88 1 92 113 114 93 +CQUAD4 89 1 93 114 115 94 +CQUAD4 90 1 94 115 116 95 +CQUAD4 91 1 95 116 117 96 +CQUAD4 92 1 96 117 118 97 +CQUAD4 93 1 97 118 119 98 +CQUAD4 94 1 98 119 120 99 +CQUAD4 95 1 99 120 121 100 +CQUAD4 96 1 100 121 122 101 +CQUAD4 97 1 101 122 123 102 +CQUAD4 98 1 102 123 124 103 +CQUAD4 99 1 103 124 125 104 +CQUAD4 100 1 104 125 126 105 +CQUAD4 101 1 106 127 128 107 +CQUAD4 102 1 107 128 129 108 +CQUAD4 103 1 108 129 130 109 +CQUAD4 104 1 109 130 131 110 +CQUAD4 105 1 110 131 132 111 +CQUAD4 106 1 111 132 133 112 +CQUAD4 107 1 112 133 134 113 +CQUAD4 108 1 113 134 135 114 +CQUAD4 109 1 114 135 136 115 +CQUAD4 110 1 115 136 137 116 +CQUAD4 111 1 116 137 138 117 +CQUAD4 112 1 117 138 139 118 +CQUAD4 113 1 118 139 140 119 +CQUAD4 114 1 119 140 141 120 +CQUAD4 115 1 120 141 142 121 +CQUAD4 116 1 121 142 143 122 +CQUAD4 117 1 122 143 144 123 +CQUAD4 118 1 123 144 145 124 +CQUAD4 119 1 124 145 146 125 +CQUAD4 120 1 125 146 147 126 +CQUAD4 121 1 127 148 149 128 +CQUAD4 122 1 128 149 150 129 +CQUAD4 123 1 129 150 151 130 +CQUAD4 124 1 130 151 152 131 +CQUAD4 125 1 131 152 153 132 +CQUAD4 126 1 132 153 154 133 +CQUAD4 127 1 133 154 155 134 +CQUAD4 128 1 134 155 156 135 +CQUAD4 129 1 135 156 157 136 +CQUAD4 130 1 136 157 158 137 +CQUAD4 131 1 137 158 159 138 +CQUAD4 132 1 138 159 160 139 +CQUAD4 133 1 139 160 161 140 +CQUAD4 134 1 140 161 162 141 +CQUAD4 135 1 141 162 163 142 +CQUAD4 136 1 142 163 164 143 +CQUAD4 137 1 143 164 165 144 +CQUAD4 138 1 144 165 166 145 +CQUAD4 139 1 145 166 167 146 +CQUAD4 140 1 146 167 168 147 +CQUAD4 141 1 148 169 170 149 +CQUAD4 142 1 149 170 171 150 +CQUAD4 143 1 150 171 172 151 +CQUAD4 144 1 151 172 173 152 +CQUAD4 145 1 152 173 174 153 +CQUAD4 146 1 153 174 175 154 +CQUAD4 147 1 154 175 176 155 +CQUAD4 148 1 155 176 177 156 +CQUAD4 149 1 156 177 178 157 +CQUAD4 150 1 157 178 179 158 +CQUAD4 151 1 158 179 180 159 +CQUAD4 152 1 159 180 181 160 +CQUAD4 153 1 160 181 182 161 +CQUAD4 154 1 161 182 183 162 +CQUAD4 155 1 162 183 184 163 +CQUAD4 156 1 163 184 185 164 +CQUAD4 157 1 164 185 186 165 +CQUAD4 158 1 165 186 187 166 +CQUAD4 159 1 166 187 188 167 +CQUAD4 160 1 167 188 189 168 +CQUAD4 161 1 169 190 191 170 +CQUAD4 162 1 170 191 192 171 +CQUAD4 163 1 171 192 193 172 +CQUAD4 164 1 172 193 194 173 +CQUAD4 165 1 173 194 195 174 +CQUAD4 166 1 174 195 196 175 +CQUAD4 167 1 175 196 197 176 +CQUAD4 168 1 176 197 198 177 +CQUAD4 169 1 177 198 199 178 +CQUAD4 170 1 178 199 200 179 +CQUAD4 171 1 179 200 201 180 +CQUAD4 172 1 180 201 202 181 +CQUAD4 173 1 181 202 203 182 +CQUAD4 174 1 182 203 204 183 +CQUAD4 175 1 183 204 205 184 +CQUAD4 176 1 184 205 206 185 +CQUAD4 177 1 185 206 207 186 +CQUAD4 178 1 186 207 208 187 +CQUAD4 179 1 187 208 209 188 +CQUAD4 180 1 188 209 210 189 +CQUAD4 181 1 190 211 212 191 +CQUAD4 182 1 191 212 213 192 +CQUAD4 183 1 192 213 214 193 +CQUAD4 184 1 193 214 215 194 +CQUAD4 185 1 194 215 216 195 +CQUAD4 186 1 195 216 217 196 +CQUAD4 187 1 196 217 218 197 +CQUAD4 188 1 197 218 219 198 +CQUAD4 189 1 198 219 220 199 +CQUAD4 190 1 199 220 221 200 +CQUAD4 191 1 200 221 222 201 +CQUAD4 192 1 201 222 223 202 +CQUAD4 193 1 202 223 224 203 +CQUAD4 194 1 203 224 225 204 +CQUAD4 195 1 204 225 226 205 +CQUAD4 196 1 205 226 227 206 +CQUAD4 197 1 206 227 228 207 +CQUAD4 198 1 207 228 229 208 +CQUAD4 199 1 208 229 230 209 +CQUAD4 200 1 209 230 231 210 +CQUAD4 201 1 211 232 233 212 +CQUAD4 202 1 212 233 234 213 +CQUAD4 203 1 213 234 235 214 +CQUAD4 204 1 214 235 236 215 +CQUAD4 205 1 215 236 237 216 +CQUAD4 206 1 216 237 238 217 +CQUAD4 207 1 217 238 239 218 +CQUAD4 208 1 218 239 240 219 +CQUAD4 209 1 219 240 241 220 +CQUAD4 210 1 220 241 242 221 +CQUAD4 211 1 221 242 243 222 +CQUAD4 212 1 222 243 244 223 +CQUAD4 213 1 223 244 245 224 +CQUAD4 214 1 224 245 246 225 +CQUAD4 215 1 225 246 247 226 +CQUAD4 216 1 226 247 248 227 +CQUAD4 217 1 227 248 249 228 +CQUAD4 218 1 228 249 250 229 +CQUAD4 219 1 229 250 251 230 +CQUAD4 220 1 230 251 252 231 +CQUAD4 221 1 232 253 254 233 +CQUAD4 222 1 233 254 255 234 +CQUAD4 223 1 234 255 256 235 +CQUAD4 224 1 235 256 257 236 +CQUAD4 225 1 236 257 258 237 +CQUAD4 226 1 237 258 259 238 +CQUAD4 227 1 238 259 260 239 +CQUAD4 228 1 239 260 261 240 +CQUAD4 229 1 240 261 262 241 +CQUAD4 230 1 241 262 263 242 +CQUAD4 231 1 242 263 264 243 +CQUAD4 232 1 243 264 265 244 +CQUAD4 233 1 244 265 266 245 +CQUAD4 234 1 245 266 267 246 +CQUAD4 235 1 246 267 268 247 +CQUAD4 236 1 247 268 269 248 +CQUAD4 237 1 248 269 270 249 +CQUAD4 238 1 249 270 271 250 +CQUAD4 239 1 250 271 272 251 +CQUAD4 240 1 251 272 273 252 +CQUAD4 241 1 253 274 275 254 +CQUAD4 242 1 254 275 276 255 +CQUAD4 243 1 255 276 277 256 +CQUAD4 244 1 256 277 278 257 +CQUAD4 245 1 257 278 279 258 +CQUAD4 246 1 258 279 280 259 +CQUAD4 247 1 259 280 281 260 +CQUAD4 248 1 260 281 282 261 +CQUAD4 249 1 261 282 283 262 +CQUAD4 250 1 262 283 284 263 +CQUAD4 251 1 263 284 285 264 +CQUAD4 252 1 264 285 286 265 +CQUAD4 253 1 265 286 287 266 +CQUAD4 254 1 266 287 288 267 +CQUAD4 255 1 267 288 289 268 +CQUAD4 256 1 268 289 290 269 +CQUAD4 257 1 269 290 291 270 +CQUAD4 258 1 270 291 292 271 +CQUAD4 259 1 271 292 293 272 +CQUAD4 260 1 272 293 294 273 +CQUAD4 261 1 274 295 296 275 +CQUAD4 262 1 275 296 297 276 +CQUAD4 263 1 276 297 298 277 +CQUAD4 264 1 277 298 299 278 +CQUAD4 265 1 278 299 300 279 +CQUAD4 266 1 279 300 301 280 +CQUAD4 267 1 280 301 302 281 +CQUAD4 268 1 281 302 303 282 +CQUAD4 269 1 282 303 304 283 +CQUAD4 270 1 283 304 305 284 +CQUAD4 271 1 284 305 306 285 +CQUAD4 272 1 285 306 307 286 +CQUAD4 273 1 286 307 308 287 +CQUAD4 274 1 287 308 309 288 +CQUAD4 275 1 288 309 310 289 +CQUAD4 276 1 289 310 311 290 +CQUAD4 277 1 290 311 312 291 +CQUAD4 278 1 291 312 313 292 +CQUAD4 279 1 292 313 314 293 +CQUAD4 280 1 293 314 315 294 +CQUAD4 281 1 295 316 317 296 +CQUAD4 282 1 296 317 318 297 +CQUAD4 283 1 297 318 319 298 +CQUAD4 284 1 298 319 320 299 +CQUAD4 285 1 299 320 321 300 +CQUAD4 286 1 300 321 322 301 +CQUAD4 287 1 301 322 323 302 +CQUAD4 288 1 302 323 324 303 +CQUAD4 289 1 303 324 325 304 +CQUAD4 290 1 304 325 326 305 +CQUAD4 291 1 305 326 327 306 +CQUAD4 292 1 306 327 328 307 +CQUAD4 293 1 307 328 329 308 +CQUAD4 294 1 308 329 330 309 +CQUAD4 295 1 309 330 331 310 +CQUAD4 296 1 310 331 332 311 +CQUAD4 297 1 311 332 333 312 +CQUAD4 298 1 312 333 334 313 +CQUAD4 299 1 313 334 335 314 +CQUAD4 300 1 314 335 336 315 +CQUAD4 301 1 316 337 338 317 +CQUAD4 302 1 317 338 339 318 +CQUAD4 303 1 318 339 340 319 +CQUAD4 304 1 319 340 341 320 +CQUAD4 305 1 320 341 342 321 +CQUAD4 306 1 321 342 343 322 +CQUAD4 307 1 322 343 344 323 +CQUAD4 308 1 323 344 345 324 +CQUAD4 309 1 324 345 346 325 +CQUAD4 310 1 325 346 347 326 +CQUAD4 311 1 326 347 348 327 +CQUAD4 312 1 327 348 349 328 +CQUAD4 313 1 328 349 350 329 +CQUAD4 314 1 329 350 351 330 +CQUAD4 315 1 330 351 352 331 +CQUAD4 316 1 331 352 353 332 +CQUAD4 317 1 332 353 354 333 +CQUAD4 318 1 333 354 355 334 +CQUAD4 319 1 334 355 356 335 +CQUAD4 320 1 335 356 357 336 +CQUAD4 321 1 337 358 359 338 +CQUAD4 322 1 338 359 360 339 +CQUAD4 323 1 339 360 361 340 +CQUAD4 324 1 340 361 362 341 +CQUAD4 325 1 341 362 363 342 +CQUAD4 326 1 342 363 364 343 +CQUAD4 327 1 343 364 365 344 +CQUAD4 328 1 344 365 366 345 +CQUAD4 329 1 345 366 367 346 +CQUAD4 330 1 346 367 368 347 +CQUAD4 331 1 347 368 369 348 +CQUAD4 332 1 348 369 370 349 +CQUAD4 333 1 349 370 371 350 +CQUAD4 334 1 350 371 372 351 +CQUAD4 335 1 351 372 373 352 +CQUAD4 336 1 352 373 374 353 +CQUAD4 337 1 353 374 375 354 +CQUAD4 338 1 354 375 376 355 +CQUAD4 339 1 355 376 377 356 +CQUAD4 340 1 356 377 378 357 +CQUAD4 341 1 358 379 380 359 +CQUAD4 342 1 359 380 381 360 +CQUAD4 343 1 360 381 382 361 +CQUAD4 344 1 361 382 383 362 +CQUAD4 345 1 362 383 384 363 +CQUAD4 346 1 363 384 385 364 +CQUAD4 347 1 364 385 386 365 +CQUAD4 348 1 365 386 387 366 +CQUAD4 349 1 366 387 388 367 +CQUAD4 350 1 367 388 389 368 +CQUAD4 351 1 368 389 390 369 +CQUAD4 352 1 369 390 391 370 +CQUAD4 353 1 370 391 392 371 +CQUAD4 354 1 371 392 393 372 +CQUAD4 355 1 372 393 394 373 +CQUAD4 356 1 373 394 395 374 +CQUAD4 357 1 374 395 396 375 +CQUAD4 358 1 375 396 397 376 +CQUAD4 359 1 376 397 398 377 +CQUAD4 360 1 377 398 399 378 +CQUAD4 361 1 379 400 401 380 +CQUAD4 362 1 380 401 402 381 +CQUAD4 363 1 381 402 403 382 +CQUAD4 364 1 382 403 404 383 +CQUAD4 365 1 383 404 405 384 +CQUAD4 366 1 384 405 406 385 +CQUAD4 367 1 385 406 407 386 +CQUAD4 368 1 386 407 408 387 +CQUAD4 369 1 387 408 409 388 +CQUAD4 370 1 388 409 410 389 +CQUAD4 371 1 389 410 411 390 +CQUAD4 372 1 390 411 412 391 +CQUAD4 373 1 391 412 413 392 +CQUAD4 374 1 392 413 414 393 +CQUAD4 375 1 393 414 415 394 +CQUAD4 376 1 394 415 416 395 +CQUAD4 377 1 395 416 417 396 +CQUAD4 378 1 396 417 418 397 +CQUAD4 379 1 397 418 419 398 +CQUAD4 380 1 398 419 420 399 +CQUAD4 381 1 400 421 422 401 +CQUAD4 382 1 401 422 423 402 +CQUAD4 383 1 402 423 424 403 +CQUAD4 384 1 403 424 425 404 +CQUAD4 385 1 404 425 426 405 +CQUAD4 386 1 405 426 427 406 +CQUAD4 387 1 406 427 428 407 +CQUAD4 388 1 407 428 429 408 +CQUAD4 389 1 408 429 430 409 +CQUAD4 390 1 409 430 431 410 +CQUAD4 391 1 410 431 432 411 +CQUAD4 392 1 411 432 433 412 +CQUAD4 393 1 412 433 434 413 +CQUAD4 394 1 413 434 435 414 +CQUAD4 395 1 414 435 436 415 +CQUAD4 396 1 415 436 437 416 +CQUAD4 397 1 416 437 438 417 +CQUAD4 398 1 417 438 439 418 +CQUAD4 399 1 418 439 440 419 +CQUAD4 400 1 419 440 441 420 +CQUAD4 401 1 421 442 443 422 +CQUAD4 402 1 422 443 444 423 +CQUAD4 403 1 423 444 445 424 +CQUAD4 404 1 424 445 446 425 +CQUAD4 405 1 425 446 447 426 +CQUAD4 406 1 426 447 448 427 +CQUAD4 407 1 427 448 449 428 +CQUAD4 408 1 428 449 450 429 +CQUAD4 409 1 429 450 451 430 +CQUAD4 410 1 430 451 452 431 +CQUAD4 411 1 431 452 453 432 +CQUAD4 412 1 432 453 454 433 +CQUAD4 413 1 433 454 455 434 +CQUAD4 414 1 434 455 456 435 +CQUAD4 415 1 435 456 457 436 +CQUAD4 416 1 436 457 458 437 +CQUAD4 417 1 437 458 459 438 +CQUAD4 418 1 438 459 460 439 +CQUAD4 419 1 439 460 461 440 +CQUAD4 420 1 440 461 462 441 +CQUAD4 421 1 442 463 464 443 +CQUAD4 422 1 443 464 465 444 +CQUAD4 423 1 444 465 466 445 +CQUAD4 424 1 445 466 467 446 +CQUAD4 425 1 446 467 468 447 +CQUAD4 426 1 447 468 469 448 +CQUAD4 427 1 448 469 470 449 +CQUAD4 428 1 449 470 471 450 +CQUAD4 429 1 450 471 472 451 +CQUAD4 430 1 451 472 473 452 +CQUAD4 431 1 452 473 474 453 +CQUAD4 432 1 453 474 475 454 +CQUAD4 433 1 454 475 476 455 +CQUAD4 434 1 455 476 477 456 +CQUAD4 435 1 456 477 478 457 +CQUAD4 436 1 457 478 479 458 +CQUAD4 437 1 458 479 480 459 +CQUAD4 438 1 459 480 481 460 +CQUAD4 439 1 460 481 482 461 +CQUAD4 440 1 461 482 483 462 +CQUAD4 441 1 463 484 485 464 +CQUAD4 442 1 464 485 486 465 +CQUAD4 443 1 465 486 487 466 +CQUAD4 444 1 466 487 488 467 +CQUAD4 445 1 467 488 489 468 +CQUAD4 446 1 468 489 490 469 +CQUAD4 447 1 469 490 491 470 +CQUAD4 448 1 470 491 492 471 +CQUAD4 449 1 471 492 493 472 +CQUAD4 450 1 472 493 494 473 +CQUAD4 451 1 473 494 495 474 +CQUAD4 452 1 474 495 496 475 +CQUAD4 453 1 475 496 497 476 +CQUAD4 454 1 476 497 498 477 +CQUAD4 455 1 477 498 499 478 +CQUAD4 456 1 478 499 500 479 +CQUAD4 457 1 479 500 501 480 +CQUAD4 458 1 480 501 502 481 +CQUAD4 459 1 481 502 503 482 +CQUAD4 460 1 482 503 504 483 +CQUAD4 461 1 484 505 506 485 +CQUAD4 462 1 485 506 507 486 +CQUAD4 463 1 486 507 508 487 +CQUAD4 464 1 487 508 509 488 +CQUAD4 465 1 488 509 510 489 +CQUAD4 466 1 489 510 511 490 +CQUAD4 467 1 490 511 512 491 +CQUAD4 468 1 491 512 513 492 +CQUAD4 469 1 492 513 514 493 +CQUAD4 470 1 493 514 515 494 +CQUAD4 471 1 494 515 516 495 +CQUAD4 472 1 495 516 517 496 +CQUAD4 473 1 496 517 518 497 +CQUAD4 474 1 497 518 519 498 +CQUAD4 475 1 498 519 520 499 +CQUAD4 476 1 499 520 521 500 +CQUAD4 477 1 500 521 522 501 +CQUAD4 478 1 501 522 523 502 +CQUAD4 479 1 502 523 524 503 +CQUAD4 480 1 503 524 525 504 +CQUAD4 481 1 505 526 527 506 +CQUAD4 482 1 506 527 528 507 +CQUAD4 483 1 507 528 529 508 +CQUAD4 484 1 508 529 530 509 +CQUAD4 485 1 509 530 531 510 +CQUAD4 486 1 510 531 532 511 +CQUAD4 487 1 511 532 533 512 +CQUAD4 488 1 512 533 534 513 +CQUAD4 489 1 513 534 535 514 +CQUAD4 490 1 514 535 536 515 +CQUAD4 491 1 515 536 537 516 +CQUAD4 492 1 516 537 538 517 +CQUAD4 493 1 517 538 539 518 +CQUAD4 494 1 518 539 540 519 +CQUAD4 495 1 519 540 541 520 +CQUAD4 496 1 520 541 542 521 +CQUAD4 497 1 521 542 543 522 +CQUAD4 498 1 522 543 544 523 +CQUAD4 499 1 523 544 545 524 +CQUAD4 500 1 524 545 546 525 +CQUAD4 501 1 526 547 548 527 +CQUAD4 502 1 527 548 549 528 +CQUAD4 503 1 528 549 550 529 +CQUAD4 504 1 529 550 551 530 +CQUAD4 505 1 530 551 552 531 +CQUAD4 506 1 531 552 553 532 +CQUAD4 507 1 532 553 554 533 +CQUAD4 508 1 533 554 555 534 +CQUAD4 509 1 534 555 556 535 +CQUAD4 510 1 535 556 557 536 +CQUAD4 511 1 536 557 558 537 +CQUAD4 512 1 537 558 559 538 +CQUAD4 513 1 538 559 560 539 +CQUAD4 514 1 539 560 561 540 +CQUAD4 515 1 540 561 562 541 +CQUAD4 516 1 541 562 563 542 +CQUAD4 517 1 542 563 564 543 +CQUAD4 518 1 543 564 565 544 +CQUAD4 519 1 544 565 566 545 +CQUAD4 520 1 545 566 567 546 +CQUAD4 521 1 547 568 569 548 +CQUAD4 522 1 548 569 570 549 +CQUAD4 523 1 549 570 571 550 +CQUAD4 524 1 550 571 572 551 +CQUAD4 525 1 551 572 573 552 +CQUAD4 526 1 552 573 574 553 +CQUAD4 527 1 553 574 575 554 +CQUAD4 528 1 554 575 576 555 +CQUAD4 529 1 555 576 577 556 +CQUAD4 530 1 556 577 578 557 +CQUAD4 531 1 557 578 579 558 +CQUAD4 532 1 558 579 580 559 +CQUAD4 533 1 559 580 581 560 +CQUAD4 534 1 560 581 582 561 +CQUAD4 535 1 561 582 583 562 +CQUAD4 536 1 562 583 584 563 +CQUAD4 537 1 563 584 585 564 +CQUAD4 538 1 564 585 586 565 +CQUAD4 539 1 565 586 587 566 +CQUAD4 540 1 566 587 588 567 +CQUAD4 541 1 568 589 590 569 +CQUAD4 542 1 569 590 591 570 +CQUAD4 543 1 570 591 592 571 +CQUAD4 544 1 571 592 593 572 +CQUAD4 545 1 572 593 594 573 +CQUAD4 546 1 573 594 595 574 +CQUAD4 547 1 574 595 596 575 +CQUAD4 548 1 575 596 597 576 +CQUAD4 549 1 576 597 598 577 +CQUAD4 550 1 577 598 599 578 +CQUAD4 551 1 578 599 600 579 +CQUAD4 552 1 579 600 601 580 +CQUAD4 553 1 580 601 602 581 +CQUAD4 554 1 581 602 603 582 +CQUAD4 555 1 582 603 604 583 +CQUAD4 556 1 583 604 605 584 +CQUAD4 557 1 584 605 606 585 +CQUAD4 558 1 585 606 607 586 +CQUAD4 559 1 586 607 608 587 +CQUAD4 560 1 587 608 609 588 +CQUAD4 561 1 589 610 611 590 +CQUAD4 562 1 590 611 612 591 +CQUAD4 563 1 591 612 613 592 +CQUAD4 564 1 592 613 614 593 +CQUAD4 565 1 593 614 615 594 +CQUAD4 566 1 594 615 616 595 +CQUAD4 567 1 595 616 617 596 +CQUAD4 568 1 596 617 618 597 +CQUAD4 569 1 597 618 619 598 +CQUAD4 570 1 598 619 620 599 +CQUAD4 571 1 599 620 621 600 +CQUAD4 572 1 600 621 622 601 +CQUAD4 573 1 601 622 623 602 +CQUAD4 574 1 602 623 624 603 +CQUAD4 575 1 603 624 625 604 +CQUAD4 576 1 604 625 626 605 +CQUAD4 577 1 605 626 627 606 +CQUAD4 578 1 606 627 628 607 +CQUAD4 579 1 607 628 629 608 +CQUAD4 580 1 608 629 630 609 +CQUAD4 581 1 610 631 632 611 +CQUAD4 582 1 611 632 633 612 +CQUAD4 583 1 612 633 634 613 +CQUAD4 584 1 613 634 635 614 +CQUAD4 585 1 614 635 636 615 +CQUAD4 586 1 615 636 637 616 +CQUAD4 587 1 616 637 638 617 +CQUAD4 588 1 617 638 639 618 +CQUAD4 589 1 618 639 640 619 +CQUAD4 590 1 619 640 641 620 +CQUAD4 591 1 620 641 642 621 +CQUAD4 592 1 621 642 643 622 +CQUAD4 593 1 622 643 644 623 +CQUAD4 594 1 623 644 645 624 +CQUAD4 595 1 624 645 646 625 +CQUAD4 596 1 625 646 647 626 +CQUAD4 597 1 626 647 648 627 +CQUAD4 598 1 627 648 649 628 +CQUAD4 599 1 628 649 650 629 +CQUAD4 600 1 629 650 651 630 +CQUAD4 601 1 631 652 653 632 +CQUAD4 602 1 632 653 654 633 +CQUAD4 603 1 633 654 655 634 +CQUAD4 604 1 634 655 656 635 +CQUAD4 605 1 635 656 657 636 +CQUAD4 606 1 636 657 658 637 +CQUAD4 607 1 637 658 659 638 +CQUAD4 608 1 638 659 660 639 +CQUAD4 609 1 639 660 661 640 +CQUAD4 610 1 640 661 662 641 +CQUAD4 611 1 641 662 663 642 +CQUAD4 612 1 642 663 664 643 +CQUAD4 613 1 643 664 665 644 +CQUAD4 614 1 644 665 666 645 +CQUAD4 615 1 645 666 667 646 +CQUAD4 616 1 646 667 668 647 +CQUAD4 617 1 647 668 669 648 +CQUAD4 618 1 648 669 670 649 +CQUAD4 619 1 649 670 671 650 +CQUAD4 620 1 650 671 672 651 +CQUAD4 621 1 652 673 674 653 +CQUAD4 622 1 653 674 675 654 +CQUAD4 623 1 654 675 676 655 +CQUAD4 624 1 655 676 677 656 +CQUAD4 625 1 656 677 678 657 +CQUAD4 626 1 657 678 679 658 +CQUAD4 627 1 658 679 680 659 +CQUAD4 628 1 659 680 681 660 +CQUAD4 629 1 660 681 682 661 +CQUAD4 630 1 661 682 683 662 +CQUAD4 631 1 662 683 684 663 +CQUAD4 632 1 663 684 685 664 +CQUAD4 633 1 664 685 686 665 +CQUAD4 634 1 665 686 687 666 +CQUAD4 635 1 666 687 688 667 +CQUAD4 636 1 667 688 689 668 +CQUAD4 637 1 668 689 690 669 +CQUAD4 638 1 669 690 691 670 +CQUAD4 639 1 670 691 692 671 +CQUAD4 640 1 671 692 693 672 +CQUAD4 641 1 673 694 695 674 +CQUAD4 642 1 674 695 696 675 +CQUAD4 643 1 675 696 697 676 +CQUAD4 644 1 676 697 698 677 +CQUAD4 645 1 677 698 699 678 +CQUAD4 646 1 678 699 700 679 +CQUAD4 647 1 679 700 701 680 +CQUAD4 648 1 680 701 702 681 +CQUAD4 649 1 681 702 703 682 +CQUAD4 650 1 682 703 704 683 +CQUAD4 651 1 683 704 705 684 +CQUAD4 652 1 684 705 706 685 +CQUAD4 653 1 685 706 707 686 +CQUAD4 654 1 686 707 708 687 +CQUAD4 655 1 687 708 709 688 +CQUAD4 656 1 688 709 710 689 +CQUAD4 657 1 689 710 711 690 +CQUAD4 658 1 690 711 712 691 +CQUAD4 659 1 691 712 713 692 +CQUAD4 660 1 692 713 714 693 +CQUAD4 661 1 694 715 716 695 +CQUAD4 662 1 695 716 717 696 +CQUAD4 663 1 696 717 718 697 +CQUAD4 664 1 697 718 719 698 +CQUAD4 665 1 698 719 720 699 +CQUAD4 666 1 699 720 721 700 +CQUAD4 667 1 700 721 722 701 +CQUAD4 668 1 701 722 723 702 +CQUAD4 669 1 702 723 724 703 +CQUAD4 670 1 703 724 725 704 +CQUAD4 671 1 704 725 726 705 +CQUAD4 672 1 705 726 727 706 +CQUAD4 673 1 706 727 728 707 +CQUAD4 674 1 707 728 729 708 +CQUAD4 675 1 708 729 730 709 +CQUAD4 676 1 709 730 731 710 +CQUAD4 677 1 710 731 732 711 +CQUAD4 678 1 711 732 733 712 +CQUAD4 679 1 712 733 734 713 +CQUAD4 680 1 713 734 735 714 +CQUAD4 681 1 715 736 737 716 +CQUAD4 682 1 716 737 738 717 +CQUAD4 683 1 717 738 739 718 +CQUAD4 684 1 718 739 740 719 +CQUAD4 685 1 719 740 741 720 +CQUAD4 686 1 720 741 742 721 +CQUAD4 687 1 721 742 743 722 +CQUAD4 688 1 722 743 744 723 +CQUAD4 689 1 723 744 745 724 +CQUAD4 690 1 724 745 746 725 +CQUAD4 691 1 725 746 747 726 +CQUAD4 692 1 726 747 748 727 +CQUAD4 693 1 727 748 749 728 +CQUAD4 694 1 728 749 750 729 +CQUAD4 695 1 729 750 751 730 +CQUAD4 696 1 730 751 752 731 +CQUAD4 697 1 731 752 753 732 +CQUAD4 698 1 732 753 754 733 +CQUAD4 699 1 733 754 755 734 +CQUAD4 700 1 734 755 756 735 +CQUAD4 701 1 736 757 758 737 +CQUAD4 702 1 737 758 759 738 +CQUAD4 703 1 738 759 760 739 +CQUAD4 704 1 739 760 761 740 +CQUAD4 705 1 740 761 762 741 +CQUAD4 706 1 741 762 763 742 +CQUAD4 707 1 742 763 764 743 +CQUAD4 708 1 743 764 765 744 +CQUAD4 709 1 744 765 766 745 +CQUAD4 710 1 745 766 767 746 +CQUAD4 711 1 746 767 768 747 +CQUAD4 712 1 747 768 769 748 +CQUAD4 713 1 748 769 770 749 +CQUAD4 714 1 749 770 771 750 +CQUAD4 715 1 750 771 772 751 +CQUAD4 716 1 751 772 773 752 +CQUAD4 717 1 752 773 774 753 +CQUAD4 718 1 753 774 775 754 +CQUAD4 719 1 754 775 776 755 +CQUAD4 720 1 755 776 777 756 +CQUAD4 721 1 757 778 779 758 +CQUAD4 722 1 758 779 780 759 +CQUAD4 723 1 759 780 781 760 +CQUAD4 724 1 760 781 782 761 +CQUAD4 725 1 761 782 783 762 +CQUAD4 726 1 762 783 784 763 +CQUAD4 727 1 763 784 785 764 +CQUAD4 728 1 764 785 786 765 +CQUAD4 729 1 765 786 787 766 +CQUAD4 730 1 766 787 788 767 +CQUAD4 731 1 767 788 789 768 +CQUAD4 732 1 768 789 790 769 +CQUAD4 733 1 769 790 791 770 +CQUAD4 734 1 770 791 792 771 +CQUAD4 735 1 771 792 793 772 +CQUAD4 736 1 772 793 794 773 +CQUAD4 737 1 773 794 795 774 +CQUAD4 738 1 774 795 796 775 +CQUAD4 739 1 775 796 797 776 +CQUAD4 740 1 776 797 798 777 +CQUAD4 741 1 778 799 800 779 +CQUAD4 742 1 779 800 801 780 +CQUAD4 743 1 780 801 802 781 +CQUAD4 744 1 781 802 803 782 +CQUAD4 745 1 782 803 804 783 +CQUAD4 746 1 783 804 805 784 +CQUAD4 747 1 784 805 806 785 +CQUAD4 748 1 785 806 807 786 +CQUAD4 749 1 786 807 808 787 +CQUAD4 750 1 787 808 809 788 +CQUAD4 751 1 788 809 810 789 +CQUAD4 752 1 789 810 811 790 +CQUAD4 753 1 790 811 812 791 +CQUAD4 754 1 791 812 813 792 +CQUAD4 755 1 792 813 814 793 +CQUAD4 756 1 793 814 815 794 +CQUAD4 757 1 794 815 816 795 +CQUAD4 758 1 795 816 817 796 +CQUAD4 759 1 796 817 818 797 +CQUAD4 760 1 797 818 819 798 +CQUAD4 761 1 799 820 821 800 +CQUAD4 762 1 800 821 822 801 +CQUAD4 763 1 801 822 823 802 +CQUAD4 764 1 802 823 824 803 +CQUAD4 765 1 803 824 825 804 +CQUAD4 766 1 804 825 826 805 +CQUAD4 767 1 805 826 827 806 +CQUAD4 768 1 806 827 828 807 +CQUAD4 769 1 807 828 829 808 +CQUAD4 770 1 808 829 830 809 +CQUAD4 771 1 809 830 831 810 +CQUAD4 772 1 810 831 832 811 +CQUAD4 773 1 811 832 833 812 +CQUAD4 774 1 812 833 834 813 +CQUAD4 775 1 813 834 835 814 +CQUAD4 776 1 814 835 836 815 +CQUAD4 777 1 815 836 837 816 +CQUAD4 778 1 816 837 838 817 +CQUAD4 779 1 817 838 839 818 +CQUAD4 780 1 818 839 840 819 +CQUAD4 781 1 820 841 842 821 +CQUAD4 782 1 821 842 843 822 +CQUAD4 783 1 822 843 844 823 +CQUAD4 784 1 823 844 845 824 +CQUAD4 785 1 824 845 846 825 +CQUAD4 786 1 825 846 847 826 +CQUAD4 787 1 826 847 848 827 +CQUAD4 788 1 827 848 849 828 +CQUAD4 789 1 828 849 850 829 +CQUAD4 790 1 829 850 851 830 +CQUAD4 791 1 830 851 852 831 +CQUAD4 792 1 831 852 853 832 +CQUAD4 793 1 832 853 854 833 +CQUAD4 794 1 833 854 855 834 +CQUAD4 795 1 834 855 856 835 +CQUAD4 796 1 835 856 857 836 +CQUAD4 797 1 836 857 858 837 +CQUAD4 798 1 837 858 859 838 +CQUAD4 799 1 838 859 860 839 +CQUAD4 800 1 839 860 861 840 +SPC 1 1123 0.00000 +SPC 1 23 0.00000 +SPC 1 33 0.00000 +SPC 1 43 0.00000 +SPC 1 53 0.00000 +SPC 1 63 0.00000 +SPC 1 73 0.00000 +SPC 1 83 0.00000 +SPC 1 93 0.00000 +SPC 1 103 0.00000 +SPC 1 113 0.00000 +SPC 1 123 0.00000 +SPC 1 133 0.00000 +SPC 1 143 0.00000 +SPC 1 153 0.00000 +SPC 1 163 0.00000 +SPC 1 173 0.00000 +SPC 1 183 0.00000 +SPC 1 193 0.00000 +SPC 1 203 0.00000 +SPC 1 2123 0.00000 +SPC 1 223 0.00000 +SPC 1 423 0.00000 +SPC 1 433 0.00000 +SPC 1 633 0.00000 +SPC 1 643 0.00000 +SPC 1 843 0.00000 +SPC 1 853 0.00000 +SPC 1 1053 0.00000 +SPC 1 1063 0.00000 +SPC 1 1263 0.00000 +SPC 1 1273 0.00000 +SPC 1 1473 0.00000 +SPC 1 1483 0.00000 +SPC 1 1683 0.00000 +SPC 1 1693 0.00000 +SPC 1 1893 0.00000 +SPC 1 1903 0.00000 +SPC 1 2103 0.00000 +SPC 1 2113 0.00000 +SPC 1 2313 0.00000 +SPC 1 2323 0.00000 +SPC 1 2523 0.00000 +SPC 1 2533 0.00000 +SPC 1 2733 0.00000 +SPC 1 2743 0.00000 +SPC 1 2943 0.00000 +SPC 1 2953 0.00000 +SPC 1 3153 0.00000 +SPC 1 3163 0.00000 +SPC 1 3363 0.00000 +SPC 1 3373 0.00000 +SPC 1 3573 0.00000 +SPC 1 3583 0.00000 +SPC 1 3783 0.00000 +SPC 1 3793 0.00000 +SPC 1 3993 0.00000 +SPC 1 4003 0.00000 +SPC 1 4203 0.00000 +SPC 1 4213 0.00000 +SPC 1 4413 0.00000 +SPC 1 4423 0.00000 +SPC 1 4623 0.00000 +SPC 1 4633 0.00000 +SPC 1 4833 0.00000 +SPC 1 4843 0.00000 +SPC 1 5043 0.00000 +SPC 1 5053 0.00000 +SPC 1 5253 0.00000 +SPC 1 5263 0.00000 +SPC 1 5463 0.00000 +SPC 1 5473 0.00000 +SPC 1 5673 0.00000 +SPC 1 5683 0.00000 +SPC 1 5883 0.00000 +SPC 1 5893 0.00000 +SPC 1 6093 0.00000 +SPC 1 6103 0.00000 +SPC 1 6303 0.00000 +SPC 1 6313 0.00000 +SPC 1 6513 0.00000 +SPC 1 6523 0.00000 +SPC 1 6723 0.00000 +SPC 1 6733 0.00000 +SPC 1 6933 0.00000 +SPC 1 6943 0.00000 +SPC 1 7143 0.00000 +SPC 1 7153 0.00000 +SPC 1 7353 0.00000 +SPC 1 7363 0.00000 +SPC 1 7563 0.00000 +SPC 1 7573 0.00000 +SPC 1 7773 0.00000 +SPC 1 7783 0.00000 +SPC 1 7983 0.00000 +SPC 1 7993 0.00000 +SPC 1 8193 0.00000 +SPC 1 8203 0.00000 +SPC 1 8403 0.00000 +SPC 1 8413 0.00000 +SPC 1 8423 0.00000 +SPC 1 8433 0.00000 +SPC 1 8443 0.00000 +SPC 1 8453 0.00000 +SPC 1 8463 0.00000 +SPC 1 8473 0.00000 +SPC 1 8483 0.00000 +SPC 1 8493 0.00000 +SPC 1 8503 0.00000 +SPC 1 8513 0.00000 +SPC 1 8523 0.00000 +SPC 1 8533 0.00000 +SPC 1 8543 0.00000 +SPC 1 8553 0.00000 +SPC 1 8563 0.00000 +SPC 1 8573 0.00000 +SPC 1 8583 0.00000 +SPC 1 8593 0.00000 +SPC 1 8603 0.00000 +SPC 1 8613 0.00000 +ENDDATA diff --git a/src/constitutive/TACSBladeStiffenedShellConstitutive.cpp b/src/constitutive/TACSBladeStiffenedShellConstitutive.cpp index 7825609e8..556f06327 100644 --- a/src/constitutive/TACSBladeStiffenedShellConstitutive.cpp +++ b/src/constitutive/TACSBladeStiffenedShellConstitutive.cpp @@ -21,7 +21,12 @@ bladeFSDT model from previous versions of TACS developed by Graeme Kennedy. #include "TACSMaterialProperties.h" #include "TACSShellConstitutive.h" -const char* TACSBladeStiffenedShellConstitutive::constName = +// Explicit definition of static constexpr member, for some reason if this is +// not included, TACS will throw a linker error complaining that +// DUMMY_FAIL_VALUE is an undefined symbol when compiled in complex mode. +constexpr TacsScalar TACSBladeStiffenedShellConstitutive::DUMMY_FAIL_VALUE; + +const char* const TACSBladeStiffenedShellConstitutive::constName = "TACSBladeStiffenedShellConstitutive"; // ============================================================================== @@ -194,22 +199,22 @@ TACSBladeStiffenedShellConstitutive::TACSBladeStiffenedShellConstitutive( // Arrays for storing failure values, need values for each ply angle at the // top and bottom of the panel and at the tip of the stiffener this->panelPlyFailValues = new TacsScalar[2 * _numPanelPlies]; - this->stiffenerPlyFailValues = new TacsScalar[_numStiffenerPlies]; + this->stiffenerPlyFailValues = new TacsScalar[2 * _numStiffenerPlies]; // Arrays for storing failure strain sensitivities this->panelPlyFailStrainSens = new TacsScalar*[2 * _numPanelPlies]; - this->stiffenerPlyFailStrainSens = new TacsScalar*[_numStiffenerPlies]; + this->stiffenerPlyFailStrainSens = new TacsScalar*[2 * _numStiffenerPlies]; for (int ii = 0; ii < 2 * _numPanelPlies; ii++) { this->panelPlyFailStrainSens[ii] = new TacsScalar[this->NUM_STRESSES]; } - for (int ii = 0; ii < _numStiffenerPlies; ii++) { + for (int ii = 0; ii < 2 * _numStiffenerPlies; ii++) { this->stiffenerPlyFailStrainSens[ii] = new TacsScalar[TACSBeamConstitutive::NUM_STRESSES]; } // Arrays for storing ply failure sensitivities this->panelPlyFailSens = new TacsScalar[2 * this->numPanelPlies]; - this->stiffenerPlyFailSens = new TacsScalar[this->numPanelPlies]; + this->stiffenerPlyFailSens = new TacsScalar[2 * this->numStiffenerPlies]; } // ============================================================================== @@ -552,7 +557,7 @@ void TACSBladeStiffenedShellConstitutive::evalMassMoments( TacsScalar stiffenerDensity = this->stiffenerPly->getDensity(); TacsScalar stiffenerArea = this->computeStiffenerArea(); TacsScalar stiffenerOffset = - this->computeStiffenerCentroidHeight() - 0.5 * pThick; + -this->computeStiffenerCentroidHeight() - 0.5 * pThick; TacsScalar stiffenerMOI = this->computeStiffenerMOI(); moments[0] = @@ -596,11 +601,13 @@ void TACSBladeStiffenedShellConstitutive::addMassMomentsDVSens( TacsScalar stiffenerDensity = this->stiffenerPly->getDensity(); TacsScalar stiffenerArea = this->computeStiffenerArea(); TacsScalar stiffenerOffset = - this->computeStiffenerCentroidHeight() - 0.5 * pThick; + -this->computeStiffenerCentroidHeight() - 0.5 * pThick; TacsScalar stiffenerMOI = this->computeStiffenerMOI(); TacsScalar dzdt, dzdh; this->computeStiffenerCentroidHeightSens(dzdt, dzdh); + dzdt *= -1; + dzdh *= -1; TacsScalar dAdt, dAdh; this->computeStiffenerAreaSens(dAdt, dAdh); @@ -742,24 +749,23 @@ void TACSBladeStiffenedShellConstitutive::addStressDVSens( TacsScalar pInv = 1.0 / this->stiffenerPitch; TacsScalar stiffScale = pInv * scale; - TacsScalar A, dAdt, dAdh, Izz, dIzzdt, dIzzdh, J, dJdt, dJdh, z, dzdt, dzdh, - E, G; + TacsScalar A, dAdt, dAdh, dIzzdt, dIzzdh, dJdt, dJdh, dzdt, dzdh, E, G; A = this->computeStiffenerArea(); this->computeStiffenerAreaSens(dAdt, dAdh); - Izz = this->computeStiffenerIzz(); + this->computeStiffenerIzz(); this->computeStiffenerIzzSens(dIzzdt, dIzzdh); - J = this->computeStiffenerJxx(); this->computeStiffenerJxxSens(dJdt, dJdh); this->computeEffectiveModulii(this->numStiffenerPlies, this->stiffenerQMats, this->stiffenerPlyFracs, &E, &G); - z = this->computeStiffenerCentroidHeight() - 0.5 * this->panelThick; this->computeStiffenerCentroidHeightSens(dzdt, dzdh); + dzdt *= -1; + dzdh *= -1; // Sensitivity of the panel stress values to it's DVs (this has been proven // correct) this->addPanelStressDVSens(scale, strain, psi, &dfdx[this->panelDVStartNum]); - // Transform the psi vector the same way we do for stains + // Transform the psi vector the same way we do for strains TacsScalar stiffenerPsi[TACSBeamConstitutive::NUM_STRESSES]; this->transformStrain(psi, stiffenerPsi); @@ -841,45 +847,47 @@ TacsScalar TACSBladeStiffenedShellConstitutive::evalFailure( // Compute the failure values for each failure mode of the stiffened panel TacsScalar TACSBladeStiffenedShellConstitutive::computeFailureValues( const TacsScalar e[], TacsScalar fails[]) { - // --- Panel material failure --- - fails[0] = this->computePanelFailure(e); - - // --- Stiffener material failure --- + // Initialize the failure values to some very large and negative that won't + // contribute to the KS aggregate + for (int ii = 0; ii < this->NUM_FAILURES; ii++) { + fails[ii] = DUMMY_FAIL_VALUE; + } TacsScalar stiffenerStrain[TACSBeamConstitutive::NUM_STRESSES]; this->transformStrain(e, stiffenerStrain); - fails[1] = this->computeStiffenerFailure(stiffenerStrain); - // --- Local panel buckling --- - // Compute panel stiffness matrix and loads - TacsScalar panelStiffness[NUM_TANGENT_STIFFNESS_ENTRIES], - stress[NUM_STRESSES]; - this->computePanelStiffness(panelStiffness); - const TacsScalar *A, *D; - this->extractTangentStiffness(panelStiffness, &A, NULL, &D, NULL, NULL); - this->computePanelStress(e, stress); + // --- Panel material failure --- + if (this->includePanelMaterialFailure) { + fails[0] = this->computePanelFailure(e); + } - // Compute the critical local loads - TacsScalar N1Crit, N12Crit; - TacsScalar D11 = D[0], D12 = D[1], D22 = D[3], D66 = D[5], - L = this->stiffenerPitch; - N1Crit = this->computeCriticalLocalAxialLoad(D11, D22, D12, D66, L); - N12Crit = this->computeCriticalShearLoad(D11, D22, D12 + 2.0 * D66, L); + // --- Stiffener material failure --- + if (this->includeStiffenerMaterialFailure) { + fails[1] = this->computeStiffenerFailure(stiffenerStrain); + } - // Compute the buckling criteria - fails[2] = this->bucklingEnvelope(-stress[0], N1Crit, stress[2], N12Crit); + // --- Local panel buckling --- + if (this->includeLocalBuckling) { + fails[2] = this->evalLocalPanelBuckling(e); + } // --- Global buckling --- - TacsScalar D1, D2, D3; - this->computeCriticalGlobalBucklingStiffness(&D1, &D2, &D3); - L = this->panelLength; + if (this->includeGlobalBuckling) { + fails[3] = this->evalGlobalPanelBuckling(e); + } - N1Crit = computeCriticalGlobalAxialLoad(D1, L); - N12Crit = this->computeCriticalShearLoad(D1, D2, D3, L); + // --- Stiffener column buckling --- + if (this->includeStiffenerColumnBuckling) { + fails[4] = this->evalStiffenerColumnBuckling(stiffenerStrain); + } - this->evalStress(0, NULL, NULL, e, stress); - fails[3] = this->bucklingEnvelope(-stress[0], N1Crit, stress[2], N12Crit); + // --- Stiffener crippling --- + if (this->includeStiffenerCrippling) { + fails[5] = this->evalStiffenerCrippling(stiffenerStrain); + } - return ksAggregation(fails, this->NUM_FAILURES, this->ksWeight); + TacsScalar ksFail = ksAggregation(fails, this->NUM_FAILURES, this->ksWeight); + + return ksFail; } // Evaluate the derivative of the failure criteria w.r.t. the strain @@ -889,93 +897,84 @@ TacsScalar TACSBladeStiffenedShellConstitutive::evalFailureStrainSens( memset(sens, 0, this->NUM_STRESSES * sizeof(TacsScalar)); TacsScalar fails[this->NUM_FAILURES], dKSdf[this->NUM_FAILURES]; - // First compute the sensitivity of the panel failure value + + // Initialize the failure values to some very large and negative that won't + // contribute to the KS aggregate + for (int ii = 0; ii < this->NUM_FAILURES; ii++) { + fails[ii] = DUMMY_FAIL_VALUE; + } + + // --- Material failure --- TacsScalar panelFailSens[this->NUM_STRESSES]; - fails[0] = this->evalPanelFailureStrainSens(e, panelFailSens); + memset(panelFailSens, 0, this->NUM_STRESSES * sizeof(TacsScalar)); + if (this->includePanelMaterialFailure) { + // First compute the sensitivity of the panel failure value + fails[0] = this->evalPanelFailureStrainSens(e, panelFailSens); + } - // And now for the stiffener failure value, first in terms of the beam - // strains, and then transformed back to shell strains - TacsScalar stiffenerStrain[TACSBeamConstitutive::NUM_STRESSES], - stiffenerStrainSens[TACSBeamConstitutive::NUM_STRESSES], - stiffenerFailSens[this->NUM_STRESSES]; + TacsScalar stiffenerStrainSens[TACSBeamConstitutive::NUM_STRESSES], + stiffenerMatFailSens[this->NUM_STRESSES]; + memset(stiffenerStrainSens, 0, + TACSBeamConstitutive::NUM_STRESSES * sizeof(TacsScalar)); + memset(stiffenerMatFailSens, 0, this->NUM_STRESSES * sizeof(TacsScalar)); + + TacsScalar stiffenerStrain[TACSBeamConstitutive::NUM_STRESSES]; this->transformStrain(e, stiffenerStrain); - fails[1] = this->evalStiffenerFailureStrainSens(stiffenerStrain, - stiffenerStrainSens); - this->transformStrainSens(stiffenerStrainSens, stiffenerFailSens); + if (this->includeStiffenerMaterialFailure) { + // And now for the stiffener failure value, first in terms of the beam + // strains, and then transformed back to shell strains + fails[1] = this->evalStiffenerFailureStrainSens(stiffenerStrain, + stiffenerStrainSens); + this->transformStrainSens(stiffenerStrainSens, stiffenerMatFailSens); + } // --- Local panel buckling --- - // Compute panel stiffness matrix and loads - TacsScalar panelStiffness[NUM_TANGENT_STIFFNESS_ENTRIES], - panelStress[NUM_STRESSES]; - this->computePanelStiffness(panelStiffness); - const TacsScalar *APanel, *DPanel; - this->extractTangentStiffness(panelStiffness, &APanel, NULL, &DPanel, NULL, - NULL); - this->computePanelStress(e, panelStress); - - // Compute the critical local loads (no need to compute their sensitivities - // because they're not dependent on the strain)) - TacsScalar N1CritLocal, N12CritLocal; - TacsScalar D11 = DPanel[0], D12 = DPanel[1], D22 = DPanel[3], D66 = DPanel[5], - L = this->stiffenerPitch; - N1CritLocal = this->computeCriticalLocalAxialLoad(D11, D22, D12, D66, L); - N12CritLocal = this->computeCriticalShearLoad(D11, D22, D12 + 2.0 * D66, L); - - // Compute the buckling criteria and it's sensitivities - TacsScalar N1LocalSens, N12LocalSens, N1CritLocalSens, N12CritLocalSens; - fails[2] = this->bucklingEnvelopeSens( - -panelStress[0], N1CritLocal, panelStress[2], N12CritLocal, &N1LocalSens, - &N1CritLocalSens, &N12LocalSens, &N12CritLocalSens); + TacsScalar localBucklingSens[this->NUM_STRESSES]; + memset(localBucklingSens, 0, this->NUM_STRESSES * sizeof(TacsScalar)); + if (this->includeLocalBuckling) { + fails[2] = this->evalLocalPanelBucklingStrainSens(e, localBucklingSens); + } // --- Global buckling --- - TacsScalar stiffness[NUM_TANGENT_STIFFNESS_ENTRIES], stress[NUM_STRESSES]; - this->computeStiffness(stiffness); - const TacsScalar *A, *B, *D, *As; - TacsScalar drill; - this->extractTangentStiffness(stiffness, &A, &B, &D, &As, &drill); - this->computeStress(A, B, D, As, drill, e, stress); - TacsScalar N1GlobalSens, N1CritGlobalSens, N12GlobalSens, N12CritGlobalSens; - TacsScalar D1, D2, D3; - this->computeCriticalGlobalBucklingStiffness(&D1, &D2, &D3); - L = this->panelLength; - TacsScalar N1CritGlobal = computeCriticalGlobalAxialLoad(D1, L); - TacsScalar N12CritGlobal = this->computeCriticalShearLoad(D1, D2, D3, L); + TacsScalar globalBucklingSens[this->NUM_STRESSES]; + memset(globalBucklingSens, 0, this->NUM_STRESSES * sizeof(TacsScalar)); + if (this->includeGlobalBuckling) { + fails[3] = this->evalGlobalPanelBucklingStrainSens(e, globalBucklingSens); + } - fails[3] = this->bucklingEnvelopeSens( - -stress[0], N1CritGlobal, stress[2], N12CritGlobal, &N1GlobalSens, - &N1CritGlobalSens, &N12GlobalSens, &N12CritGlobalSens); + // --- Stiffener column buckling --- + TacsScalar stiffenerBucklingSens[this->NUM_STRESSES]; + memset(stiffenerBucklingSens, 0, this->NUM_STRESSES * sizeof(TacsScalar)); + if (this->includeStiffenerColumnBuckling) { + fails[4] = evalStiffenerColumnBucklingStrainSens(stiffenerStrain, + stiffenerStrainSens); + this->transformStrainSens(stiffenerStrainSens, stiffenerBucklingSens); + } + + // --- Stiffener crippling --- + TacsScalar stiffenerCripplingSens[this->NUM_STRESSES]; + memset(stiffenerCripplingSens, 0, this->NUM_STRESSES * sizeof(TacsScalar)); + if (this->includeStiffenerCrippling) { + fails[5] = + evalStiffenerCripplingStrainSens(stiffenerStrain, stiffenerStrainSens); + this->transformStrainSens(stiffenerStrainSens, stiffenerCripplingSens); + } // Compute the sensitivity of the aggregate failure value to the individual // failure mode values TacsScalar fail = ksAggregationSens(fails, this->NUM_FAILURES, this->ksWeight, dKSdf); - // Compute the total sensitivity due to the panel and stiffener material - // failure + // Sum up the strain sens for each failure mode memset(sens, 0, this->NUM_STRESSES * sizeof(TacsScalar)); for (int ii = 0; ii < this->NUM_STRESSES; ii++) { - sens[ii] = dKSdf[0] * panelFailSens[ii] + dKSdf[1] * stiffenerFailSens[ii]; + sens[ii] = + dKSdf[0] * panelFailSens[ii] + dKSdf[1] * stiffenerMatFailSens[ii] + + dKSdf[2] * localBucklingSens[ii] + dKSdf[3] * globalBucklingSens[ii] + + dKSdf[4] * stiffenerBucklingSens[ii] + + dKSdf[5] * stiffenerCripplingSens[ii]; } - // Now add the sensitivity of the buckling criteria - - // local buckling - N1LocalSens *= dKSdf[2]; - N12LocalSens *= dKSdf[2]; - sens[0] += N1LocalSens * -APanel[0] + N12LocalSens * APanel[2]; - sens[1] += N1LocalSens * -APanel[1] + N12LocalSens * APanel[4]; - sens[2] += N1LocalSens * -APanel[2] + N12LocalSens * APanel[5]; - - // Global buckling - N1GlobalSens *= dKSdf[3]; - N12GlobalSens *= dKSdf[3]; - sens[0] += N1GlobalSens * -A[0] + N12GlobalSens * A[2]; - sens[1] += N1GlobalSens * -A[1] + N12GlobalSens * A[4]; - sens[2] += N1GlobalSens * -A[2] + N12GlobalSens * A[5]; - sens[3] += N1GlobalSens * -B[0] + N12GlobalSens * B[2]; - sens[4] += N1GlobalSens * -B[1] + N12GlobalSens * B[4]; - sens[5] += N1GlobalSens * -B[2] + N12GlobalSens * B[5]; - return fail; } @@ -987,216 +986,73 @@ void TACSBladeStiffenedShellConstitutive::addFailureDVSens( // forward and backward differentiation and ends up recomputing a lot of // stuff. It should be rewritten to use only forward or only backward // differentiation in future. - const int numDV = this->numDesignVars; // Compute the failure values and then compute the // sensitivity of the aggregate failure value w.r.t. them TacsScalar fails[this->NUM_FAILURES], dKSdf[this->NUM_FAILURES]; - TacsScalar fail = this->computeFailureValues(strain, fails); + this->computeFailureValues(strain, fails); ksAggregationSens(fails, this->NUM_FAILURES, this->ksWeight, dKSdf); - // Sensitivity of the panel failure value to it's DVs - this->addPanelFailureDVSens(strain, scale * dKSdf[0], - &dfdx[this->panelDVStartNum]); - - // Add the direct sensitivity of the stiffener failure value w.r.t DVs - // Sensitivity of the panel failure value to it's DVs TacsScalar stiffenerStrain[TACSBeamConstitutive::NUM_STRESSES]; this->transformStrain(strain, stiffenerStrain); - this->addStiffenerFailureDVSens(stiffenerStrain, scale * dKSdf[1], - &dfdx[this->stiffenerDVStartNum]); - - // Add the sensitivity of the stiffener failure value w.r.t. the DVs - // due to the dependence of the stiffener strains on the DVs - TacsScalar stiffenerFailStrainSens[TACSBeamConstitutive::NUM_STRESSES]; - this->evalStiffenerFailureStrainSens(stiffenerStrain, - stiffenerFailStrainSens); - this->addStrainTransformProductDVsens(stiffenerFailStrainSens, strain, - scale * dKSdf[1], dfdx); - - // --- Local panel buckling --- - // Compute panel stiffness matrix and loads - TacsScalar panelStiffness[NUM_TANGENT_STIFFNESS_ENTRIES], - panelStress[NUM_STRESSES]; - this->computePanelStiffness(panelStiffness); - const TacsScalar *A, *D; - this->extractTangentStiffness(panelStiffness, &A, NULL, &D, NULL, NULL); - this->computePanelStress(strain, panelStress); - - // Compute the critical local loads and their sensitivities - TacsScalar N1Crit, N12Crit; - TacsScalar D11 = D[0], D12 = D[1], D22 = D[3], D66 = D[5], - L = this->stiffenerPitch; - - // Create arrays for the sensitivities of the critical loads: - // [dN/dD11, dNdD22, dNdD12, dNdD66, dNdL] - TacsScalar N1CritSens[5], N12CritSens[5]; - N1Crit = this->computeCriticalLocalAxialLoadSens( - D11, D22, D12, D66, L, &N1CritSens[0], &N1CritSens[1], &N1CritSens[2], - &N1CritSens[3], &N1CritSens[4]); - N12Crit = this->computeCriticalShearLoadSens( - D11, D22, D12 + 2.0 * D66, L, &N12CritSens[0], &N12CritSens[1], - &N12CritSens[2], &N12CritSens[4]); - - // N12CritSens[2] is currently dN12Crit/d(D12 + 2D66) - N12CritSens[3] = 2.0 * N12CritSens[2]; - - // Compute the buckling criteria and it's sensitivities to the applied and - // critical loads - TacsScalar dfdN1Local, dfdN12Local, dfdN1CritLocal, dfdN12CritLocal; - fails[2] = this->bucklingEnvelopeSens(-panelStress[0], N1Crit, panelStress[2], - N12Crit, &dfdN1Local, &dfdN1CritLocal, - &dfdN12Local, &dfdN12CritLocal); - dfdN1Local *= dKSdf[2]; - dfdN12Local *= dKSdf[2]; - dfdN1CritLocal *= dKSdf[2]; - dfdN12CritLocal *= dKSdf[2]; - - // Convert sensitivity w.r.t applied loads into sensitivity w.r.t DVs - TacsScalar dfdPanelStress[NUM_STRESSES]; - memset(dfdPanelStress, 0, NUM_STRESSES * sizeof(TacsScalar)); - dfdPanelStress[0] = -dfdN1Local; - dfdPanelStress[2] = dfdN12Local; - this->addPanelStressDVSens(scale, strain, dfdPanelStress, - &dfdx[this->panelDVStartNum]); - - // Convert the sensitivities of the critical loads w.r.t the D matrix entries - // to sensitivities of the buckling failure criteria w.r.t the D matrix - // entries - TacsScalar localBucklingDMatSens[4]; - for (int ii = 0; ii < 4; ii++) { - localBucklingDMatSens[ii] = - N1CritSens[ii] * dfdN1CritLocal + N12CritSens[ii] * dfdN12CritLocal; - } - - // --- Global buckling sensitivity --- - TacsScalar stress[NUM_STRESSES]; - this->evalStress(0, NULL, NULL, strain, stress); - TacsScalar dfdN1Global, dfdN12Global, dfdN1CritGlobal, dfdN12CritGlobal; - TacsScalar D1, D2, D3; - this->computeCriticalGlobalBucklingStiffness(&D1, &D2, &D3); - L = this->panelLength; - N1Crit = computeCriticalGlobalAxialLoad(D1, L); - N12Crit = this->computeCriticalShearLoad(D1, D2, D3, L); - - this->bucklingEnvelopeSens(-stress[0], N1Crit, stress[2], N12Crit, - &dfdN1Global, &dfdN1CritGlobal, &dfdN12Global, - &dfdN12CritGlobal); - dfdN1Global *= dKSdf[3]; - dfdN12Global *= dKSdf[3]; - dfdN1CritGlobal *= dKSdf[3]; - dfdN12CritGlobal *= dKSdf[3]; - - // Add the sensitivity of the buckling failure criteria due to the dependence - // of the applied loads on the DVs - TacsScalar dfdStress[NUM_STRESSES]; - memset(dfdStress, 0, NUM_STRESSES * sizeof(TacsScalar)); - dfdStress[0] = -dfdN1Global; - dfdStress[2] = dfdN12Global; - this->addStressDVSens(elemIndex, scale, pt, X, strain, dfdStress, numDV, - dfdx); - - // Propogate the sensitivity of the buckling failure criteria w.r.t the - // critical loads back to the DVs - TacsScalar dfdD1, dfdD2, dfdD3, dfdPanelLength; - this->computeCriticalShearLoadSens(D1, D2, D3, L, &dfdD1, &dfdD2, &dfdD3, - &dfdPanelLength); - dfdD1 *= dfdN12CritGlobal; - dfdD2 *= dfdN12CritGlobal; - dfdD3 *= dfdN12CritGlobal; - dfdPanelLength *= dfdN12CritGlobal; - // N1CritGlobal = M_PI * M_PI * D1 / (L * L); - dfdD1 += dfdN1CritGlobal * (M_PI * M_PI / (L * L)); - dfdPanelLength += dfdN1CritGlobal * (-2.0 * M_PI * M_PI * D1 / (L * L * L)); - - if (this->panelLengthNum >= 0) { - dfdx[this->panelLengthLocalNum] += scale * dfdPanelLength; - } - - TacsScalar globalBucklingspSens, globalBucklingtpSens, globalBucklinghsSens, - globalBucklingtsSens, globalBucklingQstiffSens[NUM_Q_ENTRIES], - globalBucklingQpanelSens[NUM_Q_ENTRIES]; - this->computeCriticalGlobalBucklingStiffnessSens( - dfdD1, dfdD2, dfdD3, &globalBucklingspSens, &globalBucklingtpSens, - &globalBucklinghsSens, &globalBucklingtsSens, globalBucklingQpanelSens, - globalBucklingQstiffSens); - - // --- Panel thickness sensitivity --- - TacsScalar t = this->panelThick; - if (this->panelThickNum >= 0) { - int dvNum = this->panelThickLocalNum; - // --- Local buckling contribution --- - TacsScalar dMatdt = 0.25 * t * t; // d/dt(t^3/12) = t^2/4 - for (int ii = 0; ii < this->numPanelPlies; ii++) { - TacsScalar* Q = &(this->panelQMats[ii * NUM_Q_ENTRIES]); - dfdx[dvNum] += - scale * dMatdt * this->panelPlyFracs[ii] * - (localBucklingDMatSens[0] * Q[0] + localBucklingDMatSens[1] * Q[3] + - localBucklingDMatSens[2] * Q[1] + localBucklingDMatSens[3] * Q[5]); - } - // --- Global buckling contribution --- - dfdx[dvNum] += scale * globalBucklingtpSens; - } - // --- Panel Ply fraction sensitivities --- - for (int ii = 0; ii < this->numPanelPlies; ii++) { - if (this->panelPlyFracNums[ii] >= 0) { - int dvNum = this->panelPlyFracLocalNums[ii]; - // --- Local buckling contribution --- - TacsScalar DFactor = t * t * t / 12.0; - TacsScalar* Q = &(this->panelQMats[ii * NUM_Q_ENTRIES]); - // Do df/dx += df/dD11 * dD11/dx + df/dD22 * dD22/dx + df/dD12 * dD12/dx + - // df/dD66 * dD66/dx - dfdx[dvNum] += - scale * DFactor * - (localBucklingDMatSens[0] * Q[0] + localBucklingDMatSens[1] * Q[3] + - localBucklingDMatSens[2] * Q[1] + localBucklingDMatSens[3] * Q[5]); - - // --- Global buckling contribution --- - dfdx[dvNum] += scale * (globalBucklingQpanelSens[0] * Q[0] + - globalBucklingQpanelSens[1] * Q[1] + - globalBucklingQpanelSens[2] * Q[2] + - globalBucklingQpanelSens[3] * Q[3] + - globalBucklingQpanelSens[4] * Q[4] + - globalBucklingQpanelSens[5] * Q[5]); - } + // Sensitivity of the panel failure value to it's DVs + if (this->includePanelMaterialFailure) { + this->addPanelFailureDVSens(strain, scale * dKSdf[0], + &dfdx[this->panelDVStartNum]); } - // --- Stiffener height contribution --- - if (this->stiffenerHeightNum >= 0) { - int dvNum = this->stiffenerHeightLocalNum; - // --- Global buckling contribution --- - dfdx[dvNum] += scale * globalBucklinghsSens; - } + if (this->includeStiffenerMaterialFailure) { + // Add the direct sensitivity of the stiffener failure value w.r.t DVs + // Sensitivity of the panel failure value to it's DVs + this->addStiffenerFailureDVSens(stiffenerStrain, scale * dKSdf[1], + &dfdx[this->stiffenerDVStartNum]); - // --- Stiffener thickness contribution --- - if (this->stiffenerThickNum >= 0) { - int dvNum = this->stiffenerThickLocalNum; - // --- Global buckling contribution --- - dfdx[dvNum] += scale * globalBucklingtsSens; + // Add the sensitivity of the stiffener failure value w.r.t. the DVs + // due to the dependence of the stiffener strains on the DVs + TacsScalar stiffenerFailStrainSens[TACSBeamConstitutive::NUM_STRESSES]; + this->evalStiffenerFailureStrainSens(stiffenerStrain, + stiffenerFailStrainSens); + this->addStrainTransformProductDVsens(stiffenerFailStrainSens, strain, + scale * dKSdf[1], dfdx); } - // --- Stiffener ply fraction contributions --- - for (int ii = 0; ii < this->numStiffenerPlies; ii++) { - if (this->stiffenerPlyFracNums[ii] >= 0) { - int dvNum = this->stiffenerPlyFracLocalNums[ii]; - TacsScalar* Q = &(this->stiffenerQMats[ii * NUM_Q_ENTRIES]); - - // --- Global buckling contribution --- - dfdx[dvNum] += scale * (globalBucklingQstiffSens[0] * Q[0] + - globalBucklingQstiffSens[1] * Q[1] + - globalBucklingQstiffSens[2] * Q[2] + - globalBucklingQstiffSens[3] * Q[3] + - globalBucklingQstiffSens[4] * Q[4] + - globalBucklingQstiffSens[5] * Q[5]); - } + // --- Local panel buckling --- + if (this->includeLocalBuckling) { + this->addLocalPanelBucklingDVSens(elemIndex, scale * dKSdf[2], pt, X, + strain, dvLen, dfdx); } - // --- Stiffener pitch sensitivity --- - if (this->stiffenerPitchNum >= 0) { - dfdx[this->stiffenerPitchLocalNum] += - scale * (N12CritSens[4] * dfdN12CritLocal + - N1CritSens[4] * dfdN1CritLocal + globalBucklingspSens); + // --- Global buckling sensitivity --- + if (this->includeGlobalBuckling) { + this->addGlobalPanelBucklingDVSens(elemIndex, scale * dKSdf[3], pt, X, + strain, dvLen, dfdx); + } + + // --- Stiffener column buckling --- + if (this->includeStiffenerColumnBuckling) { + TacsScalar stiffenerStress[TACSBeamConstitutive::NUM_STRESSES]; + this->computeStiffenerStress(stiffenerStrain, stiffenerStress); + const TacsScalar columnBucklingLoad = + this->computeStiffenerColumnBucklingLoad(); + const TacsScalar stiffenerAxialLoad = -stiffenerStress[0]; + this->addStiffenerColumnBucklingDVSens(dKSdf[4] * scale, strain, + stiffenerStrain, stiffenerAxialLoad, + columnBucklingLoad, dfdx); + } + + // --- Stiffener crippling --- + if (this->includeStiffenerCrippling) { + // Direct dependence of the stiffener crippling on the DVs + this->addStiffenerCripplingDVSens(scale * dKSdf[5], stiffenerStrain, + &dfdx[this->stiffenerDVStartNum]); + // Sensitivity of the stiffener crippling due to effect of DVs on the + // stiffener strains + TacsScalar stiffenerCripplingStrainSens[TACSBeamConstitutive::NUM_STRESSES]; + this->evalStiffenerCripplingStrainSens(stiffenerStrain, + stiffenerCripplingStrainSens); + this->addStrainTransformProductDVsens(stiffenerCripplingStrainSens, strain, + scale * dKSdf[5], dfdx); } } @@ -1233,7 +1089,12 @@ TacsScalar TACSBladeStiffenedShellConstitutive::evalFailureFieldValue( } else if (failIndex >= 1 && failIndex <= this->NUM_FAILURES) { TacsScalar fails[this->NUM_FAILURES]; computeFailureValues(strain, fails); - return fails[failIndex - 1]; + TacsScalar failVal = fails[failIndex - 1]; + if (TacsRealPart(failVal) == TacsRealPart(this->DUMMY_FAIL_VALUE)) { + return 0.0; + } else { + return failVal; + } } else { return 0.0; } @@ -1242,7 +1103,7 @@ TacsScalar TACSBladeStiffenedShellConstitutive::evalFailureFieldValue( TacsScalar TACSBladeStiffenedShellConstitutive::computeEffectiveBendingThickness() { TacsScalar IStiff = this->computeStiffenerIzz(); - TacsScalar zStiff = this->computeStiffenerCentroidHeight(); + TacsScalar zStiff = -this->computeStiffenerCentroidHeight(); TacsScalar t = this->panelThick; TacsScalar AStiff = this->computeStiffenerArea(); TacsScalar Ieff = t * t * t / 12.0 + @@ -1256,12 +1117,6 @@ TACSBladeStiffenedShellConstitutive::computeEffectiveBendingThickness() { // Compute the stiffness matrix void TACSBladeStiffenedShellConstitutive::computeStiffness(TacsScalar C[]) { - TacsScalar* A = &C[0]; - TacsScalar* B = &C[6]; - TacsScalar* D = &C[12]; - TacsScalar* As = &C[18]; - TacsScalar* drill = &C[21]; - // --- Zero out the C matrix --- memset(C, 0, this->NUM_TANGENT_STIFFNESS_ENTRIES * sizeof(TacsScalar)); @@ -1320,7 +1175,7 @@ void TACSBladeStiffenedShellConstitutive::transformStrain( const TacsScalar panelStrain[], TacsScalar stiffenerStrain[]) { // Compute the offset of the stiffener centroid from the shell mid-plane TacsScalar z = - this->computeStiffenerCentroidHeight() - 0.5 * this->panelThick; + -this->computeStiffenerCentroidHeight() - 0.5 * this->panelThick; // Axial strain (contains contribution from panel bending) stiffenerStrain[0] = panelStrain[0] + z * panelStrain[3]; @@ -1338,10 +1193,8 @@ void TACSBladeStiffenedShellConstitutive::transformStrain( void TACSBladeStiffenedShellConstitutive::transformStrainSens( const TacsScalar stiffenerStrainSens[], TacsScalar panelStrainSens[]) { - memset(panelStrainSens, 0, - TACSBeamConstitutive::NUM_STRESSES * sizeof(TacsScalar)); TacsScalar z = - this->computeStiffenerCentroidHeight() - 0.5 * this->panelThick; + -this->computeStiffenerCentroidHeight() - 0.5 * this->panelThick; panelStrainSens[0] = stiffenerStrainSens[0]; panelStrainSens[1] = 0.0; @@ -1361,7 +1214,7 @@ void TACSBladeStiffenedShellConstitutive::addStiffenerStress( TacsScalar pInv = 1.0 / this->stiffenerPitch; // Compute the offset of the stiffener centroid from the shell mid-plane TacsScalar z = - this->computeStiffenerCentroidHeight() - 0.5 * this->panelThick; + -this->computeStiffenerCentroidHeight() - 0.5 * this->panelThick; panelStress[0] += pInv * stiffenerStress[0]; panelStress[2] += pInv * 0.5 * stiffenerStress[5]; @@ -1376,7 +1229,7 @@ void TACSBladeStiffenedShellConstitutive::addStiffenerStiffness( TacsScalar pInv = 1.0 / this->stiffenerPitch; // Compute the offset of the stiffener centroid from the shell mid-plane TacsScalar z = - this->computeStiffenerCentroidHeight() - 0.5 * this->panelThick; + -this->computeStiffenerCentroidHeight() - 0.5 * this->panelThick; // Some shorthand for the entries of the stiffness matrix TacsScalar* A = &(panelStiffness[0]); @@ -1422,6 +1275,8 @@ void TACSBladeStiffenedShellConstitutive::addStrainTransformProductDVsens( TacsScalar dzdtp, dzdhs, dzdts; dzdtp = -0.5; this->computeStiffenerCentroidHeightSens(dzdts, dzdhs); + dzdts *= -1; + dzdhs *= -1; // The sensitivities of the transformation matrix w.r.t the offset are: // dTe[0,3]/dz = 1 @@ -1501,7 +1356,6 @@ void TACSBladeStiffenedShellConstitutive::addPanelStressDVSens( if (this->panelThickNum >= 0) { int index = this->panelThickLocalNum - this->panelDVStartNum; TacsScalar t24 = this->panelThick * this->panelThick / 4.0; - TacsScalar tInv = 1.0 / this->panelThick; TacsScalar AMatProd, DMatProd, AsMatProd, drillProd; TacsScalar QPanel[this->NUM_Q_ENTRIES]; @@ -1569,7 +1423,6 @@ void TACSBladeStiffenedShellConstitutive::addPanelStressDVSens( void TACSBladeStiffenedShellConstitutive::computePanelStiffness( TacsScalar C[]) { TacsScalar* A = &C[0]; - TacsScalar* B = &C[6]; TacsScalar* D = &C[12]; TacsScalar* As = &C[18]; @@ -1706,7 +1559,6 @@ void TACSBladeStiffenedShellConstitutive::addPanelFailureDVSens( if (this->panelThickNum >= 0) { TACSOrthotropicPly* ply = this->panelPly; const int numPlies = this->numPanelPlies; - const int numStrain = TACSBeamConstitutive::NUM_STRESSES; TacsScalar* dKSdFail = this->panelPlyFailSens; TacsScalar* fails = this->panelPlyFailValues; const TacsScalar* angles = this->panelPlyAngles; @@ -1831,7 +1683,6 @@ void TACSBladeStiffenedShellConstitutive::addStiffenerStressDVSens( this->stiffenerPlyFracLocalNums[ii] - this->stiffenerDVStartNum; TacsScalar* Q = &(this->stiffenerQMats[ii * NUM_Q_ENTRIES]); - TacsScalar* Abar = &(this->stiffenerQMats[ii * NUM_ABAR_ENTRIES]); TacsScalar dEdx = Q[0] - (Q[1] * Q[1]) / Q[3]; TacsScalar dGdx = Q[5]; @@ -1868,11 +1719,11 @@ void TACSBladeStiffenedShellConstitutive::computeStiffenerStiffness( void TACSBladeStiffenedShellConstitutive::computeEffectiveModulii( const int numPlies, const TacsScalar QMats[], const TacsScalar plyFracs[], - TacsScalar* E, TacsScalar* G) { + TacsScalar* const E, TacsScalar* const G) { *E = 0.; *G = 0.; for (int plyNum = 0; plyNum < numPlies; plyNum++) { - const TacsScalar* Q = &(QMats[plyNum * NUM_Q_ENTRIES]); + const TacsScalar* const Q = &(QMats[plyNum * NUM_Q_ENTRIES]); *E += plyFracs[plyNum] * (Q[0] - Q[1] * Q[1] / Q[3]); *G += plyFracs[plyNum] * Q[5]; } @@ -1881,21 +1732,24 @@ void TACSBladeStiffenedShellConstitutive::computeEffectiveModulii( // code above, but for some reason (probably related to floating point // arithmetic), it produces results that don't quite match complex step // derivatives w.r.t the ply fractions - /* - TacsScalar Q[this->NUM_Q_ENTRIES], ABar[this->NUM_ABAR_ENTRIES]; - - this->computeSmearedStiffness(this->numStiffenerPlies, this->stiffenerQMats, - this->stiffenerAbarMats, - this->stiffenerPlyFracs, Q, ABar); - - // Compute the effective elastic and shear moduli - TacsScalar Q11 = Q[0]; - TacsScalar Q12 = Q[1]; - TacsScalar Q22 = Q[3]; - TacsScalar Q66 = Q[5]; - E = Q11 - Q12 * Q12 / Q22; - G = Q66; - */ + // TacsScalar Q[NUM_Q_ENTRIES]; //, ABar[this->NUM_ABAR_ENTRIES]; + // for (int ii = 0; ii < NUM_Q_ENTRIES; ii++) { + // Q[ii] = 0.0; + // } + // for (int plyNum = 0; plyNum < numPlies; plyNum++) { + // const TacsScalar* Qply = &(QMats[plyNum * NUM_Q_ENTRIES]); + // for (int ii = 0; ii < NUM_Q_ENTRIES; ii++) { + // Q[ii] += plyFracs[plyNum] * Qply[ii]; + // } + // } + + // // Compute the effective elastic and shear moduli + // TacsScalar Q11 = Q[0]; + // TacsScalar Q12 = Q[1]; + // TacsScalar Q22 = Q[3]; + // TacsScalar Q66 = Q[5]; + // *E = Q11 - Q12 * Q12 / Q22; + // *G = Q66; } // Compute the failure criteria for the stiffener @@ -1904,25 +1758,36 @@ TacsScalar TACSBladeStiffenedShellConstitutive::computeStiffenerFailure( TACSOrthotropicPly* ply = this->stiffenerPly; // Compute the strain state at the tip of the stiffener - TacsScalar zTipOffset = -(this->stiffenerHeight + this->stiffenerThick) - - this->computeStiffenerCentroidHeight(); - TacsScalar tipStrain[3]; - memset(tipStrain, 0, 3 * sizeof(TacsScalar)); - tipStrain[0] = stiffenerStrain[0] + zTipOffset * stiffenerStrain[2]; + TacsScalar zCentroid = -this->computeStiffenerCentroidHeight(); + TacsScalar zTipOffset = + -(this->stiffenerHeight + this->stiffenerThick) - zCentroid; + TacsScalar plyStrain[3]; + memset(plyStrain, 0, 3 * sizeof(TacsScalar)); + plyStrain[0] = stiffenerStrain[0] + zTipOffset * stiffenerStrain[2]; // Compute the failure criteria at this strain state for each ply angle for (int ii = 0; ii < this->numStiffenerPlies; ii++) { this->stiffenerPlyFailValues[ii] = - ply->failure(this->stiffenerPlyAngles[ii], tipStrain); + ply->failure(this->stiffenerPlyAngles[ii], plyStrain); } - // Returned the aggregated value over all plies - return ksAggregation(this->stiffenerPlyFailValues, this->numStiffenerPlies, - this->ksWeight); -} + // Now do the same thing for the bottom of the stiffener + zTipOffset = -zCentroid; + plyStrain[0] = stiffenerStrain[0] + zTipOffset * stiffenerStrain[2]; -TacsScalar TACSBladeStiffenedShellConstitutive::evalStiffenerFailureStrainSens( - const TacsScalar strain[], TacsScalar sens[]) { + // Compute the failure criteria at this strain state for each ply angle + for (int ii = 0; ii < this->numStiffenerPlies; ii++) { + this->stiffenerPlyFailValues[this->numStiffenerPlies + ii] = + ply->failure(this->stiffenerPlyAngles[ii], plyStrain); + } + + // Returned the aggregated value over all plies + return ksAggregation(this->stiffenerPlyFailValues, + 2 * this->numStiffenerPlies, this->ksWeight); +} + +TacsScalar TACSBladeStiffenedShellConstitutive::evalStiffenerFailureStrainSens( + const TacsScalar strain[], TacsScalar sens[]) { TACSOrthotropicPly* ply = this->stiffenerPly; const int numPlies = this->numStiffenerPlies; const int numStrain = TACSBeamConstitutive::NUM_STRESSES; @@ -1933,11 +1798,15 @@ TacsScalar TACSBladeStiffenedShellConstitutive::evalStiffenerFailureStrainSens( memset(sens, 0, numStrain * sizeof(TacsScalar)); // Compute the strain state at the tip of the stiffener - TacsScalar zTipOffset = -(this->stiffenerHeight + this->stiffenerThick) - - this->computeStiffenerCentroidHeight(); + TacsScalar zCentroid = -this->computeStiffenerCentroidHeight(); + TacsScalar zTipOffset = + -(this->stiffenerHeight + this->stiffenerThick) - zCentroid; TacsScalar tipStrain[3]; memset(tipStrain, 0, 3 * sizeof(TacsScalar)); tipStrain[0] = strain[0] + zTipOffset * strain[2]; + TacsScalar bottomStrain[3]; + memset(bottomStrain, 0, 3 * sizeof(TacsScalar)); + bottomStrain[0] = strain[0] - zCentroid * strain[2]; // Compute the failure criteria at this strain state for each ply angle and // the sensitivity of the failure criteria w.r.t the strains @@ -1945,15 +1814,22 @@ TacsScalar TACSBladeStiffenedShellConstitutive::evalStiffenerFailureStrainSens( TacsScalar plyFailStrainSens[3]; fails[ii] = ply->failureStrainSens(angles[ii], tipStrain, plyFailStrainSens); - // Convert the sensitivity w.r.t the tip strain to the sensitivity w.r.t - // beam strains + // Convert the sensitivity w.r.t the tip strains to the sensitivity + // w.r.t beam strains memset(dFaildStrain[ii], 0, numStrain * sizeof(TacsScalar)); dFaildStrain[ii][0] = plyFailStrainSens[0]; dFaildStrain[ii][2] = zTipOffset * plyFailStrainSens[0]; + + // Now do the same for the bottom of the stiffener + fails[numPlies + ii] = + ply->failureStrainSens(angles[ii], bottomStrain, plyFailStrainSens); + memset(dFaildStrain[numPlies + ii], 0, numStrain * sizeof(TacsScalar)); + dFaildStrain[numPlies + ii][0] = plyFailStrainSens[0]; + dFaildStrain[numPlies + ii][2] = -zCentroid * plyFailStrainSens[0]; } TacsScalar fail = ksAggregationSensProduct( - fails, numPlies, numStrain, this->ksWeight, dFaildStrain, sens); + fails, 2 * numPlies, numStrain, this->ksWeight, dFaildStrain, sens); return fail; } @@ -1963,16 +1839,20 @@ void TACSBladeStiffenedShellConstitutive::addStiffenerFailureDVSens( TACSOrthotropicPly* ply = this->stiffenerPly; TacsScalar* fails = this->stiffenerPlyFailValues; const TacsScalar* angles = this->stiffenerPlyAngles; - TacsScalar* dKSdFail = this->panelPlyFailSens; + TacsScalar* dKSdFail = this->stiffenerPlyFailSens; const int hNum = this->stiffenerHeightLocalNum - this->stiffenerDVStartNum; const int tNum = this->stiffenerThickLocalNum - this->stiffenerDVStartNum; - TacsScalar zTipOffset = -(this->stiffenerHeight + this->stiffenerThick) - - this->computeStiffenerCentroidHeight(); + TacsScalar zCentroid = -this->computeStiffenerCentroidHeight(); + TacsScalar zTipOffset = + -(this->stiffenerHeight + this->stiffenerThick) - zCentroid; + TacsScalar dZdh, dZdt; + this->computeStiffenerCentroidHeightSens(dZdt, dZdh); + dZdt *= -1; + dZdh *= -1; TacsScalar dTipStraindh, dTipStraindt; - this->computeStiffenerCentroidHeightSens(dTipStraindt, dTipStraindh); - dTipStraindh = -dTipStraindh - 1.0; - dTipStraindt = -dTipStraindt - 1.0; + dTipStraindh = -dZdh - 1.0; + dTipStraindt = -dZdt - 1.0; // Compute the strain state at the tip of the stiffener TacsScalar tipStrain[3]; @@ -1986,19 +1866,36 @@ void TACSBladeStiffenedShellConstitutive::addStiffenerFailureDVSens( fails[ii] = ply->failure(angles[ii], tipStrain); } + // Now do the same thing for the bottom of the stiffener + TacsScalar bottomStrain[3]; + memset(bottomStrain, 0, 3 * sizeof(TacsScalar)); + zTipOffset = -zCentroid; + bottomStrain[0] = strain[0] + zTipOffset * strain[2]; + + for (int ii = 0; ii < this->numStiffenerPlies; ii++) { + fails[this->numStiffenerPlies + ii] = + ply->failure(this->stiffenerPlyAngles[ii], bottomStrain); + } + // Compute the sensitivity of the KS aggregation w.r.t the failure values - ksAggregationSens(fails, this->numStiffenerPlies, this->ksWeight, dKSdFail); + ksAggregationSens(fails, 2 * this->numStiffenerPlies, this->ksWeight, + dKSdFail); // Now go back through each ply, compute the strain sensitivity of it's // failure, then convert it to a DV sensitivity and add it to the dfdx array for (int ii = 0; ii < this->numStiffenerPlies; ii++) { - TacsScalar plyFailStrainSens[3]; - ply->failureStrainSens(angles[ii], tipStrain, plyFailStrainSens); + TacsScalar tipFailStrainSens[3], bottomFailStrainSens[3]; + ply->failureStrainSens(angles[ii], tipStrain, tipFailStrainSens); + ply->failureStrainSens(angles[ii], bottomStrain, bottomFailStrainSens); if (hNum >= 0) { - dfdx[hNum] += scale * dKSdFail[ii] * dTipStraindh * plyFailStrainSens[0]; + dfdx[hNum] += scale * dKSdFail[ii] * dTipStraindh * tipFailStrainSens[0]; + dfdx[hNum] += scale * dKSdFail[this->numStiffenerPlies + ii] * -dZdh * + strain[2] * bottomFailStrainSens[0]; } if (tNum >= 0) { - dfdx[tNum] += scale * dKSdFail[ii] * dTipStraindt * plyFailStrainSens[0]; + dfdx[tNum] += scale * dKSdFail[ii] * dTipStraindt * tipFailStrainSens[0]; + dfdx[tNum] += scale * dKSdFail[this->numStiffenerPlies + ii] * -dZdt * + strain[2] * bottomFailStrainSens[0]; } } } @@ -2019,16 +1916,16 @@ void TACSBladeStiffenedShellConstitutive::computeStiffenerAreaSens( TacsScalar TACSBladeStiffenedShellConstitutive::computeStiffenerCentroidHeight() { - return -((1.0 + 0.5 * this->flangeFraction) * this->stiffenerThick + - 0.5 * this->stiffenerHeight) / + return ((1.0 + 0.5 * this->flangeFraction) * this->stiffenerThick + + 0.5 * this->stiffenerHeight) / (1.0 + this->flangeFraction); } void TACSBladeStiffenedShellConstitutive::computeStiffenerCentroidHeightSens( TacsScalar& dzdt, TacsScalar& dzdh) { TacsScalar kf = this->flangeFraction; - dzdh = -0.5 / (1.0 + kf); - dzdt = -(1.0 + 0.5 * kf) / (1.0 + kf); + dzdh = 0.5 / (1.0 + kf); + dzdt = (1.0 + 0.5 * kf) / (1.0 + kf); } TacsScalar TACSBladeStiffenedShellConstitutive::computeStiffenerIzz() { @@ -2091,8 +1988,8 @@ TacsScalar TACSBladeStiffenedShellConstitutive::computeStiffenerMOI() { TacsScalar z1 = -(st + 0.5 * sh); // Centroid of the stiffener web TacsScalar z2 = -(0.5 * st); // Centroid of the stiffener flange TacsScalar zc = - this->computeStiffenerCentroidHeight(); // Centroid of the whole - // stiffener section + -this->computeStiffenerCentroidHeight(); // Centroid of the whole + // stiffener section // Offsets of each area from the centroid of the whole stiffener section TacsScalar dz1 = z1 - zc; @@ -2134,9 +2031,24 @@ void TACSBladeStiffenedShellConstitutive::computeStiffenerMOISens( // Buckling functions // ============================================================================== +TacsScalar TACSBladeStiffenedShellConstitutive::evalGlobalPanelBuckling( + const TacsScalar e[]) { + TacsScalar stress[TACSShellConstitutive::NUM_STRESSES]; + TacsScalar D1, D2, D3; + this->computeCriticalGlobalBucklingStiffness(&D1, &D2, &D3); + const TacsScalar L = this->panelLength; + + const TacsScalar N1Crit = computeCriticalGlobalAxialLoad(D1, L); + const TacsScalar N12Crit = this->computeCriticalShearLoad(D1, D2, D3, L); + + this->evalStress(0, NULL, NULL, e, stress); + return this->bucklingEnvelope(-stress[0], N1Crit, stress[2], N12Crit); +} + void TACSBladeStiffenedShellConstitutive:: - computeCriticalGlobalBucklingStiffness(TacsScalar* D1, TacsScalar* D2, - TacsScalar* D3) { + computeCriticalGlobalBucklingStiffness(TacsScalar* const D1, + TacsScalar* const D2, + TacsScalar* const D3) { // Compute the Q matrices for the panel and stiffener TacsScalar QPanel[this->NUM_Q_ENTRIES], QStiffener[this->NUM_Q_ENTRIES]; this->computeSmearedStiffness(this->numPanelPlies, this->panelQMats, @@ -2152,7 +2064,7 @@ void TACSBladeStiffenedShellConstitutive:: As = this->computeStiffenerArea(); Ip = ps * tp3 / 12.0; Is = this->computeStiffenerIzz(); - zs = this->computeStiffenerCentroidHeight(); + zs = -this->computeStiffenerCentroidHeight(); Js = this->computeStiffenerJxx(); Jp = ps * tp3 / 12.0; @@ -2169,14 +2081,15 @@ void TACSBladeStiffenedShellConstitutive:: // --- 2-direction bending stiffness --- // TacsScalar D2Panel = (tp3 * QPanel[3]) / 12.0; - // TacsScalar D2Stiff = ((tp + 0.5 * ts) * (tp + 0.5 * ts) * (tp + 0.5 * ts) * + // TacsScalar D2Stiff = ((tp + 0.5 * ts) * (tp + 0.5 * ts) * (tp + 0.5 * ts) + // * // (QPanel[3] + QStiffener[3])) / // 6.0; // *D2 = ps / ((ps - hs * kf) / D2Panel + (hs * kf) / D2Stiff); // NOTE: I am ignoring the contribution of the stiffener flange to the // 2-direction bending stiffness so that the stiffness used for the buckling - // calculation is consistent with the stiffness matrix. Not sure whether this - // is a good idea or not. + // calculation is consistent with the stiffness matrix. Not sure whether + // this is a good idea or not. *D2 = tp3 / 12.0 * QPanel[3]; // --- Twisting stiffness --- @@ -2186,15 +2099,153 @@ void TACSBladeStiffenedShellConstitutive:: *D3 = (QPanel[5] * (Jp + Ap * zg * zg) + 0.25 * QStiffener[5] * (Js + As * (zg - zs) * (zg - zs))) / ps; +} - TacsScalar C[NUM_TANGENT_STIFFNESS_ENTRIES]; +TacsScalar +TACSBladeStiffenedShellConstitutive::evalGlobalPanelBucklingStrainSens( + const TacsScalar e[], TacsScalar sens[]) { + TacsScalar stiffness[NUM_TANGENT_STIFFNESS_ENTRIES], stress[NUM_STRESSES]; + this->computeStiffness(stiffness); + const TacsScalar *A, *B, *D, *As; + TacsScalar drill; + this->extractTangentStiffness(stiffness, &A, &B, &D, &As, &drill); + this->computeStress(A, B, D, As, drill, e, stress); + TacsScalar N1GlobalSens, N1CritGlobalSens, N12GlobalSens, N12CritGlobalSens; + TacsScalar D1, D2, D3; + this->computeCriticalGlobalBucklingStiffness(&D1, &D2, &D3); + const TacsScalar L = this->panelLength; + TacsScalar N1CritGlobal = computeCriticalGlobalAxialLoad(D1, L); + TacsScalar N12CritGlobal = this->computeCriticalShearLoad(D1, D2, D3, L); + + const TacsScalar strengthRatio = this->bucklingEnvelopeSens( + -stress[0], N1CritGlobal, stress[2], N12CritGlobal, &N1GlobalSens, + &N1CritGlobalSens, &N12GlobalSens, &N12CritGlobalSens); + + sens[0] += N1GlobalSens * -A[0] + N12GlobalSens * A[2]; + sens[1] += N1GlobalSens * -A[1] + N12GlobalSens * A[4]; + sens[2] += N1GlobalSens * -A[2] + N12GlobalSens * A[5]; + sens[3] += N1GlobalSens * -B[0] + N12GlobalSens * B[2]; + sens[4] += N1GlobalSens * -B[1] + N12GlobalSens * B[4]; + sens[5] += N1GlobalSens * -B[2] + N12GlobalSens * B[5]; + + return strengthRatio; +} + +void TACSBladeStiffenedShellConstitutive::addGlobalPanelBucklingDVSens( + int elemIndex, TacsScalar scale, const double pt[], const TacsScalar X[], + const TacsScalar strain[], int dvLen, TacsScalar dfdx[]) { + TacsScalar stress[NUM_STRESSES]; + this->evalStress(0, NULL, NULL, strain, stress); + TacsScalar dfdN1Global, dfdN12Global, dfdN1CritGlobal, dfdN12CritGlobal; + TacsScalar D1, D2, D3; + TacsScalar N1Crit, N12Crit; + this->computeCriticalGlobalBucklingStiffness(&D1, &D2, &D3); + const TacsScalar L = this->panelLength; + N1Crit = computeCriticalGlobalAxialLoad(D1, L); + N12Crit = this->computeCriticalShearLoad(D1, D2, D3, L); + + this->bucklingEnvelopeSens(-stress[0], N1Crit, stress[2], N12Crit, + &dfdN1Global, &dfdN1CritGlobal, &dfdN12Global, + &dfdN12CritGlobal); + + // Add the sensitivity of the buckling failure criteria due to the + // dependence of the applied loads on the DVs + TacsScalar dfdStress[NUM_STRESSES]; + memset(dfdStress, 0, NUM_STRESSES * sizeof(TacsScalar)); + dfdStress[0] = -dfdN1Global; + dfdStress[2] = dfdN12Global; + this->addStressDVSens(elemIndex, scale, pt, X, strain, dfdStress, dvLen, + dfdx); + + // Propogate the sensitivity of the buckling failure criteria w.r.t the + // critical loads back to the DVs + TacsScalar dfdD1, dfdD2, dfdD3, dfdPanelLength; + this->computeCriticalShearLoadSens(D1, D2, D3, L, &dfdD1, &dfdD2, &dfdD3, + &dfdPanelLength); + dfdD1 *= dfdN12CritGlobal; + dfdD2 *= dfdN12CritGlobal; + dfdD3 *= dfdN12CritGlobal; + dfdPanelLength *= dfdN12CritGlobal; + const TacsScalar N1CritGlobal = M_PI * M_PI * D1 / (L * L); + dfdD1 += dfdN1CritGlobal * N1CritGlobal / D1; + dfdPanelLength += dfdN1CritGlobal * -2.0 * N1CritGlobal / L; + + if (this->panelLengthNum >= 0) { + dfdx[this->panelLengthLocalNum] += scale * dfdPanelLength; + } + + TacsScalar globalBucklingspSens, globalBucklingtpSens, globalBucklinghsSens, + globalBucklingtsSens, globalBucklingQstiffSens[NUM_Q_ENTRIES], + globalBucklingQpanelSens[NUM_Q_ENTRIES]; + this->computeCriticalGlobalBucklingStiffnessSens( + dfdD1, dfdD2, dfdD3, &globalBucklingspSens, &globalBucklingtpSens, + &globalBucklinghsSens, &globalBucklingtsSens, globalBucklingQpanelSens, + globalBucklingQstiffSens); + + // --- Panel thickness sensitivity --- + if (this->panelThickNum >= 0) { + const int dvNum = this->panelThickLocalNum; + dfdx[dvNum] += scale * globalBucklingtpSens; + } + + // --- Stiffener height contribution --- + if (this->stiffenerHeightNum >= 0) { + const int dvNum = this->stiffenerHeightLocalNum; + // --- Global buckling contribution --- + dfdx[dvNum] += scale * globalBucklinghsSens; + } + + // --- Stiffener thickness contribution --- + if (this->stiffenerThickNum >= 0) { + const int dvNum = this->stiffenerThickLocalNum; + // --- Global buckling contribution --- + dfdx[dvNum] += scale * globalBucklingtsSens; + } + + // --- Panel Ply fraction sensitivities --- + for (int ii = 0; ii < this->numPanelPlies; ii++) { + if (this->panelPlyFracNums[ii] >= 0) { + const int dvNum = this->panelPlyFracLocalNums[ii]; + const TacsScalar* const Q = &(this->panelQMats[ii * NUM_Q_ENTRIES]); + + // --- Global buckling contribution --- + dfdx[dvNum] += scale * (globalBucklingQpanelSens[0] * Q[0] + + globalBucklingQpanelSens[1] * Q[1] + + globalBucklingQpanelSens[2] * Q[2] + + globalBucklingQpanelSens[3] * Q[3] + + globalBucklingQpanelSens[4] * Q[4] + + globalBucklingQpanelSens[5] * Q[5]); + } + } + + // --- Stiffener ply fraction contributions --- + for (int ii = 0; ii < this->numStiffenerPlies; ii++) { + if (this->stiffenerPlyFracNums[ii] >= 0) { + const int dvNum = this->stiffenerPlyFracLocalNums[ii]; + const TacsScalar* const Q = &(this->stiffenerQMats[ii * NUM_Q_ENTRIES]); + + // --- Global buckling contribution --- + dfdx[dvNum] += scale * (globalBucklingQstiffSens[0] * Q[0] + + globalBucklingQstiffSens[1] * Q[1] + + globalBucklingQstiffSens[2] * Q[2] + + globalBucklingQstiffSens[3] * Q[3] + + globalBucklingQstiffSens[4] * Q[4] + + globalBucklingQstiffSens[5] * Q[5]); + } + } + + // --- Stiffener pitch sensitivity --- + if (this->stiffenerPitchNum >= 0) { + dfdx[this->stiffenerPitchLocalNum] += scale * globalBucklingspSens; + } } void TACSBladeStiffenedShellConstitutive:: computeCriticalGlobalBucklingStiffnessSens( const TacsScalar dfdD1, const TacsScalar dfdD2, const TacsScalar dfdD3, - TacsScalar* psSens, TacsScalar* tpSens, TacsScalar* hsSens, - TacsScalar* tsSens, TacsScalar QpanelSens[], TacsScalar QstiffSens[]) { + TacsScalar* const psSens, TacsScalar* const tpSens, + TacsScalar* const hsSens, TacsScalar* const tsSens, + TacsScalar QpanelSens[], TacsScalar QstiffSens[]) { // Zero the sensitivities *tpSens = 0.0; *psSens = 0.0; @@ -2218,7 +2269,7 @@ void TACSBladeStiffenedShellConstitutive:: As = this->computeStiffenerArea(); Ip = ps * tp3 / 12.0; Is = this->computeStiffenerIzz(); - zs = this->computeStiffenerCentroidHeight(); + zs = -this->computeStiffenerCentroidHeight(); Js = this->computeStiffenerJxx(); Jp = ps * tp3 / 12.0; @@ -2234,8 +2285,8 @@ void TACSBladeStiffenedShellConstitutive:: TacsScalar zns2 = (zn - zs) * (zn - zs); TacsScalar pInv = 1.0 / ps; - // D1 = (E1p * (Ip + Ap * zn * zn) + E1s * (Is + As * (zn - zs) * (zn - zs))) - // / ps; + // D1 = (E1p * (Ip + Ap * zn * zn) + E1s * (Is + As * (zn - zs) * (zn - + // zs))) / ps; TacsScalar E1pSens = dfdD1 * ((Ap * zn2 + Ip) / ps); TacsScalar IpSens = dfdD1 * (E1p / ps); @@ -2352,14 +2403,20 @@ void TACSBladeStiffenedShellConstitutive:: *hsSens += IsSens * dIdh; // ZsSens - TacsScalar dZdt, dZdh, dzdtp; + TacsScalar dZdt, dZdh; this->computeStiffenerCentroidHeightSens(dZdt, dZdh); + dZdt *= -1; + dZdh *= -1; *tsSens += ZsSens * dZdt; *hsSens += ZsSens * dZdh; } void TACSBladeStiffenedShellConstitutive::testGlobalBucklingStiffnessSens() { - const TacsScalar eps = 1e-6; +#ifdef TACS_USE_COMPLEX + const double eps = 1e-200; +#else + const double eps = 1e-6; +#endif // Get the number of DVs int num_dvs = this->getDesignVars(0, 0, NULL); TacsScalar* DV0 = new TacsScalar[num_dvs]; @@ -2394,7 +2451,7 @@ void TACSBladeStiffenedShellConstitutive::testGlobalBucklingStiffnessSens() { TacsRealPart(psSens[2])); TacsScalar D1Pert, D2Pert, D3Pert; #ifdef TACS_USE_COMPLEX - DVPert[this->stiffenerPitchLocalNum] += TacsScalar(0.0, 1e-200); + DVPert[this->stiffenerPitchLocalNum] += TacsScalar(0.0, eps); #else DVPert[this->stiffenerPitchLocalNum] += eps; #endif @@ -2402,7 +2459,7 @@ void TACSBladeStiffenedShellConstitutive::testGlobalBucklingStiffnessSens() { this->computeCriticalGlobalBucklingStiffness(&D1Pert, &D2Pert, &D3Pert); #ifdef TACS_USE_COMPLEX - TacsScalar psSensFD = TacsImagPart(D1Pert) * 1e200; + TacsScalar psSensFD = TacsImagPart(D1Pert) / eps; #else TacsScalar psSensFD = (D1Pert - D1) / eps; #endif @@ -2414,7 +2471,7 @@ void TACSBladeStiffenedShellConstitutive::testGlobalBucklingStiffnessSens() { printf(" FD: D1sens = % 011.7e, ", TacsRealPart(psSensFD)); #ifdef TACS_USE_COMPLEX - psSensFD = TacsImagPart(D2Pert) * 1e200; + psSensFD = TacsImagPart(D2Pert) / eps; #else psSensFD = (D2Pert - D2) / eps; #endif @@ -2618,33 +2675,37 @@ void TACSBladeStiffenedShellConstitutive::testGlobalBucklingStiffnessSens() { delete[] DVPert; } -TacsScalar -TACSBladeStiffenedShellConstitutive::computeCriticalLocalAxialLoadSens( - const TacsScalar D11, const TacsScalar D22, const TacsScalar D12, - const TacsScalar D66, const TacsScalar L, TacsScalar* D11Sens, - TacsScalar* D22Sens, TacsScalar* D12Sens, TacsScalar* D66Sens, - TacsScalar* LSens) { - double pi2 = M_PI * M_PI; - TacsScalar L2 = L * L; - TacsScalar root = sqrt(D11 * D22); +TacsScalar TACSBladeStiffenedShellConstitutive::evalLocalPanelBuckling( + const TacsScalar e[]) { + // Compute panel stiffness matrix and loads + TacsScalar panelStiffness[NUM_TANGENT_STIFFNESS_ENTRIES], + stress[NUM_STRESSES]; + this->computePanelStiffness(panelStiffness); + const TacsScalar *A, *D; + this->extractTangentStiffness(panelStiffness, &A, NULL, &D, NULL, NULL); + this->computePanelStress(e, stress); - *D11Sens = pi2 * root / (D11 * L2); - *D12Sens = 2.0 * pi2 / L2; - *D22Sens = pi2 * root / (D22 * L2); - *D66Sens = 4.0 * pi2 / L2; - *LSens = 4.0 * pi2 * (-D12 - 2.0 * D66 - root) / (L2 * L); + // Compute the critical local loads + const TacsScalar D11 = D[0], D12 = D[1], D22 = D[3], D66 = D[5], + L = this->stiffenerPitch; + const TacsScalar N1Crit = + this->computeCriticalLocalAxialLoad(D11, D22, D12, D66, L); + const TacsScalar N12Crit = + this->computeCriticalShearLoad(D11, D22, D12 + 2.0 * D66, L); - return 2.0 * pi2 / L2 * (root + D12 + 2.0 * D66); + // Compute the buckling criteria + return this->bucklingEnvelope(-stress[0], N1Crit, stress[2], N12Crit); } TacsScalar TACSBladeStiffenedShellConstitutive::computeCriticalShearLoad( TacsScalar D1, TacsScalar D2, TacsScalar D3, TacsScalar L) { - double ks = 50.0; - TacsScalar xi = sqrt(D1 * D2) / D3; + constexpr double ks = 50.0; + const TacsScalar xi = sqrt(D1 * D2) / D3; - TacsScalar N12_crit_1 = + // NOTE: sqrt(D3 * D1 * xi) = (D1^3 * D2)^0.25 + const TacsScalar N12_crit_1 = (4.0 / (L * L)) * sqrt(D3 * D1 * xi) * (8.125 + 5.045 / xi); - TacsScalar N12_crit_2 = + const TacsScalar N12_crit_2 = (4.0 / (L * L)) * sqrt(D1 * D3) * (11.7 + 0.532 * xi + 0.938 * xi * xi); TacsScalar N12_min = 0.0; @@ -2654,57 +2715,203 @@ TacsScalar TACSBladeStiffenedShellConstitutive::computeCriticalShearLoad( N12_min = N12_crit_2; } - TacsScalar N12_diff = fabs(N12_crit_1 - N12_crit_2); - TacsScalar N12_crit = N12_min - log(1.0 + exp(-ks * N12_diff)) / ks; + const TacsScalar N12_diff = fabs(N12_crit_1 - N12_crit_2); + const TacsScalar N12_crit = N12_min - log(1.0 + exp(-ks * N12_diff)) / ks; return N12_crit; } +TacsScalar +TACSBladeStiffenedShellConstitutive::evalLocalPanelBucklingStrainSens( + const TacsScalar e[], TacsScalar sens[]) { + // Compute panel stiffness matrix and loads + TacsScalar panelStiffness[NUM_TANGENT_STIFFNESS_ENTRIES], + panelStress[NUM_STRESSES]; + this->computePanelStiffness(panelStiffness); + const TacsScalar *APanel, *DPanel; + this->extractTangentStiffness(panelStiffness, &APanel, NULL, &DPanel, NULL, + NULL); + this->computePanelStress(e, panelStress); + + // Compute the critical local loads (no need to compute their + // sensitivities because they're not dependent on the strain)) + TacsScalar N1CritLocal, N12CritLocal; + TacsScalar D11 = DPanel[0], D12 = DPanel[1], D22 = DPanel[3], D66 = DPanel[5], + L = this->stiffenerPitch; + N1CritLocal = this->computeCriticalLocalAxialLoad(D11, D22, D12, D66, L); + N12CritLocal = this->computeCriticalShearLoad(D11, D22, D12 + 2.0 * D66, L); + + // Compute the buckling criteria and it's sensitivities + TacsScalar N1LocalSens, N12LocalSens, N1CritLocalSens, N12CritLocalSens; + const TacsScalar strengthRatio = this->bucklingEnvelopeSens( + -panelStress[0], N1CritLocal, panelStress[2], N12CritLocal, &N1LocalSens, + &N1CritLocalSens, &N12LocalSens, &N12CritLocalSens); + + sens[0] = N1LocalSens * -APanel[0] + N12LocalSens * APanel[2]; + sens[1] = N1LocalSens * -APanel[1] + N12LocalSens * APanel[4]; + sens[2] = N1LocalSens * -APanel[2] + N12LocalSens * APanel[5]; + for (int ii = 3; ii < NUM_STRESSES; ii++) { + sens[ii] = 0.0; + } + + return strengthRatio; +} + +void TACSBladeStiffenedShellConstitutive::addLocalPanelBucklingDVSens( + int elemIndex, TacsScalar scale, const double pt[], const TacsScalar X[], + const TacsScalar strain[], int dvLen, TacsScalar dfdx[]) { + // Compute panel stiffness matrix and loads + TacsScalar panelStiffness[NUM_TANGENT_STIFFNESS_ENTRIES], + panelStress[NUM_STRESSES]; + const TacsScalar t = this->panelThick; + this->computePanelStiffness(panelStiffness); + const TacsScalar *A, *D; + this->extractTangentStiffness(panelStiffness, &A, NULL, &D, NULL, NULL); + this->computePanelStress(strain, panelStress); + + // Compute the critical local loads and their sensitivities + TacsScalar N1Crit, N12Crit; + const TacsScalar D11 = D[0], D12 = D[1], D22 = D[3], D66 = D[5], + L = this->stiffenerPitch; + + // Create arrays for the sensitivities of the critical loads: + // [dN/dD11, dNdD22, dNdD12, dNdD66, dNdL] + TacsScalar N1CritSens[5], N12CritSens[5]; + N1Crit = this->computeCriticalLocalAxialLoadSens( + D11, D22, D12, D66, L, &N1CritSens[0], &N1CritSens[1], &N1CritSens[2], + &N1CritSens[3], &N1CritSens[4]); + N12Crit = this->computeCriticalShearLoadSens( + D11, D22, D12 + 2.0 * D66, L, &N12CritSens[0], &N12CritSens[1], + &N12CritSens[2], &N12CritSens[4]); + + // N12CritSens[2] is currently dN12Crit/d(D12 + 2D66) + N12CritSens[3] = 2.0 * N12CritSens[2]; + + // Compute the buckling criteria and it's sensitivities to the applied and + // critical loads + TacsScalar dfdN1Local, dfdN12Local, dfdN1CritLocal, dfdN12CritLocal; + this->bucklingEnvelopeSens(-panelStress[0], N1Crit, panelStress[2], N12Crit, + &dfdN1Local, &dfdN1CritLocal, &dfdN12Local, + &dfdN12CritLocal); + // Convert sensitivity w.r.t applied loads into sensitivity w.r.t DVs + TacsScalar dfdPanelStress[NUM_STRESSES]; + memset(dfdPanelStress, 0, NUM_STRESSES * sizeof(TacsScalar)); + dfdPanelStress[0] = -dfdN1Local; + dfdPanelStress[2] = dfdN12Local; + this->addPanelStressDVSens(scale, strain, dfdPanelStress, + &dfdx[this->panelDVStartNum]); + + // Convert the sensitivities of the critical loads w.r.t the D matrix + // entries to sensitivities of the buckling failure criteria w.r.t the D + // matrix entries + TacsScalar localBucklingDMatSens[4]; + for (int ii = 0; ii < 4; ii++) { + localBucklingDMatSens[ii] = + N1CritSens[ii] * dfdN1CritLocal + N12CritSens[ii] * dfdN12CritLocal; + } + + // --- Panel thickness sensitivity --- + if (this->panelThickNum >= 0) { + const int dvNum = this->panelThickLocalNum; + // --- Local buckling contribution --- + const TacsScalar dMatdt = 0.25 * t * t; // d/dt(t^3/12) = t^2/4 + for (int ii = 0; ii < this->numPanelPlies; ii++) { + TacsScalar* Q = &(this->panelQMats[ii * NUM_Q_ENTRIES]); + dfdx[dvNum] += + scale * dMatdt * this->panelPlyFracs[ii] * + (localBucklingDMatSens[0] * Q[0] + localBucklingDMatSens[1] * Q[3] + + localBucklingDMatSens[2] * Q[1] + localBucklingDMatSens[3] * Q[5]); + } + } + + // --- Panel Ply fraction sensitivities --- + for (int ii = 0; ii < this->numPanelPlies; ii++) { + if (this->panelPlyFracNums[ii] >= 0) { + const int dvNum = this->panelPlyFracLocalNums[ii]; + // --- Local buckling contribution --- + const TacsScalar DFactor = t * t * t / 12.0; + const TacsScalar* const Q = &(this->panelQMats[ii * NUM_Q_ENTRIES]); + // Do df/dx += df/dD11 * dD11/dx + df/dD22 * dD22/dx + df/dD12 * dD12/dx + // + df/dD66 * dD66/dx + dfdx[dvNum] += + scale * DFactor * + (localBucklingDMatSens[0] * Q[0] + localBucklingDMatSens[1] * Q[3] + + localBucklingDMatSens[2] * Q[1] + localBucklingDMatSens[3] * Q[5]); + } + } + + // --- Stiffener pitch sensitivity --- + if (this->stiffenerPitchNum >= 0) { + dfdx[this->stiffenerPitchLocalNum] += + scale * + (N12CritSens[4] * dfdN12CritLocal + N1CritSens[4] * dfdN1CritLocal); + } +} + +TacsScalar +TACSBladeStiffenedShellConstitutive::computeCriticalLocalAxialLoadSens( + const TacsScalar D11, const TacsScalar D22, const TacsScalar D12, + const TacsScalar D66, const TacsScalar L, TacsScalar* const D11Sens, + TacsScalar* const D22Sens, TacsScalar* const D12Sens, + TacsScalar* const D66Sens, TacsScalar* const LSens) { + const double pi2 = M_PI * M_PI; + const TacsScalar L2 = L * L; + const TacsScalar root = sqrt(D11 * D22); + + *D11Sens = pi2 * root / (D11 * L2); + *D12Sens = 2.0 * pi2 / L2; + *D22Sens = pi2 * root / (D22 * L2); + *D66Sens = 4.0 * pi2 / L2; + *LSens = 4.0 * pi2 * (-D12 - 2.0 * D66 - root) / (L2 * L); + + return 2.0 * pi2 / L2 * (root + D12 + 2.0 * D66); +} + TacsScalar TACSBladeStiffenedShellConstitutive::computeCriticalShearLoadSens( const TacsScalar D1, const TacsScalar D2, const TacsScalar D3, - const TacsScalar L, TacsScalar* D1Sens, TacsScalar* D2Sens, - TacsScalar* D3Sens, TacsScalar* LSens) { - TacsScalar L2 = L * L; - TacsScalar L3 = L2 * L; - TacsScalar D32 = D3 * D3; - TacsScalar root = sqrt(D1 * D2); - TacsScalar xi = root / D3; + const TacsScalar L, TacsScalar* const D1Sens, TacsScalar* const D2Sens, + TacsScalar* const D3Sens, TacsScalar* const LSens) { + const TacsScalar L2 = L * L; + const TacsScalar L3 = L2 * L; + const TacsScalar D32 = D3 * D3; + const TacsScalar root = sqrt(D1 * D2); + const TacsScalar xi = root / D3; TacsScalar N12CritVals[2]; N12CritVals[0] = -(4.0 / L2) * sqrt(D3 * D1 * xi) * (8.125 + 5.045 / xi); N12CritVals[1] = -(4.0 / L2) * sqrt(D1 * D3) * (11.7 + 0.532 * xi + 0.938 * xi * xi); - TacsScalar N12Crit, N12CritSens[2]; - N12Crit = ksAggregationSens(N12CritVals, 2, 50., N12CritSens); - N12Crit *= -1.0; + TacsScalar N12CritSens[2]; + const TacsScalar N12Crit = + -ksAggregationSens(N12CritVals, 2, 50., N12CritSens); - TacsScalar dN12Crit1_dD1 = + const TacsScalar dN12Crit1_dD1 = sqrt(D1 * root) * (5.045 * D3 + 24.375 * root) / (D1 * L2 * root); - TacsScalar dN12Crit2_dD1 = + const TacsScalar dN12Crit2_dD1 = sqrt(D1 * D3) * (5.628 * D1 * D2 + 23.4 * D32 + 2.128 * D3 * root) / (D1 * D32 * L2); *D1Sens = dN12Crit1_dD1 * N12CritSens[0] + dN12Crit2_dD1 * N12CritSens[1]; - TacsScalar dN12Crit1_dD2 = + const TacsScalar dN12Crit1_dD2 = sqrt(D1 * root) * (-5.045 * D3 + 8.125 * root) / (D2 * L2 * root); - TacsScalar dN12Crit2_dD2 = + const TacsScalar dN12Crit2_dD2 = sqrt(D1 * D3) * (3.752 * D1 * D2 + 1.064 * D3 * root) / (D2 * D32 * L2); *D2Sens = dN12Crit1_dD2 * N12CritSens[0] + dN12Crit2_dD2 * N12CritSens[1]; - TacsScalar dN12Crit1_dD3 = 20.18 * sqrt(D1 * root) / (L2 * root); - TacsScalar dN12Crit2_dD3 = + const TacsScalar dN12Crit1_dD3 = 20.18 * sqrt(D1 * root) / (L2 * root); + const TacsScalar dN12Crit2_dD3 = sqrt(D1 * D3) * (-5.628 * D1 * D2 + 23.4 * D32 - 1.064 * D3 * root) / (D32 * D3 * L2); *D3Sens = dN12Crit1_dD3 * N12CritSens[0] + dN12Crit2_dD3 * N12CritSens[1]; - TacsScalar dN12Crit1_dL = + const TacsScalar dN12Crit1_dL = sqrt(D1 * root) * (-40.36 * D3 - 65.0 * root) / (L3 * root); - TacsScalar dN12Crit2_dL = + const TacsScalar dN12Crit2_dL = sqrt(D1 * D3) * (-7.504 * D1 * D2 - 93.6 * D32 - 4.256 * D3 * root) / (D32 * L3); @@ -2765,7 +2972,8 @@ bool TACSBladeStiffenedShellConstitutive::testCriticalShearLoadSens( " LSens = % 011.7e | LSensFD = % 011.7e | LSensRelError = % 011.7e\n", TacsRealPart(LSens), TacsRealPart(LSensFD), TacsRealPart(LSensRelError)); printf( - "------------------------------------------------------------------------" + "----------------------------------------------------------------------" + "--" "\n"); return fabs(TacsRealPart(D1SensRelError)) < tol && @@ -2777,20 +2985,21 @@ bool TACSBladeStiffenedShellConstitutive::testCriticalShearLoadSens( TacsScalar TACSBladeStiffenedShellConstitutive::bucklingEnvelope( const TacsScalar N1, const TacsScalar N1Crit, const TacsScalar N12, const TacsScalar N12Crit) { - TacsScalar N1Term = N1 / N1Crit; - TacsScalar N12Term = N12 / N12Crit; - TacsScalar root = sqrt(N1Term * N1Term + 4.0 * N12Term * N12Term); + const TacsScalar N1Term = N1 / N1Crit; + const TacsScalar N12Term = N12 / N12Crit; + const TacsScalar root = sqrt(N1Term * N1Term + 4.0 * N12Term * N12Term); return 0.5 * (N1Term + root); } -// Compute the sensitivity of the buckling failure criterion w.r.t the loads and -// critical loads +// Compute the sensitivity of the buckling failure criterion w.r.t the loads +// and critical loads TacsScalar TACSBladeStiffenedShellConstitutive::bucklingEnvelopeSens( const TacsScalar N1, const TacsScalar N1Crit, const TacsScalar N12, - const TacsScalar N12Crit, TacsScalar* dfdN1, TacsScalar* dfdN1Crit, - TacsScalar* dfdN12, TacsScalar* dfdN12Crit) { - TacsScalar N1Term = N1 / N1Crit; - TacsScalar N12Term = N12 / N12Crit; + const TacsScalar N12Crit, TacsScalar* const dfdN1, + TacsScalar* const dfdN1Crit, TacsScalar* const dfdN12, + TacsScalar* const dfdN12Crit) { + const TacsScalar N1Term = N1 / N1Crit; + const TacsScalar N12Term = N12 / N12Crit; TacsScalar root = sqrt(N1Term * N1Term + 4.0 * N12Term * N12Term); if (TacsRealPart(root) == 0.0) { root = 1e-13; @@ -2846,7 +3055,8 @@ bool TACSBladeStiffenedShellConstitutive::testBucklingEnvelopeSens( printf("testBucklingEnvelopeSens results:"); printf( - "N1 = % 011.7e, N1Crit = % 011.7e, N12 = % 011.7e, N12Crit = % 011.7e\n", + "N1 = % 011.7e, N1Crit = % 011.7e, N12 = % 011.7e, N12Crit = % " + "011.7e\n", TacsRealPart(N1), TacsRealPart(N1Crit), TacsRealPart(N12), TacsRealPart(N12Crit)); printf("f: % 011.7e\n", f); @@ -2867,6 +3077,551 @@ bool TACSBladeStiffenedShellConstitutive::testBucklingEnvelopeSens( fabs(dfdN12RelError) < tol && fabs(dfdN12CritRelError) < tol); } +TacsScalar TACSBladeStiffenedShellConstitutive::evalStiffenerColumnBuckling( + const TacsScalar stiffenerStrain[]) { + TacsScalar stiffenerStress[TACSBeamConstitutive::NUM_STRESSES]; + this->computeStiffenerStress(stiffenerStrain, stiffenerStress); + // The first component of the stiffener stress is the axial force + TacsScalar fCrit = this->computeStiffenerColumnBucklingLoad(); + return -stiffenerStress[0] / fCrit; +} + +TacsScalar +TACSBladeStiffenedShellConstitutive::computeStiffenerColumnBucklingLoad() { + TacsScalar E, G; + this->computeEffectiveModulii(this->numStiffenerPlies, this->stiffenerQMats, + this->stiffenerPlyFracs, &E, &G); + const TacsScalar Izz = this->computeStiffenerIzz(); + const TacsScalar fCrit = + this->computeColumnBucklingLoad(E, Izz, this->panelLength); + return fCrit; +} + +void TACSBladeStiffenedShellConstitutive::addStiffenerColumnBucklingLoadDVSens( + const TacsScalar scale, TacsScalar dfdx[]) { + // First compute the sensitivity of the critical load to the E, I and L + // values of the stiffener + TacsScalar E, G; + this->computeEffectiveModulii(this->numStiffenerPlies, this->stiffenerQMats, + this->stiffenerPlyFracs, &E, &G); + const TacsScalar Izz = this->computeStiffenerIzz(); + TacsScalar dFdE, dFdI, dFdL; + this->computeColumnBucklingLoadSens(E, Izz, this->panelLength, dFdE, dFdI, + dFdL); + + // Now convert those sensitivities into sensitivities with respect to the + // DVs Beam length contributions (only relevant DV is panel length) + if (this->panelLengthNum >= 0) { + dfdx[this->panelLengthLocalNum] += scale * dFdL; + } + + // Moment of inertia contributions (only relevant DVs are stiffener height + // and thickness) + TacsScalar dIzzdt, dIzzdh; + this->computeStiffenerIzzSens(dIzzdt, dIzzdh); + if (this->stiffenerHeightNum >= 0) { + dfdx[this->stiffenerHeightLocalNum] += scale * dFdI * dIzzdh; + } + if (this->stiffenerThickNum >= 0) { + dfdx[this->stiffenerThickLocalNum] += scale * dFdI * dIzzdt; + } + + // Young's modulus contributions (only relevant DVs are stiffener ply + // fractions) + for (int ii = 0; ii < this->numStiffenerPlies; ii++) { + if (this->stiffenerPlyFracNums[ii] >= 0) { + const int index = this->stiffenerPlyFracLocalNums[ii]; + + const TacsScalar* const Q = &(this->stiffenerQMats[ii * NUM_Q_ENTRIES]); + + const TacsScalar dEdx = Q[0] - (Q[1] * Q[1]) / Q[3]; + dfdx[index] += scale * dFdE * dEdx; + } + } +} + +TacsScalar TACSBladeStiffenedShellConstitutive::computeColumnBucklingLoad( + const TacsScalar E, const TacsScalar I, const TacsScalar L) { + return M_PI * M_PI * E * I / (L * L); +} + +TacsScalar TACSBladeStiffenedShellConstitutive::computeColumnBucklingLoadSens( + const TacsScalar E, const TacsScalar I, const TacsScalar L, + TacsScalar& dFdE, TacsScalar& dFdI, TacsScalar& dFdL) { + const double pi2 = M_PI * M_PI; + const TacsScalar L2inv = 1.0 / (L * L); + const TacsScalar F = pi2 * E * I * L2inv; + dFdE = pi2 * I * L2inv; + dFdI = pi2 * E * L2inv; + dFdL = -2.0 * F / L; + return F; +} + +TacsScalar +TACSBladeStiffenedShellConstitutive::evalStiffenerColumnBucklingStrainSens( + const TacsScalar stiffenerStrain[], TacsScalar sens[]) { + const int numStiff = TACSBeamConstitutive::NUM_TANGENT_STIFFNESS_ENTRIES; + TacsScalar C[numStiff]; + this->computeStiffenerStiffness(C); + const int numStress = TACSBeamConstitutive::NUM_STRESSES; + TacsScalar stiffenerStress[numStress]; + TACSBeamConstitutive::computeStress(C, stiffenerStrain, stiffenerStress); + + const TacsScalar stiffenerAxialLoad = -stiffenerStress[0]; + const TacsScalar fCrit = this->computeStiffenerColumnBucklingLoad(); + memset(sens, 0, numStress * sizeof(TacsScalar)); + + for (int ii = 0; ii < numStress; ii++) { + sens[ii] = -C[ii] / fCrit; + } + return stiffenerAxialLoad / fCrit; +} + +void TACSBladeStiffenedShellConstitutive::addStiffenerColumnBucklingDVSens( + const TacsScalar scale, const TacsScalar shellStrain[], + const TacsScalar stiffenerStrain[], const TacsScalar stiffenerAxialLoad, + const TacsScalar fCrit, TacsScalar dfdx[]) { + // F = stiffenerAxialLoad / fCrit + // Using the Quotient rule: + // dF/dx = 1/fCrit * dS11/dx - stiffenerAxialLoad/fCrit^2 * dfCrit/dx + + // First we add the 1/fCrit * dS11/dx term + // We need to consider both the direct dependence of the stiffener stress on + // the DVs, and also the dependence of the stiffener stress on the stiffener + // centroid strains, which depend on the DVS: + // psi^T dS/dx = psi^T pS/px + psi^T pS/pe * dstiffenerStrain/dx + // = psi^T pS/px + C * psi * d/dx(Te) * shellStrain + TacsScalar psi[TACSBeamConstitutive::NUM_STRESSES]; + memset(psi, 0, TACSBeamConstitutive::NUM_STRESSES * sizeof(TacsScalar)); + psi[0] = 1.0; + this->addStiffenerStressDVSens(-scale / fCrit, stiffenerStrain, psi, + &dfdx[this->stiffenerDVStartNum]); + + TacsScalar psiStress[TACSBeamConstitutive::NUM_STRESSES]; + this->computeStiffenerStress(psi, psiStress); + this->addStrainTransformProductDVsens(psiStress, shellStrain, -scale / fCrit, + dfdx); + + // Now we add the - stiffenerAxialLoad/fCrit^2 * dfCrit/dx term + this->addStiffenerColumnBucklingLoadDVSens( + -scale * stiffenerAxialLoad / (fCrit * fCrit), dfdx); +} + +void TACSBladeStiffenedShellConstitutive::computeStiffenerCripplingValues( + const TacsScalar stiffenerStrain[], TacsScalar plyFailValues[]) { + // We use the semi-empirical formula for one-edge-free crippling described + // in the DoD composite materials handbook Volume 3F (a.k.a MIL-HDBK-17-3F) + // (available at + // http://everyspec.com/MIL-HDBK/MIL-HDBK-0001-0099/MIL_HDBK_17_3F_216/) + // + // The formula is: F_crippling / F_ult = 1.63*(b/t)^-0.717 + // Where: + // F_crippling is the crippling load + // F_ult is the ultimate compressive load + // b is the flange width + // t is the flange thickness + // + // Here we compute the ultimate compressive load using the same criteria + // used to compute the stiffener material failure value but using only the + // axial strain component. This gives: SR_Crippling = SR_comp/1.63 * + // (b/t)^0.717 Where SR_Crippling is the crippling strength ratio SR_comp is + // the strength ratio computed using only the compressive component of the + // strain + + const int numPlies = this->numStiffenerPlies; + TacsScalar* const plyAngles = this->stiffenerPlyAngles; + memset(plyFailValues, 0, 2 * numPlies * sizeof(TacsScalar)); + + // We compute the crippling criteria for both the web and + // the flange of the stiffener. + TACSOrthotropicPly* ply = this->stiffenerPly; + TacsScalar zCentroid = -this->computeStiffenerCentroidHeight(); + TacsScalar zFlange = -0.5 * this->stiffenerThick - zCentroid; + + TacsScalar flangeCrippleFactor = computeCripplingFactor( + 0.5 * this->flangeFraction * this->stiffenerHeight, this->stiffenerThick); + + TacsScalar plyStrain[3]; + memset(plyStrain, 0, 3 * sizeof(TacsScalar)); + plyStrain[0] = stiffenerStrain[0] + zFlange * stiffenerStrain[2]; + + if (TacsRealPart(plyStrain[0]) < 0.0) { + for (int ii = 0; ii < numPlies; ii++) { + plyFailValues[ii] = + ply->failure(plyAngles[ii], plyStrain) * flangeCrippleFactor; + } + } + + // For the stiffener web, we will use the method described by Kassapoglou to + // account for the variation in tension/compression over the height of the + // web. (See section 8.5.3 of Kassapoglou's "Design and Analysis of + // Composite Structures with Applications to Aerospace Structures"). + const TacsScalar zWebTop = + -(this->stiffenerHeight + this->stiffenerThick) - zCentroid; + const TacsScalar zWebBottom = -this->stiffenerThick - zCentroid; + const TacsScalar axStrainTop = + stiffenerStrain[0] + zWebTop * stiffenerStrain[2]; + const TacsScalar axStrainBottom = + stiffenerStrain[0] + zWebBottom * stiffenerStrain[2]; + + // There are 3 cases we have to consider: + // 1. Both strains are tensile + // 2. Both strains are compressive + // 3. One strain is tensile and the other is compressive + // + // In case 1 the strength ratio is simply zero as there can be no crippling. + // In case 2 we compute the crippling strength ratio as usual using the + // average of the two strains and the full height of the stiffener as the b + // value + // In cases 3 we compute the crippling strength ratio considering that + // only the portion of the web that is in compression can cripplie, we + // therefore use the length of that region as b and the average strain in + // that region as the strain value. + + // In theory, the point at which the strain changes sign can be treated as a + // simple support, therefore we should either treat the web as a + // one-edge-free or no-edge-free flange depending whether it is the top or + // bottom of the web that is in compression. However, this would lead to a + // discontinuity in the strength ratio, so we use the one-edge-free formula + // for both cases. + if (TacsRealPart(axStrainTop) < 0.0 || TacsRealPart(axStrainBottom) < 0.0) { + TacsScalar compressiveLength = 0.0, averageStrain = 0.0, + webCrippleFactor = 0.0; + if (TacsRealPart(axStrainTop) < 0 && TacsRealPart(axStrainBottom) < 0) { + // --- Case 2 --- + compressiveLength = this->stiffenerHeight; + averageStrain = 0.5 * (axStrainTop + axStrainBottom); + } else if (TacsRealPart(axStrainTop) < 0 && + TacsRealPart(axStrainBottom) >= 0) { + // --- Case 3 top in compression --- + compressiveLength = + this->stiffenerHeight * axStrainTop / (axStrainTop - axStrainBottom); + averageStrain = 0.5 * axStrainTop; + } else if (TacsRealPart(axStrainTop) >= 0 && + TacsRealPart(axStrainBottom) < 0) { + // --- Case 3 bottom in compression --- + compressiveLength = this->stiffenerHeight * axStrainBottom / + (axStrainBottom - axStrainTop); + averageStrain = 0.5 * axStrainBottom; + } + + webCrippleFactor = + computeCripplingFactor(compressiveLength, this->stiffenerThick); + + plyStrain[0] = averageStrain; + for (int ii = 0; ii < numPlies; ii++) { + plyFailValues[ii + numPlies] = + ply->failure(plyAngles[ii], plyStrain) * webCrippleFactor; + } + } +} + +TacsScalar TACSBladeStiffenedShellConstitutive::evalStiffenerCrippling( + const TacsScalar stiffenerStrain[]) { + const int numPlies = this->numStiffenerPlies; + this->computeStiffenerCripplingValues(stiffenerStrain, + this->stiffenerPlyFailValues); + TacsScalar fail = + ksAggregation(this->stiffenerPlyFailValues, 2 * numPlies, this->ksWeight); + + return fail; +} + +TacsScalar +TACSBladeStiffenedShellConstitutive::evalStiffenerCripplingStrainSens( + const TacsScalar stiffenerStrain[], TacsScalar sens[]) { + const int numPlies = this->numStiffenerPlies; + const int numStrain = TACSBeamConstitutive::NUM_STRESSES; + TacsScalar* const plyFailValues = this->stiffenerPlyFailValues; + TacsScalar** const dFaildStrain = this->stiffenerPlyFailStrainSens; + TacsScalar* const plyAngles = this->stiffenerPlyAngles; + memset(plyFailValues, 0, 2 * numPlies * sizeof(TacsScalar)); + memset(sens, 0, numStrain * sizeof(TacsScalar)); + + for (int ii = 0; ii < 2 * numPlies; ii++) { + memset(dFaildStrain[ii], 0, numStrain * sizeof(TacsScalar)); + } + + // We compute the crippling criteria for both the web and + // the flange of the stiffener. + + // --- Flange crippling --- + TACSOrthotropicPly* ply = this->stiffenerPly; + TacsScalar zCentroid = -this->computeStiffenerCentroidHeight(); + TacsScalar zFlange = -0.5 * this->stiffenerThick - zCentroid; + + TacsScalar flangeCrippleFactor = computeCripplingFactor( + 0.5 * this->flangeFraction * this->stiffenerHeight, this->stiffenerThick); + + TacsScalar plyStrain[3]; + memset(plyStrain, 0, 3 * sizeof(TacsScalar)); + plyStrain[0] = stiffenerStrain[0] + zFlange * stiffenerStrain[2]; + + if (TacsRealPart(plyStrain[0]) < 0.0) { + for (int ii = 0; ii < numPlies; ii++) { + TacsScalar plyFailStrainSens[3]; + plyFailValues[ii] = + ply->failureStrainSens(plyAngles[ii], plyStrain, plyFailStrainSens) * + flangeCrippleFactor; + // Convert the sensitivity w.r.t the ply strains to the sensitivity + // w.r.t beam strains + dFaildStrain[ii][0] = flangeCrippleFactor * plyFailStrainSens[0]; + dFaildStrain[ii][2] = + flangeCrippleFactor * zFlange * plyFailStrainSens[0]; + } + } + + // --- Web crippling --- + TacsScalar zWebTop = + -(this->stiffenerHeight + this->stiffenerThick) - zCentroid; + TacsScalar zWebBottom = -this->stiffenerThick - zCentroid; + TacsScalar axStrainTop = stiffenerStrain[0] + zWebTop * stiffenerStrain[2]; + TacsScalar axStrainBottom = + stiffenerStrain[0] + zWebBottom * stiffenerStrain[2]; + + if (TacsRealPart(axStrainTop) < 0.0 || TacsRealPart(axStrainBottom) < 0.0) { + TacsScalar compressiveLength = 0.0, averageStrain = 0.0, + webCrippleFactor = 0.0; + TacsScalar averageStrainSens[2] = {0.0, 0.0}; + TacsScalar lengthStrainSens[2] = {0.0, 0.0}; + if (TacsRealPart(axStrainTop) < 0 && TacsRealPart(axStrainBottom) < 0) { + // --- Case 2 --- + compressiveLength = this->stiffenerHeight; + averageStrain = 0.5 * (axStrainTop + axStrainBottom); + averageStrainSens[0] = 0.5; + averageStrainSens[1] = 0.5; + } else if (TacsRealPart(axStrainTop) < 0 && + TacsRealPart(axStrainBottom) >= 0) { + // --- Case 3 top in compression --- + const TacsScalar strainDiff = axStrainTop - axStrainBottom; + compressiveLength = this->stiffenerHeight * axStrainTop / strainDiff; + lengthStrainSens[0] = + -this->stiffenerHeight * axStrainBottom / (strainDiff * strainDiff); + lengthStrainSens[1] = + this->stiffenerHeight * axStrainTop / (strainDiff * strainDiff); + + averageStrain = 0.5 * axStrainTop; + averageStrainSens[0] = 0.5; + } else if (TacsRealPart(axStrainTop) >= 0 && + TacsRealPart(axStrainBottom) < 0) { + // --- Case 3 bottom in compression --- + const TacsScalar strainDiff = axStrainBottom - axStrainTop; + compressiveLength = this->stiffenerHeight * axStrainBottom / strainDiff; + lengthStrainSens[0] = + this->stiffenerHeight * axStrainBottom / (strainDiff * strainDiff); + lengthStrainSens[1] = + -this->stiffenerHeight * axStrainTop / (strainDiff * strainDiff); + + averageStrain = 0.5 * axStrainBottom; + averageStrainSens[1] = 0.5; + } + + TacsScalar dFactordL, dFactordt; + webCrippleFactor = computeCripplingFactorSens( + compressiveLength, this->stiffenerThick, dFactordL, dFactordt); + + plyStrain[0] = averageStrain; + for (int ii = 0; ii < numPlies; ii++) { + TacsScalar plyFailStrainSens[3]; + const TacsScalar strengthRatio = + ply->failureStrainSens(plyAngles[ii], plyStrain, plyFailStrainSens); + plyFailValues[ii + numPlies] = strengthRatio * webCrippleFactor; + + // Convert sensitivity w.r.t the average strain to sensitivity w.r.t + // the top and bottom strains + TacsScalar topStrainSens = + strengthRatio * dFactordL * lengthStrainSens[0] + + webCrippleFactor * plyFailStrainSens[0] * averageStrainSens[0]; + + TacsScalar bottomStrainSens = + strengthRatio * dFactordL * lengthStrainSens[1] + + webCrippleFactor * plyFailStrainSens[0] * averageStrainSens[1]; + + // Convert the sensitivity w.r.t the top and bottom strains to the + // sensitivity w.r.t beam strains + dFaildStrain[ii + numPlies][0] = topStrainSens + bottomStrainSens; + dFaildStrain[ii + numPlies][2] = + zWebTop * topStrainSens + zWebBottom * bottomStrainSens; + } + } + + TacsScalar fail = + ksAggregationSensProduct(plyFailValues, 2 * numPlies, numStrain, + this->ksWeight, dFaildStrain, sens); + + return fail; +} + +void TACSBladeStiffenedShellConstitutive::addStiffenerCripplingDVSens( + const TacsScalar scale, const TacsScalar stiffenerStrain[], + TacsScalar dfdx[]) { + TACSOrthotropicPly* ply = this->stiffenerPly; + TacsScalar* plyFailValues = this->stiffenerPlyFailValues; + const TacsScalar* plyAngles = this->stiffenerPlyAngles; + TacsScalar* dKSdFail = this->stiffenerPlyFailSens; + const int hNum = this->stiffenerHeightLocalNum - this->stiffenerDVStartNum; + const int tNum = this->stiffenerThickLocalNum - this->stiffenerDVStartNum; + const int numPlies = this->numStiffenerPlies; + const bool computeThicknessSens = (this->stiffenerThickNum >= 0); + const bool computeHeightSens = (this->stiffenerHeightNum >= 0); + + this->computeStiffenerCripplingValues(stiffenerStrain, plyFailValues); + + ksAggregationSens(plyFailValues, 2 * numPlies, this->ksWeight, dKSdFail); + + // --- Flange crippling --- + TacsScalar dzCentroiddh, dzCentroiddt; + TacsScalar zCentroid = -this->computeStiffenerCentroidHeight(); + this->computeStiffenerCentroidHeightSens(dzCentroiddt, dzCentroiddh); + dzCentroiddt *= -1; + dzCentroiddh *= -1; + TacsScalar zFlange = -0.5 * this->stiffenerThick - zCentroid; + const TacsScalar dzFlangedt = -0.5 - dzCentroiddt; + const TacsScalar dzFlangedh = -dzCentroiddh; + + TacsScalar dFactordh, dFactordt; + TacsScalar flangeCrippleFactor = computeCripplingFactorSens( + 0.5 * this->flangeFraction * this->stiffenerHeight, this->stiffenerThick, + dFactordh, dFactordt); + dFactordh *= 0.5 * this->flangeFraction; + + TacsScalar plyStrain[3]; + memset(plyStrain, 0, 3 * sizeof(TacsScalar)); + plyStrain[0] = stiffenerStrain[0] + zFlange * stiffenerStrain[2]; + if (TacsRealPart(plyStrain[0]) < 0.0) { + for (int ii = 0; ii < numPlies; ii++) { + TacsScalar plyFailStrainSens[3]; + const TacsScalar strengthRatio = + ply->failureStrainSens(plyAngles[ii], plyStrain, plyFailStrainSens); + if (computeThicknessSens) { + dfdx[tNum] += dKSdFail[ii] * scale * + (strengthRatio * dFactordt + + plyFailStrainSens[0] * dzFlangedt * stiffenerStrain[2] * + flangeCrippleFactor); + } + if (computeHeightSens) { + dfdx[hNum] += dKSdFail[ii] * scale * + (strengthRatio * dFactordh + + plyFailStrainSens[0] * dzFlangedh * stiffenerStrain[2] * + flangeCrippleFactor); + } + } + } + + // --- Flange crippling --- + const TacsScalar zWebTop = + -(this->stiffenerHeight + this->stiffenerThick) - zCentroid; + const TacsScalar dzWebTopdh = -1.0 - dzCentroiddh; + const TacsScalar dzWebTopdt = -1.0 - dzCentroiddt; + + const TacsScalar zWebBottom = -this->stiffenerThick - zCentroid; + const TacsScalar dzWebBottomdt = -1.0 - dzCentroiddt; + const TacsScalar dzWebBottomdh = -dzCentroiddh; + + const TacsScalar axStrainTop = + stiffenerStrain[0] + zWebTop * stiffenerStrain[2]; + const TacsScalar dStrainTopdh = stiffenerStrain[2] * dzWebTopdh; + const TacsScalar dStrainTopdt = stiffenerStrain[2] * dzWebTopdt; + + const TacsScalar axStrainBottom = + stiffenerStrain[0] + zWebBottom * stiffenerStrain[2]; + const TacsScalar dStrainBottomdh = stiffenerStrain[2] * dzWebBottomdh; + const TacsScalar dStrainBottomdt = stiffenerStrain[2] * dzWebBottomdt; + + if (TacsRealPart(axStrainTop) < 0.0 || TacsRealPart(axStrainBottom) < 0.0) { + TacsScalar compressiveLength = 0.0, averageStrain = 0.0, + webCrippleFactor = 0.0; + TacsScalar dAverageStraindh = 0.0; + TacsScalar dAverageStraindt = 0.0; + TacsScalar dLdh = 0.0; + TacsScalar dLdt = 0.0; + if (TacsRealPart(axStrainTop) < 0 && TacsRealPart(axStrainBottom) < 0) { + // --- Case 2 --- + compressiveLength = this->stiffenerHeight; + dLdh = 1.0; + + averageStrain = 0.5 * (axStrainTop + axStrainBottom); + dAverageStraindh = 0.5 * (dStrainTopdh + dStrainBottomdh); + dAverageStraindt = 0.5 * (dStrainTopdt + dStrainBottomdt); + } else if (TacsRealPart(axStrainTop) < 0 && + TacsRealPart(axStrainBottom) >= 0) { + // --- Case 3 top in compression --- + const TacsScalar strainDiff = axStrainTop - axStrainBottom; + compressiveLength = this->stiffenerHeight * axStrainTop / strainDiff; + + const TacsScalar dLdstrainTop = + -this->stiffenerHeight * axStrainBottom / (strainDiff * strainDiff); + const TacsScalar dLdstrainBottom = + this->stiffenerHeight * axStrainTop / (strainDiff * strainDiff); + + // dLdx = pLpx + pLpet * detdx + pLpeb * debdx + dLdh = axStrainTop / strainDiff + dLdstrainTop * dStrainTopdh + + dLdstrainBottom * dStrainBottomdh; + dLdt = dLdstrainTop * dStrainTopdt + dLdstrainBottom * dStrainBottomdt; + + averageStrain = 0.5 * axStrainTop; + dAverageStraindh = 0.5 * dStrainTopdh; + dAverageStraindt = 0.5 * dStrainTopdt; + } else if (TacsRealPart(axStrainTop) >= 0 && + TacsRealPart(axStrainBottom) < 0) { + // --- Case 3 bottom in compression --- + const TacsScalar strainDiff = axStrainBottom - axStrainTop; + + compressiveLength = this->stiffenerHeight * axStrainBottom / strainDiff; + + const TacsScalar dLdstrainTop = + this->stiffenerHeight * axStrainBottom / (strainDiff * strainDiff); + const TacsScalar dLdstrainBottom = + -this->stiffenerHeight * axStrainTop / (strainDiff * strainDiff); + + // dLdx = pLpx + pLpet * detdx + pLpeb * debdx + dLdh = axStrainBottom / strainDiff + dLdstrainTop * dStrainTopdh + + dLdstrainBottom * dStrainBottomdh; + dLdt = dLdstrainTop * dStrainTopdt + dLdstrainBottom * dStrainBottomdt; + + averageStrain = 0.5 * axStrainBottom; + dAverageStraindh = 0.5 * dStrainBottomdh; + dAverageStraindt = 0.5 * dStrainBottomdt; + } + + TacsScalar dFactordL, dFactordt; + webCrippleFactor = computeCripplingFactorSens( + compressiveLength, this->stiffenerThick, dFactordL, dFactordt); + const TacsScalar dFactordh = dFactordL * dLdh; + dFactordt += dFactordL * dLdt; + + plyStrain[0] = averageStrain; + for (int ii = 0; ii < numPlies; ii++) { + TacsScalar plyFailStrainSens[3]; + const TacsScalar strengthRatio = + ply->failureStrainSens(plyAngles[ii], plyStrain, plyFailStrainSens); + if (computeThicknessSens) { + const TacsScalar dFaildt = + strengthRatio * dFactordt + + webCrippleFactor * plyFailStrainSens[0] * dAverageStraindt; + + dfdx[tNum] += dKSdFail[ii + numPlies] * scale * dFaildt; + } + if (computeHeightSens) { + const TacsScalar dFaildh = + strengthRatio * dFactordh + + webCrippleFactor * plyFailStrainSens[0] * dAverageStraindh; + + dfdx[hNum] += dKSdFail[ii + numPlies] * scale * dFaildh; + } + } + } +} + +TacsScalar TACSBladeStiffenedShellConstitutive::computeCripplingFactorSens( + const TacsScalar b, const TacsScalar t, TacsScalar& dkdb, + TacsScalar& dkdt) { + const TacsScalar factor = pow(b / t, 0.717) / 1.63; + dkdb = 0.717 * factor / b; + dkdt = -0.717 * factor / t; + return factor; +} + // ============================================================================== // Utility functions // ============================================================================== diff --git a/src/constitutive/TACSBladeStiffenedShellConstitutive.h b/src/constitutive/TACSBladeStiffenedShellConstitutive.h index 4e466edc5..8aef64b77 100644 --- a/src/constitutive/TACSBladeStiffenedShellConstitutive.h +++ b/src/constitutive/TACSBladeStiffenedShellConstitutive.h @@ -81,13 +81,20 @@ void printStiffnessMatrix(const TacsScalar* const C); * depends on the Orthotropic ply objects you pass to this class) is computed at * the upper and lower surface of the panel and at the tip of the stiffener, * this calculation is performed for every ply angle present in the panel and - * stiffener laminate. Additionally buckling criteria are computed for combined - * shear and axial buckling for both a global buckling mode (i.e the entire - * panel buckles) and a local buckling mode (i.e. the panel buckles between a - * pair of stiffeners). These buckling failure values are aggregated along with - * the material failure values into a single failure value using KS aggregation. - * The smoothness and conservatism of this aggregation can be controlled using - * the `setKSWeight` method. + * stiffener laminate. Buckling criteria are computed for combined + * shear and axial buckling for both a local buckling mode (i.e. the panel + * buckles between a pair of stiffeners) and a global buckling mode (i.e the + * entire panel buckles). Finally, two stiffener buckling criteria are also + * evaluated, one for global column buckling of the stiffener, and one for + * crippling of the flanges. These buckling failure values are aggregated along + * with the material failure values into a single failure value using KS + * aggregation. The smoothness and conservatism of this aggregation can be + * controlled using the `setKSWeight` method. + * + * WARNING: The stiffener flange crippling failure criterion uses a + * semi-empirical method that is only deemed valid for laminates consisting of + * >=25% 0 degree plies and >= 25% +-45 degree plies (as in the sum of + and - + * 45 degree ply fractions is >= 25%) * * The panel length design variables do not directly affect the stiffness or * stresses computed by the model, their only role is to allow the computation @@ -149,6 +156,70 @@ class TACSBladeStiffenedShellConstitutive : public TACSShellConstitutive { // ============================================================================== // Set non-default values // ============================================================================== + + /** + * @brief Enable or disable the panel material failure mode in the aggregated + * failure criteria + * + * @param includePanelMaterialFailure Whether to include material failure + */ + void setIncludePanelMaterialFailure(bool _includePanelMaterialFailure) { + this->includePanelMaterialFailure = _includePanelMaterialFailure; + } + + /** + * @brief Enable or disable the stiffener material failure mode in the + * aggregated failure criteria + * + * @param includeStiffenerMaterialFailure Whether to include material failure + */ + void setIncludeStiffenerMaterialFailure( + bool _includeStiffenerMaterialFailure) { + this->includeStiffenerMaterialFailure = _includeStiffenerMaterialFailure; + } + + /** + * @brief Enable or disable the global panel buckling mode in the aggregated + * failure criteria + * + * @param includeGlobalBuckling Whether to include global panel buckling + */ + void setIncludeGlobalBuckling(bool _includeGlobalBuckling) { + this->includeGlobalBuckling = _includeGlobalBuckling; + } + + /** + * @brief Enable or disable the local inter-stringer buckling mode in the + * aggregated failure criteria + * + * @param _includeLocalBuckling Whether to include local inter-stringer + * buckling + */ + void setIncludeLocalBuckling(bool _includeLocalBuckling) { + this->includeLocalBuckling = _includeLocalBuckling; + } + + /** + * @brief Enable or disable the stiffener column buckling mode in the + * aggregated failure criteria + * + * @param _includeStiffenerColumnBuckling Whether to include stiffener column + * buckling + */ + void setIncludeStiffenerColumnBuckling(bool _includeStiffenerColumnBuckling) { + this->includeStiffenerColumnBuckling = _includeStiffenerColumnBuckling; + } + + /** + * @brief Enable or disable the stiffener crippling mode in the aggregated + * failure criteria + * + * @param _includeStiffenerCrippling Whether to include stiffener crippling + */ + void setIncludeStiffenerCrippling(bool _includeStiffenerCrippling) { + this->includeStiffenerCrippling = _includeStiffenerCrippling; + } + /** * @brief Set the Stiffener Pitch DV Bounds * @@ -658,7 +729,7 @@ class TACSBladeStiffenedShellConstitutive : public TACSShellConstitutive { static void computeEffectiveModulii(const int numPlies, const TacsScalar QMats[], const TacsScalar plyFracs[], - TacsScalar* E, TacsScalar* G); + TacsScalar* const E, TacsScalar* const G); /** * @brief Compute the failure criterion for the stiffener in a given strain @@ -717,6 +788,11 @@ class TACSBladeStiffenedShellConstitutive : public TACSShellConstitutive { * @brief Compute the stiffener centroid height, this is the height relative * to the bottom surface of the stiffener, NOT the mid-plane of the panel. * + * Also note that, since the stiffener is assume to be on the opposite side of + * the shell from the shell normal (3-direction), the stiffener centroid + * offset used throughout this class will use the negative of this height + * value + * * @return TacsScalar The stiffener centroid height */ TacsScalar computeStiffenerCentroidHeight(); @@ -792,6 +868,14 @@ class TACSBladeStiffenedShellConstitutive : public TACSShellConstitutive { // Buckling functions // ============================================================================== + /** + * @brief Compute the strength ratio for the global buckling of the panel + * + * @param e Shell strains + * @return TacsScalar Strength ratio + */ + TacsScalar evalGlobalPanelBuckling(const TacsScalar e[]); + /** * @brief Compute the panel + stiffener stiffness values used to compute the * global buckling loads @@ -800,8 +884,37 @@ class TACSBladeStiffenedShellConstitutive : public TACSShellConstitutive { * @output D2 2-direction bending stiffness * @output D3 Twisting stiffness */ - void computeCriticalGlobalBucklingStiffness(TacsScalar* D1, TacsScalar* D2, - TacsScalar* D3); + void computeCriticalGlobalBucklingStiffness(TacsScalar* const D1, + TacsScalar* const D2, + TacsScalar* const D3); + + /** + * @brief Compute the sensitivity of the global buckling strength ratio w.r.t + * the shell strains + * + * @param e Shell strains + * @param sens Sensitivity of the output w.r.t the shell strains + * @return TacsScalar Strength Ratio + */ + TacsScalar evalGlobalPanelBucklingStrainSens(const TacsScalar e[], + TacsScalar sens[]); + + /** + * @brief Add the derivative of the global panel buckling strength ratio w.r.t + * the design variables + + @param elemIndex The local element index (not used) + @param scale Value by which to scale the derivatives + @param pt The parametric point (not used) + @param X The physical node location (not used) + @param strain The shell strains + @param dvLen The length of the design vector (not used) + @param dfdx The DV sensitivity array to add to + */ + void addGlobalPanelBucklingDVSens(int elemIndex, TacsScalar scale, + const double pt[], const TacsScalar X[], + const TacsScalar strain[], int dvLen, + TacsScalar dfdx[]); /** * @brief Compute the sensitivities of the panel + stiffener stiffness values @@ -821,13 +934,17 @@ class TACSBladeStiffenedShellConstitutive : public TACSShellConstitutive { */ void computeCriticalGlobalBucklingStiffnessSens( const TacsScalar dfdD1, const TacsScalar dfdD2, const TacsScalar dfdD3, - TacsScalar* spSens, TacsScalar* tpSens, TacsScalar* hsSens, - TacsScalar* tsSens, TacsScalar QstiffSens[], TacsScalar QpanelSens[]); + TacsScalar* const spSens, TacsScalar* const tpSens, + TacsScalar* const hsSens, TacsScalar* const tsSens, + TacsScalar QstiffSens[], TacsScalar QpanelSens[]); /** * @brief Compute the critical axial load for the global buckling of the * stiffened panel * + * This is just the classic Euler buckling load computed using the bending + * stiffness of the skin+stiffener cross section about it's centroid. + * * @param D1 1-direction bending stiffness, computed by * `computeCriticalGlobalBucklingStiffness` * @param L Panel length @@ -838,6 +955,15 @@ class TACSBladeStiffenedShellConstitutive : public TACSShellConstitutive { return M_PI * M_PI * D1 / (L * L); } + /** + * @brief Compute the strength ratio for the local buckling of the panel skin + * between stiffeners + * + * @param e Shell strains + * @return TacsScalar Strength ratio + */ + TacsScalar evalLocalPanelBuckling(const TacsScalar e[]); + /** * @brief Compute the critical axial load for local buckling of the panel * @@ -856,6 +982,33 @@ class TACSBladeStiffenedShellConstitutive : public TACSShellConstitutive { return 2.0 * M_PI * M_PI / (L * L) * (sqrt(D11 * D22) + D12 + 2.0 * D66); } + /** + * @brief Compute the sensitivity of the local panel buckling strength ratio + * + * @param e Shell strains + * @param sens Sensitivity of the output w.r.t the shell strains + * @return TacsScalar Strength Ratio + */ + TacsScalar evalLocalPanelBucklingStrainSens(const TacsScalar e[], + TacsScalar sens[]); + + /** + * @brief Add the derivative of the local panel buckling strength ratio w.r.t + * the design variables + + @param elemIndex The local element index (not used) + @param scale Value by which to scale the derivatives + @param pt The parametric point (not used) + @param X The physical node location (not used) + @param strain The shell strains + @param dvLen The length of the design vector (not used) + @param dfdx The DV sensitivity array to add to + */ + void addLocalPanelBucklingDVSens(int elemIndex, TacsScalar scale, + const double pt[], const TacsScalar X[], + const TacsScalar strain[], int dvLen, + TacsScalar dfdx[]); + /** * @brief Compute the sensitivity of the critical axial load for local * buckling of the panel @@ -874,9 +1027,9 @@ class TACSBladeStiffenedShellConstitutive : public TACSShellConstitutive { */ static TacsScalar computeCriticalLocalAxialLoadSens( const TacsScalar D11, const TacsScalar D22, const TacsScalar D12, - const TacsScalar D66, const TacsScalar L, TacsScalar* D11Sens, - TacsScalar* D22Sens, TacsScalar* D12Sens, TacsScalar* D66Sens, - TacsScalar* LSens); + const TacsScalar D66, const TacsScalar L, TacsScalar* const D11Sens, + TacsScalar* const D22Sens, TacsScalar* const D12Sens, + TacsScalar* const D66Sens, TacsScalar* const LSens); /** * @brief Compute the critical shear load for either local or global buckling @@ -947,8 +1100,8 @@ class TACSBladeStiffenedShellConstitutive : public TACSShellConstitutive { */ static TacsScalar computeCriticalShearLoadSens( const TacsScalar D1, const TacsScalar D2, const TacsScalar D3, - const TacsScalar L, TacsScalar* D1Sens, TacsScalar* D2Sens, - TacsScalar* D3Sens, TacsScalar* LSens); + const TacsScalar L, TacsScalar* const D1Sens, TacsScalar* const D2Sens, + TacsScalar* const D3Sens, TacsScalar* const LSens); /** * @brief Compute the buckling failure criterion @@ -983,8 +1136,150 @@ class TACSBladeStiffenedShellConstitutive : public TACSShellConstitutive { */ static TacsScalar bucklingEnvelopeSens( const TacsScalar N1, const TacsScalar N1Crit, const TacsScalar N12, - const TacsScalar N12Crit, TacsScalar* N1Sens, TacsScalar* N1CritSens, - TacsScalar* N12Sens, TacsScalar* N12CritSens); + const TacsScalar N12Crit, TacsScalar* const N1Sens, + TacsScalar* const N1CritSens, TacsScalar* const N12Sens, + TacsScalar* const N12CritSens); + + /** + * @brief Compute the strength ratio for the stiffener column buckling failure + * mode + * + * This failure mode is based on the simple Euler buckling formula for a beam + * pinned at both ends. See sections 8.3 and 9.2.1.2 in "Design and Analysis + * of Composite Structures with Application to Aerospace Structures, 2nd + * Edition" by Christos Kassapoglou. + * + * @param stiffenerStrain Stiffener centroid strains + * @return TacsScalar Strength ratio + */ + TacsScalar evalStiffenerColumnBuckling(const TacsScalar stiffenerStrain[]); + + /** + * @brief Compute the critical buckling load of the panel stiffeners + * + * @return TacsScalar + */ + TacsScalar computeStiffenerColumnBucklingLoad(); + + /** + * @brief Add the sensitivity of the stiffener column buckling failure with + * respect to the DVs + * + * @param scale Scaling factor to apply to the sensitivities (e.g the + * sensitivity of the final output to the stiffener column buckling load) + * @param dfdx Array of DV sensitivities + */ + void addStiffenerColumnBucklingLoadDVSens(const TacsScalar scale, + TacsScalar dfdx[]); + + /** + * @brief Compute the critical column buckling load of a beam + * + * @param E Elastic modulus + * @param I Bending moment of inertia + * @param L Beam length + * @return TacsScalar Critical column buckling load + */ + static TacsScalar computeColumnBucklingLoad(const TacsScalar E, + const TacsScalar I, + const TacsScalar L); + + /** + * @brief Compute the sensitivity of the critical column buckling load of a + * beam w.r.t the it's stiffness and length + * + * @param E Elastic modulus + * @param I Bending moment of inertia + * @param L Beam length + * @param dFdE Sensitivity of the critical load w.r.t the elastic modulus + * @param dFdI Sensitivity of the critical load w.r.t the bending moment of + * inertia + * @param dFdL Sensitivity of the critical load w.r.t the beam length + * @return TacsScalar Critical column buckling load + */ + static TacsScalar computeColumnBucklingLoadSens( + const TacsScalar E, const TacsScalar I, const TacsScalar L, + TacsScalar& dFdE, TacsScalar& dFdI, TacsScalar& dFdL); + + /** + * @brief Compute the sensitivity of the stiffener column buckling failure + * criteria with respect to the beam strains + * + * @param stiffenerStrain Stiffener centroid beam strains + * @param sens Sensitivity of the column failure criteria w.r.t the beam + * strains + * @return TacsScalar The column buckling failure criteria value + */ + TacsScalar evalStiffenerColumnBucklingStrainSens( + const TacsScalar stiffenerStrain[], TacsScalar sens[]); + + /** + * @brief Add the sensitivity of the stiffener column buckling failure + * criteria with respect to the design variables to an existing strain + * sensitivity vector + * + * @param scale + * @param shellStrain + * @param stiffenerAxialLoad + * @param fCrit + * @param dfdx + */ + void addStiffenerColumnBucklingDVSens(const TacsScalar scale, + const TacsScalar shellStrain[], + const TacsScalar stiffenerStrain[], + const TacsScalar stiffenerAxialLoad, + const TacsScalar fCrit, + TacsScalar dfdx[]); + + /** + * @brief Compute the empirical crippling factor for a stiffener flange + * + * @param b Flange length + * @param t Flange thickness + * @return TacsScalar Crippling factor by which the compressive strength + * should be scaled down or, conversely, the strength ratio should be scaled + * up + */ + static TacsScalar computeCripplingFactor(const TacsScalar b, + const TacsScalar t) { + return pow(b / t, 0.717) / 1.63; + } + + /** + * @brief Compute the sensitivity of the flange crippling factor w.r.t the + * flange dimensions + * + * @param b Flange length + * @param t Flange thickness + * @return dkdb Sensitivity of the crippling factor w.r.t the flange length + * @return dkdt Sensitivity of the crippling factor w.r.t the flange thickness + * @return TacsScalar The crippling factor + */ + static TacsScalar computeCripplingFactorSens(const TacsScalar b, + const TacsScalar t, + TacsScalar& dkdb, + TacsScalar& dkdt); + + /** + * @brief Compute the strength ratio with respect to stiffener crippling + * + * Uses methods described in section 8.5 of "Design and Analysis of Composite + * Structures with Application to Aerospace Structures, 2nd Edition" by + * Christos Kassapoglou. + * + * @param stiffenerStrain Stiffener centroid beam strains + * @return TacsScalar Strength ratio + */ + TacsScalar evalStiffenerCrippling(const TacsScalar stiffenerStrain[]); + void computeStiffenerCripplingValues(const TacsScalar stiffenerStrain[], + TacsScalar plyFailValues[]); + + TacsScalar evalStiffenerCripplingStrainSens( + const TacsScalar stiffenerStrain[], TacsScalar sens[]); + + void addStiffenerCripplingDVSens(const TacsScalar scale, + const TacsScalar stiffenerStrain[], + TacsScalar dfdx[]); // ============================================================================== // Attributes @@ -998,6 +1293,18 @@ class TACSBladeStiffenedShellConstitutive : public TACSShellConstitutive { int numGeneralDV; ///< Number of general DVs int numPanelDV; ///< Number of panel DVs int numStiffenerDV; ///< Number of stiffener DVs + bool includePanelMaterialFailure = + true; ///< Whether to consider panel material failure + bool includeStiffenerMaterialFailure = + true; ///< Whether to consider panel material failure + bool includeGlobalBuckling = + true; ///< Whether to consider global panel buckling failure + bool includeLocalBuckling = true; ///< Whether to consider local buckling + ///< failure of the skin between stiffeners + bool includeStiffenerColumnBuckling = + true; ///< Whether to consider stiffener column buckling failure + bool includeStiffenerCrippling = + true; ///< Whether to consider stiffener crippling failure // --- Material properties --- TACSOrthotropicPly* panelPly; ///< Orthotropic ply for the panel @@ -1071,9 +1378,18 @@ class TACSBladeStiffenedShellConstitutive : public TACSShellConstitutive { TacsScalar* panelPlyFailSens; TacsScalar* stiffenerPlyFailSens; - static const char* constName; ///< Constitutive model name + static const char* const constName; ///< Constitutive model name static const int NUM_Q_ENTRIES = 6; ///< Number of entries in the Q matrix static const int NUM_ABAR_ENTRIES = - 3; ///< Number of entries in the ABar matrix - static const int NUM_FAILURES = 4; ///< Number of failure modes + 3; ///< Number of entries in the ABar matrix + static const int NUM_FAILURES = + 6; ///< Number of failure modes, we have: + ///< 1. Panel material failure + ///< 2. Panel material failure + ///< 3. Local panel buckling (between stiffeners) + ///< 4. Global panel buckling + ///< 5. Stiffener column buckling + ///< 6. Stiffener crippling + static constexpr TacsScalar DUMMY_FAIL_VALUE = + -1e200; ///< Dummy failure value used for failure modes that are disabled }; diff --git a/src/elements/TACSElementTypes.cpp b/src/elements/TACSElementTypes.cpp index 76b4293b6..03eaa223f 100644 --- a/src/elements/TACSElementTypes.cpp +++ b/src/elements/TACSElementTypes.cpp @@ -85,7 +85,7 @@ int TacsGetOutputComponentCount(ElementType etype, int comp) { } else if (comp == TACS_OUTPUT_STRESSES) { return 9; } else if (comp == TACS_OUTPUT_EXTRAS) { - return 13; + return 14; } else if (comp == TACS_OUTPUT_LOADS) { return 6; } @@ -310,18 +310,20 @@ const char *TacsGetOutputComponentName(ElementType etype, int comp, int index) { case 5: return "failure5"; case 6: - return "dv1"; + return "failure6"; case 7: - return "dv2"; + return "dv1"; case 8: - return "dv3"; + return "dv2"; case 9: - return "dv4"; + return "dv3"; case 10: - return "dv5"; + return "dv4"; case 11: - return "dv6"; + return "dv5"; case 12: + return "dv6"; + case 13: return "dv7"; default: return NULL; diff --git a/src/elements/shell/TACSBeamElement.h b/src/elements/shell/TACSBeamElement.h index 35ab9f76f..91a075c84 100644 --- a/src/elements/shell/TACSBeamElement.h +++ b/src/elements/shell/TACSBeamElement.h @@ -2222,16 +2222,15 @@ void TACSBeamElement::getOutputData( data += 9; } if (write_flag & TACS_OUTPUT_EXTRAS) { - data[0] = con->evalFailureFieldValue(elemIndex, pt, X0.x, e, 0); - data[1] = con->evalFailureFieldValue(elemIndex, pt, X0.x, e, 1); - data[2] = con->evalFailureFieldValue(elemIndex, pt, X0.x, e, 2); - data[3] = con->evalFailureFieldValue(elemIndex, pt, X0.x, e, 3); - data[4] = con->evalFailureFieldValue(elemIndex, pt, X0.x, e, 4); - data[5] = con->evalFailureFieldValue(elemIndex, pt, X0.x, e, 5); - data[6] = con->evalDesignFieldValue(elemIndex, pt, X0.x, 0); - data[7] = con->evalDesignFieldValue(elemIndex, pt, X0.x, 1); - data[8] = con->evalDesignFieldValue(elemIndex, pt, X0.x, 2); - data += 9; + for (int failInd = 0; failInd < 7; failInd++) { + data[failInd] = + con->evalFailureFieldValue(elemIndex, pt, X0.x, e, failInd); + } + for (int dvInd = 0; dvInd < 7; dvInd++) { + data[dvInd + 7] = + con->evalDesignFieldValue(elemIndex, pt, X0.x, dvInd); + } + data += 14; } } } diff --git a/src/elements/shell/TACSShellElement.h b/src/elements/shell/TACSShellElement.h index 06e3dc090..51bfd99b1 100644 --- a/src/elements/shell/TACSShellElement.h +++ b/src/elements/shell/TACSShellElement.h @@ -1487,20 +1487,14 @@ void TACSShellElement::getOutputData( data += 9; } if (write_flag & TACS_OUTPUT_EXTRAS) { - data[0] = con->evalFailureFieldValue(elemIndex, pt, X, e, 0); - data[1] = con->evalFailureFieldValue(elemIndex, pt, X, e, 1); - data[2] = con->evalFailureFieldValue(elemIndex, pt, X, e, 2); - data[3] = con->evalFailureFieldValue(elemIndex, pt, X, e, 3); - data[4] = con->evalFailureFieldValue(elemIndex, pt, X, e, 4); - data[5] = con->evalFailureFieldValue(elemIndex, pt, X, e, 5); - data[6] = con->evalDesignFieldValue(elemIndex, pt, X, 0); - data[7] = con->evalDesignFieldValue(elemIndex, pt, X, 1); - data[8] = con->evalDesignFieldValue(elemIndex, pt, X, 2); - data[9] = con->evalDesignFieldValue(elemIndex, pt, X, 3); - data[10] = con->evalDesignFieldValue(elemIndex, pt, X, 4); - data[11] = con->evalDesignFieldValue(elemIndex, pt, X, 5); - data[12] = con->evalDesignFieldValue(elemIndex, pt, X, 6); - data += 13; + for (int failInd = 0; failInd < 7; failInd++) { + data[failInd] = + con->evalFailureFieldValue(elemIndex, pt, X, e, failInd); + } + for (int dvInd = 0; dvInd < 7; dvInd++) { + data[dvInd + 7] = con->evalDesignFieldValue(elemIndex, pt, X, dvInd); + } + data += 14; } } } diff --git a/src/elements/shell/TACSThermalShellElement.h b/src/elements/shell/TACSThermalShellElement.h index 049ce7017..88a1936d9 100644 --- a/src/elements/shell/TACSThermalShellElement.h +++ b/src/elements/shell/TACSThermalShellElement.h @@ -1451,16 +1451,14 @@ void TACSThermalShellElement::getOutputData( data += 9; } if (write_flag & TACS_OUTPUT_EXTRAS) { - data[0] = con->evalFailureFieldValue(elemIndex, pt, X, e, 0); - data[1] = con->evalFailureFieldValue(elemIndex, pt, X, e, 1); - data[2] = con->evalFailureFieldValue(elemIndex, pt, X, e, 2); - data[3] = con->evalFailureFieldValue(elemIndex, pt, X, e, 3); - data[4] = con->evalFailureFieldValue(elemIndex, pt, X, e, 4); - data[5] = con->evalFailureFieldValue(elemIndex, pt, X, e, 5); - data[6] = con->evalDesignFieldValue(elemIndex, pt, X, 0); - data[7] = con->evalDesignFieldValue(elemIndex, pt, X, 1); - data[8] = con->evalDesignFieldValue(elemIndex, pt, X, 2); - data += 9; + for (int failInd = 0; failInd < 7; failInd++) { + data[failInd] = + con->evalFailureFieldValue(elemIndex, pt, X, e, failInd); + } + for (int dvInd = 0; dvInd < 7; dvInd++) { + data[dvInd + 7] = con->evalDesignFieldValue(elemIndex, pt, X, dvInd); + } + data += 14; } } } diff --git a/tacs/constitutive.pyx b/tacs/constitutive.pyx index fb332bfd3..7942bda5f 100644 --- a/tacs/constitutive.pyx +++ b/tacs/constitutive.pyx @@ -910,7 +910,7 @@ cdef class BladeStiffenedShellConstitutive(ShellConstitutive): np.ndarray[int, ndim=1, mode='c'] panelPlyFracNums = None, int stiffenerHeightNum = -1, int stiffenerThickNum = -1, - np.ndarray[int, ndim=1, mode='c'] stiffenerPlyFracNums = None + np.ndarray[int, ndim=1, mode='c'] stiffenerPlyFracNums = None, ): numPanelPlies = len(panelPlyAngles) @@ -964,6 +964,30 @@ cdef class BladeStiffenedShellConstitutive(ShellConstitutive): self.ptr = self.cptr = self.blade_ptr self.ptr.incref() + def setFailureModes( + self, + includePanelMaterialFailure=None, + includeStiffenerMaterialFailure=None, + includeGlobalBuckling=None, + includeLocalBuckling=None, + includeStiffenerColumnBuckling=None, + includeStiffenerCrippling=None, + ): + + if self.blade_ptr: + if includePanelMaterialFailure is not None: + self.blade_ptr.setIncludePanelMaterialFailure(includePanelMaterialFailure) + if includeStiffenerMaterialFailure is not None: + self.blade_ptr.setIncludeStiffenerMaterialFailure(includeStiffenerMaterialFailure) + if includeGlobalBuckling is not None: + self.blade_ptr.setIncludeGlobalBuckling(includeGlobalBuckling) + if includeLocalBuckling is not None: + self.blade_ptr.setIncludeLocalBuckling(includeLocalBuckling) + if includeStiffenerColumnBuckling is not None: + self.blade_ptr.setIncludeStiffenerColumnBuckling(includeStiffenerColumnBuckling) + if includeStiffenerCrippling is not None: + self.blade_ptr.setIncludeStiffenerCrippling(includeStiffenerCrippling) + def setKSWeight(self, double ksWeight): """ Update the ks weight used for aggregating the different failure modes diff --git a/tacs/cpp_headers/constitutive.pxd b/tacs/cpp_headers/constitutive.pxd index b449a2f30..205eda4cd 100644 --- a/tacs/cpp_headers/constitutive.pxd +++ b/tacs/cpp_headers/constitutive.pxd @@ -152,46 +152,16 @@ cdef extern from "TACSBladeStiffenedShellConstitutive.h": TacsScalar[], # stiffenerPlyAngles TacsScalar[], # stiffenerPlyFracs int[], # stiffenerPlyFracNums - TacsScalar # flangeFraction - ) - int getNumPanelPlies() - int getNumStiffenerPlies() - void setKSWeight(double ksWeight) - void setStiffenerPitchBounds(TacsScalar lowerBound, TacsScalar upperBound) - void setStiffenerHeightBounds(TacsScalar lowerBound, TacsScalar upperBound) - void setStiffenerThicknessBounds(TacsScalar lowerBound, TacsScalar upperBound) - void setPanelThicknessBounds(TacsScalar lowerBound, TacsScalar upperBound) - void setStiffenerPlyFractionBounds(TacsScalar[] lowerBound, TacsScalar[] upperBound) - void setPanelPlyFractionBounds(TacsScalar[] lowerBound, TacsScalar[] upperBound) - -cdef extern from "TACSBladeStiffenedShellConstitutive.h": - cdef cppclass TACSBladeStiffenedShellConstitutive(TACSShellConstitutive): - TACSBladeStiffenedShellConstitutive( - TACSOrthotropicPly*, # panelPly - TACSOrthotropicPly*, # stiffenerPly - TacsScalar, # kcorr - TacsScalar, # panelLength - int, # panelLengthNum - TacsScalar, # stiffenerPitch - int, # stiffenerPitchNum - TacsScalar, # panelThick - int, # panelThickNum - int, # numPanelPlies - TacsScalar[], # panelPlyAngles - TacsScalar[], # panelPlyFracs - int[], # panelPlyFracNums - TacsScalar, # stiffenerHeight - int, # stiffenerHeightNum - TacsScalar, # stiffenerThick - int, # stiffenerThickNum - int, # numStiffenerPlies - TacsScalar[], # stiffenerPlyAngles - TacsScalar[], # stiffenerPlyFracs - int[], # stiffenerPlyFracNums - TacsScalar # flangeFraction + TacsScalar, # flangeFraction ) int getNumPanelPlies() int getNumStiffenerPlies() + void setIncludePanelMaterialFailure(bool _includePanelMaterialFailure) + void setIncludeStiffenerMaterialFailure(bool _includeStiffenerMaterialFailure) + void setIncludeGlobalBuckling(bool _includeGlobalBuckling) + void setIncludeLocalBuckling(bool _includeLocalBuckling) + void setIncludeStiffenerColumnBuckling(bool _includeStiffenerColumnBuckling) + void setIncludeStiffenerCrippling(bool _includeStiffenerCrippling) void setKSWeight(double ksWeight) void setStiffenerPitchBounds(TacsScalar lowerBound, TacsScalar upperBound) void setStiffenerHeightBounds(TacsScalar lowerBound, TacsScalar upperBound) diff --git a/tests/constitutive_tests/test_blade_sitffened_shell_constitutive.py b/tests/constitutive_tests/test_blade_sitffened_shell_constitutive.py index 07e202502..f1ea478ac 100644 --- a/tests/constitutive_tests/test_blade_sitffened_shell_constitutive.py +++ b/tests/constitutive_tests/test_blade_sitffened_shell_constitutive.py @@ -34,15 +34,15 @@ def setUp(self): self.x = np.ones(3, dtype=self.dtype) self.pt = np.zeros(3) - self.panelLength = 2.0 + self.panelLength = 2.1 self.panelLengthNum = 0 - self.stiffenerPitch = 0.2 + self.stiffenerPitch = 0.178 self.stiffenerPitchNum = 1 - self.stiffenerHeight = 0.075 + self.stiffenerHeight = 0.314 self.stiffenerHeightNum = 2 - self.stiffenerThickness = 1e-2 + self.stiffenerThickness = 1.23e-2 self.stiffenerThicknessNum = 3 - self.panelThickness = 1.5e-2 + self.panelThickness = 1.586e-2 self.panelThicknessNum = 4 self.numPanelPlies = 3 @@ -69,11 +69,13 @@ def setUp(self): [ self.panelLength, self.stiffenerPitch, - self.stiffenerHeight, - self.stiffenerThickness, self.panelThickness, ] + list(self.panelPlyFracs) + + [ + self.stiffenerHeight, + self.stiffenerThickness, + ] + list(self.stiffenerPlyFracs) ) self.dvs = np.array(self.dvs, dtype=self.dtype) @@ -136,6 +138,17 @@ def setUp(self): self.ply_list = [iso_ply, ortho_ply] + # These are the individual failure modes that can be enabled/disabled in the model. We will run the failure sensitivity tests with each enabled individually and then again with all enabled. + self.failure_modes = [ + "PanelMaterialFailure", + "StiffenerMaterialFailure", + "LocalBuckling", + "GlobalBuckling", + "StiffenerColumnBuckling", + "StiffenerCrippling", + ] + self.failure_modes_to_test = self.failure_modes + ["all"] + # Seed random number generator in tacs for consistent test results elements.SeedRandomGenerator(0) @@ -164,7 +177,7 @@ def get_con(self, ply): ) # Set the KS weight really low so that all failure modes make a # significant contribution to the failure function derivatives - con.setKSWeight(0.1) + con.setKSWeight(1.0) return con def test_constitutive_density(self): @@ -257,43 +270,64 @@ def test_constitutive_stress(self): # ) # self.assertFalse(fail) - def test_constitutive_failure(self): + def test_constitutive_failure_dv_sens(self): # Test failure dv sensitivity for ply in self.ply_list: with self.subTest(ply=ply): - con = self.get_con(ply) - fail = False - for _ in range(self.numFailureTests): - fail = fail or constitutive.TestConstitutiveFailure( - con, - self.elem_index, - self.pt, - self.x, - self.dvs, - self.dh, - self.print_level, - self.atol, - self.rtol, - ) - self.assertFalse(fail) + for enabled_failure_mode in self.failure_modes_to_test: + with self.subTest(failure_mode=enabled_failure_mode): + includeFailureModes = {} + for failure_mode in self.failure_modes: + includeFailureModes[f"include{failure_mode}"] = ( + failure_mode == enabled_failure_mode + or enabled_failure_mode == "all" + ) + con = self.get_con(ply) + con.setFailureModes(**includeFailureModes) + fail = False + for _ in range(self.numFailureTests): + fail = fail or constitutive.TestConstitutiveFailure( + con, + self.elem_index, + self.pt, + self.x, + self.dvs, + self.dh, + self.print_level, + self.atol, + self.rtol, + ) + self.assertFalse(fail) def test_constitutive_failure_strain_sens(self): for ply in self.ply_list: with self.subTest(ply=ply): - con = self.get_con(ply) - fail = False - for _ in range(self.numFailureTests): - fail = fail or constitutive.TestConstitutiveFailureStrainSens( - con, - self.elem_index, - self.pt, - self.x, - self.dh, - self.print_level, - self.rtol, - self.atol, - ) - self.assertFalse(fail) + for enabled_failure_mode in self.failure_modes_to_test: + with self.subTest(failure_mode=enabled_failure_mode): + includeFailureModes = {} + for failure_mode in self.failure_modes: + includeFailureModes[f"include{failure_mode}"] = ( + failure_mode == enabled_failure_mode + or enabled_failure_mode == "all" + ) + con = self.get_con(ply) + con.setFailureModes(**includeFailureModes) + fail = False + for _ in range(self.numFailureTests): + fail = ( + fail + or constitutive.TestConstitutiveFailureStrainSens( + con, + self.elem_index, + self.pt, + self.x, + self.dh, + self.print_level, + self.rtol, + self.atol, + ) + ) + self.assertFalse(fail) if __name__ == "__main__": diff --git a/tests/integration_tests/test_shell_blade_stiffened_plate_quad.py b/tests/integration_tests/test_shell_blade_stiffened_plate_quad.py index 58bf14d9b..42e49c506 100644 --- a/tests/integration_tests/test_shell_blade_stiffened_plate_quad.py +++ b/tests/integration_tests/test_shell_blade_stiffened_plate_quad.py @@ -42,7 +42,7 @@ class ProblemTest(PyTACSTestCase.PyTACSTest): "point_load_cgy": 0.500000000000004, "point_load_cgz": -0.0035714285714285718, "point_load_compliance": 71.87161795633577, - "point_load_ks_vmfailure": 0.3304517634314118, + "point_load_ks_failure": 1.55459927291223, "point_load_mass": 17.5, "pressure_Ixx": 1.4589304315475928, "pressure_Ixy": 3.907985046680551e-14, @@ -54,7 +54,7 @@ class ProblemTest(PyTACSTestCase.PyTACSTest): "pressure_cgy": 0.500000000000004, "pressure_cgz": -0.0035714285714285718, "pressure_compliance": 377.11604579572935, - "pressure_ks_vmfailure": 0.9085085771277308, + "pressure_ks_failure": 2.071155983783409, "pressure_mass": 17.5, "gravity_Ixx": 1.4589304315475928, "gravity_Ixy": 3.907985046680551e-14, @@ -66,7 +66,7 @@ class ProblemTest(PyTACSTestCase.PyTACSTest): "gravity_cgy": 0.500000000000004, "gravity_cgz": -0.0035714285714285718, "gravity_compliance": 11.114479357783475, - "gravity_ks_vmfailure": 0.0908244150089233, + "gravity_ks_failure": 0.36091429055815866, "gravity_mass": 17.5, "modal_eigsm.0": 728895.1077101853, "modal_eigsm.1": 1591857.6791554866, @@ -175,7 +175,7 @@ def elem_call_back( # Add Functions for problem in tacs_probs: problem.addFunction("mass", functions.StructuralMass) - problem.addFunction("ks_vmfailure", functions.KSFailure, ksWeight=ksweight) + problem.addFunction("ks_failure", functions.KSFailure, ksWeight=ksweight) problem.addFunction("compliance", functions.Compliance) problem.addFunction( "cgx", functions.CenterOfMass, direction=[1.0, 0.0, 0.0]