def test_molecular(): global outstructs global outstrings print( "=== Testing generation of molecular 3D crystals. This may take some time. ===" ) from time import time from spglib import get_symmetry_dataset from pyxtal.symmetry import get_wyckoffs from pyxtal.crystal import cellsize from pyxtal.molecular_crystal import molecular_crystal from pymatgen.symmetry.analyzer import SpacegroupAnalyzer slow = [] failed = [] print(" Spacegroup # |Generated (SPG)|Generated (PMG)| Time Elapsed") skip = ( [] ) # [24, 183, 202, 203, 209, 210, 216, 219, 225, 226, 227, 228, 229, 230] #slow for sg in range(1, 231): if sg not in skip: multiplicity = len(get_wyckoffs(sg)[0]) / cellsize( sg) # multiplicity of the general position start = time() rand_crystal = molecular_crystal(sg, ["H2O"], [multiplicity], 2.5) end = time() timespent = np.around((end - start), decimals=2) t = str(timespent) if len(t) == 3: t += "0" t += " s" if timespent >= 1.0: t += " ~" if timespent >= 3.0: t += "~" if timespent >= 10.0: t += "~" if timespent >= 60.0: t += "~" slow.append(sg) if rand_crystal.valid: check = False ans1 = get_symmetry_dataset(rand_crystal.spg_struct, symprec=1e-1) if ans1 is None: ans1 = "???" else: ans1 = ans1["number"] sga = SpacegroupAnalyzer(rand_crystal.struct) ans2 = "???" if sga is not None: try: ans2 = sga.get_space_group_number() except: ans2 = "???" if ans2 is None: ans2 = "???" # Compare expected and detected groups if ans1 == "???" and ans2 == "???": check = True elif ans1 == "???": if int(ans2) > sg: pass elif ans2 == "???": if int(ans1) > sg: pass else: if ans1 < sg and ans2 < sg: if compare_wyckoffs(sg, ans1) or compare_wyckoffs( sg, ans2): pass else: check = True # output cif files for incorrect space groups if check is True: if check_struct_group(rand_crystal, sg, dim=3): pass else: t += " xxxxx" outstructs.append(rand_crystal.struct) outstrings.append( str("3D_Molecular_" + str(sg) + ".vasp")) print("\t" + str(sg) + "\t|\t" + str(ans1) + "\t|\t" + str(ans2) + "\t|\t" + t) else: print("~~~~ Error: Could not generate space group " + str(sg) + " after " + t) failed.append(sg) if slow != []: print( "~~~~ The following space groups took more than 60 seconds to generate:" ) for i in slow: print(" " + str(i)) if failed != []: print("~~~~ The following space groups failed to generate:") for i in failed: print(" " + str(i))
def test_molecular_2D(): global outstructs global outstrings print("=== Testing generation of molecular 2D crystals. This may take some time. ===") from time import time from spglib import get_symmetry_dataset from pyxtal.symmetry import get_layer from pyxtal.crystal import cellsize from pyxtal.molecular_crystal import molecular_crystal_2D from pyxtal.database.layergroup import Layergroup from pymatgen.symmetry.analyzer import SpacegroupAnalyzer slow = [] failed = [] print(" Layergroup | sg # Expected |Generated (SPG)|Generated (PMG)|Time Elapsed") skip = []#12, 64, 65, 80] #slow to generate for num in range(1, 81): if num not in skip: sg = Layergroup(num).sgnumber multiplicity = len(get_layer(num)[0]) / cellsize(sg) #multiplicity of the general position start = time() rand_crystal = molecular_crystal_2D(num, ['H2O'], [multiplicity], 4.0) end = time() timespent = np.around((end - start), decimals=2) t = str(timespent) if len(t) == 3: t += "0" t += " s" if timespent >= 1.0: t += " ~" if timespent >= 3.0: t += "~" if timespent >= 10.0: t += "~" if timespent >= 60.0: t += "~" slow.append(num) if rand_crystal.valid: check = False ans1 = get_symmetry_dataset(rand_crystal.spg_struct, symprec=1e-1) if ans1 is None: ans1 = "???" else: ans1 = ans1['number'] sga = SpacegroupAnalyzer(rand_crystal.struct) ans2 = "???" if sga is not None: try: ans2 = sga.get_space_group_number() except: ans2 = "???" if ans2 is None: ans2 = "???" #Compare expected and detected groups if ans1 == "???" and ans2 == "???": check = True elif ans1 == "???": if int(ans2) > sg: pass elif ans2 == "???": if int(ans1) > sg: pass else: if ans1 < sg and ans2 < sg: if compare_wyckoffs(sg, ans1) or compare_wyckoffs(sg, ans2): pass else: check = True #output cif files for incorrect space groups if check is True: if check_struct_group(rand_crystal.struct, num, dim=2): pass else: t += " xxxxx" outstructs.append(rand_crystal.struct) outstrings.append(str("2D_Molecular_"+str(num)+".vasp")) print("\t"+str(num)+"\t|\t"+str(sg)+"\t|\t"+str(ans1)+"\t|\t"+str(ans2)+"\t|\t"+t) else: print("~~~~ Error: Could not generate layer group "+str(num)+" after "+t) failed.append(num) if slow != []: print("~~~~ The following layer groups took more than 60 seconds to generate:") for i in slow: print(" "+str(i)) if failed != []: print("~~~~ The following layer groups failed to generate:") for i in failed: print(" "+str(i))