From fabcee5d272402a61b668636f3f7056b29eb6795 Mon Sep 17 00:00:00 2001 From: Aditya Wibawa Sakti Date: Sun, 14 Aug 2022 20:25:18 +0700 Subject: [PATCH] mod README --- README.md | 6 ++-- bin/cmmdepost.py | 72 +++++++++++++++++++++++++++++------------------- cmmde_gui/gui.py | 47 ++++++++++++++++++++++--------- 3 files changed, 80 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index 3c71633..ccdc11c 100644 --- a/README.md +++ b/README.md @@ -22,9 +22,6 @@ CMMDE is a set of tools based on Python for running computational jobs, as well Tahap kedua peluncuran CMMDE, didahului workshop: -**Senin, 15 Agustus 2022 (10:00 WIB):**
-Penyiapan Server Komputasi
-Tautan: [https://mki.ac/CMMD-server](https://mki.ac/CMMD-server) **Selasa, 16 Agustus 2022 (13:00 WIB):**
Workshop on Text-Based CMMDE
@@ -40,6 +37,9 @@ Launching Consortium on Computational Science Development
(Konsorsium Pengembangan Sains Komputasi)
Tautan: [https://mki.ac/cmsd-launch]( https://mki.ac/cmsd-launch) +**Kamis, 18 Agustus 2022 (13:00 WIB):**
+Penyiapan Server Komputasi
+Tautan: [https://mki.ac/CMMD-server](https://mki.ac/CMMD-server) Informasi lebih lanjut: cmmde@mki.or.id diff --git a/bin/cmmdepost.py b/bin/cmmdepost.py index 6bee52e..4866f62 100755 --- a/bin/cmmdepost.py +++ b/bin/cmmdepost.py @@ -63,7 +63,7 @@ ev2kcal = 23.060541945329334 Ha2kj = 2625.5 ev2kj = 96 # Analisis Output - +method = opt.method if opt.job == 'sp' and opt.software == 'orca' and not (opt.method == 'XTB' or opt.method == 'XTB2'): if os.path.isfile('cmmd.out'): with open('cmmd.out','r') as f: @@ -101,6 +101,7 @@ elif opt.job == 'sp' and opt.software == 'orca': if opt.job == 'opt' and opt.software == 'orca': Energy = [] Gradient = [] + TotalEnergy = [] if os.path.isfile('cmmd.out'): with open('cmmd.out','r') as f: for line in f: @@ -110,35 +111,48 @@ if opt.job == 'opt' and opt.software == 'orca': if "Current gradient" in line: arr = line.split() Gradient.append(float(arr[4])) - Optstep = range(0,len(Energy)) - - with open('cmmd.out','r') as f: - lines = f.readlines() - occ = [] - energy = [] - for index,line in enumerate(lines): - if 'Basis Dimension' in line: + if "TOTAL ENERGY" in line: arr = line.split() - NBas = int(arr[4]) - if 'ORBITAL ENERGIES' in line: - for i in range(NBas): - arr = lines[index+i+4].split() - occ.append(arr[1]) - energy.append(float(arr[3])) - Eocc = [] - Evir = [] - for energy in energy: - if energy > 0: - Evir.append(energy) - if energy < 0: - Eocc.append(energy) - E_HOMO = max(Eocc) - E_LUMO = min(Evir) - print('######INFORMASI ENERGI HOMO & LUMO######') - print('Energi HOMO = {:.2f} eV'.format(E_HOMO)) - print('Energi LUMO = {:.2f} eV'.format(E_LUMO)) - print('Gap HOMO-LUMO = {:.2f} eV'.format(E_LUMO-E_HOMO)) - + TotalEnergy.append(float(arr[3])) + Optstep = range(0,len(Energy)) + print("Total energi elektronik = {} Hartree = {} kJ/mol".format(TotalEnergy[-1],TotalEnergy[-1]*Ha2kj)) + if method != "XTB1" and method != "xtb1" and method != "XTB2" and method != "xtb2" and method != "XTB" and method != "xtb": + with open('cmmd.out','r') as f: + lines = f.readlines() + occ = [] + energy = [] + for index,line in enumerate(lines): + if 'Basis Dimension' in line: + arr = line.split() + NBas = int(arr[4]) + if 'ORBITAL ENERGIES' in line: + for i in range(NBas): + arr = lines[index+i+4].split() + occ.append(arr[1]) + energy.append(float(arr[3])) + Eocc = [] + Evir = [] + for energy in energy: + if energy > 0: + Evir.append(energy) + if energy < 0: + Eocc.append(energy) + E_HOMO = max(Eocc) + E_LUMO = min(Evir) + print('######INFORMASI ENERGI HOMO & LUMO######') + print('Energi HOMO = {:.2f} eV'.format(E_HOMO)) + print('Energi LUMO = {:.2f} eV'.format(E_LUMO)) + print('Gap HOMO-LUMO = {:.2f} eV'.format(E_LUMO-E_HOMO)) + else: + Gaps = [] + with open("cmmd.out", 'r') as f: + print('######INFORMASI ENERGI HOMO & LUMO######') + for line in f: + if "GAP" in line: + arr = line.split() + Gaps.append(float(arr[3])) + print("Gap HOMO-LUMO = {:.2f} eV".format(Gaps[-1])) + with open('optimized.dat','w') as fout: print("#Step Energy Gradient", file=fout) for optstep,energy,gradient in zip(Optstep,Energy,Gradient): diff --git a/cmmde_gui/gui.py b/cmmde_gui/gui.py index 1f9a144..8a8fdcf 100755 --- a/cmmde_gui/gui.py +++ b/cmmde_gui/gui.py @@ -42,11 +42,11 @@ def cmmde_gui(): job = {'Single point calculation':'sp','Geometry optimization':'opt','Frequency calculation':'freq','Molecular dynamics':'md','Metadynamics':'mtd'} # CMMDE method options - method_btn = pn.widgets.Select(name="Method selections",value='GFN2-xTB',options=['GFN2-xTB','GFN1-xTB','DFTB2','DFTB2-gammah','DFTB3','DFTB3-diag']) - method = {'GFN2-xTB':'XTB2', 'GFN1-xTB':'XTB1','DFTB2':'DFTB2','DFTB2-gammah':'DFTB2_gammah','DFTB3':'DFTB3','DFTB3-diag':'DFTB3-diag'} + method_btn = pn.widgets.Select(name="Method selections",value='GFN2-xTB',options=['GFN2-xTB','GFN1-xTB','DFTB2','DFTB2-gammah','DFTB3','DFTB3-diag','B3LYP/def2-svp']) + method = {'GFN2-xTB':'XTB2', 'GFN1-xTB':'XTB1','DFTB2':'DFTB2','DFTB2-gammah':'DFTB2_gammah','DFTB3':'DFTB3','DFTB3-diag':'DFTB3-diag','B3LYP/def2-svp':'B3LYP def2-svp'} # Name your molecule/Material - Name_input = pn.widgets.TextInput(name="Molecule name") + Molecule_input = pn.widgets.TextInput(name="Molecule name") id_input = pn.widgets.TextInput(name="Input your name") workdir = os.getenv("HOME") + "/" + "scr" @@ -68,7 +68,7 @@ def cmmde_gui(): # terminal.clear() # unik = str(uuid.uuid4().hex) - Folder = workdir + "/" + id_input.value + "/" + Name_input.value + Folder = workdir + "/" + id_input.value + "/" + Molecule_input.value os.chdir(Folder) @@ -96,7 +96,7 @@ def cmmde_gui(): checkdir_btn = pn.widgets.Button(name="Generate work directory",type="primary") TextWarning = pn.widgets.StaticText() def checkdir(event): - Folder = workdir + "/" + id_input.value + "/" + Name_input.value + Folder = workdir + "/" + id_input.value + "/" + Molecule_input.value isExist = os.path.exists(Folder) TextWarning.value = "" if isExist: @@ -110,9 +110,11 @@ def cmmde_gui(): + + # Post calculations - post_calc = {'Frequency calculation':'freq', 'Radial distribution function':'rdf','Mean Square Displacement':'msd','Time-dependent calculation':'td','Thermochemistry calculation':'thermo'} - post_btn = pn.widgets.Select(name="Job Selection",value='Frequency calculation', options=['Frequency calculation','Radial distribution function', 'Mean Square Displacement','Time-dependent calculation','Thermochemistry calculation']) + post_calc = {'Frequency calculation':'freq', 'Radial distribution function':'rdf','Mean Square Displacement':'msd','Time-dependent calculation':'td','Thermochemistry calculation':'thermo','Optimized energy':'opt'} + post_btn = pn.widgets.Select(name="Job Selection",value='Frequency calculation', options=['Frequency calculation','Radial distribution function', 'Mean Square Displacement','Time-dependent calculation','Thermochemistry calculation','Optimized energy']) # Post Calculation CMMDE software options post_software_btn = pn.widgets.Select(name="Software selections for post calculations",value='Orca',options=['Orca','GROMACS','Dcdftbmd','Quantum Espresso']) post_software = {'Orca':'orca','GROMACS':'gromacs','Dcdftbmd':'dcdftb','Quantum Espresso':'qe'} @@ -124,9 +126,12 @@ def cmmde_gui(): if post_calc[post_btn.value] == 'thermo' and post_software[post_software_btn.value] == 'orca': cmd = subprocess.run(["cmmdepost.py","-j","{}".format(post_calc[post_btn.value]),"-s","{}".format(post_software[post_software_btn.value])],capture_output=True,text=True) TextArea.value = TextArea.value + "\n" + cmd.stdout - # terminal.subprocess.run("cmmdepost.py","-j{}".format(post_calc[post_btn.value]),"-s{}".format(post_software[post_software_btn.value])) + # terminal.subprocess.run("cmmdepost.py","-j{}".format(post_calc[post_btn.value]),"-s{}".format(post_software[post_software_btn.value])) + elif post_calc[post_btn.value] == 'opt' and post_software[post_software_btn.value] == 'orca': + cmd = subprocess.run(["cmmdepost.py","-j","{}".format(post_calc[post_btn.value]),"-s","{}".format(post_software[post_software_btn.value]),"-m","{}".format(post_method[post_method_btn.value])],capture_output=True,text=True) + TextArea.value = TextArea.value + "\n" + cmd.stdout else: - Folder = workdir + "/" + id_input.value + "/" + Name_input.value + Folder = workdir + "/" + id_input.value + "/" + Molecule_input.value os.chdir(Folder) os.makedirs(post_calc[post_btn.value]) os.chdir(post_calc[post_btn.value]) @@ -163,8 +168,24 @@ def cmmde_gui(): size_input = pn.widgets.TextInput(name="Dimension",placeholder="Example: 2x2") layer_input = pn.widgets.TextInput(name="Layer",placeholder="Example: 2") slabbuilder_btn = pn.widgets.Button(name="Build it!",button_type="primary") + Material_input = pn.widgets.TextInput(name="Material name") + + # Generate material folder button + materialdir_btn = pn.widgets.Button(name="Generate work directory",type="primary") + TextWarning = pn.widgets.StaticText() + def materialgen(event): + Folder = workdir + "/" + id_input.value + "/" + Material_input.value + isExist = os.path.exists(Folder) + TextWarning.value = "" + if isExist: + TextWarning.value = "Directory exists! Change the material name!" + else: + os.makedirs(Folder) + TextWarning.value = "Successfully create the directory!" + + materialdir_btn.on_click(materialgen) def slab_builder(event): - Folder = workdir + "/" + id_input.value + "/" + Name_input.value + Folder = workdir + "/" + id_input.value + "/" + Molecule_input.value os.chdir(Folder) os.system("mv geom.xyz POSCAR") hkl = hkl_input.value @@ -190,7 +211,7 @@ def cmmde_gui(): # def SolutionBuilder(event): # solute = fileinput_solute.value # solvent = fileinput_solute.value - + # Visualize the results @@ -200,7 +221,7 @@ def cmmde_gui(): def visualize(event): xyzview = py3Dmol.view() - Folder = workdir + "/" + id_input.value + "/" + Name_input.value + Folder = workdir + "/" + id_input.value + "/" + Molecule_input.value os.chdir(Folder) with open('cmmd.xyz','r') as f: xyz = f.read() @@ -237,7 +258,7 @@ def cmmde_gui(): site="CMMDE-GUI", title="CMMDE Editor", main=[editor, TextArea, pn.Tabs(xyzviewer)], - sidebar=[pn.Card(id_input,Name_input,charge,mult,checkdir_btn,TextWarning,pn.Card(FileInput,title="Upload molecule",collapsed=True),pn.Card(pn.Card(FileInput,title="Unit cell",collapsed=True),hkl_input,size_input,layer_input,pn.Row(slabbuilder_btn,visual_btn),pn.Row(download_xyz,download_slab),title="Surface Builder",collapsed=True),title="Pre-Calculation",collapsed=True),pn.Card(pn.Card(software_btn,job_btn,method_btn,pn.Row(Run_btn,Progress_btn),pn.Row(Checkcalc_btn,visual_btn),title="General calculation",collapsed=True),title="Main Calculation",collapsed=True),pn.Card(post_software_btn,post_btn,post_method_btn,pn.Row(runpost_btn,Progress_btn),pn.Row(Checkcalc_btn,visual_btn),title="Post-Calculation",collapsed=True)], + sidebar=[pn.Card(id_input,title="User information",collapsed=True),pn.Card(Molecule_input,charge,mult,checkdir_btn,TextWarning,pn.Card(FileInput,title="Upload molecule",collapsed=True),title="Molecule information",collapsed=True),pn.Card(Material_input, materialdir_btn, pn.Card(FileInput,title="Unit cell",collapsed=True),hkl_input,size_input,layer_input,pn.Row(slabbuilder_btn,visual_btn),pn.Row(download_xyz,download_slab),title="Surface Builder",collapsed=True),pn.Card(pn.Card(software_btn,job_btn,method_btn,pn.Row(Run_btn,Progress_btn),pn.Row(Checkcalc_btn,visual_btn),title="General calculation",collapsed=True),title="Main Calculation",collapsed=True),pn.Card(post_software_btn,post_btn,post_method_btn,pn.Row(runpost_btn,Progress_btn),pn.Row(Checkcalc_btn,visual_btn),title="Post-Calculation",collapsed=True)], header_background=accent, accent_base_color=accent )