From 3c3008aa20065040f26c1b4d6f20e21b98a10a0b Mon Sep 17 00:00:00 2001 From: VsevolodX Date: Tue, 31 Mar 2026 19:00:00 -0700 Subject: [PATCH 1/3] chore: remove empty files --- .../entities/reusable/three_dimensional/strained_non_uniform.py | 0 .../entities/reusable/three_dimensional/strained_uniform.py | 0 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/py/mat3ra/made/tools/build_components/entities/reusable/three_dimensional/strained_non_uniform.py delete mode 100644 src/py/mat3ra/made/tools/build_components/entities/reusable/three_dimensional/strained_uniform.py diff --git a/src/py/mat3ra/made/tools/build_components/entities/reusable/three_dimensional/strained_non_uniform.py b/src/py/mat3ra/made/tools/build_components/entities/reusable/three_dimensional/strained_non_uniform.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/py/mat3ra/made/tools/build_components/entities/reusable/three_dimensional/strained_uniform.py b/src/py/mat3ra/made/tools/build_components/entities/reusable/three_dimensional/strained_uniform.py deleted file mode 100644 index e69de29bb..000000000 From f7ae76f6191b672a3aecbf265f80bd1bf6474ef7 Mon Sep 17 00:00:00 2001 From: VsevolodX Date: Tue, 31 Mar 2026 19:00:21 -0700 Subject: [PATCH 2/3] update: add uniform strain builder (codex) --- .../core/modifications/strain/__init__.py | 5 ++++ .../core/modifications/strain/builder.py | 17 +++++++++++ .../modifications/strain/configuration.py | 13 ++++++++ .../core/modifications/strain/helpers.py | 30 +++++++++++++++++++ 4 files changed, 65 insertions(+) create mode 100644 src/py/mat3ra/made/tools/build_components/operations/core/modifications/strain/__init__.py create mode 100644 src/py/mat3ra/made/tools/build_components/operations/core/modifications/strain/builder.py create mode 100644 src/py/mat3ra/made/tools/build_components/operations/core/modifications/strain/configuration.py create mode 100644 src/py/mat3ra/made/tools/build_components/operations/core/modifications/strain/helpers.py diff --git a/src/py/mat3ra/made/tools/build_components/operations/core/modifications/strain/__init__.py b/src/py/mat3ra/made/tools/build_components/operations/core/modifications/strain/__init__.py new file mode 100644 index 000000000..c78973e5d --- /dev/null +++ b/src/py/mat3ra/made/tools/build_components/operations/core/modifications/strain/__init__.py @@ -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"] diff --git a/src/py/mat3ra/made/tools/build_components/operations/core/modifications/strain/builder.py b/src/py/mat3ra/made/tools/build_components/operations/core/modifications/strain/builder.py new file mode 100644 index 000000000..0f2336249 --- /dev/null +++ b/src/py/mat3ra/made/tools/build_components/operations/core/modifications/strain/builder.py @@ -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()) diff --git a/src/py/mat3ra/made/tools/build_components/operations/core/modifications/strain/configuration.py b/src/py/mat3ra/made/tools/build_components/operations/core/modifications/strain/configuration.py new file mode 100644 index 000000000..b6e26da7a --- /dev/null +++ b/src/py/mat3ra/made/tools/build_components/operations/core/modifications/strain/configuration.py @@ -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 diff --git a/src/py/mat3ra/made/tools/build_components/operations/core/modifications/strain/helpers.py b/src/py/mat3ra/made/tools/build_components/operations/core/modifications/strain/helpers.py new file mode 100644 index 000000000..cda499245 --- /dev/null +++ b/src/py/mat3ra/made/tools/build_components/operations/core/modifications/strain/helpers.py @@ -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) From c5c1ff360dcd1ddb52fb3592259b95076a644f97 Mon Sep 17 00:00:00 2001 From: VsevolodX Date: Tue, 31 Mar 2026 19:12:07 -0700 Subject: [PATCH 3/3] update: corrections --- .../core/modifications/strain/builder.py | 4 +-- tests/py/unit/test_tools_build_strain.py | 26 +++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 tests/py/unit/test_tools_build_strain.py diff --git a/src/py/mat3ra/made/tools/build_components/operations/core/modifications/strain/builder.py b/src/py/mat3ra/made/tools/build_components/operations/core/modifications/strain/builder.py index 0f2336249..ddab3a8c6 100644 --- a/src/py/mat3ra/made/tools/build_components/operations/core/modifications/strain/builder.py +++ b/src/py/mat3ra/made/tools/build_components/operations/core/modifications/strain/builder.py @@ -2,8 +2,8 @@ from mat3ra.made.tools.build_components.entities.reusable.base_builder import BaseBuilderParameters, BaseSingleBuilder -from ...... import MaterialWithBuildMetadata -from .......operations.core.unary import strain +from ..... import MaterialWithBuildMetadata +from ......operations.core.unary import strain from .configuration import StrainConfiguration diff --git a/tests/py/unit/test_tools_build_strain.py b/tests/py/unit/test_tools_build_strain.py new file mode 100644 index 000000000..1751718ef --- /dev/null +++ b/tests/py/unit/test_tools_build_strain.py @@ -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 == {}