====== Jacapoチュートリアル ======
===== パラメータの設定 =====
==== 最も簡単な例 ====
from ase import Atom, Atoms
from ase.calculators.jacapo import Jacapo
atom1 = Atom('C')
atom2 = Atom('O', (1.1, 0, 0))
box1 = Atoms([atom1, atom2], cell = (5, 3, 3), pbc = True)
calc1 = Jacapo(nbands = 6, atoms = box1)
calc1.calculate()
==== 様々な計算パラメータの設定法 ====
from ase import Atom
atom1 = Atom('C', (2, 2, 2))
atom2 = Atom()
atom2.number = 8
(x, y, z) = atom1.position
atom2.position = (x + 1.1, y, z)
from ase import Atoms
box1 = Atoms()
box1.set_cell((5, 3, 3))
box1.set_pbc(True)
box1.append(atom1)
box1.append(atom2)
from ase.calculators.jacapo import Jacapo
ncfile1 = 'sample.nc'
params1 = dict(nbands = 8)
params1.update(stay_alive = False)
params1.update(pw = 200)
params1.update(dw = 400)
params1.update(kpts = (2, 2, 2))
params1.update(ft = 0.01)
params1.update(symmetry = True)
params1.update(atoms = box1)
calc1 = Jacapo(ncfile1, **params1)
calc1.calculate()
print calc1.get_potential_energy()
===== ncファイルの利用法 =====
==== 使用するncファイルの作成 ====
a = 2.0
d = 1.1
from ase import Atom
atom1 = Atom('C', (a, a, a))
atom2 = Atom('O', (a + d, a, a))
from ase import Atoms
box1 = Atoms(cell = (2*a, 2*a, 2*a), pbc = True)
box1.append(atom1)
box1.append(atom2)
from ase.calculators.jacapo import Jacapo
ncfile1 = 'sample.nc'
params1 = dict(nbands = 8)
params1.update(ft = 0.01)
params1.update(symmetry = True)
params1.update(atoms = box1)
calc1 = Jacapo(ncfile1, **params1)
calc1.calculate()
==== 計算済みncファイルの再利用 ====
from ase.calculators.jacapo import read
model1, solver1 = read('sample.nc')
print 'E = ', model1.get_potential_energy(), '[eV]'
print model1.get_forces()
eng = solver1.get_eigenvalues()
occ = solver1.get_occupation_numbers()
for i in range(len(eng)):
print 'n(%6.2f) = %3.1f'%(eng[i], occ[i])
===== 構造最適化 =====
==== 半手動でCO間距離を変化させる ====
from ase import Atom, Atoms
from ase.calculators.jacapo import Jacapo
for d in [1.05, 1.10, 1.15, 1.20, 1.25]:
atom1 = Atom('C', (0, 0, 0))
atom2 = Atom('O', (d, 0, 0))
molecule1 = Atoms([atom1, atom2], cell = (6, 6, 6), pbc = True)
ncfile1 = 'sample_%1.2f.nc' % d
solver1 = Jacapo(ncfile1, nbands = 8, ft = 0.01, atoms = molecule1)
print 'd = %1.2f ang' % d
print 'energy = %f eV' % molecule1.get_potential_energy()
print 'forces = (eV/ang)\n', molecule1.get_forces()
print '-----'
solver1.strip()
==== グラフ用ファイルの作成 ====
from ase.calculators.jacapo import Jacapo
bondlenths = [1.05, 1.10, 1.15, 1.20, 1.25]
ncfiles = ['sample_%1.2f.nc' % d for d in bondlenths]
solvers = [Jacapo(f) for f in ncfiles]
energies = [s.get_potential_energy() for s in solvers]
print "bondlenth energy"
emin = min(energies)
for i in range(len(bondlenths)):
print bondlenths[i], energies[i] - emin
==== 全自動で構造最適化(QuasiNewton版) ====
from ase import Atom, Atoms
from ase.calculators.jacapo import Jacapo
from ase.optimize import QuasiNewton
d = 1.1
atom1 = Atom('C', (0, 0, 0))
atom2 = Atom('O', (d, 0, 0))
molecule1 = Atoms([atom1, atom2], cell = (6, 6, 6), pbc = True)
solver1 = Jacapo('sample.nc', nbands = 8, ft = 0.01, atoms = molecule1)
dynamics1 = QuasiNewton(molecule1, trajectory = 'sample.traj')
dynamics1.run(fmax = 0.05)
==== 全自動で構造最適化(BFGS版) ====
from ase import Atom, Atoms
from ase.calculators.jacapo import Jacapo
from ase.optimize import BFGS
d = 1.15
atom1 = Atom('C', (0, 0, 0))
atom2 = Atom('O', (d, 0, 0))
molecule1 = Atoms([atom1, atom2], cell = (6, 6, 6), pbc = True)
solver1 = Jacapo('sample.nc', nbands = 8, ft = 0.01, atoms = molecule1)
dynamics1 = BFGS(molecule1, trajectory = 'sample.traj')
dynamics1.run(fmax = 0.04)
print molecule1.get_positions()
print molecule1.get_forces()
==== 拘束条件付き構造最適化 ====
from ase import Atom, Atoms
from ase.calculators.jacapo import Jacapo
from ase.constraints import FixAtoms
from ase.optimize import QuasiNewton
d = 1.20
atom1 = Atom('C', (0, 0, 0), tag = 1)
atom2 = Atom('O', (d, 0, 0))
molecule1 = Atoms([atom1, atom2], cell = (6, 6, 6), pbc = True)
fixatom1 = [atomx.tag == 1 for atomx in molecule1]
molecule1.set_constraint(FixAtoms(mask = fixatom1))
solver1 = Jacapo('sample.nc', nbands = 8, stay_alive = True, ft = 0.01, atoms = molecule1)
dynamics1 = QuasiNewton(molecule1, trajectory = 'sample.traj')
dynamics1.run(fmax = 0.04)
print molecule1.get_positions()
print molecule1.get_forces()
==== 拘束条件の設定法 ====
from ase import Atom, Atoms
from ase.calculators.jacapo import Jacapo
from ase.constraints import FixAtoms
from ase.optimize import BFGS
d = 1.20
atom1 = Atom('C', (0, 0, 0), tag = 1)
atom2 = Atom('O', (d, 0, 0))
molecule1 = Atoms([atom1, atom2], cell = (6, 6, 6), pbc = True)
#fix1 = FixAtoms(mask = [atomx.symbol == 'C' for atomx in molecule1])
#fix1 = FixAtoms(indices = [atomx.index for atomx in molecule1 if atomx.symbol == 'C'])
#fix1 = FixAtoms(indices = [atomx.index for atomx in molecule1 if atomx.tag == 1])
fix1 = FixAtoms(mask = [atomx.tag == 1 for atomx in molecule1])
molecule1.set_constraint(fix1)
solver1 = Jacapo('sample.nc', nbands = 8, ft = 0.01, atoms = molecule1)
dynamics1 = BFGS(molecule1, trajectory = 'sample.traj')
dynamics1.run(fmax = 0.04)
print molecule1.get_positions()
print molecule1.get_forces()
==== trajファイルをxyzファイに変換 ====
$ traj2xyz sample.traj sample.xyz
xyzファイルはiMol/jmolで可視化(アニメーション化)できる。
===== 磁気モーメント(スピン分極)のあるときの計算 =====
==== 強磁性鉄の計算 ====
from ase import Atom, Atoms
from ase.calculators.jacapo import Jacapo
a = 2.87
atom1 = Atom('Fe', (0.0, 0.0, 0.0), magmom = 1.0)
atom2 = Atom('Fe', (0.5, 0.5, 0.5), magmom = 1.0)
crystal1 = Atoms([atom1, atom2], pbc = True)
crystal1.set_cell((a, a, a), scale_atoms = True)
para1 = dict(spinpol = True)
para1.update(kpts=(8, 8, 8))
para1.update(pw = 300)
para1.update(dw = 500)
para1.update(symmetry = True)
para1.update(atoms = crystal1)
solver1 = Jacapo('ferro.nc', nbands = 16, **para1)
print solver1.get_potential_energy()
==== 非磁性鉄の計算 ====
from ase import Atom, Atoms
from ase.calculators.jacapo import Jacapo
a = 2.87
atom1 = Atom('Fe', (0.0, 0.0, 0.0), magmom = 0.0)
atom2 = Atom('Fe', (0.5, 0.5, 0.5), magmom = 0.0)
crystal1 = Atoms([atom1, atom2], pbc = True)
crystal1.set_cell((a, a, a), scale_atoms = True)
para1 = dict(spinpol = False)
para1.update(kpts=(8, 8, 8))
para1.update(pw = 300)
para1.update(dw = 500)
para1.update(symmetry = True)
para1.update(atoms = crystal1)
solver1 = Jacapo('nonmag.nc', nbands = 16, **para1)
print solver1.get_potential_energy()
==== 反強磁性鉄の計算 ====
from ase import Atom, Atoms
from ase.calculators.jacapo import Jacapo
a = 2.87
atom1 = Atom('Fe', (0.0, 0.0, 0.0), magmom = 1.0)
atom2 = Atom('Fe', (0.5, 0.5, 0.5), magmom = -1.0)
crystal1 = Atoms([atom1, atom2], pbc = True)
crystal1.set_cell((a, a, a), scale_atoms = True)
para1 = dict(spinpol = True)
para1.update(kpts=(8, 8, 8))
para1.update(pw = 300)
para1.update(dw = 500)
para1.update(symmetry = True)
para1.update(atoms = crystal1)
solver1 = Jacapo('antiferro.nc', nbands = 16, **para1)
print solver1.get_potential_energy()