diff --git a/calphy/alchemy.py b/calphy/alchemy.py index 16514ac..da8d3f9 100644 --- a/calphy/alchemy.py +++ b/calphy/alchemy.py @@ -90,119 +90,30 @@ def run_averaging(self): lmp.command("variable mlz equal lz") lmp.command("variable mpress equal press") + #add some computes if not self.calc._fix_lattice: if self.calc._pressure == 0: - #This routine should be followed for zero pressure - lmp.command("velocity all create %f %d"%(self.calc._temperature, np.random.randint(0, 10000))) - lmp.command("fix 1 all npt temp %f %f %f %s %f %f %f"%(self.calc._temperature, self.calc._temperature, self.calc.md.thermostat_damping, - self.iso, self.calc._pressure, self.calc._pressure, self.calc.md.barostat_damping)) - lmp.command("thermo_style custom step pe press vol etotal temp lx ly lz") - lmp.command("thermo 10") - lmp.command("run %d"%int(self.calc.md.n_small_steps)) - + self.run_zero_pressure_equilibration(lmp) else: - #Now this routine is for non-zero pressure - #one has to equilibriate at a low temperature, but high pressure and then increase temp gradually - #start at 0.25 temp, and increase to 0.50, while keeping high pressure - lmp.command("velocity all create %f %d"%(0.25*self.calc._temperature, np.random.randint(0, 10000))) - lmp.command("fix 1 all npt temp %f %f %f %s %f %f %f"%(0.25*self.calc._temperature, 0.5*self.calc._temperature, self.calc.md.thermostat_damping, - self.iso, self.calc._pressure, self.calc._pressure, self.calc.md.barostat_damping)) - lmp.command("thermo_style custom step pe press vol etotal temp") - lmp.command("thermo 10") - lmp.command("run %d"%int(self.calc.md.n_small_steps)) - lmp.command("unfix 1") - - #now heat again - lmp.command("fix 1 all npt temp %f %f %f %s %f %f %f"%(0.5*self.calc._temperature, self.calc._temperature, self.calc.md.thermostat_damping, - self.iso, self.calc._pressure, self.calc._pressure, self.calc.md.barostat_damping)) - lmp.command("run %d"%int(self.calc.md.n_small_steps)) - lmp.command("unfix 1") - - #now run normal cycle - lmp.command("fix 1 all npt temp %f %f %f %s %f %f %f"%(self.calc._temperature, self.calc._temperature, self.calc.md.thermostat_damping, - self.iso, self.calc._pressure, self.calc._pressure, self.calc.md.barostat_damping)) - lmp.command("run %d"%int(self.calc.md.n_small_steps)) + self.run_finite_pressure_equilibration(lmp) #this is when the averaging routine starts - lmp.command("fix 2 all ave/time %d %d %d v_mlx v_mly v_mlz v_mpress file avg.dat"%(int(self.calc.md.n_every_steps), - int(self.calc.md.n_repeat_steps), int(self.calc.md.n_every_steps*self.calc.md.n_repeat_steps))) - - laststd = 0.00 - converged = False - - for i in range(int(self.calc.md.n_cycles)): - lmp.command("run %d"%int(self.calc.md.n_small_steps)) - ncount = int(self.calc.md.n_small_steps)//int(self.calc.md.n_every_steps*self.calc.md.n_repeat_steps) - #now we can check if it converted - file = os.path.join(self.simfolder, "avg.dat") - lx, ly, lz, ipress = np.loadtxt(file, usecols=(1, 2, 3, 4), unpack=True) - - lxpc = ipress - mean = np.mean(lxpc) - std = np.std(lxpc) - volatom = np.mean((lx*ly*lz)/self.natoms) - self.logger.info("At count %d mean pressure is %f with %f vol/atom"%(i+1, mean, volatom)) - - if (np.abs(mean - self.calc._pressure)) < self.calc.tolerance.pressure: - - #process other means - self.lx = np.round(np.mean(lx[-ncount+1:]), decimals=3) - self.ly = np.round(np.mean(ly[-ncount+1:]), decimals=3) - self.lz = np.round(np.mean(lz[-ncount+1:]), decimals=3) - self.volatom = volatom - self.vol = self.lx*self.ly*self.lz - self.logger.info("finalized vol/atom %f at pressure %f"%(self.volatom, mean)) - self.logger.info("Avg box dimensions x: %f, y: %f, z:%f"%(self.lx, self.ly, self.lz)) - converged = True - break - laststd = std - - if not converged: - lmp.close() - raise ValueError("Pressure did not converge after MD runs, maybe change lattice_constant and try?") - - #now run for msd - lmp.command("unfix 1") - lmp.command("unfix 2") - + self.run_pressure_convergence(lmp) + + #run if a constrained lattice is used else: - #we should do a small run to eqbrte atom positions - lmp.command("fix 1 all nvt temp %f %f %f"%(self.calc._temperature, self.calc._temperature, self.calc.md.thermostat_damping)) - lmp.command("velocity all create %f %d"%(self.calc._temperature, np.random.randint(0, 10000))) - lmp.command("thermo_style custom step pe press vol etotal temp lx ly lz") - lmp.command("thermo 10") - lmp.command("fix 2 all ave/time %d %d %d v_mlx v_mly v_mlz v_mpress file avg.dat"%(int(self.calc.md.n_every_steps), - int(self.calc.md.n_repeat_steps), int(self.calc.md.n_every_steps*self.calc.md.n_repeat_steps))) - - lmp.command("run %d"%int(self.calc.md.n_small_steps)) - lmp.command("unfix 1") - lmp.command("unfix 2") - - file = os.path.join(self.simfolder, "avg.dat") - lx, ly, lz, ipress = np.loadtxt(file, usecols=(1, 2, 3, 4), unpack=True) - mean = np.mean(ipress) - self.calc._pressure = mean - volatom = np.mean((lx*ly*lz)/self.natoms) - self.logger.info("At count 0 mean pressure is %f with %f vol/atom"%(mean, volatom)) - self.lx = np.round(np.mean(lx), decimals=3) - self.ly = np.round(np.mean(ly), decimals=3) - self.lz = np.round(np.mean(lz), decimals=3) - self.volatom = volatom - self.vol = self.lx*self.ly*self.lz - self.logger.info("finalized vol/atom %f at pressure %f"%(self.volatom, mean)) - self.logger.info("Avg box dimensions x: %f, y: %f, z:%f"%(self.lx, self.ly, self.lz)) - - - #dump is common for both - lmp.command("dump 2 all custom 1 traj.dat id type mass x y z vx vy vz") - lmp.command("run 0") - lmp.command("undump 2") + #routine in which lattice constant will not varied, but is set to a given fixed value + self.run_constrained_pressure_convergence(lmp) + #check for melting + self.dump_current_snapshot(lmp, "traj.equilibration_stage2.dat") + self.check_if_melted(lmp, "traj.equilibration_stage2.dat") #close object and process traj lmp.close() - self.process_traj() + self.process_traj("traj.equilibration_stage2.dat", "conf.equilibration.dump") + @@ -233,8 +144,8 @@ def run_integration(self, iteration=1): lmp.command("variable lf equal 0.0") #read dump file - conf = os.path.join(self.simfolder, "conf.dump") - lmp = ph.read_dump(lmp, conf, species=self.calc.n_elements) + conf = os.path.join(self.simfolder, "conf.equilibration.dump") + lmp = ph.read_dump(lmp, conf, species=self.calc.n_elements+self.calc._ghost_element_count) #set up hybrid potential #here we only need to set one potential @@ -247,10 +158,10 @@ def run_integration(self, iteration=1): # Integrator & thermostat. if self.calc._npt: lmp.command("fix f1 all npt temp %f %f %f %s %f %f %f"%(self.calc._temperature, self.calc._temperature, - self.calc.md.thermostat_damping, self.iso, self.calc._pressure, self.calc._pressure, self.calc.md.barostat_damping)) + self.calc.md.thermostat_damping[1], self.iso, self.calc._pressure, self.calc._pressure, self.calc.md.barostat_damping[1])) else: lmp.command("fix f1 all nvt temp %f %f %f"%(self.calc._temperature, self.calc._temperature, - self.calc.md.thermostat_damping)) + self.calc.md.thermostat_damping[1])) lmp.command("thermo_style custom step pe") lmp.command("thermo 1000") @@ -393,9 +304,25 @@ def thermodynamic_integration(self): w, q, qerr = find_w(self.simfolder, nelements=self.calc.n_elements, concentration=self.concentration, nsims=self.calc.n_iterations, full=True, solid=False, alchemy=True) - + self.w = w self.ferr = qerr self.fe = self.w + + if self.calc.mode == "composition_scaling": + w_arr, q_arr, qerr_arr, flambda_arr = find_w(self.simfolder, nelements=self.calc.n_elements, + concentration=self.concentration, nsims=self.calc.n_iterations, + full=True, solid=False, alchemy=True, composition_integration=True) + + #now we need to process the comp scaling + return flambda_arr, w_arr, q_arr, qerr_arr + + + + + def mass_integration(self, flambda, ref_mass, target_masses, target_counts): + mcorarr = integrate_mass(flambda, ref_mass, target_masses, target_counts, + self.calc._temperature, self.natoms) + return mcorarr diff --git a/calphy/composition_transformation.py b/calphy/composition_transformation.py new file mode 100644 index 0000000..82268df --- /dev/null +++ b/calphy/composition_transformation.py @@ -0,0 +1,390 @@ +""" +calphy: a Python library and command line interface for automated free +energy calculations. + +Copyright 2021 (c) Sarath Menon^1, Yury Lysogorskiy^2, Ralf Drautz^2 +^1: Max Planck Institut für Eisenforschung, Dusseldorf, Germany +^2: Ruhr-University Bochum, Bochum, Germany + +calphy is published and distributed under the Academic Software License v1.0 (ASL). +calphy is distributed in the hope that it will be useful for non-commercial academic research, +but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +calphy API is published and distributed under the BSD 3-Clause "New" or "Revised" License +See the LICENSE FILE for more details. + +More information about the program can be found in: +Menon, Sarath, Yury Lysogorskiy, Jutta Rogal, and Ralf Drautz. +“Automated Free Energy Calculation from Atomistic Simulations.” Physical Review Materials 5(10), 2021 +DOI: 10.1103/PhysRevMaterials.5.103801 + +For more information contact: +sarath.menon@ruhr-uni-bochum.de/yury.lysogorskiy@icams.rub.de +""" + +import re +import numpy as np +import os +import random +import pyscal.core as pc +from mendeleev import element +from ase.io import read, write +from ase.atoms import Atoms + +class CompositionTransformation: + """ + Class for performing composition transformations and + generating necessary pair styles for such transformations. + + Parameters + ---------- + input_structure: ASE object, LAMMPS Data file or LAMMPS dump file + input structure which is used for composition transformation + + input_chemical_formula: dict + dictionary of input chemical + + output_chemical_formula: string + the required chemical composition string + + restrictions: list of strings, optional + Can be used to specify restricted transformations + + Notes + ----- + This class can be used to create compositional mappings to be used with alchemy mode. + For example, assuming there is a structure file with 500 Atoms of Al in FCC structure, which needs to + be transformed to the structure of 495 Al and 5 Li atoms: + + ``` + comp = CompositionTransformation(filename, {"Al":500}, {"Al":500, "Li":5}) + ``` + Note that the atoms are chosen at random, that is, one cannot specify that only face centered lattice sites + in Al can be transformed to Li. + + More complex transformations can be done. For example `{"Al": 495, "Li":5}` to `{"Al": 494, "Li": 2, "O": 3, "C":1}`. + The corresponding input is simply: + + ``` + comp = CompositionTransformation(filename, {"Al":500, "Li":5}, {"Al": 494, "Li": 2, "O": 3, "C":1}) + ``` + + Restrictions can be placed on the transformations. In the above example, one can specify that Al-O + transformations should not take place. The code for this is: + + ``` + comp = CompositionTransformation(filename, {"Al":500, "Li":5}, + {"Al": 494, "Li": 2, "O": 3, "C":1}, restrictions=["Al-O"]) + ``` + + If the restrictions are not satisfiable, an error will be raised. + + The LAMMPS data file or dump files do not contain any information about the species except the type numbers. + In general the number of atoms are respected, for example if the file has 10 atoms of type 1, 5 of type 2, + and 1 of type 3. If the `input_chemical_composition` is `{"Li": 5, "Al": 10, "O": 1}`, type 1 is assigned to Al, + type 2 is assigned to Li and type 3 is assigned to O. This is done irrespective of the order in which + `input_chemical_composition` is specified. However, if there are equal number of atoms, the order is respected. + Therefore it is important to make sure that the `input_chemical_composition` is in the same order as that of + types in structure file. For example, consider a NiAl structure of 10 Ni atoms and 10 Al atoms. Ni atoms are type 1 in LAMMPS terminology + and Al atoms are type 2. In this case, to preserve the order, `input_chemical_composition` should be `{"Ni": 5, "Al": 10}`. + + Once the calculation is done, there are two possible useful output options. The first one is to generate + the necessary pair coefficient commands for LAMMPS. For the hypothetical transformation `{"Li":5, "Al": 495}` to `{"Al": 494, "Li": 2, "O": 3, "C":1}`, + the pair style can be generated by: + + ``` + alc.update_pair_coeff("pair_coeff * * filename Al") + ``` + + An example pair coefficient needs to be provided. The output for the above command is, + + ``` + ('pair_coeff * * filename Al Al Li Li Li', + 'pair_coeff * * filename Al O Li O C') + ``` + + These pair styles map the necessary transformation and can be used with `alchemy` mode. The next option + is to output the structure where this pair styles can be employed. This can be done using, + + ``` + alc.write_structure(outfilename) + ``` + The output is written in LAMMPS dump format. + """ + def __init__(self, input_structure, input_chemical_composition, + output_chemical_composition, restrictions=None): + + self.structure = self.prepare_structure(input_structure) + self.input_chemical_composition = input_chemical_composition + self.output_chemical_composition = output_chemical_composition + if restrictions is None: + self.restrictions = [] + else: + self.restrictions = restrictions + self.actual_species = None + self.new_species = None + self.maxtype = None + self.atom_mark = None + self.atom_species = None + self.mappings = None + self.unique_mappings = None + self.prepare_mappings() + + def dict_to_string(self, inputdict): + strlst = [] + for key, val in inputdict.items(): + strlst.append(str(key)) + strlst.append(str(val)) + return "".join(strlst) + + def is_data_file(self, filename): + try: + atoms = read(filename, format="lammps-data", style="atomic") + return atoms + except: + return None + + def is_dump_file(self, filename): + try: + atoms = read(filename, format="lammps-dump-text") + return atoms + except: + return None + + def prepare_structure(self, input_structure): + """ + Check the format of a given input file and validate it. + """ + if isinstance(input_structure, Atoms): + return input_structure + elif os.path.exists(input_structure): + atoms = self.is_data_file(input_structure) + if atoms is None: + atoms = self.is_dump_file(input_structure) + return atoms + + def convert_to_pyscal(self): + """ + Convert a given system to pyscal and give a dict of type mappings + """ + pstruct = pc.System() + pstruct.read_inputfile(self.structure, format="ase") + + #here we have to validate the input composition dict; and map it + composition = pstruct.get_concentration() + atomsymbols = [] + atomtypes = [] + for key, val in self.input_chemical_composition.items(): + if not val==0: + found = False + for key1, val1 in composition.items(): + if val1==val: + found = True + atomsymbols.append(key) + atomtypes.append(int(key1)) + del composition[key1] + break + if not found: + raise ValueError("Input structure and composition do not match!") + + self.pyscal_structure = pstruct + self.typedict = dict(zip(atomsymbols, atomtypes)) + self.reversetypedict = dict(zip(atomtypes, atomsymbols)) + self.natoms = self.pyscal_structure.natoms + + self.actual_species = len(self.typedict) + self.new_species = len(self.output_chemical_composition) - len(self.typedict) + self.maxtype = self.actual_species + 1 #+ self.new_species + #print(self.typedict) + + def check_if_atoms_conserved(self): + """ + Check if a given transformation is possible by checking if number of atoms are conserved + """ + natoms1 = np.sum([val for key, val in self.input_chemical_composition.items()]) + natoms2 = np.sum([val for key, val in self.output_chemical_composition.items()]) + if not (natoms1==natoms2==self.natoms): + raise ValueError(f"Input and output number of atoms are not conserved! Input {self.dict_to_string(self.input_chemical_composition)}, output {self.dict_to_string(self.output_chemical_composition)}, total atoms in structure {self.natoms}") + + def get_composition_transformation(self): + """ + From the two given composition transformation, find the transformation dict + """ + fdiff = {} + for key, val in self.output_chemical_composition.items(): + if key in self.input_chemical_composition.keys(): + fdiff[key] = val - self.input_chemical_composition[key] + else: + fdiff[key] = val - 0 + to_remove = {} + to_add = {} + + for key, val in fdiff.items(): + if val < 0: + to_remove[key] = np.abs(val) + else: + to_add[key] = val + + self.to_remove = to_remove + self.to_add = to_add + + def get_random_index_of_species(self, species): + """ + Get a random index of a given species + """ + ids = [count for count, x in enumerate(self.atom_type) if x==species] + return ids[np.random.randint(0, len(ids))] + + def mark_atoms(self): + for i in range(self.natoms): + self.atom_mark.append(False) + self.atom_type = [atom.type for atom in self.pyscal_structure.iter_atoms()] + self.mappings = [f"{x}-{x}" for x in self.atom_type] + + def update_mark_atoms(self): + self.marked_atoms = [] + for key, val in self.to_remove.items(): + #print(f"Element {key}, count {val}") + for i in range(100000): + rint = self.get_random_index_of_species(self.typedict[key]) + self.atom_mark[rint] = True + self.marked_atoms.append(rint) + val -= 1 + if (val <= 0): + break + + def update_typedicts(self): + #in a cycle add things to the typedict + for key, val in self.to_add.items(): + #print(f"Element {key}, count {val}") + if key in self.typedict.keys(): + newtype = self.typedict[key] + else: + newtype = self.maxtype + self.typedict[key] = self.maxtype + self.reversetypedict[self.maxtype] = key + self.maxtype += 1 + #print(f"Element {key}, newtype {newtype}") + + def compute_possible_mappings(self): + self.possible_mappings = [] + #Now make a list of possible mappings + for key1, val1 in self.to_remove.items(): + for key2, val2 in self.to_add.items(): + mapping = f"{key1}-{key2}" + if mapping not in self.restrictions: + self.possible_mappings.append(f"{self.typedict[key1]}-{self.typedict[key2]}") + + def update_mappings(self): + for key, val in self.to_add.items(): + #now get all + marked_atoms = self.marked_atoms.copy() + random.shuffle(marked_atoms) + #for each addition needed + for i in range(val): + #start searching + #go over all possible options + for x in range(len(marked_atoms)): + #calculate mapping + int_to_change = marked_atoms[x] + mapping = f"{self.atom_type[int_to_change]}-{self.typedict[key]}" + #is it a possible mapping? + if mapping in self.possible_mappings: + #then remove this from main list + self.marked_atoms.remove(int_to_change) + #remove this from current list + marked_atoms.remove(int_to_change) + #add the mapping + self.mappings[int_to_change] = mapping + #break the loop + break + #if the loop was not broken, that is it ran the whole cycle without finding + else: + raise ValueError("A possible transformation could not be found, please check the restrictions") + self.unique_mappings, self.unique_mapping_counts = np.unique(self.mappings, return_counts=True) + + #now make the transformation dict + self.transformation_list = [] + for count, mapping in enumerate(self.unique_mappings): + mapsplit = mapping.split("-") + if not mapsplit[0] == mapsplit[1]: + transformation_dict = {} + transformation_dict["primary_element"] = self.reversetypedict[int(mapsplit[0])] + transformation_dict["secondary_element"] = self.reversetypedict[int(mapsplit[1])] + transformation_dict["count"] = self.unique_mapping_counts[count] + self.transformation_list.append(transformation_dict) + + def get_mappings(self): + self.update_typedicts() + self.compute_possible_mappings() + self.update_mappings() + + def prepare_pair_lists(self): + self.pair_list_old = [] + self.pair_list_new = [] + for mapping in self.unique_mappings: + map_split = mapping.split("-") + #conserved atom + if (map_split[0]==map_split[1]): + self.pair_list_old.append(self.reversetypedict[int(map_split[0])]) + self.pair_list_new.append(self.reversetypedict[int(map_split[0])]) + else: + self.pair_list_old.append(self.reversetypedict[int(map_split[0])]) + self.pair_list_new.append(self.reversetypedict[int(map_split[1])]) + self.new_atomtype = np.array(range(len(self.unique_mappings)))+1 + self.mappingdict = dict(zip(self.unique_mappings, self.new_atomtype)) + + def update_types(self): + for x in range(len(self.atom_type)): + self.atom_type[x] = self.mappingdict[self.mappings[x]] + atoms = self.pyscal_structure.atoms + for count, atom in enumerate(atoms): + atom.type = self.atom_type[count] + self.pyscal_structure.atoms = atoms + + def iselement(self, symbol): + try: + _ = element(symbol) + return True + except: + return False + + def update_pair_coeff(self, pair_coeff): + pcsplit = pair_coeff.strip().split() + pc_before = [] + pc_after = [] + + started = False + stopped = False + + for p in pcsplit: + if ((not self.iselement(p)) and (not started)): + pc_before.append(p) + elif (self.iselement(p) and (not started)): + started = True + elif ((not self.iselement(p)) and started): + stopped = True + elif ((not self.iselement(p)) and stopped): + pc_after.append(p) + + pc_old = " ".join([*pc_before, *self.pair_list_old, *pc_after]) + pc_new = " ".join([*pc_before, *self.pair_list_new, *pc_after]) + return pc_old, pc_new + + def write_structure(self, outfilename): + self.pyscal_structure.to_file(outfilename) + + def prepare_mappings(self): + self.atom_mark = [] + self.atom_species = [] + self.mappings = [] + self.unique_mappings = [] + + self.get_composition_transformation() + self.convert_to_pyscal() + self.check_if_atoms_conserved() + + self.mark_atoms() + self.update_mark_atoms() + self.get_mappings() + self.prepare_pair_lists() + self.update_types() \ No newline at end of file diff --git a/calphy/input.py b/calphy/input.py index eeecaf8..0d07dd1 100644 --- a/calphy/input.py +++ b/calphy/input.py @@ -83,6 +83,48 @@ def convert_to_list(data, check_none=False): return data + def merge_dicts(self, dicts): + """ + Merge dicts from a given list + """ + merged_dict = {} + for d in dicts: + for key, val in d.items(): + merged_dict[key] = val + return merged_dict + + +class CompositionScaling(InputTemplate): + def __init__(self): + self._input_chemical_composition = None + self._output_chemical_composition = None + self._restrictions = None + + @property + def input_chemical_composition(self): + return self._input_chemical_composition + + @input_chemical_composition.setter + def input_chemical_composition(self, val): + self._input_chemical_composition = self.merge_dicts(val) + + @property + def output_chemical_composition(self): + return self._output_chemical_composition + + @output_chemical_composition.setter + def output_chemical_composition(self, val): + self._output_chemical_composition = self.merge_dicts(val) + + @property + def restrictions(self): + return self._restrictions + + @restrictions.setter + def restrictions(self, val): + self._restrictions = check_and_convert_to_list(val) + + class Calculation(InputTemplate): def __init__(self): super(InputTemplate, self).__init__() @@ -160,6 +202,9 @@ def __init__(self): self.melting_temperature.guess = None self.melting_temperature.step = 200 self.melting_temperature.attempts = 5 + + #new mode for composition trf + self.composition_scaling = CompositionScaling() def __repr__(self): """ @@ -606,6 +651,8 @@ def generate(cls, indata): calc.nose_hoover.add_from_dict(indata["nose_hoover"]) if "berendsen" in indata.keys(): calc.berendsen.add_from_dict(indata["berendsen"]) + if "composition_scaling" in indata.keys(): + calc.composition_scaling.add_from_dict(indata["composition_scaling"]) return calc else: raise FileNotFoundError('%s input file not found'% indata) @@ -660,7 +707,7 @@ def read_inputfile(file): if not len(lattice_constant)==len(reference_phase)==len(lattice): raise ValueError("lattice constant, reference phase and lattice should have same length") lat_props = [{"lattice": lattice[x], "lattice_constant":lattice_constant[x], "reference_phase":reference_phase[x]} for x in range(len(lattice))] - if (mode == "fe") or (mode == "alchemy"): + if (mode == "fe") or (mode == "alchemy") or (mode == "composition_scaling"): combos = itertools.product(lat_props, pressure, temperature) elif mode == "ts" or mode == "tscale" or mode == "mts": if not len(temperature) == 2: diff --git a/calphy/integrators.py b/calphy/integrators.py index eb4514c..db729f8 100644 --- a/calphy/integrators.py +++ b/calphy/integrators.py @@ -172,7 +172,7 @@ def get_einstein_crystal_fe(temp, natoms, mass, vol, k, concentration, cm_correc return F_harm def integrate_path(fwdfilename, bkdfilename, nelements=1, concentration=[1,], usecols=(0, 1, 2), solid=True, - alchemy=False): + alchemy=False, composition_integration=False): """ Get a filename with columns du and dlambda and integrate @@ -216,13 +216,17 @@ def integrate_path(fwdfilename, bkdfilename, nelements=1, concentration=[1,], us fdu = fdui - fdur bdu = bdui - bdur - fw = np.trapz(fdu, flambda) - bw = np.trapz(bdu, blambda) + if composition_integration: + fw = cumtrapz(fdu, flambda, initial=0) + bw = cumtrapz(bdu, blambda, initial=0) + else: + fw = np.trapz(fdu, flambda) + bw = np.trapz(bdu, blambda) w = 0.5*(fw - bw) q = 0.5*(fw + bw) - return w, q + return w, q, flambda def calculate_entropy_mix(conc): @@ -311,7 +315,7 @@ def calculate_fe_mix(temp, fepure, feimpure, concs, natoms=4000): return fes def find_w(mainfolder, nelements=1, concentration=[1,], nsims=5, full=False, usecols=(0,1,2), solid=True, - alchemy=False): + alchemy=False, composition_integration=False): """ Integrate the irreversible work and dissipation for independent simulations @@ -348,15 +352,25 @@ def find_w(mainfolder, nelements=1, concentration=[1,], nsims=5, full=False, use fwdfilename = os.path.join(mainfolder,fwdfilestring) bkdfilestring = 'backward_%d.dat' % (i+1) bkdfilename = os.path.join(mainfolder,bkdfilestring) - w, q = integrate_path(fwdfilename, bkdfilename, nelements=nelements, concentration=concentration, usecols=usecols, solid=solid, - alchemy=alchemy) + w, q, flambda = integrate_path(fwdfilename, bkdfilename, nelements=nelements, concentration=concentration, usecols=usecols, solid=solid, + alchemy=alchemy, composition_integration=composition_integration) ws.append(w) qs.append(q) - + + if composition_integration: + wsmean = np.mean(ws, axis=0) + qsmean = np.mean(qs, axis=0) + qsstd = np.mean(qs, axis=0) + return wsmean, qsmean, qsstd, flambda + + wsmean = np.mean(ws) + qsmean = np.mean(qs) + qsstd = np.mean(qs) + if full: - return np.mean(ws), np.mean(qs), np.std(qs) + return wsmean, qsmean, qsstd else: - return np.mean(ws) + return wsmean def integrate_mts(folder1, folder2, natoms1, natoms2, @@ -650,4 +664,14 @@ def integrate_ps(simfolder, f0, natoms, pi, pf, nsims=1, outfile = os.path.join(simfolder, "pressure_sweep.dat") np.savetxt(outfile, np.column_stack((press, f, werr))) else: - return (press, f, werr) \ No newline at end of file + return (press, f, werr) + + +def integrate_mass(flambda, ref_mass, target_masses, target_counts, + temperature, natoms): + + mcorarr = np.zeros(len(flambda)) + for i in range(len(target_masses)): + mcorarr += 1.5*kb*temperature*(flambda*(target_counts[i]/natoms)*np.log(ref_mass/target_masses[i])) + + return mcorarr \ No newline at end of file diff --git a/calphy/lattice.py b/calphy/lattice.py index d53313a..b8e9689 100644 --- a/calphy/lattice.py +++ b/calphy/lattice.py @@ -27,7 +27,6 @@ import numpy as np import pyscal.core as pc - """ Conversion factors for creating initial lattices """ diff --git a/calphy/queuekernel.py b/calphy/queuekernel.py index d970159..4b887eb 100644 --- a/calphy/queuekernel.py +++ b/calphy/queuekernel.py @@ -34,7 +34,7 @@ from calphy.liquid import Liquid from calphy.solid import Solid from calphy.alchemy import Alchemy -from calphy.routines import MeltingTemp, routine_fe, routine_ts, routine_only_ts, routine_pscale, routine_tscale, routine_alchemy +from calphy.routines import MeltingTemp, routine_fe, routine_ts, routine_only_ts, routine_pscale, routine_tscale, routine_alchemy, routine_composition_scaling def setup_calculation(calc): @@ -58,7 +58,7 @@ def setup_calculation(calc): if calc.mode == "melting_temperature": simfolder = None job = MeltingTemp(calculation=calc, simfolder=simfolder) - elif calc.mode == "alchemy": + elif calc.mode == "alchemy" or calc.mode == "composition_scaling": simfolder = calc.create_folders() job = Alchemy(calculation=calc, simfolder=simfolder) else: @@ -96,8 +96,10 @@ def run_calculation(job): job = routine_tscale(job) elif job.calc.mode == "pscale": job = routine_pscale(job) + elif job.calc.mode == "composition_scaling": + job = routine_composition_scaling(job) else: - raise ValueError("Mode should be either fe/ts/mts/alchemy/melting_temperature/tscale/pscale") + raise ValueError("Mode should be either fe/ts/mts/alchemy/melting_temperature/tscale/pscale/composition_scaling") return job def main(): @@ -132,7 +134,7 @@ def main(): os.rmdir(simfolder) simfolder = None job = MeltingTemp(calculation=calc, simfolder=simfolder) - elif calc.mode == "alchemy": + elif calc.mode == "alchemy" or calc.mode == "composition_scaling": job = Alchemy(calculation=calc, simfolder=simfolder) os.chdir(simfolder) else: @@ -156,5 +158,7 @@ def main(): _ = routine_tscale(job) elif job.calc.mode == "pscale": _ = routine_pscale(job) + elif job.calc.mode == "composition_scaling": + _ = routine_composition_scaling(job) else: - raise ValueError("Mode should be either fe/ts/mts/alchemy/melting_temperature/tscale/pscale") + raise ValueError("Mode should be either fe/ts/mts/alchemy/melting_temperature/tscale/pscale/composition_scaling") diff --git a/calphy/routines.py b/calphy/routines.py index f49e8aa..8f7d37b 100644 --- a/calphy/routines.py +++ b/calphy/routines.py @@ -34,6 +34,7 @@ from calphy.liquid import Liquid from calphy.solid import Solid +from calphy.composition_transformation import CompositionTransformation class MeltingTemp: """ @@ -435,4 +436,87 @@ def routine_alchemy(job): job.thermodynamic_integration() job.submit_report() - return job \ No newline at end of file + return job + + +def routine_composition_scaling(job): + """ + Perform a compositional scaling routine + """ + #we set up comp scaling first + job.logger.info("Calculating composition scaling") + comp = CompositionTransformation(job.calc.lattice, + job.calc.composition_scaling.input_chemical_composition, + job.calc.composition_scaling.output_chemical_composition, + restrictions=job.calc.composition_scaling.restrictions) + + #update pair styles + res = comp.update_pair_coeff(job.calc.pair_coeff[0]) + job.calc.pair_style.append(job.calc.pair_style[0]) + job.calc.pair_coeff[0] = res[0] + job.calc.pair_coeff.append(res[1]) + job.logger.info("Update pair coefficients") + job.logger.info(f"pair coeff 1: {job.calc.pair_coeff[0]}") + job.logger.info(f"pair coeff 2: {job.calc.pair_coeff[1]}") + backup_element = job.calc.element.copy() + job.calc.element = comp.pair_list_old + #job.calc._ghost_element_count = len(comp.new_atomtype) - len() + + #write new file out and update lattice + outfilename = ".".join([job.calc.lattice, "comp", "dump"]) + comp.write_structure(outfilename) + job.calc.lattice = outfilename + job.logger.info(f"Modified lattice written to {outfilename}") + + #prepare mass change methods + #update and backup mass + job.logger.info(f"Original mass: {job.calc.mass}") + backup_mass = job.calc.mass.copy() + mass_dict = {key:val for (key, val) in zip(backup_element, backup_mass)} + + target_masses = [] + target_counts = [] + + ref_mass_list = [] + + for mdict in comp.transformation_list: + ref_mass_list.append(mass_dict[mdict["primary_element"]]) + target_masses.append(mass_dict[mdict["secondary_element"]]) + target_counts.append(mdict["count"]) + + if len(backup_mass) > 2: + job.logger.warning("Composition scaling is untested for more than 2 elements!") + + if len(np.unique(ref_mass_list)) > 1: + job.logger.warning("More than one kind of transformation found! Stopping") + raise RuntimeError("More than one kind of transformation found! Stopping") + + ref_mass = ref_mass_list[0] + + #now replace mass + job.calc.mass = [ref_mass for x in range(len(job.calc.element))] + job.logger.info(f"Temporarily replacing mass: {job.calc.mass}") + + + #now start cycle + ts = time.time() + job.run_averaging() + te = (time.time() - ts) + job.logger.info("Averaging routine finished in %f s"%te) + + #now run integration loops + for i in range(job.calc.n_iterations): + ts = time.time() + job.run_integration(iteration=(i+1)) + te = (time.time() - ts) + job.logger.info("Alchemy integration cycle %d finished in %f s"%(i+1, te)) + + flambda_arr, w_arr, q_arr, qerr_arr = job.thermodynamic_integration() + + #read the file + mcorrarr = job.mass_integration(flambda_arr, ref_mass, target_masses, target_counts) + netfe = w_arr - mcorrarr + + outfile = os.path.join(job.simfolder, "composition_sweep.dat") + np.savetxt(outfile, np.column_stack((flambda_arr, netfe, w_arr, mcorrarr))) + return job \ No newline at end of file diff --git a/examples/example_07/analysis.ipynb b/examples/example_07/analysis.ipynb index c4df343..8596abe 100644 --- a/examples/example_07/analysis.ipynb +++ b/examples/example_07/analysis.ipynb @@ -13,37 +13,9 @@ "id": "9dd01e04-93a1-4219-923f-08904414f558", "metadata": {}, "source": [ - "In this example, upsampling calculations which can be used to switch a system between two different interatomic potentials is illustrated. The input file is shown below:\n", + "In this example, upsampling calculations which can be used to switch a system between two different interatomic potentials is illustrated. \n", "\n", - "```\n", - "element: ['Cu']\n", - "mass: [63.546]\n", - "calculations:\n", - "- mode: alchemy \n", - " temperature: [600]\n", - " pressure: [0]\n", - " lattice: [FCC]\n", - " repeat: [5, 5, 5]\n", - " state: [solid]\n", - " nsims: 1\n", - " \n", - "md:\n", - " pair_style: [eam/fs, eam/alloy]\n", - " pair_coeff: [\"* * ../potentials/Cu1.eam.fs Cu\", \"* * ../potentials/Cu01.eam.alloy Cu\"]\n", - " timestep: 0.001\n", - " tdamp: 0.1\n", - " pdamp: 0.1\n", - " te: 10000\n", - " ts: 15000\n", - "\n", - "queue:\n", - " scheduler: local\n", - " cores: 4\n", - " commands:\n", - " - conda activate calphy\n", - "```\n", - "\n", - "The major change is that both `pair_style` and `pair_coeff` keywords have two arguments. These are the two potentials between which the transformation will be carried out.\n", + "The major change in the input file is that both `pair_style` and `pair_coeff` keywords have two arguments. These are the two potentials between which the transformation will be carried out.\n", "\n", "The first potential is a Finnis-Sinclair (FS) potential for copper: \n", "\n", @@ -89,7 +61,7 @@ { "data": { "text/plain": [ - "-3.43894689000222" + "-3.4389380251304913" ] }, "execution_count": 3, @@ -129,7 +101,7 @@ { "data": { "text/plain": [ - "-0.2544935936478223" + "-0.25451608590151586" ] }, "execution_count": 5, @@ -158,7 +130,7 @@ { "data": { "text/plain": [ - "-3.6934404836500425" + "-3.693454111032007" ] }, "execution_count": 6, @@ -198,7 +170,7 @@ { "data": { "text/plain": [ - "-3.6942301262722053" + "-3.6923377327832667" ] }, "execution_count": 8, @@ -221,9 +193,9 @@ ], "metadata": { "kernelspec": { - "display_name": "calphy", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": "calphy" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -235,7 +207,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.7" + "version": "3.10.5" } }, "nbformat": 4, diff --git a/examples/example_10/ZrCu.dump b/examples/example_10/ZrCu.dump new file mode 100644 index 0000000..a52bd0b --- /dev/null +++ b/examples/example_10/ZrCu.dump @@ -0,0 +1,1033 @@ +ITEM: TIMESTEP +0 +ITEM: NUMBER OF ATOMS +1024 +ITEM: BOX BOUNDS +0.000000 26.160000 +0.000000 26.160000 +0.000000 26.160000 +ITEM: ATOMS id type x y z +1 1 0.000000 0.000000 0.000000 +2 2 1.635000 1.635000 1.635000 +3 1 0.000000 0.000000 3.270000 +4 2 1.635000 1.635000 4.905000 +5 1 0.000000 0.000000 6.540000 +6 2 1.635000 1.635000 8.175000 +7 1 0.000000 0.000000 9.810000 +8 2 1.635000 1.635000 11.445000 +9 1 0.000000 0.000000 13.080000 +10 2 1.635000 1.635000 14.715000 +11 1 0.000000 0.000000 16.350000 +12 2 1.635000 1.635000 17.985000 +13 1 0.000000 0.000000 19.620000 +14 2 1.635000 1.635000 21.255000 +15 1 0.000000 0.000000 22.890000 +16 2 1.635000 1.635000 24.525000 +17 1 0.000000 3.270000 0.000000 +18 2 1.635000 4.905000 1.635000 +19 1 0.000000 3.270000 3.270000 +20 2 1.635000 4.905000 4.905000 +21 1 0.000000 3.270000 6.540000 +22 2 1.635000 4.905000 8.175000 +23 1 0.000000 3.270000 9.810000 +24 2 1.635000 4.905000 11.445000 +25 1 0.000000 3.270000 13.080000 +26 2 1.635000 4.905000 14.715000 +27 1 0.000000 3.270000 16.350000 +28 2 1.635000 4.905000 17.985000 +29 1 0.000000 3.270000 19.620000 +30 2 1.635000 4.905000 21.255000 +31 1 0.000000 3.270000 22.890000 +32 2 1.635000 4.905000 24.525000 +33 1 0.000000 6.540000 0.000000 +34 2 1.635000 8.175000 1.635000 +35 1 0.000000 6.540000 3.270000 +36 2 1.635000 8.175000 4.905000 +37 1 0.000000 6.540000 6.540000 +38 2 1.635000 8.175000 8.175000 +39 1 0.000000 6.540000 9.810000 +40 2 1.635000 8.175000 11.445000 +41 1 0.000000 6.540000 13.080000 +42 2 1.635000 8.175000 14.715000 +43 1 0.000000 6.540000 16.350000 +44 2 1.635000 8.175000 17.985000 +45 1 0.000000 6.540000 19.620000 +46 2 1.635000 8.175000 21.255000 +47 1 0.000000 6.540000 22.890000 +48 2 1.635000 8.175000 24.525000 +49 1 0.000000 9.810000 0.000000 +50 2 1.635000 11.445000 1.635000 +51 1 0.000000 9.810000 3.270000 +52 2 1.635000 11.445000 4.905000 +53 1 0.000000 9.810000 6.540000 +54 2 1.635000 11.445000 8.175000 +55 1 0.000000 9.810000 9.810000 +56 2 1.635000 11.445000 11.445000 +57 1 0.000000 9.810000 13.080000 +58 2 1.635000 11.445000 14.715000 +59 1 0.000000 9.810000 16.350000 +60 2 1.635000 11.445000 17.985000 +61 1 0.000000 9.810000 19.620000 +62 2 1.635000 11.445000 21.255000 +63 1 0.000000 9.810000 22.890000 +64 2 1.635000 11.445000 24.525000 +65 1 0.000000 13.080000 0.000000 +66 2 1.635000 14.715000 1.635000 +67 1 0.000000 13.080000 3.270000 +68 2 1.635000 14.715000 4.905000 +69 1 0.000000 13.080000 6.540000 +70 2 1.635000 14.715000 8.175000 +71 1 0.000000 13.080000 9.810000 +72 2 1.635000 14.715000 11.445000 +73 1 0.000000 13.080000 13.080000 +74 2 1.635000 14.715000 14.715000 +75 1 0.000000 13.080000 16.350000 +76 2 1.635000 14.715000 17.985000 +77 1 0.000000 13.080000 19.620000 +78 2 1.635000 14.715000 21.255000 +79 1 0.000000 13.080000 22.890000 +80 2 1.635000 14.715000 24.525000 +81 1 0.000000 16.350000 0.000000 +82 2 1.635000 17.985000 1.635000 +83 1 0.000000 16.350000 3.270000 +84 2 1.635000 17.985000 4.905000 +85 1 0.000000 16.350000 6.540000 +86 2 1.635000 17.985000 8.175000 +87 1 0.000000 16.350000 9.810000 +88 2 1.635000 17.985000 11.445000 +89 1 0.000000 16.350000 13.080000 +90 2 1.635000 17.985000 14.715000 +91 1 0.000000 16.350000 16.350000 +92 2 1.635000 17.985000 17.985000 +93 1 0.000000 16.350000 19.620000 +94 2 1.635000 17.985000 21.255000 +95 1 0.000000 16.350000 22.890000 +96 2 1.635000 17.985000 24.525000 +97 1 0.000000 19.620000 0.000000 +98 2 1.635000 21.255000 1.635000 +99 1 0.000000 19.620000 3.270000 +100 2 1.635000 21.255000 4.905000 +101 1 0.000000 19.620000 6.540000 +102 2 1.635000 21.255000 8.175000 +103 1 0.000000 19.620000 9.810000 +104 2 1.635000 21.255000 11.445000 +105 1 0.000000 19.620000 13.080000 +106 2 1.635000 21.255000 14.715000 +107 1 0.000000 19.620000 16.350000 +108 2 1.635000 21.255000 17.985000 +109 1 0.000000 19.620000 19.620000 +110 2 1.635000 21.255000 21.255000 +111 1 0.000000 19.620000 22.890000 +112 2 1.635000 21.255000 24.525000 +113 1 0.000000 22.890000 0.000000 +114 2 1.635000 24.525000 1.635000 +115 1 0.000000 22.890000 3.270000 +116 2 1.635000 24.525000 4.905000 +117 1 0.000000 22.890000 6.540000 +118 2 1.635000 24.525000 8.175000 +119 1 0.000000 22.890000 9.810000 +120 2 1.635000 24.525000 11.445000 +121 1 0.000000 22.890000 13.080000 +122 2 1.635000 24.525000 14.715000 +123 1 0.000000 22.890000 16.350000 +124 2 1.635000 24.525000 17.985000 +125 1 0.000000 22.890000 19.620000 +126 2 1.635000 24.525000 21.255000 +127 1 0.000000 22.890000 22.890000 +128 2 1.635000 24.525000 24.525000 +129 1 3.270000 0.000000 0.000000 +130 2 4.905000 1.635000 1.635000 +131 1 3.270000 0.000000 3.270000 +132 2 4.905000 1.635000 4.905000 +133 1 3.270000 0.000000 6.540000 +134 2 4.905000 1.635000 8.175000 +135 1 3.270000 0.000000 9.810000 +136 2 4.905000 1.635000 11.445000 +137 1 3.270000 0.000000 13.080000 +138 2 4.905000 1.635000 14.715000 +139 1 3.270000 0.000000 16.350000 +140 2 4.905000 1.635000 17.985000 +141 1 3.270000 0.000000 19.620000 +142 2 4.905000 1.635000 21.255000 +143 1 3.270000 0.000000 22.890000 +144 2 4.905000 1.635000 24.525000 +145 1 3.270000 3.270000 0.000000 +146 2 4.905000 4.905000 1.635000 +147 1 3.270000 3.270000 3.270000 +148 2 4.905000 4.905000 4.905000 +149 1 3.270000 3.270000 6.540000 +150 2 4.905000 4.905000 8.175000 +151 1 3.270000 3.270000 9.810000 +152 2 4.905000 4.905000 11.445000 +153 1 3.270000 3.270000 13.080000 +154 2 4.905000 4.905000 14.715000 +155 1 3.270000 3.270000 16.350000 +156 2 4.905000 4.905000 17.985000 +157 1 3.270000 3.270000 19.620000 +158 2 4.905000 4.905000 21.255000 +159 1 3.270000 3.270000 22.890000 +160 2 4.905000 4.905000 24.525000 +161 1 3.270000 6.540000 0.000000 +162 2 4.905000 8.175000 1.635000 +163 1 3.270000 6.540000 3.270000 +164 2 4.905000 8.175000 4.905000 +165 1 3.270000 6.540000 6.540000 +166 2 4.905000 8.175000 8.175000 +167 1 3.270000 6.540000 9.810000 +168 2 4.905000 8.175000 11.445000 +169 1 3.270000 6.540000 13.080000 +170 2 4.905000 8.175000 14.715000 +171 1 3.270000 6.540000 16.350000 +172 2 4.905000 8.175000 17.985000 +173 1 3.270000 6.540000 19.620000 +174 2 4.905000 8.175000 21.255000 +175 1 3.270000 6.540000 22.890000 +176 2 4.905000 8.175000 24.525000 +177 1 3.270000 9.810000 0.000000 +178 2 4.905000 11.445000 1.635000 +179 1 3.270000 9.810000 3.270000 +180 2 4.905000 11.445000 4.905000 +181 1 3.270000 9.810000 6.540000 +182 2 4.905000 11.445000 8.175000 +183 1 3.270000 9.810000 9.810000 +184 2 4.905000 11.445000 11.445000 +185 1 3.270000 9.810000 13.080000 +186 2 4.905000 11.445000 14.715000 +187 1 3.270000 9.810000 16.350000 +188 2 4.905000 11.445000 17.985000 +189 1 3.270000 9.810000 19.620000 +190 2 4.905000 11.445000 21.255000 +191 1 3.270000 9.810000 22.890000 +192 2 4.905000 11.445000 24.525000 +193 1 3.270000 13.080000 0.000000 +194 2 4.905000 14.715000 1.635000 +195 1 3.270000 13.080000 3.270000 +196 2 4.905000 14.715000 4.905000 +197 1 3.270000 13.080000 6.540000 +198 2 4.905000 14.715000 8.175000 +199 1 3.270000 13.080000 9.810000 +200 2 4.905000 14.715000 11.445000 +201 1 3.270000 13.080000 13.080000 +202 2 4.905000 14.715000 14.715000 +203 1 3.270000 13.080000 16.350000 +204 2 4.905000 14.715000 17.985000 +205 1 3.270000 13.080000 19.620000 +206 2 4.905000 14.715000 21.255000 +207 1 3.270000 13.080000 22.890000 +208 2 4.905000 14.715000 24.525000 +209 1 3.270000 16.350000 0.000000 +210 2 4.905000 17.985000 1.635000 +211 1 3.270000 16.350000 3.270000 +212 2 4.905000 17.985000 4.905000 +213 1 3.270000 16.350000 6.540000 +214 2 4.905000 17.985000 8.175000 +215 1 3.270000 16.350000 9.810000 +216 2 4.905000 17.985000 11.445000 +217 1 3.270000 16.350000 13.080000 +218 2 4.905000 17.985000 14.715000 +219 1 3.270000 16.350000 16.350000 +220 2 4.905000 17.985000 17.985000 +221 1 3.270000 16.350000 19.620000 +222 2 4.905000 17.985000 21.255000 +223 1 3.270000 16.350000 22.890000 +224 2 4.905000 17.985000 24.525000 +225 1 3.270000 19.620000 0.000000 +226 2 4.905000 21.255000 1.635000 +227 1 3.270000 19.620000 3.270000 +228 2 4.905000 21.255000 4.905000 +229 1 3.270000 19.620000 6.540000 +230 2 4.905000 21.255000 8.175000 +231 1 3.270000 19.620000 9.810000 +232 2 4.905000 21.255000 11.445000 +233 1 3.270000 19.620000 13.080000 +234 2 4.905000 21.255000 14.715000 +235 1 3.270000 19.620000 16.350000 +236 2 4.905000 21.255000 17.985000 +237 1 3.270000 19.620000 19.620000 +238 2 4.905000 21.255000 21.255000 +239 1 3.270000 19.620000 22.890000 +240 2 4.905000 21.255000 24.525000 +241 1 3.270000 22.890000 0.000000 +242 2 4.905000 24.525000 1.635000 +243 1 3.270000 22.890000 3.270000 +244 2 4.905000 24.525000 4.905000 +245 1 3.270000 22.890000 6.540000 +246 2 4.905000 24.525000 8.175000 +247 1 3.270000 22.890000 9.810000 +248 2 4.905000 24.525000 11.445000 +249 1 3.270000 22.890000 13.080000 +250 2 4.905000 24.525000 14.715000 +251 1 3.270000 22.890000 16.350000 +252 2 4.905000 24.525000 17.985000 +253 1 3.270000 22.890000 19.620000 +254 2 4.905000 24.525000 21.255000 +255 1 3.270000 22.890000 22.890000 +256 2 4.905000 24.525000 24.525000 +257 1 6.540000 0.000000 0.000000 +258 2 8.175000 1.635000 1.635000 +259 1 6.540000 0.000000 3.270000 +260 2 8.175000 1.635000 4.905000 +261 1 6.540000 0.000000 6.540000 +262 2 8.175000 1.635000 8.175000 +263 1 6.540000 0.000000 9.810000 +264 2 8.175000 1.635000 11.445000 +265 1 6.540000 0.000000 13.080000 +266 2 8.175000 1.635000 14.715000 +267 1 6.540000 0.000000 16.350000 +268 2 8.175000 1.635000 17.985000 +269 1 6.540000 0.000000 19.620000 +270 2 8.175000 1.635000 21.255000 +271 1 6.540000 0.000000 22.890000 +272 2 8.175000 1.635000 24.525000 +273 1 6.540000 3.270000 0.000000 +274 2 8.175000 4.905000 1.635000 +275 1 6.540000 3.270000 3.270000 +276 2 8.175000 4.905000 4.905000 +277 1 6.540000 3.270000 6.540000 +278 2 8.175000 4.905000 8.175000 +279 1 6.540000 3.270000 9.810000 +280 2 8.175000 4.905000 11.445000 +281 1 6.540000 3.270000 13.080000 +282 2 8.175000 4.905000 14.715000 +283 1 6.540000 3.270000 16.350000 +284 2 8.175000 4.905000 17.985000 +285 1 6.540000 3.270000 19.620000 +286 2 8.175000 4.905000 21.255000 +287 1 6.540000 3.270000 22.890000 +288 2 8.175000 4.905000 24.525000 +289 1 6.540000 6.540000 0.000000 +290 2 8.175000 8.175000 1.635000 +291 1 6.540000 6.540000 3.270000 +292 2 8.175000 8.175000 4.905000 +293 1 6.540000 6.540000 6.540000 +294 2 8.175000 8.175000 8.175000 +295 1 6.540000 6.540000 9.810000 +296 2 8.175000 8.175000 11.445000 +297 1 6.540000 6.540000 13.080000 +298 2 8.175000 8.175000 14.715000 +299 1 6.540000 6.540000 16.350000 +300 2 8.175000 8.175000 17.985000 +301 1 6.540000 6.540000 19.620000 +302 2 8.175000 8.175000 21.255000 +303 1 6.540000 6.540000 22.890000 +304 2 8.175000 8.175000 24.525000 +305 1 6.540000 9.810000 0.000000 +306 2 8.175000 11.445000 1.635000 +307 1 6.540000 9.810000 3.270000 +308 2 8.175000 11.445000 4.905000 +309 1 6.540000 9.810000 6.540000 +310 2 8.175000 11.445000 8.175000 +311 1 6.540000 9.810000 9.810000 +312 2 8.175000 11.445000 11.445000 +313 1 6.540000 9.810000 13.080000 +314 2 8.175000 11.445000 14.715000 +315 1 6.540000 9.810000 16.350000 +316 2 8.175000 11.445000 17.985000 +317 1 6.540000 9.810000 19.620000 +318 2 8.175000 11.445000 21.255000 +319 1 6.540000 9.810000 22.890000 +320 2 8.175000 11.445000 24.525000 +321 1 6.540000 13.080000 0.000000 +322 2 8.175000 14.715000 1.635000 +323 1 6.540000 13.080000 3.270000 +324 2 8.175000 14.715000 4.905000 +325 1 6.540000 13.080000 6.540000 +326 2 8.175000 14.715000 8.175000 +327 1 6.540000 13.080000 9.810000 +328 2 8.175000 14.715000 11.445000 +329 1 6.540000 13.080000 13.080000 +330 2 8.175000 14.715000 14.715000 +331 1 6.540000 13.080000 16.350000 +332 2 8.175000 14.715000 17.985000 +333 1 6.540000 13.080000 19.620000 +334 2 8.175000 14.715000 21.255000 +335 1 6.540000 13.080000 22.890000 +336 2 8.175000 14.715000 24.525000 +337 1 6.540000 16.350000 0.000000 +338 2 8.175000 17.985000 1.635000 +339 1 6.540000 16.350000 3.270000 +340 2 8.175000 17.985000 4.905000 +341 1 6.540000 16.350000 6.540000 +342 2 8.175000 17.985000 8.175000 +343 1 6.540000 16.350000 9.810000 +344 2 8.175000 17.985000 11.445000 +345 1 6.540000 16.350000 13.080000 +346 2 8.175000 17.985000 14.715000 +347 1 6.540000 16.350000 16.350000 +348 2 8.175000 17.985000 17.985000 +349 1 6.540000 16.350000 19.620000 +350 2 8.175000 17.985000 21.255000 +351 1 6.540000 16.350000 22.890000 +352 2 8.175000 17.985000 24.525000 +353 1 6.540000 19.620000 0.000000 +354 2 8.175000 21.255000 1.635000 +355 1 6.540000 19.620000 3.270000 +356 2 8.175000 21.255000 4.905000 +357 1 6.540000 19.620000 6.540000 +358 2 8.175000 21.255000 8.175000 +359 1 6.540000 19.620000 9.810000 +360 2 8.175000 21.255000 11.445000 +361 1 6.540000 19.620000 13.080000 +362 2 8.175000 21.255000 14.715000 +363 1 6.540000 19.620000 16.350000 +364 2 8.175000 21.255000 17.985000 +365 1 6.540000 19.620000 19.620000 +366 2 8.175000 21.255000 21.255000 +367 1 6.540000 19.620000 22.890000 +368 2 8.175000 21.255000 24.525000 +369 1 6.540000 22.890000 0.000000 +370 2 8.175000 24.525000 1.635000 +371 1 6.540000 22.890000 3.270000 +372 2 8.175000 24.525000 4.905000 +373 1 6.540000 22.890000 6.540000 +374 2 8.175000 24.525000 8.175000 +375 1 6.540000 22.890000 9.810000 +376 2 8.175000 24.525000 11.445000 +377 1 6.540000 22.890000 13.080000 +378 2 8.175000 24.525000 14.715000 +379 1 6.540000 22.890000 16.350000 +380 2 8.175000 24.525000 17.985000 +381 1 6.540000 22.890000 19.620000 +382 2 8.175000 24.525000 21.255000 +383 1 6.540000 22.890000 22.890000 +384 2 8.175000 24.525000 24.525000 +385 1 9.810000 0.000000 0.000000 +386 2 11.445000 1.635000 1.635000 +387 1 9.810000 0.000000 3.270000 +388 2 11.445000 1.635000 4.905000 +389 1 9.810000 0.000000 6.540000 +390 2 11.445000 1.635000 8.175000 +391 1 9.810000 0.000000 9.810000 +392 2 11.445000 1.635000 11.445000 +393 1 9.810000 0.000000 13.080000 +394 2 11.445000 1.635000 14.715000 +395 1 9.810000 0.000000 16.350000 +396 2 11.445000 1.635000 17.985000 +397 1 9.810000 0.000000 19.620000 +398 2 11.445000 1.635000 21.255000 +399 1 9.810000 0.000000 22.890000 +400 2 11.445000 1.635000 24.525000 +401 1 9.810000 3.270000 0.000000 +402 2 11.445000 4.905000 1.635000 +403 1 9.810000 3.270000 3.270000 +404 2 11.445000 4.905000 4.905000 +405 1 9.810000 3.270000 6.540000 +406 2 11.445000 4.905000 8.175000 +407 1 9.810000 3.270000 9.810000 +408 2 11.445000 4.905000 11.445000 +409 1 9.810000 3.270000 13.080000 +410 2 11.445000 4.905000 14.715000 +411 1 9.810000 3.270000 16.350000 +412 2 11.445000 4.905000 17.985000 +413 1 9.810000 3.270000 19.620000 +414 2 11.445000 4.905000 21.255000 +415 1 9.810000 3.270000 22.890000 +416 2 11.445000 4.905000 24.525000 +417 1 9.810000 6.540000 0.000000 +418 2 11.445000 8.175000 1.635000 +419 1 9.810000 6.540000 3.270000 +420 2 11.445000 8.175000 4.905000 +421 1 9.810000 6.540000 6.540000 +422 2 11.445000 8.175000 8.175000 +423 1 9.810000 6.540000 9.810000 +424 2 11.445000 8.175000 11.445000 +425 1 9.810000 6.540000 13.080000 +426 2 11.445000 8.175000 14.715000 +427 1 9.810000 6.540000 16.350000 +428 2 11.445000 8.175000 17.985000 +429 1 9.810000 6.540000 19.620000 +430 2 11.445000 8.175000 21.255000 +431 1 9.810000 6.540000 22.890000 +432 2 11.445000 8.175000 24.525000 +433 1 9.810000 9.810000 0.000000 +434 2 11.445000 11.445000 1.635000 +435 1 9.810000 9.810000 3.270000 +436 2 11.445000 11.445000 4.905000 +437 1 9.810000 9.810000 6.540000 +438 2 11.445000 11.445000 8.175000 +439 1 9.810000 9.810000 9.810000 +440 2 11.445000 11.445000 11.445000 +441 1 9.810000 9.810000 13.080000 +442 2 11.445000 11.445000 14.715000 +443 1 9.810000 9.810000 16.350000 +444 2 11.445000 11.445000 17.985000 +445 1 9.810000 9.810000 19.620000 +446 2 11.445000 11.445000 21.255000 +447 1 9.810000 9.810000 22.890000 +448 2 11.445000 11.445000 24.525000 +449 1 9.810000 13.080000 0.000000 +450 2 11.445000 14.715000 1.635000 +451 1 9.810000 13.080000 3.270000 +452 2 11.445000 14.715000 4.905000 +453 1 9.810000 13.080000 6.540000 +454 2 11.445000 14.715000 8.175000 +455 1 9.810000 13.080000 9.810000 +456 2 11.445000 14.715000 11.445000 +457 1 9.810000 13.080000 13.080000 +458 2 11.445000 14.715000 14.715000 +459 1 9.810000 13.080000 16.350000 +460 2 11.445000 14.715000 17.985000 +461 1 9.810000 13.080000 19.620000 +462 2 11.445000 14.715000 21.255000 +463 1 9.810000 13.080000 22.890000 +464 2 11.445000 14.715000 24.525000 +465 1 9.810000 16.350000 0.000000 +466 2 11.445000 17.985000 1.635000 +467 1 9.810000 16.350000 3.270000 +468 2 11.445000 17.985000 4.905000 +469 1 9.810000 16.350000 6.540000 +470 2 11.445000 17.985000 8.175000 +471 1 9.810000 16.350000 9.810000 +472 2 11.445000 17.985000 11.445000 +473 1 9.810000 16.350000 13.080000 +474 2 11.445000 17.985000 14.715000 +475 1 9.810000 16.350000 16.350000 +476 2 11.445000 17.985000 17.985000 +477 1 9.810000 16.350000 19.620000 +478 2 11.445000 17.985000 21.255000 +479 1 9.810000 16.350000 22.890000 +480 2 11.445000 17.985000 24.525000 +481 1 9.810000 19.620000 0.000000 +482 2 11.445000 21.255000 1.635000 +483 1 9.810000 19.620000 3.270000 +484 2 11.445000 21.255000 4.905000 +485 1 9.810000 19.620000 6.540000 +486 2 11.445000 21.255000 8.175000 +487 1 9.810000 19.620000 9.810000 +488 2 11.445000 21.255000 11.445000 +489 1 9.810000 19.620000 13.080000 +490 2 11.445000 21.255000 14.715000 +491 1 9.810000 19.620000 16.350000 +492 2 11.445000 21.255000 17.985000 +493 1 9.810000 19.620000 19.620000 +494 2 11.445000 21.255000 21.255000 +495 1 9.810000 19.620000 22.890000 +496 2 11.445000 21.255000 24.525000 +497 1 9.810000 22.890000 0.000000 +498 2 11.445000 24.525000 1.635000 +499 1 9.810000 22.890000 3.270000 +500 2 11.445000 24.525000 4.905000 +501 1 9.810000 22.890000 6.540000 +502 2 11.445000 24.525000 8.175000 +503 1 9.810000 22.890000 9.810000 +504 2 11.445000 24.525000 11.445000 +505 1 9.810000 22.890000 13.080000 +506 2 11.445000 24.525000 14.715000 +507 1 9.810000 22.890000 16.350000 +508 2 11.445000 24.525000 17.985000 +509 1 9.810000 22.890000 19.620000 +510 2 11.445000 24.525000 21.255000 +511 1 9.810000 22.890000 22.890000 +512 2 11.445000 24.525000 24.525000 +513 1 13.080000 0.000000 0.000000 +514 2 14.715000 1.635000 1.635000 +515 1 13.080000 0.000000 3.270000 +516 2 14.715000 1.635000 4.905000 +517 1 13.080000 0.000000 6.540000 +518 2 14.715000 1.635000 8.175000 +519 1 13.080000 0.000000 9.810000 +520 2 14.715000 1.635000 11.445000 +521 1 13.080000 0.000000 13.080000 +522 2 14.715000 1.635000 14.715000 +523 1 13.080000 0.000000 16.350000 +524 2 14.715000 1.635000 17.985000 +525 1 13.080000 0.000000 19.620000 +526 2 14.715000 1.635000 21.255000 +527 1 13.080000 0.000000 22.890000 +528 2 14.715000 1.635000 24.525000 +529 1 13.080000 3.270000 0.000000 +530 2 14.715000 4.905000 1.635000 +531 1 13.080000 3.270000 3.270000 +532 2 14.715000 4.905000 4.905000 +533 1 13.080000 3.270000 6.540000 +534 2 14.715000 4.905000 8.175000 +535 1 13.080000 3.270000 9.810000 +536 2 14.715000 4.905000 11.445000 +537 1 13.080000 3.270000 13.080000 +538 2 14.715000 4.905000 14.715000 +539 1 13.080000 3.270000 16.350000 +540 2 14.715000 4.905000 17.985000 +541 1 13.080000 3.270000 19.620000 +542 2 14.715000 4.905000 21.255000 +543 1 13.080000 3.270000 22.890000 +544 2 14.715000 4.905000 24.525000 +545 1 13.080000 6.540000 0.000000 +546 2 14.715000 8.175000 1.635000 +547 1 13.080000 6.540000 3.270000 +548 2 14.715000 8.175000 4.905000 +549 1 13.080000 6.540000 6.540000 +550 2 14.715000 8.175000 8.175000 +551 1 13.080000 6.540000 9.810000 +552 2 14.715000 8.175000 11.445000 +553 1 13.080000 6.540000 13.080000 +554 2 14.715000 8.175000 14.715000 +555 1 13.080000 6.540000 16.350000 +556 2 14.715000 8.175000 17.985000 +557 1 13.080000 6.540000 19.620000 +558 2 14.715000 8.175000 21.255000 +559 1 13.080000 6.540000 22.890000 +560 2 14.715000 8.175000 24.525000 +561 1 13.080000 9.810000 0.000000 +562 2 14.715000 11.445000 1.635000 +563 1 13.080000 9.810000 3.270000 +564 2 14.715000 11.445000 4.905000 +565 1 13.080000 9.810000 6.540000 +566 2 14.715000 11.445000 8.175000 +567 1 13.080000 9.810000 9.810000 +568 2 14.715000 11.445000 11.445000 +569 1 13.080000 9.810000 13.080000 +570 2 14.715000 11.445000 14.715000 +571 1 13.080000 9.810000 16.350000 +572 2 14.715000 11.445000 17.985000 +573 1 13.080000 9.810000 19.620000 +574 2 14.715000 11.445000 21.255000 +575 1 13.080000 9.810000 22.890000 +576 2 14.715000 11.445000 24.525000 +577 1 13.080000 13.080000 0.000000 +578 2 14.715000 14.715000 1.635000 +579 1 13.080000 13.080000 3.270000 +580 2 14.715000 14.715000 4.905000 +581 1 13.080000 13.080000 6.540000 +582 2 14.715000 14.715000 8.175000 +583 1 13.080000 13.080000 9.810000 +584 2 14.715000 14.715000 11.445000 +585 1 13.080000 13.080000 13.080000 +586 2 14.715000 14.715000 14.715000 +587 1 13.080000 13.080000 16.350000 +588 2 14.715000 14.715000 17.985000 +589 1 13.080000 13.080000 19.620000 +590 2 14.715000 14.715000 21.255000 +591 1 13.080000 13.080000 22.890000 +592 2 14.715000 14.715000 24.525000 +593 1 13.080000 16.350000 0.000000 +594 2 14.715000 17.985000 1.635000 +595 1 13.080000 16.350000 3.270000 +596 2 14.715000 17.985000 4.905000 +597 1 13.080000 16.350000 6.540000 +598 2 14.715000 17.985000 8.175000 +599 1 13.080000 16.350000 9.810000 +600 2 14.715000 17.985000 11.445000 +601 1 13.080000 16.350000 13.080000 +602 2 14.715000 17.985000 14.715000 +603 1 13.080000 16.350000 16.350000 +604 2 14.715000 17.985000 17.985000 +605 1 13.080000 16.350000 19.620000 +606 2 14.715000 17.985000 21.255000 +607 1 13.080000 16.350000 22.890000 +608 2 14.715000 17.985000 24.525000 +609 1 13.080000 19.620000 0.000000 +610 2 14.715000 21.255000 1.635000 +611 1 13.080000 19.620000 3.270000 +612 2 14.715000 21.255000 4.905000 +613 1 13.080000 19.620000 6.540000 +614 2 14.715000 21.255000 8.175000 +615 1 13.080000 19.620000 9.810000 +616 2 14.715000 21.255000 11.445000 +617 1 13.080000 19.620000 13.080000 +618 2 14.715000 21.255000 14.715000 +619 1 13.080000 19.620000 16.350000 +620 2 14.715000 21.255000 17.985000 +621 1 13.080000 19.620000 19.620000 +622 2 14.715000 21.255000 21.255000 +623 1 13.080000 19.620000 22.890000 +624 2 14.715000 21.255000 24.525000 +625 1 13.080000 22.890000 0.000000 +626 2 14.715000 24.525000 1.635000 +627 1 13.080000 22.890000 3.270000 +628 2 14.715000 24.525000 4.905000 +629 1 13.080000 22.890000 6.540000 +630 2 14.715000 24.525000 8.175000 +631 1 13.080000 22.890000 9.810000 +632 2 14.715000 24.525000 11.445000 +633 1 13.080000 22.890000 13.080000 +634 2 14.715000 24.525000 14.715000 +635 1 13.080000 22.890000 16.350000 +636 2 14.715000 24.525000 17.985000 +637 1 13.080000 22.890000 19.620000 +638 2 14.715000 24.525000 21.255000 +639 1 13.080000 22.890000 22.890000 +640 2 14.715000 24.525000 24.525000 +641 1 16.350000 0.000000 0.000000 +642 2 17.985000 1.635000 1.635000 +643 1 16.350000 0.000000 3.270000 +644 2 17.985000 1.635000 4.905000 +645 1 16.350000 0.000000 6.540000 +646 2 17.985000 1.635000 8.175000 +647 1 16.350000 0.000000 9.810000 +648 2 17.985000 1.635000 11.445000 +649 1 16.350000 0.000000 13.080000 +650 2 17.985000 1.635000 14.715000 +651 1 16.350000 0.000000 16.350000 +652 2 17.985000 1.635000 17.985000 +653 1 16.350000 0.000000 19.620000 +654 2 17.985000 1.635000 21.255000 +655 1 16.350000 0.000000 22.890000 +656 2 17.985000 1.635000 24.525000 +657 1 16.350000 3.270000 0.000000 +658 2 17.985000 4.905000 1.635000 +659 1 16.350000 3.270000 3.270000 +660 2 17.985000 4.905000 4.905000 +661 1 16.350000 3.270000 6.540000 +662 2 17.985000 4.905000 8.175000 +663 1 16.350000 3.270000 9.810000 +664 2 17.985000 4.905000 11.445000 +665 1 16.350000 3.270000 13.080000 +666 2 17.985000 4.905000 14.715000 +667 1 16.350000 3.270000 16.350000 +668 2 17.985000 4.905000 17.985000 +669 1 16.350000 3.270000 19.620000 +670 2 17.985000 4.905000 21.255000 +671 1 16.350000 3.270000 22.890000 +672 2 17.985000 4.905000 24.525000 +673 1 16.350000 6.540000 0.000000 +674 2 17.985000 8.175000 1.635000 +675 1 16.350000 6.540000 3.270000 +676 2 17.985000 8.175000 4.905000 +677 1 16.350000 6.540000 6.540000 +678 2 17.985000 8.175000 8.175000 +679 1 16.350000 6.540000 9.810000 +680 2 17.985000 8.175000 11.445000 +681 1 16.350000 6.540000 13.080000 +682 2 17.985000 8.175000 14.715000 +683 1 16.350000 6.540000 16.350000 +684 2 17.985000 8.175000 17.985000 +685 1 16.350000 6.540000 19.620000 +686 2 17.985000 8.175000 21.255000 +687 1 16.350000 6.540000 22.890000 +688 2 17.985000 8.175000 24.525000 +689 1 16.350000 9.810000 0.000000 +690 2 17.985000 11.445000 1.635000 +691 1 16.350000 9.810000 3.270000 +692 2 17.985000 11.445000 4.905000 +693 1 16.350000 9.810000 6.540000 +694 2 17.985000 11.445000 8.175000 +695 1 16.350000 9.810000 9.810000 +696 2 17.985000 11.445000 11.445000 +697 1 16.350000 9.810000 13.080000 +698 2 17.985000 11.445000 14.715000 +699 1 16.350000 9.810000 16.350000 +700 2 17.985000 11.445000 17.985000 +701 1 16.350000 9.810000 19.620000 +702 2 17.985000 11.445000 21.255000 +703 1 16.350000 9.810000 22.890000 +704 2 17.985000 11.445000 24.525000 +705 1 16.350000 13.080000 0.000000 +706 2 17.985000 14.715000 1.635000 +707 1 16.350000 13.080000 3.270000 +708 2 17.985000 14.715000 4.905000 +709 1 16.350000 13.080000 6.540000 +710 2 17.985000 14.715000 8.175000 +711 1 16.350000 13.080000 9.810000 +712 2 17.985000 14.715000 11.445000 +713 1 16.350000 13.080000 13.080000 +714 2 17.985000 14.715000 14.715000 +715 1 16.350000 13.080000 16.350000 +716 2 17.985000 14.715000 17.985000 +717 1 16.350000 13.080000 19.620000 +718 2 17.985000 14.715000 21.255000 +719 1 16.350000 13.080000 22.890000 +720 2 17.985000 14.715000 24.525000 +721 1 16.350000 16.350000 0.000000 +722 2 17.985000 17.985000 1.635000 +723 1 16.350000 16.350000 3.270000 +724 2 17.985000 17.985000 4.905000 +725 1 16.350000 16.350000 6.540000 +726 2 17.985000 17.985000 8.175000 +727 1 16.350000 16.350000 9.810000 +728 2 17.985000 17.985000 11.445000 +729 1 16.350000 16.350000 13.080000 +730 2 17.985000 17.985000 14.715000 +731 1 16.350000 16.350000 16.350000 +732 2 17.985000 17.985000 17.985000 +733 1 16.350000 16.350000 19.620000 +734 2 17.985000 17.985000 21.255000 +735 1 16.350000 16.350000 22.890000 +736 2 17.985000 17.985000 24.525000 +737 1 16.350000 19.620000 0.000000 +738 2 17.985000 21.255000 1.635000 +739 1 16.350000 19.620000 3.270000 +740 2 17.985000 21.255000 4.905000 +741 1 16.350000 19.620000 6.540000 +742 2 17.985000 21.255000 8.175000 +743 1 16.350000 19.620000 9.810000 +744 2 17.985000 21.255000 11.445000 +745 1 16.350000 19.620000 13.080000 +746 2 17.985000 21.255000 14.715000 +747 1 16.350000 19.620000 16.350000 +748 2 17.985000 21.255000 17.985000 +749 1 16.350000 19.620000 19.620000 +750 2 17.985000 21.255000 21.255000 +751 1 16.350000 19.620000 22.890000 +752 2 17.985000 21.255000 24.525000 +753 1 16.350000 22.890000 0.000000 +754 2 17.985000 24.525000 1.635000 +755 1 16.350000 22.890000 3.270000 +756 2 17.985000 24.525000 4.905000 +757 1 16.350000 22.890000 6.540000 +758 2 17.985000 24.525000 8.175000 +759 1 16.350000 22.890000 9.810000 +760 2 17.985000 24.525000 11.445000 +761 1 16.350000 22.890000 13.080000 +762 2 17.985000 24.525000 14.715000 +763 1 16.350000 22.890000 16.350000 +764 2 17.985000 24.525000 17.985000 +765 1 16.350000 22.890000 19.620000 +766 2 17.985000 24.525000 21.255000 +767 1 16.350000 22.890000 22.890000 +768 2 17.985000 24.525000 24.525000 +769 1 19.620000 0.000000 0.000000 +770 2 21.255000 1.635000 1.635000 +771 1 19.620000 0.000000 3.270000 +772 2 21.255000 1.635000 4.905000 +773 1 19.620000 0.000000 6.540000 +774 2 21.255000 1.635000 8.175000 +775 1 19.620000 0.000000 9.810000 +776 2 21.255000 1.635000 11.445000 +777 1 19.620000 0.000000 13.080000 +778 2 21.255000 1.635000 14.715000 +779 1 19.620000 0.000000 16.350000 +780 2 21.255000 1.635000 17.985000 +781 1 19.620000 0.000000 19.620000 +782 2 21.255000 1.635000 21.255000 +783 1 19.620000 0.000000 22.890000 +784 2 21.255000 1.635000 24.525000 +785 1 19.620000 3.270000 0.000000 +786 2 21.255000 4.905000 1.635000 +787 1 19.620000 3.270000 3.270000 +788 2 21.255000 4.905000 4.905000 +789 1 19.620000 3.270000 6.540000 +790 2 21.255000 4.905000 8.175000 +791 1 19.620000 3.270000 9.810000 +792 2 21.255000 4.905000 11.445000 +793 1 19.620000 3.270000 13.080000 +794 2 21.255000 4.905000 14.715000 +795 1 19.620000 3.270000 16.350000 +796 2 21.255000 4.905000 17.985000 +797 1 19.620000 3.270000 19.620000 +798 2 21.255000 4.905000 21.255000 +799 1 19.620000 3.270000 22.890000 +800 2 21.255000 4.905000 24.525000 +801 1 19.620000 6.540000 0.000000 +802 2 21.255000 8.175000 1.635000 +803 1 19.620000 6.540000 3.270000 +804 2 21.255000 8.175000 4.905000 +805 1 19.620000 6.540000 6.540000 +806 2 21.255000 8.175000 8.175000 +807 1 19.620000 6.540000 9.810000 +808 2 21.255000 8.175000 11.445000 +809 1 19.620000 6.540000 13.080000 +810 2 21.255000 8.175000 14.715000 +811 1 19.620000 6.540000 16.350000 +812 2 21.255000 8.175000 17.985000 +813 1 19.620000 6.540000 19.620000 +814 2 21.255000 8.175000 21.255000 +815 1 19.620000 6.540000 22.890000 +816 2 21.255000 8.175000 24.525000 +817 1 19.620000 9.810000 0.000000 +818 2 21.255000 11.445000 1.635000 +819 1 19.620000 9.810000 3.270000 +820 2 21.255000 11.445000 4.905000 +821 1 19.620000 9.810000 6.540000 +822 2 21.255000 11.445000 8.175000 +823 1 19.620000 9.810000 9.810000 +824 2 21.255000 11.445000 11.445000 +825 1 19.620000 9.810000 13.080000 +826 2 21.255000 11.445000 14.715000 +827 1 19.620000 9.810000 16.350000 +828 2 21.255000 11.445000 17.985000 +829 1 19.620000 9.810000 19.620000 +830 2 21.255000 11.445000 21.255000 +831 1 19.620000 9.810000 22.890000 +832 2 21.255000 11.445000 24.525000 +833 1 19.620000 13.080000 0.000000 +834 2 21.255000 14.715000 1.635000 +835 1 19.620000 13.080000 3.270000 +836 2 21.255000 14.715000 4.905000 +837 1 19.620000 13.080000 6.540000 +838 2 21.255000 14.715000 8.175000 +839 1 19.620000 13.080000 9.810000 +840 2 21.255000 14.715000 11.445000 +841 1 19.620000 13.080000 13.080000 +842 2 21.255000 14.715000 14.715000 +843 1 19.620000 13.080000 16.350000 +844 2 21.255000 14.715000 17.985000 +845 1 19.620000 13.080000 19.620000 +846 2 21.255000 14.715000 21.255000 +847 1 19.620000 13.080000 22.890000 +848 2 21.255000 14.715000 24.525000 +849 1 19.620000 16.350000 0.000000 +850 2 21.255000 17.985000 1.635000 +851 1 19.620000 16.350000 3.270000 +852 2 21.255000 17.985000 4.905000 +853 1 19.620000 16.350000 6.540000 +854 2 21.255000 17.985000 8.175000 +855 1 19.620000 16.350000 9.810000 +856 2 21.255000 17.985000 11.445000 +857 1 19.620000 16.350000 13.080000 +858 2 21.255000 17.985000 14.715000 +859 1 19.620000 16.350000 16.350000 +860 2 21.255000 17.985000 17.985000 +861 1 19.620000 16.350000 19.620000 +862 2 21.255000 17.985000 21.255000 +863 1 19.620000 16.350000 22.890000 +864 2 21.255000 17.985000 24.525000 +865 1 19.620000 19.620000 0.000000 +866 2 21.255000 21.255000 1.635000 +867 1 19.620000 19.620000 3.270000 +868 2 21.255000 21.255000 4.905000 +869 1 19.620000 19.620000 6.540000 +870 2 21.255000 21.255000 8.175000 +871 1 19.620000 19.620000 9.810000 +872 2 21.255000 21.255000 11.445000 +873 1 19.620000 19.620000 13.080000 +874 2 21.255000 21.255000 14.715000 +875 1 19.620000 19.620000 16.350000 +876 2 21.255000 21.255000 17.985000 +877 1 19.620000 19.620000 19.620000 +878 2 21.255000 21.255000 21.255000 +879 1 19.620000 19.620000 22.890000 +880 2 21.255000 21.255000 24.525000 +881 1 19.620000 22.890000 0.000000 +882 2 21.255000 24.525000 1.635000 +883 1 19.620000 22.890000 3.270000 +884 2 21.255000 24.525000 4.905000 +885 1 19.620000 22.890000 6.540000 +886 2 21.255000 24.525000 8.175000 +887 1 19.620000 22.890000 9.810000 +888 2 21.255000 24.525000 11.445000 +889 1 19.620000 22.890000 13.080000 +890 2 21.255000 24.525000 14.715000 +891 1 19.620000 22.890000 16.350000 +892 2 21.255000 24.525000 17.985000 +893 1 19.620000 22.890000 19.620000 +894 2 21.255000 24.525000 21.255000 +895 1 19.620000 22.890000 22.890000 +896 2 21.255000 24.525000 24.525000 +897 1 22.890000 0.000000 0.000000 +898 2 24.525000 1.635000 1.635000 +899 1 22.890000 0.000000 3.270000 +900 2 24.525000 1.635000 4.905000 +901 1 22.890000 0.000000 6.540000 +902 2 24.525000 1.635000 8.175000 +903 1 22.890000 0.000000 9.810000 +904 2 24.525000 1.635000 11.445000 +905 1 22.890000 0.000000 13.080000 +906 2 24.525000 1.635000 14.715000 +907 1 22.890000 0.000000 16.350000 +908 2 24.525000 1.635000 17.985000 +909 1 22.890000 0.000000 19.620000 +910 2 24.525000 1.635000 21.255000 +911 1 22.890000 0.000000 22.890000 +912 2 24.525000 1.635000 24.525000 +913 1 22.890000 3.270000 0.000000 +914 2 24.525000 4.905000 1.635000 +915 1 22.890000 3.270000 3.270000 +916 2 24.525000 4.905000 4.905000 +917 1 22.890000 3.270000 6.540000 +918 2 24.525000 4.905000 8.175000 +919 1 22.890000 3.270000 9.810000 +920 2 24.525000 4.905000 11.445000 +921 1 22.890000 3.270000 13.080000 +922 2 24.525000 4.905000 14.715000 +923 1 22.890000 3.270000 16.350000 +924 2 24.525000 4.905000 17.985000 +925 1 22.890000 3.270000 19.620000 +926 2 24.525000 4.905000 21.255000 +927 1 22.890000 3.270000 22.890000 +928 2 24.525000 4.905000 24.525000 +929 1 22.890000 6.540000 0.000000 +930 2 24.525000 8.175000 1.635000 +931 1 22.890000 6.540000 3.270000 +932 2 24.525000 8.175000 4.905000 +933 1 22.890000 6.540000 6.540000 +934 2 24.525000 8.175000 8.175000 +935 1 22.890000 6.540000 9.810000 +936 2 24.525000 8.175000 11.445000 +937 1 22.890000 6.540000 13.080000 +938 2 24.525000 8.175000 14.715000 +939 1 22.890000 6.540000 16.350000 +940 2 24.525000 8.175000 17.985000 +941 1 22.890000 6.540000 19.620000 +942 2 24.525000 8.175000 21.255000 +943 1 22.890000 6.540000 22.890000 +944 2 24.525000 8.175000 24.525000 +945 1 22.890000 9.810000 0.000000 +946 2 24.525000 11.445000 1.635000 +947 1 22.890000 9.810000 3.270000 +948 2 24.525000 11.445000 4.905000 +949 1 22.890000 9.810000 6.540000 +950 2 24.525000 11.445000 8.175000 +951 1 22.890000 9.810000 9.810000 +952 2 24.525000 11.445000 11.445000 +953 1 22.890000 9.810000 13.080000 +954 2 24.525000 11.445000 14.715000 +955 1 22.890000 9.810000 16.350000 +956 2 24.525000 11.445000 17.985000 +957 1 22.890000 9.810000 19.620000 +958 2 24.525000 11.445000 21.255000 +959 1 22.890000 9.810000 22.890000 +960 2 24.525000 11.445000 24.525000 +961 1 22.890000 13.080000 0.000000 +962 2 24.525000 14.715000 1.635000 +963 1 22.890000 13.080000 3.270000 +964 2 24.525000 14.715000 4.905000 +965 1 22.890000 13.080000 6.540000 +966 2 24.525000 14.715000 8.175000 +967 1 22.890000 13.080000 9.810000 +968 2 24.525000 14.715000 11.445000 +969 1 22.890000 13.080000 13.080000 +970 2 24.525000 14.715000 14.715000 +971 1 22.890000 13.080000 16.350000 +972 2 24.525000 14.715000 17.985000 +973 1 22.890000 13.080000 19.620000 +974 2 24.525000 14.715000 21.255000 +975 1 22.890000 13.080000 22.890000 +976 2 24.525000 14.715000 24.525000 +977 1 22.890000 16.350000 0.000000 +978 2 24.525000 17.985000 1.635000 +979 1 22.890000 16.350000 3.270000 +980 2 24.525000 17.985000 4.905000 +981 1 22.890000 16.350000 6.540000 +982 2 24.525000 17.985000 8.175000 +983 1 22.890000 16.350000 9.810000 +984 2 24.525000 17.985000 11.445000 +985 1 22.890000 16.350000 13.080000 +986 2 24.525000 17.985000 14.715000 +987 1 22.890000 16.350000 16.350000 +988 2 24.525000 17.985000 17.985000 +989 1 22.890000 16.350000 19.620000 +990 2 24.525000 17.985000 21.255000 +991 1 22.890000 16.350000 22.890000 +992 2 24.525000 17.985000 24.525000 +993 1 22.890000 19.620000 0.000000 +994 2 24.525000 21.255000 1.635000 +995 1 22.890000 19.620000 3.270000 +996 2 24.525000 21.255000 4.905000 +997 1 22.890000 19.620000 6.540000 +998 2 24.525000 21.255000 8.175000 +999 1 22.890000 19.620000 9.810000 +1000 2 24.525000 21.255000 11.445000 +1001 1 22.890000 19.620000 13.080000 +1002 2 24.525000 21.255000 14.715000 +1003 1 22.890000 19.620000 16.350000 +1004 2 24.525000 21.255000 17.985000 +1005 1 22.890000 19.620000 19.620000 +1006 2 24.525000 21.255000 21.255000 +1007 1 22.890000 19.620000 22.890000 +1008 2 24.525000 21.255000 24.525000 +1009 1 22.890000 22.890000 0.000000 +1010 2 24.525000 24.525000 1.635000 +1011 1 22.890000 22.890000 3.270000 +1012 2 24.525000 24.525000 4.905000 +1013 1 22.890000 22.890000 6.540000 +1014 2 24.525000 24.525000 8.175000 +1015 1 22.890000 22.890000 9.810000 +1016 2 24.525000 24.525000 11.445000 +1017 1 22.890000 22.890000 13.080000 +1018 2 24.525000 24.525000 14.715000 +1019 1 22.890000 22.890000 16.350000 +1020 2 24.525000 24.525000 17.985000 +1021 1 22.890000 22.890000 19.620000 +1022 2 24.525000 24.525000 21.255000 +1023 1 22.890000 22.890000 22.890000 +1024 2 24.525000 24.525000 24.525000 diff --git a/examples/example_10/analysis.ipynb b/examples/example_10/analysis.ipynb new file mode 100644 index 0000000..cd004e1 --- /dev/null +++ b/examples/example_10/analysis.ipynb @@ -0,0 +1,200 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "1b0613c5-5671-4340-b3b4-51ae7d8e925d", + "metadata": {}, + "source": [ + "# Example 10: Composition scaling" + ] + }, + { + "cell_type": "markdown", + "id": "31133816", + "metadata": { + "jp-MarkdownHeadingCollapsed": true, + "tags": [] + }, + "source": [ + "In this notebook, we will calculate the free energy of a binary ZrCu system as a function of the composition. The structure that will be considered is ZrCu with a B2 structure. The potential that will be used is-\n", + "\n", + "[M.I. Mendelev , M.J. Kramer , R.T. Ott , D.J. Sordelet , D. Yagodin & P. Popel (2009) Development of suitable interatomic potentials for simulation of liquid and amorphous Cu–Zr alloys, Philosophical Magazine, 89:11, 967-987](http://dx.doi.org/10.1080/14786430902832773)\n", + "\n", + "We specify the mode as `composition_scaling` in the input file. The input file has a new section:\n", + "\n", + "```\n", + "composition_scaling:\n", + " input_chemical_composition:\n", + " - Cu: 512\n", + " - Zr: 512\n", + " output_chemical_composition:\n", + " - Cu: 532\n", + " - Zr: 492\n", + "```\n", + "\n", + "which provides the details for composition change. The `input_chemical_composition` shows equal number of Cu and Zr atoms as expected in the B2 structure. The `output_chemical_composition` has 532 Cu and 492 Zr atoms, which amounts to 48 at. % Zr. The composition integration therefore will span 48-50% of Zr.\n", + "\n", + "As usual, the calculation can be run by:\n", + "\n", + "```\n", + "calphy -i input.yaml\n", + "```\n", + "\n", + "Once the calculation is run, there is a file `composition_scaling.dat` created in the simulation folder. We can read in this file, to get the information. There are a number of columns in the file, but we will just use the first two." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "48d15362-3fdf-43bd-84ca-851c30b68da5", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "b430d8a6-9da6-4245-b151-7c064ca41909", + "metadata": {}, + "outputs": [], + "source": [ + "flambda_arr, netfe = np.loadtxt(\"composition_scaling-ZrCu.dump-800-0/composition_sweep.dat\", unpack=True,\n", + " usecols=(0,1))" + ] + }, + { + "cell_type": "markdown", + "id": "d5599993-ed20-4e86-afd9-85111d0f196c", + "metadata": {}, + "source": [ + "The first column, `flambda_arr` goes from 1.00 to 0.00. This spans the composition interval. At 1.00, the composition is 50 % Zr, while at 0.00, the composition is 48 %. First, the array is converted to the actual composition." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "c57c37f3-2563-421b-9c7c-1d0767b817fa", + "metadata": {}, + "outputs": [], + "source": [ + "comp = 0.50-flambda_arr*(0.50-0.48)" + ] + }, + { + "cell_type": "markdown", + "id": "5daf0435-b60c-4197-a3a1-05b3a81e4d1b", + "metadata": {}, + "source": [ + "To compare our results, we will use the data from this publication:\n", + "\n", + "[Tang, C, and Peter Harrowell. “Predicting the Solid State Phase Diagram for Glass-Forming Alloys of Copper and Zirconium.” Journal of Physics: Condensed Matter 24, no. 24 (June 20, 2012): 245102.](https://doi.org/10.1088/0953-8984/24/24/245102)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "3810bf00-f36e-4da7-8dee-253d12bdf0b6", + "metadata": {}, + "outputs": [], + "source": [ + "comp_reference = np.array([0.4810, 0.4913, 0.5])\n", + "fe_reference = np.array([-5.27, -5.31, -5.34])" + ] + }, + { + "cell_type": "markdown", + "id": "7bbc6196-dbef-47e4-9268-aa66953332a7", + "metadata": {}, + "source": [ + "We will also use direct calculations done using calphy. The results from direct calculations are given here for easiness." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "54710468-f710-4bc9-b010-f07ee59b3978", + "metadata": {}, + "outputs": [], + "source": [ + "comp_direct = np.array([0.48, 0.49, 0.50])\n", + "fe_direct = np.array([-5.271, -5.311, -5.350])" + ] + }, + { + "cell_type": "markdown", + "id": "13ae27bc-3a31-4e9e-ae3c-52efe935816e", + "metadata": {}, + "source": [ + "Note that our results, `netfe` only includes the free energy difference as composition change. We will modify the other calculations to plot the energy difference." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "0a890009-bc3c-4dd4-977f-4dc156b41dbc", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY0AAAEGCAYAAACZ0MnKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAA5bElEQVR4nO3deXxU1fn48c9DiIQd2QwSwmaQfQ0giIAiOwIqbrihVkotFf19bQsoErGltloVV0otKtW6VBaDoCwWUFSUgEBI2ELYAgHCFiAkkOX5/XEHHEKWGZKZyfK8X695Jffec+99ZnKTJ+eec88RVcUYY4zxRIVAB2CMMab0sKRhjDHGY5Y0jDHGeMyShjHGGI9Z0jDGGOOxioEOwFfq1q2rTZo0CXQYxhhTaqxbt+6IqtYrqEyZTRpNmjQhJiYm0GEYY0ypISJ7Citjt6eMMcZ4zJKGMcYYj1nSMMYY4zG/tWmIyCBgBhAEvKOqL+TaLq7tQ4AzwBhVXe/a9iTwK0CBWOAhVc3wNobMzEySkpLIyPB6V+NDISEhhIWFERwcHOhQjDGF8EvSEJEg4E2gP5AErBWRaFWNdys2GIhwvboDbwPdRaQh8DjQWlXTReRT4G7gPW/jSEpKonr16jRp0gQnR5lAU1WOHj1KUlISTZs2DXQ4xphC+Ov2VDcgQVUTVfUc8DEwIleZEcAcdawBaolIA9e2ikBlEakIVAEOXE4QGRkZ1KlTxxJGCSIi1KlTx2p/xhTRosRFDPhsAO3fb8+AzwawKHGRT87jr6TRENjntpzkWldoGVXdD7wE7AWSgVRVXZrXSURkrIjEiEhMSkpKnoFYwih57GdiTNEsSlxE1PdRJKcloyjJaclEfR/lk8Thr6SR11+F3GOy51lGRK7EqYU0Ba4GqorIfXmdRFVnqWqkqkbWq1fg8ynGGFNmzFg/g4zsi2vrGdkZzFg/o9jP5a+kkQQ0clsO49JbTPmVuRnYpaopqpoJzAN6+jBWnzp48CB33303zZs3p3Xr1gwZMoTt27cHOiyPrVy5kmHDhgEQHR3NCy+8UMgexhhfO5h20Kv1ReGvpLEWiBCRpiJyBU5DdnSuMtHAA+K4Duc2VDLObanrRKSKq4dVP2CLn+IuVqrKrbfeSt++fdm5cyfx8fFMnz6dQ4cOBTq0yzJ8+HAmTpwY6DCMKfdCq4Z6tb4o/JI0VDULGA8swfmD/6mqxonIOBEZ5yq2GEgEEoB/Ao+59v0R+AxYj9PdtgIwyx9xF7cVK1YQHBzMuHHjLqzr2LEjN9xwA6rK73//e9q2bUu7du345JNPAOc/+z59+nDnnXfSokULJk6cyIcffki3bt1o164dO3fuBGDMmDGMGzeOG264gRYtWvDFF19ccv7k5GR69+5Nx44dadu2Ld9++y0AX331FZ07d6ZDhw7069cPgJ9++omePXvSqVMnevbsybZt2y453nvvvcf48eMvnP/xxx+nZ8+eNGvWjM8++wyAnJwcHnvsMdq0acOwYcMYMmTIhW3GmOIxofMEQoJCLloXEhTChM4Tiv1cfntOQ1UX4yQG93Uz3b5X4Lf57DsVmFqc8Ty3MI74AyeL85C0vroGU29pk+/2zZs306VLlzy3zZs3jw0bNrBx40aOHDlC165d6d27NwAbN25ky5Yt1K5dm2bNmvGrX/2Kn376iRkzZvD666/z6quvArB7925WrVrFzp07ufHGG0lISCAk5JcL6T//+Q8DBw7k6aefJjs7mzNnzpCSksKjjz7KN998Q9OmTTl27BgALVu25JtvvqFixYosX76cyZMnM3fu3ALff3JyMqtXr2br1q0MHz6cUaNGMW/ePHbv3k1sbCyHDx+mVatWPPzww958rMaYQgxtNhRw2jYOph0ktGooEzpPuLC+OJXZAQtLm9WrV3PPPfcQFBTEVVddRZ8+fVi7di01atSga9euNGjg9D5u3rw5AwYMAKBdu3asWLHiwjHuvPNOKlSoQEREBM2aNWPr1q107NjxwvauXbvy8MMPk5mZyciRI+nYsSMrV66kd+/eF56RqF27NgCpqak8+OCD7NixAxEhMzOz0PcwcuRIKlSoQOvWrS/cclu9ejV33HEHFSpUIDQ0lBtvvLFYPi9jzMWGNhvqkySRW7lNGgXVCHylTZs2+d6acSpaeatUqdKF7ytUqHBhuUKFCmRlZV3Ylrvrau7l3r17880337Bo0SLuv/9+fv/731OrVq08u7xOmTKFG2+8kfnz57N792769u1b6Ptzj/P8+ynofRljik92jvLvH3azYd8JXrmro8+6stvYU3500003cfbsWf75z39eWLd27VpWrVpF7969+eSTT8jOziYlJYVvvvmGbt26eXX8//73v+Tk5LBz504SExO59tpr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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(comp, netfe, label=\"Comp scaling\")\n", + "plt.plot(comp_reference, fe_reference[0]-fe_reference, \"o\", label=\"reference\")\n", + "plt.plot(comp_direct, fe_direct[0]-fe_direct, \"o\", label=\"Direct\")\n", + "plt.legend()\n", + "plt.xlabel(\"At. % Zr\")\n", + "plt.ylabel(r\"$ \\Delta F $(eV/atom)\");" + ] + }, + { + "cell_type": "markdown", + "id": "1107e334-372f-4336-9fb7-edd707b458b5", + "metadata": {}, + "source": [ + "As seen from the plot, we have excellent agreement. However, we can obtain the whole range from a single calculation." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "de0b31d3-b01f-454a-9266-0b6b2ec457cc", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/example_10/input-composition.yaml b/examples/example_10/input-composition.yaml new file mode 100644 index 0000000..2a8f1c0 --- /dev/null +++ b/examples/example_10/input-composition.yaml @@ -0,0 +1,25 @@ +element: ['Zr', 'Cu'] +mass: [91.224, 63.546] +calculations: +- mode: composition_scaling + temperature: 800 + pressure: [0] + lattice: [ZrCu.dump] + n_iterations: 1 + reference_phase: solid + pair_style: eam/fs + pair_coeff: "* * ../potentials/ZrCu.eam.fs Zr Cu" + n_equilibration_steps: 5000 + n_switching_steps: 5000 + +composition_scaling: + input_chemical_composition: + - Cu: 512 + - Zr: 512 + output_chemical_composition: + - Cu: 532 + - Zr: 492 + +queue: + scheduler: local + cores: 4 \ No newline at end of file diff --git a/tests/conf1.data b/tests/conf1.data new file mode 100644 index 0000000..3c57e63 --- /dev/null +++ b/tests/conf1.data @@ -0,0 +1,511 @@ +conf1.data (written by ASE) + +500 atoms +1 atom types +0.0 20.555858880622804 xlo xhi +0.0 20.555858880622804 ylo yhi +0.0 20.555858880622804 zlo zhi + + +Atoms + + 1 1 20.524548357666024 20.366655705699234 0.069272119220278525 + 2 1 20.322411911175486 2.0196228383401706 2.403291043224713 + 3 1 2.0676758351980644 20.217392741214045 1.8619394902017379 + 4 1 2.0401304376348905 1.7103220678445428 0.033274241678507101 + 5 1 20.429472238848337 3.9376269173245486 0.10742110312295768 + 6 1 20.107465474929672 6.1322527488420402 1.6270899145353082 + 7 1 1.8528898468598389 3.6819122468399152 1.5518415145751607 + 8 1 1.7456622581815935 6.0525933000663761 20.540050137831191 + 9 1 0.047808106584656118 8.0190815664015993 20.319328484421817 + 10 1 20.455086997666257 10.139184264764904 1.5512029605811266 + 11 1 2.0220242999716644 8.2696388493881372 1.9134142709355353 + 12 1 2.1399852743501246 10.229301831381601 20.35578338005573 + 13 1 0.15613001471180216 12.064572961892738 20.504537560910016 + 14 1 20.522960002985887 14.33566921156244 1.840478329062925 + 15 1 1.81278764300984 12.12868445746091 1.7283346338880849 + 16 1 1.9934969480055069 14.415973379173673 20.51702331392319 + 17 1 20.292129673803014 16.504337332000198 0.098934156809128759 + 18 1 20.252793463017731 18.451734722130841 2.0908584615543928 + 19 1 2.1906734594652346 16.617063435077249 2.1241378688115948 + 20 1 1.9663691972101001 18.463310856251333 20.546469764312565 + 21 1 4.0826434278582591 0.012794600514239717 20.477390368858224 + 22 1 3.918059597193333 2.0300987585041996 1.7267828768508524 + 23 1 6.1386933606775891 0.067412796255132482 1.9939923709152978 + 24 1 6.0571249788247279 2.0418956685201399 0.044937117549540995 + 25 1 3.8084360894140254 4.3018307087518615 20.281818297195919 + 26 1 3.8845631646206416 6.028222580906605 1.8946995184455868 + 27 1 5.6931559455690035 4.0681603661901971 2.1587257374451414 + 28 1 6.116034091826922 6.1844115128498229 0.26785992451312474 + 29 1 3.7073867224847685 8.03382065447604 20.301786652992497 + 30 1 3.7437585165816376 10.135429898244581 1.9519867297140172 + 31 1 6.0685744521063762 8.1364719879076812 1.8024758746113496 + 32 1 5.8816050482246549 10.00113495584333 20.536769284924546 + 33 1 3.9249428568792779 12.550356841766829 0.17848655739412247 + 34 1 4.0266567256277899 14.415905955499897 2.1104104754779853 + 35 1 6.2336068074856943 12.223557340833381 1.6128452355941219 + 36 1 6.4120716554161996 14.551415012226485 20.518832805603044 + 37 1 4.1604183989925652 16.094045272033508 0.0041066596581296301 + 38 1 4.3026990680152561 18.60136097076888 2.2805405931001537 + 39 1 6.261382278666356 16.616433522287309 2.2252823569703586 + 40 1 5.9858217417055748 18.238999456344459 20.401736663340095 + 41 1 8.0221814043450497 20.467401998181849 0.11828652139203676 + 42 1 8.2673485991117772 2.1623037214670942 2.0780700510591945 + 43 1 10.26269037536971 20.372816716954208 2.0381091022111542 + 44 1 10.256112391321496 2.1303407679852095 0.054269374564588198 + 45 1 8.1670007054627209 3.9910545934375756 0.059806457774728164 + 46 1 8.2480233635213125 6.0638970584127518 1.9218898664697295 + 47 1 10.504554227950139 4.0884962539824734 1.9321497260938705 + 48 1 10.31555385270469 6.0582948537540124 19.885289022092238 + 49 1 8.2135883207683644 8.1468873745987018 20.404560466715051 + 50 1 8.1515355502719231 10.298479097169285 1.8013491547788099 + 51 1 10.230952705762135 8.1632622960451666 1.7685564354512311 + 52 1 10.100984981225425 10.360890130802156 20.513189115446306 + 53 1 8.252552022024096 12.360695683782323 20.290807550799958 + 54 1 7.9815061999080994 14.153052209499235 2.3980398295252243 + 55 1 10.227581129468948 12.352458932553491 1.9233289973026968 + 56 1 10.192727125079456 14.082480503050544 0.18908790068914708 + 57 1 8.3428467147997729 16.181149188338242 0.28490340723198371 + 58 1 8.286471030425405 18.305433791874297 1.8924882394596485 + 59 1 10.353942547377839 16.359097869618118 2.1033385652930296 + 60 1 10.361474552525499 18.476586753654967 0.29357154194181662 + 61 1 12.199128160579617 0.44931591204146532 0.046949453082189271 + 62 1 12.459498110068168 2.1719578602571179 2.2932897273555559 + 63 1 14.076145744249832 20.456080801950989 2.2033527379952775 + 64 1 14.292327656159305 2.1374077408882481 20.492715438975964 + 65 1 12.293332720594423 4.3221666986251712 20.391217132028039 + 66 1 12.255752084252423 6.276846891557704 1.921742312335518 + 67 1 14.511068949236341 4.0515461091339802 2.0669291138665762 + 68 1 14.465265167494463 6.0756228592977273 0.35472260232575764 + 69 1 12.273967806937677 8.1786585542281962 0.17923686226728489 + 70 1 12.459278226993227 10.185677641660458 1.8626920803599147 + 71 1 14.783152182650952 8.2913211923744417 1.9773822580553186 + 72 1 14.580566734665647 10.360933319008542 0.27629253904847961 + 73 1 12.134111138688116 12.480176985971854 0.044177881501088881 + 74 1 12.100002722783387 14.211691987308397 2.191598046489172 + 75 1 14.405841158016427 12.417120891236792 2.167791028552946 + 76 1 14.366938913466706 14.513920320908532 0.17511975742709657 + 77 1 11.996074507758392 16.280435878547696 0.036465873329793209 + 78 1 12.453464905156022 18.345783955162023 1.9971543866820127 + 79 1 14.493776875776417 16.184955710465893 2.1775406780194619 + 80 1 14.622933888191719 18.538931663305966 20.552594886845402 + 81 1 16.488745955470289 20.522182328343362 0.39004610307987791 + 82 1 16.232168955702146 2.1456234880991336 2.1654707153930994 + 83 1 18.472341836860785 0.052466498028896184 2.2271684812042989 + 84 1 18.354921018023607 2.0969676672649618 0.043060753857599963 + 85 1 16.559005203099655 4.1948324530370211 0.10090602797487314 + 86 1 16.569157993600015 6.2791536323237338 2.2655910285839962 + 87 1 18.599170838343014 4.2857180559649821 2.1161736023737685 + 88 1 18.152640657052473 6.1120448248454453 20.289260172868619 + 89 1 16.43246179803527 8.1575349127184911 0.052685034247012395 + 90 1 16.718129227630392 10.382841269645319 1.8518139672098726 + 91 1 18.441199455060321 8.2021333153896325 2.02396723358014 + 92 1 18.69214501772565 10.070363946602448 20.129368904510251 + 93 1 16.523381869981502 12.261208354675899 0.12243237603056388 + 94 1 16.398916336148037 14.298121389457805 2.24149861581295 + 95 1 18.918518318059974 12.214368084699949 2.0826266586974085 + 96 1 18.437842507455375 13.935667263854112 0.082044675859113653 + 97 1 16.454471571614345 16.220349028979907 0.042318926358861635 + 98 1 16.561841490828641 18.524681194048949 2.3146987646431816 + 99 1 18.269090402671587 16.369902768371755 2.2010492059135336 + 100 1 18.314946585388739 18.345622444054776 0.08444733622321228 + 101 1 20.485918855142394 20.517595676586087 4.2424606539678411 + 102 1 0.14590366797402635 2.2805445092361323 5.7773243381385262 + 103 1 2.0569542241100902 20.321372717316532 6.2089867128378824 + 104 1 1.8582676429643232 1.9659239890005311 4.0616904988842055 + 105 1 0.095623300316208512 4.3761963104116157 3.888861985436594 + 106 1 0.39236222882971972 6.4096940872894663 6.2974086398511639 + 107 1 1.9637075639242114 4.026823283191054 6.1186783248713876 + 108 1 2.2178235358847092 6.2837832571441758 4.1504785207098136 + 109 1 0.011717055187313904 7.8419272007118073 3.9026137058057007 + 110 1 0.27046914973395231 10.281408772949652 6.1781101548015771 + 111 1 2.3677528708981974 8.0085645355430568 6.2568752202179869 + 112 1 2.1991296387433001 9.7896429526568394 4.3007316685835955 + 113 1 0.29766647889106684 12.326704326519353 4.1284420684143557 + 114 1 0.021272641370257164 14.513896840510794 6.279295235816341 + 115 1 2.1111984511892943 12.23773769848688 6.3507488307342834 + 116 1 2.1762462473971929 14.468848233364895 4.1340542505208973 + 117 1 0.16944056706121463 16.470279804945125 4.3330221085064808 + 118 1 20.444500379866046 18.197367668514435 6.3130244633567498 + 119 1 2.3116647397623136 16.737725050883935 6.3474452462292525 + 120 1 2.1065575977535698 18.623482784932072 4.1574345130239116 + 121 1 4.1667336892741051 0.12125497034599451 3.885791260247792 + 122 1 3.9243417607105067 1.9658044806173818 6.1300322438878023 + 123 1 6.3043124567987405 0.047333842951203652 5.9278125035344313 + 124 1 6.0954961639139063 2.3745490720418383 3.9734613514536159 + 125 1 3.9786898756017872 4.1087715945660079 4.3582842389106844 + 126 1 4.2658840228813899 6.2711687833964795 6.131762686960136 + 127 1 6.2049009315884502 3.9509984717749513 6.426420197356026 + 128 1 5.9368066445103134 6.1985808772725655 4.1043978039848179 + 129 1 4.0155778167828418 8.1188416086114454 4.0875222743406914 + 130 1 4.1176997617291216 10.378162490889888 6.1275942457628219 + 131 1 6.111318987190872 8.5366730890402369 6.373627113700878 + 132 1 5.9683383261465623 10.080004405854341 3.8681940529485996 + 133 1 4.1738264419941231 12.268034483441118 3.8810998173067506 + 134 1 4.2538673831971003 14.464237093810928 6.0533997755382396 + 135 1 6.1761263512424005 12.254560652646317 6.2030736381358595 + 136 1 6.2282403141876941 14.443956339377436 4.2032408788136397 + 137 1 4.0753954862542843 16.416515657787336 4.0938906303146165 + 138 1 4.1027757307976822 18.475593602981963 6.2718441852456532 + 139 1 6.0958982425002182 16.350368335703443 6.0506645449852918 + 140 1 6.3740695719263938 18.652448014351037 4.0632330052199928 + 141 1 8.582581891833204 20.523063831603071 4.0574789217817813 + 142 1 8.0852942504234573 1.8246434361196902 5.9398578659577899 + 143 1 10.381461510760216 0.12112257494830156 6.2971290780730929 + 144 1 10.075381379842909 1.8363994771860543 4.1339145389046434 + 145 1 8.1773090573883103 4.1010041534211377 3.8174285983022145 + 146 1 8.0554772889267134 6.2733604151531424 6.2301215891289869 + 147 1 10.074207412322373 3.8875974222088185 6.0737289459500898 + 148 1 9.9723141192734932 6.1236298270642919 4.3391324415668286 + 149 1 8.2416700893272736 8.1007007377862479 3.9980444087264537 + 150 1 8.1326097569588676 10.213954684275743 6.1534686015280213 + 151 1 10.133715443389823 8.2941255893151471 6.1390882051472513 + 152 1 10.149525201809357 10.066038006504259 3.9125069238188672 + 153 1 8.1928067947739613 11.850842603055545 4.0258002648809539 + 154 1 8.3023525212831508 14.584793675513456 6.0299039572864066 + 155 1 10.088092081392563 11.935739114822375 5.9522302696126461 + 156 1 10.28934324053329 14.193472626168738 4.0335658371100536 + 157 1 8.4767475831188062 16.504382646784531 4.0721925530526519 + 158 1 8.1908224844275779 18.855748863618558 6.2631924542315733 + 159 1 10.262617264824682 16.602718718985344 6.2715732363512187 + 160 1 10.22055515423831 18.631694060855168 3.9985314725743266 + 161 1 12.255041021591845 20.306187297685703 4.2563473101492919 + 162 1 12.382556340755029 2.1989439575415157 5.9749217842494096 + 163 1 14.276738611542457 0.11844596465057107 6.1874011998307799 + 164 1 14.447705484319558 2.1913690281283342 4.0907190964345892 + 165 1 12.386556148221084 3.9889241137975411 4.0753816224221096 + 166 1 12.231390716123615 6.1799228531216599 6.2624347181692572 + 167 1 14.433570903470603 4.4011754066721167 6.2152471816482313 + 168 1 14.514488531452956 6.0062205488958549 4.0551330931761589 + 169 1 12.373434519873857 8.2436957911288093 4.1651534649625379 + 170 1 12.351906769417713 10.072272233810693 5.9345324361369789 + 171 1 14.53447131294929 8.2398003714460621 5.7911538821606445 + 172 1 14.25443962107815 10.505357344651602 4.2850713663183724 + 173 1 12.197066827091163 12.224795460000529 4.0405887276971839 + 174 1 12.297768470717747 14.733870271408842 6.2134324395477778 + 175 1 14.557258381738494 12.399072626816542 6.2135623176974004 + 176 1 14.261099895832514 14.343901919119753 4.4404467274914809 + 177 1 12.348970142073634 16.469078520188695 4.3201101961547526 + 178 1 12.212976989043458 18.446232404071999 6.3036059658252466 + 179 1 14.020801753776249 16.458110870387511 6.5189031473523631 + 180 1 14.275992290812781 18.389246316749993 4.3494665534390347 + 181 1 16.243520201219113 20.406467135672294 4.1345255528110911 + 182 1 16.378222974234081 1.949079091647685 6.1527610151916585 + 183 1 18.853335034455938 20.389426887554791 6.5882352193774523 + 184 1 18.296304104851504 2.0752789253848474 4.3256623117798831 + 185 1 16.505804572964852 4.1762982428687074 4.2012673732666892 + 186 1 16.643585812597617 6.4643662261201493 6.1543686115351006 + 187 1 18.576137637344004 4.4395012578833368 6.2362376004908073 + 188 1 18.575411292414969 6.1558623678935751 4.1867037496556003 + 189 1 16.631706957961409 8.1081456314734019 4.2903233113501598 + 190 1 16.478244923624729 10.106520529915043 5.9304273372766243 + 191 1 18.569036621644422 8.2683830133232448 6.1499173122942343 + 192 1 18.891891495796173 10.024744707213339 3.8185618062714175 + 193 1 16.697759355618469 12.450533882869699 4.0618925958123349 + 194 1 16.201354737766049 14.656585496828724 6.5936677044378849 + 195 1 18.244248705819089 12.424640283046964 6.3643926807586375 + 196 1 18.888643404917541 14.212186303261985 3.9731381940471415 + 197 1 16.361359364459364 16.336268461639708 4.3049370235251967 + 198 1 16.37663079124615 18.476808683590448 6.2172843075309947 + 199 1 18.342390390854117 16.32255991945356 6.072449382249256 + 200 1 18.440820868416907 18.609004440105803 4.3659562094808493 + 201 1 20.507141892731738 0.12837001966626921 8.3673656731778792 + 202 1 20.269340692029825 2.1647287339114958 10.507712326050424 + 203 1 2.0606560789558395 20.408753260873269 10.38529106052086 + 204 1 1.7142488623602394 1.7415561775967745 8.2900675486873858 + 205 1 20.366093936420359 4.2934733885016652 8.091520162045434 + 206 1 0.016012551943152372 6.362402293869156 9.9136691791443123 + 207 1 2.002734778769002 4.088000115110753 10.308179387001601 + 208 1 2.0566228325100218 6.0942984805146185 8.4366908242496521 + 209 1 0.012503559418419958 8.4847868118063356 8.1576671753187 + 210 1 20.398002579565553 10.657226967903494 10.492668811244943 + 211 1 1.9456817542998608 8.5787861255725666 10.337967127498416 + 212 1 2.1403673211067904 10.298371452694179 8.2190408139198752 + 213 1 0.055800894301672614 12.440970071366785 8.1314463239397767 + 214 1 0.2352992512016332 14.065110002491771 10.293818866155339 + 215 1 2.3227141793414585 12.500394977734111 10.390352007645035 + 216 1 2.0494323443731779 14.5279170094093 8.1157638197439343 + 217 1 0.20782007921890311 16.420081381999214 8.1882705378548017 + 218 1 0.11887314743095834 18.698794782315023 10.3819989976447 + 219 1 2.3304603886178525 16.351932293100173 10.094468797339818 + 220 1 2.0288848319525195 18.768381373006044 8.3512998529589524 + 221 1 4.0892901946994114 0.23392595835650895 8.0866875854845723 + 222 1 3.9179611675923414 1.8986556069433169 10.332601268012265 + 223 1 6.0511620912341817 20.410322146484457 10.124231119089092 + 224 1 6.1990237922544447 2.0537439770466253 8.6228818179309847 + 225 1 3.8684750204179279 3.7630681428888337 8.1771906769931455 + 226 1 4.0566227921485991 5.913506492347377 10.189796518606032 + 227 1 6.0880554163074949 4.2287738450086811 10.415578560644342 + 228 1 6.1588275913310699 6.1517362247723542 8.5180961995918061 + 229 1 4.1869246686846173 8.266707093965822 8.288224450522927 + 230 1 4.0490332766172505 10.507657067617892 10.345262844725063 + 231 1 6.0233046622710225 8.4623768361998604 10.384755266570146 + 232 1 6.1457728665952542 10.578233066355867 8.2698862108295259 + 233 1 4.2106001998447136 12.413316286097439 8.4528588010753882 + 234 1 4.3274358305170892 14.434911262655961 10.07022042908666 + 235 1 6.3143956240284407 12.533186830888198 10.422884402298486 + 236 1 6.4100870078425629 14.347227457176515 7.8802013413078473 + 237 1 4.3318085854431709 16.657687882088315 8.2938699444223012 + 238 1 4.0852464932927202 18.680847469282739 10.184703223052585 + 239 1 6.6425377527784564 16.58102825548119 10.200352137258911 + 240 1 6.2098706930844907 18.592764212625298 8.0246430366727477 + 241 1 8.0963151135637368 0.14648189747483592 8.3990558630070584 + 242 1 8.1760477913812668 1.8607422972305769 10.453555253942763 + 243 1 10.397659354625471 20.42069055500269 10.13748652456413 + 244 1 10.613849047356176 2.0585618539487682 8.2523439219449912 + 245 1 8.18312642041335 4.0200534393476195 8.3735504824772331 + 246 1 8.3341096186806976 6.3739229271287572 10.071747450011333 + 247 1 10.460608680685267 4.1538071823283298 10.361841605902972 + 248 1 10.402339332237174 5.9350701182332024 8.2935151773911571 + 249 1 8.3731356213874104 8.554928745939625 8.1734938248758997 + 250 1 8.0824901646140983 10.39451291615288 10.145797488814786 + 251 1 10.030696788587209 8.3525460842447394 10.530535589629634 + 252 1 10.417563390286894 10.400473152338325 8.3248561514549007 + 253 1 8.6415413085038892 12.421565002501778 8.3492299765990481 + 254 1 8.2546877974566488 14.420270513082297 10.448906967610155 + 255 1 10.369465952616732 12.34670751426062 10.191573020763078 + 256 1 10.424048791187856 14.446623803943753 8.1937866371942079 + 257 1 8.1736593498436321 16.591547899144345 7.9877100910005918 + 258 1 8.3387599494715268 18.44633828752108 10.391565580968573 + 259 1 10.111458051890352 16.264231907787853 10.178316359520879 + 260 1 10.383072567425492 18.661457953417294 8.1193155802085339 + 261 1 12.515066249331468 0.3016554673208226 8.2781519721805381 + 262 1 12.44354459057209 1.9523222196760426 10.454876167974136 + 263 1 14.379919671165423 20.544638957989296 10.176940290189989 + 264 1 14.297429580446616 2.3781755438985064 8.2248030748611267 + 265 1 12.14504712459636 4.060010227476047 8.0167466467387296 + 266 1 12.234529930215324 6.3697369836579378 10.261960955878742 + 267 1 14.257749015247384 4.2321067557897951 10.409066417808992 + 268 1 14.102443689417427 6.4748488029419411 8.0306983562630485 + 269 1 11.951009875682338 8.2588606981814809 8.1851962096575246 + 270 1 12.373728389424544 10.33555106331206 10.25850726861313 + 271 1 14.136991571711581 8.3479888180277424 10.110546102447209 + 272 1 14.412667318522152 10.398287623692321 7.7439825526384496 + 273 1 12.381249186677723 12.193901195009515 7.8455301788702938 + 274 1 12.465868628984593 14.294241385319012 10.404547611954088 + 275 1 14.40094236717335 12.286326926852949 10.426051073568321 + 276 1 14.065027818829554 14.018155546313396 8.4703116726107162 + 277 1 12.05950042966044 16.604977068461995 8.4220246687746432 + 278 1 12.260402330257261 18.573056762209806 10.375181052041368 + 279 1 14.131774924100704 16.50155249097995 10.229838302448655 + 280 1 14.253233370794243 18.785051349072184 8.059281144931262 + 281 1 16.716392894008834 20.4993940114236 8.0674049119935614 + 282 1 16.512992330212967 2.2028129280925839 10.435731995545092 + 283 1 18.406632634703989 0.01196372326761394 10.344651810282164 + 284 1 18.513883973723136 2.4659484063635499 7.9040525653664604 + 285 1 16.500829692924547 4.3995661416534686 8.1744834999618181 + 286 1 16.368350329910772 6.3435687615905128 10.226049821276581 + 287 1 18.189468335119397 4.3228545977543362 10.095327878441211 + 288 1 18.663486516343866 6.3207156349892841 8.2711614742914055 + 289 1 16.471798533177562 8.4921115217980283 8.4012006458695883 + 290 1 16.284241168186085 10.345910300005944 10.484354598583788 + 291 1 18.424334347259816 8.4559231516742734 10.214465910094065 + 292 1 18.415797825877096 10.38453843107165 8.3406068550392778 + 293 1 16.430637997192768 12.36956610377044 8.1337921994898608 + 294 1 16.534730468767666 14.706506767472161 10.265445305306217 + 295 1 18.469193830108502 12.525070397075668 10.003493575864434 + 296 1 18.423413116582864 14.639564770451738 8.3874191090938286 + 297 1 16.616046309538071 16.702395721456831 8.5314334537838583 + 298 1 16.406791039832608 18.661974912218817 10.241357870678682 + 299 1 18.746529738885386 16.448406927422635 10.387757607359601 + 300 1 18.58151595219601 18.353377959947991 8.4847222221692338 + 301 1 20.455622648469998 20.452321682260479 12.362515143005522 + 302 1 20.524404764322743 2.0975687193341188 14.277508978502556 + 303 1 2.0781193131258946 0.028556184690114478 14.081779609106638 + 304 1 2.030488416246667 2.2103823833464391 12.411817363872958 + 305 1 0.41454986324599419 4.4268889338818749 12.154179600842863 + 306 1 0.074484506776184997 6.1914168755496366 14.22931928395076 + 307 1 2.5799412204104835 4.3056510290000709 14.399568556826829 + 308 1 2.0009489370437383 6.3228127984697418 12.044390852745979 + 309 1 0.28198499011875428 8.5779041703947456 12.317848474419707 + 310 1 20.428468109594135 10.129266211386524 14.541261522170224 + 311 1 2.2668225806420046 8.4970595530814972 14.357708796423529 + 312 1 2.1112611463877116 10.406534220435077 12.131998744761406 + 313 1 0.03532430456214547 12.387073071730255 12.429439568011039 + 314 1 0.19532810694418887 14.285685804683657 14.472677543510251 + 315 1 1.9257571372395572 11.998449555490236 14.547237111752802 + 316 1 2.267435500109686 14.465197229119598 12.363419406984656 + 317 1 20.485244148719829 16.276802507978552 12.500646295989899 + 318 1 20.428038002936841 18.53613926131133 14.463958906763992 + 319 1 2.1166247961363402 16.480054683227056 14.492357939715893 + 320 1 2.1478527449521105 18.33877683875237 12.261767994288624 + 321 1 4.366346312504696 20.128457717231676 12.522239654180238 + 322 1 4.3968966196818444 2.1002347154652345 14.494871177654987 + 323 1 6.1711377306491659 0.084784438450716121 14.371161451571238 + 324 1 5.8919395710805063 1.6655801313210596 12.16455067488674 + 325 1 4.0678223121240435 3.9702319424205932 12.018597103364542 + 326 1 4.3737998921444321 6.213734955112332 14.408483917546338 + 327 1 6.3607423426909246 4.1047242922968303 14.016553361929326 + 328 1 6.1816246376882464 6.3072316673334683 12.36606279826481 + 329 1 4.0916982135989972 8.2010746122130005 12.250994919100682 + 330 1 3.9274338282448786 10.569974214532055 14.22959743511683 + 331 1 6.5780306785799612 8.261957835124953 14.342059831379709 + 332 1 6.2551166462573526 10.40066209756276 12.249541681106571 + 333 1 4.0660655750180812 12.573645002310091 12.264157855855228 + 334 1 3.9201329061331514 14.292733158011258 14.612475409060188 + 335 1 6.2189743954338415 12.343964009444564 14.318975050401535 + 336 1 6.0073632598655484 14.679309497990639 12.093514484594756 + 337 1 4.1452254644951667 16.68895325543318 12.144735386176491 + 338 1 4.3458445048525984 18.336316116004856 14.418661826841582 + 339 1 6.2588666265745738 16.164373719354554 14.46787034512351 + 340 1 6.218662249846008 18.310023358769612 12.245998974622703 + 341 1 8.1274497823037688 20.435968459267066 12.370832396001417 + 342 1 8.2232498443128907 1.9490322336530179 14.133153364323386 + 343 1 10.285871472115513 20.525017742619873 14.276223515053339 + 344 1 10.123411858886636 1.8456458957122204 12.242416932887508 + 345 1 8.3282699634128097 4.1772514522406397 12.140972473350635 + 346 1 8.3987425827203328 6.2226290038362979 14.265325725491085 + 347 1 10.253244009034123 4.2237604090365268 14.686279275150715 + 348 1 10.493663072241578 6.1206121360629986 12.203540080356582 + 349 1 8.1111701765200106 8.3615433089589963 12.280738632793978 + 350 1 8.2843015361442447 10.324248987072314 14.593133981116599 + 351 1 10.153949361809484 8.2717609845992435 14.125574966594094 + 352 1 10.486203665975211 10.642501171813413 12.099093326056611 + 353 1 8.1104762011214504 12.373888599854498 12.368539511833031 + 354 1 8.2589441616274026 14.515035121930685 14.138517416688048 + 355 1 10.254461958079064 12.336104478834143 14.406107827666178 + 356 1 10.251363998792725 14.350767278146737 12.425986026478121 + 357 1 8.3221029770340262 16.394077127390624 12.312803943012357 + 358 1 8.5928953781561468 18.437805471352011 14.672606200325387 + 359 1 10.192775508487182 16.457078792408112 14.493761028503764 + 360 1 10.377849437342963 18.486142843649997 12.341952979514856 + 361 1 12.277301161532634 20.440624496992779 12.337186326072523 + 362 1 12.413585208543115 1.634540109806921 14.582323587103568 + 363 1 14.603481184875818 20.425186299441876 14.599670965064359 + 364 1 14.453271826305581 1.6162701395639607 12.297819754662134 + 365 1 12.101776623966211 4.050732214453876 12.599409990692003 + 366 1 12.508681673619041 6.5074794709432622 14.363316522160673 + 367 1 14.410225737136772 4.0604808363591127 14.523272010266352 + 368 1 14.255532199579271 6.31941802711391 12.244980990202002 + 369 1 12.342080571071378 8.2942514665516001 12.382572047108283 + 370 1 12.404520109827335 10.186003397913771 14.274308739730101 + 371 1 14.390929364251409 8.4183345740912667 14.607105468094646 + 372 1 14.255194361840939 10.071284474702155 12.33221192579318 + 373 1 12.494522772157431 12.566313917682704 12.586807026384502 + 374 1 12.397224293884237 14.741204174971891 14.439315047739312 + 375 1 14.436114678189929 12.162530789364226 14.569309474516574 + 376 1 14.607733074510232 14.794182227555485 12.390433421758784 + 377 1 12.429892114640628 16.761059453555994 12.603888400242822 + 378 1 12.506590234791874 18.680891777984453 14.380174717215386 + 379 1 14.490160004198744 16.646302419788491 14.771916200804149 + 380 1 14.407453154667705 18.715761323605463 12.23892043185386 + 381 1 16.381078574497739 20.507249477574796 12.506528783335748 + 382 1 16.195292355642021 2.1045418647358307 14.474315206520009 + 383 1 18.565052977669421 20.452273213717959 14.282095733179288 + 384 1 18.511955419176029 2.5689551535508426 12.359574069558132 + 385 1 16.332926194873501 4.2170386337952781 12.437040625680666 + 386 1 16.450974428390463 6.4583485269882255 14.087737786340931 + 387 1 18.599417851130337 4.5582396229790696 13.989752855259983 + 388 1 18.659179669779302 6.6536865568746366 12.125544474770692 + 389 1 16.399777412106257 8.1850107647742778 12.262983090845788 + 390 1 16.482754831617257 10.330013468552863 14.355900701337342 + 391 1 18.602366280517273 8.10898552898764 14.29797011561981 + 392 1 18.555042041622048 10.253341180477838 12.305087540038281 + 393 1 16.508818631483567 12.498491484142839 12.243666925691988 + 394 1 16.393676348418847 14.33978727182711 14.594962214743445 + 395 1 18.322440761881133 12.36846611823993 14.421405557648711 + 396 1 18.577242078796925 14.266448812926978 12.170943847884484 + 397 1 16.59621807390511 16.711526391875225 12.51596337179927 + 398 1 16.512615680533706 18.646284219143087 14.312116130717664 + 399 1 18.388297593338542 16.302859462731377 14.417031266145559 + 400 1 18.762010841266012 18.36361409494695 12.131295392785452 + 401 1 0.26028251966180349 20.504351164078756 16.240549558830526 + 402 1 0.023280456394884561 1.5461507406655097 18.622213645525918 + 403 1 2.1748231056872522 20.259198925532733 18.387874804972274 + 404 1 2.1972340473810643 2.174604547415357 16.292302812261109 + 405 1 20.358046922713683 3.973532555203751 16.287151235128153 + 406 1 20.3722190437345 5.9251254366928165 18.42768845235938 + 407 1 1.9955421028271336 3.9936879744543914 18.43550176928651 + 408 1 1.8315929715656096 6.2234928113829096 16.306376053443955 + 409 1 20.279583095048178 8.1376971813169856 16.311843414188388 + 410 1 20.512204315921878 10.166004470170673 18.248053148893234 + 411 1 1.7162801127981149 7.9894604763828951 18.321850044339588 + 412 1 1.9942421116773623 10.147297811374925 16.653527731571025 + 413 1 20.39109626424408 12.481644895202017 16.519228209777342 + 414 1 20.521344417405302 14.224092604892908 18.544398672928946 + 415 1 2.1502455133721976 12.332156164821454 18.567555772991515 + 416 1 2.1077867069315799 14.267397263448427 16.334988843530702 + 417 1 0.11016527536302832 16.482617194854328 16.416825943100815 + 418 1 20.539109123946037 18.638631423040366 18.408427576571455 + 419 1 2.1683252908261208 16.092634588642248 18.54523571437511 + 420 1 1.9646942217054257 18.51556779487775 16.166967029838034 + 421 1 4.1674183630536943 20.400724096555884 16.340347276550624 + 422 1 4.0348452334000271 1.9193758713100799 18.615743697927407 + 423 1 6.2072908083532354 20.49766809541342 18.507696175544144 + 424 1 6.2161902566925562 1.8073238415966351 16.355151415147212 + 425 1 4.1957707012674765 4.0766719234936515 16.503192626899537 + 426 1 3.876451446889337 6.165676289005436 18.251395366999422 + 427 1 5.9980001627015955 3.9563901197579159 18.621593776023801 + 428 1 6.0995766531431084 6.0491173644299385 16.305707604788669 + 429 1 4.1395722172899685 7.9708701288977402 16.596242726842608 + 430 1 4.1744100911498494 10.196182178161806 18.585183379783125 + 431 1 6.0785706740263166 7.8855836159602584 18.550241656268888 + 432 1 5.8362485179901071 10.178193014873791 16.415696825090645 + 433 1 3.9040995226479054 12.135724543804523 16.4030201304926 + 434 1 4.4416472412843122 14.2741152861408 18.211522579703249 + 435 1 6.038755566090984 12.218048681232217 18.839959589458726 + 436 1 6.1997411211345161 14.175223463336149 16.282300198030232 + 437 1 4.1541997501522614 16.525454628676947 16.264978577371796 + 438 1 4.032815647813945 18.446457758441724 18.495508937069342 + 439 1 6.2326437090675837 16.772044543998504 18.264603579319111 + 440 1 6.4096331991280735 18.573956542576287 16.358319988492603 + 441 1 8.4381796612393476 20.41516761587172 16.522303373912465 + 442 1 8.3684843068856818 1.8755866884220715 18.231232131022523 + 443 1 10.476305358301516 0.020921289133581048 18.603270118472739 + 444 1 10.345097109561488 2.2764405840151922 16.22072855080285 + 445 1 8.1012903688055697 3.9258575118777381 16.114468686341272 + 446 1 7.9611751373379072 5.6519487749571784 18.469118234229708 + 447 1 10.251566307365273 4.1147108626500222 18.239599729014465 + 448 1 10.432921982697023 6.4007729704385756 16.706508192589144 + 449 1 8.2230289435124639 8.1154266063945695 16.674694513660551 + 450 1 8.0351697630769863 10.407709241049471 18.60060708877587 + 451 1 10.48780870486782 8.6048796458598886 18.716960660222487 + 452 1 10.159820032858757 9.8725371736559033 16.456608467276109 + 453 1 8.2627828526104139 12.114172540262235 16.412797188192183 + 454 1 7.9796175204214475 14.176885009061728 18.498001530435634 + 455 1 10.586414552907561 12.587484809615582 18.270268244923752 + 456 1 10.269310514976935 14.358303938837304 16.391881262522606 + 457 1 8.406001659110732 16.363767404312977 16.585813630124786 + 458 1 8.1594822593747693 18.65621383551338 18.781312950789435 + 459 1 10.063224803707708 16.049757980798489 18.593530990096674 + 460 1 10.293548354608966 18.568303778506518 16.792174937837654 + 461 1 12.512899817264152 20.536462890339259 16.854161016029199 + 462 1 12.38260747802077 1.9231865999940752 18.492472161743063 + 463 1 14.348972575962195 0.049292072175817429 18.869555877656641 + 464 1 14.551513619215843 2.0968356337214247 16.58437705843329 + 465 1 12.449407986465641 4.1661828724942147 16.266660547724278 + 466 1 12.600698230992588 6.5580860326203121 18.446311102145064 + 467 1 14.314069238926599 4.1417526490724041 18.560520970246809 + 468 1 14.387332900401464 6.4145423227991811 16.308377025560944 + 469 1 12.281380624501638 8.6081923685250796 16.558469195531885 + 470 1 12.513473556805341 10.192870054483118 18.85703169006263 + 471 1 14.637827868035957 8.2021274513758193 18.584778338227238 + 472 1 14.566860849111057 10.152438386629685 16.67142180661844 + 473 1 12.050165387502343 11.939457098195433 16.061183709547585 + 474 1 12.308390045634283 14.537709055531479 18.320447796564594 + 475 1 14.033378409041875 12.381139727718088 18.700708495073151 + 476 1 14.012663507858086 14.070598910797468 16.5141489808566 + 477 1 12.313659646292633 16.60759392261966 16.573387545463252 + 478 1 12.193989843125207 18.222350942742626 18.639131135849318 + 479 1 14.326901469032101 16.507286486298273 18.675521761905046 + 480 1 14.535198733079433 18.616613800831662 17.1174438151135 + 481 1 16.543030346658337 20.465212243785452 16.696393816164921 + 482 1 16.395896656394637 2.122231420997267 18.610019151496644 + 483 1 18.425262252910432 20.232415471130622 18.714041450366199 + 484 1 18.639537379356373 1.8045907559716277 16.348406166239595 + 485 1 16.385428433883948 4.2867062073747704 16.434613985184733 + 486 1 16.28000099963522 6.1280709286790938 18.447925182226903 + 487 1 18.515990279542905 3.9123288011025963 18.257498218379357 + 488 1 18.492096503799427 6.214086334857349 16.206408806947458 + 489 1 16.514295061120645 8.3059998452363537 16.217557255947934 + 490 1 16.638499744079326 10.300864798783108 18.426251588987874 + 491 1 18.178980433465433 8.1452943243840181 18.371366135097841 + 492 1 18.497945532979926 10.362876058449066 16.5703414959988 + 493 1 16.298507108818825 12.45508285721476 16.841585752240356 + 494 1 16.283253822790293 14.144519784597577 18.528904392248258 + 495 1 18.62569368551863 12.465846066127956 18.452264868487017 + 496 1 18.622246560760136 14.363454977316087 16.387559632833895 + 497 1 16.186937478257061 16.047132154998234 16.637317431421646 + 498 1 16.61460403910662 18.499379237576711 18.573536848756849 + 499 1 18.530679434067164 16.368989937130557 18.452979381497602 + 500 1 18.328412413841122 18.215436307084065 16.545829099879903 diff --git a/tests/test_composition.py b/tests/test_composition.py new file mode 100644 index 0000000..061e119 --- /dev/null +++ b/tests/test_composition.py @@ -0,0 +1,14 @@ +import pytest +from calphy.composition_transformation import CompositionTransformation + +def test_composition(): + alc = CompositionTransformation("tests/conf1.data", {"Al": 500}, {"Al": 496, "Li": 1, "C": 2, "O": 1}) + assert alc.mappingdict['1-1'] == 1 + assert alc.mappingdict['1-2'] == 2 + assert alc.mappingdict['1-3'] == 3 + assert alc.mappingdict['1-4'] == 4 + assert len(alc.unique_mappings) == 4 + assert alc.unique_mapping_counts[0] == 496 + a, b = alc.update_pair_coeff("pair_coeff * * filename Al Li") + assert a == 'pair_coeff * * filename Al Al Al Al' + assert b == 'pair_coeff * * filename Al Li C O' \ No newline at end of file