Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
49634e4
PES: CCSD(T) option
RagnarB83 May 11, 2026
de4dfd8
- DL-FIND bugfix for tsopt option, icoord should have been 1, not 3. …
RagnarB83 May 11, 2026
2c99cda
pes: oodft, now moreading init state each time by default
RagnarB83 May 12, 2026
e192c03
PES: better handling of deltaSCFkeyword
RagnarB83 May 12, 2026
980096d
geometric bond-order, distance-matrix and coulomb matrix
RagnarB83 May 12, 2026
656169e
PDBx/mmCIF file support in Fragment and OpenMMTheory
RagnarB83 May 20, 2026
c331047
PES: keeping outputfiles for OODFT
RagnarB83 May 20, 2026
badf929
PES: mdci block
RagnarB83 May 20, 2026
2dda7b2
PES: OODFT_CC, avoiding scf-maxiter
RagnarB83 May 22, 2026
0c0143b
pes: minor
RagnarB83 May 22, 2026
abcb535
flexible_align_pdb: now using openmm pdb writing
RagnarB83 May 26, 2026
9ffd5e0
- bugfix: missing lanthanides and actinides from element_dict_atname
RagnarB83 May 27, 2026
094fb7a
PES: cleanup for UHF/UKS logic. now avoiding UKS keyword (activates D…
RagnarB83 May 27, 2026
820b3f5
update to element_dict_atnum as well
RagnarB83 May 28, 2026
a67aa14
pyscf: minor bugfix for skala
RagnarB83 Jun 2, 2026
258eba9
fix for faulty skala bugfix
RagnarB83 Jun 2, 2026
9e0878c
kspies interface: minor changes
RagnarB83 Jun 3, 2026
ab07d58
ks inversion n2v: changes
RagnarB83 Jun 3, 2026
eff26ec
macetheory: print some timings
RagnarB83 Jun 8, 2026
fc54292
experimental: crest socket test
RagnarB83 Jun 9, 2026
4633230
crest: fixes
RagnarB83 Jun 9, 2026
7eacee9
crest: serverlog
RagnarB83 Jun 9, 2026
101faa3
- Fragment.read_pdbfile_openmm: now not crashing when virtual sites a…
RagnarB83 Jun 10, 2026
8e8e375
- further fixes for virtual sites, now for amber files. hopefully wor…
RagnarB83 Jun 11, 2026
fd3ff59
minor cleanup
RagnarB83 Jun 13, 2026
8972bff
create_ML_training_data: now returning number of datapoints
RagnarB83 Jun 13, 2026
0cd7bdf
Add files via upload
madhursharmaa Jun 18, 2026
98a653f
Merge pull request #503 from madhursharmaa/NEW
RagnarB83 Jun 19, 2026
cb3fad2
bug-fix
madhursharmaa Jun 24, 2026
aac4c8d
Merge pull request #504 from madhursharmaa/NEW
RagnarB83 Jun 24, 2026
c15c7a2
- Updated ASH version to be 0.99 in pyproject.toml
RagnarB83 Jun 24, 2026
0a15158
Merge branch 'NEW' of https://github.com/RagnarB83/ash into NEW
RagnarB83 Jun 24, 2026
794cf6b
Allow GHF/GKS calculations
RagnarB83 Jun 24, 2026
109a158
- fix for grabspinpop_ORCA (failed for BS-state output in ORCA)
RagnarB83 Jun 26, 2026
1622020
cfour NEB bug
madhursharmaa Jul 6, 2026
1aa5dc8
- openmm: drudelangevinintegrator (not ready)
RagnarB83 Jul 8, 2026
a242746
Merge pull request #507 from madhursharmaa/NEW
RagnarB83 Jul 14, 2026
58c01fe
Sella interface: IRC option
RagnarB83 Jul 16, 2026
f0e3f63
Merge branch 'NEW' of https://github.com/RagnarB83/ash into NEW
RagnarB83 Jul 16, 2026
f9ce0a7
sella irc: convergence check
RagnarB83 Jul 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,8 @@ Interfaces to popular QM codes: ORCA, xTB, PySCF, MRCC, ccpy, Psi4, Dalton, CFou
Excellent environment for writing simple or complex computational chemistry workflows.

**Citation**
If ASH is useful in your research please cite us:
`ASH: a Multi-scale, Multi-theory Modeling program <https://onlinelibrary.wiley.com/doi/10.1002/jcc.70359>`_
R. Bjornsson*, J. Comput. Chem 2026, 47, e70359.
If ASH is useful in your research please cite us: `ASH: a Multi-scale, Multi-theory Modeling program <https://onlinelibrary.wiley.com/doi/10.1002/jcc.70359>`_
R. Bjornsson, J. Comput. Chem 2026, 47, e70359.

**In case of problems:**
Please open an issue on Github and we will try to fix any problems as soon as possible.
Expand Down
2 changes: 1 addition & 1 deletion ash/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@
from ash.interfaces.interface_dlfind import DLFIND_optimizer,DLFIND_optimizerClass

# Sella
from ash.interfaces.interface_sella import SellaOptimizer, SellaoptimizerClass
from ash.interfaces.interface_sella import SellaOptimizer, SellaoptimizerClass, SellaIRC

# Other
import ash.interfaces.interface_crest
Expand Down
45 changes: 40 additions & 5 deletions ash/dictionaries_lists.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ def __init__(self, name, symbol, atomnumber):
self.atomnumber = atomnumber


element_dict_atname = {'h': Element('hydrogen', 'H', 1), 'he': Element('helium', 'He', 2),
element_dict_atname = {'m': Element('dummy', 'M', 0), 'h': Element('hydrogen', 'H', 1), 'he': Element('helium', 'He', 2),
'li': Element('lithium', 'Li', 3),
'be': Element('beryllium', 'Be', 4), 'b': Element('boron', 'B', 5),
'c': Element('carbon', 'C', 6), 'n': Element('nitrogen', 'N', 7),
Expand Down Expand Up @@ -93,16 +93,31 @@ def __init__(self, name, symbol, atomnumber):
'sb': Element('antimony', 'Sb', 51), 'te': Element('tellurium', 'Te', 52),
'i': Element('iodine', 'I', 53), 'xe': Element('xenon', 'Xe', 54),
'cs': Element('cesium', 'Cs', 55), 'ba': Element('barium', 'Ba', 56),
'la': Element('lanthanum', 'La', 57), 'ce': Element('cerium', 'Ce', 58), 'pr': Element('praseodymium', 'Pr', 59),
'nd': Element('neodymium', 'Nd', 60), 'pm': Element('promethium', 'Pm', 61), 'sm': Element('samarium', 'Sm', 62),
'eu': Element('europium', 'Eu', 63), 'gd': Element('gadolinium', 'Gd', 64), 'tb': Element('terbium', 'Tb', 65),
'dy': Element('dysprosium', 'Dy', 66), 'ho': Element('holmium', 'Ho', 67), 'er': Element('erbium', 'Er', 68),
'tm': Element('thulium', 'Tm', 69), 'yb': Element('ytterbium', 'Yb', 70), 'lu': Element('lutetium', 'Lu', 71),
'hf': Element('hafnium', 'Hf', 72), 'ta': Element('tantalum', 'Ta', 73),
'w': Element('tungsten', 'W', 74), 're': Element('rhenium', 'Re', 75),
'os': Element('osmium', 'Os', 76),
'ir': Element('iridium', 'Ir', 77), 'pt': Element('platinum', 'Pt', 78),
'au': Element('gold', 'Au', 79), 'hg': Element('mercury', 'Hg', 80), 'tl': Element('thallium', 'Tl', 81),
'pb': Element('lead', 'Pb', 82),'bi': Element('bismuth', 'Bi', 83),'po': Element('polonium', 'Po', 84),
'at': Element('astatine', 'At', 85), 'rn': Element('radon', 'Rn', 86)}
'at': Element('astatine', 'At', 85), 'rn': Element('radon', 'Rn', 86), 'fr': Element('francium', 'Fr', 87),
'ra': Element('radium', 'Ra', 88), 'ac': Element('actinium', 'Ac', 89),
'th': Element('thorium', 'Th', 90), 'pa': Element('protactinium', 'Pa', 91), 'u': Element('uranium', 'U', 92),
'np': Element('neptunium', 'Np', 93), 'pu': Element('plutonium', 'Pu', 94), 'am': Element('americium', 'Am', 95),
'cm': Element('curium', 'Cm', 96), 'bk': Element('berkelium', 'Bk', 97), 'cf': Element('californium', 'Cf', 98),
'es': Element('einsteinium', 'Es', 99), 'fm': Element('fermium', 'Fm', 100), 'md': Element('mendelevium', 'Md', 101),
'no': Element('nobelium', 'No', 102), 'lr': Element('lawrencium', 'Lr', 103), 'rf': Element('rutherfordium', 'Rf', 104),
'db': Element('dubnium', 'Db', 105), 'sg': Element('seaborgium', 'Sg', 106), 'bh': Element('bohrium', 'Bh', 107),
'hs': Element('hassium', 'Hs', 108), 'mt': Element('meitnerium', 'Mt', 109), 'ds': Element('darmstadtium', 'Ds', 110),
'rg': Element('roentgenium', 'Rg', 111), 'cn': Element('copernicium', 'Cn', 112), 'nh': Element('nihonium', 'Nh', 113),
'fl': Element('flerovium', 'Fl', 114), 'mc': Element('moscovium', 'Mc', 115), 'lv': Element('livermorium', 'Lv', 116),
'ts': Element('tennessine', 'Ts', 117), 'og': Element('oganesson', 'Og', 118)}

# NOTE: redundant? remove?
element_dict_atnum = {1: Element('hydrogen', 'H', 1), 2: Element('helium', 'He', 2), 3: Element('lithium', 'Li', 3),
element_dict_atnum = {0: Element('dummy', 'M', 0), 1: Element('hydrogen', 'H', 1), 2: Element('helium', 'He', 2), 3: Element('lithium', 'Li', 3),
4: Element('beryllium', 'Be', 4), 5: Element('boron', 'B', 5), 6: Element('carbon', 'C', 6),
7: Element('nitrogen', 'N', 7),
8: Element('oxygen', 'O', 8), 9: Element('fluorine', 'F', 9), 10: Element('neon', 'Ne', 10),
Expand All @@ -129,11 +144,31 @@ def __init__(self, name, symbol, atomnumber):
52: Element('tellurium', 'Te', 52), 53: Element('iodine', 'I', 53),
54: Element('xenon', 'Xe', 54),
55: Element('cesium', 'Cs', 55), 56: Element('barium', 'Ba', 56),
57: Element('lanthanum', 'La', 57), 58: Element('cerium', 'Ce', 58), 59: Element('praseodymium', 'Pr', 59),
60: Element('neodymium', 'Nd', 60), 61: Element('promethium', 'Pm', 61), 62: Element('samarium', 'Sm', 62),
63: Element('europium', 'Eu', 63), 64: Element('gadolinium', 'Gd', 64),
65: Element('terbium', 'Tb', 65), 66: Element('dysprosium', 'Dy', 66),
67: Element('holmium', 'Ho', 67), 68: Element('erbium', 'Er', 68),
69: Element('thulium', 'Tm', 69), 70: Element('ytterbium', 'Yb', 70),
71: Element('lutetium', 'Lu', 71),
72: Element('hafnium', 'Hf', 72), 73: Element('tantalum', 'Ta', 73),
74: Element('tungsten', 'W', 74), 75: Element('rhenium', 'Re', 75),
76: Element('osmium', 'Os', 76),
77: Element('iridium', 'Ir', 77), 78: Element('platinum', 'Pt', 78),
79: Element('gold', 'Au', 79), 80: Element('mercury', 'Hg', 80)}
79: Element('gold', 'Au', 79), 80: Element('mercury', 'Hg', 80),
81: Element('thallium', 'Tl', 81), 82: Element('lead', 'Pb', 82),
83: Element('bismuth', 'Bi', 83), 84: Element('polonium', 'Po', 84), 85: Element('astatine', 'At', 85),
86: Element('radon', 'Rn', 86), 87: Element('francium', 'Fr', 87), 88: Element('radium', 'Ra', 88),
89: Element('actinium', 'Ac', 89), 90: Element('thorium', 'Th', 90), 91: Element('protactinium', 'Pa', 91), 92: Element('uranium', 'U', 92),
93: Element('neptunium', 'Np', 93), 94: Element('plutonium', 'Pu', 94), 95: Element('americium', 'Am', 95),
96: Element('curium', 'Cm', 96), 97: Element('berkelium', 'Bk', 97), 98: Element('californium', 'Cf', 98),
99: Element('einsteinium', 'Es', 99), 100: Element('fermium', 'Fm', 100), 101: Element('mendelevium', 'Md', 101),
102: Element('nobelium', 'No', 102), 103: Element('lawrencium', 'Lr', 103), 104: Element('rutherfordium', 'Rf', 104),
105: Element('dubnium', 'Db', 105), 106: Element('seaborgium', 'Sg', 106), 107: Element('bohrium', 'Bh', 107),
108: Element('hassium', 'Hs', 108), 109: Element('meitnerium', 'Mt', 109), 110: Element('darmstadtium', 'Ds', 110),
111: Element('roentgenium', 'Rg', 111), 112: Element('copernicium', 'Cn', 112), 113: Element('nihonium', 'Nh', 113),
114: Element('flerovium', 'Fl', 114), 115: Element('moscovium', 'Mc', 115), 116: Element('livermorium', 'Lv', 116),
117: Element('tennessine', 'Ts', 117), 118: Element('oganesson', 'Og', 118)}

# Ground-state spin multiplicities of all elements
atom_spinmults = {'H': 2, 'He': 1, 'Li': 2, 'Be': 1, 'B': 2, 'C': 3, 'N': 4, 'O': 3, 'F': 2, 'Ne': 1, 'Na': 2, 'Mg': 1,
Expand Down
30 changes: 29 additions & 1 deletion ash/interfaces/interface_CFour.py
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,16 @@ def __init__(self, cfourdir=None, printlevel=2, cfouroptions=None, numcores=1,
except shutil.SameFileError:
pass


#Storing absolute path of staged GENBAS file and caching ECPDATA contents in memory.
#Necessary because some job-types (e.g. NEB via Knarr, Singlepoint_parallel) change into
#subdirectories (image_N, worker dirs) before calling run(). The run-method will
#restore these files in the current working directory if they are missing there.
#Note: ECPDATA must be cached in memory since cleanup() (called below) deletes the file.
self.genbas_path = os.path.abspath('GENBAS') if os.path.isfile('GENBAS') else None
self.ecpdata_content = None
if os.path.isfile('ECPDATA'):
with open('ECPDATA') as ecpfile:
self.ecpdata_content = ecpfile.read()

#Clean-up of possible old Cfour files before beginning
#TODO: Skip cleanup of chosen files?
Expand Down Expand Up @@ -321,6 +330,25 @@ def run(self, current_coords=None, current_MM_coords=None, MMcharges=None, qm_el
print("no current_coords")
ashexit()

#Making sure GENBAS (and ECPDATA if available) is present in current working directory.
#Jobs like NEB (Knarr) and Singlepoint_parallel change into subdirectories (image_N, worker dirs)
#where the basis files staged by __init__ are not present, causing xcfour to crash.
if self.genbas_path is not None and not os.path.isfile("GENBAS"):
if os.path.isfile(self.genbas_path):
print(f"No GENBAS file found in current directory. Copying GENBAS from: {self.genbas_path}")
shutil.copyfile(self.genbas_path, "GENBAS")
if self.ecpdata_content is not None and not os.path.isfile("ECPDATA"):
with open("ECPDATA", "w") as ecpfile:
ecpfile.write(self.ecpdata_content)

#Resetting EXTERN_POT for this run unless pointcharges are used (QM/MM job).
#Energy-only runs with PROP active set self.EXTERN_POT='ON' (dummy-pcharges trick to prevent
#reorientation), which is sticky on the object. A subsequent gradient run in a fresh directory
#(e.g. NEB image dirs) would then require a pcharges file that does not exist there,
#crashing CFour (mkvmol.f: End of file reading pcharges).
if PC is not True:
self.EXTERN_POT='OFF'

if self.DBOC is True:
DBOC=True

Expand Down
9 changes: 6 additions & 3 deletions ash/interfaces/interface_ORCA.py
Original file line number Diff line number Diff line change
Expand Up @@ -1828,7 +1828,7 @@ def create_orca_input_pc(name,elems,coords,orcasimpleinput,orcablockinput,charge
orcafile.write('! Freq' + '\n')
if moreadfile is not None:
print("MOREAD option active. Will read orbitals from file:", moreadfile)
orcafile.write('! MOREAD' + '\n')
orcafile.write('\n! MOREAD' + '\n')
orcafile.write('%moinp \"{}\"'.format(moreadfile) + '\n')
orcafile.write('%pointcharges "{}"\n'.format(pcfile))
orcafile.write(orcablockinput + '\n')
Expand Down Expand Up @@ -1904,7 +1904,7 @@ def create_orca_input_plain(name,elems,coords,orcasimpleinput,orcablockinput,cha
orcafile.write('! Freq' + '\n')
if moreadfile is not None:
print("MOREAD option active. Will read orbitals from file:", moreadfile)
orcafile.write('! MOREAD' + '\n')
orcafile.write('\n! MOREAD' + '\n')
orcafile.write('%moinp \"{}\"'.format(moreadfile) + '\n')
orcafile.write(orcablockinput)
if atomstoflip is not None:
Expand Down Expand Up @@ -2000,6 +2000,7 @@ def grabspinpop_ORCA(chargemodel,outputfile):
coordgrab=False
spinpops=[]
BS=False #if broken-symmetry job
numatoms = int(pygrep('Number of atoms ...', outputfile)[-1])
#if
if len(pygrep2("WARNING: Broken symmetry calculations", outputfile)):
BS=True
Expand Down Expand Up @@ -2032,7 +2033,9 @@ def grabspinpop_ORCA(chargemodel,outputfile):
#If BS then we have grabbed charges for both high-spin and BS solution
if BS is True:
print("Broken-symmetry job detected. Only taking BS-state populations")
spinpops=spinpops[int(len(spinpops)/2):]
#spinpops=spinpops[int(len(spinpops)/2):]
if len(spinpops) != numatoms:
spinpops=spinpops[-numatoms:]
#if len(spinpops) == 0:
# print("Warning: No spinpopulations were found in ORCA outputfile")
return spinpops
Expand Down
Loading
Loading