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)