diff --git a/python/converters/vasp/.gitignore b/python/converters/vasp/.gitignore new file mode 100644 index 00000000..0d20b648 --- /dev/null +++ b/python/converters/vasp/.gitignore @@ -0,0 +1 @@ +*.pyc diff --git a/python/converters/vasp/EIGENVAL b/python/converters/vasp/EIGENVAL new file mode 100644 index 00000000..61fdf71f --- /dev/null +++ b/python/converters/vasp/EIGENVAL @@ -0,0 +1,74 @@ + 2 2 1 2 + 0.1333597E+02 0.2987800E-09 0.2987800E-09 0.2987800E-09 0.5000000E-15 + 1.000000000000000E-004 + CAR + V + 22 4 15 + + 0.0000000E+00 0.0000000E+00 0.0000000E+00 0.3703704E-01 + 1 -31.708596 -31.708596 + 2 -31.708596 -31.708596 + 3 -31.708596 -31.708596 + 4 -31.061475 -31.061475 + 5 -31.061475 -31.061475 + 6 -31.061475 -31.061475 + 7 -0.811953 -0.811953 + 8 2.607665 2.607665 + 9 2.607665 2.607665 + 10 6.002735 6.002735 + 11 6.002735 6.002735 + 12 6.002735 6.002735 + 13 8.013630 8.013630 + 14 8.013630 8.013630 + 15 9.361252 9.361252 + + 0.3333333E+00 0.0000000E+00 0.0000000E+00 0.2222222E+00 + 1 -31.682851 -31.682851 + 2 -31.539793 -31.539793 + 3 -31.539793 -31.539793 + 4 -31.363786 -31.363786 + 5 -31.215960 -31.215960 + 6 -31.215960 -31.215960 + 7 1.216017 1.216017 + 8 3.394994 3.394994 + 9 3.771669 3.771669 + 10 6.050595 6.050595 + 11 6.050595 6.050595 + 12 6.457025 6.457025 + 13 6.771661 6.771661 + 14 7.383619 7.383619 + 15 7.383620 7.383620 + + 0.3333333E+00 0.3333333E+00 0.0000000E+00 0.4444444E+00 + 1 -31.935665 -31.935665 + 2 -31.782518 -31.782518 + 3 -31.447103 -31.447103 + 4 -31.284953 -31.284953 + 5 -31.234384 -31.234384 + 6 -31.067231 -31.067231 + 7 2.201004 2.201004 + 8 3.123182 3.123182 + 9 4.809697 4.809697 + 10 5.123957 5.123957 + 11 5.357025 5.357025 + 12 5.853431 5.853431 + 13 7.260017 7.260017 + 14 7.862532 7.862532 + 15 8.230907 8.230907 + + 0.3333333E+00 0.3333333E+00 0.3333333E+00 0.2962963E+00 + 1 -31.808727 -31.808727 + 2 -31.713049 -31.713049 + 3 -31.713049 -31.713049 + 4 -31.278227 -31.278227 + 5 -31.278227 -31.278227 + 6 -31.179331 -31.179331 + 7 3.831291 3.831291 + 8 3.998572 3.998572 + 9 4.466211 4.466211 + 10 4.466211 4.466211 + 11 4.724276 4.724276 + 12 4.724276 4.724276 + 13 8.230309 8.230309 + 14 8.253908 8.253831 + 15 8.292606 8.292606 diff --git a/python/converters/vasp/IBZKPT b/python/converters/vasp/IBZKPT new file mode 100644 index 00000000..348ae81d --- /dev/null +++ b/python/converters/vasp/IBZKPT @@ -0,0 +1,2457 @@ +Automatically generated mesh + 352 +Reciprocal lattice + 0.00000000000000 0.00000000000000 0.00000000000000 1 + 0.10000000000000 0.00000000000000 0.00000000000000 2 + 0.20000000000000 0.00000000000000 0.00000000000000 2 + 0.30000000000000 0.00000000000000 0.00000000000000 2 + 0.40000000000000 0.00000000000000 0.00000000000000 2 + 0.50000000000000 0.00000000000000 0.00000000000000 1 + 0.00000000000000 0.10000000000000 0.00000000000000 2 + 0.10000000000000 0.10000000000000 0.00000000000000 2 + 0.20000000000000 0.10000000000000 0.00000000000000 2 + 0.30000000000000 0.10000000000000 0.00000000000000 2 + 0.40000000000000 0.10000000000000 0.00000000000000 2 + 0.50000000000000 0.10000000000000 0.00000000000000 2 + -0.40000000000000 0.10000000000000 0.00000000000000 2 + -0.30000000000000 0.10000000000000 0.00000000000000 2 + -0.20000000000000 0.10000000000000 0.00000000000000 2 + -0.10000000000000 0.10000000000000 0.00000000000000 2 + 0.00000000000000 0.20000000000000 0.00000000000000 2 + 0.10000000000000 0.20000000000000 0.00000000000000 2 + 0.20000000000000 0.20000000000000 0.00000000000000 2 + 0.30000000000000 0.20000000000000 0.00000000000000 2 + 0.40000000000000 0.20000000000000 0.00000000000000 2 + 0.50000000000000 0.20000000000000 0.00000000000000 2 + -0.40000000000000 0.20000000000000 0.00000000000000 2 + -0.30000000000000 0.20000000000000 0.00000000000000 2 + -0.20000000000000 0.20000000000000 0.00000000000000 2 + -0.10000000000000 0.20000000000000 0.00000000000000 2 + 0.00000000000000 0.30000000000000 0.00000000000000 2 + 0.10000000000000 0.30000000000000 0.00000000000000 2 + 0.20000000000000 0.30000000000000 0.00000000000000 2 + 0.30000000000000 0.30000000000000 0.00000000000000 2 + 0.40000000000000 0.30000000000000 0.00000000000000 2 + 0.50000000000000 0.30000000000000 0.00000000000000 2 + -0.40000000000000 0.30000000000000 0.00000000000000 2 + -0.30000000000000 0.30000000000000 0.00000000000000 2 + -0.20000000000000 0.30000000000000 0.00000000000000 2 + -0.10000000000000 0.30000000000000 0.00000000000000 2 + 0.00000000000000 0.40000000000000 0.00000000000000 2 + 0.10000000000000 0.40000000000000 0.00000000000000 2 + 0.20000000000000 0.40000000000000 0.00000000000000 2 + 0.30000000000000 0.40000000000000 0.00000000000000 2 + 0.40000000000000 0.40000000000000 0.00000000000000 2 + 0.50000000000000 0.40000000000000 0.00000000000000 2 + -0.40000000000000 0.40000000000000 0.00000000000000 2 + -0.30000000000000 0.40000000000000 0.00000000000000 2 + -0.20000000000000 0.40000000000000 0.00000000000000 2 + -0.10000000000000 0.40000000000000 0.00000000000000 2 + 0.00000000000000 0.50000000000000 0.00000000000000 1 + 0.10000000000000 0.50000000000000 0.00000000000000 2 + 0.20000000000000 0.50000000000000 0.00000000000000 2 + 0.30000000000000 0.50000000000000 0.00000000000000 2 + 0.40000000000000 0.50000000000000 0.00000000000000 2 + 0.50000000000000 0.50000000000000 0.00000000000000 1 + 0.00000000000000 0.00000000000000 0.14285714285714 2 + 0.10000000000000 0.00000000000000 0.14285714285714 2 + 0.20000000000000 0.00000000000000 0.14285714285714 2 + 0.30000000000000 0.00000000000000 0.14285714285714 2 + 0.40000000000000 0.00000000000000 0.14285714285714 2 + 0.50000000000000 0.00000000000000 0.14285714285714 2 + -0.40000000000000 0.00000000000000 0.14285714285714 2 + -0.30000000000000 0.00000000000000 0.14285714285714 2 + -0.20000000000000 0.00000000000000 0.14285714285714 2 + -0.10000000000000 0.00000000000000 0.14285714285714 2 + 0.00000000000000 0.10000000000000 0.14285714285714 2 + 0.10000000000000 0.10000000000000 0.14285714285714 2 + 0.20000000000000 0.10000000000000 0.14285714285714 2 + 0.30000000000000 0.10000000000000 0.14285714285714 2 + 0.40000000000000 0.10000000000000 0.14285714285714 2 + 0.50000000000000 0.10000000000000 0.14285714285714 2 + -0.40000000000000 0.10000000000000 0.14285714285714 2 + -0.30000000000000 0.10000000000000 0.14285714285714 2 + -0.20000000000000 0.10000000000000 0.14285714285714 2 + -0.10000000000000 0.10000000000000 0.14285714285714 2 + 0.00000000000000 0.20000000000000 0.14285714285714 2 + 0.10000000000000 0.20000000000000 0.14285714285714 2 + 0.20000000000000 0.20000000000000 0.14285714285714 2 + 0.30000000000000 0.20000000000000 0.14285714285714 2 + 0.40000000000000 0.20000000000000 0.14285714285714 2 + 0.50000000000000 0.20000000000000 0.14285714285714 2 + -0.40000000000000 0.20000000000000 0.14285714285714 2 + -0.30000000000000 0.20000000000000 0.14285714285714 2 + -0.20000000000000 0.20000000000000 0.14285714285714 2 + -0.10000000000000 0.20000000000000 0.14285714285714 2 + 0.00000000000000 0.30000000000000 0.14285714285714 2 + 0.10000000000000 0.30000000000000 0.14285714285714 2 + 0.20000000000000 0.30000000000000 0.14285714285714 2 + 0.30000000000000 0.30000000000000 0.14285714285714 2 + 0.40000000000000 0.30000000000000 0.14285714285714 2 + 0.50000000000000 0.30000000000000 0.14285714285714 2 + -0.40000000000000 0.30000000000000 0.14285714285714 2 + -0.30000000000000 0.30000000000000 0.14285714285714 2 + -0.20000000000000 0.30000000000000 0.14285714285714 2 + -0.10000000000000 0.30000000000000 0.14285714285714 2 + 0.00000000000000 0.40000000000000 0.14285714285714 2 + 0.10000000000000 0.40000000000000 0.14285714285714 2 + 0.20000000000000 0.40000000000000 0.14285714285714 2 + 0.30000000000000 0.40000000000000 0.14285714285714 2 + 0.40000000000000 0.40000000000000 0.14285714285714 2 + 0.50000000000000 0.40000000000000 0.14285714285714 2 + -0.40000000000000 0.40000000000000 0.14285714285714 2 + -0.30000000000000 0.40000000000000 0.14285714285714 2 + -0.20000000000000 0.40000000000000 0.14285714285714 2 + -0.10000000000000 0.40000000000000 0.14285714285714 2 + 0.00000000000000 0.50000000000000 0.14285714285714 2 + 0.10000000000000 0.50000000000000 0.14285714285714 2 + 0.20000000000000 0.50000000000000 0.14285714285714 2 + 0.30000000000000 0.50000000000000 0.14285714285714 2 + 0.40000000000000 0.50000000000000 0.14285714285714 2 + 0.50000000000000 0.50000000000000 0.14285714285714 2 + -0.40000000000000 0.50000000000000 0.14285714285714 2 + -0.30000000000000 0.50000000000000 0.14285714285714 2 + -0.20000000000000 0.50000000000000 0.14285714285714 2 + -0.10000000000000 0.50000000000000 0.14285714285714 2 + 0.00000000000000 -0.40000000000000 0.14285714285714 2 + 0.10000000000000 -0.40000000000000 0.14285714285714 2 + 0.20000000000000 -0.40000000000000 0.14285714285714 2 + 0.30000000000000 -0.40000000000000 0.14285714285714 2 + 0.40000000000000 -0.40000000000000 0.14285714285714 2 + 0.50000000000000 -0.40000000000000 0.14285714285714 2 + -0.40000000000000 -0.40000000000000 0.14285714285714 2 + -0.30000000000000 -0.40000000000000 0.14285714285714 2 + -0.20000000000000 -0.40000000000000 0.14285714285714 2 + -0.10000000000000 -0.40000000000000 0.14285714285714 2 + 0.00000000000000 -0.30000000000000 0.14285714285714 2 + 0.10000000000000 -0.30000000000000 0.14285714285714 2 + 0.20000000000000 -0.30000000000000 0.14285714285714 2 + 0.30000000000000 -0.30000000000000 0.14285714285714 2 + 0.40000000000000 -0.30000000000000 0.14285714285714 2 + 0.50000000000000 -0.30000000000000 0.14285714285714 2 + -0.40000000000000 -0.30000000000000 0.14285714285714 2 + -0.30000000000000 -0.30000000000000 0.14285714285714 2 + -0.20000000000000 -0.30000000000000 0.14285714285714 2 + -0.10000000000000 -0.30000000000000 0.14285714285714 2 + 0.00000000000000 -0.20000000000000 0.14285714285714 2 + 0.10000000000000 -0.20000000000000 0.14285714285714 2 + 0.20000000000000 -0.20000000000000 0.14285714285714 2 + 0.30000000000000 -0.20000000000000 0.14285714285714 2 + 0.40000000000000 -0.20000000000000 0.14285714285714 2 + 0.50000000000000 -0.20000000000000 0.14285714285714 2 + -0.40000000000000 -0.20000000000000 0.14285714285714 2 + -0.30000000000000 -0.20000000000000 0.14285714285714 2 + -0.20000000000000 -0.20000000000000 0.14285714285714 2 + -0.10000000000000 -0.20000000000000 0.14285714285714 2 + 0.00000000000000 -0.10000000000000 0.14285714285714 2 + 0.10000000000000 -0.10000000000000 0.14285714285714 2 + 0.20000000000000 -0.10000000000000 0.14285714285714 2 + 0.30000000000000 -0.10000000000000 0.14285714285714 2 + 0.40000000000000 -0.10000000000000 0.14285714285714 2 + 0.50000000000000 -0.10000000000000 0.14285714285714 2 + -0.40000000000000 -0.10000000000000 0.14285714285714 2 + -0.30000000000000 -0.10000000000000 0.14285714285714 2 + -0.20000000000000 -0.10000000000000 0.14285714285714 2 + -0.10000000000000 -0.10000000000000 0.14285714285714 2 + 0.00000000000000 0.00000000000000 0.28571428571429 2 + 0.10000000000000 0.00000000000000 0.28571428571429 2 + 0.20000000000000 0.00000000000000 0.28571428571429 2 + 0.30000000000000 0.00000000000000 0.28571428571429 2 + 0.40000000000000 0.00000000000000 0.28571428571429 2 + 0.50000000000000 0.00000000000000 0.28571428571429 2 + -0.40000000000000 0.00000000000000 0.28571428571429 2 + -0.30000000000000 0.00000000000000 0.28571428571429 2 + -0.20000000000000 0.00000000000000 0.28571428571429 2 + -0.10000000000000 0.00000000000000 0.28571428571429 2 + 0.00000000000000 0.10000000000000 0.28571428571429 2 + 0.10000000000000 0.10000000000000 0.28571428571429 2 + 0.20000000000000 0.10000000000000 0.28571428571429 2 + 0.30000000000000 0.10000000000000 0.28571428571429 2 + 0.40000000000000 0.10000000000000 0.28571428571429 2 + 0.50000000000000 0.10000000000000 0.28571428571429 2 + -0.40000000000000 0.10000000000000 0.28571428571429 2 + -0.30000000000000 0.10000000000000 0.28571428571429 2 + -0.20000000000000 0.10000000000000 0.28571428571429 2 + -0.10000000000000 0.10000000000000 0.28571428571429 2 + 0.00000000000000 0.20000000000000 0.28571428571429 2 + 0.10000000000000 0.20000000000000 0.28571428571429 2 + 0.20000000000000 0.20000000000000 0.28571428571429 2 + 0.30000000000000 0.20000000000000 0.28571428571429 2 + 0.40000000000000 0.20000000000000 0.28571428571429 2 + 0.50000000000000 0.20000000000000 0.28571428571429 2 + -0.40000000000000 0.20000000000000 0.28571428571429 2 + -0.30000000000000 0.20000000000000 0.28571428571429 2 + -0.20000000000000 0.20000000000000 0.28571428571429 2 + -0.10000000000000 0.20000000000000 0.28571428571429 2 + 0.00000000000000 0.30000000000000 0.28571428571429 2 + 0.10000000000000 0.30000000000000 0.28571428571429 2 + 0.20000000000000 0.30000000000000 0.28571428571429 2 + 0.30000000000000 0.30000000000000 0.28571428571429 2 + 0.40000000000000 0.30000000000000 0.28571428571429 2 + 0.50000000000000 0.30000000000000 0.28571428571429 2 + -0.40000000000000 0.30000000000000 0.28571428571429 2 + -0.30000000000000 0.30000000000000 0.28571428571429 2 + -0.20000000000000 0.30000000000000 0.28571428571429 2 + -0.10000000000000 0.30000000000000 0.28571428571429 2 + 0.00000000000000 0.40000000000000 0.28571428571429 2 + 0.10000000000000 0.40000000000000 0.28571428571429 2 + 0.20000000000000 0.40000000000000 0.28571428571429 2 + 0.30000000000000 0.40000000000000 0.28571428571429 2 + 0.40000000000000 0.40000000000000 0.28571428571429 2 + 0.50000000000000 0.40000000000000 0.28571428571429 2 + -0.40000000000000 0.40000000000000 0.28571428571429 2 + -0.30000000000000 0.40000000000000 0.28571428571429 2 + -0.20000000000000 0.40000000000000 0.28571428571429 2 + -0.10000000000000 0.40000000000000 0.28571428571429 2 + 0.00000000000000 0.50000000000000 0.28571428571429 2 + 0.10000000000000 0.50000000000000 0.28571428571429 2 + 0.20000000000000 0.50000000000000 0.28571428571429 2 + 0.30000000000000 0.50000000000000 0.28571428571429 2 + 0.40000000000000 0.50000000000000 0.28571428571429 2 + 0.50000000000000 0.50000000000000 0.28571428571429 2 + -0.40000000000000 0.50000000000000 0.28571428571429 2 + -0.30000000000000 0.50000000000000 0.28571428571429 2 + -0.20000000000000 0.50000000000000 0.28571428571429 2 + -0.10000000000000 0.50000000000000 0.28571428571429 2 + 0.00000000000000 -0.40000000000000 0.28571428571429 2 + 0.10000000000000 -0.40000000000000 0.28571428571429 2 + 0.20000000000000 -0.40000000000000 0.28571428571429 2 + 0.30000000000000 -0.40000000000000 0.28571428571429 2 + 0.40000000000000 -0.40000000000000 0.28571428571429 2 + 0.50000000000000 -0.40000000000000 0.28571428571429 2 + -0.40000000000000 -0.40000000000000 0.28571428571429 2 + -0.30000000000000 -0.40000000000000 0.28571428571429 2 + -0.20000000000000 -0.40000000000000 0.28571428571429 2 + -0.10000000000000 -0.40000000000000 0.28571428571429 2 + 0.00000000000000 -0.30000000000000 0.28571428571429 2 + 0.10000000000000 -0.30000000000000 0.28571428571429 2 + 0.20000000000000 -0.30000000000000 0.28571428571429 2 + 0.30000000000000 -0.30000000000000 0.28571428571429 2 + 0.40000000000000 -0.30000000000000 0.28571428571429 2 + 0.50000000000000 -0.30000000000000 0.28571428571429 2 + -0.40000000000000 -0.30000000000000 0.28571428571429 2 + -0.30000000000000 -0.30000000000000 0.28571428571429 2 + -0.20000000000000 -0.30000000000000 0.28571428571429 2 + -0.10000000000000 -0.30000000000000 0.28571428571429 2 + 0.00000000000000 -0.20000000000000 0.28571428571429 2 + 0.10000000000000 -0.20000000000000 0.28571428571429 2 + 0.20000000000000 -0.20000000000000 0.28571428571429 2 + 0.30000000000000 -0.20000000000000 0.28571428571429 2 + 0.40000000000000 -0.20000000000000 0.28571428571429 2 + 0.50000000000000 -0.20000000000000 0.28571428571429 2 + -0.40000000000000 -0.20000000000000 0.28571428571429 2 + -0.30000000000000 -0.20000000000000 0.28571428571429 2 + -0.20000000000000 -0.20000000000000 0.28571428571429 2 + -0.10000000000000 -0.20000000000000 0.28571428571429 2 + 0.00000000000000 -0.10000000000000 0.28571428571429 2 + 0.10000000000000 -0.10000000000000 0.28571428571429 2 + 0.20000000000000 -0.10000000000000 0.28571428571429 2 + 0.30000000000000 -0.10000000000000 0.28571428571429 2 + 0.40000000000000 -0.10000000000000 0.28571428571429 2 + 0.50000000000000 -0.10000000000000 0.28571428571429 2 + -0.40000000000000 -0.10000000000000 0.28571428571429 2 + -0.30000000000000 -0.10000000000000 0.28571428571429 2 + -0.20000000000000 -0.10000000000000 0.28571428571429 2 + -0.10000000000000 -0.10000000000000 0.28571428571429 2 + 0.00000000000000 0.00000000000000 0.42857142857143 2 + 0.10000000000000 0.00000000000000 0.42857142857143 2 + 0.20000000000000 0.00000000000000 0.42857142857143 2 + 0.30000000000000 0.00000000000000 0.42857142857143 2 + 0.40000000000000 0.00000000000000 0.42857142857143 2 + 0.50000000000000 0.00000000000000 0.42857142857143 2 + -0.40000000000000 0.00000000000000 0.42857142857143 2 + -0.30000000000000 0.00000000000000 0.42857142857143 2 + -0.20000000000000 0.00000000000000 0.42857142857143 2 + -0.10000000000000 0.00000000000000 0.42857142857143 2 + 0.00000000000000 0.10000000000000 0.42857142857143 2 + 0.10000000000000 0.10000000000000 0.42857142857143 2 + 0.20000000000000 0.10000000000000 0.42857142857143 2 + 0.30000000000000 0.10000000000000 0.42857142857143 2 + 0.40000000000000 0.10000000000000 0.42857142857143 2 + 0.50000000000000 0.10000000000000 0.42857142857143 2 + -0.40000000000000 0.10000000000000 0.42857142857143 2 + -0.30000000000000 0.10000000000000 0.42857142857143 2 + -0.20000000000000 0.10000000000000 0.42857142857143 2 + -0.10000000000000 0.10000000000000 0.42857142857143 2 + 0.00000000000000 0.20000000000000 0.42857142857143 2 + 0.10000000000000 0.20000000000000 0.42857142857143 2 + 0.20000000000000 0.20000000000000 0.42857142857143 2 + 0.30000000000000 0.20000000000000 0.42857142857143 2 + 0.40000000000000 0.20000000000000 0.42857142857143 2 + 0.50000000000000 0.20000000000000 0.42857142857143 2 + -0.40000000000000 0.20000000000000 0.42857142857143 2 + -0.30000000000000 0.20000000000000 0.42857142857143 2 + -0.20000000000000 0.20000000000000 0.42857142857143 2 + -0.10000000000000 0.20000000000000 0.42857142857143 2 + 0.00000000000000 0.30000000000000 0.42857142857143 2 + 0.10000000000000 0.30000000000000 0.42857142857143 2 + 0.20000000000000 0.30000000000000 0.42857142857143 2 + 0.30000000000000 0.30000000000000 0.42857142857143 2 + 0.40000000000000 0.30000000000000 0.42857142857143 2 + 0.50000000000000 0.30000000000000 0.42857142857143 2 + -0.40000000000000 0.30000000000000 0.42857142857143 2 + -0.30000000000000 0.30000000000000 0.42857142857143 2 + -0.20000000000000 0.30000000000000 0.42857142857143 2 + -0.10000000000000 0.30000000000000 0.42857142857143 2 + 0.00000000000000 0.40000000000000 0.42857142857143 2 + 0.10000000000000 0.40000000000000 0.42857142857143 2 + 0.20000000000000 0.40000000000000 0.42857142857143 2 + 0.30000000000000 0.40000000000000 0.42857142857143 2 + 0.40000000000000 0.40000000000000 0.42857142857143 2 + 0.50000000000000 0.40000000000000 0.42857142857143 2 + -0.40000000000000 0.40000000000000 0.42857142857143 2 + -0.30000000000000 0.40000000000000 0.42857142857143 2 + -0.20000000000000 0.40000000000000 0.42857142857143 2 + -0.10000000000000 0.40000000000000 0.42857142857143 2 + 0.00000000000000 0.50000000000000 0.42857142857143 2 + 0.10000000000000 0.50000000000000 0.42857142857143 2 + 0.20000000000000 0.50000000000000 0.42857142857143 2 + 0.30000000000000 0.50000000000000 0.42857142857143 2 + 0.40000000000000 0.50000000000000 0.42857142857143 2 + 0.50000000000000 0.50000000000000 0.42857142857143 2 + -0.40000000000000 0.50000000000000 0.42857142857143 2 + -0.30000000000000 0.50000000000000 0.42857142857143 2 + -0.20000000000000 0.50000000000000 0.42857142857143 2 + -0.10000000000000 0.50000000000000 0.42857142857143 2 + 0.00000000000000 -0.40000000000000 0.42857142857143 2 + 0.10000000000000 -0.40000000000000 0.42857142857143 2 + 0.20000000000000 -0.40000000000000 0.42857142857143 2 + 0.30000000000000 -0.40000000000000 0.42857142857143 2 + 0.40000000000000 -0.40000000000000 0.42857142857143 2 + 0.50000000000000 -0.40000000000000 0.42857142857143 2 + -0.40000000000000 -0.40000000000000 0.42857142857143 2 + -0.30000000000000 -0.40000000000000 0.42857142857143 2 + -0.20000000000000 -0.40000000000000 0.42857142857143 2 + -0.10000000000000 -0.40000000000000 0.42857142857143 2 + 0.00000000000000 -0.30000000000000 0.42857142857143 2 + 0.10000000000000 -0.30000000000000 0.42857142857143 2 + 0.20000000000000 -0.30000000000000 0.42857142857143 2 + 0.30000000000000 -0.30000000000000 0.42857142857143 2 + 0.40000000000000 -0.30000000000000 0.42857142857143 2 + 0.50000000000000 -0.30000000000000 0.42857142857143 2 + -0.40000000000000 -0.30000000000000 0.42857142857143 2 + -0.30000000000000 -0.30000000000000 0.42857142857143 2 + -0.20000000000000 -0.30000000000000 0.42857142857143 2 + -0.10000000000000 -0.30000000000000 0.42857142857143 2 + 0.00000000000000 -0.20000000000000 0.42857142857143 2 + 0.10000000000000 -0.20000000000000 0.42857142857143 2 + 0.20000000000000 -0.20000000000000 0.42857142857143 2 + 0.30000000000000 -0.20000000000000 0.42857142857143 2 + 0.40000000000000 -0.20000000000000 0.42857142857143 2 + 0.50000000000000 -0.20000000000000 0.42857142857143 2 + -0.40000000000000 -0.20000000000000 0.42857142857143 2 + -0.30000000000000 -0.20000000000000 0.42857142857143 2 + -0.20000000000000 -0.20000000000000 0.42857142857143 2 + -0.10000000000000 -0.20000000000000 0.42857142857143 2 + 0.00000000000000 -0.10000000000000 0.42857142857143 2 + 0.10000000000000 -0.10000000000000 0.42857142857143 2 + 0.20000000000000 -0.10000000000000 0.42857142857143 2 + 0.30000000000000 -0.10000000000000 0.42857142857143 2 + 0.40000000000000 -0.10000000000000 0.42857142857143 2 + 0.50000000000000 -0.10000000000000 0.42857142857143 2 + -0.40000000000000 -0.10000000000000 0.42857142857143 2 + -0.30000000000000 -0.10000000000000 0.42857142857143 2 + -0.20000000000000 -0.10000000000000 0.42857142857143 2 + -0.10000000000000 -0.10000000000000 0.42857142857143 2 +Tetrahedra + 2100 0.00023809523810 + 2 1 2 8 53 + 2 1 7 8 53 + 2 7 8 53 63 + 2 2 8 53 54 + 2 8 53 54 64 + 2 8 53 63 64 + 2 2 3 9 54 + 2 2 8 9 54 + 2 8 9 54 64 + 2 3 9 54 55 + 2 9 54 55 65 + 2 9 54 64 65 + 2 3 4 10 55 + 2 3 9 10 55 + 2 9 10 55 65 + 2 4 10 55 56 + 2 10 55 56 66 + 2 10 55 65 66 + 2 4 5 11 56 + 2 4 10 11 56 + 2 10 11 56 66 + 2 5 11 56 57 + 2 11 56 57 67 + 2 11 56 66 67 + 2 5 6 12 57 + 2 5 11 12 57 + 2 11 12 57 67 + 2 6 12 57 58 + 2 12 57 58 68 + 2 12 57 67 68 + 2 5 6 13 58 + 2 6 12 13 58 + 2 12 13 58 68 + 2 5 13 58 59 + 2 13 58 59 69 + 2 13 58 68 69 + 2 4 5 14 59 + 2 5 13 14 59 + 2 13 14 59 69 + 2 4 14 59 60 + 2 14 59 60 70 + 2 14 59 69 70 + 2 3 4 15 60 + 2 4 14 15 60 + 2 14 15 60 70 + 2 3 15 60 61 + 2 15 60 61 71 + 2 15 60 70 71 + 2 2 3 16 61 + 2 3 15 16 61 + 2 15 16 61 71 + 2 2 16 61 62 + 2 16 61 62 72 + 2 16 61 71 72 + 2 1 2 7 62 + 2 2 7 16 62 + 2 7 16 62 72 + 2 1 7 53 62 + 2 7 53 62 63 + 2 7 62 63 72 + 2 7 8 18 63 + 2 7 17 18 63 + 2 17 18 63 73 + 2 8 18 63 64 + 2 18 63 64 74 + 2 18 63 73 74 + 2 8 9 19 64 + 2 8 18 19 64 + 2 18 19 64 74 + 2 9 19 64 65 + 2 19 64 65 75 + 2 19 64 74 75 + 2 9 10 20 65 + 2 9 19 20 65 + 2 19 20 65 75 + 2 10 20 65 66 + 2 20 65 66 76 + 2 20 65 75 76 + 2 10 11 21 66 + 2 10 20 21 66 + 2 20 21 66 76 + 2 11 21 66 67 + 2 21 66 67 77 + 2 21 66 76 77 + 2 11 12 22 67 + 2 11 21 22 67 + 2 21 22 67 77 + 2 12 22 67 68 + 2 22 67 68 78 + 2 22 67 77 78 + 2 12 13 23 68 + 2 12 22 23 68 + 2 22 23 68 78 + 2 13 23 68 69 + 2 23 68 69 79 + 2 23 68 78 79 + 2 13 14 24 69 + 2 13 23 24 69 + 2 23 24 69 79 + 2 14 24 69 70 + 2 24 69 70 80 + 2 24 69 79 80 + 2 14 15 25 70 + 2 14 24 25 70 + 2 24 25 70 80 + 2 15 25 70 71 + 2 25 70 71 81 + 2 25 70 80 81 + 2 15 16 26 71 + 2 15 25 26 71 + 2 25 26 71 81 + 2 16 26 71 72 + 2 26 71 72 82 + 2 26 71 81 82 + 2 7 16 17 72 + 2 16 17 26 72 + 2 17 26 72 82 + 2 7 17 63 72 + 2 17 63 72 73 + 2 17 72 73 82 + 2 17 18 28 73 + 2 17 27 28 73 + 2 27 28 73 83 + 2 18 28 73 74 + 2 28 73 74 84 + 2 28 73 83 84 + 2 18 19 29 74 + 2 18 28 29 74 + 2 28 29 74 84 + 2 19 29 74 75 + 2 29 74 75 85 + 2 29 74 84 85 + 2 19 20 30 75 + 2 19 29 30 75 + 2 29 30 75 85 + 2 20 30 75 76 + 2 30 75 76 86 + 2 30 75 85 86 + 2 20 21 31 76 + 2 20 30 31 76 + 2 30 31 76 86 + 2 21 31 76 77 + 2 31 76 77 87 + 2 31 76 86 87 + 2 21 22 32 77 + 2 21 31 32 77 + 2 31 32 77 87 + 2 22 32 77 78 + 2 32 77 78 88 + 2 32 77 87 88 + 2 22 23 33 78 + 2 22 32 33 78 + 2 32 33 78 88 + 2 23 33 78 79 + 2 33 78 79 89 + 2 33 78 88 89 + 2 23 24 34 79 + 2 23 33 34 79 + 2 33 34 79 89 + 2 24 34 79 80 + 2 34 79 80 90 + 2 34 79 89 90 + 2 24 25 35 80 + 2 24 34 35 80 + 2 34 35 80 90 + 2 25 35 80 81 + 2 35 80 81 91 + 2 35 80 90 91 + 2 25 26 36 81 + 2 25 35 36 81 + 2 35 36 81 91 + 2 26 36 81 82 + 2 36 81 82 92 + 2 36 81 91 92 + 2 17 26 27 82 + 2 26 27 36 82 + 2 27 36 82 92 + 2 17 27 73 82 + 2 27 73 82 83 + 2 27 82 83 92 + 2 27 28 38 83 + 2 27 37 38 83 + 2 37 38 83 93 + 2 28 38 83 84 + 2 38 83 84 94 + 2 38 83 93 94 + 2 28 29 39 84 + 2 28 38 39 84 + 2 38 39 84 94 + 2 29 39 84 85 + 2 39 84 85 95 + 2 39 84 94 95 + 2 29 30 40 85 + 2 29 39 40 85 + 2 39 40 85 95 + 2 30 40 85 86 + 2 40 85 86 96 + 2 40 85 95 96 + 2 30 31 41 86 + 2 30 40 41 86 + 2 40 41 86 96 + 2 31 41 86 87 + 2 41 86 87 97 + 2 41 86 96 97 + 2 31 32 42 87 + 2 31 41 42 87 + 2 41 42 87 97 + 2 32 42 87 88 + 2 42 87 88 98 + 2 42 87 97 98 + 2 32 33 43 88 + 2 32 42 43 88 + 2 42 43 88 98 + 2 33 43 88 89 + 2 43 88 89 99 + 2 43 88 98 99 + 2 33 34 44 89 + 2 33 43 44 89 + 2 43 44 89 99 + 2 34 44 89 90 + 2 44 89 90 100 + 2 44 89 99 100 + 2 34 35 45 90 + 2 34 44 45 90 + 2 44 45 90 100 + 2 35 45 90 91 + 2 45 90 91 101 + 2 45 90 100 101 + 2 35 36 46 91 + 2 35 45 46 91 + 2 45 46 91 101 + 2 36 46 91 92 + 2 46 91 92 102 + 2 46 91 101 102 + 2 27 36 37 92 + 2 36 37 46 92 + 2 37 46 92 102 + 2 27 37 83 92 + 2 37 83 92 93 + 2 37 92 93 102 + 2 37 38 48 93 + 2 37 47 48 93 + 2 47 48 93 103 + 2 38 48 93 94 + 2 48 93 94 104 + 2 48 93 103 104 + 2 38 39 49 94 + 2 38 48 49 94 + 2 48 49 94 104 + 2 39 49 94 95 + 2 49 94 95 105 + 2 49 94 104 105 + 2 39 40 50 95 + 2 39 49 50 95 + 2 49 50 95 105 + 2 40 50 95 96 + 2 50 95 96 106 + 2 50 95 105 106 + 2 40 41 51 96 + 2 40 50 51 96 + 2 50 51 96 106 + 2 41 51 96 97 + 2 51 96 97 107 + 2 51 96 106 107 + 2 41 42 52 97 + 2 41 51 52 97 + 2 51 52 97 107 + 2 42 52 97 98 + 2 52 97 98 108 + 2 52 97 107 108 + 2 42 43 51 98 + 2 42 51 52 98 + 2 51 52 98 108 + 2 43 51 98 99 + 2 51 98 99 109 + 2 51 98 108 109 + 2 43 44 50 99 + 2 43 50 51 99 + 2 50 51 99 109 + 2 44 50 99 100 + 2 50 99 100 110 + 2 50 99 109 110 + 2 44 45 49 100 + 2 44 49 50 100 + 2 49 50 100 110 + 2 45 49 100 101 + 2 49 100 101 111 + 2 49 100 110 111 + 2 45 46 48 101 + 2 45 48 49 101 + 2 48 49 101 111 + 2 46 48 101 102 + 2 48 101 102 112 + 2 48 101 111 112 + 2 37 46 47 102 + 2 46 47 48 102 + 2 47 48 102 112 + 2 37 47 93 102 + 2 47 93 102 103 + 2 47 102 103 112 + 2 46 47 48 103 + 2 37 46 47 103 + 2 37 46 103 113 + 2 46 48 103 104 + 2 46 103 104 114 + 2 46 103 113 114 + 2 45 48 49 104 + 2 45 46 48 104 + 2 45 46 104 114 + 2 45 49 104 105 + 2 45 104 105 115 + 2 45 104 114 115 + 2 44 49 50 105 + 2 44 45 49 105 + 2 44 45 105 115 + 2 44 50 105 106 + 2 44 105 106 116 + 2 44 105 115 116 + 2 43 50 51 106 + 2 43 44 50 106 + 2 43 44 106 116 + 2 43 51 106 107 + 2 43 106 107 117 + 2 43 106 116 117 + 2 42 51 52 107 + 2 42 43 51 107 + 2 42 43 107 117 + 2 42 52 107 108 + 2 42 107 108 118 + 2 42 107 117 118 + 2 41 51 52 108 + 2 41 42 52 108 + 2 41 42 108 118 + 2 41 51 108 109 + 2 41 108 109 119 + 2 41 108 118 119 + 2 40 50 51 109 + 2 40 41 51 109 + 2 40 41 109 119 + 2 40 50 109 110 + 2 40 109 110 120 + 2 40 109 119 120 + 2 39 49 50 110 + 2 39 40 50 110 + 2 39 40 110 120 + 2 39 49 110 111 + 2 39 110 111 121 + 2 39 110 120 121 + 2 38 48 49 111 + 2 38 39 49 111 + 2 38 39 111 121 + 2 38 48 111 112 + 2 38 111 112 122 + 2 38 111 121 122 + 2 37 47 48 112 + 2 37 38 48 112 + 2 37 38 112 122 + 2 37 47 103 112 + 2 37 103 112 113 + 2 37 112 113 122 + 2 36 37 46 113 + 2 27 36 37 113 + 2 27 36 113 123 + 2 36 46 113 114 + 2 36 113 114 124 + 2 36 113 123 124 + 2 35 45 46 114 + 2 35 36 46 114 + 2 35 36 114 124 + 2 35 45 114 115 + 2 35 114 115 125 + 2 35 114 124 125 + 2 34 44 45 115 + 2 34 35 45 115 + 2 34 35 115 125 + 2 34 44 115 116 + 2 34 115 116 126 + 2 34 115 125 126 + 2 33 43 44 116 + 2 33 34 44 116 + 2 33 34 116 126 + 2 33 43 116 117 + 2 33 116 117 127 + 2 33 116 126 127 + 2 32 42 43 117 + 2 32 33 43 117 + 2 32 33 117 127 + 2 32 42 117 118 + 2 32 117 118 128 + 2 32 117 127 128 + 2 31 41 42 118 + 2 31 32 42 118 + 2 31 32 118 128 + 2 31 41 118 119 + 2 31 118 119 129 + 2 31 118 128 129 + 2 30 40 41 119 + 2 30 31 41 119 + 2 30 31 119 129 + 2 30 40 119 120 + 2 30 119 120 130 + 2 30 119 129 130 + 2 29 39 40 120 + 2 29 30 40 120 + 2 29 30 120 130 + 2 29 39 120 121 + 2 29 120 121 131 + 2 29 120 130 131 + 2 28 38 39 121 + 2 28 29 39 121 + 2 28 29 121 131 + 2 28 38 121 122 + 2 28 121 122 132 + 2 28 121 131 132 + 2 27 37 38 122 + 2 27 28 38 122 + 2 27 28 122 132 + 2 27 37 113 122 + 2 27 113 122 123 + 2 27 122 123 132 + 2 26 27 36 123 + 2 17 26 27 123 + 2 17 26 123 133 + 2 26 36 123 124 + 2 26 123 124 134 + 2 26 123 133 134 + 2 25 35 36 124 + 2 25 26 36 124 + 2 25 26 124 134 + 2 25 35 124 125 + 2 25 124 125 135 + 2 25 124 134 135 + 2 24 34 35 125 + 2 24 25 35 125 + 2 24 25 125 135 + 2 24 34 125 126 + 2 24 125 126 136 + 2 24 125 135 136 + 2 23 33 34 126 + 2 23 24 34 126 + 2 23 24 126 136 + 2 23 33 126 127 + 2 23 126 127 137 + 2 23 126 136 137 + 2 22 32 33 127 + 2 22 23 33 127 + 2 22 23 127 137 + 2 22 32 127 128 + 2 22 127 128 138 + 2 22 127 137 138 + 2 21 31 32 128 + 2 21 22 32 128 + 2 21 22 128 138 + 2 21 31 128 129 + 2 21 128 129 139 + 2 21 128 138 139 + 2 20 30 31 129 + 2 20 21 31 129 + 2 20 21 129 139 + 2 20 30 129 130 + 2 20 129 130 140 + 2 20 129 139 140 + 2 19 29 30 130 + 2 19 20 30 130 + 2 19 20 130 140 + 2 19 29 130 131 + 2 19 130 131 141 + 2 19 130 140 141 + 2 18 28 29 131 + 2 18 19 29 131 + 2 18 19 131 141 + 2 18 28 131 132 + 2 18 131 132 142 + 2 18 131 141 142 + 2 17 27 28 132 + 2 17 18 28 132 + 2 17 18 132 142 + 2 17 27 123 132 + 2 17 123 132 133 + 2 17 132 133 142 + 2 16 17 26 133 + 2 7 16 17 133 + 2 7 16 133 143 + 2 16 26 133 134 + 2 16 133 134 144 + 2 16 133 143 144 + 2 15 25 26 134 + 2 15 16 26 134 + 2 15 16 134 144 + 2 15 25 134 135 + 2 15 134 135 145 + 2 15 134 144 145 + 2 14 24 25 135 + 2 14 15 25 135 + 2 14 15 135 145 + 2 14 24 135 136 + 2 14 135 136 146 + 2 14 135 145 146 + 2 13 23 24 136 + 2 13 14 24 136 + 2 13 14 136 146 + 2 13 23 136 137 + 2 13 136 137 147 + 2 13 136 146 147 + 2 12 22 23 137 + 2 12 13 23 137 + 2 12 13 137 147 + 2 12 22 137 138 + 2 12 137 138 148 + 2 12 137 147 148 + 2 11 21 22 138 + 2 11 12 22 138 + 2 11 12 138 148 + 2 11 21 138 139 + 2 11 138 139 149 + 2 11 138 148 149 + 2 10 20 21 139 + 2 10 11 21 139 + 2 10 11 139 149 + 2 10 20 139 140 + 2 10 139 140 150 + 2 10 139 149 150 + 2 9 19 20 140 + 2 9 10 20 140 + 2 9 10 140 150 + 2 9 19 140 141 + 2 9 140 141 151 + 2 9 140 150 151 + 2 8 18 19 141 + 2 8 9 19 141 + 2 8 9 141 151 + 2 8 18 141 142 + 2 8 141 142 152 + 2 8 141 151 152 + 2 7 17 18 142 + 2 7 8 18 142 + 2 7 8 142 152 + 2 7 17 133 142 + 2 7 133 142 143 + 2 7 142 143 152 + 2 2 7 16 143 + 2 1 2 7 143 + 2 1 2 53 143 + 2 2 16 143 144 + 2 2 54 143 144 + 2 2 53 54 143 + 2 3 15 16 144 + 2 2 3 16 144 + 2 2 3 54 144 + 2 3 15 144 145 + 2 3 55 144 145 + 2 3 54 55 144 + 2 4 14 15 145 + 2 3 4 15 145 + 2 3 4 55 145 + 2 4 14 145 146 + 2 4 56 145 146 + 2 4 55 56 145 + 2 5 13 14 146 + 2 4 5 14 146 + 2 4 5 56 146 + 2 5 13 146 147 + 2 5 57 146 147 + 2 5 56 57 146 + 2 6 12 13 147 + 2 5 6 13 147 + 2 5 6 57 147 + 2 6 12 147 148 + 2 6 58 147 148 + 2 6 57 58 147 + 2 5 11 12 148 + 2 5 6 12 148 + 2 5 6 58 148 + 2 5 11 148 149 + 2 5 59 148 149 + 2 5 58 59 148 + 2 4 10 11 149 + 2 4 5 11 149 + 2 4 5 59 149 + 2 4 10 149 150 + 2 4 60 149 150 + 2 4 59 60 149 + 2 3 9 10 150 + 2 3 4 10 150 + 2 3 4 60 150 + 2 3 9 150 151 + 2 3 61 150 151 + 2 3 60 61 150 + 2 2 8 9 151 + 2 2 3 9 151 + 2 2 3 61 151 + 2 2 8 151 152 + 2 2 62 151 152 + 2 2 61 62 151 + 2 1 7 8 152 + 2 1 2 8 152 + 2 1 2 62 152 + 2 1 7 143 152 + 2 1 53 143 152 + 2 1 53 62 152 + 2 53 54 64 153 + 2 53 63 64 153 + 2 63 64 153 163 + 2 54 64 153 154 + 2 64 153 154 164 + 2 64 153 163 164 + 2 54 55 65 154 + 2 54 64 65 154 + 2 64 65 154 164 + 2 55 65 154 155 + 2 65 154 155 165 + 2 65 154 164 165 + 2 55 56 66 155 + 2 55 65 66 155 + 2 65 66 155 165 + 2 56 66 155 156 + 2 66 155 156 166 + 2 66 155 165 166 + 2 56 57 67 156 + 2 56 66 67 156 + 2 66 67 156 166 + 2 57 67 156 157 + 2 67 156 157 167 + 2 67 156 166 167 + 2 57 58 68 157 + 2 57 67 68 157 + 2 67 68 157 167 + 2 58 68 157 158 + 2 68 157 158 168 + 2 68 157 167 168 + 2 58 59 69 158 + 2 58 68 69 158 + 2 68 69 158 168 + 2 59 69 158 159 + 2 69 158 159 169 + 2 69 158 168 169 + 2 59 60 70 159 + 2 59 69 70 159 + 2 69 70 159 169 + 2 60 70 159 160 + 2 70 159 160 170 + 2 70 159 169 170 + 2 60 61 71 160 + 2 60 70 71 160 + 2 70 71 160 170 + 2 61 71 160 161 + 2 71 160 161 171 + 2 71 160 170 171 + 2 61 62 72 161 + 2 61 71 72 161 + 2 71 72 161 171 + 2 62 72 161 162 + 2 72 161 162 172 + 2 72 161 171 172 + 2 53 62 63 162 + 2 62 63 72 162 + 2 63 72 162 172 + 2 53 63 153 162 + 2 63 153 162 163 + 2 63 162 163 172 + 2 63 64 74 163 + 2 63 73 74 163 + 2 73 74 163 173 + 2 64 74 163 164 + 2 74 163 164 174 + 2 74 163 173 174 + 2 64 65 75 164 + 2 64 74 75 164 + 2 74 75 164 174 + 2 65 75 164 165 + 2 75 164 165 175 + 2 75 164 174 175 + 2 65 66 76 165 + 2 65 75 76 165 + 2 75 76 165 175 + 2 66 76 165 166 + 2 76 165 166 176 + 2 76 165 175 176 + 2 66 67 77 166 + 2 66 76 77 166 + 2 76 77 166 176 + 2 67 77 166 167 + 2 77 166 167 177 + 2 77 166 176 177 + 2 67 68 78 167 + 2 67 77 78 167 + 2 77 78 167 177 + 2 68 78 167 168 + 2 78 167 168 178 + 2 78 167 177 178 + 2 68 69 79 168 + 2 68 78 79 168 + 2 78 79 168 178 + 2 69 79 168 169 + 2 79 168 169 179 + 2 79 168 178 179 + 2 69 70 80 169 + 2 69 79 80 169 + 2 79 80 169 179 + 2 70 80 169 170 + 2 80 169 170 180 + 2 80 169 179 180 + 2 70 71 81 170 + 2 70 80 81 170 + 2 80 81 170 180 + 2 71 81 170 171 + 2 81 170 171 181 + 2 81 170 180 181 + 2 71 72 82 171 + 2 71 81 82 171 + 2 81 82 171 181 + 2 72 82 171 172 + 2 82 171 172 182 + 2 82 171 181 182 + 2 63 72 73 172 + 2 72 73 82 172 + 2 73 82 172 182 + 2 63 73 163 172 + 2 73 163 172 173 + 2 73 172 173 182 + 2 73 74 84 173 + 2 73 83 84 173 + 2 83 84 173 183 + 2 74 84 173 174 + 2 84 173 174 184 + 2 84 173 183 184 + 2 74 75 85 174 + 2 74 84 85 174 + 2 84 85 174 184 + 2 75 85 174 175 + 2 85 174 175 185 + 2 85 174 184 185 + 2 75 76 86 175 + 2 75 85 86 175 + 2 85 86 175 185 + 2 76 86 175 176 + 2 86 175 176 186 + 2 86 175 185 186 + 2 76 77 87 176 + 2 76 86 87 176 + 2 86 87 176 186 + 2 77 87 176 177 + 2 87 176 177 187 + 2 87 176 186 187 + 2 77 78 88 177 + 2 77 87 88 177 + 2 87 88 177 187 + 2 78 88 177 178 + 2 88 177 178 188 + 2 88 177 187 188 + 2 78 79 89 178 + 2 78 88 89 178 + 2 88 89 178 188 + 2 79 89 178 179 + 2 89 178 179 189 + 2 89 178 188 189 + 2 79 80 90 179 + 2 79 89 90 179 + 2 89 90 179 189 + 2 80 90 179 180 + 2 90 179 180 190 + 2 90 179 189 190 + 2 80 81 91 180 + 2 80 90 91 180 + 2 90 91 180 190 + 2 81 91 180 181 + 2 91 180 181 191 + 2 91 180 190 191 + 2 81 82 92 181 + 2 81 91 92 181 + 2 91 92 181 191 + 2 82 92 181 182 + 2 92 181 182 192 + 2 92 181 191 192 + 2 73 82 83 182 + 2 82 83 92 182 + 2 83 92 182 192 + 2 73 83 173 182 + 2 83 173 182 183 + 2 83 182 183 192 + 2 83 84 94 183 + 2 83 93 94 183 + 2 93 94 183 193 + 2 84 94 183 184 + 2 94 183 184 194 + 2 94 183 193 194 + 2 84 85 95 184 + 2 84 94 95 184 + 2 94 95 184 194 + 2 85 95 184 185 + 2 95 184 185 195 + 2 95 184 194 195 + 2 85 86 96 185 + 2 85 95 96 185 + 2 95 96 185 195 + 2 86 96 185 186 + 2 96 185 186 196 + 2 96 185 195 196 + 2 86 87 97 186 + 2 86 96 97 186 + 2 96 97 186 196 + 2 87 97 186 187 + 2 97 186 187 197 + 2 97 186 196 197 + 2 87 88 98 187 + 2 87 97 98 187 + 2 97 98 187 197 + 2 88 98 187 188 + 2 98 187 188 198 + 2 98 187 197 198 + 2 88 89 99 188 + 2 88 98 99 188 + 2 98 99 188 198 + 2 89 99 188 189 + 2 99 188 189 199 + 2 99 188 198 199 + 2 89 90 100 189 + 2 89 99 100 189 + 2 99 100 189 199 + 2 90 100 189 190 + 2 100 189 190 200 + 2 100 189 199 200 + 2 90 91 101 190 + 2 90 100 101 190 + 2 100 101 190 200 + 2 91 101 190 191 + 2 101 190 191 201 + 2 101 190 200 201 + 2 91 92 102 191 + 2 91 101 102 191 + 2 101 102 191 201 + 2 92 102 191 192 + 2 102 191 192 202 + 2 102 191 201 202 + 2 83 92 93 192 + 2 92 93 102 192 + 2 93 102 192 202 + 2 83 93 183 192 + 2 93 183 192 193 + 2 93 192 193 202 + 2 93 94 104 193 + 2 93 103 104 193 + 2 103 104 193 203 + 2 94 104 193 194 + 2 104 193 194 204 + 2 104 193 203 204 + 2 94 95 105 194 + 2 94 104 105 194 + 2 104 105 194 204 + 2 95 105 194 195 + 2 105 194 195 205 + 2 105 194 204 205 + 2 95 96 106 195 + 2 95 105 106 195 + 2 105 106 195 205 + 2 96 106 195 196 + 2 106 195 196 206 + 2 106 195 205 206 + 2 96 97 107 196 + 2 96 106 107 196 + 2 106 107 196 206 + 2 97 107 196 197 + 2 107 196 197 207 + 2 107 196 206 207 + 2 97 98 108 197 + 2 97 107 108 197 + 2 107 108 197 207 + 2 98 108 197 198 + 2 108 197 198 208 + 2 108 197 207 208 + 2 98 99 109 198 + 2 98 108 109 198 + 2 108 109 198 208 + 2 99 109 198 199 + 2 109 198 199 209 + 2 109 198 208 209 + 2 99 100 110 199 + 2 99 109 110 199 + 2 109 110 199 209 + 2 100 110 199 200 + 2 110 199 200 210 + 2 110 199 209 210 + 2 100 101 111 200 + 2 100 110 111 200 + 2 110 111 200 210 + 2 101 111 200 201 + 2 111 200 201 211 + 2 111 200 210 211 + 2 101 102 112 201 + 2 101 111 112 201 + 2 111 112 201 211 + 2 102 112 201 202 + 2 112 201 202 212 + 2 112 201 211 212 + 2 93 102 103 202 + 2 102 103 112 202 + 2 103 112 202 212 + 2 93 103 193 202 + 2 103 193 202 203 + 2 103 202 203 212 + 2 103 104 114 203 + 2 103 113 114 203 + 2 113 114 203 213 + 2 104 114 203 204 + 2 114 203 204 214 + 2 114 203 213 214 + 2 104 105 115 204 + 2 104 114 115 204 + 2 114 115 204 214 + 2 105 115 204 205 + 2 115 204 205 215 + 2 115 204 214 215 + 2 105 106 116 205 + 2 105 115 116 205 + 2 115 116 205 215 + 2 106 116 205 206 + 2 116 205 206 216 + 2 116 205 215 216 + 2 106 107 117 206 + 2 106 116 117 206 + 2 116 117 206 216 + 2 107 117 206 207 + 2 117 206 207 217 + 2 117 206 216 217 + 2 107 108 118 207 + 2 107 117 118 207 + 2 117 118 207 217 + 2 108 118 207 208 + 2 118 207 208 218 + 2 118 207 217 218 + 2 108 109 119 208 + 2 108 118 119 208 + 2 118 119 208 218 + 2 109 119 208 209 + 2 119 208 209 219 + 2 119 208 218 219 + 2 109 110 120 209 + 2 109 119 120 209 + 2 119 120 209 219 + 2 110 120 209 210 + 2 120 209 210 220 + 2 120 209 219 220 + 2 110 111 121 210 + 2 110 120 121 210 + 2 120 121 210 220 + 2 111 121 210 211 + 2 121 210 211 221 + 2 121 210 220 221 + 2 111 112 122 211 + 2 111 121 122 211 + 2 121 122 211 221 + 2 112 122 211 212 + 2 122 211 212 222 + 2 122 211 221 222 + 2 103 112 113 212 + 2 112 113 122 212 + 2 113 122 212 222 + 2 103 113 203 212 + 2 113 203 212 213 + 2 113 212 213 222 + 2 113 114 124 213 + 2 113 123 124 213 + 2 123 124 213 223 + 2 114 124 213 214 + 2 124 213 214 224 + 2 124 213 223 224 + 2 114 115 125 214 + 2 114 124 125 214 + 2 124 125 214 224 + 2 115 125 214 215 + 2 125 214 215 225 + 2 125 214 224 225 + 2 115 116 126 215 + 2 115 125 126 215 + 2 125 126 215 225 + 2 116 126 215 216 + 2 126 215 216 226 + 2 126 215 225 226 + 2 116 117 127 216 + 2 116 126 127 216 + 2 126 127 216 226 + 2 117 127 216 217 + 2 127 216 217 227 + 2 127 216 226 227 + 2 117 118 128 217 + 2 117 127 128 217 + 2 127 128 217 227 + 2 118 128 217 218 + 2 128 217 218 228 + 2 128 217 227 228 + 2 118 119 129 218 + 2 118 128 129 218 + 2 128 129 218 228 + 2 119 129 218 219 + 2 129 218 219 229 + 2 129 218 228 229 + 2 119 120 130 219 + 2 119 129 130 219 + 2 129 130 219 229 + 2 120 130 219 220 + 2 130 219 220 230 + 2 130 219 229 230 + 2 120 121 131 220 + 2 120 130 131 220 + 2 130 131 220 230 + 2 121 131 220 221 + 2 131 220 221 231 + 2 131 220 230 231 + 2 121 122 132 221 + 2 121 131 132 221 + 2 131 132 221 231 + 2 122 132 221 222 + 2 132 221 222 232 + 2 132 221 231 232 + 2 113 122 123 222 + 2 122 123 132 222 + 2 123 132 222 232 + 2 113 123 213 222 + 2 123 213 222 223 + 2 123 222 223 232 + 2 123 124 134 223 + 2 123 133 134 223 + 2 133 134 223 233 + 2 124 134 223 224 + 2 134 223 224 234 + 2 134 223 233 234 + 2 124 125 135 224 + 2 124 134 135 224 + 2 134 135 224 234 + 2 125 135 224 225 + 2 135 224 225 235 + 2 135 224 234 235 + 2 125 126 136 225 + 2 125 135 136 225 + 2 135 136 225 235 + 2 126 136 225 226 + 2 136 225 226 236 + 2 136 225 235 236 + 2 126 127 137 226 + 2 126 136 137 226 + 2 136 137 226 236 + 2 127 137 226 227 + 2 137 226 227 237 + 2 137 226 236 237 + 2 127 128 138 227 + 2 127 137 138 227 + 2 137 138 227 237 + 2 128 138 227 228 + 2 138 227 228 238 + 2 138 227 237 238 + 2 128 129 139 228 + 2 128 138 139 228 + 2 138 139 228 238 + 2 129 139 228 229 + 2 139 228 229 239 + 2 139 228 238 239 + 2 129 130 140 229 + 2 129 139 140 229 + 2 139 140 229 239 + 2 130 140 229 230 + 2 140 229 230 240 + 2 140 229 239 240 + 2 130 131 141 230 + 2 130 140 141 230 + 2 140 141 230 240 + 2 131 141 230 231 + 2 141 230 231 241 + 2 141 230 240 241 + 2 131 132 142 231 + 2 131 141 142 231 + 2 141 142 231 241 + 2 132 142 231 232 + 2 142 231 232 242 + 2 142 231 241 242 + 2 123 132 133 232 + 2 132 133 142 232 + 2 133 142 232 242 + 2 123 133 223 232 + 2 133 223 232 233 + 2 133 232 233 242 + 2 133 134 144 233 + 2 133 143 144 233 + 2 143 144 233 243 + 2 134 144 233 234 + 2 144 233 234 244 + 2 144 233 243 244 + 2 134 135 145 234 + 2 134 144 145 234 + 2 144 145 234 244 + 2 135 145 234 235 + 2 145 234 235 245 + 2 145 234 244 245 + 2 135 136 146 235 + 2 135 145 146 235 + 2 145 146 235 245 + 2 136 146 235 236 + 2 146 235 236 246 + 2 146 235 245 246 + 2 136 137 147 236 + 2 136 146 147 236 + 2 146 147 236 246 + 2 137 147 236 237 + 2 147 236 237 247 + 2 147 236 246 247 + 2 137 138 148 237 + 2 137 147 148 237 + 2 147 148 237 247 + 2 138 148 237 238 + 2 148 237 238 248 + 2 148 237 247 248 + 2 138 139 149 238 + 2 138 148 149 238 + 2 148 149 238 248 + 2 139 149 238 239 + 2 149 238 239 249 + 2 149 238 248 249 + 2 139 140 150 239 + 2 139 149 150 239 + 2 149 150 239 249 + 2 140 150 239 240 + 2 150 239 240 250 + 2 150 239 249 250 + 2 140 141 151 240 + 2 140 150 151 240 + 2 150 151 240 250 + 2 141 151 240 241 + 2 151 240 241 251 + 2 151 240 250 251 + 2 141 142 152 241 + 2 141 151 152 241 + 2 151 152 241 251 + 2 142 152 241 242 + 2 152 241 242 252 + 2 152 241 251 252 + 2 133 142 143 242 + 2 142 143 152 242 + 2 143 152 242 252 + 2 133 143 233 242 + 2 143 233 242 243 + 2 143 242 243 252 + 2 54 143 144 243 + 2 53 54 143 243 + 2 53 54 153 243 + 2 54 144 243 244 + 2 54 154 243 244 + 2 54 153 154 243 + 2 55 144 145 244 + 2 54 55 144 244 + 2 54 55 154 244 + 2 55 145 244 245 + 2 55 155 244 245 + 2 55 154 155 244 + 2 56 145 146 245 + 2 55 56 145 245 + 2 55 56 155 245 + 2 56 146 245 246 + 2 56 156 245 246 + 2 56 155 156 245 + 2 57 146 147 246 + 2 56 57 146 246 + 2 56 57 156 246 + 2 57 147 246 247 + 2 57 157 246 247 + 2 57 156 157 246 + 2 58 147 148 247 + 2 57 58 147 247 + 2 57 58 157 247 + 2 58 148 247 248 + 2 58 158 247 248 + 2 58 157 158 247 + 2 59 148 149 248 + 2 58 59 148 248 + 2 58 59 158 248 + 2 59 149 248 249 + 2 59 159 248 249 + 2 59 158 159 248 + 2 60 149 150 249 + 2 59 60 149 249 + 2 59 60 159 249 + 2 60 150 249 250 + 2 60 160 249 250 + 2 60 159 160 249 + 2 61 150 151 250 + 2 60 61 150 250 + 2 60 61 160 250 + 2 61 151 250 251 + 2 61 161 250 251 + 2 61 160 161 250 + 2 62 151 152 251 + 2 61 62 151 251 + 2 61 62 161 251 + 2 62 152 251 252 + 2 62 162 251 252 + 2 62 161 162 251 + 2 53 143 152 252 + 2 53 62 152 252 + 2 53 62 162 252 + 2 53 143 243 252 + 2 53 153 243 252 + 2 53 153 162 252 + 2 153 154 164 253 + 2 153 163 164 253 + 2 163 164 253 263 + 2 154 164 253 254 + 2 164 253 254 264 + 2 164 253 263 264 + 2 154 155 165 254 + 2 154 164 165 254 + 2 164 165 254 264 + 2 155 165 254 255 + 2 165 254 255 265 + 2 165 254 264 265 + 2 155 156 166 255 + 2 155 165 166 255 + 2 165 166 255 265 + 2 156 166 255 256 + 2 166 255 256 266 + 2 166 255 265 266 + 2 156 157 167 256 + 2 156 166 167 256 + 2 166 167 256 266 + 2 157 167 256 257 + 2 167 256 257 267 + 2 167 256 266 267 + 2 157 158 168 257 + 2 157 167 168 257 + 2 167 168 257 267 + 2 158 168 257 258 + 2 168 257 258 268 + 2 168 257 267 268 + 2 158 159 169 258 + 2 158 168 169 258 + 2 168 169 258 268 + 2 159 169 258 259 + 2 169 258 259 269 + 2 169 258 268 269 + 2 159 160 170 259 + 2 159 169 170 259 + 2 169 170 259 269 + 2 160 170 259 260 + 2 170 259 260 270 + 2 170 259 269 270 + 2 160 161 171 260 + 2 160 170 171 260 + 2 170 171 260 270 + 2 161 171 260 261 + 2 171 260 261 271 + 2 171 260 270 271 + 2 161 162 172 261 + 2 161 171 172 261 + 2 171 172 261 271 + 2 162 172 261 262 + 2 172 261 262 272 + 2 172 261 271 272 + 2 153 162 163 262 + 2 162 163 172 262 + 2 163 172 262 272 + 2 153 163 253 262 + 2 163 253 262 263 + 2 163 262 263 272 + 2 163 164 174 263 + 2 163 173 174 263 + 2 173 174 263 273 + 2 164 174 263 264 + 2 174 263 264 274 + 2 174 263 273 274 + 2 164 165 175 264 + 2 164 174 175 264 + 2 174 175 264 274 + 2 165 175 264 265 + 2 175 264 265 275 + 2 175 264 274 275 + 2 165 166 176 265 + 2 165 175 176 265 + 2 175 176 265 275 + 2 166 176 265 266 + 2 176 265 266 276 + 2 176 265 275 276 + 2 166 167 177 266 + 2 166 176 177 266 + 2 176 177 266 276 + 2 167 177 266 267 + 2 177 266 267 277 + 2 177 266 276 277 + 2 167 168 178 267 + 2 167 177 178 267 + 2 177 178 267 277 + 2 168 178 267 268 + 2 178 267 268 278 + 2 178 267 277 278 + 2 168 169 179 268 + 2 168 178 179 268 + 2 178 179 268 278 + 2 169 179 268 269 + 2 179 268 269 279 + 2 179 268 278 279 + 2 169 170 180 269 + 2 169 179 180 269 + 2 179 180 269 279 + 2 170 180 269 270 + 2 180 269 270 280 + 2 180 269 279 280 + 2 170 171 181 270 + 2 170 180 181 270 + 2 180 181 270 280 + 2 171 181 270 271 + 2 181 270 271 281 + 2 181 270 280 281 + 2 171 172 182 271 + 2 171 181 182 271 + 2 181 182 271 281 + 2 172 182 271 272 + 2 182 271 272 282 + 2 182 271 281 282 + 2 163 172 173 272 + 2 172 173 182 272 + 2 173 182 272 282 + 2 163 173 263 272 + 2 173 263 272 273 + 2 173 272 273 282 + 2 173 174 184 273 + 2 173 183 184 273 + 2 183 184 273 283 + 2 174 184 273 274 + 2 184 273 274 284 + 2 184 273 283 284 + 2 174 175 185 274 + 2 174 184 185 274 + 2 184 185 274 284 + 2 175 185 274 275 + 2 185 274 275 285 + 2 185 274 284 285 + 2 175 176 186 275 + 2 175 185 186 275 + 2 185 186 275 285 + 2 176 186 275 276 + 2 186 275 276 286 + 2 186 275 285 286 + 2 176 177 187 276 + 2 176 186 187 276 + 2 186 187 276 286 + 2 177 187 276 277 + 2 187 276 277 287 + 2 187 276 286 287 + 2 177 178 188 277 + 2 177 187 188 277 + 2 187 188 277 287 + 2 178 188 277 278 + 2 188 277 278 288 + 2 188 277 287 288 + 2 178 179 189 278 + 2 178 188 189 278 + 2 188 189 278 288 + 2 179 189 278 279 + 2 189 278 279 289 + 2 189 278 288 289 + 2 179 180 190 279 + 2 179 189 190 279 + 2 189 190 279 289 + 2 180 190 279 280 + 2 190 279 280 290 + 2 190 279 289 290 + 2 180 181 191 280 + 2 180 190 191 280 + 2 190 191 280 290 + 2 181 191 280 281 + 2 191 280 281 291 + 2 191 280 290 291 + 2 181 182 192 281 + 2 181 191 192 281 + 2 191 192 281 291 + 2 182 192 281 282 + 2 192 281 282 292 + 2 192 281 291 292 + 2 173 182 183 282 + 2 182 183 192 282 + 2 183 192 282 292 + 2 173 183 273 282 + 2 183 273 282 283 + 2 183 282 283 292 + 2 183 184 194 283 + 2 183 193 194 283 + 2 193 194 283 293 + 2 184 194 283 284 + 2 194 283 284 294 + 2 194 283 293 294 + 2 184 185 195 284 + 2 184 194 195 284 + 2 194 195 284 294 + 2 185 195 284 285 + 2 195 284 285 295 + 2 195 284 294 295 + 2 185 186 196 285 + 2 185 195 196 285 + 2 195 196 285 295 + 2 186 196 285 286 + 2 196 285 286 296 + 2 196 285 295 296 + 2 186 187 197 286 + 2 186 196 197 286 + 2 196 197 286 296 + 2 187 197 286 287 + 2 197 286 287 297 + 2 197 286 296 297 + 2 187 188 198 287 + 2 187 197 198 287 + 2 197 198 287 297 + 2 188 198 287 288 + 2 198 287 288 298 + 2 198 287 297 298 + 2 188 189 199 288 + 2 188 198 199 288 + 2 198 199 288 298 + 2 189 199 288 289 + 2 199 288 289 299 + 2 199 288 298 299 + 2 189 190 200 289 + 2 189 199 200 289 + 2 199 200 289 299 + 2 190 200 289 290 + 2 200 289 290 300 + 2 200 289 299 300 + 2 190 191 201 290 + 2 190 200 201 290 + 2 200 201 290 300 + 2 191 201 290 291 + 2 201 290 291 301 + 2 201 290 300 301 + 2 191 192 202 291 + 2 191 201 202 291 + 2 201 202 291 301 + 2 192 202 291 292 + 2 202 291 292 302 + 2 202 291 301 302 + 2 183 192 193 292 + 2 192 193 202 292 + 2 193 202 292 302 + 2 183 193 283 292 + 2 193 283 292 293 + 2 193 292 293 302 + 2 193 194 204 293 + 2 193 203 204 293 + 2 203 204 293 303 + 2 194 204 293 294 + 2 204 293 294 304 + 2 204 293 303 304 + 2 194 195 205 294 + 2 194 204 205 294 + 2 204 205 294 304 + 2 195 205 294 295 + 2 205 294 295 305 + 2 205 294 304 305 + 2 195 196 206 295 + 2 195 205 206 295 + 2 205 206 295 305 + 2 196 206 295 296 + 2 206 295 296 306 + 2 206 295 305 306 + 2 196 197 207 296 + 2 196 206 207 296 + 2 206 207 296 306 + 2 197 207 296 297 + 2 207 296 297 307 + 2 207 296 306 307 + 2 197 198 208 297 + 2 197 207 208 297 + 2 207 208 297 307 + 2 198 208 297 298 + 2 208 297 298 308 + 2 208 297 307 308 + 2 198 199 209 298 + 2 198 208 209 298 + 2 208 209 298 308 + 2 199 209 298 299 + 2 209 298 299 309 + 2 209 298 308 309 + 2 199 200 210 299 + 2 199 209 210 299 + 2 209 210 299 309 + 2 200 210 299 300 + 2 210 299 300 310 + 2 210 299 309 310 + 2 200 201 211 300 + 2 200 210 211 300 + 2 210 211 300 310 + 2 201 211 300 301 + 2 211 300 301 311 + 2 211 300 310 311 + 2 201 202 212 301 + 2 201 211 212 301 + 2 211 212 301 311 + 2 202 212 301 302 + 2 212 301 302 312 + 2 212 301 311 312 + 2 193 202 203 302 + 2 202 203 212 302 + 2 203 212 302 312 + 2 193 203 293 302 + 2 203 293 302 303 + 2 203 302 303 312 + 2 203 204 214 303 + 2 203 213 214 303 + 2 213 214 303 313 + 2 204 214 303 304 + 2 214 303 304 314 + 2 214 303 313 314 + 2 204 205 215 304 + 2 204 214 215 304 + 2 214 215 304 314 + 2 205 215 304 305 + 2 215 304 305 315 + 2 215 304 314 315 + 2 205 206 216 305 + 2 205 215 216 305 + 2 215 216 305 315 + 2 206 216 305 306 + 2 216 305 306 316 + 2 216 305 315 316 + 2 206 207 217 306 + 2 206 216 217 306 + 2 216 217 306 316 + 2 207 217 306 307 + 2 217 306 307 317 + 2 217 306 316 317 + 2 207 208 218 307 + 2 207 217 218 307 + 2 217 218 307 317 + 2 208 218 307 308 + 2 218 307 308 318 + 2 218 307 317 318 + 2 208 209 219 308 + 2 208 218 219 308 + 2 218 219 308 318 + 2 209 219 308 309 + 2 219 308 309 319 + 2 219 308 318 319 + 2 209 210 220 309 + 2 209 219 220 309 + 2 219 220 309 319 + 2 210 220 309 310 + 2 220 309 310 320 + 2 220 309 319 320 + 2 210 211 221 310 + 2 210 220 221 310 + 2 220 221 310 320 + 2 211 221 310 311 + 2 221 310 311 321 + 2 221 310 320 321 + 2 211 212 222 311 + 2 211 221 222 311 + 2 221 222 311 321 + 2 212 222 311 312 + 2 222 311 312 322 + 2 222 311 321 322 + 2 203 212 213 312 + 2 212 213 222 312 + 2 213 222 312 322 + 2 203 213 303 312 + 2 213 303 312 313 + 2 213 312 313 322 + 2 213 214 224 313 + 2 213 223 224 313 + 2 223 224 313 323 + 2 214 224 313 314 + 2 224 313 314 324 + 2 224 313 323 324 + 2 214 215 225 314 + 2 214 224 225 314 + 2 224 225 314 324 + 2 215 225 314 315 + 2 225 314 315 325 + 2 225 314 324 325 + 2 215 216 226 315 + 2 215 225 226 315 + 2 225 226 315 325 + 2 216 226 315 316 + 2 226 315 316 326 + 2 226 315 325 326 + 2 216 217 227 316 + 2 216 226 227 316 + 2 226 227 316 326 + 2 217 227 316 317 + 2 227 316 317 327 + 2 227 316 326 327 + 2 217 218 228 317 + 2 217 227 228 317 + 2 227 228 317 327 + 2 218 228 317 318 + 2 228 317 318 328 + 2 228 317 327 328 + 2 218 219 229 318 + 2 218 228 229 318 + 2 228 229 318 328 + 2 219 229 318 319 + 2 229 318 319 329 + 2 229 318 328 329 + 2 219 220 230 319 + 2 219 229 230 319 + 2 229 230 319 329 + 2 220 230 319 320 + 2 230 319 320 330 + 2 230 319 329 330 + 2 220 221 231 320 + 2 220 230 231 320 + 2 230 231 320 330 + 2 221 231 320 321 + 2 231 320 321 331 + 2 231 320 330 331 + 2 221 222 232 321 + 2 221 231 232 321 + 2 231 232 321 331 + 2 222 232 321 322 + 2 232 321 322 332 + 2 232 321 331 332 + 2 213 222 223 322 + 2 222 223 232 322 + 2 223 232 322 332 + 2 213 223 313 322 + 2 223 313 322 323 + 2 223 322 323 332 + 2 223 224 234 323 + 2 223 233 234 323 + 2 233 234 323 333 + 2 224 234 323 324 + 2 234 323 324 334 + 2 234 323 333 334 + 2 224 225 235 324 + 2 224 234 235 324 + 2 234 235 324 334 + 2 225 235 324 325 + 2 235 324 325 335 + 2 235 324 334 335 + 2 225 226 236 325 + 2 225 235 236 325 + 2 235 236 325 335 + 2 226 236 325 326 + 2 236 325 326 336 + 2 236 325 335 336 + 2 226 227 237 326 + 2 226 236 237 326 + 2 236 237 326 336 + 2 227 237 326 327 + 2 237 326 327 337 + 2 237 326 336 337 + 2 227 228 238 327 + 2 227 237 238 327 + 2 237 238 327 337 + 2 228 238 327 328 + 2 238 327 328 338 + 2 238 327 337 338 + 2 228 229 239 328 + 2 228 238 239 328 + 2 238 239 328 338 + 2 229 239 328 329 + 2 239 328 329 339 + 2 239 328 338 339 + 2 229 230 240 329 + 2 229 239 240 329 + 2 239 240 329 339 + 2 230 240 329 330 + 2 240 329 330 340 + 2 240 329 339 340 + 2 230 231 241 330 + 2 230 240 241 330 + 2 240 241 330 340 + 2 231 241 330 331 + 2 241 330 331 341 + 2 241 330 340 341 + 2 231 232 242 331 + 2 231 241 242 331 + 2 241 242 331 341 + 2 232 242 331 332 + 2 242 331 332 342 + 2 242 331 341 342 + 2 223 232 233 332 + 2 232 233 242 332 + 2 233 242 332 342 + 2 223 233 323 332 + 2 233 323 332 333 + 2 233 332 333 342 + 2 233 234 244 333 + 2 233 243 244 333 + 2 243 244 333 343 + 2 234 244 333 334 + 2 244 333 334 344 + 2 244 333 343 344 + 2 234 235 245 334 + 2 234 244 245 334 + 2 244 245 334 344 + 2 235 245 334 335 + 2 245 334 335 345 + 2 245 334 344 345 + 2 235 236 246 335 + 2 235 245 246 335 + 2 245 246 335 345 + 2 236 246 335 336 + 2 246 335 336 346 + 2 246 335 345 346 + 2 236 237 247 336 + 2 236 246 247 336 + 2 246 247 336 346 + 2 237 247 336 337 + 2 247 336 337 347 + 2 247 336 346 347 + 2 237 238 248 337 + 2 237 247 248 337 + 2 247 248 337 347 + 2 238 248 337 338 + 2 248 337 338 348 + 2 248 337 347 348 + 2 238 239 249 338 + 2 238 248 249 338 + 2 248 249 338 348 + 2 239 249 338 339 + 2 249 338 339 349 + 2 249 338 348 349 + 2 239 240 250 339 + 2 239 249 250 339 + 2 249 250 339 349 + 2 240 250 339 340 + 2 250 339 340 350 + 2 250 339 349 350 + 2 240 241 251 340 + 2 240 250 251 340 + 2 250 251 340 350 + 2 241 251 340 341 + 2 251 340 341 351 + 2 251 340 350 351 + 2 241 242 252 341 + 2 241 251 252 341 + 2 251 252 341 351 + 2 242 252 341 342 + 2 252 341 342 352 + 2 252 341 351 352 + 2 233 242 243 342 + 2 242 243 252 342 + 2 243 252 342 352 + 2 233 243 333 342 + 2 243 333 342 343 + 2 243 342 343 352 + 2 154 243 244 343 + 2 153 154 243 343 + 2 153 154 253 343 + 2 154 244 343 344 + 2 154 254 343 344 + 2 154 253 254 343 + 2 155 244 245 344 + 2 154 155 244 344 + 2 154 155 254 344 + 2 155 245 344 345 + 2 155 255 344 345 + 2 155 254 255 344 + 2 156 245 246 345 + 2 155 156 245 345 + 2 155 156 255 345 + 2 156 246 345 346 + 2 156 256 345 346 + 2 156 255 256 345 + 2 157 246 247 346 + 2 156 157 246 346 + 2 156 157 256 346 + 2 157 247 346 347 + 2 157 257 346 347 + 2 157 256 257 346 + 2 158 247 248 347 + 2 157 158 247 347 + 2 157 158 257 347 + 2 158 248 347 348 + 2 158 258 347 348 + 2 158 257 258 347 + 2 159 248 249 348 + 2 158 159 248 348 + 2 158 159 258 348 + 2 159 249 348 349 + 2 159 259 348 349 + 2 159 258 259 348 + 2 160 249 250 349 + 2 159 160 249 349 + 2 159 160 259 349 + 2 160 250 349 350 + 2 160 260 349 350 + 2 160 259 260 349 + 2 161 250 251 350 + 2 160 161 250 350 + 2 160 161 260 350 + 2 161 251 350 351 + 2 161 261 350 351 + 2 161 260 261 350 + 2 162 251 252 351 + 2 161 162 251 351 + 2 161 162 261 351 + 2 162 252 351 352 + 2 162 262 351 352 + 2 162 261 262 351 + 2 153 243 252 352 + 2 153 162 252 352 + 2 153 162 262 352 + 2 153 243 343 352 + 2 153 253 343 352 + 2 153 253 262 352 + 2 253 253 254 264 + 2 253 253 263 264 + 2 253 263 264 343 + 2 253 254 262 264 + 2 253 262 264 352 + 2 253 264 343 352 + 2 254 255 262 265 + 2 254 262 264 265 + 2 262 264 265 352 + 2 255 261 262 265 + 2 261 262 265 351 + 2 262 265 351 352 + 2 255 256 261 266 + 2 255 261 265 266 + 2 261 265 266 351 + 2 256 260 261 266 + 2 260 261 266 350 + 2 261 266 350 351 + 2 256 257 260 267 + 2 256 260 266 267 + 2 260 266 267 350 + 2 257 259 260 267 + 2 259 260 267 349 + 2 260 267 349 350 + 2 257 258 259 268 + 2 257 259 267 268 + 2 259 267 268 349 + 2 258 258 259 268 + 2 258 259 268 348 + 2 259 268 348 349 + 2 258 258 259 269 + 2 258 258 268 269 + 2 258 268 269 348 + 2 257 258 259 269 + 2 257 258 269 347 + 2 258 269 347 348 + 2 257 259 260 270 + 2 257 259 269 270 + 2 257 269 270 347 + 2 256 257 260 270 + 2 256 257 270 346 + 2 257 270 346 347 + 2 256 260 261 271 + 2 256 260 270 271 + 2 256 270 271 346 + 2 255 256 261 271 + 2 255 256 271 345 + 2 256 271 345 346 + 2 255 261 262 272 + 2 255 261 271 272 + 2 255 271 272 345 + 2 254 255 262 272 + 2 254 255 272 344 + 2 255 272 344 345 + 2 253 254 262 263 + 2 254 262 263 272 + 2 254 263 272 344 + 2 253 253 254 263 + 2 253 254 263 343 + 2 254 263 343 344 + 2 263 264 274 343 + 2 263 273 274 343 + 2 273 274 333 343 + 2 264 274 343 352 + 2 274 342 343 352 + 2 274 333 342 343 + 2 264 265 275 352 + 2 264 274 275 352 + 2 274 275 342 352 + 2 265 275 351 352 + 2 275 341 351 352 + 2 275 341 342 352 + 2 265 266 276 351 + 2 265 275 276 351 + 2 275 276 341 351 + 2 266 276 350 351 + 2 276 340 350 351 + 2 276 340 341 351 + 2 266 267 277 350 + 2 266 276 277 350 + 2 276 277 340 350 + 2 267 277 349 350 + 2 277 339 349 350 + 2 277 339 340 350 + 2 267 268 278 349 + 2 267 277 278 349 + 2 277 278 339 349 + 2 268 278 348 349 + 2 278 338 348 349 + 2 278 338 339 349 + 2 268 269 279 348 + 2 268 278 279 348 + 2 278 279 338 348 + 2 269 279 347 348 + 2 279 337 347 348 + 2 279 337 338 348 + 2 269 270 280 347 + 2 269 279 280 347 + 2 279 280 337 347 + 2 270 280 346 347 + 2 280 336 346 347 + 2 280 336 337 347 + 2 270 271 281 346 + 2 270 280 281 346 + 2 280 281 336 346 + 2 271 281 345 346 + 2 281 335 345 346 + 2 281 335 336 346 + 2 271 272 282 345 + 2 271 281 282 345 + 2 281 282 335 345 + 2 272 282 344 345 + 2 282 334 344 345 + 2 282 334 335 345 + 2 263 272 273 344 + 2 272 273 282 344 + 2 273 282 334 344 + 2 263 273 343 344 + 2 273 333 343 344 + 2 273 333 334 344 + 2 273 274 284 333 + 2 273 283 284 333 + 2 283 284 323 333 + 2 274 284 333 342 + 2 284 332 333 342 + 2 284 323 332 333 + 2 274 275 285 342 + 2 274 284 285 342 + 2 284 285 332 342 + 2 275 285 341 342 + 2 285 331 341 342 + 2 285 331 332 342 + 2 275 276 286 341 + 2 275 285 286 341 + 2 285 286 331 341 + 2 276 286 340 341 + 2 286 330 340 341 + 2 286 330 331 341 + 2 276 277 287 340 + 2 276 286 287 340 + 2 286 287 330 340 + 2 277 287 339 340 + 2 287 329 339 340 + 2 287 329 330 340 + 2 277 278 288 339 + 2 277 287 288 339 + 2 287 288 329 339 + 2 278 288 338 339 + 2 288 328 338 339 + 2 288 328 329 339 + 2 278 279 289 338 + 2 278 288 289 338 + 2 288 289 328 338 + 2 279 289 337 338 + 2 289 327 337 338 + 2 289 327 328 338 + 2 279 280 290 337 + 2 279 289 290 337 + 2 289 290 327 337 + 2 280 290 336 337 + 2 290 326 336 337 + 2 290 326 327 337 + 2 280 281 291 336 + 2 280 290 291 336 + 2 290 291 326 336 + 2 281 291 335 336 + 2 291 325 335 336 + 2 291 325 326 336 + 2 281 282 292 335 + 2 281 291 292 335 + 2 291 292 325 335 + 2 282 292 334 335 + 2 292 324 334 335 + 2 292 324 325 335 + 2 273 282 283 334 + 2 282 283 292 334 + 2 283 292 324 334 + 2 273 283 333 334 + 2 283 323 333 334 + 2 283 323 324 334 + 2 283 284 294 323 + 2 283 293 294 323 + 2 293 294 313 323 + 2 284 294 323 332 + 2 294 322 323 332 + 2 294 313 322 323 + 2 284 285 295 332 + 2 284 294 295 332 + 2 294 295 322 332 + 2 285 295 331 332 + 2 295 321 331 332 + 2 295 321 322 332 + 2 285 286 296 331 + 2 285 295 296 331 + 2 295 296 321 331 + 2 286 296 330 331 + 2 296 320 330 331 + 2 296 320 321 331 + 2 286 287 297 330 + 2 286 296 297 330 + 2 296 297 320 330 + 2 287 297 329 330 + 2 297 319 329 330 + 2 297 319 320 330 + 2 287 288 298 329 + 2 287 297 298 329 + 2 297 298 319 329 + 2 288 298 328 329 + 2 298 318 328 329 + 2 298 318 319 329 + 2 288 289 299 328 + 2 288 298 299 328 + 2 298 299 318 328 + 2 289 299 327 328 + 2 299 317 327 328 + 2 299 317 318 328 + 2 289 290 300 327 + 2 289 299 300 327 + 2 299 300 317 327 + 2 290 300 326 327 + 2 300 316 326 327 + 2 300 316 317 327 + 2 290 291 301 326 + 2 290 300 301 326 + 2 300 301 316 326 + 2 291 301 325 326 + 2 301 315 325 326 + 2 301 315 316 326 + 2 291 292 302 325 + 2 291 301 302 325 + 2 301 302 315 325 + 2 292 302 324 325 + 2 302 314 324 325 + 2 302 314 315 325 + 2 283 292 293 324 + 2 292 293 302 324 + 2 293 302 314 324 + 2 283 293 323 324 + 2 293 313 323 324 + 2 293 313 314 324 + 2 293 294 304 313 + 2 293 303 304 313 + 2 303 303 304 313 + 2 294 304 313 322 + 2 304 312 313 322 + 2 303 304 312 313 + 2 294 295 305 322 + 2 294 304 305 322 + 2 304 305 312 322 + 2 295 305 321 322 + 2 305 311 321 322 + 2 305 311 312 322 + 2 295 296 306 321 + 2 295 305 306 321 + 2 305 306 311 321 + 2 296 306 320 321 + 2 306 310 320 321 + 2 306 310 311 321 + 2 296 297 307 320 + 2 296 306 307 320 + 2 306 307 310 320 + 2 297 307 319 320 + 2 307 309 319 320 + 2 307 309 310 320 + 2 297 298 308 319 + 2 297 307 308 319 + 2 307 308 309 319 + 2 298 308 318 319 + 2 308 308 318 319 + 2 308 308 309 319 + 2 298 299 309 318 + 2 298 308 309 318 + 2 308 308 309 318 + 2 299 309 317 318 + 2 307 309 317 318 + 2 307 308 309 318 + 2 299 300 310 317 + 2 299 309 310 317 + 2 307 309 310 317 + 2 300 310 316 317 + 2 306 310 316 317 + 2 306 307 310 317 + 2 300 301 311 316 + 2 300 310 311 316 + 2 306 310 311 316 + 2 301 311 315 316 + 2 305 311 315 316 + 2 305 306 311 316 + 2 301 302 312 315 + 2 301 311 312 315 + 2 305 311 312 315 + 2 302 312 314 315 + 2 304 312 314 315 + 2 304 305 312 315 + 2 293 302 303 314 + 2 302 303 312 314 + 2 303 304 312 314 + 2 293 303 313 314 + 2 303 303 313 314 + 2 303 303 304 314 diff --git a/python/converters/vasp/POSCAR b/python/converters/vasp/POSCAR new file mode 100644 index 00000000..d87d9349 --- /dev/null +++ b/python/converters/vasp/POSCAR @@ -0,0 +1,29 @@ +LuNiO3, low-T, P2_1/n +1.0 + 5.1234998703 0.0000000000 0.0000000000 + 0.0000000000 5.5089001656 0.0000000000 + -0.0166880521 0.0000000000 7.3551808822 + Lu Ni O + 4 4 12 +Cartesian + 5.00246185 0.42418531 1.86086070 + 0.10434997 5.08471473 5.49431996 + 2.67444393 3.17863552 1.81672974 + 2.43236789 2.33026481 5.53845136 + 2.56174994 0.00000000 0.00000000 + -0.00834403 2.75445008 3.67759044 + 2.55340591 0.00000000 3.67759044 + 0.00000000 2.75445008 0.00000000 + 0.56002379 2.54896816 1.79539968 + 4.54678788 2.95993201 5.55978141 + 1.99338212 5.30341824 1.88219076 + 3.11342985 0.20548193 5.47298991 + 3.55122302 1.72814193 0.39644425 + 1.55558880 3.78075840 6.95873661 + 4.12568276 4.48259185 3.28114617 + 0.98112906 1.02630815 4.07403471 + 0.93260966 1.11059427 6.94181952 + 4.17420208 4.39830581 0.41336136 + 1.60410812 3.86504444 4.09095181 + 3.50270370 1.64385573 3.26422908 + diff --git a/python/converters/vasp/POSCAR.cart b/python/converters/vasp/POSCAR.cart new file mode 100644 index 00000000..a9de6f86 --- /dev/null +++ b/python/converters/vasp/POSCAR.cart @@ -0,0 +1,29 @@ +LuNiO3, low-T, P2_1/n +1.0 + 5.1234998703 0.0000000000 0.0000000000 + 0.0000000000 5.5089001656 0.0000000000 + -0.0166880521 0.0000000000 7.3551808822 + Lu Ni O + 4 4 12 +Kartesian + 5.00246185 0.42418531 1.86086070 + 0.10434997 5.08471473 5.49431996 + 2.67444393 3.17863552 1.81672974 + 2.43236789 2.33026481 5.53845136 + 2.56174994 0.00000000 0.00000000 + -0.00834403 2.75445008 3.67759044 + 2.55340591 0.00000000 3.67759044 + 0.00000000 2.75445008 0.00000000 + 0.56002379 2.54896816 1.79539968 + 4.54678788 2.95993201 5.55978141 + 1.99338212 5.30341824 1.88219076 + 3.11342985 0.20548193 5.47298991 + 3.55122302 1.72814193 0.39644425 + 1.55558880 3.78075840 6.95873661 + 4.12568276 4.48259185 3.28114617 + 0.98112906 1.02630815 4.07403471 + 0.93260966 1.11059427 6.94181952 + 4.17420208 4.39830581 0.41336136 + 1.60410812 3.86504444 4.09095181 + 3.50270370 1.64385573 3.26422908 + diff --git a/python/converters/vasp/POSCAR.direct b/python/converters/vasp/POSCAR.direct new file mode 100644 index 00000000..0ed61cab --- /dev/null +++ b/python/converters/vasp/POSCAR.direct @@ -0,0 +1,28 @@ +LuNiO3, low-T, P2_1/n +1.0 + 5.1234998703 0.0000000000 0.0000000000 + 0.0000000000 5.5089001656 0.0000000000 + -0.0166880521 0.0000000000 7.3551808822 + Lu Ni O + 4 4 12 +Direct + 0.977199972 0.077000000 0.252999991 + 0.022800028 0.922999978 0.746999979 + 0.522800028 0.577000022 0.247000009 + 0.477199972 0.423000008 0.753000021 + 0.500000000 0.000000000 0.000000000 + 0.000000000 0.500000000 0.500000000 + 0.500000000 0.000000000 0.500000000 + 0.000000000 0.500000000 0.000000000 + 0.110100001 0.462700009 0.244100004 + 0.889899969 0.537299991 0.755900025 + 0.389899999 0.962700009 0.255899996 + 0.610100031 0.037299991 0.744099975 + 0.693300009 0.313699991 0.053900000 + 0.306699991 0.686300039 0.946099997 + 0.806699991 0.813699961 0.446099997 + 0.193300009 0.186300009 0.553900003 + 0.185100004 0.201600000 0.943799973 + 0.814899981 0.798399985 0.056200027 + 0.314899981 0.701600015 0.556200027 + 0.685100019 0.298399985 0.443799973 diff --git a/python/converters/vasp/doc/Makefile b/python/converters/vasp/doc/Makefile new file mode 100644 index 00000000..711e5ca7 --- /dev/null +++ b/python/converters/vasp/doc/Makefile @@ -0,0 +1,153 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build-2.7 +PAPER = +BUILDDIR = build + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + -rm -rf $(BUILDDIR)/* + +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/plotools.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/plotools.qhc" + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/plotools" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/plotools" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." diff --git a/python/converters/vasp/doc/build/.gitignore b/python/converters/vasp/doc/build/.gitignore new file mode 100644 index 00000000..120f485d --- /dev/null +++ b/python/converters/vasp/doc/build/.gitignore @@ -0,0 +1,2 @@ +* +!/.gitignore diff --git a/python/converters/vasp/doc/source/adv_example.cfg b/python/converters/vasp/doc/source/adv_example.cfg new file mode 100644 index 00000000..a02179c1 --- /dev/null +++ b/python/converters/vasp/doc/source/adv_example.cfg @@ -0,0 +1,20 @@ +[General] +EFERMI = -0.6 + +[Group 1] +SHELLS = 1 2 +EMIN = -7.6 +EMAX = 2.7 + +[Shell 1] +# Ni shell +IONS = 5 6 7 8 +LSHELL = 2 +RTRANSFORM = + 0.0 0.0 0.0 0.0 1.0 + 0.0 0.0 1.0 0.0 0.0 + +[Shell 2] +# Oxygen shell +IONS = 9..20 +LSHELL = 1 diff --git a/python/converters/vasp/doc/source/code_struct.rst b/python/converters/vasp/doc/source/code_struct.rst new file mode 100644 index 00000000..7147a5fb --- /dev/null +++ b/python/converters/vasp/doc/source/code_struct.rst @@ -0,0 +1,25 @@ +Code Structure +############## + +.. toctree:: + + vaspio + plotools + converter + +The program consists of three main parts: + * :doc:`Import of data from VASP files ` + * Processing of projectors according to an input config-file + * Conversion of the DFT data to TRIQS h5-file + +Import of data from VASP files is implemented in `vaspio.py`. The data +is read from VASP files and then stored in objects in raw format +(i.e. practically no processing is done at this stage). +These objects are then combined into a dictionary which can be easily +passed to other routines. + +The basic workflow is prescribed as follows: + * raw data is read from VASP files and passed to the main part + * in the main part the input config-file is read and the projectors are selected and process accordingly + * the processed data is stored into output text-files + * when the TRIQS-converter is requested the data is read from text-files and written into a h5-file in an appropriate format diff --git a/python/converters/vasp/doc/source/conf.py b/python/converters/vasp/doc/source/conf.py new file mode 100644 index 00000000..4edcff66 --- /dev/null +++ b/python/converters/vasp/doc/source/conf.py @@ -0,0 +1,243 @@ +# -*- coding: utf-8 -*- +# +# plotools documentation build configuration file, created by +# sphinx-quickstart on Tue Feb 3 20:25:36 2015. +# +# This file is execfile()d with the current directory set to its containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys, os + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +sys.path.insert(0, os.path.abspath('../../')) + +# -- General configuration ----------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be extensions +# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. +extensions = ['sphinx.ext.autodoc', 'sphinx.ext.doctest', 'sphinx.ext.pngmath', 'sphinx.ext.mathjax'] +mathjax_path = 'http://cdn.mathjax.org/mathjax/latest/MathJax.js' + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'PLOVasp' +copyright = u'2015, Oleg E. Peil' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '0.1' +# The full version, including alpha/beta/rc tags. +release = '0.1' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +#language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = [] + +# The reST default role (used for this markup: `text`) to use for all documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + + +# -- Options for HTML output --------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'default' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Output file base name for HTML help builder. +htmlhelp_basename = 'plotoolsdoc' + + +# -- Options for LaTeX output -------------------------------------------------- + +latex_elements = { +# The paper size ('letterpaper' or 'a4paper'). +#'papersize': 'letterpaper', + +# The font size ('10pt', '11pt' or '12pt'). +#'pointsize': '10pt', + +# Additional stuff for the LaTeX preamble. +#'preamble': '', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, documentclass [howto/manual]). +latex_documents = [ + ('index', 'plotools.tex', u'plotools Documentation', + u'Oleg E. Peil', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + + +# -- Options for manual page output -------------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + ('index', 'plotools', u'plotools Documentation', + [u'Oleg E. Peil'], 1) +] + +# If true, show URL addresses after external links. +#man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------------ + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + ('index', 'plotools', u'plotools Documentation', + u'Oleg E. Peil', 'plotools', 'One line description of project.', + 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +#texinfo_appendices = [] + +# If false, no module index is generated. +#texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#texinfo_show_urls = 'footnote' diff --git a/python/converters/vasp/doc/source/config.rst b/python/converters/vasp/doc/source/config.rst new file mode 100644 index 00000000..91a56f89 --- /dev/null +++ b/python/converters/vasp/doc/source/config.rst @@ -0,0 +1,61 @@ +Input Config-file +================= + +A config-file describes subsets of PLOs that are to be generated. +The PLOs are defined in terms of `shells` determined uniquely by an orbital +number `l` and a set of ions (nomrmally, of the same sort). +The shells are further combined into `groups` such that PLO in each group +are orthogonalized together. This allows to create several mutually orthogonal +subsets of PLOs. A group is characterized by a single projection energy window. + +A config-file contains three types of sections: + + - **[General]** : providing information applicable to all projected shells + (e.g. Fermi level) + - **[Shell ]** : each section like this describes a PLO shell, with the index + `Ns` used for referencing + - **[Group ]** : describes shell groups + +.. + It must contain at least one group defined by a section `[PLO Group 1]`. + There is also an optional section `[General]` containing options that concern + all PLO groups (e.g. `k`-mesh properties). + +The format requirements are relatively flexible. A config-file must contain +at least one `[Shell]` section. If there is only one shell defined, it is possible +to specify the energy window by providing parameters `EMIN`, `EMAX` (see below) +right in this section, in which case a group +will be created automatically and the `[Group]` section can be omitted. +If, nevertheless, a group referencing the single shell is explicitly given +the energy window parameters provided in the `[Group]` have higher priority +and in case of conflict with `[Shell]` section a warning is issued. + +An example of a config-file: + +.. literalinclude:: adv_example.cfg + +A config file must contain at least on group of PLOs. Each group is described +by a set of ions to which the projectors are applied, an atomic shell number +(:math:`l = 0,1,2,3` for `s,p,d,f`, respectively), and an energy window defining +the subset of bands from which the projectors are constructed. + +In addition, one can define a real or complex transformation, which allows one +to produce projectors in a basis set different from the original one. + +Below, the format of config-file is described. +All option names are case-insensitive. + +Required parameters +------------------- + +- **IONS**: ion indices as defined in POSCAR files +- **LSHELL**: atomic shell (values 0, 1, 2, 3 for `s,p,d,f` orbitals, respectively) +- **EMIN**, **EMAX**: the bottom and top of the energy window with respect to the Fermi level + +Optional parameters +------------------- + +- **RTRANSFORM**, **CTRANSFORM**: real or complex transformation matrix used to produce projectors + in a different basis; the number of columns is determined by the size of the atomic shell + + diff --git a/python/converters/vasp/doc/source/converter.rst b/python/converters/vasp/doc/source/converter.rst new file mode 100644 index 00000000..960c35a5 --- /dev/null +++ b/python/converters/vasp/doc/source/converter.rst @@ -0,0 +1,4 @@ +TRIQS Converter +############### + +The converter provides an interface between a DFT code and TRIQS solvers. diff --git a/python/converters/vasp/doc/source/example.cfg b/python/converters/vasp/doc/source/example.cfg new file mode 100644 index 00000000..c3f310bb --- /dev/null +++ b/python/converters/vasp/doc/source/example.cfg @@ -0,0 +1,12 @@ +[General] + +[PLO Group 1] + +IONS = 5 6 7 8 +EMIN = -0.6 +EMAX = 2.7 +LSHELL = 2 +RTRANSFORM = + 0.0 0.0 0.0 0.0 1.0 + 0.0 0.0 1.0 0.0 0.0 + diff --git a/python/converters/vasp/doc/source/index.rst b/python/converters/vasp/doc/source/index.rst new file mode 100644 index 00000000..8b89c318 --- /dev/null +++ b/python/converters/vasp/doc/source/index.rst @@ -0,0 +1,27 @@ +.. plotools documentation master file, created by + sphinx-quickstart on Tue Feb 3 20:25:36 2015. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to PLOVasp's documentation! +==================================== + +PLOVasp documentation. + +Contents: + +.. toctree:: + :maxdepth: 1 + + users_guide + code_struct + + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + diff --git a/python/converters/vasp/doc/source/plotools.rst b/python/converters/vasp/doc/source/plotools.rst new file mode 100644 index 00000000..2142d43f --- /dev/null +++ b/python/converters/vasp/doc/source/plotools.rst @@ -0,0 +1,114 @@ +.. highlight:: python + +PLO tools +######### + +Introduction +============ + +This set of tools is intended for processing of raw projectors read +from VASP. One of the main tasks is to generate an orthonormalized subset +of PLOs constructed according to the :doc:`config-file `. + +As an input this sub-library accepts a dictionary with parameters from +the config-file and a dictionary containing VASP-data objects. +Generally, the following workflow is adopted: + + * The VASP data is checked for consistency. + + * For each group of PLOs a corresponding subset of projectors and eigenvalues + is selected according to the config-file. + + * The selected subsets of projectors are orthogonalized. In general, there are different ways + how it can be done (see :ref:`Orthogonalization`). + + +Initial Processing +================== + +Consistency check +----------------- + +The purpose of a consistency check is to make sure that the VASP data passed +to PLOtools are complete and originating from the same calculation. +In particular, the following things are supposed to be checked: + + * the basic dimensions, such as the number of bands, number of `k`-points, etc., + are consistent for all data + + * the `k`-point mesh are read both the IBZKPT and EIGENVAL and it is worth checking + that both sets are coinciding + + * in case tetrahedron data is read from IBZKPT, the tetrahedron volume must be related + to the total volume of the unit cell as derived from POSCAR + + * parameters in the config-file should pass trivial checks such as that the ion + list does not contain non-existing ions (boundary check for ion indices) + +.. function:: check_vasp_data_consistency(conf_pars, vasp_data) + + **Parameters**: + + - *conf_pars* (dict) : dictionary of input parameters from conf-file + - *vasp_data* (dict) : dictionary containing all VASP data + + **Returns**: + + *None* + + **Raises**: + + A meaningful exception indicating an inconsistency in the input data + + +Selecting projector subsets +--------------------------- + +.. autoclass:: plotools.ProjectorSet + :members: + + +The class is using a helper function `select_bands()` for selecting a subset of bands. + +.. function:: select_bands(eigvals, emin, emax) + + **Parameters**: + + - *eigvals* (numpy.array) : array of eigenvalues + - *emin*, *emax* (float) : energy window + + **Returns**: + + *ib_win*, *nb_min*, *nb_max* (numpy.array[int], int, int) : + lowest and highest indices of the selected bands + + +.. _ortho: + +Orthogonalization +================= + +At the second stage the selected projectors are orthogonalized (orthonormalized). +Orthogonalization can be performed in different ways if projection is made +on several ions or if several correlated shells per ion are considered. +In the case of several correlated ions per unit cell (and one correlated shell per ion) +at least two options can be considered: + + #. Projectors are normalized for each ion separetely. In this case, corresponding + Wannier functions for different ions are generally not orthogonal. + + #. Projectors are normalized for all ions in the unit cell simultaneously. This + ensures that the Wannier functions for different ions are mutually orthogonal. + +If more than one shells is considered (say, `p` and `d` orbitals), the +normalization can be imposed either for a combined set of shells or for each shell +separately. + +The way the normalization of a PLO group is done is controlled by two flags: + + - **NORMALIZE** (True/False) : indicates whether the PLO group is normalized (True by default) + - **NORMION** (True/False) : indicates whether the PLO group is normalized on a per-ion basis + +If there are several PLO groups defined, the convention is the following: All PLO groups +marked with `NORMALIZE = True` are orthogonalized with respect to each other. + diff --git a/python/converters/vasp/doc/source/users_guide.rst b/python/converters/vasp/doc/source/users_guide.rst new file mode 100644 index 00000000..e665f113 --- /dev/null +++ b/python/converters/vasp/doc/source/users_guide.rst @@ -0,0 +1,7 @@ +User's Guide +############ + +.. toctree:: + config + +Here the user interface of PLOVasp is described. diff --git a/python/converters/vasp/doc/source/vaspio.rst b/python/converters/vasp/doc/source/vaspio.rst new file mode 100644 index 00000000..e2425524 --- /dev/null +++ b/python/converters/vasp/doc/source/vaspio.rst @@ -0,0 +1,9 @@ +.. sec_vaspio + +VASP input-output +################# + +The following VASP are used by PLOtools: + * PLOCAR: raw projectors generated by VASP-PLO interface + * EIGENVAL: Kohn-Sham eigenvalues as well as `k`-points with weights + * IBZKPT: `k`-point data (:math:`\Gamma`) diff --git a/python/converters/vasp/notes.txt b/python/converters/vasp/notes.txt new file mode 100644 index 00000000..37a5eea5 --- /dev/null +++ b/python/converters/vasp/notes.txt @@ -0,0 +1,64 @@ + + Processing tools for PLOs generated by VASP. + + The main purpose of this set of tools is to process raw data +generated by VASP and to convert data to the TRIQS format. The raw data +is read from files: + POSCAR (atomic positions) + EIGVAL (eignevalues) + PLOCAR (non-orthogonalized PLOs and Fermi-weights) + IBZKPT (k-points and tetrahedra) + + An appropriate set of orthogonalized projectors is defined by +parameters defined in the config file (config-like syntax). +The config-file allows to define several groups of projectors. + + + Structure of PLOtools: + + vaspio.py: reading of VASP-generated files + + + + vaspio.py: + All VASP data are represented by objects which contain data read +from corresponding files. These objects will subsequently be used to +handle the data and convert it into a more functional internal representation. + + + Functions + + read_lines(filename): generator yielding lines from a file + + Classes: + Plocar: raw PLO data from PLOCAR file; + the data itself is read using an auxiliary C-routine 'read_plocar' + + Poscar: structure data from POSCAR file + + Kpoints: k-point data from IBZKPT file + note that k-point data is also contained in EIGENVAL file; + the two k-point sets will be checked for consistency. + + Eigenval: Kohn-Sham eigenvalues as well as k-points with weights + + Symmcar: symmetry operations stored by VASP into SYMMCAR file + + + ploortho.py (or projectors.py) + Set of routines for processing projectors. The functionality includes: + -- selecting a proper subset of non-orthogonalized projectors from the raw VASP input + -- transforming and orthogonalizing projectors + -- calculating DFT density matrix and local Hamiltonian + + General design: + Input data: conf_pars (output of 'parse_input()'), VASP file descriptors (Eigenval, Plocar, etc.) + + * A projector for a given k-point is described by class 'Projector' + PLOs project on a set or orbitals and a set of ions. + + * Projector set is a container of 'Projector' objects. + Out of optimization purposes the projectors are stored in a multi-dimensional + array. A view in terms of Projector objects is, however, possible. + + diff --git a/python/converters/vasp/plocar_io/.gitignore b/python/converters/vasp/plocar_io/.gitignore new file mode 100644 index 00000000..f0ad8e09 --- /dev/null +++ b/python/converters/vasp/plocar_io/.gitignore @@ -0,0 +1,4 @@ +makefile +*.so +*.o +*.pyc diff --git a/python/converters/vasp/plocar_io/__init__.py b/python/converters/vasp/plocar_io/__init__.py new file mode 100644 index 00000000..139597f9 --- /dev/null +++ b/python/converters/vasp/plocar_io/__init__.py @@ -0,0 +1,2 @@ + + diff --git a/python/converters/vasp/plocar_io/c_plocar_io.c b/python/converters/vasp/plocar_io/c_plocar_io.c new file mode 100644 index 00000000..0d9d000c --- /dev/null +++ b/python/converters/vasp/plocar_io/c_plocar_io.c @@ -0,0 +1,311 @@ + +#include +#include +#include +#include + +#define MAX_STR_LEN 512 + +static int verbose = 1; + +typedef struct { + int nion; + int ns; + int nk; + int nb; + int nlmmax; + int nc_flag; + int isdouble; +} t_params; + +static PyObject* io_read_plocar(PyObject *self, PyObject *args); +PyObject* create_par_dictionary(t_params* p); +PyArrayObject* create_plo_array(t_params* p); +PyArrayObject* create_ferw_array(t_params* p); +int read_arrays(FILE* fh, t_params* p, PyArrayObject* py_plo, PyArrayObject* py_ferw); + +// Python module descriptor +static PyMethodDef c_plocar_io[] = { + {"read_plocar", io_read_plocar, METH_VARARGS, + "Reads from PLOCAR and returns PLOs"}, + {NULL, NULL, 0, NULL} +}; + +PyMODINIT_FUNC +initc_plocar_io() +{ + (void) Py_InitModule("c_plocar_io", c_plocar_io); + import_array(); +} + +/* + Main function. + + Reads data from the specified file (default is 'PLOCAR') +and returns it as a Python tuple. + +*/ +static PyObject * +io_read_plocar(PyObject *self, PyObject *args) +{ + PyArrayObject *py_plo = NULL; + PyArrayObject *py_ferw = NULL; + PyObject *par_dict = NULL; + PyObject *ret_tuple = NULL; + + char *fname = "PLOCAR"; + char errmsg[MAX_STR_LEN] = {"\0"}; + + FILE* fh; + + int isdouble, prec; + t_params params; + + if(!PyArg_ParseTuple(args, "|s", &fname)) + return NULL; + + if(verbose) + printf(" Reading PLO data from file: %s\n", fname); + +// +// Read the header +// + fh = fopen(fname, "r"); + if(fh == NULL) { +// Treat this error separately because no clean-up is necessary + strncpy(errmsg, "Error opening PLOCAR\n", MAX_STR_LEN); + strncat(errmsg, strerror(errno), MAX_STR_LEN); + PyErr_SetString(PyExc_IOError, errmsg); + return NULL; + } + + if(!fread(&prec, 4, 1, fh)) goto ioerror; + if(!fread(¶ms.nion, 4, 1, fh)) goto ioerror; + if(!fread(¶ms.ns, 4, 1, fh)) goto ioerror; + if(!fread(¶ms.nk, 4, 1, fh)) goto ioerror; + if(!fread(¶ms.nb, 4, 1, fh)) goto ioerror; + if(!fread(¶ms.nlmmax, 4, 1, fh)) goto ioerror; + if(!fread(¶ms.nc_flag, 4, 1, fh)) goto ioerror; + + switch(prec) { + case 8: + params.isdouble = 1; + if(verbose) printf(" Data in double precision\n"); + break; + case 4: + params.isdouble = 0; + if(verbose) printf(" Data in single precision\n"); + break; + default: + PyErr_SetString(PyExc_ValueError, + "Error reading PLOCAR: only 'prec = 4, 8' are supported"); + goto error; + } + + if(verbose) { + printf(" nion: %d\n", params.nion); + printf(" ns: %d\n", params.ns); + printf(" nk: %d\n", params.nk); + printf(" nb: %d\n", params.nb); + printf(" nlmmax: %d\n", params.nlmmax); + printf(" nc_flag: %d\n", params.nc_flag); + } + +// +// Create parameter dictionary +// + par_dict = create_par_dictionary(¶ms); + +// +// Create PLO and Fermi-weight arrays +// + py_plo = create_plo_array(¶ms); + py_ferw = create_ferw_array(¶ms); + +// +// Read the data from file +// + if(read_arrays(fh, ¶ms, py_plo, py_ferw)) goto ioerror; + +// +// Create return tuple +// + ret_tuple = PyTuple_New(3); + + if(PyTuple_SetItem(ret_tuple, 0, par_dict) < 0) { + PyErr_SetString(PyExc_ValueError, + "Error adding element to the return tuple (parameter dictionary)"); + goto error; + } + + if(PyTuple_SetItem(ret_tuple, 1, (PyObject *)py_plo) < 0) { + PyErr_SetString(PyExc_ValueError, + "Error adding element to the return tuple (PLO array)"); + goto error; + } + + if(PyTuple_SetItem(ret_tuple, 2, (PyObject *)py_ferw) < 0) { + PyErr_SetString(PyExc_ValueError, + "Error adding element to the return tuple (Fermi-weight array)"); + goto error; + } + // Py_DECREF(par_dict); + + fclose(fh); + + return ret_tuple; + +// +// Handle IO-errors +// +ioerror: + printf("Error number: %d\n", errno); + if(feof(fh)) { + PyErr_SetString(PyExc_IOError, "End-of-file reading PLOCAR"); + } + else { + strncpy(errmsg, "Error reading PLOCAR\n", MAX_STR_LEN); + strncat(errmsg, strerror(errno), MAX_STR_LEN); + PyErr_SetString(PyExc_IOError, errmsg); + } + +// +// Clean-up after an error +// +error: + fclose(fh); + + Py_XDECREF(par_dict); + Py_XDECREF(py_plo); + Py_XDECREF(py_ferw); + Py_XDECREF(ret_tuple); + + return NULL; +} + +// +// Auxiliary functions +// +PyObject* +create_par_dictionary(t_params* p) +{ + PyObject *par_dict = PyDict_New(); + PyDict_SetItemString(par_dict, "nion", PyInt_FromLong((long)p->nion)); + PyDict_SetItemString(par_dict, "ns", PyInt_FromLong((long)p->ns)); + PyDict_SetItemString(par_dict, "nk", PyInt_FromLong((long)p->nk)); + PyDict_SetItemString(par_dict, "nb", PyInt_FromLong((long)p->nb)); + PyDict_SetItemString(par_dict, "nc_flag", PyInt_FromLong((long)p->nc_flag)); + + return par_dict; +} + +PyArrayObject* +create_plo_array(t_params* p) +{ + double complex *plo; + npy_intp *dims; + int ntot = p->nion * p->ns * p->nk * p->nb * p->nlmmax; + int ndim = 5; + + plo = (double complex*)malloc(ntot * sizeof(double complex)); + memset(plo, 0, ntot * sizeof(double complex)); + dims = (npy_intp *)malloc(ndim * sizeof(npy_intp)); + + dims[0] = p->nion; + dims[1] = p->ns; + dims[2] = p->nk; + dims[3] = p->nb; + dims[4] = p->nlmmax; + + return (PyArrayObject *)PyArray_SimpleNewFromData(ndim, dims, NPY_CDOUBLE, plo); +} + +PyArrayObject* +create_ferw_array(t_params* p) +{ + double *ferw; + npy_intp *dims; + int ntot = p->nion * p->ns * p->nk * p->nb; + int ndim = 4; + + ferw = (double *)malloc(ntot * sizeof(double)); + memset(ferw, 0, ntot * sizeof(double)); + dims = (npy_intp *)malloc(ndim * sizeof(npy_intp)); + + dims[0] = p->nion; + dims[1] = p->ns; + dims[2] = p->nk; + dims[3] = p->nb; + + return (PyArrayObject *)PyArray_SimpleNewFromData(ndim, dims, NPY_DOUBLE, ferw); +} + +int read_arrays(FILE* fh, t_params* p, PyArrayObject* py_plo, PyArrayObject* py_ferw) +{ + double complex *plo; + double *ferw; + int strd_plo[5], strd_ferw[4]; + + int ion, ik, ib, is, ilm; + int nlm; + long ind1, ind2; + float rtmp; + float complex rbuf[50]; + double dtmp; + double complex dbuf[50]; + +// Initialize array pointers and strides + plo = (double complex *)py_plo->data; + strd_plo[0] = py_plo->strides[0] / sizeof(double complex); + strd_plo[1] = py_plo->strides[1] / sizeof(double complex); + strd_plo[2] = py_plo->strides[2] / sizeof(double complex); + strd_plo[3] = py_plo->strides[3] / sizeof(double complex); + strd_plo[4] = py_plo->strides[4] / sizeof(double complex); + + ferw = (double *)py_ferw->data; + strd_ferw[0] = py_ferw->strides[0] / sizeof(double); + strd_ferw[1] = py_ferw->strides[1] / sizeof(double); + strd_ferw[2] = py_ferw->strides[2] / sizeof(double); + strd_ferw[3] = py_ferw->strides[3] / sizeof(double); + + ind1 = 0; + ind2 = 0; + for(ion = 0; ion < p->nion; ion++) { + fread(&nlm, 4, 1, fh); +// printf(" nlm = %d\n", nlm); + for(is = 0; is < p->ns; is++) + for(ik = 0; ik < p->nk; ik++) + for(ib = 0; ib < p->nb; ib++) { + ind1 = strd_ferw[0] * ion + strd_ferw[1] * is + strd_ferw[2] * ik + strd_ferw[3] * ib; + ind2 = strd_plo[0] * ion + strd_plo[1] * is + strd_plo[2] * ik + strd_plo[3] * ib; + + if(p->isdouble) { + if(fread(&dtmp, sizeof(double), 1, fh) < 1) goto error; + if(fread(dbuf, sizeof(double complex), nlm, fh) < nlm) goto error; + + ferw[ind1] = dtmp; +// printf("%5d %5d %5d %5d %lf\n", ion, is, ik, ib, dtmp); + memcpy(plo + ind2, dbuf, nlm * sizeof(double complex)); + } + else { + if(fread(&rtmp, sizeof(float), 1, fh) < 1) goto error; + if(fread(rbuf, sizeof(float complex), nlm, fh) < nlm) goto error; + + ferw[ind1] = (double)rtmp; +// printf("%5d %5d %5d %5d %f\n", ion, is, ik, ib, rtmp); +// In this case destination and source arrays are not compatible, +// we have to copy element-wise + for(ilm = 0; ilm < nlm; ilm++) { + plo[ind2 + ilm] = (double complex)rbuf[ilm]; +// printf("%5d %5d %f\n", ilm, ind2 + ilm, rbuf[ilm]); + } + } // if p->isdouble + + } + } + + return 0; + +error: + return -1; +} diff --git a/python/converters/vasp/plocar_io/makefile.darwin b/python/converters/vasp/plocar_io/makefile.darwin new file mode 100644 index 00000000..10491743 --- /dev/null +++ b/python/converters/vasp/plocar_io/makefile.darwin @@ -0,0 +1,9 @@ + +CC=gcc +INC_FLAGS=-I/opt/local/Library/Frameworks/Python.framework/Versions/Current/include/python2.7 -I/opt/local/Library/Frameworks/Python.framework/Versions/Current/lib/python2.7/site-packages/numpy/core/include/numpy +LIB_FLAGS=-L/opt/local/Library/Frameworks/Python.framework/Versions/Current/lib/python2.7 + +c_plocar_io.so: c_plocar_io.c + $(CC) $< -fPIC -shared -o $@ $(INC_FLAGS) $(LIB_FLAGS) -lpython2.7 + cp $@ .. + diff --git a/python/converters/vasp/plotools.py b/python/converters/vasp/plotools.py new file mode 100644 index 00000000..f063409b --- /dev/null +++ b/python/converters/vasp/plotools.py @@ -0,0 +1,215 @@ + +import numpy as np + +class Projector: + """ + Class describing a local-orbital projector. + """ + + def __init__(self, matrix, ib1=1, ib2=None, nion=1): + self.p_matrix = matrix.astype(np.complex128) + self.norb, self.nb = matrix.shape + self.nion = nion + self.ib1 = ib1 - 1 + if not ib2 is None: + self.ib2 = ib2 - 1 + else: + self.ib2 = self.nb - 1 + + def project_up(self, mat): + return np.dot(self.p_matrix.conj().T, np.dot(mat, self.p_matrix)) + + def project_down(self, mat): + assert mat.shape == (self.nb, self.nb), " Matrix must match projector in size" + return np.dot(self.p_matrix, np.dot(mat, self.p_matrix.conj().T)) + + def orthogonalize(self): + """ + Orthogonalizes a projector. + Returns an overlap matrix and its eigenvalues for initial projectors. + """ + self.p_matrix, overlap, over_eig = orthogonalize_projector(self.p_matrix) + + return (overlap, over_eig) + +################################################################################ +# orthogonalize_projector() +################################################################################ +def orthogonalize_projector(p_matrix): + """ + Orthogonalizes a projector defined by a rectangular matrix `p_matrix`. + + Parameters + ---------- + + p_matrix (numpy.array[complex]) : matrix `Nm x Nb`, where `Nm` is + the number of orbitals, `Nb` number of bands + + Returns + ------- + + Orthogonalized projector matrix, initial overlap matrix and its eigenvalues. + """ + + overlap = np.dot(p_matrix, p_matrix.conj().T) + eig, eigv = np.linalg.eigh(overlap) + assert np.all(eig > 0.0), (" Negative eigenvalues of the overlap matrix:" + "projectors are ill-defined") + sqrt_eig = np.diag(1.0 / np.sqrt(eig)) + shalf = np.dot(eigv, np.dot(sqrt_eig, eigv.conj().T)) + p_ortho = np.dot(shalf, p_matrix) + + return (p_ortho, overlap, eig) + +################################################################################ +# check_vasp_data_consistency() +################################################################################ +def check_vasp_data_consistency(vasp_data): + """ + Check the consistency of the VASP data. + """ + pass + +################################################################################ +# select_bands() +################################################################################ +def select_bands(eigvals, emin, emax): + """ + Select a subset of bands lying within a given energy window. + The band energies are assumed to be sorted in an ascending order. + + Parameters + ---------- + + eigvals (numpy.array) : all eigenvalues + emin, emax (float) : energy window + + Returns + ------- + + ib_win, nb_min, nb_max : + """ + nk, nband, ns_band = eigvals.shape + ib_win = np.zeros((nk, ns_band, 2), dtype=np.int32) + + nb_min = 10000000 + nb_max = 0 + for isp in xrange(ns_band): + for ik in xrange(nk): + for ib in xrange(nband): + en = eigvals[ik, ib, isp] + if en >= emin: + break + ib1 = ib + for ib in xrange(ib1, nb_max): + en = eigvals[ik, ib, isp] + if en <= emax: + break + ib2 = ib + + ib_win[ik, isp, 0] = ib1 + ib_win[ik, isp, 1] = ib2 + + nb_min = min(nb_min, ib1) + nb_max = max(nb_max, ib2) + + return ib_win, nb_min, nb_max + +################################################################################ +# +# class ProjectorSet +# +################################################################################ +class ProjectorSet: + """ + Container of projectors defined within a certain energy window. + + The constructor selects a subset of projectors according to + the parameters from the config-file (passed in `pars`). + + Parameters: + + - pars (dict) : dictionary of parameters from the config-file for a given PLO group + - proj_raw (numpy.array) : array of raw projectors + - eigvals (numpy.array) : array of KS eigenvalues + + """ +# def __init__(self, proj_set, nb_min, nb_max, ib_win): +# """ +# Constructor. +# +# Parameters +# ---------- +# +# proj_set (numpy.array) : projector array +# nb_min (int) : the lowest absolute band index +# nb_max (int) : the lowest absolute band index +# ib_win (numpy.array((nk, ns, 2), dtype=int)) : the lowest and highest band indices +# for a given `k`-point +# """ +# self.proj_set = proj_set +# self.nb_min = nb_min +# self.nb_max = nb_max +# self.ib_win = ib_win + +################################################################################# +# __init__() +################################################################################# + def __init__(self, pars, proj_raw, eigvals): + """ + Constructor + """ + ns = proj_raw.shape[1] + nk, nband, ns_band = eigvals.shape + + self.lorb = pars['lshell'] + self.lm_l = range(lorb**2, (lorb+1)**2) + nlm = len(self.lm_l) + + self.emin = pars['emin'] + self.emax = pars['emax'] + +# Determine the minimum and maximum band numbers + ib_win, nb_min, nb_max = select_bands(eigvals, self.emin, self.emax) + self.ib_win = ib_win + self.nb_min = nb_min + self.nb_max = nb_max + +# Set the dimensions of the array + nb_win = self.nb_max - self.nb_min + 1 + nion_sel = pars['ion_list'].shape[0] + + self.proj_set = np.zeros((nion_sel, ns, nk, nb_win, nlm), dtype=np.complex128) +# Select projectors for a given energy window + for isp in xrange(ns): + for ik in xrange(nk): +# TODO: for non-collinear case something else should be done here + is_b = min(isp, ns_band) + ib1 = self.ib_win[ik, is_b, 0] + ib2 = self.ib_win[ik, is_b, 1] + 1 + ib1_win = ib1 - self.nb_min + ib2_win = ib2 - self.nb_min + for ion, ion_sel in enumerate(pars['ion_list']): + self.proj_set[ion, isp, ik, ib1_win:ib2_win, :] = proj_raw[ion_sel, isp, ik, ib1:ib2, self.lm_l] + + +def generate_ortho_plos(conf_pars, vasp_data): + """ + Parameters + ---------- + + conf_pars (dict) : dictionary of input parameters (from conf-file) + vasp_data (dict) : dictionary of object representing various VASP files + """ + + check_vasp_data_consistency(vasp_data) + + proj_raw = vaps_data['plocar'].plo + efermi = vasp_data['doscar'].efermi +# eigvals(nktot, nband, ispin) are defined with respect to the Fermi level + eigvals = vasp_data['eigenval'].eigs - efermi + + proj_set_l = [] + for pars in conf_pars: + proj_set = select_projectors(pars, proj_raw, eigvals) + diff --git a/python/converters/vasp/pyconf.py b/python/converters/vasp/pyconf.py new file mode 100644 index 00000000..0dc2fe7e --- /dev/null +++ b/python/converters/vasp/pyconf.py @@ -0,0 +1,331 @@ + +import ConfigParser +import numpy as np +import re +import sys +import vaspio + +def issue_warning(message): + """ + Issues a warning. + """ + print + print " !!! WARNING !!!: " + message + print +################################################################################ +################################################################################ +# +# class ConfigParameters +# +################################################################################ +################################################################################ +class ConfigParameters: + r""" + Class responsible for parsing of the input config-file. + + Parameters: + + - *sh_required*, *sh_optional* : required and optional parameters of shells + - *gr_required*, *gr_optional* : required and optional parameters of groups + + The dictionary contains a mapping of conf-file keywords to + a pair of objects: + + 1. internal name of a parameter + 2. function used to convert an input string into data for a given parameter + """ + self.sh_required = { + 'ions': ('ion_list', self.parse_ion_list), + 'lshell': ('lshell', int)} + + self.sh_optional = { + 'rtransform': ('tmatrix', lambda s: self.parse_tmatrix(s, real=True)), + 'ctransform': ('tmatrix', lambda s: self.parse_tmatrix(s, real=False))} + + self.gr_required = { + 'emin': ('emin', float), + 'emax': ('emax', float)} + + self.gr_optional = { + 'normalize' : ('normalize', self.parse_logical), + 'normion' : ('normion', self.parse_logical)} + + +################################################################################ +# +# __init__() +# +################################################################################ + def __init__(self, input_filename, verbosity=1): + self.verbosity = verbosity + self.cp = ConfigParser.ConfigParser() + self.cp.readfp(open(input_filename, 'r')) + + self.conf_pars = {} + +# +# Special parsers +# +################################################################################ +# +# parse_string_ion_list() +# +################################################################################ + def parse_string_ion_list(self, par_str): + """ + The ion list accepts two formats: + 1). A list of ion indices according to POSCAR. + 2). An element name, in which case all ions with + this name are included. + + The second option requires an input from POSCAR file. + """ + try: + l_tmp = map(int, par_str.split()) +# Subtract 1 so that VASP indices (starting with 1) are converted +# to Python indices (starting with 0) + ion_list = np.array(l_tmp) - 1 + except ValueError: + err_msg = "Only an option with a list of ion indices is implemented" + raise NotImplementedError(err_msg) + + return ion_list + +################################################################################ +# +# parse_string_logical() +# +################################################################################ + def parse_string_logical(self, par_str): + """ + Logical parameters are given by string 'True' or 'False' + (case does not matter). In fact, only the first symbol matters so that + one can write 'T' or 'F'. + """ + assert par_str[0] in 'tf', "Logical parameters should be given by either 'True' or 'False'" + return par_str[0] == 't' + +################################################################################ +# +# parse_parameter_set() +# +################################################################################ + def parse_parameter_set(self, section, param_set, exception=False): + """ + Parses required or optional parameter set from a section. + For required parameters `exception=True` must be set. + """ + parsed = {} + for par in param_set.keys(): + try: + par_str = self.cp.get(section, par) + except ConfigParser.NoOptionError: + if exception: + message = "Required parameter '%s' not found in section [%s]"%(par, section) + raise ConfigParser.NoOptionError(message) + else: + continue + + if self.verbosity > 0: + print " %s = %s"%(par, par_str) + + key = param_set[par][0] + parse_fun = param_set[par][1] + parsed[key] = parse_fun(par_str) + + return parsed + + +################################################################################ +# +# parse_shells() +# +################################################################################ + def parse_shells(self): + """ + Parses all [Shell] sections. + """ +# Find all [Shell] sections +# (note that ConfigParser transforms all names to lower case) + sections = self.cp.sections() + + sh_patt = 'shell *([0-9]*)' + ismatch = lambda s: not re.match(sh_patt, s) is None + sec_shells = filter(ismatch, sections) + + self.nshells = len(sec_shells) + assert self.nshells > 0, "No projected shells found in the input file" + + if self.verbosity > 0: + print + if self.nshells > 1: + print " Found %i projected shells"%(self.nshells) + else: + print " Found 1 projected shell" + +# Get shell indices + get_ind = lambda s: int(re.match(sh_patt, s).groups()[0]) + try: + sh_inds = map(get_ind, sec_shells) + except ValueError: + raise ValueError("Failed to extract shell indices from a list: %s"%(sec_shells)) + + self.sh_sections = {ind: sec for ind, sec in sh_inds, sec_shells} + +# Check that all indices are unique + assert len(sh_inds) == len(set(sh_inds)), "There must be no shell with the same index!" + +# Ideally, indices should run from 1 to +# If it's not the case, issue a warning + sh_inds.sort() + if sh_inds != range(1, len(sh_inds) + 1): + issue_warning("Shell indices are not uniform or not starting from 1. " + "This might be an indication of a incorrect setup." + +# Parse shell parameters + self.shells = {} + for ind in sh_inds: + self.shells[ind] = {} + section = self.sh_sections[ind] + +# Shell required parameters + if self.verbosity > 0: + print + print " Required shell parameters:" + parsed = self.parse_parameter_set(section, self.sh_required, exception=True) + self.shells[ind].update(parsed) + +# Shell optional parameters + if self.verbosity > 0: + print + print " Optional shell parameters:" + parsed = self.parse_parameter_set(section, self.sh_optional, exception=False) + self.shells[ind].update(parsed) + +# Group required parameters +# Must be given if no group is explicitly specified +# If in conflict with the [Group] section, the latter has a priority + if self.verbosity > 0: + print + print " Required group parameters:" + parsed = self.parse_parameter_set(section, self.gr_required, exception=False) + self.shells[ind].update(parsed) + +# Group optional parameters + if self.verbosity > 0: + print + print " Optional group parameters:" + parsed = self.parse_parameter_set(section, self.gr_optional, exception=False) + self.shells[ind].update(parsed) + +################################################################################ +# +# parse_groups() +# +################################################################################ + def parse_groups(self): + """ + Parses [Group] sections. + """ +# Find group sections + sections = self.cp.sections() + + gr_patt = 'group *([0-9]*)' + ismatch = lambda s: not re.match(gr_patt, s) is None + sec_groups = filter(ismatch, sections) + + self.ngroups = len(sec_groups) + +# Special case: no groups is defined + if self.ngroups == 0: +# Check that 'nshells = 1' + assert self.nshells == 1, "At least one group must be defined if there are more than one shells." + +# Otherwise create a single group taking group information from [Shell] section + self.groups = [{}] +# Check that the single '[Shell]' section contains enough information +# and move it to the `groups` dictionary + ind = self.sh_sections.keys()[0] + try: + for par in self.gr_required.keys(): + key = self.gr_required[par][0] + value = self.shells[ind].pop(key) + self.groups[0][key] = value + except KeyError: + message = "One [Shell] section is specified but no explicit [Group] section is provided." + message += " In this case the [Shell] section must contain all required group information.\n" + message += " Required parameters are: %s"%(self.gr_required.keys()) + raise KeyError(message) + +# Do the same for optional group parameters, but do not raise an exception + for par in self.gr_required.keys(): + try: + key = self.gr_required[par][0] + value = self.shells[ind].pop(key) + self.groups[0][key] = value + except KeyError: + continue + + self.groups.update({'shells': [self.shells[ind]]}) + + +################################################################################ +# +# Main parser +# parse_logical() +# +################################################################################ + def parse_input(self): + """ + Parses input conf-file. + """ + self.parse_shells() + self.parse_groups() + + +# Output list of dictionaries + output_pars = [{} for isec in xrange(nsections)] + for isec, section in enumerate(sections): + print "Section: %s"%(section) + for par in required.keys(): + try: + par_str = cp.get(section, par) + except ConfigParser.NoOptionError: + raise SystemExit("*** Error: Required entry '%s' not found in the input file"%(par)) + + print " %s: %s"%(par, par_str) + key = required[par][0] + parse_fun = required[par][1] + output_pars[isec][key] = parse_fun(par_str) + + print output_pars + print cp.get(section, 'rtransform').strip().split('\n') + + return output_pars + +if __name__ == '__main__': + narg = len(sys.argv) + if narg < 2: + raise SystemExit(" Usage: python pyconf.py []") + else: + filename = sys.argv[1] + if narg > 2: + vasp_dir = sys.argv[2] + if vasp_dir[-1] != '/': + vasp_dir += '/' + else: + vasp_dir = './' + + +# plocar = vaspio.Plocar() +# plocar.from_file(vasp_dir) +# poscar = vaspio.Poscar() +# poscar.from_file(vasp_dir) +# kpoints = vaspio.Kpoints() +# kpoints.from_file(vasp_dir) + eigenval = vaspio.Eigenval() + eigenval.from_file(vasp_dir) + doscar = vaspio.Doscar() + doscar.from_file(vasp_dir) +# pars = parse_input(filename) + diff --git a/python/converters/vasp/test.cfg b/python/converters/vasp/test.cfg new file mode 100644 index 00000000..7640037e --- /dev/null +++ b/python/converters/vasp/test.cfg @@ -0,0 +1,13 @@ +[General] + +[PLO Group 1] + +IONS = 5 6 7 8 +#IONS = Ni +EMIN = -0.6 +EMAX = 2.7 +LSHELL = 2 +RTRANSFORM = + 0.0 0.0 0.0 0.0 1.0 + 0.0 0.0 1.0 0.0 0.0 + diff --git a/python/converters/vasp/vaspio.py b/python/converters/vasp/vaspio.py new file mode 100644 index 00000000..3b4e0507 --- /dev/null +++ b/python/converters/vasp/vaspio.py @@ -0,0 +1,406 @@ + +import numpy as np +import plocar_io.c_plocar_io as c_plocar_io + +def read_lines(filename): + r""" + Generator of lines for a file + + Parameters + ---------- + + filename (str) : name of the file + """ + with open(filename, 'r') as f: + for line in f: + yield line + +class Plocar: + r""" + Class containing raw PLO data from VASP. + + Properties + ---------- + + plo (numpy.array((nion, ns, nk, nb, nlmmax))) : raw projectors + """ + + def from_file(self, vasp_dir='./', plocar_filename='PLOCAR'): + r""" + Reads non-normalized projectors from a binary file (`PLOCAR' by default) + generated by VASP PLO interface. + + Parameters + ---------- + + vasp_dir (str) : path to the VASP working directory [default = `./'] + plocar_filename (str) : filename [default = `PLOCAR'] + + """ +# Add a slash to the path name if necessary + if vasp_dir[-1] != '/': + vasp_dir += '/' + + self.params, self.plo, self.ferw = c_plocar_io.read_plocar(vasp_dir + plocar_filename) + + +class Poscar: + """ + Class containing POSCAR data from VASP. + + Properties + ---------- + + nq (int) : total number of ions + ntypes ([int]) : number of ion types + nions (int) : a list of number of ions of each type + a_brav (numpy.array((3, 3), dtype=float)) : lattice vectors + q_types ([numpy.array((nions, 3), dtype=float)]) : a list of + arrays each containing fractional coordinates of ions of a given type + """ + def __init__(self): + self.q_cart = None + self.b_rec = None + + def from_file(self, vasp_dir='./', poscar_filename='POSCAR'): + """ + Reads POSCAR and returns a dictionary. + + Parameters + ---------- + + vasp_dir (str) : path to the VASP working directory [default = `./'] + plocar_filename (str) : filename [default = `PLOCAR'] + + """ +# Convenince local function + def readline_remove_comments(): + return f.next().split('!')[0].strip() + +# Add a slash to the path name if necessary + if vasp_dir[-1] != '/': + vasp_dir += '/' + + f = read_lines(vasp_dir + poscar_filename) +# Comment line + comment = f.next().rstrip() + print " Found POSCAR, title line: %s"%(comment) + +# Read scale + sline = readline_remove_comments() + ascale = float(sline[0]) +# Read lattice vectors + self.a_brav = np.zeros((3, 3)) + for ia in xrange(3): + sline = readline_remove_comments() + self.a_brav[ia, :] = map(float, sline.split()) +# Negative scale means that it is a volume scale + if ascale < 0: + vscale = -ascale + vol = np.linalg.det(self.a_brav) + ascale = (vscale / vol)**(1.0/3) + + self.a_brav *= ascale + +# Depending on the version of VASP there could be +# an extra line with element names + sline = readline_remove_comments() + try: +# Old v4.6 format: no element names + self.nions = map(int, sline.split()) + self.el_names = ['El%i'%(i) for i in xrange(len(nions))] + except ValueError: +# New v5.x format: read element names first + self.el_names = sline.split() + sline = readline_remove_comments() + self.nions = map(int, sline.split()) + +# Set the number of atom sorts (types) and the total +# number of atoms in the unit cell + self.ntypes = len(self.nions) + self.nq = sum(self.nions) + +# Check for the line 'Selective dynamics' (and ignore it) + sline = readline_remove_comments() + if sline[0].lower() == 's': + sline = readline_remove_comments() + +# Check whether coordinates are cartesian or fractional + cartesian = (sline[0].lower() in 'ck') + if cartesian: + brec = np.linalg.inv(self.a_brav.T) + +# Read atomic positions + self.q_types = [] + for it in xrange(self.ntypes): + q_at_it = np.zeros((self.nions[it], 3)) + for iq in xrange(self.nions[it]): + sline = readline_remove_comments() + qcoord = map(float, sline.split()[:3]) + if cartesian: + qcoord = np.dot(brec, qcoord) + q_at_it[iq, :] = qcoord + + self.q_types.append(q_at_it) + + print " Total number of ions:", self.nq + print " Number of types:", self.ntypes + print " Number of ions for each type:", self.nions + +# print +# print " Coords:" +# for it in xrange(ntypes): +# print " Element:", el_names[it] +# print q_at[it] + +################################################################ +# +# Kpoints +# +################################################################ +class Kpoints: + """ + Class describing k-points and optionally tetrahedra. + + Properties + ---------- + + nktot (int) : total number of k-points in the IBZ + kpts (numpy.array((nktot, 3), dtype=float)) : k-point vectors (fractional coordinates) + ntet (int) : total number of k-point tetrahedra + itet (numpy.array((ntet, 5), dtype=float) : array of tetrahedra + volt (float) : volume of a tetrahedron (the k-grid is assumed to + be uniform) + """ +# +# Reads IBZKPT file +# + def from_file(self, vasp_dir='./', ibz_filename='IBZKPT'): + """ + Reads from IBZKPT: k-points and optionally + tetrahedra topology (if present). + + Parameters + ---------- + + vasp_dir (str) : path to the VASP working directory [default = `./'] + plocar_filename (str) : filename [default = `PLOCAR'] + + """ + +# Add a slash to the path name if necessary + if vasp_dir[-1] != '/': + vasp_dir += '/' + + ibz_file = read_lines(vasp_dir + ibz_filename) + +# Skip comment line + line = ibz_file.next() +# Number of k-points + line = ibz_file.next() + self.nktot = int(line.strip().split()[0]) + + print + print " {0:>26} {1:d}".format("Total number of k-points:", self.nktot) + + self.kpts = np.zeros((self.nktot, 3)) + +# Skip comment line + line = ibz_file.next() + for ik in xrange(self.nktot): + line = ibz_file.next() + self.kpts[ik, :] = map(float, line.strip().split()[:3]) + +# Attempt to read tetrahedra +# Skip comment line ("Tetrahedra") + try: + line = ibz_file.next() + +# Number of tetrahedra and volume = 1/(6*nkx*nky*nkz) + line = ibz_file.next() + sline = line.split() + self.ntet = int(sline[0]) + self.volt = float(sline[1]) + + print " {0:>26} {1:d}".format("Total number of tetrahedra:", self.ntet) + +# Traditionally, itet[it, 0] contains multiplicity + self.itet = np.zeros((self.ntet, 5), dtype=int) + for it in xrange(self.ntet): + line = ibz_file.next() + self.itet[it, :] = map(int, line.split()[:5]) + except IOError, ValueError: + print " Error reading tetrahedra. No tetrahedron data is uesd" + self.ntet = 0 + +# data = { 'nktot': nktot, +# 'kpts': kpts, +# 'ntet': ntet, +# 'itet': itet, +# 'volt': volt } +# +# return data + +################################################################ +# +# Eigenval +# +################################################################ +class Eigenval: + """ + Class containing Kohn-Sham-eigenvalues data from VASP (EIGENVAL file). + """ + def from_file(self, vasp_dir='./', eig_filename='EIGENVAL'): + """ + Reads eigenvalues from EIGENVAL. Note that the file also + contains k-points with weights. They are also stored and + then used to check the consistency of files read. + """ + +# Add a slash to the path name if necessary + if vasp_dir[-1] != '/': + vasp_dir += '/' + + f = read_lines(vasp_dir + eig_filename) + +# First line: only the first and the last number out of four +# are used; these are 'nions' and 'ispin' + sline = f.next() + self.nq = int(sline[0]) + self.ispin = int(sline[3]) + +# Second line: cell volume and lengths of lattice vectors (skip) + sline = f.next() + +# Third line: temperature (skip) + sline = f.next() + +# Fourth and fifth line: useless + sline = f.next() + sline = f.next() + +# Sixth line: NELECT, NKTOT, NBTOT + sline = f.next() + self.nelect = int(sline[0]) + self.nktot = int(sline[1]) + self.nband = int(sline[2]) + +# Set of eigenvalues and k-points + self.kpts = np.zeros((self.nktot, 3)) + sefl.kwghts = np.zeros((self.nktot,)) + self.eigs = np.zeros((self.nktot, self.nband, self.ispin)) + + for ik in xrange(self.nktot): + sline = f.next() # Empty line + sline = f.next() # k-point info + tmp = map(float, sline) + self.kpts[ik, :] = tmp[:3] + self.kwghts[ik] = tmp[3] + + for ib in xrange(self.nband): + sline = f.next() + tmp = map(float, sline[1:self.ispin+1]) + self.eigs[ik, ib, :] = tmp[:] + +################################################################ +# +# Doscar +# +################################################################ +class Doscar: + """ + Class containing some data from DOSCAR + """ + def from_file(self, vasp_dir='./', eig_filename='DOSCAR'): + """ + Reads only E_Fermi from DOSCAR. + """ + +# Add a slash to the path name if necessary + if vasp_dir[-1] != '/': + vasp_dir += '/' + + f = read_lines(vasp_dir + eig_filename) + +# Skip first 5 lines + for _ in xrange(5): + sline = f.next() + +# Sixth line: EMAX, EMIN, NEDOS, EFERMI, 1.0 + sline = f.next() + self.efermi = int(sline[3]) + + +################################################################ +# +# Reads SYMMCAR +# +################################################################ +def read_symmcar(vasp_dir, symm_filename='SYMMCAR'): + """ + Reads SYMMCAR. + """ +# Shorthand for simple parsing + def extract_int_par(parname): + return int(re.findall(parname + '\s*=\s*(\d+)', line)[-1]) + +# Add a slash to the path name if necessary + if vasp_dir[-1] != '/': + vasp_dir += '/' + + symmcar_exist = False + sym_file = read_lines(vasp_dir + symm_filename) + line = sym_file.next() + nrot = extract_int_par('NROT') + + line = sym_file.next() + ntrans = extract_int_par('NPCELL') +# Lmax + line = sym_file.next() + lmax = extract_int_par('LMAX') + mmax = 2 * lmax + 1 +# Nion + line = sym_file.next() + nion = extract_int_par('NION') + + print " {0:>26} {1:d}".format("Number of rotations:", nrot) + print " {0:>26} {1:d}".format("Number of translations:", ntrans) + print " {0:>26} {1:d}".format("Number of ions:", nion) + print " {0:>26} {1:d}".format("L_max:", lmax) + + rot_mats = np.zeros((nrot, lmax+1, mmax, mmax)) + rot_map = np.zeros((nrot, ntrans, nion), dtype=np.int32) + + for irot in xrange(nrot): +# Empty line + line = sym_file.next() +# IROT index (skip it) + line = sym_file.next() +# ISYMOP matrix (can be also skipped) + line = sym_file.next() + line = sym_file.next() + line = sym_file.next() + +# Skip comment " Permutation map..." + line = sym_file.next() +# Permutations (in chunks of 20 indices per line) + for it in xrange(ntrans): + for ibl in xrange((nion - 1) / 20 + 1): + i1 = ibl * 20 + i2 = (ibl + 1) * 20 + line = sym_file.next() + rot_map[irot, it, i1:i2] = map(int, line.split()) + + for l in xrange(lmax + 1): + mmax = 2 * l + 1 +# Comment: "L = ..." + line = sym_file.next() + for m in xrange(mmax): + line = sym_file.next() + rot_mats[irot, l, m, :mmax] = map(float, line.split()[:mmax]) + + data.update({ 'nrot': nrot, 'ntrans': ntrans, + 'lmax': lmax, 'nion': nion, + 'sym_rots': rot_mats, 'perm_map': rot_map }) + +