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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