This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
bulk_optimization [2009/11/24 23:02] jelen |
bulk_optimization [2014/02/09 11:23] (current) |
||
|---|---|---|---|
| Line 4: | Line 4: | ||
| Detail description of the diamond structure can be found [[http://cst-www.nrl.navy.mil/lattice/struk/a4.html|elsewhere]]. | Detail description of the diamond structure can be found [[http://cst-www.nrl.navy.mil/lattice/struk/a4.html|elsewhere]]. | ||
| There is an elegant way to rescale atomic coordinates, lattice vector and k-points by only one parameter **''rescal''** defined in the section **''&OPTIONS''**. | There is an elegant way to rescale atomic coordinates, lattice vector and k-points by only one parameter **''rescal''** defined in the section **''&OPTIONS''**. | ||
| - | Our input atomic coordinates written in **''fireball.in''** look like: | + | Our input atomic coordinates written in **''Si.bas''** look like: |
| 2 | 2 | ||
| Line 120: | Line 120: | ||
| gnuplot> set format y "%8.2f" | gnuplot> set format y "%8.2f" | ||
| gnuplot> plot 'etot.dat' with linespoints | gnuplot> plot 'etot.dat' with linespoints | ||
| + | |||
| + | {{:si-bulk:etot-alat.png|}} | ||
| + | ===== The bulk modulus ===== | ||
| + | |||
| + | $ ls | ||
| + | Fdata uno.bas uno.kpts uno.lvs vol.sh | ||
| + | | ||
| + | $ head uno.bas | ||
| + | 2 | ||
| + | 14 0.000000 0.000000 0.000000 | ||
| + | 14 0.250000 0.250000 0.250000 | ||
| + | | ||
| + | $ head uno.kpts | ||
| + | 32 | ||
| + | -2.35619449 -2.35619449 -2.35619449 0.03125000 | ||
| + | -3.92699081 -0.78539816 -0.78539816 0.03125000 | ||
| + | -5.49778713 0.78539816 0.78539816 0.03125000 | ||
| + | -7.06858347 2.35619449 2.35619449 0.03125000 | ||
| + | -0.78539816 -3.92699081 -0.78539816 0.03125000 | ||
| + | -2.35619449 -2.35619449 0.78539816 0.03125000 | ||
| + | -3.92699081 -0.78539816 2.35619449 0.03125000 | ||
| + | -5.49778713 0.78539816 3.92699081 0.03125000 | ||
| + | 0.78539816 -5.49778713 0.78539816 0.03125000 | ||
| + | | ||
| + | $ head uno.lvs | ||
| + | 0.5000 0.5000 0.0000 | ||
| + | 0.5000 0.0000 0.5000 | ||
| + | 0.0000 0.5000 0.5000 | ||
| + | |||
| + | The script to calculate the bulk modulus | ||
| + | $ cat vol.sh | ||
| + | #!/bin/bash | ||
| + | |||
| + | ##----- Parametros de control (el parametro de red tiene que encontrase entre ini fin --------## | ||
| + | N=10 | ||
| + | ini=5.0 | ||
| + | fin=6.0 | ||
| + | |||
| + | ##----------Funcion analisis para dos atomos/celda-----------------------------------------## | ||
| + | function analisis { | ||
| + | ETOT=$(grep 'ETOT' salida.out|cut -d'=' -f2) | ||
| + | sigma=$(grep sigma salida.out | cut -d'=' -f16 | tail -1) | ||
| + | charge=$(head -2 uno.bas | tail -1 | tr -s ' ' | cut -d' ' -f2)' -> '$(head -2 CHARGES | tail -1) | ||
| + | charge=$charge' ;'$(head -3 uno.bas | tail -1 | tr -s ' ' | cut -d' ' -f2)' -> ' | ||
| + | charge=$charge$(tail -1 CHARGES) | ||
| + | echo $rescal$'\t'$ETOT$'\t'$sigma$'\t'$charge$'\t'>>salida | ||
| + | } | ||
| + | ##------------------------------------------------------------------------------------------## | ||
| + | function start { | ||
| + | rm -fr salida | ||
| + | for((i=0;i<=N;i++)) | ||
| + | do | ||
| + | rescal=$(python -c "print '%.6f' % ($i*1.0*($fin-$ini)/$N+$ini)") | ||
| + | echo "&option | ||
| + | basisfile = uno.bas | ||
| + | lvsfile = uno.lvs | ||
| + | kptpreference = uno.kpts | ||
| + | rescal = $rescal | ||
| + | sigmatol = 0.000001 | ||
| + | nstepf = 1 | ||
| + | &end | ||
| + | &output | ||
| + | iwrtxyz = 1 | ||
| + | &end" > fireball.in | ||
| + | ../progs/fireball.x > salida.out | ||
| + | | ||
| + | analisis | ||
| + | done | ||
| + | } | ||
| + | ##----------------------------------1º start ----------------------------------------------## | ||
| + | start | ||
| + | ##-----------------------------buscamos el minimo ------------------------------------------## | ||
| + | min=$(python -c " | ||
| + | x0 = [] | ||
| + | y0 = [] | ||
| + | for line in file(\"salida\"): | ||
| + | line = line.split() | ||
| + | x = line[0] | ||
| + | y = line[1] | ||
| + | x0.append(x) | ||
| + | y0.append(y) | ||
| + | | ||
| + | j=0 | ||
| + | for i in range(len(x0)): | ||
| + | if y0[j]< y0[i]: | ||
| + | j=i | ||
| + | print x0[j]") | ||
| + | cp salida borrar | ||
| + | rm -fr aux.py | ||
| + | | ||
| + | ##----------------------------------2º start -----------------------------------------------## | ||
| + | N=40 | ||
| + | d=0.4 | ||
| + | ini=$(python -c "print '%.6f' % (1.0*($min-$d))") | ||
| + | fin=$(python -c "print '%.6f' % (1.0*($min+$d))") | ||
| + | start | ||
| + | mv salida Vol.dat | ||
| + | ##------------------------------------------------------------------------------------------## | ||
| + | |||
| + | In the 1º start of the script "vol.sh" takes 10 points between 5-6: | ||
| + | |||
| + | {{:bulk-si-10.png|}} | ||
| + | |||
| + | In the 2º start of the script "vol.sh" takes 40 points between the minimum of the 1º start | ||
| + | |||
| + | {{:si-bulk-40.png|}} | ||
| + | |||
| + | The scripts uses the parameter rescal in fireball.in and unitary positions and lattice vectors with 2 atoms/cell | ||
| + | to obtain the kpts points we used xeo: | ||
| + | |||
| + | {{:xeo-menu-kpts.png|}} | ||
| + | |||
| + | {{:xeo-kpts.png|}} | ||
| + | |||
| + | The bulk mudulus can be calculed also with xeo (Utilities->Bulk modulus), in the in line command: | ||
| + | |||
| + | $ xeo -Bulk Vol.dat zincblende | ||
| + | E_min = -214.35239 eV | ||
| + | a_min = 5.43719 angs | ||
| + | Volumen = 40.18518 ang**3 | ||
| + | Bulk modulus = 100.79399 GPa | ||
| + | |||