# What Material Models Are Supported by PhaseFieldX?

> Discover the material models supported by PhaseFieldX. It features an isotropic linear-elastic model with seamless conversion of common elastic constants.

- Repository: [Miguel Castillón/phasefieldx](https://github.com/castillonmiguel/phasefieldx)
- Tags: deep-dive
- Published: 2026-02-26

---

**PhaseFieldX supports a single mechanical material model: an isotropic linear-elastic constitutive law, complemented by conversion utilities that translate between common elastic constants (Young's modulus, Poisson's ratio, Lamé parameters, and bulk modulus).**

The open-source repository `castillonmiguel/phasefieldx` implements this material model using UFL-based functions that compute strain, stress, and strain-energy density. These primitives power both standard elasticity analyses and phase-field fracture simulations throughout the library.

## Core Material Model: Isotropic Linear Elasticity

The foundation of PhaseFieldX's material modeling resides in [`src/phasefieldx/Materials/elastic_isotropic.py`](https://github.com/castillonmiguel/phasefieldx/blob/main/src/phasefieldx/Materials/elastic_isotropic.py). This module exposes three core functions that define the mechanical response for isotropic linear-elastic materials:

- **`epsilon(u)`** – Computes the symmetric strain tensor from the displacement field `u`.
- **`psi(u, lambda_, mu)`** – Calculates the strain-energy density using the Lamé parameters.
- **`sigma(u, lambda_, mu)`** – Returns the Cauchy stress tensor.

### Strain, Stress, and Energy Functions

The implementation handles both multi-dimensional and one-dimensional cases. For 2D and 3D problems, the strain tensor uses the symmetric gradient:

```python
from phasefieldx.Materials.elastic_isotropic import epsilon, sigma, psi

# Given a displacement field u (UFL object)

strain = epsilon(u)  # ε = sym(∇u)

# Compute stress using Lamé parameters

stress = sigma(u, lambda_, mu)  # σ = λ tr(ε) I + 2με

# Calculate strain energy density

energy_density = psi(u, lambda_, mu)  # ψ = ½ λ tr(ε)² + με:ε

```

In one-dimensional simulations, the functions simplify to scalar operations where `epsilon(u)` returns `∇u` directly, and the stress reduces to `(lambda_ + 2*mu) * epsilon(u)`.

## Material Property Conversion Utilities

PhaseFieldX recognizes that users may possess material data in various formats. The [`src/phasefieldx/Materials/conversion.py`](https://github.com/castillonmiguel/phasefieldx/blob/main/src/phasefieldx/Materials/conversion.py) module provides bidirectional translation between elastic constants, ensuring the isotropic model can accept inputs as **Young's modulus** (*E*), **Poisson's ratio** (*ν*), **Lamé parameters** (λ, μ), or **bulk modulus** (*K*).

### Available Conversion Functions

The utility functions compute missing parameters from any provided pair:

```python
from phasefieldx.Materials.conversion import (
    get_lambda_lame, get_mu_lame, get_bulk_modulus,
    get_youngs_modulus, get_poissons_ratio
)

# Convert from E and nu to Lamé parameters

E = 210e9    # Young's modulus [Pa]

nu = 0.3     # Poisson's ratio

lambda_ = get_lambda_lame(E, nu)  # First Lamé parameter

mu = get_mu_lame(E, nu)          # Shear modulus (second Lamé parameter)

# Reverse conversion

E_recovered = get_youngs_modulus(lambda_, mu)
nu_recovered = get_poissons_ratio(lambda_, mu)

```

These conversions are automatically invoked when parsing simulation inputs in [`src/phasefieldx/Element/Elasticity/Input.py`](https://github.com/castillonmiguel/phasefieldx/blob/main/src/phasefieldx/Element/Elasticity/Input.py) and [`src/phasefieldx/Element/Phase_Field_Fracture/Input.py`](https://github.com/castillonmiguel/phasefieldx/blob/main/src/phasefieldx/Element/Phase_Field_Fracture/Input.py), creating a material-properties container that supplies `lambda_` and `mu` to the constitutive functions.

## Integration with Phase-Field Fracture Simulations

The isotropic linear-elastic model serves as the mechanical backbone for phase-field fracture analyses. In [`src/phasefieldx/Element/Phase_Field_Fracture/solver/solver_ener_variational.py`](https://github.com/castillonmiguel/phasefieldx/blob/main/src/phasefieldx/Element/Phase_Field_Fracture/solver/solver_ener_variational.py), the stress and strain functions combine with degradation functions to model crack evolution.

### Anisotropic Energy Splitting vs. Material Anisotropy

PhaseFieldX implements **anisotropic energy splitting** through [`src/phasefieldx/Element/Phase_Field_Fracture/split_energy_stress_tangent_functions.py`](https://github.com/castillonmiguel/phasefieldx/blob/main/src/phasefieldx/Element/Phase_Field_Fracture/split_energy_stress_tangent_functions.py). This feature distinguishes between tensile and compressive stress states to prevent crack healing under compression, but it **does not constitute an anisotropic material model**. The underlying elastic stiffness remains isotropic, governed by the `sigma` and `psi` functions from [`elastic_isotropic.py`](https://github.com/castillonmiguel/phasefieldx/blob/main/elastic_isotropic.py).

```python
from phasefieldx.Element.Phase_Field_Fracture.g_degradation_functions import g
from phasefieldx.Materials.elastic_isotropic import sigma, epsilon

# Within the variational formulation

g_phi = g(phi, degradation_function)  # Degradation function of phase field

stress_active = (g_phi + k) * sigma(u, lambda_, mu)  # Degraded stress

```

## Summary

PhaseFieldX provides a focused, robust material modeling layer built around a single constitutive framework:

- **Isotropic linear-elastic material model** implemented in [`elastic_isotropic.py`](https://github.com/castillonmiguel/phasefieldx/blob/main/elastic_isotropic.py) with UFL-based functions for strain, stress, and energy density.
- **Material property conversion utilities** in [`conversion.py`](https://github.com/castillonmiguel/phasefieldx/blob/main/conversion.py) enabling seamless translation between Young's modulus, Poisson's ratio, Lamé parameters, and bulk modulus.
- **Integration with fracture mechanics** through energy degradation functions that utilize the isotropic elastic backbone while supporting tension-compression splitting.

## Frequently Asked Questions

### Does PhaseFieldX support anisotropic elastic materials?

No. PhaseFieldX currently implements only **isotropic linear-elastic** material behavior. While the library supports *anisotropic energy splitting* for phase-field fracture (distinguishing tensile from compressive damage), the underlying elastic stiffness tensor remains isotropic with no directional dependence in material properties.

### How do I specify material properties in PhaseFieldX?

You can specify material properties using any pair of standard elastic constants in the JSON input files or Python scripts. The [`conversion.py`](https://github.com/castillonmiguel/phasefieldx/blob/main/conversion.py) module automatically converts **Young's modulus** (*E*) and **Poisson's ratio** (*ν*) into the required Lamé parameters (λ, μ) used internally by the isotropic model. Alternative conversions between bulk modulus, shear modulus, and Lamé parameters are also supported.

### What is the difference between energy splitting and material anisotropy?

**Energy splitting** (implemented in [`split_energy_stress_tangent_functions.py`](https://github.com/castillonmiguel/phasefieldx/blob/main/split_energy_stress_tangent_functions.py)) is a fracture mechanics technique that separates the elastic energy into tensile and compressive components to prevent crack healing under compression. This is a *degradation strategy*, not a material model. **Material anisotropy** would imply directionally dependent elastic constants (e.g., different Young's moduli in x vs y directions), which PhaseFieldX does not currently support.

### Can I use custom constitutive laws with PhaseFieldX?

The library is designed around the isotropic linear-elastic functions in [`elastic_isotropic.py`](https://github.com/castillonmiguel/phasefieldx/blob/main/elastic_isotropic.py). While you could theoretically implement custom UFL expressions for stress and strain energy by following the same function signature (`sigma(u, lambda_, mu)` and `psi(u, lambda_, mu)`), the existing solver infrastructure in `Element/Elasticity/` and `Element/Phase_Field_Fracture/` expects the specific isotropic formulation. Extending to hyperelastic or plastic material models would require modifications to the core variational formulations.