@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,627 +0,0 @@
|
|
|
1
|
-
from typing import Callable, List, Literal, Optional, Tuple, Union
|
|
2
|
-
|
|
3
|
-
import numpy as np
|
|
4
|
-
from mat3ra.made.material import Material
|
|
5
|
-
from mat3ra.made.utils import get_atomic_coordinates_extremum
|
|
6
|
-
|
|
7
|
-
from .analyze.other import get_atom_indices_with_condition_on_coordinates, get_atom_indices_within_radius_pbc
|
|
8
|
-
from .build_components.metadata import MaterialWithBuildMetadata
|
|
9
|
-
from .convert import from_ase, to_ase
|
|
10
|
-
from .convert.interface_parts_enum import InterfacePartsEnum
|
|
11
|
-
from .entities.coordinate import (
|
|
12
|
-
is_coordinate_in_box,
|
|
13
|
-
is_coordinate_in_cylinder,
|
|
14
|
-
is_coordinate_in_triangular_prism,
|
|
15
|
-
is_coordinate_within_layer,
|
|
16
|
-
)
|
|
17
|
-
from .third_party import ase_add_vacuum
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
def filter_by_label(material: Material, label: Union[int, str]) -> Material:
|
|
21
|
-
"""
|
|
22
|
-
Filter out only atoms corresponding to the label.
|
|
23
|
-
|
|
24
|
-
Args:
|
|
25
|
-
material (Material): The material object to filter.
|
|
26
|
-
label (int|str): The tag/label to filter by.
|
|
27
|
-
|
|
28
|
-
Returns:
|
|
29
|
-
Material: The filtered material object.
|
|
30
|
-
"""
|
|
31
|
-
new_material = material.clone()
|
|
32
|
-
labels_array = new_material.basis.labels.to_array_of_values_with_ids()
|
|
33
|
-
filtered_label_ids = [_label.id for _label in labels_array if _label.value == label]
|
|
34
|
-
new_material.basis.filter_atoms_by_ids(filtered_label_ids)
|
|
35
|
-
return new_material
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
def translate_to_z_level(
|
|
39
|
-
material: Material, z_level: Optional[Literal["top", "bottom", "center"]] = "bottom", tolerance: float = 1e-6
|
|
40
|
-
) -> Material:
|
|
41
|
-
"""
|
|
42
|
-
Translate atoms to the specified z-level.
|
|
43
|
-
|
|
44
|
-
Args:
|
|
45
|
-
material (Material): The material object to normalize.
|
|
46
|
-
z_level (str): The z-level to translate the atoms to (top, bottom, center)
|
|
47
|
-
tolerance (float): The tolerance value to avoid moving past unit cell.
|
|
48
|
-
Returns:
|
|
49
|
-
Material: The translated material object.
|
|
50
|
-
"""
|
|
51
|
-
min_z = get_atomic_coordinates_extremum(material, "min")
|
|
52
|
-
max_z = get_atomic_coordinates_extremum(material)
|
|
53
|
-
if z_level == "top":
|
|
54
|
-
material = translate_by_vector(material, vector=[0, 0, 1 - max_z - tolerance])
|
|
55
|
-
elif z_level == "bottom":
|
|
56
|
-
material = translate_by_vector(material, vector=[0, 0, -min_z + tolerance])
|
|
57
|
-
elif z_level == "center":
|
|
58
|
-
material = translate_by_vector(material, vector=[0, 0, (1 - min_z - max_z) / 2])
|
|
59
|
-
return material
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
def translate_by_vector(
|
|
63
|
-
material: Material,
|
|
64
|
-
vector: Optional[List[float]] = None,
|
|
65
|
-
use_cartesian_coordinates: bool = False,
|
|
66
|
-
) -> Material:
|
|
67
|
-
"""
|
|
68
|
-
Translate atoms by a vector.
|
|
69
|
-
|
|
70
|
-
Args:
|
|
71
|
-
material (Material): The material object to normalize.
|
|
72
|
-
vector (List[float]): The vector to translate the atoms by (in crystal coordinates by default).
|
|
73
|
-
use_cartesian_coordinates (bool): Whether to use cartesian coordinates.
|
|
74
|
-
Returns:
|
|
75
|
-
Material: The translated material object.
|
|
76
|
-
"""
|
|
77
|
-
if not use_cartesian_coordinates:
|
|
78
|
-
vector = material.basis.cell.convert_point_to_cartesian(vector)
|
|
79
|
-
|
|
80
|
-
if vector is None:
|
|
81
|
-
vector = [0, 0, 0]
|
|
82
|
-
|
|
83
|
-
atoms = to_ase(material)
|
|
84
|
-
# ASE accepts cartesian coordinates for translation
|
|
85
|
-
atoms.translate(tuple(vector))
|
|
86
|
-
return MaterialWithBuildMetadata.create(from_ase(atoms))
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
def translate_to_center(material: Material, axes: Optional[List[str]] = None) -> Material:
|
|
90
|
-
"""
|
|
91
|
-
Center the material in the unit cell.
|
|
92
|
-
|
|
93
|
-
Args:
|
|
94
|
-
material (Material): The material object to center.
|
|
95
|
-
axes (List[str]): The axes to center the material along.
|
|
96
|
-
Returns:
|
|
97
|
-
Material: The centered material object.
|
|
98
|
-
"""
|
|
99
|
-
new_material = material.clone()
|
|
100
|
-
new_material.to_crystal()
|
|
101
|
-
if axes is None:
|
|
102
|
-
axes = ["x", "y", "z"]
|
|
103
|
-
min_x = get_atomic_coordinates_extremum(new_material, axis="x", extremum="min") if "x" in axes else 0
|
|
104
|
-
max_x = get_atomic_coordinates_extremum(new_material, axis="x", extremum="max") if "x" in axes else 1
|
|
105
|
-
min_y = get_atomic_coordinates_extremum(new_material, axis="y", extremum="min") if "y" in axes else 0
|
|
106
|
-
max_y = get_atomic_coordinates_extremum(new_material, axis="y", extremum="max") if "y" in axes else 1
|
|
107
|
-
if "z" in axes:
|
|
108
|
-
material = translate_to_z_level(new_material, z_level="center")
|
|
109
|
-
|
|
110
|
-
material = translate_by_vector(material, vector=[(1 - min_x - max_x) / 2, (1 - min_y - max_y) / 2, 0])
|
|
111
|
-
return material
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
def wrap_to_unit_cell(material: Material) -> MaterialWithBuildMetadata:
|
|
115
|
-
"""
|
|
116
|
-
Wrap the material to the unit cell.
|
|
117
|
-
|
|
118
|
-
Args:
|
|
119
|
-
material (Material): The material to wrap.
|
|
120
|
-
Returns:
|
|
121
|
-
Material: The wrapped material.
|
|
122
|
-
"""
|
|
123
|
-
atoms = to_ase(material)
|
|
124
|
-
atoms.wrap()
|
|
125
|
-
return MaterialWithBuildMetadata.create(from_ase(atoms))
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
def filter_by_ids(material: Material, ids: List[int], invert: bool = False, reset_ids: bool = False) -> Material:
|
|
129
|
-
"""
|
|
130
|
-
Filter out only atoms corresponding to the ids.
|
|
131
|
-
|
|
132
|
-
Args:
|
|
133
|
-
material (Material): The material object to filter.
|
|
134
|
-
ids (List[int]): The ids to filter by.
|
|
135
|
-
invert (bool): Whether to invert the selection.
|
|
136
|
-
reset_ids (bool): Whether to reset the ids of the filtered atoms (to start from 0).
|
|
137
|
-
|
|
138
|
-
Returns:
|
|
139
|
-
Material: The filtered material object.
|
|
140
|
-
"""
|
|
141
|
-
new_material = material.clone()
|
|
142
|
-
new_material.basis.filter_atoms_by_ids(ids, invert, reset_ids=reset_ids)
|
|
143
|
-
return new_material
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
def filter_by_condition_on_coordinates(
|
|
147
|
-
material: MaterialWithBuildMetadata,
|
|
148
|
-
condition: Callable[[List[float]], bool],
|
|
149
|
-
use_cartesian_coordinates: bool = False,
|
|
150
|
-
invert_selection: bool = False,
|
|
151
|
-
reset_ids: bool = False,
|
|
152
|
-
) -> MaterialWithBuildMetadata:
|
|
153
|
-
"""
|
|
154
|
-
Filter atoms based on a condition on their coordinates.
|
|
155
|
-
|
|
156
|
-
Args:
|
|
157
|
-
material (Material): The material object to filter.
|
|
158
|
-
condition (Callable): The condition on coordinate function.
|
|
159
|
-
use_cartesian_coordinates (bool): Whether to use cartesian coordinates.
|
|
160
|
-
invert_selection (bool): Whether to invert the selection.
|
|
161
|
-
|
|
162
|
-
Returns:
|
|
163
|
-
Material: The filtered material object.
|
|
164
|
-
"""
|
|
165
|
-
new_material = material.clone()
|
|
166
|
-
ids = get_atom_indices_with_condition_on_coordinates(
|
|
167
|
-
material,
|
|
168
|
-
condition,
|
|
169
|
-
use_cartesian_coordinates=use_cartesian_coordinates,
|
|
170
|
-
)
|
|
171
|
-
|
|
172
|
-
new_material = filter_by_ids(new_material, ids, invert=invert_selection, reset_ids=reset_ids)
|
|
173
|
-
return new_material
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
def filter_by_layers(
|
|
177
|
-
material: MaterialWithBuildMetadata,
|
|
178
|
-
center_coordinate: List[float] = [0, 0, 0],
|
|
179
|
-
central_atom_id: Optional[int] = None,
|
|
180
|
-
layer_thickness: float = 1.0,
|
|
181
|
-
invert_selection: bool = False,
|
|
182
|
-
) -> MaterialWithBuildMetadata:
|
|
183
|
-
"""
|
|
184
|
-
Filter out atoms within a specified layer thickness of a central atom along c-vector direction.
|
|
185
|
-
|
|
186
|
-
Args:
|
|
187
|
-
material (Material): The material object to filter.
|
|
188
|
-
center_coordinate (List[float]): Index of the central atom.
|
|
189
|
-
central_atom_id (int): Index of the central atom.
|
|
190
|
-
layer_thickness (float): Thickness of the layer in angstroms.
|
|
191
|
-
invert_selection (bool): Whether to invert the selection.
|
|
192
|
-
|
|
193
|
-
Returns:
|
|
194
|
-
Material: The filtered material object.
|
|
195
|
-
"""
|
|
196
|
-
if central_atom_id is not None:
|
|
197
|
-
center_coordinate = material.basis.coordinates.get_element_value_by_index(central_atom_id)
|
|
198
|
-
vectors = material.lattice.vectors
|
|
199
|
-
direction_vector = vectors.c.value
|
|
200
|
-
|
|
201
|
-
def condition(coordinate):
|
|
202
|
-
return is_coordinate_within_layer(coordinate, center_coordinate, direction_vector, layer_thickness)
|
|
203
|
-
|
|
204
|
-
return filter_by_condition_on_coordinates(material, condition, invert_selection=invert_selection)
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
def get_default_min_max(material: Material, use_cartesian_coordinates: bool) -> Tuple[List[float], List[float]]:
|
|
208
|
-
"""
|
|
209
|
-
Get default min and max coordinates for the material based on the coordinate system (crystal or cartesian).
|
|
210
|
-
|
|
211
|
-
Args:
|
|
212
|
-
material (Material): The material object.
|
|
213
|
-
use_cartesian_coordinates (bool): Whether to use Cartesian coordinates.
|
|
214
|
-
|
|
215
|
-
Returns:
|
|
216
|
-
Tuple[List[float], List[float]]: Default min and max coordinates.
|
|
217
|
-
"""
|
|
218
|
-
axes: List[Literal["x", "y", "z"]] = ["x", "y", "z"]
|
|
219
|
-
min_coords = []
|
|
220
|
-
max_coords = []
|
|
221
|
-
for axis in axes:
|
|
222
|
-
min_val = get_atomic_coordinates_extremum(
|
|
223
|
-
material, "min", axis, use_cartesian_coordinates=use_cartesian_coordinates
|
|
224
|
-
)
|
|
225
|
-
max_val = get_atomic_coordinates_extremum(
|
|
226
|
-
material, "max", axis, use_cartesian_coordinates=use_cartesian_coordinates
|
|
227
|
-
)
|
|
228
|
-
min_coords.append(min_val)
|
|
229
|
-
max_coords.append(max_val)
|
|
230
|
-
return min_coords, max_coords
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
def filter_by_sphere(
|
|
234
|
-
material: Material,
|
|
235
|
-
center_coordinate: List[float] = [0, 0, 0],
|
|
236
|
-
central_atom_id: Optional[int] = None,
|
|
237
|
-
radius: float = 1,
|
|
238
|
-
tolerance: float = 0.0,
|
|
239
|
-
invert: bool = False,
|
|
240
|
-
) -> Material:
|
|
241
|
-
"""
|
|
242
|
-
Filter out atoms within a specified radius of a central atom considering periodic boundary conditions.
|
|
243
|
-
|
|
244
|
-
Args:
|
|
245
|
-
material (Material): The material object to filter.
|
|
246
|
-
central_atom_id (int): Index of the central atom.
|
|
247
|
-
radius (float): Radius of the sphere in angstroms.
|
|
248
|
-
tolerance (float): The tolerance value to include atoms on the edge of the sphere.
|
|
249
|
-
invert (bool): Whether to invert the selection.
|
|
250
|
-
|
|
251
|
-
Returns:
|
|
252
|
-
Material: The filtered material object.
|
|
253
|
-
"""
|
|
254
|
-
ids = get_atom_indices_within_radius_pbc(
|
|
255
|
-
material=material,
|
|
256
|
-
atom_index=central_atom_id,
|
|
257
|
-
coordinate=center_coordinate,
|
|
258
|
-
radius=radius + tolerance,
|
|
259
|
-
)
|
|
260
|
-
return filter_by_ids(material, ids, invert=invert)
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
def filter_by_circle_projection(
|
|
264
|
-
material: Material,
|
|
265
|
-
x: float = 0.5,
|
|
266
|
-
y: float = 0.5,
|
|
267
|
-
r: float = 0.25,
|
|
268
|
-
tolerance: float = 0.0,
|
|
269
|
-
use_cartesian_coordinates: bool = False,
|
|
270
|
-
invert_selection: bool = False,
|
|
271
|
-
) -> Material:
|
|
272
|
-
"""
|
|
273
|
-
Get material with atoms that are within or outside an XY circle projection.
|
|
274
|
-
|
|
275
|
-
Args:
|
|
276
|
-
material (Material): The material object to filter.
|
|
277
|
-
x (float): The x-coordinate of the circle center.
|
|
278
|
-
y (float): The y-coordinate of the circle center.
|
|
279
|
-
r (float): The radius of the circle.
|
|
280
|
-
tolerance (float): The tolerance value to include atoms on the edge of the circle.
|
|
281
|
-
use_cartesian_coordinates (bool): Whether to use cartesian coordinates
|
|
282
|
-
invert_selection (bool): Whether to invert the selection.
|
|
283
|
-
|
|
284
|
-
Returns:
|
|
285
|
-
Material: The filtered material object.
|
|
286
|
-
"""
|
|
287
|
-
|
|
288
|
-
def condition(coordinate):
|
|
289
|
-
return is_coordinate_in_cylinder(coordinate, [x, y, 0], r + tolerance, min_z=0, max_z=1)
|
|
290
|
-
|
|
291
|
-
return filter_by_condition_on_coordinates(
|
|
292
|
-
material, condition, use_cartesian_coordinates=use_cartesian_coordinates, invert_selection=invert_selection
|
|
293
|
-
)
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
def filter_by_cylinder(
|
|
297
|
-
material: Material,
|
|
298
|
-
center_position: Optional[List[float]] = None,
|
|
299
|
-
min_z: Optional[float] = None,
|
|
300
|
-
max_z: Optional[float] = None,
|
|
301
|
-
radius: float = 0.25,
|
|
302
|
-
tolerance: float = 0.0,
|
|
303
|
-
use_cartesian_coordinates: bool = False,
|
|
304
|
-
invert_selection: bool = False,
|
|
305
|
-
) -> Material:
|
|
306
|
-
"""
|
|
307
|
-
Get material with atoms that are within or outside a cylinder.
|
|
308
|
-
|
|
309
|
-
Args:
|
|
310
|
-
material (Material): The material object to filter.
|
|
311
|
-
center_position (List[float], optional): The center position of the cylinder. Defaults to material's center.
|
|
312
|
-
min_z (float, optional): Lower limit of z-coordinate. Defaults to material's min z.
|
|
313
|
-
max_z (float, optional): Upper limit of z-coordinate. Defaults to material's max z.
|
|
314
|
-
radius (float): The radius of the cylinder.
|
|
315
|
-
use_cartesian_coordinates (bool): Whether to use cartesian coordinates.
|
|
316
|
-
invert_selection (bool): Whether to invert the selection.
|
|
317
|
-
|
|
318
|
-
Returns:
|
|
319
|
-
Material: The filtered material object.
|
|
320
|
-
"""
|
|
321
|
-
if center_position is None:
|
|
322
|
-
default_min, default_max = get_default_min_max(material, use_cartesian_coordinates)
|
|
323
|
-
center_position = [(min_c + max_c) / 2 for min_c, max_c in zip(default_min, default_max)]
|
|
324
|
-
|
|
325
|
-
if min_z is None or max_z is None:
|
|
326
|
-
min_z = get_atomic_coordinates_extremum(
|
|
327
|
-
material, "min", "z", use_cartesian_coordinates=use_cartesian_coordinates
|
|
328
|
-
)
|
|
329
|
-
max_z = get_atomic_coordinates_extremum(
|
|
330
|
-
material, "max", "z", use_cartesian_coordinates=use_cartesian_coordinates
|
|
331
|
-
)
|
|
332
|
-
|
|
333
|
-
def condition(coordinate):
|
|
334
|
-
return is_coordinate_in_cylinder(
|
|
335
|
-
coordinate, center_position, radius + tolerance, min_z - tolerance, max_z + tolerance
|
|
336
|
-
)
|
|
337
|
-
|
|
338
|
-
return filter_by_condition_on_coordinates(
|
|
339
|
-
material, condition, use_cartesian_coordinates=use_cartesian_coordinates, invert_selection=invert_selection
|
|
340
|
-
)
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
def filter_by_rectangle_projection(
|
|
344
|
-
material: Material,
|
|
345
|
-
min_coordinate: List[float] = [0, 0],
|
|
346
|
-
max_coordinate: List[float] = [1, 1],
|
|
347
|
-
tolerance: float = 0.0,
|
|
348
|
-
use_cartesian_coordinates: bool = False,
|
|
349
|
-
invert_selection: bool = False,
|
|
350
|
-
) -> Material:
|
|
351
|
-
"""
|
|
352
|
-
Get material with atoms that are within or outside an XY rectangle projection.
|
|
353
|
-
|
|
354
|
-
Args:
|
|
355
|
-
material (Material): The material object to filter.
|
|
356
|
-
min_coordinate (List[float]): The minimum coordinate of the rectangle.
|
|
357
|
-
max_coordinate (List[float]): The maximum coordinate of the rectangle.
|
|
358
|
-
tolerance (float): The tolerance value to include atoms on the edges of the rectangle.
|
|
359
|
-
use_cartesian_coordinates (bool): Whether to use cartesian coordinates
|
|
360
|
-
invert_selection (bool): Whether to invert the selection.
|
|
361
|
-
|
|
362
|
-
Returns:
|
|
363
|
-
Material: The filtered material object.
|
|
364
|
-
"""
|
|
365
|
-
min_z = get_atomic_coordinates_extremum(material, "min", "z", use_cartesian_coordinates=use_cartesian_coordinates)
|
|
366
|
-
max_z = get_atomic_coordinates_extremum(material, "max", "z", use_cartesian_coordinates=use_cartesian_coordinates)
|
|
367
|
-
min_coordinate = [c - tolerance for c in min_coordinate[:2]] + [min_z]
|
|
368
|
-
max_coordinate = [c + tolerance for c in max_coordinate[:2]] + [max_z]
|
|
369
|
-
|
|
370
|
-
def condition(coordinate):
|
|
371
|
-
return is_coordinate_in_box(coordinate, min_coordinate, max_coordinate)
|
|
372
|
-
|
|
373
|
-
return filter_by_condition_on_coordinates(
|
|
374
|
-
material, condition, use_cartesian_coordinates=use_cartesian_coordinates, invert_selection=invert_selection
|
|
375
|
-
)
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
def filter_by_box(
|
|
379
|
-
material: Material,
|
|
380
|
-
min_coordinate: Optional[List[float]] = None,
|
|
381
|
-
max_coordinate: Optional[List[float]] = None,
|
|
382
|
-
tolerance: float = 0.0,
|
|
383
|
-
use_cartesian_coordinates: bool = False,
|
|
384
|
-
invert_selection: bool = False,
|
|
385
|
-
reset_ids: bool = False,
|
|
386
|
-
) -> MaterialWithBuildMetadata:
|
|
387
|
-
"""
|
|
388
|
-
Get material with atoms that are within or outside an XYZ box.
|
|
389
|
-
|
|
390
|
-
Args:
|
|
391
|
-
material (Material): The material to filter.
|
|
392
|
-
min_coordinate (List[float], optional): The minimum coordinate of the box. Defaults to material's min.
|
|
393
|
-
max_coordinate (List[float], optional): The maximum coordinate of the box. Defaults to material's max.
|
|
394
|
-
tolerance (float): The tolerance value to include atoms on the edges of the box.
|
|
395
|
-
use_cartesian_coordinates (bool): Whether to use cartesian coordinates.
|
|
396
|
-
invert_selection (bool): Whether to invert the selection.
|
|
397
|
-
|
|
398
|
-
Returns:
|
|
399
|
-
Material: The filtered material object.
|
|
400
|
-
"""
|
|
401
|
-
if min_coordinate is None or max_coordinate is None:
|
|
402
|
-
default_min, default_max = get_default_min_max(material, use_cartesian_coordinates)
|
|
403
|
-
min_coordinate = min_coordinate if min_coordinate is not None else default_min
|
|
404
|
-
max_coordinate = max_coordinate if max_coordinate is not None else default_max
|
|
405
|
-
|
|
406
|
-
min_coordinate = [c - tolerance for c in min_coordinate]
|
|
407
|
-
max_coordinate = [c + tolerance for c in max_coordinate]
|
|
408
|
-
|
|
409
|
-
def condition(coordinate):
|
|
410
|
-
return is_coordinate_in_box(coordinate, min_coordinate, max_coordinate)
|
|
411
|
-
|
|
412
|
-
return filter_by_condition_on_coordinates(
|
|
413
|
-
material,
|
|
414
|
-
condition,
|
|
415
|
-
use_cartesian_coordinates=use_cartesian_coordinates,
|
|
416
|
-
invert_selection=invert_selection,
|
|
417
|
-
reset_ids=reset_ids,
|
|
418
|
-
)
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
def filter_by_triangle_projection(
|
|
422
|
-
material: Material,
|
|
423
|
-
coordinate_1: Optional[List[float]] = None,
|
|
424
|
-
coordinate_2: Optional[List[float]] = None,
|
|
425
|
-
coordinate_3: Optional[List[float]] = None,
|
|
426
|
-
min_z: Optional[float] = None,
|
|
427
|
-
max_z: Optional[float] = None,
|
|
428
|
-
tolerance: float = 0.0,
|
|
429
|
-
use_cartesian_coordinates: bool = False,
|
|
430
|
-
invert_selection: bool = False,
|
|
431
|
-
) -> Material:
|
|
432
|
-
"""
|
|
433
|
-
Get material with atoms that are within or outside a triangular prism.
|
|
434
|
-
|
|
435
|
-
Args:
|
|
436
|
-
material (Material): The material object to filter.
|
|
437
|
-
coordinate_1 (List[float], optional): First vertex of the triangle. Defaults to material's corner.
|
|
438
|
-
coordinate_2 (List[float], optional): Second vertex of the triangle. Defaults to material's corner.
|
|
439
|
-
coordinate_3 (List[float], optional): Third vertex of the triangle. Defaults to material's corner.
|
|
440
|
-
min_z (float, optional): Lower z-limit. Defaults to material's min z.
|
|
441
|
-
max_z (float, optional): Upper z-limit. Defaults to material's max z.
|
|
442
|
-
tolerance (float): The tolerance value to include atoms on the top and bottom faces of the prism.
|
|
443
|
-
use_cartesian_coordinates (bool): Whether to use cartesian coordinates.
|
|
444
|
-
invert_selection (bool): Whether to invert the selection.
|
|
445
|
-
|
|
446
|
-
Returns:
|
|
447
|
-
Material: The filtered material object.
|
|
448
|
-
"""
|
|
449
|
-
if coordinate_1 is None or coordinate_2 is None or coordinate_3 is None:
|
|
450
|
-
default_min, default_max = get_default_min_max(material, use_cartesian_coordinates)
|
|
451
|
-
coordinate_1 = coordinate_1 if coordinate_1 is not None else [default_min[0], default_min[1]]
|
|
452
|
-
coordinate_2 = coordinate_2 if coordinate_2 is not None else [default_min[0], default_max[1]]
|
|
453
|
-
coordinate_3 = coordinate_3 if coordinate_3 is not None else [default_max[0], default_min[1]]
|
|
454
|
-
|
|
455
|
-
if min_z is None:
|
|
456
|
-
min_z = get_atomic_coordinates_extremum(
|
|
457
|
-
material, "min", "z", use_cartesian_coordinates=use_cartesian_coordinates
|
|
458
|
-
)
|
|
459
|
-
else:
|
|
460
|
-
min_z -= tolerance
|
|
461
|
-
|
|
462
|
-
if max_z is None:
|
|
463
|
-
max_z = get_atomic_coordinates_extremum(
|
|
464
|
-
material, "max", "z", use_cartesian_coordinates=use_cartesian_coordinates
|
|
465
|
-
)
|
|
466
|
-
else:
|
|
467
|
-
max_z += tolerance
|
|
468
|
-
|
|
469
|
-
def condition(coordinate):
|
|
470
|
-
return is_coordinate_in_triangular_prism(
|
|
471
|
-
coordinate,
|
|
472
|
-
coordinate_1,
|
|
473
|
-
coordinate_2,
|
|
474
|
-
coordinate_3,
|
|
475
|
-
min_z,
|
|
476
|
-
max_z,
|
|
477
|
-
)
|
|
478
|
-
|
|
479
|
-
return filter_by_condition_on_coordinates(
|
|
480
|
-
material, condition, use_cartesian_coordinates=use_cartesian_coordinates, invert_selection=invert_selection
|
|
481
|
-
)
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
def add_vacuum(material: Material, vacuum: float = 5.0, on_top=True, to_bottom=False) -> Material:
|
|
485
|
-
"""
|
|
486
|
-
Add vacuum to the material along the c-axis.
|
|
487
|
-
On top, on bottom, or both.
|
|
488
|
-
|
|
489
|
-
Args:
|
|
490
|
-
material (Material): The material object to add vacuum to.
|
|
491
|
-
vacuum (float): The thickness of the vacuum to add in angstroms.
|
|
492
|
-
on_top (bool): Whether to add vacuum on top.
|
|
493
|
-
to_bottom (bool): Whether to add vacuum on bottom.
|
|
494
|
-
|
|
495
|
-
Returns:
|
|
496
|
-
Material: The material object with vacuum added.
|
|
497
|
-
"""
|
|
498
|
-
new_material_atoms = to_ase(material)
|
|
499
|
-
vacuum_amount = vacuum * 2 if on_top and to_bottom else vacuum
|
|
500
|
-
ase_add_vacuum(new_material_atoms, vacuum_amount)
|
|
501
|
-
new_material = MaterialWithBuildMetadata.create(from_ase(new_material_atoms))
|
|
502
|
-
if to_bottom and not on_top:
|
|
503
|
-
new_material = translate_to_z_level(new_material, z_level="top")
|
|
504
|
-
elif on_top and to_bottom:
|
|
505
|
-
new_material = translate_to_z_level(new_material, z_level="center")
|
|
506
|
-
return new_material
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
def add_vacuum_sides(material: Material, vacuum: float = 5.0, on_x=False, on_y=False) -> Material:
|
|
510
|
-
"""
|
|
511
|
-
Add vacuum to the material along the x-axis and/or y-axis.
|
|
512
|
-
On x, on y, or both.
|
|
513
|
-
|
|
514
|
-
Args:
|
|
515
|
-
material (Material): The material object to add vacuum to.
|
|
516
|
-
vacuum (float): The thickness of the vacuum to add in angstroms.
|
|
517
|
-
on_x (bool): Whether to add vacuum on the x-axis.
|
|
518
|
-
on_y (bool): Whether to add vacuum on the y-axis.
|
|
519
|
-
|
|
520
|
-
Returns:
|
|
521
|
-
Material: The material object with vacuum added.
|
|
522
|
-
"""
|
|
523
|
-
new_material = material.clone()
|
|
524
|
-
min_x = get_atomic_coordinates_extremum(new_material, "min", "x", use_cartesian_coordinates=True)
|
|
525
|
-
max_x = get_atomic_coordinates_extremum(new_material, "max", "x", use_cartesian_coordinates=True)
|
|
526
|
-
min_y = get_atomic_coordinates_extremum(new_material, "min", "y", use_cartesian_coordinates=True)
|
|
527
|
-
max_y = get_atomic_coordinates_extremum(new_material, "max", "y", use_cartesian_coordinates=True)
|
|
528
|
-
|
|
529
|
-
new_lattice_a_vector, new_lattice_b_vector, new_lattice_c_vector = new_material.lattice.vector_arrays
|
|
530
|
-
if on_x:
|
|
531
|
-
new_x_length = max_x - min_x + 2 * vacuum
|
|
532
|
-
new_lattice_a_vector = [new_x_length, 0, 0]
|
|
533
|
-
if on_y:
|
|
534
|
-
new_y_length = max_y - min_y + 2 * vacuum
|
|
535
|
-
new_lattice_b_vector = [0, new_y_length, 0]
|
|
536
|
-
|
|
537
|
-
new_material.set_lattice_vectors(new_lattice_a_vector, new_lattice_b_vector, new_lattice_c_vector)
|
|
538
|
-
new_material = translate_by_vector(
|
|
539
|
-
new_material,
|
|
540
|
-
[-min_x + vacuum if on_x else 0, -min_y + vacuum if on_y else 0, 0],
|
|
541
|
-
use_cartesian_coordinates=True,
|
|
542
|
-
)
|
|
543
|
-
|
|
544
|
-
return new_material
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
def remove_vacuum(material: Material, from_top=True, from_bottom=True, fixed_padding=1.0) -> Material:
|
|
548
|
-
"""
|
|
549
|
-
Remove vacuum from the material along the c-axis.
|
|
550
|
-
From top, from bottom, or from both.
|
|
551
|
-
|
|
552
|
-
Args:
|
|
553
|
-
material (Material): The material object to set the vacuum thickness.
|
|
554
|
-
from_top (bool): Whether to remove vacuum from the top.
|
|
555
|
-
from_bottom (bool): Whether to remove vacuum from the bottom.
|
|
556
|
-
fixed_padding (float): The fixed padding of vacuum to add to avoid collisions in pbc (in angstroms).
|
|
557
|
-
|
|
558
|
-
Returns:
|
|
559
|
-
Material: The material object with the vacuum thickness set.
|
|
560
|
-
"""
|
|
561
|
-
translated_material = translate_to_z_level(material, z_level="bottom")
|
|
562
|
-
translated_material.to_cartesian()
|
|
563
|
-
max_z_distance = (
|
|
564
|
-
get_atomic_coordinates_extremum(translated_material, use_cartesian_coordinates=True) + fixed_padding
|
|
565
|
-
)
|
|
566
|
-
new_lattice = translated_material.lattice
|
|
567
|
-
new_lattice.c = max_z_distance
|
|
568
|
-
translated_material.set_lattice(new_lattice)
|
|
569
|
-
if material.basis.is_in_crystal_units:
|
|
570
|
-
translated_material.to_crystal()
|
|
571
|
-
|
|
572
|
-
new_material = translated_material.clone()
|
|
573
|
-
|
|
574
|
-
if from_top and not from_bottom:
|
|
575
|
-
new_material = translate_to_z_level(new_material, z_level="top")
|
|
576
|
-
if from_bottom and not from_top:
|
|
577
|
-
new_material = translate_to_z_level(new_material, z_level="bottom")
|
|
578
|
-
return new_material
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
def interface_displace_part(
|
|
582
|
-
interface: Material,
|
|
583
|
-
displacement: List[float],
|
|
584
|
-
label: InterfacePartsEnum = InterfacePartsEnum.FILM,
|
|
585
|
-
use_cartesian_coordinates=True,
|
|
586
|
-
) -> Material:
|
|
587
|
-
"""
|
|
588
|
-
Displace atoms in an interface along a certain direction.
|
|
589
|
-
|
|
590
|
-
Args:
|
|
591
|
-
interface (Material): The interface Material object.
|
|
592
|
-
displacement (List[float]): The displacement vector in angstroms or crystal coordinates.
|
|
593
|
-
label (InterfacePartsEnum): The label of the atoms to displace ("substrate" or "film").
|
|
594
|
-
use_cartesian_coordinates (bool): Whether to use cartesian coordinates.
|
|
595
|
-
|
|
596
|
-
Returns:
|
|
597
|
-
Material: The displaced material object.
|
|
598
|
-
"""
|
|
599
|
-
new_material = interface.clone()
|
|
600
|
-
if use_cartesian_coordinates:
|
|
601
|
-
new_material.to_cartesian()
|
|
602
|
-
labels_array = new_material.basis.labels.to_array_of_values_with_ids()
|
|
603
|
-
displaced_label_ids = [_label.id for _label in labels_array if _label.value == int(label)]
|
|
604
|
-
|
|
605
|
-
new_coordinates_values = new_material.basis.coordinates.values
|
|
606
|
-
for atom_id in displaced_label_ids:
|
|
607
|
-
current_coordinate = new_material.basis.coordinates.get_element_value_by_index(atom_id)
|
|
608
|
-
new_atom_coordinate = np.array(current_coordinate) + np.array(displacement)
|
|
609
|
-
new_coordinates_values[atom_id] = new_atom_coordinate
|
|
610
|
-
|
|
611
|
-
new_material.set_coordinates(new_coordinates_values)
|
|
612
|
-
new_material.to_crystal()
|
|
613
|
-
new_material = wrap_to_unit_cell(new_material)
|
|
614
|
-
return new_material
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
def interface_get_part(
|
|
618
|
-
interface: MaterialWithBuildMetadata,
|
|
619
|
-
part: InterfacePartsEnum = InterfacePartsEnum.FILM,
|
|
620
|
-
) -> Material:
|
|
621
|
-
metadata = interface.metadata
|
|
622
|
-
allowed_configurations = ["InterfaceConfiguration", "StackConfiguration"]
|
|
623
|
-
if metadata.build[-1].configuration.get("type") not in allowed_configurations:
|
|
624
|
-
raise ValueError("The material is not an interface.")
|
|
625
|
-
interface_part_material = interface.clone()
|
|
626
|
-
interface_part_material.basis.filter_atoms_by_labels([part.value])
|
|
627
|
-
return interface_part_material
|