📚 Examples

This page provides practical examples of using pyLattice for various lattice design and simulation tasks.


🔵 Basic Lattice Generation

Simple BCC Lattice

Create and visualize a basic Body-Centered Cubic (BCC) lattice structure:

from pyLattice.lattice import Lattice
from pyLattice.plotting_lattice import LatticePlotting

# Load a simple BCC lattice configuration
name_file = "design/simple_BCC"
lattice_object = Lattice(name_file)

# Create visualizer and plot the lattice
visualizer = LatticePlotting()
visualizer.visualize_lattice(lattice_object, beam_color_type="radii")

All Design Parameters

Example showcasing all available design parameters:

from pyLattice.lattice import Lattice
from pyLattice.plotting_lattice import LatticePlotting

name_file = "design/all_design_parameters"
lattice_object = Lattice(name_file, verbose=1)

# Visualize with different color schemes
visualizer = LatticePlotting()
visualizer.visualize_lattice(lattice_object, beam_color_type="materials")

🔧 Mesh Operations

Lattice Trimming with MeshTrimmer

Use MeshTrimmer to cut lattice structures to fit complex geometries:

from pyLattice.lattice import Lattice
from pyLattice.plotting_lattice import LatticePlotting
from data.inputs.mesh_file.mesh_trimmer import MeshTrimmer

# Load a mesh (e.g., bone structure)
name_mesh = "CutedBone"
mesh_trimmer = MeshTrimmer(name_mesh)
mesh_trimmer.scale_mesh(1.5)

# Create lattice with mesh trimming
name_lattice = "Bone_cuted_hybrid"
lattice_object = Lattice.from_json(name_lattice, mesh_trimmer)

# Visualize the trimmed lattice
visualizer = LatticePlotting()
visualizer.visualize_lattice(lattice_object)

🧮 Finite Element Simulation

Simple Beam Flexion Simulation

Perform a finite element simulation using pyLatticeSim:

from pyLatticeSim.lattice_sim import LatticeSim
from pyLattice.plotting_lattice import LatticePlotting
from pyLatticeSim.utils_simulation import solve_FEM_FenicsX
from pyLatticeSim.export_simulation_results import exportSimulationResults

# Load simulation configuration
name_file = "simulation/beam_flexion"
lattice_sim = LatticeSim(name_file, verbose=1)

# Run FE simulation
result = solve_FEM_FenicsX(lattice_sim)

# Export results
exportSimulationResults(lattice_sim, result)

Homogenization Analysis

Compute effective material properties of a lattice unit cell:

from pyLattice.plotting_lattice import LatticePlotting
from pyLatticeSim.lattice_sim import LatticeSim
from pyLatticeSim.utils import create_homogenization_figure
from pyLatticeSim.utils_simulation import get_homogenized_properties
from pyLatticeSim.export_simulation_results import exportSimulationResults

name_file = "simulation/hybrid_cell_homogenization"
lattice_sim = LatticeSim(name_file, verbose=1)

# Compute homogenized properties
properties = get_homogenized_properties(lattice_sim)
print(f"Effective Young's modulus: {properties['E_eff']:.2f} MPa")

🚀 Optimization

Topology Optimization

Optimize lattice topology for minimum compliance:

from pyLattice.plotting_lattice import LatticePlotting
from pyLatticeOpti.lattice_opti import LatticeOpti

name_file = "optimization/optimization_beam_flexion"
lattice_object = LatticeOpti(name_file, verbose=1, convergence_plotting=True)

# Run optimization
lattice_object.run_optimization()

# Visualize optimized result
visualizer = LatticePlotting()
visualizer.visualize_lattice(lattice_object.get_optimized_lattice())

Surrogate Model Generation

Create surrogate models for predicting lattice properties:

from pyLattice.lattice import Lattice
from pyLatticeOpti.surrogate_model_relative_densities import (
    compute_relative_densities_dataset, 
    plot_3D_scatter,
    evaluate_kriging_from_pickle
)

# Generate dataset
dataset = compute_relative_densities_dataset("hybrid_cell_parametric")

# Create and visualize surrogate model
plot_3D_scatter(dataset)
model = evaluate_kriging_from_pickle("relative_density_model")

💾 Data Management

Saving and Loading Lattices

Save computed lattices for later use:

from pyLattice.lattice import Lattice
from pyLattice.plotting_lattice import LatticePlotting

# Create and save a lattice
lattice = Lattice("design/complex_lattice")
lattice.save_pickle_lattice("my_lattice")

# Load the saved lattice
loaded_lattice = Lattice.open_pickle_lattice("my_lattice")

# Visualize
visualizer = LatticePlotting()
visualizer.visualize_lattice(loaded_lattice)

📐 Custom Geometries

Adding New Unit Cell Geometries

Define custom lattice unit cells using JSON geometry files:

{
  "name": "MyCustomCell",
  "description": "A custom parametric lattice unit cell",
  "parameters": {
    "height": 0.35,
    "angle": 20,
    "offset": "height - tan(angle * pi / 180) / 2"
  },
  "beams": [
    [0.0, 0.0, 0.0, 0.5, 0.5, "height"],
    [0.5, 0.5, "height", 1.0, 1.0, 1.0],
    [0.0, 1.0, "offset", 1.0, 0.0, "1 - offset"]
  ]
}

Use the custom geometry:

from pyLattice.lattice import Lattice

# The geometry file should be placed in src/pyLattice/geometries/
lattice = Lattice("design/config_with_custom_cell")

🛠️ Advanced Usage

Domain Decomposition

For large-scale simulations using domain decomposition methods:

from pyLatticeSim.lattice_sim import LatticeSim

name_file = "simulation/3PointBending"
solver_DDM = LatticeSim(name_file, verbose=1, enable_domain_decomposition_solver=True)

# Run simulation with domain decomposition
result = solver_DDM.solve_with_DDM()

Schur Complement Methods

Use Schur complement methods for efficient substructuring:

from pyLatticeSim.lattice_sim import LatticeSim
from pyLatticeSim.utils_simulation import get_schur_complement

name_file = "simulation/hybrid_cell_simulation"
lattice_sim = LatticeSim(name_file, verbose=1)

# Compute Schur complement
schur_matrix = get_schur_complement(lattice_sim)

For more examples, check the examples/ directory in the repository, which contains:

  • design/: Basic lattice generation examples

  • simulation/: Finite element analysis examples

  • optimization/: Topology and parameter optimization examples

Each example includes a corresponding JSON parameter file and detailed comments explaining the setup and usage.