@mat3ra/made 2026.8.7-0 → 2026.8.18-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/dist/js/Material.d.ts +219 -0
- package/dist/js/Material.js +457 -0
- package/dist/js/basis/basis.d.ts +14 -9
- package/dist/js/basis/basis.js +15 -13
- package/dist/js/basis/constrained_basis.d.ts +9 -7
- package/dist/js/basis/constrained_basis.js +4 -4
- package/dist/js/generated/MaterialSchemaMixin.d.ts +5 -0
- package/dist/js/generated/MaterialSchemaMixin.js +69 -0
- package/dist/js/lattice/lattice.d.ts +4 -3
- package/dist/js/lattice/lattice.js +1 -2
- package/dist/js/made.d.ts +12 -12
- package/dist/js/made.js +38 -5
- package/dist/js/parsers/espresso.d.ts +2 -3
- package/dist/js/parsers/espresso.js +0 -1
- package/dist/js/parsers/native_format_parsers.d.ts +9 -8
- package/dist/js/parsers/native_format_parsers.js +6 -6
- package/dist/js/parsers/parsers.d.ts +6 -6
- package/dist/js/parsers/poscar.d.ts +5 -4
- package/dist/js/parsers/poscar.js +3 -2
- package/dist/js/parsers/xyz.d.ts +3 -5
- package/dist/js/parsers/xyz.js +3 -4
- package/dist/js/parsers/xyz_combinatorial_basis.js +3 -1
- package/dist/js/tools/basis.d.ts +1 -1
- package/dist/js/tools/index.d.ts +7 -7
- package/dist/js/tools/material.d.ts +1 -1
- package/dist/js/tools/material.js +8 -7
- package/dist/js/tools/supercell.d.ts +4 -5
- package/dist/js/tools/supercell.js +2 -4
- package/dist/js/tools/surface.d.ts +4 -4
- package/dist/js/tools/surface.js +2 -7
- package/package.json +12 -8
- 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/dist/js/material.d.ts +0 -169
- package/dist/js/material.js +0 -362
- 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/src/__init__.py +0 -0
- package/src/js/basis/basis.ts +0 -621
- package/src/js/basis/constrained_basis.ts +0 -114
- package/src/js/basis/coordinates.ts +0 -93
- 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 -150
- 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/lattice/lattice.ts +0 -306
- package/src/js/lattice/lattice_types.ts +0 -134
- package/src/js/lattice/reciprocal/lattice_reciprocal.ts +0 -193
- 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/material.ts +0 -458
- package/src/js/parsers/cif.ts +0 -25
- package/src/js/parsers/errors.ts +0 -6
- package/src/js/parsers/espresso.ts +0 -30
- package/src/js/parsers/native_format_parsers.ts +0 -51
- package/src/js/parsers/parsers.ts +0 -13
- package/src/js/parsers/poscar.ts +0 -212
- package/src/js/parsers/xyz.ts +0 -187
- package/src/js/parsers/xyz_combinatorial_basis.ts +0 -265
- package/src/js/tools/basis.ts +0 -132
- package/src/js/tools/cell.ts +0 -41
- package/src/js/tools/index.ts +0 -11
- package/src/js/tools/material.ts +0 -62
- package/src/js/tools/supercell.ts +0 -88
- package/src/js/tools/surface.ts +0 -223
- 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 -134
- 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 -120
- package/tests/js/lattice/lattice.ts +0 -43
- package/tests/js/lattice/lattice_reciprocal.ts +0 -104
- package/tests/js/material.test.ts +0 -42
- package/tests/js/parsers/espresso.ts +0 -15
- 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/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 -115
- 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,80 +0,0 @@
|
|
|
1
|
-
from typing import List, Tuple
|
|
2
|
-
|
|
3
|
-
from mat3ra.code.entity import InMemoryEntityPydantic
|
|
4
|
-
from mat3ra.esse.models.core.abstract.matrix_3x3 import Matrix3x3Schema
|
|
5
|
-
from mat3ra.esse.models.materials_category_components.entities.auxiliary.two_dimensional.supercell_matrix_2d import (
|
|
6
|
-
SupercellMatrix2DSchema,
|
|
7
|
-
)
|
|
8
|
-
from mat3ra.made.material import Material
|
|
9
|
-
from mat3ra.made.tools.build.pristine_structures.two_dimensional.slab.configuration import SlabConfiguration
|
|
10
|
-
from pydantic import model_validator
|
|
11
|
-
|
|
12
|
-
from .utils.holders import MatchedSubstrateFilmConfigurationHolder
|
|
13
|
-
from .zsl import ZSLInterfaceAnalyzer
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
class GrainBoundaryPlanarMatchHolder(InMemoryEntityPydantic):
|
|
17
|
-
match_id: int
|
|
18
|
-
substrate_transformation_matrix: SupercellMatrix2DSchema
|
|
19
|
-
film_transformation_matrix: SupercellMatrix2DSchema
|
|
20
|
-
match_area: float
|
|
21
|
-
strain_transformation_matrix: Matrix3x3Schema
|
|
22
|
-
total_strain_percentage: float
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
class GrainBoundaryPlanarAnalyzer(ZSLInterfaceAnalyzer):
|
|
26
|
-
"""
|
|
27
|
-
Analyzer for creating grain boundaries between two orientations of the same material.
|
|
28
|
-
|
|
29
|
-
Uses ZSL to find matching supercells between two phases with different
|
|
30
|
-
orientations, then stacks them in x/y direction to create a grain boundary configuration.
|
|
31
|
-
"""
|
|
32
|
-
|
|
33
|
-
phase_1_material: Material
|
|
34
|
-
phase_2_material: Material
|
|
35
|
-
phase_1_miller_indices: Tuple[int, int, int]
|
|
36
|
-
phase_2_miller_indices: Tuple[int, int, int]
|
|
37
|
-
phase_1_thickness: int = 1
|
|
38
|
-
phase_2_thickness: int = 1
|
|
39
|
-
|
|
40
|
-
@model_validator(mode="before")
|
|
41
|
-
@classmethod
|
|
42
|
-
def _setup_slab_configurations(cls, values):
|
|
43
|
-
# we need to create slab configurations for both phases for InterfaceAnalyzer to use
|
|
44
|
-
values["substrate_slab_configuration"] = SlabConfiguration.from_parameters(
|
|
45
|
-
material_or_dict=values["phase_1_material"],
|
|
46
|
-
miller_indices=values["phase_1_miller_indices"],
|
|
47
|
-
number_of_layers=values.get("phase_1_thickness", 1),
|
|
48
|
-
vacuum=0.0,
|
|
49
|
-
)
|
|
50
|
-
values["film_slab_configuration"] = SlabConfiguration.from_parameters(
|
|
51
|
-
material_or_dict=values["phase_2_material"],
|
|
52
|
-
miller_indices=values["phase_2_miller_indices"],
|
|
53
|
-
number_of_layers=values.get("phase_2_thickness", 1),
|
|
54
|
-
vacuum=0.0,
|
|
55
|
-
)
|
|
56
|
-
return values
|
|
57
|
-
|
|
58
|
-
@property
|
|
59
|
-
def grain_boundary_match_holders(self) -> List[GrainBoundaryPlanarMatchHolder]:
|
|
60
|
-
zsl_matches = self.zsl_match_holders
|
|
61
|
-
match_holders = []
|
|
62
|
-
|
|
63
|
-
for idx, zsl_match in enumerate(zsl_matches):
|
|
64
|
-
match_holder = GrainBoundaryPlanarMatchHolder(
|
|
65
|
-
match_id=idx,
|
|
66
|
-
substrate_transformation_matrix=zsl_match.substrate_supercell_matrix,
|
|
67
|
-
film_transformation_matrix=zsl_match.film_supercell_matrix,
|
|
68
|
-
match_area=zsl_match.match_area,
|
|
69
|
-
strain_transformation_matrix=zsl_match.strain_transformation_matrix,
|
|
70
|
-
total_strain_percentage=zsl_match.total_strain_percentage,
|
|
71
|
-
)
|
|
72
|
-
match_holders.append(match_holder)
|
|
73
|
-
|
|
74
|
-
return match_holders
|
|
75
|
-
|
|
76
|
-
def get_grain_boundary_configuration_by_match_id(self, match_id: int) -> MatchedSubstrateFilmConfigurationHolder:
|
|
77
|
-
return self.get_strained_configuration_by_match_id(match_id)
|
|
78
|
-
|
|
79
|
-
def get_grain_boundary_configurations(self) -> List[MatchedSubstrateFilmConfigurationHolder]:
|
|
80
|
-
return self.get_strained_configurations()
|
|
@@ -1,251 +0,0 @@
|
|
|
1
|
-
from functools import cached_property
|
|
2
|
-
from typing import Optional, Tuple
|
|
3
|
-
|
|
4
|
-
import numpy as np
|
|
5
|
-
from mat3ra.code.entity import InMemoryEntityPydantic
|
|
6
|
-
from mat3ra.esse.models.core.abstract.matrix_3x3 import Matrix3x3Schema
|
|
7
|
-
from mat3ra.esse.models.materials_category_components.entities.auxiliary.two_dimensional.supercell_matrix_2d import (
|
|
8
|
-
SupercellMatrix2DSchema,
|
|
9
|
-
)
|
|
10
|
-
from mat3ra.made.tools.build.pristine_structures.two_dimensional.slab.build_parameters import SlabBuilderParameters
|
|
11
|
-
from mat3ra.made.tools.build.pristine_structures.two_dimensional.slab.builder import SlabBuilder
|
|
12
|
-
from mat3ra.made.tools.build.pristine_structures.two_dimensional.slab.configuration import SlabConfiguration
|
|
13
|
-
|
|
14
|
-
from ...build.pristine_structures.two_dimensional.slab_strained_supercell.configuration import (
|
|
15
|
-
SlabStrainedSupercellConfiguration,
|
|
16
|
-
)
|
|
17
|
-
from ...operations.core.unary import supercell
|
|
18
|
-
from ...utils import unwrap
|
|
19
|
-
from ..interface.utils.holders import MatchedSubstrateFilmConfigurationHolder
|
|
20
|
-
from ..utils import calculate_von_mises_strain
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
class InterfaceAnalyzer(InMemoryEntityPydantic):
|
|
24
|
-
"""
|
|
25
|
-
Analyzes the interface between two slabs, calculating strain matrices and strained configurations.
|
|
26
|
-
This class is used to prepare the configurations for the substrate and film materials, ensuring that the film
|
|
27
|
-
material's lattice vectors match the substrate material's lattice vectors.
|
|
28
|
-
|
|
29
|
-
`substrate_strained_configuration` and `film_strained_configuration` properties provide the strained configurations.
|
|
30
|
-
"""
|
|
31
|
-
|
|
32
|
-
substrate_slab_configuration: SlabConfiguration
|
|
33
|
-
film_slab_configuration: SlabConfiguration
|
|
34
|
-
substrate_build_parameters: Optional[SlabBuilderParameters] = None
|
|
35
|
-
film_build_parameters: Optional[SlabBuilderParameters] = None
|
|
36
|
-
optimize_film_supercell: bool = False
|
|
37
|
-
|
|
38
|
-
def get_component_material(self, configuration: SlabConfiguration):
|
|
39
|
-
return SlabBuilder().get_material(configuration)
|
|
40
|
-
|
|
41
|
-
@cached_property
|
|
42
|
-
def substrate_material(self):
|
|
43
|
-
return self.get_component_material(self.substrate_slab_configuration)
|
|
44
|
-
|
|
45
|
-
@cached_property
|
|
46
|
-
def film_material(self):
|
|
47
|
-
return self.get_component_material(self.film_slab_configuration)
|
|
48
|
-
|
|
49
|
-
@property
|
|
50
|
-
def identity_supercell(self) -> SupercellMatrix2DSchema:
|
|
51
|
-
return SupercellMatrix2DSchema(root=[[1, 0], [0, 1]])
|
|
52
|
-
|
|
53
|
-
@property
|
|
54
|
-
def _no_strain_matrix(self) -> Matrix3x3Schema:
|
|
55
|
-
return Matrix3x3Schema(root=np.eye(3).tolist())
|
|
56
|
-
|
|
57
|
-
def get_film_strain_matrix(
|
|
58
|
-
self,
|
|
59
|
-
substrate_lattice_vector_arrays: np.ndarray,
|
|
60
|
-
film_lattice_vector_arrays: np.ndarray,
|
|
61
|
-
) -> Matrix3x3Schema:
|
|
62
|
-
"""Calculate film strain to match substrate using ZSL approach.
|
|
63
|
-
|
|
64
|
-
This function calculates the 2D strain matrix needed to transform the film
|
|
65
|
-
lattice vectors to match the substrate lattice vectors.
|
|
66
|
-
|
|
67
|
-
Args:
|
|
68
|
-
substrate_lattice_vector_arrays: 3x3 array of substrate lattice vectors
|
|
69
|
-
film_lattice_vector_arrays: 3x3 array of film lattice vectors
|
|
70
|
-
|
|
71
|
-
Returns:
|
|
72
|
-
2x2 strain matrix that transforms film vectors to substrate vectors
|
|
73
|
-
"""
|
|
74
|
-
substrate_vectors = np.array(substrate_lattice_vector_arrays)
|
|
75
|
-
film_vectors = np.array(film_lattice_vector_arrays)
|
|
76
|
-
|
|
77
|
-
substrate_2d_vectors = substrate_vectors[:2, :2]
|
|
78
|
-
film_2d_vectors = film_vectors[:2, :2]
|
|
79
|
-
|
|
80
|
-
try:
|
|
81
|
-
strain_2d = np.linalg.solve(film_2d_vectors, substrate_2d_vectors)
|
|
82
|
-
except np.linalg.LinAlgError:
|
|
83
|
-
raise ValueError("Film lattice vectors are not linearly independent.")
|
|
84
|
-
|
|
85
|
-
strain_3d = np.eye(3)
|
|
86
|
-
strain_3d[:2, :2] = strain_2d
|
|
87
|
-
return Matrix3x3Schema(root=strain_3d.tolist())
|
|
88
|
-
|
|
89
|
-
def get_substrate_strain_matrix(self) -> Matrix3x3Schema:
|
|
90
|
-
return self._no_strain_matrix
|
|
91
|
-
|
|
92
|
-
def _calculate_strain_for_film_supercell(self, film_n: int, film_m: int) -> float:
|
|
93
|
-
"""
|
|
94
|
-
Calculate strain for given film supercell configuration against unchanged substrate.
|
|
95
|
-
|
|
96
|
-
Args:
|
|
97
|
-
film_n: Film supercell multiplier in a direction
|
|
98
|
-
film_m: Film supercell multiplier in b direction
|
|
99
|
-
|
|
100
|
-
Returns:
|
|
101
|
-
Von Mises strain percentage
|
|
102
|
-
"""
|
|
103
|
-
|
|
104
|
-
# Apply supercell to film material
|
|
105
|
-
supercell_matrix = [[film_n, 0], [0, film_m]]
|
|
106
|
-
film_with_supercell = supercell(self.film_material, supercell_matrix)
|
|
107
|
-
|
|
108
|
-
# Use existing get_film_strain_matrix with supercelled film
|
|
109
|
-
strain_matrix = self.get_film_strain_matrix(
|
|
110
|
-
self.substrate_material.lattice.vector_arrays, film_with_supercell.lattice.vector_arrays
|
|
111
|
-
)
|
|
112
|
-
|
|
113
|
-
return calculate_von_mises_strain(np.array(unwrap(strain_matrix.root)))
|
|
114
|
-
|
|
115
|
-
def _find_optimal_supercell_factor_for_direction(self, substrate_length: float, film_length: float) -> int:
|
|
116
|
-
"""
|
|
117
|
-
Finds a multiplier for the component of diagonal supercell matrix
|
|
118
|
-
that will get film supercell lattice vector length around substrate length.
|
|
119
|
-
The N leads to the film supercell vector length being shorter than substrate length,
|
|
120
|
-
and N+1 leads to the film supercell vector length being longer than substrate length.
|
|
121
|
-
"""
|
|
122
|
-
|
|
123
|
-
# Find optimal: when n*film_length < substrate_length < (n+1)*film_length
|
|
124
|
-
optimal = max(1, int(substrate_length / film_length))
|
|
125
|
-
if (optimal + 1) * film_length - substrate_length < substrate_length - optimal * film_length:
|
|
126
|
-
optimal += 1
|
|
127
|
-
|
|
128
|
-
return optimal
|
|
129
|
-
|
|
130
|
-
def find_optimal_film_supercell(self) -> Tuple[int, int]:
|
|
131
|
-
"""
|
|
132
|
-
Find optimal (n, m) supercell multipliers for film that minimize strain.
|
|
133
|
-
|
|
134
|
-
Returns:
|
|
135
|
-
Tuple of (n, m) supercell multipliers that minimize strain
|
|
136
|
-
"""
|
|
137
|
-
substrate_vectors = np.array(self.substrate_material.lattice.vector_arrays[:2])
|
|
138
|
-
film_vectors = np.array(self.film_material.lattice.vector_arrays[:2])
|
|
139
|
-
|
|
140
|
-
substrate_lengths = [np.linalg.norm(substrate_vectors[i, :2]) for i in range(2)]
|
|
141
|
-
film_lengths = [np.linalg.norm(film_vectors[i, :2]) for i in range(2)]
|
|
142
|
-
|
|
143
|
-
optimal_values = []
|
|
144
|
-
for substrate_length, film_length in zip(substrate_lengths, film_lengths):
|
|
145
|
-
optimal = self._find_optimal_supercell_factor_for_direction(substrate_length, film_length)
|
|
146
|
-
optimal_values.append(optimal)
|
|
147
|
-
|
|
148
|
-
n_optimal, m_optimal = optimal_values
|
|
149
|
-
|
|
150
|
-
# Test neighboring values to find minimum strain
|
|
151
|
-
candidates = [
|
|
152
|
-
(n_optimal, m_optimal),
|
|
153
|
-
(n_optimal + 1, m_optimal),
|
|
154
|
-
(n_optimal, m_optimal + 1),
|
|
155
|
-
(n_optimal + 1, m_optimal + 1),
|
|
156
|
-
]
|
|
157
|
-
|
|
158
|
-
min_strain = float("inf")
|
|
159
|
-
best_n, best_m = n_optimal, m_optimal
|
|
160
|
-
|
|
161
|
-
for n, m in candidates:
|
|
162
|
-
strain = self._calculate_strain_for_film_supercell(n, m)
|
|
163
|
-
if strain < min_strain:
|
|
164
|
-
min_strain = strain
|
|
165
|
-
best_n, best_m = n, m
|
|
166
|
-
|
|
167
|
-
return best_n, best_m
|
|
168
|
-
|
|
169
|
-
def get_component_strained_configuration(
|
|
170
|
-
self,
|
|
171
|
-
configuration: SlabConfiguration,
|
|
172
|
-
strain_matrix: Matrix3x3Schema,
|
|
173
|
-
xy_supercell_matrix: SupercellMatrix2DSchema = None,
|
|
174
|
-
) -> SlabStrainedSupercellConfiguration:
|
|
175
|
-
if xy_supercell_matrix is not None:
|
|
176
|
-
matrix_list = [[item.root[0], item.root[1]] for item in xy_supercell_matrix.root]
|
|
177
|
-
else:
|
|
178
|
-
matrix_list = [[1, 0], [0, 1]]
|
|
179
|
-
|
|
180
|
-
return SlabStrainedSupercellConfiguration(
|
|
181
|
-
stack_components=configuration.stack_components,
|
|
182
|
-
direction=configuration.direction,
|
|
183
|
-
strain_matrix=strain_matrix,
|
|
184
|
-
xy_supercell_matrix=matrix_list,
|
|
185
|
-
)
|
|
186
|
-
|
|
187
|
-
def create_matched_configuration_holder(
|
|
188
|
-
self,
|
|
189
|
-
substrate_slab_config: SlabConfiguration,
|
|
190
|
-
film_slab_config: SlabConfiguration,
|
|
191
|
-
match_id: int = 0,
|
|
192
|
-
substrate_xy_supercell_matrix: SupercellMatrix2DSchema = None,
|
|
193
|
-
film_xy_supercell_matrix: SupercellMatrix2DSchema = None,
|
|
194
|
-
substrate_strain_matrix: Matrix3x3Schema = None,
|
|
195
|
-
film_strain_matrix: Matrix3x3Schema = None,
|
|
196
|
-
total_strain_percentage: Optional[float] = None,
|
|
197
|
-
) -> MatchedSubstrateFilmConfigurationHolder:
|
|
198
|
-
if substrate_strain_matrix is None:
|
|
199
|
-
substrate_strain_matrix = self._no_strain_matrix
|
|
200
|
-
if film_strain_matrix is None:
|
|
201
|
-
film_strain_matrix = self._no_strain_matrix
|
|
202
|
-
|
|
203
|
-
substrate_config = self.get_component_strained_configuration(
|
|
204
|
-
substrate_slab_config,
|
|
205
|
-
substrate_strain_matrix,
|
|
206
|
-
xy_supercell_matrix=substrate_xy_supercell_matrix,
|
|
207
|
-
)
|
|
208
|
-
|
|
209
|
-
film_config = self.get_component_strained_configuration(
|
|
210
|
-
film_slab_config, film_strain_matrix, xy_supercell_matrix=film_xy_supercell_matrix
|
|
211
|
-
)
|
|
212
|
-
|
|
213
|
-
return MatchedSubstrateFilmConfigurationHolder(
|
|
214
|
-
match_id=match_id,
|
|
215
|
-
substrate_configuration=substrate_config,
|
|
216
|
-
film_configuration=film_config,
|
|
217
|
-
total_strain_percentage=total_strain_percentage,
|
|
218
|
-
)
|
|
219
|
-
|
|
220
|
-
@property
|
|
221
|
-
def substrate_supercell_matrix(self) -> SupercellMatrix2DSchema:
|
|
222
|
-
if self.substrate_build_parameters and self.substrate_build_parameters.xy_supercell_matrix:
|
|
223
|
-
return SupercellMatrix2DSchema(root=self.substrate_build_parameters.xy_supercell_matrix)
|
|
224
|
-
return self.identity_supercell
|
|
225
|
-
|
|
226
|
-
@property
|
|
227
|
-
def film_supercell_matrix(self) -> SupercellMatrix2DSchema:
|
|
228
|
-
if self.optimize_film_supercell:
|
|
229
|
-
n, m = self.find_optimal_film_supercell()
|
|
230
|
-
return SupercellMatrix2DSchema(root=[[n, 0], [0, m]])
|
|
231
|
-
elif self.film_build_parameters and self.film_build_parameters.xy_supercell_matrix:
|
|
232
|
-
return SupercellMatrix2DSchema(root=self.film_build_parameters.xy_supercell_matrix)
|
|
233
|
-
return self.identity_supercell
|
|
234
|
-
|
|
235
|
-
@cached_property
|
|
236
|
-
def substrate_strained_configuration(self) -> SlabStrainedSupercellConfiguration:
|
|
237
|
-
return self.get_component_strained_configuration(
|
|
238
|
-
self.substrate_slab_configuration,
|
|
239
|
-
self._no_strain_matrix,
|
|
240
|
-
xy_supercell_matrix=self.substrate_supercell_matrix,
|
|
241
|
-
)
|
|
242
|
-
|
|
243
|
-
@cached_property
|
|
244
|
-
def film_strained_configuration(self) -> SlabStrainedSupercellConfiguration:
|
|
245
|
-
return self.get_component_strained_configuration(
|
|
246
|
-
self.film_slab_configuration,
|
|
247
|
-
self.get_film_strain_matrix(
|
|
248
|
-
self.substrate_material.lattice.vector_arrays, self.film_material.lattice.vector_arrays
|
|
249
|
-
),
|
|
250
|
-
xy_supercell_matrix=self.film_supercell_matrix,
|
|
251
|
-
)
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
from typing import Tuple
|
|
2
|
-
|
|
3
|
-
from mat3ra.made.material import Material
|
|
4
|
-
from mat3ra.made.tools.build.pristine_structures.two_dimensional.slab.configuration import SlabConfiguration
|
|
5
|
-
|
|
6
|
-
from ...modify import translate_to_center
|
|
7
|
-
from ...operations.core.unary import rotate
|
|
8
|
-
from ..other import get_surface_area
|
|
9
|
-
from . import InterfaceAnalyzer
|
|
10
|
-
from .utils.holders import MatchedSubstrateFilmConfigurationHolder
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class TwistedNanoribbonsInterfaceAnalyzer(InterfaceAnalyzer):
|
|
14
|
-
"""
|
|
15
|
-
Analyzer for creating twisted interfaces between two nanoribbons.
|
|
16
|
-
|
|
17
|
-
Takes two nanoribbons (or any 0D materials) and returns them with:
|
|
18
|
-
- Same lattice vectors
|
|
19
|
-
- One rotated by the specified angle
|
|
20
|
-
- Nanoribbons centered
|
|
21
|
-
- Gap handled separately through vacuum configuration
|
|
22
|
-
|
|
23
|
-
Args:
|
|
24
|
-
|
|
25
|
-
angle (float): Twist angle in degrees.
|
|
26
|
-
vacuum_x (float): Vacuum along x on both sides, in Angstroms.
|
|
27
|
-
vacuum_y (float): Vacuum along y on both sides, in Angstroms.
|
|
28
|
-
"""
|
|
29
|
-
|
|
30
|
-
angle: float = 0.0
|
|
31
|
-
vacuum_x: float = 5.0
|
|
32
|
-
vacuum_y: float = 5.0
|
|
33
|
-
|
|
34
|
-
@property
|
|
35
|
-
def nanoribbon1(self):
|
|
36
|
-
return self.substrate_slab_configuration.atomic_layers.crystal
|
|
37
|
-
|
|
38
|
-
@property
|
|
39
|
-
def nanoribbon2(self):
|
|
40
|
-
return self.film_slab_configuration.atomic_layers.crystal
|
|
41
|
-
|
|
42
|
-
def _create_default_slab_from_nanoribbon(self, nanoribbon: Material) -> SlabConfiguration:
|
|
43
|
-
return SlabConfiguration.from_parameters(
|
|
44
|
-
material_or_dict=nanoribbon,
|
|
45
|
-
miller_indices=(0, 0, 1),
|
|
46
|
-
number_of_layers=1,
|
|
47
|
-
vacuum=0.0,
|
|
48
|
-
use_conventional_cell=False,
|
|
49
|
-
)
|
|
50
|
-
|
|
51
|
-
def _match_lattice_vectors(self, material1: Material, material2: Material) -> Tuple[Material, Material]:
|
|
52
|
-
"""
|
|
53
|
-
Matches the lattice vectors of two nanoribbons with vacuum on the sides to assume the size of the larger one.
|
|
54
|
-
Before stacking, two materials must have the same lattice vectors.
|
|
55
|
-
"""
|
|
56
|
-
area1 = get_surface_area(material1)
|
|
57
|
-
area2 = get_surface_area(material2)
|
|
58
|
-
|
|
59
|
-
if area1 >= area2:
|
|
60
|
-
material1_matched = material1
|
|
61
|
-
material2_matched = material2.clone()
|
|
62
|
-
material2_matched.set_lattice(material1.lattice)
|
|
63
|
-
else:
|
|
64
|
-
material1_matched = material1.clone()
|
|
65
|
-
material1_matched.set_lattice(material2.lattice)
|
|
66
|
-
material2_matched = material2
|
|
67
|
-
|
|
68
|
-
return material1_matched, material2_matched
|
|
69
|
-
|
|
70
|
-
def get_strained_configuration(self) -> MatchedSubstrateFilmConfigurationHolder:
|
|
71
|
-
centered_nanoribbon1 = translate_to_center(self.nanoribbon1, axes=["x", "y"])
|
|
72
|
-
centered_nanoribbon2 = translate_to_center(self.nanoribbon2, axes=["x", "y"])
|
|
73
|
-
|
|
74
|
-
matched_nanoribbon1, matched_nanoribbon2 = self._match_lattice_vectors(
|
|
75
|
-
centered_nanoribbon1, centered_nanoribbon2
|
|
76
|
-
)
|
|
77
|
-
|
|
78
|
-
rotated_nanoribbon2 = rotate(matched_nanoribbon2, [0, 0, 1], self.angle, wrap=False)
|
|
79
|
-
|
|
80
|
-
substrate_slab_config = self._create_default_slab_from_nanoribbon(matched_nanoribbon1)
|
|
81
|
-
film_slab_config = self._create_default_slab_from_nanoribbon(rotated_nanoribbon2)
|
|
82
|
-
|
|
83
|
-
return self.create_matched_configuration_holder(substrate_slab_config, film_slab_config, match_id=0)
|
|
84
|
-
|
|
85
|
-
@property
|
|
86
|
-
def substrate_nanoribbon_configuration(self):
|
|
87
|
-
return self.get_strained_configuration().substrate_configuration
|
|
88
|
-
|
|
89
|
-
@property
|
|
90
|
-
def film_nanoribbon_configuration(self):
|
|
91
|
-
return self.get_strained_configuration().film_configuration
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
from typing import Union
|
|
2
|
-
|
|
3
|
-
from mat3ra.made.material import Material
|
|
4
|
-
|
|
5
|
-
from ....build.pristine_structures.two_dimensional.slab import SlabConfiguration
|
|
6
|
-
from ....build_components.entities.reusable.three_dimensional.supercell.helpers import create_supercell
|
|
7
|
-
from ...rdf import RadialDistributionFunction
|
|
8
|
-
from .holders import MatchedSubstrateFilmConfigurationHolder
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def calculate_interfacial_distance_from_rdf(
|
|
12
|
-
substrate_material: Union[Material, dict, "SlabConfiguration"],
|
|
13
|
-
film_material: Union[Material, dict, "SlabConfiguration"],
|
|
14
|
-
rdf_cutoff: float = 10.0,
|
|
15
|
-
rdf_bin_size: float = 0.1,
|
|
16
|
-
supercell_size: tuple = (3, 3, 3),
|
|
17
|
-
) -> float:
|
|
18
|
-
"""
|
|
19
|
-
Calculate interfacial distance based on RDF analysis of bulk materials.
|
|
20
|
-
|
|
21
|
-
Creates temporary supercells of substrate and film bulk materials,
|
|
22
|
-
calculates their RDFs to find the first peak (nearest neighbor distance),
|
|
23
|
-
and returns the average of these distances as the initial guess for interfacial distance.
|
|
24
|
-
|
|
25
|
-
Args:
|
|
26
|
-
substrate_material: Material, dict, or SlabConfiguration for the substrate
|
|
27
|
-
film_material: Material, dict, or SlabConfiguration for the film
|
|
28
|
-
rdf_cutoff: Maximum distance for RDF calculation in Angstroms
|
|
29
|
-
rdf_bin_size: Bin size for RDF histogram in Angstroms
|
|
30
|
-
supercell_size: Size of supercell for RDF analysis (default: 3x3x3)
|
|
31
|
-
|
|
32
|
-
Returns:
|
|
33
|
-
float: Calculated interfacial distance in Angstroms
|
|
34
|
-
"""
|
|
35
|
-
|
|
36
|
-
if isinstance(substrate_material, SlabConfiguration):
|
|
37
|
-
substrate_bulk = substrate_material.atomic_layers.crystal
|
|
38
|
-
elif isinstance(substrate_material, dict):
|
|
39
|
-
substrate_bulk = Material.create(substrate_material)
|
|
40
|
-
else:
|
|
41
|
-
substrate_bulk = substrate_material
|
|
42
|
-
|
|
43
|
-
if isinstance(film_material, SlabConfiguration):
|
|
44
|
-
film_bulk = film_material.atomic_layers.crystal
|
|
45
|
-
elif isinstance(film_material, dict):
|
|
46
|
-
film_bulk = Material.create(film_material)
|
|
47
|
-
else:
|
|
48
|
-
film_bulk = film_material
|
|
49
|
-
|
|
50
|
-
substrate_supercell = create_supercell(material=substrate_bulk, scaling_factor=list(supercell_size))
|
|
51
|
-
|
|
52
|
-
film_supercell = create_supercell(material=film_bulk, scaling_factor=list(supercell_size))
|
|
53
|
-
|
|
54
|
-
substrate_rdf = RadialDistributionFunction.from_material(
|
|
55
|
-
substrate_supercell,
|
|
56
|
-
cutoff=rdf_cutoff,
|
|
57
|
-
bin_size=rdf_bin_size,
|
|
58
|
-
)
|
|
59
|
-
|
|
60
|
-
film_rdf = RadialDistributionFunction.from_material(
|
|
61
|
-
film_supercell,
|
|
62
|
-
cutoff=rdf_cutoff,
|
|
63
|
-
bin_size=rdf_bin_size,
|
|
64
|
-
)
|
|
65
|
-
|
|
66
|
-
substrate_first_peak = substrate_rdf.first_peak_distance
|
|
67
|
-
film_first_peak = film_rdf.first_peak_distance
|
|
68
|
-
|
|
69
|
-
interfacial_distance = (substrate_first_peak + film_first_peak) / 2.0
|
|
70
|
-
|
|
71
|
-
return interfacial_distance
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
__all__ = [
|
|
75
|
-
"MatchedSubstrateFilmConfigurationHolder",
|
|
76
|
-
"calculate_interfacial_distance_from_rdf",
|
|
77
|
-
]
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
from typing import Optional
|
|
2
|
-
|
|
3
|
-
from mat3ra.code.entity import InMemoryEntityPydantic
|
|
4
|
-
|
|
5
|
-
from ....build.pristine_structures.two_dimensional.slab_strained_supercell.configuration import (
|
|
6
|
-
SlabStrainedSupercellConfiguration,
|
|
7
|
-
)
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class MatchedSubstrateFilmConfigurationHolder(InMemoryEntityPydantic):
|
|
11
|
-
match_id: int
|
|
12
|
-
substrate_configuration: SlabStrainedSupercellConfiguration
|
|
13
|
-
film_configuration: SlabStrainedSupercellConfiguration
|
|
14
|
-
total_strain_percentage: Optional[float] = None
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
from functools import reduce
|
|
2
|
-
from typing import List
|
|
3
|
-
|
|
4
|
-
import numpy as np
|
|
5
|
-
from mat3ra.esse.models.core.abstract.vector_2d import Vector2dSchema
|
|
6
|
-
from mat3ra.esse.models.materials_category_components.entities.auxiliary.two_dimensional.supercell_matrix_2d import (
|
|
7
|
-
SupercellMatrix2DSchema,
|
|
8
|
-
)
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def are_vectors_colinear(v1: Vector2dSchema, v2: Vector2dSchema, tol=1e-3):
|
|
12
|
-
v1 = np.array(v1)
|
|
13
|
-
v2 = np.array(v2)
|
|
14
|
-
norm1 = np.linalg.norm(v1)
|
|
15
|
-
norm2 = np.linalg.norm(v2)
|
|
16
|
-
if norm1 < tol or norm2 < tol:
|
|
17
|
-
return False
|
|
18
|
-
cos_angle = np.dot(v1, v2) / (norm1 * norm2)
|
|
19
|
-
# Colinear if |cos_angle| close to 1
|
|
20
|
-
return np.abs(np.abs(cos_angle) - 1) < tol
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
def align_first_vector_to_x_2d_right_handed(vectors: List[Vector2dSchema]):
|
|
24
|
-
"""
|
|
25
|
-
Rotates a set of 2D lattice vectors so that the first vector is aligned with the x-axis,
|
|
26
|
-
and makes the cell right-handed.
|
|
27
|
-
vectors: (2, 2) array
|
|
28
|
-
Returns: rotated (2, 2) array
|
|
29
|
-
"""
|
|
30
|
-
vectors_np = np.array(vectors)
|
|
31
|
-
if vectors_np.shape != (2, 2):
|
|
32
|
-
raise ValueError("Input must be two 2D vectors (shape (2, 2)).")
|
|
33
|
-
v = vectors_np[0]
|
|
34
|
-
a = np.linalg.norm(v)
|
|
35
|
-
if a == 0:
|
|
36
|
-
raise ValueError("First lattice vector has zero length.")
|
|
37
|
-
# Angle to x-axis
|
|
38
|
-
angle = np.arctan2(v[1], v[0])
|
|
39
|
-
# 2D rotation matrix to align v with x-axis
|
|
40
|
-
R = np.array([[np.cos(-angle), -np.sin(-angle)], [np.sin(-angle), np.cos(-angle)]])
|
|
41
|
-
rotated_vectors = vectors_np @ R.T
|
|
42
|
-
# Set first vector to [a, 0]
|
|
43
|
-
rotated_vectors[0] = np.array([a, 0])
|
|
44
|
-
|
|
45
|
-
# Check handedness: z-component of cross product should be positive
|
|
46
|
-
cross_z = np.cross(rotated_vectors[0], rotated_vectors[1])
|
|
47
|
-
if cross_z < 0:
|
|
48
|
-
rotated_vectors[1] = -rotated_vectors[1]
|
|
49
|
-
|
|
50
|
-
return rotated_vectors
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
def get_global_gcd(A: SupercellMatrix2DSchema, B: SupercellMatrix2DSchema) -> int:
|
|
54
|
-
# flatten all entries, compute gcd over them
|
|
55
|
-
vals = np.hstack((A.ravel(), B.ravel())).astype(int)
|
|
56
|
-
return reduce(np.gcd, vals.tolist())
|