Regex
^.*(A|B).*(A|B).*$
Nano
see https://www.nano-editor.org/dist/latest/cheatsheet.html
alt+U to undo
alt+a to start a selection
alt+shift+} to indent the selection
Bayesian Error Estimation (BEE) for RPBE
The Beyesian Error Estimation (BEE) is implemented in GPAW only for PBE, BEEF-vdW, and mBEEF-vdW.
Here is a trick for making the BEE with the RPBE functional. Just edit the lines in ASE and GPAW codes by adding RPBE as an exception.
To find the needed files, run
find ./ -name "bee.py"
In ase/dft/bee.py change one line:
class BEEFEnsemble:
if self.xc in ['BEEF-vdW', 'BEEF', 'PBE', 'RPBE']: # add RPBE
self.beef_type = 'beefvdw'
In gpaw/xc/bee.py add two lines:
class BEEFEnsemble:
"""BEEF ensemble error estimation."""
def __init__(self, calc):
# determine functional and read parameters
self.xc = self.calc.get_xc_functional()
if self.xc == 'BEEF-vdW':
self.bee_type = 1
elif self.xc == 'RPBE': # catch the RPBE exchange functional
self.bee_type = 1 # assign BEEF coefficients the RBPE
Below we use BEEF-vdW, RPBE, and PBE dimensionless density (n) with gradient (s) and apply BEEF coefficients (E₀, ΔEᵢ) to evaluate the BEE as the standard deviation for the ensemble total energies with the variable enhancement factor (F(s,θᵢ)).
from ase import Atoms
from ase.dft.bee import BEEFEnsemble
from ase.parallel import parprint
from gpaw import GPAW
import time
for xc in ['BEEF-vdW','RPBE','PBE']:
start_time = time.time()
h2 = Atoms('H2',[[0.,0.,0.],[0.,0.,0.741]]) #exp. bond length
h2.center(vacuum=3)
cell = h2.get_cell()
calc = GPAW(xc=xc,txt='H2_{0}.txt'.format(xc))
h2.calc = calc
e_h2 = h2.get_potential_energy()
ens = BEEFEnsemble(calc)
de_h2 = ens.get_ensemble_energies()
del h2, calc, ens
h = Atoms('H')
h.set_cell(cell)
h.center()
calc = GPAW(xc=xc,txt='H_{0}.txt'.format(xc), hund=True)
h.calc = calc
e_h = h.get_potential_energy()
ens = BEEFEnsemble(calc)
de_h = ens.get_ensemble_energies()
del h, calc, ens
E_bind = 2*e_h - e_h2
dE_bind = 2*de_h[:] - de_h2[:]
dE_bind = dE_bind.std()
parpting('{0} functional'.format(xc))
parprint('Time: {0} s'.format(round(time.time()-start_time,0)))
parprint('E_bind: {0} eV'.format(round(E_bind,4)))
parprint('Error bar {0} eV'.format(round(dE_bind,4)))
TS09 and D4 corrections with ASE
TS09 and D4 are atomic-charge dependent dispersion corrections (see TS09 PRL paper and D4 homepage for the refs). The D4 code is available at github. According to GPAW documentation, TS09 and D4 show for the S26 test set smaller mean deviation than vdW-DF. Herewith, D4 correction does not depend on the actual calculation as it is added to the calculated energy.
Here is how D4 correction can be added with ASE (see Readme) after installing it (for example, as conda install -c conda-forge dftd4 dftd4-python):
from ase.build import molecule
from ase.calculators.mixing import SumCalculator
from ase.optimize import BFGS
from dftd4.ase import DFTD4
from gpaw import GPAW
atoms = molecule('H2O')
atoms.center(vacuum=4)
gpaw = GPAW(mode='fd',txt='H2O_D4.txt',xc='PBE')
atoms.calc = SumCalculator([DFTD4(method='PBE'), gpaw])
#atoms.get_potential_energy()
opt = BFGS(atoms,trajectory='H2O_D4.traj', logfile='H2O_D4.log')
opt.run(fmax=0.05)
Let me stress that before choosing TS09 or D4 one should consider all pro and contra. TS09 method used Hirshfeld charges while D4 uses the electronegativity equilibration method to obtain charges. The former naturally accounts for the interfacial charge transfer while the latter does not. The TS09 correction requires vdW radii and is implemented for a limited set on functionals (see ASE code), like PBE, RPBE, and BLYP. The D4 correction supports much more functionals (see parameters). Regarding the vdW radii values for TS09 bare in mind that there are four data sources – one in GPAW, two in ASE and one more in ASE.
Here is how TS09 correction can be added with ASE and GPAW:
from ase.build import molecule
from ase.calculators.vdwcorrection import vdWTkatchenko09prl
from ase.data.vdw_alvarez import vdw_radii
from ase.optimize import BFGS
from gpaw.analyse.hirshfeld import HirshfeldPartitioning
from gpaw.analyse.vdwradii import vdWradii
from gpaw import GPAW
atoms = molecule('H2O')
atoms.center(vacuum=4)
gpaw = GPAW(mode='fd',txt='H2O_TS.txt',xc='PBE')
atoms.calc = vdWTkatchenko09prl(HirshfeldPartitioning(gpaw), vdWradii(atoms.get_chemical_symbols(), 'PBE'))
#atoms.get_potential_energy()
opt = BFGS(atoms,trajectory='H2O_TS.traj', logfile='H2O_TS.log')
opt.run(fmax=0.05)
N.B! Note that the TS09 and D4 energies are no outputted to the H2O.txt. They are written to the log-file.
Synchronizing calendars
This post describes ways of pushing MS outlook and Google calendars to Nextcloud.
My main working calendar is the Nextcloud app because I can easily sync it is my Sailfish phone. I also use Google calendar (for sharing family events) and MS outlook calendar (for work). Today I decided to merge all these calendars into a single one that I can sync on all my devices. Here is how.
MS to Nextcloud
Use outlookcaldavsynchronizer as recommended in the Nextcloud blog.
Google to Nextcould
- Get the iCal link from Google Calendar as follows:
- In the left calendar list menu of Google Calendar, go to the ⋮ menu of the calendar to be shared
- Click on “Settings and sharing”
- On the Calendar settings page, scroll down to “Secret address in iCal format”
- In Nextcloud Calendar’s left menu, click on “+New Calendar” > “New subscription from link (read-only)”
- Insert the “Secret address in iCal format”
- Your new calendar subscription will appear in the list; you can change its name or color in the menu of your calendar
Bader and Hirshfeld charges with python
Bader analysis is a fast and simple way of getting atomic charges. It is especially useful for periodic calculations. The analysis can be done on the fly using pybader tool from pypi.org/project/pybader. I recommend using it within conda environments.
The installation is straightforward:
pip install pybader
The usage is less obvious. Here is a function for obtaining xmol-type xyz that can obtained with GPAW and visualized with ASE:
def xyzb(atoms, filename, nCPU):
from pybader.io import gpaw
from pybader.interface import Bader
import os
bader = Bader(*gpaw.read_obj(atoms.calc)) # read ASE object 'atoms'
bader(threads=nCPU) # specify the number of CPUs
f = open('{0}.xyz'.format(filename), 'w') # set xmol format
b = bader.atoms_charge # get number of electrons per atom
n = atoms.get_atomic_numbers() # get atomic numbers
a = atoms.get_chemical_symbols() # get chemical symbols
p = atoms.get_positions() # get positions of the atoms
f.write('{0}\n'.format(len(a)))
f.write('Properties=species:S:1:pos:R:3:charge:R:1\n') # ensure compatibility with ASE
for i in range(len(a)): # print symbol, positions, and charge
s = '{0}'.format(a[i])
x = '{0:.6f}'.format(round(p[i][0],6))
y = '{0:.6f}'.format(round(p[i][1],6))
z = '{0:.6f}'.format(round(p[i][2],6))
c = '{0:.3f}'.format(round(float(n[i]) - float(b[i]),3))
f.write('{0:<4}{1:>16}{2:>16}{3:>16}{4:>10}\n'.format(s,x,y,z,c))
f.close()
del bader
os.remove('bader.p')
Similarly one can obtain xmol-type xyz file with Hirshfeld charges:
def xyzh(atoms, filename):
from gpaw.analyse.hirshfeld import HirshfeldPartitioning
f = open('{0}.xyz'.format(filename), 'w') # set xmol format
a = atoms.get_chemical_symbols() # get chemical symbols
p = atoms.get_positions() # get positions of the atoms
h = HirshfeldPartitioning(atoms.calc).get_charges()
f.write('{0}\n'.format(len(a)))
f.write('Properties=species:S:1:pos:R:3:charge:R:1\n') # ensure compatibility with ASE
for i in range(len(a)): # print symbol, positions, and charge
s = '{0}'.format(a[i])
x = '{0:.6f}'.format(round(p[i][0],6))
y = '{0:.6f}'.format(round(p[i][1],6))
z = '{0:.6f}'.format(round(p[i][2],6))
c = '{0:.3f}'.format(round(h[i],3))
f.write('{0:<4}{1:>16}{2:>16}{3:>16}{4:>10}\n'.format(s,x,y,z,c))
f.close()
In the LCAO mode of GPAW one can also get the Mulliken charges. Test before using:
def xyzm(atoms, filename):
from gpaw.lcao.tools import get_mulliken
f = open('{0}.xyz'.format(filename), 'w') # set xmol format
a = atoms.get_chemical_symbols() # get chemical symbols
p = atoms.get_positions() # get positions of the atoms
m = get_mulliken(atoms.calc, range(len(a)))
f.write('{0}\n'.format(len(a)))
f.write('Properties=species:S:1:pos:R:3:charge:R:1\n') # ensure compatibility with ASE
for i in range(len(a)): # print symbol, positions, and charge
s = '{0}'.format(a[i])
x = '{0:.6f}'.format(round(p[i][0],6))
y = '{0:.6f}'.format(round(p[i][1],6))
z = '{0:.6f}'.format(round(p[i][2],6))
c = '{0:.3f}'.format(round(m[i],3))
f.write('{0:<4}{1:>16}{2:>16}{3:>16}{4:>10}\n'.format(s,x,y,z,c))
f.close()
“Resurrections”
I have not been writing to the blog for approximately 2.5 years. That period overlaps with the birth of my second child, pandemic, and absence of research funding – all the reasons for prioritizing family and grant writing above the blog writing. At the moment, there are no barriers to blogging, as I have the MSCA fellowship, some vaccine protection, and my adapted to a nursery.
I am now returning to that blog for several reasons. First, it is the right place for summarising research activity. Foremost for myself and close colleagues. Second, I feel the need to communicate science-related thoughts and emotions, especially in changing the working environment (from Tartu Univ. to Copenhagen Univ.). So, I am back!
ILMAT5 presentation
Abstract
In this work [0], we have applied the DFT-based delta Kohn–Sham (ΔKS) method to ion pairs in a vacuum to obtain X-ray photoelectron spectra of corresponding ionic liquids (IL). On the example of forty ion pairs, we demonstrate how the core level binding energy (BE) values can be calculated and used to plot theoretical spectra at a low computational cost. Furthermore, we compare the ΔKS results, 1s Kohn–Sham orbital energies, and atomic charges against the experimental X-ray photoelectron data. Recently, in connection to the electrochemical application in the supercapacitors, we have measured spectra for EMImBF4 and EMImB(CN)4 ionic liquids at the carbon–IL interface [1–3]. Other experimental spectra were obtained from the literature [4,5]. Both the ΔKS BE values and the 1s Kohn–Sham orbital energies show a correlation, yet with a different order of the BEs assigned to specific atoms. We find that neither DDEC6 nor Bader charges correlate with the experimental data. Thus, the DFT calculations of 1s Kohn–Sham orbital energies provide the fastest way of predicting the XPS spectra. However, more detailed experimental studies are required to resolve the right order of the BE values and its relation to the atomistic structure of the ILs. The ΔKS calculations provide the most precise estimations of the BEs. Herewith, they also demand more resources and cause computational difficulties discussed in the presentation. Besides the prediction power, a robust computational method can help in intepretating experimental data when the appropriate reference values are either not available nor directly applicable. Thus, the ΔKS method can find its application in various fields of physics and chemistry where the XPS is used for resolving electronic and geometric structures of pure ILs, their mixtures, and at interfaces.
In this work, we have applied the DFT-based delta Kohn–Sham (ΔKS) method to ion pairs in a vacuum to obtain X-ray photoelectron spectra of corresponding ionic liquids (IL). On the example of forty ion pairs, we demonstrate how the core level binding energy (BE) values can be calculated and used to plot theoretical spectra at a low computational cost. Furthermore, we compare the ΔKS results, 1s Kohn–Sham orbital energies, and atomic charges against the experimental X-ray photoelectron data. Recently, in connection to the electrochemical application in the supercapacitors, we have measured spectra for EMImBF4 and EMImB(CN)4 ionic liquids at the carbon–IL interface [1–3]. Other experimental spectra were obtained from the literature [4,5]. Both the ΔKS BE values and the 1s Kohn–Sham orbital energies show a correlation, yet with a different order of the BEs assigned to specific atoms. We find that neither DDEC6 nor Bader charges correlate with the experimental data. Thus, the DFT calculations of 1s Kohn–Sham orbital energies provide the fastest way of predicting the XPS spectra. However, more detailed experimental studies are required to resolve the right order of the BE values and its relation to the atomistic structure of the ILs. The ΔKS calculations provide the most precise estimations of the BEs. Herewith, they also demand more resources and cause computational difficulties discussed in the presentation. Besides the prediction power, a robust computational method can help in intepretating experimental data when the appropriate reference values are either not available nor directly applicable. Thus, the ΔKS method can find its application in various fields of physics and chemistry where the XPS is used for resolving electronic and geometric structures of pure ILs, their mixtures, and at interfaces.
[0] M. Lembinen, E. Nõmmiste, H. Ers, B. Docampo‐Álvarez, J. Kruusma, E. Lust, V.B. Ivaništšev, Calculation of core‐level electron spectra of ionic liquids, Int. J. Quantum Chem. 120 (2020). https://doi.org/10.1002/qua.26247.
[1] J. Kruusma, A. Tõnisoo, R. Pärna, E. Nõmmiste, I. Tallo, T. Romann, E. Lust, Electrochimica Acta 206 (2016) 419–426.
[2] J. Kruusma, A. Tõnisoo, R. Pärna, E. Nõmmiste, I. Kuusik, M. Vahtrus, I. Tallo, T. Romann, E. Lust, J. Electrochem. Soc. 164 (2017) A3393–A3402.
[3] A. Tõnisoo, J. Kruusma, R. Pärna, A. Kikas, M. Hirsimäki, E. Nõmmiste, E. Lust, J. Electrochem. Soc. 160 (2013) A1084–A1093.
[4] A. Foelske-Schmitz, D. Weingarth, R. Kötz, Surf. Sci. 605 (2011) 1979–1985.
[5] I.J. Villar-Garcia, E.F. Smith, A.W. Taylor, F. Qiu, K.R.J. Lovelock, R.G. Jones, P. Licence, Phys. Chem. Chem. Phys. 13 (2011) 2797–2808.
Oriental fonts in Ubuntu
!/bin/bash
for i in fonts-kacst fonts-kacst-one fonts-khmeros-core fonts-lklug-sinhala fonts-guru fonts-nanum fonts-noto-cjk fonts-takao-pgothic fonts-tibetan-machine fonts-guru-extra fonts-lao fonts-sil-padauk fonts-sil-abyssinica fonts-tlwg-* fonts-lohit-* fonts-beng fonts-beng-extra fonts-gargi fonts-gubbi fonts-gujr fonts-gujr-extra fonts-kalapi fonts-lohit-gujr fonts-samyak-* fonts-noto-unhinted fonts-noto-hinted fonts-navilu fonts-nakula fonts-orya-extra fonts-pagul fonts-sahadeva fonts-sarai fonts-smc fonts-telu-extra fonts-wqy-microhei; do
sudo apt purge -y $i
echo
done
echo “==== Fixing font cache”
sudo fc-cache -f -v && sudo dpkg-reconfigure fontconfig
echo “==== Packages remained (each containing multiple fonts)”
dpkg -l fonts*|grep ^ii|awk ‘{print $2}’
echo
read -p “Press any key to close.”
Elsevier reviewer


Installing the metalwalls
Here is a quick and dirty instruction for installation of the metalwalls code.
Download the source code using https protocol:
git clone https://gitlab.maisondelasimulation.fr/amarinla/mw2.git
You will be prompted for your username and password.
Preinstall gfortran and openmpi. Then copy compile.something.mk from the computer directory to the mw2 folder as compile.mk. Add a line “FPPFLAGS := -DMW_USE_MPI”. Comment the path to the pFUnit package.
Execute make.
Go to tests directory and execute tests:
python regression_tests.py -s nist
python regression_tests.py -s nacl
python regression_tests.py -s lammps
