class RelaxationAnalyzerTest(unittest.TestCase): def setUp(self): p = Poscar.from_file(os.path.join(test_dir, 'POSCAR.Li2O'), check_for_POTCAR=False) s1 = p.structure p = Poscar.from_file(os.path.join(test_dir, 'CONTCAR.Li2O'), check_for_POTCAR=False) s2 = p.structure self.analyzer = RelaxationAnalyzer(s1, s2) def test_vol_and_para_changes(self): for k, v in self.analyzer.get_percentage_lattice_parameter_changes().items(): self.assertAlmostEqual(-0.0092040921155279731, v) latt_change = v vol_change = self.analyzer.get_percentage_volume_change() self.assertAlmostEqual(-0.0273589101391, vol_change) # This is a simple cubic cell, so the latt and vol change are simply # Related. So let's test that. self.assertAlmostEqual((1 + latt_change) ** 3 - 1, vol_change) def test_get_percentage_bond_dist_changes(self): for k, v in self.analyzer.get_percentage_bond_dist_changes().items(): for k2, v2 in v.items(): self.assertAlmostEqual(-0.009204092115527862, v2)
def check_relaxation(mat, new_style_mat): final_structure = Structure.from_dict(new_style_mat["structure"]) warnings = [] # Check relaxation for just the initial structure to optimized structure init_struc = new_style_mat["initial_structure"] orig_crystal = Structure.from_dict(init_struc) try: analyzer = RelaxationAnalyzer(orig_crystal, final_structure) latt_para_percentage_changes = ( analyzer.get_percentage_lattice_parameter_changes() ) for l in ["a", "b", "c"]: change = latt_para_percentage_changes[l] * 100 if change < latt_para_interval[0] or change > latt_para_interval[1]: warnings.append( "Large change in a lattice parameter during relaxation." ) change = analyzer.get_percentage_volume_change() * 100 if change < vol_interval[0] or change > vol_interval[1]: warnings.append("Large change in volume during relaxation.") except Exception as ex: # print icsd_crystal.formula # print final_structure.formula print( "Relaxation analyzer failed for Material:{} due to {}".format( mat["task_id"], traceback.print_exc() ) ) mat["warnings"] = list(set(warnings))
def get_percentage_volume_change(self, n): """ Volume change after the introduction of interstitial Args: n: index of interstitials """ def_struct = self._structs[n:n + 1][0] def_struct.remove(-1) rv = RelaxationAnalyzer(self._blk_struct, def_struct) return rv.get_percentage_volume_change()
def get_percentage_volume_change(self, n): """ Volume change after the introduction of interstitial Args: n: Symmetrically distinct interstitial index """ if not self._relax_struct: self._relax_analysis() blk_struct = self._relax_struct[0] #print blk_struct def_struct = self._relax_struct[n + 1:n + 2][0] #print def_struct def_struct.remove(-1) rv = RelaxationAnalyzer(blk_struct, def_struct) return rv.get_percentage_volume_change()
def add_icsd(mat, icsds): relevant_icsd = [ icsd for icsd in icsds if icsd["icsd_id"] in mat.get("icsd_ids", []) ] results = [] for icsd in relevant_icsd: result = {"warnings": []} tags = [ icsd[t] for t in ["chem_name", "min_name"] if t in icsd and icsd[t] ] result["exp"] = {'pressure': icsd["pressure"], 'tags': tags} if icsd.get('pressure', 0) > 1: result["warnings"].append("High pressure experimental phase.") results.append(result) if len(results) == 0: results.append({ "warnings": ["Structure has been removed in the 2012 version of ICSD."], "exp": {} }) if mat["icsd_ids"]: results[0]["exp_lattice"] = mat["snl"]["lattice"] # Check relaxation orig_crystal = Structure.from_dict(mat["snl"]) final_structure = Structure.from_dict(mat["structure"]) try: analyzer = RelaxationAnalyzer(orig_crystal, final_structure) latt_para_percentage_changes = analyzer.get_percentage_lattice_parameter_changes( ) for l in ["a", "b", "c"]: change = latt_para_percentage_changes[l] * 100 if change < latt_para_interval[0] or change > latt_para_interval[1]: results[0]["warnings"].append( "Large change in {} lattice parameter during relaxation.". format(l)) change = analyzer.get_percentage_volume_change() * 100 if change < vol_interval[0] or change > vol_interval[1]: results[0]["warnings"].append( "Large change in volume during relaxation.") except Exception as ex: # print icsd_crystal.formula # print final_structure.formula print("Relaxation analyzer failed for Material:{} due to {}".format( mat["task_id"], traceback.print_exc())) # Merge all the results if len(results) > 1: results_union = {"exp": {"tags": []}, "warnings": []} tags = [] warnings = [] for i in results: if i.get("exp_lattice"): results_union["exp_lattice"] = i["exp_lattice"] if i.get("exp"): if i["exp"].get("tags"): tags.extend(i["exp"]["tags"]) if i.get("warnings"): warnings.extend(i["warnings"]) if tags: results_union["exp"]["tags"] = [i for i in set(tags)] if warnings: high_pressure_count = 0 for w in warnings: if w == "High pressure experimental phase.": high_pressure_count += 1 results_union["warnings"] = [i for i in set(warnings)] if high_pressure_count != 0 and high_pressure_count != len( mat.get("icsd_ids", [])): results_union["warnings"].remove( "High pressure experimental phase.") results = results_union else: results = results[0] if results.get("exp_lattice"): mat["exp_lattice"] = results["exp_lattice"] mat["exp"] = results["exp"] mat["warnings"] = results["warnings"]
Voronoi = VoronoiCoordFinder(s2, target=None) site = s2.num_sites #print("s2[0]:",s2.sites) print("s2_cart_coords[0]", s2.cart_coords[0]) #print("s2_distance_(0,1)",s2.get_distance(0,1)) polyhedra = Voronoi.get_voronoi_polyhedra(1) coordinate = Voronoi.get_coordination_number(1) coordinate_sites = Voronoi.get_coordinated_sites(1) Voronoi_Analyzer = VoronoiAnalyzer() anay = Voronoi_Analyzer.analyze(s1, n=0) strucs = [s1, s2] anays = Voronoi_Analyzer.analyze_structures(strucs) print("Voronoi_Analyzer.analyze(s1,n=0):", anay) #plt = Voronoi_Analyzer.plot_vor_analysis(anays) relax = RelaxationAnalyzer(s1, s2) volume_change = relax.get_percentage_volume_change() lattice_parameter_changes = relax.get_percentage_lattice_parameter_changes() print('initial volume:', s1.volume) print('final volume:', s2.volume) print("percent_volume_change:", volume_change) print("percent_lattice_change:", lattice_parameter_changes) bond_dist = relax.get_percentage_bond_dist_changes(max_radius=6) print("percent_bond_distance_change:", bond_dist) connec = VoronoiConnectivity(s2) #print("connec.get_connections():",connec.get_connections()) #A_222_dopant = [0] A_222_dopant_neighbour = [[69, 73], [68, 72], [63, 65], [62, 64], [64, 65], [62, 63], [72, 73], [68, 69]] A_222_dopant_neighbour_MA_I_a = [[69, 73], [68, 72], [59, 61], [58, 60], [60, 61], [58, 59], [68, 69], [72, 73]]