[ase-users] ase-users Digest, Vol 107, Issue 6

fabian Fabian.T89 at web.de
Thu May 4 13:38:22 CEST 2017


Hello


I obviously did not read the message well .....i wrote *"**contraints"* 
instead of*"constraints".*

*Now it works:*

from  ase.ioimport  read,  write
from  ase.atomsimport  Atoms
from  ase.constraintsimport  FixAtoms


atoms=  read('CONTCAR')

write('POSCAR_slab_molecule',  atoms,  vasp5=True,  sort=True,  direct=True,long_format=True,  format='vasp')
# Specify the Atoms in the slab!
slab_elms=  ['Cu',  'O']  # assuming the adsorbate has no Cu and O

slab_i=  [a.indexfor  ain  atomsif  a.symbolin  slab_elms]
ads_i=  [a.indexfor  ain  atomsif  a.symbolnot  in  slab_elms]

# Use Atoms
slab=  Atoms([afor  ain  atomsif  a.indexin  slab_i])
ads=  Atoms([afor  ain  atomsif  a.indexin  ads_i])
cell=  atoms.get_cell()
slab.set_cell(cell)
ads.set_cell(cell)

# read constraints
fixed_atoms_i=  atoms.constraints[0].index
fix_mask=  {'ads':  [],  'slab':  []}
for  ain  atoms:
      is_fixed=  a.indexin  fixed_atoms_i
      key=  'ads'  if  a.indexin  ads_ielse  'slab'
      fix_mask[key].append(is_fixed)
fix_ads=  FixAtoms(mask=fix_mask['ads'])
fix_slab=  FixAtoms(mask=fix_mask['slab'])
ads.set_constraint(fix_ads)
slab.set_constraint(fix_slab)


# write

write('POSCAR_slab',  slab,  vasp5=True,  sort=True,  direct=True,long_format=True,  format='vasp')
write('POSCAR_molecule',  ads,  vasp5=True,  sort=True,  direct=True,long_format=True,  format='vasp')


Thank you very much for your help!


All the best


Fabian


Am 04.05.2017 um 10:10 schrieb ase-users-request at listserv.fysik.dtu.dk:
> Send ase-users mailing list submissions to
> 	ase-users at listserv.fysik.dtu.dk
>
> To subscribe or unsubscribe via the World Wide Web, visit
> 	https://listserv.fysik.dtu.dk/mailman/listinfo/ase-users
> or, via email, send a message with subject or body 'help' to
> 	ase-users-request at listserv.fysik.dtu.dk
>
> You can reach the person managing the list at
> 	ase-users-owner at listserv.fysik.dtu.dk
>
> When replying, please edit your Subject line so it is more specific
> than "Re: Contents of ase-users digest..."
>
>
> Today's Topics:
>
>     1. Re: Split POSCAR/CONTCAR files (fabian)
>
>
> ----------------------------------------------------------------------
>
> Message: 1
> Date: Thu, 4 May 2017 09:25:40 +0200
> From: fabian <Fabian.T89 at web.de>
> To: Oscar Xavier Guerrero <oscarxavier.ox at gmail.com>,	ase-users
> 	<ase-users at listserv.fysik.dtu.dk>
> Subject: Re: [ase-users] Split POSCAR/CONTCAR files
> Message-ID: <56142656-aef0-2d18-1a3d-243fc8589683 at web.de>
> Content-Type: text/plain; charset="utf-8"; Format="flowed"
>
> Dear Oscar,
>
> Thank you for your reply! It is really appreciated.
> I included your solution into my code:
>
> from  ase.ioimport  read,  write
> from  ase.atomsimport  Atoms
> from  ase.constraintsimport  FixAtoms
>
>
> atoms=  read('CONTCAR')
>
> write('POSCAR_slab_molecule',  atoms,  vasp5=True,  sort=True,  direct=True,long_format=True,  format='vasp')
> # Specify the Atoms in the slab!
> slab_elms=  ['Cu',  'O']  # assuming the adsorbate has no Cu and O
>
> slab_i=  [a.indexfor  ain  atomsif  a.symbolin  slab_elms]
> ads_i=  [a.indexfor  ain  atomsif  a.symbolnot  in  slab_elms]
>
> # Use Atoms
> slab=  Atoms([afor  ain  atomsif  a.indexin  slab_i])
> ads=  Atoms([afor  ain  atomsif  a.indexin  ads_i])
> cell=  atoms.get_cell()
> slab.set_cell(cell)
> ads.set_cell(cell)
>
> # read constraints
> fixed_atoms_i=  atoms.contraints[0].index
> fix_mask=  {'ads':  [],  'slab':  []}
> for  ain  atoms:
>       is_fixed=  a.indexin  fixed_atoms_i
>       key=  'ads'  if  a.indexin  ads_ielse  'slab'
>       fix_mask[key].append(is_fixed)
> fix_ads=  FixAtoms(mask=fix_mask['ads'])
> fix_slab=  FixAtoms(mask=fix_mask['slab'])
> ads.set_constraint(fix_ads)
> slab.set_constraint(fix_slab)
>
>
> # write
>
> write('POSCAR_slab',  slab,  vasp5=True,  sort=True,  direct=True,long_format=True,  format='vasp')
> write('POSCAR_molecule',  ads,  vasp5=True,  sort=True,  direct=True,long_format=True,  format='vasp')
>
> But i still get an error:
>
> *T**raceback (most recent call last):**
> **  File "SPLIT_CONTCAR_V6.py", line 23, in <module>**
> **    fixed_atoms_i = atoms.contraints[0].index**
> **AttributeError: 'Atoms' object has no attribute 'contraints'*
>
> I am running and older Version of ASE ( 3.9.1.4567) . Might this be a
> problem? The package is installed on a windows machine and i am a little
> reluctant to ask the admin to
> update it, as i was told it is complicated to install it under Win7.  Is
> there a Tutorial available how to uninstall ASE and reinstall the newest
> Version available under Windows?
>
> Thank you very much for you support!
>
> all the best
>
> Fabian
>
>
> Am 03.05.2017 um 16:16 schrieb Oscar Xavier Guerrero:
>> Forgot to include the ase-users to the recipients.
>>
>> 2017-05-03 9:11 GMT-05:00 Oscar Xavier Guerrero
>> <oscarxavier.ox at gmail.com <mailto:oscarxavier.ox at gmail.com>>:
>>
>>      Hello,
>>
>>      For the formatting of the code, it depends on your e-mail client.
>>      Gmail has the formatting tools to do it, it can also keep the
>>      format if you paste it from somewhere else like a python code
>>      editor that formats the text automatically.
>>
>>      It crashes because you're setting a constraint for atoms that
>>      don't exist, I'm sure you're getting an IndexError. One way of
>>      fixing it is by remapping the constraints with something like I
>>      write down here. Also, constraints is a list of FixAtoms objects
>>      so you have to ask for the first one to get the correct indices:
>>
>>      fixed_atoms_i = atoms.contraints[0].index
>>      fix_mask = {'ads': [], 'slab': []}
>>      for a in atoms:
>>          is_fixed = a.index in fixed_atoms_i
>>          key = 'ads' if a.index in ads_i else 'slab'
>>      fix_mask[key].append(is_fixed)
>>      fix_ads = FixAtoms(mask=fix_mask['ads'])
>>      fix_slab = FixAtoms(mask=fix_mask['slab'])
>>      ads.set_constraint(fix_ads)
>>      slab.set_constraint(fix_slab)
>>
>>      Whenever the program crashes take a look at the error ir raises,
>>      it will most of the times point you to the cause. The  error will
>>      also help other people understand what went wrong.
>>
>>
>>
>>
>>
>>
>>
>>      2017-05-03 3:25 GMT-05:00 fabian <Fabian.T89 at web.de
>>      <mailto:Fabian.T89 at web.de>>:
>>
>>          Dear Oscar ,
>>
>>
>>          I am sorry to bug you again with this, but in my environment i
>>          am the only one using ASE so far. I could get my code to write
>>          tags to the POSCAR files, but they are all T T T wich is
>>          obviously wrong.
>>
>>
>>          from ase.io import read, write from ase.atoms import Atoms
>>          from ase.constraints import FixAtoms atoms = read('CONTCAR')
>>
>>          write('POSCAR_slab_molecule',  atoms,  vasp5=True,  sort=True,  direct=True,long_format=True,  format='vasp')# assuming the adsorbate has no Cu and O
>>          slab_elms=  ['Cu',  'O']  # Specify the Atoms in the slab!
>>
>>
>>          # read constraints
>>          #constraint_slab = [atoms.constraints.index for a in atoms if
>>          a.symbol in slab_elms]
>>          #constraint_ads = [atoms.constraints.index for a in atoms if
>>          a.symbol not in slab_elms]
>>
>>          constraint_slab=  atoms.constraints.index
>>          constraint_ads=  atoms.constraints.index
>>
>>
>>          slab_i=  [a.indexfor  ain  atomsif  a.symbolin  slab_elms]ads_i = [a.index for a in atoms if a.symbol not in slab_elms]
>>          # Use Atoms slab = Atoms([a for a in atoms if a.index in
>>          slab_i]) ads = Atoms([a for a in atoms if a.index in ads_i])
>>          cell = atoms.get_cell() slab.set_cell(cell) ads.set_cell(cell)
>>          #Slab
>>          slab.set_constraint(constraint_slab)
>>          ads.set_constraint(constraint_ads)
>>
>>
>>
>>          write('POSCAR_slab',  slab,  vasp5=True,  sort=True,  direct=True,long_format=True,  format='vasp')write('POSCAR_molecule', ads, vasp5=True, sort=True,
>>          direct=True,long_format=True, format='vasp'
>>
>>          I guess i am using the atoms.constraints  command wrong? The line
>>
>>          write('POSCAR_slab_molecule',  atoms,  vasp5=True,  sort=True,  direct=True,long_format=True,  format='vasp')
>>
>>          does result in a File with the constraints correctly written,
>>          though.
>>
>>          All the best
>>
>>          Fabian
>>
>>          Am 02.05.2017 um 16:47 schrieb Oscar Xavier Guerrero:
>>>          Hello,
>>>          The constraints are read from the CONTCAR, they are stored in
>>>          atoms.constraints and you can access the indices of the fixed
>>>          atoms with atoms.constraints.index, you can then use that
>>>          information to add that constraint to the new atoms object
>>>          you created with slab.set_contraint().
>>>          The tags are not stored in the Vasp file format, so if you
>>>          want to use them you would have to assign them yourself. If
>>>          you want to set tags to the atoms you can use the
>>>          atoms.set_tags() function. I'm assuming you want to filter
>>>          the atoms by layer in the slab, here's a function I wrote
>>>          that assigns tags to fix some layers in a slab.
>>>          def fix_layers(atoms, fix, n_layers):
>>>          '''
>>>            fix: number of layers to fix
>>>            n_layers: total number of layers in slab
>>>              ''' from ase.constraints import FixAtoms     factor =
>>>          float(fix) / n_layers     max_z = max([a.z for a in atoms])
>>>            th = max_z * factor     constraint = FixAtoms(mask=[a.z <=
>>>          th for a in atoms])     atoms.set_constraint(constraint)
>>>          return atoms
>>>          I would strongly recommend you store files and directories in
>>>          separate directories, having a dedicated directory to store
>>>          files. To create a new directory you can use:
>>>          import os
>>>          directory = 'path/to/New_Folder'
>>>          if not os.path.exists(directory)
>>>              os.makedirs(directory)
>>>          2017-05-02 5:21 GMT-05:00 fabian <Fabian.T89 at web.de
>>>          <mailto:Fabian.T89 at web.de>>:
>>>
>>>              Dear Oscar,
>>>
>>>              I have an additional requtest.
>>>
>>>              Is it possible to read the constraints from the CONTCAR
>>>              file and write them to the split files for the slab and
>>>              the adsorbate?
>>>
>>>              At the moment i am using this code based on your supplied
>>>              solution, but there are no selective dynamics constraints
>>>              written to the new Files. Ideally i would like to write
>>>              them directly just as they are written in the CONTCAR
>>>              file without the need to rewrite them.
>>>
>>>              /*from ase.io <http://ase.io> import read,
>>>              write*//**//*from ase.atoms import Atoms*//**//*from
>>>              ase.constraints import FixAtoms*//**//*atoms =
>>>              read('CONTCAR')*//**//*# assuming the adsorbate has no Cu
>>>              and O*//**//**//*slab_elms = ['Cu', 'O']*//**//*slab_i =
>>>              [a.index for a in atoms if a.symbol in
>>>              slab_elms]*//**//**//*ads_i = [a.index for a in atoms if
>>>              a.symbol not in slab_elms]*//**//**//*# Use
>>>              Atoms*//**//*slab = Atoms([a for a in atoms if a.index in
>>>              slab_i])*//**//*ads = Atoms([a for a in atoms if a.index
>>>              in ads_i])*//**//*cell =
>>>              atoms.get_cell()*//**//*slab.set_cell(cell)*//**//*ads.set_cell(cell)*//**//*#Slab*//**//*c
>>>              = FixAtoms(indices=[atom.index for atom in slab if
>>>              atom.tag > 2])*//**//*slab.set_constraint(c)*//**//*print
>>>              slab.get_cell()*//**//*ns = [x.index for x in
>>>              sorted(slab, key=lambda x: [ 'Cu',
>>>              'O'].index(x.symbol))]*//**//*slab =
>>>              slab[ns]*//**//*print
>>>              slab.get_cell()*//**//*#Ads*//**//*#print
>>>              ads.get_cell()*//**//*#na = [y.index for y in sorted(ads,
>>>              key=lambda y: [ 'C', 'H'].index(y.symbol))]*//**//*#ads =
>>>              ads[na]*//**//*#print
>>>              ads.get_cell()*//**//**//**//*write('POSCAR', slab,
>>>              vasp5=True, sort=True, direct=False,long_format=True,
>>>              format='vasp')*//**//*write('POSCAR_2', ads, vasp5=True,
>>>              sort=True, direct=False, format='vasp')*//**/
>>>
>>>              Is this possible?In the code above the  line /*if
>>>              atom.tag > 2 */the seems to be ignored? Is it possible to
>>>              write each new POSCAR file into a new Folder which is
>>>              also created by the script directly?
>>>
>>>              Thanks in advance
>>>
>>>              Fabian
>>>
>>>              Am 19.04.2017 um 18:11 schrieb Oscar Xavier Guerrero:
>>>>              No, you would have to use in:
>>>>              slab_elms = ['Cu', 'O']
>>>>              slab_i = [a.index for a in atoms if a.symbol *in slab_elms*]
>>>>              This is correct only if you have no O in your adsorbate.
>>>>              Otherwise, it would be better to use height to separate.
>>>>              2017-04-19 2:56 GMT-05:00 fabian <Fabian.T89 at web.de
>>>>              <mailto:Fabian.T89 at web.de>>:
>>>>
>>>>                  Dear Oscar, Thank you very much for your fast reply!
>>>>                  This is exactly what i want to do! If my slab
>>>>                  consist of different species , for example Cu and O
>>>>                  atoms, is it correct to change this lineslab_i =
>>>>                  [a.index for a in atoms if a.symbol == 'Cu'] to
>>>>                  slab_i = [a.index for a in atoms if a.symbol ==
>>>>                  'Cu','O'] ? All the bestfabian
>>>>                  Am 18.04.2017 um 23:25 schrieb Oscar Xavier Guerrero:
>>>>>                  Sorry, in the previous example I forgot to convert
>>>>>                  from list to an atoms object.
>>>>>                  This should work:
>>>>>                  from ase.io <http://ase.io> import read, write
>>>>>                  from ase.atoms import Atoms
>>>>>                  atoms = read('CONTCAR')
>>>>>                  # assuming the slab is only composed of Cu and the
>>>>>                  adsorbate has no Cu
>>>>>                  slab_i = [a.index for a in atoms if a.symbol == 'Cu']
>>>>>                  ads_i = [a.index for a in atoms if a.symbol != 'Cu']
>>>>>                  # you could also use height as the threshold
>>>>>                  th = max(a.z for a in atoms if a.symbol == 'Cu')
>>>>>                  # you can also use constraints to set the th
>>>>>                  slb = {atoms[i].symbol for i in
>>>>>                  atoms.constraints[0].index}
>>>>>                  th = max(a.z for a in atoms if a.symbol in alb)
>>>>>                  slab_i = [a.index for a in atoms if a.z <= th]
>>>>>                  ads_i = [a.index for a in atoms if a.z > th]
>>>>>                  # this is a quick fix, maybe there's a better method
>>>>>                  slab = atoms.copy()
>>>>>                  for i in sorted(ads_i, reverse=True):
>>>>>                      del slab[i]
>>>>>                  ads = atoms.copy()
>>>>>                  for i in sorted(slab_i, reverse=True):
>>>>>                      del ads[i]
>>>>>                  # or you could use Atoms
>>>>>                  slab = Atoms([a for a in atoms if a.index in slab_i])
>>>>>                  ads = Atoms([a for a in atoms if a.index in ads_i])
>>>>>                  cell = atoms.get_cell()
>>>>>                  slab.set_cell(cell)
>>>>>                  ads.set_cell(cell)
>>>>>                  constraint = atoms.constraints[0]
>>>>>                  slab.set_constraints(constraint)
>>>>>                  ads.set_constraints(constraint)
>>>>>                  write('slab.vasp', slab, vasp5=True, sort=True,
>>>>>                  direct=True, format='vasp')
>>>>>                  write('ads.vasp', ads, vasp5=True, sort=True,
>>>>>                  direct=True, format='vasp')
>>>>>                  If you have any questions I'm happy to help.
>>>>>                  2017-04-18 15:53 GMT-05:00 Oscar Xavier Guerrero
>>>>>                  <oscarxavier.ox at gmail.com
>>>>>                  <mailto:oscarxavier.ox at gmail.com>>:
>>>>>
>>>>>                      Hello Fabian, You can read POSCAR/CONTCAR files
>>>>>                      with ase.io.read, you get an atoms object with
>>>>>                      all the information the file had. Then you can
>>>>>                      copy parts of that atoms object into other
>>>>>                      atoms object. Then use the ase.io.write
>>>>>                      function to write POSCAR files for each of the
>>>>>                      new atoms objects. Since you have a slab and an
>>>>>                      adsorbate, you can use the height as a
>>>>>                      threshold. It really depends on your systems.
>>>>>                      Here's an example:
>>>>>                      from ase.io <http://ase.io> import read, write
>>>>>                      atoms = read('CONTCAR')
>>>>>                      # assuming the slab is only composed of Cu and
>>>>>                      the adsorbate has no Cu
>>>>>                      slab = [a for a in atoms if a.symbol == 'Cu']
>>>>>                      ads = [a for a in atoms if a.symbol != 'Cu']
>>>>>                      # you could also use height as the threshold
>>>>>                      th = max(a.z for a in atoms if a.symbol == 'Cu')
>>>>>                      # you can also use constraints to set the th
>>>>>                      slb = {atoms[i].symbol for i in
>>>>>                      atoms.constraints[0].index}
>>>>>                      th = max(a.z for a in atoms if a.symbol in alb)
>>>>>                      slab = [a for a in atoms if a.z <= th]
>>>>>                      ads = [a for a in atoms if a.z > th]
>>>>>                      write('slab.vasp', slab, vasp5=True, sort=True,
>>>>>                      direct=True, format='vasp')
>>>>>                      write('ads.vasp', ads, vasp5=True, sort=True,
>>>>>                      direct=True, format='vasp')
>>>>>                      If you have any questions I'm happy to help.
>>>>>                      P.S. heres my github with some of my scripts.
>>>>>                      https://github.com/izxle/VaspTools
>>>>>                      <https://github.com/izxle/VaspTools>
>>>>>                      2017-04-18 2:52 GMT-05:00 fabian via ase-users
>>>>>                      <ase-users at listserv.fysik.dtu.dk
>>>>>                      <mailto:ase-users at listserv.fysik.dtu.dk>>:
>>>>>
>>>>>                          Dear all,
>>>>>
>>>>>                          I want to perform a series of charge density difference calculations. Therefore i want to split the geometry optimised CONTCAR file
>>>>>                          containing the coordinates from the slab and the Molecule into tow files containing only slab or Molecule coordinates. At the moment i am doing this
>>>>>                          manually. Can someone give me a hint how to read positions and constraints as well as atom types from the POSCAR/CONTCAR files and later write them into two new POSCAR Files?
>>>>>                          I would like to be able to either fix all atomic coordinates or leave the as they are.
>>>>>                          Atom types could also be extracted from OUTCAR or POTCAR files. For now it is sufficient to perform the split based on the ATOM tag.
>>>>>                          Unfortunately i am completely stuck.
>>>>>
>>>>>                          All the best
>>>>>
>>>>>                          fabian
>>>>>
>>>>>                          _______________________________________________
>>>>>                          ase-users mailing list
>>>>>                          ase-users at listserv.fysik.dtu.dk
>>>>>                          <mailto:ase-users at listserv.fysik.dtu.dk>
>>>>>                          https://listserv.fysik.dtu.dk/mailman/listinfo/ase-users
>>>>>                          <https://listserv.fysik.dtu.dk/mailman/listinfo/ase-users>
>>>>>
>>>>>
> -------------- next part --------------
> An HTML attachment was scrubbed...
> URL: <http://listserv.fysik.dtu.dk/pipermail/ase-users/attachments/20170504/2c52be02/attachment.html>
>
> ------------------------------
>
> _______________________________________________
> ase-users mailing list
> ase-users at listserv.fysik.dtu.dk
> https://listserv.fysik.dtu.dk/mailman/listinfo/ase-users
>
> End of ase-users Digest, Vol 107, Issue 6
> *****************************************

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listserv.fysik.dtu.dk/pipermail/ase-users/attachments/20170504/48afd67a/attachment-0001.html>


More information about the ase-users mailing list