3
0
mirror of https://github.com/triqs/dft_tools synced 2024-06-29 00:15:00 +02:00

(style) add proper logging for warnings and debug info

This commit is contained in:
Oleg Peil 2023-03-24 17:36:35 +01:00
parent 1c9190496d
commit 2b93019874
3 changed files with 67 additions and 25 deletions

View File

@ -40,6 +40,36 @@ from . import vaspio
from .inpconf import ConfigParameters
from .elstruct import ElectronicStructure
from .plotools import generate_plo, output_as_text
import logging
class PloFormatter(logging.Formatter):
def format(self, record):
# Save the original format
_style = self._style
# Customized WARNING format
if record.levelno == logging.WARNING:
self._style = logging.PercentStyle("\n!!! WARNING !!!: %(msg)s\n")
result = super().format(record)
# Restore the original format
self._style = _style
return result
# Uncomment this to get extra output
#logging.basicConfig(level=logging.DEBUG)
# Main logger from which all other loggers should be inherited
main_log = logging.getLogger('plovasp')
main_log.propagate = False
handler = logging.StreamHandler(sys.stdout)
formatter = PloFormatter("[%(levelname)s]:[%(name)s]: %(message)s")
handler.setFormatter(formatter)
main_log.addHandler(handler)
def generate_and_output_as_text(conf_filename, vasp_dir):
"""

View File

@ -29,20 +29,17 @@ r"""
Storage and manipulation on projector shells.
"""
def issue_warning(message):
"""
Issues a warning.
"""
print()
print(" !!! WARNING !!!: " + message)
print()
import itertools as it
import logging
import numpy as np
from . import atm
np.set_printoptions(suppress=True)
log = logging.getLogger('plovasp.proj_shell')
################################################################################
################################################################################
#
@ -60,38 +57,50 @@ class ProjectorShell:
Parameters:
- sh_pars (dict) : shell parameters from the config-file
- proj_raw (numpy.array) : array of raw projectors
- proj_raw (numpy.array) : array of raw projectors from LOCPROJ
- proj_params (list[dict]) : parameters of raw projectors from LOCPROJ
- nc_flag (bool) : True if projectors are for non-collinear magnetic state
"""
def __init__(self, sh_pars, proj_raw, proj_params, kmesh, structure, nc_flag):
self.lorb = sh_pars['lshell']
self.ions = sh_pars['ions']
self.user_index = sh_pars['user_index']
log.debug(f"-- Shell index: {self.user_index}")
self.corr = sh_pars['corr']
self.ion_sort = [sh_pars['ion_sort']]
self.nc_flag = nc_flag
# try:
# self.tmatrix = sh_pars['tmatrix']
# except KeyError:
# self.tmatrix = None
self.lm1 = self.lorb**2
self.lm2 = (self.lorb+1)**2
self.lm2 = (self.lorb + 1)**2
self.nion = self.ions['nion']
# Extract ion list and equivalence classes (ion sorts)
# Extract ion list and equivalence classes (ion sorts)
# `ion_sort` contains actual indices of ions representing an equivalence class
self.ion_list = sorted(it.chain(*self.ions['ion_list']))
log.debug(f"-- ions: {self.ions}")
log.debug(f"-- ion_list: {self.ion_list}")
if self.ion_sort[0] is None:
self.ion_sort = []
# Not the most efficient algorithm but ensures that ion indices are properly
# ordered in the resulting `ion_sort`
for ion in self.ion_list:
for icl, eq_cl in enumerate(self.ions['ion_list']):
# Representative ion index of equivalence class `eq_cl`
ion_rep = eq_cl[0]
if ion in eq_cl:
log.debug(f"-- adding to equivalence class ({icl}, {eq_cl})")
log.debug(f"-- ion = {ion}, ion_rep = {ion_rep}")
self.ion_sort.append(ion_rep + 1) # Enumerate classes starting from 1
break
log.debug(f"-- ion_sort: {self.ion_sort}")
self.ndim = self.extract_tmatrices(sh_pars)
self.extract_projectors(proj_raw, proj_params, kmesh, structure)
@ -121,14 +130,13 @@ class ProjectorShell:
if self.nc_flag == False:
nm = self.lm2 - self.lm1
else:
nm = 2*(self.lm2 - self.lm1)
nm = 2 * (self.lm2 - self.lm1)
if 'tmatrices' in sh_pars:
self.do_transform = True
if 'tmatrix' in sh_pars:
mess = "Both TRANSFORM and TRANSFILE are specified, TRANSFORM will be ignored."
issue_warning(mess)
log.warning("Both TRANSFORM and TRANSFILE are specified, TRANSFORM will be ignored")
raw_matrices = sh_pars['tmatrices']
nrow, ncol = raw_matrices.shape

View File

@ -37,9 +37,11 @@ r"""
- EIGENVAL
- DOSCAR
"""
import logging
import numpy as np
import re
#import plocar_io.c_plocar_io as c_plocar_io
log = logging.getLogger('plovasp.vaspio')
def read_lines(filename):
r"""
@ -83,12 +85,13 @@ class VaspData:
except (IOError, StopIteration):
self.eigenval.eigs = None
self.eigenval.ferw = None
print("!!! WARNING !!!: Error reading from EIGENVAL, trying LOCPROJ")
log.warning("Error reading from EIGENVAL, trying LOCPROJ...")
try:
self.doscar.from_file(vasp_dir)
except (IOError, StopIteration):
if efermi_required:
print("!!! WARNING !!!: Error reading from Efermi from DOSCAR, trying LOCPROJ")
log.warning("Error reading Efermi from DOSCAR, trying LOCPROJ...")
try:
self.plocar.efermi
self.doscar.efermi = self.plocar.efermi
@ -96,7 +99,7 @@ class VaspData:
raise Exception("Efermi cannot be read from DOSCAR or LOCPROJ")
else:
# TODO: This a hack. Find out a way to determine ncdij without DOSCAR
print("!!! WARNING !!!: Error reading from DOSCAR, taking Efermi from config")
log.warning("Error reading Efermi from DOSCAR, taking from config")
self.doscar.ncdij = self.plocar.nspin
################################################################################
@ -168,14 +171,14 @@ class Plocar:
# VASP.6.
self.nspin = self.ncdij if self.ncdij < 4 else 1
print("ISPIN is {}".format(self.nspin))
log.debug("ISPIN is {}".format(self.nspin))
self.nspin_band = 2 if self.ncdij == 2 else 1
try:
self.efermi = float(sline[4])
except:
print("!!! WARNING !!!: Error reading E-Fermi from LOCPROJ, trying DOSCAR")
log.warning("Error reading Efermi from LOCPROJ, trying DOSCAR...")
plo = np.zeros((nproj, self.nspin, nk, self.nband), dtype=complex)
proj_params = [{} for i in range(nproj)]
@ -189,7 +192,8 @@ class Plocar:
self.ncdij = 1
else:
self.nc_flag = 0
print("NC FLAG : {}".format(self.nc_flag))
log.debug("NC FLAG : {}".format(self.nc_flag))
# First read the header block with orbital labels
line = self.search_for(f, "^ *ISITE")