
GPAW png logo

GPAW has a large set of PAW setups (updated in 2016) for elements from H to Rn, excluding lanthanides, actinides, and radioactive elements. One can generate new setups with a PAW generating build-in tool and their own risk. One can use optimized norm-conserving Vanderbilt SG15 pseudopotentials (updated in 2017) or norm-conserving Hartwigsen-Goedecker-Hutter HGH pseudopotentials (see also GPAW intro) or even JTH pseudopotentials from ABINIT. There are even more setups, including f-elements, listed on the QE webpage. The great thing about these setups is that they use a similar format – either xml or upf. Apparently, GPAW can read both formats, although there is no relevant documentation. So, there are many ways to run calculations with elements that are missing in the GPAW default setups set. QuantumATK webpage provides an overview of pseudopotentials and even suggests mixing them. I hope that in the future, these and new PAWs will be gathered together like basis sets at the basis sets exchange portal.
P.S. Interesting https://esl.cecam.org/data/ and https://molmod.ugent.be/deltacodesdft
These are undeservedly less attention to optimizers than density functionals (concerning Jacob’s ladder). It is not even covered in the recent review: Best-Practice DFT Protocols for Basic Molecular Computational Chemistry. At the same time, in my current projects, the most resource-demanding was geometry optimization – the time spent on optimizing structures was much longer than a single-point calculation. Papers that introduce new (AI-based) optimizers promise significant speed-up. However, there are always some problems:
ASE wiki lists all internal and some external optimizers and provides their comparison. I have checked the most promising on a high-entropy alloy slab.
Observation 1. QuasiNewton outperforms all other optimizers. Point. I have run a standard GPAW/DFT/PBE/PW optimization with various optimizers:
Observation 2. Pre-optimizing the slab with a cheaper method does not reduce the number of optimization steps. I have preoptimized the geometry with TBLITE/DFTB/GFN1-xTB to continue with GPAW/DFT/PBE/PW. Preoptimization takes just some minutes and the obtained geometry looks similar to the DFT one but that does not reduce the number of DFT optimization steps.
Optimizer | N steps* | Time$ | N steps*# | Total time# |
BFGS | 16 | 02:44:27 | 17 | 03:01:26 |
LBFGS | 15 | 02:30:35 | 16 | 02:55:04 |
BondMin | 12 | 02:46:27 | 13 | 02:45:07 |
GPMin | 12 | 05:26:23 | 31 | 08:14:22 |
MLMin | 38 | verylong | 28 | 12:31:29 |
FIRE | 38 | 05:06:56 | 44 | 05:56:54 |
QuasiNewton | 8 | 01:36:23 | 9 | 02:00:10 |
Note * – the printed number of steps might different from the actuall number of calculations because each calculator has a different way of reporting that number.
Note $ – the time between the end of the first and last steps.
Note # – started from the TBLITE/DFTB/GFN1-xTB preoptimized geometry.
N.B! I have done my test only once in two runs: starting with slab.xyz and preoptized geometry. Runs were on similar nodes and all optimizations were done on the same node.
Conclusion. Do not believe in claims in articles advertizing new optimizers – Run your tests before using them.
A practical finding. The usual problem with calculations that require many optimization steps is that they need to fit into HPC time limits. On the restart, ASE usually rewrites the trajectory. Some optimizers (GPMin and AI-based) could benefit from reading the full trajectory. So, I started writing two trajectories and a restart file like this.
# Restarting
if os.path.exists(f'{name}_last.gpw') == True and os.stat(f'{name}_last.gpw').st_size > 0:
atoms,calc = restart(f'{name}_last.gpw', txt=None)
parprint(f'Restart from the gpw geometry.')
elif os.path.exists(f'{name}_full.traj') == True and os.stat(f'{name}_full.traj').st_size > 0:
atoms = read(f'{name}_full.traj',-1)
parprint(f'Restart with the traj geometry.')
else:
atoms = read(f'{name}_init.xyz')
parprint(f'Start with the initial xyz geometry.')
# Optimizing
opt = QuasiNewton(atoms, trajectory=f'{name}.traj', logfile=f'{name}.log')
traj= Trajectory(f'{name}_full.traj', 'a', atoms)
opt.attach(traj.write, interval=1)
def writegpw():
calc.write(f'{name}_last.gpw')
opt.attach(writegpw, interval=1)
opt.run(fmax=0.05, steps=42)
Here are some details on the tests.
My gpaw_opt.py for DFT calculations on 24 cores:
# Load modules
from ase import Atom, Atoms
from ase.build import add_adsorbate, fcc100, fcc110, fcc111, fcc211, molecule
from ase.calculators.mixing import SumCalculator
from ase.constraints import FixAtoms, FixedPlane, FixInternals
from ase.data.vdw_alvarez import vdw_radii
from ase.db import connect
from ase.io import write, read
from ase.optimize import BFGS, GPMin, LBFGS, FIRE, QuasiNewton
from ase.parallel import parprint
from ase.units import Bohr
from bondmin import BondMin
from catlearn.optimize.mlmin import MLMin
from dftd4.ase import DFTD4
from gpaw import GPAW, PW, FermiDirac, PoissonSolver, Mixer, restart
from gpaw.dipole_correction import DipoleCorrection
from gpaw.external import ConstantElectricField
from gpaw.utilities import h2gpts
import numpy as np
import os
atoms = read('slab.xyz')
atoms.set_constraint([FixAtoms(indices=[atom.index for atom in atoms if atom.tag in [1,2]])])
# Set calculator
kwargs = dict(poissonsolver={'dipolelayer':'xy'},
xc='RPBE',
kpts=(4,4,1),
gpts=h2gpts(0.18, atoms.get_cell(), idiv=4),
mode=PW(400),
basis='dzp',
parallel={'augment_grids':True,'sl_auto':True,'use_elpa':True},
)
calc = GPAW(**kwargs)
#atoms.calc = SumCalculator([DFTD4(method='RPBE'), calc])
#atoms.calc = calc
# Optimization paramters
maxf = 0.05
# Run optimization
###############################################################################
# 2.A. Optimize structure using MLMin (CatLearn).
initial_mlmin = atoms.copy()
initial_mlmin.set_calculator(calc)
mlmin_opt = MLMin(initial_mlmin, trajectory='results_mlmin.traj')
mlmin_opt.run(fmax=maxf, kernel='SQE', full_output=True)
# 2.B Optimize using GPMin.
initial_gpmin = atoms.copy()
initial_gpmin.set_calculator(calc)
gpmin_opt = GPMin(initial_gpmin, trajectory='results_gpmin.traj', logfile='results_gpmin.log', update_hyperparams=True)
gpmin_opt.run(fmax=maxf)
# 2.C Optimize using LBFGS.
initial_lbfgs = atoms.copy()
initial_lbfgs.set_calculator(calc)
lbfgs_opt = LBFGS(initial_lbfgs, trajectory='results_lbfgs.traj', logfile='results_lbfgs.log')
lbfgs_opt.run(fmax=maxf)
# 2.D Optimize using FIRE.
initial_fire = atoms.copy()
initial_fire.set_calculator(calc)
fire_opt = FIRE(initial_fire, trajectory='results_fire.traj', logfile='results_fire.log')
fire_opt.run(fmax=maxf)
# 2.E Optimize using QuasiNewton.
initial_qn = atoms.copy()
initial_qn.set_calculator(calc)
qn_opt = QuasiNewton(initial_qn, trajectory='results_qn.traj', logfile='results_qn.log')
qn_opt.run(fmax=maxf)
# 2.F Optimize using BFGS.
initial_bfgs = atoms.copy()
initial_bfgs.set_calculator(calc)
bfgs_opt = LBFGS(initial_bfgs, trajectory='results_bfgs.traj', logfile='results_bfgs.log')
bfgs_opt.run(fmax=maxf)
# 2.G. Optimize structure using BondMin.
initial_bondmin = atoms.copy()
initial_bondmin.set_calculator(calc)
bondmin_opt = BondMin(initial_bondmin, trajectory='results_bondmin.traj',logfile='results_bondmin.log')
bondmin_opt.run(fmax=maxf)
# Summary of the results
###############################################################################
fire_results = read('results_fire.traj', ':')
parprint('Number of function evaluations using FIRE:',
len(fire_results))
lbfgs_results = read('results_lbfgs.traj', ':')
parprint('Number of function evaluations using LBFGS:',
len(lbfgs_results))
gpmin_results = read('results_gpmin.traj', ':')
parprint('Number of function evaluations using GPMin:',
gpmin_opt.function_calls)
bfgs_results = read('results_bfgs.traj', ':')
parprint('Number of function evaluations using BFGS:',
len(bfgs_results))
qn_results = read('results_qn.traj', ':')
parprint('Number of function evaluations using QN:',
len(qn_results))
catlearn_results = read('results_mlmin.traj', ':')
parprint('Number of function evaluations using MLMin:',
len(catlearn_results))
bondmin_results = read('results_bondmin.traj', ':')
parprint('Number of function evaluations using BondMin:',
len(bondmin_results))
Initial slab.xyz file:
45
Lattice="8.529357696932532 0.0 0.0 4.264678848466266 7.386640443507905 0.0 0.0 0.0 29.190908217261956" Properties=species:S:1:pos:R:3:tags:I:1 pbc="T T F"
Ir 0.00000000 1.62473838 10.00000000 5
Ru 2.81412943 1.62473838 10.00000000 5
Pt 5.62825885 1.62473838 10.00000000 5
Pd 1.40706471 4.06184595 10.00000000 5
Ag 4.22119414 4.06184595 10.00000000 5
Ag 7.03532356 4.06184595 10.00000000 5
Ag 2.81412943 6.49895353 10.00000000 5
Ru 5.62825885 6.49895353 10.00000000 5
Pt 8.44238828 6.49895353 10.00000000 5
Pt 0.00000000 0.00000000 12.29772705 4
Ag 2.81412943 0.00000000 12.29772705 4
Ru 5.62825885 0.00000000 12.29772705 4
Ru 1.40706471 2.43710757 12.29772705 4
Ir 4.22119414 2.43710757 12.29772705 4
Ag 7.03532356 2.43710757 12.29772705 4
Ag 2.81412943 4.87421514 12.29772705 4
Ir 5.62825885 4.87421514 12.29772705 4
Pd 8.44238828 4.87421514 12.29772705 4
Pd 1.40706471 0.81236919 14.59545411 3
Ir 4.22119414 0.81236919 14.59545411 3
Pt 7.03532356 0.81236919 14.59545411 3
Ag 2.81412943 3.24947676 14.59545411 3
Ir 5.62825885 3.24947676 14.59545411 3
Ir 8.44238828 3.24947676 14.59545411 3
Pd 4.22119414 5.68658433 14.59545411 3
Pt 7.03532356 5.68658433 14.59545411 3
Ag 9.84945299 5.68658433 14.59545411 3
Pd 0.00000000 1.62473838 16.89318116 2
Pd 2.81412943 1.62473838 16.89318116 2
Ag 5.62825885 1.62473838 16.89318116 2
Pt 1.40706471 4.06184595 16.89318116 2
Ag 4.22119414 4.06184595 16.89318116 2
Ag 7.03532356 4.06184595 16.89318116 2
Ru 2.81412943 6.49895353 16.89318116 2
Ru 5.62825885 6.49895353 16.89318116 2
Ru 8.44238828 6.49895353 16.89318116 2
Ir 0.00000000 0.00000000 19.19090822 1
Ag 2.81412943 0.00000000 19.19090822 1
Pt 5.62825885 0.00000000 19.19090822 1
Pd 1.40706471 2.43710757 19.19090822 1
Ag 4.22119414 2.43710757 19.19090822 1
Pd 7.03532356 2.43710757 19.19090822 1
Ag 2.81412943 4.87421514 19.19090822 1
Ru 5.62825885 4.87421514 19.19090822 1
Ir 8.44238828 4.87421514 19.19090822 1
My tblite_opt.py for DFTB calcualation with just one core. It takes some minutes but eventually crashes 🙁
# Load modules
from ase import Atom, Atoms
from ase.build import add_adsorbate, fcc100, fcc110, fcc111, fcc211, molecule
from ase.calculators.mixing import SumCalculator
from ase.constraints import FixAtoms, FixedPlane, FixInternals
from ase.data.vdw_alvarez import vdw_radii
from ase.db import connect
from ase.io import write, read
from ase.optimize import BFGS, GPMin, LBFGS, FIRE, QuasiNewton
from ase.parallel import parprint
from ase.units import Bohr
from tblite.ase import TBLite
import numpy as np
import os
# https://tblite.readthedocs.io/en/latest/users/ase.html
atoms = read('slab.xyz')
atoms.set_constraint([FixAtoms(indices=[atom.index for atom in atoms if atom.tag in [1,2]])])
# Set calculator
calc = TBLite(method="GFN1-xTB",accuracy=1000,electronic_temperature=300,max_iterations=300)
atoms.set_calculator(calc)
qn_opt = QuasiNewton(atoms, trajectory='results_qn.traj', logfile='results_qn.log', maxstep=0.1)
qn_opt.run(fmax=0.1)
To compare structures I have used MDanalysis, which unfortunately does not work with ASE traj, so I prepared xyz-files with “ase convert -n -1 file.traj file.xyz”
import MDAnalysis as mda
from MDAnalysis.analysis.rms import rmsd
import sys
def coord(file_name):
file = mda.Universe(f"{file_name}.xyz")
atoms = file.select_atoms("index 1:9")
return atoms.positions.copy()
print(rmsd(coord(sys.argv[1]),coord(sys.argv[2])))
An instruction on installation of GPAW. TBLITE can be installed as “conda install -c conda-forge tblite”.
Between installation with conda and compilation of libraries, an intermediate path – installation of GPAW with pip – is a compromise for those who wish to text specific GPAW branches or packages.
For example, I wish to text self-interaction error correction (SIC) and evaluate Bader charges with pybader. Neither SIC nor pybader is compatible with the recent GPAW. Here is not to get a workable version.
# numba in pybader is not compatible with python 3.11, so create a conda environment with python 3.10
conda create -n gpaw-pip python=3.10
conda activate gpaw-pip
conda install -c conda-forge libxc libvdwxc
conda install -c conda-forge ase
# ensure that you install the right openmpi (not external)
conda install -c conda-forge openmpi ucx
conda install -c conda-forge compilers
conda install -c conda-forge openblas scalapack
conda install -c conda-forge pytest
pip install pybader
# Get a developer version of GPAW with SIC
git clone -b dm_sic_mom_update https://gitlab.com/alxvov/gpaw.git
cd gpaw
cp siteconfig_example.py siteconfig.py
# In the siteconfig.py rewrite
'''
fftw = True
scalapack = True
if scalapack:
libraries += ['scalapack']
'''
unset CC
python -m pip install -e .
gpaw info
While preparing the final report on the past MSCA project, I found some memorable pictures. Here me, my wife and nephew are building a LEGO illustration for the project proposal. Yes, we had some fun while I was thinking about the concept.
The results looks pretty.
Still, as the concept illustration, I draw this figure. Today, I have reused it for the report illustration.
For a long time I wanted to see ASE atoms in my Jupyter notebook. My previous attempts were usually unsuccessful. Today I decided to try again. First ASE wiki suggests x3d and webngl:
view(atoms, viewer='x3d')
view(atoms, viewer='ngl')
Łucasz Mentel gives some useful tips in his blogpost from 2017.
In my case x3d works and webngl fails. The x3d picture is not enought, and I do not want to spend much time on fixing webngl.
ASE-notebook is what works for me.
conda create -n "jupyter"
conda activate jupyter
conda install -c conda-forge ase-notebook
conda install -c conda-forge jupyterlab
By the way, the model is from my “Surface Curvature Effect on Dual-Atom Site Oxygen Electrocatalysis” paper, which you can read at chemRxiv until it turns Gold Open Access.
While working on the “Potential of monolayer charge” letter, we learned that saving figure versions is essential. In particular, while working on the first Figure (representing the concept), we started with this sketch as an intermediate of a cartoon from “Overscreening versus Crowding” and MD snapshots from “Interfaces between Charged Surfaces and Ionic Liquids.”
With chatGPT, we created a wavy electrode and arranged ions in Matplotlib. Then, we created over 30 versions in Inkscape, as shown in this animation (also made with guidance from chatGPT):
It was crucial to have versions instead of working on the same file because we often reverted to previous versions after trying new visual elements. Our final figure illustrates that the Potential of Monolayer Charge (PMC) is right between overscreening and crowding regimes. Moreover, the PMC can fit into the electrochemical stability window by lowering its absolute value with varying ion area. Read more in the “Potential of monolayer charge” letter.
Here are two examples of lyrics generated by ChatGPT. To make it even more fun, copy-paste the text to deepl.com (better than google translate) and make it read/sign the lyrics. melobytes is not good at all.
Verse 1:
Carbon in the air, causing so much harm
But we can make a change, with carbon capture
Trapping it away, before it can do more
We can reduce the harm, and protect our shore
Chorus:
Carbon capture, carbon capture
A solution for our planet’s future
Carbon capture, carbon capture
Together we can make it happen
Verse 2:
Technology is key, to making it a success
We can power our lives, while reducing the excess
Carbon in the air, will no longer be a threat
With carbon capture, we can make a new bet
Chorus:
Carbon capture, carbon capture
A solution for our planet’s future
Carbon capture, carbon capture
Together we can make it happen
Bridge:
We can make a difference, with every step we take
Towards a brighter future, for the sake of those who’ll come
Let’s work together, and make this dream come true
With carbon capture, we can make a better future for you
Chorus:
Carbon capture, carbon capture
A solution for our planet’s future
Carbon capture, carbon capture
Together we can make it happen.
and another one
Electricity, oh electricity
Flowing through a circuit so free
But when it comes to ionic liquids
There’s more to it, as you’ll see
The electric double layer
Is a fascinating thing
It forms between the electrodes
And the ionic liquids they bring
The ions in the liquid
Are attracted to the metal
They line up in a layer
It’s really quite essential
This double layer of charge
Controls the flow of electricity
It’s a key part of the circuit
That makes our technology so advanced, you see
So next time you flip a switch
Or plug in your phone to charge
Think of the electric double layer
Making it all possible, oh so large!
Choosing optimal k-points is a tricky task. In GPAW, one can set them manually, using size or density and following a rule of thumb:
calc = GPAW(kpts={'size': (4, 4, 4), 'gamma': True})
# or
calc = GPAW(kpts={'density': 2.5, 'gamma': True})
A rule of thumb for choosing the initial k-point sampling is, that the product, ka, between the number of k-points, k, in any direction, and the length of the basis vector in this direction, a, should be:
- ka ~ 30 Å, for d band metals
- ka ~ 25 Å, for simple metals
- ka ~ 20 Å, for semiconductors
- ka ~ 15 Å, for insulators
Remember that convergence in this parameter should always be checked.
https://wiki.fysik.dtu.dk/gpaw/tutorialsexercises/structureoptimization/surface/surface.html
The corresponding densities (ka/2π) are:
With the recent update, I can start using kplib (see paper) to choose the optimal generalized k-point grids. The main variable in kplib is min_distance, which is analogous to the density×2π. Read more about the min_distance at muellergroup.jhu.edu/K-Points.html.
Here is an example of my conda environment
conda create -n gpaw23 python=3.9
conda activate gpaw23
conda install -c conda-forge cxx-compiler
pip install kplib # from pypi.org/project/kpLib
conda install -c conda-forge gpaw
Here is a working example:
from ase import Atoms
from ase.parallel import parprint
from gpaw import GPAW, PW
from kpLib import get_kpoints
from pymatgen.io.ase import AseAtomsAdaptor
atoms = Atoms(cell=[[1.608145, -2.785389, 0.0], [1.608145, 2.785389, 0.0], [0.0, 0.0, 5.239962]],
symbols=['Ga', 'Ga', 'N', 'N'],
positions=[[ 1.608145 , -0.92846486, 2.61536983],
[ 1.608145 , 0.92846486, 5.23535083],
[ 1.608145 , -0.92846486, 4.58957792],
[ 1.608145 , 0.92846486, 1.96959692]],
pbc=True)
structure = AseAtomsAdaptor.get_structure(atoms)
kpts_data = get_kpoints(structure, minDistance=30, include_gamma=False)
parprint("Found lattice with kplib: ")
parprint(f"Nominal kpts: {kpts_data['num_total_kpts']}")
parprint(f"Distinct kpts: {kpts_data['num_distinct_kpts']}")
atoms.calc = GPAW(xc='PBE',
mode=PW(400),
kpts=kpts_data['coords'],
symmetry={'point_group': True,
'time_reversal': True,
'symmorphic': False,
'tolerance': 1e-4},
txt='gpaw-out.txt')
energy = atoms.get_total_energy()
parprint(f"Total energy: {energy}")
parprint(f"kpts passed to GPAW: {len(atoms.calc.get_bz_k_points())}")
parprint(f"kpts in GPAW IBZ: {len(atoms.calc.get_ibz_k_points())}")
RSS is a site summary – a format used to create feeds with articles’ metadata, including Graphical Abstract, Title, Publication data, Authors, and Abstract.
Here is my way of organizing RSS flows. Let us take as an example ACS journals. Their RSS feeds are all given on one page:
https://pubs.acs.org/page/follow.html
I have copied them all by opening the html-code and taking the urls, which I then merge into a single opml-file at https://opml-gen.ovh.
Then I uploaded the opml-file to a very old but still working webpage:
feedrinse merges all feeds into one “channel” feed. Here is my merged feed:
http://www.feedrinse.com/services/channel/?chanurl=7bde3acd38bc31fc705118deb2300ca1
Using feedrince’s interface is tricky. Check this blogposts for a step-by-step instruction:
https://www.journalism.co.uk/skills/how-to-tame-your-rss-sources-using-feed-rinse/s7/a53238/
In my case, feedrince’s filters do not work. So, I turned to https://siftrss.com/ , where one can set up a regex filter. You can check your regex expression at https://regex101.com/. Here is my example:
/(electro)|(cataly)|(double)/
which finds all words containing “electro” or “cataly” or “double”.
From siftrss I got a new feed that I entered to my RSS reader.
I am currently using online and mobile RSS readers, which are synced together. Namely, I use Nextcloud News, because I have a Nextcloud account.
In these RSS readers, one can see the essential info about each article and star articles. It is a pleasure to swipe articles on the mobile phone and star interesting articles. Later one can open the stared articles from the online reader and go to the publisher’s webpage. At that stage, I also use Reader View (in Firefox) and listen to the abstract.
P.S. Here are all ACS feeds (as for dec 2022):
http://feeds.feedburner.com/acs/aabmcb
http://feeds.feedburner.com/acs/aaembp
http://feeds.feedburner.com/acs/aaemcq
http://feeds.feedburner.com/acs/aamick
http://feeds.feedburner.com/acs/aanmf6
http://feeds.feedburner.com/acs/aapmcd
http://feeds.feedburner.com/acs/aastgj
http://feeds.feedburner.com/acs/abmcb8
http://feeds.feedburner.com/acs/abseba
http://feeds.feedburner.com/acs/acbcct
http://feeds.feedburner.com/acs/accacs
http://feeds.feedburner.com/acs/achre4
http://feeds.feedburner.com/acs/achsc5
http://feeds.feedburner.com/acs/acncdm
http://feeds.feedburner.com/acs/acscii
http://feeds.feedburner.com/acs/acsodf
http://feeds.feedburner.com/acs/aeacb3
http://feeds.feedburner.com/acs/aeacc4
http://feeds.feedburner.com/acs/aeecco
http://feeds.feedburner.com/acs/aelccp
http://feeds.feedburner.com/acs/aesccq1
http://feeds.feedburner.com/acs/aewcaa
http://feeds.feedburner.com/acs/afsthl
http://feeds.feedburner.com/acs/aidcbc
http://feeds.feedburner.com/acs/amacgu
http://feeds.feedburner.com/acs/amachv
http://feeds.feedburner.com/acs/amclct
http://feeds.feedburner.com/acs/amlccd
http://feeds.feedburner.com/acs/amlcef
http://feeds.feedburner.com/acs/amrcda
http://feeds.feedburner.com/acs/anaccx
http://feeds.feedburner.com/acs/ancac3
http://feeds.feedburner.com/acs/ancham/
http://feeds.feedburner.com/acs/aoiab5
http://feeds.feedburner.com/acs/apaccd
http://feeds.feedburner.com/acs/apcach
http://feeds.feedburner.com/acs/apchd5
http://feeds.feedburner.com/acs/aptsfn
http://feeds.feedburner.com/acs/asbcd6
http://feeds.feedburner.com/acs/ascecg
http://feeds.feedburner.com/acs/ascefj
http://feeds.feedburner.com/acs/bcches
http://feeds.feedburner.com/acs/bichaw
http://feeds.feedburner.com/acs/bomaf6
http://feeds.feedburner.com/acs/cgdefu
http://feeds.feedburner.com/acs/chreay
http://feeds.feedburner.com/acs/cmatex
http://feeds.feedburner.com/acs/crtoec
http://feeds.feedburner.com/acs/enfuem
http://feeds.feedburner.com/acs/esthag
http://feeds.feedburner.com/acs/estlcu
http://feeds.feedburner.com/acs/iecred
http://feeds.feedburner.com/acs/inocaj
http://feeds.feedburner.com/acs/jaaucr
http://feeds.feedburner.com/acs/jacsat
http://feeds.feedburner.com/acs/jafcau
http://feeds.feedburner.com/acs/jamsef
http://feeds.feedburner.com/acs/jceaax
http://feeds.feedburner.com/acs/jceda8
http://feeds.feedburner.com/acs/jcisd8
http://feeds.feedburner.com/acs/jctcce
http://feeds.feedburner.com/acs/jmcmar
http://feeds.feedburner.com/acs/jnprdf
http://feeds.feedburner.com/acs/joceah
http://feeds.feedburner.com/acs/jpcafh
http://feeds.feedburner.com/acs/jpcbfk
http://feeds.feedburner.com/acs/jpccck
http://feeds.feedburner.com/acs/jpclcd
http://feeds.feedburner.com/acs/jprobs
http://feeds.feedburner.com/acs/langd5
http://feeds.feedburner.com/acs/mamobx
http://feeds.feedburner.com/acs/mpohbp
http://feeds.feedburner.com/acs/nalefd
http://feeds.feedburner.com/acs/oprdfk
http://feeds.feedburner.com/acs/orgnd7
http://feeds.feedburner.com/acs/orlef7