Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from .builder import StrainBuilder
from .configuration import StrainConfiguration
from .helpers import create_strain, get_isotropic_strain_matrix

__all__ = ["StrainBuilder", "StrainConfiguration", "create_strain", "get_isotropic_strain_matrix"]
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from typing import Type

from mat3ra.made.tools.build_components.entities.reusable.base_builder import BaseBuilderParameters, BaseSingleBuilder

from ..... import MaterialWithBuildMetadata
from ......operations.core.unary import strain
from .configuration import StrainConfiguration


class StrainBuilder(BaseSingleBuilder):
_ConfigurationType: Type[StrainConfiguration] = StrainConfiguration
_BuildParametersType: Type[BaseBuilderParameters] = BaseBuilderParameters
_DefaultBuildParameters: BaseBuilderParameters = BaseBuilderParameters()

def _generate(self, configuration: StrainConfiguration) -> MaterialWithBuildMetadata:
strained_material = strain(configuration.material, configuration.strain_matrix)
return MaterialWithBuildMetadata.create(strained_material.to_dict())
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
from typing import Union

from mat3ra.esse.models.core.abstract.matrix_3x3 import Matrix3x3Schema
from mat3ra.made.material import Material
from mat3ra.made.tools.build_components.entities.reusable.base_builder import BaseConfigurationPydantic

from ..... import MaterialWithBuildMetadata


class StrainConfiguration(BaseConfigurationPydantic):
type: str = "StrainConfiguration"
material: Union[Material, MaterialWithBuildMetadata]
strain_matrix: Matrix3x3Schema
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
from typing import Union

from mat3ra.esse.models.core.abstract.matrix_3x3 import Matrix3x3Schema
from mat3ra.made.material import Material

from ..... import MaterialWithBuildMetadata
from .builder import StrainBuilder
from .configuration import StrainConfiguration


def get_isotropic_strain_matrix(scale_factor: float) -> Matrix3x3Schema:
"""
Returns a 3x3 isotropic strain matrix for uniform lattice scaling.
"""
return Matrix3x3Schema(
root=[
[scale_factor, 0.0, 0.0],
[0.0, scale_factor, 0.0],
[0.0, 0.0, scale_factor],
]
)


def create_strain(
material: Union[Material, MaterialWithBuildMetadata],
strain_matrix: Matrix3x3Schema,
) -> MaterialWithBuildMetadata:
configuration = StrainConfiguration(material=material, strain_matrix=strain_matrix)
builder = StrainBuilder()
return builder.get_material(configuration)
26 changes: 26 additions & 0 deletions tests/py/unit/test_tools_build_strain.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import pytest
from mat3ra.esse.models.core.abstract.matrix_3x3 import Matrix3x3Schema
from mat3ra.made.material import Material
from mat3ra.made.tools.build_components.operations.core.modifications.strain.helpers import create_strain
from unit.fixtures.strain import BULK_Si_CONVENTIONAL_STRAINED
from unit.utils import assert_two_entities_deep_almost_equal

from .fixtures.bulk import BULK_Si_CONVENTIONAL


@pytest.mark.parametrize(
"material_config, strain_matrix, expected_material_config",
[
(BULK_Si_CONVENTIONAL, [[1.1, 0, 0], [0, 1.1, 0], [0, 0, 1.0]], BULK_Si_CONVENTIONAL_STRAINED),
],
)
def test_create_strain(material_config, strain_matrix, expected_material_config):
material = Material.create(material_config)
strained_material = create_strain(material, Matrix3x3Schema(root=strain_matrix))

assert_two_entities_deep_almost_equal(strained_material, expected_material_config)

build_step = strained_material.metadata.build[-1]
assert build_step.configuration["type"] == "StrainConfiguration"
assert build_step.configuration["strain_matrix"] == strain_matrix
assert build_step.build_parameters == {}
Loading