@mat3ra/made 2026.8.13-0 → 2026.8.26-0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +9 -5
- package/.babelrc +0 -10
- package/.eslintrc.json +0 -11
- package/.gitattributes +0 -1
- package/.husky/post-checkout +0 -3
- package/.husky/post-commit +0 -3
- package/.husky/post-merge +0 -3
- package/.husky/pre-commit +0 -6
- package/.husky/pre-push +0 -3
- package/.mocharc.json +0 -5
- package/.pre-commit-config.yaml +0 -26
- package/.prettierignore +0 -2
- package/.prettierrc +0 -6
- package/AGENTS.md +0 -133
- package/MANIFEST.in +0 -1
- package/data/constants.json +0 -13
- package/data/reciprocal_paths.json +0 -111
- package/images/made/tools/tools_diagram_general.png +0 -3
- package/images/made/tools/tools_diagram_interface.png +0 -3
- package/pyproject.toml +0 -123
- package/scripts/generate-mixins.ts +0 -28
- package/src/__init__.py +0 -0
- package/src/js/Material.ts +0 -618
- package/src/js/basis/basis.ts +0 -634
- package/src/js/basis/constrained_basis.ts +0 -115
- package/src/js/basis/coordinates.ts +0 -92
- package/src/js/basis/elements.ts +0 -24
- package/src/js/basis/helpers.ts +0 -20
- package/src/js/basis/labels.ts +0 -6
- package/src/js/cell/cell.ts +0 -149
- package/src/js/cell/conventional_cell.ts +0 -86
- package/src/js/cell/primitive_cell.ts +0 -166
- package/src/js/constants/molecule.ts +0 -18
- package/src/js/constants.ts +0 -4
- package/src/js/constraints/constraints.ts +0 -45
- package/src/js/generated/MaterialSchemaMixin.ts +0 -79
- package/src/js/lattice/lattice.ts +0 -308
- package/src/js/lattice/lattice_types.ts +0 -134
- package/src/js/lattice/reciprocal/lattice_reciprocal.ts +0 -206
- package/src/js/lattice/reciprocal/paths.ts +0 -39
- package/src/js/lattice/reciprocal/symmetry_points.ts +0 -886
- package/src/js/lattice/unit_cell.ts +0 -66
- package/src/js/made.ts +0 -62
- package/src/js/parsers/cif.ts +0 -25
- package/src/js/parsers/errors.ts +0 -6
- package/src/js/parsers/espresso.ts +0 -29
- package/src/js/parsers/native_format_parsers.ts +0 -52
- package/src/js/parsers/parsers.ts +0 -13
- package/src/js/parsers/poscar.ts +0 -218
- package/src/js/parsers/xyz.ts +0 -190
- package/src/js/parsers/xyz_combinatorial_basis.ts +0 -268
- package/src/js/tools/basis.ts +0 -131
- package/src/js/tools/cell.ts +0 -40
- package/src/js/tools/index.ts +0 -11
- package/src/js/tools/material.ts +0 -64
- package/src/js/tools/supercell.ts +0 -89
- package/src/js/tools/surface.ts +0 -213
- package/src/py/__init__.py +0 -0
- package/src/py/mat3ra/__init__.py +0 -1
- package/src/py/mat3ra/made/__init__.py +0 -7
- package/src/py/mat3ra/made/basis/__init__.py +0 -255
- package/src/py/mat3ra/made/basis/coordinates.py +0 -43
- package/src/py/mat3ra/made/cell/__init__.py +0 -55
- package/src/py/mat3ra/made/cell/primitive_cell.py +0 -156
- package/src/py/mat3ra/made/data_helper.py +0 -5
- package/src/py/mat3ra/made/lattice.py +0 -195
- package/src/py/mat3ra/made/material.py +0 -135
- package/src/py/mat3ra/made/metadata.py +0 -45
- package/src/py/mat3ra/made/reciprocal/__init__.py +0 -5
- package/src/py/mat3ra/made/reciprocal/lattice_reciprocal.py +0 -147
- package/src/py/mat3ra/made/reciprocal/paths.py +0 -30
- package/src/py/mat3ra/made/reciprocal/symmetry_points.py +0 -385
- package/src/py/mat3ra/made/tools/README.md +0 -173
- package/src/py/mat3ra/made/tools/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/analyze/__init__.py +0 -31
- package/src/py/mat3ra/made/tools/analyze/basis/__init__.py +0 -3
- package/src/py/mat3ra/made/tools/analyze/basis/analyzer.py +0 -50
- package/src/py/mat3ra/made/tools/analyze/build_metadata_analyzer.py +0 -32
- package/src/py/mat3ra/made/tools/analyze/build_metadata_analyzer_factory.py +0 -31
- package/src/py/mat3ra/made/tools/analyze/coordination.py +0 -56
- package/src/py/mat3ra/made/tools/analyze/crystal_site/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/analyze/crystal_site/adatom_crystal_site_material_analyzer.py +0 -35
- package/src/py/mat3ra/made/tools/analyze/crystal_site/adatom_material_analyzer.py +0 -49
- package/src/py/mat3ra/made/tools/analyze/crystal_site/crystal_site_analyzer.py +0 -65
- package/src/py/mat3ra/made/tools/analyze/crystal_site/voronoi_crystal_site_analyzer.py +0 -47
- package/src/py/mat3ra/made/tools/analyze/enums.py +0 -33
- package/src/py/mat3ra/made/tools/analyze/fingerprint/__init__.py +0 -4
- package/src/py/mat3ra/made/tools/analyze/fingerprint/layers/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/analyze/fingerprint/layers/layered_fingerprint_along_axis.py +0 -83
- package/src/py/mat3ra/made/tools/analyze/fingerprint/layers/unique_element_string_per_layer.py +0 -9
- package/src/py/mat3ra/made/tools/analyze/interface/__init__.py +0 -20
- package/src/py/mat3ra/made/tools/analyze/interface/commensurate.py +0 -156
- package/src/py/mat3ra/made/tools/analyze/interface/enums.py +0 -60
- package/src/py/mat3ra/made/tools/analyze/interface/grain_boundary.py +0 -80
- package/src/py/mat3ra/made/tools/analyze/interface/simple.py +0 -251
- package/src/py/mat3ra/made/tools/analyze/interface/twisted_nanoribbons.py +0 -91
- package/src/py/mat3ra/made/tools/analyze/interface/utils/__init__.py +0 -77
- package/src/py/mat3ra/made/tools/analyze/interface/utils/holders.py +0 -14
- package/src/py/mat3ra/made/tools/analyze/interface/utils/vector.py +0 -56
- package/src/py/mat3ra/made/tools/analyze/interface/zsl.py +0 -259
- package/src/py/mat3ra/made/tools/analyze/interface_material.py +0 -45
- package/src/py/mat3ra/made/tools/analyze/lattice/__init__.py +0 -2
- package/src/py/mat3ra/made/tools/analyze/lattice/analyzer.py +0 -126
- package/src/py/mat3ra/made/tools/analyze/lattice/helpers.py +0 -31
- package/src/py/mat3ra/made/tools/analyze/lattice_lines.py +0 -30
- package/src/py/mat3ra/made/tools/analyze/lattice_planes.py +0 -192
- package/src/py/mat3ra/made/tools/analyze/lattice_swap_analyzer.py +0 -105
- package/src/py/mat3ra/made/tools/analyze/material.py +0 -276
- package/src/py/mat3ra/made/tools/analyze/other.py +0 -434
- package/src/py/mat3ra/made/tools/analyze/rdf.py +0 -74
- package/src/py/mat3ra/made/tools/analyze/slab.py +0 -76
- package/src/py/mat3ra/made/tools/analyze/solid_solution_analyzer.py +0 -171
- package/src/py/mat3ra/made/tools/analyze/terrace.py +0 -105
- package/src/py/mat3ra/made/tools/analyze/utils.py +0 -162
- package/src/py/mat3ra/made/tools/bond_directions/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/bond_directions/bond_directions.py +0 -150
- package/src/py/mat3ra/made/tools/bond_directions/bond_directions_for_element_list.py +0 -7
- package/src/py/mat3ra/made/tools/bond_directions/bond_directions_templates_enum.py +0 -8
- package/src/py/mat3ra/made/tools/bond_directions/bond_directions_templates_for_element.py +0 -16
- package/src/py/mat3ra/made/tools/build/__init__.py +0 -25
- package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/heterostructure/__init__.py +0 -7
- package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/heterostructure/helpers.py +0 -59
- package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/heterostructure/types.py +0 -26
- package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/heterostructure/utils.py +0 -139
- package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/__init__.py +0 -47
- package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/base/__init__.py +0 -11
- package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/base/build_parameters.py +0 -5
- package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/base/builder.py +0 -164
- package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/base/configuration.py +0 -48
- package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/base/helpers.py +0 -134
- package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/commensurate/__init__.py +0 -6
- package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/commensurate/helpers.py +0 -157
- package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/enums.py +0 -7
- package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/twisted/__init__.py +0 -7
- package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/twisted/configuration.py +0 -13
- package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/twisted/helpers.py +0 -70
- package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/utils.py +0 -87
- package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/zsl/__init__.py +0 -6
- package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/zsl/helpers.py +0 -129
- package/src/py/mat3ra/made/tools/build/defective_structures/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build/defective_structures/one_dimensional/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build/defective_structures/one_dimensional/grain_boundary_linear/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build/defective_structures/one_dimensional/grain_boundary_linear/build_parameters.py +0 -12
- package/src/py/mat3ra/made/tools/build/defective_structures/one_dimensional/grain_boundary_linear/builder.py +0 -17
- package/src/py/mat3ra/made/tools/build/defective_structures/one_dimensional/grain_boundary_linear/configuration.py +0 -40
- package/src/py/mat3ra/made/tools/build/defective_structures/one_dimensional/grain_boundary_linear/helpers.py +0 -82
- package/src/py/mat3ra/made/tools/build/defective_structures/three_dimensional/__init__.py +0 -1
- package/src/py/mat3ra/made/tools/build/defective_structures/three_dimensional/solid_solution/__init__.py +0 -9
- package/src/py/mat3ra/made/tools/build/defective_structures/three_dimensional/solid_solution/builder.py +0 -37
- package/src/py/mat3ra/made/tools/build/defective_structures/three_dimensional/solid_solution/configuration.py +0 -30
- package/src/py/mat3ra/made/tools/build/defective_structures/three_dimensional/solid_solution/enums.py +0 -8
- package/src/py/mat3ra/made/tools/build/defective_structures/three_dimensional/solid_solution/helpers.py +0 -76
- package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/adatom/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/adatom/builder.py +0 -11
- package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/adatom/configuration.py +0 -18
- package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/adatom/helpers.py +0 -137
- package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/adatom/types.py +0 -22
- package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/grain_boundary_planar/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/grain_boundary_planar/builder.py +0 -28
- package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/grain_boundary_planar/configuration.py +0 -55
- package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/grain_boundary_planar/helpers.py +0 -75
- package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/island/builder.py +0 -15
- package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/island/configuration.py +0 -16
- package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/island/helpers.py +0 -116
- package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/terrace/build_parameters.py +0 -10
- package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/terrace/builder.py +0 -30
- package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/terrace/configuration.py +0 -11
- package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/terrace/helpers.py +0 -78
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/pair_defect/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/pair_defect/builder.py +0 -31
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/pair_defect/configuration.py +0 -45
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/pair_defect/helpers.py +0 -80
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/__init__.py +0 -40
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/atom_placement_method_enum.py +0 -14
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/base/__init__.py +0 -7
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/base/builder.py +0 -42
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/base/configuration.py +0 -27
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/complex_defect_type_enum.py +0 -5
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/factories.py +0 -69
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/helpers.py +0 -92
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/interstitial/__init__.py +0 -7
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/interstitial/builder.py +0 -8
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/interstitial/configuration.py +0 -29
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/interstitial/helpers.py +0 -48
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/interstitial/interstitial_placement_method_enum.py +0 -8
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/point_defect_type_enum.py +0 -8
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/substitutional/__init__.py +0 -7
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/substitutional/builder.py +0 -6
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/substitutional/configuration.py +0 -41
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/substitutional/helpers.py +0 -43
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/substitutional/substitution_placement_method_enum.py +0 -7
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/types.py +0 -24
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/vacancy/__init__.py +0 -7
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/vacancy/builder.py +0 -19
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/vacancy/configuration.py +0 -27
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/vacancy/helpers.py +0 -42
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/vacancy/vacancy_placement_method_enum.py +0 -7
- package/src/py/mat3ra/made/tools/build/pristine_structures/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build/pristine_structures/three_dimensional/ideal_crystal/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build/pristine_structures/three_dimensional/ideal_crystal/builder.py +0 -80
- package/src/py/mat3ra/made/tools/build/pristine_structures/three_dimensional/ideal_crystal/configurations.py +0 -22
- package/src/py/mat3ra/made/tools/build/pristine_structures/three_dimensional/ideal_crystal/helpers.py +0 -40
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanoribbon/__init__.py +0 -29
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanoribbon/build_parameters.py +0 -5
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanoribbon/builders.py +0 -56
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanoribbon/configuration.py +0 -33
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanoribbon/helpers.py +0 -76
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanotape/__init__.py +0 -11
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanotape/build_parameters.py +0 -9
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanotape/builders.py +0 -83
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanotape/configuration.py +0 -35
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanotape/helpers.py +0 -62
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/slab/__init__.py +0 -9
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/slab/build_parameters.py +0 -8
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/slab/builder.py +0 -42
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/slab/configuration.py +0 -99
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/slab/helpers.py +0 -95
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/slab/termination_utils.py +0 -14
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/slab/utils.py +0 -61
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/slab_strained_supercell/builder.py +0 -22
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/slab_strained_supercell/configuration.py +0 -17
- package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/__init__.py +0 -19
- package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/analyzer.py +0 -86
- package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/ase_based/__init__.py +0 -7
- package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/ase_based/builder.py +0 -54
- package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/ase_based/configuration.py +0 -19
- package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/enums.py +0 -42
- package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/helpers.py +0 -127
- package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/merge_based/__init__.py +0 -7
- package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/merge_based/builder.py +0 -33
- package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/merge_based/configuration.py +0 -16
- package/src/py/mat3ra/made/tools/build/processed_structures/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/passivation/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/passivation/analyzers/__init__.py +0 -9
- package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/passivation/analyzers/coordination_based_passivation_material_analyzer.py +0 -112
- package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/passivation/analyzers/passivation_material_analyzer.py +0 -16
- package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/passivation/analyzers/surface_passivation_material_analyzer.py +0 -32
- package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/passivation/builder.py +0 -23
- package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/passivation/configuration.py +0 -31
- package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/passivation/enums.py +0 -7
- package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/passivation/helpers.py +0 -151
- package/src/py/mat3ra/made/tools/build_components/__init__.py +0 -10
- package/src/py/mat3ra/made/tools/build_components/entities/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/one_dimensional/miller_indices_2d.py +0 -0
- package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/two_dimensional/miller_indices.py +0 -18
- package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/two_dimensional/termination.py +0 -33
- package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/zero_dimensional/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/zero_dimensional/crystal_site/__init__.py +0 -2
- package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/zero_dimensional/crystal_site/crystal_site.py +0 -24
- package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/zero_dimensional/crystal_site/crystal_site_list.py +0 -9
- package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/zero_dimensional/point_defect_site/builder.py +0 -32
- package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/zero_dimensional/point_defect_site/configuration.py +0 -14
- package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/zero_dimensional/void_region/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/zero_dimensional/void_region/builder.py +0 -29
- package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/zero_dimensional/void_region/configuration.py +0 -19
- package/src/py/mat3ra/made/tools/build_components/entities/core/two_dimensional/vacuum/builder.py +0 -48
- package/src/py/mat3ra/made/tools/build_components/entities/core/two_dimensional/vacuum/configuration.py +0 -17
- package/src/py/mat3ra/made/tools/build_components/entities/core/zero_dimensional/atom/builder.py +0 -25
- package/src/py/mat3ra/made/tools/build_components/entities/core/zero_dimensional/atom/configuration.py +0 -8
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/base_builder/__init__.py +0 -16
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/base_builder/base_configuration_pydantic.py +0 -5
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/base_builder/base_single_builder.py +0 -87
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/base_builder/build_parameters.py +0 -5
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/one_dimensional/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/one_dimensional/crystal_lattice_lines/__init__.py +0 -4
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/one_dimensional/crystal_lattice_lines/builder.py +0 -46
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/one_dimensional/crystal_lattice_lines/configuration.py +0 -19
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/one_dimensional/crystal_lattice_lines/edge_types.py +0 -51
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/one_dimensional/crystal_lattice_lines/helpers.py +0 -58
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/one_dimensional/crystal_lattice_lines_unique_repeated/__init__.py +0 -4
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/one_dimensional/crystal_lattice_lines_unique_repeated/builder.py +0 -42
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/one_dimensional/crystal_lattice_lines_unique_repeated/configuration.py +0 -21
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/three_dimensional/supercell/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/three_dimensional/supercell/configuration.py +0 -11
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/three_dimensional/supercell/helpers.py +0 -38
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/__init__.py +0 -24
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/atomic_layers_unique_repeated/__init__.py +0 -7
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/atomic_layers_unique_repeated/builder.py +0 -62
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/atomic_layers_unique_repeated/configuration.py +0 -14
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/atomic_layers_unique_repeated/helpers.py +0 -42
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/crystal_lattice_planes/__init__.py +0 -7
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/crystal_lattice_planes/builder.py +0 -39
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/crystal_lattice_planes/configuration.py +0 -24
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/slab_stack/__init__.py +0 -10
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/slab_stack/builder.py +0 -36
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/slab_stack/configuration.py +0 -31
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/slab_stack/helpers.py +0 -80
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/zero_dimensional/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/zero_dimensional/coordinates_shape_enum.py +0 -8
- package/src/py/mat3ra/made/tools/build_components/metadata/__init__.py +0 -2
- package/src/py/mat3ra/made/tools/build_components/metadata/build_metadata.py +0 -7
- package/src/py/mat3ra/made/tools/build_components/metadata/material_build_metadata.py +0 -35
- package/src/py/mat3ra/made/tools/build_components/metadata/material_with_build_metadata.py +0 -8
- package/src/py/mat3ra/made/tools/build_components/mixins/__init__.py +0 -2
- package/src/py/mat3ra/made/tools/build_components/mixins/convert_generated_items_ase_atoms_mixin.py +0 -8
- package/src/py/mat3ra/made/tools/build_components/mixins/convert_generated_items_pymatgen_structure_mixin.py +0 -8
- package/src/py/mat3ra/made/tools/build_components/operations/core/combinations/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build_components/operations/core/combinations/enums.py +0 -11
- package/src/py/mat3ra/made/tools/build_components/operations/core/combinations/merge/__init__.py +0 -6
- package/src/py/mat3ra/made/tools/build_components/operations/core/combinations/merge/build_parameters.py +0 -18
- package/src/py/mat3ra/made/tools/build_components/operations/core/combinations/merge/builder.py +0 -93
- package/src/py/mat3ra/made/tools/build_components/operations/core/combinations/merge/configuration.py +0 -20
- package/src/py/mat3ra/made/tools/build_components/operations/core/combinations/stack/builder.py +0 -83
- package/src/py/mat3ra/made/tools/build_components/operations/core/combinations/stack/configuration.py +0 -24
- package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/__init__.py +0 -15
- package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/build_parameters.py +0 -5
- package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/builders/base.py +0 -33
- package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/builders/isometric.py +0 -25
- package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/configuration.py +0 -24
- package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/functions/__init__.py +0 -13
- package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/functions/atomic_mass_dependent_function_holder.py +0 -32
- package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/functions/function_holder.py +0 -80
- package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/functions/maxwell_boltzmann.py +0 -39
- package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/functions/perturbation_function_holder.py +0 -45
- package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/functions/sine_wave_perturbation_function_holder.py +0 -29
- package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/helpers.py +0 -83
- package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/strain/__init__.py +0 -5
- package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/strain/builder.py +0 -25
- package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/strain/configuration.py +0 -23
- package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/strain/helpers.py +0 -49
- package/src/py/mat3ra/made/tools/build_components/utils.py +0 -44
- package/src/py/mat3ra/made/tools/calculate/__init__.py +0 -149
- package/src/py/mat3ra/made/tools/calculate/ase/__init__.py +0 -133
- package/src/py/mat3ra/made/tools/calculate/ase/constraints.py +0 -91
- package/src/py/mat3ra/made/tools/calculate/calculators/__init__.py +0 -4
- package/src/py/mat3ra/made/tools/calculate/calculators/interface_material_calculator.py +0 -70
- package/src/py/mat3ra/made/tools/calculate/calculators/interface_material_calculator_parameters.py +0 -14
- package/src/py/mat3ra/made/tools/calculate/calculators/material_calculator.py +0 -32
- package/src/py/mat3ra/made/tools/calculate/calculators/material_calculator_parameters.py +0 -17
- package/src/py/mat3ra/made/tools/calculate/interaction_functions.py +0 -23
- package/src/py/mat3ra/made/tools/convert/__init__.py +0 -286
- package/src/py/mat3ra/made/tools/convert/interface_parts_enum.py +0 -9
- package/src/py/mat3ra/made/tools/convert/utils.py +0 -96
- package/src/py/mat3ra/made/tools/entities/__init__.py +0 -5
- package/src/py/mat3ra/made/tools/entities/coordinate/__init__.py +0 -14
- package/src/py/mat3ra/made/tools/entities/coordinate/box_coordinate_condition.py +0 -15
- package/src/py/mat3ra/made/tools/entities/coordinate/coordinate_condition.py +0 -16
- package/src/py/mat3ra/made/tools/entities/coordinate/coordinate_functions.py +0 -158
- package/src/py/mat3ra/made/tools/entities/coordinate/cylinder_coordinate_condition.py +0 -17
- package/src/py/mat3ra/made/tools/entities/coordinate/plane_coordinate_condition.py +0 -14
- package/src/py/mat3ra/made/tools/entities/coordinate/sphere_coordinate_condition.py +0 -15
- package/src/py/mat3ra/made/tools/entities/coordinate/triangular_prism_coordinate_condition.py +0 -26
- package/src/py/mat3ra/made/tools/entities/termination_holder.py +0 -12
- package/src/py/mat3ra/made/tools/helpers.py +0 -168
- package/src/py/mat3ra/made/tools/modify.py +0 -627
- package/src/py/mat3ra/made/tools/operations/core/binary.py +0 -106
- package/src/py/mat3ra/made/tools/operations/core/unary.py +0 -170
- package/src/py/mat3ra/made/tools/operations/core/utils.py +0 -138
- package/src/py/mat3ra/made/tools/operations/reusable/unary.py +0 -53
- package/src/py/mat3ra/made/tools/optimize.py +0 -55
- package/src/py/mat3ra/made/tools/third_party.py +0 -69
- package/src/py/mat3ra/made/tools/utils.py +0 -182
- package/src/py/mat3ra/made/utils.py +0 -144
- package/tests/.gitattributes +0 -1
- package/tests/fixtures/AsGe-basis.json +0 -3
- package/tests/fixtures/C2H4-translated.json +0 -3
- package/tests/fixtures/C2H4.json +0 -3
- package/tests/fixtures/FeLiSi-basis.json +0 -3
- package/tests/fixtures/FeO.json +0 -3
- package/tests/fixtures/Ge2-basis.json +0 -3
- package/tests/fixtures/Graphene.json +0 -3
- package/tests/fixtures/Graphene.poscar +0 -3
- package/tests/fixtures/H2+H-final.json +0 -3
- package/tests/fixtures/H2+H-image.json +0 -3
- package/tests/fixtures/H2+H-initial.json +0 -3
- package/tests/fixtures/H2O.poscar +0 -3
- package/tests/fixtures/LiFeSi-basis-labels.json +0 -3
- package/tests/fixtures/LiFeSi-basis.json +0 -3
- package/tests/fixtures/Na.json +0 -3
- package/tests/fixtures/Na4Cl4-cartesian.json +0 -3
- package/tests/fixtures/Na4Cl4.json +0 -3
- package/tests/fixtures/Na4Cl4.poscar +0 -3
- package/tests/fixtures/Ni-hex.json +0 -3
- package/tests/fixtures/Ni-hex.poscar +0 -3
- package/tests/fixtures/OSi-basis.json +0 -3
- package/tests/fixtures/Si-hex.poscar +0 -3
- package/tests/fixtures/Si-pwscf.in +0 -3
- package/tests/fixtures/Si-slab.json +0 -3
- package/tests/fixtures/Si-supercell.json +0 -3
- package/tests/fixtures/Si2-basis-repeated.json +0 -3
- package/tests/fixtures/Si2-basis.json +0 -3
- package/tests/fixtures/Zr1H23Zr1H1.json +0 -3
- package/tests/fixtures/Zr1H23Zr1H1.poscar +0 -3
- package/tests/fixtures/atomic-constraints.json +0 -3
- package/tests/fixtures/hashes.json +0 -3
- package/tests/fixtures/si-slab-100.json +0 -3
- package/tests/fixtures/si-slab-111-0-vacuum.json +0 -3
- package/tests/fixtures/si-slab-111-0.5-vacuum-gamma-120.json +0 -3
- package/tests/fixtures/si-slab-111-0.5-vacuum-ratio.json +0 -3
- package/tests/fixtures/si-standata.json +0 -3
- package/tests/js/basis/basis.ts +0 -247
- package/tests/js/cell/cell.ts +0 -182
- package/tests/js/cell/primitive_cell.ts +0 -21
- package/tests/js/constraints/constraints.ts +0 -11
- package/tests/js/fixtures.ts +0 -123
- package/tests/js/lattice/lattice.ts +0 -43
- package/tests/js/lattice/lattice_reciprocal.ts +0 -104
- package/tests/js/material/material.ts +0 -161
- package/tests/js/parsers/espresso.ts +0 -12
- package/tests/js/parsers/native_formats.ts +0 -35
- package/tests/js/parsers/poscar.ts +0 -89
- package/tests/js/parsers/xyz.ts +0 -33
- package/tests/js/parsers/xyz_combinatorial_basis.ts +0 -156
- package/tests/js/register-esse-schemas.cjs +0 -10
- package/tests/js/setup.ts +0 -6
- package/tests/js/tools/basis.ts +0 -22
- package/tests/js/tools/supercell.ts +0 -58
- package/tests/js/tools/surface.ts +0 -111
- package/tests/py/conftest.py +0 -34
- package/tests/py/mat3ra/debug_utils.py +0 -75
- package/tests/py/unit/__init__.py +0 -0
- package/tests/py/unit/fixtures/__init__.py +0 -0
- package/tests/py/unit/fixtures/adatom.py +0 -60
- package/tests/py/unit/fixtures/bulk.py +0 -162
- package/tests/py/unit/fixtures/cuts.py +0 -118
- package/tests/py/unit/fixtures/grain_boundary.py +0 -875
- package/tests/py/unit/fixtures/interface/commensurate.py +0 -498
- package/tests/py/unit/fixtures/interface/gaas_dia.py +0 -837
- package/tests/py/unit/fixtures/interface/gr_ni_111_top_hcp.py +0 -123
- package/tests/py/unit/fixtures/interface/simple.py +0 -84
- package/tests/py/unit/fixtures/interface/twisted_nanoribbons.py +0 -131
- package/tests/py/unit/fixtures/interface/zsl.py +0 -756
- package/tests/py/unit/fixtures/island.py +0 -336
- package/tests/py/unit/fixtures/merge.py +0 -147
- package/tests/py/unit/fixtures/monolayer.py +0 -46
- package/tests/py/unit/fixtures/nanoparticle.py +0 -116
- package/tests/py/unit/fixtures/nanoribbon/__init__.py +0 -0
- package/tests/py/unit/fixtures/nanoribbon/armchair.py +0 -102
- package/tests/py/unit/fixtures/nanoribbon/nanoribbon.py +0 -145
- package/tests/py/unit/fixtures/nanoribbon/zigzag.py +0 -54
- package/tests/py/unit/fixtures/pair_defects.py +0 -41
- package/tests/py/unit/fixtures/passivated/nanoribbon.py +0 -69
- package/tests/py/unit/fixtures/passivated/slab.py +0 -58
- package/tests/py/unit/fixtures/point_defects.py +0 -158
- package/tests/py/unit/fixtures/slab.py +0 -606
- package/tests/py/unit/fixtures/strain.py +0 -42
- package/tests/py/unit/fixtures/supercell.py +0 -64
- package/tests/py/unit/fixtures/terrace.py +0 -70
- package/tests/py/unit/fixtures/thrid_party/ase_atoms.py +0 -13
- package/tests/py/unit/test_analyze_lattice_planes.py +0 -131
- package/tests/py/unit/test_cell.py +0 -104
- package/tests/py/unit/test_data_files.py +0 -68
- package/tests/py/unit/test_lattice.py +0 -103
- package/tests/py/unit/test_lattice_type_extended.py +0 -53
- package/tests/py/unit/test_material.py +0 -158
- package/tests/py/unit/test_operations.py +0 -126
- package/tests/py/unit/test_primitive_cell.py +0 -118
- package/tests/py/unit/test_reciprocal_lattice.py +0 -86
- package/tests/py/unit/test_reciprocal_paths.py +0 -64
- package/tests/py/unit/test_symmetry_points.py +0 -151
- package/tests/py/unit/test_tools_analyze.py +0 -219
- package/tests/py/unit/test_tools_analyze_basis.py +0 -105
- package/tests/py/unit/test_tools_analyze_interface.py +0 -223
- package/tests/py/unit/test_tools_analyze_interface_material.py +0 -63
- package/tests/py/unit/test_tools_analyze_interface_zsl.py +0 -187
- package/tests/py/unit/test_tools_analyze_lattice.py +0 -74
- package/tests/py/unit/test_tools_analyze_swap.py +0 -80
- package/tests/py/unit/test_tools_build.py +0 -158
- package/tests/py/unit/test_tools_build_defect/__init__.py +0 -0
- package/tests/py/unit/test_tools_build_defect/test_adatom.py +0 -84
- package/tests/py/unit/test_tools_build_defect/test_island.py +0 -45
- package/tests/py/unit/test_tools_build_defect/test_pair_defect.py +0 -84
- package/tests/py/unit/test_tools_build_defect/test_point_defect.py +0 -196
- package/tests/py/unit/test_tools_build_defect/test_slab_stack.py +0 -30
- package/tests/py/unit/test_tools_build_defect/test_solid_solution.py +0 -90
- package/tests/py/unit/test_tools_build_defect/test_terrace.py +0 -44
- package/tests/py/unit/test_tools_build_grain_boundary.py +0 -133
- package/tests/py/unit/test_tools_build_heterostructure.py +0 -46
- package/tests/py/unit/test_tools_build_interface.py +0 -292
- package/tests/py/unit/test_tools_build_interface_zsl.py +0 -263
- package/tests/py/unit/test_tools_build_maxwell_disorder.py +0 -123
- package/tests/py/unit/test_tools_build_metadata.py +0 -79
- package/tests/py/unit/test_tools_build_monolayer.py +0 -33
- package/tests/py/unit/test_tools_build_nanoparticle.py +0 -42
- package/tests/py/unit/test_tools_build_nanoribbon.py +0 -45
- package/tests/py/unit/test_tools_build_passivation.py +0 -85
- package/tests/py/unit/test_tools_build_perturbation.py +0 -103
- package/tests/py/unit/test_tools_build_slab.py +0 -382
- package/tests/py/unit/test_tools_build_strain.py +0 -36
- package/tests/py/unit/test_tools_build_supercell.py +0 -47
- package/tests/py/unit/test_tools_calculate.py +0 -67
- package/tests/py/unit/test_tools_convert.py +0 -174
- package/tests/py/unit/test_tools_modify.py +0 -248
- package/tests/py/unit/utils.py +0 -142
- package/tsconfig-transpile.json +0 -3
- package/tsconfig.json +0 -3
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
from typing import List, Optional
|
|
2
|
-
|
|
3
|
-
import numpy as np
|
|
4
|
-
from mat3ra.esse.models.core.reusable.axis_enum import AxisEnum
|
|
5
|
-
from mat3ra.esse.models.materials_category_components.operations.core.combinations.merge import MergeMethodsEnum
|
|
6
|
-
from mat3ra.made.material import Material
|
|
7
|
-
from mat3ra.made.utils import AXIS_TO_INDEX_MAP
|
|
8
|
-
|
|
9
|
-
from ...build_components import MaterialWithBuildMetadata
|
|
10
|
-
from ...modify import translate_by_vector
|
|
11
|
-
from .utils import merge_two_materials, should_skip_stacking
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
def merge(
|
|
15
|
-
materials: List[Material],
|
|
16
|
-
merge_method: Optional[MergeMethodsEnum] = MergeMethodsEnum.ADD,
|
|
17
|
-
material_name: Optional[str] = None,
|
|
18
|
-
distance_tolerance: float = 0.1,
|
|
19
|
-
merge_dangerously: bool = False,
|
|
20
|
-
) -> MaterialWithBuildMetadata:
|
|
21
|
-
"""
|
|
22
|
-
Merge multiple materials using a specific merge method.
|
|
23
|
-
|
|
24
|
-
Args:
|
|
25
|
-
materials (List[Material]): List of materials to merge.
|
|
26
|
-
merge_method (MergeMethodsEnum): The merge method to use.
|
|
27
|
-
material_name (Optional[str]): Name of the merged material.
|
|
28
|
-
distance_tolerance (float): The tolerance for resolving overlapping coordinates.
|
|
29
|
-
merge_dangerously (bool): If True, allows merging even if lattices are different.
|
|
30
|
-
|
|
31
|
-
Returns:
|
|
32
|
-
MaterialWithBuildMetadata: The merged material.
|
|
33
|
-
"""
|
|
34
|
-
merged_material = materials[0]
|
|
35
|
-
for material in materials[1:]:
|
|
36
|
-
merged_material = merge_two_materials(
|
|
37
|
-
merged_material, material, merge_method, material_name, distance_tolerance, merge_dangerously
|
|
38
|
-
)
|
|
39
|
-
return merged_material
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
def stack(materials: List[Material], direction: AxisEnum) -> MaterialWithBuildMetadata:
|
|
43
|
-
result = materials[0]
|
|
44
|
-
for material in materials[1:]:
|
|
45
|
-
result = stack_two_materials(material_1=result, material_2=material, direction=direction)
|
|
46
|
-
return result
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
def stack_two_materials(
|
|
50
|
-
material_1: Material,
|
|
51
|
-
material_2: Material,
|
|
52
|
-
direction: AxisEnum = AxisEnum.z,
|
|
53
|
-
) -> MaterialWithBuildMetadata:
|
|
54
|
-
"""
|
|
55
|
-
Stack two materials along a specified direction by expanding lattices and merging.
|
|
56
|
-
|
|
57
|
-
First attempts to stack materials as-is. If that fails due to lattice mismatch,
|
|
58
|
-
adjusts the in-plane lattice vectors of material_2 to match material_1 and tries again.
|
|
59
|
-
|
|
60
|
-
Args:
|
|
61
|
-
material_1: First material to stack.
|
|
62
|
-
material_2: Second material to stack.
|
|
63
|
-
direction: Direction along which to stack (x, y, or z axis).
|
|
64
|
-
|
|
65
|
-
Returns:
|
|
66
|
-
MaterialWithBuildMetadata: Stacked material with combined lattice and atoms.
|
|
67
|
-
"""
|
|
68
|
-
lattice_vector_index = AXIS_TO_INDEX_MAP[direction.value]
|
|
69
|
-
|
|
70
|
-
try:
|
|
71
|
-
if should_skip_stacking(material_1, material_2, lattice_vector_index):
|
|
72
|
-
return material_1.clone()
|
|
73
|
-
|
|
74
|
-
material_1_lattice_vectors = material_1.lattice.vector_arrays
|
|
75
|
-
material_2_lattice_vectors = material_2.lattice.vector_arrays
|
|
76
|
-
|
|
77
|
-
stacked_lattice_vectors_values = [vector.copy() for vector in material_1_lattice_vectors]
|
|
78
|
-
stacked_lattice_vectors_values[lattice_vector_index] = (
|
|
79
|
-
np.array(material_1_lattice_vectors[lattice_vector_index])
|
|
80
|
-
+ np.array(material_2_lattice_vectors[lattice_vector_index])
|
|
81
|
-
).tolist()
|
|
82
|
-
|
|
83
|
-
material_1_final_lattice_config = material_1.clone()
|
|
84
|
-
material_1_final_lattice_config.set_lattice_vectors_from_array(stacked_lattice_vectors_values)
|
|
85
|
-
|
|
86
|
-
# Translate material2 so its atoms are positioned correctly relative to material1
|
|
87
|
-
material_2_adjusted_c = material_2.clone()
|
|
88
|
-
material_2_adjusted_c.set_lattice_vectors_from_array(stacked_lattice_vectors_values)
|
|
89
|
-
# The translation amount is the original lattice vector of material1 in the stacking direction
|
|
90
|
-
translation_vec = material_1_lattice_vectors[lattice_vector_index]
|
|
91
|
-
material_2_translated = translate_by_vector(
|
|
92
|
-
material_2_adjusted_c, translation_vec, use_cartesian_coordinates=True
|
|
93
|
-
)
|
|
94
|
-
|
|
95
|
-
stacked_material = merge_two_materials(
|
|
96
|
-
material1=material_1_final_lattice_config,
|
|
97
|
-
material2=material_2_translated,
|
|
98
|
-
distance_tolerance=0,
|
|
99
|
-
merge_dangerously=False,
|
|
100
|
-
material_name=material_1.name,
|
|
101
|
-
)
|
|
102
|
-
return stacked_material
|
|
103
|
-
except ValueError as e:
|
|
104
|
-
raise ValueError(
|
|
105
|
-
f"Failed to stack materials {material_1.name} and {material_2.name} due to lattice mismatch: {str(e)}"
|
|
106
|
-
) from e
|
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
from typing import List
|
|
2
|
-
|
|
3
|
-
import numpy as np
|
|
4
|
-
from mat3ra.code.vector import Vector3D
|
|
5
|
-
from mat3ra.esse.models.core.abstract.matrix_3x3 import Matrix3x3Schema
|
|
6
|
-
from mat3ra.made.material import Material
|
|
7
|
-
|
|
8
|
-
from ...build_components.metadata import MaterialWithBuildMetadata
|
|
9
|
-
from ...build_components.operations.core.modifications.perturb import FunctionHolder
|
|
10
|
-
from ...convert import from_ase, to_ase
|
|
11
|
-
from ...modify import translate_by_vector, wrap_to_unit_cell
|
|
12
|
-
from ...third_party import ase_make_supercell
|
|
13
|
-
from ...utils import decorator_convert_supercell_matrix_2x2_to_3x3
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
def translate(material: Material, vector: Vector3D) -> Material:
|
|
17
|
-
return translate_by_vector(material, vector, use_cartesian_coordinates=True)
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
def translate_atoms(
|
|
21
|
-
material: Material,
|
|
22
|
-
atom_ids: List[int],
|
|
23
|
-
vector: Vector3D,
|
|
24
|
-
use_cartesian_coordinates: bool = True,
|
|
25
|
-
) -> Material:
|
|
26
|
-
"""
|
|
27
|
-
Translate the given atoms by a vector.
|
|
28
|
-
|
|
29
|
-
Basis order is preserved.
|
|
30
|
-
|
|
31
|
-
Args:
|
|
32
|
-
material (Material): The material to translate atoms in.
|
|
33
|
-
atom_ids (List[int]): Indices of the atoms to translate.
|
|
34
|
-
vector (Vector3D): The vector to translate the atoms by.
|
|
35
|
-
use_cartesian_coordinates (bool): Whether `vector` is in cartesian coordinates.
|
|
36
|
-
|
|
37
|
-
Returns:
|
|
38
|
-
Material: The material with the given atoms translated.
|
|
39
|
-
|
|
40
|
-
Raises:
|
|
41
|
-
IndexError: If any atom id is out of range for the basis.
|
|
42
|
-
"""
|
|
43
|
-
new_material = material.clone()
|
|
44
|
-
if use_cartesian_coordinates:
|
|
45
|
-
new_material.to_cartesian()
|
|
46
|
-
coordinates: List[List[float]] = [list(coordinate) for coordinate in new_material.basis.coordinates.values]
|
|
47
|
-
|
|
48
|
-
out_of_range = [atom_id for atom_id in atom_ids if not -len(coordinates) <= atom_id < len(coordinates)]
|
|
49
|
-
if out_of_range:
|
|
50
|
-
raise IndexError(f"Atom ids {out_of_range} are out of range for a basis of {len(coordinates)} atoms.")
|
|
51
|
-
|
|
52
|
-
for atom_id in atom_ids:
|
|
53
|
-
coordinates[atom_id] = (np.array(coordinates[atom_id]) + np.array(vector)).tolist()
|
|
54
|
-
|
|
55
|
-
new_material.set_coordinates(coordinates)
|
|
56
|
-
if use_cartesian_coordinates:
|
|
57
|
-
new_material.to_crystal()
|
|
58
|
-
return new_material
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
@decorator_convert_supercell_matrix_2x2_to_3x3
|
|
62
|
-
def supercell(material: MaterialWithBuildMetadata, supercell_matrix) -> MaterialWithBuildMetadata:
|
|
63
|
-
atoms = to_ase(material)
|
|
64
|
-
|
|
65
|
-
supercell_atoms = ase_make_supercell(atoms, supercell_matrix)
|
|
66
|
-
material_config = from_ase(supercell_atoms)
|
|
67
|
-
# ASE make_supercell drops atoms.info; merge prior build/boundaryConditions when present.
|
|
68
|
-
source_metadata = material.to_dict().get("metadata") or {}
|
|
69
|
-
if source_metadata:
|
|
70
|
-
material_config["metadata"] = {**material_config.get("metadata", {}), **source_metadata}
|
|
71
|
-
new_material = MaterialWithBuildMetadata.create(material_config)
|
|
72
|
-
new_material.name = material.name
|
|
73
|
-
return new_material
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
def edit_cell(material: Material, lattice_vectors=None) -> MaterialWithBuildMetadata:
|
|
77
|
-
if lattice_vectors is not None:
|
|
78
|
-
material.set_lattice_vectors(
|
|
79
|
-
lattice_vector1=lattice_vectors[0], lattice_vector2=lattice_vectors[1], lattice_vector3=lattice_vectors[2]
|
|
80
|
-
)
|
|
81
|
-
wrapped_material = wrap_to_unit_cell(material)
|
|
82
|
-
return wrapped_material
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
def strain(material: Material, strain_matrix: Matrix3x3Schema) -> Material:
|
|
86
|
-
"""
|
|
87
|
-
Applies a strain to the material by modifying its lattice vectors while keeping the basis in crystal coordinates.
|
|
88
|
-
"""
|
|
89
|
-
if not isinstance(strain_matrix, Matrix3x3Schema):
|
|
90
|
-
raise ValueError("strain_matrix must be an instance of Matrix3x3Schema")
|
|
91
|
-
|
|
92
|
-
strain_matrix_np = np.array([row.root for row in strain_matrix.root])
|
|
93
|
-
lattice_vectors_np = np.array(material.lattice.vector_arrays)
|
|
94
|
-
new_lattice_vectors_np = lattice_vectors_np @ strain_matrix_np
|
|
95
|
-
new_lattice_vectors = new_lattice_vectors_np.tolist()
|
|
96
|
-
|
|
97
|
-
new_material = material.clone()
|
|
98
|
-
|
|
99
|
-
original_crystal_coords = new_material.basis.coordinates.values
|
|
100
|
-
|
|
101
|
-
new_material.set_lattice_vectors_from_array(new_lattice_vectors)
|
|
102
|
-
new_material.basis.coordinates.values = original_crystal_coords
|
|
103
|
-
|
|
104
|
-
return new_material
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
def perturb(
|
|
108
|
-
material: Material, perturbation_function: FunctionHolder, use_cartesian_coordinates: bool = False
|
|
109
|
-
) -> Material:
|
|
110
|
-
"""
|
|
111
|
-
Applies a small delta perturbation to a each atom in the material. Lattice vectors are not modified.
|
|
112
|
-
|
|
113
|
-
Args:
|
|
114
|
-
material: The input Material instance containing coordinates.
|
|
115
|
-
perturbation_function: A PerturbationFunctionHolder that defines
|
|
116
|
-
a function f(x,y,z) -> float (or vector) and
|
|
117
|
-
optional transform_coordinates behavior.
|
|
118
|
-
use_cartesian_coordinates: If True, the perturbation is applied in Cartesian coordinates.
|
|
119
|
-
If False, the perturbation is applied in crystal coordinates.
|
|
120
|
-
|
|
121
|
-
Returns:
|
|
122
|
-
A new Material with perturbed coordinates.
|
|
123
|
-
"""
|
|
124
|
-
new_material = material.clone()
|
|
125
|
-
if use_cartesian_coordinates:
|
|
126
|
-
new_material.to_cartesian()
|
|
127
|
-
original_coordinates = new_material.basis.coordinates.values
|
|
128
|
-
perturbed_coordinates: List[List[float]] = []
|
|
129
|
-
|
|
130
|
-
for coordinate in original_coordinates:
|
|
131
|
-
displacement = perturbation_function.apply_function(coordinate, material=new_material)
|
|
132
|
-
|
|
133
|
-
if isinstance(displacement, (list, tuple, np.ndarray)):
|
|
134
|
-
delta = np.array(displacement)
|
|
135
|
-
else:
|
|
136
|
-
delta = np.array([0.0, 0.0, displacement])
|
|
137
|
-
|
|
138
|
-
new_coordinate = np.array(coordinate) + delta
|
|
139
|
-
perturbed_coordinates.append(new_coordinate.tolist())
|
|
140
|
-
|
|
141
|
-
new_material.set_coordinates(perturbed_coordinates)
|
|
142
|
-
if use_cartesian_coordinates:
|
|
143
|
-
new_material.to_crystal()
|
|
144
|
-
return new_material
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
def rotate(material: Material, axis: List[int], angle: float, wrap: bool = True) -> Material:
|
|
148
|
-
"""
|
|
149
|
-
Rotate the basis of the material relative to the lattice.
|
|
150
|
-
This operation breaks symmetry and does not modify lattice vectors.
|
|
151
|
-
|
|
152
|
-
Args:
|
|
153
|
-
material (Material): The material to rotate.
|
|
154
|
-
axis (List[int]): The axis to rotate around, expressed as [x, y, z].
|
|
155
|
-
angle (float): The angle of rotation in degrees.
|
|
156
|
-
wrap (bool): Whether to wrap the material to the unit cell.
|
|
157
|
-
Returns:
|
|
158
|
-
Atoms: The rotated material.
|
|
159
|
-
"""
|
|
160
|
-
new_material = material.clone()
|
|
161
|
-
original_is_in_cartesian_units = new_material.basis.is_in_cartesian_units
|
|
162
|
-
new_material.to_crystal()
|
|
163
|
-
atoms = to_ase(new_material)
|
|
164
|
-
atoms.rotate(v=axis, a=angle, center="COU", rotate_cell=False)
|
|
165
|
-
if wrap:
|
|
166
|
-
atoms.wrap()
|
|
167
|
-
new_material = MaterialWithBuildMetadata.create(from_ase(atoms))
|
|
168
|
-
if original_is_in_cartesian_units:
|
|
169
|
-
new_material.to_cartesian()
|
|
170
|
-
return new_material
|
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
from typing import Optional
|
|
2
|
-
|
|
3
|
-
import numpy as np
|
|
4
|
-
from mat3ra.code.array_with_ids import ArrayWithIds
|
|
5
|
-
from mat3ra.esse.models.materials_category_components.operations.core.combinations.merge import MergeMethodsEnum
|
|
6
|
-
from mat3ra.made.basis import Basis, Coordinates
|
|
7
|
-
from mat3ra.made.material import Material
|
|
8
|
-
|
|
9
|
-
from ...build_components import MaterialWithBuildMetadata
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
def merge_two_bases(basis1: Basis, basis2: Basis, distance_tolerance: float) -> Basis:
|
|
13
|
-
"""
|
|
14
|
-
Merges two Basis objects into a new Basis object, resolving overlapping coordinates.
|
|
15
|
-
The function assumes that both Basis objects have the same lattice structure handled separately.
|
|
16
|
-
|
|
17
|
-
Args:
|
|
18
|
-
basis1 (Basis): The first Basis object to merge.
|
|
19
|
-
basis2 (Basis): The second Basis object to merge.
|
|
20
|
-
distance_tolerance (float): The tolerance for resolving overlapping coordinates.
|
|
21
|
-
|
|
22
|
-
Returns:
|
|
23
|
-
Basis: A new Basis object containing merged elements, coordinates, labels, and constraints.
|
|
24
|
-
"""
|
|
25
|
-
basis1.to_crystal()
|
|
26
|
-
basis2.to_crystal()
|
|
27
|
-
|
|
28
|
-
merged_elements_values = basis1.elements.values + basis2.elements.values
|
|
29
|
-
merged_coordinates_values = basis1.coordinates.values + basis2.coordinates.values
|
|
30
|
-
merged_labels_values = basis1.labels.values + basis2.labels.values if basis1.labels and basis2.labels else []
|
|
31
|
-
merged_constraints_values = basis1.constraints.values + basis2.constraints.values
|
|
32
|
-
|
|
33
|
-
new_basis = basis1.clone()
|
|
34
|
-
new_basis.elements = ArrayWithIds.from_values(values=merged_elements_values)
|
|
35
|
-
new_basis.coordinates = Coordinates.from_values(values=merged_coordinates_values)
|
|
36
|
-
new_basis.labels = ArrayWithIds.from_values(values=merged_labels_values)
|
|
37
|
-
new_basis.constraints = ArrayWithIds.from_values(values=merged_constraints_values)
|
|
38
|
-
new_basis.resolve_colliding_coordinates(tolerance=distance_tolerance)
|
|
39
|
-
|
|
40
|
-
return new_basis
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
def merge_two_materials(
|
|
44
|
-
material1: Material,
|
|
45
|
-
material2: Material,
|
|
46
|
-
merge_method: Optional[MergeMethodsEnum] = MergeMethodsEnum.ADD,
|
|
47
|
-
material_name: Optional[str] = None,
|
|
48
|
-
distance_tolerance: float = 0.1,
|
|
49
|
-
merge_dangerously: bool = False,
|
|
50
|
-
) -> MaterialWithBuildMetadata:
|
|
51
|
-
"""
|
|
52
|
-
Merge two materials using a specific merge method.
|
|
53
|
-
|
|
54
|
-
Args:
|
|
55
|
-
material1 (Material): The first material to merge.
|
|
56
|
-
material2 (Material): The second material to merge.
|
|
57
|
-
merge_method (MergeMethodsEnum): The merge method to use.
|
|
58
|
-
material_name (Optional[str]): Name of the merged material.
|
|
59
|
-
distance_tolerance (float): The tolerance for resolving overlapping coordinates.
|
|
60
|
-
merge_dangerously (bool): If True, allows merging even if lattices are different.
|
|
61
|
-
|
|
62
|
-
Returns:
|
|
63
|
-
MaterialWithBuildMetadata: The merged material.
|
|
64
|
-
"""
|
|
65
|
-
if not np.allclose(material1.lattice.vector_arrays, material2.lattice.vector_arrays) and not merge_dangerously:
|
|
66
|
-
raise ValueError("Lattices of the two materials must be the same.")
|
|
67
|
-
|
|
68
|
-
if merge_method == MergeMethodsEnum.ADD:
|
|
69
|
-
merged_basis = merge_bases_add(material1.basis, material2.basis, distance_tolerance)
|
|
70
|
-
elif merge_method == MergeMethodsEnum.REPLACE:
|
|
71
|
-
merged_basis = merge_bases_replace(material1.basis, material2.basis, distance_tolerance)
|
|
72
|
-
elif merge_method == MergeMethodsEnum.YIELD:
|
|
73
|
-
merged_basis = merge_bases_yield(material1.basis, material2.basis, distance_tolerance)
|
|
74
|
-
else:
|
|
75
|
-
raise ValueError(f"Unknown merge method: {merge_method}")
|
|
76
|
-
|
|
77
|
-
name = material_name or "Merged Material"
|
|
78
|
-
new_material = MaterialWithBuildMetadata.create(
|
|
79
|
-
{"name": name, "lattice": material1.lattice.to_dict(), "basis": merged_basis.to_dict()}
|
|
80
|
-
)
|
|
81
|
-
|
|
82
|
-
return new_material
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
def should_skip_stacking(
|
|
86
|
-
material_1: Material,
|
|
87
|
-
material_2: Material,
|
|
88
|
-
lattice_vector_index: int,
|
|
89
|
-
) -> bool:
|
|
90
|
-
"""
|
|
91
|
-
Determine if stacking should be skipped due to zero thickness in material_2.
|
|
92
|
-
|
|
93
|
-
Also validates that materials are compatible for stacking.
|
|
94
|
-
|
|
95
|
-
Args:
|
|
96
|
-
material_1: First material to stack.
|
|
97
|
-
material_2: Second material to stack.
|
|
98
|
-
lattice_vector_index: Index of the lattice vector in the stacking direction.
|
|
99
|
-
|
|
100
|
-
Returns:
|
|
101
|
-
bool: True if stacking should be skipped (material_2 has zero thickness).
|
|
102
|
-
|
|
103
|
-
Raises:
|
|
104
|
-
ValueError: If in-plane lattice vectors are not the same.
|
|
105
|
-
"""
|
|
106
|
-
material_1_lattice_vectors = material_1.lattice.vector_arrays
|
|
107
|
-
material_2_lattice_vectors = material_2.lattice.vector_arrays
|
|
108
|
-
|
|
109
|
-
is_zero_thickness = np.allclose(material_2_lattice_vectors[lattice_vector_index], [0, 0, 0])
|
|
110
|
-
if is_zero_thickness:
|
|
111
|
-
return True
|
|
112
|
-
|
|
113
|
-
# Check that in-plane vectors are the same
|
|
114
|
-
all_indices = [0, 1, 2]
|
|
115
|
-
in_plane_indices = [i for i in all_indices if i != lattice_vector_index]
|
|
116
|
-
|
|
117
|
-
material_1_in_plane_vectors = np.array(material_1_lattice_vectors)[in_plane_indices]
|
|
118
|
-
material_2_in_plane_vectors = np.array(material_2_lattice_vectors)[in_plane_indices]
|
|
119
|
-
|
|
120
|
-
if not np.allclose(material_1_in_plane_vectors, material_2_in_plane_vectors):
|
|
121
|
-
difference = np.abs(material_1_in_plane_vectors - material_2_in_plane_vectors)
|
|
122
|
-
raise ValueError(f"In-plane lattice vectors of the two materials must be the same for stacking.\n{difference}")
|
|
123
|
-
|
|
124
|
-
return False
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
def merge_bases_add(basis1: Basis, basis2: Basis, distance_tolerance: float) -> Basis:
|
|
128
|
-
return merge_two_bases(basis1, basis2, distance_tolerance)
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
def merge_bases_replace(basis1: Basis, basis2: Basis, distance_tolerance: float) -> Basis:
|
|
132
|
-
base1 = basis1.clone()
|
|
133
|
-
return merge_two_bases(base1, basis2, distance_tolerance)
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
def merge_bases_yield(basis1: Basis, basis2: Basis, distance_tolerance: float) -> Basis:
|
|
137
|
-
base2 = basis2.clone()
|
|
138
|
-
return merge_two_bases(base2, basis1, distance_tolerance)
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import numpy as np
|
|
2
|
-
from mat3ra.esse.models.core.abstract.matrix_3x3 import Matrix3x3Schema
|
|
3
|
-
from mat3ra.made.material import Material
|
|
4
|
-
|
|
5
|
-
from ...modify import wrap_to_unit_cell
|
|
6
|
-
from ..core.unary import strain
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
def transform_material_by_matrix(material: Material, matrix: np.ndarray) -> Material:
|
|
10
|
-
"""
|
|
11
|
-
Transforms a material by applying a transformation matrix to lattice vectors and coordinates.
|
|
12
|
-
|
|
13
|
-
Args:
|
|
14
|
-
material: The material to be transformed.
|
|
15
|
-
matrix: The 3x3 transformation matrix as a numpy array.
|
|
16
|
-
|
|
17
|
-
Returns:
|
|
18
|
-
A new material instance with transformed lattice and coordinates, wrapped to unit cell.
|
|
19
|
-
"""
|
|
20
|
-
current_lattice_vectors = np.array(material.lattice.vector_arrays)
|
|
21
|
-
current_coordinates = material.basis.coordinates.values
|
|
22
|
-
|
|
23
|
-
new_lattice_vectors = (matrix @ current_lattice_vectors.T).tolist()
|
|
24
|
-
new_coordinates = (np.linalg.inv(matrix) @ np.array(current_coordinates).T).T.tolist()
|
|
25
|
-
|
|
26
|
-
transformed_material = material.clone()
|
|
27
|
-
transformed_material.set_lattice_vectors_from_array(new_lattice_vectors)
|
|
28
|
-
transformed_material.basis.coordinates.values = new_coordinates
|
|
29
|
-
return wrap_to_unit_cell(transformed_material)
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
def strain_to_match_lattice(material_to_strain: Material, target_material: Material) -> Material:
|
|
33
|
-
"""
|
|
34
|
-
Strains a material to match the lattice of a target material.
|
|
35
|
-
|
|
36
|
-
Args:
|
|
37
|
-
material_to_strain: The material to be strained.
|
|
38
|
-
target_material: The material with the target lattice.
|
|
39
|
-
|
|
40
|
-
Returns:
|
|
41
|
-
A new material instance with the strained lattice.
|
|
42
|
-
"""
|
|
43
|
-
target_lattice_vectors = np.array(target_material.lattice.vector_arrays)
|
|
44
|
-
source_lattice_vectors = np.array(material_to_strain.lattice.vector_arrays)
|
|
45
|
-
|
|
46
|
-
# Prevent division by zero or singular matrix issues
|
|
47
|
-
if np.linalg.det(source_lattice_vectors) == 0:
|
|
48
|
-
raise ValueError("Lattice of material to strain is singular and cannot be inverted.")
|
|
49
|
-
|
|
50
|
-
strain_matrix_np = np.linalg.inv(source_lattice_vectors) @ target_lattice_vectors
|
|
51
|
-
strain_matrix = Matrix3x3Schema(root=strain_matrix_np.tolist())
|
|
52
|
-
strained_material = strain(material_to_strain, strain_matrix)
|
|
53
|
-
return strained_material
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
from typing import Any, Callable, Dict, List, Optional, Tuple
|
|
2
|
-
|
|
3
|
-
import numpy as np
|
|
4
|
-
from mat3ra.made.material import Material
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
def evaluate_calculator_on_xy_grid(
|
|
8
|
-
material: Material,
|
|
9
|
-
calculator_function: Callable[[Material], Any],
|
|
10
|
-
modifier: Optional[Callable] = None,
|
|
11
|
-
modifier_parameters: Dict[str, Any] = {},
|
|
12
|
-
grid_size_xy: Tuple[int, int] = (10, 10),
|
|
13
|
-
grid_offset_position: List[float] = [0, 0],
|
|
14
|
-
grid_range_x: Tuple[float, float] = (-0.5, 0.5),
|
|
15
|
-
grid_range_y: Tuple[float, float] = (-0.5, 0.5),
|
|
16
|
-
use_cartesian_coordinates: bool = False,
|
|
17
|
-
) -> Tuple[List[np.ndarray], np.ndarray]:
|
|
18
|
-
"""
|
|
19
|
-
Calculate a property on a grid of x-y positions.
|
|
20
|
-
|
|
21
|
-
Args:
|
|
22
|
-
material (Material): The material object.
|
|
23
|
-
modifier (Callable): The modifier function to apply to the material.
|
|
24
|
-
modifier_parameters (Dict[str, Any]): The parameters to pass to the modifier.
|
|
25
|
-
calculator_function (Callable): The calculator function to apply to the modified material.
|
|
26
|
-
grid_size_xy (Tuple[int, int]): The size of the grid in x and y directions.
|
|
27
|
-
grid_offset_position (List[float]): The offset position of the grid, in Angstroms or crystal coordinates.
|
|
28
|
-
grid_range_x (Tuple[float, float]): The range to search in x direction, in Angstroms or crystal coordinates.
|
|
29
|
-
grid_range_y (Tuple[float, float]): The range to search in y direction, in Angstroms or crystal coordinates.
|
|
30
|
-
use_cartesian_coordinates (bool): Whether to use Cartesian coordinates.
|
|
31
|
-
|
|
32
|
-
Returns:
|
|
33
|
-
Tuple[List[np.ndarray[float]], np.ndarray[float]]: The x-y positions and the calculated property values.
|
|
34
|
-
"""
|
|
35
|
-
x_values = np.linspace(grid_range_x[0], grid_range_x[1], grid_size_xy[0]) + grid_offset_position[0]
|
|
36
|
-
y_values = np.linspace(grid_range_y[0], grid_range_y[1], grid_size_xy[1]) + grid_offset_position[1]
|
|
37
|
-
|
|
38
|
-
xy_matrix = [x_values, y_values]
|
|
39
|
-
results_matrix = np.zeros(grid_size_xy)
|
|
40
|
-
|
|
41
|
-
for i, x in enumerate(x_values):
|
|
42
|
-
for j, y in enumerate(y_values):
|
|
43
|
-
if modifier is None:
|
|
44
|
-
modified_material = material
|
|
45
|
-
else:
|
|
46
|
-
modified_material = modifier(
|
|
47
|
-
material,
|
|
48
|
-
displacement=[x, y, 0],
|
|
49
|
-
use_cartesian_coordinates=use_cartesian_coordinates,
|
|
50
|
-
**modifier_parameters,
|
|
51
|
-
)
|
|
52
|
-
result = calculator_function(modified_material)
|
|
53
|
-
results_matrix[i, j] = result
|
|
54
|
-
|
|
55
|
-
return xy_matrix, results_matrix
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
from ase import Atoms as ASEAtoms
|
|
2
|
-
from ase.build import add_vacuum as ase_add_vacuum
|
|
3
|
-
from ase.build.supercells import make_supercell as ase_make_supercell
|
|
4
|
-
from ase.calculators.calculator import Calculator as ASECalculator
|
|
5
|
-
from ase.calculators.calculator import all_changes as ase_all_changes
|
|
6
|
-
from ase.calculators.emt import EMT as ASECalculatorEMT
|
|
7
|
-
from ase.cluster import BodyCenteredCubic as ASEBodyCenteredCubic
|
|
8
|
-
from ase.cluster import Decahedron as ASEDecahedron
|
|
9
|
-
from ase.cluster import FaceCenteredCubic as ASEFaceCenteredCubic
|
|
10
|
-
from ase.cluster import HexagonalClosedPacked as ASEHexagonalClosedPacked
|
|
11
|
-
from ase.cluster import Icosahedron as ASEIcosahedron
|
|
12
|
-
from ase.cluster import Octahedron as ASEOctahedron
|
|
13
|
-
from ase.cluster import SimpleCubic as ASESimpleCubic
|
|
14
|
-
from ase.cluster.wulff import wulff_construction as ASEWulffConstruction
|
|
15
|
-
from ase.constraints import FixAtoms as ASEFixAtoms
|
|
16
|
-
from ase.constraints import FixedPlane as ASEFixedPlane
|
|
17
|
-
from pymatgen.analysis.defects.core import Interstitial as PymatgenInterstitial
|
|
18
|
-
from pymatgen.analysis.defects.core import Substitution as PymatgenSubstitution
|
|
19
|
-
from pymatgen.analysis.defects.core import Vacancy as PymatgenVacancy
|
|
20
|
-
from pymatgen.analysis.defects.generators import VoronoiInterstitialGenerator as PymatgenVoronoiInterstitialGenerator
|
|
21
|
-
from pymatgen.analysis.local_env import VoronoiNN as PymatgenVoronoiNN
|
|
22
|
-
from pymatgen.core import IStructure as PymatgenIStructure
|
|
23
|
-
from pymatgen.core import PeriodicSite as PymatgenPeriodicSite
|
|
24
|
-
from pymatgen.core.interface import Interface as PymatgenInterface
|
|
25
|
-
from pymatgen.core.interface import label_termination as label_pymatgen_slab_termination
|
|
26
|
-
from pymatgen.core.structure import Lattice as PymatgenLattice
|
|
27
|
-
from pymatgen.core.structure import Structure as PymatgenStructure
|
|
28
|
-
from pymatgen.core.surface import Slab as PymatgenSlab
|
|
29
|
-
from pymatgen.core.surface import SlabGenerator as PymatgenSlabGenerator
|
|
30
|
-
from pymatgen.io.ase import AseAtomsAdaptor as PymatgenAseAtomsAdaptor
|
|
31
|
-
from pymatgen.io.vasp.inputs import Poscar as PymatgenPoscar
|
|
32
|
-
from pymatgen.symmetry.analyzer import SpacegroupAnalyzer as PymatgenSpacegroupAnalyzer
|
|
33
|
-
|
|
34
|
-
# Re-exported imports to allow for both use in type hints and instantiation
|
|
35
|
-
|
|
36
|
-
__all__ = [
|
|
37
|
-
"ASEAtoms",
|
|
38
|
-
"ASECalculator",
|
|
39
|
-
"ASECalculatorEMT",
|
|
40
|
-
"ASEFixAtoms",
|
|
41
|
-
"ASEFixedPlane",
|
|
42
|
-
"ase_all_changes",
|
|
43
|
-
"PymatgenLattice",
|
|
44
|
-
"PymatgenStructure",
|
|
45
|
-
"PymatgenIStructure",
|
|
46
|
-
"PymatgenSlab",
|
|
47
|
-
"PymatgenSlabGenerator",
|
|
48
|
-
"PymatgenInterface",
|
|
49
|
-
"PymatgenPeriodicSite",
|
|
50
|
-
"PymatgenSpacegroupAnalyzer",
|
|
51
|
-
"PymatgenVacancy",
|
|
52
|
-
"PymatgenSubstitution",
|
|
53
|
-
"PymatgenInterstitial",
|
|
54
|
-
"PymatgenVoronoiInterstitialGenerator",
|
|
55
|
-
"label_pymatgen_slab_termination",
|
|
56
|
-
"ase_make_supercell",
|
|
57
|
-
"ase_add_vacuum",
|
|
58
|
-
"PymatgenAseAtomsAdaptor",
|
|
59
|
-
"PymatgenPoscar",
|
|
60
|
-
"PymatgenVoronoiNN",
|
|
61
|
-
"ASESimpleCubic",
|
|
62
|
-
"ASEBodyCenteredCubic",
|
|
63
|
-
"ASEFaceCenteredCubic",
|
|
64
|
-
"ASEIcosahedron",
|
|
65
|
-
"ASEOctahedron",
|
|
66
|
-
"ASEDecahedron",
|
|
67
|
-
"ASEHexagonalClosedPacked",
|
|
68
|
-
"ASEWulffConstruction",
|
|
69
|
-
]
|