6. CALYPSO as a library
Now one can use calypso in a pythonic way.
6.1. Generator structures with python interface
import numpy as np
from calypso.generators.crystal_generator import FortranBulk
amounts_of_element = [4, 4, 12]
volume = 40
element_wise_min_distance = np.ones((3, 3))
sg_number = 216
bulk = FortranBulk(
group_number=sg_number,
volume=volume,
element_numbers=[57, 26, 8],
amounts_of_bbs=amounts_of_element,
bbwise_min_distance=element_wise_min_distance,
)
(
lattice_matrix,
frac_coords,
element_numbers,
) = bulk()
6.2. Using BCM module to calculate the fingerprint
from calypso.descriptors.BondCharMatrix import Descriptor as BCMDescriptor
from calypso.data import CalyData
calydata_1 = CalyData(
symbols=[1, 3, 1, 3],
lattice=[[1.5, 0, 0], [1.5, 2, 0], [0, 0, 3]],
cartpos=[[0, 0, 0], [0.5, 0.5, 0], [0, 0, 0.6], [0, 0.6, 0]],
)
bcm_1 = get_BondCharMatrix(calydata_1)
calydata_2 = CalyData(
symbols=[1, 3, 1, 3],
lattice=[[1.5, 0, 0], [1.5, 2, 0], [0, 0, 3]],
cartpos=[[0, 0, 0], [0.5, 0.5, 0], [0, 0, 0.6], [0, 0.6, 0]],
)
bcm_2 = get_BondCharMatrix(calydata_2)
des = Descriptor(simthreshold=0.1)
dist_list, sim_list = des.equal(calydata_1, calydata_2)
6.3. IO module
from calypso.io.vasp import Poscar
calydata = Poscar.from_file("POSCAR")
calydata = Poscar.from_str(poscar_str)
poscar = Poscar(calydata)
poscar.write_file("file_name.vasp")
from calypso.io.vasp import Outcar
outcar = Outcar.from_file("OUTCAR")
last_frame = outcar.get_calydata(index=-1)
first_frame = outcar.get_calydata(index=0)
all_frame = outcar.get_calydata(index=":")
slice_frames = outcar.get_calydata(index=slice(1, 3, 4))
from calypso.io.extxyz import Extxyz
xyzs = Extxyz.from_file("example.xyz")
last_frame = xyzs.get_calydata(index=-1)
first_frame = xyzs.get_calydata(index=0)
all_frame = xyzs.get_calydata(index=":")
slice_frames = xyzs.get_calydata(index=slice(1, 3, 4))
6.4. Dispatcher module
from dataclasses import asdict
from pathlib import Path
from threading import Thread
from calypso.dispatchers.orchestrator.jobs import Job
from calypso.dispatchers.orchestrator.machine import Machine, MachineData
from calypso.dispatchers.orchestrator.orchestrator import Orchestrator
machine_data = MachineData(
name="test_machine",
executor="Local",
scheduler="Shell",
numb_node=1,
numb_cpu_per_node=1,
machine_capacity=1,
group_size=1,
remote_root=str(self.test_dir),
envs="",
source="",
module="",
queue="",
)
machines = [Machine(machine_data)]
# Initialize Orchestrator
with Orchestrator(
machinelist=[asdict(machine_data)],
timeinternal=1,
maxjobnumb=20,
pickup=False,
) as orchestrator:
jobs = [
Job(
name="job1-same-local-remote",
command="touch job1_output.txt",
local_root=str(test_dir),
local_work_dir="work_dir",
remote_root=str(test_dir),
remote_work_dir="work_dir",
upload_files=["file1.txt"],
upload_share_files=[f"{file3_txt.absolute()}"],
download_files=["job1_output.txt"],
)
]
orchestrator.orchestrate(jobs, nowait=False)
# Check if jobs are in the collection and queue
# self.assertEqual(len(orchestrator.job_collection), 1)
6.5. Convexhull
from calypso.tools.convexhull import Entry, Entries, PhaseDiagram
from calypso.formula import Formula
entries = [
Entry("H2", 0),
Entry("O2", 0),
Entry("H2O", -3.0),
Entry("H2O2", -4.0),
]
entries = Entries(
[
Entry("H2", 1.3, label="x1"),
Entry(Formula("CaO"), 2.3, label="x2"),
]
)
entries = Entries.from_file("ref_ene_file.txt")
phasediagram = PhaseDiagram(entries)
phase_dim = phasediagram.phase_dim
element_dim = phasediagram.element_dim
form_energy = phasediagram.get_formation_energy(Entry("H2O", 0))
energy_above_hull = phasediagram.get_energy_above_hull(Entry("H2O", 0))
6.6. Evolution structure with PSO
from calypso.io.vasp import Outcar
from calypso.evolution.pso import PBest, Gbest
from calypso.evolution.pso.crystal_pso import Evolution
from calypso.descriptors.BondCharMatrix import Descriptor
popsize = 10
nbest = 3
simthreshold = 0.1
descriptor = Descriptor(simthreshold=simthreshold)
pbest=PBest(popsize=popsize),
gbest=GBest(nbest=nbest, descriptor=descriptor),
evolutioner = Evolution(
pbest=pbest,
gbest=gbest,
descriptor=descriptor,
fitness_name="ENTHALPY",
ialgo="LPSO",
distanceofion={"La": 0.5, "H": 0.5},
)
ini_calydata_list = [Poscar.from_file(f"POSCAR_{i}").calydata for i in range(1, 11)]
opt_calydata_list = [Outcar.from_file(f"OUTCAR_{i}").get_calydata(-1) for i in range(1, 11)]
for idx, opt_calydata in enumerate(opt_calydata_list):
opt_calydata.caly_idx = idx
pbest.update_pbest(opt_calydata)
gbest.update_gbest(opt_calydata)
calydata_list = list(zip(ini_calydata_list, opt_calydata_list))
refer_entries = (
Entries.from_file(REF_ENE_FILE)
if REF_ENE_FILE.exists()
else None
)
determined_calydata_list = evolutioner.determine_group(
calydata_list=calydata_list,
refer_entries=refer_entries,
reverse=False,
)
evolution_calydata_list = []
for ini_calydata, opt_calydata in determined_calydata_list:
pbest_calydata = pbest.get_pbest(calydata=opt_calydata)
gbest_calydata = gbest.get_best(calydata=opt_calydata)
calydata = evolutioner.generate(
ini_calydata=ini_calydata,
opt_calydata=opt_calydata,
pbest_calydata=pbest_calydata,
gbest_calydata=gbest_calydata,
)
evolution_calydata_list.append(calydata)