From 4d33f65e8cee5f1fa6117b6080dc10d69963e391 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20R=C3=BCssmann?= Date: Sat, 2 Jun 2018 20:17:05 +0200 Subject: [PATCH 1/2] Bugfix filename runopt parser --- aiida_kkr/parsers/kkr.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aiida_kkr/parsers/kkr.py b/aiida_kkr/parsers/kkr.py index 9f469054..03107b67 100644 --- a/aiida_kkr/parsers/kkr.py +++ b/aiida_kkr/parsers/kkr.py @@ -137,7 +137,7 @@ def parse_with_retrieved(self, retrieved): # determine wether or not everything is parsed or not (e.g. qdos option) skip_mode = False - with open(self._calc._INPUT_FILE_NAME) as file: + with open(out_folder.get_abs_path(self._calc._INPUT_FILE_NAME)) as file: txt = file.readlines() itmp = search_string('RUNOPT', txt) if itmp>=0: From 57b18e517b236be367c878d09c772b31e5a389b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20R=C3=BCssmann?= Date: Mon, 4 Jun 2018 17:32:31 +0200 Subject: [PATCH 2/2] Fixed KKRimp calculation after make_scoef inclusion also impurity DOS works and documentation for KKRimp DOS calculation --- aiida_kkr/calculations/kkr.py | 8 +- aiida_kkr/calculations/kkrimp.py | 101 ++++- aiida_kkr/calculations/voro.py | 10 - aiida_kkr/tools/common_functions.py | 2 - aiida_kkr/tools/kkr_params.py | 2 + aiida_kkr/tools/tools_kkrimp.py | 3 +- aiida_kkr/workflows/dos.py | 4 +- docs/source/examples/kkr_short_example.py | 137 +++++-- docs/source/examples/kkrimp_dos_example.py | 112 +++++ docs/source/images/impDOS_Au_Cu_example.png | Bin 0 -> 105144 bytes docs/source/user_guide/calculations.rst | 429 +++++++++++++++++--- 11 files changed, 688 insertions(+), 120 deletions(-) create mode 100644 docs/source/examples/kkrimp_dos_example.py create mode 100644 docs/source/images/impDOS_Au_Cu_example.png diff --git a/aiida_kkr/calculations/kkr.py b/aiida_kkr/calculations/kkr.py index 0268acd4..c8d9670b 100644 --- a/aiida_kkr/calculations/kkr.py +++ b/aiida_kkr/calculations/kkr.py @@ -293,11 +293,11 @@ def _prepare_for_submission(self, tempfolder, inputdict): parameters = update_params_wf(parameters, ParameterData(dict={'RUNOPT':runopt, 'nodename': 'update_KKRFLEX', 'nodedesc':'Update Parameter node with KKRFLEX runopt'})) if found_imp_info and write_scoef: scoef_filename = os.path.join(tempfolder.get_abs_path(''), self._SCOEF) - imp_info_dict = imp_info.get_dict() - Rcut = imp_info_dict.get('Rcut', None) + imp_info_dict = imp_info.get_dict() + Rcut = imp_info_dict.get('Rcut', None) hcut = imp_info_dict.get('hcut', -1.) - cylinder_orient = imp_info_dict.get('cylinder_orient', [0., 0., 1.]) - ilayer_center = imp_info_dict.get('ilayer_center', 0) + cylinder_orient = imp_info_dict.get('cylinder_orient', [0., 0., 1.]) + ilayer_center = imp_info_dict.get('ilayer_center', 0) for i in range(len(cylinder_orient)): try: len(cylinder_orient[i]) diff --git a/aiida_kkr/calculations/kkrimp.py b/aiida_kkr/calculations/kkrimp.py index 5b025d71..83744d03 100644 --- a/aiida_kkr/calculations/kkrimp.py +++ b/aiida_kkr/calculations/kkrimp.py @@ -11,7 +11,11 @@ from aiida_kkr.tools.kkr_params import kkrparams from aiida_kkr.calculations.kkr import KkrCalculation from aiida_kkr.tools.tools_kkrimp import modify_potential +from aiida_kkr.tools.tools_kkrimp import make_scoef +from aiida_kkr.tools.common_functions import search_string +from aiida_kkr.calculations.voro import VoronoiCalculation import os +from numpy import array, sqrt, sum, where ParameterData = DataFactory('parameter') RemoteData = DataFactory('remote') @@ -21,7 +25,7 @@ __copyright__ = (u"Copyright (c), 2018, Forschungszentrum Jülich GmbH, " "IAS-1/PGI-1, Germany. All rights reserved.") __license__ = "MIT license, see LICENSE.txt file" -__version__ = "0.1" +__version__ = "0.2" __contributors__ = ("Philipp Rüßmann") @@ -152,14 +156,15 @@ def _prepare_for_submission(self, tempfolder, inputdict): params_host = tmp[7] impurity_potential = tmp[8] parent_calc_folder = tmp[9] + structure = tmp[10] # Prepare input files for KKRimp calculation # 1. fill kkr params for KKRimp, write config file self._extract_and_write_config(parent_calc_folder, params_host, parameters, tempfolder) - # 2. change kkrflex_atominfo to match impurity case + # 2. write shapefun from impurity info and host shapefun and copy imp. potential + potfile = self._get_pot_and_shape(imp_info, shapefun_path, shapes, impurity_potential, parent_calc_folder, tempfolder, structure) + # 3. change kkrflex_atominfo to match impurity case self._change_atominfo(imp_info, kkrflex_file_paths, tempfolder) - # 3. write shapefun from impurity info and host shapefun and copy imp. potential - potfile = self._get_pot_and_shape(imp_info, shapefun_path, shapes, impurity_potential, parent_calc_folder, tempfolder) # prepare copy and retrieve lists local_copy_list = [(potfile, self._POTENTIAL)] @@ -173,17 +178,38 @@ def _prepare_for_submission(self, tempfolder, inputdict): self._SHAPEFUN, self._KKRFLEX_ANGLE, self._KKRFLEX_LLYFAC, self._OUT_POTENTIAL, self._OUTPUT_000, self._OUT_TIMING_000, self._OUT_ENERGYSP_PER_ATOM, self._OUT_ENERGYTOT_PER_ATOM] - """ - # Lift of output files that are retrieved if special conditions are fulfilled - self._OUT_JIJDIJ = 'out_JijDij' - self._OUT_JIJDIJ_LOCAL = 'out_JijDij_local' - self._OUT_JIJMAT = 'out_Jijmatrix' - self._OUT_JIJMAT_LOCAL = 'out_Jijmatrix_local' - self._OUT_LDOS_BASE = 'out_ldos.atom=%2i_spin%i.dat' - self._OUT_LDOS_INTERPOL_BASE = 'out_ldos.interpol.atom=%2i_spin%i.dat' - self._OUT_LMDOS_BASE = 'out_lmdos.atom=%2i_spin%i.dat' - self._OUT_LMDOS_INTERPOL_BASE = 'out_lmdos.interpol.atom=%2i_spin%i.dat' - """ + + # retrieve l(m)dos files + runopts = parameters.get_dict().get('RUNFLAG') + if runopts is None: + runopts = [] + testopts = parameters.get_dict().get('TESTFLAG') + if testopts is None: + testopts = [] + allopts = runopts+testopts + if 'lmdos' in allopts or 'ldos' in allopts: + file = open(tempfolder.get_abs_path(self._CONFIG)) + config = file.readlines() + file.close() + itmp = search_string('NSPIN', config) + if itmp>=0: + nspin = int(config[itmp].split()[-1]) + else: + raise ValueError("Could not extract NSPIN value from config.cfg") + file = open(tempfolder.get_abs_path(self._KKRFLEX_ATOMINFO)) + atominfo = file.readlines() + file.close() + itmp = search_string('NATOM', atominfo) + if itmp>=0: + natom = int(atominfo[itmp+1].split()[0]) + else: + raise ValueError("Could not extract NATOM value from kkrflex_atominfo") + for iatom in range(1,natom+1): + for ispin in range(1,nspin+1): + retrieve_list.append((self._OUT_LDOS_BASE%(iatom, ispin)).replace(' ', '0')) + retrieve_list.append((self._OUT_LDOS_INTERPOL_BASE%(iatom, ispin)).replace(' ', '0')) + retrieve_list.append((self._OUT_LMDOS_BASE%(iatom, ispin)).replace(' ', '0')) + retrieve_list.append((self._OUT_LMDOS_INTERPOL_BASE%(iatom, ispin)).replace(' ', '0')) # Prepare CalcInfo to be returned to aiida (e.g. retreive_list etc.) calcinfo = CalcInfo() @@ -281,7 +307,15 @@ def _get_and_verify_hostfiles(self, inputdict): if type(shapes)==int: shapes = [shapes] - return imp_info, kkrflex_file_paths, shapefun_path, shapes, parent_calc, params_host_calc + # extract input structure + try: + structure, voro_parent = VoronoiCalculation.find_parent_structure(parent_calc) + except: + structure, voro_parent = None, None + if structure is None: + raiseInputValidationError("No structure node found from host GF parent") + + return imp_info, kkrflex_file_paths, shapefun_path, shapes, parent_calc, params_host_calc, structure def _check_and_extract_input_nodes(self, inputdict): @@ -314,9 +348,10 @@ def _check_and_extract_input_nodes(self, inputdict): except KeyError: raise InputValidationError("No code specified for this calculation") # 3. get hostfiles - imp_info, kkrflex_file_paths, shapfun_path, shapes, host_parent_calc, params_host = self._get_and_verify_hostfiles(inputdict) + imp_info, kkrflex_file_paths, shapfun_path, shapes, host_parent_calc, params_host, structure = self._get_and_verify_hostfiles(inputdict) # 4. check impurity potential or parent calc input + # imp potential try: impurity_potential = inputdict.pop(self.get_linkname('impurity_potential')) if not isinstance(impurity_potential, SinglefileData): @@ -325,6 +360,7 @@ def _check_and_extract_input_nodes(self, inputdict): except KeyError: impurity_potential = None found_imp_pot = False + # parent calc folder try: parent_calc_folder = inputdict.pop(self.get_linkname('parent_calc_folder')) if not isinstance(parent_calc_folder, RemoteData): @@ -333,6 +369,7 @@ def _check_and_extract_input_nodes(self, inputdict): except KeyError: parent_calc_folder = None found_parent_calc = False + # consistency checks if not found_parent_calc and not found_imp_pot: raise InputValidationError("Neither impurity_potential nor parent_calc_folder specified for this calculation.\n" "Please provide either impurity_potential or parent_calc_folder.") @@ -343,7 +380,7 @@ def _check_and_extract_input_nodes(self, inputdict): if inputdict: raise ValidationError("Unknown inputs: {}".format(inputdict)) # Done checking inputdict, returning ... - return parameters, code, imp_info, kkrflex_file_paths, shapfun_path, shapes, host_parent_calc, params_host, impurity_potential, parent_calc_folder + return parameters, code, imp_info, kkrflex_file_paths, shapfun_path, shapes, host_parent_calc, params_host, impurity_potential, parent_calc_folder, structure def _extract_and_write_config(self, parent_calc_folder, params_host, parameters, tempfolder): @@ -417,13 +454,34 @@ def _change_atominfo(self, imp_info, kkrflex_file_paths, tempfolder): #TODO implement logic to extract this info from imp_info replace_zatom_imp = [] + + # read scoef for comparison with Rimp_rel + scoef = [] + with open(tempfolder.get_abs_path(KkrCalculation()._SCOEF), 'r') as file: + Nscoef = int(file.readline().split()[0]) + for iline in range(Nscoef): + tmpline = file.readline().split() + scoef.append([float(i) for i in tmpline[:3]]) + scoef = array(scoef) + + # find replaceZimp list from Zimp and Rimp_rel + imp_info_dict = imp_info.get_dict() + Zimp_list = imp_info_dict.get('Zimp') + Rimp_rel_list = imp_info_dict.get('Rimp_rel', [[0,0,0]]) + for iatom in range(len(Zimp_list)): + rtmp = Rimp_rel_list[iatom] + diff = sqrt(sum((rtmp-scoef)**2, axis=1)) + Zimp = Zimp_list[iatom] + ipos_replace = where(diff==diff.min())[0][0] + replace_zatom_imp.append([ipos_replace, Zimp]) + for (iatom, zimp) in replace_zatom_imp: tmp = atominfo[iatom+4].split() x, y, z = float(tmp[0]), float(tmp[1]), float(tmp[2]) zatom = float(tmp[3]) virt, remove, lmax = int(tmp[4]), int(tmp[5]), int(tmp[6]) zatom = zimp - tmp = ' %24.16f %24.16f %24.16f %5.2f %11i %11i %11i\n'%(x, y, z, zatom, virt, remove, lmax) + tmp = ' %24.16f %24.16f %24.16f %5.2f %4i %4i %4i\n'%(x, y, z, zatom, virt, remove, lmax) atominfo[iatom+4] = tmp # write atominfo file @@ -432,13 +490,12 @@ def _change_atominfo(self, imp_info, kkrflex_file_paths, tempfolder): file.writelines(atominfo) - def _get_pot_and_shape(self, imp_info, shapefun_path, shapes, impurity_potential, parent_calc_folder, tempfolder): + def _get_pot_and_shape(self, imp_info, shapefun_path, shapes, impurity_potential, parent_calc_folder, tempfolder, structure): """ write shapefun from impurity info and host shapefun and copy imp. potential """ - - scoef_filename = os.path.join(tempfolder.get_abs_path(''), self._SCOEF) + scoef_filename = os.path.join(tempfolder.get_abs_path(''), KkrCalculation()._SCOEF) imp_info_dict = imp_info.get_dict() Rcut = imp_info_dict.get('Rcut', None) hcut = imp_info_dict.get('hcut', -1.) diff --git a/aiida_kkr/calculations/voro.py b/aiida_kkr/calculations/voro.py index 6e0a7fc9..ab39f098 100644 --- a/aiida_kkr/calculations/voro.py +++ b/aiida_kkr/calculations/voro.py @@ -310,10 +310,6 @@ def _has_struc(self, parent_folder): parent_folder.inp.structure except: success = False - if success: - print('struc found') - else: - print('no struc found') return success @@ -325,11 +321,9 @@ def _get_remote(self, parent_folder): parent_folder_tmp0 = parent_folder try: parent_folder_tmp = parent_folder_tmp0.inp.remote_folder - print('input has remote folder') except: #TODO check if this is a remote folder parent_folder_tmp = parent_folder_tmp0 - print('input is remote folder') return parent_folder_tmp @@ -341,14 +335,11 @@ def _get_parent(self, input_folder): input_folder_tmp0 = input_folder try: parent_folder_tmp = input_folder_tmp0.inp.parent_calc_folder - print('input has parent folder') except: try: parent_folder_tmp = input_folder_tmp0.inp.parent_calc - print('input has parent folder') except: parent_folder_tmp = input_folder_tmp0 - print('input is parent folder') return parent_folder_tmp @@ -363,7 +354,6 @@ def find_parent_structure(self, parent_folder): while not self._has_struc(parent_folder_tmp) and iiter') + # then set structure and input parameter voro_calc.use_structure(Cu) voro_calc.use_parameters(ParaNode) @@ -79,7 +83,7 @@ def wait_for_it(calc, maxwait=200): ################################################### -# KKR step (single iteration) +# KKR step (20 iterations simple mixing) ################################################### # create new set of parameters for a KKR calculation and fill with values from previous voronoin calculation @@ -88,10 +92,14 @@ def wait_for_it(calc, maxwait=200): # and set the missing values params.set_multiple_values(RMAX=7., GMAX=65.) +# choose 20 simple mixing iterations first to preconverge potential (here 5% simple mixing) +params.set_multiple_values(NSTEPS=20, IMIX=0, STRMIX=0.05) + # create aiida ParameterData node from the KKR parameters ParaNode = ParameterData(dict=params.get_dict()) # get KKR code and create new calculation instance +### !!! use your code name !!! ### code = Code.get_from_string('KKRcode@my_mac') kkr_calc = code.new_calc() @@ -100,6 +108,9 @@ def wait_for_it(calc, maxwait=200): kkr_calc.use_parent_folder(voronoi_calc_folder) kkr_calc.set_resources({'num_machines': 1, 'num_mpiprocs_per_machine':1}) +### !!! use queue name if necessary !!! ### +# kkr_calc.set_queue_name('') + # store nodes and submit calculation kkr_calc.store_all() kkr_calc.submit() @@ -123,9 +134,13 @@ def wait_for_it(calc, maxwait=200): # then set input nodes for calculation kkr_calc_continued.use_code(code) kkr_calc_continued.use_parameters(ParaNode) -kkr_calc_continued.use_parent_folder(voronoi_calc_folder) +kkr_calc_parent_folder = kkr_calc.out.remote_folder # parent remote folder of previous calculation +kkr_calc_continued.use_parent_folder(kkr_calc_parent_folder) kkr_calc_continued.set_resources({'num_machines': 1, 'num_mpiprocs_per_machine':1}) +### !!! use queue name if necessary !!! ### +# kkr_calc_continued.set_queue_name('') + # store input nodes and submit calculation kkr_calc_continued.store_all() kkr_calc_continued.submit() @@ -161,8 +176,11 @@ def wait_for_it(calc, maxwait=200): GF_host_calc.use_parameters(ParaNode) GF_host_calc.use_parent_folder(kkr_converged_parent_folder) +### !!! use queue name if necessary !!! ### +# GF_host_calc.set_queue_name('') + # prepare impurity_info node containing the information about the impurity cluster -imp_info = ParameterData(dict={'Rcut':1.01, 'imp_pos':[0], 'Zimp':[29.]}) # choose host-in-host calculation first +imp_info = ParameterData(dict={'Rcut':1.01, 'ilayer_center':0, 'Zimp':[79.]}) # set impurity info node to calculation GF_host_calc.use_impurity_info(imp_info) @@ -174,14 +192,73 @@ def wait_for_it(calc, maxwait=200): wait_for_it(GF_host_calc) -################################################### -# KKRimp calculation (single iteration first) -################################################### +###################################################################### +# KKRimp calculation (20 simple mixing iterations for preconvergence) +###################################################################### -SingleFileData = DataFactory('singlefile') -pot_imp_path = '' -potfile_imp = SingleFileData() -potfile_imp.set_file(pot_imp_path) +# first create impurity start pot using auxiliary voronoi calculation + +# creation of the auxiliary styructure: +# use an aiida workfunction to keep track of the provenance +from aiida.work import workfunction as wf +@wf +def change_struc_imp_aux_wf(struc, imp_info): # Note: works for single imp at center only! + from aiida.common.constants import elements as PeriodicTableElements + _atomic_numbers = {data['symbol']: num for num, data in PeriodicTableElements.iteritems()} + + new_struc = StructureData(cell=struc.cell) + isite = 0 + for site in struc.sites: + sname = site.kind_name + kind = struc.get_kind(sname) + pos = site.position + zatom = _atomic_numbers[kind.get_symbols_string()] + if isite == imp_info.get_dict().get('ilayer_center'): + zatom = imp_info.get_dict().get('Zimp')[0] + symbol = PeriodicTableElements.get(zatom).get('symbol') + new_struc.append_atom(position=pos, symbols=symbol) + isite += 1 + + return new_struc + +new_struc = change_struc_imp_aux_wf(voro_calc.inp.structure, imp_info) + +# then Voronoi calculation for auxiliary structure +### !!! use your code name !!! ### +codename = 'voronoi@my_mac' +code = Code.get_from_string(codename) +voro_calc_aux = code.new_calc() +voro_calc_aux.set_resources({'num_machines':1, 'tot_num_mpiprocs':1}) +voro_calc_aux.use_structure(new_struc) +voro_calc_aux.use_parameters(kkrcalc_converged.inp.parameters) +voro_calc_aux.store_all() +voro_calc_aux.submit() +### !!! use queue name if necessary !!! ### +# voro_calc_aux.set_queue_name('') + +# wait for calculation to finish +wait_for_it(voro_calc_aux) + +# then create impurity startpot using auxiliary voronoi calc and converged host potential + +from aiida_kkr.tools.common_workfunctions import neworder_potential_wf + +potname_converged = kkrcalc_converged._POTENTIAL +potname_imp = 'potential_imp' +neworder_pot1 = [int(i) for i in loadtxt(GF_host_calc.out.retrieved.get_abs_path('scoef'), skiprows=1)[:,3]-1] +potname_impvorostart = voro_calc_aux._OUT_POTENTIAL_voronoi +replacelist_pot2 = [[0,0]] + +settings_dict = {'pot1': potname_converged, 'out_pot': potname_imp, 'neworder': neworder_pot1, + 'pot2': potname_impvorostart, 'replace_newpos': replacelist_pot2, 'label': 'startpot_KKRimp', + 'description': 'starting potential for Au impurity in bulk Cu'} +settings = ParameterData(dict=settings_dict) + +startpot_Au_imp_sfd = neworder_potential_wf(settings_node=settings, + parent_calc_folder=kkrcalc_converged.out.remote_folder, + parent_calc_folder2=voro_calc_aux.out.remote_folder) + +# now create KKRimp calculation and run first (some simple mixing steps) calculation # needed to link to host GF writeout calculation GF_host_output_folder = GF_host_calc.out.remote_folder @@ -190,14 +267,21 @@ def wait_for_it(calc, maxwait=200): from aiida_kkr.calculations.kkrimp import KkrimpCalculation kkrimp_calc = KkrimpCalculation() +### !!! use your code name !!! ### kkrimp_code = Code.get_from_string('KKRimp@my_mac') kkrimp_calc.use_code(kkrimp_code) kkrimp_calc.use_host_Greenfunction_folder(GF_host_output_folder) -kkrimp_calc.use_impurity_potential(potfile_imp) +kkrimp_calc.use_impurity_potential(startpot_Au_imp_sfd) kkrimp_calc.set_resources(resources) kkrimp_calc.set_computer(kkrimp_code.get_computer()) +# first set 20 simple mixing steps +kkrimp_params = kkrparams(params_type='kkrimp') +kkrimp_params.set_multiple_values(SCFSTEPS=20, IMIX=0, MIXFAC=0.05) +ParamsKKRimp = ParameterData(dict=kkrimp_params.get_dict()) +kkrimp_calc.use_parameters(ParamsKKRimp) + # store and submit kkrimp_calc.store_all() kkrimp_calc.submit() @@ -207,21 +291,24 @@ def wait_for_it(calc, maxwait=200): ################################################### -# continued KKRimp calculation +# continued KKRimp calculation until convergence ################################################### -kkrimp_parent_calc_folder = kkrimp_calc.out.remote_folder +kkrimp_calc_converge = kkrimp_code.new_calc() +kkrimp_calc_converge.use_parent_calc_folder(kkrimp_calc.out.remote_folder) +kkrimp_calc_converge.set_resources(resources) +kkrimp_calc_converge.use_host_Greenfunction_folder(kkrimp_calc.inp.GFhost_folder) + +kkrimp_params = kkrparams(params_type='kkrimp', **kkrimp_calc.inp.parameters.get_dict()) +kkrimp_params.set_multiple_values(SCFSTEPS=99, IMIX=5, MIXFAC=0.05) +ParamsKKRimp = ParameterData(dict=kkrimp_params.get_dict()) +kkrimp_calc_converge.use_parameters(ParamsKKRimp) -kkrimp_code = kkrimp_calc.get_code() -kkrimp_calc_continued = KkrimpCalculation() -kkrimp_calc_continued.use_code(kkrimp_code) -kkrimp_calc_continued.use_host_Greenfunction_folder(GF_host_output_folder) -kkrimp_calc_continued.use_parent_calc_folder(kkrimp_parent_calc_folder) -kkrimp_calc_continued.set_resources(resources) -kkrimp_calc_continued.set_computer(code.get_computer()) -kkrimp_calc_continued.use_parameters(ParameterData(dict=kkrparams(params_type='kkrimp', IMIX=5, SCFSTEPS=50).get_dict())) +### !!! use queue name if necessary !!! ### +# kkrimp_calc_converge.set_queue_name('') -kkrimp_calc_continued.store_all() -kkrimp_calc_continued.submit() +# store and submit +kkrimp_calc_converge.store_all() +kkrimp_calc_converge.submit() -wait_for_it(kkrimp_calc_continued) +wait_for_it(kkrimp_calc_converge) \ No newline at end of file diff --git a/docs/source/examples/kkrimp_dos_example.py b/docs/source/examples/kkrimp_dos_example.py new file mode 100644 index 00000000..ae129322 --- /dev/null +++ b/docs/source/examples/kkrimp_dos_example.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python + +# connect to aiida db +from aiida import load_dbenv, is_dbenv_loaded +if not is_dbenv_loaded(): + load_dbenv() +# load essential aiida classes +from aiida.orm import DataFactory, load_node +ParameterData = DataFactory('parameter') + + +# some settings: +#DOS contour (in Ry units), emax=EF+dE_emax: +emin, dE_emax, npt = -0.2, 0.1, 101 +# kkrimp parent (converged imp pot, needs to tbe a KKRimp calculation node) +kkrimp_calc_converge = load_node(25025) + +# derived quantities: +GF_host_calc = kkrimp_calc_converge.inp.GFhost_folder.inp.remote_folder +kkr_converged_parent_folder = GF_host_calc.inp.parent_calc_folder + +# helper function +def wait_for_it(calc, maxwait=300): + from time import sleep + N = 0 + print 'start waiting for calculation to finish' + while not calc.has_finished() and N<(maxwait/2.): + N += 1 + if N%5==0: + print('.') + sleep(2.) + print('waiting done after {} seconds: {} {}'.format(N*2, calc.has_finished(), calc.has_finished_ok())) + +################################################################################################ + +# first host GF with DOS contour +from aiida_kkr.tools.kkr_params import kkrparams +params = kkrparams(**GF_host_calc.inp.parameters.get_dict()) +params.set_multiple_values(EMIN=emin, EMAX=GF_host_calc.res.fermi_energy+dE_emax, NPOL=0, NPT1=0, NPT2=npt, NPT3=0) +ParaNode = ParameterData(dict=params.get_dict()) + +code = GF_host_calc.get_code() # take the same code as in the calculation before +GF_host_doscalc= code.new_calc() +resources = GF_host_calc.get_resources() +GF_host_doscalc.set_resources(resources) +GF_host_doscalc.use_parameters(ParaNode) +GF_host_doscalc.use_parent_folder(kkr_converged_parent_folder) +GF_host_doscalc.use_impurity_info(GF_host_calc.inp.impurity_info) + +# store and submit +GF_host_doscalc.store_all() +GF_host_doscalc.submit() + +# wait for calculation to finish +print 'host GF calc for DOS contour' +wait_for_it(GF_host_doscalc) + +# then KKRimp step using the converged potential + +kkrimp_doscalc = kkrimp_calc_converge.get_code().new_calc() +kkrimp_doscalc.use_host_Greenfunction_folder(GF_host_doscalc.out.remote_folder) +kkrimp_doscalc.use_parent_calc_folder(kkrimp_calc_converge.out.remote_folder) +kkrimp_doscalc.set_resources(kkrimp_calc_converge.get_resources()) + +# set to DOS settings +params = kkrparams(params_type='kkrimp', **kkrimp_calc_converge.inp.parameters.get_dict()) +params.set_multiple_values(RUNFLAG=['lmdos'], SCFSTEPS=1) +ParaNode = ParameterData(dict=params.get_dict()) + +kkrimp_doscalc.use_parameters(ParaNode) + +# store and submit calculation +kkrimp_doscalc.store_all() +kkrimp_doscalc.submit() + +# wait for calculation to finish + +print 'KKRimp calc DOS' +wait_for_it(kkrimp_doscalc) + +# Finally plot the DOS: + +# get interpolated DOS from GF_host_doscalc calculation: +from aiida_kkr.tools.common_functions import interpolate_dos +dospath_host = GF_host_doscalc.out.retrieved.get_abs_path('') +ef, dos, dos_interpol = interpolate_dos(dospath_host, return_original=True) +dos, dos_interpol = dos[0], dos_interpol[0] + +# read in impurity DOS +from numpy import loadtxt +impdos0 = loadtxt(kkrimp_doscalc.out.retrieved.get_abs_path('out_lmdos.interpol.atom=01_spin1.dat')) +impdos1 = loadtxt(kkrimp_doscalc.out.retrieved.get_abs_path('out_lmdos.interpol.atom=13_spin1.dat')) +# sum over spins: +impdos0[:,1:] = impdos0[:,1:]*2 +impdos1[:,1:] = impdos1[:,1:]*2 + +# plot bulk and impurity DOS +from matplotlib.pyplot import figure, fill_between, plot, legend, title, axhline, axvline, xlim, ylim, ylabel, xlabel, title, show +figure() +fill_between((dos_interpol[:,0]-ef)*13.6, dos_interpol[:,1]/13.6, color='lightgrey', lw=0, label='bulk Cu') +plot((impdos0[:,0]-ef)*13.6, impdos0[:,1]/13.6, label='Au imp') +plot((impdos0[:,0]-ef)*13.6, impdos1[:,1]/13.6, label='1st Cu neighbor') +plot((impdos0[:,0]-ef)*13.6, (impdos1[:,1]-dos_interpol[:,1])/dos_interpol[:,1], '--', label='relative difference in 1st Cu neighbor') +legend() +title('DOS of Au impurity embedded into bulk Cu') +axhline(0, lw=1, color='grey') +axvline(0, lw=1, color='grey') +xlim(-8, 1) +ylim(-0.5,8.5) +xlabel('E-E_F (eV)') +ylabel('DOS (states/eV)') +show() \ No newline at end of file diff --git a/docs/source/images/impDOS_Au_Cu_example.png b/docs/source/images/impDOS_Au_Cu_example.png new file mode 100644 index 0000000000000000000000000000000000000000..6f085648a3b9ebb20f8433e5df157f0890a0e1bc GIT binary patch literal 105144 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:: + new_struc = change_struc_imp_aux_wf(voro_calc.inp.structure, imp_info) + +Then we run the Voronoi calculation for auxiliary structure to create the impurity starting potential:: - SingleFileData = DataFactory('singlefile') - pot_imp_path = '' - potfile_imp = SingleFileData() - potfile_imp.set_file(pot_imp_path) + codename = 'voronoi@my_mac' + code = Code.get_from_string(codename) + + voro_calc_aux = code.new_calc() + voro_calc_aux.set_resources({'num_machines':1, 'tot_num_mpiprocs':1}) + voro_calc_aux.use_structure(new_struc) + voro_calc_aux.use_parameters(kkrcalc_converged.inp.parameters) + + voro_calc_aux.store_all() + voro_calc_aux.submit() + +Now we create the impurity starting potential using the converged host potential +for the surrounding of the impurity and the new Au impurity startpot:: + + from aiida_kkr.tools.common_workfunctions import neworder_potential_wf + + potname_converged = kkrcalc_converged._POTENTIAL + potname_imp = 'potential_imp' + neworder_pot1 = [int(i) for i in loadtxt(GF_host_calc.out.retrieved.get_abs_path('scoef'), skiprows=1)[:,3]-1] + potname_impvorostart = voro_calc_aux._OUT_POTENTIAL_voronoi + replacelist_pot2 = [[0,0]] + + settings_dict = {'pot1': potname_converged, 'out_pot': potname_imp, 'neworder': neworder_pot1, + 'pot2': potname_impvorostart, 'replace_newpos': replacelist_pot2, 'label': 'startpot_KKRimp', + 'description': 'starting potential for Au impurity in bulk Cu'} + settings = ParameterData(dict=settings_dict) + + startpot_Au_imp_sfd = neworder_potential_wf(settings_node=settings, + parent_calc_folder=kkrcalc_converged.out.remote_folder, + parent_calc_folder2=voro_calc_aux.out.remote_folder) Create and submit initial KKRimp calculation -------------------------------------------- -Now we create a new impurity calculation, set all input nodes and submit the calculation:: +Now we create a new impurity calculation, set all input nodes and submit the calculation +to preconverge the impurity potential (Au embedded into Cu ulk host as described in the +``impurity_info`` node):: # needed to link to host GF writeout calculation GF_host_output_folder = GF_host_calc.out.remote_folder @@ -368,10 +427,16 @@ Now we create a new impurity calculation, set all input nodes and submit the cal kkrimp_calc.use_code(kkrimp_code) kkrimp_calc.use_host_Greenfunction_folder(GF_host_output_folder) - kkrimp_calc.use_impurity_potential(potfile_imp) + kkrimp_calc.use_impurity_potential(startpot_Au_imp_sfd) kkrimp_calc.set_resources(resources) kkrimp_calc.set_computer(kkrimp_code.get_computer()) + # first set 20 simple mixing steps + kkrimp_params = kkrparams(params_type='kkrimp') + kkrimp_params.set_multiple_values(SCFSTEPS=20, IMIX=0, MIXFAC=0.05) + ParamsKKRimp = ParameterData(dict=kkrimp_params.get_dict()) + kkrimp_calc.use_parameters(ParamsKKRimp) + # store and submit kkrimp_calc.store_all() kkrimp_calc.submit() @@ -380,27 +445,101 @@ Now we create a new impurity calculation, set all input nodes and submit the cal Restart KKRimp calculation from KKRimp parent --------------------------------------------- -Here we demonstrate how to restart a KKRimp calculation from a parent calculation from which the starting potential is extracted:: +Here we demonstrate how to restart a KKRimp calculation from a parent calculation +from which the starting potential is extracted autimatically. This is used to compute +the converged impurity potential starting from the previous preconvergence step:: - # remote folder of previous KKRimp calculation - kkrimp_parent_calc_folder = kkrimp_calc.out.remote_folder + kkrimp_calc_converge = kkrimp_code.new_calc() + kkrimp_calc_converge.use_parent_calc_folder(kkrimp_calc.out.remote_folder) + kkrimp_calc_converge.set_resources(resources) + kkrimp_calc_converge.use_host_Greenfunction_folder(kkrimp_calc.inp.GFhost_folder) - # extract kkrimp code from parent calc - kkrimp_code = kkrimp_calc.get_code() - - # create new KKRimp calculation - kkrimp_calc_continued = KkrimpCalculation() - kkrimp_calc_continued.use_code(kkrimp_code) - kkrimp_calc_continued.use_host_Greenfunction_folder(GF_host_output_folder) - kkrimp_calc_continued.use_parent_calc_folder(kkrimp_parent_calc_folder) - kkrimp_calc_continued.set_resources(resources) - kkrimp_calc_continued.set_computer(code.get_computer()) - kkrimp_calc_continued.use_parameters(ParameterData(dict=kkrparams(params_type='kkrimp', IMIX=5, SCFSTEPS=50).get_dict())) + kkrimp_params = kkrparams(params_type='kkrimp', **kkrimp_calc.inp.parameters.get_dict()) + kkrimp_params.set_multiple_values(SCFSTEPS=99, IMIX=5, MIXFAC=0.05) + ParamsKKRimp = ParameterData(dict=kkrimp_params.get_dict()) + kkrimp_calc_converge.use_parameters(ParamsKKRimp) # store and submit - kkrimp_calc_continued.store_all() - kkrimp_calc_continued.submit() + kkrimp_calc_converge.store_all() + kkrimp_calc_converge.submit() + + +Impurity DOS +------------ + +create final imp DOS (new host GF for DOS contour, then KKRimp calc using converged potential) + +first prepare host GF with DOS contour:: + params = kkrparams(**GF_host_calc.inp.parameters.get_dict()) + params.set_multiple_values(EMIN=-0.2, EMAX=GF_host_calc.res.fermi_energy+0.1, NPOL=0, NPT1=0, NPT2=101, NPT3=0) + ParaNode = ParameterData(dict=params.get_dict()) + + code = GF_host_calc.get_code() # take the same code as in the calculation before + GF_host_doscalc= code.new_calc() + resources = GF_host_calc.get_resources() + GF_host_doscalc.set_resources(resources) + GF_host_doscalc.use_parameters(ParaNode) + GF_host_doscalc.use_parent_folder(kkr_converged_parent_folder) + GF_host_doscalc.use_impurity_info(GF_host_calc.inp.impurity_info) + + GF_host_doscalc.store_all() + GF_host_doscalc.submit() + +Then we run the KKRimp step using the converged potential (via the ``parent_calc_folder`` +node) and the host GF which contains the DOS contour information (via ``host_Greenfunction_folder``):: + + kkrimp_doscalc = kkrimp_calc_converge.get_code().new_calc() + kkrimp_doscalc.use_host_Greenfunction_folder(GF_host_doscalc.out.remote_folder) + kkrimp_doscalc.use_parent_calc_folder(kkrimp_calc_converge.out.remote_folder) + kkrimp_doscalc.set_resources(kkrimp_calc_converge.get_resources()) + + params = kkrparams(params_type='kkrimp', **kkrimp_calc_converge.inp.parameters.get_dict()) + params.set_multiple_values(RUNFLAG=['lmdos'], SCFSTEPS=1) + ParaNode = ParameterData(dict=params.get_dict()) + + kkrimp_doscalc.use_parameters(ParaNode) + + kkrimp_doscalc.store_all() + kkrimp_doscalc.submit() + +Finally we plot the DOS:: + + # get interpolated DOS from GF_host_doscalc calculation: + from aiida_kkr.tools.common_functions import interpolate_dos + dospath_host = GF_host_doscalc.out.retrieved.get_abs_path('') + ef, dos, dos_interpol = interpolate_dos(dospath_host, return_original=True) + dos, dos_interpol = dos[0], dos_interpol[0] + + # read in impurity DOS + from numpy import loadtxt + impdos0 = loadtxt(kkrimp_doscalc.out.retrieved.get_abs_path('out_lmdos.interpol.atom=01_spin1.dat')) + impdos1 = loadtxt(kkrimp_doscalc.out.retrieved.get_abs_path('out_lmdos.interpol.atom=13_spin1.dat')) + # sum over spins: + impdos0[:,1:] = impdos0[:,1:]*2 + impdos1[:,1:] = impdos1[:,1:]*2 + + # plot bulk and impurity DOS + from matplotlib.pyplot import figure, fill_between, plot, legend, title, axhline, axvline, xlim, ylim, ylabel, xlabel, title, show + figure() + fill_between((dos_interpol[:,0]-ef)*13.6, dos_interpol[:,1]/13.6, color='lightgrey', lw=0, label='bulk Cu') + plot((impdos0[:,0]-ef)*13.6, impdos0[:,1]/13.6, label='Au imp') + plot((impdos0[:,0]-ef)*13.6, impdos1[:,1]/13.6, label='1st Cu neighbor') + plot((impdos0[:,0]-ef)*13.6, (impdos1[:,1]-dos_interpol[:,1])/dos_interpol[:,1], '--', label='relative difference in 1st Cu neighbor') + legend() + title('DOS of Au impurity embedded into bulk Cu') + axhline(0, lw=1, color='grey') + axvline(0, lw=1, color='grey') + xlim(-8, 1) + ylim(-0.5,8.5) + xlabel('E-E_F (eV)') + ylabel('DOS (states/eV)') + show() + +Which should look like this: + +.. image:: ../images/impDOS_Au_Cu_example.png + :width: 60% KKR calculation importer @@ -700,7 +839,7 @@ Download: :download:`this example script <../examples/kkr_short_example.py>` # GF_host_calc.set_queue_name('') # prepare impurity_info node containing the information about the impurity cluster - imp_info = ParameterData(dict={'Rcut':1.01, 'ilayer_center':0, 'Zimp':[29.]}) # choose host-in-host calculation first + imp_info = ParameterData(dict={'Rcut':1.01, 'ilayer_center':0, 'Zimp':[79.]}) # set impurity info node to calculation GF_host_calc.use_impurity_info(imp_info) @@ -712,14 +851,73 @@ Download: :download:`this example script <../examples/kkr_short_example.py>` wait_for_it(GF_host_calc) - ################################################### - # KKRimp calculation (single iteration first) - ################################################### + ###################################################################### + # KKRimp calculation (20 simple mixing iterations for preconvergence) + ###################################################################### + + # first create impurity start pot using auxiliary voronoi calculation + + # creation of the auxiliary styructure: + # use an aiida workfunction to keep track of the provenance + from aiida.work import workfunction as wf + @wf + def change_struc_imp_aux_wf(struc, imp_info): # Note: works for single imp at center only! + from aiida.common.constants import elements as PeriodicTableElements + _atomic_numbers = {data['symbol']: num for num, data in PeriodicTableElements.iteritems()} + + new_struc = StructureData(cell=struc.cell) + isite = 0 + for site in struc.sites: + sname = site.kind_name + kind = struc.get_kind(sname) + pos = site.position + zatom = _atomic_numbers[kind.get_symbols_string()] + if isite == imp_info.get_dict().get('ilayer_center'): + zatom = imp_info.get_dict().get('Zimp')[0] + symbol = PeriodicTableElements.get(zatom).get('symbol') + new_struc.append_atom(position=pos, symbols=symbol) + isite += 1 + + return new_struc + + new_struc = change_struc_imp_aux_wf(voro_calc.inp.structure, imp_info) + + # then Voronoi calculation for auxiliary structure + ### !!! use your code name !!! ### + codename = 'voronoi@my_mac' + code = Code.get_from_string(codename) + voro_calc_aux = code.new_calc() + voro_calc_aux.set_resources({'num_machines':1, 'tot_num_mpiprocs':1}) + voro_calc_aux.use_structure(new_struc) + voro_calc_aux.use_parameters(kkrcalc_converged.inp.parameters) + voro_calc_aux.store_all() + voro_calc_aux.submit() + ### !!! use queue name if necessary !!! ### + # voro_calc_aux.set_queue_name('') + + # wait for calculation to finish + wait_for_it(voro_calc_aux) + + # then create impurity startpot using auxiliary voronoi calc and converged host potential + + from aiida_kkr.tools.common_workfunctions import neworder_potential_wf - SingleFileData = DataFactory('singlefile') - pot_imp_path = '' - potfile_imp = SingleFileData() - potfile_imp.set_file(pot_imp_path) + potname_converged = kkrcalc_converged._POTENTIAL + potname_imp = 'potential_imp' + neworder_pot1 = [int(i) for i in loadtxt(GF_host_calc.out.retrieved.get_abs_path('scoef'), skiprows=1)[:,3]-1] + potname_impvorostart = voro_calc_aux._OUT_POTENTIAL_voronoi + replacelist_pot2 = [[0,0]] + + settings_dict = {'pot1': potname_converged, 'out_pot': potname_imp, 'neworder': neworder_pot1, + 'pot2': potname_impvorostart, 'replace_newpos': replacelist_pot2, 'label': 'startpot_KKRimp', + 'description': 'starting potential for Au impurity in bulk Cu'} + settings = ParameterData(dict=settings_dict) + + startpot_Au_imp_sfd = neworder_potential_wf(settings_node=settings, + parent_calc_folder=kkrcalc_converged.out.remote_folder, + parent_calc_folder2=voro_calc_aux.out.remote_folder) + + # now create KKRimp calculation and run first (some simple mixing steps) calculation # needed to link to host GF writeout calculation GF_host_output_folder = GF_host_calc.out.remote_folder @@ -728,18 +926,20 @@ Download: :download:`this example script <../examples/kkr_short_example.py>` from aiida_kkr.calculations.kkrimp import KkrimpCalculation kkrimp_calc = KkrimpCalculation() - ### !!! use your code name !!! ### kkrimp_code = Code.get_from_string('KKRimp@my_mac') kkrimp_calc.use_code(kkrimp_code) kkrimp_calc.use_host_Greenfunction_folder(GF_host_output_folder) - kkrimp_calc.use_impurity_potential(potfile_imp) + kkrimp_calc.use_impurity_potential(startpot_Au_imp_sfd) kkrimp_calc.set_resources(resources) kkrimp_calc.set_computer(kkrimp_code.get_computer()) - ### !!! use queue name if necessary !!! ### - # kkrimp_calc.set_queue_name('') + # first set 20 simple mixing steps + kkrimp_params = kkrparams(params_type='kkrimp') + kkrimp_params.set_multiple_values(SCFSTEPS=20, IMIX=0, MIXFAC=0.05) + ParamsKKRimp = ParameterData(dict=kkrimp_params.get_dict()) + kkrimp_calc.use_parameters(ParamsKKRimp) # store and submit kkrimp_calc.store_all() @@ -750,24 +950,147 @@ Download: :download:`this example script <../examples/kkr_short_example.py>` ################################################### - # continued KKRimp calculation + # continued KKRimp calculation until convergence ################################################### - kkrimp_parent_calc_folder = kkrimp_calc.out.remote_folder + kkrimp_calc_converge = kkrimp_code.new_calc() + kkrimp_calc_converge.use_parent_calc_folder(kkrimp_calc.out.remote_folder) + kkrimp_calc_converge.set_resources(resources) + kkrimp_calc_converge.use_host_Greenfunction_folder(kkrimp_calc.inp.GFhost_folder) - kkrimp_code = kkrimp_calc.get_code() - kkrimp_calc_continued = KkrimpCalculation() - kkrimp_calc_continued.use_code(kkrimp_code) - kkrimp_calc_continued.use_host_Greenfunction_folder(GF_host_output_folder) - kkrimp_calc_continued.use_parent_calc_folder(kkrimp_parent_calc_folder) - kkrimp_calc_continued.set_resources(resources) - kkrimp_calc_continued.set_computer(code.get_computer()) - kkrimp_calc_continued.use_parameters(ParameterData(dict=kkrparams(params_type='kkrimp', IMIX=5, SCFSTEPS=50).get_dict())) + kkrimp_params = kkrparams(params_type='kkrimp', **kkrimp_calc.inp.parameters.get_dict()) + kkrimp_params.set_multiple_values(SCFSTEPS=99, IMIX=5, MIXFAC=0.05) + ParamsKKRimp = ParameterData(dict=kkrimp_params.get_dict()) + kkrimp_calc_converge.use_parameters(ParamsKKRimp) ### !!! use queue name if necessary !!! ### - # kkrimp_calc_continued.set_queue_name('') + # kkrimp_calc_converge.set_queue_name('') - kkrimp_calc_continued.store_all() - kkrimp_calc_continued.submit() + # store and submit + kkrimp_calc_converge.store_all() + kkrimp_calc_converge.submit() + + wait_for_it(kkrimp_calc_converge) + + +KKRimp DOS (starting from converged parent KKRimp calculation) +-------------------------------------------------------------- + +Script running host GF step for DOS contour first before running KKRimp step and plotting. + +Download: :download:`this example script <../examples/kkrimp_dos_example.py>` + +:: + + #!/usr/bin/env python + + # connect to aiida db + from aiida import load_dbenv, is_dbenv_loaded + if not is_dbenv_loaded(): + load_dbenv() + # load essential aiida classes + from aiida.orm import DataFactory, load_node + ParameterData = DataFactory('parameter') + + + # some settings: + #DOS contour (in Ry units), emax=EF+dE_emax: + emin, dE_emax, npt = -0.2, 0.1, 101 + # kkrimp parent (converged imp pot, needs to tbe a KKRimp calculation node) + kkrimp_calc_converge = load_node(25025) + + # derived quantities: + GF_host_calc = kkrimp_calc_converge.inp.GFhost_folder.inp.remote_folder + kkr_converged_parent_folder = GF_host_calc.inp.parent_calc_folder + + # helper function + def wait_for_it(calc, maxwait=300): + from time import sleep + N = 0 + print 'start waiting for calculation to finish' + while not calc.has_finished() and N<(maxwait/2.): + N += 1 + if N%5==0: + print('.') + sleep(2.) + print('waiting done after {} seconds: {} {}'.format(N*2, calc.has_finished(), calc.has_finished_ok())) + + ################################################################################################ + + # first host GF with DOS contour + from aiida_kkr.tools.kkr_params import kkrparams + params = kkrparams(**GF_host_calc.inp.parameters.get_dict()) + params.set_multiple_values(EMIN=emin, EMAX=GF_host_calc.res.fermi_energy+dE_emax, NPOL=0, NPT1=0, NPT2=npt, NPT3=0) + ParaNode = ParameterData(dict=params.get_dict()) + + code = GF_host_calc.get_code() # take the same code as in the calculation before + GF_host_doscalc= code.new_calc() + resources = GF_host_calc.get_resources() + GF_host_doscalc.set_resources(resources) + GF_host_doscalc.use_parameters(ParaNode) + GF_host_doscalc.use_parent_folder(kkr_converged_parent_folder) + GF_host_doscalc.use_impurity_info(GF_host_calc.inp.impurity_info) + + # store and submit + GF_host_doscalc.store_all() + GF_host_doscalc.submit() + + # wait for calculation to finish + print 'host GF calc for DOS contour' + wait_for_it(GF_host_doscalc) + + # then KKRimp step using the converged potential + + kkrimp_doscalc = kkrimp_calc_converge.get_code().new_calc() + kkrimp_doscalc.use_host_Greenfunction_folder(GF_host_doscalc.out.remote_folder) + kkrimp_doscalc.use_parent_calc_folder(kkrimp_calc_converge.out.remote_folder) + kkrimp_doscalc.set_resources(kkrimp_calc_converge.get_resources()) + + # set to DOS settings + params = kkrparams(params_type='kkrimp', **kkrimp_calc_converge.inp.parameters.get_dict()) + params.set_multiple_values(RUNFLAG=['lmdos'], SCFSTEPS=1) + ParaNode = ParameterData(dict=params.get_dict()) + + kkrimp_doscalc.use_parameters(ParaNode) + + # store and submit calculation + kkrimp_doscalc.store_all() + kkrimp_doscalc.submit() + + # wait for calculation to finish - wait_for_it(kkrimp_calc_continued) \ No newline at end of file + print 'KKRimp calc DOS' + wait_for_it(kkrimp_doscalc) + + # Finally plot the DOS: + + # get interpolated DOS from GF_host_doscalc calculation: + from aiida_kkr.tools.common_functions import interpolate_dos + dospath_host = GF_host_doscalc.out.retrieved.get_abs_path('') + ef, dos, dos_interpol = interpolate_dos(dospath_host, return_original=True) + dos, dos_interpol = dos[0], dos_interpol[0] + + # read in impurity DOS + from numpy import loadtxt + impdos0 = loadtxt(kkrimp_doscalc.out.retrieved.get_abs_path('out_lmdos.interpol.atom=01_spin1.dat')) + impdos1 = loadtxt(kkrimp_doscalc.out.retrieved.get_abs_path('out_lmdos.interpol.atom=13_spin1.dat')) + # sum over spins: + impdos0[:,1:] = impdos0[:,1:]*2 + impdos1[:,1:] = impdos1[:,1:]*2 + + # plot bulk and impurity DOS + from matplotlib.pyplot import figure, fill_between, plot, legend, title, axhline, axvline, xlim, ylim, ylabel, xlabel, title, show + figure() + fill_between((dos_interpol[:,0]-ef)*13.6, dos_interpol[:,1]/13.6, color='lightgrey', lw=0, label='bulk Cu') + plot((impdos0[:,0]-ef)*13.6, impdos0[:,1]/13.6, label='Au imp') + plot((impdos0[:,0]-ef)*13.6, impdos1[:,1]/13.6, label='1st Cu neighbor') + plot((impdos0[:,0]-ef)*13.6, (impdos1[:,1]-dos_interpol[:,1])/dos_interpol[:,1], '--', label='relative difference in 1st Cu neighbor') + legend() + title('DOS of Au impurity embedded into bulk Cu') + axhline(0, lw=1, color='grey') + axvline(0, lw=1, color='grey') + xlim(-8, 1) + ylim(-0.5,8.5) + xlabel('E-E_F (eV)') + ylabel('DOS (states/eV)') + show() \ No newline at end of file