MICCoM School 2022 Ex#3 : More systems (input generation with ASE)¶
You can try different systems, here are some examples:
Benzene molecule
H\(_2\)O
SiC solid
We will use the ASE (Atomic Simulation Environment) Python package to build the input files.
3.1 : Benzene molecule¶
[1]:
# download the pseudopotential files
!wget -N -q http://www.quantum-simulation.org/potentials/sg15_oncv/upf/C_ONCV_PBE-1.2.upf
!wget -N -q http://www.quantum-simulation.org/potentials/sg15_oncv/upf/H_ONCV_PBE-1.2.upf
[2]:
# build the input for DFT
from ase import Atom, Atoms
from ase.cell import Cell
from ase.io import write
cell = Cell([[10,0,0],[0,10,0],[0,0,10]]) # Angstroms
positions = []
positions.append(Atom('C',[1.2115,0.6995,0.0000])) # Angstroms
positions.append(Atom('C',[1.2115,-0.6995,0.0000]))
positions.append(Atom('C',[0.0000,1.3990,0.0000]))
positions.append(Atom('C',[0.0000,-1.3990,0.0000]))
positions.append(Atom('C',[-1.2115,-0.6995,0.0000]))
positions.append(Atom('C',[-1.2115,0.6995,0.0000]))
positions.append(Atom('H',[0.0000,2.5000,0.0000]))
positions.append(Atom('H',[2.1651,1.2500,0.0000]))
positions.append(Atom('H',[2.1651,-1.2500,0.0000]))
positions.append(Atom('H',[0.0000,-2.5000,0.0000]))
positions.append(Atom('H',[-2.1651,-1.2500,0.0000]))
positions.append(Atom('H',[-2.1651,1.2500,0.0000]))
atoms = Atoms(positions,cell=cell)
pseudopotentials = {}
pseudopotentials['C'] = 'C_ONCV_PBE-1.2.upf'
pseudopotentials['H'] = 'H_ONCV_PBE-1.2.upf'
inp_data = {}
inp_data['calculation'] = 'scf'
inp_data['restart_mode'] = 'from_scratch'
inp_data['prefix'] = 'benzene'
inp_data['outdir'] = './'
inp_data['pseudo_dir'] = './'
inp_data['verbosity'] = 'high'
inp_data['wf_collect'] = True
inp_data['ecutwfc'] = 50
inp_data['nbnd'] = 30
inp_data['assume_isolated'] = 'mp'
inp_data['diago_full_acc'] = True
write('benzene.pwi',atoms,pseudopotentials=pseudopotentials,input_data=inp_data)
[3]:
!cat benzene.pwi
&CONTROL
calculation = 'scf'
verbosity = 'high'
restart_mode = 'from_scratch'
wf_collect = .true.
outdir = './'
prefix = 'benzene'
pseudo_dir = './'
/
&SYSTEM
nbnd = 30
ecutwfc = 50
assume_isolated = 'mp'
ntyp = 2
nat = 12
ibrav = 0
/
&ELECTRONS
diago_full_acc = .true.
/
&IONS
/
&CELL
/
ATOMIC_SPECIES
C 12.011 C_ONCV_PBE-1.2.upf
H 1.008 H_ONCV_PBE-1.2.upf
K_POINTS gamma
CELL_PARAMETERS angstrom
10.00000000000000 0.00000000000000 0.00000000000000
0.00000000000000 10.00000000000000 0.00000000000000
0.00000000000000 0.00000000000000 10.00000000000000
ATOMIC_POSITIONS angstrom
C 1.2115000000 0.6995000000 0.0000000000
C 1.2115000000 -0.6995000000 0.0000000000
C 0.0000000000 1.3990000000 0.0000000000
C 0.0000000000 -1.3990000000 0.0000000000
C -1.2115000000 -0.6995000000 0.0000000000
C -1.2115000000 0.6995000000 0.0000000000
H 0.0000000000 2.5000000000 0.0000000000
H 2.1651000000 1.2500000000 0.0000000000
H 2.1651000000 -1.2500000000 0.0000000000
H 0.0000000000 -2.5000000000 0.0000000000
H -2.1651000000 -1.2500000000 0.0000000000
H -2.1651000000 1.2500000000 0.0000000000
[4]:
# build the input for MBPT
import yaml
west = {}
west['input_west'] = {}
west['input_west']['qe_prefix'] = 'benzene'
west['input_west']['west_prefix'] = 'benzene'
west['input_west']['outdir'] = './'
west['wstat_control'] = {}
west['wstat_control']['wstat_calculation'] = 'S'
west['wstat_control']['n_pdep_eigen'] = 50
west['wstat_control']['n_steps_write_restart'] = 0
west['wfreq_control'] = {}
west['wfreq_control']['wfreq_calculation'] = 'XWGQ'
west['wfreq_control']['n_pdep_eigen_to_use'] = 50
west['wfreq_control']['qp_bandrange'] = [13,18]
west['wfreq_control']['o_restart_time'] = -1.0
with open('west.in', 'w') as file :
yaml.dump(west, file, sort_keys=False)
[5]:
!cat west.in
input_west:
qe_prefix: benzene
west_prefix: benzene
outdir: ./
wstat_control:
wstat_calculation: S
n_pdep_eigen: 50
n_steps_write_restart: 0
wfreq_control:
wfreq_calculation: XWGQ
n_pdep_eigen_to_use: 50
qp_bandrange:
- 13
- 18
o_restart_time: -1.0
Run pw.x
, wstat.x
, and wfreq.x
. These calculations should finish in 5 minutes.
[6]:
!mpirun -n 8 pw.x -i benzene.pwi > benzene.pwo
!mpirun -n 64 wstat.x -ni 8 -i west.in > wstat.out
!mpirun -n 64 wfreq.x -ni 8 -i west.in > wfreq.out
3.2 : H2O¶
[7]:
# download the pseudopotential files
!wget -N -q http://www.quantum-simulation.org/potentials/sg15_oncv/upf/O_ONCV_PBE-1.2.upf
!wget -N -q http://www.quantum-simulation.org/potentials/sg15_oncv/upf/H_ONCV_PBE-1.2.upf
!wget -N -q http://west-code.org/doc/training/water/H2O.cif
[8]:
# build the input for DFT, starting from a CIF file
from ase.io import read, write
atoms = read('H2O.cif')
pseudopotentials = {}
pseudopotentials['O'] = 'O_ONCV_PBE-1.2.upf'
pseudopotentials['H'] = 'H_ONCV_PBE-1.2.upf'
inp_data = {}
inp_data['calculation'] = 'scf'
inp_data['restart_mode'] = 'from_scratch'
inp_data['prefix'] = 'h2o'
inp_data['outdir'] = './'
inp_data['pseudo_dir'] = './'
inp_data['verbosity'] = 'high'
inp_data['wf_collect'] = True
inp_data['ecutwfc'] = 50
inp_data['nbnd'] = 80
inp_data['diago_full_acc'] = True
write('h2o.pwi',atoms,pseudopotentials=pseudopotentials,input_data=inp_data)
[9]:
!cat h2o.pwi
&CONTROL
calculation = 'scf'
verbosity = 'high'
restart_mode = 'from_scratch'
wf_collect = .true.
outdir = './'
prefix = 'h2o'
pseudo_dir = './'
/
&SYSTEM
nbnd = 80
ecutwfc = 50
ntyp = 2
nat = 36
ibrav = 0
/
&ELECTRONS
diago_full_acc = .true.
/
&IONS
/
&CELL
/
ATOMIC_SPECIES
H 1.008 H_ONCV_PBE-1.2.upf
O 15.999 O_ONCV_PBE-1.2.upf
K_POINTS gamma
CELL_PARAMETERS angstrom
7.60356630000000 0.00000000000000 0.00000000000000
-3.80178315000000 6.58488157515925 0.00000000000000
0.00000000000000 0.00000000000000 7.14296200000000
ATOMIC_POSITIONS angstrom
H 2.5154346141 0.0000000000 1.4030777397
H -1.2577173070 2.1784302773 1.4030777397
H 2.5440658430 4.4064512978 1.4030777397
H 5.0881316859 0.0000000000 4.9745587397
H -2.5440658430 4.4064512978 4.9745587397
H 1.2577173070 2.1784302773 4.9745587397
H 3.4394504051 0.0000000000 0.0760439735
H -1.7197252026 2.9786514259 0.0760439735
H 2.0820579474 3.6062301493 0.0760439735
H 4.1641158949 0.0000000000 3.6475249735
H -2.0820579474 3.6062301493 3.6475249735
H 1.7197252026 2.9786514259 3.6475249735
H 1.7103728160 5.7785299019 6.9918669248
H -2.0577569496 5.1768429328 6.9918669248
H 0.3473841335 2.2143903156 6.9918669248
H 5.5121559660 0.8063516733 6.9918669248
H 1.7440262004 1.4080386423 6.9918669248
H 4.1491672835 4.3704912595 6.9918669248
H 2.0914103340 0.8063516733 3.4203859248
H 5.8595400996 1.4080386423 3.4203859248
H 3.4543990165 4.3704912595 3.4203859248
H -1.7103728160 5.7785299019 3.4203859248
H 2.0577569496 5.1768429328 3.4203859248
H -0.3473841335 2.2143903156 3.4203859248
O 2.4836441034 0.0000000000 0.3975629790
O -1.2418220517 2.1508988875 0.3975629790
O 2.5599610983 4.4339826877 0.3975629790
O 5.1199221966 0.0000000000 3.9690439790
O -2.5599610983 4.4339826877 3.9690439790
O 1.2418220517 2.1508988875 3.9690439790
O 5.0229539156 0.0000000000 6.6399189011
O -2.5114769578 4.3500056930 6.6399189011
O 1.2903061922 2.2348758822 6.6399189011
O 2.5806123844 0.0000000000 3.0684379011
O -1.2903061922 2.2348758822 3.0684379011
O 2.5114769578 4.3500056930 3.0684379011
[10]:
# build the input for MBPT
import yaml
west = {}
west['input_west'] = {}
west['input_west']['qe_prefix'] = 'h2o'
west['input_west']['west_prefix'] = 'h2o'
west['input_west']['outdir'] = './'
west['wstat_control'] = {}
west['wstat_control']['wstat_calculation'] = 'S'
west['wstat_control']['n_pdep_eigen'] = 200
west['wstat_control']['n_steps_write_restart'] = 0
west['wfreq_control'] = {}
west['wfreq_control']['wfreq_calculation'] = 'XWGQ'
west['wfreq_control']['macropol_calculation'] = 'C'
# Note that for a solid we must set macropol_calculation to 'C', the default 'N' is good for molecules
west['wfreq_control']['n_pdep_eigen_to_use'] = 200
west['wfreq_control']['qp_bandrange'] = [20,30]
west['wfreq_control']['o_restart_time'] = -1.0
with open('west.in', 'w') as file :
yaml.dump(west, file, sort_keys=False)
[11]:
!cat west.in
input_west:
qe_prefix: h2o
west_prefix: h2o
outdir: ./
wstat_control:
wstat_calculation: S
n_pdep_eigen: 200
n_steps_write_restart: 0
wfreq_control:
wfreq_calculation: XWGQ
macropol_calculation: C
n_pdep_eigen_to_use: 200
qp_bandrange:
- 20
- 30
o_restart_time: -1.0
Run pw.x
, wstat.x
, and wfreq.x
. These calculations should finish in 10 minutes.
[12]:
!mpirun -n 8 pw.x -i h2o.pwi > h2o.pwo
!mpirun -n 64 wstat.x -ni 8 -i west.in > wstat.out
!mpirun -n 64 wfreq.x -ni 8 -i west.in > wfreq.out
3.3 : SiC solid¶
[13]:
# download the pseudopotential files
!wget -N -q http://www.quantum-simulation.org/potentials/sg15_oncv/upf/C_ONCV_PBE-1.2.upf
!wget -N -q http://www.quantum-simulation.org/potentials/sg15_oncv/upf/Si_ONCV_PBE-1.2.upf
[14]:
# build the input for DFT
from ase.build import bulk
from ase.io import write
atoms = bulk('SiC', 'zincblende', a=4.36, cubic=True) # Angstrom
pseudopotentials = {}
pseudopotentials['C'] = 'C_ONCV_PBE-1.2.upf'
pseudopotentials['Si'] = 'Si_ONCV_PBE-1.2.upf'
inp_data = {}
inp_data['calculation'] = 'scf'
inp_data['restart_mode'] = 'from_scratch'
inp_data['prefix'] = 'sic'
inp_data['outdir'] = './'
inp_data['pseudo_dir'] = './'
inp_data['verbosity'] = 'high'
inp_data['wf_collect'] = True
inp_data['ecutwfc'] = 30
write('sic_scf.pwi',atoms,pseudopotentials=pseudopotentials,input_data=inp_data,kpts=[8,8,8])
inp_data['calculation'] = 'nscf'
inp_data['nosym'] = True
inp_data['noinv'] = True
inp_data['nbnd'] = 20
inp_data['diago_full_acc'] = True
# Note that for systems with k-points we run a nscf calculation making sure that symmetries are turned off
write('sic_nscf.pwi',atoms,pseudopotentials=pseudopotentials,input_data=inp_data,kpts=[2,2,2])
[15]:
!cat sic_scf.pwi
!cat sic_nscf.pwi
&CONTROL
calculation = 'scf'
verbosity = 'high'
restart_mode = 'from_scratch'
wf_collect = .true.
outdir = './'
prefix = 'sic'
pseudo_dir = './'
/
&SYSTEM
ecutwfc = 30
ntyp = 2
nat = 8
ibrav = 0
/
&ELECTRONS
/
&IONS
/
&CELL
/
ATOMIC_SPECIES
Si 28.085 Si_ONCV_PBE-1.2.upf
C 12.011 C_ONCV_PBE-1.2.upf
K_POINTS automatic
8 8 8 0 0 0
CELL_PARAMETERS angstrom
4.36000000000000 0.00000000000000 0.00000000000000
0.00000000000000 4.36000000000000 0.00000000000000
0.00000000000000 0.00000000000000 4.36000000000000
ATOMIC_POSITIONS angstrom
Si 0.0000000000 0.0000000000 0.0000000000
C 1.0900000000 1.0900000000 1.0900000000
Si 0.0000000000 2.1800000000 2.1800000000
C 1.0900000000 3.2700000000 3.2700000000
Si 2.1800000000 0.0000000000 2.1800000000
C 3.2700000000 1.0900000000 3.2700000000
Si 2.1800000000 2.1800000000 0.0000000000
C 3.2700000000 3.2700000000 1.0900000000
&CONTROL
calculation = 'nscf'
verbosity = 'high'
restart_mode = 'from_scratch'
wf_collect = .true.
outdir = './'
prefix = 'sic'
pseudo_dir = './'
/
&SYSTEM
nbnd = 20
ecutwfc = 30
nosym = .true.
noinv = .true.
ntyp = 2
nat = 8
ibrav = 0
/
&ELECTRONS
diago_full_acc = .true.
/
&IONS
/
&CELL
/
ATOMIC_SPECIES
Si 28.085 Si_ONCV_PBE-1.2.upf
C 12.011 C_ONCV_PBE-1.2.upf
K_POINTS automatic
2 2 2 0 0 0
CELL_PARAMETERS angstrom
4.36000000000000 0.00000000000000 0.00000000000000
0.00000000000000 4.36000000000000 0.00000000000000
0.00000000000000 0.00000000000000 4.36000000000000
ATOMIC_POSITIONS angstrom
Si 0.0000000000 0.0000000000 0.0000000000
C 1.0900000000 1.0900000000 1.0900000000
Si 0.0000000000 2.1800000000 2.1800000000
C 1.0900000000 3.2700000000 3.2700000000
Si 2.1800000000 0.0000000000 2.1800000000
C 3.2700000000 1.0900000000 3.2700000000
Si 2.1800000000 2.1800000000 0.0000000000
C 3.2700000000 3.2700000000 1.0900000000
[16]:
# build the input for MBPT
import yaml
west = {}
west['input_west'] = {}
west['input_west']['qe_prefix'] = 'sic'
west['input_west']['west_prefix'] = 'sic'
west['input_west']['outdir'] = './'
west['wstat_control'] = {}
west['wstat_control']['wstat_calculation'] = 'S'
west['wstat_control']['n_pdep_eigen'] = 48
west['wstat_control']['n_steps_write_restart'] = 0
west['wfreq_control'] = {}
west['wfreq_control']['wfreq_calculation'] = 'XWGQ'
west['wfreq_control']['macropol_calculation'] = 'C'
west['wfreq_control']['n_pdep_eigen_to_use'] = 48
west['wfreq_control']['qp_bandrange'] = [15,18]
west['wfreq_control']['o_restart_time'] = -1.0
with open('west.in', 'w') as file :
yaml.dump(west, file, sort_keys=False)
[17]:
!cat west.in
input_west:
qe_prefix: sic
west_prefix: sic
outdir: ./
wstat_control:
wstat_calculation: S
n_pdep_eigen: 48
n_steps_write_restart: 0
wfreq_control:
wfreq_calculation: XWGQ
macropol_calculation: C
n_pdep_eigen_to_use: 48
qp_bandrange:
- 15
- 18
o_restart_time: -1.0
Run pw.x
, wstat.x
, and wfreq.x
. These calculations should finish in 15 minutes.
[18]:
!mpirun -n 16 pw.x -i sic_scf.pwi > sic_scf.pwo
!mpirun -n 16 pw.x -i sic_nscf.pwi > sic_nscf.pwo
!mpirun -n 64 wstat.x -ni 8 -i west.in > wstat.out
!mpirun -n 64 wfreq.x -ni 8 -i west.in > wfreq.out