[ase-users] [ase-developers] ASE calculator interface proposal
Jens Jørgen Mortensen
jensj at fysik.dtu.dk
Fri Feb 15 07:48:40 CET 2013
> Hi there,
>
> I am looking for a way to start a NEB calculation with image
> parallelization using siesta.
> In my calculations 6 CPUs are distributed over 3 images, therefore each
> image should run with 2 CPUs.
> Since the siesta calculator does not directly support the
> parallelization, I was trying a work around by starting the neb-python
> script using
>
> mpirun -np 3 neb.py
>
> and in "run_siesta.py" I was changing the way how siesta is started
>
> from "siesta" to "mpirun -np 2 siesta"
>
> the neb.py starts up correctly but when siesta is initialized, it just
> crashed with the error message "OOB: Connection to HNP lost" and no
> further information or error message. The siesta output is empty.
>
> If I dont change "siesta" to "mpirun -np 2 siesta" it runs fine.
Looks like running MPI from inside MPI doesn't work - which means you
are out of luck with our current NEB implementation in ASE. Someone
could make our NEB implementation run in three threads instead of three
MPI processes - I think such a multithreaded NEB would work for your case.
Jens Jørgen
> Cheers and thanks for any help in advance
> Benedikt Ziebarth
>
>
>
>
> import mpi4py
> from ase import *
> import ase.io as io
> from ase.calculators.siesta import Siesta
> import time
> from ase.optimize import MDMin
> import os
> from ase.neb import NEB
> from ase.parallel import rank, size
> from ase.io.trajectory import PickleTrajectory
> import time
>
>
>
> initial = io.read('init.traj')
> final = io.read('final.traj')
>
> numimages=3
> print size
> print rank
> assert numimages == size
>
>
> images = [initial]
> calc=['z']*numimages
> for i in range(numimages):
> print calc[i]
> calc[i]=Siesta(label='IMAGE_%d'%i,\
> xc='PBE',\
> meshcutoff=200 * 13.6,\
> basis='dzp',\
> kpts=[1,1,4])
> calc[i].set_fdf('Diag.ParallelOverK',True)
> for i in range(numimages):
> image = initial.copy()
> if i == rank:
> image.set_calculator(calc[i])
>
> images.append(image)
> images.append(final)
> time.sleep(rank*1) #needed to avoid some copy errors of the pseudo
> potential files
> neb = NEB(images, parallel=True)
> neb.interpolate()
> qn = MDMin(neb)
>
> time.sleep(rank*1) #needed to avoid some copy errors of the pseudo
> potential files
> traj = PickleTrajectory('neb%d.traj' % rank, 'w', images[1 + rank],
> master=True)
> qn.attach(traj)
> qn.run(fmax=0.05)
>>>
>>> myatoms = Atoms(..., ideal positions)
>>>
>>> calc = MyCalculator(arg1, atoms=myatoms, kwargs)
>>> # I greatly prefer this to myatoms.set_calculator(calc)
>>> atoms.get_potential_energy()
>>
>> I like that way of attaching the calculator to the atoms. I'll put that
>> idea in the proposal.
> >
> >> 1. The first time you run this, a calculation get run.
>
> As a personal preference :-), I do not like that heavy calculations
> get run when one creates an object (even though some GPAW
> functionality behaves this way), but that user has to explicitly
> request calculation by calling a function.
>
> Also, I think that the above approach brings up the question whether
> one attaches atoms to a calculator, and asks calculator to determine
> physical quantities for this atomic configuration, or attaches
> calculator to atoms and asks physical quantities from atoms object,
> i.e. which comes first, atoms or calculator? There is already some
> controversy as some quantities are requested from atoms (energy,
> forces), and some from the calculator (wavefunctions, densities).
> Personally, I do not have strong feelings over this matter, asking
> atoms is maybe a little bit more physics oriented (calculator is just
> black box providing numbers), on the other hand asking calculator
> would unify things in the sense that everything is requested from
> calculator (quantities available from MD calculator are of course
> quite different than the ones availabe from DFT calculator).
>
> One question that should maybe also discussed is if there should
> standard way to specify the command/binary to be executed when
> calculator is run. Some calculators (e.g. Siesta) request a python
> script containing the actual command to be executed, while other
> calculators (e.g. Castep) ask for a shell command. I prefer the shell
> command, as it is easier to specify e.g. number of CPUs within a batch
> job script (at least for casual user who is used to do something like
> 'mpirun -np 8 siesta'). People wanting to script everything may prefer
> the first option...
>
> Best regards,
> Jussi
More information about the ase-users
mailing list