From 42ac20c6a96e231bb305eee2e576c7b90ea6fd93 Mon Sep 17 00:00:00 2001
From: Mikkel Strange <mikst@fysik.dtu.dk>
Date: Wed, 21 Sep 2016 19:03:05 +0200
Subject: [PATCH] xc name seperated out in x and c parts

---
 parser/parser-gpaw/libxc_names.py | 39 +++++++++++++++++++++++++++++--
 parser/parser-gpaw/parser.py      |  8 ++++---
 2 files changed, 42 insertions(+), 5 deletions(-)

diff --git a/parser/parser-gpaw/libxc_names.py b/parser/parser-gpaw/libxc_names.py
index df65b9f..11c183a 100644
--- a/parser/parser-gpaw/libxc_names.py
+++ b/parser/parser-gpaw/libxc_names.py
@@ -1,4 +1,8 @@
 from __future__ import print_function
+import re
+#p = re.compile(r"(?P<x_name>.*_X.*)\+(?P<c_name>.*_C.*)")
+p = re.compile(
+  '((?P<x_name>(GGA|LDA|MGGA|HF|HYB_MGGA)_X.*)|(?P<c_name>(GGA|LDA|MGGA)_C.*))')
 
 short_names = {
         'LDA': 'LDA_X+LDA_C_PW',
@@ -24,7 +28,38 @@ def get_libxc_name(name):
         libxc_name = name
     return libxc_name
 
+def get_libxc_xc_names(name):
+    name = get_libxc_name(name)
+    xc = {'xc_name': None,
+          'x_name' : None,
+          'c_name': None}
+
+    if '_XC_' in name:
+        xc['xc_name'] = name
+        return xc
+
+    if '+' in name:
+        s = name.split('+')
+        xc['x_name'] = s[0]
+        xc['c_name'] = s[1]
+        return xc
+
+    m = re.search(p, name)
+    if m is not None: # it is either a correlation or exchange functional
+        xc.update(m.groupdict())
+        return xc
+
+    xc['xc_name'] = name  # for something like BEEF-vdW
+    return xc
 
 if __name__ == '__main__':
-    print(get_libxc_name('LDA'))
-    print(get_libxc_name('GGA_X_PBE'))
+#    print(get_libxc_name('LDA'))
+#    print(get_libxc_name('GGA_X_PBE'))
+    names = ['GGA_X_B88+GGA_C_LYP',
+             'HF_X',
+             'HYB_GGA_XC_B1LYP',
+             'HYB_GGA_XC_HSE03',
+             'BEEF-vdW',
+             'LDA_K_TF']
+    for name in names:
+        print(get_libxc_xc_names(name))
diff --git a/parser/parser-gpaw/parser.py b/parser/parser-gpaw/parser.py
index 435514e..e169f95 100644
--- a/parser/parser-gpaw/parser.py
+++ b/parser/parser-gpaw/parser.py
@@ -8,7 +8,7 @@ from nomadcore.unit_conversion.unit_conversion import convert_unit as cu
 from nomadcore.local_meta_info import loadJsonFile, InfoKindEl
 from nomadcore.parser_backend import JsonParseEventsWriterBackend
 from tar import Reader
-from libxc_names import get_libxc_name
+from libxc_names import get_libxc_xc_names
 
 
 @contextmanager
@@ -87,8 +87,10 @@ def parse(filename):
                 p.addRealValue('smearing_width',
                                c(r.FermiWidth, 'hartree'))
             with o(p, 'section_XC_functionals'):
-                p.addValue('XC_functional_name',
-                           get_libxc_name(r.XCFunctional))
+                xc_names = get_libxc_xc_names(r.XCFunctional)
+                for name in xc_names.values():
+                    if name is not None:
+                        p.addValue('XC_functional_name', name)
         with o(p, 'section_single_configuration_calculation'):
             p.addValue('single_configuration_calculation_to_system_ref',
                        system_gid)
-- 
GitLab