From 0e002c1dd2271bbbd316e8133ceaf5f4fe700a35 Mon Sep 17 00:00:00 2001 From: Annabelle Lolinco Date: Wed, 3 Jul 2019 12:41:42 -0500 Subject: [PATCH 01/21] nwc: add tce dipole harvest --- qcengine/programs/nwchem/harvester.py | 62 +++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 4 deletions(-) diff --git a/qcengine/programs/nwchem/harvester.py b/qcengine/programs/nwchem/harvester.py index fa3759d8e..55e43d86b 100644 --- a/qcengine/programs/nwchem/harvester.py +++ b/qcengine/programs/nwchem/harvester.py @@ -201,9 +201,27 @@ def harvest_outfile_pass(outtext): else: psivar[f'{mbpt_plain} CORRECTION ENERGY'] = mobj.group(1) psivar[f'{mbpt_plain} TOTAL ENERGY'] = mobj.group(2) + #TCE dipole- MBPT(n) + mobj2 = re.search( + r'^\s+' + cc_name + r'dipole moments / hartree & Debye' + r'\s*' + + r'^\s+' + r'X' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + + r'^\s+' + r'Y' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + + r'^\s+' + r'Z' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + + r'^\s+' + r'Total' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*$', + outtext, re.MULTILINE) + + if mobj2: + mbpt_plain = cc_name.replace('\\', '').replace('MBPT', 'MP').replace('(', '').replace(')', '') + print(f'matched tce {mbpt_plain} dipole moment') + + #only pulling Debye + psivar[f'{mbpt_plain} DIPOLE X'] = mobj2.group(2) + psivar[f'{mbpt_plain} DIPOLE Y'] = mobj2.group(4) + psivar[f'{mbpt_plain} DIPOLE Z'] = mobj2.group(6) - # Process CC '()' correction part through tce [dertype] command - for cc_name in [r'CCSD\(T\)', r'CCSD\[T\]']: + #TCE with () or [] + for cc_name in [r'CCSD\(T\)', r'CCSD\[T\]', r'CCSD\(2\)_T', r'CCSD\(2\)', r'CCSDT\(2\)_Q', \ + r'CR-CCSD\[T\]', r'CR-CCSD\(T\)', r'LR-CCSD\(T\)', r'LR-CCSD\(TQ\)-1', r'CREOMSD\(T\)']: mobj = re.search( r'^\s+' + cc_name + r'\s+' + r'correction energy / hartree' + r'\s+=\s*' + NUMBER + r'\s*' + r'^\s+' + cc_name + r'\s+' + r'correlation energy / hartree' + r'\s+=\s*' + NUMBER + r'\s*' + @@ -212,13 +230,32 @@ def harvest_outfile_pass(outtext): if mobj: cc_plain = cc_name.replace('\\', '') cc_corr = cc_plain.replace('CCSD', '') - print(f'matched tce cc {cc_plain}') + print(f'matched tce {cc_plain}') psivar[f'{cc_corr} CORRECTION ENERGY'] = mobj.group(1) psivar[f'{cc_plain} CORRELATION ENERGY'] = mobj.group(2) psivar[f'{cc_plain} TOTAL ENERGY'] = mobj.group(3) + #TCE dipole with () or [] + mobj2 = re.search( + r'^\s+' + cc_name + r'dipole moments / hartree & Debye' + r'\s*' + + r'^\s+' + r'X' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + + r'^\s+' + r'Y' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + + r'^\s+' + r'Z' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + + r'^\s+' + r'Total' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*$', + outtext, re.MULTILINE) + + if mobj2: + cc_plain = cc_name.replace('\\', '') + cc_corr = cc_plain.replace('CCSD', '') + print(f'matched tce {cc_plain} dipole moment') + + #only pulling Debye + psivar[f'{cc_plain} DIPOLE X'] = mobj2.group(2) + psivar[f'{cc_plain} DIPOLE Y'] = mobj2.group(4) + psivar[f'{cc_plain} DIPOLE Z'] = mobj2.group(6) #Process other TCE cases - for cc_name in [r'CISD', r'CISDT', r'CISDTQ', r'CCD', r'CCSD', r'CCSDT', r'CCSDTQ', r'LCCSD', r'LCCD']: + for cc_name in [r'CISD', r'CISDT', r'CISDTQ', r'CCD', r'CC2', r'CCSD', r'CCSDT', r'CCSDTQ', \ + r'LCCSD', r'LCCD', r'CCSDTA']: mobj = re.search( r'^\s+' + r'Iterations converged' + r'\s*' + r'^\s+' + cc_name + r'\s+' + r'correlation energy / hartree' + r'\s+=\s*' + NUMBER + r'\s*'+ @@ -230,6 +267,23 @@ def harvest_outfile_pass(outtext): print(mobj) psivar[f'{cc_name} CORRELATION ENERGY'] = mobj.group(1) psivar[f'{cc_name} TOTAL ENERGY'] = mobj.group(2) + #TCE dipole + mobj2 = re.search( + r'^\s+' + cc_name + r'dipole moments / hartree & Debye' + r'\s*' + + r'^\s+' + r'X' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + + r'^\s+' + r'Y' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + + r'^\s+' + r'Z' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + + r'^\s+' + r'Total' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*$', + outtext, re.MULTILINE) + + if mobj2: + print(f'matched tce {cc_name} dipole moment') + + #only pulling Debye + psivar[f'{cc_name} DIPOLE X'] = mobj2.group(2) + psivar[f'{cc_name} DIPOLE Y'] = mobj2.group(4) + psivar[f'{cc_name} DIPOLE Z'] = mobj2.group(6) + #Process CCSD/CCSD(T) using nwchem CCSD/CCSD(T) [dertype] command mobj = re.search( From 7af13220f7f60bb92bc81d9f1f991c555e41304a Mon Sep 17 00:00:00 2001 From: Annabelle Lolinco Date: Tue, 16 Jul 2019 16:34:42 -0500 Subject: [PATCH 02/21] nwc: add tce dipole harvest --- qcengine/programs/nwchem/harvester.py | 63 ++++++++++++++++++++++++--- 1 file changed, 58 insertions(+), 5 deletions(-) diff --git a/qcengine/programs/nwchem/harvester.py b/qcengine/programs/nwchem/harvester.py index fa3759d8e..34e936186 100644 --- a/qcengine/programs/nwchem/harvester.py +++ b/qcengine/programs/nwchem/harvester.py @@ -201,24 +201,60 @@ def harvest_outfile_pass(outtext): else: psivar[f'{mbpt_plain} CORRECTION ENERGY'] = mobj.group(1) psivar[f'{mbpt_plain} TOTAL ENERGY'] = mobj.group(2) + #TCE dipole- MBPT(n) + mobj2 = re.search( + r'^\s+' + cc_name + r'dipole moments / hartree & Debye' + r'\s*' + + r'^\s+' + r'X' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + + r'^\s+' + r'Y' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + + r'^\s+' + r'Z' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + + r'^\s+' + r'Total' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*$', + outtext, re.MULTILINE) + + if mobj2: + mbpt_plain = cc_name.replace('\\', '').replace('MBPT', 'MP').replace('(', '').replace(')', '') + print(f'matched tce {mbpt_plain} dipole moment') + + #only pulling Debye + psivar[f'{mbpt_plain} DIPOLE X'] = mobj2.group(2) + psivar[f'{mbpt_plain} DIPOLE Y'] = mobj2.group(4) + psivar[f'{mbpt_plain} DIPOLE Z'] = mobj2.group(6) - # Process CC '()' correction part through tce [dertype] command - for cc_name in [r'CCSD\(T\)', r'CCSD\[T\]']: + #TCE with () or [] + for cc_name in [r'CCSD\(T\)', r'CCSD\[T\]', r'CCSD\(2\)_T', r'CCSD\(2\)', r'CCSDT\(2\)_Q', r'CR-CCSD\[T\]', r'CR-CCSD\(T\)', r'LR-CCSD\(T\)', r'LR-CCSD\(TQ\)-1', r'CREOMSD\(T\)']: mobj = re.search( r'^\s+' + cc_name + r'\s+' + r'correction energy / hartree' + r'\s+=\s*' + NUMBER + r'\s*' + r'^\s+' + cc_name + r'\s+' + r'correlation energy / hartree' + r'\s+=\s*' + NUMBER + r'\s*' + - r'^\s+' + cc_name + r'\s+' + r'total energy / hartree' + r'\s+=\s*' + NUMBER + r'\s*$', outtext, re.MULTILINE) + r'^\s+' + cc_name + r'\s+' + r'total energy / hartree' + r'\s+=\s*' + NUMBER + r'\s*$', + outtext, re.MULTILINE) if mobj: cc_plain = cc_name.replace('\\', '') cc_corr = cc_plain.replace('CCSD', '') - print(f'matched tce cc {cc_plain}') + print(f'matched tce {cc_plain}') psivar[f'{cc_corr} CORRECTION ENERGY'] = mobj.group(1) psivar[f'{cc_plain} CORRELATION ENERGY'] = mobj.group(2) psivar[f'{cc_plain} TOTAL ENERGY'] = mobj.group(3) + #TCE dipole with () or [] + mobj2 = re.search( + r'^\s+' + cc_name + r'dipole moments / hartree & Debye' + r'\s*' + + r'^\s+' + r'X' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + + r'^\s+' + r'Y' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + + r'^\s+' + r'Z' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + + r'^\s+' + r'Total' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*$', + outtext, re.MULTILINE) + + if mobj2: + cc_plain = cc_name.replace('\\', '') + cc_corr = cc_plain.replace('CCSD', '') + print(f'matched tce {cc_plain} dipole moment') + + #only pulling Debye + psivar[f'{cc_plain} DIPOLE X'] = mobj2.group(2) + psivar[f'{cc_plain} DIPOLE Y'] = mobj2.group(4) + psivar[f'{cc_plain} DIPOLE Z'] = mobj2.group(6) #Process other TCE cases - for cc_name in [r'CISD', r'CISDT', r'CISDTQ', r'CCD', r'CCSD', r'CCSDT', r'CCSDTQ', r'LCCSD', r'LCCD']: + for cc_name in [r'CISD', r'CISDT', r'CISDTQ', r'CCD', r'CC2', r'CCSD', r'CCSDT', r'CCSDTQ', r'LCCSD', r'LCCD', r'CCSDTA']: mobj = re.search( r'^\s+' + r'Iterations converged' + r'\s*' + r'^\s+' + cc_name + r'\s+' + r'correlation energy / hartree' + r'\s+=\s*' + NUMBER + r'\s*'+ @@ -230,6 +266,23 @@ def harvest_outfile_pass(outtext): print(mobj) psivar[f'{cc_name} CORRELATION ENERGY'] = mobj.group(1) psivar[f'{cc_name} TOTAL ENERGY'] = mobj.group(2) + #TCE dipole + mobj2 = re.search( + r'^\s+' + cc_name + r'dipole moments / hartree & Debye' + r'\s*' + + r'^\s+' + r'X' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + + r'^\s+' + r'Y' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + + r'^\s+' + r'Z' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + + r'^\s+' + r'Total' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*$', + outtext, re.MULTILINE) + + if mobj2: + print(f'matched tce {cc_name} dipole moment') + + #only pulling Debye + psivar[f'{cc_name} DIPOLE X'] = mobj2.group(2) + psivar[f'{cc_name} DIPOLE Y'] = mobj2.group(4) + psivar[f'{cc_name} DIPOLE Z'] = mobj2.group(6) + #Process CCSD/CCSD(T) using nwchem CCSD/CCSD(T) [dertype] command mobj = re.search( From a1707c2c9d08a49a7f5e0ef7bc357f054194c4d7 Mon Sep 17 00:00:00 2001 From: Annabelle Lolinco Date: Fri, 19 Jul 2019 11:36:45 -0500 Subject: [PATCH 03/21] nwc: dipole regex edit --- qcengine/programs/nwchem/harvester.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/qcengine/programs/nwchem/harvester.py b/qcengine/programs/nwchem/harvester.py index 34e936186..0fbd25c45 100644 --- a/qcengine/programs/nwchem/harvester.py +++ b/qcengine/programs/nwchem/harvester.py @@ -544,13 +544,19 @@ def harvest_outfile_pass(outtext): #Process dipole mobj = re.search( - r'^\s+' + r'Dipole moment' + r'\s+' + NUMBER + r'\s' + r'A\.U\.' + r'\s*' + r'^\s+' + r'DMX' + r'\s+' + - NUMBER + r'.*' + r'\s*' + r'^\s+' + r'DMY' + r'\s+' + NUMBER + r'.*' + r'\s*' + r'^\s+' + r'DMZ' + r'\s+' + - NUMBER + r'.' + r'\s*' + r'^\s+' + r'.*' + r'\s*' + r'^\s+' + r'Total dipole' + r'\s+' + NUMBER + r'\s' + - r'A\.U\.' + r'\s*' + r'^\s+' + r'Dipole moment' + r'\s+' + NUMBER + r'\s' + r'Debye\(s\)' + r'\s*' + - r'^\s+' + r'DMX' + r'\s+' + NUMBER + r'.*' + r'\s*' + r'^\s+' + r'DMY' + r'\s+' + NUMBER + r'.*' + r'\s*' + - r'^\s+' + r'DMZ' + r'\s+' + NUMBER + r'.*' + r'\s*' + r'^\s+' + r'.*' + r'\s*' + r'^\s+' + r'Total dipole' - + r'\s+' + NUMBER + r'\s' + r'DEBYE\(S\)' + r'\s*$', outtext, re.MULTILINE) + r'^\s+' + r'Dipole moment' + r'\s+' + NUMBER + r'\s+' + r'A\.U\.' + r'\s*' + + r'^\s+' + r'DMX' + r'\s+' + NUMBER + r'.*' + + r'^\s+' + r'DMY' + r'\s+' + NUMBER + r'.*' + + r'^\s+' + r'DMZ' + r'\s+' + NUMBER + r'.*' + + r'^\s+' + r'.*' + + r'^\s+' + r'Total dipole' + r'\s+' + NUMBER + r'\s+' + r'A\.U\.' + r'\s*' + + r'^\s+' + r'Dipole moment' + r'\s+' + NUMBER + r'\s' + r'Debye\(s\)' + r'\s*' + + r'^\s+' + r'DMX' + r'\s+' + NUMBER + r'.*' + + r'^\s+' + r'DMY' + r'\s+' + NUMBER + r'.*' + + r'^\s+' + r'DMZ' + r'\s+' + NUMBER + r'.*' + + r'^\s+' + r'.*' + + r'^\s+' + r'Total dipole' + r'\s+' + NUMBER + r'\s' + r'DEBYE\(S\)' + r'\s*$', + outtext, re.MULTILINE) if mobj: print('matched total dipole') From 064624ed63bbc02c846f1c02483b5da6577fd436 Mon Sep 17 00:00:00 2001 From: Annabelle Lolinco Date: Wed, 3 Jul 2019 12:41:42 -0500 Subject: [PATCH 04/21] nwc: add tce dipole harvest --- qcengine/programs/nwchem/harvester.py | 45 ++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/qcengine/programs/nwchem/harvester.py b/qcengine/programs/nwchem/harvester.py index 1e082b3f6..1051eb1c8 100644 --- a/qcengine/programs/nwchem/harvester.py +++ b/qcengine/programs/nwchem/harvester.py @@ -197,9 +197,26 @@ def harvest_outfile_pass(outtext): else: psivar[f'{mbpt_plain} CORRECTION ENERGY'] = mobj.group(1) psivar[f'{mbpt_plain} TOTAL ENERGY'] = mobj.group(2) + #TCE dipole- MBPT(n) + mobj2 = re.search( + r'^\s+' + cc_name + r'dipole moments / hartree & Debye' + r'\s*' + + r'^\s+' + r'X' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + + r'^\s+' + r'Y' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + + r'^\s+' + r'Z' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + + r'^\s+' + r'Total' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*$', + outtext, re.MULTILINE) + + if mobj2: + mbpt_plain = cc_name.replace('\\', '').replace('MBPT', 'MP').replace('(', '').replace(')', '') + print(f'matched tce {mbpt_plain} dipole moment') + + #only pulling Debye + psivar[f'{mbpt_plain} DIPOLE X'] = mobj2.group(2) + psivar[f'{mbpt_plain} DIPOLE Y'] = mobj2.group(4) + psivar[f'{mbpt_plain} DIPOLE Z'] = mobj2.group(6) - # Process CC '()' correction part through tce [dertype] command - for cc_name in [r'CCSD\(T\)', r'CCSD\[T\]']: + #TCE with () or [] + for cc_name in [r'CCSD\(T\)', r'CCSD\[T\]', r'CCSD\(2\)_T', r'CCSD\(2\)', r'CCSDT\(2\)_Q', r'CR-CCSD\[T\]', r'CR-CCSD\(T\)', r'LR-CCSD\(T\)', r'LR-CCSD\(TQ\)-1', r'CREOMSD\(T\)']: mobj = re.search( r'^\s+' + cc_name + r'\s+' + r'correction energy / hartree' + r'\s+=\s*' + NUMBER + r'\s*' + r'^\s+' + cc_name + r'\s+' + r'correlation energy / hartree' + r'\s+=\s*' + NUMBER + r'\s*' + @@ -209,13 +226,14 @@ def harvest_outfile_pass(outtext): if mobj: cc_plain = cc_name.replace('\\', '') cc_corr = cc_plain.replace('CCSD', '') - print(f'matched tce cc {cc_plain}') + print(f'matched tce {cc_plain}') psivar[f'{cc_corr} CORRECTION ENERGY'] = mobj.group(1) psivar[f'{cc_plain} CORRELATION ENERGY'] = mobj.group(2) psivar[f'{cc_plain} TOTAL ENERGY'] = mobj.group(3) - # Process other TCE cases - for cc_name in [r'CISD', r'CISDT', r'CISDTQ', r'CCD', r'CCSD', r'CCSDT', r'CCSDTQ', r'LCCSD', r'LCCD']: + + #Process other TCE cases + for cc_name in [r'CISD', r'CISDT', r'CISDTQ', r'CCD', r'CC2', r'CCSD', r'CCSDT', r'CCSDTQ', r'LCCSD', r'LCCD', r'CCSDTA']: mobj = re.search( r'^\s+' + r'Iterations converged' + r'\s*' + r'^\s+' + cc_name + r'\s+' + r'correlation energy / hartree' + r'\s+=\s*' + NUMBER + r'\s*' + r'^\s+' + cc_name + r'\s+' + @@ -226,6 +244,23 @@ def harvest_outfile_pass(outtext): print(mobj) psivar[f'{cc_name} CORRELATION ENERGY'] = mobj.group(1) psivar[f'{cc_name} TOTAL ENERGY'] = mobj.group(2) + #TCE dipole + mobj2 = re.search( + r'^\s+' + cc_name + r'dipole moments / hartree & Debye' + r'\s*' + + r'^\s+' + r'X' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + + r'^\s+' + r'Y' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + + r'^\s+' + r'Z' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + + r'^\s+' + r'Total' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*$', + outtext, re.MULTILINE) + + if mobj2: + print(f'matched tce {cc_name} dipole moment') + + #only pulling Debye + psivar[f'{cc_name} DIPOLE X'] = mobj2.group(2) + psivar[f'{cc_name} DIPOLE Y'] = mobj2.group(4) + psivar[f'{cc_name} DIPOLE Z'] = mobj2.group(6) + # Process CCSD/CCSD(T) using nwchem CCSD/CCSD(T) [dertype] command mobj = re.search( From 212150289e33a980ee7c93a29f77df841eb73c9a Mon Sep 17 00:00:00 2001 From: Annabelle Lolinco Date: Tue, 16 Jul 2019 16:34:42 -0500 Subject: [PATCH 05/21] nwc: add tce dipole harvest --- qcengine/programs/nwchem/harvester.py | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/qcengine/programs/nwchem/harvester.py b/qcengine/programs/nwchem/harvester.py index 1051eb1c8..f25618868 100644 --- a/qcengine/programs/nwchem/harvester.py +++ b/qcengine/programs/nwchem/harvester.py @@ -209,7 +209,6 @@ def harvest_outfile_pass(outtext): if mobj2: mbpt_plain = cc_name.replace('\\', '').replace('MBPT', 'MP').replace('(', '').replace(')', '') print(f'matched tce {mbpt_plain} dipole moment') - #only pulling Debye psivar[f'{mbpt_plain} DIPOLE X'] = mobj2.group(2) psivar[f'{mbpt_plain} DIPOLE Y'] = mobj2.group(4) @@ -220,8 +219,8 @@ def harvest_outfile_pass(outtext): mobj = re.search( r'^\s+' + cc_name + r'\s+' + r'correction energy / hartree' + r'\s+=\s*' + NUMBER + r'\s*' + r'^\s+' + cc_name + r'\s+' + r'correlation energy / hartree' + r'\s+=\s*' + NUMBER + r'\s*' + - r'^\s+' + cc_name + r'\s+' + r'total energy / hartree' + r'\s+=\s*' + NUMBER + r'\s*$', outtext, - re.MULTILINE) # yapf: disable + r'^\s+' + cc_name + r'\s+' + r'total energy / hartree' + r'\s+=\s*' + NUMBER + r'\s*$', + outtext, re.MULTILINE) if mobj: cc_plain = cc_name.replace('\\', '') @@ -232,6 +231,25 @@ def harvest_outfile_pass(outtext): psivar[f'{cc_plain} CORRELATION ENERGY'] = mobj.group(2) psivar[f'{cc_plain} TOTAL ENERGY'] = mobj.group(3) + #TCE dipole with () or [] + mobj2 = re.search( + r'^\s+' + cc_name + r'dipole moments / hartree & Debye' + r'\s*' + + r'^\s+' + r'X' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + + r'^\s+' + r'Y' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + + r'^\s+' + r'Z' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + + r'^\s+' + r'Total' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*$', + outtext, re.MULTILINE) + + if mobj2: + cc_plain = cc_name.replace('\\', '') + cc_corr = cc_plain.replace('CCSD', '') + print(f'matched tce {cc_plain} dipole moment') + + #only pulling Debye + psivar[f'{cc_plain} DIPOLE X'] = mobj2.group(2) + psivar[f'{cc_plain} DIPOLE Y'] = mobj2.group(4) + psivar[f'{cc_plain} DIPOLE Z'] = mobj2.group(6) + #Process other TCE cases for cc_name in [r'CISD', r'CISDT', r'CISDTQ', r'CCD', r'CC2', r'CCSD', r'CCSDT', r'CCSDTQ', r'LCCSD', r'LCCD', r'CCSDTA']: mobj = re.search( @@ -252,7 +270,6 @@ def harvest_outfile_pass(outtext): r'^\s+' + r'Z' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + r'^\s+' + r'Total' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*$', outtext, re.MULTILINE) - if mobj2: print(f'matched tce {cc_name} dipole moment') @@ -261,7 +278,6 @@ def harvest_outfile_pass(outtext): psivar[f'{cc_name} DIPOLE Y'] = mobj2.group(4) psivar[f'{cc_name} DIPOLE Z'] = mobj2.group(6) - # Process CCSD/CCSD(T) using nwchem CCSD/CCSD(T) [dertype] command mobj = re.search( r'^\s+' + r'-----------' + r'\s*' + r'^\s+' + r'CCSD Energy' + r'\s*' + r'^\s+' + r'-----------' + r'\s*' + From b89f413fe36264e136fc4137d79f3e3142e57fdb Mon Sep 17 00:00:00 2001 From: Annabelle Lolinco Date: Fri, 19 Jul 2019 11:36:45 -0500 Subject: [PATCH 06/21] nwc: dipole regex edit --- qcengine/programs/nwchem/harvester.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/qcengine/programs/nwchem/harvester.py b/qcengine/programs/nwchem/harvester.py index f25618868..726a1f431 100644 --- a/qcengine/programs/nwchem/harvester.py +++ b/qcengine/programs/nwchem/harvester.py @@ -544,13 +544,19 @@ def harvest_outfile_pass(outtext): # Process dipole mobj = re.search( - r'^\s+' + r'Dipole moment' + r'\s+' + NUMBER + r'\s' + r'A\.U\.' + r'\s*' + r'^\s+' + r'DMX' + r'\s+' + - NUMBER + r'.*' + r'\s*' + r'^\s+' + r'DMY' + r'\s+' + NUMBER + r'.*' + r'\s*' + r'^\s+' + r'DMZ' + r'\s+' + - NUMBER + r'.' + r'\s*' + r'^\s+' + r'.*' + r'\s*' + r'^\s+' + r'Total dipole' + r'\s+' + NUMBER + r'\s' + - r'A\.U\.' + r'\s*' + r'^\s+' + r'Dipole moment' + r'\s+' + NUMBER + r'\s' + r'Debye\(s\)' + r'\s*' + - r'^\s+' + r'DMX' + r'\s+' + NUMBER + r'.*' + r'\s*' + r'^\s+' + r'DMY' + r'\s+' + NUMBER + r'.*' + r'\s*' + - r'^\s+' + r'DMZ' + r'\s+' + NUMBER + r'.*' + r'\s*' + r'^\s+' + r'.*' + r'\s*' + r'^\s+' + - r'Total dipole' + r'\s+' + NUMBER + r'\s' + r'DEBYE\(S\)' + r'\s*$', outtext, re.MULTILINE) + r'^\s+' + r'Dipole moment' + r'\s+' + NUMBER + r'\s+' + r'A\.U\.' + r'\s*' + + r'^\s+' + r'DMX' + r'\s+' + NUMBER + r'.*' + + r'^\s+' + r'DMY' + r'\s+' + NUMBER + r'.*' + + r'^\s+' + r'DMZ' + r'\s+' + NUMBER + r'.*' + + r'^\s+' + r'.*' + + r'^\s+' + r'Total dipole' + r'\s+' + NUMBER + r'\s+' + r'A\.U\.' + r'\s*' + + r'^\s+' + r'Dipole moment' + r'\s+' + NUMBER + r'\s' + r'Debye\(s\)' + r'\s*' + + r'^\s+' + r'DMX' + r'\s+' + NUMBER + r'.*' + + r'^\s+' + r'DMY' + r'\s+' + NUMBER + r'.*' + + r'^\s+' + r'DMZ' + r'\s+' + NUMBER + r'.*' + + r'^\s+' + r'.*' + + r'^\s+' + r'Total dipole' + r'\s+' + NUMBER + r'\s' + r'DEBYE\(S\)' + r'\s*$', + outtext, re.MULTILINE) if mobj: print('matched total dipole') From c266d5d27dda519c44e3779bc0196d24dd68fc11 Mon Sep 17 00:00:00 2001 From: Annabelle Lolinco Date: Fri, 18 Oct 2019 10:23:54 -0500 Subject: [PATCH 07/21] nwc: add keep file for running hess, adjust harvester' --- qcengine/programs/nwchem/harvester.py | 14 +++++++------- qcengine/programs/nwchem/runner.py | 7 +++++-- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/qcengine/programs/nwchem/harvester.py b/qcengine/programs/nwchem/harvester.py index 726a1f431..2f4f8ff96 100644 --- a/qcengine/programs/nwchem/harvester.py +++ b/qcengine/programs/nwchem/harvester.py @@ -199,7 +199,7 @@ def harvest_outfile_pass(outtext): psivar[f'{mbpt_plain} TOTAL ENERGY'] = mobj.group(2) #TCE dipole- MBPT(n) mobj2 = re.search( - r'^\s+' + cc_name + r'dipole moments / hartree & Debye' + r'\s*' + + r'^\s+' + r'dipole moments / hartree & Debye' + r'\s*' + r'^\s+' + r'X' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + r'^\s+' + r'Y' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + r'^\s+' + r'Z' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + @@ -264,19 +264,19 @@ def harvest_outfile_pass(outtext): psivar[f'{cc_name} TOTAL ENERGY'] = mobj.group(2) #TCE dipole mobj2 = re.search( - r'^\s+' + cc_name + r'dipole moments / hartree & Debye' + r'\s*' + + r'^\s+' + r'dipole moments / hartree & Debye' + r'\s*' + r'^\s+' + r'X' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + r'^\s+' + r'Y' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + r'^\s+' + r'Z' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + r'^\s+' + r'Total' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*$', outtext, re.MULTILINE) if mobj2: - print(f'matched tce {cc_name} dipole moment') + print(f'matched tce dipole moment') #only pulling Debye - psivar[f'{cc_name} DIPOLE X'] = mobj2.group(2) - psivar[f'{cc_name} DIPOLE Y'] = mobj2.group(4) - psivar[f'{cc_name} DIPOLE Z'] = mobj2.group(6) + psivar[f'CURRENT DIPOLE X'] = mobj2.group(2) + psivar[f'CURRENT DIPOLE Y'] = mobj2.group(4) + psivar[f'CURRENT DIPOLE Z'] = mobj2.group(6) # Process CCSD/CCSD(T) using nwchem CCSD/CCSD(T) [dertype] command mobj = re.search( @@ -542,7 +542,7 @@ def harvest_outfile_pass(outtext): atoms.append(lline[1]) # Tag psivar_grad.append([float(lline[-3]), float(lline[-2]), float(lline[-1])]) - # Process dipole + # Process dipole (Properties) mobj = re.search( r'^\s+' + r'Dipole moment' + r'\s+' + NUMBER + r'\s+' + r'A\.U\.' + r'\s*' + r'^\s+' + r'DMX' + r'\s+' + NUMBER + r'.*' + diff --git a/qcengine/programs/nwchem/runner.py b/qcengine/programs/nwchem/runner.py index 1dda47102..8bf2c7d73 100644 --- a/qcengine/programs/nwchem/runner.py +++ b/qcengine/programs/nwchem/runner.py @@ -115,7 +115,10 @@ def build_input(self, input_model: 'ResultInput', config: 'JobConfig', # Handle basis set # * for nwchem, still needs sph and ghost for el in set(input_model.molecule.symbols): - opts[f'basis__{el}'] = f'library {input_model.model.basis}' + if ropts.scrolls['QCDB']['BASIS'] == "nwchem-{el}": + opts[f'basis_nwchem-{el}'] = f'library {input_model.model.basis}' + else: + opts[f'basis__{el}'] = f'library {input_model.model.basis}' print('JOB_OPTS') pp.pprint(opts) @@ -139,7 +142,7 @@ def execute(self, success, dexe = execute( inputs["command"], inputs["infiles"], - ["job.movecs", "job.hess", "job.db", "job.zmat"], + ["job.movecs", "job.hess", "job.db", "job.zmat", "job.fd_dipole"], scratch_messy=False, scratch_directory=inputs["scratch_directory"], ) From 8a0dbdbf10358c3768dfc8ff7665c4e837e10e1a Mon Sep 17 00:00:00 2001 From: Annabelle Lolinco Date: Mon, 18 Nov 2019 15:20:38 -0600 Subject: [PATCH 08/21] nwc: add tddft to germinate; rm specific qcdb opts for basis set --- qcengine/programs/nwchem/germinate.py | 3 +++ qcengine/programs/nwchem/runner.py | 5 +---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/qcengine/programs/nwchem/germinate.py b/qcengine/programs/nwchem/germinate.py index 0b9c5e3f0..5ef592386 100644 --- a/qcengine/programs/nwchem/germinate.py +++ b/qcengine/programs/nwchem/germinate.py @@ -62,5 +62,8 @@ def muster_modelchem(method: str, derint: int, use_tce: bool) -> Tuple[str, Dict opts['tce__ccsd(t)'] = True else: mdccmd = f'task ccsd(t) {runtyp}\n\n' + + elif method == 'tddft': + mdccmd = f'task tddft {runtyp}\n\n' return mdccmd, opts diff --git a/qcengine/programs/nwchem/runner.py b/qcengine/programs/nwchem/runner.py index 8bf2c7d73..eac9a6aad 100644 --- a/qcengine/programs/nwchem/runner.py +++ b/qcengine/programs/nwchem/runner.py @@ -115,10 +115,7 @@ def build_input(self, input_model: 'ResultInput', config: 'JobConfig', # Handle basis set # * for nwchem, still needs sph and ghost for el in set(input_model.molecule.symbols): - if ropts.scrolls['QCDB']['BASIS'] == "nwchem-{el}": - opts[f'basis_nwchem-{el}'] = f'library {input_model.model.basis}' - else: - opts[f'basis__{el}'] = f'library {input_model.model.basis}' + opts[f'basis__{el}'] = f'library {input_model.model.basis}' print('JOB_OPTS') pp.pprint(opts) From 835255bb17ee25d9350ea239ef236dac8aff8444 Mon Sep 17 00:00:00 2001 From: Annabelle Lolinco Date: Wed, 27 Nov 2019 13:33:08 -0600 Subject: [PATCH 09/21] nwc: regex edits to tddft, eom (wip) --- qcengine/programs/nwchem/harvester.py | 53 +++++++++++++++------------ 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/qcengine/programs/nwchem/harvester.py b/qcengine/programs/nwchem/harvester.py index 1b217718f..4985858f2 100644 --- a/qcengine/programs/nwchem/harvester.py +++ b/qcengine/programs/nwchem/harvester.py @@ -310,28 +310,25 @@ def harvest_outfile_pass(outtext): # psivar name might need to be fixed # each root excitation energy is extracted from the last iteration of right hand side mobj = re.findall( - # r'^\s+' + r'Excited-state calculation' + r'\s+' + r'\(\s+' + r'(.*?)' + r'\s+' + r'symmetry\)' + r'\s*' + - # r'^\s+' + r'=========================================' + r'\s*' + r'(?:.*?)' - # + #Skip to line before right-hand side iterations - # r'^\s+' + r'EOM-' + cc_name + r' right-hand side iterations' + r'\s*' + r'(?:.*?)' + r'^\s+' + r'Iteration' - # + r'\s+\d+\s+' + r'using' + r'\s+\d+\s+' + r'trial vectors' + r'\s*' + - # r'((?:\s+[-+]?\d+\.\d+\s+[-+]?\d+\.\d+\s+[-+]?\d+\.\d+(?:(\s+\d+\.\d+\s+\d+\.\d+)?)\s*\n)+)' + r'^\s+' + - # r'--------------------------------------------------------------' + r'\s*' + r'^\s+' + - # r'Iterations converged' + r'\s*$', - # outtext, - # re.MULTILINE | re.DOTALL) - r'^\s+' + r'Excited-state calculation' + r'\s+' + r'\((.*?)\)' + r'\s*' + - r'^\s+' + r'EOM-' + cc_name + r'\s+right-hand side iterations' + r'\s*' + # capture cc_name - r'^\s+' + r'Iterations converged' + r'\s*' + # skip to excitation - r'^\s+' + r'Excited state root\s+\d{1,2}\s*' + - r'^\s+' + r'Excitation energy / hartree' + r'\s+=\s+' + NUMBER + r'\s*' + - r'^\s+' + r'/ eV\s+' + r'\s+=\s+' + NUMBER + r'\s*$', + r'^\s+(?:Excited-state calculation \( )(.*)\s+(?:symmetry\))\s+(?:.*\n)*^\s+EOM-' + cc-name + + # (..) captures symmetry + r'right-hand side iterations\s+(?:.*\n)*(?:Excited state root)\s+' + NUMBER + #root + r'\s*(?:Excitation energy / hartree)\s+.\s+' + NUMBER + #excitation energy hartree + r'\s*(?:/ eV)\s+.\s+' + NUMBER + r'\s*$', #excitation energy eV outtext, re.MULTILINE | re.DOTALL) + #regex should be more dynamic in finding values + #mobj.group(0) = symmetry value + #mobj.group(1) = cc_name + #mobj.group(2) = root number + #mobj.group(3) = excitation energy (hartree) + #mobj.group(4) = excitation energy (eV) if mobj: + print(mobj) ext_energy = {} # dic ext_energy_list = [] + print(f'matched eom-{cc_name}') for mobj_list in mobj: print('matched EOM-%s - %s symmetry' % (cc_name, mobj_list[0])) # cc_name, symmetry print(mobj_list) @@ -370,17 +367,25 @@ def harvest_outfile_pass(outtext): # Process TDDFT # 1) Spin allowed mobj = re.findall( - r'^\s+' + r'----------------------------------------------------------------------------' + r'\s*' + - r'^\s+' + r'Root' + r'\s+' + r'(\d+)' + r'\s+' + r'(\w+)' + r'\s+' + r'(.*?)' + r'\s+' + NUMBER + - r'\s+a\.u\.\s+' + NUMBER + r'\s+eV\s*' + r'^\s+' + - r'----------------------------------------------------------------------------' + r'\s*' + r'^\s+' + - r'Transition Moments' + r'\s+X\s+' + NUMBER + r'\s+Y\s+' + NUMBER + r'\s+Z\s+' + NUMBER + r'\s*' + r'^\s+' - + r'Transition Moments' + r'\s+XX\s+' + NUMBER + r'\s+XY\s+' + NUMBER + r'\s+XZ\s+' + NUMBER + r'\s*' + - r'^\s+' + r'Transition Moments' + r'\s+YY\s+' + NUMBER + r'\s+YZ\s+' + NUMBER + r'\s+ZZ\s+' + NUMBER + - r'\s*$', outtext, re.MULTILINE) + r'^\s+(?:Root)\s+(\d+)\s(\w+)\s+(.*?)\s+(\d+\.\d+)\s(?:a\.u\.)\s+(\d+\.\d+)\s+(?:\w+)' + #Root # singlet/triplet symmetry # a.u. # eV + + r'\s+(?:.*\n)\s+Transition Moments\s+X\s'+ NUMBER + r'\s+Y\s'+ NUMBER+ r'\s+Z\s'+ NUMBER + #X # Y # Z # + + r'\s+Transition Moments\s+XX\s'+ NUMBER + r'\s+XY\s'+ NUMBER+ r'\s+XZ\s'+ NUMBER + + r'\s+Transition Moments\s+YY\s'+ NUMBER + r'\s+YZ\s'+ NUMBER+ r'\s+ZZ\s'+ NUMBER + r'\s*$', + outtext, re.MULTILINE) + #r'^\s+' + r'----------------------------------------------------------------------------' + r'\s*' + + #r'^\s+' + r'Root' + r'\s+' + r'(\d+)' + r'\s+' + r'(\w+)' + r'\s+' + r'(.*?)' + r'\s+' + NUMBER + + #r'\s+a\.u\.\s+' + NUMBER + r'\s+eV\s*' + r'^\s+' + + #r'----------------------------------------------------------------------------' + r'\s*' + r'^\s+' + + #r'Transition Moments' + r'\s+X\s+' + NUMBER + r'\s+Y\s+' + NUMBER + r'\s+Z\s+' + NUMBER + r'\s*' + r'^\s+' + #+ r'Transition Moments' + r'\s+XX\s+' + NUMBER + r'\s+XY\s+' + NUMBER + r'\s+XZ\s+' + NUMBER + r'\s*' + + #r'^\s+' + r'Transition Moments' + r'\s+YY\s+' + NUMBER + r'\s+YZ\s+' + NUMBER + r'\s+ZZ\s+' + NUMBER + + #r'\s*$', outtext, re.MULTILINE) if mobj: print('matched TDDFT with transition moments') + print(mobj) for mobj_list in mobj: # print (mobj_list) # print (mobj_list[0]) #root number From 3fd4228c7ce11b12f9704b76eb7a75de3ccfff8a Mon Sep 17 00:00:00 2001 From: Annabelle Lolinco Date: Mon, 2 Dec 2019 17:49:05 -0600 Subject: [PATCH 10/21] nwc:tddft regex edit (wip) --- qcengine/programs/nwchem/harvester.py | 38 ++++++++++----------------- 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/qcengine/programs/nwchem/harvester.py b/qcengine/programs/nwchem/harvester.py index 4985858f2..d2107b44b 100644 --- a/qcengine/programs/nwchem/harvester.py +++ b/qcengine/programs/nwchem/harvester.py @@ -367,36 +367,26 @@ def harvest_outfile_pass(outtext): # Process TDDFT # 1) Spin allowed mobj = re.findall( - r'^\s+(?:Root)\s+(\d+)\s(\w+)\s+(.*?)\s+(\d+\.\d+)\s(?:a\.u\.)\s+(\d+\.\d+)\s+(?:\w+)' - #Root # singlet/triplet symmetry # a.u. # eV - + r'\s+(?:.*\n)\s+Transition Moments\s+X\s'+ NUMBER + r'\s+Y\s'+ NUMBER+ r'\s+Z\s'+ NUMBER - #X # Y # Z # - + r'\s+Transition Moments\s+XX\s'+ NUMBER + r'\s+XY\s'+ NUMBER+ r'\s+XZ\s'+ NUMBER - + r'\s+Transition Moments\s+YY\s'+ NUMBER + r'\s+YZ\s'+ NUMBER+ r'\s+ZZ\s'+ NUMBER + r'\s*$', + r'^\s+(?:Root)\s+(\d+)\s+(.*?)\s+' + NUMBER + r'\s(?:a\.u\.)\s+' + NUMBER + r'\s+(?:\w+)' + #Root | symmetry | a.u. | eV + + r'\s+(?:.\w+.\s+.\s+\d+.\d+)' #s2 value + + r'\s+(?:.*\n)\s+Transition Moments\s+X\s+'+ NUMBER + r'\s+Y\s+'+ NUMBER+ r'\s+Z\s+'+ NUMBER #dipole + + r'\s+Transition Moments\s+XX\s+'+ NUMBER + r'\s+XY\s+'+ NUMBER+ r'\s+XZ\s+'+ NUMBER #quadrople + + r'\s+Transition Moments\s+YY\s+'+ NUMBER + r'\s+YZ\s+'+ NUMBER+ r'\s+ZZ\s+'+ NUMBER #quadrople + + r'\s*$', outtext, re.MULTILINE) - #r'^\s+' + r'----------------------------------------------------------------------------' + r'\s*' + - #r'^\s+' + r'Root' + r'\s+' + r'(\d+)' + r'\s+' + r'(\w+)' + r'\s+' + r'(.*?)' + r'\s+' + NUMBER + - #r'\s+a\.u\.\s+' + NUMBER + r'\s+eV\s*' + r'^\s+' + - #r'----------------------------------------------------------------------------' + r'\s*' + r'^\s+' + - #r'Transition Moments' + r'\s+X\s+' + NUMBER + r'\s+Y\s+' + NUMBER + r'\s+Z\s+' + NUMBER + r'\s*' + r'^\s+' - #+ r'Transition Moments' + r'\s+XX\s+' + NUMBER + r'\s+XY\s+' + NUMBER + r'\s+XZ\s+' + NUMBER + r'\s*' + - #r'^\s+' + r'Transition Moments' + r'\s+YY\s+' + NUMBER + r'\s+YZ\s+' + NUMBER + r'\s+ZZ\s+' + NUMBER + - #r'\s*$', outtext, re.MULTILINE) if mobj: print('matched TDDFT with transition moments') - print(mobj) for mobj_list in mobj: - # print (mobj_list) - # print (mobj_list[0]) #root number - # print (mobj_list[1]) #singlet or triplet? - # print (mobj_list[2]) #symmetry - + print (mobj_list) + psivar['TDDFT ROOT %s EXCITATION ENERGY - %s SYMMETRY' % (mobj_list[0], mobj_list[1])] = mobj_list[2] #in eV + psivar['TDDFT ROOT %s EXCITED STATE ENERGY - %s SYMMETRY' % (mobj_list[0], mobj_list[1])] = psivar['DFT TOTAL ENERGY'] + Decimal(mobj_list[2]) #### temporary psivars #### - psivar['TDDFT ROOT %s %s %s EXCITATION ENERGY' % - (mobj_list[0], mobj_list[1], mobj_list[2])] = mobj_list[3] # in a.u. - psivar ['TDDFT ROOT %s %s %s EXCITED STATE ENERGY' %(mobj_list[0],mobj_list[1],mobj_list[2])] = \ - psivar ['DFT TOTAL ENERGY'] + Decimal(mobj_list[3]) + #psivar['TDDFT ROOT %d %s %s EXCITATION ENERGY' % + # (mobj_list[0], mobj_list[1], mobj_list[2])] = mobj_list[3] # in a.u. + #psivar ['TDDFT ROOT %s %s %s EXCITED STATE ENERGY' %(mobj_list[0],mobj_list[1],mobj_list[2])] = \ + # psivar ['DFT TOTAL ENERGY'] + Decimal(mobj_list[3]) psivar['TDDFT ROOT %s DIPOLE X' % (mobj_list[0])] = mobj_list[5] psivar['TDDFT ROOT %s DIPOLE Y' % (mobj_list[0])] = mobj_list[6] psivar['TDDFT ROOT %s DIPOLE Z' % (mobj_list[0])] = mobj_list[7] From 528d07d824da1cbd218f505deffe1af743187ba3 Mon Sep 17 00:00:00 2001 From: Annabelle Lolinco Date: Tue, 3 Dec 2019 11:03:26 -0600 Subject: [PATCH 11/21] nwc: eom + tddft regex + vars (wip) --- qcengine/programs/nwchem/harvester.py | 29 ++++++++++++++++++--------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/qcengine/programs/nwchem/harvester.py b/qcengine/programs/nwchem/harvester.py index d2107b44b..0916b40f8 100644 --- a/qcengine/programs/nwchem/harvester.py +++ b/qcengine/programs/nwchem/harvester.py @@ -316,7 +316,7 @@ def harvest_outfile_pass(outtext): r'\s*(?:Excitation energy / hartree)\s+.\s+' + NUMBER + #excitation energy hartree r'\s*(?:/ eV)\s+.\s+' + NUMBER + r'\s*$', #excitation energy eV outtext, re.MULTILINE | re.DOTALL) - #regex should be more dynamic in finding values + #regex should be more dynamic in finding values, need to revisit #mobj.group(0) = symmetry value #mobj.group(1) = cc_name #mobj.group(2) = root number @@ -400,20 +400,29 @@ def harvest_outfile_pass(outtext): # 2) Spin forbidden mobj = re.findall( - r'^\s+' + r'----------------------------------------------------------------------------' + r'\s*' + - r'^\s+' + r'Root' + r'\s+' + r'(\d+)' + r'\s+' + r'(\w+)' + r'\s+' + r'(.*?)' + r'\s+' + NUMBER + - r'\s+a\.u\.\s+' + NUMBER + r'\s+eV\s*' + r'^\s+' + - r'----------------------------------------------------------------------------' + r'\s*' + r'^\s+' + - r'Transition Moments' + r'\s+Spin forbidden\s*$', outtext, re.MULTILINE) + r'^\s+(?:Root)\s+(\d+)\s+(.*?)\s+' + NUMBER + r'\s(?:a\.u\.)\s+' + NUMBER + r'\s+(?:\w+)' + #Root | symmetry | a.u. | eV + + r'\s+(?:.\w+.\s+.\s+\d+.\d+)' #s2 value + + r'\s+Transition Moments\s+(?:Spin forbidden)' + r'\s*$', + outtext, re.MULTILINE) + #mobj.group(0) = Root + #mobj.group(1) = symmetry + #mobj.group(2) a.u. + #mobj.group(3) e.V + #mobj.group(4) Excitation energy + #mobj.group(5) Excited state energy if mobj: print('matched TDDFT - spin forbidden') for mobj_list in mobj: #### temporary psivars #### - psivar['TDDFT ROOT %s %s %s EXCITATION ENERGY' % - (mobj_list[0], mobj_list[1], mobj_list[2])] = mobj_list[3] # in a.u. - psivar['TDDFT ROOT %s %s %s EXCITED STATE ENERGY' %(mobj_list[0], mobj_list[1], mobj_list[2])] = \ - psivar['DFT TOTAL ENERGY'] + Decimal(mobj_list[3]) + psivar['TDDFT ROOT %s EXCITATION ENERGY - %s SYMMETRY' % (mobj_list[0], mobj_list[2])] = mobj_list[4] #in eV + psivar['TDDFT ROOT %s EXCITED STATE ENERGY - %s SYMMETRY' % (mobj_list[0], mobj_list[2])] = psivar['DFT TOTAL ENERGY'] + qcel.constants.converstion_factor("eV", "hartree")*Decimal(mobj_list[4]) + + #psivar['TDDFT ROOT %s %s %s EXCITATION ENERGY' % + # (mobj_list[0], mobj_list[1], mobj_list[2])] = mobj_list[3] # in a.u. + #psivar['TDDFT ROOT %s %s %s EXCITED STATE ENERGY' %(mobj_list[0], mobj_list[1], mobj_list[2])] = \ + # psivar['DFT TOTAL ENERGY'] + Decimal(mobj_list[3]) if mobj: print('Non-variation initial energy') # prints out energy, 5 counts From 00af3f27cce3222989dbf187c83dab44286bfbf1 Mon Sep 17 00:00:00 2001 From: Annabelle Lolinco Date: Wed, 3 Jul 2019 12:41:42 -0500 Subject: [PATCH 12/21] nwc: add tce dipole harvest --- qcengine/programs/nwchem/harvester.py | 47 ++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 5 deletions(-) diff --git a/qcengine/programs/nwchem/harvester.py b/qcengine/programs/nwchem/harvester.py index 4eac9dd10..58cfa2d65 100644 --- a/qcengine/programs/nwchem/harvester.py +++ b/qcengine/programs/nwchem/harvester.py @@ -200,9 +200,27 @@ def harvest_outfile_pass(outtext): else: psivar[f'{mbpt_plain} CORRECTION ENERGY'] = mobj.group(1) psivar[f'{mbpt_plain} TOTAL ENERGY'] = mobj.group(2) + #TCE dipole- MBPT(n) + mobj2 = re.search( + r'^\s+' + cc_name + r'dipole moments / hartree & Debye' + r'\s*' + + r'^\s+' + r'X' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + + r'^\s+' + r'Y' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + + r'^\s+' + r'Z' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + + r'^\s+' + r'Total' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*$', + outtext, re.MULTILINE) + + if mobj2: + mbpt_plain = cc_name.replace('\\', '').replace('MBPT', 'MP').replace('(', '').replace(')', '') + print(f'matched tce {mbpt_plain} dipole moment') + + #only pulling Debye + psivar[f'{mbpt_plain} DIPOLE X'] = mobj2.group(2) + psivar[f'{mbpt_plain} DIPOLE Y'] = mobj2.group(4) + psivar[f'{mbpt_plain} DIPOLE Z'] = mobj2.group(6) - # Process CC '()' correction part through tce [dertype] command - for cc_name in [r'CCSD\(T\)', r'CCSD\[T\]']: + #TCE with () or [] + for cc_name in [r'CCSD\(T\)', r'CCSD\[T\]', r'CCSD\(2\)_T', r'CCSD\(2\)', r'CCSDT\(2\)_Q', \ + r'CR-CCSD\[T\]', r'CR-CCSD\(T\)', r'LR-CCSD\(T\)', r'LR-CCSD\(TQ\)-1', r'CREOMSD\(T\)']: mobj = re.search( r'^\s+' + cc_name + r'\s+' + r'correction energy / hartree' + r'\s+=\s*' + NUMBER + r'\s*' + r'^\s+' + cc_name + r'\s+' + r'correlation energy / hartree' + r'\s+=\s*' + NUMBER + r'\s*' + @@ -212,13 +230,15 @@ def harvest_outfile_pass(outtext): if mobj: cc_plain = cc_name.replace('\\', '') cc_corr = cc_plain.replace('CCSD', '') + logger.debug(f'matched tce cc {cc_plain}') - psivar[f'{cc_corr} CORRECTION ENERGY'] = mobj.group(1) psivar[f'{cc_plain} CORRELATION ENERGY'] = mobj.group(2) psivar[f'{cc_plain} TOTAL ENERGY'] = mobj.group(3) - # Process other TCE cases - for cc_name in [r'CISD', r'CISDT', r'CISDTQ', r'CCD', r'CCSD', r'CCSDT', r'CCSDTQ', r'LCCSD', r'LCCD']: + + #Process other TCE cases + for cc_name in [r'CISD', r'CISDT', r'CISDTQ', r'CCD', r'CC2', r'CCSD', r'CCSDT', r'CCSDTQ', \ + r'LCCSD', r'LCCD', r'CCSDTA']: mobj = re.search( r'^\s+' + r'Iterations converged' + r'\s*' + r'^\s+' + cc_name + r'\s+' + r'correlation energy / hartree' + r'\s+=\s*' + NUMBER + r'\s*' + r'^\s+' + cc_name + r'\s+' + @@ -229,6 +249,23 @@ def harvest_outfile_pass(outtext): logger.debug(mobj) psivar[f'{cc_name} CORRELATION ENERGY'] = mobj.group(1) psivar[f'{cc_name} TOTAL ENERGY'] = mobj.group(2) + #TCE dipole + mobj2 = re.search( + r'^\s+' + cc_name + r'dipole moments / hartree & Debye' + r'\s*' + + r'^\s+' + r'X' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + + r'^\s+' + r'Y' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + + r'^\s+' + r'Z' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + + r'^\s+' + r'Total' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*$', + outtext, re.MULTILINE) + + if mobj2: + print(f'matched tce {cc_name} dipole moment') + + #only pulling Debye + psivar[f'{cc_name} DIPOLE X'] = mobj2.group(2) + psivar[f'{cc_name} DIPOLE Y'] = mobj2.group(4) + psivar[f'{cc_name} DIPOLE Z'] = mobj2.group(6) + # Process CCSD/CCSD(T) using nwchem CCSD/CCSD(T) [dertype] command mobj = re.search( From 5b334f1be88894e32469018a7e1da207fff7c714 Mon Sep 17 00:00:00 2001 From: Annabelle Lolinco Date: Tue, 16 Jul 2019 16:34:42 -0500 Subject: [PATCH 13/21] nwc: add tce dipole harvest --- qcengine/programs/nwchem/harvester.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/qcengine/programs/nwchem/harvester.py b/qcengine/programs/nwchem/harvester.py index 58cfa2d65..dfafbd48f 100644 --- a/qcengine/programs/nwchem/harvester.py +++ b/qcengine/programs/nwchem/harvester.py @@ -237,8 +237,7 @@ def harvest_outfile_pass(outtext): psivar[f'{cc_plain} TOTAL ENERGY'] = mobj.group(3) #Process other TCE cases - for cc_name in [r'CISD', r'CISDT', r'CISDTQ', r'CCD', r'CC2', r'CCSD', r'CCSDT', r'CCSDTQ', \ - r'LCCSD', r'LCCD', r'CCSDTA']: + for cc_name in [r'CISD', r'CISDT', r'CISDTQ', r'CCD', r'CC2', r'CCSD', r'CCSDT', r'CCSDTQ', r'LCCSD', r'LCCD', r'CCSDTA']: mobj = re.search( r'^\s+' + r'Iterations converged' + r'\s*' + r'^\s+' + cc_name + r'\s+' + r'correlation energy / hartree' + r'\s+=\s*' + NUMBER + r'\s*' + r'^\s+' + cc_name + r'\s+' + @@ -266,7 +265,6 @@ def harvest_outfile_pass(outtext): psivar[f'{cc_name} DIPOLE Y'] = mobj2.group(4) psivar[f'{cc_name} DIPOLE Z'] = mobj2.group(6) - # Process CCSD/CCSD(T) using nwchem CCSD/CCSD(T) [dertype] command mobj = re.search( r'^\s+' + r'-----------' + r'\s*' + r'^\s+' + r'CCSD Energy' + r'\s*' + r'^\s+' + r'-----------' + r'\s*' + From dda118eea5a7e5dc0a9a9cd476bf1556f0df4de6 Mon Sep 17 00:00:00 2001 From: Annabelle Lolinco Date: Fri, 19 Jul 2019 11:36:45 -0500 Subject: [PATCH 14/21] nwc: dipole regex edit --- qcengine/programs/nwchem/harvester.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/qcengine/programs/nwchem/harvester.py b/qcengine/programs/nwchem/harvester.py index dfafbd48f..3fedfb7da 100644 --- a/qcengine/programs/nwchem/harvester.py +++ b/qcengine/programs/nwchem/harvester.py @@ -533,18 +533,22 @@ def harvest_outfile_pass(outtext): # Process dipole mobj = re.search( - r'^\s+' + r'Dipole moment' + r'\s+' + NUMBER + r'\s' + r'A\.U\.' + r'\s*' + r'^\s+' + r'DMX' + r'\s+' + - NUMBER + r'.*' + r'\s*' + r'^\s+' + r'DMY' + r'\s+' + NUMBER + r'.*' + r'\s*' + r'^\s+' + r'DMZ' + r'\s+' + - NUMBER + r'.' + r'\s*' + r'^\s+' + r'.*' + r'\s*' + r'^\s+' + r'Total dipole' + r'\s+' + NUMBER + r'\s' + - r'A\.U\.' + r'\s*' + r'^\s+' + r'Dipole moment' + r'\s+' + NUMBER + r'\s' + r'Debye\(s\)' + r'\s*' + - r'^\s+' + r'DMX' + r'\s+' + NUMBER + r'.*' + r'\s*' + r'^\s+' + r'DMY' + r'\s+' + NUMBER + r'.*' + r'\s*' + - r'^\s+' + r'DMZ' + r'\s+' + NUMBER + r'.*' + r'\s*' + r'^\s+' + r'.*' + r'\s*' + r'^\s+' + - r'Total dipole' + r'\s+' + NUMBER + r'\s' + r'DEBYE\(S\)' + r'\s*$', outtext, re.MULTILINE) + r'^\s+' + r'Dipole moment' + r'\s+' + NUMBER + r'\s+' + r'A\.U\.' + r'\s*' + + r'^\s+' + r'DMX' + r'\s+' + NUMBER + r'.*' + + r'^\s+' + r'DMY' + r'\s+' + NUMBER + r'.*' + + r'^\s+' + r'DMZ' + r'\s+' + NUMBER + r'.*' + + r'^\s+' + r'.*' + + r'^\s+' + r'Total dipole' + r'\s+' + NUMBER + r'\s+' + r'A\.U\.' + r'\s*' + + r'^\s+' + r'Dipole moment' + r'\s+' + NUMBER + r'\s' + r'Debye\(s\)' + r'\s*' + + r'^\s+' + r'DMX' + r'\s+' + NUMBER + r'.*' + + r'^\s+' + r'DMY' + r'\s+' + NUMBER + r'.*' + + r'^\s+' + r'DMZ' + r'\s+' + NUMBER + r'.*' + + r'^\s+' + r'.*' + + r'^\s+' + r'Total dipole' + r'\s+' + NUMBER + r'\s' + r'DEBYE\(S\)' + r'\s*$', + outtext, re.MULTILINE) if mobj: logger.debug('matched total dipole') - # print (mobj.group(5), 'a.u.') - # print (mobj.group(10),'debye(s)') # UNIT = DEBYE(S) psivar['CURRENT DIPOLE X'] = mobj.group(7) From b9860bddd5a3a2fd71f99245b7075dc5fc937cef Mon Sep 17 00:00:00 2001 From: Annabelle Lolinco Date: Wed, 3 Jul 2019 12:41:42 -0500 Subject: [PATCH 15/21] nwc: add tce dipole harvest --- qcengine/programs/nwchem/harvester.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/qcengine/programs/nwchem/harvester.py b/qcengine/programs/nwchem/harvester.py index 3fedfb7da..bec56b190 100644 --- a/qcengine/programs/nwchem/harvester.py +++ b/qcengine/programs/nwchem/harvester.py @@ -219,8 +219,7 @@ def harvest_outfile_pass(outtext): psivar[f'{mbpt_plain} DIPOLE Z'] = mobj2.group(6) #TCE with () or [] - for cc_name in [r'CCSD\(T\)', r'CCSD\[T\]', r'CCSD\(2\)_T', r'CCSD\(2\)', r'CCSDT\(2\)_Q', \ - r'CR-CCSD\[T\]', r'CR-CCSD\(T\)', r'LR-CCSD\(T\)', r'LR-CCSD\(TQ\)-1', r'CREOMSD\(T\)']: + for cc_name in [r'CCSD\(T\)', r'CCSD\[T\]', r'CCSD\(2\)_T', r'CCSD\(2\)', r'CCSDT\(2\)_Q', r'CR-CCSD\[T\]', r'CR-CCSD\(T\)', r'LR-CCSD\(T\)', r'LR-CCSD\(TQ\)-1', r'CREOMSD\(T\)']: mobj = re.search( r'^\s+' + cc_name + r'\s+' + r'correction energy / hartree' + r'\s+=\s*' + NUMBER + r'\s*' + r'^\s+' + cc_name + r'\s+' + r'correlation energy / hartree' + r'\s+=\s*' + NUMBER + r'\s*' + @@ -230,8 +229,8 @@ def harvest_outfile_pass(outtext): if mobj: cc_plain = cc_name.replace('\\', '') cc_corr = cc_plain.replace('CCSD', '') - logger.debug(f'matched tce cc {cc_plain}') + psivar[f'{cc_corr} CORRECTION ENERGY'] = mobj.group(1) psivar[f'{cc_plain} CORRELATION ENERGY'] = mobj.group(2) psivar[f'{cc_plain} TOTAL ENERGY'] = mobj.group(3) @@ -264,7 +263,6 @@ def harvest_outfile_pass(outtext): psivar[f'{cc_name} DIPOLE X'] = mobj2.group(2) psivar[f'{cc_name} DIPOLE Y'] = mobj2.group(4) psivar[f'{cc_name} DIPOLE Z'] = mobj2.group(6) - # Process CCSD/CCSD(T) using nwchem CCSD/CCSD(T) [dertype] command mobj = re.search( r'^\s+' + r'-----------' + r'\s*' + r'^\s+' + r'CCSD Energy' + r'\s*' + r'^\s+' + r'-----------' + r'\s*' + From c8f21c110f743ac7a233c98aa608b74d5127b3d2 Mon Sep 17 00:00:00 2001 From: Annabelle Lolinco Date: Tue, 16 Jul 2019 16:34:42 -0500 Subject: [PATCH 16/21] nwc: add tce dipole harvest --- qcengine/programs/nwchem/harvester.py | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/qcengine/programs/nwchem/harvester.py b/qcengine/programs/nwchem/harvester.py index bec56b190..28399d785 100644 --- a/qcengine/programs/nwchem/harvester.py +++ b/qcengine/programs/nwchem/harvester.py @@ -212,7 +212,6 @@ def harvest_outfile_pass(outtext): if mobj2: mbpt_plain = cc_name.replace('\\', '').replace('MBPT', 'MP').replace('(', '').replace(')', '') print(f'matched tce {mbpt_plain} dipole moment') - #only pulling Debye psivar[f'{mbpt_plain} DIPOLE X'] = mobj2.group(2) psivar[f'{mbpt_plain} DIPOLE Y'] = mobj2.group(4) @@ -223,8 +222,8 @@ def harvest_outfile_pass(outtext): mobj = re.search( r'^\s+' + cc_name + r'\s+' + r'correction energy / hartree' + r'\s+=\s*' + NUMBER + r'\s*' + r'^\s+' + cc_name + r'\s+' + r'correlation energy / hartree' + r'\s+=\s*' + NUMBER + r'\s*' + - r'^\s+' + cc_name + r'\s+' + r'total energy / hartree' + r'\s+=\s*' + NUMBER + r'\s*$', outtext, - re.MULTILINE) + r'^\s+' + cc_name + r'\s+' + r'total energy / hartree' + r'\s+=\s*' + NUMBER + r'\s*$', + outtext, re.MULTILINE) if mobj: cc_plain = cc_name.replace('\\', '') @@ -235,6 +234,25 @@ def harvest_outfile_pass(outtext): psivar[f'{cc_plain} CORRELATION ENERGY'] = mobj.group(2) psivar[f'{cc_plain} TOTAL ENERGY'] = mobj.group(3) + #TCE dipole with () or [] + mobj2 = re.search( + r'^\s+' + cc_name + r'dipole moments / hartree & Debye' + r'\s*' + + r'^\s+' + r'X' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + + r'^\s+' + r'Y' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + + r'^\s+' + r'Z' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + + r'^\s+' + r'Total' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*$', + outtext, re.MULTILINE) + + if mobj2: + cc_plain = cc_name.replace('\\', '') + cc_corr = cc_plain.replace('CCSD', '') + print(f'matched tce {cc_plain} dipole moment') + + #only pulling Debye + psivar[f'{cc_plain} DIPOLE X'] = mobj2.group(2) + psivar[f'{cc_plain} DIPOLE Y'] = mobj2.group(4) + psivar[f'{cc_plain} DIPOLE Z'] = mobj2.group(6) + #Process other TCE cases for cc_name in [r'CISD', r'CISDT', r'CISDTQ', r'CCD', r'CC2', r'CCSD', r'CCSDT', r'CCSDTQ', r'LCCSD', r'LCCD', r'CCSDTA']: mobj = re.search( @@ -255,7 +273,6 @@ def harvest_outfile_pass(outtext): r'^\s+' + r'Z' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + r'^\s+' + r'Total' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*$', outtext, re.MULTILINE) - if mobj2: print(f'matched tce {cc_name} dipole moment') From 6985d0c8191e27691c488d5a8ad07576dac97b08 Mon Sep 17 00:00:00 2001 From: Annabelle Lolinco Date: Fri, 18 Oct 2019 10:23:54 -0500 Subject: [PATCH 17/21] nwc: add keep file for running hess, adjust harvester' --- qcengine/programs/nwchem/harvester.py | 15 ++++++++------- qcengine/programs/nwchem/runner.py | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/qcengine/programs/nwchem/harvester.py b/qcengine/programs/nwchem/harvester.py index 28399d785..31ca8aac5 100644 --- a/qcengine/programs/nwchem/harvester.py +++ b/qcengine/programs/nwchem/harvester.py @@ -202,7 +202,7 @@ def harvest_outfile_pass(outtext): psivar[f'{mbpt_plain} TOTAL ENERGY'] = mobj.group(2) #TCE dipole- MBPT(n) mobj2 = re.search( - r'^\s+' + cc_name + r'dipole moments / hartree & Debye' + r'\s*' + + r'^\s+' + r'dipole moments / hartree & Debye' + r'\s*' + r'^\s+' + r'X' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + r'^\s+' + r'Y' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + r'^\s+' + r'Z' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + @@ -267,19 +267,20 @@ def harvest_outfile_pass(outtext): psivar[f'{cc_name} TOTAL ENERGY'] = mobj.group(2) #TCE dipole mobj2 = re.search( - r'^\s+' + cc_name + r'dipole moments / hartree & Debye' + r'\s*' + + r'^\s+' + r'dipole moments / hartree & Debye' + r'\s*' + r'^\s+' + r'X' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + r'^\s+' + r'Y' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + r'^\s+' + r'Z' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*' + r'^\s+' + r'Total' + r'\s+' + NUMBER + r'\s+' + NUMBER + r'\s*$', outtext, re.MULTILINE) if mobj2: - print(f'matched tce {cc_name} dipole moment') + print(f'matched tce dipole moment') #only pulling Debye - psivar[f'{cc_name} DIPOLE X'] = mobj2.group(2) - psivar[f'{cc_name} DIPOLE Y'] = mobj2.group(4) - psivar[f'{cc_name} DIPOLE Z'] = mobj2.group(6) + psivar[f'CURRENT DIPOLE X'] = mobj2.group(2) + psivar[f'CURRENT DIPOLE Y'] = mobj2.group(4) + psivar[f'CURRENT DIPOLE Z'] = mobj2.group(6) + # Process CCSD/CCSD(T) using nwchem CCSD/CCSD(T) [dertype] command mobj = re.search( r'^\s+' + r'-----------' + r'\s*' + r'^\s+' + r'CCSD Energy' + r'\s*' + r'^\s+' + r'-----------' + r'\s*' + @@ -546,7 +547,7 @@ def harvest_outfile_pass(outtext): atoms.append(lline[1]) # Tag psivar_grad.append([float(lline[-3]), float(lline[-2]), float(lline[-1])]) - # Process dipole + # Process dipole (Properties) mobj = re.search( r'^\s+' + r'Dipole moment' + r'\s+' + NUMBER + r'\s+' + r'A\.U\.' + r'\s*' + r'^\s+' + r'DMX' + r'\s+' + NUMBER + r'.*' + diff --git a/qcengine/programs/nwchem/runner.py b/qcengine/programs/nwchem/runner.py index 654867c29..7ee0ef7d0 100644 --- a/qcengine/programs/nwchem/runner.py +++ b/qcengine/programs/nwchem/runner.py @@ -151,7 +151,7 @@ def execute( success, dexe = execute( inputs["command"], inputs["infiles"], - ["job.movecs", "job.hess", "job.db", "job.zmat"], + ["job.movecs", "job.hess", "job.db", "job.zmat", "job.fd_dipole"], scratch_messy=False, scratch_directory=inputs["scratch_directory"], ) From adb8fca79cd31b50a421147efbffc24ebedd8470 Mon Sep 17 00:00:00 2001 From: Annabelle Lolinco Date: Wed, 27 Nov 2019 13:33:08 -0600 Subject: [PATCH 18/21] nwc: regex edits to tddft, eom (wip) --- qcengine/programs/nwchem/harvester.py | 52 ++++++++++++++------------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/qcengine/programs/nwchem/harvester.py b/qcengine/programs/nwchem/harvester.py index 31ca8aac5..2dc68ee60 100644 --- a/qcengine/programs/nwchem/harvester.py +++ b/qcengine/programs/nwchem/harvester.py @@ -330,28 +330,25 @@ def harvest_outfile_pass(outtext): # psivar name might need to be fixed # each root excitation energy is extracted from the last iteration of right hand side mobj = re.findall( - # r'^\s+' + r'Excited-state calculation' + r'\s+' + r'\(\s+' + r'(.*?)' + r'\s+' + r'symmetry\)' + r'\s*' + - # r'^\s+' + r'=========================================' + r'\s*' + r'(?:.*?)' - # + #Skip to line before right-hand side iterations - # r'^\s+' + r'EOM-' + cc_name + r' right-hand side iterations' + r'\s*' + r'(?:.*?)' + r'^\s+' + r'Iteration' - # + r'\s+\d+\s+' + r'using' + r'\s+\d+\s+' + r'trial vectors' + r'\s*' + - # r'((?:\s+[-+]?\d+\.\d+\s+[-+]?\d+\.\d+\s+[-+]?\d+\.\d+(?:(\s+\d+\.\d+\s+\d+\.\d+)?)\s*\n)+)' + r'^\s+' + - # r'--------------------------------------------------------------' + r'\s*' + r'^\s+' + - # r'Iterations converged' + r'\s*$', - # outtext, - # re.MULTILINE | re.DOTALL) - r'^\s+' + r'Excited-state calculation' + r'\s+' + r'\((.*?)\)' + r'\s*' + - r'^\s+' + r'EOM-' + cc_name + r'\s+right-hand side iterations' + r'\s*' + # capture cc_name - r'^\s+' + r'Iterations converged' + r'\s*' + # skip to excitation - r'^\s+' + r'Excited state root\s+\d{1,2}\s*' + - r'^\s+' + r'Excitation energy / hartree' + r'\s+=\s+' + NUMBER + r'\s*' + - r'^\s+' + r'/ eV\s+' + r'\s+=\s+' + NUMBER + r'\s*$', + r'^\s+(?:Excited-state calculation \( )(.*)\s+(?:symmetry\))\s+(?:.*\n)*^\s+EOM-' + cc-name + + # (..) captures symmetry + r'right-hand side iterations\s+(?:.*\n)*(?:Excited state root)\s+' + NUMBER + #root + r'\s*(?:Excitation energy / hartree)\s+.\s+' + NUMBER + #excitation energy hartree + r'\s*(?:/ eV)\s+.\s+' + NUMBER + r'\s*$', #excitation energy eV outtext, re.MULTILINE | re.DOTALL) + #regex should be more dynamic in finding values + #mobj.group(0) = symmetry value + #mobj.group(1) = cc_name + #mobj.group(2) = root number + #mobj.group(3) = excitation energy (hartree) + #mobj.group(4) = excitation energy (eV) if mobj: + print(mobj) ext_energy = {} # dic ext_energy_list = [] + print(f'matched eom-{cc_name}') for mobj_list in mobj: logger.debug('matched EOM-%s - %s symmetry' % (cc_name, mobj_list[0])) # cc_name, symmetry logger.debug(mobj_list) @@ -390,14 +387,21 @@ def harvest_outfile_pass(outtext): # Process TDDFT # 1) Spin allowed mobj = re.findall( - r'^\s+' + r'----------------------------------------------------------------------------' + r'\s*' + - r'^\s+' + r'Root' + r'\s+' + r'(\d+)' + r'\s+' + r'(\w+)' + r'\s+' + r'(.*?)' + r'\s+' + NUMBER + - r'\s+a\.u\.\s+' + NUMBER + r'\s+eV\s*' + r'^\s+' + - r'----------------------------------------------------------------------------' + r'\s*' + r'^\s+' + - r'Transition Moments' + r'\s+X\s+' + NUMBER + r'\s+Y\s+' + NUMBER + r'\s+Z\s+' + NUMBER + r'\s*' + r'^\s+' - + r'Transition Moments' + r'\s+XX\s+' + NUMBER + r'\s+XY\s+' + NUMBER + r'\s+XZ\s+' + NUMBER + r'\s*' + - r'^\s+' + r'Transition Moments' + r'\s+YY\s+' + NUMBER + r'\s+YZ\s+' + NUMBER + r'\s+ZZ\s+' + NUMBER + - r'\s*$', outtext, re.MULTILINE) + r'^\s+(?:Root)\s+(\d+)\s(\w+)\s+(.*?)\s+(\d+\.\d+)\s(?:a\.u\.)\s+(\d+\.\d+)\s+(?:\w+)' + #Root # singlet/triplet symmetry # a.u. # eV + + r'\s+(?:.*\n)\s+Transition Moments\s+X\s'+ NUMBER + r'\s+Y\s'+ NUMBER+ r'\s+Z\s'+ NUMBER + #X # Y # Z # + + r'\s+Transition Moments\s+XX\s'+ NUMBER + r'\s+XY\s'+ NUMBER+ r'\s+XZ\s'+ NUMBER + + r'\s+Transition Moments\s+YY\s'+ NUMBER + r'\s+YZ\s'+ NUMBER+ r'\s+ZZ\s'+ NUMBER + r'\s*$', + outtext, re.MULTILINE) + #r'^\s+' + r'----------------------------------------------------------------------------' + r'\s*' + + #r'^\s+' + r'Root' + r'\s+' + r'(\d+)' + r'\s+' + r'(\w+)' + r'\s+' + r'(.*?)' + r'\s+' + NUMBER + + #r'\s+a\.u\.\s+' + NUMBER + r'\s+eV\s*' + r'^\s+' + + #r'----------------------------------------------------------------------------' + r'\s*' + r'^\s+' + + #r'Transition Moments' + r'\s+X\s+' + NUMBER + r'\s+Y\s+' + NUMBER + r'\s+Z\s+' + NUMBER + r'\s*' + r'^\s+' + #+ r'Transition Moments' + r'\s+XX\s+' + NUMBER + r'\s+XY\s+' + NUMBER + r'\s+XZ\s+' + NUMBER + r'\s*' + + #r'^\s+' + r'Transition Moments' + r'\s+YY\s+' + NUMBER + r'\s+YZ\s+' + NUMBER + r'\s+ZZ\s+' + NUMBER + + #r'\s*$', outtext, re.MULTILINE) if mobj: logger.debug('matched TDDFT with transition moments') From bded75680ecf894d4794263c60280893ccb4cba0 Mon Sep 17 00:00:00 2001 From: Annabelle Lolinco Date: Mon, 2 Dec 2019 17:49:05 -0600 Subject: [PATCH 19/21] nwc:tddft regex edit (wip) --- qcengine/programs/nwchem/harvester.py | 37 ++++++++++----------------- 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/qcengine/programs/nwchem/harvester.py b/qcengine/programs/nwchem/harvester.py index 2dc68ee60..9e25f3089 100644 --- a/qcengine/programs/nwchem/harvester.py +++ b/qcengine/programs/nwchem/harvester.py @@ -387,35 +387,26 @@ def harvest_outfile_pass(outtext): # Process TDDFT # 1) Spin allowed mobj = re.findall( - r'^\s+(?:Root)\s+(\d+)\s(\w+)\s+(.*?)\s+(\d+\.\d+)\s(?:a\.u\.)\s+(\d+\.\d+)\s+(?:\w+)' - #Root # singlet/triplet symmetry # a.u. # eV - + r'\s+(?:.*\n)\s+Transition Moments\s+X\s'+ NUMBER + r'\s+Y\s'+ NUMBER+ r'\s+Z\s'+ NUMBER - #X # Y # Z # - + r'\s+Transition Moments\s+XX\s'+ NUMBER + r'\s+XY\s'+ NUMBER+ r'\s+XZ\s'+ NUMBER - + r'\s+Transition Moments\s+YY\s'+ NUMBER + r'\s+YZ\s'+ NUMBER+ r'\s+ZZ\s'+ NUMBER + r'\s*$', + r'^\s+(?:Root)\s+(\d+)\s+(.*?)\s+' + NUMBER + r'\s(?:a\.u\.)\s+' + NUMBER + r'\s+(?:\w+)' + #Root | symmetry | a.u. | eV + + r'\s+(?:.\w+.\s+.\s+\d+.\d+)' #s2 value + + r'\s+(?:.*\n)\s+Transition Moments\s+X\s+'+ NUMBER + r'\s+Y\s+'+ NUMBER+ r'\s+Z\s+'+ NUMBER #dipole + + r'\s+Transition Moments\s+XX\s+'+ NUMBER + r'\s+XY\s+'+ NUMBER+ r'\s+XZ\s+'+ NUMBER #quadrople + + r'\s+Transition Moments\s+YY\s+'+ NUMBER + r'\s+YZ\s+'+ NUMBER+ r'\s+ZZ\s+'+ NUMBER #quadrople + + r'\s*$', outtext, re.MULTILINE) - #r'^\s+' + r'----------------------------------------------------------------------------' + r'\s*' + - #r'^\s+' + r'Root' + r'\s+' + r'(\d+)' + r'\s+' + r'(\w+)' + r'\s+' + r'(.*?)' + r'\s+' + NUMBER + - #r'\s+a\.u\.\s+' + NUMBER + r'\s+eV\s*' + r'^\s+' + - #r'----------------------------------------------------------------------------' + r'\s*' + r'^\s+' + - #r'Transition Moments' + r'\s+X\s+' + NUMBER + r'\s+Y\s+' + NUMBER + r'\s+Z\s+' + NUMBER + r'\s*' + r'^\s+' - #+ r'Transition Moments' + r'\s+XX\s+' + NUMBER + r'\s+XY\s+' + NUMBER + r'\s+XZ\s+' + NUMBER + r'\s*' + - #r'^\s+' + r'Transition Moments' + r'\s+YY\s+' + NUMBER + r'\s+YZ\s+' + NUMBER + r'\s+ZZ\s+' + NUMBER + - #r'\s*$', outtext, re.MULTILINE) if mobj: logger.debug('matched TDDFT with transition moments') for mobj_list in mobj: - # print (mobj_list) - # print (mobj_list[0]) #root number - # print (mobj_list[1]) #singlet or triplet? - # print (mobj_list[2]) #symmetry - + print (mobj_list) + psivar['TDDFT ROOT %s EXCITATION ENERGY - %s SYMMETRY' % (mobj_list[0], mobj_list[1])] = mobj_list[2] #in eV + psivar['TDDFT ROOT %s EXCITED STATE ENERGY - %s SYMMETRY' % (mobj_list[0], mobj_list[1])] = psivar['DFT TOTAL ENERGY'] + Decimal(mobj_list[2]) #### temporary psivars #### - psivar['TDDFT ROOT %s %s %s EXCITATION ENERGY' % - (mobj_list[0], mobj_list[1], mobj_list[2])] = mobj_list[3] # in a.u. - psivar ['TDDFT ROOT %s %s %s EXCITED STATE ENERGY' %(mobj_list[0],mobj_list[1],mobj_list[2])] = \ - psivar ['DFT TOTAL ENERGY'] + Decimal(mobj_list[3]) + #psivar['TDDFT ROOT %d %s %s EXCITATION ENERGY' % + # (mobj_list[0], mobj_list[1], mobj_list[2])] = mobj_list[3] # in a.u. + #psivar ['TDDFT ROOT %s %s %s EXCITED STATE ENERGY' %(mobj_list[0],mobj_list[1],mobj_list[2])] = \ + # psivar ['DFT TOTAL ENERGY'] + Decimal(mobj_list[3]) psivar['TDDFT ROOT %s DIPOLE X' % (mobj_list[0])] = mobj_list[5] psivar['TDDFT ROOT %s DIPOLE Y' % (mobj_list[0])] = mobj_list[6] psivar['TDDFT ROOT %s DIPOLE Z' % (mobj_list[0])] = mobj_list[7] From b62c81d2c6f4f9f8ac5639a593afb88fa23b435d Mon Sep 17 00:00:00 2001 From: Annabelle Lolinco Date: Tue, 3 Dec 2019 11:03:26 -0600 Subject: [PATCH 20/21] nwc: eom + tddft regex + vars (wip) --- qcengine/programs/nwchem/harvester.py | 29 ++++++++++++++++++--------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/qcengine/programs/nwchem/harvester.py b/qcengine/programs/nwchem/harvester.py index 9e25f3089..9c4c61ebe 100644 --- a/qcengine/programs/nwchem/harvester.py +++ b/qcengine/programs/nwchem/harvester.py @@ -336,7 +336,7 @@ def harvest_outfile_pass(outtext): r'\s*(?:Excitation energy / hartree)\s+.\s+' + NUMBER + #excitation energy hartree r'\s*(?:/ eV)\s+.\s+' + NUMBER + r'\s*$', #excitation energy eV outtext, re.MULTILINE | re.DOTALL) - #regex should be more dynamic in finding values + #regex should be more dynamic in finding values, need to revisit #mobj.group(0) = symmetry value #mobj.group(1) = cc_name #mobj.group(2) = root number @@ -420,20 +420,29 @@ def harvest_outfile_pass(outtext): # 2) Spin forbidden mobj = re.findall( - r'^\s+' + r'----------------------------------------------------------------------------' + r'\s*' + - r'^\s+' + r'Root' + r'\s+' + r'(\d+)' + r'\s+' + r'(\w+)' + r'\s+' + r'(.*?)' + r'\s+' + NUMBER + - r'\s+a\.u\.\s+' + NUMBER + r'\s+eV\s*' + r'^\s+' + - r'----------------------------------------------------------------------------' + r'\s*' + r'^\s+' + - r'Transition Moments' + r'\s+Spin forbidden\s*$', outtext, re.MULTILINE) + r'^\s+(?:Root)\s+(\d+)\s+(.*?)\s+' + NUMBER + r'\s(?:a\.u\.)\s+' + NUMBER + r'\s+(?:\w+)' + #Root | symmetry | a.u. | eV + + r'\s+(?:.\w+.\s+.\s+\d+.\d+)' #s2 value + + r'\s+Transition Moments\s+(?:Spin forbidden)' + r'\s*$', + outtext, re.MULTILINE) + #mobj.group(0) = Root + #mobj.group(1) = symmetry + #mobj.group(2) a.u. + #mobj.group(3) e.V + #mobj.group(4) Excitation energy + #mobj.group(5) Excited state energy if mobj: logger.debug('matched TDDFT - spin forbidden') for mobj_list in mobj: #### temporary psivars #### - psivar['TDDFT ROOT %s %s %s EXCITATION ENERGY' % - (mobj_list[0], mobj_list[1], mobj_list[2])] = mobj_list[3] # in a.u. - psivar['TDDFT ROOT %s %s %s EXCITED STATE ENERGY' %(mobj_list[0], mobj_list[1], mobj_list[2])] = \ - psivar['DFT TOTAL ENERGY'] + Decimal(mobj_list[3]) + psivar['TDDFT ROOT %s EXCITATION ENERGY - %s SYMMETRY' % (mobj_list[0], mobj_list[2])] = mobj_list[4] #in eV + psivar['TDDFT ROOT %s EXCITED STATE ENERGY - %s SYMMETRY' % (mobj_list[0], mobj_list[2])] = psivar['DFT TOTAL ENERGY'] + qcel.constants.converstion_factor("eV", "hartree")*Decimal(mobj_list[4]) + + #psivar['TDDFT ROOT %s %s %s EXCITATION ENERGY' % + # (mobj_list[0], mobj_list[1], mobj_list[2])] = mobj_list[3] # in a.u. + #psivar['TDDFT ROOT %s %s %s EXCITED STATE ENERGY' %(mobj_list[0], mobj_list[1], mobj_list[2])] = \ + # psivar['DFT TOTAL ENERGY'] + Decimal(mobj_list[3]) if mobj: logger.debug('Non-variation initial energy') # prints out energy, 5 counts From 9ec37fcf7736c635ee4066515a13fa523dde412b Mon Sep 17 00:00:00 2001 From: Annabelle Lolinco Date: Tue, 3 Dec 2019 15:20:02 -0600 Subject: [PATCH 21/21] black: nwc files --- qcengine/programs/nwchem/germinate.py | 102 ++++++++++++++++++++++---- qcengine/programs/nwchem/harvester.py | 4 +- qcengine/programs/nwchem/runner.py | 11 ++- 3 files changed, 96 insertions(+), 21 deletions(-) diff --git a/qcengine/programs/nwchem/germinate.py b/qcengine/programs/nwchem/germinate.py index 1bc94771f..8388cfb26 100644 --- a/qcengine/programs/nwchem/germinate.py +++ b/qcengine/programs/nwchem/germinate.py @@ -3,15 +3,89 @@ from qcengine.exceptions import InputError # List of XC functionals known to NWChem -_xc_functionals = ['acm', 'b3lyp', 'beckehandh', 'pbe0', 'becke97', 'becke97-1', 'becke97-2', 'becke97-3', 'becke97-d', - 'becke98', 'hcth', 'hcth120', 'hcth147', 'hcth407', 'becke97gga1', 'hcth407p', 'mpw91', 'mpw1k', - 'xft97', 'cft97', 'ft97', 'op', 'bop', 'pbeop', 'xpkzb99', 'cpkzb99', 'xtpss03', 'ctpss03', - 'xctpssh', 'b1b95', 'bb1k', 'mpw1b95', 'mpwb1k', 'pw6b95', 'pwb6k', 'm05', 'm05-2x', 'vs98', 'm06', - 'm06-hf', 'm06-L', 'm06-2x', 'HFexch', 'becke88', 'xperdew91', 'xpbe96', 'gill96', 'lyp', 'perdew81', - 'perdew86', 'perdew91', 'cpbe96', 'pw91lda', 'slater', 'vwn_1', 'vwn_2', 'vwn_3', 'vwn_4', 'vwn_5', - 'vwn_1_rpa', 'xtpss03', 'ctpss03', 'bc95', 'xpw6b95', 'xpwb6k', 'xm05', 'xm05-2x', 'cpw6b95', - 'cpwb6k', 'cm05', 'cm05-2x', 'xvs98', 'cvs98', 'xm06-L', 'xm06-hf', 'xm06', 'xm06-2x', 'cm06-L', - 'cm06-hf', 'cm06', 'cm06-2x'] +_xc_functionals = [ + "acm", + "b3lyp", + "beckehandh", + "pbe0", + "becke97", + "becke97-1", + "becke97-2", + "becke97-3", + "becke97-d", + "becke98", + "hcth", + "hcth120", + "hcth147", + "hcth407", + "becke97gga1", + "hcth407p", + "mpw91", + "mpw1k", + "xft97", + "cft97", + "ft97", + "op", + "bop", + "pbeop", + "xpkzb99", + "cpkzb99", + "xtpss03", + "ctpss03", + "xctpssh", + "b1b95", + "bb1k", + "mpw1b95", + "mpwb1k", + "pw6b95", + "pwb6k", + "m05", + "m05-2x", + "vs98", + "m06", + "m06-hf", + "m06-L", + "m06-2x", + "HFexch", + "becke88", + "xperdew91", + "xpbe96", + "gill96", + "lyp", + "perdew81", + "perdew86", + "perdew91", + "cpbe96", + "pw91lda", + "slater", + "vwn_1", + "vwn_2", + "vwn_3", + "vwn_4", + "vwn_5", + "vwn_1_rpa", + "xtpss03", + "ctpss03", + "bc95", + "xpw6b95", + "xpwb6k", + "xm05", + "xm05-2x", + "cpw6b95", + "cpwb6k", + "cm05", + "cm05-2x", + "xvs98", + "cvs98", + "xm06-L", + "xm06-hf", + "xm06", + "xm06-2x", + "cm06-L", + "cm06-hf", + "cm06", + "cm06-2x", +] def muster_modelchem(method: str, derint: int, use_tce: bool) -> Tuple[str, Dict[str, Any]]: @@ -88,12 +162,14 @@ def muster_modelchem(method: str, derint: int, use_tce: bool) -> Tuple[str, Dict else: mdccmd = f"task ccsd(t) {runtyp}\n\n" - elif method in ['sodft', 'direct_mp2', 'rimp2', 'mcscf', 'selci', 'md', 'pspw', 'band']: - raise InputError(f"Method \"{method}\" not yet supported by QCEngine") + elif method in ["sodft", "direct_mp2", "rimp2", "mcscf", "selci", "md", "pspw", "band"]: + raise InputError(f'Method "{method}" not yet supported by QCEngine') elif method == "tce": - raise InputError(f"Do not specify TCE as a method. Instead specify the desired method " - f"and \"qc_module=True\" in the run configuration") + raise InputError( + f"Do not specify TCE as a method. Instead specify the desired method " + f'and "qc_module=True" in the run configuration' + ) elif method in _xc_functionals: opts["dft__xc"] = method diff --git a/qcengine/programs/nwchem/harvester.py b/qcengine/programs/nwchem/harvester.py index 9c4c61ebe..e25adb8b0 100644 --- a/qcengine/programs/nwchem/harvester.py +++ b/qcengine/programs/nwchem/harvester.py @@ -1,7 +1,7 @@ -import re import logging -from typing import Tuple +import re from decimal import Decimal +from typing import Tuple import qcelemental as qcel from qcelemental.models import Molecule diff --git a/qcengine/programs/nwchem/runner.py b/qcengine/programs/nwchem/runner.py index 7ee0ef7d0..d973aa158 100644 --- a/qcengine/programs/nwchem/runner.py +++ b/qcengine/programs/nwchem/runner.py @@ -2,8 +2,8 @@ Calls the NWChem executable. """ import copy -import pprint import logging +import pprint from decimal import Decimal from typing import Any, Dict, Optional, Tuple @@ -12,14 +12,14 @@ import qcelemental as qcel from qcelemental.models import AtomicResult, Provenance from qcelemental.util import safe_version, which - from qcengine.config import TaskConfig, get_config from qcengine.exceptions import UnknownError + from ...exceptions import InputError from ...util import execute from ..model import ProgramHarness from .germinate import muster_modelchem -from .harvester import harvest, extract_formatted_properties +from .harvester import extract_formatted_properties, harvest from .keywords import format_keywords pp = pprint.PrettyPrinter(width=120, compact=True, indent=1) @@ -67,8 +67,7 @@ def get_version(self) -> str: # Run NWChem which_prog = which("nwchem") if which_prog not in self.version_cache: - success, output = execute([which_prog, "v.nw"], {"v.nw": ""}, - scratch_directory=config.scratch_directory) + success, output = execute([which_prog, "v.nw"], {"v.nw": ""}, scratch_directory=config.scratch_directory) if success: for line in output["stdout"].splitlines(): @@ -78,7 +77,7 @@ def get_version(self) -> str: revision = line.strip().split()[-1] self.version_cache[which_prog] = safe_version(branch + "+" + revision) else: - raise UnknownError(output['stderr']) + raise UnknownError(output["stderr"]) return self.version_cache[which_prog]