Atomic Structure Generation¶
[1]:
import mdapy as mp
import numpy as np
mp.__version__
[1]:
'1.0.0a1'
Build FCC Cu¶
[2]:
fcc = mp.build_crystal('Cu', 'fcc', 3.615, nx=3, ny=3, nz=3)
Build BCC Fe¶
[3]:
bcc = mp.build_crystal('Fe', 'bcc', 2.8, nx=3, ny=3, nz=3)
Build HCP Ti¶
[4]:
hcp = mp.build_crystal('Ti', 'hcp', 3.0, nx=2, ny=2, nz=2)
[5]:
hcp
[5]:
Atom Number: 32
Box information:
[[ 6. 0. 0. ]
[ 0. 10.39230485 0. ]
[ 0. 0. 9.79795897]]
Origin: [0. 0. 0.]
Triclinic: False
Boundary: [1 1 1]
Particle Information:
shape: (32, 4)
┌─────┬──────────┬──────────┬─────────┐
│ x ┆ y ┆ z ┆ element │
│ --- ┆ --- ┆ --- ┆ --- │
│ f64 ┆ f64 ┆ f64 ┆ str │
╞═════╪══════════╪══════════╪═════════╡
│ 0.0 ┆ 0.0 ┆ 0.0 ┆ Ti │
│ 1.5 ┆ 2.598076 ┆ 0.0 ┆ Ti │
│ 1.5 ┆ 4.330127 ┆ 2.44949 ┆ Ti │
│ 0.0 ┆ 1.732051 ┆ 2.44949 ┆ Ti │
│ 0.0 ┆ 0.0 ┆ 4.898979 ┆ Ti │
│ … ┆ … ┆ … ┆ … │
│ 3.0 ┆ 6.928203 ┆ 2.44949 ┆ Ti │
│ 3.0 ┆ 5.196152 ┆ 4.898979 ┆ Ti │
│ 4.5 ┆ 7.794229 ┆ 4.898979 ┆ Ti │
│ 4.5 ┆ 9.526279 ┆ 7.348469 ┆ Ti │
│ 3.0 ┆ 6.928203 ┆ 7.348469 ┆ Ti │
└─────┴──────────┴──────────┴─────────┘
Build Diamond¶
[6]:
dia = mp.build_crystal('C', 'diamond', 3.0, nx=2, ny=2, nz=2)
Build Graphene layer¶
[7]:
gra = mp.build_crystal('C', 'graphene', 1.42, nx=2, ny=4, nz=1)
Build FCC/BCC with specific orientations¶
[8]:
aluminum = mp.build_crystal('Al', 'fcc', 3.615, nx=3, ny=3, nz=3, miller1=[1, 1, 2], miller2=[1, -1, 0], miller3=[1, 1, -1])
[9]:
aluminum
[9]:
Atom Number: 162
Box information:
[[13.28235813 0. 0. ]
[ 0. 7.66857304 0. ]
[ 0. 0. 18.78409101]]
Origin: [0. 0. 0.]
Triclinic: False
Boundary: [1 1 1]
Particle Information:
shape: (162, 4)
┌───────────┬──────────┬───────────┬─────────┐
│ x ┆ y ┆ z ┆ element │
│ --- ┆ --- ┆ --- ┆ --- │
│ f64 ┆ f64 ┆ f64 ┆ str │
╞═══════════╪══════════╪═══════════╪═════════╡
│ 0.0 ┆ 0.0 ┆ 0.0 ┆ Al │
│ 2.213726 ┆ 1.278096 ┆ 0.0 ┆ Al │
│ 1.475818 ┆ 0.0 ┆ 2.087121 ┆ Al │
│ 2.951635 ┆ 0.0 ┆ 4.174242 ┆ Al │
│ 3.689544 ┆ 1.278096 ┆ 2.087121 ┆ Al │
│ … ┆ … ┆ … ┆ … │
│ 11.068632 ┆ 6.390478 ┆ 12.522727 ┆ Al │
│ 10.330723 ┆ 5.112382 ┆ 14.609849 ┆ Al │
│ 11.806541 ┆ 5.112382 ┆ 16.69697 ┆ Al │
│ 12.544449 ┆ 6.390478 ┆ 14.609849 ┆ Al │
│ 9.592814 ┆ 6.390478 ┆ 16.69697 ┆ Al │
└───────────┴──────────┴───────────┴─────────┘
Build high-entropy alloy¶
[10]:
hea = mp.build_hea(['Cr', 'Co', 'Ni'], [0.5, 0.3, 0.2], 'fcc', 3.6, nx=10, ny=10, nz=10, random_seed=1)
[11]:
hea
[11]:
Atom Number: 4000
Box information:
[[36. 0. 0.]
[ 0. 36. 0.]
[ 0. 0. 36.]]
Origin: [0. 0. 0.]
Triclinic: False
Boundary: [1 1 1]
Particle Information:
shape: (4_000, 4)
┌──────┬──────┬──────┬─────────┐
│ x ┆ y ┆ z ┆ element │
│ --- ┆ --- ┆ --- ┆ --- │
│ f64 ┆ f64 ┆ f64 ┆ str │
╞══════╪══════╪══════╪═════════╡
│ 0.0 ┆ 0.0 ┆ 0.0 ┆ Cr │
│ 0.0 ┆ 1.8 ┆ 1.8 ┆ Cr │
│ 1.8 ┆ 0.0 ┆ 1.8 ┆ Cr │
│ 1.8 ┆ 1.8 ┆ 0.0 ┆ Co │
│ 0.0 ┆ 0.0 ┆ 3.6 ┆ Cr │
│ … ┆ … ┆ … ┆ … │
│ 34.2 ┆ 34.2 ┆ 28.8 ┆ Ni │
│ 32.4 ┆ 32.4 ┆ 32.4 ┆ Cr │
│ 32.4 ┆ 34.2 ┆ 34.2 ┆ Ni │
│ 34.2 ┆ 32.4 ┆ 34.2 ┆ Cr │
│ 34.2 ┆ 34.2 ┆ 32.4 ┆ Cr │
└──────┴──────┴──────┴─────────┘
Build polyscrystal¶
[12]:
unit = mp.build_crystal("Al", "fcc", 4.05)
poly = mp.CreatePolycrystal(unit, box=100, seed_number=5, randomseed=1, metal_overlap_dis=2.0)
system = poly.compute()
======================================================================
POLYCRYSTAL GENERATION
======================================================================
[1/5] Generating Voronoi tessellation...
Number of grains: 5
Average volume: 200000.00 A^3
Volume range: 180820.01 - 251770.56 A^3
Random seed: 1
[2/5] Generating atoms for 5 grains...
Grain 1/5: Volume = 251770.56 A^3 Atoms = 15162
Grain 2/5: Volume = 180820.01 A^3 Atoms = 10890
Grain 3/5: Volume = 193528.01 A^3 Atoms = 11653
Grain 4/5: Volume = 191668.31 A^3 Atoms = 11531
Grain 5/5: Volume = 182213.11 A^3 Atoms = 10969
Total atoms generated: 60,205
[3/5] Creating atomic structure...
[4/5] Removing overlapping atoms...
Filtering: Metal-Metal overlaps
Metal-Metal distance: 2.00 Å
Atoms removed: 2,051 (3.41%)
Atoms remaining: 58,154
[5/5] Finalizing structure...
======================================================================
✓ Polycrystal generation completed successfully!
✓ Execution time: 0.04 seconds
======================================================================
Build 2D polycrystal¶
[13]:
unit = mp.build_crystal("Al", "fcc", 4.05)
random_seed = 42
np.random.seed(random_seed)
box = np.array([[300, 0, 0], [0, 300, 0], [0, 0, unit.box.box[2, 2] * 12]])
seed_number = 10
box_lengths = np.diag(box)
seed_position = np.random.random((seed_number, 3)) * box_lengths
seed_position[:, 2] = box[2, 2] / 2
theta_list = np.random.uniform(-180, 180, (seed_number, 3))
theta_list[:, :2] = 0
poly = mp.CreatePolycrystal(
unit,
box=box,
seed_number=seed_number,
randomseed=random_seed,
metal_overlap_dis=2.0,
theta_list=theta_list,
seed_position=seed_position,
)
system = poly.compute()
======================================================================
POLYCRYSTAL GENERATION
======================================================================
[1/5] Generating Voronoi tessellation...
Number of grains: 10
Average volume: 437400.00 A^3
Volume range: 256714.65 - 797106.53 A^3
Random seed: 42
[2/5] Generating atoms for 10 grains...
Grain 1/10: Volume = 362972.67 A^3 Atoms = 21876
Grain 2/10: Volume = 256714.65 A^3 Atoms = 15468
Grain 3/10: Volume = 797106.53 A^3 Atoms = 47796
Grain 4/10: Volume = 391536.22 A^3 Atoms = 23688
Grain 5/10: Volume = 524456.68 A^3 Atoms = 31536
Grain 6/10: Volume = 319233.38 A^3 Atoms = 19188
Grain 7/10: Volume = 345779.30 A^3 Atoms = 20868
Grain 8/10: Volume = 397379.07 A^3 Atoms = 23964
Grain 9/10: Volume = 356555.71 A^3 Atoms = 21516
Grain 10/10: Volume = 622265.80 A^3 Atoms = 37512
Total atoms generated: 263,412
[3/5] Creating atomic structure...
[4/5] Removing overlapping atoms...
Filtering: Metal-Metal overlaps
Metal-Metal distance: 2.00 Å
Atoms removed: 3,516 (1.33%)
Atoms remaining: 259,896
[5/5] Finalizing structure...
======================================================================
✓ Polycrystal generation completed successfully!
✓ Execution time: 0.07 seconds
======================================================================
Build polycrystal with graphene grain boundary¶
[14]:
unit = mp.build_crystal("Al", "fcc", 4.05)
poly = mp.CreatePolycrystal(unit, box=100, seed_number=5, randomseed=1, metal_overlap_dis=2.0, add_graphene=True, metal_gra_overlap_dis=2.8)
system = poly.compute()
# system.write_xyz('gra_al.xyz')
======================================================================
POLYCRYSTAL GENERATION
======================================================================
[1/5] Generating Voronoi tessellation...
Number of grains: 5
Average volume: 200000.00 A^3
Volume range: 180820.01 - 251770.56 A^3
Graphene enabled: Yes (threshold = 0.0 A^2)
Random seed: 1
[2/5] Generating atoms for 5 grains...
Grain 1/5: Volume = 251770.56 A^3 Metal = 15162, Carbon = 8653
Grain 2/5: Volume = 180820.01 A^3 Metal = 10890, Carbon = 7263
Grain 3/5: Volume = 193528.01 A^3 Metal = 11653, Carbon = 7490
Grain 4/5: Volume = 191668.31 A^3 Metal = 11531, Carbon = 7536
Grain 5/5: Volume = 182213.11 A^3 Metal = 10969, Carbon = 7577
Total atoms generated: 98,724
[3/5] Creating atomic structure...
[4/5] Removing overlapping atoms...
Filtering: Metal-Metal, C-C, Metal-C overlaps
Metal-Metal distance: 2.00 Å
C-C distance: 1.40 Å
Metal-C distance: 2.80 Å
Atoms removed: 35,527 (35.99%)
Atoms remaining: 63,197
[5/5] Finalizing structure...
======================================================================
✓ Polycrystal generation completed successfully!
✓ Execution time: 0.11 seconds
======================================================================