Characterisation

Elastic Analysis

Calculate elastic properties and mechanical constants of materials using Second-Order Elastic Constants (SOEC) calculations.

1. Overview

Elastic Analysis (EA) enables calculation of elastic properties and mechanical constants of materials through Second-Order Elastic Constants (SOEC) calculations with customizable strain patterns and stress algorithms. This module creates parent explorations that generate multiple child strain calculations for comprehensive elastic property determination.

EA explorations create multiple child strain calculations, each applying different strain values to compute the full elastic tensor. This differs from single-point calculations as it generates systematic strain-stress data for complete mechanical characterization.

The workflow creates individual strain calculations for each strain point, allowing efficient parallel processing of elastic property calculations with consistent computational parameters.

2. Creating EA Explorations

EA explorations require strain patterns and computational settings to generate individual strain calculations:

ea.py
from atomict.simulation.ea import create_ea_exploration

# Create basic EA exploration
result = create_ea_exploration(
    project_id="project_id",
    name="Basic Elastic Analysis",
    structure_id="structure_id",
    structure_type="userupload",
    action="DRAFT"
)

exploration_id = result['id']
print(f"Created EA exploration: {exploration_id}")
print(f"Default strains: {result['strains_list']}")

2.1 Parameter Details

EA explorations require strain configurations and computational parameters for SOEC calculations.

Strain Configuration

The strain values that get turned into individual strain calculations. Each strain creates a separate child calculation:

  • strains_list=[-0.06, -0.03, 0.03, 0.06] - Default 4-point strain pattern
  • strains_list=[-0.10, -0.05, 0.025, 0.05, 0.10] - Extended 5-point pattern for higher precision

Computational Parameters

  • stress_algorithm=2 - ASESS stress calculation method (default)
  • calculator=0 - FHI-AIMS computational engine (default)
  • stress_method=1 - Dynamic stress calculation (default)

Available Calculators

CalculatorValueStatusDeveloper
FHI-AIMS0ActiveDFT calculations (default)
ORB V3 Conservative3ActiveOrbital Materials
eSEN 30M OAM4ActiveMeta FAIR

3. Advanced Configuration

Create EA explorations with custom strain patterns and computational settings:

ea.py
from atomict.simulation.ea import (
    create_ea_exploration,
    STRESS_ALGORITHMS,
    CALCULATORS
)

# Advanced EA exploration with custom parameters
result = create_ea_exploration(
    project_id="project_id",
    name="High-Precision Elastic Analysis",
    structure_id="structure_id",
    structure_type="mlrelax",
    action="DRAFT",
    
    # Custom strain configuration
    strains_list=[-0.08, -0.04, -0.02, 0.02, 0.04, 0.08],  # 6-point pattern
    
    # Computational settings
    stress_algorithm=STRESS_ALGORITHMS["OHESS"],  # High-precision method
    calculator=CALCULATORS["ORB_V3_CONSERVATIVE"],
    
    # Analysis parameters
    num_last_samples=500,
    make_conventional_cell=True,
    add_vacuum=10,  # Add 10 Å vacuum for surface calculations
    
    description="High-precision elastic analysis with extended strain range"
)

exploration_id = result['id']

3.1 Configuration Constants

from atomict.simulation.ea import STRESS_ALGORITHMS, CALCULATORS

# Available stress algorithms
STRESS_ALGORITHMS = {
    "ULICS": 0,  # ULICS method
    "OHESS": 1,  # OHESS method (high-precision)
    "ASESS": 2   # ASESS method (default)
}

# Available calculators
CALCULATORS = {
    "FHI-AIMS": 0,                  # DFT calculations (default)
    "ORB_V3_CONSERVATIVE": 3,       # ORB V3 Conservative
    "ESEN_30M_OAM": 4              # eSEN 30M OAM
}

4. Working with EA Samples

EA explorations create individual strain calculation samples that can be monitored and managed. These samples represent the actual strain calculations performed for each strain point.

4.1 Getting Samples

After creating an EA exploration, you can retrieve all individual strain calculation samples to monitor progress and access results.

from atomict.simulation.ea import get_ea_exploration_samples

# Get all samples for an exploration
samples = get_ea_exploration_samples(exploration_id)

print(f"Found {len(samples['results'])} strain calculations")

for sample in samples['results']:
    print(f"Sample {sample['id']}: strain={sample['strain']}")
    print(f"Matrix: {sample['matrix']}")
    print(f"Status: {sample['status']}")

4.2 Getting Sample Details

Individual strain calculations have detailed information including computed stress tensors and convergence data.

from atomict.simulation.ea import get_ea_exploration_sample

# Get detailed sample information
if samples['results']:
    sample_id = samples['results'][0]['id']
    sample_detail = get_ea_exploration_sample(sample_id)
    
    print(f"Sample ID: {sample_detail['id']}")
    print(f"Strain value: {sample_detail['strain']}")
    print(f"Stress tensor: {sample_detail.get('stress_tensor', 'Not computed')}")

5. Analysis Pipeline

Create and manage analyses to extract elastic properties from completed explorations:

5.1 Creating Analysis

ea.py
from atomict.simulation.ea import create_ea_exploration_analysis

# Create analysis for completed exploration
analysis = create_ea_exploration_analysis(
    exploration_id="exploration_id",
    compute_directional_properties=True,  # Include directional properties
    action="DRAFT"
)

analysis_id = analysis['id']
print(f"Created analysis: {analysis_id}")

5.2 Launching Analysis

# Launch analysis for processing
analysis = create_ea_exploration_analysis(
    exploration_id="exploration_id",
    compute_directional_properties=True,
    action="LAUNCH"  # Process immediately
)

print(f"Analysis launched: {analysis['id']}")

5.3 Retrieving Analysis Results

from atomict.simulation.ea import get_ea_exploration_analysis

# Get analysis results
result = get_ea_exploration_analysis(analysis_id)

print(f"Analysis Status: {result['status']}")

# Check for calculated properties
if result.get('bulk_modulus'):
    print(f"Bulk modulus: {result['bulk_modulus']} GPa")

if result.get('shear_modulus'):
    print(f"Shear modulus: {result['shear_modulus']} GPa")

if result.get('youngs_modulus'):
    print(f"Young's modulus: {result['youngs_modulus']} GPa")

6. Managing EA Explorations

6.1 Listing Explorations

ea.py
from atomict.simulation.ea import list_ea_explorations

# List all EA explorations
all_explorations = list_ea_explorations()
print(f"Total explorations: {all_explorations['count']}")

# Filter by project
project_explorations = list_ea_explorations(
    project_id="project_id"
)

# Pagination support
paginated = list_ea_explorations(limit=10, offset=0)

6.2 Getting Exploration Details

ea.py
from atomict.simulation.ea import get_ea_exploration

# Get basic exploration details
exploration = get_ea_exploration(exploration_id)
print(f"Name: {exploration['name']}")
print(f"Status: {exploration['status']}")
print(f"Strain points: {len(exploration['strains_list'])}")
print(f"Calculator: {exploration['calculator']}")

6.3 Updating Explorations

ea.py
from atomict.simulation.ea import update_ea_exploration

# Update parameters before launching
updated = update_ea_exploration(
    exploration_id,
    strains_list=[-0.05, -0.025, 0.025, 0.05],  # Updated strain pattern
    stress_algorithm=1,  # Switch to OHESS
    description="Updated with optimized strain pattern"
)

7. File Management

Associate external files with analyses for additional data or custom processing:

ea.py
from atomict.simulation.ea import create_ea_exploration_analysis_file

# Associate user upload file with analysis
file_association = create_ea_exploration_analysis_file(
    analysis_id="analysis_id",
    user_upload_id="file_id"
)

print(f"Created file association: {file_association['id']}")

7.1 Retrieving File Associations

from atomict.simulation.ea import get_ea_exploration_analysis_file

# Get file details
file_info = get_ea_exploration_analysis_file("file_association_id")

print(f"File association: {file_info['id']}")
print(f"Analysis: {file_info['analysis']}")