Mesh Input Format Guide

This guide describes the yaml input file format supported by OpenSG and how to load mesh data into the various mesh classes for wind turbine blade analysis.

Overview

OpenSG currently supports a yaml file format:
  • Primary format for mesh definitions

  • Human-readable and easily editable

  • Contains complete mesh geometry, materials, and layup information

YAML File Structure

The YAML format contains several key sections that define the complete mesh:

Basic Structure

# Mesh geometry
nodes:
  - [x1, y1, z1]  # Node coordinates
  - [x2, y2, z2]
  # ... more nodes

elements:
  - [node_1, node_2, node_3, node_4]  # Element connectivity (quad/tri)
  - [node_5, node_6, node_7, node_8]
  # ... more elements

# Material definitions
materials:
  - name: "carbon_fiber"
    E1: 150000.0      # Young's modulus in fiber direction (MPa)
    E2: 10000.0       # Young's modulus transverse to fiber (MPa)
    G12: 5000.0       # Shear modulus (MPa)
    nu12: 0.3         # Poisson's ratio
  # ... more materials

# Element grouping and layup assignment
sets:
  element:
    - name: "segment_0_layup_0"
      elements: [element_1, element_1, ..., element_n]  # Element IDs for this layup
    # ... more element sets

# Layup definitions
sections:
  - elementSet: "segment_0_layup_0"
    layup:
      - ["carbon_fiber", 0.001, 0.0]     # [material, thickness, angle]
      - ["carbon_fiber", 0.001, 1.57]    # 90 degrees in radians
      # ... more layers

# Element orientation matrices
elementOrientations:
  - [[1.0, 0.0, 0.0],   # 3x3 rotation matrix for element 1
     [0.0, 1.0, 0.0],
     [0.0, 0.0, 1.0]]
  # ... one matrix per element

Detailed Section Descriptions

Understanding each section of the YAML file is crucial for creating valid mesh inputs:

Nodes Section

The nodes section defines the 3D coordinates of all mesh vertices:

nodes:
  - [0.0, 0.0, 0.0]      # Node 1: [x, y, z] coordinates
  - [1.0, 0.0, 0.0]      # Node 2
  - [1.0, 1.0, 0.0]      # Node 3
  - [0.0, 1.0, 0.0]      # Node 4

Elements Section

The elements section defines how nodes are connected to form finite elements:

elements:
  - [1, 2, 3, 4]    # Quadrilateral element using nodes 1,2,3,4
  - [1, 2, 3]       # Triangular element using nodes 1,2,3

Requirements: - Node IDs reference the nodes section (1-indexed) - Supports both triangular (3 nodes) and quadrilateral (4 nodes) elements - Node ordering should follow standard finite element conventions

Materials Section

The materials section defines material properties for composite analysis:

materials:
  - name: "carbon_fiber_unidirectional"
    E1: 150000.0    # Longitudinal Young's modulus (MPa)
    E2: 10000.0     # Transverse Young's modulus (MPa)
    G12: 5000.0     # In-plane shear modulus (MPa)
    nu12: 0.3       # Major Poisson's ratio

  - name: "glass_fiber_fabric"
    E1: 45000.0
    E2: 45000.0     # Equal for fabric (quasi-isotropic)
    G12: 4500.0
    nu12: 0.25

Requirements: - All moduli in MPa - E1: fiber direction modulus, E2: transverse modulus - G12: in-plane shear modulus - nu12: Poisson’s ratio (fiber to transverse direction)

Sets Section

The sets section groups elements by their layup configurations:

sets:
  element:
    - name: "segment_0_layup_0"
      elements: [1, 2, 5, 6]      # Shell elements
    - name: "segment_0_layup_1"
      elements: [3, 4, 7, 8]      # Different layup
  node:
    - name: "root_nodes"
      nodes: [1, 2, 3, 4]         # Boundary nodes

Requirements: - Element IDs must reference valid elements - Names should be descriptive and unique

Loading Mesh Data into OpenSG

OpenSG provides several classes for loading and working with mesh data:

Loading Individual Segment Meshes

For segment-based analysis, use the ShellSegmentMesh or SolidSegmentMesh classes:

from opensg.mesh.segment import ShellSegmentMesh, SolidSegmentMesh

# Load segment mesh directly from YAML file
shell_segment = ShellSegmentMesh("your_shell_segment_mesh.yaml")
solid_segment = SolidSegmentMesh("your_solid_segment_mesh.yaml")

Generating Segment Files from Blade Mesh

OpenSG can automatically generate individual segment files from a full blade mesh. This is currently only available for shell mesh:

from pathlib import Path
import opensg

# Generate all segment files from blade mesh
blade_mesh_file = Path("your_shell_blade_mesh.yaml")

segment_files = opensg.io.generate_segment_shell_mesh_files(
    blade_mesh_file,
    segment_folder="segments/",
    segment_indices=None  # Generate all segments (default)
)

# Generate specific segments only
specific_segments = opensg_io.generate_segment_shell_mesh_files(
    blade_mesh_file,
    segment_folder="segments/",
    segment_indices=[0, 1, 2]  # Only segments 0, 1, and 2
)