DLR-SL / CPACS

CPACS - Common Parametric Aircraft Configuration Schema
http://dlr-sl.github.io/CPACS/
Apache License 2.0
78 stars 38 forks source link

New definition of structural reinforcements for fuselage wall and pressure bulkhead elements #789

Open sdeinert opened 2 years ago

sdeinert commented 2 years ago

In reality large planar structural components such as fuselage walls or pressure bulkheads need to be reinforced to increase stiffness and prevent stability issues such as buckling. Such reinforcements are quite similar to wing stringers. Depending on the specific design, these reinforcements can have quite complex geometries as they need to consider other intersecting structures and cutouts. Therefore, a logic similar to wing spars or explicit wing stringers is proposed using a list of positions and segments connecting these positions.

CPACS extension proposal:

To allow modelling this in CPACS, the following extensions to the types pressureBulkheadAssemblyPositionType and wallSegmentType are proposed:

pressureBulkheadAssemblyPositionType the following optional element needs to be added:

<xsd:element name="reinforcements" type="pressureBulkheadReinforcementsType" maxOccurs="1" minOccurs="0"></xsd:element>

The pressureBulkheadReinforcementsType looks like this:

<xsd:complexType name="pressureBulkheadReinforcementsType">
    <xsd:all>
    <xsd:element name="reinforcementPositions" type="fuselageStructureReinforcementPositionsType"></xsd:element>
    <xsd:element name="reinforcementSegments" type="fuselageStructureReinforcementSegmentsType"></xsd:element>
    </xsd:all>
</xsd:complexType>

The wallSegmentType is extended with a similar optional element:

<xsd:complexType name="wallSegmentType">
  <xsd:all>
    <xsd:element name="phi" maxOccurs="1" minOccurs="1" default="0.0">
      <xsd:annotation>
        <xsd:documentation>Defines extrusion direction. Rotation angle around fuselage x-axis of extrusion direction. A value of 0deg means fuselage z-axis as extrusion direction. Default: 0.0deg.</xsd:documentation>
      </xsd:annotation>
      <xsd:complexType>
        <xsd:simpleContent>
          <xsd:restriction base="doubleBaseType">
            <xsd:minInclusive value="0" />
            <xsd:maxInclusive value="360" />
          </xsd:restriction>
        </xsd:simpleContent>
      </xsd:complexType>
    </xsd:element>
    <xsd:element name="doubleSidedExtrusion" maxOccurs="1" minOccurs="0" type="booleanBaseType">
      <xsd:annotation>
        <xsd:documentation>By default, the wall is only extruded in positive direction. If doubleSidedExtrusion is true, the wall is additionaly extruded in negative direction as well. Default: false.</xsd:documentation>
      </xsd:annotation>
    </xsd:element>
    <xsd:element name="flushConnectionStart" type="booleanBaseType" maxOccurs="1" minOccurs="0">
      <xsd:annotation>
        <xsd:documentation>Rotates the first edge of the wall segment so that it is adjacent with the structural element defined in the first wall position (bulkhead, fuselage section or another plane wall). Default: false.</xsd:documentation>
      </xsd:annotation>
    </xsd:element>
    <xsd:element name="flushConnectionEnd" type="booleanBaseType" maxOccurs="1" minOccurs="0">
      <xsd:annotation>
        <xsd:documentation>Rotates the last edge of the wall segment so that it is adjacent with the structural element defined in the last wall position (bulkhead, fuselage section or another plane wall). Default: false.</xsd:documentation>
      </xsd:annotation>
    </xsd:element>
    <xsd:element name="boundingElementUIDs" type="boundingElementUIDsType" maxOccurs="1" minOccurs="0">
      <xsd:annotation>
        <xsd:documentation>A list of uIDs referencing other structural/geometric elements that shall serve as a boundary of the wall element. Possible references are floor, wall or genericGeometryComponent. A major requirement is that the referenced element has an intersection with the wall for at least the distance between two wall positions. So that a full geometric face of the wall is bounded by it. Neighbouring wall faces that are not completely bounded by the reference element are not affected.</xsd:documentation>
      </xsd:annotation>
    </xsd:element>
    <xsd:element name="structuralWallElementUID" type="stringUIDBaseType" maxOccurs="1" minOccurs="0">
      <xsd:annotation>
        <xsd:documentation>Reference to the structural property definition of this wall segment.</xsd:documentation>
      </xsd:annotation>
    </xsd:element>
    <xsd:element name="wallPositionUIDs" type="wallPositionUIDsType" maxOccurs="1" minOccurs="1">
      <xsd:annotation>
        <xsd:documentation>List of wall position uIDs that are used for this wall segment. At least two positions must be defined (for start and end position of wall). If more than two positions are referenced here, the wall is constructed out of several planar faces that connect two consecutive positions (Note: Order of position uIDs defines connectivity).</xsd:documentation>
      </xsd:annotation>
    </xsd:element>
    <xsd:element name="reinforcements" type="wallReinforcementsType" maxOccurs="1" minOccurs="0"></xsd:element>  <!-- AIRBUS extension -->
  </xsd:all>
  <xsd:attribute name="uID" type="xsd:string"/>
</xsd:complexType>

with

<xsd:complexType name="wallReinforcementsType">
  <xsd:all>
    <xsd:element name="reinforcementPositions" type="fuselageStructureReinforcementPositionsType">
      <xsd:annotation>
        <xsd:documentation>Definition list of reinforcement positions.</xsd:documentation>
      </xsd:annotation></xsd:element>
    <xsd:element name="reinforcementSegments" type="fuselageStructureReinforcementSegmentsType">
      <xsd:annotation>
        <xsd:documentation>Definition of reinforcement segments built from positions.</xsd:documentation>
      </xsd:annotation></xsd:element>
  </xsd:all>
</xsd:complexType>

The pressureBulkheadReinforcementsType and wallReinforcementsType each contain a list of positions and a list of segments similar to the wing spar logic:

<xsd:complexType name="fuselageStructureReinforcementPositionsType">
  <xsd:sequence>
    <xsd:element name="reinforcementPosition" type="fuselageStructureReinforcementPositionType" maxOccurs="unbounded" minOccurs="1">
      <xsd:annotation>
        <xsd:documentation>Definition of a fuselage structure reinforcement position defined through a relative position on its parent component.</xsd:documentation>
      </xsd:annotation></xsd:element>
  </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="fuselageStructureReinforcementSegmentsType">
  <xsd:sequence>
    <xsd:element name="reinforcementSegment" type="fuselageStructureReinforcementSegmentType" maxOccurs="unbounded" minOccurs="1">
      <xsd:annotation>
        <xsd:documentation>Definition of a fuselage structure reinforcement segment connecting different positions</xsd:documentation>
      </xsd:annotation></xsd:element>
  </xsd:sequence>
</xsd:complexType>

Reinforcement positions are defined using relative coordinates (eta/xsi) inside the shape of the parent component (wall/pressure bulkhead). For walls an additional subSegmentIndex is required as they can consist of several segments. The subSegmentIndex selects the wall segment relative to which the eta/xsi coordinates shall be evaluated. An alternative placement option to eta/xsi is the direct reference of another structural component intersecting the parent component (i.e. other walls, pressure bulkheads, reinforcements of other walls/pressure bulkheads, frames, stringers). In case this intersection with the parent component yields a wire, the relPos parameter is applied to select a point along the intersection wire. In case of a point as result to this intersection relPos is not required.

<xsd:complexType name="fuselageStructureReinforcementPositionType">
  <xsd:choice>
    <xsd:sequence>
      <xsd:element name="eta" type="doubleBaseType">
        <xsd:annotation>
          <xsd:documentation>Relative coordinate in width direction of parent component.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element name="xsi" type="doubleBaseType">
        <xsd:annotation>
          <xsd:documentation>Relative coordinate in height/length direction of parent component.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element name="subSegmentIndex" type="integerBaseType" maxOccurs="1" minOccurs="0">
        <xsd:annotation>
          <xsd:documentation>In case the parent structure component consists of several sub segments (e.g. FuselageWallSegment) this index can be used to reference one of these sub segments. If this index is used, the relative eta/xsi coordinates will use the referenced sub segment as reference.</xsd:documentation>
        </xsd:annotation></xsd:element>
    </xsd:sequence>
    <xsd:sequence>
      <xsd:element name="intersectingStructureUID" type="stringUIDBaseType">
        <xsd:annotation>
          <xsd:documentation>Reference to another fuselage structure component that intersects with the parent component. The position shall lie exactly on this intersection. Possible references are stringers, walls and pressure bulkheads.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element name="relPos" type="doubleBaseType" maxOccurs="1" minOccurs="0">
        <xsd:annotation>
          <xsd:documentation>In case the intersection with the referenced structural component yields a line, this relative position value places the location along the intersection line.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
    </xsd:sequence>
  </xsd:choice>
  <xsd:attribute name="uID" type="xsd:string" use="required"></xsd:attribute>
</xsd:complexType>

The fuselageStructureReinforcementSegmentType is defined as follows:

<xsd:complexType name="fuselageStructureReinforcementSegmentType">
    <xsd:sequence>
      <xsd:element name="structuralElementUID" type="stringUIDBaseType">
        <xsd:annotation>
          <xsd:documentation>Reference to a profile based structural element defining the physical properties of this reinforcement segment.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element name="offsetSide">
        <xsd:annotation>
          <xsd:documentation>Defines the side of the parent component face on which the reinforcement lies if modelled as a 3D bar profile. None means the reinforcement lies symmetrically in the middle of the parent component face extending by its dimension defined in the structural element equally to both sides of the parent component face's normal direction. Positive means that the reinforcement is attached to the side of the parent component face facing in the direction of its normal. Negative means that the reinforcement is attached to the side of the parent component's facing in the opposite direction of its normal.</xsd:documentation>
        </xsd:annotation>
        <xsd:simpleType>
          <xsd:restriction base="xsd:string">
            <xsd:enumeration value="None"></xsd:enumeration>
            <xsd:enumeration value="Positive"></xsd:enumeration>
            <xsd:enumeration value="Negative"></xsd:enumeration>
          </xsd:restriction>
        </xsd:simpleType>
      </xsd:element>

      <xsd:choice>

            <xsd:element name="singlePosition" type="fuselageStructureReinforcementSinglePositionType">
              <xsd:annotation>
                <xsd:documentation>Defines a straight reinforcement segment going through a single position at a given angle.</xsd:documentation>
              </xsd:annotation></xsd:element>
            <xsd:element name="positionUIDs" type="fuselageStructureReinforcementPositionUIDsType">
              <xsd:annotation>
                <xsd:documentation>Defines an arbitrary reinforcement segment connecting a list of positions.</xsd:documentation>
              </xsd:annotation></xsd:element>
      </xsd:choice>
    </xsd:sequence>
    <xsd:attribute name="uID" type="xsd:string" use="required"></xsd:attribute>
</xsd:complexType>

And some additional types used by the definitions above:

<xsd:complexType name="fuselageStructureReinforcementPositionUIDsType">
  <xsd:sequence>
    <xsd:element name="positionUID" type="stringUIDBaseType" maxOccurs="unbounded" minOccurs="2">
      <xsd:annotation>
        <xsd:documentation>Reference to a reinforcement position within the same parent component.</xsd:documentation>
      </xsd:annotation></xsd:element>
  </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="fuselageStructureReinforcementSinglePositionType">
    <xsd:all>
    <xsd:element name="positionUID" type="stringUIDBaseType">
      <xsd:annotation>
        <xsd:documentation>Reference to a reinforcement position within the same parent.</xsd:documentation>
      </xsd:annotation>
    </xsd:element>
    <xsd:element name="angle" type="doubleBaseType">
      <xsd:annotation>
        <xsd:documentation>This angle determines the direction of the reinforcement segment. An angle value of 0.0 means local up or length direction.</xsd:documentation>
      </xsd:annotation>
    </xsd:element>
    <xsd:element name="doubleSidedExtrusion" type="booleanBaseType" default="false">
      <xsd:annotation>
        <xsd:documentation>Flag determining whether the reinforcement segment is created only from the referenced position in the defined direction up to the loft line, or whether the reinforcement segment is extruded in both directions (angle and angle+180deg) from the position up to the loft line.</xsd:documentation>
      </xsd:annotation></xsd:element>
  </xsd:all>
</xsd:complexType>

Geometric construction

With this definition the geometry for pressure bulkhead reinforcements can be realized like this: bulkhead_reinforcement The eta/xsi space is defined by the bounding box (grey dashed box) of the pressure bulkhead so that also positions outside the actual geometry could be defined. The geometry construction must be robust enough to support this. Two options are shown above, a straight reinforcement segment with a single position definition plus an angle, and a multi-position reinforcement segment based on four positions with the last one placed outside the actual loft. Eta runs from -0.5 (left border) to +0.5 (right border), while xsi ranges between -0.5 (lower border) and 0.5 (upper border).

A similar geometry construction logic is applied for wall reinforcements: wall_reinforcements

Eta/xsi locations are always relative to the bounding boxes of the respective wall (sub-)segment that contains them. The example in the figure above shows a reinforcement segment with three positions, where the last position lies in wall sub-segment 2. For each wall sub-segment eta ranges between 0 (start position border of wall subsegment) to 1 (end position border of wall subsegment) and xsi from 0 ("left" border of wall subsegment) to 1 ("right" border of wall subsegment) depending on the orientation with which the wall was defined. Also in this case the geometry construction must be robust enough to support positions lying outside the shape of the wall segment but inside its bounding box.

As reinforcement segments may reference common position definitions, fixed intersections between reinforcements can be defined explicitly.

An example for a pressure bulkhead reinforcement definition created with a TiGL prototype can be seen here: pressureBulkheadReinf

Obsolete CPACS definitions

With the new definitions detailed above the following CPACS definitions become obsolete:

jnwalther commented 2 years ago

This is a fairly legthy issue, so I will need to take some time to get through to all the details. What I can already say, is that im pretty decidedly against removing the "obsolete" options for bulkhead reinforcements, since those provide as imple as possible parametrizations of established bulkhead designs, and I know of several tools, that use them. So the way I see it, we should rather consider the eta-ksi way you propose as an additional option for more complex designs.

Another point, since eta-ksi-coordinates are a known concept from the wing, where it is in the interval of [0,1], it might be confusing to have it in the interval [-0.5, 0.5] here (incidentally, I think your coordinate system origin in the sketches might be wrong). Anyway, for the walls, which are not subject to configuration symmetry like bulkheads the (0, 0) coordinate would be pretty meaningless.

sdeinert commented 2 years ago

Sorry, I didn't mean to step on any toes with "obsolete". I just wanted to mention that there is already something similar in CPACS which this new definition could also cover.

The main drawback on the existing reinforcement definition is that it is placed under structuralElements so this means the reinforcements are placed without having any idea how the actual geometry of the wall or pressure bulkhead will look like, as it could be referenced by several ones. In practice this has created issues very regularly.

Usually the reinforcements are the last in line to be placed after all the intersections with other main structural components like walls or pressure bulkheads are defined. Therefore, the reinforcements need to be placed individually around the already existing structure intersections which is quite difficult to achieve with only equal distanced lattices:

reinf

In the picture above one can see that the equally spaced horizontal and vertical reinforcements (yellow) of the pressure bulkhead interfere in some areas with the walls and floors intersecting this pressure bulkhead (red lines). Also, vertical and horizontal reinforcements may intersect each other very close to the border of the bulkhead leading to tiny patches in between. These effects yield to not very reasonable structural designs when looking at it in detail. One may be able to solve this playing around with the number of reinforcements in both directions. This solution, however, would only be useful for that single bulkhead and the process needs to be repeated for all other bulkheads as well so that in the end each pressure bulkhead would reference its individual structuralElement definition. Most likely the number of reinforcements would be different in adjacent pressure bulkheads making it very complicated to define reinforcements in walls/floors connecting those bulkheads. For this reason we developed the more flexible solution described above which can also cover such equal spaced lattices.

Concerning your argument about the range of eta/xsi values, I am aware of that. The idea behind -0.5 to 0.5 was to simplify creating symmetric definitions by flipping the sign. Walls may also benefit from that, if used as floors. Here, xsi=0 would yield the fuselage center line. If 0 to 1 is a fixed requirement, this can be changed rather easily. Alternatively, eta/xsi could also be renamed in this definition, as I think they are not used anywhere in the fuselage yet. So we could keep eta/xsi exclusively for the wing and use different names for the fuselage.

You are right about the pressure bulkhead sketch, it needs updating. But I think it still illustrates more or less what is intended.

jnwalther commented 2 years ago

Not to worry, my toes are just fine. :) To be honest, my main concern is retaining the old definition. I completely see the use of the new definition, and welcome it as another option, but simple is better than complex, so why not keep the simple established solution and only use the complex way if we need to? Certainly, having more than one way to do things is not unprecedented in CPACS (looking at you, positionings).

As for the parametrization of the underlying surface, I surely don't insist on the [0, 1] interval, but I agree, that a changed naming would go a long way to avoid confusion. Another thing: would it maybe be better to change the interval to [-1,1]. If I remember correctly from FEM class, it's usually either that or [0, 1] for local parameters, whereas bounds at 0.5 seem uncommon.

sdeinert commented 2 years ago

Removing or leaving the existing definition is equally fine for me. I just want to stress the importance of such a more detailed definition.

Regarding the renaming of eta/xsi in this definition I'd be thankful for any suggestions. Any favorite Greek letters that are not taken elsewhere yet?

We can surely change the interval from -1 to 1.