diff --git a/ChangeLog.md b/ChangeLog.md index 1ea3eb50..e33d7e26 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,3 +1,36 @@ +# Ver. 1.1.0 (2019-5-1) + +## New + +- An interface to OpenMX code (contributed by Yuto Tanaka) +- Compressive sensing approach (``LMODEL = enet``) in alm code. Many new variables related to the compressive sensing are also added. See the document page for details. +- ``SPARSE`` and ``SPARSESOLVER`` tags in alm code +- ``DOS``-tag in anphon code +- A python script scph_to_qe.py that converts the result of a SCPH calculation to Quantum ESPRESSO force-constant format. + +## Changes + +- Default value of ``ICONST`` is changed to ``ICONST = 11`` +- Python scripts now work with python3 as well as python2 +- Python interface scripts are move to tools/interface +- Default values for ``MASS``- and ``ISOFACT``-tags are implemented +- Implement a sparse version of rref, which improves the performance of alm significantly. +- Performance improvements of anphon code. +- ``DFILE`` and ``FFILE`` in alm code are now deprecated. Use ``DFSET`` instead. +- ``&fitting`` field in alm is replaced with ``&optimize`` field. + +## Fix + +- Fix a minor bug in calc_damping_tetrahedron. The phonon linewidths at high temperatures and the thermal conductivityies were not affected by this minor error. In very low temperature region (< 10 K), the thermal conductivity may have been underestimated. +- Fix other minor bugs + +# Ver. 1.0.1 (2017-11-21) + +## Fix +- Fixed a minor issue in the previous version + + + # Ver. 1.0.2 (2018-1-29) ## New diff --git a/README.md b/README.md index 2504659e..61d225e0 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![License][license-image]][license-url] [![Doc status][docs-image]][docs-url] -### Version 1.0.2 +### Version 1.1.0 ![alt ALAMODE](./docs/img/alamode.png) @@ -13,7 +13,7 @@ ALAMODE is a scientific software designed for analyzing lattice anharmonicity and lattice thermal conductivity of solids. By using an external DFT package -such as VASP and Quantum ESPRESSO, you can extract harmonic and anharmonic +such as VASP and Quantum ESPRESSO, you can extract harmonic and anharmonic force constants straightforwardly with ALAMODE. Using the calculated anharmonic force constants, you can also estimate lattice thermal conductivity, phonon linewidth, and other anharmonic phonon properties from first principles. @@ -25,7 +25,7 @@ linewidth, and other anharmonic phonon properties from first principles. * Extraction of harmonic and anharmonic force constants based on the supercell approach * Applicable to any crystal structures and low-dimensional systems * Accurate treatment of translational and rotational invariance -* Interface to VASP, Quantum-ESPRESSO, xTAPP, and LAMMPS codes +* Interface to VASP, Quantum-ESPRESSO, OpenMX, xTAPP, and LAMMPS codes * Parallelization with MPI+OpenMP ### Harmonic properties @@ -57,6 +57,7 @@ linewidth, and other anharmonic phonon properties from first principles. * Boost C++ library * FFT library * Eigen3 library +* spglib ## Download @@ -75,7 +76,7 @@ If you download the github version, please use the 'master' branch. The directories alm/, anphon/, and tools/ contain separate Makefiles. Please modify the Makefiles appropriately by changing variables such as CXX, CXXFLAGS, or MPICXX. Then, execute "make" will create the binary for -each program. +each program. Please see the documentation for more details. ## Documentation @@ -86,7 +87,7 @@ http://alamode.readthedocs.io ## License -Copyright (c) 2014--2017 Terumasa Tadano +Copyright (c) 2014--2019 Terumasa Tadano This software is released under the MIT license. For license rights and limitations, see LICENSE.txt file. @@ -97,7 +98,7 @@ Terumasa Tadano (National Institute for Materials Science, Japan) * Tatsuro Nishimoto (Univ. Tokyo) * Yusuke Oba (Univ. Tokyo) - +* Atsushi Togo (Kyoto Univ.) [license-image]: https://img.shields.io/github/license/ttadano/alamode.svg diff --git a/alamode.sln b/alamode.sln index d3df06bb..4fb64243 100644 --- a/alamode.sln +++ b/alamode.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.25123.0 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.28803.202 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "alm", "alm\alm.vcxproj", "{0FFEA662-D4F1-4D18-A920-B61EE02A7F21}" EndProject @@ -22,13 +22,15 @@ Global {0FFEA662-D4F1-4D18-A920-B61EE02A7F21}.Debug|x64.ActiveCfg = Debug|Win32 {0FFEA662-D4F1-4D18-A920-B61EE02A7F21}.Release|Win32.ActiveCfg = Release|Win32 {0FFEA662-D4F1-4D18-A920-B61EE02A7F21}.Release|Win32.Build.0 = Release|Win32 - {0FFEA662-D4F1-4D18-A920-B61EE02A7F21}.Release|x64.ActiveCfg = Release|Win32 + {0FFEA662-D4F1-4D18-A920-B61EE02A7F21}.Release|x64.ActiveCfg = Release|x64 + {0FFEA662-D4F1-4D18-A920-B61EE02A7F21}.Release|x64.Build.0 = Release|x64 {80B34241-B404-47A5-B4C6-DA735D121433}.Debug|Win32.ActiveCfg = Debug|Win32 {80B34241-B404-47A5-B4C6-DA735D121433}.Debug|Win32.Build.0 = Debug|Win32 {80B34241-B404-47A5-B4C6-DA735D121433}.Debug|x64.ActiveCfg = Debug|Win32 {80B34241-B404-47A5-B4C6-DA735D121433}.Release|Win32.ActiveCfg = Release|Win32 {80B34241-B404-47A5-B4C6-DA735D121433}.Release|Win32.Build.0 = Release|Win32 - {80B34241-B404-47A5-B4C6-DA735D121433}.Release|x64.ActiveCfg = Release|Win32 + {80B34241-B404-47A5-B4C6-DA735D121433}.Release|x64.ActiveCfg = Release|x64 + {80B34241-B404-47A5-B4C6-DA735D121433}.Release|x64.Build.0 = Release|x64 {93B2B654-5EEE-46E4-8DCF-8E6051B6C1ED}.Debug|Win32.ActiveCfg = Debug|Win32 {93B2B654-5EEE-46E4-8DCF-8E6051B6C1ED}.Debug|Win32.Build.0 = Debug|Win32 {93B2B654-5EEE-46E4-8DCF-8E6051B6C1ED}.Debug|x64.ActiveCfg = Debug|x64 @@ -41,4 +43,7 @@ Global GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {0545154B-4355-4AA5-AC7F-B4206208E703} + EndGlobalSection EndGlobal diff --git a/alm/Makefile.linux b/alm/Makefile.linux index fd27bbd3..8b363f18 100644 --- a/alm/Makefile.linux +++ b/alm/Makefile.linux @@ -6,11 +6,11 @@ #----------------------------------------------- CXX = icpc -CXXFLAGS = -O2 -xHOST -openmp -std=c++11 -INCLUDE = -I../include +CXXFLAGS = -O2 -xHOST -qopenmp -std=c++11 +INCLUDE = -I../include -I$(HOME)/include -I$(SPGLIB_ROOT)/include CXXL = ${CXX} -LDFLAGS = -mkl +LDFLAGS = -mkl -L$(SPGLIB_ROOT)/lib -lsymspg LAPACK = LIBS = ${LAPACK} @@ -24,9 +24,7 @@ LIBS = ${LAPACK} PROG = alm -CXXSRC= alamode.cpp constraint.cpp error.cpp fcs.cpp files.cpp \ - fitting.cpp input.cpp interaction.cpp main.cpp memory.cpp \ - patterndisp.cpp symmetry.cpp system.cpp timer.cpp writes.cpp +CXXSRC= $(wildcard *.cpp) OBJS= ${CXXSRC:.cpp=.o} diff --git a/alm/Makefile.osx b/alm/Makefile.osx index 0e0bbead..af82bcc2 100644 --- a/alm/Makefile.osx +++ b/alm/Makefile.osx @@ -9,12 +9,12 @@ # OpenMP-enabled gcc can be installed via homebrew CXX = g++-8 CXXFLAGS = -O2 -fopenmp -std=c++11 -INCLUDE = -I../include +INCLUDE = -I../include -I$(HOME)/include -I$(SPGLIB_ROOT)/include CXXL = ${CXX} -LDFLAGS = -lgomp +LDFLAGS = -lgomp -L$(SPGLIB_ROOT)/lib -lsymspg -LAPACK = -llapack +LAPACK = -llapack -lblas LIBS = ${LAPACK} #----------------------------------------------- @@ -26,9 +26,7 @@ LIBS = ${LAPACK} PROG = alm -CXXSRC= alamode.cpp constraint.cpp error.cpp fcs.cpp files.cpp \ - fitting.cpp input.cpp interaction.cpp main.cpp memory.cpp \ - patterndisp.cpp symmetry.cpp system.cpp timer.cpp writes.cpp +CXXSRC= $(wildcard *.cpp) OBJS= ${CXXSRC:.cpp=.o} diff --git a/alm/Makefile.osx_clang b/alm/Makefile.osx_clang new file mode 100644 index 00000000..97d1b8cb --- /dev/null +++ b/alm/Makefile.osx_clang @@ -0,0 +1,50 @@ +.SUFFIXES: .h .cpp +#----------------------------------------------- +# Makefile for the program 'ALM'. +# Please modify the variables properly. +# We recommend to use Intel c++ compiler. +#----------------------------------------------- + +# Use clang++ to use hdf5 installed via homebrew +CXX = g++ +CXXFLAGS = -O2 -std=c++11 +INCLUDE = -I../include -I$(HOME)/include -I$(SPGLIB_ROOT)/include + +CXXL = ${CXX} +LDFLAGS = -L$(SPGLIB_ROOT)/lib -lsymspg +#LDFLAGS = -L/usr/local/lib -lhdf5_cpp -lhdf5 -lsymspg + +LAPACK = -llapack -lblas +LIBS = ${LAPACK} + +#----------------------------------------------- +# General rules +#----------------------------------------------- + +.cpp.o: + ${CXX} ${CXXFLAGS} ${INCLUDE} -c $< + +PROG = alm + +CXXSRC= alm.cpp alm_cui.cpp input_parser.cpp input_setter.cpp constraint.cpp fcs.cpp files.cpp \ + optimize.cpp cluster.cpp main.cpp rref.cpp \ + patterndisp.cpp symmetry.cpp system.cpp timer.cpp writer.cpp + +OBJS= ${CXXSRC:.cpp=.o} + +default: alm + +all: ${PROG} + +alm: ${OBJS} + ${CXXL} ${LDFLAGS} -o $@ ${OBJS} ${LIBS} + +clean: + rm -f ${OBJS} + +.PHONY: clean + +depend: + gcc -MM *.cpp > .depend + +-include .depend diff --git a/alm/alamode.cpp b/alm/alamode.cpp deleted file mode 100644 index 5f1a6616..00000000 --- a/alm/alamode.cpp +++ /dev/null @@ -1,118 +0,0 @@ -/* - alamode.cpp - - Copyright (c) 2014, 2015, 2016 Terumasa Tadano - - This file is distributed under the terms of the MIT license. - Please see the file 'LICENCE.txt' in the root directory - or http://opensource.org/licenses/mit-license.php for information. -*/ - -#include -#include -#include "interaction.h" -#include "symmetry.h" -#include "input.h" -#include "system.h" -#include "files.h" -#include "memory.h" -#include "timer.h" -#include "fcs.h" -#include "fitting.h" -#include "constraint.h" -#include "timer.h" -#include "writes.h" -#include "patterndisp.h" -#include "version.h" - -#ifdef _OPENMP -#include -#endif - -using namespace ALM_NS; - -ALM::ALM(int narg, char **arg) -{ - std::cout << " +-----------------------------------------------------------------+" << std::endl; - std::cout << " + Program ALM +" << std::endl; - std::cout << " + Ver."; - std::cout << std::setw(7) << ALAMODE_VERSION; - std::cout << " +" << std::endl; - std::cout << " +-----------------------------------------------------------------+" << std::endl; - std::cout << std::endl; - - timer = new Timer(this); - -#ifdef _OPENMP - std::cout << " Number of OpenMP threads = " - << omp_get_max_threads() << std::endl << std::endl; -#endif - std::cout << " Job started at " << timer->DateAndTime() << std::endl; - - input = new Input(this, narg, arg); - create(); - input->parse_input(narg, arg); - writes->write_input_vars(); - initialize(); - - if (mode == "fitting") { - - fcs->init(); - constraint->setup(); - fitting->fitmain(); - writes->writeall(); - - } else if (mode == "suggest") { - - displace->gen_displacement_pattern(); - writes->write_displacement_pattern(); - - } - - finalize(); - - std::cout << std::endl << " Job finished at " - << timer->DateAndTime() << std::endl; -} - -void ALM::create() -{ - memory = new Memory(this); - files = new Files(this); - system = new System(this); - interaction = new Interaction(this); - fcs = new Fcs(this); - symmetry = new Symmetry(this); - fitting = new Fitting(this); - constraint = new Constraint(this); - displace = new Displace(this); - writes = new Writes(this); -} - -void ALM::initialize() -{ - system->init(); - files->init(); - symmetry->init(); - interaction->init(); -} - -ALM::~ALM() -{ - delete input; - delete timer; -} - -void ALM::finalize() -{ - delete files; - delete interaction; - delete fcs; - delete symmetry; - delete system; - delete fitting; - delete constraint; - delete displace; - delete writes; - delete memory; -} diff --git a/alm/alamode.h b/alm/alamode.h deleted file mode 100644 index 7fdbb494..00000000 --- a/alm/alamode.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - alamode.h - - Copyright (c) 2014 Terumasa Tadano - - This file is distributed under the terms of the MIT license. - Please see the file 'LICENCE.txt' in the root directory - or http://opensource.org/licenses/mit-license.php for information. -*/ - -/* Declaration of pointers used in the whole program. */ - -#pragma once -#include - -namespace ALM_NS -{ - class ALM - { - public: - class Memory *memory; - class Input *input; - class System *system; - class Interaction *interaction; - class Fcs *fcs; - class Symmetry *symmetry; - class Fitting *fitting; - class Constraint *constraint; - class Files *files; - class Displace *displace; - class Writes *writes; - class Error *error; - class Timer *timer; - ALM(int, char **); - ~ALM(); - void create(); - void initialize(); - void finalize(); - - std::string mode; - }; -} diff --git a/alm/alm.cpp b/alm/alm.cpp new file mode 100644 index 00000000..a695be26 --- /dev/null +++ b/alm/alm.cpp @@ -0,0 +1,611 @@ +/* + alm.cpp + + Copyright (c) 2014, 2015, 2016 Terumasa Tadano + + This file is distributed under the terms of the MIT license. + Please see the file 'LICENCE.txt' in the root directory + or http://opensource.org/licenses/mit-license.php for information. +*/ + +#include "alm.h" +#include "constraint.h" +#include "fcs.h" +#include "files.h" +#include "optimize.h" +#include "cluster.h" +#include "patterndisp.h" +#include "symmetry.h" +#include "system.h" +#include "timer.h" +#include +#include + +using namespace ALM_NS; + +ALM::ALM() +{ + create(); + verbosity = 1; + structure_initialized = false; + ready_to_fit = false; + ofs_alm = nullptr; + coutbuf = nullptr; + run_mode = "suggest"; +} + +ALM::~ALM() +{ + delete files; + delete system; + delete cluster; + delete fcs; + delete symmetry; + delete optimize; + delete constraint; + delete displace; + delete timer; +} + +void ALM::create() +{ + files = new Files(); + system = new System(); + cluster = new Cluster(); + fcs = new Fcs(); + symmetry = new Symmetry(); + optimize = new Optimize(); + constraint = new Constraint(); + displace = new Displace(); + timer = new Timer(); +} + +void ALM::set_run_mode(const std::string run_mode_in) +{ + if (run_mode_in != "optimize" && run_mode_in != "suggest") { + std::cout << "Invalid run mode: " << run_mode_in << std::endl; + exit(EXIT_FAILURE); + } + run_mode = run_mode_in; +} + +std::string ALM::get_run_mode() const +{ + return run_mode; +} + +void ALM::set_verbosity(const int verbosity_in) +{ + verbosity = verbosity_in; +} + +int ALM::get_verbosity() const +{ + return verbosity; +} + +void ALM::set_output_filename_prefix(const std::string prefix) const // PREFIX +{ + files->set_prefix(prefix); +} + +void ALM::set_print_symmetry(const int printsymmetry) const // PRINTSYM +{ + symmetry->set_print_symmetry(printsymmetry); +} + +void ALM::set_print_hessian(const bool print_hessian) const // HESSIAN +{ + files->print_hessian = print_hessian; +} + +void ALM::set_symmetry_tolerance(const double tolerance) const // TOLERANCE +{ + symmetry->set_tolerance(tolerance); +} + +void ALM::set_displacement_param(const bool trim_dispsign_for_evenfunc) const // TRIMEVEN +{ + displace->set_trim_dispsign_for_evenfunc(trim_dispsign_for_evenfunc); +} + +void ALM::set_displacement_basis(const std::string str_disp_basis) const // DBASIS +{ + displace->set_disp_basis(str_disp_basis); +} + +void ALM::set_periodicity(const int is_periodic[3]) const // PERIODIC +{ + system->set_periodicity(is_periodic); +} + +void ALM::set_cell(const size_t nat, + const double lavec[3][3], + const double xcoord[][3], + const int kind[], + const std::string kdname[]) const +{ + system->set_supercell(lavec, nat, kind, xcoord); + system->set_kdname(kdname); +} + +void ALM::set_magnetic_params(const size_t nat, + const double (*magmom)[3], + // MAGMOM + const bool lspin, + const int noncollinear, + // NONCOLLINEAR + const int trev_sym_mag, + // TREVSYM + const std::string str_magmom) const // MAGMOM +{ + system->set_spin_variables(nat, + lspin, + noncollinear, + trev_sym_mag, + magmom); + system->set_str_magmom(str_magmom); +} + +void ALM::set_displacement_and_force(const double *u_in, + const double *f_in, + const int nat, + const int ndata_used) const +{ + std::vector> u, f; + + u.resize(ndata_used, std::vector(3 * nat)); + f.resize(ndata_used, std::vector(3 * nat)); + + for (auto i = 0; i < ndata_used; i++) { + for (auto j = 0; j < 3 * nat; j++) { + u[i][j] = u_in[i * nat * 3 + j]; + f[i][j] = f_in[i * nat * 3 + j]; + } + } + optimize->set_training_data(u, f); + u.clear(); + f.clear(); +} + +void ALM::set_constraint_type(const int constraint_flag) const // ICONST +{ + constraint->set_constraint_mode(constraint_flag); +} + +void ALM::set_rotation_axis(const std::string rotation_axis) const // ROTAXIS +{ + constraint->set_rotation_axis(rotation_axis); +} + +void ALM::set_sparse_mode(const int sparse_mode) const // SPARSE +{ + auto optctrl = optimize->get_optimizer_control(); + optctrl.use_sparse_solver = sparse_mode; + optimize->set_optimizer_control(optctrl); +} + +void ALM::define(const int maxorder, + const size_t nkd, + const int *nbody_include, + const double *cutoff_radii) const +{ + // nkd = 0 means cutoff_radii undefined (hopefully nullptr). + cluster->define(maxorder, + nkd, + nbody_include, + cutoff_radii); +} + +size_t ALM::get_nrows_sensing_matrix() const +{ + return optimize->get_number_of_rows_sensing_matrix(); +} + +Cell ALM::get_supercell() const +{ + return system->get_supercell(); +} + +std::string* ALM::get_kdname() const +{ + return system->get_kdname(); +} + +Spin ALM::get_spin() const +{ + return system->get_spin(); +} + +std::string ALM::get_str_magmom() const +{ + return system->get_str_magmom(); +} + +double*** ALM::get_x_image() const +{ + return system->get_x_image(); +} + +int* ALM::get_periodicity() const +{ + return system->get_periodicity(); +} + +const std::vector>& ALM::get_atom_mapping_by_pure_translations() const +{ + return symmetry->get_map_p2s(); +} + +int ALM::get_maxorder() const +{ + return cluster->get_maxorder(); +} + +int* ALM::get_nbody_include() const +{ + return cluster->get_nbody_include(); +} + +size_t ALM::get_number_of_displacement_patterns(const int fc_order) const +// harmonic=1, ... +{ + const auto order = fc_order - 1; + return displace->get_pattern_all(order).size(); +} + +void ALM::get_number_of_displaced_atoms(int *numbers, + const int fc_order) const +// harmonic=1, ... +{ + const auto order = fc_order - 1; + + for (size_t i = 0; i < displace->get_pattern_all(order).size(); ++i) { + numbers[i] = static_cast(displace->get_pattern_all(order)[i].atoms.size()); + } +} + +int ALM::get_displacement_patterns(int *atom_indices, + double *disp_patterns, + const int fc_order) const +// harmonic=1, ... +{ + const auto order = fc_order - 1; + + auto i_atom = 0; + auto i_disp = 0; + for (const auto &displacements : displace->get_pattern_all(order)) { + for (size_t j = 0; j < displacements.atoms.size(); ++j) { + atom_indices[i_atom] = displacements.atoms[j]; + ++i_atom; + for (auto k = 0; k < 3; ++k) { + disp_patterns[i_disp] = displacements.directions[3 * j + k]; + ++i_disp; + } + } + } + + // 0:Cartesian or 1:Fractional. -1 means something wrong. + if (displace->get_disp_basis()[0] == 'C') { + return 0; + } + if (displace->get_disp_basis()[0] == 'F') { + return 1; + } + return -1; +} + +size_t ALM::get_number_of_fc_elements(const int fc_order) const +// harmonic=1, ... +{ + const auto order = fc_order - 1; + + if (fcs->get_nequiv()[order].empty()) { return 0; } + size_t id = 0; + const auto num_unique_elems = fcs->get_nequiv()[order].size(); + + for (size_t iuniq = 0; iuniq < num_unique_elems; ++iuniq) { + const auto num_equiv_elems = fcs->get_nequiv()[order][iuniq]; + id += num_equiv_elems; + } + return id; +} + +size_t ALM::get_number_of_irred_fc_elements(const int fc_order) // harmonic=1, ... +{ + // Returns the number of irreducible force constants for the given order. + // The irreducible force constant means a set of independent force constants + // reduced by using all available symmetry operations and + // constraints for translational invariance. Rotational invariance is not considered. + + const auto order = fc_order - 1; + if (!ready_to_fit) { + constraint->setup(system, + fcs, + cluster, + symmetry, + run_mode, + verbosity, + timer); + ready_to_fit = true; + } + return constraint->get_index_bimap(order).size(); +} + +void ALM::get_fc_origin(double *fc_values, + int *elem_indices, + // (len(fc_values), fc_order + 1) is flatten. + const int fc_order) const +// harmonic=1, ... +{ + // Return a set of force constants Phi(i,j,k,...) where i is an atom + // inside the primitive cell at origin. + + const auto maxorder = cluster->get_maxorder(); + if (fc_order > maxorder) { + std::cout << "fc_order must not be larger than maxorder" << std::endl; + exit(EXIT_FAILURE); + } + + size_t ishift = 0; + size_t ip; + for (auto order = 0; order < fc_order; ++order) { + + if (fcs->get_nequiv()[order].empty()) { continue; } + + auto id = 0; + + if (order == fc_order - 1) { + for (const auto &it : fcs->get_fc_table()[order]) { + + ip = it.mother + ishift; + fc_values[id] = optimize->get_params()[ip] * it.sign; + for (auto i = 0; i < fc_order + 1; ++i) { + elem_indices[id * (fc_order + 1) + i] = it.elems[i]; + } + ++id; + } + } + ishift += fcs->get_nequiv()[order].size(); + } +} + + +void ALM::get_fc_irreducible(double *fc_values, + int *elem_indices, + // (len(fc_values), fc_order + 1) is flatten. + const int fc_order) // harmonic=1, ... +{ + // Return an irreducible set of force constants. + + double fc_elem; + + const auto maxorder = cluster->get_maxorder(); + if (fc_order > maxorder) { + std::cout << "fc_order must not be larger than maxorder" << std::endl; + exit(EXIT_FAILURE); + } + + if (!ready_to_fit) { + constraint->setup(system, + fcs, + cluster, + symmetry, + run_mode, + verbosity, + timer); + ready_to_fit = true; + } + + size_t ishift = 0; + size_t inew, iold; + + for (auto order = 0; order < fc_order; ++order) { + + if (constraint->get_index_bimap(order).empty()) { continue; } + + if (order == fc_order - 1) { + for (const auto &it : constraint->get_index_bimap(order)) { + inew = it.left; + iold = it.right + ishift; + + fc_elem = optimize->get_params()[iold]; + fc_values[inew] = fc_elem; + for (auto i = 0; i < fc_order + 1; ++i) { + elem_indices[inew * (fc_order + 1) + i] = + fcs->get_fc_table()[order][it.right].elems[i]; + } + } + } + ishift += fcs->get_nequiv()[order].size(); + } +} + + +void ALM::get_fc_all(double *fc_values, + int *elem_indices, + // (len(fc_values), fc_order + 1) is flatten. + const int fc_order) const +// harmonic=1, ... +{ + int i; + double fc_elem; + const auto ntran = symmetry->get_ntran(); + + const auto maxorder = cluster->get_maxorder(); + if (fc_order > maxorder) { + std::cout << "fc_order must not be larger than maxorder" << std::endl; + exit(EXIT_FAILURE); + } + + size_t ishift = 0; + size_t ip; + std::vector pair_tmp(fc_order + 1); + std::vector pair_tran(fc_order + 1); + std::vector xyz_tmp(fc_order + 1); + + for (auto order = 0; order < fc_order; ++order) { + + if (fcs->get_nequiv()[order].empty()) { continue; } + + auto id = 0; + + if (order == fc_order - 1) { + for (const auto &it : fcs->get_fc_table()[order]) { + + ip = it.mother + ishift; + fc_elem = optimize->get_params()[ip] * it.sign; + + for (i = 0; i < fc_order + 1; ++i) { + pair_tmp[i] = it.elems[i] / 3; + xyz_tmp[i] = it.elems[i] % 3; + } + + for (size_t itran = 0; itran < ntran; ++itran) { + for (i = 0; i < fc_order + 1; ++i) { + pair_tran[i] = symmetry->get_map_sym()[pair_tmp[i]][symmetry->get_symnum_tran()[itran]]; + } + fc_values[id] = fc_elem; + for (i = 0; i < fc_order + 1; ++i) { + elem_indices[id * (fc_order + 1) + i] = + 3 * pair_tran[i] + xyz_tmp[i]; + } + ++id; + } + } + } + + ishift += fcs->get_nequiv()[order].size(); + } +} + +void ALM::set_fc(double *fc_in) const +{ + optimize->set_fcs_values(cluster->get_maxorder(), + fc_in, + fcs->get_nequiv(), + constraint); +} + +void ALM::get_matrix_elements(double *amat, + double *bvec) const +{ + const auto maxorder = cluster->get_maxorder(); + double fnorm; + + std::vector amat_vec; + std::vector bvec_vec; + + optimize->get_matrix_elements_algebraic_constraint(maxorder, + amat_vec, + bvec_vec, + optimize->get_u_train(), + optimize->get_f_train(), + fnorm, + symmetry, + fcs, + constraint); + // This may be inefficient. + auto i = 0; + for (const auto it : amat_vec) { + amat[i++] = it; + } + i = 0; + for (const auto it : bvec_vec) { + bvec[i++] = it; + } + //amat = amat_vec.data(); + //bvec = bvec_vec.data(); +} + + +void ALM::generate_force_constant() +{ + initialize_structure(); + initialize_interaction(); +} + +void ALM::run() +{ + generate_force_constant(); + + if (run_mode == "optimize") { + run_optimize(); + } else if (run_mode == "suggest") { + run_suggest(); + } +} + +int ALM::run_optimize() +{ + if (!structure_initialized) { + std::cout << "initialize_structure must be called beforehand." << std::endl; + exit(EXIT_FAILURE); + } + if (!ready_to_fit) { + constraint->setup(system, + fcs, + cluster, + symmetry, + run_mode, + verbosity, + timer); + ready_to_fit = true; + } + const auto maxorder = cluster->get_maxorder(); + std::vector str_order(maxorder); + for (auto i = 0; i < maxorder; ++i) { + str_order[i] = cluster->get_ordername(i); + } + const auto info = optimize->optimize_main(symmetry, + constraint, + fcs, + maxorder, + files->get_prefix(), + str_order, + verbosity, + files->get_datfile_train(), + files->get_datfile_validation(), + timer); + return info; +} + +void ALM::run_suggest() const +{ + displace->gen_displacement_pattern(cluster, + symmetry, + fcs, + constraint, + system, + verbosity); +} + +void ALM::initialize_structure() +{ + // Initialization of structure information. + // Perform initialization only once. + + if (structure_initialized) return; + system->init(verbosity, timer); + files->init(); + symmetry->init(system, verbosity, timer); + structure_initialized = true; +} + +void ALM::initialize_interaction() +{ + // Build cluster & force constant table + cluster->init(system, + symmetry, + verbosity, + timer); + fcs->init(cluster, + symmetry, + system->get_supercell().number_of_atoms, + verbosity, + timer); + + // Switch off the ready flag because the force constants are updated + // but corresponding constranits are not. + ready_to_fit = false; +} diff --git a/alm/alm.h b/alm/alm.h new file mode 100644 index 00000000..ca87e214 --- /dev/null +++ b/alm/alm.h @@ -0,0 +1,139 @@ +/* + alm.h + + Copyright (c) 2014, 2015, 2016 Terumasa Tadano + + This file is distributed under the terms of the MIT license. + Please see the file 'LICENCE.txt' in the root directory + or http://opensource.org/licenses/mit-license.php for information. +*/ + +#pragma once + +#include +#include "system.h" +#include "cluster.h" +#include "fcs.h" +#include "symmetry.h" +#include "optimize.h" +#include "constraint.h" +#include "files.h" +#include "patterndisp.h" +#include "timer.h" + +namespace ALM_NS +{ + class ALM + { + public: + ALM(); + ~ALM(); + + class Cluster *cluster{}; + class Fcs *fcs{}; + class Symmetry *symmetry{}; + class Optimize *optimize{}; + class Constraint *constraint{}; + class Files *files{}; + class Displace *displace{}; + class Timer *timer{}; + + void set_run_mode(std::string run_mode_in); + std::string get_run_mode() const; + void set_verbosity(int verbosity_in); + int get_verbosity() const; + void set_output_filename_prefix(std::string prefix) const; + void set_print_symmetry(int printsymmetry) const; + void set_print_hessian(bool print_hessian) const; + void set_symmetry_tolerance(double tolerance) const; + void set_displacement_param(bool trim_dispsign_for_evenfunc) const; + void set_displacement_basis(std::string str_disp_basis) const; + void set_periodicity(const int is_periodic[3]) const; + void set_cell(size_t nat, + const double lavec[3][3], + const double xcoord[][3], + const int kind[], + const std::string kdname[]) const; + void set_magnetic_params(const size_t nat, + const double (*magmom)[3], + const bool lspin, + const int noncollinear, + const int trev_sym_mag, + const std::string str_magmom) const; + void set_displacement_and_force(const double *u_in, + const double *f_in, + int nat, + int ndata_used) const; + void set_constraint_type(int constraint_flag) const; + void set_rotation_axis(std::string rotation_axis) const; + void set_sparse_mode(int sparse_mode) const; + //void set_fitting_filenames(std::string dfile, + // std::string ffile) const; + void define(const int maxorder, + const size_t nkd, + const int *nbody_include, + const double *cutoff_radii) const; + //int get_ndata_used() const; + size_t get_nrows_sensing_matrix() const; + Cell get_supercell() const; + std::string* get_kdname() const; + Spin get_spin() const; + void set_str_magmom(std::string); + std::string get_str_magmom() const; + double*** get_x_image() const; + int* get_periodicity() const; + + const std::vector>& get_atom_mapping_by_pure_translations() const; + int get_maxorder() const; + int* get_nbody_include() const; + + size_t get_number_of_displacement_patterns(const int fc_order) const; // harmonic=1, ... + void get_number_of_displaced_atoms(int *numbers, + int fc_order) const; // harmonic=1, ... + int get_displacement_patterns(int *atom_indices, + double *disp_patterns, + int fc_order) const; // harmonic=1, ... + size_t get_number_of_fc_elements(const int fc_order) const; // harmonic=2, ... + size_t get_number_of_irred_fc_elements(const int fc_order); // harmonic=2, ... + + void get_fc_origin(double *fc_values, + int *elem_indices, + // (len(fc_value), fc_order) is flatten. + int fc_order) const; // harmonic=2, ... + + + void get_fc_irreducible(double *fc_values, + int *elem_indices, + // (len(fc_value), fc_order) is flatten. + int fc_order); // harmonic=2, ... + + + void get_fc_all(double *fc_values, + int *elem_indices, + // (len(fc_value), fc_order) is flatten. + int fc_order) const; // harmonic=2, ... + + void set_fc(double *fc_in) const; + + void get_matrix_elements(double *amat, + double *bvec) const; + void generate_force_constant(); + int run_optimize(); + void run_suggest() const; + void run(); + + private: + class System *system{}; + + std::string run_mode; + int verbosity; + + bool structure_initialized; + bool ready_to_fit; + std::ofstream *ofs_alm; + std::streambuf *coutbuf; + void create(); + void initialize_structure(); + void initialize_interaction(); + }; +} diff --git a/alm/alm.vcxproj b/alm/alm.vcxproj index 3c265730..33bcd05c 100644 --- a/alm/alm.vcxproj +++ b/alm/alm.vcxproj @@ -1,117 +1,261 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {0FFEA662-D4F1-4D18-A920-B61EE02A7F21} - alm - - - - Application - true - v140 - MultiByte - - - Application - false - v140 - true - MultiByte - - - - - - - - - - - - - $(UniversalCRT_IncludePath);C:\boost\boost_1_60_0;C:\eigen_c++;$(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSDK_IncludePath) - $(UniversalCRT_LibraryPath_x86);C:\boost\boost_1_60_0\lib;$(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(WindowsSDK_LibraryPath_x86) - - - $(UniversalCRT_IncludePath);C:\boost\boost_1_60_0;C:\eigen_c++;$(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSDK_IncludePath) - $(UniversalCRT_LibraryPath_x86);C:\boost\boost_1_60_0\lib;$(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(WindowsSDK_LibraryPath_x86) - - - - Level3 - Disabled - $(SolutionDir)include;C:\lapack - - - true - "C:\lapack" - libblas.lib;liblapack.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Level3 - MaxSpeed - true - true - $(SolutionDir)include;C:\lapack - true - 4018 - - - true - true - true - "C:\lapack" - libblas.lib;liblapack.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug x64 + Win32 + + + Debug x64 + x64 + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {0FFEA662-D4F1-4D18-A920-B61EE02A7F21} + alm + 10.0 + + + + Application + true + v141 + MultiByte + + + Application + true + v141 + MultiByte + + + Application + true + v141 + MultiByte + + + Application + true + v141 + MultiByte + + + Application + false + v142 + true + MultiByte + + + Application + false + v142 + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + C:\boost\include\boost-1_67;C:\spglib;$(UniversalCRT_IncludePath);C:\boost\boost_1_66_0;C:\eigen_c++;$(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSDK_IncludePath);$(IncludePath) + C:\spglib;$(UniversalCRT_LibraryPath_x86);C:\boost\boost_1_66_0\lib;$(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(WindowsSDK_LibraryPath_x86);$(LibraryPath) + + + C:\boost\include\boost-1_67;C:\spglib;$(UniversalCRT_IncludePath);C:\boost\boost_1_66_0;C:\eigen_c++;$(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSDK_IncludePath);$(IncludePath) + C:\spglib;$(UniversalCRT_LibraryPath_x64);C:\boost\boost_1_66_0\lib;$(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(WindowsSDK_LibraryPath_x86);$(LibraryPath) + + + C:\boost\include\boost-1_67;C:\spglib;$(UniversalCRT_IncludePath);C:\boost\boost_1_66_0;C:\eigen_c++;$(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSDK_IncludePath);$(IncludePath) + C:\spglib;$(UniversalCRT_LibraryPath_x86);C:\boost\boost_1_66_0\lib;$(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(WindowsSDK_LibraryPath_x86);$(LibraryPath) + + + C:\boost\include\boost-1_67;C:\spglib;$(UniversalCRT_IncludePath);C:\boost\boost_1_66_0;C:\eigen_c++;$(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSDK_IncludePath);$(IncludePath) + C:\spglib;$(UniversalCRT_LibraryPath_x64);C:\boost\boost_1_66_0\lib;$(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(WindowsSDK_LibraryPath_x86);$(LibraryPath) + + + C:\boost\include\boost-1_67\;C:\spglib;$(UniversalCRT_IncludePath);C:\boost\boost_1_66_0;C:\eigen_c++;$(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSDK_IncludePath);$(IncludePath) + C:\spglib;$(UniversalCRT_LibraryPath_x86);$(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(WindowsSDK_LibraryPath_x86);$(LibraryPath) + + + C:\boost\include\boost-1_67\;C:\spglib;$(UniversalCRT_IncludePath);C:\boost\boost_1_66_0;C:\eigen_c++;$(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSDK_IncludePath);$(IncludePath) + C:\spglib;$(UniversalCRT_LibraryPath_x64);$(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(WindowsSDK_LibraryPath_x86);$(LibraryPath) + + + + Level4 + Disabled + $(SolutionDir)include;C:\lapack + true + stdcpplatest + _MBCS;%(PreprocessorDefinitions);WITH_SPARSE_SOLVER;_SILENCE_CXX17_ALLOCATOR_VOID_DEPRECATION_WARNING + + + true + C:\lapack;C:\spglib + symspg.lib;libblas.lib;liblapack.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + + + Level4 + Disabled + $(SolutionDir)include;C:\lapack + true + stdcpplatest + _MBCS;%(PreprocessorDefinitions);WITH_SPARSE_SOLVER;_SILENCE_CXX17_ALLOCATOR_VOID_DEPRECATION_WARNING + + + true + C:\lapack;C:\spglib + symspg.lib;libblas.lib;liblapack.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + + + Level4 + Disabled + $(SolutionDir)include;C:\lapack + true + stdcpplatest + _MBCS;%(PreprocessorDefinitions);WITH_SPARSE_SOLVER;_SILENCE_CXX17_ALLOCATOR_VOID_DEPRECATION_WARNING + + + true + C:\lapack;C:\spglib + symspg.lib;libblas.lib;liblapack.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + + + Level4 + Disabled + $(SolutionDir)include;C:\lapack + true + stdcpplatest + _MBCS;%(PreprocessorDefinitions);WITH_SPARSE_SOLVER;_SILENCE_CXX17_ALLOCATOR_VOID_DEPRECATION_WARNING + + + true + C:\lapack;C:\spglib + symspg.lib;libblas.lib;liblapack.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + + + Level3 + MaxSpeed + true + true + $(SolutionDir)include;C:\lapack + true + 4018 + _MBCS;%(PreprocessorDefinitions) + + + true + true + true + "C:\lapack"; "C:\spglib" + symspg.lib;libblas.lib;liblapack.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + + + Level3 + MaxSpeed + true + true + $(SolutionDir)include;C:\lapack + true + 4018 + _MBCS;%(PreprocessorDefinitions);WITH_SPARSE_SOLVER + + + true + true + true + "C:\lapack"; "C:\spglib" + symspg.lib;libblas.lib;liblapack.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/alm/alm.vcxproj.filters b/alm/alm.vcxproj.filters index 14081b57..e3043809 100644 --- a/alm/alm.vcxproj.filters +++ b/alm/alm.vcxproj.filters @@ -15,56 +15,56 @@ - + ソース ファイル - + ソース ファイル - + ソース ファイル - + ソース ファイル - + + ソース ファイル + + ソース ファイル - + ソース ファイル - + ソース ファイル - + ソース ファイル - + ソース ファイル - + ソース ファイル - + ソース ファイル - + ソース ファイル - + ソース ファイル - + ソース ファイル - + ソース ファイル - - ヘッダー ファイル - ヘッダー ファイル @@ -80,35 +80,49 @@ ヘッダー ファイル - + ヘッダー ファイル - + ヘッダー ファイル - + ヘッダー ファイル - + ヘッダー ファイル - + ヘッダー ファイル - + ヘッダー ファイル - + ヘッダー ファイル - + ヘッダー ファイル - + ヘッダー ファイル - + ヘッダー ファイル + + ヘッダー ファイル + + + ヘッダー ファイル + + + ヘッダー ファイル + + + + + ソース ファイル + \ No newline at end of file diff --git a/alm/alm_cui.cpp b/alm/alm_cui.cpp new file mode 100644 index 00000000..3c64c89f --- /dev/null +++ b/alm/alm_cui.cpp @@ -0,0 +1,81 @@ +/* + alm_cui.cpp + + Copyright (c) 2014, 2015, 2016 Terumasa Tadano + + This file is distributed under the terms of the MIT license. + Please see the file 'LICENCE.txt' in the root directory + or http://opensource.org/licenses/mit-license.php for information. +*/ + +#include "alm_cui.h" +#include "alm.h" +#include "input_parser.h" +#include "timer.h" +#include "version.h" +#include "writer.h" +#include +#include + +#ifdef _OPENMP +#include +#endif + +using namespace ALM_NS; + +ALMCUI::ALMCUI() {} + +ALMCUI::~ALMCUI() {} + +void ALMCUI::run(const int narg, + char **arg) const +{ + auto alm = new ALM(); + + // alm->mode is set herein. + auto input_parser = new InputParser(); + input_parser->run(alm, narg, arg); + delete input_parser; + + if (alm->get_verbosity() > 0) { + std::cout << " +-----------------------------------------------------------------+" << std::endl; + std::cout << " + Program ALM +" << std::endl; + std::cout << " + Ver."; + std::cout << std::setw(7) << ALAMODE_VERSION; + std::cout << " +" << std::endl; + std::cout << " +-----------------------------------------------------------------+" << std::endl; + std::cout << std::endl; +#ifdef _OPENMP + std::cout << " Number of OpenMP threads = " + << omp_get_max_threads() << std::endl << std::endl; +#endif + + std::cout << " Job started at " << alm->timer->DateAndTime() << std::endl; + } + + auto writer = new Writer(); + + if (alm->get_verbosity() > 0) { + writer->write_input_vars(alm); + } + + alm->run(); + + if (alm->get_run_mode() == "optimize") { + if (alm->optimize->get_optimizer_control().linear_model == 1 || + (alm->optimize->get_optimizer_control().linear_model == 2 + && alm->optimize->get_optimizer_control().cross_validation == 0)) { + writer->writeall(alm); + } + } else if (alm->get_run_mode() == "suggest") { + writer->write_displacement_pattern(alm); + } + delete writer; + + if (alm->get_verbosity() > 0) { + std::cout << std::endl << " Job finished at " + << alm->timer->DateAndTime() << std::endl; + } + + delete alm; +} diff --git a/alm/alm_cui.h b/alm/alm_cui.h new file mode 100644 index 00000000..94227017 --- /dev/null +++ b/alm/alm_cui.h @@ -0,0 +1,24 @@ +/* + almcui.h + + Copyright (c) 2014, 2015, 2016 Terumasa Tadano + + This file is distributed under the terms of the MIT license. + Please see the file 'LICENCE.txt' in the root directory + or http://opensource.org/licenses/mit-license.php for information. +*/ + + +#pragma once + +namespace ALM_NS +{ + class ALMCUI + { + public: + ALMCUI(); + ~ALMCUI(); + void run(const int narg, + char **arg) const; + }; +} diff --git a/alm/cluster.cpp b/alm/cluster.cpp new file mode 100644 index 00000000..6a8e9217 --- /dev/null +++ b/alm/cluster.cpp @@ -0,0 +1,924 @@ +/* +cluster.cpp + +Copyright (c) 2014, 2015, 2016 Terumasa Tadano + +This file is distributed under the terms of the MIT license. +Please see the file 'LICENCE.txt' in the root directory +or http://opensource.org/licenses/mit-license.php for information. +*/ + +#include "cluster.h" +#include "combination.h" +#include "constants.h" +#include "fcs.h" +#include "mathfunctions.h" +#include "memory.h" +#include "symmetry.h" +#include "system.h" +#include "timer.h" +#include +#include +#include +#include +#include +#include + +using namespace ALM_NS; + +Cluster::Cluster() +{ + set_default_variables(); +} + +Cluster::~Cluster() +{ + deallocate_variables(); +} + +void Cluster::init(const System *system, + const Symmetry *symmetry, + const int verbosity, + Timer *timer) +{ + timer->start_clock("cluster"); + + int i; + size_t j, k; + const auto nat = system->get_supercell().number_of_atoms; + const auto nkd = system->get_supercell().number_of_elems; + + if (verbosity > 0) { + std::cout << " INTERACTION" << std::endl; + std::cout << " ===========" << std::endl << std::endl; + } + + if (distall) { + deallocate(distall); + } + allocate(distall, nat, nat); + + if (mindist_pairs) { + deallocate(mindist_pairs); + } + allocate(mindist_pairs, nat, nat); + + if (interaction_pair) { + deallocate(interaction_pair); + } + allocate(interaction_pair, maxorder, symmetry->get_nat_prim()); + + if (interaction_cluster) { + deallocate(interaction_cluster); + } + allocate(interaction_cluster, maxorder, symmetry->get_nat_prim()); + + if (cluster_list) { + deallocate(cluster_list); + } + allocate(cluster_list, maxorder); + + // Default values of cutoof_radii and nbody_include + if (! cutoff_radii) { + allocate(cutoff_radii, maxorder, nkd, nkd); + for (i = 0; i < maxorder; ++i) { + for (j = 0; j < nkd; ++j) { + for (k = 0; k < nkd; ++k) { + cutoff_radii[i][j][k] = -1.0; + } + } + } + } + if (! nbody_include) { + allocate(nbody_include, maxorder); + for (i = 0; i < maxorder; ++i) { + nbody_include[i] = i + 2; + } + } + + get_pairs_of_minimum_distance(nat, + system->get_x_image(), + system->get_exist_image()); + + set_interaction_by_cutoff(system->get_supercell().number_of_atoms, + system->get_supercell().kind, + symmetry->get_nat_prim(), + symmetry->get_map_p2s()); + + calc_interaction_clusters(symmetry->get_nat_prim(), + system->get_supercell().kind, + symmetry->get_map_p2s(), + system->get_x_image(), + system->get_exist_image()); + + generate_pairs(symmetry->get_nat_prim(), + symmetry->get_map_p2s(), + cluster_list); + + + if (verbosity > 0) { + std::cout << " +++ Cutoff Radii Matrix in Bohr Unit (NKD x NKD matrix) +++" << std::endl; + + for (i = 0; i < maxorder; ++i) { + std::cout << " " << std::setw(9) << get_ordername(i) << std::endl; + for (j = 0; j < nkd; ++j) { + for (k = 0; k < nkd; ++k) { + if (cutoff_radii[i][j][k] < 0.0) { + std::cout << std::setw(9) << "None"; + } else { + std::cout << std::setw(9) << cutoff_radii[i][j][k]; + } + } + std::cout << std::endl; + } + std::cout << std::endl; + } + + print_neighborlist(system->get_supercell().number_of_atoms, + symmetry->get_nat_prim(), + symmetry->get_map_p2s(), + system->get_supercell().kind, + system->get_kdname()); + } + + if (verbosity > 1) { + print_interaction_information(symmetry->get_nat_prim(), + symmetry->get_map_p2s(), + system->get_supercell().kind, + system->get_kdname(), + interaction_pair); + } + + if (verbosity > 0) { + for (i = 0; i < maxorder; ++i) { + if (i + 2 > nbody_include[i]) { + std::cout << " For " << std::setw(8) << get_ordername(i) << ", "; + std::cout << "interactions related to more than" << std::setw(2) << nbody_include[i]; + std::cout << " atoms will be neglected." << std::endl; + } + } + + + timer->print_elapsed(); + std::cout << " -------------------------------------------------------------------" << std::endl; + std::cout << std::endl; + } + + timer->stop_clock("cluster"); +} + +void Cluster::generate_pairs(const size_t natmin, + const std::vector> &map_p2s, + std::set *pair_out) const +{ + int *pair_tmp; + + for (auto order = 0; order < maxorder; ++order) { + + pair_out[order].clear(); + + allocate(pair_tmp, order + 2); + + for (size_t i = 0; i < natmin; ++i) { + + const auto iat = map_p2s[i][0]; + + for (const auto &it : interaction_cluster[order][i]) { + + pair_tmp[0] = iat; + for (auto j = 0; j < order + 1; ++j) { + pair_tmp[j + 1] = it.atom[j]; + } + insort(order + 2, pair_tmp); + + // Ignore many-body case + // if (!satisfy_nbody_rule(order + 2, pair_tmp, order)) continue; + pair_out[order].insert(IntList(order + 2, pair_tmp)); + } + } + deallocate(pair_tmp); + } +} + +void Cluster::set_default_variables() +{ + maxorder = 0; + nbody_include = nullptr; + cutoff_radii = nullptr; + distall = nullptr; + mindist_pairs = nullptr; + cluster_list = nullptr; + interaction_pair = nullptr; + interaction_cluster = nullptr; +} + +void Cluster::deallocate_variables() +{ + if (nbody_include) { + deallocate(nbody_include); + nbody_include = nullptr; + } + if (cutoff_radii) { + deallocate(cutoff_radii); + cutoff_radii = nullptr; + } + if (cluster_list) { + deallocate(cluster_list); + cluster_list = nullptr; + } + if (mindist_pairs) { + deallocate(mindist_pairs); + mindist_pairs = nullptr; + } + if (interaction_pair) { + deallocate(interaction_pair); + interaction_pair = nullptr; + } + if (interaction_cluster) { + deallocate(interaction_cluster); + interaction_cluster = nullptr; + } + if (distall) { + deallocate(distall); + distall = nullptr; + } +} + +double Cluster::distance(const double *x1, + const double *x2) const +{ + auto dist = std::pow(x1[0] - x2[0], 2) + std::pow(x1[1] - x2[1], 2) + std::pow(x1[2] - x2[2], 2); + dist = std::sqrt(dist); + + return dist; +} + +void Cluster::get_pairs_of_minimum_distance(const size_t nat, + const double *const *const *xc_in, + const int *exist) const +{ + size_t i, j; + double vec[3]; + + for (i = 0; i < nat; ++i) { + for (j = 0; j < nat; ++j) { + + distall[i][j].clear(); + + for (auto icell = 0; icell < 27; ++icell) { + + if (exist[icell]) { + + const auto dist_tmp = distance(xc_in[0][i], xc_in[icell][j]); + + for (auto k = 0; k < 3; ++k) vec[k] = xc_in[icell][j][k] - xc_in[0][i][k]; + + distall[i][j].emplace_back(DistInfo(icell, dist_tmp, vec)); + } + } + std::sort(distall[i][j].begin(), distall[i][j].end()); + } + } + + // Construct pairs of minimum distance. + + for (i = 0; i < nat; ++i) { + for (j = 0; j < nat; ++j) { + mindist_pairs[i][j].clear(); + + const auto dist_min = distall[i][j][0].dist; + for (auto it = distall[i][j].cbegin(); it != distall[i][j].cend(); ++it) { + // The tolerance below (1.e-3) should be chosen so that + // the mirror images with equal distances are found correctly. + // If this fails, the phonon dispersion would be incorrect. + if (std::abs((*it).dist - dist_min) < 1.0e-3) { + mindist_pairs[i][j].emplace_back(DistInfo(*it)); + } + } + } + } +} + +void Cluster::print_neighborlist(const size_t nat, + const size_t natmin, + const std::vector> &map_p2s, + const std::vector &kd, + const std::string *kdname) const +{ + // + // Print the list of neighboring atoms and distances + // + size_t i, j, k; + int iat; + int icount; + + std::vector *neighborlist; + + allocate(neighborlist, natmin); + + for (i = 0; i < natmin; ++i) { + neighborlist[i].clear(); + + iat = map_p2s[i][0]; + + for (j = 0; j < nat; ++j) { + neighborlist[i].emplace_back(DistList(j, mindist_pairs[iat][j][0].dist)); + } + std::sort(neighborlist[i].begin(), neighborlist[i].end()); + } + + std::cout << std::endl; + std::cout << " List of neighboring atoms below." << std::endl; + std::cout << " Format [N th-nearest shell, distance in Bohr (Number of atoms on the shell)]" + << std::endl << std::endl; + + std::vector atomlist; + + for (i = 0; i < natmin; ++i) { + + auto nthnearest = 0; + atomlist.clear(); + + iat = map_p2s[i][0]; + std::cout << std::setw(5) << iat + 1 << " (" + << std::setw(3) << kdname[kd[iat] - 1] << "): "; + + auto dist_tmp = 0.0; + + for (j = 0; j < nat; ++j) { + + if (neighborlist[i][j].dist < eps8) continue; // distance is zero + + if (std::abs(neighborlist[i][j].dist - dist_tmp) > eps6) { + + if (!atomlist.empty()) { + nthnearest += 1; + + if (nthnearest > 1) std::cout << std::setw(13) << " "; + + std::cout << std::setw(3) << nthnearest << std::setw(10) << dist_tmp + << " (" << std::setw(3) << atomlist.size() << ") -"; + + icount = 0; + for (k = 0; k < atomlist.size(); ++k) { + + if (icount % 4 == 0 && icount > 0) { + std::cout << std::endl; + std::cout << std::setw(34) << " "; + } + ++icount; + + std::cout << std::setw(4) << atomlist[k] + 1; + std::cout << "(" << std::setw(3) + << kdname[kd[atomlist[k]] - 1] << ")"; + + } + std::cout << std::endl; + } + + + dist_tmp = neighborlist[i][j].dist; + atomlist.clear(); + atomlist.push_back(neighborlist[i][j].atom); + } else { + atomlist.push_back(neighborlist[i][j].atom); + } + } + if (!atomlist.empty()) { + nthnearest += 1; + + if (nthnearest > 1) std::cout << std::setw(13) << " "; + + std::cout << std::setw(3) << nthnearest << std::setw(10) << dist_tmp + << " (" << std::setw(3) << atomlist.size() << ") -"; + + icount = 0; + for (k = 0; k < atomlist.size(); ++k) { + + if (icount % 4 == 0 && icount > 0) { + std::cout << std::endl; + std::cout << std::setw(34) << " "; + } + ++icount; + + std::cout << std::setw(4) << atomlist[k] + 1; + std::cout << "(" << std::setw(3) + << kdname[kd[atomlist[k]] - 1] << ")"; + + } + std::cout << std::endl; + } + std::cout << std::endl; + } + atomlist.clear(); + deallocate(neighborlist); +} + + +void Cluster::generate_interaction_information_by_cutoff(const size_t nat, + const size_t natmin, + const std::vector &kd, + const std::vector> &map_p2s, + const double *const *rc, + std::vector *interaction_list) const +{ + for (size_t i = 0; i < natmin; ++i) { + + interaction_list[i].clear(); + + const auto iat = map_p2s[i][0]; + const auto ikd = kd[iat] - 1; + + for (size_t jat = 0; jat < nat; ++jat) { + + const auto jkd = kd[jat] - 1; + const auto cutoff_tmp = rc[ikd][jkd]; + + if (cutoff_tmp < 0.0) { + + // Cutoff 'None' + interaction_list[i].push_back(jat); + + } else { + + if (mindist_pairs[iat][jat][0].dist <= cutoff_tmp) { + interaction_list[i].push_back(jat); + } + } + } + } +} + +void Cluster::set_interaction_by_cutoff(const size_t nat, + const std::vector &kd, + const size_t nat_prim, + const std::vector> &map_p2s) const +{ + for (auto order = 0; order < maxorder; ++order) { + generate_interaction_information_by_cutoff(nat, + nat_prim, + kd, + map_p2s, + cutoff_radii[order], + interaction_pair[order]); + } +} + +int Cluster::get_maxorder() const +{ + return maxorder; +} + +void Cluster::define(const int maxorder_in, + const size_t nkd, + const int *nbody_include_in, + const double *cutoff_radii_in) +{ + maxorder = maxorder_in; + if (nbody_include) { + deallocate(nbody_include); + } + allocate(nbody_include, maxorder); + + for (auto i = 0; i < maxorder; ++i) { + nbody_include[i] = nbody_include_in[i]; + } + + // nkd == 0: Use current values, which are probably default values + // defined at Cluster::init(). + if (nkd > 0) { + if (cutoff_radii) { + deallocate(cutoff_radii); + } + allocate(cutoff_radii, maxorder, nkd, nkd); + } + + // if cutoff_radii_in = nullptr, use current value + if (cutoff_radii_in) { + auto counter = 0; + for (auto i = 0; i < maxorder; ++i) { + for (size_t j = 0; j < nkd; ++j) { + for (size_t k = 0; k < nkd; ++k) { + cutoff_radii[i][j][k] = cutoff_radii_in[counter++]; + } + } + } + } +} + +int* Cluster::get_nbody_include() const +{ + return nbody_include; +} + +std::string Cluster::get_ordername(const unsigned int order) const +{ + if (order == 0) { + return "HARMONIC"; + } else { + return "ANHARM" + std::to_string(order + 2); + } +} + +const std::set& Cluster::get_cluster_list(const unsigned int order) const +{ + return cluster_list[order]; +} + +const std::vector& Cluster::get_interaction_pair(const unsigned int order, + const size_t atom_index) const +{ + return interaction_pair[order][atom_index]; +} + +const std::set& Cluster::get_interaction_cluster(const unsigned int order, + const size_t atom_index) const +{ + return interaction_cluster[order][atom_index]; +} + +void Cluster::print_interaction_information(const size_t natmin, + const std::vector> &map_p2s, + const std::vector &kd, + const std::string *kdname, + const std::vector *const *interaction_list) const +{ + std::vector intlist; + + std::cout << std::endl; + std::cout << " List of interacting atom pairs considered for each order:" << std::endl; + + for (auto order = 0; order < maxorder; ++order) { + + std::cout << std::endl << " ***" << get_ordername(order) << "***" << std::endl; + + for (size_t i = 0; i < natmin; ++i) { + + if (interaction_list[order][i].empty()) { + std::cout << " No interacting atoms! Skipped." << std::endl; + continue; // no interaction + } + + const auto iat = map_p2s[i][0]; + + intlist.clear(); + for (auto &it : interaction_list[order][i]) { + intlist.push_back(it); + } + std::sort(intlist.begin(), intlist.end()); + + // write atoms inside the cutoff radius + std::cout << " Atom " << std::setw(5) << iat + 1 + << "(" << std::setw(3) << kdname[kd[iat] - 1] + << ")" << " interacts with atoms ... " << std::endl; + + for (size_t id = 0; id < intlist.size(); ++id) { + if (id % 6 == 0) { + if (id == 0) { + std::cout << " "; + } else { + std::cout << std::endl; + std::cout << " "; + } + } + std::cout << std::setw(5) << intlist[id] + 1 << "(" + << std::setw(3) << kdname[kd[intlist[id]] - 1] << ")"; + } + + std::cout << std::endl << std::endl; + std::cout << " Number of total interaction pairs = " + << interaction_list[order][i].size() << std::endl << std::endl; + } + } + + std::cout << std::endl; +} + + +bool Cluster::is_incutoff(const int n, + const int *atomnumlist, + const size_t order, + const std::vector &kd) const +{ + for (auto i = 0; i < n; ++i) { + const auto iat = atomnumlist[i]; + const auto ikd = kd[iat] - 1; + + for (auto j = i + 1; j < n; ++j) { + const auto jat = atomnumlist[j]; + const auto jkd = kd[jat] - 1; + + const auto cutoff_tmp = cutoff_radii[order][ikd][jkd]; + + if (cutoff_tmp >= 0.0 && + (mindist_pairs[iat][jat][0].dist > cutoff_tmp)) { + return false; + } + + } + } + return true; +} + +int Cluster::nbody(const int n, + const int *arr) const +{ + std::vector v(n); + + for (auto i = 0; i < n; ++i) { + v[i] = arr[i]; + } + std::stable_sort(v.begin(), v.end()); + v.erase(std::unique(v.begin(), v.end()), v.end()); + + const auto ret = v.size(); + v.clear(); + + return static_cast(ret); +} + +bool Cluster::satisfy_nbody_rule(const int nelem, + const int *arr, + const int order) const +{ + return nbody(nelem, arr) <= nbody_include[order]; +} + + +void Cluster::calc_interaction_clusters(const size_t natmin, + const std::vector &kd, + const std::vector> &map_p2s, + const double *const *const *x_image, + const int *exist) const +{ + // + // Calculate the complete set of clusters for all orders. + // + + for (auto order = 0; order < maxorder; ++order) { + set_interaction_cluster(order, + natmin, + kd, + map_p2s, + interaction_pair[order], + x_image, + exist, + interaction_cluster[order]); + + } +} + + +void Cluster::set_interaction_cluster(const int order, + const size_t natmin, + const std::vector &kd, + const std::vector> &map_p2s, + const std::vector *interaction_pair_in, + const double *const *const *x_image, + const int *exist, + std::set *interaction_cluster_out) const +{ + // + // Calculate a set of clusters for the given order + // + + size_t j, k; + int jat; + size_t ii; + int jkd; + int icount; + + double dist_tmp, rc_tmp; + double distmax; + + bool isok; + + int *list_now; + + std::vector cell_vector; + std::vector dist_vector; + std::vector> pairs_icell, comb_cell, comb_cell_min; + std::vector> comb_cell_atom_center; + std::vector accum_tmp; + std::vector atom_tmp, cell_tmp; + std::vector intpair_uniq, cellpair; + std::vector group_atom; + std::vector data_now; + std::vector distance_list; + std::vector> data_vec; + + allocate(list_now, order + 2); + + for (size_t i = 0; i < natmin; ++i) { + + interaction_cluster_out[i].clear(); + + const auto iat = map_p2s[i][0]; + const auto ikd = kd[iat] - 1; + list_now[0] = iat; + + // List of 2-body interaction pairs + std::vector intlist(interaction_pair_in[i]); + std::sort(intlist.begin(), intlist.end()); // Need to sort here + + if (order == 0) { + + // Harmonic term + + for (auto ielem : intlist) { + + jat = ielem; + list_now[1] = jat; + + if (!satisfy_nbody_rule(2, list_now, 0)) continue; + + comb_cell_min.clear(); + atom_tmp.clear(); + atom_tmp.push_back(jat); + + for (j = 0; j < mindist_pairs[iat][jat].size(); ++j) { + cell_tmp.clear(); + cell_tmp.push_back(mindist_pairs[iat][jat][j].cell); + comb_cell_min.push_back(cell_tmp); + } + distmax = mindist_pairs[iat][jat][0].dist; + interaction_cluster_out[i].insert(InteractionCluster(atom_tmp, + comb_cell_min, + distmax)); + } + + } else if (order > 0) { + + // Anharmonic terms + + data_vec.clear(); + + // First, we generate all possible combinations of clusters. + CombinationWithRepetition g(intlist.begin(), intlist.end(), order + 1); + do { + auto data = g.now(); + + list_now[0] = iat; + for (auto m = 0; m < order + 1; ++m) list_now[m + 1] = data[m]; + + // Save as a candidate if the cluster satisfies the NBODY-rule. + if (satisfy_nbody_rule(order + 2, list_now, order)) { + data_vec.emplace_back(data); + } + + } while (g.next()); + + intlist.clear(); + + const auto ndata = data_vec.size(); + + for (size_t idata = 0; idata < ndata; ++idata) { + + data_now = data_vec[idata]; + + // Uniq the list of atoms in data like as follows: + // cubic term : (i, i) --> (i) x 2 + // quartic term : (i, i, j) --> (i, j) x (2, 1) + intpair_uniq.clear(); + group_atom.clear(); + icount = 1; + + for (auto m = 0; m < order; ++m) { + if (data_now[m] == data_now[m + 1]) { + ++icount; + } else { + group_atom.push_back(icount); + intpair_uniq.push_back(data_now[m]); + icount = 1; + } + } + group_atom.push_back(icount); + intpair_uniq.push_back(data_now[order]); + + pairs_icell.clear(); + for (j = 0; j < intpair_uniq.size(); ++j) { + jat = intpair_uniq[j]; + jkd = kd[jat] - 1; + + rc_tmp = cutoff_radii[order][ikd][jkd]; + cell_vector.clear(); + + // Loop over the cell images of atom 'jat' and add to the list + // as a candidate for the cluster. + // The mirror images whose distance is larger than the minimum value + // of the distance(iat, jat) can be added to the cell_vector list. + for (const auto &it : distall[iat][jat]) { + if (exist[it.cell]) { + if (rc_tmp < 0.0 || it.dist <= rc_tmp) { + cell_vector.push_back(it.cell); + } + } + } + pairs_icell.push_back(cell_vector); + } + + accum_tmp.clear(); + comb_cell.clear(); + cell_combination(pairs_icell, 0, accum_tmp, comb_cell); + + distance_list.clear(); + for (j = 0; j < comb_cell.size(); ++j) { + + cellpair.clear(); + + for (k = 0; k < group_atom.size(); ++k) { + for (auto m = 0; m < group_atom[k]; ++m) { + cellpair.push_back(comb_cell[j][k]); + } + } + + dist_vector.clear(); + + for (k = 0; k < cellpair.size(); ++k) { + dist_tmp = distance(x_image[cellpair[k]][data_now[k]], x_image[0][iat]); + dist_vector.push_back(dist_tmp); + } + + // Flag to check if the distance is smaller than the cutoff radius + isok = true; + + for (k = 0; k < cellpair.size(); ++k) { + for (ii = k + 1; ii < cellpair.size(); ++ii) { + dist_tmp = distance(x_image[cellpair[k]][data_now[k]], + x_image[cellpair[ii]][data_now[ii]]); + rc_tmp = cutoff_radii[order][kd[data_now[k]] - 1][kd[data_now[ii]] - 1]; + if (rc_tmp >= 0.0 && dist_tmp > rc_tmp) { + isok = false; + break; + } + dist_vector.push_back(dist_tmp); + } + if (!isok) break; + } + if (isok) { + // This combination is a candidate of the minimum distance cluster + distance_list.emplace_back(MinDistList(cellpair, dist_vector)); + } + } // close loop over the mirror image combination + + if (!distance_list.empty()) { + // If the distance_list is not empty, there is a set of mirror images + // that satisfies the condition of the cluster. + + pairs_icell.clear(); + for (j = 0; j < intpair_uniq.size(); ++j) { + jat = intpair_uniq[j]; + cell_vector.clear(); + + for (ii = 0; ii < mindist_pairs[iat][jat].size(); ++ii) { + cell_vector.push_back(mindist_pairs[iat][jat][ii].cell); + } + pairs_icell.push_back(cell_vector); + } + + accum_tmp.clear(); + comb_cell.clear(); + comb_cell_atom_center.clear(); + cell_combination(pairs_icell, 0, accum_tmp, comb_cell); + + for (j = 0; j < comb_cell.size(); ++j) { + cellpair.clear(); + for (k = 0; k < group_atom.size(); ++k) { + for (auto m = 0; m < group_atom[k]; ++m) { + cellpair.push_back(comb_cell[j][k]); + } + } + comb_cell_atom_center.push_back(cellpair); + } + + std::sort(distance_list.begin(), distance_list.end(), + MinDistList::compare_max_distance); + distmax = *std::max_element(distance_list[0].dist.begin(), + distance_list[0].dist.end()); + interaction_cluster_out[i].insert(InteractionCluster(data_now, + comb_cell_atom_center, + distmax)); + } + } + } + } + deallocate(list_now); +} + + +void Cluster::cell_combination(const std::vector> &array, + const size_t i, + const std::vector &accum, + std::vector> &comb) const +{ + if (i == array.size()) { + comb.push_back(accum); + } else { + auto row = array[i]; + for (auto j : row) { + auto tmp(accum); + tmp.push_back(j); + cell_combination(array, i + 1, tmp, comb); + } + } +} diff --git a/alm/cluster.h b/alm/cluster.h new file mode 100644 index 00000000..ab7d9205 --- /dev/null +++ b/alm/cluster.h @@ -0,0 +1,302 @@ +/* + cluster.h + + Copyright (c) 2014 Terumasa Tadano + + This file is distributed under the terms of the MIT license. + Please see the file 'LICENCE.txt' in the root directory + or http://opensource.org/licenses/mit-license.php for information. +*/ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include "constants.h" +#include "system.h" +#include "symmetry.h" +#include "timer.h" + +namespace ALM_NS +{ + class IntList + { + public: + std::vector iarray; + + IntList() = default; + ~IntList() = default; + IntList(const IntList &a) = default; + + IntList(const int n, + const int *arr) + { + for (auto i = 0; i < n; ++i) { + iarray.push_back(arr[i]); + } + } + + bool operator<(const IntList &a) const + { + return std::lexicographical_compare(iarray.begin(), iarray.end(), + a.iarray.begin(), a.iarray.end()); + } + + bool operator==(const IntList &a) const + { + const auto n = iarray.size(); + const auto n_ = a.iarray.size(); + if (n != n_) return false; + for (size_t i = 0; i < n; ++i) { + if (iarray[i] != a.iarray[i]) return false; + } + return true; + } + }; + + + class DistInfo + { + public: + int cell; + double dist; + double relvec[3]{}; + + DistInfo() = default; + ~DistInfo() = default; + DistInfo(const DistInfo &obj) = default; + + DistInfo(const int n, + const double d, + const double x[3]) + { + cell = n; + dist = d; + for (auto i = 0; i < 3; ++i) relvec[i] = x[i]; + } + + bool operator<(const DistInfo &a) const + { + return dist < a.dist; + } + }; + + class DistList + // This class is used only in print_neighborlist. Can be replaced by a more generalic function. + { + public: + size_t atom; + double dist; + + DistList() = default; + + DistList(const size_t atom_, + const double dist_) : atom(atom_), dist(dist_) { }; + + bool operator<(const DistList &a) const + { + if (std::abs(dist - a.dist) > eps8) { + return dist < a.dist; + } + return atom < a.atom; + } + }; + + class MinDistList + { + public: + std::vector cell; + std::vector dist; + + MinDistList() = default; + + MinDistList(std::vector cell_in, + std::vector dist_in) + : cell(std::move(cell_in)), dist(std::move(dist_in)) {}; + + static bool compare_sum_distance(const MinDistList &a, + const MinDistList &b) + { + double dist_a = 0; + double dist_b = 0; + + for (auto i : a.dist) { + dist_a += i; + } + for (auto i : b.dist) { + dist_b += i; + } + return dist_a < dist_b; + } + + static bool compare_max_distance(const MinDistList &a, + const MinDistList &b) + { + // This function works properly when dvec_a.size() > 0 and dvec_b.size() > 0 + std::vector dvec_a, dvec_b; + std::copy(a.dist.begin(), a.dist.end(), std::back_inserter(dvec_a)); + std::copy(b.dist.begin(), b.dist.end(), std::back_inserter(dvec_b)); + const auto max_dist_a = *std::max_element(dvec_a.begin(), dvec_a.end()); + const auto max_dist_b = *std::max_element(dvec_b.begin(), dvec_b.end()); + + return max_dist_a < max_dist_b; + } + }; + + class InteractionCluster + { + public: + std::vector atom; + std::vector> cell; + double distmax; + + InteractionCluster() = default; + + InteractionCluster(std::vector atom_in, + std::vector> cell_in, + const double dist_in) + : atom(std::move(atom_in)), cell(std::move(cell_in)), distmax(dist_in) {}; + + InteractionCluster(std::vector atom_in, + std::vector> cell_in) + : atom(std::move(atom_in)), cell(std::move(cell_in)), distmax(0.0) {}; + + + bool operator<(const InteractionCluster &a) const + { + return lexicographical_compare(atom.begin(), atom.end(), + a.atom.begin(), a.atom.end()); + } + }; + + class Cluster + { + public: + Cluster(); + ~Cluster(); + + void init(const System *system, + const Symmetry *symmetry, + const int verbosity, + Timer *timer); + + bool satisfy_nbody_rule(const int nelem, + const int *arr, + const int order) const; + + bool is_incutoff(const int n, + const int *atomnumlist, + const size_t order, + const std::vector &kd) const; + + void define(const int maxorder_in, + const size_t nkd, + const int *nbody_include_in, + const double *cutoff_radii_in); + + int get_maxorder() const; + int* get_nbody_include() const; + std::string get_ordername(const unsigned int order) const; + const std::set& get_cluster_list(const unsigned int order) const; + const std::vector& get_interaction_pair(const unsigned int order, + const size_t atom_index) const; + const std::set& get_interaction_cluster(const unsigned int order, + const size_t atom_index) const; + + private: + + int maxorder; + int *nbody_include; + double ***cutoff_radii; + std::set *cluster_list; + std::vector **interaction_pair; // List of atoms inside the cutoff radius for each order + std::set **interaction_cluster; + + std::vector **distall; // Distance of all pairs (i,j) under the PBC + std::vector **mindist_pairs; // All pairs (i,j) with the minimum distance + // Interacting many-body clusters with mirrow image information + + void set_default_variables(); + void deallocate_variables(); + + // can be made const function, but mindist_pairs is modified + // in this function. + void get_pairs_of_minimum_distance(const size_t nat, + const double *const *const *xc_in, + const int *exist) const; + + void generate_interaction_information_by_cutoff(const size_t nat, + const size_t natmin, + const std::vector &kd, + const std::vector> &map_p2s, + const double *const *rc, + std::vector *interaction_list) const; + + void set_interaction_by_cutoff(const size_t nat, + const std::vector &kd, + const size_t nat_prim, + const std::vector> &map_p2s) const; + + void print_neighborlist(const size_t, + const size_t, + const std::vector> &, + const std::vector &, + const std::string *) const; + + void print_interaction_information(const size_t natmin, + const std::vector> &map_p2s, + const std::vector &kd, + const std::string *kdname, + const std::vector *const *interaction_list) const; + + double distance(const double *, + const double *) const; + int nbody(const int, + const int *) const; + + void calc_interaction_clusters(const size_t natmin, + const std::vector &kd, + const std::vector> &map_p2s, + const double *const *const *x_image, + const int *exist) const; + + void set_interaction_cluster(const int order, + const size_t natmin, + const std::vector &kd, + const std::vector> &map_p2s, + const std::vector *interaction_pair_in, + const double *const *const *x_image, + const int *exist, + std::set *interaction_cluster_out) const; + + void cell_combination(const std::vector> &, + const size_t, + const std::vector &, + std::vector> &) const; + + void generate_pairs(const size_t natmin, + const std::vector> &map_p2s, + std::set *pair_out) const; + }; +} + +namespace std +{ + template <> + struct hash + { + std::size_t operator ()(ALM_NS::IntList const &obj) const + { + hash hasher; + size_t seed = 0; + for (auto i : obj.iarray) { + seed ^= hasher(i) + 0x9e3779b9 + (seed << 6) + (seed >> 2); + } + return seed; + } + }; +} diff --git a/alm/combination.h b/alm/combination.h index 492f4c13..5738740c 100644 --- a/alm/combination.h +++ b/alm/combination.h @@ -19,15 +19,12 @@ namespace ALM_NS template class CombinationWithRepetition { - private: std::vector vec; unsigned int ndim; public: - CombinationWithRepetition() - { - }; + CombinationWithRepetition() { }; template CombinationWithRepetition(InputIter begin, @@ -42,8 +39,7 @@ namespace ALM_NS vec.clear(); - typename std::set::iterator iter; - for (iter = set_tmp.begin(); iter != set_tmp.end(); ++iter) { + for (auto iter = set_tmp.begin(); iter != set_tmp.end(); ++iter) { for (unsigned int i = 0; i < ndim; i++) { vec.push_back(*iter); } @@ -62,8 +58,8 @@ namespace ALM_NS unsigned int size() const { - unsigned int n = vec.size() / ndim; - unsigned int r = ndim; + const unsigned int n = vec.size() / ndim; + const auto r = ndim; return factorial(n + r - 1, n - 1) / factorial(r); } @@ -72,7 +68,7 @@ namespace ALM_NS const unsigned int min = 1) const { unsigned int result = 1; - for (unsigned int i = min + 1; i <= max; ++i) result *= i; + for (auto i = min + 1; i <= max; ++i) result *= i; return result; } }; diff --git a/alm/constraint.cpp b/alm/constraint.cpp index c9fe8009..1e69ccda 100644 --- a/alm/constraint.cpp +++ b/alm/constraint.cpp @@ -4,539 +4,581 @@ Copyright (c) 2014, 2015, 2016 Terumasa Tadano This file is distributed under the terms of the MIT license. - Please see the file 'LICENCE.txt' in the root directory + Please see the file 'LICENCE.txt' in the root directory or http://opensource.org/licenses/mit-license.php for information. */ -#include #include "constraint.h" -#include "interaction.h" -#include "memory.h" +#include "combination.h" +#include "constants.h" +#include "error.h" #include "fcs.h" +#include "cluster.h" +#include "mathfunctions.h" +#include "memory.h" +#include "rref.h" #include "symmetry.h" #include "system.h" #include "timer.h" -#include "combination.h" -#include "constants.h" -#include "error.h" +#include "xml_parser.h" +#include +#include #include -#include "mathfunctions.h" +#include #include - -#ifdef _USE_EIGEN -#include -#endif +#include +#include +#include +#include +#include using namespace ALM_NS; -Constraint::Constraint(ALM *alm) : Pointers(alm) +Constraint::Constraint() +{ + set_default_variables(); +} + +Constraint::~Constraint() +{ + deallocate_variables(); +} + +void Constraint::set_default_variables() { + constraint_mode = 11; + rotation_axis = ""; + fix_harmonic = false; + fix_cubic = false; + constraint_algebraic = 1; + fc2_file = ""; + fc3_file = ""; + exist_constraint = false; + extra_constraint_from_symmetry = false; + const_mat = nullptr; + const_rhs = nullptr; const_symmetry = nullptr; const_fix = nullptr; const_relate = nullptr; + const_relate_rotation = nullptr; index_bimap = nullptr; - const_mat = nullptr; - const_rhs = nullptr; + number_of_constraints = 0; + tolerance_constraint = eps8; } -Constraint::~Constraint() +void Constraint::deallocate_variables() { if (const_symmetry) { - memory->deallocate(const_symmetry); + deallocate(const_symmetry); } if (const_fix) { - memory->deallocate(const_fix); + deallocate(const_fix); } if (const_relate) { - memory->deallocate(const_relate); + deallocate(const_relate); + } + if (const_relate_rotation) { + deallocate(const_relate_rotation); } if (index_bimap) { - memory->deallocate(index_bimap); + deallocate(index_bimap); } if (const_mat) { - memory->deallocate(const_mat); + deallocate(const_mat); } if (const_rhs) { - memory->deallocate(const_rhs); + deallocate(const_rhs); } } -void Constraint::setup() +void Constraint::setup(const System *system, + const Fcs *fcs, + const Cluster *cluster, + const Symmetry *symmetry, + const std::string alm_mode, + const int verbosity, + Timer *timer) { - std::cout << " CONSTRAINT" << std::endl; - std::cout << " ==========" << std::endl << std::endl; + timer->start_clock("constraint"); + + if (verbosity > 0) { + std::cout << " CONSTRAINT" << std::endl; + std::cout << " ==========" << std::endl << std::endl; + } constraint_algebraic = constraint_mode / 10; constraint_mode = constraint_mode % 10; + const auto maxorder = cluster->get_maxorder(); + + if (alm_mode == "lasso") { + if (constraint_mode > 1) { + warn("Constraint::setup()", "Sorry, only ICONST = 11 is supported when MODE = lasso."); + constraint_mode = 1; + } + constraint_algebraic = 1; + } switch (constraint_mode) { case 0: // do nothing impose_inv_T = false; impose_inv_R = false; - std::cout << " ICONST = 0: Constraint for translational/rotational invariance" << std::endl; - std::cout << " will NOT be considered." << std::endl; + if (verbosity > 0) { + std::cout << " ICONST = 0: Constraint for translational/rotational invariance" << std::endl; + std::cout << " will NOT be considered." << std::endl; + } break; case 1: impose_inv_T = true; impose_inv_R = false; - std::cout << " ICONST = 1: Constraints for translational invariance" << std::endl; - std::cout << " will be considered." << std::endl; + if (verbosity > 0) { + std::cout << " ICONST = 1: Constraints for translational invariance" << std::endl; + std::cout << " will be considered." << std::endl; + } break; case 2: impose_inv_T = true; impose_inv_R = true; exclude_last_R = true; - std::cout << " ICONST = 2: Constraints for translational and rotational invariance" << std::endl; - std::cout << " will be considered. Axis of rotation is " << rotation_axis << std::endl; - std::cout << " Rotational invariance of the maximum order will be neglected" << std::endl; + if (verbosity > 0) { + std::cout << " ICONST = 2: Constraints for translational and rotational invariance" << std::endl; + std::cout << " will be considered. Axis of rotation is " << rotation_axis << std::endl; + std::cout << " Rotational invariance of the maximum order will be neglected" << std::endl; + } break; case 3: impose_inv_T = true; impose_inv_R = true; exclude_last_R = false; - std::cout << " ICONST = 3: Constraints for translational and rotational invariance" << std::endl; - std::cout << " will be considered. Axis of rotation is " << rotation_axis << std::endl; + if (verbosity > 0) { + std::cout << " ICONST = 3: Constraints for translational and rotational invariance" << std::endl; + std::cout << " will be considered. Axis of rotation is " << rotation_axis << std::endl; + } break; default: - error->exit("Constraint::setup", "invalid constraint_mode", constraint_mode); + exit("Constraint::setup", "invalid constraint_mode", constraint_mode); break; } - std::cout << std::endl; + if (verbosity > 0) std::cout << std::endl; - if (fix_harmonic) { - std::cout << " FC2XML is given : Harmonic force constants will be " << std::endl; - std::cout << " fixed to the values given in " << fc2_file << std::endl; - std::cout << std::endl; + if (const_symmetry) { + deallocate(const_symmetry); } - - fix_cubic = fix_cubic & (interaction->maxorder > 1); - if (fix_cubic) { - std::cout << " FC3XML is given : Cubic force constants will be " << std::endl; - std::cout << " fixed to the values given in " << fc3_file << std::endl; - std::cout << std::endl; + if (const_fix) { + deallocate(const_fix); } - - extra_constraint_from_symmetry = false; - memory->allocate(const_symmetry, interaction->maxorder); - generate_symmetry_constraint_in_cartesian(const_symmetry); - for (int order = 0; order < interaction->maxorder; ++order) { - if (const_symmetry[order].size() > 0) extra_constraint_from_symmetry = true; + if (const_relate) { + deallocate(const_relate); } - - if (impose_inv_T || fix_harmonic || fix_cubic || extra_constraint_from_symmetry) { - exist_constraint = true; - } else { - exist_constraint = false; + if (index_bimap) { + deallocate(index_bimap); } - if (exist_constraint) { + allocate(const_fix, maxorder); + allocate(const_relate, maxorder); + allocate(index_bimap, maxorder); + allocate(const_symmetry, maxorder); + allocate(const_translation, maxorder); + allocate(const_rotation_self, maxorder); + allocate(const_rotation_cross, maxorder); + allocate(const_self, maxorder); - int i; - int maxorder = interaction->maxorder; - int Pmax, order; - int N = 0; - - for (i = 0; i < maxorder; ++i) { - N += fcs->nequiv[i].size(); - } + for (auto order = 0; order < maxorder; ++order) { + const_translation[order].clear(); + const_rotation_self[order].clear(); + const_rotation_cross[order].clear(); + const_self[order].clear(); + const_fix[order].clear(); + } - memory->allocate(const_translation, maxorder); - memory->allocate(const_rotation_self, maxorder); - memory->allocate(const_rotation_cross, maxorder); + if (fix_harmonic) { - for (order = 0; order < maxorder; ++order) { - const_translation[order].clear(); - const_rotation_self[order].clear(); - const_rotation_cross[order].clear(); + if (verbosity > 0) { + std::cout << " FC2XML is given : Harmonic force constants will be " << std::endl; + std::cout << " fixed to the values given in " << fc2_file << std::endl; + std::cout << std::endl; } - if (impose_inv_T) { - translational_invariance(); - } - if (impose_inv_R) { - rotational_invariance(); - } + fix_forceconstants_to_file(0, + symmetry, + fcs, + fc2_file, + const_fix[0]); + } - if (impose_inv_T || impose_inv_R) { - std::cout << " Number of constraints [T-inv, R-inv (self), R-inv (cross)]:" << std::endl; - for (order = 0; order < maxorder; ++order) { - std::cout << " " << std::setw(8) << interaction->str_order[order]; - std::cout << std::setw(5) << const_translation[order].size(); - std::cout << std::setw(5) << const_rotation_self[order].size(); - std::cout << std::setw(5) << const_rotation_cross[order].size(); - std::cout << std::endl; - } - std::cout << std::endl; - } + fix_cubic = fix_cubic & (cluster->get_maxorder() > 1); + if (fix_cubic) { - if (extra_constraint_from_symmetry) { - std::cout << " There are constraints from crystal symmetry." << std::endl; - std::cout << " The number of such constraints for each order:" << std::endl; - for (order = 0; order < maxorder; ++order) { - std::cout << " " << std::setw(8) << interaction->str_order[order]; - std::cout << std::setw(5) << const_symmetry[order].size(); - std::cout << std::endl; - } + if (verbosity > 0) { + std::cout << " FC3XML is given : Cubic force constants will be " << std::endl; + std::cout << " fixed to the values given in " << fc3_file << std::endl; std::cout << std::endl; } - memory->allocate(const_self, maxorder); - for (order = 0; order < maxorder; ++order) const_self[order].clear(); + fix_forceconstants_to_file(1, + symmetry, + fcs, + fc3_file, + const_fix[1]); + } - int nparam; - double *arr_tmp; + generate_symmetry_constraint_in_cartesian(system->get_supercell().number_of_atoms, + symmetry, + cluster, + fcs, + verbosity); - std::vector::const_iterator it_const; - // Merge translational and rotational invariance excluding order-crossing constraints + extra_constraint_from_symmetry = false; - for (order = 0; order < maxorder; ++order) { + for (auto order = 0; order < cluster->get_maxorder(); ++order) { + if (!const_symmetry[order].empty()) extra_constraint_from_symmetry = true; + } - nparam = fcs->nequiv[order].size(); - memory->allocate(arr_tmp, nparam); + if (impose_inv_T) { + // const_translation is updated. + generate_translational_constraint(system->get_supercell(), + symmetry, + cluster, + fcs, + verbosity); + } - if (const_symmetry[order].size() > 0) { - for (it_const = const_symmetry[order].begin(); - it_const != const_symmetry[order].end(); ++it_const) { - for (i = 0; i < nparam; ++i) arr_tmp[i] = (*it_const).w_const[i]; - const_self[order].push_back(ConstraintClass(nparam, arr_tmp)); - } - // remove_redundant_rows(nparam, const_self[order], eps8); - } + if (impose_inv_R) { + generate_rotational_constraint(system, + symmetry, + cluster, + fcs, + verbosity, + tolerance_constraint); + } + // Merge intra-order constrants and do reduction - for (it_const = const_translation[order].begin(); - it_const != const_translation[order].end(); ++it_const) { - for (i = 0; i < nparam; ++i) arr_tmp[i] = (*it_const).w_const[i]; - const_self[order].push_back(ConstraintClass(nparam, arr_tmp)); - } - remove_redundant_rows(nparam, const_self[order], eps8); + for (auto order = 0; order < maxorder; ++order) { - if (const_rotation_self[order].size() > 0) { - for (it_const = const_rotation_self[order].begin(); - it_const != const_rotation_self[order].end(); ++it_const) { - for (i = 0; i < nparam; ++i) arr_tmp[i] = (*it_const).w_const[i]; - const_self[order].push_back(ConstraintClass(nparam, arr_tmp)); - } - remove_redundant_rows(nparam, const_self[order], eps8); - } + const auto nparam = fcs->get_nequiv()[order].size(); -/* - if (const_symmetry[order].size() > 0) { - for (it_const = const_symmetry[order].begin(); - it_const != const_symmetry[order].end(); ++it_const) { - for (i = 0; i < nparam; ++i) arr_tmp[i] = (*it_const).w_const[i]; - const_self[order].push_back(ConstraintClass(nparam, arr_tmp)); - } - remove_redundant_rows(nparam, const_self[order], eps8); - } -*/ + const_self[order].reserve( + const_translation[order].size() + + const_rotation_self[order].size() + + const_symmetry[order].size()); - memory->deallocate(arr_tmp); - const_translation[order].clear(); - const_rotation_self[order].clear(); - } + // The order of const_symmetry and const_translation + // should not be changed since the rref_sparse is sensitive to + // the numerical accuracy of the input matrix. + const_self[order].insert(const_self[order].end(), + const_symmetry[order].begin(), + const_symmetry[order].end()); - if (extra_constraint_from_symmetry) { - std::cout << " Constraints of T-inv, R-inv (self), and those from crystal symmetry are merged." << std::endl; - } else { - std::cout << " Constraints of T-inv and R-inv (self) are merged." << std::endl; + const_self[order].insert(const_self[order].end(), + const_translation[order].begin(), + const_translation[order].end()); + + const_self[order].insert(const_self[order].end(), + const_rotation_self[order].begin(), + const_rotation_self[order].end()); + + rref_sparse(nparam, const_self[order], tolerance_constraint); + } + + get_mapping_constraint(maxorder, + fcs->get_nequiv(), + const_self, + const_fix, + const_relate, + index_bimap); + + if (!constraint_algebraic) { + + size_t Pmax = 0; + size_t nparams = 0; + for (auto order = 0; order < maxorder; ++order) { + Pmax += const_self[order].size() + + const_rotation_cross[order].size(); + } + if (fix_harmonic) { + Pmax -= const_self[0].size(); + Pmax += fcs->get_nequiv()[0].size(); + } + if (fix_cubic) { + Pmax -= const_self[1].size(); + Pmax += fcs->get_nequiv()[1].size(); + } + for (auto order = 0; order < maxorder; ++order) { + nparams += fcs->get_nequiv()[order].size(); } - std::cout << " If there are redundant constraints, they are removed in this process." << std::endl; - std::cout << std::endl; - std::cout << " Number of inequivalent constraints (self, cross) : " << std::endl; - for (order = 0; order < maxorder; ++order) { - std::cout << " " << std::setw(8) << interaction->str_order[order]; - std::cout << std::setw(5) << const_self[order].size(); - std::cout << std::setw(5) << const_rotation_cross[order].size(); - std::cout << std::endl; + if (const_mat) { + deallocate(const_mat); } - std::cout << std::endl; + allocate(const_mat, Pmax, nparams); - if (constraint_algebraic) { + if (const_rhs) { + deallocate(const_rhs); + } + allocate(const_rhs, Pmax); - std::cout << " ICONST >= 10 : Constraints will be considered algebraically." - << std::endl << std::endl; + // const_mat and const_rhs are updated. + number_of_constraints = calc_constraint_matrix(maxorder, + fcs->get_nequiv(), + nparams); + } - if (impose_inv_R) { - std::cout << " WARNING : Inter-order constraints for rotational invariance will be neglected." << std::endl; + exist_constraint + = impose_inv_T + || fix_harmonic + || fix_cubic + || extra_constraint_from_symmetry; + + if (verbosity > 0) { + if (exist_constraint) { + + int order; + + if (impose_inv_T || impose_inv_R) { + std::cout << " Number of constraints [T-inv, R-inv (self), R-inv (cross)]:" << std::endl; + for (order = 0; order < maxorder; ++order) { + std::cout << " " << std::setw(8) << cluster->get_ordername(order); + std::cout << std::setw(5) << const_translation[order].size(); + std::cout << std::setw(5) << const_rotation_self[order].size(); + std::cout << std::setw(5) << const_rotation_cross[order].size(); + std::cout << std::endl; + } + std::cout << std::endl; } - memory->allocate(const_fix, maxorder); - memory->allocate(const_relate, maxorder); - memory->allocate(index_bimap, maxorder); + if (extra_constraint_from_symmetry) { + std::cout << " There are constraints from crystal symmetry." << std::endl; + std::cout << " The number of such constraints for each order:" << std::endl; + for (order = 0; order < maxorder; ++order) { + std::cout << " " << std::setw(8) << cluster->get_ordername(order); + std::cout << std::setw(5) << const_symmetry[order].size(); + std::cout << std::endl; + } + std::cout << std::endl; + } - get_mapping_constraint(maxorder, fcs->nequiv, const_self, const_fix, - const_relate, index_bimap, false); + if (extra_constraint_from_symmetry) { + std::cout << " Constraints of T-inv, R-inv (self), and those from crystal symmetry are merged." + << std::endl; + } else { + std::cout << " Constraints of T-inv and R-inv (self) are merged." << std::endl; + } + std::cout << " If there are redundant constraints, they are removed in this process." << std::endl; + std::cout << std::endl; + std::cout << " Number of inequivalent constraints (self, cross) : " << std::endl; for (order = 0; order < maxorder; ++order) { - std::cout << " Number of free" << std::setw(9) << interaction->str_order[order] - << " FCs : " << index_bimap[order].size() << std::endl; + std::cout << " " << std::setw(8) << cluster->get_ordername(order); + std::cout << std::setw(5) << const_self[order].size(); + std::cout << std::setw(5) << const_rotation_cross[order].size(); + std::cout << std::endl; } std::cout << std::endl; - } else { + if (constraint_algebraic) { - Pmax = 0; - for (order = 0; order < maxorder; ++order) { - Pmax += const_self[order].size() + const_rotation_cross[order].size(); - } - if (fix_harmonic) { - Pmax -= const_self[0].size(); - Pmax += fcs->nequiv[0].size(); - } - if (fix_cubic) { - Pmax -= const_self[1].size(); - Pmax += fcs->nequiv[1].size(); - } - memory->allocate(const_mat, Pmax, N); - memory->allocate(const_rhs, Pmax); + std::cout << " ICONST >= 10 : Constraints will be considered algebraically." + << std::endl << std::endl; - calc_constraint_matrix(N, P); - std::cout << " Total number of constraints = " << P << std::endl << std::endl; + if (impose_inv_R) { + std::cout << " WARNING : Inter-order constraints for rotational invariance will be neglected." + << std::endl; + } - } + for (order = 0; order < maxorder; ++order) { + std::cout << " Number of free" << std::setw(9) << cluster->get_ordername(order) + << " FCs : " << index_bimap[order].size() << std::endl; + } + std::cout << std::endl; - memory->deallocate(const_translation); - memory->deallocate(const_rotation_self); - memory->deallocate(const_rotation_cross); - memory->deallocate(const_self); + } else { + + std::cout << " Total number of constraints = " << number_of_constraints << std::endl << std::endl; + } + } timer->print_elapsed(); std::cout << " -------------------------------------------------------------------" << std::endl; std::cout << std::endl; } + + + deallocate(const_translation); + const_translation = nullptr; + deallocate(const_rotation_self); + const_rotation_self = nullptr; + deallocate(const_rotation_cross); + const_rotation_cross = nullptr; + deallocate(const_self); + const_self = nullptr; + + timer->stop_clock("constraint"); } -void Constraint::calc_constraint_matrix(const int N, int &P) +size_t Constraint::calc_constraint_matrix(const int maxorder, + const std::vector *nequiv, + const size_t nparams) const { - int i, j; - int maxorder = interaction->maxorder; + size_t i, j; int order; - int nconst1; - int icol, irow; double *arr_tmp; std::vector const_total; const_total.clear(); - memory->allocate(arr_tmp, N); + allocate(arr_tmp, nparams); - int nshift = 0; + size_t nshift = 0; - // Intra-order constraints for (order = 0; order < maxorder; ++order) { - int nparam = fcs->nequiv[order].size(); + const auto nelems = nequiv[order].size(); - if ((order == 0 && !fix_harmonic) || (order == 1 && !fix_cubic) || order > 1) { - for (i = 0; i < N; ++i) arr_tmp[i] = 0.0; - - for (auto p = const_self[order].begin(); p != const_self[order].end(); ++p) { - ConstraintClass const_now = *p; - for (i = 0; i < nparam; ++i) { - arr_tmp[nshift + i] = const_now.w_const[i]; + if (const_fix[order].empty()) { + for (auto &p : const_self[order]) { + for (i = 0; i < nparams; ++i) arr_tmp[i] = 0.0; + for (const auto &it : p) { + arr_tmp[nshift + it.first] = it.second; } - const_total.push_back(ConstraintClass(N, arr_tmp)); + const_total.emplace_back(nparams, arr_tmp); } } - nshift += nparam; + nshift += nelems; } - nconst1 = const_total.size(); - // order-crossing constraints - int nshift2 = 0; + + const auto nconst1 = const_total.size(); + + // Inter-order constraints + size_t nshift2 = 0; for (order = 0; order < maxorder; ++order) { if (order > 0) { - int nparam2 = fcs->nequiv[order - 1].size() + fcs->nequiv[order].size(); - for (i = 0; i < N; ++i) arr_tmp[i] = 0.0; - for (auto p = const_rotation_cross[order].begin(); - p != const_rotation_cross[order].end(); ++p) { - ConstraintClass const_now = *p; - for (i = 0; i < nparam2; ++i) { - arr_tmp[nshift2 + i] = const_now.w_const[i]; + if (const_fix[order - 1].empty() && const_fix[order].empty()) { + for (auto &p : const_rotation_cross[order]) { + for (i = 0; i < nparams; ++i) arr_tmp[i] = 0.0; + for (const auto &it : p) { + arr_tmp[nshift2 + it.first] = it.second; + } + const_total.emplace_back(nparams, arr_tmp); } - const_total.push_back(ConstraintClass(N, arr_tmp)); } - nshift2 += fcs->nequiv[order - 1].size(); + + nshift2 += nequiv[order - 1].size(); } } - memory->deallocate(arr_tmp); + deallocate(arr_tmp); if (nconst1 != const_total.size()) - remove_redundant_rows(N, const_total, eps8); - - P = const_total.size(); + remove_redundant_rows(nparams, const_total, tolerance_constraint); - if (fix_harmonic) { - std::cout << " Harmonic force constants will be fixed to the values " << std::endl; - std::cout << " of the reference " << fc2_file << std::endl; - std::cout << " Constraint for HARMONIC IFCs will be updated accordingly." - << std::endl << std::endl; - P += fcs->nequiv[0].size(); - } + auto nconst = const_total.size(); - if (fix_cubic) { - std::cout << " Cubic force constants will be fixed to the values " << std::endl; - std::cout << " of the reference " << fc3_file << std::endl; - std::cout << " Constraint for ANHARM3 IFCs will be updated accordingly." - << std::endl << std::endl; - P += fcs->nequiv[1].size(); - } + if (fix_harmonic) nconst += nequiv[0].size(); + if (fix_cubic) nconst += nequiv[1].size(); - for (i = 0; i < P; ++i) { - for (j = 0; j < N; ++j) { + for (i = 0; i < nconst; ++i) { + for (j = 0; j < nparams; ++j) { const_mat[i][j] = 0.0; } const_rhs[i] = 0.0; } - irow = 0; - icol = 0; + size_t irow = 0; + size_t icol = 0; + size_t ishift = 0; if (fix_harmonic) { - double *const_rhs_tmp; - int nfcs_tmp = fcs->nequiv[0].size(); - memory->allocate(const_rhs_tmp, nfcs_tmp); - system->load_reference_system_xml(fc2_file, 0, const_rhs_tmp); - for (i = 0; i < nfcs_tmp; ++i) { + for (const auto &p : const_fix[0]) { + i = p.p_index_target; const_mat[i][i] = 1.0; - const_rhs[i] = const_rhs_tmp[i]; + const_rhs[i] = p.val_to_fix; } - irow += nfcs_tmp; - icol += nfcs_tmp; - memory->deallocate(const_rhs_tmp); + irow += const_fix[0].size(); + icol += const_fix[0].size(); + ishift += const_fix[0].size(); } - if (fix_cubic) { - int ishift = fcs->nequiv[0].size(); - double *const_rhs_tmp; - int nfcs_tmp = fcs->nequiv[1].size(); - memory->allocate(const_rhs_tmp, nfcs_tmp); - system->load_reference_system_xml(fc3_file, 1, const_rhs_tmp); - - for (i = 0; i < nfcs_tmp; ++i) { - const_mat[i + ishift][i + ishift] = 1.0; - const_rhs[i + ishift] = const_rhs_tmp[i]; + if (fix_cubic && maxorder > 1) { + + const auto ishift2 = nequiv[0].size(); + + for (const auto &p : const_fix[1]) { + i = p.p_index_target; + const_mat[i + ishift][i + ishift2] = 1.0; + const_rhs[i + ishift] = p.val_to_fix; } - irow += nfcs_tmp; - icol += nfcs_tmp; - memory->deallocate(const_rhs_tmp); + irow += const_fix[1].size(); + icol += const_fix[1].size(); } - for (auto p = const_total.begin(); p != const_total.end(); ++p) { - for (i = 0; i < N; ++i) { - const_mat[irow][i] = (*p).w_const[i]; + for (auto &p : const_total) { + for (i = 0; i < nparams; ++i) { + const_mat[irow][i] = p.w_const[i]; } ++irow; } const_total.clear(); + + return nconst; } void Constraint::get_mapping_constraint(const int nmax, - std::vector *nequiv, - std::vector *const_in, + const std::vector *nequiv, + const ConstraintSparseForm *const_in, std::vector *const_fix_out, std::vector *const_relate_out, - boost::bimap *index_bimap_out, - const bool is_suggest_mode) + boost::bimap *index_bimap_out) const { - int order; - unsigned int i; - //double const_tol = eps8; + // If const_fix_out[order] is not empty as input, it assumes that fix_forceconstant[order] is true. + // In this case, const_fix_out[order] is not updated. - bool *fix_forceconstant; - std::string *file_forceconstant; - - memory->allocate(fix_forceconstant, nmax); - memory->allocate(file_forceconstant, nmax); - - for (i = 0; i < nmax; ++i) { - fix_forceconstant[i] = false; - file_forceconstant[i] = ""; - } - - if (!is_suggest_mode) { - fix_forceconstant[0] = fix_harmonic; - fix_forceconstant[1] = fix_cubic; - if (fix_forceconstant[0]) file_forceconstant[0] = fc2_file; - if (fix_forceconstant[1]) file_forceconstant[1] = fc3_file; - } + int order; + size_t i; - int nparam; for (order = 0; order < nmax; ++order) { - nparam = nequiv[order].size(); - - if (fix_forceconstant[order]) { - - double *const_rhs_tmp; - memory->allocate(const_rhs_tmp, nparam); - system->load_reference_system_xml(file_forceconstant[order], - order, const_rhs_tmp); + if (const_fix_out[order].empty()) { - for (i = 0; i < nparam; ++i) { - const_fix_out[order].push_back(ConstraintTypeFix(i, const_rhs_tmp[i])); - } - memory->deallocate(const_rhs_tmp); - - } else { - - int p_index_target; + size_t p_index_target; std::vector alpha_tmp; - std::vector p_index_tmp; + std::vector p_index_tmp; for (auto p = const_in[order].rbegin(); p != const_in[order].rend(); ++p) { - p_index_target = -1; - for (i = 0; i < nparam; ++i) { - if (std::abs((*p).w_const[i]) > tolerance_constraint) { - p_index_target = i; - break; - } - } - - if (p_index_target == -1) { - error->exit("get_mapping_constraint", - "No finite entry found in the constraint."); - } alpha_tmp.clear(); p_index_tmp.clear(); - - for (i = p_index_target + 1; i < nparam; ++i) { - if (std::abs((*p).w_const[i]) > tolerance_constraint) { - alpha_tmp.push_back((*p).w_const[i]); - p_index_tmp.push_back(i); + auto counter = 0; + for (const auto &p2 : (*p)) { + if (counter == 0) { + p_index_target = p2.first; + } else { + alpha_tmp.push_back(p2.second); + p_index_tmp.push_back(p2.first); } + ++counter; } - if (alpha_tmp.size() > 0) { - const_relate_out[order].push_back( - ConstraintTypeRelate(p_index_target, - alpha_tmp, p_index_tmp)); + if (!alpha_tmp.empty()) { + const_relate_out[order].emplace_back(p_index_target, + alpha_tmp, p_index_tmp); } else { - const_fix_out[order].push_back( - ConstraintTypeFix(p_index_target, 0.0)); + const_fix_out[order].emplace_back(p_index_target, 0.0); } } } } - std::vector *has_constraint; - memory->allocate(has_constraint, nmax); - + allocate(has_constraint, nmax); + size_t nparam; for (order = 0; order < nmax; ++order) { nparam = nequiv[order].size(); - - for (i = 0; i < nparam; ++i) { - has_constraint[order].push_back(0); - } + has_constraint[order].resize(nparam, 0); for (i = 0; i < const_fix_out[order].size(); ++i) { has_constraint[order][const_fix_out[order][i].p_index_target] = 1; @@ -547,544 +589,540 @@ void Constraint::get_mapping_constraint(const int nmax, } } - int icount; + size_t icount; for (order = 0; order < nmax; ++order) { nparam = nequiv[order].size(); icount = 0; for (i = 0; i < nparam; ++i) { - - if (!has_constraint[order][i]) { + if (has_constraint[order][i] == 0) { index_bimap_out[order].insert( - boost::bimap::value_type(icount, i)); + boost::bimap::value_type(icount, i)); ++icount; } } } - memory->deallocate(has_constraint); - memory->deallocate(fix_forceconstant); - memory->deallocate(file_forceconstant); + deallocate(has_constraint); } -void Constraint::generate_symmetry_constraint_in_cartesian(std::vector *const_out) +int Constraint::get_constraint_mode() const { - // Create constraint matrices arising from the crystal symmetry. + return constraint_mode; +} - unsigned int isym; - int order; - int maxorder = interaction->maxorder; - bool has_constraint_from_symm = false; +void Constraint::set_constraint_mode(const int constraint_mode_in) +{ + constraint_mode = constraint_mode_in; +} - for (isym = 0; isym < symmetry->nsym; ++isym) { - if (symmetry->SymmData[isym].compatible_with_cartesian) continue; - has_constraint_from_symm = true; - } +size_t Constraint::get_number_of_constraints() const +{ + return number_of_constraints; +} - if (has_constraint_from_symm) { - std::cout << " Generating constraints from crystal symmetry ..." << std::endl; +std::string Constraint::get_fc_file(const int order) const +{ + switch (order) { + case 2: + return fc2_file; + case 3: + return fc3_file; + default: + return ""; } +} - for (order = 0; order < maxorder; ++order) { - if (has_constraint_from_symm) { - std::cout << " " << std::setw(8) << interaction->str_order[order] << " ..."; - } - get_symmetry_constraint(order, interaction->pairs[order], - symmetry->SymmData, "Cartesian", - fcs->fc_table[order], fcs->nequiv[order], - const_out[order]); - if (has_constraint_from_symm) { - std::cout << " done." << std::endl; - } - } - if (has_constraint_from_symm) { - std::cout << " Finished !" << std::endl << std::endl; +void Constraint::set_fc_file(const int order, + const std::string fc_file) +{ + switch (order) { + case 2: + fc2_file = fc_file; + break; + case 3: + fc3_file = fc_file; + break; + default: + break; } } +bool Constraint::get_fix_harmonic() const +{ + return fix_harmonic; +} -void Constraint::get_symmetry_constraint(const int order, const std::set pairs, - const std::vector symmop, - const std::string basis, - const std::vector fc_table, - const std::vector nequiv, - std::vector &const_out) +void Constraint::set_fix_harmonic(const bool fix_harmonic_in) { - // Create constraint matrices arising from the crystal symmetry. + fix_harmonic = fix_harmonic_in; +} - int i, j; - unsigned int isym; - int ixyz, nxyz; - int *index_tmp; - int **xyzcomponent; - int nparams; - int counter; - int nsym_in_use; - double *arr_constraint; - bool has_constraint_from_symm = false; - std::unordered_set list_found; - std::vector> const_mat; - int **map_sym; - double ***rotation; +bool Constraint::get_fix_cubic() const +{ + return fix_cubic; +} - if (order < 0) return; +void Constraint::set_fix_cubic(const bool fix_cubic_in) +{ + fix_cubic = fix_cubic_in; +} - int nsym = symmop.size(); - int nat = system->nat; - nparams = nequiv.size(); +int Constraint::get_constraint_algebraic() const +{ + return constraint_algebraic; +} - if (nparams == 0) return; +double** Constraint::get_const_mat() const +{ + return const_mat; +} - memory->allocate(rotation, nsym, 3, 3); - memory->allocate(map_sym, nat, nsym); - memory->allocate(index_tmp, order + 2); - nxyz = static_cast(std::pow(static_cast(3), order + 2)); - memory->allocate(xyzcomponent, nxyz, order + 2); - fcs->get_xyzcomponent(order + 2, xyzcomponent); - nsym_in_use = 0; - counter = 0; - const_mat.clear(); - int nfcs = fc_table.size(); +double* Constraint::get_const_rhs() const +{ + return const_rhs; +} - if (basis == "Cartesian") { +double Constraint::get_tolerance_constraint() const +{ + return tolerance_constraint; +} - for (auto it = symmop.begin(); it != symmop.end(); ++it) { +void Constraint::set_tolerance_constraint(const double tol) +{ + tolerance_constraint = tol; +} - if (!(*it).compatible_with_cartesian) { +bool Constraint::get_exist_constraint() const +{ + return exist_constraint; +} - for (i = 0; i < 3; ++i) { - for (j = 0; j < 3; ++j) { - rotation[nsym_in_use][i][j] = (*it).rotation_cart[i][j]; - } - } - for (i = 0; i < nat; ++i) { - map_sym[i][nsym_in_use] = symmetry->map_sym[i][counter]; - } - ++nsym_in_use; - } - ++counter; - } +bool Constraint::get_extra_constraint_from_symmetry() const +{ + return extra_constraint_from_symmetry; +} - } else if (basis == "Lattice") { +std::string Constraint::get_rotation_axis() const +{ + return rotation_axis; +} - for (auto it = symmop.begin(); it != symmop.end(); ++it) { - if (!(*it).compatible_with_lattice) { - for (i = 0; i < 3; ++i) { - for (j = 0; j < 3; ++j) { - rotation[nsym_in_use][i][j] - = static_cast((*it).rotation[i][j]); - } - } - for (i = 0; i < nat; ++i) { - map_sym[i][nsym_in_use] = symmetry->map_sym[i][counter]; - } - ++nsym_in_use; - } - ++counter; - } +void Constraint::set_rotation_axis(const std::string rotation_axis_in) +{ + rotation_axis = rotation_axis_in; +} +const ConstraintSparseForm& Constraint::get_const_symmetry(const int order) const +{ + return const_symmetry[order]; +} - } else { - memory->deallocate(rotation); - memory->deallocate(map_sym); - error->exit("get_symmetry_constraint", "Invalid basis input"); - } +const std::vector& Constraint::get_const_fix(const int order) const +{ + return const_fix[order]; +} - // Generate temporary list of parameters - list_found.clear(); - for (auto p = fc_table.begin(); p != fc_table.end(); ++p) { - for (i = 0; i < order + 2; ++i) index_tmp[i] = (*p).elems[i]; - list_found.insert(FcProperty(order + 2, (*p).sign, - index_tmp, (*p).mother)); - } +void Constraint::set_const_fix_val_to_fix(const int order, + const size_t idx, + const double val) +{ + const_fix[order][idx].val_to_fix = val; +} +const std::vector& Constraint::get_const_relate(const int order) const +{ + return const_relate[order]; +} -#ifdef _OPENMP -#pragma omp parallel -#endif - { - int j; - int i_prim; - int loc_nonzero; - int *ind; - int *atm_index, *atm_index_symm; - int *xyz_index; - double c_tmp; - - std::unordered_set::iterator iter_found; - std::vector const_now_omp; - std::vector> const_omp; - - memory->allocate(ind, order + 2); - memory->allocate(atm_index, order + 2); - memory->allocate(atm_index_symm, order + 2); - memory->allocate(xyz_index, order + 2); - - const_omp.clear(); - const_now_omp.resize(nparams); +const boost::bimap& Constraint::get_index_bimap(const int order) const +{ + return index_bimap[order]; +} -#ifdef _OPENMP -#pragma omp for private(i, isym, ixyz), schedule(static) -#endif - for (int ii = 0; ii < nfcs; ++ii) { - FcProperty list_tmp = fc_table[ii]; +void Constraint::generate_symmetry_constraint_in_cartesian(const size_t nat, + const Symmetry *symmetry, + const Cluster *cluster, + const Fcs *fcs, + const int verbosity) const +{ + // Create constraint matrices arising from the crystal symmetry. - for (i = 0; i < order + 2; ++i) { - atm_index[i] = list_tmp.elems[i] / 3; - xyz_index[i] = list_tmp.elems[i] % 3; - } + const auto maxorder = cluster->get_maxorder(); + auto has_constraint_from_symm = false; + std::vector> const_tmp; + + for (auto isym = 0; isym < symmetry->get_nsym(); ++isym) { + if (!symmetry->get_SymmData()[isym].compatible_with_cartesian) { + has_constraint_from_symm = true; + break; + } + } - for (isym = 0; isym < nsym_in_use; ++isym) { + has_constraint_from_symm = has_constraint_from_symm & (verbosity > 0); - for (i = 0; i < order + 2; ++i) - atm_index_symm[i] = map_sym[atm_index[i]][isym]; - if (!fcs->is_inprim(order + 2, atm_index_symm)) continue; + if (has_constraint_from_symm) { + std::cout << " Generating constraints from crystal symmetry ..." << std::endl; + } - for (i = 0; i < nparams; ++i) const_now_omp[i] = 0.0; + for (auto order = 0; order < maxorder; ++order) { + if (has_constraint_from_symm) { + std::cout << " " << std::setw(8) << cluster->get_ordername(order) << " ..."; + } - const_now_omp[list_tmp.mother] = -list_tmp.sign; + fcs->get_constraint_symmetry(nat, + symmetry, + order, + "Cartesian", + fcs->get_fc_table()[order], + fcs->get_nequiv()[order].size(), + tolerance_constraint, + const_symmetry[order], true); - for (ixyz = 0; ixyz < nxyz; ++ixyz) { - for (i = 0; i < order + 2; ++i) - ind[i] = 3 * atm_index_symm[i] + xyzcomponent[ixyz][i]; + if (has_constraint_from_symm) { + std::cout << " done." << std::endl; + } + } - i_prim = fcs->min_inprim(order + 2, ind); - std::swap(ind[0], ind[i_prim]); - fcs->sort_tail(order + 2, ind); + if (has_constraint_from_symm) { + std::cout << " Finished !" << std::endl << std::endl; + } +} - iter_found = list_found.find(FcProperty(order + 2, 1.0, ind, 1)); - if (iter_found != list_found.end()) { - c_tmp = fcs->coef_sym(order + 2, rotation[isym], xyz_index, xyzcomponent[ixyz]); - const_now_omp[(*iter_found).mother] += (*iter_found).sign * c_tmp; - } - } - if (!is_allzero(const_now_omp, eps8, loc_nonzero)) { - if (const_now_omp[loc_nonzero] < 0.0) { - for (j = 0; j < nparams; ++j) const_now_omp[j] *= -1.0; - } - const_omp.push_back(const_now_omp); - } - } // close isym loop +void Constraint::generate_translational_constraint(const Cell &supercell, + const Symmetry *symmetry, + const Cluster *cluster, + const Fcs *fcs, + const int verbosity) const +{ + // Create constraint matrix for the translational invariance (aka acoustic sum rule). - if (const_omp.size() > nparams) rref(const_omp, tolerance_constraint); + if (verbosity > 0) { + std::cout << " Generating constraints for translational invariance ..." << std::endl; + } - } // close ii loop + for (auto order = 0; order < cluster->get_maxorder(); ++order) { - memory->deallocate(ind); - memory->deallocate(atm_index); - memory->deallocate(atm_index_symm); - memory->deallocate(xyz_index); + if (verbosity > 0) + std::cout << " " << std::setw(8) << cluster->get_ordername(order) << " ..."; -#pragma omp critical - { - for (auto it = const_omp.begin(); it != const_omp.end(); ++it) { - const_mat.push_back(*it); - } - } - const_omp.clear(); - } // close openmp region + const auto nparams = fcs->get_nequiv()[order].size(); - memory->allocate(arr_constraint, nparams); - for (auto it = const_mat.crbegin(); it != const_mat.crend(); ++it) { - for (i = 0; i < nparams; ++i) { - arr_constraint[i] = (*it)[i]; + if (nparams == 0) { + if (verbosity > 0) std::cout << " No parameters! Skipped." << std::endl; + continue; } - const_out.push_back(ConstraintClass(nparams, - arr_constraint)); - } - const_mat.clear(); - memory->deallocate(xyzcomponent); - memory->deallocate(arr_constraint); - memory->deallocate(index_tmp); - memory->deallocate(rotation); - memory->deallocate(map_sym); + get_constraint_translation(supercell, + symmetry, + cluster, + fcs, + order, + fcs->get_fc_table()[order], + fcs->get_nequiv()[order].size(), + const_translation[order], true); - remove_redundant_rows(nparams, const_out, tolerance_constraint); + if (verbosity > 0) std::cout << " done." << std::endl; + } + + if (verbosity > 0) std::cout << " Finished !" << std::endl << std::endl; } -void Constraint::translational_invariance() +void Constraint::get_constraint_translation(const Cell &supercell, + const Symmetry *symmetry, + const Cluster *cluster, + const Fcs *fcs, + const int order, + const std::vector &fc_table, + const size_t nparams, + ConstraintSparseForm &const_out, + const bool do_rref) const { - // Create constraint matrix for the translational invariance (aka acoustic sum rule). + // Generate equality constraint for the acoustic sum rule. int i, j; int iat, jat, icrd, jcrd; int idata; - int order; int loc_nonzero; - int maxorder = interaction->maxorder; int *ind; int *intarr, *intarr_copy; int **xyzcomponent; - int ixyz, nxyz; - int natmin = symmetry->nat_prim; - int nat = system->nat; - int nparams; + int ixyz; + const auto natmin = symmetry->get_nat_prim(); + const auto nat = supercell.number_of_atoms; unsigned int isize; - double *arr_constraint; - std::vector intlist, data; + std::vector data; std::unordered_set list_found; std::unordered_set::iterator iter_found; std::vector> data_vec; std::vector list_vec; - std::vector::iterator iter_vec; std::vector const_now; - std::vector> const_mat; - std::cout << " Generating constraints for translational invariance ..." << std::endl; + typedef std::vector ConstEntry; + std::vector constraint_all; - memory->allocate(ind, maxorder + 1); + ConstEntry const_tmp; - for (order = 0; order < maxorder; ++order) { + if (order < 0) return; + + if (nparams == 0) return; - std::cout << " " << std::setw(8) << interaction->str_order[order] << " ..."; + allocate(ind, order + 2); - const_mat.clear(); + // Create force constant table for search - nparams = fcs->nequiv[order].size(); + list_found.clear(); - if (nparams == 0) { - std::cout << " No parameters! Skipped." << std::endl; - continue; + for (const auto &p : fc_table) { + for (i = 0; i < order + 2; ++i) { + ind[i] = p.elems[i]; } + if (list_found.find(FcProperty(order + 2, p.sign, + ind, p.mother)) != list_found.end()) { + exit("get_constraint_translation", "Duplicate interaction list found"); + } + list_found.insert(FcProperty(order + 2, p.sign, + ind, p.mother)); + } - // Make interaction list + deallocate(ind); - list_found.clear(); + // Generate xyz component for each order - for (auto p = fcs->fc_table[order].cbegin(); p != fcs->fc_table[order].cend(); ++p) { - for (i = 0; i < order + 2; ++i) { - ind[i] = (*p).elems[i]; - } - if (list_found.find(FcProperty(order + 2, (*p).sign, - ind, (*p).mother)) != list_found.end()) { - error->exit("translational invariance", "Duplicate interaction list found"); - } - list_found.insert(FcProperty(order + 2, (*p).sign, - ind, (*p).mother)); - } + const auto nxyz = static_cast(std::pow(static_cast(3), order + 1)); + allocate(xyzcomponent, nxyz, order + 1); + fcs->get_xyzcomponent(order + 1, xyzcomponent); - // Generate xyz component for each order + allocate(intarr, order + 2); + allocate(intarr_copy, order + 2); - nxyz = static_cast(std::pow(static_cast(3), order + 1)); - memory->allocate(xyzcomponent, nxyz, order + 1); - fcs->get_xyzcomponent(order + 1, xyzcomponent); + const_now.resize(nparams); - memory->allocate(arr_constraint, nparams); - memory->allocate(intarr, order + 2); - memory->allocate(intarr_copy, order + 2); + for (i = 0; i < natmin; ++i) { - const_now.resize(nparams); + iat = symmetry->get_map_p2s()[i][0]; - for (i = 0; i < natmin; ++i) { + // Generate atom pairs for each order - iat = symmetry->map_p2s[i][0]; + if (order == 0) { - // Generate atom pairs for each order - if (order == 0) { - for (icrd = 0; icrd < 3; ++icrd) { + for (icrd = 0; icrd < 3; ++icrd) { - intarr[0] = 3 * iat + icrd; + intarr[0] = 3 * iat + icrd; - for (jcrd = 0; jcrd < 3; ++jcrd) { + for (jcrd = 0; jcrd < 3; ++jcrd) { - // Reset the temporary array for another constraint - for (j = 0; j < nparams; ++j) const_now[j] = 0; + // Reset the temporary array for another constraint + for (j = 0; j < nparams; ++j) const_now[j] = 0; - for (jat = 0; jat < 3 * nat; jat += 3) { - intarr[1] = jat + jcrd; + for (jat = 0; jat < 3 * nat; jat += 3) { + intarr[1] = jat + jcrd; - iter_found = list_found.find( - FcProperty(order + 2, 1.0, intarr, 1)); + iter_found = list_found.find(FcProperty(order + 2, 1.0, + intarr, 1)); - // If found an IFC - if (iter_found != list_found.end()) { - // Round the coefficient to integer - const_now[(*iter_found).mother] += nint((*iter_found).sign); - } + // If found an IFC + if (iter_found != list_found.end()) { + // Round the coefficient to integer + const_now[(*iter_found).mother] += nint((*iter_found).sign); + } + } + // Add to the constraint list + if (!is_allzero(const_now, loc_nonzero)) { + if (const_now[loc_nonzero] < 0) { + for (j = 0; j < nparams; ++j) const_now[j] *= -1; } - // Add to the constraint list - if (!is_allzero(const_now, loc_nonzero)) { - if (const_now[loc_nonzero] < 0) { - for (j = 0; j < nparams; ++j) const_now[j] *= -1; + const_tmp.clear(); + for (j = 0; j < nparams; ++j) { + if (std::abs(const_now[j]) > 0) { + const_tmp.emplace_back(j, const_now[j]); } - const_mat.push_back(const_now); } + constraint_all.emplace_back(const_tmp); } } + } - } else { + } else { - // Anharmonic cases + // Anharmonic cases - for (j = 0; j < interaction->interaction_pair[order][i].size(); ++j) { - intlist.push_back(interaction->interaction_pair[order][i][j]); - } - std::sort(intlist.begin(), intlist.end()); + auto intlist(cluster->get_interaction_pair(order, i)); + std::sort(intlist.begin(), intlist.end()); - data_vec.clear(); - // Generate data_vec that contains possible interaction clusters. - // Each cluster contains (order + 1) atoms, and the last atom index - // will be treated seperately below. - CombinationWithRepetition g2(intlist.begin(), intlist.end(), order); - do { - data = g2.now(); + data_vec.clear(); + // Generate data_vec that contains possible interacting clusters. + // Each cluster contains (order + 1) atoms, and the last atom index + // will be treated seperately below. + CombinationWithRepetition g2(intlist.begin(), intlist.end(), order); + do { + data = g2.now(); - intarr[0] = iat; + intarr[0] = iat; - for (isize = 0; isize < data.size(); ++isize) { - intarr[isize + 1] = data[isize]; - } + for (isize = 0; isize < data.size(); ++isize) { + intarr[isize + 1] = data[isize]; + } - if (interaction->nbody(order + 1, intarr) - <= interaction->nbody_include[order]) { - if (interaction->is_incutoff(order + 1, intarr, order)) { - // Add to list if the atoms interact with each other. - data_vec.push_back(data); - } + if (cluster->satisfy_nbody_rule(order + 1, intarr, order)) { + if (cluster->is_incutoff(order + 1, intarr, order, supercell.kind)) { + // Add to list if the atoms interact with each other. + data_vec.push_back(data); } + } - } while (g2.next()); + } while (g2.next()); - int ndata = data_vec.size(); + const auto ndata = data_vec.size(); - // Use openmp for acceleration if possible + // Use openmp for acceleration if possible #ifdef _OPENMP #pragma omp parallel #endif - { - int *intarr_omp, *intarr_copy_omp; + { + int *intarr_omp, *intarr_copy_omp; - memory->allocate(intarr_omp, order + 2); - memory->allocate(intarr_copy_omp, order + 2); + allocate(intarr_omp, order + 2); + allocate(intarr_copy_omp, order + 2); - std::vector> const_omp; - std::vector data_omp; - std::vector const_now_omp; + std::vector data_omp; + std::vector const_now_omp; - const_omp.clear(); - const_now_omp.resize(nparams); + ConstEntry const_tmp_omp; + std::vector constraint_list_omp; + + const_now_omp.resize(nparams); #ifdef _OPENMP #pragma omp for private(isize, ixyz, jcrd, j, jat, iter_found, loc_nonzero), schedule(guided), nowait #endif - for (idata = 0; idata < ndata; ++idata) { - - data_omp = data_vec[idata]; + for (idata = 0; idata < ndata; ++idata) { - intarr_omp[0] = iat; - for (isize = 0; isize < data_omp.size(); ++isize) { - intarr_omp[isize + 1] = data_omp[isize]; - } + data_omp = data_vec[idata]; - // Loop for xyz component - for (ixyz = 0; ixyz < nxyz; ++ixyz) { - // Loop for the xyz index of the last atom - for (jcrd = 0; jcrd < 3; ++jcrd) { + intarr_omp[0] = iat; + for (isize = 0; isize < data_omp.size(); ++isize) { + intarr_omp[isize + 1] = data_omp[isize]; + } - // Reset the temporary array for another constraint - for (j = 0; j < nparams; ++j) const_now_omp[j] = 0; + // Loop for xyz component + for (ixyz = 0; ixyz < nxyz; ++ixyz) { + // Loop for the xyz index of the last atom + for (jcrd = 0; jcrd < 3; ++jcrd) { - // Loop for the last atom index - for (jat = 0; jat < 3 * nat; jat += 3) { - intarr_omp[order + 1] = jat / 3; + // Reset the temporary array for another constraint + for (j = 0; j < nparams; ++j) const_now_omp[j] = 0; - if (interaction->nbody(order + 2, intarr_omp) - <= interaction->nbody_include[order]) { - for (j = 0; j < order + 1; ++j) { - intarr_copy_omp[j] = 3 * intarr_omp[j] + xyzcomponent[ixyz][j]; - } - intarr_copy_omp[order + 1] = jat + jcrd; + // Loop for the last atom index + for (jat = 0; jat < 3 * nat; jat += 3) { + intarr_omp[order + 1] = jat / 3; - fcs->sort_tail(order + 2, intarr_copy_omp); + if (cluster->satisfy_nbody_rule(order + 2, intarr_omp, order)) { + for (j = 0; j < order + 1; ++j) { + intarr_copy_omp[j] = 3 * intarr_omp[j] + xyzcomponent[ixyz][j]; + } + intarr_copy_omp[order + 1] = jat + jcrd; - iter_found = list_found.find(FcProperty(order + 2, 1.0, - intarr_copy_omp, 1)); - if (iter_found != list_found.end()) { - const_now_omp[(*iter_found).mother] += nint((*iter_found).sign); - } + sort_tail(order + 2, intarr_copy_omp); + iter_found = list_found.find(FcProperty(order + 2, 1.0, + intarr_copy_omp, 1)); + if (iter_found != list_found.end()) { + const_now_omp[(*iter_found).mother] += nint((*iter_found).sign); } - } // close loop jat - // Add the constraint to the private array - if (!is_allzero(const_now_omp, loc_nonzero)) { - if (const_now_omp[loc_nonzero] < 0) { - for (j = 0; j < nparams; ++j) const_now_omp[j] *= -1; - } - const_omp.push_back(const_now_omp); } - } - } - // sort-->uniq the array - std::sort(const_omp.begin(), const_omp.end()); - const_omp.erase(std::unique(const_omp.begin(), const_omp.end()), - const_omp.end()); + } // close loop jat - // Merge vectors -#pragma omp critical - { - for (auto it = const_omp.begin(); it != const_omp.end(); ++it) { - const_mat.push_back(*it); + // Add the constraint to the private array + if (!is_allzero(const_now_omp, loc_nonzero)) { + if (const_now_omp[loc_nonzero] < 0) { + for (j = 0; j < nparams; ++j) const_now_omp[j] *= -1; + } + + const_tmp_omp.clear(); + for (j = 0; j < nparams; ++j) { + if (std::abs(const_now_omp[j]) > 0) { + const_tmp_omp.emplace_back(j, const_now_omp[j]); + } + } + if (const_tmp_omp.empty()) { + std::cout << "This cannot happen" << std::endl; + } + constraint_list_omp.emplace_back(const_tmp_omp); } } - const_omp.clear(); + } - }// close idata (openmp main loop) + } // close idata (openmp main loop) - memory->deallocate(intarr_omp); - memory->deallocate(intarr_copy_omp); + deallocate(intarr_omp); + deallocate(intarr_copy_omp); - } // close openmp + // Merge vectors +#pragma omp critical + { + for (const auto &it : constraint_list_omp) { + constraint_all.emplace_back(it); + } + } + constraint_list_omp.clear(); + } // close openmp - intlist.clear(); - } // close if + intlist.clear(); + } // close if + } // close loop i - // sort--> uniq the array (to save memory consumption) - std::sort(const_mat.begin(), const_mat.end()); - const_mat.erase(std::unique(const_mat.begin(), const_mat.end()), - const_mat.end()); - // timer->print_elapsed(); - } // close loop i + deallocate(xyzcomponent); + deallocate(intarr); + deallocate(intarr_copy); - memory->deallocate(xyzcomponent); - memory->deallocate(intarr); - memory->deallocate(intarr_copy); + std::sort(constraint_all.begin(), constraint_all.end()); + constraint_all.erase(std::unique(constraint_all.begin(), + constraint_all.end()), + constraint_all.end()); - // Copy to constraint class - const_translation[order].clear(); - for (auto it = const_mat.rbegin(); it != const_mat.rend(); ++it) { - for (i = 0; i < (*it).size(); ++i) { - arr_constraint[i] = static_cast((*it)[i]); + typedef std::map ConstDoubleEntry; + ConstDoubleEntry const_tmp2; + auto division_factor = 1.0; + int counter; + const_out.clear(); + + for (const auto &it : constraint_all) { + const_tmp2.clear(); + counter = 0; + for (const auto &it2 : it) { + if (counter == 0) { + division_factor = 1.0 / it2.val; } - const_translation[order].push_back(ConstraintClass(nparams, - arr_constraint)); + const_tmp2[it2.col] = it2.val * division_factor; + ++counter; } - const_mat.clear(); - memory->deallocate(arr_constraint); - - remove_redundant_rows(nparams, const_translation[order], eps8); - - std::cout << " done." << std::endl; - } // close loop order - memory->deallocate(ind); - - std::cout << " Finished !" << std::endl << std::endl; + const_out.emplace_back(const_tmp2); + } + constraint_all.clear(); + if (do_rref) rref_sparse(nparams, const_out, eps8); } -void Constraint::rotational_invariance() +void Constraint::generate_rotational_constraint(const System *system, + const Symmetry *symmetry, + const Cluster *cluster, + const Fcs *fcs, + const int verbosity, + const double tolerance) { // Create constraints for the rotational invariance - std::cout << " Generating constraints for rotational invariance ..." << std::endl; + if (verbosity > 0) + std::cout << " Generating constraints for rotational invariance ..." << std::endl; #ifdef _DEBUG std::ofstream ofs_constraint; @@ -1095,27 +1133,30 @@ void Constraint::rotational_invariance() int iat, jat; int icrd, jcrd; int order; - int maxorder = interaction->maxorder; - int natmin = symmetry->nat_prim; + const auto maxorder = cluster->get_maxorder(); + const auto natmin = symmetry->get_nat_prim(); int mu, nu; - int ixyz, nxyz, nxyz2; + int ixyz, nxyz{0}, nxyz2; int mu_lambda, lambda; int levi_factor; int *ind; - int **xyzcomponent, **xyzcomponent2; - int *nparams, nparam_sub; + int **xyzcomponent = nullptr; + int **xyzcomponent2 = nullptr; + size_t *nparams, nparam_sub; int *interaction_index, *interaction_atom; int *interaction_tmp; + int loc_nonzero; - double *arr_constraint; - double *arr_constraint_self; + std::vector arr_constraint; + std::vector arr_constraint_self; + std::vector arr_constraint_lower; bool valid_rotation_axis[3][3]; double vec_for_rot[3]; - std::vector interaction_list, interaction_list_old, interaction_list_now; + std::vector interaction_list; std::unordered_set list_found; std::unordered_set list_found_last; @@ -1125,45 +1166,62 @@ void Constraint::rotational_invariance() std::vector atom_tmp; std::vector> cell_dummy; - std::set::iterator iter_cluster; + std::set::iterator iter_cluster; + + typedef std::vector ConstEntry; + ConstEntry const_tmp; + std::vector *const_self_vec, *const_cross_vec; + + allocate(const_self_vec, maxorder); + allocate(const_cross_vec, maxorder); setup_rotation_axis(valid_rotation_axis); - memory->allocate(ind, maxorder + 1); - memory->allocate(nparams, maxorder); + allocate(ind, maxorder + 1); + allocate(nparams, maxorder); for (order = 0; order < maxorder; ++order) { - nparams[order] = fcs->nequiv[order].size(); + nparams[order] = fcs->get_nequiv()[order].size(); if (order == 0) { - std::cout << " Constraints between " << std::setw(8) - << "1st-order IFCs (which are zero) and " - << std::setw(8) << interaction->str_order[order] << " ..."; + if (verbosity > 0) { + std::cout << " Constraints between " << std::setw(8) + << "1st-order IFCs (which are zero) and " + << std::setw(8) << cluster->get_ordername(order) << " ..."; + } + nparam_sub = nparams[order]; } else { - std::cout << " Constraints between " << std::setw(8) - << interaction->str_order[order - 1] << " and " - << std::setw(8) << interaction->str_order[order] << " ..."; + if (verbosity > 0) { + std::cout << " Constraints between " << std::setw(8) + << cluster->get_ordername(order - 1) << " and " + << std::setw(8) << cluster->get_ordername(order) << " ..."; + } + nparam_sub = nparams[order] + nparams[order - 1]; } + arr_constraint.resize(nparam_sub); + arr_constraint_self.resize(nparams[order]); + + if (order > 0) arr_constraint_lower.resize(nparams[order - 1]); - memory->allocate(arr_constraint, nparam_sub); - memory->allocate(arr_constraint_self, nparams[order]); - memory->allocate(interaction_atom, order + 2); - memory->allocate(interaction_index, order + 2); - memory->allocate(interaction_tmp, order + 2); + allocate(interaction_atom, order + 2); + allocate(interaction_index, order + 2); + allocate(interaction_tmp, order + 2); + const_self_vec[order].clear(); + const_cross_vec[order].clear(); if (order > 0) { list_found_last = list_found; nxyz = static_cast(pow(static_cast(3), order)); - memory->allocate(xyzcomponent, nxyz, order); + allocate(xyzcomponent, nxyz, order); fcs->get_xyzcomponent(order, xyzcomponent); } list_found.clear(); - for (auto p = fcs->fc_table[order].begin(); p != fcs->fc_table[order].end(); ++p) { + for (auto p = fcs->get_fc_table()[order].begin(); p != fcs->get_fc_table()[order].end(); ++p) { for (i = 0; i < order + 2; ++i) { ind[i] = (*p).elems[i]; } @@ -1173,16 +1231,13 @@ void Constraint::rotational_invariance() for (i = 0; i < natmin; ++i) { - iat = symmetry->map_p2s[i][0]; + iat = symmetry->get_map_p2s()[i][0]; interaction_atom[0] = iat; if (order == 0) { - interaction_list_now.clear(); - for (j = 0; j < interaction->interaction_pair[order][i].size(); ++j) { - interaction_list_now.push_back(interaction->interaction_pair[order][i][j]); - } + auto interaction_list_now(cluster->get_interaction_pair(order, i)); std::sort(interaction_list_now.begin(), interaction_list_now.end()); // Special treatment for harmonic force constants @@ -1201,10 +1256,9 @@ void Constraint::rotational_invariance() for (j = 0; j < nparam_sub; ++j) arr_constraint[j] = 0.0; - for (auto iter_list = interaction_list_now.begin(); - iter_list != interaction_list_now.end(); ++iter_list) { + for (auto &iter_list : interaction_list_now) { - jat = *iter_list; + jat = iter_list; interaction_index[1] = 3 * jat + mu; iter_found = list_found.find(FcProperty(order + 2, 1.0, interaction_index, 1)); @@ -1212,21 +1266,21 @@ void Constraint::rotational_invariance() atom_tmp.clear(); atom_tmp.push_back(jat); cell_dummy.clear(); - iter_cluster = interaction->mindist_cluster[order][i].find( - MinimumDistanceCluster(atom_tmp, cell_dummy)); + iter_cluster = cluster->get_interaction_cluster(order, i).find( + InteractionCluster(atom_tmp, cell_dummy)); - if (iter_cluster == interaction->mindist_cluster[order][i].end()) { - error->exit("rotational_invariance", - "interaction not found ..."); + if (iter_cluster == cluster->get_interaction_cluster(order, i).end()) { + exit("generate_rotational_constraint", + "cluster not found ..."); } else { for (j = 0; j < 3; ++j) vec_for_rot[j] = 0.0; - int nsize_equiv = (*iter_cluster).cell.size(); + const auto nsize_equiv = (*iter_cluster).cell.size(); for (j = 0; j < nsize_equiv; ++j) { - for (int k = 0; k < 3; ++k) { + for (auto k = 0; k < 3; ++k) { vec_for_rot[k] - += interaction->x_image[(*iter_cluster).cell[j][0]][jat][k]; + += system->get_x_image()[(*iter_cluster).cell[j][0]][jat][k]; } } @@ -1240,7 +1294,7 @@ void Constraint::rotational_invariance() arr_constraint[(*iter_found).mother] += (*iter_found).sign * vec_for_rot[nu]; } - // Exchange mu <--> nu and repeat again. + // Exchange mu <--> nu and repeat again. // Note that the sign is inverted (+ --> -) in the summation interaction_index[1] = 3 * jat + nu; @@ -1252,29 +1306,29 @@ void Constraint::rotational_invariance() } } - if (!is_allzero(nparam_sub, arr_constraint)) { + if (!is_allzero(arr_constraint, tolerance, loc_nonzero)) { // Add to constraint list - const_rotation_self[order].push_back( - ConstraintClass(nparam_sub, arr_constraint)); + if (arr_constraint[loc_nonzero] < 0.0) { + for (j = 0; j < nparam_sub; ++j) arr_constraint[j] *= -1.0; + } + const_tmp.clear(); + for (j = 0; j < nparam_sub; ++j) { + if (std::abs(arr_constraint[j]) >= tolerance) { + const_tmp.emplace_back(j, arr_constraint[j]); + } + } + const_self_vec[order].emplace_back(const_tmp); } } // nu - } // mu + } // mu } } else { // Constraint between different orders - interaction_list_old.clear(); - interaction_list_now.clear(); - - for (j = 0; j < interaction->interaction_pair[order][i].size(); ++j) { - interaction_list_now.push_back(interaction->interaction_pair[order][i][j]); - } - for (j = 0; j < interaction->interaction_pair[order - 1][i].size(); ++j) { - interaction_list_old.push_back(interaction->interaction_pair[order - 1][i][j]); - } - + auto interaction_list_now(cluster->get_interaction_pair(order, i)); + auto interaction_list_old(cluster->get_interaction_pair(order - 1, i)); std::sort(interaction_list_now.begin(), interaction_list_now.end()); std::sort(interaction_list_old.begin(), interaction_list_old.end()); @@ -1282,10 +1336,10 @@ void Constraint::rotational_invariance() interaction_index[0] = 3 * iat + icrd; - CombinationWithRepetition g_now(interaction_list_now.begin(), - interaction_list_now.end(), order); - CombinationWithRepetition g_old(interaction_list_old.begin(), - interaction_list_old.end(), order); + const CombinationWithRepetition g_now(interaction_list_now.begin(), + interaction_list_now.end(), order); + const CombinationWithRepetition g_old(interaction_list_old.begin(), + interaction_list_old.end(), order); // m -th order --> (m-1)-th order // (m-1)-th order --> m-th order @@ -1304,10 +1358,11 @@ void Constraint::rotational_invariance() // Loop for the interacting pairs do { - std::vector data = g.now(); + auto data = g.now(); - for (int idata = 0; idata < data.size(); ++idata) + for (size_t idata = 0; idata < data.size(); ++idata) { interaction_atom[idata + 1] = data[idata]; + } for (ixyz = 0; ixyz < nxyz; ++ixyz) { @@ -1325,12 +1380,15 @@ void Constraint::rotational_invariance() for (j = 0; j < nparam_sub; ++j) arr_constraint[j] = 0.0; // Loop for m_{N+1}, a_{N+1} - for (auto iter_list = interaction_list.begin(); - iter_list != interaction_list.end(); ++iter_list) { - jat = *iter_list; + for (auto &iter_list : interaction_list) { + jat = iter_list; interaction_atom[order + 1] = jat; - if (!interaction->is_incutoff(order + 2, interaction_atom, order)) continue; + if (!cluster->is_incutoff(order + 2, + interaction_atom, + order, + system->get_supercell().kind)) + continue; atom_tmp.clear(); @@ -1339,9 +1397,10 @@ void Constraint::rotational_invariance() } std::sort(atom_tmp.begin(), atom_tmp.end()); - iter_cluster = interaction->mindist_cluster[order][i].find( - MinimumDistanceCluster(atom_tmp, cell_dummy)); - if (iter_cluster != interaction->mindist_cluster[order][i].end()) { + iter_cluster = cluster->get_interaction_cluster(order, i).find( + InteractionCluster(atom_tmp, + cell_dummy)); + if (iter_cluster != cluster->get_interaction_cluster(order, i).end()) { int iloc = -1; @@ -1353,16 +1412,17 @@ void Constraint::rotational_invariance() } if (iloc == -1) { - error->exit("rotational_invariance", "This cannot happen."); + exit("generate_rotational_constraint", "This cannot happen."); } for (j = 0; j < 3; ++j) vec_for_rot[j] = 0.0; - int nsize_equiv = (*iter_cluster).cell.size(); + const auto nsize_equiv = (*iter_cluster).cell.size(); for (j = 0; j < nsize_equiv; ++j) { - for (int k = 0; k < 3; ++k) { - vec_for_rot[k] += interaction->x_image[(*iter_cluster).cell[j][iloc]][jat][k]; + for (auto k = 0; k < 3; ++k) { + vec_for_rot[k] += system->get_x_image()[(*iter_cluster).cell[j][ + iloc]][jat][k]; } } @@ -1377,9 +1437,10 @@ void Constraint::rotational_invariance() interaction_index[order + 1] = 3 * jat + mu; for (j = 0; j < order + 2; ++j) interaction_tmp[j] = interaction_index[j]; - fcs->sort_tail(order + 2, interaction_tmp); + sort_tail(order + 2, interaction_tmp); - iter_found = list_found.find(FcProperty(order + 2, 1.0, interaction_tmp, 1)); + iter_found = list_found. + find(FcProperty(order + 2, 1.0, interaction_tmp, 1)); if (iter_found != list_found.end()) { arr_constraint[nparams[order - 1] + (*iter_found).mother] += (*iter_found).sign * vec_for_rot[nu]; @@ -1390,9 +1451,10 @@ void Constraint::rotational_invariance() interaction_index[order + 1] = 3 * jat + nu; for (j = 0; j < order + 2; ++j) interaction_tmp[j] = interaction_index[j]; - fcs->sort_tail(order + 2, interaction_tmp); + sort_tail(order + 2, interaction_tmp); - iter_found = list_found.find(FcProperty(order + 2, 1.0, interaction_tmp, 1)); + iter_found = list_found. + find(FcProperty(order + 2, 1.0, interaction_tmp, 1)); if (iter_found != list_found.end()) { arr_constraint[nparams[order - 1] + (*iter_found).mother] -= (*iter_found).sign * vec_for_rot[mu]; @@ -1405,19 +1467,22 @@ void Constraint::rotational_invariance() for (jcrd = 0; jcrd < 3; ++jcrd) { - for (j = 0; j < order + 1; ++j) interaction_tmp[j] = interaction_index[j]; + for (j = 0; j < order + 1; ++j) + interaction_tmp[j] = interaction_index[j + ]; interaction_tmp[lambda] = 3 * interaction_atom[lambda] + jcrd; levi_factor = 0; for (j = 0; j < 3; ++j) { - levi_factor += levi_civita(j, mu, nu) * levi_civita(j, mu_lambda, jcrd); + levi_factor += levi_civita(j, mu, nu) * levi_civita( + j, mu_lambda, jcrd); } if (levi_factor == 0) continue; - fcs->sort_tail(order + 1, interaction_tmp); + sort_tail(order + 1, interaction_tmp); iter_found = list_found_last.find(FcProperty(order + 1, 1.0, interaction_tmp, 1)); @@ -1428,32 +1493,65 @@ void Constraint::rotational_invariance() } } - if (!is_allzero(nparam_sub, arr_constraint)) { + if (!is_allzero(arr_constraint, tolerance, loc_nonzero)) { // A Candidate for another constraint found ! // Add to the appropriate set - if (is_allzero(nparam_sub, arr_constraint, nparams[order - 1])) { - const_rotation_self[order - 1].push_back( - ConstraintClass(nparams[order - 1], arr_constraint)); - } else if (is_allzero(nparams[order - 1], arr_constraint)) { - const_rotation_self[order].push_back( - ConstraintClass(nparam_sub, arr_constraint, nparams[order - 1])); + if (arr_constraint[loc_nonzero] < 0.0) { + for (j = 0; j < nparam_sub; ++j) arr_constraint[j] *= -1.0; + } + for (j = 0; j < nparams[order]; ++j) { + arr_constraint_self[j] = arr_constraint[j + nparams[order - 1]]; + } + for (j = 0; j < nparams[order - 1]; ++j) { + arr_constraint_lower[j] = arr_constraint[j]; + } + + const_tmp.clear(); + + if (is_allzero(arr_constraint_self, tolerance, loc_nonzero)) { + // If all elements of the "order"th order is zero, + // the constraint is intraorder of the "order-1"th order. + for (j = 0; j < nparams[order - 1]; ++j) { + if (std::abs(arr_constraint_lower[j]) >= tolerance) { + const_tmp.emplace_back(j, arr_constraint_lower[j]); + } + } + const_self_vec[order - 1].emplace_back(const_tmp); + + } else if (is_allzero(arr_constraint_lower, tolerance, loc_nonzero)) { + // If all elements of the "order-1"th order is zero, + // the constraint is intraorder of the "order"th order. + for (j = 0; j < nparams[order]; ++j) { + if (std::abs(arr_constraint_self[j]) >= tolerance) { + const_tmp.emplace_back(j, arr_constraint_self[j]); + } + } + const_self_vec[order].emplace_back(const_tmp); + } else { - const_rotation_cross[order].push_back( - ConstraintClass(nparam_sub, arr_constraint)); + // If nonzero elements exist in both of the "order-1" and "order", + // the constraint is intrerorder. + + for (j = 0; j < nparam_sub; ++j) { + if (std::abs(arr_constraint[j]) >= tolerance) { + const_tmp.emplace_back(j, arr_constraint[j]); + } + } + const_cross_vec[order].emplace_back(const_tmp); } } } // nu - } // mu + } // mu } // ixyz } while (g.next()); } // direction - } // icrd + } // icrd } // Additional constraint for the last order. @@ -1461,8 +1559,11 @@ void Constraint::rotational_invariance() if (order == maxorder - 1 && !exclude_last_R) { + auto interaction_list_now(cluster->get_interaction_pair(order, i)); + std::sort(interaction_list_now.begin(), interaction_list_now.end()); + nxyz2 = static_cast(pow(static_cast(3), order + 1)); - memory->allocate(xyzcomponent2, nxyz2, order + 1); + allocate(xyzcomponent2, nxyz2, order + 1); fcs->get_xyzcomponent(order + 1, xyzcomponent2); for (icrd = 0; icrd < 3; ++icrd) { @@ -1473,9 +1574,9 @@ void Constraint::rotational_invariance() interaction_list_now.end(), order + 1); do { - std::vector data = g_now.now(); + auto data = g_now.now(); - for (int idata = 0; idata < data.size(); ++idata) + for (auto idata = 0; idata < data.size(); ++idata) interaction_atom[idata + 1] = data[idata]; for (ixyz = 0; ixyz < nxyz2; ++ixyz) { @@ -1509,7 +1610,7 @@ void Constraint::rotational_invariance() if (levi_factor == 0) continue; - fcs->sort_tail(order + 2, interaction_tmp); + sort_tail(order + 2, interaction_tmp); iter_found = list_found.find(FcProperty(order + 2, 1.0, interaction_tmp, 1)); @@ -1518,15 +1619,23 @@ void Constraint::rotational_invariance() += (*iter_found).sign * static_cast(levi_factor); } } // jcrd - } // lambda + } // lambda - if (!is_allzero(nparams[order], arr_constraint_self)) { - const_rotation_self[order].push_back( - ConstraintClass(nparams[order], arr_constraint_self)); + if (!is_allzero(arr_constraint_self, tolerance, loc_nonzero)) { + if (arr_constraint_self[loc_nonzero] < 0.0) { + for (j = 0; j < nparams[order]; ++j) arr_constraint_self[j] *= -1.0; + } + const_tmp.clear(); + for (j = 0; j < nparams[order]; ++j) { + if (std::abs(arr_constraint_self[j]) >= tolerance) { + const_tmp.emplace_back(j, arr_constraint_self[j]); + } + } + const_self_vec[order].emplace_back(const_tmp); } } // nu - } // mu + } // mu } // ixyz @@ -1535,131 +1644,98 @@ void Constraint::rotational_invariance() } // icrd - memory->deallocate(xyzcomponent2); + deallocate(xyzcomponent2); } } // iat - std::cout << " done." << std::endl; + if (verbosity > 0) std::cout << " done." << std::endl; if (order > 0) { - memory->deallocate(xyzcomponent); + deallocate(xyzcomponent); } - memory->deallocate(arr_constraint); - memory->deallocate(arr_constraint_self); - memory->deallocate(interaction_tmp); - memory->deallocate(interaction_index); - memory->deallocate(interaction_atom); + deallocate(interaction_tmp); + deallocate(interaction_index); + deallocate(interaction_atom); } // order - for (order = 0; order < maxorder; ++order) { - remove_redundant_rows(nparam_sub, const_rotation_cross[order], eps6); - remove_redundant_rows(nparams[order], const_rotation_self[order], eps6); - } - - std::cout << " Finished !" << std::endl << std::endl; - - memory->deallocate(ind); - memory->deallocate(nparams); -} - -void Constraint::remove_redundant_rows(const int n, - std::vector &Constraint_vec, - const double tolerance) -{ - int i, j; - - int nparam = n; - int nconst = Constraint_vec.size(); - double *arr_tmp; - double **mat_tmp; - - int nrank; - - if (nconst > 0) { - - memory->allocate(mat_tmp, nconst, nparam); - - i = 0; + int counter; + std::map const_copy; + auto division_factor = 1.0; - for (auto p = Constraint_vec.begin(); p != Constraint_vec.end(); ++p) { - for (j = 0; j < nparam; ++j) { - mat_tmp[i][j] = (*p).w_const[j]; + for (order = 0; order < maxorder; ++order) { + // Sort & unique + std::sort(const_self_vec[order].begin(), const_self_vec[order].end()); + const_self_vec[order].erase(std::unique(const_self_vec[order].begin(), + const_self_vec[order].end()), + const_self_vec[order].end()); + std::sort(const_cross_vec[order].begin(), const_cross_vec[order].end()); + const_cross_vec[order].erase(std::unique(const_cross_vec[order].begin(), + const_cross_vec[order].end()), + const_cross_vec[order].end()); + + // Copy to the return variable + for (const auto &it : const_self_vec[order]) { + const_copy.clear(); + counter = 0; + for (const auto &it2 : it) { + if (counter == 0) { + division_factor = 1.0 / it2.val; + } + const_copy[it2.col] = it2.val * division_factor; + ++counter; } - ++i; + const_rotation_self[order].emplace_back(const_copy); } - - rref(nconst, nparam, mat_tmp, nrank, tolerance); - - memory->allocate(arr_tmp, nparam); - - Constraint_vec.clear(); - - for (i = 0; i < nrank; ++i) { - for (j = 0; j < i; ++j) arr_tmp[j] = 0.0; - - for (j = i; j < nparam; ++j) { - if (std::abs(mat_tmp[i][j]) < tolerance) { - arr_tmp[j] = 0.0; - } else { - arr_tmp[j] = mat_tmp[i][j]; + const_self_vec[order].clear(); + + for (const auto &it : const_cross_vec[order]) { + const_copy.clear(); + counter = 0; + for (const auto &it2 : it) { + if (counter == 0) { + division_factor = 1.0 / it2.val; } + const_copy[it2.col] = it2.val * division_factor; + ++counter; } - Constraint_vec.push_back(ConstraintClass(nparam, arr_tmp)); + const_rotation_cross[order].emplace_back(const_copy); } + const_cross_vec[order].clear(); - memory->deallocate(mat_tmp); - memory->deallocate(arr_tmp); + // Perform rref + rref_sparse(nparams[order], + const_rotation_self[order], + eps6); + + if (order > 0) { + rref_sparse(nparams[order - 1] + nparams[order], + const_rotation_cross[order], + eps6); + } } -} + if (verbosity > 0) std::cout << " Finished !" << std::endl << std::endl; -int Constraint::levi_civita(const int i, const int j, const int k) -{ - int epsilon = (j - i) * (k - i) * (k - j) / 2; - return epsilon; + deallocate(ind); + deallocate(nparams); + deallocate(const_self_vec); + deallocate(const_cross_vec); } -bool Constraint::is_allzero(const int n, const double *arr, const int nshift) -{ - for (int i = nshift; i < n; ++i) { - if (std::abs(arr[i]) > eps10) { - return false; - } - } - return true; -} -bool Constraint::is_allzero(const std::vector vec, int &loc) +int Constraint::levi_civita(const int i, + const int j, + const int k) const { - loc = -1; - for (int i = 0; i < vec.size(); ++i) { - if (std::abs(vec[i]) > 0) { - loc = i; - return false; - } - } - return true; + return (j - i) * (k - i) * (k - j) / 2; } -bool Constraint::is_allzero(const std::vector vec, const double tol, int &loc) -{ - loc = -1; - for (int i = 0; i < vec.size(); ++i) { - if (std::abs(vec[i]) > tol) { - loc = i; - return false; - } - } - return true; -} void Constraint::setup_rotation_axis(bool flag[3][3]) { - unsigned int mu, nu; - - for (mu = 0; mu < 3; ++mu) { - for (nu = 0; nu < 3; ++nu) { + for (auto mu = 0; mu < 3; ++mu) { + for (auto nu = 0; nu < 3; ++nu) { if (mu == nu) { flag[mu][nu] = false; } else { @@ -1696,245 +1772,240 @@ void Constraint::setup_rotation_axis(bool flag[3][3]) } else if (rotation_axis == "xyz") { // do nothing } else { - error->warn("setup_rotation_axis", - "Invalid rotation_axis. Default value(xyz) will be used."); + warn("setup_rotation_axis", + "Invalid rotation_axis. Default value(xyz) will be used."); } } -void Constraint::rref(int nrows, - int ncols, - double **mat, - int &nrank, - double tolerance) +void Constraint::fix_forceconstants_to_file(const int order, + const Symmetry *symmetry, + const Fcs *fcs, + const std::string file_to_fix, + std::vector &const_out) const { - // Return the reduced row echelon form (rref) of matrix mat. - // In addition, rank of the matrix is estimated. - - int irow, icol, jrow, jcol; - int pivot; - double tmp; + using namespace boost::property_tree; + ptree pt; - nrank = 0; - - icol = 0; + try { + read_xml(file_to_fix, pt); + } + catch (std::exception &e) { + if (order == 0) { + auto str_error = "Cannot open file FC2XML ( " + file_to_fix + " )"; + } else if (order == 1) { + auto str_error = "Cannot open file FC3XML ( " + file_to_fix + " )"; + } + exit("fix_forceconstants_to_file", "Failed to open ", file_to_fix.c_str()); + } - for (irow = 0; irow < nrows; ++irow) { + const auto nat_ref = boost::lexical_cast( + get_value_from_xml(pt, "Data.Structure.NumberOfAtoms")); + const auto ntran_ref = boost::lexical_cast( + get_value_from_xml(pt, "Data.Symmetry.NumberOfTranslations")); + const auto natmin_ref = nat_ref / ntran_ref; - pivot = irow; + if (natmin_ref != symmetry->get_nat_prim()) { + exit("fix_forceconstants_to_file", + "The number of atoms in the primitive cell is not consistent."); + } - while (std::abs(mat[pivot][icol]) < tolerance) { - ++pivot; + const auto nfcs = fcs->get_nequiv()[order].size(); - if (pivot == nrows) { - pivot = irow; - ++icol; + if (order == 0) { + const auto nfcs_ref = boost::lexical_cast( + get_value_from_xml(pt, "Data.ForceConstants.HarmonicUnique.NFC2")); - if (icol == ncols) break; - } + if (nfcs_ref != nfcs) { + exit("load_reference_system_xml", + "The number of harmonic force constants is not consistent."); } + } else if (order == 1) { + const auto nfcs_ref = boost::lexical_cast( + get_value_from_xml(pt, "Data.ForceConstants.CubicUnique.NFC3")); - if (icol == ncols) break; + if (nfcs_ref != nfcs) { + exit("load_reference_system_xml", + "The number of cubic force constants is not consistent."); + } + } - if (std::abs(mat[pivot][icol]) > tolerance) ++nrank; + int **intpair_ref; + double *fcs_ref; - if (pivot != irow) { - //#pragma omp parallel for private(tmp) - for (jcol = icol; jcol < ncols; ++jcol) { - tmp = mat[pivot][jcol]; - mat[pivot][jcol] = mat[irow][jcol]; - mat[irow][jcol] = tmp; - } - } + allocate(fcs_ref, nfcs); + allocate(intpair_ref, nfcs, 3); - tmp = mat[irow][icol]; - tmp = 1.0 / tmp; - //#pragma omp parallel for - for (jcol = icol; jcol < ncols; ++jcol) { - mat[irow][jcol] *= tmp; - } + int counter = 0; - for (jrow = 0; jrow < nrows; ++jrow) { - if (jrow == irow) continue; + if (order == 0) { + BOOST_FOREACH(const ptree::value_type & child_, pt.get_child("Data.ForceConstants.HarmonicUnique")) { + if (child_.first == "FC2") { + const auto &child = child_.second; + const auto str_intpair = child.get(".pairs"); + const auto str_multiplicity = child.get(".multiplicity"); - tmp = mat[jrow][icol]; - //#pragma omp parallel for - for (jcol = icol; jcol < ncols; ++jcol) { - mat[jrow][jcol] -= tmp * mat[irow][jcol]; + std::istringstream is(str_intpair); + is >> intpair_ref[counter][0] >> intpair_ref[counter][1]; + fcs_ref[counter] = boost::lexical_cast(child.data()); + ++counter; + } + } + } else if (order == 1) { + BOOST_FOREACH(const ptree::value_type & child_, pt.get_child("Data.ForceConstants.CubicUnique")) { + if (child_.first == "FC3") { + const auto &child = child_.second; + const auto str_intpair = child.get(".pairs"); + const auto str_multiplicity = child.get(".multiplicity"); + + std::istringstream is(str_intpair); + is >> intpair_ref[counter][0] >> intpair_ref[counter][1] >> intpair_ref[counter][2]; + fcs_ref[counter] = boost::lexical_cast(child.data()); + ++counter; } } } -} - - -void Constraint::rref(std::vector> &mat, const double tolerance) -{ - // Return the reduced row echelon form (rref) of matrix mat. - // In addition, rank of the matrix is estimated. - int irow, icol, jrow, jcol; - int pivot; - double tmp; + const auto nterms = order + 2; - int nrank = 0; - - icol = 0; - - int nrows = mat.size(); - - if (nrows == 0) return; - - int ncols = mat[0].size(); - - for (irow = 0; irow < nrows; ++irow) { - - pivot = irow; + std::unordered_set list_found; + std::unordered_set::iterator iter_found; - while (std::abs(mat[pivot][icol]) < tolerance) { - ++pivot; + list_found.clear(); - if (pivot == nrows) { - pivot = irow; - ++icol; + for (auto &list_tmp : fcs->get_fc_table()[order]) { + list_found.insert(FcProperty(list_tmp)); + } - if (icol == ncols) break; - } + for (auto i = 0; i < nfcs; ++i) { + iter_found = list_found.find(FcProperty(nterms, 1.0, + intpair_ref[i], 1)); + if (iter_found == list_found.end()) { + exit("fix_forceconstants_to_file", + "Cannot find equivalent force constant, number: ", + i + 1); } + const_out.emplace_back(ConstraintTypeFix((*iter_found).mother, fcs_ref[i])); + } + deallocate(intpair_ref); + deallocate(fcs_ref); - if (icol == ncols) break; + list_found.clear(); +} - if (std::abs(mat[pivot][icol]) > tolerance) ++nrank; - if (pivot != irow) { - for (jcol = icol; jcol < ncols; ++jcol) { - tmp = mat[pivot][jcol]; - mat[pivot][jcol] = mat[irow][jcol]; - mat[irow][jcol] = tmp; - } +bool Constraint::is_allzero(const int n, + const double *arr, + const int nshift) const +{ + for (auto i = nshift; i < n; ++i) { + if (std::abs(arr[i]) > eps10) { + return false; } + } + return true; +} - tmp = mat[irow][icol]; - tmp = 1.0 / tmp; - for (jcol = icol; jcol < ncols; ++jcol) { - mat[irow][jcol] *= tmp; +bool Constraint::is_allzero(const std::vector &vec, + int &loc) const +{ + loc = -1; + for (auto i = 0; i < vec.size(); ++i) { + if (std::abs(vec[i]) > 0) { + loc = i; + return false; } + } + return true; +} - for (jrow = 0; jrow < nrows; ++jrow) { - if (jrow == irow) continue; - - tmp = mat[jrow][icol]; - for (jcol = icol; jcol < ncols; ++jcol) { - mat[jrow][jcol] -= tmp * mat[irow][jcol]; - } +bool Constraint::is_allzero(const std::vector &vec, + const double tol, + int &loc, + const int nshift) const +{ + loc = -1; + const auto n = vec.size(); + for (auto i = nshift; i < n; ++i) { + if (std::abs(vec[i]) > tol) { + loc = i; + return false; } } - - mat.erase(mat.begin() + nrank, mat.end()); - mat.shrink_to_fit(); + return true; } -/* -void Constraint::rref_nofraction(std::vector> &mat) +void Constraint::remove_redundant_rows(const size_t n, + std::vector &Constraint_vec, + const double tolerance) const { - // Return the reduced row echelon form (rref) of matrix mat. - // In addition, rank of the matrix is estimated. + size_t i, j; - int irow, icol, jrow, jcol; - int pivot; - int tmp, tmp2; - - int nrank = 0; - - icol = 0; - - int nrows = mat.size(); - int ncols = mat[0].size(); + auto nparam = n; + const auto nconst = Constraint_vec.size(); + double *arr_tmp; + double **mat_tmp; - for (irow = 0; irow < nrows; ++irow) { + size_t nrank; - pivot = irow; + if (nconst > 0) { - while (mat[pivot][icol] == 0) { - ++pivot; + allocate(mat_tmp, nconst, nparam); - if (pivot == nrows) { - pivot = irow; - ++icol; + i = 0; - if (icol == ncols) break; + for (auto &p : Constraint_vec) { + for (j = 0; j < nparam; ++j) { + mat_tmp[i][j] = p.w_const[j]; } + ++i; } - if (icol == ncols) break; - - if (std::abs(mat[pivot][icol]) > 0) ++nrank; + rref(nconst, nparam, mat_tmp, nrank, tolerance); - // swap rows - if (pivot != irow) { -#pragma omp parallel for private(tmp) - for (jcol = icol; jcol < ncols; ++jcol) { - tmp = mat[pivot][jcol]; - mat[pivot][jcol] = mat[irow][jcol]; - mat[irow][jcol] = tmp; - } - } + allocate(arr_tmp, nparam); - tmp = mat[irow][icol]; + Constraint_vec.clear(); - for (jrow = 0; jrow < nrows; ++jrow) { - if (jrow == irow) continue; + for (i = 0; i < nrank; ++i) { + for (j = 0; j < nparam; ++j) arr_tmp[j] = 0.0; + long iloc = -1; + for (j = 0; j < nparam; ++j) { + if (std::abs(mat_tmp[i][j]) < tolerance) { + arr_tmp[j] = 0.0; + } else { + arr_tmp[j] = mat_tmp[i][j]; + } + if (std::abs(arr_tmp[j]) >= tolerance) { + iloc = j; + } + } - tmp2 = mat[jrow][icol]; -#pragma omp parallel for - for (jcol = icol; jcol < ncols; ++jcol) { - mat[jrow][jcol] = mat[jrow][jcol] * tmp - tmp2 * mat[irow][jcol]; + if (iloc != -1) { + Constraint_vec.emplace_back(nparam, arr_tmp); } } - } - mat.erase(mat.begin() + nrank, mat.end()); - mat.shrink_to_fit(); -} -*/ + deallocate(mat_tmp); + deallocate(arr_tmp); + } +} -#ifdef _USE_EIGEN -void Constraint::get_column_space(std::vector> &mat) +void Constraint::print_constraint(const ConstraintSparseForm &const_in) const { -// Return the column space of matrix mat. - - using namespace Eigen; - - int irow, icol, jrow, jcol; - int pivot; - int tmp, tmp2; - - int nrank = 0; - - icol = 0; - - int nrows = mat.size(); - int ncols = mat[0].size(); - - MatrixXf A(ncols, nrows); - - for (irow = 0; irow < nrows; ++irow) { - for (icol = 0; icol < ncols; ++icol) { - A(icol, irow) = static_cast(mat[irow][icol]); - } - } - FullPivLU lu_decomp(A); - nrank = lu_decomp.rank(); - MatrixXf B = lu_decomp.image(A).transpose(); - - for (irow = 0; irow < nrank; ++irow) { - for (icol = 0; icol < ncols; ++icol) { - mat[irow][icol] = static_cast(B(irow, icol) + 0.5); + const auto nconst = const_in.size(); + auto counter = 0; + std::cout << std::endl; + std::cout << "TOTAL CONST SIZE :" << std::setw(6) << nconst << std::endl; + for (const auto &it : const_in) { + std::cout << "CONST : " << std::setw(5) << counter + 1 << std::endl; + for (const auto &it2 : it) { + std::cout << std::setw(5) << it2.first + 1; + std::cout << std::setw(15) << it2.second << std::endl; } + std::cout << std::endl; + ++counter; } - - mat.erase(mat.begin() + nrank, mat.end()); - mat.shrink_to_fit(); } -#endif diff --git a/alm/constraint.h b/alm/constraint.h index ba5c3b27..521aff80 100644 --- a/alm/constraint.h +++ b/alm/constraint.h @@ -4,22 +4,23 @@ Copyright (c) 2014, 2015, 2016 Terumasa Tadano This file is distributed under the terms of the MIT license. - Please see the file 'LICENCE.txt' in the root directory + Please see the file 'LICENCE.txt' in the root directory or http://opensource.org/licenses/mit-license.php for information. */ #pragma once -#include +#include +#include #include -#include #include -#include "pointers.h" +#include +#include #include "constants.h" -#include "interaction.h" -#include "symmetry.h" #include "fcs.h" -#include +#include "cluster.h" +#include "system.h" +#include "timer.h" namespace ALM_NS { @@ -28,19 +29,17 @@ namespace ALM_NS public: std::vector w_const; - ConstraintClass(); + ConstraintClass() = default; - ConstraintClass(const ConstraintClass &a) - { - for (std::vector::const_iterator p = a.w_const.begin(); - p != a.w_const.end(); ++p) { - w_const.push_back(*p); - } - } + ConstraintClass(const ConstraintClass &a) = default; - ConstraintClass(const int n, const double *arr, const int nshift = 0) + ConstraintClass(std::vector vec) : w_const(std::move(vec)) { } + + ConstraintClass(const int n, + const double *arr, + const int nshift = 0) { - for (int i = nshift; i < n; ++i) { + for (auto i = nshift; i < n; ++i) { w_const.push_back(arr[i]); } } @@ -55,125 +54,299 @@ namespace ALM_NS class ConstraintTypeFix { public: - unsigned int p_index_target; + size_t p_index_target; double val_to_fix; - ConstraintTypeFix(const unsigned int index_in, const double val_in) - { - p_index_target = index_in; - val_to_fix = val_in; - } + ConstraintTypeFix(const size_t index_in, + const double val_in) : + p_index_target(index_in), val_to_fix(val_in) { } }; class ConstraintTypeRelate { public: - unsigned int p_index_target; + size_t p_index_target; std::vector alpha; - std::vector p_index_orig; + std::vector p_index_orig; - ConstraintTypeRelate(const unsigned int index_in, - const std::vector alpha_in, - const std::vector p_index_in) - { - p_index_target = index_in; - std::copy(alpha_in.begin(), alpha_in.end(), std::back_inserter(alpha)); - std::copy(p_index_in.begin(), p_index_in.end(), std::back_inserter(p_index_orig)); - } + ConstraintTypeRelate(const size_t index_in, + std::vector alpha_in, + std::vector p_index_in) : + p_index_target(index_in), alpha(std::move(alpha_in)), p_index_orig(std::move(p_index_in)) { } }; - inline bool equal_within_eps12(const std::vector &a, const std::vector &b) + inline bool equal_within_eps12(const std::vector &a, + const std::vector &b) { - int n = a.size(); - int m = b.size(); + const auto n = a.size(); + const auto m = b.size(); if (n != m) return false; - double res = 0.0; - for (int i = 0; i < n; ++i) { + for (size_t i = 0; i < n; ++i) { if (std::abs(a[i] - b[i]) > eps12) return false; } - // if (std::sqrt(res)>eps12) return false; return true; } - class Constraint: protected Pointers + class ConstraintIntegerElement + { + // For sparse representation + public: + size_t col; + int val; + + ConstraintIntegerElement(const size_t col_in, + const int val_in) : + col(col_in), val(val_in) {} + }; + + // Operator for sort + inline bool operator<(const std::vector &obj1, + const std::vector &obj2) + { + const auto len1 = obj1.size(); + const auto len2 = obj2.size(); + const auto min = (std::min)(len1, len2); + + for (size_t i = 0; i < min; ++i) { + if (obj1[i].col < obj2[i].col) { + return true; + } + if (obj1[i].col > obj2[i].col) { + return false; + } + if (obj1[i].val < obj2[i].val) { + return true; + } + if (obj1[i].val > obj2[i].val) { + return false; + } + } + return false; + } + + // Operator for unique + inline bool operator==(const std::vector &obj1, + const std::vector &obj2) + { + const auto len1 = obj1.size(); + const auto len2 = obj2.size(); + if (len1 != len2) return false; + + for (size_t i = 0; i < len1; ++i) { + if (obj1[i].col != obj2[i].col || obj1[i].val != obj2[i].val) { + return false; + } + } + return true; + } + + class ConstraintDoubleElement { + // For sparse representation public: - Constraint(class ALM *); + size_t col; + double val; + + ConstraintDoubleElement(const size_t col_in, + const double val_in) : + col(col_in), val(val_in) {} + }; + + // Operator for sort + inline bool operator<(const std::vector &obj1, + const std::vector &obj2) + { + const auto len1 = obj1.size(); + const auto len2 = obj2.size(); + const auto min = (std::min)(len1, len2); + + for (size_t i = 0; i < min; ++i) { + if (obj1[i].col < obj2[i].col) { + return true; + } + if (obj1[i].col > obj2[i].col) { + return false; + } + if (obj1[i].val < obj2[i].val) { + return true; + } + if (obj1[i].val > obj2[i].val) { + return false; + } + } + return false; + } + + // Operator for unique + inline bool operator==(const std::vector &obj1, + const std::vector &obj2) + { + const auto len1 = obj1.size(); + const auto len2 = obj2.size(); + if (len1 != len2) return false; + + for (size_t i = 0; i < len1; ++i) { + if (obj1[i].col != obj2[i].col || (std::abs(obj1[i].val - obj2[i].val) > 1.0e-10)) { + return false; + } + } + return true; + } + + inline bool operator<(const std::map &obj1, + const std::map &obj2) + { + return obj1.begin()->first < obj2.begin()->first; + } + + class Constraint + { + public: + Constraint(); ~Constraint(); - void setup(); + void setup(const System *system, + const Fcs *fcs, + const Cluster *cluster, + const Symmetry *symmetry, + const std::string alm_mode, + const int verbosity, + Timer *timer); + + void get_mapping_constraint(const int nmax, + const std::vector *nequiv, + const ConstraintSparseForm *const_in, + std::vector *const_fix_out, + std::vector *const_relate_out, + boost::bimap *index_bimap_out) const; + + int get_constraint_mode() const; + void set_constraint_mode(const int); + size_t get_number_of_constraints() const; + std::string get_fc_file(const int) const; + void set_fc_file(const int, + const std::string); + bool get_fix_harmonic() const; + void set_fix_harmonic(const bool); + bool get_fix_cubic() const; + void set_fix_cubic(const bool); + int get_constraint_algebraic() const; + + double** get_const_mat() const; + double* get_const_rhs() const; + + double get_tolerance_constraint() const; + void set_tolerance_constraint(const double); + + bool get_exist_constraint() const; + bool get_extra_constraint_from_symmetry() const; + + std::string get_rotation_axis() const; + void set_rotation_axis(const std::string); + + const ConstraintSparseForm& get_const_symmetry(const int) const; + const std::vector& get_const_fix(const int) const; + void set_const_fix_val_to_fix(const int order, + const size_t idx, + const double val); + const std::vector& get_const_relate(const int) const; + const boost::bimap& get_index_bimap(const int) const; + + private: int constraint_mode; - int P; + size_t number_of_constraints; std::string fc2_file, fc3_file; bool fix_harmonic, fix_cubic; int constraint_algebraic; double **const_mat; double *const_rhs; + double tolerance_constraint; bool exist_constraint; bool extra_constraint_from_symmetry; - std::string rotation_axis; - std::vector *const_symmetry; + std::string rotation_axis; + ConstraintSparseForm *const_symmetry; std::vector *const_fix; std::vector *const_relate; - boost::bimap *index_bimap; - - //void constraint_from_symmetry(std::vector *); - void get_symmetry_constraint(const int, const std::set, - const std::vector, - const std::string, - const std::vector, - const std::vector, - std::vector &); - - void get_mapping_constraint(const int, std::vector *, - std::vector *, - std::vector *, - std::vector *, - boost::bimap *, const bool); - - private: + std::vector *const_relate_rotation; + boost::bimap *index_bimap; bool impose_inv_T, impose_inv_R, exclude_last_R; - std::vector *const_translation; - std::vector *const_rotation_self; - std::vector *const_rotation_cross; + ConstraintSparseForm *const_translation; + ConstraintSparseForm *const_rotation_self; + ConstraintSparseForm *const_rotation_cross; + ConstraintSparseForm *const_self; + + void set_default_variables(); + void deallocate_variables(); - std::vector *const_self; + int levi_civita(const int, + const int, + const int) const; - int levi_civita(const int, const int, const int); + void generate_rotational_constraint(const System *, + const Symmetry *, + const Cluster *, + const Fcs *, + const int, + const double); - void translational_invariance(); - void rotational_invariance(); - void calc_constraint_matrix(const int, int &); + // const_mat and const_rhs are updated. + size_t calc_constraint_matrix(const int maxorder, + const std::vector *nequiv, + const size_t nparams) const; + + void print_constraint(const ConstraintSparseForm &) const; void setup_rotation_axis(bool [3][3]); - bool is_allzero(const int, const double *, const int nshift = 0); - bool is_allzero(const std::vector, int &); - bool is_allzero(const std::vector, const double, int &); - - void remove_redundant_rows(const int, std::vector &, - const double tolerance = eps12); - // void remove_redundant_rows_integer(const int, std::vector> &); - - void rref(int, int, double **, int &, double tolerance = eps12); - void rref(std::vector> &, const double tolerance = eps12); - void rref_nofraction(std::vector> &); -#ifdef _USE_EIGEN - void get_column_space(std::vector> &); -#endif - - void generate_symmetry_constraint_in_cartesian(std::vector *); + bool is_allzero(const int, + const double *, + const int nshift = 0) const; + bool is_allzero(const std::vector &, + int &) const; + bool is_allzero(const std::vector &, + const double, + int &, + const int nshift = 0) const; + + + void remove_redundant_rows(const size_t n, + std::vector &Constraint_vec, + const double tolerance = eps12) const; + + // const_symmetry is updated. + void generate_symmetry_constraint_in_cartesian(const size_t nat, + const Symmetry *symmetry, + const Cluster *cluster, + const Fcs *fcs, + const int verbosity) const; + + void get_constraint_translation(const Cell &supercell, + const Symmetry *symmetry, + const Cluster *cluster, + const Fcs *fcs, + const int order, + const std::vector &fc_table, + const size_t nparams, + ConstraintSparseForm &const_out, + const bool do_rref = false) const; + + // const_translation is updated. + void generate_translational_constraint(const Cell &, + const Symmetry *, + const Cluster *, + const Fcs *, + const int) const; + + void fix_forceconstants_to_file(const int, + const Symmetry *, + const Fcs *, + const std::string, + std::vector &) const; }; - - extern "C" - { - void dgetrf_(int *m, int *n, double *a, int *lda, int *ipiv, int *info); - void sgetrf_(int *m, int *n, float *a, int *lda, int *ipiv, int *info); - } } diff --git a/alm/error.cpp b/alm/error.cpp deleted file mode 100644 index 40988a94..00000000 --- a/alm/error.cpp +++ /dev/null @@ -1,47 +0,0 @@ -/* - error.cpp - - Copyright (c) 2014 Terumasa Tadano - - This file is distributed under the terms of the MIT license. - Please see the file 'LICENCE.txt' in the root directory - or http://opensource.org/licenses/mit-license.php for information. -*/ - -#include -#include -#include -#include "error.h" - -using namespace ALM_NS; - -Error::Error(ALM *alm): Pointers(alm) -{ -} - -Error::~Error() -{ -} - -void Error::warn(const char *file, const char *message) -{ - std::cout << " WARNING in " << file << " MESSAGE: " << message << std::endl; -} - -void Error::exit(const char *file, const char *message) -{ - std::cout << " ERROR in " << file << " MESSAGE: " << message << std::endl; - std::exit(EXIT_FAILURE); -} - -void Error::exit(const char *file, const char *message, int info) -{ - std::cout << " ERROR in " << file << " MESSAGE: " << message << info << std::endl; - std::exit(EXIT_FAILURE); -} - -void Error::exit(const char *file, const char *message, const char *info) -{ - std::cout << " ERROR in " << file << " MESSAGE: " << message << info << std::endl; - std::exit(EXIT_FAILURE); -} diff --git a/alm/error.h b/alm/error.h index 7d90525a..77b6753c 100644 --- a/alm/error.h +++ b/alm/error.h @@ -1,29 +1,48 @@ /* error.h - Copyright (c) 2014 Terumasa Tadano + Copyright (c) 2014-2018 Terumasa Tadano This file is distributed under the terms of the MIT license. - Please see the file 'LICENCE.txt' in the root directory + Please see the file 'LICENCE.txt' in the root directory or http://opensource.org/licenses/mit-license.php for information. */ #pragma once -#include -#include "pointers.h" +#include +#include + namespace ALM_NS { - class Error : protected Pointers + inline void warn(const char *file, + const char *message) + { + std::cout << " WARNING in " << file << " MESSAGE: " << message << std::endl; + } + + inline void exit(const char *file, + const char *message) + { + std::cout << " ERROR in " << file << " MESSAGE: " << message << std::endl; + std::exit(EXIT_FAILURE); + } + + template + void exit(const char *file, + const char *message, + const T info) + { + std::cout << " ERROR in " << file << " MESSAGE: " << message << info << std::endl; + std::exit(EXIT_FAILURE); + } + + inline void exit(const char *file, + const char *message, + const char *info) { - public: - Error(class ALM *); - ~Error(); - - void exit(const char *, const char *); - void warn(const char *, const char *); - void exit(const char *, const char *, int); - void exit(const char *, const char *, const char *); - }; + std::cout << " ERROR in " << file << " MESSAGE: " << message << info << std::endl; + std::exit(EXIT_FAILURE); + } } diff --git a/alm/fcs.cpp b/alm/fcs.cpp index a2b4f54c..7b977aa8 100644 --- a/alm/fcs.cpp +++ b/alm/fcs.cpp @@ -8,98 +8,139 @@ or http://opensource.org/licenses/mit-license.php for information. */ +#include "fcs.h" +#include "constants.h" +#include "constraint.h" +#include "error.h" +#include "cluster.h" +#include "mathfunctions.h" +#include "memory.h" +#include "rref.h" +#include "symmetry.h" +#include "timer.h" #include #include +#include +#include #include #include #include "../external/combination.hpp" -#include -#include "files.h" -#include "interaction.h" -#include "error.h" -#include "memory.h" -#include "fcs.h" -#include "symmetry.h" -#include "system.h" -#include "timer.h" -#include "constants.h" +#include +#include + +#if defined(_WIN32) || defined(_WIN64) +#undef min +#undef max +#endif using namespace ALM_NS; -Fcs::Fcs(ALM *alm) : Pointers(alm) +Fcs::Fcs() { + set_default_variables(); }; Fcs::~Fcs() { - if (alm->mode == "fitting") { - memory->deallocate(fc_table); - memory->deallocate(nequiv); - memory->deallocate(fc_zeros); - } + deallocate_variables(); }; -void Fcs::init() +void Fcs::init(const Cluster *cluster, + const Symmetry *symmetry, + const size_t number_of_atoms, + const int verbosity, + Timer *timer) { int i; - int maxorder = interaction->maxorder; + const auto maxorder = cluster->get_maxorder(); - std::cout << " FORCE CONSTANT" << std::endl; - std::cout << " ==============" << std::endl << std::endl; + timer->start_clock("fcs"); - memory->allocate(fc_table, maxorder); - memory->allocate(nequiv, maxorder); - memory->allocate(fc_zeros, maxorder); + if (verbosity > 0) { + std::cout << " FORCE CONSTANT" << std::endl; + std::cout << " ==============" << std::endl << std::endl; + } - for (i = 0; i < maxorder; ++i) { - generate_force_constant_table(i, interaction->pairs[i], - symmetry->SymmData, "Cartesian", - fc_table[i], nequiv[i], fc_zeros[i], true); + if (fc_table) { + deallocate(fc_table); + } + allocate(fc_table, maxorder); + + if (nequiv) { + deallocate(nequiv); + } + allocate(nequiv, maxorder); + + if (fc_zeros) { + deallocate(fc_zeros); } + allocate(fc_zeros, maxorder); - std::cout << std::endl; + // Generate force constants using the information of interacting atom pairs for (i = 0; i < maxorder; ++i) { - std::cout << " Number of " << std::setw(9) - << interaction->str_order[i] - << " FCs : " << nequiv[i].size(); + generate_force_constant_table(i, + number_of_atoms, + cluster->get_cluster_list(i), + symmetry, + "Cartesian", + fc_table[i], + nequiv[i], + fc_zeros[i], + store_zeros); + } + + if (verbosity > 0) { std::cout << std::endl; + for (i = 0; i < maxorder; ++i) { + std::cout << " Number of " << std::setw(9) + << cluster->get_ordername(i) + << " FCs : " << nequiv[i].size(); + std::cout << std::endl; + } + std::cout << std::endl; + + + timer->print_elapsed(); + std::cout << " -------------------------------------------------------------------" << std::endl; + std::cout << std::endl; + } + + timer->stop_clock("fcs"); +} + +void Fcs::set_default_variables() +{ + nequiv = nullptr; + fc_table = nullptr; + fc_zeros = nullptr; + store_zeros = true; +} + +void Fcs::deallocate_variables() +{ + if (nequiv) { + deallocate(nequiv); + } + if (fc_table) { + deallocate(fc_table); + } + if (fc_zeros) { + deallocate(fc_zeros); } - std::cout << std::endl; - - - // - // std::vector fc_test, fc_zeros_tmp; - // std::vector nmulti; - // generate_force_constant_table(1, interaction->pairs[1], - // symmetry->SymmData, "Lattice", - // fc_test, nmulti, fc_zeros_tmp, true); - // std::cout << "Nonzero independent IFCs:" << std::setw(5) << nmulti.size() << std::endl; - // std::cout << "Zero IFCs:" << std::endl; - // for (auto it = fc_zeros_tmp.begin(); it != fc_zeros_tmp.end(); ++it) { - // for (i = 0; i < (*it).elems.size(); ++i) { - // std::cout << std::setw(4) << (*it).elems[i]; - // } - // std::cout << std::setw(5) << (*it).mother; - // std::cout << std::endl; - // } - // std::cout << std::endl; - - - timer->print_elapsed(); - std::cout << " -------------------------------------------------------------------" << std::endl; - std::cout << std::endl; } + void Fcs::generate_force_constant_table(const int order, - const std::set pairs, - const std::vector symmop, - std::string basis, + const size_t nat, + const std::set &pairs, + const Symmetry *symm_in, + const std::string basis, std::vector &fc_vec, - std::vector &ndup, - std::vector &fc_zeros, - const bool store_zeros) + std::vector &ndup, + std::vector &fc_zeros_out, + const bool store_zeros_in) const { - int i, j; + size_t i, j; int i1, i2; int i_prim; int *atmn, *atmn_mapped; @@ -112,95 +153,59 @@ void Fcs::generate_force_constant_table(const int order, int **xyzcomponent; - int nmother; - int nat = system->nat; - int nsym = symmop.size(); - int nsym_in_use; - + const auto nsym = symm_in->get_SymmData().size(); bool is_zero; bool *is_searched; - int counter; int **map_sym; double ***rotation; + const bool use_compatible = true; if (order < 0) return; - memory->allocate(rotation, nsym, 3, 3); - memory->allocate(map_sym, nat, nsym); - nsym_in_use = 0; - counter = 0; - if (basis == "Cartesian") { - - for (auto it = symmop.begin(); it != symmop.end(); ++it) { - if ((*it).compatible_with_cartesian) { - for (i = 0; i < 3; ++i) { - for (j = 0; j < 3; ++j) { - rotation[nsym_in_use][i][j] = (*it).rotation_cart[i][j]; - } - } - for (i = 0; i < nat; ++i) { - map_sym[i][nsym_in_use] = symmetry->map_sym[i][counter]; - } - ++nsym_in_use; - } - ++counter; - } - - } else if (basis == "Lattice") { - - for (auto it = symmop.begin(); it != symmop.end(); ++it) { - if ((*it).compatible_with_lattice) { - for (i = 0; i < 3; ++i) { - for (j = 0; j < 3; ++j) { - rotation[nsym_in_use][i][j] - = static_cast((*it).rotation[i][j]); - } - } - for (i = 0; i < nat; ++i) { - map_sym[i][nsym_in_use] = symmetry->map_sym[i][counter]; - } - ++nsym_in_use; - } - ++counter; - } - - - } else { - memory->deallocate(rotation); - memory->deallocate(map_sym); - error->exit("generate_force_constant_table", "Invalid basis inpout"); - } - - memory->allocate(atmn, order + 2); - memory->allocate(atmn_mapped, order + 2); - memory->allocate(ind, order + 2); - memory->allocate(ind_mapped, order + 2); - memory->allocate(ind_tmp, order); - memory->allocate(ind_mapped_tmp, order + 2); - memory->allocate(is_searched, 3 * nat); + allocate(rotation, nsym, 3, 3); + allocate(map_sym, nat, nsym); + int nsym_in_use = 0; + + get_available_symmop(nat, + symm_in, + basis, + nsym_in_use, + map_sym, + rotation, + use_compatible); + + allocate(atmn, order + 2); + allocate(atmn_mapped, order + 2); + allocate(ind, order + 2); + allocate(ind_mapped, order + 2); + allocate(ind_tmp, order); + allocate(ind_mapped_tmp, order + 2); + allocate(is_searched, 3 * nat); fc_vec.clear(); ndup.clear(); - fc_zeros.clear(); - nmother = 0; + fc_zeros_out.clear(); + size_t nmother = 0; nxyz = static_cast(std::pow(3.0, order + 2)); - memory->allocate(xyzcomponent, nxyz, order + 2); + allocate(xyzcomponent, nxyz, order + 2); get_xyzcomponent(order + 2, xyzcomponent); - std::set list_found; + std::unordered_set list_found; - for (auto iter = pairs.begin(); iter != pairs.end(); ++iter) { + for (const auto &pair : pairs) { - for (i = 0; i < order + 2; ++i) atmn[i] = (*iter).iarray[i]; + for (i = 0; i < order + 2; ++i) atmn[i] = pair.iarray[i]; for (i1 = 0; i1 < nxyz; ++i1) { for (i = 0; i < order + 2; ++i) ind[i] = 3 * atmn[i] + xyzcomponent[i1][i]; if (!is_ascending(order + 2, ind)) continue; - i_prim = min_inprim(order + 2, ind); + i_prim = get_minimum_index_in_primitive(order + 2, ind, nat, + symm_in->get_nat_prim(), + symm_in->get_map_p2s()); std::swap(ind[0], ind[i_prim]); sort_tail(order + 2, ind); @@ -210,22 +215,34 @@ void Fcs::generate_force_constant_table(const int order, // Search symmetrically-dependent parameter set - int ndeps = 0; + size_t ndeps = 0; for (isym = 0; isym < nsym_in_use; ++isym) { - for (i = 0; i < order + 2; ++i) - atmn_mapped[i] = map_sym[atmn[i]][isym]; + for (i = 0; i < order + 2; ++i) atmn_mapped[i] = map_sym[atmn[i]][isym]; - if (!is_inprim(order + 2, atmn_mapped)) continue; + if (!is_inprim(order + 2, + atmn_mapped, + symm_in->get_nat_prim(), + symm_in->get_map_p2s())) + continue; for (i2 = 0; i2 < nxyz; ++i2) { - c_tmp = coef_sym(order + 2, rotation[isym], xyzcomponent[i1], xyzcomponent[i2]); + + c_tmp = coef_sym(order + 2, + rotation[isym], + xyzcomponent[i1], + xyzcomponent[i2]); + if (std::abs(c_tmp) > eps12) { for (i = 0; i < order + 2; ++i) ind_mapped[i] = 3 * atmn_mapped[i] + xyzcomponent[i2][i]; - i_prim = min_inprim(order + 2, ind_mapped); + i_prim = get_minimum_index_in_primitive(order + 2, + ind_mapped, + nat, + symm_in->get_nat_prim(), + symm_in->get_map_p2s()); std::swap(ind_mapped[0], ind_mapped[i_prim]); sort_tail(order + 2, ind_mapped); @@ -243,8 +260,10 @@ void Fcs::generate_force_constant_table(const int order, if (list_found.find(IntList(order + 2, ind_mapped)) == list_found.end()) { list_found.insert(IntList(order + 2, ind_mapped)); - fc_vec.push_back(FcProperty(order + 2, c_tmp, - ind_mapped, nmother)); + fc_vec.emplace_back(FcProperty(order + 2, + c_tmp, + ind_mapped, + nmother)); ++ndeps; // Add equivalent interaction list (permutation) if there are two or more indices @@ -254,13 +273,17 @@ void Fcs::generate_force_constant_table(const int order, for (i = 0; i < 3 * nat; ++i) is_searched[i] = false; is_searched[ind_mapped[0]] = true; for (i = 1; i < order + 2; ++i) { - if ((!is_searched[ind_mapped[i]]) && is_inprim(ind_mapped[i])) { + if ((!is_searched[ind_mapped[i]]) && is_inprim(ind_mapped[i], + symm_in->get_nat_prim(), + symm_in->get_map_p2s())) { for (j = 0; j < order + 2; ++j) ind_mapped_tmp[j] = ind_mapped[j]; std::swap(ind_mapped_tmp[0], ind_mapped_tmp[i]); sort_tail(order + 2, ind_mapped_tmp); - fc_vec.push_back(FcProperty(order + 2, c_tmp, - ind_mapped_tmp, nmother)); + fc_vec.emplace_back(FcProperty(order + 2, + c_tmp, + ind_mapped_tmp, + nmother)); ++ndeps; @@ -275,10 +298,10 @@ void Fcs::generate_force_constant_table(const int order, } // close symmetry loop if (is_zero) { - if (store_zeros) { + if (store_zeros_in) { for (auto it = fc_vec.rbegin(); it != fc_vec.rbegin() + ndeps; ++it) { - (*it).mother = -1; - fc_zeros.push_back(*it); + (*it).mother = std::numeric_limits::max(); + fc_zeros_out.push_back(*it); } } for (i = 0; i < ndeps; ++i) fc_vec.pop_back(); @@ -288,96 +311,350 @@ void Fcs::generate_force_constant_table(const int order, } } // close xyz component loop - } // close atom number loop (iterator) + } // close atom number loop (iterator) - memory->deallocate(xyzcomponent); + deallocate(xyzcomponent); list_found.clear(); - memory->deallocate(atmn); - memory->deallocate(atmn_mapped); - memory->deallocate(ind); - memory->deallocate(ind_mapped); - memory->deallocate(ind_tmp); - memory->deallocate(ind_mapped_tmp); - memory->deallocate(is_searched); - memory->deallocate(rotation); - memory->deallocate(map_sym); + deallocate(atmn); + deallocate(atmn_mapped); + deallocate(ind); + deallocate(ind_mapped); + deallocate(ind_tmp); + deallocate(ind_mapped_tmp); + deallocate(is_searched); + deallocate(rotation); + deallocate(map_sym); // sort fc_vec - if (ndup.size() > 0) { + if (!ndup.empty()) { std::sort(fc_vec.begin(), fc_vec.begin() + ndup[0]); - int nbegin = ndup[0]; - int nend; - for (int mm = 1; mm < ndup.size(); ++mm) { - nend = nbegin + ndup[mm]; + auto nbegin = ndup[0]; + for (size_t mm = 1; mm < ndup.size(); ++mm) { + const auto nend = nbegin + ndup[mm]; std::sort(fc_vec.begin() + nbegin, fc_vec.begin() + nend); nbegin += ndup[mm]; } } } - -double Fcs::coef_sym(const int n, - const int symnum, - const int *arr1, - const int *arr2) +void Fcs::get_constraint_symmetry(const size_t nat, + const Symmetry *symmetry, + const int order, + const std::string basis, + const std::vector &fc_table_in, + const size_t nparams, + const double tolerance, + ConstraintSparseForm &const_out, + const bool do_rref) const { - double tmp = 1.0; + // Create constraint matrices arising from the crystal symmetry. + // Necessary for hexagonal systems. + int i; + // int j; + unsigned int isym; + int ixyz; + int *index_tmp; + int **xyzcomponent; + int nsym_in_use; + std::unordered_set list_found; - for (i = 0; i < n; ++i) { - tmp *= symmetry->SymmData[symnum].rotation_cart[arr2[i]][arr1[i]]; + typedef std::vector ConstEntry; + std::vector constraint_all; + ConstEntry const_tmp; + + int **map_sym; + double ***rotation; + + if (order < 0) return; + + const auto nsym = symmetry->get_SymmData().size(); + const auto natmin = symmetry->get_nat_prim(); + const auto nfcs = fc_table_in.size(); + const auto use_compatible = false; + + if (nparams == 0) return; + + allocate(rotation, nsym, 3, 3); + allocate(map_sym, nat, nsym); + allocate(index_tmp, order + 2); + + const auto nxyz = static_cast(std::pow(static_cast(3), order + 2)); + allocate(xyzcomponent, nxyz, order + 2); + get_xyzcomponent(order + 2, xyzcomponent); + + const_out.clear(); + + get_available_symmop(nat, + symmetry, + basis, + nsym_in_use, + map_sym, + rotation, + use_compatible); + + // Generate temporary list of parameters + list_found.clear(); + for (const auto &p : fc_table_in) { + for (i = 0; i < order + 2; ++i) index_tmp[i] = p.elems[i]; + list_found.insert(FcProperty(order + 2, p.sign, + index_tmp, p.mother)); + } + + +#ifdef _OPENMP +#pragma omp parallel +#endif + { + int j; + int i_prim; + int loc_nonzero; + int *ind; + int *atm_index, *atm_index_symm; + int *xyz_index; + double c_tmp; + // double maxabs; + + std::unordered_set::iterator iter_found; + std::vector const_now_omp; + std::vector> const_omp; + + ConstEntry const_tmp_omp; + std::vector constraint_list_omp; + + allocate(ind, order + 2); + allocate(atm_index, order + 2); + allocate(atm_index_symm, order + 2); + allocate(xyz_index, order + 2); + + const_omp.clear(); + const_now_omp.resize(nparams); + +#ifdef _OPENMP +#pragma omp for private(i, isym, ixyz), schedule(static) +#endif + for (long ii = 0; ii < nfcs; ++ii) { + FcProperty list_tmp = fc_table_in[ii]; + + for (i = 0; i < order + 2; ++i) { + atm_index[i] = list_tmp.elems[i] / 3; + xyz_index[i] = list_tmp.elems[i] % 3; + } + + for (isym = 0; isym < nsym_in_use; ++isym) { + + for (i = 0; i < order + 2; ++i) + atm_index_symm[i] = map_sym[atm_index[i]][isym]; + if (!is_inprim(order + 2, atm_index_symm, natmin, symmetry->get_map_p2s())) continue; + + for (i = 0; i < nparams; ++i) const_now_omp[i] = 0.0; + + const_now_omp[list_tmp.mother] = -list_tmp.sign; + + for (ixyz = 0; ixyz < nxyz; ++ixyz) { + for (i = 0; i < order + 2; ++i) + ind[i] = 3 * atm_index_symm[i] + xyzcomponent[ixyz][i]; + + i_prim = get_minimum_index_in_primitive(order + 2, ind, nat, natmin, symmetry->get_map_p2s()); + std::swap(ind[0], ind[i_prim]); + sort_tail(order + 2, ind); + + iter_found = list_found.find(FcProperty(order + 2, 1.0, ind, 1)); + if (iter_found != list_found.end()) { + c_tmp = coef_sym(order + 2, rotation[isym], xyz_index, xyzcomponent[ixyz]); + const_now_omp[(*iter_found).mother] += (*iter_found).sign * c_tmp; + } + } + + if (!is_allzero(const_now_omp, eps8, loc_nonzero)) { + if (const_now_omp[loc_nonzero] < 0.0) { + for (j = 0; j < nparams; ++j) const_now_omp[j] *= -1.0; + } + // maxabs = 0.0; + // for (j = 0; j < nparams; ++j) { + // maxabs = std::max(maxabs, std::abs(const_now_omp[j])); + // } + // std::cout << "maxabs = " << maxabs << std::endl; + + const_tmp_omp.clear(); + for (j = 0; j < nparams; ++j) { + if (std::abs(const_now_omp[j]) >= eps8) { + const_tmp_omp.emplace_back(j, const_now_omp[j]); + } + } + constraint_list_omp.emplace_back(const_tmp_omp); + } + + } // close isym loop + } // close ii loop + + deallocate(ind); + deallocate(atm_index); + deallocate(atm_index_symm); + deallocate(xyz_index); + +#pragma omp critical + { + for (const auto &it : constraint_list_omp) { + constraint_all.emplace_back(it); + } + } + constraint_list_omp.clear(); + } // close openmp region + + deallocate(xyzcomponent); + deallocate(index_tmp); + deallocate(rotation); + deallocate(map_sym); + + std::sort(constraint_all.begin(), constraint_all.end()); + constraint_all.erase(std::unique(constraint_all.begin(), + constraint_all.end()), + constraint_all.end()); + + typedef std::map ConstDoubleEntry; + ConstDoubleEntry const_tmp2; + auto division_factor = 1.0; + int counter; + const_out.clear(); + + for (const auto &it : constraint_all) { + const_tmp2.clear(); + counter = 0; + for (const auto &it2 : it) { + if (counter == 0) { + division_factor = 1.0 / it2.val; + } + const_tmp2[it2.col] = it2.val * division_factor; + ++counter; + } + const_out.emplace_back(const_tmp2); + } + constraint_all.clear(); + + if (do_rref) rref_sparse(nparams, const_out, tolerance); +} + +std::vector* Fcs::get_nequiv() const +{ + return nequiv; +} + +std::vector* Fcs::get_fc_table() const +{ + return fc_table; +} + +void Fcs::get_available_symmop(const size_t nat, + const Symmetry *symmetry, + const std::string basis, + int &nsym_avail, + int **mapping_symm, + double ***rotation, + const bool use_compatible) const +{ + // Return mapping information of atoms and the rotation matrices of symmetry operations + // that are (compatible, incompatible) with the given lattice basis (Cartesian or Lattice). + + // use_compatible == true returns the compatible space group (for creating fc_table) + // use_compatible == false returnes the incompatible supace group (for creating constraint) + + int i, j; + int counter = 0; + + nsym_avail = 0; + + if (basis == "Cartesian") { + + for (auto it = symmetry->get_SymmData().begin(); it != symmetry->get_SymmData().end(); ++it) { + + if ((*it).compatible_with_cartesian == use_compatible) { + + for (i = 0; i < 3; ++i) { + for (j = 0; j < 3; ++j) { + rotation[nsym_avail][i][j] = (*it).rotation_cart[i][j]; + } + } + for (i = 0; i < nat; ++i) { + mapping_symm[i][nsym_avail] = symmetry->get_map_sym()[i][counter]; + } + ++nsym_avail; + } + ++counter; + } + + } else if (basis == "Lattice") { + + for (auto it = symmetry->get_SymmData().begin(); it != symmetry->get_SymmData().end(); ++it) { + if ((*it).compatible_with_lattice == use_compatible) { + for (i = 0; i < 3; ++i) { + for (j = 0; j < 3; ++j) { + rotation[nsym_avail][i][j] + = static_cast((*it).rotation[i][j]); + } + } + for (i = 0; i < nat; ++i) { + mapping_symm[i][nsym_avail] = symmetry->get_map_sym()[i][counter]; + } + ++nsym_avail; + } + ++counter; + } + + + } else { + deallocate(rotation); + deallocate(mapping_symm); + exit("get_available_symmop", "Invalid basis input"); } - return tmp; } double Fcs::coef_sym(const int n, - double **rot, + const double *const *rot, const int *arr1, - const int *arr2) + const int *arr2) const { - double tmp = 1.0; - int i; + auto tmp = 1.0; - for (i = 0; i < n; ++i) { + for (auto i = 0; i < n; ++i) { tmp *= rot[arr2[i]][arr1[i]]; } return tmp; } -bool Fcs::is_ascending(const int n, const int *arr) +bool Fcs::is_ascending(const int n, + const int *arr) const { - int i; - for (i = 0; i < n - 1; ++i) { + for (auto i = 0; i < n - 1; ++i) { if (arr[i] > arr[i + 1]) return false; } return true; } -int Fcs::min_inprim(const int n, const int *arr) +int Fcs::get_minimum_index_in_primitive(const int n, + const int *arr, + const size_t nat, + const size_t natmin, + const std::vector> &map_p2s) const { - int i, j, atmnum; - int natmin = symmetry->nat_prim; - int minloc; - int *ind; + int i, atmnum; - memory->allocate(ind, n); + std::vector ind(n, 3 * nat); for (i = 0; i < n; ++i) { - ind[i] = 3 * system->nat; atmnum = arr[i] / 3; - for (j = 0; j < natmin; ++j) { - if (symmetry->map_p2s[j][0] == atmnum) { + for (size_t j = 0; j < natmin; ++j) { + if (map_p2s[j][0] == atmnum) { ind[i] = arr[i]; - continue; } } } - int minval = ind[0]; - minloc = 0; + auto minval = ind[0]; + auto minloc = 0; for (i = 0; i < n; ++i) { if (ind[i] < minval) { @@ -386,53 +663,49 @@ int Fcs::min_inprim(const int n, const int *arr) } } - memory->deallocate(ind); return minloc; } -bool Fcs::is_inprim(const int n, const int *arr) +bool Fcs::is_inprim(const int n, + const int *arr, + const size_t natmin, + const std::vector> &map_p2s) const { - int i, j; - int natmin = symmetry->nat_prim; - - for (i = 0; i < n; ++i) { - for (j = 0; j < natmin; ++j) { - if (symmetry->map_p2s[j][0] == arr[i]) return true; + for (auto i = 0; i < n; ++i) { + for (size_t j = 0; j < natmin; ++j) { + if (map_p2s[j][0] == arr[i]) return true; } } return false; } -bool Fcs::is_inprim(const int n) +bool Fcs::is_inprim(const int n, + const size_t natmin, + const std::vector> &map_p2s) const { - int i, atmn; - int natmin = symmetry->nat_prim; - - atmn = n / 3; + const auto atmn = n / 3; - for (i = 0; i < natmin; ++i) { - if (symmetry->map_p2s[i][0] == atmn) return true; + for (size_t i = 0; i < natmin; ++i) { + if (map_p2s[i][0] == atmn) return true; } return false; } -void Fcs::get_xyzcomponent(int n, int **xyz) +void Fcs::get_xyzcomponent(const int n, + int **xyz) const { // Return xyz component for the given order using boost algorithm library - std::vector v; int i; - for (i = 0; i < n; ++i) { - v.push_back(0); - v.push_back(1); - v.push_back(2); - } + std::vector v(3 * n); - std::sort(v.begin(), v.end()); + for (i = 0; i < n; ++i) v[i] = 0; + for (i = n; i < 2 * n; ++i) v[i] = 1; + for (i = 2 * n; i < 3 * n; ++i) v[i] = 2; - int m = 0; + auto m = 0; do { xyz[m][0] = v[0]; @@ -441,39 +714,17 @@ void Fcs::get_xyzcomponent(int n, int **xyz) } while (boost::next_partial_permutation(v.begin(), v.begin() + n, v.end())); } -void Fcs::sort_tail(const int n, int *arr) +bool Fcs::is_allzero(const std::vector &vec, + const double tol, + int &loc) const { - int i, m; - - m = n - 1; - int *ind_tmp; - - memory->allocate(ind_tmp, m); - - for (i = 0; i < m; ++i) { - ind_tmp[i] = arr[i + 1]; - } - - interaction->insort(m, ind_tmp); - - for (i = 0; i < m; ++i) { - arr[i + 1] = ind_tmp[i]; + loc = -1; + const auto n = vec.size(); + for (auto i = 0; i < n; ++i) { + if (std::abs(vec[i]) > tol) { + loc = i; + return false; + } } - - memory->deallocate(ind_tmp); -} - -std::string Fcs::easyvizint(const int n) -{ - int atmn; - int crdn; - atmn = n / 3 + 1; - crdn = n % 3; - std::string str_crd[3] = {"x", "y", "z"}; - std::string str_tmp; - - str_tmp = boost::lexical_cast(atmn); - str_tmp += str_crd[crdn]; - - return str_tmp; + return true; } diff --git a/alm/fcs.h b/alm/fcs.h index 2eb69870..dacbd113 100644 --- a/alm/fcs.h +++ b/alm/fcs.h @@ -3,19 +3,23 @@ Copyright (c) 2014--2017 Terumasa Tadano + This file is distributed under the terms of the MIT license. - Please see the file 'LICENCE.txt' in the root directory + Please see the file 'LICENCE.txt' in the root directory or http://opensource.org/licenses/mit-license.php for information. */ #pragma once -#include "pointers.h" #include #include +#include #include +#include "cluster.h" #include "symmetry.h" -#include "interaction.h" +#include "timer.h" + +using ConstraintSparseForm = std::vector>; namespace ALM_NS { @@ -23,25 +27,21 @@ namespace ALM_NS { public: std::vector elems; // flattened index of (iatom, icoordinate) in the supercell - double sign; // factor (+1 or -1) to convert the mother FC to the child - int mother; + double sign; // factor (+1 or -1) to convert the mother FC to the child + size_t mother; // index of the reducible force constants FcProperty(); - FcProperty(const FcProperty &obj) - { - sign = obj.sign; - mother = obj.mother; - for (auto it = obj.elems.begin(); it != obj.elems.end(); ++it) { - elems.push_back(*it); - } - }; + FcProperty(const FcProperty &obj) = default; - FcProperty(const int n, const double c, const int *arr, const int m) + FcProperty(const int n, + const double c, + const int *arr, + const size_t m) { sign = c; mother = m; - for (int i = 0; i < n; ++i) { + for (auto i = 0; i < n; ++i) { elems.push_back(arr[i]); } } @@ -54,10 +54,10 @@ namespace ALM_NS bool operator==(const FcProperty &a) const { - int n = elems.size(); - int n_ = a.elems.size(); + auto n = elems.size(); + auto n_ = a.elems.size(); if (n != n_) return false; - for (int i = 0; i < n; ++i) { + for (size_t i = 0; i < n; ++i) { if (elems[i] != a.elems[i]) return false; } return true; @@ -73,45 +73,84 @@ namespace ALM_NS ForceConstantTable(); }; - class Fcs: protected Pointers + class Fcs { public: - Fcs(class ALM *); + Fcs(); ~Fcs(); - void init(); - - std::vector *nequiv; - std::vector *fc_table; - std::vector *fc_zeros; - - std::string easyvizint(const int); - void get_xyzcomponent(int, int **); - void sort_tail(const int, int *); - - bool is_inprim(const int, const int *); - bool is_inprim(const int); - int min_inprim(const int, const int *); - double coef_sym(const int, const int, const int *, const int *); - double coef_sym(const int, double **, const int *, const int *); + void init(const Cluster *cluster, + const Symmetry *symmetry, + const size_t number_of_atoms, + const int verbosity, + Timer *timer); + void get_xyzcomponent(int, + int **) const; void generate_force_constant_table(const int, - const std::set, - const std::vector, - std::string, + const size_t nat, + const std::set &, + const Symmetry *, + const std::string, std::vector &, - std::vector &, + std::vector &, std::vector &, - const bool); + const bool) const; - private: + void get_constraint_symmetry(const size_t nat, + const Symmetry *symmetry, + const int order, + const std::string basis, + const std::vector &fc_table_in, + const size_t nparams, + const double tolerance, + ConstraintSparseForm &const_out, + const bool do_rref = false) const; - bool is_ascending(const int, const int *); + std::vector* get_nequiv() const; + std::vector* get_fc_table() const; + + private: + std::vector *nequiv; // stores duplicate number of irreducible force constants + std::vector *fc_table; // all force constants + std::vector *fc_zeros; // zero force constants (due to space group symm.) + + bool store_zeros; + void set_default_variables(); + void deallocate_variables(); + bool is_ascending(int, + const int *) const; + bool is_inprim(const int n, + const int *arr, + const size_t natmin, + const std::vector> &map_p2s) const; + bool is_inprim(const int n, + const size_t natmin, + const std::vector> &map_p2s) const; + bool is_allzero(const std::vector &, + double, + int &) const; + void get_available_symmop(const size_t nat, + const Symmetry *symmetry, + const std::string basis, + int &nsym_avail, + int **mapping_symm, + double ***rotation, + const bool use_compatible) const; + int get_minimum_index_in_primitive(const int n, + const int *arr, + const size_t nat, + const size_t natmin, + const std::vector> &map_p2s) const; + double coef_sym(const int, + const double *const *, + const int *, + const int *) const; }; } // Define a hash function for FcProperty class -// Use boost::hash_combine +// Use boost::hash_combine namespace std { template <> diff --git a/alm/files.cpp b/alm/files.cpp index 1afd6627..6281838e 100644 --- a/alm/files.cpp +++ b/alm/files.cpp @@ -4,48 +4,53 @@ Copyright (c) 2014 Terumasa Tadano This file is distributed under the terms of the MIT license. - Please see the file 'LICENCE.txt' in the root directory + Please see the file 'LICENCE.txt' in the root directory or http://opensource.org/licenses/mit-license.php for information. */ -#include #include "files.h" -#include "error.h" -#include "memory.h" -#include "interaction.h" -#include using namespace ALM_NS; -Files::Files(ALM *alm): Pointers(alm) +Files::Files() { + print_hessian = false; } -Files::~Files() -{ - if (alm->mode == "suggest") { - memory->deallocate(file_disp_pattern); - } -} +Files::~Files() = default; void Files::init() { - int i; - file_fcs = job_title + ".fcs"; file_hes = job_title + ".hessian"; +} + +void Files::set_prefix(const std::string prefix_in) +{ + job_title = prefix_in; +} + +std::string Files::get_prefix() const +{ + return job_title; +} - if (alm->mode == "suggest") { +void Files::set_datfile_train(const DispForceFile &dat_in) +{ + datfile_train = dat_in; +} - memory->allocate(file_disp_pattern, interaction->maxorder); +void Files::set_datfile_validation(const DispForceFile &dat_in) +{ + datfile_validation = dat_in; +} - for (i = 0; i < interaction->maxorder; ++i) { - if (i == 0) { - file_disp_pattern[i] = job_title + ".pattern_HARMONIC"; - } else { - file_disp_pattern[i] = job_title + ".pattern_ANHARM" - + boost::lexical_cast(i + 2); - } - } - } +DispForceFile Files::get_datfile_train() const +{ + return datfile_train; +} + +DispForceFile Files::get_datfile_validation() const +{ + return datfile_validation; } diff --git a/alm/files.h b/alm/files.h index ed248a8c..912801f6 100644 --- a/alm/files.h +++ b/alm/files.h @@ -4,29 +4,61 @@ Copyright (c) 2014 Terumasa Tadano This file is distributed under the terms of the MIT license. - Please see the file 'LICENCE.txt' in the root directory + Please see the file 'LICENCE.txt' in the root directory or http://opensource.org/licenses/mit-license.php for information. */ #pragma once #include -#include -#include "pointers.h" namespace ALM_NS { - class Files : protected Pointers + class DispForceFile { public: - Files(class ALM *); + std::string filename; + std::string filename_second; + size_t ndata, nstart, nend; + size_t skip_s, skip_e; + + DispForceFile() + { + filename = ""; + filename_second = ""; + ndata = 0; + nstart = 0; + nend = 0; + skip_s = 0; + skip_e = 0; + } + + ~DispForceFile() = default; + DispForceFile(const DispForceFile &obj) = default; + DispForceFile& operator=(const DispForceFile &obj) = default; + }; + + class Files + { + public: + Files(); ~Files(); void init(); - std::string job_title; + bool print_hessian; std::string file_fcs, file_hes; - std::string file_disp, file_force; - std::string *file_disp_pattern; + + void set_prefix(const std::string); + std::string get_prefix() const; + void set_datfile_train(const DispForceFile &dat_in); + void set_datfile_validation(const DispForceFile &dat_in); + DispForceFile get_datfile_train() const; + DispForceFile get_datfile_validation() const; + + private: + + std::string job_title; + DispForceFile datfile_train, datfile_validation; }; } diff --git a/alm/fitting.cpp b/alm/fitting.cpp deleted file mode 100644 index 28fae7fa..00000000 --- a/alm/fitting.cpp +++ /dev/null @@ -1,1478 +0,0 @@ -/* - fitting.cpp - - Copyright (c) 2014, 2015, 2016 Terumasa Tadano - - This file is distributed under the terms of the MIT license. - Please see the file 'LICENCE.txt' in the root directory - or http://opensource.org/licenses/mit-license.php for information. -*/ - -#include -#include -#include -#include -#include -#include -#include -#include "fitting.h" -#include "files.h" -#include "error.h" -#include "memory.h" -#include "symmetry.h" -#include "system.h" -#include "fcs.h" -#include "interaction.h" -#include "timer.h" -#include "combination.h" -#include "constants.h" -#include "constraint.h" -#include "mathfunctions.h" - -#ifdef _USE_EIGEN -#include -#endif - -#include - -#ifdef _VSL -#include "mkl_vsl.h" - -#else -#include -#endif - -using namespace ALM_NS; - - -Fitting::Fitting(ALM *alm): Pointers(alm) -{ - seed = static_cast(time(NULL)); -#ifdef _VSL - brng = VSL_BRNG_MT19937; - vslNewStream(&stream, brng, seed); -#else - std::srand(seed); -#endif -} - -Fitting::~Fitting() -{ - if (alm->mode == "fitting") { - memory->deallocate(params); - } -} - -void Fitting::fitmain() -{ - int i; - int nat = system->nat; - int natmin = symmetry->nat_prim; - int ntran = symmetry->ntran; - - int ndata = system->ndata; - int nstart = system->nstart; - int nend = system->nend; - int nskip = system->nskip; - - int N, M, N_new; - int maxorder = interaction->maxorder; - int P = constraint->P; - - int nmulti; - int ndata_used = nend - nstart + 1; - - double **u, **f; - double **amat, *amat_1D, *fsum; - double *fsum_orig; - double *param_tmp; - - amat = NULL; - amat_1D = NULL; - fsum = NULL; - fsum_orig = NULL; - param_tmp = NULL; - - std::cout << " FITTING" << std::endl; - std::cout << " =======" << std::endl << std::endl; - - std::cout << " Reference files" << std::endl; - std::cout << " Displacement: " << files->file_disp << std::endl; - std::cout << " Force : " << files->file_force << std::endl; - std::cout << std::endl; - - std::cout << " NSTART = " << nstart << "; NEND = " << nend << std::endl; - std::cout << " " << ndata_used << " entries will be used for fitting." - << std::endl << std::endl; - - // Read displacement-force training data set from files - - data_multiplier(nat, ndata, nstart, nend, ndata_used, nmulti, - symmetry->multiply_data, u, f, - files->file_disp, files->file_force); - - N = 0; - for (i = 0; i < maxorder; ++i) { - N += fcs->nequiv[i].size(); - } - std::cout << " Total Number of Parameters : " - << N << std::endl << std::endl; - - // Calculate matrix elements for fitting - - M = 3 * natmin * ndata_used * nmulti; - - if (constraint->constraint_algebraic) { - - N_new = 0; - for (i = 0; i < maxorder; ++i) { - N_new += constraint->index_bimap[i].size(); - } - std::cout << " Total Number of Free Parameters : " - << N_new << std::endl << std::endl; - - // memory->allocate(amat, M, N_new); - unsigned long NM = static_cast(N_new) * static_cast(M); - memory->allocate(amat_1D, NM); - memory->allocate(fsum, M); - memory->allocate(fsum_orig, M); - calc_matrix_elements_algebraic_constraint(M, N, N_new, nat, natmin, ndata_used, - nmulti, maxorder, u, f, amat_1D, fsum, - fsum_orig); - - } else { - - memory->allocate(amat, M, N); - memory->allocate(fsum, M); - - calc_matrix_elements(M, N, nat, natmin, ndata_used, - nmulti, maxorder, u, f, amat, fsum); - } - - memory->deallocate(u); - memory->deallocate(f); - - // Execute fitting - - memory->allocate(param_tmp, N); - - if (nskip == 0) { - - // Fitting with singular value decomposition or QR-Decomposition - - if (constraint->constraint_algebraic) { - fit_algebraic_constraints(N_new, M, amat_1D, fsum, param_tmp, - fsum_orig, maxorder); - - } else if (constraint->exist_constraint) { - fit_with_constraints(N, M, P, amat, fsum, param_tmp, - constraint->const_mat, - constraint->const_rhs); - } else { - fit_without_constraints(N, M, amat, fsum, param_tmp); - } - - } else if (nskip > 0) { - - // Execute fittings consecutively with different input data. - - if (constraint->exist_constraint) { - fit_consecutively(N, P, natmin, ndata_used, nmulti, nskip, amat, fsum, - constraint->const_mat, - constraint->const_rhs); - } else { - error->exit("fitmain", "nskip has to be 0 when constraint_mode = 0"); - } - } else { - - // Execute bootstrap simulation for estimating deviations of parameters. - - if (constraint->exist_constraint) { - fit_bootstrap(N, P, natmin, ndata_used, nmulti, amat, fsum, - constraint->const_mat, - constraint->const_rhs); - - fit_with_constraints(N, M, P, amat, fsum, param_tmp, - constraint->const_mat, - constraint->const_rhs); - } else { - error->exit("fitmain", - "bootstrap analysis for LSE without constraint is not supported yet"); - } - } - - // Copy force constants to public variable "params" - - memory->allocate(params, N); - - if (constraint->constraint_algebraic) { - - for (i = 0; i < N; ++i) { - params[i] = param_tmp[i]; - } - memory->deallocate(fsum_orig); - - } else { - - for (i = 0; i < N; ++i) params[i] = param_tmp[i]; - - } - - if (amat) { - memory->deallocate(amat); - } - if (amat_1D) { - memory->deallocate(amat_1D); - } - if (fsum) { - memory->deallocate(fsum); - } - if (param_tmp) { - memory->deallocate(param_tmp); - } - - std::cout << std::endl; - timer->print_elapsed(); - std::cout << " -------------------------------------------------------------------" << std::endl; - std::cout << std::endl; -} - -void Fitting::data_multiplier(const int nat, - const int ndata, - const int nstart, - const int nend, - const int ndata_used, - int &nmulti, - const int multiply_data, - double **&u, - double **&f, - const std::string file_disp, - const std::string file_force) -{ - int i, j, k; - int idata, itran, isym; - int n_mapped; - double u_in, f_in; - double *u_tmp, *f_tmp; - std::vector vec_data; - unsigned int nline_f, nline_u; - unsigned int nreq; - - std::ifstream ifs_disp, ifs_force; - - ifs_disp.open(file_disp.c_str(), std::ios::in); - if (!ifs_disp) error->exit("openfiles", "cannot open disp file"); - ifs_force.open(file_force.c_str(), std::ios::in); - if (!ifs_force) error->exit("openfiles", "cannot open force file"); - - nreq = 3 * nat * ndata; - - memory->allocate(u_tmp, nreq); - memory->allocate(f_tmp, nreq); - - // Read displacements from DFILE - - nline_u = 0; - while (ifs_disp >> u_in) { - u_tmp[nline_u++] = u_in; - if (nline_u == nreq) break; - } - if (nline_u < nreq) - error->exit("data_multiplier", - "The number of lines in DFILE is too small for the given NDATA = ", - ndata); - - // Read forces from FFILE - - nline_f = 0; - while (ifs_force >> f_in) { - f_tmp[nline_f++] = f_in; - if (nline_f == nreq) break; - } - if (nline_f < nreq) - error->exit("data_multiplier", - "The number of lines in FFILE is too small for the given NDATA = ", - ndata); - - // Multiply data - - if (multiply_data == 0) { - - std::cout << " MULTDAT = 0: Given displacement-force data sets will be used as is." - << std::endl << std::endl; - - nmulti = 1; - - memory->allocate(u, ndata_used * nmulti, 3 * nat); - memory->allocate(f, ndata_used * nmulti, 3 * nat); - - idata = 0; - - for (i = 0; i < ndata; ++i) { - if (i < nstart - 1) continue; - if (i > nend - 1) break; - - for (j = 0; j < nat; ++j) { - for (k = 0; k < 3; ++k) { - u[idata][3 * j + k] = u_tmp[3 * nat * i + 3 * j + k]; - f[idata][3 * j + k] = f_tmp[3 * nat * i + 3 * j + k]; - } - } - ++idata; - } - - } else if (multiply_data == 1) { - - std::cout << " MULTDAT = 1: Generate symmetrically equivalent displacement-force " << std::endl; - std::cout << " data sets by using pure translational operations only." << std::endl << std::endl; - - nmulti = symmetry->ntran; - - memory->allocate(u, ndata_used * nmulti, 3 * nat); - memory->allocate(f, ndata_used * nmulti, 3 * nat); - - idata = 0; - - for (i = 0; i < ndata; ++i) { - if (i < nstart - 1) continue; - if (i > nend - 1) break; - - for (itran = 0; itran < symmetry->ntran; ++itran) { - for (j = 0; j < nat; ++j) { - n_mapped = symmetry->map_sym[j][symmetry->symnum_tran[itran]]; - - for (k = 0; k < 3; ++k) { - u[idata][3 * n_mapped + k] = u_tmp[3 * nat * i + 3 * j + k]; - f[idata][3 * n_mapped + k] = f_tmp[3 * nat * i + 3 * j + k]; - } - } - ++idata; - } - } - - } else if (multiply_data == 2) { - - double u_rot[3], f_rot[3]; - - std::cout << " MULTDAT = 2: Generate symmetrically equivalent displacement-force" << std::endl; - std::cout << " data sets. (including rotational part) " << std::endl << std::endl; - - nmulti = symmetry->nsym; - - memory->allocate(u, ndata_used * nmulti, 3 * nat); - memory->allocate(f, ndata_used * nmulti, 3 * nat); - - idata = 0; - - for (i = 0; i < ndata; ++i) { - if (i < nstart - 1) continue; - if (i > nend - 1) break; - -#pragma omp parallel for private(j, n_mapped, k, u_rot, f_rot) - for (isym = 0; isym < symmetry->nsym; ++isym) { - for (j = 0; j < nat; ++j) { - n_mapped = symmetry->map_sym[j][isym]; - - for (k = 0; k < 3; ++k) { - u_rot[k] = u_tmp[3 * nat * i + 3 * j + k]; - f_rot[k] = f_tmp[3 * nat * i + 3 * j + k]; - } - - rotvec(u_rot, u_rot, symmetry->SymmData[isym].rotation_cart); - rotvec(f_rot, f_rot, symmetry->SymmData[isym].rotation_cart); - - for (k = 0; k < 3; ++k) { - u[nmulti * idata + isym][3 * n_mapped + k] = u_rot[k]; - f[nmulti * idata + isym][3 * n_mapped + k] = f_rot[k]; - } - } - } - ++idata; - } - - } else { - error->exit("data_multiplier", "Unsupported MULTDAT"); - } - - memory->deallocate(u_tmp); - memory->deallocate(f_tmp); - - ifs_disp.close(); - ifs_force.close(); -} - -void Fitting::fit_without_constraints(int N, - int M, - double **amat, - double *bvec, - double *param_out) -{ - int i, j; - unsigned long k; - int nrhs = 1, nrank, INFO, LWORK; - int LMIN, LMAX; - double rcond = -1.0; - double f_square = 0.0; - double *WORK, *S, *amat_mod, *fsum2; - - std::cout << " Entering fitting routine: SVD without constraints" << std::endl; - - LMIN = std::min(M, N); - LMAX = std::max(M, N); - - LWORK = 3 * LMIN + std::max(2 * LMIN, LMAX); - LWORK = 2 * LWORK; - - memory->allocate(WORK, LWORK); - memory->allocate(S, LMIN); - - // transpose matrix A - memory->allocate(amat_mod, M * N); - memory->allocate(fsum2, LMAX); - - k = 0; - for (j = 0; j < N; ++j) { - for (i = 0; i < M; ++i) { - amat_mod[k++] = amat[i][j]; - } - } - for (i = 0; i < M; ++i) { - fsum2[i] = bvec[i]; - f_square += std::pow(bvec[i], 2); - } - for (i = M; i < LMAX; ++i) fsum2[i] = 0.0; - - std::cout << " SVD has started ... "; - - // Fitting with singular value decomposition - dgelss_(&M, &N, &nrhs, amat_mod, &M, fsum2, &LMAX, - S, &rcond, &nrank, WORK, &LWORK, &INFO); - - std::cout << "finished !" << std::endl << std::endl; - - std::cout << " RANK of the matrix = " << nrank << std::endl; - if (nrank < N) - error->warn("fit_without_constraints", - "Matrix is rank-deficient. Force constants could not be determined uniquely :("); - - if (nrank == N) { - double f_residual = 0.0; - for (i = N; i < M; ++i) { - f_residual += std::pow(fsum2[i], 2); - } - std::cout << std::endl << " Residual sum of squares for the solution: " - << sqrt(f_residual) << std::endl; - std::cout << " Fitting error (%) : " - << sqrt(f_residual / f_square) * 100.0 << std::endl; - } - - for (i = 0; i < N; ++i) { - param_out[i] = fsum2[i]; - } - - memory->deallocate(WORK); - memory->deallocate(S); - memory->deallocate(fsum2); - memory->deallocate(amat_mod); -} - -void Fitting::fit_with_constraints(int N, - int M, - int P, - double **amat, - double *bvec, - double *param_out, - double **cmat, - double *dvec) -{ - int i, j; - unsigned long k; - int nrank; - double f_square, f_residual; - double *fsum2; - - std::cout << " Entering fitting routine: QRD with constraints" << std::endl; - - memory->allocate(fsum2, M); - -#ifdef _USE_EIGEN_DISABLED - - double **mat_tmp2; - memory->allocate(mat_tmp2, M + P, N); - for (i = 0; i < M; ++i) { - for (j = 0; j < N; ++j) { - mat_tmp2[i][j] = amat[i][j]; - } - } - for (i = 0; i < P; ++i) { - for (j = 0; j < N; ++j) { - mat_tmp2[M + i][j] = cmat[i][j]; - } - } - - nrank = getRankEigen(M+P, N, mat_tmp2); - memory->deallocate(mat_tmp2); - -#else - - double *mat_tmp; - - memory->allocate(mat_tmp, (M + P) * N); - - k = 0; - - for (j = 0; j < N; ++j) { - for (i = 0; i < M; ++i) { - mat_tmp[k++] = amat[i][j]; - } - for (i = 0; i < P; ++i) { - mat_tmp[k++] = cmat[i][j]; - } - } - - nrank = rankQRD((M + P), N, mat_tmp, eps12); - memory->deallocate(mat_tmp); - -#endif - - if (nrank != N) { - std::cout << std::endl; - std::cout << " **************************************************************************" << std::endl; - std::cout << " WARNING : rank deficient. " << std::endl; - std::cout << " rank ( (A) ) ! = N A: Fitting matrix B: Constraint matrix " << std::endl; - std::cout << " ( (B) ) N: The number of parameters " << std::endl; - std::cout << " rank = " << nrank << " N = " << N << std::endl << std::endl; - std::cout << " This can cause a difficulty in solving the fitting problem properly " << std::endl; - std::cout << " with DGGLSE, especially when the difference is large. Please check if " << std::endl; - std::cout << " you obtain reliable force constants in the .fcs file. " << std::endl << std::endl; - std::cout << " This issue may be resolved by setting MULTDAT = 2 in the &fitting field. " << std::endl; - std::cout << " If not, you may need to reduce the cutoff radii and/or increase NDATA " << std::endl; - std::cout << " by giving linearly-independent displacement patterns. " << std::endl; - std::cout << " **************************************************************************" << std::endl; - std::cout << std::endl; - } - - f_square = 0.0; - for (i = 0; i < M; ++i) { - fsum2[i] = bvec[i]; - f_square += std::pow(bvec[i], 2); - } - std::cout << " QR-Decomposition has started ..."; - - double *amat_mod, *cmat_mod; - memory->allocate(amat_mod, M * N); - memory->allocate(cmat_mod, P * N); - - // transpose matrix A and C - k = 0; - for (j = 0; j < N; ++j) { - for (i = 0; i < M; ++i) { - amat_mod[k++] = amat[i][j]; - } - } - k = 0; - for (j = 0; j < N; ++j) { - for (i = 0; i < P; ++i) { - cmat_mod[k++] = cmat[i][j]; - } - } - - // Fitting - - int LWORK = P + std::min(M, N) + 10 * std::max(M, N); - int INFO; - double *WORK, *x; - memory->allocate(WORK, LWORK); - memory->allocate(x, N); - - dgglse_(&M, &N, &P, amat_mod, &M, cmat_mod, &P, - fsum2, dvec, x, WORK, &LWORK, &INFO); - - std::cout << " finished. " << std::endl; - - f_residual = 0.0; - for (i = N - P; i < M; ++i) { - f_residual += std::pow(fsum2[i], 2); - } - std::cout << std::endl << " Residual sum of squares for the solution: " - << sqrt(f_residual) << std::endl; - std::cout << " Fitting error (%) : " - << std::sqrt(f_residual / f_square) * 100.0 << std::endl; - - // copy fcs to bvec - - for (i = 0; i < N; ++i) { - param_out[i] = x[i]; - } - - memory->deallocate(amat_mod); - memory->deallocate(cmat_mod); - memory->deallocate(WORK); - memory->deallocate(x); - memory->deallocate(fsum2); -} - -void Fitting::fit_algebraic_constraints(int N, - int M, - double *amat, - double *bvec, - double *param_out, - double *bvec_orig, - const int maxorder) -{ - int i, j; - unsigned long k; - int nrhs = 1, nrank, INFO, LWORK; - int LMIN, LMAX; - double rcond = -1.0; - double f_square = 0.0; - double *WORK, *S, *amat_mod, *fsum2; - - std::cout << " Entering fitting routine: SVD with constraints considered algebraically." << std::endl; - - LMIN = std::min(M, N); - LMAX = std::max(M, N); - - LWORK = 3 * LMIN + std::max(2 * LMIN, LMAX); - LWORK = 2 * LWORK; - - memory->allocate(WORK, LWORK); - memory->allocate(S, LMIN); - - // transpose matrix A - // memory->allocate(amat_mod, M * N); - memory->allocate(fsum2, LMAX); - - //k = 0; - //for (j = 0; j < N; ++j) { - // for (i = 0; i < M; ++i) { - // amat_mod[k++] = amat[i][j]; - // } - //} - for (i = 0; i < M; ++i) { - fsum2[i] = bvec[i]; - f_square += std::pow(bvec_orig[i], 2); - } - for (i = M; i < LMAX; ++i) fsum2[i] = 0.0; - - std::cout << " SVD has started ... "; - - // Fitting with singular value decomposition - dgelss_(&M, &N, &nrhs, amat, &M, fsum2, &LMAX, - S, &rcond, &nrank, WORK, &LWORK, &INFO); - - std::cout << "finished !" << std::endl << std::endl; - - std::cout << " RANK of the matrix = " << nrank << std::endl; - if (nrank < N) - error->warn("fit_without_constraints", - "Matrix is rank-deficient. Force constants could not be determined uniquely :("); - - if (nrank == N) { - double f_residual = 0.0; - for (i = N; i < M; ++i) { - f_residual += std::pow(fsum2[i], 2); - } - std::cout << std::endl; - std::cout << " Residual sum of squares for the solution: " - << sqrt(f_residual) << std::endl; - std::cout << " Fitting error (%) : " - << sqrt(f_residual / f_square) * 100.0 << std::endl; - } - - int ishift = 0; - int iparam = 0; - double tmp; - int inew, iold; - - for (i = 0; i < maxorder; ++i) { - for (j = 0; j < constraint->const_fix[i].size(); ++j) { - param_out[constraint->const_fix[i][j].p_index_target + ishift] - = constraint->const_fix[i][j].val_to_fix; - } - - for (boost::bimap::const_iterator it = constraint->index_bimap[i].begin(); - it != constraint->index_bimap[i].end(); ++it) { - inew = (*it).left + iparam; - iold = (*it).right + ishift; - - param_out[iold] = fsum2[inew]; - } - - for (j = 0; j < constraint->const_relate[i].size(); ++j) { - tmp = 0.0; - - for (k = 0; k < constraint->const_relate[i][j].alpha.size(); ++k) { - tmp += constraint->const_relate[i][j].alpha[k] - * param_out[constraint->const_relate[i][j].p_index_orig[k] + ishift]; - } - param_out[constraint->const_relate[i][j].p_index_target + ishift] = -tmp; - } - - ishift += fcs->nequiv[i].size(); - iparam += constraint->index_bimap[i].size(); - } - - memory->deallocate(WORK); - memory->deallocate(S); - memory->deallocate(fsum2); - // memory->deallocate(amat_mod); -} - - -void Fitting::fit_bootstrap(int N, - int P, - int natmin, - int ndata_used, - int nmulti, - double **amat, - double *bvec, - double **cmat, - double *dvec) -{ - int i, j; - unsigned long k, l; - int M_Start, M_End; - int mset; - unsigned int iboot; - int M; - - mset = 3 * natmin * nmulti; - - M_Start = 0; - M_End = mset * ndata_used; - - M = M_End - M_Start; - - - std::string file_fcs_bootstrap; - file_fcs_bootstrap = files->job_title + ".fcs_bootstrap"; - - std::ofstream ofs_fcs_boot; - ofs_fcs_boot.open(file_fcs_bootstrap.c_str(), std::ios::out); - if (!ofs_fcs_boot) - error->exit("fit_bootstrap", - "cannot open file_fcs_bootstrap"); - - ofs_fcs_boot.setf(std::ios::scientific); - - double f_residual, f_square; - double *fsum2; - int INFO; - double *WORK, *x; - double *amat_mod, *cmat_mod; - double *const_tmp; - - int *rnd_index; - int iloc; - - memory->allocate(x, N); - memory->allocate(cmat_mod, P * N); - memory->allocate(const_tmp, P); - - std::cout << " NSKIP < 0: Bootstrap analysis for error estimation." << std::endl; - std::cout << " The number of trials is NBOOT (=" << nboot << ")" << std::endl; - std::cout << std::endl; - std::cout << " Relative errors and FCs are stored in file: " - << file_fcs_bootstrap << std::endl; - - ofs_fcs_boot << "# Relative Error(%), FCs ..."; - - for (i = 0; i < interaction->maxorder; ++i) { - ofs_fcs_boot << std::setw(10) << fcs->nequiv[i].size(); - } - ofs_fcs_boot << std::endl; - - memory->allocate(fsum2, M); - memory->allocate(amat_mod, N * M); - memory->allocate(rnd_index, ndata_used); - - int LWORK = P + std::min(M, N) + 100 * std::max(M, N); - memory->allocate(WORK, LWORK); - - for (iboot = 0; iboot < nboot; ++iboot) { -#ifdef _VSL - // Use Intel MKL VSL if available - viRngUniform(VSL_METHOD_IUNIFORM_STD, stream, ndata_used, rnd_index, 0, ndata_used); -#else - for (i = 0; i < ndata_used; ++i) { - // random number uniformly distributed in [0, ndata_used) - rnd_index[i] = std::rand() % ndata_used; - } -#endif - - f_square = 0.0; - k = 0; - for (i = 0; i < ndata_used; ++i) { - iloc = rnd_index[i]; - for (j = iloc * mset; j < (iloc + 1) * mset; ++j) { - fsum2[k++] = bvec[j]; - f_square += std::pow(bvec[j], 2); - } - } - l = 0; - for (j = 0; j < N; ++j) { - for (i = 0; i < ndata_used; ++i) { - iloc = rnd_index[i]; - for (k = iloc * mset; k < (iloc + 1) * mset; ++k) { - amat_mod[l++] = amat[k][j]; - } - } - } - - k = 0; - for (j = 0; j < N; ++j) { - for (i = 0; i < P; ++i) { - cmat_mod[k++] = cmat[i][j]; - } - } - - for (i = 0; i < P; ++i) { - const_tmp[i] = dvec[i]; - } - - dgglse_(&M, &N, &P, amat_mod, &M, cmat_mod, &P, - fsum2, const_tmp, x, WORK, &LWORK, &INFO); - - f_residual = 0.0; - for (i = N - P; i < M; ++i) { - f_residual += std::pow(fsum2[i], 2); - } - - ofs_fcs_boot << 100.0 * std::sqrt(f_residual / f_square); - - for (i = 0; i < N; ++i) { - ofs_fcs_boot << std::setw(15) << x[i]; - } - ofs_fcs_boot << std::endl; - } - ofs_fcs_boot.close(); - - memory->deallocate(x); - memory->deallocate(fsum2); - memory->deallocate(cmat_mod); - memory->deallocate(const_tmp); - memory->deallocate(amat_mod); - memory->deallocate(rnd_index); - memory->deallocate(WORK); - - std::cout << " Bootstrap analysis finished." << std::endl; - std::cout << " Normal fitting will be performed" << std::endl; -} - - -void Fitting::fit_consecutively(int N, - int P, - const int natmin, - const int ndata_used, - const int nmulti, - const int nskip, - double **amat, - double *bvec, - double **cmat, - double *dvec) -{ - int i, j; - unsigned long k; - int iend; - int M_Start, M_End; - int mset; - int M; - - mset = 3 * natmin * nmulti; - - M_Start = 0; - - - std::string file_fcs_sequence; - file_fcs_sequence = files->job_title + ".fcs_sequence"; - - std::ofstream ofs_fcs_seq; - ofs_fcs_seq.open(file_fcs_sequence.c_str(), std::ios::out); - if (!ofs_fcs_seq) - error->exit("fit_consecutively", - "cannot open file_fcs_sequence"); - - ofs_fcs_seq.setf(std::ios::scientific); - - double f_residual, f_square; - double *fsum2; - int INFO; - double *WORK, *x; - double *amat_mod, *cmat_mod; - double *const_tmp; - - memory->allocate(x, N); - memory->allocate(cmat_mod, P * N); - memory->allocate(const_tmp, P); - - std::cout << " NSKIP > 0: Fitting will be performed consecutively" << std::endl; - std::cout << " with variously changing NEND as NEND = NSTART + i*NSKIP" << std::endl; - std::cout << std::endl; - std::cout << " Relative errors and FCs will be stored in the file " - << file_fcs_sequence << std::endl; - - ofs_fcs_seq << "# Relative Error(%), FCS..."; - - for (i = 0; i < interaction->maxorder; ++i) { - ofs_fcs_seq << std::setw(10) << fcs->nequiv[i].size(); - } - ofs_fcs_seq << std::endl; - - for (iend = 1; iend <= ndata_used; iend += nskip) { - - M_End = mset * iend; - M = M_End - M_Start; - - memory->allocate(fsum2, M); - - f_square = 0.0; - j = 0; - for (i = M_Start; i < M_End; ++i) { - fsum2[j++] = bvec[i]; - f_square += std::pow(bvec[i], 2); - } - - memory->allocate(amat_mod, M * N); - - // Transpose matrix A - k = 0; - for (j = 0; j < N; ++j) { - for (i = M_Start; i < M_End; ++i) { - amat_mod[k++] = amat[i][j]; - } - } - - k = 0; - for (j = 0; j < N; ++j) { - for (i = 0; i < P; ++i) { - cmat_mod[k++] = cmat[i][j]; - } - } - - for (i = 0; i < P; ++i) { - const_tmp[i] = dvec[i]; - } - - // Fitting - - int LWORK = P + std::min(M, N) + 100 * std::max(M, N); - memory->allocate(WORK, LWORK); - - dgglse_(&M, &N, &P, amat_mod, &M, cmat_mod, &P, - fsum2, const_tmp, x, WORK, &LWORK, &INFO); - - memory->deallocate(amat_mod); - memory->deallocate(WORK); - - f_residual = 0.0; - for (i = N - P; i < M; ++i) { - f_residual += std::pow(fsum2[i], 2); - } - - ofs_fcs_seq << 100.0 * std::sqrt(f_residual / f_square); - - for (i = 0; i < N; ++i) { - ofs_fcs_seq << std::setw(15) << x[i]; - } - ofs_fcs_seq << std::endl; - memory->deallocate(fsum2); - } - - for (i = 0; i < N; ++i) { - bvec[i] = x[i]; - } - - memory->deallocate(cmat_mod); - memory->deallocate(const_tmp); - memory->deallocate(x); - - ofs_fcs_seq.close(); - - std::cout << " Consecutive fitting finished." << std::endl; -} - -void Fitting::calc_matrix_elements(const int M, - const int N, - const int nat, - const int natmin, - const int ndata_fit, - const int nmulti, - const int maxorder, - double **u, - double **f, - double **amat, - double *bvec) -{ - int i, j; - int irow; - int ncycle; - - std::cout << " Calculation of matrix elements for direct fitting started ... "; - for (i = 0; i < M; ++i) { - for (j = 0; j < N; ++j) { - amat[i][j] = 0.0; - } - bvec[i] = 0.0; - } - - ncycle = ndata_fit * nmulti; - -#ifdef _OPENMP -#pragma omp parallel private(irow, i, j) -#endif - { - int *ind; - int mm, order, iat, k; - int im, idata, iparam; - double amat_tmp; - - memory->allocate(ind, maxorder + 1); - -#ifdef _OPENMP -#pragma omp for schedule(guided) -#endif - for (irow = 0; irow < ncycle; ++irow) { - - // generate r.h.s vector B - for (i = 0; i < natmin; ++i) { - iat = symmetry->map_p2s[i][0]; - for (j = 0; j < 3; ++j) { - im = 3 * i + j + 3 * natmin * irow; - bvec[im] = f[irow][3 * iat + j]; - } - } - - // generate l.h.s. matrix A - - idata = 3 * natmin * irow; - iparam = 0; - - for (order = 0; order < maxorder; ++order) { - - mm = 0; - - for (std::vector::iterator iter = fcs->nequiv[order].begin(); - iter != fcs->nequiv[order].end(); ++iter) { - for (i = 0; i < *iter; ++i) { - ind[0] = fcs->fc_table[order][mm].elems[0]; - k = idata + inprim_index(fcs->fc_table[order][mm].elems[0]); - amat_tmp = 1.0; - for (j = 1; j < order + 2; ++j) { - ind[j] = fcs->fc_table[order][mm].elems[j]; - amat_tmp *= u[irow][fcs->fc_table[order][mm].elems[j]]; - } - amat[k][iparam] -= gamma(order + 2, ind) * fcs->fc_table[order][mm].sign * amat_tmp; - ++mm; - } - ++iparam; - } - } - - } - - memory->deallocate(ind); - - } - - std::cout << "done!" << std::endl << std::endl; -} - - -void Fitting::calc_matrix_elements_algebraic_constraint(const int M, - const int N, - const int N_new, - const int nat, - const int natmin, - const int ndata_fit, - const int nmulti, - const int maxorder, - double **u, - double **f, - double *amat, - double *bvec, - double *bvec_orig) -{ - long i, j; - long irow; - long ncycle; - - std::cout << " Calculation of matrix elements for direct fitting started ... "; - - ncycle = ndata_fit * nmulti; - long natmin3 = 3 * static_cast(natmin); - -#ifdef _OPENMP -#pragma omp parallel for private(j) -#endif - for (i = 0; i < M; ++i) { - // for (j = 0; j < N_new; ++j) { - // amat[i][j] = 0.0; - // } - bvec[i] = 0.0; - bvec_orig[i] = 0.0; - } - -#ifdef _OPENMP -#pragma omp parallel private(irow, i, j) -#endif - { - int *ind; - long mm, order, iat, k; - long im, idata, iparam; - long ishift; - long iold, inew; - double amat_tmp; - double **amat_orig; - double **amat_mod; - - memory->allocate(ind, maxorder + 1); - memory->allocate(amat_orig, natmin3, N); - memory->allocate(amat_mod, natmin3, N_new); - -#ifdef _OPENMP -#pragma omp for schedule(guided) -#endif - for (irow = 0; irow < ncycle; ++irow) { - - // generate r.h.s vector B - for (i = 0; i < natmin; ++i) { - iat = symmetry->map_p2s[i][0]; - for (j = 0; j < 3; ++j) { - im = 3 * i + j + natmin3 * irow; - bvec[im] = f[irow][3 * iat + j]; - bvec_orig[im] = f[irow][3 * iat + j]; - } - } - - for (i = 0; i < natmin3; ++i) { - for (j = 0; j < N; ++j) { - amat_orig[i][j] = 0.0; - } - for (j = 0; j < N_new; ++j) { - amat_mod[i][j] = 0.0; - } - } - - // generate l.h.s. matrix A - - idata = natmin3 * irow; - iparam = 0; - - for (order = 0; order < maxorder; ++order) { - - mm = 0; - - for (std::vector::iterator iter = fcs->nequiv[order].begin(); - iter != fcs->nequiv[order].end(); ++iter) { - for (i = 0; i < *iter; ++i) { - ind[0] = fcs->fc_table[order][mm].elems[0]; - k = inprim_index(ind[0]); - - amat_tmp = 1.0; - for (j = 1; j < order + 2; ++j) { - ind[j] = fcs->fc_table[order][mm].elems[j]; - amat_tmp *= u[irow][fcs->fc_table[order][mm].elems[j]]; - } - amat_orig[k][iparam] -= gamma(order + 2, ind) * fcs->fc_table[order][mm].sign * amat_tmp; - ++mm; - } - ++iparam; - } - } - - ishift = 0; - iparam = 0; - - for (order = 0; order < maxorder; ++order) { - - for (i = 0; i < constraint->const_fix[order].size(); ++i) { - - for (j = 0; j < natmin3; ++j) { - bvec[j + idata] -= constraint->const_fix[order][i].val_to_fix - * amat_orig[j][ishift + constraint->const_fix[order][i].p_index_target]; - } - } - - for (boost::bimap::const_iterator it = constraint->index_bimap[order].begin(); - it != constraint->index_bimap[order].end(); ++it) { - inew = (*it).left + iparam; - iold = (*it).right + ishift; - - for (j = 0; j < natmin3; ++j) { - amat_mod[j][inew] = amat_orig[j][iold]; - } - } - - for (i = 0; i < constraint->const_relate[order].size(); ++i) { - - iold = constraint->const_relate[order][i].p_index_target + ishift; - - for (j = 0; j < constraint->const_relate[order][i].alpha.size(); ++j) { - - inew = constraint->index_bimap[order].right.at( - constraint->const_relate[order][i].p_index_orig[j]) - + iparam; - for (k = 0; k < natmin3; ++k) { - amat_mod[k][inew] -= amat_orig[k][iold] * constraint->const_relate[order][i].alpha[j]; - } - } - } - - ishift += fcs->nequiv[order].size(); - iparam += constraint->index_bimap[order].size(); - } - - for (i = 0; i < natmin3; ++i) { - for (j = 0; j < N_new; ++j) { - // amat[i + idata][j] = amat_mod[i][j]; - // Transpose the matrix for later use of lapack - amat[natmin3 * ncycle * j + i + idata] = amat_mod[i][j]; - } - } - } - - memory->deallocate(ind); - memory->deallocate(amat_orig); - memory->deallocate(amat_mod); - } -} - - -int Fitting::inprim_index(const int n) -{ - int in; - int atmn = n / 3; - int crdn = n % 3; - - for (int i = 0; i < symmetry->nat_prim; ++i) { - if (symmetry->map_p2s[i][0] == atmn) { - in = 3 * i + crdn; - break; - } - } - return in; -} - -double Fitting::gamma(const int n, const int *arr) -{ - int *arr_tmp, *nsame; - int i; - int ind_front, nsame_to_front; - - memory->allocate(arr_tmp, n); - memory->allocate(nsame, n); - - for (i = 0; i < n; ++i) { - arr_tmp[i] = arr[i]; - nsame[i] = 0; - } - - ind_front = arr[0]; - nsame_to_front = 1; - - interaction->insort(n, arr_tmp); - - int nuniq = 1; - int iuniq = 0; - - nsame[0] = 1; - - for (i = 1; i < n; ++i) { - if (arr_tmp[i] == arr_tmp[i - 1]) { - ++nsame[iuniq]; - } else { - ++nsame[++iuniq]; - ++nuniq; - } - - if (arr[i] == ind_front) ++nsame_to_front; - } - - int denom = 1; - - for (i = 0; i < nuniq; ++i) { - denom *= factorial(nsame[i]); - } - - memory->deallocate(arr_tmp); - memory->deallocate(nsame); - - return static_cast(nsame_to_front) / static_cast(denom); -} - -int Fitting::factorial(const int n) -{ - if (n == 1 || n == 0) { - return 1; - } else { - return n * factorial(n - 1); - } -} - -#ifdef _USE_EIGEN_DISABLED -int Fitting::getRankEigen(const int m, const int n, double **mat) -{ - using namespace Eigen; - - MatrixXd mat_tmp(m, n); - - int i, j; - - for (i = 0; i < m; ++i) { - for (j = 0; j < n; ++j) { - mat_tmp(i,j) = mat[i][j]; - } - } - ColPivHouseholderQR qr(mat_tmp); - return qr.rank(); -} -#endif - -int Fitting::rankQRD(const int m, - const int n, - double *mat, - const double tolerance) -{ - // Return the rank of matrix mat revealed by the column pivoting QR decomposition - // The matrix mat is destroyed. - - int m_ = m; - int n_ = n; - - int LDA = m_; - - int LWORK = 10 * n_; - int INFO; - int *JPVT; - double *WORK, *TAU; - - int nmin = std::min(m_, n_); - - memory->allocate(JPVT, n_); - memory->allocate(WORK, LWORK); - memory->allocate(TAU, nmin); - - for (int i = 0; i < n_; ++i) JPVT[i] = 0; - - dgeqp3_(&m_, &n_, mat, &LDA, JPVT, TAU, WORK, &LWORK, &INFO); - - memory->deallocate(JPVT); - memory->deallocate(WORK); - memory->deallocate(TAU); - - if (std::abs(mat[0]) < eps) return 0; - - double **mat_tmp; - memory->allocate(mat_tmp, m_, n_); - - unsigned long k = 0; - - for (int j = 0; j < n_; ++j) { - for (int i = 0; i < m_; ++i) { - mat_tmp[i][j] = mat[k++]; - } - } - - int nrank = 0; - for (int i = 0; i < nmin; ++i) { - if (std::abs(mat_tmp[i][i]) > tolerance * std::abs(mat[0])) ++nrank; - } - - memory->deallocate(mat_tmp); - - return nrank; -} - -int Fitting::rankSVD(const int m, - const int n, - double *mat, - const double tolerance) -{ - int i; - int m_ = m; - int n_ = n; - - int LWORK = 10 * m; - int INFO; - int *IWORK; - int ldu = 1, ldvt = 1; - double *s, *WORK; - double u[1], vt[1]; - - int nmin = std::min(m, n); - - memory->allocate(IWORK, 8 * nmin); - memory->allocate(WORK, LWORK); - memory->allocate(s, nmin); - - char mode[] = "N"; - - dgesdd_(mode, &m_, &n_, mat, &m_, s, u, &ldu, vt, &ldvt, - WORK, &LWORK, IWORK, &INFO); - - int rank = 0; - for (i = 0; i < nmin; ++i) { - if (s[i] > s[0] * tolerance) ++rank; - } - - memory->deallocate(WORK); - memory->deallocate(IWORK); - memory->deallocate(s); - - return rank; -} - -int Fitting::rankSVD2(const int m_in, - const int n_in, - double **mat, - const double tolerance) -{ - // Reveal the rank of matrix mat without destroying the matrix elements - - int i, j, k; - double *arr; - - int m = m_in; - int n = n_in; - - memory->allocate(arr, m * n); - - k = 0; - - for (j = 0; j < n; ++j) { - for (i = 0; i < m; ++i) { - arr[k++] = mat[i][j]; - } - } - - int LWORK = 10 * m; - int INFO; - int *IWORK; - int ldu = 1, ldvt = 1; - double *s, *WORK; - double u[1], vt[1]; - - int nmin = std::min(m, n); - - memory->allocate(IWORK, 8 * nmin); - memory->allocate(WORK, LWORK); - memory->allocate(s, nmin); - - char mode[] = "N"; - - dgesdd_(mode, &m, &n, arr, &m, s, u, &ldu, vt, &ldvt, - WORK, &LWORK, IWORK, &INFO); - - int rank = 0; - for (i = 0; i < nmin; ++i) { - if (s[i] > s[0] * tolerance) ++rank; - } - - memory->deallocate(IWORK); - memory->deallocate(WORK); - memory->deallocate(s); - memory->deallocate(arr); - - return rank; -} diff --git a/alm/fitting.h b/alm/fitting.h deleted file mode 100644 index e65c3ec9..00000000 --- a/alm/fitting.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - fitting.h - - Copyright (c) 2014, 2015, 2016 Terumasa Tadano - - This file is distributed under the terms of the MIT license. - Please see the file 'LICENCE.txt' in the root directory - or http://opensource.org/licenses/mit-license.php for information. -*/ - -#pragma once - -#include "pointers.h" -#include -#include -#include -#ifdef _VSL -#include "mkl_vsl.h" -#endif - -namespace ALM_NS -{ - class Fitting: protected Pointers - { - public: - Fitting(class ALM *); - ~Fitting(); - - void fitmain(); - - double *params; - unsigned int nboot; - unsigned int seed; - - void data_multiplier(const int, const int, const int, const int, const int, - int &, const int, - double **&, double **&, - const std::string, const std::string); - - -#ifdef _VSL - VSLStreamStatePtr stream; - int brng; -#endif - - double gamma(const int, const int *); - - private: - - int inprim_index(const int); - void fit_without_constraints(int, int, double **, double *, double *); - void fit_algebraic_constraints(int, int, double *, double *, - double *, double *, const int); - - void fit_with_constraints(int, int, int, double **, double *, - double *, double **, double *); - - void fit_consecutively(int, int, const int, const int, - const int, const int, - double **, double *, double **, double *); - - void calc_matrix_elements(const int, const int, const int, - const int, const int, const int, const int, - double **, double **, double **, double *); - - void calc_matrix_elements_algebraic_constraint(const int, const int, const int, const int, - const int, const int, const int, const int, - double **, double **, double *, double *, double *); - - void fit_bootstrap(int, int, int, int, int, - double **, double *, double **, double *); - - int factorial(const int); - int rankSVD(const int, const int, double *, const double); - int rankQRD(const int, const int, double *, const double); - int rankSVD2(const int, const int, double **, const double); -#ifdef _USE_EIGEN_DISABLED - int getRankEigen(const int, const int, double **); -#endif - }; - - extern "C" - { - void dgelss_(int *m, int *n, int *nrhs, double *a, int *lda, - double *b, int *ldb, double *s, double *rcond, int *rank, - double *work, int *lwork, int *info); - - void dgglse_(int *m, int *n, int *p, double *a, int *lda, - double *b, int *ldb, double *c, double *d, double *x, - double *work, int *lwork, int *info); - - void dgesdd_(const char *jobz, int *m, int *n, double *a, int *lda, - double *s, double *u, int *ldu, double *vt, int *ldvt, double *work, - int *lwork, int *iwork, int *info); - - void dgeqrf_(int *m, int *n, double *a, int *lda, double *tau, - double *work, int *lwork, int *info); - - void dgeqp3_(int *m, int *n, double *a, int *lda, int *jpvt, - double *tau, double *work, int *lwork, int *info); - } -} diff --git a/alm/input.cpp b/alm/input.cpp deleted file mode 100644 index 3b4853b2..00000000 --- a/alm/input.cpp +++ /dev/null @@ -1,1196 +0,0 @@ -/* - input.cpp - - Copyright (c) 2014, 2015, 2016 Terumasa Tadano - - This file is distributed under the terms of the MIT license. - Please see the file 'LICENCE.txt' in the root directory - or http://opensource.org/licenses/mit-license.php for information. -*/ - -#include "input.h" -#include -#include -#include -#include "memory.h" -#include "files.h" -#include "interaction.h" -#include "system.h" -#include "symmetry.h" -#include "error.h" -#include "fitting.h" -#include "constraint.h" -#include "writes.h" -#include "patterndisp.h" -#include -#include -#include -#include - -using namespace ALM_NS; - -Input::Input(ALM *alm, int narg, char **arg): Pointers(alm) -{ -} - -Input::~Input() -{ -} - -void Input::parse_input(int narg, char **arg) -{ - if (narg == 1) { - - from_stdin = true; - - } else { - - from_stdin = false; - - ifs_input.open(arg[1], std::ios::in); - if (!ifs_input) { - std::cout << "No such file or directory: " << arg[1] << std::endl; - exit(EXIT_FAILURE); - } - } - - if (!locate_tag("&general")) { - error->exit("parse_input", - "&general entry not found in the input file"); - } - parse_general_vars(); - - if (!locate_tag("&cell")) { - error->exit("parse_input", - "&cell entry not found in the input file"); - } - parse_cell_parameter(); - - if (!locate_tag("&interaction")) { - error->exit("parse_input", - "&interaction entry not found in the input file"); - } - parse_interaction_vars(); - - if (!locate_tag("&cutoff")) { - error->exit("parse_input", - "&cutoff entry not found in the input file"); - } - parse_cutoff_radii(); - - if (alm->mode == "fitting") { - if (!locate_tag("&fitting")) { - error->exit("parse_input", - "&fitting entry not found in the input file"); - } - parse_fitting_vars(); - } - - if (!locate_tag("&position")) { - error->exit("parse_input", - "&position entry not found in the input file"); - } - parse_atomic_positions(); -} - -void Input::parse_general_vars() -{ - int i, j; - std::string prefix, mode, str_tmp, str_disp_basis; - int nat, nkd, nsym; - int is_printsymmetry, is_periodic[3]; - int icount, ncount; - bool trim_dispsign_for_evenfunc; - bool lspin; - bool print_hessian; - int noncollinear, trevsym; - std::string *kdname; - double **magmom, magmag; - double tolerance; - double tolerance_constraint; - - std::vector kdname_v, periodic_v, magmom_v, str_split; - std::string str_allowed_list = "PREFIX MODE NAT NKD NSYM KD PERIODIC PRINTSYM TOLERANCE DBASIS TRIMEVEN\ - MAGMOM NONCOLLINEAR TREVSYM HESSIAN TOL_CONST"; - std::string str_no_defaults = "PREFIX MODE NAT NKD KD"; - std::vector no_defaults; - std::map general_var_dict; - - if (from_stdin) { - std::cin.ignore(); - } else { - ifs_input.ignore(); - } - - get_var_dict(str_allowed_list, general_var_dict); - - boost::split(no_defaults, str_no_defaults, boost::is_space()); - - for (std::vector::iterator it = no_defaults.begin(); - it != no_defaults.end(); ++it) { - if (general_var_dict.find(*it) == general_var_dict.end()) { - error->exit("parse_general_vars", - "The following variable is not found in &general input region: ", - (*it).c_str()); - } - } - - prefix = general_var_dict["PREFIX"]; - mode = general_var_dict["MODE"]; - - std::transform(mode.begin(), mode.end(), mode.begin(), tolower); - if (mode != "fitting" && mode != "suggest") { - error->exit("parse_general_vars", "Invalid MODE variable"); - } - - assign_val(nat, "NAT", general_var_dict); - assign_val(nkd, "NKD", general_var_dict); - - if (general_var_dict["NSYM"].empty()) { - nsym = 0; - } else { - assign_val(nsym, "NSYM", general_var_dict); - } - - if (general_var_dict["PRINTSYM"].empty()) { - is_printsymmetry = 0; - } else { - assign_val(is_printsymmetry, "PRINTSYM", general_var_dict); - } - - split_str_by_space(general_var_dict["KD"], kdname_v); - - if (kdname_v.size() != nkd) { - error->exit("parse_general_vars", - "The number of entries for KD is inconsistent with NKD"); - } else { - memory->allocate(kdname, nkd); - for (i = 0; i < nkd; ++i) { - kdname[i] = kdname_v[i]; - } - } - - split_str_by_space(general_var_dict["PERIODIC"], periodic_v); - - if (periodic_v.size() == 0) { - for (i = 0; i < 3; ++i) { - is_periodic[i] = 1; - } - } else if (periodic_v.size() == 3) { - for (i = 0; i < 3; ++i) { - try { - is_periodic[i] = boost::lexical_cast(periodic_v[i]); - } - catch (std::exception &e) { - std::cout << e.what() << std::endl; - error->exit("parse_general_vars", - "The PERIODIC tag must be a set of integers."); - } - } - } else { - error->exit("parse_general_vars", - "Invalid number of entries for PERIODIC"); - } - - if (general_var_dict["TOLERANCE"].empty()) { - tolerance = 1.0e-6; - } else { - assign_val(tolerance, "TOLERANCE", general_var_dict); - } - - if (general_var_dict["TOL_CONST"].empty()) { - tolerance_constraint = eps6; - } else { - assign_val(tolerance_constraint, "TOL_CONST", general_var_dict); - } - - // Convert MAGMOM input to array - memory->allocate(magmom, nat, 3); - lspin = false; - - for (i = 0; i < nat; ++i) { - for (j = 0; j < 3; ++j) { - magmom[i][j] = 0.0; - } - } - - if (general_var_dict["NONCOLLINEAR"].empty()) { - noncollinear = 0; - } else { - assign_val(noncollinear, "NONCOLLINEAR", general_var_dict); - } - if (general_var_dict["TREVSYM"].empty()) { - trevsym = 1; - } else { - assign_val(trevsym, "TREVSYM", general_var_dict); - } - if (general_var_dict["HESSIAN"].empty()) { - print_hessian = false; - } else { - assign_val(print_hessian, "HESSIAN", general_var_dict); - } - - if (!general_var_dict["MAGMOM"].empty()) { - lspin = true; - - if (noncollinear) { - icount = 0; - split_str_by_space(general_var_dict["MAGMOM"], magmom_v); - for (std::vector::const_iterator it = magmom_v.begin(); - it != magmom_v.end(); ++it) { - if ((*it).find("*") != std::string::npos) { - error->exit("parse_general_vars", - "Wild card '*' is not supported when NONCOLLINEAR = 1."); - } else { - magmag = boost::lexical_cast((*it)); - if (icount / 3 >= nat) { - error->exit("parse_general_vars", "Too many entries for MAGMOM."); - } - magmom[icount / 3][icount % 3] = magmag; - ++icount; - } - } - - if (icount != 3 * nat) { - error->exit("parse_general_vars", - "Number of entries for MAGMOM must be 3*NAT when NONCOLLINEAR = 1."); - } - } else { - icount = 0; - split_str_by_space(general_var_dict["MAGMOM"], magmom_v); - for (std::vector::const_iterator it = magmom_v.begin(); - it != magmom_v.end(); ++it) { - - if ((*it).find("*") != std::string::npos) { - if ((*it) == "*") { - error->exit("parse_general_vars", - "Please place '*' without space for the MAGMOM-tag."); - } - boost::split(str_split, (*it), boost::is_any_of("*")); - if (str_split.size() != 2) { - error->exit("parse_general_vars", - "Invalid format for the MAGMOM-tag."); - } else { - if (str_split[0].empty() || str_split[1].empty()) { - error->exit("parse_general_vars", - "Please place '*' without space for the MAGMOM-tag."); - } - try { - magmag = boost::lexical_cast(str_split[1]); - ncount = static_cast(boost::lexical_cast(str_split[0])); - } - catch (std::exception &e) { - error->exit("parse_general_vars", "Bad format for MAGMOM."); - } - - for (i = icount; i < icount + ncount; ++i) { - magmom[i][2] = magmag; - } - icount += ncount; - } - - } else { - magmag = boost::lexical_cast((*it)); - magmom[icount++][2] = magmag; - } - } - if (icount != nat) { - error->exit("parse_general_vars", - "Number of entries for MAGMOM must be NAT."); - } - } - } - - - if (mode == "suggest") { - if (general_var_dict["DBASIS"].empty()) { - str_disp_basis = "Cart"; - } else { - str_disp_basis = general_var_dict["DBASIS"]; - } - std::transform(str_disp_basis.begin(), str_disp_basis.end(), - str_disp_basis.begin(), toupper); - if ((str_disp_basis[0] != 'C') && (str_disp_basis[0] != 'F')) { - error->exit("parse_general_vars", "Invalid DBASIS"); - } - - if (general_var_dict["TRIMEVEN"].empty()) { - trim_dispsign_for_evenfunc = true; - } else { - assign_val(trim_dispsign_for_evenfunc, - "TRIMEVEN", general_var_dict); - } - - } - - files->job_title = prefix; - alm->mode = mode; - system->nat = nat; - system->nkd = nkd; - symmetry->nsym = nsym; - symmetry->is_printsymmetry = is_printsymmetry; - symmetry->tolerance = tolerance; - this->str_magmom = general_var_dict["MAGMOM"]; - memory->allocate(system->kdname, nkd); - memory->allocate(system->magmom, nat, 3); - - for (i = 0; i < nkd; ++i) { - system->kdname[i] = kdname[i]; - } - for (i = 0; i < 3; ++i) { - interaction->is_periodic[i] = is_periodic[i]; - } - for (i = 0; i < nat; ++i) { - for (j = 0; j < 3; ++j) { - system->magmom[i][j] = magmom[i][j]; - } - } - system->lspin = lspin; - system->noncollinear = noncollinear; - symmetry->trev_sym_mag = trevsym; - writes->print_hessian = print_hessian; - constraint->tolerance_constraint = tolerance_constraint; - - if (mode == "suggest") { - displace->disp_basis = str_disp_basis; - displace->trim_dispsign_for_evenfunc = trim_dispsign_for_evenfunc; - } - - memory->deallocate(kdname); - memory->deallocate(magmom); - - kdname_v.clear(); - periodic_v.clear(); - no_defaults.clear(); - general_var_dict.clear(); -} - -void Input::parse_cell_parameter() -{ - int i, j; - double a; - double lavec_tmp[3][3]; - std::string line; - std::string line_wo_comment, line_tmp; - std::vector line_vec, line_split; - std::string::size_type pos_first_comment_tag; - - line_vec.clear(); - - if (from_stdin) { - - while (std::getline(std::cin, line)) { - - // Ignore comment region - pos_first_comment_tag = line.find_first_of('#'); - - if (pos_first_comment_tag == std::string::npos) { - line_wo_comment = line; - } else { - line_wo_comment = line.substr(0, pos_first_comment_tag); - } - - boost::trim_if(line_wo_comment, boost::is_any_of("\t\n\r ")); - - if (line_wo_comment.empty()) continue; - if (is_endof_entry(line_wo_comment)) break; - - line_vec.push_back(line_wo_comment); - } - - } else { - while (std::getline(ifs_input, line)) { - - // Ignore comment region - pos_first_comment_tag = line.find_first_of('#'); - - if (pos_first_comment_tag == std::string::npos) { - line_wo_comment = line; - } else { - line_wo_comment = line.substr(0, pos_first_comment_tag); - } - - boost::trim_if(line_wo_comment, boost::is_any_of("\t\n\r ")); - - if (line_wo_comment.empty()) continue; - if (is_endof_entry(line_wo_comment)) break; - - line_vec.push_back(line_wo_comment); - } - } - - if (line_vec.size() != 4) { - error->exit("parse_cell_parameter", - "Too few or too much lines for the &cell field.\n \ - The number of valid lines for the &cell field should be 4."); - } - - for (i = 0; i < 4; ++i) { - - line = line_vec[i]; - boost::split(line_split, line, boost::is_any_of("\t "), boost::token_compress_on); - - if (i == 0) { - // Lattice factor a - if (line_split.size() == 1) { - a = boost::lexical_cast(line_split[0]); - } else { - error->exit("parse_cell_parameter", - "Unacceptable format for &cell field."); - } - - } else { - // Lattice vectors a1, a2, a3 - if (line_split.size() == 3) { - for (j = 0; j < 3; ++j) { - lavec_tmp[j][i - 1] = boost::lexical_cast(line_split[j]); - } - } else { - error->exit("parse_cell_parameter", - "Unacceptable format for &cell field."); - } - } - } - - for (i = 0; i < 3; ++i) { - for (j = 0; j < 3; ++j) { - system->lavec[i][j] = a * lavec_tmp[i][j]; - } - } - line_vec.clear(); - line_split.clear(); -} - -void Input::parse_interaction_vars() -{ - int i; - int maxorder; - int *nbody_include; - - std::vector nbody_v; - std::string str_allowed_list = "NORDER NBODY"; - std::string str_no_defaults = "NORDER"; - std::vector no_defaults; - std::map interaction_var_dict; - - - if (from_stdin) { - std::cin.ignore(); - } else { - ifs_input.ignore(); - } - - get_var_dict(str_allowed_list, interaction_var_dict); - - boost::split(no_defaults, str_no_defaults, boost::is_space()); - - for (std::vector::iterator it = no_defaults.begin(); - it != no_defaults.end(); ++it) { - if (interaction_var_dict.find(*it) == interaction_var_dict.end()) { - error->exit("parse_interaction_vars", - "The following variable is not found in &interaction input region: ", - (*it).c_str()); - } - } - - assign_val(maxorder, "NORDER", interaction_var_dict); - if (maxorder < 1) - error->exit("parse_interaction_vars", - "maxorder has to be a positive integer"); - - memory->allocate(nbody_include, maxorder); - - boost::split(nbody_v, interaction_var_dict["NBODY"], boost::is_space()); - - if (nbody_v[0].empty()) { - for (i = 0; i < maxorder; ++i) { - nbody_include[i] = i + 2; - } - } else if (nbody_v.size() == maxorder) { - for (i = 0; i < maxorder; ++i) { - try { - nbody_include[i] = boost::lexical_cast(nbody_v[i]); - } - catch (std::exception &e) { - std::cout << e.what() << std::endl; - error->exit("parse_interaction_vars", - "NBODY must be an integer."); - } - } - } else { - error->exit("parse_interaction_vars", - "The number of entry of NBODY has to be equal to NORDER"); - } - - if (nbody_include[0] != 2) { - error->warn("parce_input", - "Harmonic interaction is always 2 body (except on-site 1 body)"); - } - - interaction->maxorder = maxorder; - memory->allocate(interaction->nbody_include, maxorder); - - for (i = 0; i < maxorder; ++i) { - interaction->nbody_include[i] = nbody_include[i]; - } - - memory->deallocate(nbody_include); - nbody_v.clear(); - no_defaults.clear(); -} - -void Input::parse_cutoff_radii() -{ - std::string line, line_wo_comment; - std::string::size_type pos_first_comment_tag; - std::vector str_cutoff; - - if (from_stdin) { - std::cin.ignore(); - } else { - ifs_input.ignore(); - } - - str_cutoff.clear(); - - if (from_stdin) { - - while (std::getline(std::cin, line)) { - - pos_first_comment_tag = line.find_first_of('#'); - - if (pos_first_comment_tag == std::string::npos) { - line_wo_comment = line; - } else { - line_wo_comment = line.substr(0, pos_first_comment_tag); - } - - boost::trim_left(line_wo_comment); - if (line_wo_comment.empty()) continue; - if (is_endof_entry(line_wo_comment)) break; - - str_cutoff.push_back(line_wo_comment); - } - } else { - - while (std::getline(ifs_input, line)) { - - pos_first_comment_tag = line.find_first_of('#'); - - if (pos_first_comment_tag == std::string::npos) { - line_wo_comment = line; - } else { - line_wo_comment = line.substr(0, pos_first_comment_tag); - } - - boost::trim_left(line_wo_comment); - if (line_wo_comment.empty()) continue; - if (is_endof_entry(line_wo_comment)) break; - - str_cutoff.push_back(line_wo_comment); - } - - } - - int i, j, k; - int nkd = system->nkd; - int maxorder = interaction->maxorder; - int ikd, jkd; - int order; - std::vector cutoff_line; - std::set element_allowed; - std::vector str_pair; - std::map kd_map; - - double cutoff_tmp; - double ***rcs; - bool ***undefined_cutoff; - - memory->allocate(undefined_cutoff, maxorder, nkd, nkd); - - for (order = 0; order < maxorder; ++order) { - for (i = 0; i < nkd; ++i) { - for (j = 0; j < nkd; ++j) { - undefined_cutoff[order][i][j] = true; - } - } - } - - memory->allocate(rcs, maxorder, nkd, nkd); - - element_allowed.clear(); - - for (i = 0; i < nkd; ++i) { - element_allowed.insert(system->kdname[i]); - kd_map.insert(std::map::value_type(system->kdname[i], i)); - } - - element_allowed.insert("*"); - kd_map.insert(std::map::value_type("*", -1)); - - for (std::vector::const_iterator it = str_cutoff.begin(); - it != str_cutoff.end(); ++it) { - - split_str_by_space(*it, cutoff_line); - - if (cutoff_line.size() < maxorder + 1) { - error->exit("parse_cutoff_radii", - "Invalid format for &cutoff entry"); - } - - boost::split(str_pair, cutoff_line[0], boost::is_any_of("-")); - - if (str_pair.size() != 2) { - error->exit("parse_cutoff_radii2", - "Invalid format for &cutoff entry"); - } - - for (i = 0; i < 2; ++i) { - if (element_allowed.find(str_pair[i]) == element_allowed.end()) { - error->exit("parse_cutoff_radii2", - "Invalid format for &cutoff entry"); - } - } - - ikd = kd_map[str_pair[0]]; - jkd = kd_map[str_pair[1]]; - - for (order = 0; order < maxorder; ++order) { - // Accept any strings starting with 'N' or 'n' as 'None' - if ((cutoff_line[order + 1][0] == 'N') || (cutoff_line[order + 1][0] == 'n')) { - // Minus value for cutoff radius. - // This is a flag for neglecting cutoff radius - cutoff_tmp = -1.0; - } else { - cutoff_tmp = boost::lexical_cast(cutoff_line[order + 1]); - } - - if (ikd == -1 && jkd == -1) { - for (i = 0; i < nkd; ++i) { - for (j = 0; j < nkd; ++j) { - rcs[order][i][j] = cutoff_tmp; - undefined_cutoff[order][i][j] = false; - } - } - } else if (ikd == -1) { - for (i = 0; i < nkd; ++i) { - rcs[order][i][jkd] = cutoff_tmp; - rcs[order][jkd][i] = cutoff_tmp; - undefined_cutoff[order][i][jkd] = false; - undefined_cutoff[order][jkd][i] = false; - } - } else if (jkd == -1) { - for (j = 0; j < nkd; ++j) { - rcs[order][j][ikd] = cutoff_tmp; - rcs[order][ikd][j] = cutoff_tmp; - undefined_cutoff[order][j][ikd] = false; - undefined_cutoff[order][ikd][j] = false; - } - } else { - rcs[order][ikd][jkd] = cutoff_tmp; - rcs[order][jkd][ikd] = cutoff_tmp; - undefined_cutoff[order][ikd][jkd] = false; - undefined_cutoff[order][jkd][ikd] = false; - } - } - } - element_allowed.clear(); - str_cutoff.clear(); - - for (order = 0; order < maxorder; ++order) { - for (j = 0; j < nkd; ++j) { - for (k = 0; k < nkd; ++k) { - if (undefined_cutoff[order][j][k]) { - std::cout << " Cutoff radius for " << std::setw(3) - << order + 2 << "th-order terms" << std::endl; - std::cout << " are not defined between elements " << std::setw(3) << j + 1 - << " and " << std::setw(3) << k + 1 << std::endl; - error->exit("parse_cutoff_radii", "Incomplete cutoff radii"); - } - } - } - } - memory->deallocate(undefined_cutoff); - - memory->allocate(interaction->rcs, maxorder, nkd, nkd); - - for (i = 0; i < maxorder; ++i) { - for (j = 0; j < nkd; ++j) { - for (k = 0; k < nkd; ++k) { - interaction->rcs[i][j][k] = rcs[i][j][k]; - } - } - } - - memory->deallocate(rcs); -} - -void Input::parse_fitting_vars() -{ - int ndata, nstart, nend, nskip, nboot; - std::string dfile, ffile; - int multiply_data, constraint_flag; - std::string rotation_axis; - std::string fc2_file, fc3_file; - - std::string str_allowed_list = "NDATA NSTART NEND NSKIP NBOOT DFILE FFILE MULTDAT ICONST ROTAXIS FC2XML FC3XML"; - std::string str_no_defaults = "NDATA DFILE FFILE"; - std::vector no_defaults; - - std::map fitting_var_dict; - - bool fix_harmonic, fix_cubic; - - if (from_stdin) { - std::cin.ignore(); - } else { - ifs_input.ignore(); - } - - get_var_dict(str_allowed_list, fitting_var_dict); - - boost::split(no_defaults, str_no_defaults, boost::is_space()); - - for (std::vector::iterator it = no_defaults.begin(); - it != no_defaults.end(); ++it) { - if (fitting_var_dict.find(*it) == fitting_var_dict.end()) { - error->exit("parse_fitting_vars", - "The following variable is not found in &fitting input region: ", - (*it).c_str()); - } - } - - assign_val(ndata, "NDATA", fitting_var_dict); - - if (fitting_var_dict["NSTART"].empty()) { - nstart = 1; - } else { - assign_val(nstart, "NSTART", fitting_var_dict); - } - if (fitting_var_dict["NEND"].empty()) { - nend = ndata; - } else { - assign_val(nend, "NEND", fitting_var_dict); - } - if (fitting_var_dict["NSKIP"].empty()) { - nskip = 0; - } else { - assign_val(nskip, "NSKIP", fitting_var_dict); - } - - if (ndata <= 0 || nstart <= 0 || nend <= 0 - || nstart > ndata || nend > ndata || nstart > nend) { - error->exit("parce_fitting_vars", - "ndata, nstart, nend are not consistent with each other"); - } - - if (nskip < -1) - error->exit("parce_fitting_vars", - "nskip has to be larger than -2."); - if (nskip == -1) { - - if (fitting_var_dict["NBOOT"].empty()) { - error->exit("parse_fitting_vars", - "NBOOT has to be given when NSKIP=-1"); - } else { - assign_val(nboot, "NBOOT", fitting_var_dict); - } - - if (nboot <= 0) - error->exit("parce_input", - "nboot has to be a positive integer"); - } else { - nboot = 0; - } - - dfile = fitting_var_dict["DFILE"]; - ffile = fitting_var_dict["FFILE"]; - - - if (fitting_var_dict["MULTDAT"].empty()) { - multiply_data = 1; - } else { - assign_val(multiply_data, "MULTDAT", fitting_var_dict); - } - - if (fitting_var_dict["ICONST"].empty()) { - constraint_flag = 1; - } else { - assign_val(constraint_flag, "ICONST", fitting_var_dict); - } - - fc2_file = fitting_var_dict["FC2XML"]; - if (fc2_file.empty()) { - fix_harmonic = false; - } else { - fix_harmonic = true; - } - - fc3_file = fitting_var_dict["FC3XML"]; - if (fc3_file.empty()) { - fix_cubic = false; - } else { - fix_cubic = true; - } - - if (constraint_flag % 10 >= 2) { - rotation_axis = fitting_var_dict["ROTAXIS"]; - if (rotation_axis.empty()) { - error->exit("parse_fitting_vars", - "ROTAXIS has to be given when ICONST=2 or 3"); - } - } - - system->ndata = ndata; - system->nstart = nstart; - system->nend = nend; - system->nskip = nskip; - - fitting->nboot = nboot; - files->file_disp = dfile; - files->file_force = ffile; - symmetry->multiply_data = multiply_data; - constraint->constraint_mode = constraint_flag; - constraint->rotation_axis = rotation_axis; - constraint->fc2_file = fc2_file; - constraint->fix_harmonic = fix_harmonic; - constraint->fc3_file = fc3_file; - constraint->fix_cubic = fix_cubic; - - fitting_var_dict.clear(); -} - -void Input::parse_atomic_positions() -{ - int i, j; - std::string line, line_wo_comment; - std::string str_tmp; - std::string::size_type pos_first_comment_tag; - std::vector str_v, pos_line; - double **xeq; - int *kd; - - int nat = system->nat; - - if (from_stdin) { - std::cin.ignore(); - } else { - ifs_input.ignore(); - } - - str_v.clear(); - - if (from_stdin) { - - while (std::getline(std::cin, line)) { - - pos_first_comment_tag = line.find_first_of('#'); - - if (pos_first_comment_tag == std::string::npos) { - line_wo_comment = line; - } else { - line_wo_comment = line.substr(0, pos_first_comment_tag); - } - - boost::trim_if(line_wo_comment, boost::is_any_of("\t\n\r ")); - // boost::trim_left(line_wo_comment); - if (line_wo_comment.empty()) continue; - if (is_endof_entry(line_wo_comment)) break; - - str_v.push_back(line_wo_comment); - } - - } else { - - while (std::getline(ifs_input, line)) { - - pos_first_comment_tag = line.find_first_of('#'); - - if (pos_first_comment_tag == std::string::npos) { - line_wo_comment = line; - } else { - line_wo_comment = line.substr(0, pos_first_comment_tag); - } - - boost::trim_if(line_wo_comment, boost::is_any_of("\t\n\r ")); - // boost::trim_left(line_wo_comment); - if (line_wo_comment.empty()) continue; - if (is_endof_entry(line_wo_comment)) break; - - str_v.push_back(line_wo_comment); - } - } - - - if (str_v.size() != nat) { - error->exit("parse_atomic_positions", - "The number of entries for atomic positions should be NAT"); - } - - memory->allocate(xeq, nat, 3); - memory->allocate(kd, nat); - - - for (i = 0; i < nat; ++i) { - - split_str_by_space(str_v[i], pos_line); - - if (pos_line.size() == 4) { - try { - kd[i] = boost::lexical_cast(pos_line[0]); - } - catch (std::exception &e) { - std::cout << e.what() << std::endl; - error->exit("parse_atomic_positions", - "Invalid entry for the &position field at line ", - i + 1); - } - - for (j = 0; j < 3; ++j) { - xeq[i][j] = boost::lexical_cast(pos_line[j + 1]); - } - - } else { - error->exit("parse_atomic_positions", - "Bad format for &position region"); - } - } - - - memory->allocate(system->xcoord, nat, 3); - memory->allocate(system->kd, nat); - - for (i = 0; i < nat; ++i) { - - system->kd[i] = kd[i]; - - for (j = 0; j < 3; ++j) { - system->xcoord[i][j] = xeq[i][j]; - } - } - - memory->deallocate(xeq); - memory->deallocate(kd); - pos_line.clear(); - str_v.clear(); -} - -void Input::get_var_dict(const std::string keywords, - std::map &var_dict) -{ - std::string line, key, val; - std::string line_wo_comment; - std::string::size_type pos_first_comment_tag; - std::vector str_entry, str_varval; - - std::set keyword_set; - - boost::split(keyword_set, keywords, boost::is_space()); - - var_dict.clear(); - - if (from_stdin) { - while (std::getline(std::cin, line)) { - - // Ignore comment region - pos_first_comment_tag = line.find_first_of('#'); - - if (pos_first_comment_tag == std::string::npos) { - line_wo_comment = line; - } else { - line_wo_comment = line.substr(0, pos_first_comment_tag); - } - - boost::trim_left(line_wo_comment); - if (line_wo_comment.empty()) continue; - if (is_endof_entry(line_wo_comment)) break; - - // std::cout << line_wo_comment << std::endl; - - // Split the input line by ';' - - boost::split(str_entry, line_wo_comment, boost::is_any_of(";")); - - for (std::vector::iterator it = str_entry.begin(); - it != str_entry.end(); ++it) { - - // Split the input entry by '=' - - std::string str_tmp = boost::trim_copy(*it); - - if (!str_tmp.empty()) { - - boost::split(str_varval, str_tmp, boost::is_any_of("=")); - - if (str_varval.size() != 2) { - error->exit("get_var_dict", "Unacceptable format"); - } - - key = boost::to_upper_copy(boost::trim_copy(str_varval[0])); - val = boost::trim_copy(str_varval[1]); - - if (keyword_set.find(key) == keyword_set.end()) { - std::cout << "Could not recognize the variable " << key << std::endl; - error->exit("get_var_dict", "Invalid variable found"); - } - - if (var_dict.find(key) != var_dict.end()) { - std::cout << "Variable " << key << " appears twice in the input file." << std::endl; - error->exit("get_var_dict", "Redundant input parameter"); - } - - // If everything is OK, add the variable and the corresponding value - // to the dictionary. - - var_dict.insert(std::map::value_type(key, val)); - } - } - } - - } else { - - while (std::getline(ifs_input, line)) { - - // Ignore comment region - pos_first_comment_tag = line.find_first_of('#'); - - if (pos_first_comment_tag == std::string::npos) { - line_wo_comment = line; - } else { - line_wo_comment = line.substr(0, pos_first_comment_tag); - } - - boost::trim_left(line_wo_comment); - if (line_wo_comment.empty()) continue; - if (is_endof_entry(line_wo_comment)) break; - - // Split the input line by ';' - - boost::split(str_entry, line_wo_comment, boost::is_any_of(";")); - - for (std::vector::iterator it = str_entry.begin(); - it != str_entry.end(); ++it) { - - // Split the input entry by '=' - - std::string str_tmp = boost::trim_copy(*it); - - if (!str_tmp.empty()) { - - boost::split(str_varval, str_tmp, boost::is_any_of("=")); - - if (str_varval.size() != 2) { - error->exit("get_var_dict", "Unacceptable format"); - } - - key = boost::to_upper_copy(boost::trim_copy(str_varval[0])); - val = boost::trim_copy(str_varval[1]); - - if (keyword_set.find(key) == keyword_set.end()) { - std::cout << "Could not recognize the variable " - << key << std::endl; - error->exit("get_var_dict", "Invalid variable found"); - } - - if (var_dict.find(key) != var_dict.end()) { - std::cout << "Variable " << key - << " appears twice in the input file." << std::endl; - error->exit("get_var_dict", "Redundant input parameter"); - } - - // If everything is OK, add the variable and the corresponding value - // to the dictionary. - - var_dict.insert(std::map::value_type(key, val)); - } - } - } - } - - keyword_set.clear(); -} - - -int Input::locate_tag(std::string key) -{ - int ret = 0; - std::string line; - - if (from_stdin) { - - std::cin.clear(); - std::cin.seekg(0, std::ios_base::beg); - - while (std::cin >> line) { - boost::to_lower(line); - if (line == key) { - ret = 1; - break; - } - } - return ret; - - } else { - - ifs_input.clear(); - ifs_input.seekg(0, std::ios_base::beg); - - while (ifs_input >> line) { - boost::to_lower(line); - if (line == key) { - ret = 1; - break; - } - } - return ret; - } -} - -bool Input::is_endof_entry(std::string str) -{ - if (str[0] == '/') { - return true; - } else { - return false; - } -} - -void Input::split_str_by_space(const std::string str, - std::vector &str_vec) -{ - std::string str_tmp; - std::istringstream is(str); - - str_vec.clear(); - - while (1) { - str_tmp.clear(); - is >> str_tmp; - if (str_tmp.empty()) { - break; - } - str_vec.push_back(str_tmp); - } - str_tmp.clear(); -} - -template -void Input::assign_val(T &val, - const std::string key, - std::map dict) -{ - // Assign a value to the variable "key" using the boost::lexica_cast. - - if (!dict[key].empty()) { - try { - val = boost::lexical_cast(dict[key]); - } - catch (std::exception &e) { - std::string str_tmp; - std::cout << e.what() << std::endl; - str_tmp = "Invalid entry for the " + key + " tag.\n"; - str_tmp += " Please check the input value."; - error->exit("assign_val", str_tmp.c_str()); - } - } -} diff --git a/alm/input.h b/alm/input.h deleted file mode 100644 index fb419921..00000000 --- a/alm/input.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - input.h - - Copyright (c) 2014, 2015, 2016 Terumasa Tadano - - This file is distributed under the terms of the MIT license. - Please see the file 'LICENCE.txt' in the root directory - or http://opensource.org/licenses/mit-license.php for information. -*/ - -#pragma once - -#include "pointers.h" -#include -#include -#include -#include - -namespace ALM_NS -{ - class Input: protected Pointers - { - public: - Input(class ALM *, int, char **); - ~Input(); - void parse_input(int, char **); - - std::string str_magmom; - - private: - std::ifstream ifs_input; - bool from_stdin; - - int locate_tag(std::string); - void split_str_by_space(const std::string, std::vector &); - void parse_general_vars(); - void parse_cell_parameter(); - void parse_interaction_vars(); - void parse_cutoff_radii(); - void parse_fitting_vars(); - void parse_atomic_positions(); - bool is_endof_entry(std::string); - void get_var_dict(const std::string, std::map &); - - template - void assign_val(T &, const std::string, std::map); - }; -} diff --git a/alm/input_parser.cpp b/alm/input_parser.cpp new file mode 100644 index 00000000..62d5b7c8 --- /dev/null +++ b/alm/input_parser.cpp @@ -0,0 +1,1550 @@ +/* + input_parser.cpp + + Copyright (c) 2014, 2015, 2016 Terumasa Tadano + + This file is distributed under the terms of the MIT license. + Please see the file 'LICENCE.txt' in the root directory + or http://opensource.org/licenses/mit-license.php for information. +*/ + +#include "input_parser.h" +#include "alm.h" +#include "error.h" +#include "files.h" +#include "optimize.h" +#include "input_setter.h" +#include "memory.h" +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ALM_NS; + +InputParser::InputParser() +{ + input_setter = new InputSetter(); +} + +InputParser::~InputParser() +{ + delete input_setter; +} + +void InputParser::run(ALM *alm, + const int narg, + const char *const *arg) +{ + if (narg == 1) { + + from_stdin = true; + + } else { + + from_stdin = false; + + ifs_input.open(arg[1], std::ios::in); + if (!ifs_input) { + std::cout << "No such file or directory: " << arg[1] << std::endl; + std::exit(EXIT_FAILURE); + } + } + + parse_input(alm); +} + + +void InputParser::parse_displacement_and_force_files(std::vector> &u, + std::vector> &f, + DispForceFile &datfile_in) const +{ + if (datfile_in.filename_second.empty()) { + parse_dfset(u, f, datfile_in); + + } else { + // When filename_second is not empty, displacement (u) and force (f) data will be + // read from different files given by DFILE and FFILE, respectively. + parse_dfile_and_ffile(u, f, datfile_in); + } +} + +void InputParser::parse_dfset(std::vector> &u, + std::vector> &f, + DispForceFile &datfile_in) const +{ + int nrequired; + + if (datfile_in.ndata == 0) { + nrequired = -1; + } else { + nrequired = 6 * nat * datfile_in.ndata; + } + + std::vector value_arr; + + // Read displacements from DFILE + std::string line; + double val; + auto nline_u = 0; + + // Open the target file and copy the data to 1D temporary vector + std::ifstream ifs_data; + ifs_data.open(datfile_in.filename.c_str(), std::ios::in); + if (!ifs_data) exit("openfiles", "cannot open DFSET file"); + auto reach_end = false; + while (std::getline(ifs_data >> std::ws, line)) { + if (line[0] != '#') { + + std::istringstream iss(line); + + while (iss >> val) { + value_arr.push_back(val); + ++nline_u; + + if (nline_u == nrequired) { + reach_end = true; + break; + } + } + } + + if (reach_end) break; + } + ifs_data.close(); + + // Check if the length of the vector is correct. + // Also, estimate ndata if it is not set. + const auto n_entries = value_arr.size(); + + if (nrequired == -1) { + if (n_entries % (6 * nat) == 0) { + datfile_in.ndata = n_entries / (6 * nat); + } else { + exit("parse_displacement_and_force_files", + "The number of lines in DFSET is indivisible by NAT"); + } + } else { + if (n_entries < nrequired) { + exit("parse_displacement_and_force_files", + "The number of lines in DFSET is too small for the given NDATA = ", + datfile_in.ndata); + } + } + + if (datfile_in.nstart == 0) datfile_in.nstart = 1; + if (datfile_in.nend == 0) datfile_in.nend = datfile_in.ndata; + + // Copy the data into 2D array + const auto ndata_used = datfile_in.nend - datfile_in.nstart + + 1 - datfile_in.skip_e + datfile_in.skip_s; + + u.resize(ndata_used, std::vector(3 * nat)); + f.resize(ndata_used, std::vector(3 * nat)); + + auto idata = 0; + for (size_t i = 0; i < datfile_in.ndata; ++i) { + if (i < datfile_in.nstart - 1) continue; + if (i >= datfile_in.skip_s - 1 && i < datfile_in.skip_e - 1) continue; // When skip_s == skip_e, skip nothing. + if (i > datfile_in.nend - 1) break; + + for (auto j = 0; j < nat; ++j) { + for (auto k = 0; k < 3; ++k) { + u[idata][3 * j + k] = value_arr[6 * nat * i + 6 * j + k]; + f[idata][3 * j + k] = value_arr[6 * nat * i + 6 * j + k + 3]; + } + } + ++idata; + } + value_arr.clear(); +} + +void InputParser::parse_dfile_and_ffile(std::vector> &u, + std::vector> &f, + DispForceFile &datfile_in) const +{ + // This function is prepared to keep the backward compatibility (support DFILE and FFILE tags) + int nrequired; + + if (datfile_in.ndata == 0) { + nrequired = -1; + } else { + // Total number of data entries (displacement) + nrequired = 3 * nat * datfile_in.ndata; + } + + std::vector value_arr, value_arr2; + + // Read displacements from DFILE + std::string line; + double val; + auto nline_u = 0; + + // Open the target file and copy the data to 1D temporary vector + std::ifstream ifs_data; + ifs_data.open(datfile_in.filename.c_str(), std::ios::in); + if (!ifs_data) exit("openfiles", "cannot open DFILE file"); + auto reach_end = false; + while (std::getline(ifs_data >> std::ws, line)) { + if (line[0] != '#') { + + std::istringstream iss(line); + + while (iss >> val) { + value_arr.push_back(val); + ++nline_u; + + if (nline_u == nrequired) { + reach_end = true; + break; + } + } + } + + if (reach_end) break; + } + ifs_data.close(); + + auto nline_f = 0; + ifs_data.open(datfile_in.filename_second.c_str(), std::ios::in); + if (!ifs_data) exit("openfiles", "cannot open FFILE file"); + reach_end = false; + while (std::getline(ifs_data >> std::ws, line)) { + if (line[0] != '#') { + + std::istringstream iss(line); + + while (iss >> val) { + value_arr2.push_back(val); + ++nline_f; + + if (nline_f == nrequired) { + reach_end = true; + break; + } + } + } + + if (reach_end) break; + } + ifs_data.close(); + + // Check if the length of the vector is correct. + // Also, estimate ndata if it is not set. + auto n_entries = value_arr.size(); + const auto n_entries2 = value_arr2.size(); + + if (nrequired == -1 && (n_entries != n_entries2)) { + exit("parse_dfile_and_ffile", + "The number of lines in DFILE and FFILE are different."); + } + + n_entries = std::min(n_entries, n_entries2); + + if (nrequired == -1) { + if (n_entries % (3 * nat) == 0) { + datfile_in.ndata = n_entries / (3 * nat); + } else { + exit("parse_dfile_and_ffile", + "The number of lines in DFILE is indivisible by NAT"); + } + } else { + if (n_entries < nrequired) { + exit("parse_dfile_and_ffile", + "The number of lines in DFILE is too small for the given NDATA = ", + datfile_in.ndata); + } + } + + if (datfile_in.nstart == 0) datfile_in.nstart = 1; + if (datfile_in.nend == 0) datfile_in.nend = datfile_in.ndata; + + // Copy the data into 2D array + const auto ndata_used = datfile_in.nend - datfile_in.nstart + + 1 - datfile_in.skip_e + datfile_in.skip_s; + + u.resize(ndata_used, std::vector(3 * nat)); + f.resize(ndata_used, std::vector(3 * nat)); + + auto idata = 0; + for (size_t i = 0; i < datfile_in.ndata; ++i) { + if (i < datfile_in.nstart - 1) continue; + if (i >= datfile_in.skip_s - 1 && i < datfile_in.skip_e - 1) continue; // When skip_s == skip_e, skip nothing. + if (i > datfile_in.nend - 1) break; + + for (auto j = 0; j < nat; ++j) { + for (auto k = 0; k < 3; ++k) { + u[idata][3 * j + k] = value_arr[3 * nat * i + 3 * j + k]; + f[idata][3 * j + k] = value_arr2[3 * nat * i + 3 * j + k]; + } + } + ++idata; + } + value_arr.clear(); + value_arr2.clear(); +} + +void InputParser::parse_input(ALM *alm) +{ + // The order of calling methods in this method is important. + // Since following methods rely on variables those already + // parsed. + // Those below are set as the private class variables. See input_parser.h. + // std::string *kdname; + // std::string mode; + // int maxorder; + // int nat; + // int nkd; + + if (!locate_tag("&general")) { + exit("parse_input", + "&general entry not found in the input file"); + } + + // kdname is allocated in this method. + parse_general_vars(alm); + + if (!locate_tag("&cell")) { + exit("parse_input", + "&cell entry not found in the input file"); + } + parse_cell_parameter(); + + if (!locate_tag("&position")) { + exit("parse_input", + "&position entry not found in the input file"); + } + parse_atomic_positions(); + input_setter->set_geometric_structure(alm); + + if (!locate_tag("&interaction")) { + exit("parse_input", + "&interaction entry not found in the input file"); + } + parse_interaction_vars(); + + if (!locate_tag("&cutoff")) { + exit("parse_input", + "&cutoff entry not found in the input file"); + } + parse_cutoff_radii(); + input_setter->define(alm); + + if (mode == "optimize") { + if (!locate_tag("&optimize")) { + if (!locate_tag("&fitting")) { + exit("parse_input", + "&optimize entry not found in the input file"); + } else { + warn("parse_input", + "&fitting field is deprecated and will be removed in the next version.\n" + " Please use &optimize instead.\n"); + } + } + parse_optimize_vars(alm); + } + + deallocate(kdname); +} + +void InputParser::parse_general_vars(ALM *alm) +{ + size_t i; + std::string str_tmp, str_disp_basis; + int printsymmetry, is_periodic[3]; + size_t icount, ncount; + auto trim_dispsign_for_evenfunc = true; + bool print_hessian; + int noncollinear, trevsym; + double **magmom, magmag{0.0}; + double tolerance; + double tolerance_constraint; + int verbosity; + + std::vector kdname_v, periodic_v, magmom_v, str_split; + const std::vector input_list{ + "PREFIX", "MODE", "NAT", "NKD", "KD", "PERIODIC", "PRINTSYM", "TOLERANCE", + "DBASIS", "TRIMEVEN", "VERBOSITY", + "MAGMOM", "NONCOLLINEAR", "TREVSYM", "HESSIAN", "TOL_CONST" + }; + std::vector no_defaults{"PREFIX", "MODE", "NAT", "NKD", "KD"}; + std::map general_var_dict; + + if (from_stdin) { + std::cin.ignore(); + } else { + ifs_input.ignore(); + } + + get_var_dict(input_list, general_var_dict); + + for (const auto &it : no_defaults) { + if (general_var_dict.find(it) == general_var_dict.end()) { + exit("parse_general_vars", + "The following variable is not found in &general input region: ", + it.c_str()); + } + } + + const auto prefix = general_var_dict["PREFIX"]; + mode = general_var_dict["MODE"]; + + std::transform(mode.begin(), mode.end(), mode.begin(), tolower); + if (mode != "fitting" && mode != "suggest" && mode != "lasso" && mode != "optimize" && mode != "opt") { + exit("parse_general_vars", "Invalid MODE variable"); + } + if (mode == "fitting") { + mode = "optimize"; + warn("parse_general_vars", + "MODE = fitting is deprecated and will be removed in the next version.\n" + " Please use MODE = optimize instead.\n"); + } + if (mode == "lasso") { + mode = "optimize"; + warn("parse_general_vars", + "MODE = lasso is deprecated and will be removed in the next version.\n" + " Please use MODE = optimize instead with LMODEL = enet option in the &optimize field.\n"); + } + if (mode == "opt") mode = "optimize"; + + assign_val(nat, "NAT", general_var_dict); + assign_val(nkd, "NKD", general_var_dict); + + if (general_var_dict["VERBOSITY"].empty()) { + verbosity = 1; + } else { + assign_val(verbosity, "VERBOSITY", general_var_dict); + } + + if (general_var_dict["PRINTSYM"].empty()) { + printsymmetry = 0; + } else { + assign_val(printsymmetry, "PRINTSYM", general_var_dict); + } + + split_str_by_space(general_var_dict["KD"], kdname_v); + + if (kdname_v.size() != nkd) { + exit("parse_general_vars", + "The number of entries for KD is inconsistent with NKD"); + } else { + allocate(kdname, nkd); + for (i = 0; i < nkd; ++i) { + kdname[i] = kdname_v[i]; + } + } + + split_str_by_space(general_var_dict["PERIODIC"], periodic_v); + + if (periodic_v.empty()) { + for (i = 0; i < 3; ++i) { + is_periodic[i] = 1; + } + } else if (periodic_v.size() == 3) { + for (i = 0; i < 3; ++i) { + try { + is_periodic[i] = boost::lexical_cast(periodic_v[i]); + } + catch (std::exception &e) { + std::cout << e.what() << std::endl; + exit("parse_general_vars", + "The PERIODIC tag must be a set of integers."); + } + } + } else { + exit("parse_general_vars", + "Invalid number of entries for PERIODIC"); + } + + if (general_var_dict["TOLERANCE"].empty()) { + tolerance = 1.0e-6; + } else { + assign_val(tolerance, "TOLERANCE", general_var_dict); + } + if (general_var_dict["TOL_CONST"].empty()) { + tolerance_constraint = 1.0e-6; + } else { + assign_val(tolerance_constraint, "TOL_CONST", general_var_dict); + } + + // Convert MAGMOM input to array + allocate(magmom, nat, 3); + auto lspin = false; + + for (i = 0; i < nat; ++i) { + for (size_t j = 0; j < 3; ++j) { + magmom[i][j] = 0.0; + } + } + + if (general_var_dict["NONCOLLINEAR"].empty()) { + noncollinear = 0; + } else { + assign_val(noncollinear, "NONCOLLINEAR", general_var_dict); + } + if (general_var_dict["TREVSYM"].empty()) { + trevsym = 1; + } else { + assign_val(trevsym, "TREVSYM", general_var_dict); + } + if (general_var_dict["HESSIAN"].empty()) { + print_hessian = false; + } else { + assign_val(print_hessian, "HESSIAN", general_var_dict); + } + + if (!general_var_dict["MAGMOM"].empty()) { + lspin = true; + + if (noncollinear) { + icount = 0; + split_str_by_space(general_var_dict["MAGMOM"], magmom_v); + for (std::vector::const_iterator it = magmom_v.begin(); + it != magmom_v.end(); ++it) { + if ((*it).find('*') != std::string::npos) { + exit("parse_general_vars", + "Wild card '*' is not supported when NONCOLLINEAR = 1."); + } else { + magmag = boost::lexical_cast((*it)); + if (icount / 3 >= nat) { + exit("parse_general_vars", "Too many entries for MAGMOM."); + } + magmom[icount / 3][icount % 3] = magmag; + ++icount; + } + } + + if (icount != 3 * nat) { + exit("parse_general_vars", + "Number of entries for MAGMOM must be 3*NAT when NONCOLLINEAR = 1."); + } + } else { + icount = 0; + split_str_by_space(general_var_dict["MAGMOM"], magmom_v); + for (std::vector::const_iterator it = magmom_v.begin(); + it != magmom_v.end(); ++it) { + + if ((*it).find('*') != std::string::npos) { + if ((*it) == "*") { + exit("parse_general_vars", + "Please place '*' without space for the MAGMOM-tag."); + } + boost::split(str_split, (*it), boost::is_any_of("*")); + if (str_split.size() != 2) { + exit("parse_general_vars", + "Invalid format for the MAGMOM-tag."); + } else { + if (str_split[0].empty() || str_split[1].empty()) { + exit("parse_general_vars", + "Please place '*' without space for the MAGMOM-tag."); + } + ncount = 0; + try { + magmag = boost::lexical_cast(str_split[1]); + ncount = static_cast(boost::lexical_cast(str_split[0])); + } + catch (std::exception) { + exit("parse_general_vars", "Bad format for MAGMOM."); + } + + for (i = icount; i < icount + ncount; ++i) { + magmom[i][2] = magmag; + } + icount += ncount; + } + + } else { + magmag = boost::lexical_cast((*it)); + if (icount == nat) { + icount = 0; + break; + } + magmom[icount++][2] = magmag; + } + } + if (icount != nat) { + exit("parse_general_vars", + "Number of entries for MAGMOM must be NAT."); + } + } + } + + if (mode == "suggest") { + if (general_var_dict["DBASIS"].empty()) { + str_disp_basis = "Cart"; + } else { + str_disp_basis = general_var_dict["DBASIS"]; + } + std::transform(str_disp_basis.begin(), str_disp_basis.end(), + str_disp_basis.begin(), toupper); + if ((str_disp_basis[0] != 'C') && (str_disp_basis[0] != 'F')) { + exit("parse_general_vars", "Invalid DBASIS"); + } + + if (!general_var_dict["TRIMEVEN"].empty()) { + assign_val(trim_dispsign_for_evenfunc, + "TRIMEVEN", general_var_dict); + } + + } + + input_setter->set_general_vars(alm, + prefix, + mode, + verbosity, + str_disp_basis, + general_var_dict["MAGMOM"], + nat, + nkd, + printsymmetry, + is_periodic, + trim_dispsign_for_evenfunc, + lspin, + print_hessian, + noncollinear, + trevsym, + kdname, + magmom, + tolerance, + tolerance_constraint); + allocate(magmom, nat, 3); + + kdname_v.clear(); + periodic_v.clear(); + no_defaults.clear(); + general_var_dict.clear(); +} + +void InputParser::parse_cell_parameter() +{ + auto a = 0.0; + double lavec_tmp[3][3]; + std::string line; + std::string line_wo_comment, line_tmp; + std::vector line_vec, line_split; + std::string::size_type pos_first_comment_tag; + + line_vec.clear(); + + if (from_stdin) { + + while (std::getline(std::cin, line)) { + + // Ignore comment region + pos_first_comment_tag = line.find_first_of('#'); + + if (pos_first_comment_tag == std::string::npos) { + line_wo_comment = line; + } else { + line_wo_comment = line.substr(0, pos_first_comment_tag); + } + + boost::trim_if(line_wo_comment, boost::is_any_of("\t\n\r ")); + + if (line_wo_comment.empty()) continue; + if (is_endof_entry(line_wo_comment)) break; + + line_vec.push_back(line_wo_comment); + } + + } else { + while (std::getline(ifs_input, line)) { + + // Ignore comment region + pos_first_comment_tag = line.find_first_of('#'); + + if (pos_first_comment_tag == std::string::npos) { + line_wo_comment = line; + } else { + line_wo_comment = line.substr(0, pos_first_comment_tag); + } + + boost::trim_if(line_wo_comment, boost::is_any_of("\t\n\r ")); + + if (line_wo_comment.empty()) continue; + if (is_endof_entry(line_wo_comment)) break; + + line_vec.push_back(line_wo_comment); + } + } + + if (line_vec.size() != 4) { + exit("parse_cell_parameter", + "Too few or too much lines for the &cell field.\n \ + The number of valid lines for the &cell field should be 4."); + } + + for (auto i = 0; i < 4; ++i) { + + line = line_vec[i]; + boost::split(line_split, line, boost::is_any_of("\t "), boost::token_compress_on); + + if (i == 0) { + // Lattice factor a + if (line_split.size() == 1) { + a = boost::lexical_cast(line_split[0]); + } else { + exit("parse_cell_parameter", + "Unacceptable format for &cell field."); + } + + } else { + // Lattice vectors a1, a2, a3 + if (line_split.size() == 3) { + for (auto j = 0; j < 3; ++j) { + lavec_tmp[j][i - 1] = boost::lexical_cast(line_split[j]); + } + } else { + exit("parse_cell_parameter", + "Unacceptable format for &cell field."); + } + } + } + + input_setter->set_cell_parameter(a, lavec_tmp); +} + + +void InputParser::parse_interaction_vars() +{ + int i; + int *nbody_include; + + std::vector nbody_v; + const std::vector input_list{"NORDER", "NBODY"}; + std::vector no_defaults{"NORDER"}; + std::map interaction_var_dict; + + + if (from_stdin) { + std::cin.ignore(); + } else { + ifs_input.ignore(); + } + + get_var_dict(input_list, interaction_var_dict); + + for (const auto &it : no_defaults) { + if (interaction_var_dict.find(it) == interaction_var_dict.end()) { + exit("parse_interaction_vars", + "The following variable is not found in &interaction input region: ", + it.c_str()); + } + } + + assign_val(maxorder, "NORDER", interaction_var_dict); + if (maxorder < 1) + exit("parse_interaction_vars", + "maxorder has to be a positive integer"); + + allocate(nbody_include, maxorder); + + boost::split(nbody_v, interaction_var_dict["NBODY"], boost::is_space()); + + if (nbody_v[0].empty()) { + for (i = 0; i < maxorder; ++i) { + nbody_include[i] = i + 2; + } + } else if (nbody_v.size() == static_cast(maxorder)) { + for (i = 0; i < maxorder; ++i) { + try { + nbody_include[i] = boost::lexical_cast(nbody_v[i]); + } + catch (std::exception &e) { + std::cout << e.what() << std::endl; + exit("parse_interaction_vars", + "NBODY must be an integer."); + } + } + } else { + exit("parse_interaction_vars", + "The number of entry of NBODY has to be equal to NORDER"); + } + + if (nbody_include[0] != 2) { + warn("parce_input", + "Harmonic interaction is always 2 body (except on-site 1 body)"); + } + + input_setter->set_interaction_vars(maxorder, nbody_include); + + deallocate(nbody_include); + + nbody_v.clear(); + no_defaults.clear(); +} + + +void InputParser::parse_optimize_vars(ALM *alm) +{ + // This method must not be called before setting NAT by parse_general_vars. + + int constraint_flag; + auto flag_sparse = 0; + std::string rotation_axis; + + OptimizerControl optcontrol; + std::vector> u_tmp1, f_tmp1; + std::vector> u_tmp2, f_tmp2; + + const std::vector input_list{ + "LMODEL", "SPARSE", "SPARSESOLVER", + "ICONST", "ROTAXIS", "FC2XML", "FC3XML", + "NDATA", "NSTART", "NEND", "SKIP", "DFILE", "FFILE", "DFSET", + "NDATA_CV", "NSTART_CV", "NEND_CV", "DFSET_CV", + "L1_RATIO", "STANDARDIZE", "ENET_DNORM", + "L1_ALPHA", "CV_MAXALPHA", "CV_MINALPHA", "CV_NALPHA", + "CV", "MAXITER", "CONV_TOL", "NWRITE", "SOLUTION_PATH", "DEBIAS_OLS" + }; + + std::map optimize_var_dict; + + if (from_stdin) { + std::cin.ignore(); + } else { + ifs_input.ignore(); + } + + get_var_dict(input_list, optimize_var_dict); + + if (!optimize_var_dict["LMODEL"].empty()) { + auto str_LMODEL = optimize_var_dict["LMODEL"]; + boost::to_lower(str_LMODEL); + + if (str_LMODEL == "ols" || str_LMODEL == "ls" + || str_LMODEL == "least-squares" || str_LMODEL == "1") { + optcontrol.linear_model = 1; + } else if (str_LMODEL == "enet" || str_LMODEL == "elastic-net" + || str_LMODEL == "2") { + optcontrol.linear_model = 2; + } else { + exit("parse_optimize_vars", "Invalid OPTIMIZER-tag"); + } + } + + if (!optimize_var_dict["SPARSE"].empty()) { + assign_val(flag_sparse, "SPARSE", optimize_var_dict); + optcontrol.use_sparse_solver = flag_sparse; + } + if (!optimize_var_dict["SPARSESOLVER"].empty()) { + std::string str_sparsesolver; + assign_val(str_sparsesolver, "SPARSESOLVER", optimize_var_dict); + const auto str_lower = boost::algorithm::to_lower_copy(str_sparsesolver); + + if (str_lower != "simplicialldlt" + && str_lower != "sparseqr" + && str_lower != "conjugategradient" + && str_lower != "leastsquaresconjugategradient" + && str_lower != "bicgstab") { + exit("parse_optimize_vars", "Unsupported SPARSESOLVER :", str_sparsesolver.c_str()); + } + optcontrol.sparsesolver = str_sparsesolver; + } + + if (!optimize_var_dict["ENET_DNORM"].empty()) { + optcontrol.displacement_normalization_factor + = boost::lexical_cast(optimize_var_dict["ENET_DNORM"]); + } + if (!optimize_var_dict["L1_ALPHA"].empty()) { + optcontrol.l1_alpha = boost::lexical_cast(optimize_var_dict["L1_ALPHA"]); + } + if (!optimize_var_dict["CV_MINALPHA"].empty()) { + optcontrol.l1_alpha_min = boost::lexical_cast(optimize_var_dict["CV_MINALPHA"]); + } + if (!optimize_var_dict["CV_MAXALPHA"].empty()) { + optcontrol.l1_alpha_max = boost::lexical_cast(optimize_var_dict["CV_MAXALPHA"]); + } + if (!optimize_var_dict["CV_NALPHA"].empty()) { + optcontrol.num_l1_alpha = boost::lexical_cast(optimize_var_dict["CV_NALPHA"]); + } + if (!optimize_var_dict["CONV_TOL"].empty()) { + optcontrol.tolerance_iteration = boost::lexical_cast(optimize_var_dict["CONV_TOL"]); + } + if (!optimize_var_dict["MAXITER"].empty()) { + optcontrol.maxnum_iteration = boost::lexical_cast(optimize_var_dict["MAXITER"]); + } + if (!optimize_var_dict["CV"].empty()) { + optcontrol.cross_validation = boost::lexical_cast(optimize_var_dict["CV"]); + if (optcontrol.cross_validation == 1) { + exit("parse_optimize_vars", "CV must not be 1."); + } + } + if (!optimize_var_dict["NWRITE"].empty()) { + optcontrol.output_frequency = boost::lexical_cast(optimize_var_dict["NWRITE"]); + } + if (!optimize_var_dict["STANDARDIZE"].empty()) { + optcontrol.standardize = boost::lexical_cast(optimize_var_dict["STANDARDIZE"]); + } + if (!optimize_var_dict["SOLUTION_PATH"].empty()) { + optcontrol.save_solution_path = boost::lexical_cast(optimize_var_dict["SOLUTION_PATH"]); + } + if (!optimize_var_dict["DEBIAS_OLS"].empty()) { + optcontrol.debiase_after_l1opt = boost::lexical_cast(optimize_var_dict["DEBIAS_OLS"]); + } + if (!optimize_var_dict["L1_RATIO"].empty()) { + optcontrol.l1_ratio = boost::lexical_cast(optimize_var_dict["L1_RATIO"]); + } + + + DispForceFile datfile_train; + + if (optimize_var_dict["DFSET"].empty()) { + if (!optimize_var_dict["DFILE"].empty() && !optimize_var_dict["FFILE"].empty()) { + std::cout << " DFILE and FFILE tags are obsolate and will be removed in the next version.\n"; + std::cout << " Please use DFSET instead.\n"; + std::cout << " DFSET can be created easily by the unix paste command as:\n\n"; + std::cout << " $ paste DFILE FFILE > DFSET\n\n"; + // exit("parse_optimize_vars", "Obsolate tag: DFILE, FFILE"); + datfile_train.filename = optimize_var_dict["DFILE"]; + datfile_train.filename_second = optimize_var_dict["FFILE"]; + } else { + exit("parse_optimize_vars", + "DFSET tag (or both DFILE and FFILE tags) must be given."); + } + } else { + datfile_train.filename = optimize_var_dict["DFSET"]; + } + + if (!optimize_var_dict["NDATA"].empty()) { + assign_val(datfile_train.ndata, "NDATA", optimize_var_dict); + } + if (!optimize_var_dict["NSTART"].empty()) { + assign_val(datfile_train.nstart, "NSTART", optimize_var_dict); + } + if (!optimize_var_dict["NEND"].empty()) { + assign_val(datfile_train.nend, "NEND", optimize_var_dict); + } + + if (!optimize_var_dict["SKIP"].empty()) { + std::vector str_entry; + std::string str_skip; + assign_val(str_skip, "SKIP", optimize_var_dict); + boost::split(str_entry, str_skip, boost::is_any_of("-")); + if (str_entry.size() == 1) { + datfile_train.skip_s = boost::lexical_cast(str_entry[0]); + datfile_train.skip_e = datfile_train.skip_s + 1; + } else if (str_entry.size() == 2) { + datfile_train.skip_s = boost::lexical_cast(str_entry[0]); + datfile_train.skip_e = boost::lexical_cast(str_entry[1]) + 1; + } else { + exit("parse_optimize_vars", "Invalid format for the SKIP-tag."); + } + } + + if (!is_data_range_consistent(datfile_train)) { + exit("parse_optimize_vars", + "NDATA, NSTART, NEND and SKIP tags are inconsistent."); + } + + // Parse u_tmp1 and f_tmp1 from DFSET and set ndata if it's not. + parse_displacement_and_force_files(u_tmp1, + f_tmp1, + datfile_train); + + // Check consistency again + if (!is_data_range_consistent(datfile_train)) { + exit("parse_optimize_vars", + "NDATA, NSTART, NEND and SKIP tags are inconsistent."); + } + + auto datfile_validation = datfile_train; + datfile_validation.skip_s = 0; + datfile_validation.skip_e = 0; + + if (!optimize_var_dict["NDATA_CV"].empty()) { + datfile_validation.ndata = boost::lexical_cast(optimize_var_dict["NDATA_CV"]); + } + + if (!optimize_var_dict["NSTART_CV"].empty()) { + datfile_validation.nstart = boost::lexical_cast(optimize_var_dict["NSTART_CV"]); + } + if (!optimize_var_dict["NEND_CV"].empty()) { + datfile_validation.nend = boost::lexical_cast(optimize_var_dict["NEND_CV"]); + } + + if (!optimize_var_dict["DFSET_CV"].empty()) { + datfile_validation.filename = optimize_var_dict["DFSET_CV"]; + } + + if (!is_data_range_consistent(datfile_validation)) { + exit("parse_optimize_vars", + "NDATA_CV, NSTART_CV and NEND_CV tags are inconsistent."); + } + + if (optcontrol.cross_validation == -1) { + parse_displacement_and_force_files(u_tmp2, + f_tmp2, + datfile_validation); + + if (!is_data_range_consistent(datfile_validation)) { + exit("parse_optimize_vars", + "NDATA_CV, NSTART_CV and NEND_CV tags are inconsistent."); + } + } + + + input_setter->set_optimize_vars(alm, + u_tmp1, f_tmp1, + u_tmp2, f_tmp2, + optcontrol); + + input_setter->set_file_vars(alm, + datfile_train, + datfile_validation); + + + if (optimize_var_dict["ICONST"].empty()) { + constraint_flag = 11; + } else { + assign_val(constraint_flag, "ICONST", optimize_var_dict); + } + + auto fc2_file = optimize_var_dict["FC2XML"]; + auto fc3_file = optimize_var_dict["FC3XML"]; + const auto fix_harmonic = !fc2_file.empty(); + const auto fix_cubic = !fc3_file.empty(); + + if (constraint_flag % 10 >= 2) { + rotation_axis = optimize_var_dict["ROTAXIS"]; + if (rotation_axis.empty()) { + exit("parse_optimize_vars", + "ROTAXIS has to be given when ICONST=2 or 3"); + } + } + + input_setter->set_constraint_vars(alm, + constraint_flag, + rotation_axis, + fc2_file, + fc3_file, + fix_harmonic, + fix_cubic); + + optimize_var_dict.clear(); +} + +void InputParser::parse_atomic_positions() +{ + std::string line, line_wo_comment; + std::string str_tmp; + std::string::size_type pos_first_comment_tag; + std::vector str_v, pos_line; + double (*xeq)[3]; + int *kd; + + if (from_stdin) { + std::cin.ignore(); + } else { + ifs_input.ignore(); + } + + str_v.clear(); + + if (from_stdin) { + + while (std::getline(std::cin, line)) { + + pos_first_comment_tag = line.find_first_of('#'); + + if (pos_first_comment_tag == std::string::npos) { + line_wo_comment = line; + } else { + line_wo_comment = line.substr(0, pos_first_comment_tag); + } + + boost::trim_if(line_wo_comment, boost::is_any_of("\t\n\r ")); + if (line_wo_comment.empty()) continue; + if (is_endof_entry(line_wo_comment)) break; + + str_v.push_back(line_wo_comment); + } + + } else { + + while (std::getline(ifs_input, line)) { + + pos_first_comment_tag = line.find_first_of('#'); + + if (pos_first_comment_tag == std::string::npos) { + line_wo_comment = line; + } else { + line_wo_comment = line.substr(0, pos_first_comment_tag); + } + + boost::trim_if(line_wo_comment, boost::is_any_of("\t\n\r ")); + if (line_wo_comment.empty()) continue; + if (is_endof_entry(line_wo_comment)) break; + + str_v.push_back(line_wo_comment); + } + } + + + if (str_v.size() != nat) { + exit("parse_atomic_positions", + "The number of entries for atomic positions should be NAT"); + } + + allocate(xeq, nat); + allocate(kd, nat); + + + for (size_t i = 0; i < nat; ++i) { + + split_str_by_space(str_v[i], pos_line); + + if (pos_line.size() == 4) { + try { + kd[i] = boost::lexical_cast(pos_line[0]); + } + catch (std::exception &e) { + std::cout << e.what() << std::endl; + exit("parse_atomic_positions", + "Invalid entry for the &position field at line ", + i + 1); + } + + for (auto j = 0; j < 3; ++j) { + xeq[i][j] = boost::lexical_cast(pos_line[j + 1]); + } + + } else { + exit("parse_atomic_positions", + "Bad format for &position region"); + } + } + + + input_setter->set_atomic_positions(nat, kd, xeq); + + deallocate(xeq); + deallocate(kd); + pos_line.clear(); + str_v.clear(); +} + +void InputParser::parse_cutoff_radii() +{ + std::string line, line_wo_comment; + std::string::size_type pos_first_comment_tag; + std::vector str_cutoff; + + if (from_stdin) { + std::cin.ignore(); + } else { + ifs_input.ignore(); + } + + str_cutoff.clear(); + + if (from_stdin) { + + while (std::getline(std::cin, line)) { + + pos_first_comment_tag = line.find_first_of('#'); + + if (pos_first_comment_tag == std::string::npos) { + line_wo_comment = line; + } else { + line_wo_comment = line.substr(0, pos_first_comment_tag); + } + + boost::trim_left(line_wo_comment); + if (line_wo_comment.empty()) continue; + if (is_endof_entry(line_wo_comment)) break; + + str_cutoff.push_back(line_wo_comment); + } + } else { + + while (std::getline(ifs_input, line)) { + + pos_first_comment_tag = line.find_first_of('#'); + + if (pos_first_comment_tag == std::string::npos) { + line_wo_comment = line; + } else { + line_wo_comment = line.substr(0, pos_first_comment_tag); + } + + boost::trim_left(line_wo_comment); + if (line_wo_comment.empty()) continue; + if (is_endof_entry(line_wo_comment)) break; + + str_cutoff.push_back(line_wo_comment); + } + + } + + size_t i, j, k; + int order; + std::vector cutoff_line; + std::set element_allowed; + std::vector str_pair; + std::map kd_map; + + double cutoff_tmp; + double ***cutoff_radii_tmp; + bool ***undefined_cutoff; + + allocate(undefined_cutoff, maxorder, nkd, nkd); + + for (order = 0; order < maxorder; ++order) { + for (i = 0; i < nkd; ++i) { + for (j = 0; j < nkd; ++j) { + undefined_cutoff[order][i][j] = true; + } + } + } + + allocate(cutoff_radii_tmp, maxorder, nkd, nkd); + + element_allowed.clear(); + + for (i = 0; i < nkd; ++i) { + element_allowed.insert(kdname[i]); + kd_map.insert(std::map::value_type(kdname[i], i)); + } + + element_allowed.insert("*"); + kd_map.insert(std::map::value_type("*", -1)); + + for (const auto &it : str_cutoff) { + + split_str_by_space(it, cutoff_line); + + if (cutoff_line.size() < maxorder + 1) { + exit("parse_cutoff_radii", + "Invalid format for &cutoff entry"); + } + + boost::split(str_pair, cutoff_line[0], boost::is_any_of("-")); + + if (str_pair.size() != 2) { + exit("parse_cutoff_radii2", + "Invalid format for &cutoff entry"); + } + + for (i = 0; i < 2; ++i) { + if (element_allowed.find(str_pair[i]) == element_allowed.end()) { + exit("parse_cutoff_radii2", + "Invalid format for &cutoff entry"); + } + } + + const auto ikd = kd_map[str_pair[0]]; + const auto jkd = kd_map[str_pair[1]]; + + for (order = 0; order < maxorder; ++order) { + // Accept any strings starting with 'N' or 'n' as 'None' + if ((cutoff_line[order + 1][0] == 'N') || (cutoff_line[order + 1][0] == 'n')) { + // Minus value for cutoff radius. + // This is a flag for neglecting cutoff radius + cutoff_tmp = -1.0; + } else { + cutoff_tmp = boost::lexical_cast(cutoff_line[order + 1]); + } + + if (ikd == -1 && jkd == -1) { + for (i = 0; i < nkd; ++i) { + for (j = 0; j < nkd; ++j) { + cutoff_radii_tmp[order][i][j] = cutoff_tmp; + undefined_cutoff[order][i][j] = false; + } + } + } else if (ikd == -1) { + for (i = 0; i < nkd; ++i) { + cutoff_radii_tmp[order][i][jkd] = cutoff_tmp; + cutoff_radii_tmp[order][jkd][i] = cutoff_tmp; + undefined_cutoff[order][i][jkd] = false; + undefined_cutoff[order][jkd][i] = false; + } + } else if (jkd == -1) { + for (j = 0; j < nkd; ++j) { + cutoff_radii_tmp[order][j][ikd] = cutoff_tmp; + cutoff_radii_tmp[order][ikd][j] = cutoff_tmp; + undefined_cutoff[order][j][ikd] = false; + undefined_cutoff[order][ikd][j] = false; + } + } else { + cutoff_radii_tmp[order][ikd][jkd] = cutoff_tmp; + cutoff_radii_tmp[order][jkd][ikd] = cutoff_tmp; + undefined_cutoff[order][ikd][jkd] = false; + undefined_cutoff[order][jkd][ikd] = false; + } + } + } + element_allowed.clear(); + str_cutoff.clear(); + + for (order = 0; order < maxorder; ++order) { + for (j = 0; j < nkd; ++j) { + for (k = 0; k < nkd; ++k) { + if (undefined_cutoff[order][j][k]) { + std::cout << " Cutoff radius for " << std::setw(3) + << order + 2 << "th-order terms" << std::endl; + std::cout << " are not defined between elements " << std::setw(3) << j + 1 + << " and " << std::setw(3) << k + 1 << std::endl; + exit("parse_cutoff_radii", "Incomplete cutoff radii"); + } + } + } + } + deallocate(undefined_cutoff); + + std::vector cutoff_information_flatten; + cutoff_information_flatten.resize(maxorder * nkd * nkd); + + i = 0; + for (order = 0; order < maxorder; ++order) { + for (j = 0; j < nkd; ++j) { + for (k = 0; k < nkd; ++k) { + cutoff_information_flatten[i++] = cutoff_radii_tmp[order][j][k]; + } + } + } + deallocate(cutoff_radii_tmp); + + input_setter->set_cutoff_radii(maxorder, + nkd, + cutoff_information_flatten); +} + +void InputParser::get_var_dict(const std::vector &input_list, + std::map &var_dict) +{ + std::string line, key, val; + std::string line_wo_comment; + std::string::size_type pos_first_comment_tag; + std::vector str_entry, str_varval; + + std::set keyword_set; + + for (const auto &it : input_list) { + keyword_set.insert(it); + } + + var_dict.clear(); + + if (from_stdin) { + while (std::getline(std::cin, line)) { + + // Ignore comment region + pos_first_comment_tag = line.find_first_of('#'); + + if (pos_first_comment_tag == std::string::npos) { + line_wo_comment = line; + } else { + line_wo_comment = line.substr(0, pos_first_comment_tag); + } + + boost::trim_left(line_wo_comment); + if (line_wo_comment.empty()) continue; + if (is_endof_entry(line_wo_comment)) break; + + // Split the input line by ';' + + boost::split(str_entry, line_wo_comment, boost::is_any_of(";")); + + for (auto &it : str_entry) { + + // Split the input entry by '=' + + auto str_tmp = boost::trim_copy(it); + + if (!str_tmp.empty()) { + + boost::split(str_varval, str_tmp, boost::is_any_of("=")); + + if (str_varval.size() != 2) { + exit("get_var_dict", "Unacceptable format"); + } + + key = boost::to_upper_copy(boost::trim_copy(str_varval[0])); + val = boost::trim_copy(str_varval[1]); + + if (keyword_set.find(key) == keyword_set.end()) { + std::cout << "Could not recognize the variable " << key << std::endl; + exit("get_var_dict", "Invalid variable found"); + } + + if (var_dict.find(key) != var_dict.end()) { + std::cout << "Variable " << key << " appears twice in the input file." << std::endl; + exit("get_var_dict", "Redundant input parameter"); + } + + // If everything is OK, add the variable and the corresponding value + // to the dictionary. + + var_dict.insert(std::map::value_type(key, val)); + } + } + } + + } else { + + while (std::getline(ifs_input, line)) { + + // Ignore comment region + pos_first_comment_tag = line.find_first_of('#'); + + if (pos_first_comment_tag == std::string::npos) { + line_wo_comment = line; + } else { + line_wo_comment = line.substr(0, pos_first_comment_tag); + } + + boost::trim_left(line_wo_comment); + if (line_wo_comment.empty()) continue; + if (is_endof_entry(line_wo_comment)) break; + + // Split the input line by ';' + + boost::split(str_entry, line_wo_comment, boost::is_any_of(";")); + + for (auto &it : str_entry) { + + // Split the input entry by '=' + + auto str_tmp = boost::trim_copy(it); + + if (!str_tmp.empty()) { + + boost::split(str_varval, str_tmp, boost::is_any_of("=")); + + if (str_varval.size() != 2) { + exit("get_var_dict", "Unacceptable format"); + } + + key = boost::to_upper_copy(boost::trim_copy(str_varval[0])); + val = boost::trim_copy(str_varval[1]); + + if (keyword_set.find(key) == keyword_set.end()) { + std::cout << "Could not recognize the variable " + << key << std::endl; + exit("get_var_dict", "Invalid variable found"); + } + + if (var_dict.find(key) != var_dict.end()) { + std::cout << "Variable " << key + << " appears twice in the input file." << std::endl; + exit("get_var_dict", "Redundant input parameter"); + } + + // If everything is OK, add the variable and the corresponding value + // to the dictionary. + + var_dict.insert(std::map::value_type(key, val)); + } + } + } + } + + keyword_set.clear(); +} + +bool InputParser::is_data_range_consistent(const DispForceFile &datfile_in) const +{ + const auto ndata = datfile_in.ndata; + const auto nstart = datfile_in.nstart; + const auto nend = datfile_in.nend; + const auto skip_s = datfile_in.skip_s; + const auto skip_e = datfile_in.skip_e; + + if (nstart > 0 && skip_s > 0 && skip_s < nstart) return false; + if (nend > 0 && skip_e > 0 && (skip_e - 1) > nend) return false; + if (nstart > 0 && nend > 0 && nstart > nend) return false; + if (skip_s > 0 && skip_e > 0 && skip_s >= skip_e) return false; + + if (ndata > 0) { + if (nstart > 0 && nstart > ndata) return false; + if (nend > 0 && nend > ndata) return false; + if (skip_s > 0 && skip_s > ndata) return false; + if (skip_e > 0 && (skip_e - 1) > ndata) return false; + } + + return true; +} + + +int InputParser::locate_tag(const std::string key) +{ + auto ret = 0; + std::string line; + + if (from_stdin) { + + std::cin.clear(); + std::cin.seekg(0, std::ios_base::beg); + + while (std::cin >> line) { + boost::to_lower(line); + if (line == key) { + ret = 1; + break; + } + } + return ret; + + } + + ifs_input.clear(); + ifs_input.seekg(0, std::ios_base::beg); + + while (ifs_input >> line) { + boost::to_lower(line); + if (line == key) { + ret = 1; + break; + } + } + return ret; +} + +bool InputParser::is_endof_entry(const std::string str) const +{ + return str[0] == '/'; +} + +void InputParser::split_str_by_space(const std::string str, + std::vector &str_vec) const +{ + std::string str_tmp; + std::istringstream is(str); + + str_vec.clear(); + + while (true) { + str_tmp.clear(); + is >> str_tmp; + if (str_tmp.empty()) { + break; + } + str_vec.push_back(str_tmp); + } + str_tmp.clear(); +} + +template +void InputParser::assign_val(T &val, + const std::string key, + std::map dict) +{ + // Assign a value to the variable "key" using the boost::lexica_cast. + + if (!dict[key].empty()) { + try { + val = boost::lexical_cast(dict[key]); + } + catch (std::exception &e) { + std::cout << e.what() << std::endl; + auto str_tmp = "Invalid entry for the " + key + " tag.\n"; + str_tmp += " Please check the input value."; + exit("assign_val", str_tmp.c_str()); + } + } +} diff --git a/alm/input_parser.h b/alm/input_parser.h new file mode 100644 index 00000000..2f750007 --- /dev/null +++ b/alm/input_parser.h @@ -0,0 +1,78 @@ +/* + input_parser.h + + Copyright (c) 2014, 2015, 2016 Terumasa Tadano + + This file is distributed under the terms of the MIT license. + Please see the file 'LICENCE.txt' in the root directory + or http://opensource.org/licenses/mit-license.php for information. +*/ + +#pragma once + +#include "alm.h" +#include "input_setter.h" + +#include +#include +#include +#include + + +namespace ALM_NS +{ + class InputParser + { + public: + InputParser(); + ~InputParser(); + void run(ALM *alm, + const int narg, + const char *const *arg); + + std::string str_magmom; + + private: + std::ifstream ifs_input; + bool from_stdin{}; + std::string *kdname{}; + std::string mode; + int maxorder{}; + size_t nat{}; + size_t nkd{}; + InputSetter *input_setter; + + void parse_input(ALM *alm); + void parse_general_vars(ALM *alm); + void parse_cell_parameter(); + void parse_atomic_positions(); + void parse_interaction_vars(); + void parse_cutoff_radii(); + void parse_optimize_vars(ALM *alm); + int locate_tag(const std::string); + void split_str_by_space(const std::string, + std::vector &) const; + bool is_endof_entry(const std::string) const; + void get_var_dict(const std::vector &, + std::map &); + + bool is_data_range_consistent(const DispForceFile &datfile_in) const; + + template + void assign_val(T &, + const std::string, + std::map); + + void parse_displacement_and_force_files(std::vector> &u, + std::vector> &f, + DispForceFile &datfile_in) const; + void parse_dfset(std::vector> &u, + std::vector> &f, + DispForceFile &datfile_in) const; + + void parse_dfile_and_ffile(std::vector> &u, + std::vector> &f, + DispForceFile &datfile_in) const; + }; +} diff --git a/alm/input_setter.cpp b/alm/input_setter.cpp new file mode 100644 index 00000000..86cfca10 --- /dev/null +++ b/alm/input_setter.cpp @@ -0,0 +1,257 @@ +/* + input_setter.cpp + + Copyright (c) 2014, 2015, 2016 Terumasa Tadano + + This file is distributed under the terms of the MIT license. + Please see the file 'LICENCE.txt' in the root directory + or http://opensource.org/licenses/mit-license.php for information. +*/ + +#include +#include "input_setter.h" +#include "memory.h" +#include "files.h" +#include "symmetry.h" +#include "optimize.h" +#include "constraint.h" +#include "patterndisp.h" +#include "alm.h" +#include "error.h" + +using namespace ALM_NS; + +InputSetter::InputSetter() +{ + nat = 0; + nkd = 0; + maxorder = 0; + kd = nullptr; + kdname = nullptr; + + for (auto i = 0; i < 3; ++i) { + for (auto j = 0; j < 3; j++) { + lavec[i][j] = 0.0; + } + } + xcoord = nullptr; + is_periodic[0] = 1; + is_periodic[1] = 1; + is_periodic[2] = 1; + + lspin = false; + magmom = nullptr; + noncollinear = 0; + trevsym = 1; + str_magmom = ""; + + nbody_include = nullptr; + cutoff_radii = nullptr; +} + +InputSetter::~InputSetter() +{ + if (kdname) { + deallocate(kdname); + } + if (xcoord) { + deallocate(xcoord); + } + if (kd) { + deallocate(kd); + } + if (magmom) { + deallocate(magmom); + } + if (nbody_include) { + deallocate(nbody_include); + } + if (cutoff_radii) { + deallocate(cutoff_radii); + } +} + +void InputSetter::set_cell_parameter(const double a, + const double lavec_in[3][3]) +{ + for (auto i = 0; i < 3; ++i) { + for (auto j = 0; j < 3; ++j) { + lavec[i][j] = a * lavec_in[i][j]; + } + } +} + +void InputSetter::set_interaction_vars(const int maxorder_in, + const int *nbody_include_in) +{ + maxorder = maxorder_in; + if (nbody_include) { + deallocate(nbody_include); + } + allocate(nbody_include, maxorder); + for (auto i = 0; i < maxorder; i++) { + nbody_include[i] = nbody_include_in[i]; + } +} + +void InputSetter::set_cutoff_radii(const int maxorder_in, + const size_t nkd_in, + const std::vector &cutoff_radii_in) +{ + if (cutoff_radii_in.size() != (nkd_in * nkd_in * maxorder_in)) { + exit("set_cutoff_radii", + "Incorrect size of the input array cutoff_radii_in"); + } + if (cutoff_radii) { + deallocate(cutoff_radii); + } + allocate(cutoff_radii, maxorder_in * nkd_in * nkd_in); + auto counter = 0; + for (auto i = 0; i < maxorder_in; i++) { + for (size_t j = 0; j < nkd_in; j++) { + for (size_t k = 0; k < nkd_in; k++) { + cutoff_radii[counter] = cutoff_radii_in[counter]; + ++counter; + } + } + } +} + +void InputSetter::set_general_vars(ALM *alm, + const std::string prefix, + const std::string mode, + const int verbosity, + const std::string str_disp_basis, + const std::string str_magmom, + const size_t nat_in, + const size_t nkd_in, + const int printsymmetry, + const int is_periodic_in[3], + const bool trim_dispsign_for_evenfunc, + const bool lspin_in, + const bool print_hessian, + const int noncollinear_in, + const int trevsym_in, + const std::string *kdname_in, + const double *const *magmom_in, + const double tolerance, + const double tolerance_constraint) +{ + size_t i; + + alm->files->set_prefix(prefix); + alm->set_run_mode(mode); + alm->set_verbosity(verbosity); + nat = nat_in; + nkd = nkd_in; + alm->symmetry->set_print_symmetry(printsymmetry); + alm->symmetry->set_tolerance(tolerance); + + if (kdname) { + deallocate(kdname); + } + allocate(kdname, nkd); + for (i = 0; i < nkd; ++i) { + kdname[i] = kdname_in[i]; + } + + if (magmom) { + deallocate(magmom); + } + allocate(magmom, nat); + + for (i = 0; i < nat; i ++) { + for (auto j = 0; j < 3; j++) { + magmom[i][j] = magmom_in[i][j]; + } + } + lspin = lspin_in; + noncollinear = noncollinear_in; + trevsym = trevsym_in; + + for (i = 0; i < 3; i++) { + is_periodic[i] = is_periodic_in[i]; + } + + alm->files->print_hessian = print_hessian; + alm->constraint->set_tolerance_constraint(tolerance_constraint); + + if (mode == "suggest") { + alm->displace->set_disp_basis(str_disp_basis); + alm->displace->set_trim_dispsign_for_evenfunc(trim_dispsign_for_evenfunc); + } +} + +void InputSetter::define(ALM *alm) const +{ + alm->define(maxorder, + nkd, + nbody_include, + cutoff_radii); +} + + +void InputSetter::set_optimize_vars(ALM *alm, + const std::vector> &u_train_in, + const std::vector> &f_train_in, + const std::vector> &u_validation_in, + const std::vector> &f_validation_in, + const OptimizerControl &optcontrol_in) const +{ + alm->optimize->set_training_data(u_train_in, f_train_in); + alm->optimize->set_validation_data(u_validation_in, f_validation_in); + alm->optimize->set_optimizer_control(optcontrol_in); +} + +void InputSetter::set_file_vars(ALM *alm, + const DispForceFile &datfile_train_in, + const DispForceFile &datfile_validation_in) const +{ + alm->files->set_datfile_train(datfile_train_in); + alm->files->set_datfile_validation(datfile_validation_in); +} + +void InputSetter::set_constraint_vars(ALM *alm, + const int constraint_flag, + const std::string rotation_axis, + const std::string fc2_file, + const std::string fc3_file, + const bool fix_harmonic, + const bool fix_cubic) const +{ + alm->constraint->set_constraint_mode(constraint_flag); + alm->constraint->set_rotation_axis(rotation_axis); + alm->constraint->set_fc_file(2, fc2_file); + alm->constraint->set_fix_harmonic(fix_harmonic); + alm->constraint->set_fc_file(3, fc3_file); + alm->constraint->set_fix_cubic(fix_cubic); +} + + +void InputSetter::set_atomic_positions(const size_t nat_in, + const int *kd_in, + const double (*xcoord_in)[3]) +{ + if (kd) { + deallocate(kd); + } + if (xcoord) { + deallocate(xcoord); + } + allocate(xcoord, nat_in); + allocate(kd, nat_in); + + for (size_t i = 0; i < nat_in; ++i) { + kd[i] = kd_in[i]; + for (auto j = 0; j < 3; ++j) { + xcoord[i][j] = xcoord_in[i][j]; + } + } +} + +void InputSetter::set_geometric_structure(ALM *alm) +{ + alm->set_cell(nat, lavec, xcoord, kd, kdname); + alm->set_periodicity(is_periodic); + alm->set_magnetic_params(nat, magmom, lspin, noncollinear, trevsym, str_magmom); +} diff --git a/alm/input_setter.h b/alm/input_setter.h new file mode 100644 index 00000000..ae5f3338 --- /dev/null +++ b/alm/input_setter.h @@ -0,0 +1,97 @@ +/* + input_setter.h + + Copyright (c) 2014, 2015, 2016 Terumasa Tadano + + This file is distributed under the terms of the MIT license. + Please see the file 'LICENCE.txt' in the root directory + or http://opensource.org/licenses/mit-license.php for information. +*/ + +#pragma once + +#include "alm.h" +#include + +namespace ALM_NS +{ + class InputSetter + { + public: + InputSetter(); + ~InputSetter(); + + void set_cell_parameter(const double a, + const double lavec_in[3][3]); + void set_atomic_positions(const size_t nat_in, + const int *kd_in, + const double (*xcoord_in)[3]); + void set_geometric_structure(ALM *alm); + + void set_interaction_vars(const int maxorder_in, + const int *nbody_include_in); + void set_cutoff_radii(const int maxorder_in, + const size_t nkd_in, + const std::vector &cutoff_radii_in); + void define(ALM *alm) const; + + void set_general_vars(ALM *alm, + std::string prefix, + std::string mode, + int verbosity, + std::string str_disp_basis, + std::string str_magmom, + size_t nat_in, + size_t nkd_in, + int printsymmetry, + const int is_periodic_in[3], + bool trim_dispsign_for_evenfunc, + bool lspin_in, + bool print_hessian, + int noncollinear_in, + int trevsym_in, + const std::string *kdname_in, + const double *const *magmom_in, + double tolerance, + double tolerance_constraint); + + void set_optimize_vars(ALM *alm, + const std::vector> &u_train_in, + const std::vector> &f_train_in, + const std::vector> &u_validation_in, + const std::vector> &f_validation_in, + const OptimizerControl &optcontrol_in) const; + + void set_file_vars(ALM *alm, + const DispForceFile &datfile_train_in, + const DispForceFile &datfile_validation_in) const; + + void set_constraint_vars(ALM *alm, + int constraint_flag, + std::string rotation_axis, + std::string fc2_file, + std::string fc3_file, + bool fix_harmonic, + bool fix_cubic) const; + + void set_geometric_structure(ALM *alm) const; + + private: + size_t nat, nkd; + int *kd; + double lavec[3][3]; + double (*xcoord)[3]; // fractional coordinate + std::string *kdname; + int is_periodic[3]; + + bool lspin; + double (*magmom)[3]; + int noncollinear; + int trevsym; + std::string str_magmom; + + int maxorder; + int *nbody_include; + double *cutoff_radii; + }; +} diff --git a/alm/interaction.cpp b/alm/interaction.cpp deleted file mode 100644 index ae429b08..00000000 --- a/alm/interaction.cpp +++ /dev/null @@ -1,1204 +0,0 @@ -/* -interaction.cpp - -Copyright (c) 2014, 2015, 2016 Terumasa Tadano - -This file is distributed under the terms of the MIT license. -Please see the file 'LICENCE.txt' in the root directory -or http://opensource.org/licenses/mit-license.php for information. -*/ - -#include -#include -#include -#include -#include -#include -#include "interaction.h" -#include "memory.h" -#include "system.h" -#include "error.h" -#include "symmetry.h" -#include "combination.h" -#include "constants.h" -#include "files.h" -#include "timer.h" -#include "fcs.h" -#include - -using namespace ALM_NS; - -Interaction::Interaction(ALM *alm) : Pointers(alm) -{ - rcs = nullptr; -} - -Interaction::~Interaction() -{ - memory->deallocate(x_image); - memory->deallocate(exist_image); - memory->deallocate(str_order); - memory->deallocate(nbody_include); - memory->deallocate(pairs); - memory->deallocate(mindist_pairs); - memory->deallocate(interaction_pair); - memory->deallocate(mindist_cluster); - memory->deallocate(distall); - if (rcs) { - memory->deallocate(rcs); - } -} - -void Interaction::init() -{ - int i, j, k; - int nat = system->nat; - int nkd = system->nkd; - - std::cout << " INTERACTION" << std::endl; - std::cout << " ===========" << std::endl << std::endl; - - memory->allocate(str_order, maxorder); - set_ordername(); - - std::cout << " +++ Cutoff Radii Matrix in Bohr Unit (NKD x NKD matrix) +++" << std::endl; - - for (i = 0; i < maxorder; ++i) { - std::cout << " " << std::setw(9) << str_order[i] << std::endl; - for (j = 0; j < nkd; ++j) { - for (k = 0; k < nkd; ++k) { - if (rcs[i][j][k] < 0.0) { - std::cout << std::setw(9) << "None"; - } else { - std::cout << std::setw(9) << rcs[i][j][k]; - } - } - std::cout << std::endl; - } - std::cout << std::endl; - } - - nneib = 27; - memory->allocate(x_image, nneib, nat, 3); - memory->allocate(exist_image, nneib); - memory->allocate(distall, nat, nat); - memory->allocate(mindist_pairs, nat, nat); - memory->allocate(interaction_pair, maxorder, symmetry->nat_prim); - memory->allocate(mindist_cluster, maxorder, symmetry->nat_prim); - memory->allocate(pairs, maxorder); - - generate_coordinate_of_periodic_images(nat, system->xcoord, - is_periodic, x_image, exist_image); - get_pairs_of_minimum_distance(nat, x_image, exist_image, - distall, mindist_pairs); - print_neighborlist(mindist_pairs); - search_interactions(interaction_pair, pairs); - // calc_mindist_clusters2(interaction_pair, mindist_pairs, distall, exist_image, mindist_cluster); - calc_mindist_clusters(interaction_pair, mindist_pairs, - distall, exist_image, mindist_cluster); - generate_pairs(pairs, mindist_cluster); - - timer->print_elapsed(); - std::cout << " -------------------------------------------------------------------" << std::endl; - std::cout << std::endl; -} - -void Interaction::generate_pairs(std::set *pair_out, - std::set **mindist_cluster) -{ - int i, j; - int iat; - int order; - int natmin = symmetry->nat_prim; - int nat = system->nat; - - int *pair_tmp; - - for (order = 0; order < maxorder; ++order) { - - pair_out[order].clear(); - - if (order + 2 > nbody_include[order]) { - std::cout << " For " << std::setw(8) << interaction->str_order[order] << ", "; - std::cout << "interactions related to more than" << std::setw(2) << nbody_include[order]; - std::cout << " atoms will be neglected." << std::endl; - } - - memory->allocate(pair_tmp, order + 2); - - for (i = 0; i < natmin; ++i) { - - iat = symmetry->map_p2s[i][0]; - - for (std::set::const_iterator it = mindist_cluster[order][i].begin(); - it != mindist_cluster[order][i].end(); ++it) { - - pair_tmp[0] = iat; - for (j = 0; j < order + 1; ++j) { - pair_tmp[j + 1] = (*it).atom[j]; - } - - insort(order + 2, pair_tmp); - - // Ignore many-body case - if (nbody(order + 2, pair_tmp) > nbody_include[order]) continue; - pair_out[order].insert(IntList(order + 2, pair_tmp)); - } - } - memory->deallocate(pair_tmp); - } -} - -void Interaction::generate_coordinate_of_periodic_images(const unsigned int nat, - double **xf_in, - const int periodic_flag[3], - double ***xc_out, - int *is_allowed) -{ - // - // Generate Cartesian coordinates of atoms in the neighboring 27 supercells - // - - unsigned int i, j; - int ia, ja, ka; - int icell; - - icell = 0; - for (i = 0; i < nat; ++i) { - for (j = 0; j < 3; ++j) { - xc_out[0][i][j] = xf_in[i][j]; - } - } - // Convert to Cartesian coordinate - system->frac2cart(xc_out[0]); - - for (ia = -1; ia <= 1; ++ia) { - for (ja = -1; ja <= 1; ++ja) { - for (ka = -1; ka <= 1; ++ka) { - - if (ia == 0 && ja == 0 && ka == 0) continue; - - ++icell; - for (i = 0; i < nat; ++i) { - xc_out[icell][i][0] = xf_in[i][0] + static_cast(ia); - xc_out[icell][i][1] = xf_in[i][1] + static_cast(ja); - xc_out[icell][i][2] = xf_in[i][2] + static_cast(ka); - } - // Convert to Cartesian coordinate - system->frac2cart(xc_out[icell]); - } - } - } - - icell = 0; - is_allowed[0] = 1; - - for (ia = -1; ia <= 1; ++ia) { - for (ja = -1; ja <= 1; ++ja) { - for (ka = -1; ka <= 1; ++ka) { - - if (ia == 0 && ja == 0 && ka == 0) continue; - - ++icell; - - // When periodic flag is zero along an axis, - // periodic images along that axis cannot be considered. - if (((std::abs(ia) == 1) && (periodic_flag[0] == 0)) || - ((std::abs(ja) == 1) && (periodic_flag[1] == 0)) || - ((std::abs(ka) == 1) && (periodic_flag[2] == 0))) { - - is_allowed[icell] = 0; - - } else { - - is_allowed[icell] = 1; - } - } - } - } -} - -double Interaction::distance(double *x1, double *x2) -{ - double dist; - dist = std::pow(x1[0] - x2[0], 2) + std::pow(x1[1] - x2[1], 2) + std::pow(x1[2] - x2[2], 2); - dist = std::sqrt(dist); - - return dist; -} - -void Interaction::get_pairs_of_minimum_distance(int nat, - double ***xc_in, - int *exist, - std::vector **distall, - std::vector **mindist_pairs) -{ - // - // Calculate the minimum distance between atom i and j - // under the periodic boundary conditions - // - int icell = 0; - int i, j, k; - double dist_tmp; - double vec[3]; - - - for (i = 0; i < nat; ++i) { - for (j = 0; j < nat; ++j) { - - distall[i][j].clear(); - - for (icell = 0; icell < nneib; ++icell) { - - if (exist[icell]) { - - dist_tmp = distance(xc_in[0][i], xc_in[icell][j]); - - for (k = 0; k < 3; ++k) vec[k] = xc_in[icell][j][k] - xc_in[0][i][k]; - - distall[i][j].push_back(DistInfo(icell, dist_tmp, vec)); - } - } - std::sort(distall[i][j].begin(), distall[i][j].end()); - } - } - - // Construct pairs of minimum distance. - - double dist_min; - for (i = 0; i < nat; ++i) { - for (j = 0; j < nat; ++j) { - mindist_pairs[i][j].clear(); - - dist_min = distall[i][j][0].dist; - for (std::vector::const_iterator it = distall[i][j].begin(); - it != distall[i][j].end(); ++it) { - // The tolerance below (1.e-3) should be chosen so that - // the mirror images with equal distances are found correctly. - // If this fails, the phonon dispersion would be incorrect. - if (std::abs((*it).dist - dist_min) < 1.0e-3) { - mindist_pairs[i][j].push_back(DistInfo(*it)); - } - } - } - } -} - -void Interaction::print_neighborlist(std::vector **mindist) -{ - // - // Print the list of neighboring atoms and distances - // - int i, j, k; - int iat; - int nat = system->nat; - int icount; - - double dist_tmp; - std::vector *neighborlist; - - memory->allocate(neighborlist, symmetry->nat_prim); - - for (i = 0; i < symmetry->nat_prim; ++i) { - neighborlist[i].clear(); - - iat = symmetry->map_p2s[i][0]; - - for (j = 0; j < nat; ++j) { - neighborlist[i].push_back(DistList(j, mindist[iat][j][0].dist)); - } - std::sort(neighborlist[i].begin(), neighborlist[i].end()); - } - - std::cout << std::endl; - std::cout << " List of neighboring atoms below." << std::endl; - std::cout << " Format [N th-nearest shell, distance in Bohr (Number of atoms on the shell)]" - << std::endl << std::endl; - - int nthnearest; - std::vector atomlist; - - for (i = 0; i < symmetry->nat_prim; ++i) { - - nthnearest = 0; - atomlist.clear(); - - iat = symmetry->map_p2s[i][0]; - std::cout << std::setw(5) << iat + 1 << " (" - << std::setw(3) << system->kdname[system->kd[iat] - 1] << "): "; - - dist_tmp = 0.0; - - for (j = 0; j < nat; ++j) { - - if (neighborlist[i][j].dist < eps8) continue; // distance is zero - - if (std::abs(neighborlist[i][j].dist - dist_tmp) > eps6) { - - if (atomlist.size() > 0) { - nthnearest += 1; - - if (nthnearest > 1) std::cout << std::setw(13) << " "; - - std::cout << std::setw(3) << nthnearest << std::setw(10) << dist_tmp - << " (" << std::setw(3) << atomlist.size() << ") -"; - - icount = 0; - for (k = 0; k < atomlist.size(); ++k) { - - if (icount % 4 == 0 && icount > 0) { - std::cout << std::endl; - std::cout << std::setw(34) << " "; - } - ++icount; - - std::cout << std::setw(4) << atomlist[k] + 1; - std::cout << "(" << std::setw(3) - << system->kdname[system->kd[atomlist[k]] - 1] << ")"; - - } - std::cout << std::endl; - } - - - dist_tmp = neighborlist[i][j].dist; - atomlist.clear(); - atomlist.push_back(neighborlist[i][j].atom); - } else { - atomlist.push_back(neighborlist[i][j].atom); - } - } - if (atomlist.size() > 0) { - nthnearest += 1; - - if (nthnearest > 1) std::cout << std::setw(13) << " "; - - std::cout << std::setw(3) << nthnearest << std::setw(10) << dist_tmp - << " (" << std::setw(3) << atomlist.size() << ") -"; - - icount = 0; - for (k = 0; k < atomlist.size(); ++k) { - - if (icount % 4 == 0 && icount > 0) { - std::cout << std::endl; - std::cout << std::setw(34) << " "; - } - ++icount; - - std::cout << std::setw(4) << atomlist[k] + 1; - std::cout << "(" << std::setw(3) - << system->kdname[system->kd[atomlist[k]] - 1] << ")"; - - } - std::cout << std::endl; - } - std::cout << std::endl; - } - atomlist.clear(); - memory->deallocate(neighborlist); -} - -void Interaction::search_interactions(std::vector **interaction_list_out, - std::set *pair_out) -{ - // - // Search atoms inside the cutoff radii for harmonic and anharmonic interactions. - // - int i; - int order; - int natmin = symmetry->nat_prim; - int iat, jat; - int nat = system->nat; - int ikd, jkd; - - double cutoff_tmp; - std::set *interacting_atom_pairs; - std::vector intlist; - - memory->allocate(interacting_atom_pairs, maxorder); - - for (order = 0; order < maxorder; ++order) { - for (i = 0; i < natmin; ++i) { - interaction_list_out[order][i].clear(); - - iat = symmetry->map_p2s[i][0]; - ikd = system->kd[iat] - 1; - - for (jat = 0; jat < nat; ++jat) { - - jkd = system->kd[jat] - 1; - - cutoff_tmp = rcs[order][ikd][jkd]; - - if (cutoff_tmp < 0.0) { - - // Cutoff 'None' - interaction_list_out[order][i].push_back(jat); - - } else { - - if (mindist_pairs[iat][jat][0].dist <= cutoff_tmp) { - interaction_list_out[order][i].push_back(jat); - } - } - } - } - } - - intlist.clear(); - std::cout << std::endl; - std::cout << " List of interacting atom pairs considered for each order:" << std::endl; - - for (order = 0; order < maxorder; ++order) { - - interacting_atom_pairs[order].clear(); - - std::cout << std::endl << " ***" << str_order[order] << "***" << std::endl; - - for (i = 0; i < natmin; ++i) { - - if (interaction_list_out[order][i].size() == 0) { - std::cout << " No interacting atoms! Skipped." << std::endl; - continue; // no interaction - } - - iat = symmetry->map_p2s[i][0]; - - intlist.clear(); - for (std::vector::const_iterator it = interaction_list_out[order][i].begin(); - it != interaction_list_out[order][i].end(); ++it) { - intlist.push_back((*it)); - } - std::sort(intlist.begin(), intlist.end()); // Necessarily to sort here - - // write atoms inside the cutoff radius - int id = 0; - std::cout << " Atom " << std::setw(5) << iat + 1 - << "(" << std::setw(3) << system->kdname[system->kd[iat] - 1] - << ")" << " interacts with atoms ... " << std::endl; - - for (int id = 0; id < intlist.size(); ++id) { - if (id % 6 == 0) { - if (id == 0) { - std::cout << " "; - } else { - std::cout << std::endl; - std::cout << " "; - } - } - std::cout << std::setw(5) << intlist[id] + 1 << "(" - << std::setw(3) << system->kdname[system->kd[intlist[id]] - 1] << ")"; - } - - std::cout << std::endl << std::endl; - std::cout << " Number of total interaction pairs = " - << interaction_list_out[order][i].size() << std::endl << std::endl; - - int *intarr; - memory->allocate(intarr, order + 2); - - if (intlist.size() > 0) { - if (order == 0) { - for (unsigned int ielem = 0; ielem < intlist.size(); ++ielem) { - intarr[0] = iat; - intarr[1] = intlist[ielem]; - insort(2, intarr); - - interacting_atom_pairs[0].insert(IntList(2, intarr)); - } - } else if (order > 0) { - CombinationWithRepetition g(intlist.begin(), intlist.end(), order + 1); - do { - std::vector data = g.now(); - intarr[0] = iat; - intarr[1] = data[0]; - for (unsigned int isize = 1; isize < data.size(); ++isize) { - intarr[isize + 1] = data[isize]; - } - if (!is_incutoff(order + 2, intarr, order)) continue; - - insort(order + 2, intarr); - interacting_atom_pairs[order].insert(IntList(order + 2, intarr)); - - } while (g.next()); - } - } - intlist.clear(); - memory->deallocate(intarr); - } - } - - std::cout << std::endl; - - memory->deallocate(interacting_atom_pairs); -} - -bool Interaction::is_incutoff(const int n, - int *atomnumlist, - const int order) -{ - int i, j; - int iat, jat; - int ikd, jkd; - int ncheck = n - 1; - double cutoff_tmp; - std::vector::const_iterator it, it2; - - iat = atomnumlist[0]; - ikd = system->kd[iat] - 1; - - for (i = 0; i < n; ++i) { - iat = atomnumlist[i]; - ikd = system->kd[iat] - 1; - - for (j = i + 1; j < n; ++j) { - jat = atomnumlist[j]; - jkd = system->kd[jat] - 1; - - cutoff_tmp = rcs[order][ikd][jkd]; - - if (cutoff_tmp >= 0.0 && - (mindist_pairs[iat][jat][0].dist > cutoff_tmp)) - return false; - - } - } - return true; - - /* - for (i = 0; i < ncheck; ++i) { - - jat = atomnumlist[i + 1]; - jkd = system->kd[jat] - 1; - - if (rcs[order][ikd][jkd] >= 0.0 && - (mindist_pairs[iat][jat][0].dist > rcs[order][ikd][jkd])) return false; - - for (j = i + 1; j < ncheck; ++j) { - - kat = atomnumlist[j + 1]; - kkd = system->kd[kat] - 1; - - if (rcs[order][ikd][kkd] >= 0.0 && - (mindist_pairs[iat][kat][0].dist > rcs[order][ikd][kkd])) return false; - - cutoff_tmp = rcs[order][jkd][kkd]; - - if (cutoff_tmp >= 0.0) { - - in_cutoff_tmp = false; - - for (it = mindist_pairs[iat][jat].begin(); it != mindist_pairs[iat][jat].end(); ++it) { - for (it2 = mindist_pairs[iat][kat].begin(); it2 != mindist_pairs[iat][kat].end(); ++it2) { - dist_tmp = distance(x_image[(*it).cell][jat], x_image[(*it2).cell][kat]); - - if (n == 4) { - if (iat == 0 && jat == 4 && kat == 20) { - std::cout << "DEBUG :" << std::setw(5) << (*it).cell; - std::cout << std::setw(5) << (*it2).cell << std::setw(15) << dist_tmp << std::endl; - } - } - - if (dist_tmp <= cutoff_tmp) { - in_cutoff_tmp = true; - } - } - } - if (!in_cutoff_tmp) return false; - } - } - } - return true; - */ -} - -bool Interaction::is_incutoff2(const int n, - int *atomnumlist, - const int order) -{ - int i, j; - int iat, jat, kat; - int ikd, jkd, kkd; - int ncheck = n - 1; - // int order = n - 2; - bool in_cutoff_tmp; - double cutoff_tmp; - double dist_tmp; - std::vector::const_iterator it, it2; - - iat = atomnumlist[0]; - ikd = system->kd[iat] - 1; - - for (i = 0; i < ncheck; ++i) { - - jat = atomnumlist[i + 1]; - jkd = system->kd[jat] - 1; - - if (rcs[order][ikd][jkd] >= 0.0 && - (mindist_pairs[iat][jat][0].dist > rcs[order][ikd][jkd])) - return false; - - for (j = i + 1; j < ncheck; ++j) { - - kat = atomnumlist[j + 1]; - kkd = system->kd[kat] - 1; - - if (rcs[order][ikd][kkd] >= 0.0 && - (mindist_pairs[iat][kat][0].dist > rcs[order][ikd][kkd])) - return false; - - cutoff_tmp = rcs[order][jkd][kkd]; - - if (cutoff_tmp >= 0.0) { - - in_cutoff_tmp = false; - - for (it = mindist_pairs[iat][jat].begin(); - it != mindist_pairs[iat][jat].end(); ++it) { - for (it2 = mindist_pairs[iat][kat].begin(); - it2 != mindist_pairs[iat][kat].end(); ++it2) { - dist_tmp = distance(x_image[(*it).cell][jat], x_image[(*it2).cell][kat]); - - if (dist_tmp <= cutoff_tmp) { - in_cutoff_tmp = true; - } - } - } - if (!in_cutoff_tmp) return false; - } - } - } - - return true; -} - -void Interaction::set_ordername() -{ - std::string strnum; - - str_order[0] = "HARMONIC"; - - for (int i = 1; i < maxorder; ++i) { - strnum = boost::lexical_cast(i + 2); - str_order[i] = "ANHARM" + strnum; - } -} - -int Interaction::nbody(const int n, const int *arr) -{ - std::vector v(n); - int ret; - - for (unsigned int i = 0; i < n; ++i) { - v[i] = arr[i]; - } - std::stable_sort(v.begin(), v.end()); - v.erase(std::unique(v.begin(), v.end()), v.end()); - - ret = v.size(); - v.clear(); - - return ret; -} - - -void Interaction::calc_mindist_clusters(std::vector **interaction_pair_in, - std::vector **mindist_pair_in, - std::vector **distance_image, - int *exist, - std::set **mindist_cluster_out) -{ - // - // Calculate the complete set of interaction clusters for each order. - // - - int natmin = symmetry->nat_prim; - int i, j, k; - int iat, jat; - int order; - int ii; - int ikd, jkd; - int icount; - int idata; - unsigned int ielem; - - double dist_tmp, rc_tmp; - double distmax; - - bool isok; - - int *list_now; - - std::vector intlist; - std::vector cell_vector; - std::vector dist_vector; - std::vector> pairs_icell, comb_cell, comb_cell_min; - std::vector> comb_cell_atom_center; - std::vector accum_tmp; - std::vector atom_tmp, cell_tmp; - std::vector intpair_uniq, cellpair; - std::vector group_atom; - std::vector data_now; - std::vector distance_list; - std::vector> data_vec; - - for (order = 0; order < maxorder; ++order) { - for (i = 0; i < symmetry->nat_prim; ++i) { - - mindist_cluster_out[order][i].clear(); - - iat = symmetry->map_p2s[i][0]; - ikd = system->kd[iat] - 1; - - // List of 2-body interaction pairs - intlist.clear(); - for (std::vector::const_iterator it = interaction_pair_in[order][i].begin(); - it != interaction_pair_in[order][i].end(); ++it) { - intlist.push_back((*it)); - } - std::sort(intlist.begin(), intlist.end()); // Need to sort here - - if (order == 0) { - - // Harmonic term - - for (ielem = 0; ielem < intlist.size(); ++ielem) { - - comb_cell_min.clear(); - atom_tmp.clear(); - - jat = intlist[ielem]; - atom_tmp.push_back(jat); - - for (j = 0; j < mindist_pair_in[iat][jat].size(); ++j) { - cell_tmp.clear(); - cell_tmp.push_back(mindist_pair_in[iat][jat][j].cell); - comb_cell_min.push_back(cell_tmp); - } - distmax = mindist_pair_in[iat][jat][0].dist; - mindist_cluster_out[order][i].insert(MinimumDistanceCluster(atom_tmp, - comb_cell_min, - distmax)); - } - - } else if (order > 0) { - - // Anharmonic terms - - data_vec.clear(); - memory->allocate(list_now, order + 2); - - // First, we generate all possible combinations of interaction clusters. - CombinationWithRepetition g(intlist.begin(), intlist.end(), order + 1); - do { - std::vector data = g.now(); - - list_now[0] = iat; - for (j = 0; j < order + 1; ++j) list_now[j + 1] = data[j]; - - // Save as a candidate if the cluster satisfies the NBODY-rule. - if (nbody(order + 2, list_now) <= nbody_include[order]) { - data_vec.push_back(data); - } - - } while (g.next()); - - intlist.clear(); - - int ndata = data_vec.size(); - - for (idata = 0; idata < ndata; ++idata) { - - data_now = data_vec[idata]; - - // Uniq the list of atoms in data like as follows: - // cubic term : (i, i) --> (i) x 2 - // quartic term : (i, i, j) --> (i, j) x (2, 1) - intpair_uniq.clear(); - group_atom.clear(); - icount = 1; - - for (j = 0; j < order; ++j) { - if (data_now[j] == data_now[j + 1]) { - ++icount; - } else { - group_atom.push_back(icount); - intpair_uniq.push_back(data_now[j]); - icount = 1; - } - } - group_atom.push_back(icount); - intpair_uniq.push_back(data_now[order]); - - pairs_icell.clear(); - for (j = 0; j < intpair_uniq.size(); ++j) { - jat = intpair_uniq[j]; - jkd = system->kd[jat] - 1; - - rc_tmp = rcs[order][ikd][jkd]; - cell_vector.clear(); - - // Loop over the cell images of atom 'jat' and add to the list - // as a candidate for the minimum distance cluster - for (std::vector::const_iterator it = distance_image[iat][jat].begin(); - it != distance_image[iat][jat].end(); ++it) { - if (exist[(*it).cell]) { - if (rc_tmp < 0.0 || (*it).dist <= rc_tmp) { - cell_vector.push_back((*it).cell); - } - } - } - pairs_icell.push_back(cell_vector); - } - - accum_tmp.clear(); - comb_cell.clear(); - cell_combination(pairs_icell, 0, accum_tmp, comb_cell); - - distance_list.clear(); - for (j = 0; j < comb_cell.size(); ++j) { - - cellpair.clear(); - - for (k = 0; k < group_atom.size(); ++k) { - for (ii = 0; ii < group_atom[k]; ++ii) { - cellpair.push_back(comb_cell[j][k]); - } - } - - dist_vector.clear(); - - for (k = 0; k < cellpair.size(); ++k) { - dist_tmp = distance(x_image[cellpair[k]][data_now[k]], x_image[0][iat]); - dist_vector.push_back(dist_tmp); - } - - // Flag to check if the distance is smaller than the cutoff radius - isok = true; - - for (k = 0; k < cellpair.size(); ++k) { - for (ii = k + 1; ii < cellpair.size(); ++ii) { - dist_tmp = distance(x_image[cellpair[k]][data_now[k]], - x_image[cellpair[ii]][data_now[ii]]); - rc_tmp = rcs[order][system->kd[data_now[k]] - 1][system->kd[data_now[ii]] - 1]; - if (rc_tmp >= 0.0 && dist_tmp > rc_tmp) { - isok = false; - } - dist_vector.push_back(dist_tmp); - } - } - if (isok) { - // This combination is a candidate of the minimum distance cluster - distance_list.push_back(MinDistList(cellpair, dist_vector)); - } - } // close loop over the mirror image combination - - if (distance_list.size() > 0) { - // If the distance_list is not empty, there is a set of mirror images - // that satisfies the condition of the interaction. - - pairs_icell.clear(); - for (j = 0; j < intpair_uniq.size(); ++j) { - jat = intpair_uniq[j]; - cell_vector.clear(); - - for (ii = 0; ii < mindist_pair_in[iat][jat].size(); ++ii) { - cell_vector.push_back(mindist_pair_in[iat][jat][ii].cell); - } - pairs_icell.push_back(cell_vector); - } - - accum_tmp.clear(); - comb_cell.clear(); - comb_cell_atom_center.clear(); - cell_combination(pairs_icell, 0, accum_tmp, comb_cell); - - for (j = 0; j < comb_cell.size(); ++j) { - cellpair.clear(); - for (k = 0; k < group_atom.size(); ++k) { - for (ii = 0; ii < group_atom[k]; ++ii) { - cellpair.push_back(comb_cell[j][k]); - } - } - comb_cell_atom_center.push_back(cellpair); - } - - std::sort(distance_list.begin(), distance_list.end(), - MinDistList::compare_max_distance); - distmax = *std::max_element(distance_list[0].dist.begin(), - distance_list[0].dist.end()); - mindist_cluster_out[order][i].insert(MinimumDistanceCluster(data_now, - comb_cell_atom_center, - distmax)); - - } - } - memory->deallocate(list_now); - - /* - std::sort(distance_list.begin(), distance_list.end(), MinDistList::compare_sum_distance); - comb_cell_min.clear(); - - sum_dist_min = 0.0; - for (j = 0; j < distance_list[0].dist.size(); ++j) { - sum_dist_min += distance_list[0].dist[j]; - } - - for (j = 0; j < distance_list.size(); ++j) { - sum_dist = 0.0; - - for (k = 0; k < distance_list[j].dist.size(); ++k) { - sum_dist += distance_list[j].dist[k]; - } - - // In the following, only pairs having minimum sum of distances - // are stored. However, we found that this treatment didn't - // return a reliable value of phonon linewidth. - if (std::abs(sum_dist - sum_dist_min) < eps6) { - comb_cell_min.push_back(distance_list[j].cell); - } else { - break; - } - // Therefore, we consider all duplicate pairs - //comb_cell_min.push_back(distance_list[j].cell); - } - // mindist_cluster_out[order][i].insert(MinimumDistanceCluster(data, comb_cell_min)); - */ - - - } - } - } -} - -void Interaction::calc_mindist_clusters2(std::vector **interaction_pair_in, - std::vector **mindist_pair_in, - std::vector **distance_image, - int *exist, - std::set **mindist_cluster_out) -{ - std::vector distance_list; - - int natmin = symmetry->nat_prim; - int i, j, k; - int iat, jat; - int ikd, jkd; - int order; - int ii; - std::vector intlist; - - double rc_tmp; - double dist_tmp; - double sum_dist_min, sum_dist; - double dist_max; - - std::vector cell_vector; - std::vector dist_vector; - std::vector> pairs_icell, comb_cell, comb_cell_min; - std::vector accum_tmp; - std::vector atom_tmp, cell_tmp; - std::vector intpair_uniq, cellpair; - std::vector group_atom; - - int icount; - bool isok; - - for (order = 0; order < maxorder; ++order) { - for (i = 0; i < symmetry->nat_prim; ++i) { - - mindist_cluster_out[order][i].clear(); - iat = symmetry->map_p2s[i][0]; - ikd = system->kd[iat] - 1; - - intlist.clear(); - for (std::vector::const_iterator it = interaction_pair_in[order][i].begin(); - it != interaction_pair_in[order][i].end(); ++it) { - intlist.push_back((*it)); - } - std::sort(intlist.begin(), intlist.end()); // Need to sort here - - if (intlist.size() > 0) { - - if (order == 0) { - // For harmonic case, the minimum distance cluster is equivalen to the - // minimum distance pairs. - for (unsigned int ielem = 0; ielem < intlist.size(); ++ielem) { - - comb_cell_min.clear(); - atom_tmp.clear(); - - jat = intlist[ielem]; - atom_tmp.push_back(jat); - - for (j = 0; j < mindist_pair_in[iat][jat].size(); ++j) { - cell_tmp.clear(); - cell_tmp.push_back(mindist_pair_in[iat][jat][j].cell); - comb_cell_min.push_back(cell_tmp); - } - dist_max = mindist_pair_in[iat][jat][0].dist; - mindist_cluster_out[order][i].insert(MinimumDistanceCluster(atom_tmp, - comb_cell_min)); - } - - } else if (order > 0) { - - // For anharmonic cases, the minimum distance cluster is the set of - // cell images having the smallest value for the sum of distance. - - // Generate all possible combination of atoms from intlist - CombinationWithRepetition g(intlist.begin(), intlist.end(), order + 1); - do { - std::vector data = g.now(); - - // Uniq the list of atoms in data like as follows: - // cubic term : (i, i) --> (i) x 2 - // quartic term : (i, i, j) --> (i, j) x (2, 1) - intpair_uniq.clear(); - group_atom.clear(); - icount = 1; - - for (j = 0; j < order; ++j) { - if (data[j] == data[j + 1]) { - ++icount; - } else { - group_atom.push_back(icount); - intpair_uniq.push_back(data[j]); - icount = 1; - } - } - group_atom.push_back(icount); - intpair_uniq.push_back(data[order]); - - pairs_icell.clear(); - for (j = 0; j < intpair_uniq.size(); ++j) { - jat = intpair_uniq[j]; - jkd = system->kd[jat] - 1; - - rc_tmp = rcs[order][ikd][jkd]; - cell_vector.clear(); - - // Loop over the cell images of atom 'jat' and add to the list - // as a candidate for the minimum distance cluster - for (std::vector::const_iterator it = distance_image[iat][jat].begin(); - it != distance_image[iat][jat].end(); ++it) { - if (exist[(*it).cell]) { - if (rc_tmp < 0.0 || (*it).dist <= rc_tmp) { - cell_vector.push_back((*it).cell); - // std::cout << " iat = " << std::setw(5) << iat; - // std::cout << " jat = " << std::setw(5) << jat; - // std::cout << " cell = " << (*it).cell; - // std::cout << " dist = " << (*it).dist; - // std::cout << " rc = " << rc_tmp << std::endl; - } - } - } - pairs_icell.push_back(cell_vector); - } - - // Generate all possible combinations of mirror images - accum_tmp.clear(); - comb_cell.clear(); - cell_combination(pairs_icell, 0, accum_tmp, comb_cell); - - distance_list.clear(); - - // Loop over the combination of the mirror images and - // generate the list of atomic distances of all pairs for each combination. - // Add to list only if the distance is smaller than the cutoff radius. - - for (j = 0; j < comb_cell.size(); ++j) { - - cellpair.clear(); - - for (k = 0; k < group_atom.size(); ++k) { - for (ii = 0; ii < group_atom[k]; ++ii) { - cellpair.push_back(comb_cell[j][k]); - } - } - - dist_vector.clear(); - - for (k = 0; k < cellpair.size(); ++k) { - dist_tmp = distance(x_image[cellpair[k]][data[k]], x_image[0][iat]); - if (dist_tmp > eps15) dist_vector.push_back(dist_tmp); - } - - // Flag to check if the distance is smaller than the cutoff radius - isok = true; - - for (k = 0; k < cellpair.size(); ++k) { - for (ii = k + 1; ii < cellpair.size(); ++ii) { - dist_tmp = distance(x_image[cellpair[k]][data[k]], - x_image[cellpair[ii]][data[ii]]); - rc_tmp = rcs[order][system->kd[data[k]] - 1][system->kd[data[ii]] - 1]; - if (rc_tmp >= 0.0 && dist_tmp > rc_tmp) { - isok = false; - // break; - } - if (dist_tmp > eps15) dist_vector.push_back(dist_tmp); - } - } - if (isok) { - // This combination a candidate for the minimum distance cluster - distance_list.push_back(MinDistList(cellpair, dist_vector)); - } - } - - std::sort(distance_list.begin(), distance_list.end(), - MinDistList::compare_sum_distance); - - comb_cell_min.clear(); - - sum_dist_min = 0.0; - dist_max = 0.0; - for (j = 0; j < distance_list[0].dist.size(); ++j) { - sum_dist_min += distance_list[0].dist[j]; - dist_max = std::max(dist_max, distance_list[0].dist[j]); - } - - for (j = 0; j < distance_list.size(); ++j) { - sum_dist = 0.0; - - for (k = 0; k < distance_list[j].dist.size(); ++k) { - sum_dist += distance_list[j].dist[k]; - } - - // In the following, only pairs having minimum sum of distances - // are stored. - if (std::abs(sum_dist - sum_dist_min) < eps6) { - comb_cell_min.push_back(distance_list[j].cell); - } else { - break; - } - } - - if (comb_cell_min.size() > 0) { - mindist_cluster_out[order][i].insert(MinimumDistanceCluster(data, - comb_cell_min)); - } - - } while (g.next()); - } - } - intlist.clear(); - } - } -} - - -void Interaction::cell_combination(std::vector> array, - int i, - std::vector accum, - std::vector> &comb) -{ - if (i == array.size()) { - comb.push_back(accum); - } else { - std::vector row = array[i]; - for (int j = 0; j < row.size(); ++j) { - std::vector tmp(accum); - tmp.push_back(row[j]); - cell_combination(array, i + 1, tmp, comb); - } - } -} diff --git a/alm/interaction.h b/alm/interaction.h deleted file mode 100644 index c62cef8a..00000000 --- a/alm/interaction.h +++ /dev/null @@ -1,288 +0,0 @@ -/* - interaction.h - - Copyright (c) 2014 Terumasa Tadano - - This file is distributed under the terms of the MIT license. - Please see the file 'LICENCE.txt' in the root directory - or http://opensource.org/licenses/mit-license.php for information. -*/ - -#pragma once - -#include -#include -#include -#include -#include -#include "pointers.h" -#include "constants.h" - - -namespace ALM_NS -{ - class IntList - { - public: - std::vector iarray; - - IntList() - { - iarray.clear(); - } - - IntList(const IntList &a) - { - for (std::vector::const_iterator p = a.iarray.begin(); p != a.iarray.end(); ++p) { - iarray.push_back(*p); - } - } - - IntList(const int n, const int *arr) - { - for (int i = 0; i < n; ++i) { - iarray.push_back(arr[i]); - } - } - - bool operator<(const IntList &a) const - { - return std::lexicographical_compare(iarray.begin(), iarray.end(), - a.iarray.begin(), a.iarray.end()); - } - }; - - class InteractionCluster - { - public: - std::vector x; - - InteractionCluster(); - - InteractionCluster(const double *arr) - { - for (int i = 0; i < 3; ++i) { - x.push_back(arr[i]); - } - } - - bool operator<(const InteractionCluster &a) const - { - return std::lexicographical_compare(x.begin(), x.end(), - a.x.begin(), a.x.end()); - } - }; - - - class DistInfo - { - public: - int cell; - double dist; - double relvec[3]; - - DistInfo(); - - DistInfo(const int n, const double d, const double x[3]) - { - cell = n; - dist = d; - for (int i = 0; i < 3; ++i) relvec[i] = x[i]; - } - - DistInfo(const DistInfo &obj) - { - cell = obj.cell; - dist = obj.dist; - for (int i = 0; i < 3; ++i) relvec[i] = obj.relvec[i]; - } - - bool operator<(const DistInfo &a) const - { - return dist < a.dist; - } - }; - - class DistList - { - public: - int atom; - double dist; - - DistList(); - - DistList(int n, double dist_tmp) - { - atom = n; - dist = dist_tmp; - } - - bool operator<(const DistList &a) const - { - if (std::abs(dist - a.dist) > eps8) { - return dist < a.dist; - } else { - return atom < a.atom; - } - } - }; - - class MinDistList - { - public: - std::vector cell; - std::vector dist; - - MinDistList(); - - MinDistList(const std::vector cell_in, - const std::vector dist_in) - { - for (std::vector::const_iterator it = cell_in.begin(); it != cell_in.end(); ++it) { - cell.push_back(*it); - } - for (std::vector::const_iterator it = dist_in.begin(); it != dist_in.end(); ++it) { - dist.push_back(*it); - } - } - - static bool compare_sum_distance(const MinDistList &a, const MinDistList &b) - { - double dist_a = 0; - double dist_b = 0; - - for (int i = 0; i < a.dist.size(); ++i) { - dist_a += a.dist[i]; - } - for (int i = 0; i < b.dist.size(); ++i) { - dist_b += b.dist[i]; - } - return dist_a < dist_b; - } - - static bool compare_max_distance(const MinDistList &a, const MinDistList &b) - { - // This function works properly when dvec_a.size() > 0 and dvec_b.size() > 0 - std::vector dvec_a, dvec_b; - std::copy(a.dist.begin(), a.dist.end(), std::back_inserter(dvec_a)); - std::copy(b.dist.begin(), b.dist.end(), std::back_inserter(dvec_b)); - double max_dist_a = *std::max_element(dvec_a.begin(), dvec_a.end()); - double max_dist_b = *std::max_element(dvec_b.begin(), dvec_b.end()); - - return max_dist_a < max_dist_b; - } - }; - - class MinimumDistanceCluster - { - public: - std::vector atom; - std::vector> cell; - double distmax; - - MinimumDistanceCluster(); - - MinimumDistanceCluster(const std::vector atom_in, - const std::vector> cell_in, - const double dist_in) - { - for (int i = 0; i < atom_in.size(); ++i) { - atom.push_back(atom_in[i]); - } - for (int i = 0; i < cell_in.size(); ++i) { - cell.push_back(cell_in[i]); - } - distmax = dist_in; - } - - MinimumDistanceCluster(const std::vector atom_in, - const std::vector> cell_in) - { - for (int i = 0; i < atom_in.size(); ++i) { - atom.push_back(atom_in[i]); - } - for (int i = 0; i < cell_in.size(); ++i) { - cell.push_back(cell_in[i]); - } - } - - bool operator<(const MinimumDistanceCluster &a) const - { - return lexicographical_compare(atom.begin(), atom.end(), - a.atom.begin(), a.atom.end()); - } - }; - - class Interaction: protected Pointers - { - public: - Interaction(class ALM *); - ~Interaction(); - - int is_periodic[3]; - int nneib; - int maxorder; - - int *nbody_include; - - double ***rcs; - double ***x_image; - int *exist_image; - - std::string *str_order; - std::vector **distall; - std::vector **mindist_pairs; - std::set *pairs; - std::vector **interaction_pair; - std::set **mindist_cluster; - - void init(); - double distance(double *, double *); - int nbody(const int, const int *); - bool is_incutoff(const int, int *, const int); - bool is_incutoff2(const int, int *, const int); - - template - void insort(int n, T *arr) - { - int i, j; - T tmp; - - for (i = 1; i < n; ++i) { - tmp = arr[i]; - for (j = i - 1; j >= 0 && arr[j] > tmp; --j) { - arr[j + 1] = arr[j]; - } - arr[j + 1] = tmp; - } - } - - private: - void generate_coordinate_of_periodic_images(const unsigned int, double **, - const int [3], double ***, int *); - - void get_pairs_of_minimum_distance(int, double ***, int *, - std::vector **, - std::vector **); - - void print_neighborlist(std::vector **); - void search_interactions(std::vector **, std::set *); - void set_ordername(); - - void calc_mindist_clusters(std::vector **, - std::vector **, - std::vector **, - int *, std::set **); - - void calc_mindist_clusters2(std::vector **, - std::vector **, - std::vector **, - int *, std::set **); - - void cell_combination(std::vector>, - int, std::vector, - std::vector> &); - - void generate_pairs(std::set *, std::set **); - }; -} diff --git a/alm/main.cpp b/alm/main.cpp index 0c30fd67..fad11678 100644 --- a/alm/main.cpp +++ b/alm/main.cpp @@ -8,17 +8,19 @@ or http://opensource.org/licenses/mit-license.php for information. */ -#include -#include -#include "alamode.h" +#include "alm_cui.h" +#include using namespace ALM_NS; -int main(int argc, char **argv) +int main(const int argc, + char **argv) { - ALM *alm = new ALM(argc, argv); + const auto alm_cui = new ALMCUI(); - delete alm; + alm_cui->run(argc, argv); + + delete alm_cui; return EXIT_SUCCESS; } diff --git a/alm/memory.cpp b/alm/memory.cpp deleted file mode 100644 index 7bb3911c..00000000 --- a/alm/memory.cpp +++ /dev/null @@ -1,21 +0,0 @@ -/* - memory.cpp - - Copyright (c) 2014 Terumasa Tadano - - This file is distributed under the terms of the MIT license. - Please see the file 'LICENCE.txt' in the root directory - or http://opensource.org/licenses/mit-license.php for information. -*/ - -#include "memory.h" - -using namespace ALM_NS; - -Memory::Memory(ALM *alm) : Pointers(alm) -{ -} - -Memory::~Memory() -{ -}; diff --git a/alm/memory.h b/alm/memory.h index b03fd92e..cb3df176 100644 --- a/alm/memory.h +++ b/alm/memory.h @@ -1,173 +1,189 @@ /* memory.h - Copyright (c) 2014 Terumasa Tadano + Copyright (c) 2014, 2015, 2016 Terumasa Tadano This file is distributed under the terms of the MIT license. - Please see the file 'LICENCE.txt' in the root directory + Please see the file 'LICENCE.txt' in the root directory or http://opensource.org/licenses/mit-license.php for information. */ #pragma once #include -#include -#include -#include "pointers.h" + +// memsize calculator namespace ALM_NS { - class Memory: protected Pointers + inline size_t memsize_in_MB(const size_t size_of_one, + const size_t n1) { - public: - Memory(class ALM *); - ~Memory(); + const auto n = n1 * size_of_one; + return n / 1000000; + } - // allocator + inline size_t memsize_in_MB(const size_t size_of_one, + const size_t n1, + const size_t n2) + { + const auto n = n1 * n2 * size_of_one; + return n / 1000000; + } + + inline size_t memsize_in_MB(const size_t size_of_one, + const size_t n1, + const size_t n2, + const size_t n3) + { + const auto n = n1 * n2 * n3 * size_of_one; + return n / 1000000; + } + + inline size_t memsize_in_MB(const size_t size_of_one, + const size_t n1, + const size_t n2, + const size_t n3, + const size_t n4) + { + const auto n = n1 * n2 * n3 * n4 * size_of_one; + return n / 1000000; + } - template - T* allocate(T *&arr, const A n1) - { - try { - arr = new T [n1]; - } - catch (std::bad_alloc &ba) { - std::cout << " Caught an exception when trying to allocate 1-dimensional array" << std::endl; - std::cout << " " << ba.what() << " : Array shape = " << n1 << std::endl; - std::cout << " " << ba.what() << " : Array size (MB) = " << memsize_in_MB(sizeof(T), n1) << std::endl; - exit(EXIT_FAILURE); - } - return arr; + // Declaration and definition must be located in the same file for template functions. + + /* allocator */ + + template + T* allocate(T *&arr, + const size_t n1) + { + try { + arr = new T[n1]; + } + catch (std::bad_alloc &ba) { + std::cout << " Caught an exception when trying to allocate 1-dimensional array" << std::endl; + std::cout << " " << ba.what() << " : Array shape = " << n1 << std::endl; + std::cout << " " << ba.what() << " : Array size (MB) = " << memsize_in_MB(sizeof(T), n1) << std::endl; + std::exit(EXIT_FAILURE); } + return arr; + } - template - T** allocate(T **&arr, const unsigned int n1, const unsigned int n2) - { - try { - arr = new T *[n1]; - arr[0] = new T [n1 * n2]; - for (unsigned int i = 1; i < n1; ++i) { - arr[i] = arr[0] + i * n2; - } - } - catch (std::bad_alloc &ba) { - std::cout << " Caught an exception when trying to allocate 2-dimensional array" << std::endl; - std::cout << " " << ba.what() << " : Array shape = " << n1 << "x" << n2 << std::endl; - std::cout << " " << ba.what() << " : Array size (MB) = " << memsize_in_MB(sizeof(T), n1, n2) << std::endl; - exit(EXIT_FAILURE); + template + T** allocate(T **&arr, + const size_t n1, + const size_t n2) + { + try { + arr = new T *[n1]; + arr[0] = new T[n1 * n2]; + for (size_t i = 1; i < n1; ++i) { + arr[i] = arr[0] + i * n2; } - return arr; } - - template - T*** allocate(T ***&arr, const unsigned int n1, const unsigned int n2, const unsigned int n3) - { - try { - arr = new T **[n1]; - arr[0] = new T *[n1 * n2]; - arr[0][0] = new T [n1 * n2 * n3]; - for (unsigned int i = 0; i < n1; ++i) { - arr[i] = arr[0] + i * n2; - for (unsigned int j = 0; j < n2; ++j) { - arr[i][j] = arr[0][0] + i * n2 * n3 + j * n3; - } + catch (std::bad_alloc &ba) { + std::cout << " Caught an exception when trying to allocate 2-dimensional array" << std::endl; + std::cout << " " << ba.what() << " : Array shape = " << n1 << "x" << n2 << std::endl; + std::cout << " " << ba.what() << " : Array size (MB) = " << memsize_in_MB(sizeof(T), n1, n2) << std::endl; + std::exit(EXIT_FAILURE); + } + return arr; + } + + template + T*** allocate(T ***&arr, + const size_t n1, + const size_t n2, + const size_t n3) + { + try { + arr = new T **[n1]; + arr[0] = new T *[n1 * n2]; + arr[0][0] = new T[n1 * n2 * n3]; + for (size_t i = 0; i < n1; ++i) { + arr[i] = arr[0] + i * n2; + for (size_t j = 0; j < n2; ++j) { + arr[i][j] = arr[0][0] + i * n2 * n3 + j * n3; } } - catch (std::bad_alloc &ba) { - std::cout << " Caught an exception when trying to allocate 3-dimensional array" << std::endl; - std::cout << " " << ba.what() << " : Array shape = " << n1 << "x" << n2 << "x" << n3 << std::endl; - std::cout << " " << ba.what() << " : Array size (MB) = " << memsize_in_MB(sizeof(T), n1, n2, n3) << std::endl; - exit(EXIT_FAILURE); - } - return arr; } - - template - T**** allocate(T ****&arr, const unsigned int n1, const unsigned int n2, const unsigned int n3, const unsigned int n4) - { - try { - arr = new T ***[n1]; - arr[0] = new T **[n1 * n2]; - arr[0][0] = new T *[n1 * n2 * n3]; - arr[0][0][0] = new T [n1 * n2 * n3 * n4]; - - for (unsigned int i = 0; i < n1; ++i) { - arr[i] = arr[0] + i * n2; - for (unsigned int j = 0; j < n2; ++j) { - arr[i][j] = arr[0][0] + i * n2 * n3 + j * n3; - for (unsigned int k = 0; k < n3; ++k) { - arr[i][j][k] = arr[0][0][0] + i * n2 * n3 * n4 + j * n3 * n4 + k * n4; - } + catch (std::bad_alloc &ba) { + std::cout << " Caught an exception when trying to allocate 3-dimensional array" << std::endl; + std::cout << " " << ba.what() << " : Array shape = " << n1 << "x" << n2 << "x" << n3 << std::endl; + std::cout << " " << ba.what() << " : Array size (MB) = " << memsize_in_MB(sizeof(T), n1, n2, n3) << std:: + endl; + std::exit(EXIT_FAILURE); + } + return arr; + } + + template + T**** allocate(T ****&arr, + const size_t n1, + const size_t n2, + const size_t n3, + const size_t n4) + { + try { + arr = new T ***[n1]; + arr[0] = new T **[n1 * n2]; + arr[0][0] = new T *[n1 * n2 * n3]; + arr[0][0][0] = new T[n1 * n2 * n3 * n4]; + + for (size_t i = 0; i < n1; ++i) { + arr[i] = arr[0] + i * n2; + for (size_t j = 0; j < n2; ++j) { + arr[i][j] = arr[0][0] + i * n2 * n3 + j * n3; + for (size_t k = 0; k < n3; ++k) { + arr[i][j][k] = arr[0][0][0] + i * n2 * n3 * n4 + j * n3 * n4 + k * n4; } } } - catch (std::bad_alloc &ba) { - std::cout << " Caught an exception when trying to allocate 4-dimensional array" << std::endl; - std::cout << " " << ba.what() << " : Array shape = " << n1 << "x" << n2 << "x" << n3 << "x" << n4 << std::endl; - std::cout << " " << ba.what() << " : Array size (MB) = " << memsize_in_MB(sizeof(T), n1, n2, n3, n4) << std::endl; - exit(EXIT_FAILURE); - } - return arr; } - - // deallocator - - template - void deallocate(T *&arr) - { - delete [] arr; - } - - template - void deallocate(T **&arr) - { - delete [] arr[0]; - delete [] arr; - } - - template - void deallocate(T ***&arr) - { - delete [] arr[0][0]; - delete [] arr[0]; - delete [] arr; + catch (std::bad_alloc &ba) { + std::cout << " Caught an exception when trying to allocate 4-dimensional array" << std::endl; + std::cout << " " << ba.what() << " : Array shape = " << n1 << "x" << n2 << "x" << n3 << "x" << n4 << std:: + endl; + std::cout << " " << ba.what() << " : Array size (MB) = " << memsize_in_MB(sizeof(T), n1, n2, n3, n4) << std + :: + endl; + std::exit(EXIT_FAILURE); } + return arr; + } - template - void deallocate(T ****&arr) - { - delete [] arr[0][0][0]; - delete [] arr[0][0]; - delete [] arr[0]; - delete [] arr; - } - // memsize calculator + /* deallocator */ - template - unsigned long memsize_in_MB(const int size_of_one, const A n1) - { - unsigned long n = static_cast(n1) * size_of_one; - return n / 1000000; - } + template + void deallocate(T *&arr) + { + delete[] arr; + } - unsigned long memsize_in_MB(const int size_of_one, const unsigned int n1, const unsigned int n2) - { - unsigned long n = n1 * n2 * size_of_one; - return n / 1000000; - } + template + void deallocate(T **&arr) + { + delete[] arr[0]; + delete[] arr; + } - unsigned long memsize_in_MB(const int size_of_one, const unsigned int n1, const unsigned int n2, const unsigned int n3) - { - unsigned long n = n1 * n2 * n3 * size_of_one; - return n / 1000000; - } + template + void deallocate(T ***&arr) + { + delete[] arr[0][0]; + delete[] arr[0]; + delete[] arr; + } - unsigned long memsize_in_MB(const int size_of_one, const unsigned int n1, const unsigned int n2, const unsigned int n3, const unsigned int n4) - { - unsigned long n = n1 * n2 * n3 * n4 * size_of_one; - return n / 1000000; - } - }; + template + void deallocate(T ****&arr) + { + delete[] arr[0][0][0]; + delete[] arr[0][0]; + delete[] arr[0]; + delete[] arr; + } } diff --git a/alm/optimize.cpp b/alm/optimize.cpp new file mode 100644 index 00000000..08379282 --- /dev/null +++ b/alm/optimize.cpp @@ -0,0 +1,2738 @@ +/* + optimize.cpp + + Copyright (c) 2014-2018 Terumasa Tadano + + This file is distributed under the terms of the MIT license. + Please see the file 'LICENCE.txt' in the root directory + or http://opensource.org/licenses/mit-license.php for information. +*/ + +#include "optimize.h" +#include "files.h" +#include "constants.h" +#include "constraint.h" +#include "error.h" +#include "fcs.h" +#include "input_parser.h" +#include "mathfunctions.h" +#include "memory.h" +#include "symmetry.h" +#include "timer.h" +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +using namespace ALM_NS; + +Optimize::Optimize() +{ + set_default_variables(); +} + +Optimize::~Optimize() +{ + deallocate_variables(); +} + +void Optimize::set_default_variables() +{ + params = nullptr; +} + +void Optimize::deallocate_variables() +{ + if (params) { + deallocate(params); + } +} + +int Optimize::optimize_main(const Symmetry *symmetry, + Constraint *constraint, + const Fcs *fcs, + const int maxorder, + const std::string file_prefix, + const std::vector &str_order, + const int verbosity, + const DispForceFile &filedata_train, + const DispForceFile &filedata_validation, + Timer *timer) +{ + timer->start_clock("optimize"); + + const auto natmin = symmetry->get_nat_prim(); + + const auto ndata_used = filedata_train.nend - filedata_train.nstart + 1 + - filedata_train.skip_e + filedata_train.skip_s; + const auto ndata_used_validation = filedata_validation.nend - filedata_validation.nstart + 1; + const auto ntran = symmetry->get_ntran(); + auto info_fitting = 0; + const auto M = get_number_of_rows_sensing_matrix(); + const auto M_validation = 3 * natmin * ndata_used_validation * ntran; + size_t N = 0; + size_t N_new = 0; + for (auto i = 0; i < maxorder; ++i) { + N += fcs->get_nequiv()[i].size(); + } + + if (constraint->get_constraint_algebraic()) { + for (auto i = 0; i < maxorder; ++i) { + N_new += constraint->get_index_bimap(i).size(); + } + } + + if (verbosity > 0) { + std::vector str_linearmodel{"least-squares", "elastic-net"}; + std::cout << " OPTIMIZATION\n"; + std::cout << " ============\n\n"; + std::cout << " LMODEL = " << str_linearmodel[optcontrol.linear_model - 1] << "\n\n"; + if (filedata_train.filename_second.empty()) { + std::cout << " Training data file (DFSET) : " << filedata_train.filename << "\n\n"; + } else { + std::cout << " Training data file (DFILE) : " << filedata_train.filename << "\n"; + std::cout << " Training data file (FFILE) : " << filedata_train.filename_second << "\n\n"; + } + std::cout << " NSTART = " << filedata_train.nstart << "; NEND = " << filedata_train.nend << '\n'; + if (filedata_train.skip_s < filedata_train.skip_e) + std::cout << ": SKIP = " << filedata_train.skip_s << "-" << + filedata_train.skip_e - 1 << '\n'; + std::cout << " " << ndata_used + << " entries will be used for training.\n\n"; + + if (optcontrol.cross_validation == -1) { + std::cout << " CV = -1 : Manual cross-validation mode is selected\n"; + std::cout << " Validation data file (DFSET_CV) : " << filedata_validation.filename << "\n\n"; + std::cout << " NSTART_CV = " << filedata_validation.nstart << "; NEND_CV = " << filedata_validation.nend << + std::endl; + std::cout << " " << ndata_used_validation + << " entries will be used for validation." << std::endl << std::endl; + } + + std::cout << " Total Number of Parameters : " << N << '\n'; + if (constraint->get_constraint_algebraic()) { + std::cout << " Total Number of Free Parameters : " << N_new << '\n'; + } + std::cout << '\n'; + } + + // Run optimization and obtain force constants + + std::vector fcs_tmp(N, 0.0); + + if (optcontrol.linear_model == 1) { + + // Use ordinary least-squares + + info_fitting = least_squares(maxorder, + N, + N_new, + M, + verbosity, + symmetry, + fcs, + constraint, + fcs_tmp); + + } else if (optcontrol.linear_model == 2) { + + // Use elastic net + + if (!constraint->get_constraint_algebraic()) { + exit("optimize_main", + "Sorry, ICONST = 10 or ICONST = 11 must be used when using elastic net."); + } + + info_fitting = elastic_net(file_prefix, + maxorder, + N_new, + M, + symmetry, + str_order, + fcs, + constraint, + verbosity, + fcs_tmp); + } + + if (info_fitting == 0) { + // I should copy fcs_tmp to parameters in the Fcs class? + + // Copy force constants to public variable "params" + if (params) { + deallocate(params); + } + allocate(params, N); + for (auto i = 0; i < N; ++i) params[i] = fcs_tmp[i]; + } + + fcs_tmp.clear(); + fcs_tmp.shrink_to_fit(); + + if (verbosity > 0) { + std::cout << std::endl; + timer->print_elapsed(); + std::cout << " -------------------------------------------------------------------" << std::endl; + std::cout << std::endl; + } + + timer->stop_clock("optimize"); + + return info_fitting; +} + +int Optimize::least_squares(const int maxorder, + const size_t N, + const size_t N_new, + const size_t M, + const int verbosity, + const Symmetry *symmetry, + const Fcs *fcs, + const Constraint *constraint, + std::vector ¶m_out) const +{ + auto info_fitting = 0; + + std::vector amat; + std::vector bvec; + + if (constraint->get_constraint_algebraic()) { + + // Apply constraints algebraically. (ICONST = 2, 3 is not supported.) + // SPARSE = 1 is used only when the constraints are considered algebraically. + + // Calculate matrix elements for fitting + + double fnorm; + const auto nrows = get_number_of_rows_sensing_matrix(); + const unsigned long ncols = static_cast(N_new); + + if (optcontrol.use_sparse_solver) { + + // Use a solver for sparse matrix + // (Requires less memory for sparse inputs.) + + SpMat sp_amat(nrows, ncols); + Eigen::VectorXd sp_bvec(nrows); + + get_matrix_elements_in_sparse_form(maxorder, + sp_amat, + sp_bvec, + u_train, + f_train, + fnorm, + symmetry, + fcs, + constraint); + if (verbosity > 0) { + std::cout << " Now, start fitting ..." << std::endl; + } + + info_fitting = run_eigen_sparse_solver(sp_amat, + sp_bvec, + param_out, + fnorm, + maxorder, + fcs, + constraint, + optcontrol.sparsesolver, + verbosity); + + } else { + + // Use a direct solver for a dense matrix + + amat.resize(nrows * ncols, 0.0); + bvec.resize(nrows, 0.0); + + get_matrix_elements_algebraic_constraint(maxorder, + amat, + bvec, + u_train, + f_train, + fnorm, + symmetry, + fcs, + constraint); + + // Perform fitting with SVD + + info_fitting + = fit_algebraic_constraints(N_new, + M, + &amat[0], + &bvec[0], + param_out, + fnorm, + maxorder, + fcs, + constraint, + verbosity); + } + + } else { + + // Apply constraints numerically (ICONST=2 is supported) + + if (optcontrol.use_sparse_solver && verbosity > 0) { + std::cout << " WARNING: SPARSE = 1 works only with ICONST = 10 or ICONST = 11." << std::endl; + std::cout << " Use a solver for dense matrix." << std::endl; + } + + get_matrix_elements(maxorder, + amat, + bvec, + u_train, + f_train, + symmetry, + fcs); + + // Perform fitting with SVD or QRD + + assert(!amat.empty()); + assert(!bvec.empty()); + + if (constraint->get_exist_constraint()) { + info_fitting + = fit_with_constraints(N, + M, + constraint->get_number_of_constraints(), + &amat[0], + &bvec[0], + ¶m_out[0], + constraint->get_const_mat(), + constraint->get_const_rhs(), + verbosity); + } else { + info_fitting + = fit_without_constraints(N, + M, + &amat[0], + &bvec[0], + ¶m_out[0], + verbosity); + } + } + + + return info_fitting; +} + + +int Optimize::elastic_net(const std::string job_prefix, + const int maxorder, + const size_t N_new, + const size_t M, + const Symmetry *symmetry, + const std::vector &str_order, + const Fcs *fcs, + Constraint *constraint, + const int verbosity, + std::vector ¶m_out) +{ + auto info_fitting = 0; + + std::vector param_tmp(N_new, 0.0); + + // Scale displacements if DNORM is not 1 and the data is not standardized. + const int scale_displacement + = std::abs(optcontrol.displacement_normalization_factor - 1.0) > eps + && optcontrol.standardize == 0; + + if (scale_displacement) { + apply_scalers(maxorder, constraint); + } + + if (optcontrol.cross_validation == 0) { + + // Optimize with a given L1 coefficient (l1_alpha) + info_fitting = run_elastic_net_optimization(maxorder, + M, + N_new, + fcs, + symmetry, + constraint, + verbosity, + param_tmp); + + } else { + + // Run cross validation (manually or automatically) + info_fitting = run_elastic_net_crossvalidation(job_prefix, + maxorder, + fcs, + symmetry, + constraint, + verbosity); + } + + if (verbosity > 0 && info_fitting == 0) { + size_t iparam = 0; + std::vector nzero_lasso(maxorder); + + for (auto i = 0; i < maxorder; ++i) { + nzero_lasso[i] = 0; + for (const auto &it : constraint->get_index_bimap(i)) { + const auto inew = it.left + iparam; + if (std::abs(param_tmp[inew]) < eps) ++nzero_lasso[i]; + } + iparam += constraint->get_index_bimap(i).size(); + } + + for (auto order = 0; order < maxorder; ++order) { + std::cout << " Number of non-zero " << std::setw(9) << str_order[order] << " FCs : " + << constraint->get_index_bimap(order).size() - nzero_lasso[order] << std::endl; + } + std::cout << std::endl; + } + + // Scale back force constants + + if (scale_displacement) { + apply_scaler_force_constants(maxorder, + optcontrol.displacement_normalization_factor, + constraint, + param_tmp); + finalize_scalers(maxorder, + constraint); + } + + recover_original_forceconstants(maxorder, + param_tmp, + param_out, + fcs->get_nequiv(), + constraint); + return info_fitting; +} + +int Optimize::run_elastic_net_crossvalidation(const std::string job_prefix, + const int maxorder, + const Fcs *fcs, + const Symmetry *symmetry, + const Constraint *constraint, + const int verbosity) +{ + // Cross-validation mode + + + if (verbosity > 0) { + std::cout << " Elastic-net cross-validation with the following parameters:" << std::endl; + std::cout << " L1_RATIO = " << optcontrol.l1_ratio << std::endl; + std::cout << " CV = " << std::setw(15) << optcontrol.cross_validation << std::endl; + std::cout << " CV_MINALPHA = " << std::setw(15) << optcontrol.l1_alpha_min; + std::cout << " CV_MAXALPHA = " << std::setw(15) << optcontrol.l1_alpha_max << std::endl; + std::cout << " CV_NALPHA = " << std::setw(5) << optcontrol.num_l1_alpha << std::endl; + std::cout << " CONV_TOL = " << std::setw(15) << optcontrol.tolerance_iteration << std::endl; + std::cout << " MAXITER = " << std::setw(5) << optcontrol.maxnum_iteration << std::endl; + std::cout << " ENET_DNORM = " << std::setw(15) << optcontrol.displacement_normalization_factor << std::endl; + std::cout << std::endl; + + if (optcontrol.standardize) { + std::cout << " STANDARDIZE = 1 : Standardization will be performed for matrix A and vector b." << std:: + endl; + std::cout << " The ENET_DNORM-tag will be neglected." << std::endl; + } else { + std::cout << " STANDARDIZE = 0 : No standardization of matrix A and vector b." << std::endl; + std::cout << " Columns of matrix A will be scaled by the ENET_DNORM value." << std:: + endl; + } + std::cout << std::endl; + + if (optcontrol.cross_validation == -1) { + std::cout << " CV = -1: Manual CV mode." << std::endl; + std::cout << " Validation data is read from DFSET_CV" << std::endl; + } else if (optcontrol.cross_validation > 0) { + std::cout << " CV > 0: Automatic CV mode." << std::endl; + } else { + exit("run_elastic_net_crossvalidation", + "This cannot happen."); + } + std::cout << std::endl; + } + + + if (optcontrol.cross_validation == -1) { + + run_enetcv_manual(job_prefix, + maxorder, + fcs, + symmetry, + constraint, + verbosity); + + } else { + + run_enetcv_auto(job_prefix, + maxorder, + fcs, + symmetry, + constraint, + verbosity); + } + + return 1; +} + +void Optimize::run_enetcv_manual(const std::string job_prefix, + const int maxorder, + const Fcs *fcs, + const Symmetry *symmetry, + const Constraint *constraint, + const int verbosity) const +{ + // Manual CV mode where the test data is read from the user-defined file. + // Indeed, the test data is already read in the input_parser and stored in u_validation and f_validation. + + std::vector amat_1D, amat_1D_validation; + std::vector bvec, bvec_validation; + std::vector alphas, training_error, validation_error; + std::vector> nonzeros; + double fnorm, fnorm_validation; + + size_t N_new = 0; + if (constraint->get_constraint_algebraic()) { + for (auto i = 0; i < maxorder; ++i) { + N_new += constraint->get_index_bimap(i).size(); + } + } + + get_matrix_elements_algebraic_constraint(maxorder, + amat_1D, + bvec, + u_train, + f_train, + fnorm, + symmetry, + fcs, + constraint); + + get_matrix_elements_algebraic_constraint(maxorder, + amat_1D_validation, + bvec_validation, + u_validation, + f_validation, + fnorm_validation, + symmetry, + fcs, + constraint); + + Eigen::MatrixXd A = Eigen::Map(&amat_1D[0], amat_1D.size() / N_new, N_new); + Eigen::VectorXd b = Eigen::Map(&bvec[0], bvec.size()); + Eigen::MatrixXd A_validation = Eigen::Map(&amat_1D_validation[0], + amat_1D_validation.size() / N_new, N_new); + Eigen::VectorXd b_validation = Eigen::Map(&bvec_validation[0], bvec_validation.size()); + + if (verbosity > 0) { + Eigen::VectorXd mean = Eigen::VectorXd::Zero(A.cols()); + Eigen::VectorXd dev = Eigen::VectorXd::Ones(A.cols()); + + if (optcontrol.standardize) { + Eigen::VectorXd factor_std, scale_beta; + factor_std.resize(A.cols()); + scale_beta.resize(A.cols()); + get_standardizer(A, mean, dev, factor_std, scale_beta); + } + std::cout << " Recommended CV_MAXALPHA = " + << get_esimated_max_alpha(A, b, mean, dev) + << std::endl << std::endl; + } + + const auto file_coef = job_prefix + ".solution_path"; + const auto file_cv = job_prefix + ".enet_cv"; + + compute_alphas(alphas); + + run_enet_solution_path(maxorder, A, b, A_validation, b_validation, + fnorm, fnorm_validation, + file_coef, verbosity, + constraint, + alphas, + training_error, validation_error, nonzeros); + + write_cvresult_to_file(file_cv, + alphas, + training_error, + validation_error, + nonzeros); + + if (verbosity > 0) { + std::cout << " The manual CV has been done." << std::endl; + std::cout << " Minimum validation error at alpha = " + << alphas[get_ialpha_at_minimum_validation_error(validation_error)] << std::endl; + std::cout << " The CV result is saved in " << file_cv << std::endl; + } +} + +void Optimize::run_enetcv_auto(const std::string job_prefix, + const int maxorder, + const Fcs *fcs, + const Symmetry *symmetry, + const Constraint *constraint, + const int verbosity) +{ + // Automatic CV mode. + + size_t N_new = 0; + if (constraint->get_constraint_algebraic()) { + for (auto i = 0; i < maxorder; ++i) { + N_new += constraint->get_index_bimap(i).size(); + } + } + + const auto nstructures = u_train.size(); + const auto nsets = optcontrol.cross_validation; + + if (nsets > nstructures) { + exit("run_elastic_net_crossvalidation", + "The input CV is larger than the total number of training data."); + } + + std::vector ndata_block(nsets, nstructures / nsets); + for (auto iset = 0; iset < nsets; ++iset) { + if (nstructures - nsets * (nstructures / nsets) > iset) { + ++ndata_block[iset]; + } + } + + std::vector> u_train_tmp, u_validation_tmp; + std::vector> f_train_tmp, f_validation_tmp; + + std::vector amat_1D, amat_1D_validation; + std::vector bvec, bvec_validation; + std::vector alphas, training_error, validation_error; + std::vector> nonzeros; + std::vector> training_error_accum, validation_error_accum; + double fnorm, fnorm_validation; + + auto ishift = 0; + + compute_alphas(alphas); + + if (verbosity > 0) { + std::cout << " Start " << nsets << "-fold CV" << std::endl; + } + + for (auto iset = 0; iset < nsets; ++iset) { + + if (verbosity > 0) { + std::cout << std::endl; + std::cout << " SET : " << std::setw(3) << iset + 1 << std::endl; + } + const auto istart_validation = ishift; + const auto iend_validation = istart_validation + ndata_block[iset]; + + u_train_tmp.clear(); + f_train_tmp.clear(); + u_validation_tmp.clear(); + f_validation_tmp.clear(); + + for (auto idata = 0; idata < nstructures; ++idata) { + if (idata >= istart_validation && idata < iend_validation) { + u_validation_tmp.emplace_back(u_train[idata]); + f_validation_tmp.emplace_back(f_train[idata]); + } else { + u_train_tmp.emplace_back(u_train[idata]); + f_train_tmp.emplace_back(f_train[idata]); + } + } + ishift += ndata_block[iset]; + + get_matrix_elements_algebraic_constraint(maxorder, + amat_1D, + bvec, + u_train_tmp, + f_train_tmp, + fnorm, + symmetry, + fcs, + constraint); + + get_matrix_elements_algebraic_constraint(maxorder, + amat_1D_validation, + bvec_validation, + u_validation_tmp, + f_validation_tmp, + fnorm_validation, + symmetry, + fcs, + constraint); + + Eigen::MatrixXd A = Eigen::Map(&amat_1D[0], amat_1D.size() / N_new, N_new); + Eigen::VectorXd b = Eigen::Map(&bvec[0], bvec.size()); + + Eigen::MatrixXd A_validation = Eigen::Map(&amat_1D_validation[0], + amat_1D_validation.size() / N_new, N_new); + Eigen::VectorXd b_validation = Eigen::Map(&bvec_validation[0], bvec_validation.size()); + + + if (verbosity > 0) { + Eigen::VectorXd mean = Eigen::VectorXd::Zero(A.cols()); + Eigen::VectorXd dev = Eigen::VectorXd::Ones(A.cols()); + + if (optcontrol.standardize) { + Eigen::VectorXd factor_std, scale_beta; + factor_std.resize(A.cols()); + scale_beta.resize(A.cols()); + get_standardizer(A, mean, dev, factor_std, scale_beta); + } + std::cout << " Recommended CV_MAXALPHA = " + << get_esimated_max_alpha(A, b, mean, dev) + << std::endl << std::endl; + } + + const auto file_coef = job_prefix + ".solution_path" + std::to_string(iset + 1); + const auto file_cv = job_prefix + ".enet_cvset" + std::to_string(iset + 1); + + + run_enet_solution_path(maxorder, A, b, A_validation, b_validation, + fnorm, fnorm_validation, + file_coef, verbosity, + constraint, + alphas, + training_error, validation_error, nonzeros); + + write_cvresult_to_file(file_cv, + alphas, + training_error, + validation_error, + nonzeros); + + if (verbosity > 0) { + std::cout << " SET " << std::setw(3) << iset + 1 << " has been finished." << std::endl; + std::cout << " Minimum validation error at alpha = " + << alphas[get_ialpha_at_minimum_validation_error(validation_error)] << std::endl; + std::cout << " The CV result is saved in " << file_cv << std::endl << std::endl; + std::cout << " ---------------------------------------------------" << std::endl; + } + + training_error_accum.emplace_back(training_error); + validation_error_accum.emplace_back(validation_error); + } + + const auto file_cvscore = job_prefix + ".cvscore"; + const auto ialpha_minimum = write_cvscore_to_file(file_cvscore, + alphas, + training_error_accum, + validation_error_accum); + + if (verbosity > 0) { + std::cout << " Average and standard deviation of the CV error are" << std::endl; + std::cout << " saved in " << file_cvscore << std::endl; + std::cout << " Minimum CVSCORE at alpha = " << alphas[ialpha_minimum] << std::endl; + std::cout << std::endl; + } +} + +void Optimize::write_cvresult_to_file(const std::string file_out, + const std::vector &alphas, + const std::vector &training_error, + const std::vector &validation_error, + const std::vector> &nonzeros) const +{ + std::ofstream ofs_cv; + ofs_cv.open(file_out.c_str(), std::ios::out); + ofs_cv << "# Algorithm : Coordinate descent" << std::endl; + ofs_cv << "# L1_RATIO = " << optcontrol.l1_ratio << std::endl; + ofs_cv << "# ENET_DNORM = " << std::setw(15) << optcontrol.displacement_normalization_factor << std::endl; + ofs_cv << "# STANDARDIZE = " << optcontrol.standardize << std::endl; + ofs_cv << "# CONV_TOL = " << std::setw(15) << optcontrol.tolerance_iteration << std::endl; + ofs_cv << "# L1 ALPHA, Fitting error, Validation error, Num. zero IFCs (2nd, 3rd, ...) " << std::endl; + + const auto maxorder = nonzeros[0].size(); + for (auto ialpha = 0; ialpha < alphas.size(); ++ialpha) { + ofs_cv << std::setw(15) << alphas[ialpha]; + ofs_cv << std::setw(15) << training_error[ialpha]; + ofs_cv << std::setw(15) << validation_error[ialpha]; + for (auto i = 0; i < maxorder; ++i) { + ofs_cv << std::setw(10) << nonzeros[ialpha][i]; + } + ofs_cv << std::endl; + } + ofs_cv.close(); +} + +int Optimize::write_cvscore_to_file(const std::string file_out, + const std::vector &alphas, + const std::vector> &training_error_accum, + const std::vector> &validation_error_accum) const +{ + std::vector terr_mean, terr_std; + std::vector verr_mean, verr_std; + + const auto nalphas = alphas.size(); + terr_mean.resize(nalphas); + terr_std.resize(nalphas); + verr_mean.resize(nalphas); + verr_std.resize(nalphas); + + const auto nsets = training_error_accum.size(); + + double sum_t, sum2_t; + double sum_v, sum2_v; + const auto factor = 1.0 / static_cast(nsets); + + for (size_t ialpha = 0; ialpha < nalphas; ++ialpha) { + sum_t = 0.0; + sum2_t = 0.0; + sum_v = 0.0; + sum2_v = 0.0; + for (size_t iset = 0; iset < nsets; ++iset) { + sum_t += training_error_accum[iset][ialpha]; + sum2_t += training_error_accum[iset][ialpha] + * training_error_accum[iset][ialpha]; + sum_v += validation_error_accum[iset][ialpha]; + sum2_v += validation_error_accum[iset][ialpha] + * validation_error_accum[iset][ialpha]; + } + sum_t *= factor; + sum2_t *= factor; + sum_v *= factor; + sum2_v *= factor; + terr_mean[ialpha] = sum_t; + terr_std[ialpha] = std::sqrt(sum2_t - sum_t * sum_t); + verr_mean[ialpha] = sum_v; + verr_std[ialpha] = std::sqrt(sum2_v - sum_v * sum_v); + } + + std::ofstream ofs_cv; + ofs_cv.open(file_out.c_str(), std::ios::out); + ofs_cv << "# Algorithm : Coordinate descent" << std::endl; + ofs_cv << "# L1_RATIO = " << optcontrol.l1_ratio << std::endl; + ofs_cv << "# ENET_DNORM = " << std::setw(15) << optcontrol.displacement_normalization_factor << std::endl; + ofs_cv << "# STANDARDIZE = " << optcontrol.standardize << std::endl; + ofs_cv << "# CONV_TOL = " << std::setw(15) << optcontrol.tolerance_iteration << std::endl; + ofs_cv << "# " << nsets << "-fold cross-validation scores" << std::endl; + ofs_cv << "# L1 ALPHA, Fitting error (mean, std), Validation error (mean, std) " << std::endl; + + for (size_t ialpha = 0; ialpha < nalphas; ++ialpha) { + ofs_cv << std::setw(15) << alphas[ialpha]; + ofs_cv << std::setw(15) << terr_mean[ialpha]; + ofs_cv << std::setw(15) << terr_std[ialpha]; + ofs_cv << std::setw(15) << verr_mean[ialpha]; + ofs_cv << std::setw(15) << verr_std[ialpha]; + ofs_cv << std::endl; + } + + const auto ialpha_minimum = get_ialpha_at_minimum_validation_error(verr_mean); + + ofs_cv << "# Minimum CVSCORE at alpha = " << alphas[ialpha_minimum] << std::endl; + ofs_cv.close(); + + return ialpha_minimum; +} + +int Optimize::get_ialpha_at_minimum_validation_error(const std::vector &validation_error) const +{ + return std::distance(validation_error.begin(), + std::min_element(validation_error.begin(), + validation_error.end())); +} + +void Optimize::run_enet_solution_path(const int maxorder, + Eigen::MatrixXd &A, + Eigen::VectorXd &b, + Eigen::MatrixXd &A_validation, + Eigen::VectorXd &b_validation, + const double fnorm, + const double fnorm_validation, + const std::string file_coef, + const int verbosity, + const Constraint *constraint, + const std::vector &alphas, + std::vector &training_error, + std::vector &validation_error, + std::vector> &nonzeros) const +{ + int initialize_mode; + + std::ofstream ofs_coef; + + std::vector params_tmp; + std::vector nzero_lasso(maxorder); + + bool *has_prod; + + Eigen::MatrixXd Prod; + Eigen::VectorXd grad0, grad, x; + Eigen::VectorXd scale_beta, scale_beta_enet; + Eigen::VectorXd factor_std; + Eigen::VectorXd fdiff, fdiff_validation; + Eigen::VectorXd mean, dev; + + size_t N_new = A.cols(); + size_t M = A.rows(); + size_t M_validation = A_validation.rows(); + + Prod.setZero(N_new, N_new); + grad0.resize(N_new); + grad.resize(N_new); + x.setZero(N_new); + scale_beta.resize(N_new); + scale_beta_enet.resize(N_new); + factor_std.resize(N_new); + fdiff.resize(M); + fdiff_validation.resize(M_validation); + + allocate(has_prod, N_new); + + for (size_t i = 0; i < N_new; ++i) { + has_prod[i] = false; + } + + if (optcontrol.save_solution_path) { + ofs_coef.open(file_coef.c_str(), std::ios::out); + ofs_coef << "# L1 ALPHA, coefficients" << std::endl; + params_tmp.resize(N_new); + } + + if (optcontrol.standardize) { + get_standardizer(A, mean, dev, factor_std, scale_beta); + apply_standardizer(A, mean, dev); + apply_standardizer(A_validation, mean, dev); + } else { + get_standardizer(A, mean, dev, factor_std, scale_beta); + } + + training_error.clear(); + validation_error.clear(); + nonzeros.clear(); + + // Start iteration + + grad0 = A.transpose() * b; + grad = grad0; + + if (verbosity == 1) std::cout << std::setw(3); + + for (size_t ialpha = 0; ialpha < alphas.size(); ++ialpha) { + + const auto l1_alpha = alphas[ialpha]; + + if (ialpha == 0) { + initialize_mode = 0; + } else { + initialize_mode = 1; + } + +#pragma omp parallel for + for (auto i = 0; i < N_new; ++i) { + scale_beta_enet(i) = 1.0 / (1.0 / scale_beta(i) + (1.0 - optcontrol.l1_ratio) * l1_alpha); + } + + coordinate_descent(M, N_new, l1_alpha, + initialize_mode, + x, A, b, grad0, has_prod, Prod, grad, fnorm, + scale_beta_enet, + verbosity); + + double correction_intercept = 0.0; + for (size_t i = 0; i < N_new; ++i) { + correction_intercept += x(i) * mean(i) * factor_std(i); + } + fdiff = A * x - b + correction_intercept * Eigen::VectorXd::Ones(M); + fdiff_validation = A_validation * x - b_validation + correction_intercept * Eigen::VectorXd::Ones(M_validation); + const auto res1 = fdiff.dot(fdiff) / (fnorm * fnorm); + const auto res2 = fdiff_validation.dot(fdiff_validation) / (fnorm_validation * fnorm_validation); + + get_number_of_zero_coefs(maxorder, + constraint, + x, + nzero_lasso); + + training_error.push_back(std::sqrt(res1)); + validation_error.push_back(std::sqrt(res2)); + nonzeros.push_back(nzero_lasso); + + if (optcontrol.save_solution_path) { + ofs_coef << std::setw(15) << l1_alpha; + + for (auto i = 0; i < N_new; ++i) params_tmp[i] = x[i]; + + apply_scaler_force_constants(maxorder, + optcontrol.displacement_normalization_factor, + constraint, + params_tmp); + + for (auto i = 0; i < N_new; ++i) { + ofs_coef << std::setw(15) << params_tmp[i]; + } + ofs_coef << std::endl; + } + + if (verbosity == 1) { + + std::cout << '.' << std::flush; + if (ialpha % 25 == 24) { + std::cout << std::endl; + std::cout << std::setw(3); + } + } + } + + if (verbosity == 1) std::cout << std::endl; + + if (optcontrol.save_solution_path) { + ofs_coef.close(); + params_tmp.clear(); + params_tmp.shrink_to_fit(); + } + deallocate(has_prod); +} + +void Optimize::compute_alphas(std::vector &alphas) const +{ + alphas.resize(optcontrol.num_l1_alpha); + for (auto ialpha = 0; ialpha < optcontrol.num_l1_alpha; ++ialpha) { + + const auto l1_alpha = optcontrol.l1_alpha_min + * std::pow(optcontrol.l1_alpha_max / optcontrol.l1_alpha_min, + static_cast(optcontrol.num_l1_alpha - ialpha - 1) / + static_cast(optcontrol.num_l1_alpha)); + + alphas[ialpha] = l1_alpha; + } +} + + +int Optimize::run_elastic_net_optimization(const int maxorder, + const size_t M, + const size_t N_new, + const Fcs *fcs, + const Symmetry *symmetry, + const Constraint *constraint, + const int verbosity, + std::vector ¶m_out) const +{ + // Start Lasso optimization + int i; + bool *has_prod; + double fnorm; + + Eigen::MatrixXd A, Prod; + Eigen::VectorXd b, grad0, grad, x; + Eigen::VectorXd scale_beta, factor_std; + Eigen::VectorXd fdiff; + Eigen::VectorXd mean, dev; + + std::vector amat_1D; + std::vector bvec; + + get_matrix_elements_algebraic_constraint(maxorder, + amat_1D, + bvec, + u_train, + f_train, + fnorm, + symmetry, + fcs, + constraint); + + // Coordinate descent + + A = Eigen::Map(&amat_1D[0], M, N_new); + b = Eigen::Map(&bvec[0], M); + + Prod.setZero(N_new, N_new); + grad0.resize(N_new); + grad.resize(N_new); + x.setZero(N_new); + scale_beta.resize(N_new); + factor_std.resize(N_new); + fdiff.resize(M); + + allocate(has_prod, N_new); + + for (i = 0; i < N_new; ++i) { + has_prod[i] = false; + } + + if (verbosity > 0) { + std::cout << " Elastic-net minimization with the following parameters:" << std::endl; + std::cout << " L1_RATIO = " << optcontrol.l1_ratio << std::endl; + std::cout << " L1_ALPHA = " << std::setw(15) << optcontrol.l1_alpha << std::endl; + std::cout << " CONV_TOL = " << std::setw(15) << optcontrol.tolerance_iteration << std::endl; + std::cout << " MAXITER = " << std::setw(5) << optcontrol.maxnum_iteration << std::endl; + std::cout << " ENET_DNORM = " << std::setw(15) << optcontrol.displacement_normalization_factor << std::endl; + + std::cout << std::endl; + if (optcontrol.standardize) { + std::cout << " STANDARDIZE = 1 : Standardization will be performed for matrix A and vector b." << std::endl; + std::cout << " The ENET_DNORM-tag will be neglected." << std::endl; + } else { + std::cout << " STANDARDIZE = 0 : No standardization of matrix A and vector b." << std::endl; + std::cout << " Columns of matrix A will be scaled by the ENET_DNORM value." << std::endl; + } + } + + // Standardize if necessary + + if (optcontrol.standardize) { + get_standardizer(A, mean, dev, factor_std, scale_beta); + apply_standardizer(A, mean, dev); + } else { + get_standardizer(A, mean, dev, factor_std, scale_beta); + } + + grad0 = A.transpose() * b; + grad = grad0; + +#pragma omp parallel for + for (i = 0; i < N_new; ++i) { + scale_beta(i) = 1.0 / (1.0 / scale_beta(i) + (1.0 - optcontrol.l1_ratio) * optcontrol.l1_alpha); + } + + // Coordinate Descent Method + coordinate_descent(M, N_new, optcontrol.l1_alpha, + 0, + x, A, b, grad0, has_prod, Prod, grad, fnorm, + scale_beta, + verbosity); + + for (i = 0; i < N_new; ++i) { + param_out[i] = x[i] * factor_std[i]; + } + + if (verbosity > 0) { + double correction_intercept = 0.0; + for (size_t i = 0; i < N_new; ++i) { + correction_intercept += x(i) * mean(i) * factor_std(i); + } + fdiff = A * x - b + correction_intercept * Eigen::VectorXd::Ones(M); + const auto res1 = fdiff.dot(fdiff) / (fnorm * fnorm); + std::cout << " RESIDUAL (%): " << std::sqrt(res1) * 100.0 << std::endl; + } + + deallocate(has_prod); + + if (optcontrol.debiase_after_l1opt) { + auto info = run_least_squares_with_nonzero_coefs(A, b, + factor_std, + param_out, + verbosity); + } + + return 0; +} + +int Optimize::run_least_squares_with_nonzero_coefs(const Eigen::MatrixXd &A_in, + const Eigen::VectorXd &b_in, + const Eigen::VectorXd &factor_std, + std::vector ¶ms_inout, + const int verbosity) const +{ + // Perform OLS fitting to the features selected by LASSO for reducing the bias. + + if (verbosity > 0) { + std::cout << " DEBIAS_OLS = 1: Attempt to reduce the bias of LASSO by performing OLS fitting" << std::endl; + std::cout << " with features selected by LASSO." << std::endl; + } + + const auto N_new = A_in.cols(); + const auto M = A_in.rows(); + + std::vector nonzero_index, zero_index; + + for (auto i = 0; i < N_new; ++i) { + if (std::abs(params_inout[i]) >= eps) { + nonzero_index.push_back(i); + } else { + zero_index.push_back(i); + } + } + + const auto N_nonzero = nonzero_index.size(); + Eigen::MatrixXd A_nonzero(M, N_nonzero); + + for (auto i = 0; i < N_nonzero; ++i) { + A_nonzero.col(i) = A_in.col(nonzero_index[i]); + } + Eigen::VectorXd x_nonzero = A_nonzero.colPivHouseholderQr().solve(b_in); + + for (auto i = 0; i < N_new; ++i) params_inout[i] = 0.0; + for (auto i = 0; i < N_nonzero; ++i) { + params_inout[nonzero_index[i]] = x_nonzero[i] * factor_std[nonzero_index[i]]; + } + + return 0; +} + +void Optimize::get_number_of_zero_coefs(const int maxorder, + const Constraint *constraint, + const Eigen::VectorXd &x, + std::vector &nzeros) const +{ + // Count the number of zero parameters + size_t iparam = 0; + nzeros.resize(maxorder); + for (auto i = 0; i < maxorder; ++i) { + nzeros[i] = 0; + for (const auto &it : constraint->get_index_bimap(i)) { + const auto inew = it.left + iparam; + if (std::abs(x[inew]) < eps) ++nzeros[i]; + + } + iparam += constraint->get_index_bimap(i).size(); + } +} + + +void Optimize::get_standardizer(const Eigen::MatrixXd &Amat, + Eigen::VectorXd &mean, + Eigen::VectorXd &dev, + Eigen::VectorXd &factor_std, + Eigen::VectorXd &scale_beta) const +{ + const auto nrows = Amat.rows(); + const auto ncols = Amat.cols(); + + if (mean.size() != ncols) mean.resize(ncols); + if (dev.size() != ncols) dev.resize(ncols); + if (factor_std.size() != ncols) factor_std.resize(ncols); + if (scale_beta.size() != ncols) scale_beta.resize(ncols); + + const auto inv_nrows = 1.0 / static_cast(nrows); + double sum1, sum2; + + if (optcontrol.standardize) { + for (auto j = 0; j < ncols; ++j) { + sum1 = Amat.col(j).sum() * inv_nrows; + sum2 = Amat.col(j).dot(Amat.col(j)) * inv_nrows; + mean(j) = sum1; + dev(j) = std::sqrt(sum2 - sum1 * sum1); + factor_std(j) = 1.0 / dev(j); + scale_beta(j) = 1.0; + } + } else { + for (auto j = 0; j < ncols; ++j) { + sum2 = Amat.col(j).dot(Amat.col(j)) * inv_nrows; + mean(j) = 0.0; + dev(j) = 1.0; + factor_std(j) = 1.0; + scale_beta(j) = 1.0 / sum2; + } + } +} + +void Optimize::apply_standardizer(Eigen::MatrixXd &Amat, + const Eigen::VectorXd &mean, + const Eigen::VectorXd &dev) const +{ + const auto ncols = Amat.cols(); + const auto nrows = Amat.rows(); + if (mean.size() != ncols || dev.size() != ncols) { + exit("apply_standardizer", "The number of colums is inconsistent."); + } + + for (auto i = 0; i < nrows; ++i) { + for (auto j = 0; j < ncols; ++j) { + Amat(i, j) = (Amat(i, j) - mean(j)) / dev(j); + } + } +} + +double Optimize::get_esimated_max_alpha(const Eigen::MatrixXd &Amat, + const Eigen::VectorXd &bvec, + const Eigen::VectorXd &mean, + const Eigen::VectorXd &dev) const +{ + const auto ncols = Amat.cols(); + const auto nrows = Amat.rows(); + Eigen::MatrixXd C = Amat; + + for (auto i = 0; i < nrows; ++i) { + for (auto j = 0; j < ncols; ++j) { + C(i, j) = (C(i, j) - mean(j)) / dev(j); + } + } + + C = C.transpose() * bvec; + auto lambda_max = 0.0; + + for (auto i = 0; i < ncols; ++i) { + lambda_max = std::max(lambda_max, std::abs(C(i))); + } + lambda_max /= static_cast(nrows); + + return lambda_max; +} + +void Optimize::apply_scaler_displacement(std::vector> &u_inout, + const double normalization_factor, + const bool scale_back) const +{ + const auto nrows = u_inout.size(); + const auto ncols = u_inout[0].size(); + + if (scale_back) { + for (auto i = 0; i < nrows; ++i) { + for (auto j = 0; j < ncols; ++j) { + u_inout[i][j] *= normalization_factor; + } + } + } else { + const auto inv_scale_factor = 1.0 / normalization_factor; + for (auto i = 0; i < nrows; ++i) { + for (auto j = 0; j < ncols; ++j) { + u_inout[i][j] *= inv_scale_factor; + } + } + } +} + +void Optimize::apply_scaler_constraint(const int maxorder, + const double normalization_factor, + Constraint *constraint, + const bool scale_back) const +{ + if (scale_back) { + for (auto i = 0; i < maxorder; ++i) { + const auto scale_factor = 1.0 / std::pow(normalization_factor, i + 1); + for (auto j = 0; j < constraint->get_const_fix(i).size(); ++j) { + const auto scaled_val = constraint->get_const_fix(i)[j].val_to_fix * scale_factor; + constraint->set_const_fix_val_to_fix(i, j, scaled_val); + } + } + } else { + for (auto i = 0; i < maxorder; ++i) { + const auto scale_factor = std::pow(normalization_factor, i + 1); + for (auto j = 0; j < constraint->get_const_fix(i).size(); ++j) { + const auto scaled_val = constraint->get_const_fix(i)[j].val_to_fix * scale_factor; + constraint->set_const_fix_val_to_fix(i, j, scaled_val); + } + } + } +} + +void Optimize::apply_scaler_force_constants(const int maxorder, + const double normalization_factor, + const Constraint *constraint, + std::vector ¶m_inout) const +{ + auto k = 0; + for (auto i = 0; i < maxorder; ++i) { + const auto scale_factor = 1.0 / std::pow(normalization_factor, i + 1); + + for (auto j = 0; j < constraint->get_index_bimap(i).size(); ++j) { + param_inout[k] *= scale_factor; + ++k; + } + } +} + +void Optimize::apply_scalers(const int maxorder, + Constraint *constraint) +{ + apply_scaler_displacement(u_train, + optcontrol.displacement_normalization_factor); + apply_scaler_constraint(maxorder, + optcontrol.displacement_normalization_factor, + constraint); + + if (optcontrol.cross_validation == -1) { + apply_scaler_displacement(u_validation, + optcontrol.displacement_normalization_factor); + + } +} + +void Optimize::finalize_scalers(const int maxorder, + Constraint *constraint) +{ + apply_scaler_displacement(u_train, + optcontrol.displacement_normalization_factor, + true); + apply_scaler_constraint(maxorder, + optcontrol.displacement_normalization_factor, + constraint, + true); + if (optcontrol.cross_validation == -1) { + apply_scaler_displacement(u_validation, + optcontrol.displacement_normalization_factor, + true); + } +} + + +void Optimize::set_training_data(const std::vector> &u_train_in, + const std::vector> &f_train_in) +{ + u_train.clear(); + f_train.clear(); + u_train = u_train_in; + f_train = f_train_in; + u_train.shrink_to_fit(); + f_train.shrink_to_fit(); +} + +void Optimize::set_validation_data(const std::vector> &u_validation_in, + const std::vector> &f_validation_in) +{ + u_validation.clear(); + f_validation.clear(); + u_validation = u_validation_in; + f_validation = f_validation_in; + u_validation.shrink_to_fit(); + f_validation.shrink_to_fit(); +} + +std::vector> Optimize::get_u_train() const +{ + return u_train; +} + +std::vector> Optimize::get_f_train() const +{ + return f_train; +} + + +void Optimize::set_fcs_values(const int maxorder, + double *fc_in, + std::vector *nequiv, + const Constraint *constraint) +{ + // fc_in: irreducible set of force constants + // fc_length: dimension of params (can differ from that of fc_in) + + size_t i; + + size_t N = 0; + size_t Nirred = 0; + for (i = 0; i < maxorder; ++i) { + N += nequiv[i].size(); + Nirred += constraint->get_index_bimap(i).size(); + } + + std::vector param_in(Nirred, 0.0); + std::vector param_out(N, 0.0); + + for (i = 0; i < Nirred; ++i) { + param_in[i] = fc_in[i]; + } + recover_original_forceconstants(maxorder, + param_in, + param_out, + nequiv, + constraint); + if (params) { + deallocate(params); + } + allocate(params, N); + for (i = 0; i < N; ++i) { + params[i] = param_out[i]; + } +} + +size_t Optimize::get_number_of_rows_sensing_matrix() const +{ + return u_train.size() * u_train[0].size(); +} + + +int Optimize::fit_without_constraints(const size_t N, + const size_t M, + double *amat, + const double *bvec, + double *param_out, + const int verbosity) const +{ + int i; + int nrhs = 1, nrank, INFO, M_tmp, N_tmp; + auto rcond = -1.0; + auto f_square = 0.0; + double *WORK, *S, *fsum2; + + + const auto LMIN = std::min(M, N); + auto LMAX = std::max(M, N); + + auto LWORK = 3 * LMIN + std::max(2 * LMIN, LMAX); + LWORK = 2 * LWORK; + + if (verbosity > 0) { + std::cout << " Entering fitting routine: SVD without constraints" << std::endl; + } + + + allocate(WORK, LWORK); + allocate(S, LMIN); + allocate(fsum2, LMAX); + + for (i = 0; i < M; ++i) { + fsum2[i] = bvec[i]; + f_square += std::pow(bvec[i], 2); + } + for (i = M; i < LMAX; ++i) fsum2[i] = 0.0; + + if (verbosity > 0) std::cout << " SVD has started ... "; + + // Fitting with singular value decomposition + // M_tmp and N_tmp are prepared to cast N and M to (non-const) int. + M_tmp = M; + N_tmp = N; + dgelss_(&M_tmp, &N_tmp, &nrhs, amat, &M_tmp, fsum2, &LMAX, + S, &rcond, &nrank, WORK, &LWORK, &INFO); + + if (verbosity > 0) { + std::cout << "finished !" << std::endl << std::endl; + std::cout << " RANK of the matrix = " << nrank << std::endl; + } + + if (nrank < N) + warn("fit_without_constraints", + "Matrix is rank-deficient. Force constants could not be determined uniquely :("); + + if (nrank == N && verbosity > 0) { + auto f_residual = 0.0; + for (i = N; i < M; ++i) { + f_residual += std::pow(fsum2[i], 2); + } + std::cout << std::endl << " Residual sum of squares for the solution: " + << sqrt(f_residual) << std::endl; + std::cout << " Fitting error (%) : " + << sqrt(f_residual / f_square) * 100.0 << std::endl; + } + + for (i = 0; i < N; ++i) { + param_out[i] = fsum2[i]; + } + + deallocate(WORK); + deallocate(S); + deallocate(fsum2); + + return INFO; +} + +int Optimize::fit_with_constraints(const size_t N, + const size_t M, + const size_t P, + double *amat, + const double *bvec, + double *param_out, + const double *const *cmat, + double *dvec, + const int verbosity) const +{ + size_t i, j; + int N_tmp, M_tmp, P_tmp; + double *fsum2; + double *mat_tmp; + + if (verbosity > 0) { + std::cout << " Entering fitting routine: QRD with constraints" << std::endl; + } + + allocate(fsum2, M); + allocate(mat_tmp, (M + P) * N); + + size_t k = 0; + size_t l = 0; + + // Concatenate two matrices as 1D array + for (j = 0; j < N; ++j) { + for (i = 0; i < M; ++i) { + mat_tmp[k++] = amat[l++]; + } + for (i = 0; i < P; ++i) { + mat_tmp[k++] = cmat[i][j]; + } + } + + const auto nrank = rankQRD((M + P), N, mat_tmp, eps12); + deallocate(mat_tmp); + + if (nrank != N) { + std::cout << std::endl; + std::cout << " **************************************************************************" << std::endl; + std::cout << " WARNING : rank deficient. " << std::endl; + std::cout << " rank ( (A) ) ! = N A: Fitting matrix B: Constraint matrix " << std::endl; + std::cout << " ( (B) ) N: The number of parameters " << std::endl; + std::cout << " rank = " << nrank << " N = " << N << std::endl << std::endl; + std::cout << " This can cause a difficulty in solving the fitting problem properly " << std::endl; + std::cout << " with DGGLSE, especially when the difference is large. Please check if " << std::endl; + std::cout << " you obtain reliable force constants in the .fcs file. " << std::endl << std:: + endl; + std::cout << " You may need to reduce the cutoff radii and/or increase NDATA " << std::endl; + std::cout << " by giving linearly-independent displacement patterns. " << std::endl; + std::cout << " **************************************************************************" << std::endl; + std::cout << std::endl; + } + + auto f_square = 0.0; + for (i = 0; i < M; ++i) { + fsum2[i] = bvec[i]; + f_square += std::pow(bvec[i], 2); + } + if (verbosity > 0) std::cout << " QR-Decomposition has started ..."; + + double *cmat_mod; + allocate(cmat_mod, P * N); + + k = 0; + for (j = 0; j < N; ++j) { + for (i = 0; i < P; ++i) { + cmat_mod[k++] = cmat[i][j]; + } + } + + // Fitting + + auto LWORK = static_cast(P) + std::min(M, N) + 10 * std::max(M, N); + int INFO; + double *WORK, *x; + allocate(WORK, LWORK); + allocate(x, N); + + // M_tmp, N_tmp, P_tmp are prepared to cast N, M, P to (non-const) + // int. + M_tmp = M; + N_tmp = N; + P_tmp = P; + dgglse_(&M_tmp, &N_tmp, &P_tmp, amat, &M_tmp, cmat_mod, &P_tmp, + fsum2, dvec, x, WORK, &LWORK, &INFO); + + if (verbosity > 0) std::cout << " finished. " << std::endl; + + auto f_residual = 0.0; + for (i = N - P; i < M; ++i) { + f_residual += std::pow(fsum2[i], 2); + } + + if (verbosity > 0) { + std::cout << std::endl << " Residual sum of squares for the solution: " + << sqrt(f_residual) << std::endl; + std::cout << " Fitting error (%) : " + << std::sqrt(f_residual / f_square) * 100.0 << std::endl; + } + + // copy fcs to bvec + for (i = 0; i < N; ++i) { + param_out[i] = x[i]; + } + + deallocate(cmat_mod); + deallocate(WORK); + deallocate(x); + deallocate(fsum2); + + return INFO; +} + +int Optimize::fit_algebraic_constraints(const size_t N, + const size_t M, + double *amat, + const double *bvec, + std::vector ¶m_out, + const double fnorm, + const int maxorder, + const Fcs *fcs, + const Constraint *constraint, + const int verbosity) const +{ + int i; + int nrhs = 1, nrank, INFO, M_tmp, N_tmp; + auto rcond = -1.0; + double *WORK, *S, *fsum2; + + if (verbosity > 0) { + std::cout << " Entering fitting routine: SVD with constraints considered algebraically." << std::endl; + } + + auto LMIN = std::min(M, N); + auto LMAX = std::max(M, N); + + auto LWORK = 3 * LMIN + std::max(2 * LMIN, LMAX); + LWORK = 2 * LWORK; + + allocate(WORK, LWORK); + allocate(S, LMIN); + allocate(fsum2, LMAX); + + for (i = 0; i < M; ++i) { + fsum2[i] = bvec[i]; + } + for (i = M; i < LMAX; ++i) fsum2[i] = 0.0; + + if (verbosity > 0) std::cout << " SVD has started ... "; + + // Fitting with singular value decomposition + // M_tmp and N_tmp are prepared to cast N and M to (non-const) int. + M_tmp = M; + N_tmp = N; + dgelss_(&M_tmp, &N_tmp, &nrhs, amat, &M_tmp, fsum2, &LMAX, + S, &rcond, &nrank, WORK, &LWORK, &INFO); + + deallocate(WORK); + deallocate(S); + + if (verbosity > 0) { + std::cout << "finished !" << std::endl << std::endl; + std::cout << " RANK of the matrix = " << nrank << std::endl; + } + + if (nrank < N) { + std::cout << " **************************************************************************\n"; + std::cout << " WARNING : Rank deficient \n\n"; + std::cout << " Force constants could not be determined uniquely because \n"; + std::cout << " the sensing matrix is not full rank. \n"; + std::cout << " You may need to reduce the cutoff radii and/or increase the number of \n"; + std::cout << " training datasets. \n"; + std::cout << " **************************************************************************\n"; + } + + if (nrank == N && verbosity > 0) { + auto f_residual = 0.0; + for (i = N; i < M; ++i) { + f_residual += std::pow(fsum2[i], 2); + } + std::cout << std::endl; + std::cout << " Residual sum of squares for the solution: " + << sqrt(f_residual) << std::endl; + std::cout << " Fitting error (%) : " + << sqrt(f_residual / (fnorm * fnorm)) * 100.0 << std::endl; + } + + if (INFO == 0) { + std::vector param_irred(N, 0.0); + for (i = 0; i < LMIN; ++i) param_irred[i] = fsum2[i]; + deallocate(fsum2); + + // Recover reducible set of force constants + + recover_original_forceconstants(maxorder, + param_irred, + param_out, + fcs->get_nequiv(), + constraint); + } + + return INFO; +} + + +void Optimize::get_matrix_elements(const int maxorder, + std::vector &amat, + std::vector &bvec, + const std::vector> &u_in, + const std::vector> &f_in, + const Symmetry *symmetry, + const Fcs *fcs) const +{ + size_t i, j; + long irow; + const auto natmin = symmetry->get_nat_prim(); + const auto natmin3 = 3 * natmin; + std::vector> u_multi, f_multi; + + if (u_in.size() != f_in.size()) { + exit("get_matrix_elements", + "The lengths of displacement array and force array are diferent."); + } + + const auto ndata_fit = u_in.size(); + const auto ncycle = ndata_fit * symmetry->get_ntran(); + const auto nrows = ndata_fit * u_in[0].size(); + size_t ncols = 0; + for (i = 0; i < maxorder; ++i) { + ncols += fcs->get_nequiv()[i].size(); + } + + if (amat.size() != nrows * ncols) { + amat.resize(nrows * ncols, 0.0); + } + if (bvec.size() != nrows) { + bvec.resize(nrows, 0.0); + } + + data_multiplier(u_in, u_multi, symmetry); + data_multiplier(f_in, f_multi, symmetry); + + +#ifdef _OPENMP +#pragma omp parallel private(irow, i, j) +#endif + { + int *ind; + int mm, order, iat, k; + size_t im, iparam; + size_t idata; + double amat_tmp; + double **amat_orig_tmp; + + allocate(ind, maxorder + 1); + allocate(amat_orig_tmp, natmin3, ncols); + +#ifdef _OPENMP +#pragma omp for schedule(guided) +#endif + for (irow = 0; irow < ncycle; ++irow) { + + // generate r.h.s vector B + for (i = 0; i < natmin; ++i) { + iat = symmetry->get_map_p2s()[i][0]; + for (j = 0; j < 3; ++j) { + im = 3 * i + j + natmin3 * irow; + bvec[im] = f_multi[irow][3 * iat + j]; + } + } + + for (i = 0; i < natmin3; ++i) { + for (j = 0; j < ncols; ++j) { + amat_orig_tmp[i][j] = 0.0; + } + } + + // generate l.h.s. matrix A + + idata = natmin3 * irow; + iparam = 0; + + for (order = 0; order < maxorder; ++order) { + + mm = 0; + + for (const auto &iter : fcs->get_nequiv()[order]) { + for (i = 0; i < iter; ++i) { + ind[0] = fcs->get_fc_table()[order][mm].elems[0]; + k = inprim_index(ind[0], symmetry); + amat_tmp = 1.0; + for (j = 1; j < order + 2; ++j) { + ind[j] = fcs->get_fc_table()[order][mm].elems[j]; + amat_tmp *= u_multi[irow][fcs->get_fc_table()[order][mm].elems[j]]; + } + amat_orig_tmp[k][iparam] -= gamma(order + 2, ind) * fcs->get_fc_table()[order][mm].sign * + amat_tmp; + ++mm; + } + ++iparam; + } + } + + for (i = 0; i < natmin3; ++i) { + for (j = 0; j < ncols; ++j) { + // Transpose here for later use of lapack without transpose + amat[natmin3 * ncycle * j + i + idata] = amat_orig_tmp[i][j]; + } + } + } + + deallocate(ind); + deallocate(amat_orig_tmp); + } + + u_multi.clear(); + f_multi.clear(); +} + + +void Optimize::get_matrix_elements_algebraic_constraint(const int maxorder, + std::vector &amat, + std::vector &bvec, + const std::vector> &u_in, + const std::vector> &f_in, + double &fnorm, + const Symmetry *symmetry, + const Fcs *fcs, + const Constraint *constraint) const +{ + size_t i, j; + long irow; + + if (u_in.size() != f_in.size()) { + exit("get_matrix_elements", + "The lengths of displacement array and force array are diferent."); + } + + const auto ndata_fit = u_in.size(); + const auto natmin = symmetry->get_nat_prim(); + const auto natmin3 = 3 * natmin; + const auto nrows = u_in.size() * u_in[0].size(); + size_t ncols = 0; + size_t ncols_new = 0; + + for (i = 0; i < maxorder; ++i) { + ncols += fcs->get_nequiv()[i].size(); + ncols_new += constraint->get_index_bimap(i).size(); + } + + const auto ncycle = ndata_fit * symmetry->get_ntran(); + + if (amat.size() != nrows * ncols_new) { + amat.resize(nrows * ncols_new, 0.0); + } + if (bvec.size() != nrows) { + bvec.resize(nrows, 0.0); + } + + std::vector bvec_orig(nrows, 0.0); + std::vector> u_multi, f_multi; + + data_multiplier(u_in, u_multi, symmetry); + data_multiplier(f_in, f_multi, symmetry); + +#ifdef _OPENMP +#pragma omp parallel private(irow, i, j) +#endif + { + int *ind; + int mm, order, iat, k; + size_t im; + size_t idata; + size_t ishift, iparam; + size_t iold, inew; + double amat_tmp; + double **amat_orig_tmp; + double **amat_mod_tmp; + + allocate(ind, maxorder + 1); + allocate(amat_orig_tmp, natmin3, ncols); + allocate(amat_mod_tmp, natmin3, ncols_new); + +#ifdef _OPENMP +#pragma omp for schedule(guided) +#endif + for (irow = 0; irow < ncycle; ++irow) { + + // generate r.h.s vector B + for (i = 0; i < natmin; ++i) { + iat = symmetry->get_map_p2s()[i][0]; + for (j = 0; j < 3; ++j) { + im = 3 * i + j + natmin3 * irow; + bvec[im] = f_multi[irow][3 * iat + j]; + bvec_orig[im] = f_multi[irow][3 * iat + j]; + } + } + + for (i = 0; i < natmin3; ++i) { + for (j = 0; j < ncols; ++j) { + amat_orig_tmp[i][j] = 0.0; + } + for (j = 0; j < ncols_new; ++j) { + amat_mod_tmp[i][j] = 0.0; + } + } + + // generate l.h.s. matrix A + + idata = natmin3 * irow; + iparam = 0; + + for (order = 0; order < maxorder; ++order) { + + mm = 0; + + for (const auto &iter : fcs->get_nequiv()[order]) { + for (i = 0; i < iter; ++i) { + ind[0] = fcs->get_fc_table()[order][mm].elems[0]; + k = inprim_index(ind[0], symmetry); + + amat_tmp = 1.0; + for (j = 1; j < order + 2; ++j) { + ind[j] = fcs->get_fc_table()[order][mm].elems[j]; + amat_tmp *= u_multi[irow][fcs->get_fc_table()[order][mm].elems[j]]; + } + amat_orig_tmp[k][iparam] -= gamma(order + 2, ind) + * fcs->get_fc_table()[order][mm].sign * amat_tmp; + ++mm; + } + ++iparam; + } + } + + // Convert the full matrix and vector into a smaller irreducible form + // by using constraint information. + + ishift = 0; + iparam = 0; + + for (order = 0; order < maxorder; ++order) { + + for (i = 0; i < constraint->get_const_fix(order).size(); ++i) { + + for (j = 0; j < natmin3; ++j) { + bvec[j + idata] -= constraint->get_const_fix(order)[i].val_to_fix + * amat_orig_tmp[j][ishift + constraint->get_const_fix(order)[i].p_index_target]; + } + } + + // std::cout << "pass const_fix" << std::endl; + + for (const auto &it : constraint->get_index_bimap(order)) { + inew = it.left + iparam; + iold = it.right + ishift; + + for (j = 0; j < natmin3; ++j) { + amat_mod_tmp[j][inew] = amat_orig_tmp[j][iold]; + } + } + + for (i = 0; i < constraint->get_const_relate(order).size(); ++i) { + + iold = constraint->get_const_relate(order)[i].p_index_target + ishift; + + for (j = 0; j < constraint->get_const_relate(order)[i].alpha.size(); ++j) { + + inew = constraint->get_index_bimap(order).right.at( + constraint->get_const_relate(order)[i].p_index_orig[j]) + + iparam; + + for (k = 0; k < natmin3; ++k) { + amat_mod_tmp[k][inew] -= amat_orig_tmp[k][iold] + * constraint->get_const_relate(order)[i].alpha[j]; + } + } + } + + ishift += fcs->get_nequiv()[order].size(); + iparam += constraint->get_index_bimap(order).size(); + } + + for (i = 0; i < natmin3; ++i) { + for (j = 0; j < ncols_new; ++j) { + // Transpose here for later use of lapack without transpose + amat[natmin3 * ncycle * j + i + idata] = amat_mod_tmp[i][j]; + } + } + } + + deallocate(ind); + deallocate(amat_orig_tmp); + deallocate(amat_mod_tmp); + } + + fnorm = 0.0; + for (i = 0; i < bvec_orig.size(); ++i) { + fnorm += bvec_orig[i] * bvec_orig[i]; + } + fnorm = std::sqrt(fnorm); + + u_multi.clear(); + f_multi.clear(); +} + +void Optimize::get_matrix_elements_in_sparse_form(const int maxorder, + SpMat &sp_amat, + Eigen::VectorXd &sp_bvec, + const std::vector> &u_in, + const std::vector> &f_in, + double &fnorm, + const Symmetry *symmetry, + const Fcs *fcs, + const Constraint *constraint) const +{ + size_t i, j; + long irow; + typedef Eigen::Triplet T; + std::vector nonzero_entries; + + if (u_in.size() != f_in.size()) { + exit("get_matrix_elements", + "The lengths of displacement array and force array are diferent."); + } + + const auto ndata_fit = u_in.size(); + const auto natmin = symmetry->get_nat_prim(); + const auto natmin3 = 3 * natmin; + const auto nrows = u_in.size() * u_in[0].size(); + + size_t ncols = 0; + size_t ncols_new = 0; + + for (i = 0; i < maxorder; ++i) { + ncols += fcs->get_nequiv()[i].size(); + ncols_new += constraint->get_index_bimap(i).size(); + } + + const auto ncycle = ndata_fit * symmetry->get_ntran(); + + std::vector bvec_orig(nrows, 0.0); + std::vector> u_multi, f_multi; + + data_multiplier(u_in, u_multi, symmetry); + data_multiplier(f_in, f_multi, symmetry); + +#ifdef _OPENMP +#pragma omp parallel private(irow, i, j) +#endif + { + int *ind; + int mm, order, iat, k; + size_t im, iparam; + size_t idata; + size_t ishift; + size_t iold, inew; + double amat_tmp; + double **amat_orig_tmp; + double **amat_mod_tmp; + + std::vector nonzero_omp; + + allocate(ind, maxorder + 1); + allocate(amat_orig_tmp, natmin3, ncols); + allocate(amat_mod_tmp, natmin3, ncols_new); + +#ifdef _OPENMP +#pragma omp for schedule(guided) +#endif + for (irow = 0; irow < ncycle; ++irow) { + + // generate r.h.s vector B + for (i = 0; i < natmin; ++i) { + iat = symmetry->get_map_p2s()[i][0]; + for (j = 0; j < 3; ++j) { + im = 3 * i + j + natmin3 * irow; + sp_bvec(im) = f_multi[irow][3 * iat + j]; + bvec_orig[im] = f_multi[irow][3 * iat + j]; + } + } + + for (i = 0; i < natmin3; ++i) { + for (j = 0; j < ncols; ++j) { + amat_orig_tmp[i][j] = 0.0; + } + for (j = 0; j < ncols_new; ++j) { + amat_mod_tmp[i][j] = 0.0; + } + } + + // generate l.h.s. matrix A + + idata = natmin3 * irow; + iparam = 0; + + for (order = 0; order < maxorder; ++order) { + + mm = 0; + + for (const auto &iter : fcs->get_nequiv()[order]) { + for (i = 0; i < iter; ++i) { + ind[0] = fcs->get_fc_table()[order][mm].elems[0]; + k = inprim_index(ind[0], symmetry); + + amat_tmp = 1.0; + for (j = 1; j < order + 2; ++j) { + ind[j] = fcs->get_fc_table()[order][mm].elems[j]; + amat_tmp *= u_multi[irow][fcs->get_fc_table()[order][mm].elems[j]]; + } + amat_orig_tmp[k][iparam] -= gamma(order + 2, ind) + * fcs->get_fc_table()[order][mm].sign * amat_tmp; + ++mm; + } + ++iparam; + } + } + + // Convert the full matrix and vector into a smaller irreducible form + // by using constraint information. + + ishift = 0; + iparam = 0; + + for (order = 0; order < maxorder; ++order) { + + for (i = 0; i < constraint->get_const_fix(order).size(); ++i) { + + for (j = 0; j < natmin3; ++j) { + sp_bvec(j + idata) -= constraint->get_const_fix(order)[i].val_to_fix + * amat_orig_tmp[j][ishift + constraint->get_const_fix(order)[i].p_index_target]; + } + } + + for (const auto &it : constraint->get_index_bimap(order)) { + inew = it.left + iparam; + iold = it.right + ishift; + + for (j = 0; j < natmin3; ++j) { + amat_mod_tmp[j][inew] = amat_orig_tmp[j][iold]; + } + } + + for (i = 0; i < constraint->get_const_relate(order).size(); ++i) { + + iold = constraint->get_const_relate(order)[i].p_index_target + ishift; + + for (j = 0; j < constraint->get_const_relate(order)[i].alpha.size(); ++j) { + + inew = constraint->get_index_bimap(order).right.at( + constraint->get_const_relate(order)[i].p_index_orig[j]) + + iparam; + + for (k = 0; k < natmin3; ++k) { + amat_mod_tmp[k][inew] -= amat_orig_tmp[k][iold] + * constraint->get_const_relate(order)[i].alpha[j]; + } + } + } + + ishift += fcs->get_nequiv()[order].size(); + iparam += constraint->get_index_bimap(order).size(); + } + + for (i = 0; i < natmin3; ++i) { + for (j = 0; j < ncols_new; ++j) { + if (std::abs(amat_mod_tmp[i][j]) > eps) { + nonzero_omp.emplace_back(T(idata + i, j, amat_mod_tmp[i][j])); + } + } + } + } + + deallocate(ind); + deallocate(amat_orig_tmp); + deallocate(amat_mod_tmp); + +#pragma omp critical + { + for (const auto &it : nonzero_omp) { + nonzero_entries.emplace_back(it); + } + } + } + + fnorm = 0.0; + for (i = 0; i < bvec_orig.size(); ++i) { + fnorm += bvec_orig[i] * bvec_orig[i]; + } + fnorm = std::sqrt(fnorm); + sp_amat.setFromTriplets(nonzero_entries.begin(), nonzero_entries.end()); + sp_amat.makeCompressed(); +} + + +void Optimize::recover_original_forceconstants(const int maxorder, + const std::vector ¶m_in, + std::vector ¶m_out, + const std::vector *nequiv, + const Constraint *constraint) const +{ + // Expand the given force constants into the larger sets + // by using the constraint matrix. + + size_t i, j, k; + size_t ishift = 0; + size_t iparam = 0; + double tmp; + size_t inew, iold; + + size_t nparams = 0; + + for (i = 0; i < maxorder; ++i) nparams += nequiv[i].size(); + + param_out.resize(nparams, 0.0); + + for (i = 0; i < maxorder; ++i) { + for (j = 0; j < constraint->get_const_fix(i).size(); ++j) { + param_out[constraint->get_const_fix(i)[j].p_index_target + ishift] + = constraint->get_const_fix(i)[j].val_to_fix; + } + + for (const auto &it : constraint->get_index_bimap(i)) { + inew = it.left + iparam; + iold = it.right + ishift; + + param_out[iold] = param_in[inew]; + } + + for (j = 0; j < constraint->get_const_relate(i).size(); ++j) { + tmp = 0.0; + + for (k = 0; k < constraint->get_const_relate(i)[j].alpha.size(); ++k) { + tmp += constraint->get_const_relate(i)[j].alpha[k] + * param_out[constraint->get_const_relate(i)[j].p_index_orig[k] + ishift]; + } + param_out[constraint->get_const_relate(i)[j].p_index_target + ishift] = -tmp; + } + + ishift += nequiv[i].size(); + iparam += constraint->get_index_bimap(i).size(); + } +} + + +void Optimize::data_multiplier(const std::vector> &data_in, + std::vector> &data_out, + const Symmetry *symmetry) const +{ + const auto nat = symmetry->get_nat_prim() * symmetry->get_ntran(); + const auto ndata_used = data_in.size(); + const auto ntran = symmetry->get_ntran(); + + data_out.resize(ntran * ndata_used, std::vector(3 * nat)); + + auto idata = 0; + for (auto i = 0; i < ndata_used; ++i) { + + for (auto itran = 0; itran < symmetry->get_ntran(); ++itran) { + for (auto j = 0; j < nat; ++j) { + const auto n_mapped = symmetry->get_map_sym()[j][symmetry->get_symnum_tran()[itran]]; + for (auto k = 0; k < 3; ++k) { + data_out[idata][3 * n_mapped + k] = data_in[i][3 * j + k]; + } + } + ++idata; + } + } +} + +int Optimize::inprim_index(const int n, + const Symmetry *symmetry) const +{ + auto in = -1; + const auto atmn = n / 3; + const auto crdn = n % 3; + + for (size_t i = 0; i < symmetry->get_nat_prim(); ++i) { + if (symmetry->get_map_p2s()[i][0] == atmn) { + in = 3 * i + crdn; + break; + } + } + return in; +} + +double Optimize::gamma(const int n, + const int *arr) const +{ + int *arr_tmp, *nsame; + int i; + + allocate(arr_tmp, n); + allocate(nsame, n); + + for (i = 0; i < n; ++i) { + arr_tmp[i] = arr[i]; + nsame[i] = 0; + } + + const auto ind_front = arr[0]; + auto nsame_to_front = 1; + + insort(n, arr_tmp); + + auto nuniq = 1; + auto iuniq = 0; + + nsame[0] = 1; + + for (i = 1; i < n; ++i) { + if (arr_tmp[i] == arr_tmp[i - 1]) { + ++nsame[iuniq]; + } else { + ++nsame[++iuniq]; + ++nuniq; + } + + if (arr[i] == ind_front) ++nsame_to_front; + } + + auto denom = 1; + + for (i = 0; i < nuniq; ++i) { + denom *= factorial(nsame[i]); + } + + deallocate(arr_tmp); + deallocate(nsame); + + return static_cast(nsame_to_front) / static_cast(denom); +} + + +double* Optimize::get_params() const +{ + return params; +} + +int Optimize::factorial(const int n) const +{ + if (n == 1 || n == 0) { + return 1; + } + return n * factorial(n - 1); +} + + +int Optimize::rankQRD(const size_t m, + const size_t n, + double *mat, + const double tolerance) const +{ + // Return the rank of matrix mat revealed by the column pivoting QR decomposition + // The matrix mat is destroyed. + + auto m_ = static_cast(m); + auto n_ = static_cast(n); + + auto LDA = m_; + + auto LWORK = 10 * n_; + int INFO; + int *JPVT; + double *WORK, *TAU; + + const auto nmin = std::min(m_, n_); + + allocate(JPVT, n_); + allocate(WORK, LWORK); + allocate(TAU, nmin); + + for (auto i = 0; i < n_; ++i) JPVT[i] = 0; + + dgeqp3_(&m_, &n_, mat, &LDA, JPVT, TAU, WORK, &LWORK, &INFO); + + deallocate(JPVT); + deallocate(WORK); + deallocate(TAU); + + if (std::abs(mat[0]) < eps) return 0; + + double **mat_tmp; + allocate(mat_tmp, m_, n_); + + unsigned long k = 0; + + for (auto j = 0; j < n_; ++j) { + for (auto i = 0; i < m_; ++i) { + mat_tmp[i][j] = mat[k++]; + } + } + + auto nrank = 0; + for (auto i = 0; i < nmin; ++i) { + if (std::abs(mat_tmp[i][i]) > tolerance * std::abs(mat[0])) ++nrank; + } + + deallocate(mat_tmp); + + return nrank; +} + + +int Optimize::run_eigen_sparse_solver(const SpMat &sp_mat, + const Eigen::VectorXd &sp_bvec, + std::vector ¶m_out, + const double fnorm, + const int maxorder, + const Fcs *fcs, + const Constraint *constraint, + const std::string solver_type, + const int verbosity) const +{ + const auto solver_type_lower = boost::algorithm::to_lower_copy(solver_type); + Eigen::VectorXd x; + + if (verbosity > 0) { + std::cout << " Solve least-squares problem by Eigen " + solver_type + ".\n"; + } + + if (solver_type_lower == "simplicialldlt") { + SpMat AtA = sp_mat.transpose() * sp_mat; + Eigen::VectorXd AtB = sp_mat.transpose() * sp_bvec; + + Eigen::SimplicialLDLT ldlt(AtA); + x = ldlt.solve(AtB); + + if (ldlt.info() != Eigen::Success) { + std::cerr << " Fitting by " + solver_type + " failed." << std::endl; + std::cerr << ldlt.info() << std::endl; + return 1; + } + + } else if (solver_type_lower == "sparseqr") { + + Eigen::SparseQR> qr(sp_mat); + x = qr.solve(sp_bvec); + + if (qr.info() != Eigen::Success) { + std::cerr << " Fitting by " + solver_type + " failed." << std::endl; + std::cerr << qr.info() << std::endl; + return 1; + } + + } else if (solver_type_lower == "conjugategradient") { + SpMat AtA = sp_mat.transpose() * sp_mat; + Eigen::VectorXd AtB = sp_mat.transpose() * sp_bvec; + + Eigen::ConjugateGradient cg(AtA); + cg.setTolerance(optcontrol.tolerance_iteration); + cg.setMaxIterations(optcontrol.maxnum_iteration); + x.setZero(); + x = cg.solve(AtB); + + if (cg.info() != Eigen::Success) { + std::cerr << " Fitting by " + solver_type + " failed." << std::endl; + std::cerr << cg.info() << std::endl; + return 1; + } + + } else if (solver_type_lower == "leastsquaresconjugategradient") { + +#if EIGEN_VERSION_AT_LEAST(3,3,0) + Eigen::LeastSquaresConjugateGradient lscg(sp_mat); + lscg.setTolerance(optcontrol.tolerance_iteration); + lscg.setMaxIterations(optcontrol.maxnum_iteration); + x.setZero(); + x = lscg.solve(sp_bvec); + + if (lscg.info() != Eigen::Success) { + std::cerr << " Fitting by " + solver_type + " failed." << std::endl; + std::cerr << lscg.info() << std::endl; + return 1; + } + +#else + std::cerr << "The linked Eigen version is too old\n"; + std::cerr << solver_type + " is available as of 3.3.0\n"; + return 1; +#endif + + } else if (solver_type_lower == "bicgstab") { + SpMat AtA = sp_mat.transpose() * sp_mat; + Eigen::VectorXd AtB = sp_mat.transpose() * sp_bvec; + + Eigen::BiCGSTAB bicg(AtA); + bicg.setTolerance(optcontrol.tolerance_iteration); + bicg.setMaxIterations(optcontrol.maxnum_iteration); + x.setZero(); + x = bicg.solve(AtB); + + if (bicg.info() != Eigen::Success) { + std::cerr << " Fitting by " + solver_type + " failed." << std::endl; + std::cerr << bicg.info() << std::endl; + return 1; + } + } + + auto res = sp_bvec - sp_mat * x; + const auto res2norm = res.squaredNorm(); + const auto nparams = x.size(); + std::vector param_irred(nparams); + + for (auto i = 0; i < nparams; ++i) { + param_irred[i] = x(i); + } + + // Recover reducible set of force constants + + recover_original_forceconstants(maxorder, + param_irred, + param_out, + fcs->get_nequiv(), + constraint); + + if (verbosity > 0) { + std::cout << " Residual sum of squares for the solution: " + << sqrt(res2norm) << std::endl; + std::cout << " Fitting error (%) : " + << sqrt(res2norm / (fnorm * fnorm)) * 100.0 << std::endl; + } + + return 0; +} + + +void Optimize::set_optimizer_control(const OptimizerControl &optcontrol_in) +{ + // Check the validity of the options before copying it. + + if (optcontrol_in.cross_validation < -1) { + exit("set_optimizer_control", "cross_validation must be -1, 0, or larger"); + } + if (optcontrol_in.linear_model == 2) { + if (optcontrol_in.l1_ratio <= eps || optcontrol_in.l1_ratio > 1.0) { + exit("set_optimizer_control", "L1_RATIO must be 0 < L1_RATIO <= 1."); + } + + if (optcontrol_in.cross_validation >= 1 || optcontrol_in.cross_validation == -1) { + if (optcontrol_in.l1_alpha_min >= optcontrol_in.l1_alpha_max) { + exit("set_optimizer_control", "L1_ALPHA_MIN must be smaller than L1_ALPHA_MAX."); + } + } + } + + optcontrol = optcontrol_in; +} + +OptimizerControl Optimize::get_optimizer_control() const +{ + return optcontrol; +} + + +void Optimize::coordinate_descent(const int M, + const int N, + const double alpha, + const int warm_start, + Eigen::VectorXd &x, + const Eigen::MatrixXd &A, + const Eigen::VectorXd &b, + const Eigen::VectorXd &grad0, + bool *has_prod, + Eigen::MatrixXd &Prod, + Eigen::VectorXd &grad, + const double fnorm, + const Eigen::VectorXd &scale_beta, + const int verbosity) const +{ + int i, j; + double diff{0.0}; + Eigen::VectorXd beta(N), delta(N); + Eigen::VectorXd res(N); + bool do_print_log; + + if (warm_start) { + for (i = 0; i < N; ++i) beta(i) = x(i); + } else { + for (i = 0; i < N; ++i) beta(i) = 0.0; + grad = grad0; + } + + if (verbosity > 1) { + std::cout << "-----------------------------------------------------------------" << std::endl; + std::cout << " L1_ALPHA = " << std::setw(15) << alpha << std::endl; + } + + const auto Minv = 1.0 / static_cast(M); + const auto alphlambda = alpha * optcontrol.l1_ratio; + + auto iloop = 0; + + if (optcontrol.standardize) { + while (iloop < optcontrol.maxnum_iteration) { + do_print_log = !((iloop + 1) % optcontrol.output_frequency) && (verbosity > 1); + + if (do_print_log) { + std::cout << " Coordinate Descent : " << std::setw(5) << iloop + 1 << std::endl; + } + delta = beta; + for (i = 0; i < N; ++i) { + beta(i) = shrink(Minv * grad(i) + beta(i), alphlambda); + delta(i) -= beta(i); + if (std::abs(delta(i)) > 0.0) { + if (!has_prod[i]) { +#pragma omp parallel for + for (j = 0; j < N; ++j) { + Prod(j, i) = A.col(j).dot(A.col(i)); + } + has_prod[i] = true; + } + grad = grad + Prod.col(i) * delta(i); + } + } + ++iloop; + diff = 0.0; +#pragma omp parallel for reduction(+:diff) + for (i = 0; i < N; ++i) { + diff += delta(i) * delta(i); + } + diff = std::sqrt(diff / static_cast(N)); + //diff = std::sqrt(delta.dot(delta) / static_cast(N)); + + if (diff < optcontrol.tolerance_iteration) break; + + if (do_print_log) { + std::cout << " 1: ||u_{k}-u_{k-1}||_2 = " << std::setw(15) << diff + << std::setw(15) << diff * std::sqrt(static_cast(N) / beta.dot(beta)) << std::endl; + auto tmp = 0.0; +#ifdef _OPENMP +#pragma omp parallel for reduction(+:tmp) +#endif + for (i = 0; i < N; ++i) { + tmp += std::abs(beta(i)); + } + std::cout << " 2: ||u_{k}||_1 = " << std::setw(15) << tmp << std::endl; + res = A * beta - b; + tmp = res.dot(res); + std::cout << " 3: ||Au_{k}-f||_2 = " << std::setw(15) << std::sqrt(tmp) + << std::setw(15) << std::sqrt(tmp / (fnorm * fnorm)) << std::endl; + std::cout << std::endl; + } + } + } else { + // Non-standardized version. Needs additional operations + while (iloop < optcontrol.maxnum_iteration) { + do_print_log = !((iloop + 1) % optcontrol.output_frequency) && (verbosity > 1); + + if (do_print_log) { + std::cout << " Coordinate Descent : " << std::setw(5) << iloop + 1 << std::endl; + } + delta = beta; + for (i = 0; i < N; ++i) { + beta(i) = shrink(Minv * grad(i) + beta(i) / scale_beta(i), alphlambda) * scale_beta(i); + delta(i) -= beta(i); + if (std::abs(delta(i)) > 0.0) { + if (!has_prod[i]) { + for (j = 0; j < N; ++j) { + Prod(j, i) = A.col(j).dot(A.col(i)); + } + has_prod[i] = true; + } + grad = grad + Prod.col(i) * delta(i); + } + } + ++iloop; + diff = std::sqrt(delta.dot(delta) / static_cast(N)); + + if (diff < optcontrol.tolerance_iteration) break; + + if (do_print_log) { + std::cout << " 1: ||u_{k}-u_{k-1}||_2 = " << std::setw(15) << diff + << std::setw(15) << diff * std::sqrt(static_cast(N) / beta.dot(beta)) << std::endl; + auto tmp = 0.0; +#ifdef _OPENMP +#pragma omp parallel for reduction(+:tmp) +#endif + for (i = 0; i < N; ++i) { + tmp += std::abs(beta(i)); + } + std::cout << " 2: ||u_{k}||_1 = " << std::setw(15) << tmp << std::endl; + res = A * beta - b; + tmp = res.dot(res); + std::cout << " 3: ||Au_{k}-f||_2 = " << std::setw(15) << std::sqrt(tmp) + << std::setw(15) << std::sqrt(tmp / (fnorm * fnorm)) << std::endl; + std::cout << std::endl; + } + } + } + + if (verbosity > 1) { + if (iloop >= optcontrol.maxnum_iteration) { + std::cout << "WARNING: Convergence NOT achieved within " << optcontrol.maxnum_iteration + << " coordinate descent iterations." << std::endl; + } else { + std::cout << " Convergence achieved in " << iloop << " iterations." << std::endl; + } + const auto param2norm = beta.dot(beta); + if (std::abs(param2norm) < eps) { + std::cout << " 1': ||u_{k}-u_{k-1}||_2 = " << std::setw(15) << 0.0 + << std::setw(15) << 0.0 << std::endl; + } else { + std::cout << " 1': ||u_{k}-u_{k-1}||_2 = " << std::setw(15) << diff + << std::setw(15) << diff * std::sqrt(static_cast(N) / param2norm) << std::endl; + } + double tmp = 0.0; +#ifdef _OPENMP +#pragma omp parallel for reduction(+:tmp) +#endif + for (i = 0; i < N; ++i) { + tmp += std::abs(beta(i)); + } + std::cout << " 2': ||u_{k}||_1 = " << std::setw(15) << tmp << std::endl; + res = A * beta - b; + tmp = res.dot(res); + std::cout << " 3': ||Au_{k}-f||_2 = " << std::setw(15) << std::sqrt(tmp) + << std::setw(15) << std::sqrt(tmp / (fnorm * fnorm)) << std::endl; + std::cout << std::endl; + } + + for (i = 0; i < N; ++i) x[i] = beta(i); +} diff --git a/alm/optimize.h b/alm/optimize.h new file mode 100644 index 00000000..cffca1f2 --- /dev/null +++ b/alm/optimize.h @@ -0,0 +1,408 @@ +/* + optimize.h + + Copyright (c) 2014, 2015, 2016 Terumasa Tadano + + This file is distributed under the terms of the MIT license. + Please see the file 'LICENCE.txt' in the root directory + or http://opensource.org/licenses/mit-license.php for information. +*/ + +#pragma once + +#include +#include "files.h" +#include "constraint.h" +#include "symmetry.h" +#include "fcs.h" +#include "timer.h" +#include +#include +using SpMat = Eigen::SparseMatrix; + + +namespace ALM_NS +{ + class OptimizerControl + { + public: + // General optimization options + int linear_model; // 1 : least-squares, 2 : elastic net + int use_sparse_solver; // 0: No, 1: Yes + std::string sparsesolver; // Method name of Eigen sparse solver + int maxnum_iteration; + double tolerance_iteration; + int output_frequency; + + // Options related to L1-regularized optimization + int standardize; + double displacement_normalization_factor; + int debiase_after_l1opt; + + // cross-validation related variables + int cross_validation; // 0 : No CV mode, -1 or > 0: CV mode + double l1_alpha; // L1-regularization coefficient + double l1_alpha_min; + double l1_alpha_max; + int num_l1_alpha; + double l1_ratio; // l1_ratio = 1 for LASSO; 0 < l1_ratio < 1 for Elastic net + int save_solution_path; + + OptimizerControl() + { + linear_model = 1; + use_sparse_solver = 0; + sparsesolver = "SimplicialLDLT"; + maxnum_iteration = 10000; + tolerance_iteration = 1.0e-8; + output_frequency = 1000; + standardize = 1; + displacement_normalization_factor = 1.0; + debiase_after_l1opt = 0; + cross_validation = 0; + l1_alpha = 0.0; + l1_alpha_min = 1.0e-4; + l1_alpha_max = 1.0; + l1_ratio = 1.0; + num_l1_alpha = 1; + save_solution_path = 0; + } + + ~OptimizerControl() = default; + OptimizerControl(const OptimizerControl &obj) = default; + OptimizerControl& operator=(const OptimizerControl &obj) = default; + }; + + class Optimize + { + public: + Optimize(); + ~Optimize(); + + int optimize_main(const Symmetry *symmetry, + Constraint *constraint, + const Fcs *fcs, + const int maxorder, + const std::string file_prefix, + const std::vector &str_order, + const int verbosity, + const DispForceFile &filedata_train, + const DispForceFile &filedata_validation, + Timer *timer); + + void set_training_data(const std::vector> &u_train_in, + const std::vector> &f_train_in); + + void set_validation_data(const std::vector> &u_validation_in, + const std::vector> &f_validation_in); + + std::vector> get_u_train() const; + std::vector> get_f_train() const; + + + void get_matrix_elements_algebraic_constraint(const int maxorder, + std::vector &amat, + std::vector &bvec, + const std::vector> &u_in, + const std::vector> &f_in, + double &fnorm, + const Symmetry *symmetry, + const Fcs *fcs, + const Constraint *constraint) const; + + void set_fcs_values(const int maxorder, + double *fc_in, + std::vector *nequiv, + const Constraint *constraint); + + + size_t get_number_of_rows_sensing_matrix() const; + double* get_params() const; + + void set_optimizer_control(const OptimizerControl &); + OptimizerControl get_optimizer_control() const; + + private: + + double *params; + + std::vector> u_train, f_train; + std::vector> u_validation, f_validation; + + OptimizerControl optcontrol; + + void set_default_variables(); + void deallocate_variables(); + + void data_multiplier(const std::vector> &, + std::vector> &, + const Symmetry *) const; + + int inprim_index(const int, + const Symmetry *) const; + + int least_squares(const int maxorder, + const size_t N, + const size_t N_new, + const size_t M, + const int verbosity, + const Symmetry *symmetry, + const Fcs *fcs, + const Constraint *constraint, + std::vector ¶m_out) const; + + int elastic_net(const std::string job_prefix, + const int maxorder, + const size_t N_new, + const size_t M, + const Symmetry *symmetry, + const std::vector &str_order, + const Fcs *fcs, + Constraint *constraint, + const int verbosity, + std::vector ¶m_out); + + + int run_elastic_net_crossvalidation(const std::string job_prefix, + const int maxorder, + const Fcs *fcs, + const Symmetry *symmetry, + const Constraint *constraint, + const int verbosity); + + void run_enetcv_manual(const std::string job_prefix, + const int maxorder, + const Fcs *fcs, + const Symmetry *symmetry, + const Constraint *constraint, + const int verbosity) const; + + void run_enetcv_auto(const std::string job_prefix, + const int maxorder, + const Fcs *fcs, + const Symmetry *symmetry, + const Constraint *constraint, + const int verbosity); + + void write_cvresult_to_file(const std::string file_out, + const std::vector &alphas, + const std::vector &training_error, + const std::vector &validation_error, + const std::vector> &nonzeros) const; + + int write_cvscore_to_file(const std::string file_out, + const std::vector &alphas, + const std::vector> &training_error_accum, + const std::vector> &validation_error_accum) const; + + int get_ialpha_at_minimum_validation_error(const std::vector &validation_error) const; + + + int run_elastic_net_optimization(const int maxorder, + const size_t M, + const size_t N_new, + const Fcs *fcs, + const Symmetry *symmetry, + const Constraint *constraint, + const int verbosity, + std::vector ¶m_out) const; + + int run_least_squares_with_nonzero_coefs(const Eigen::MatrixXd &A_in, + const Eigen::VectorXd &b_in, + const Eigen::VectorXd &factor_std, + std::vector ¶ms_inout, + const int verbosity) const; + + void get_number_of_zero_coefs(const int maxorder, + const Constraint *constraint, + const Eigen::VectorXd &x, + std::vector &nzeros) const; + + void get_standardizer(const Eigen::MatrixXd &Amat, + Eigen::VectorXd &mean, + Eigen::VectorXd &dev, + Eigen::VectorXd &factor_std, + Eigen::VectorXd &scale_beta) const; + + void apply_standardizer(Eigen::MatrixXd &Amat, + const Eigen::VectorXd &mean, + const Eigen::VectorXd &dev) const; + + double get_esimated_max_alpha(const Eigen::MatrixXd &Amat, + const Eigen::VectorXd &bvec, + const Eigen::VectorXd &mean, + const Eigen::VectorXd &dev) const; + + void apply_scaler_displacement(std::vector> &u_inout, + const double normalization_factor, + const bool scale_back = false) const; + + void apply_scaler_constraint(const int maxorder, + const double normalization_factor, + Constraint *constraint, + const bool scale_back = false) const; + + void apply_scaler_force_constants(const int maxorder, + const double normalization_factor, + const Constraint *constraint, + std::vector ¶m_inout) const; + + void apply_scalers(const int maxorder, + Constraint *constraint); + void finalize_scalers(const int maxorder, + Constraint *constraint); + + + int fit_without_constraints(const size_t N, + const size_t M, + double *amat, + const double *bvec, + double *param_out, + const int verbosity) const; + + int fit_algebraic_constraints(const size_t N, + const size_t M, + double *amat, + const double *bvec, + std::vector ¶m_out, + const double fnorm, + const int maxorder, + const Fcs *fcs, + const Constraint *constraint, + const int verbosity) const; + + int fit_with_constraints(const size_t N, + const size_t M, + const size_t P, + double *amat, + const double *bvec, + double *param_out, + const double *const *cmat, + double *dvec, + const int verbosity) const; + + + void get_matrix_elements(const int maxorder, + std::vector &amat, + std::vector &bvec, + const std::vector> &u_in, + const std::vector> &f_in, + const Symmetry *, + const Fcs *) const; + + void get_matrix_elements_in_sparse_form(const int maxorder, + SpMat &sp_amat, + Eigen::VectorXd &sp_bvec, + const std::vector> &u_in, + const std::vector> &f_in, + double &fnorm, + const Symmetry *symmetry, + const Fcs *fcs, + const Constraint *constraint) const; + + int run_eigen_sparse_solver(const SpMat &sp_mat, + const Eigen::VectorXd &sp_bvec, + std::vector ¶m_out, + const double fnorm, + const int maxorder, + const Fcs *fcs, + const Constraint *constraint, + const std::string solver_type, + const int verbosity) const; + + void recover_original_forceconstants(const int maxorder, + const std::vector ¶m_in, + std::vector ¶m_out, + const std::vector *nequiv, + const Constraint *constraint) const; + + int factorial(const int) const; + int rankQRD(const size_t m, + const size_t n, + double *mat, + const double tolerance) const; + + double gamma(const int, + const int *) const; + + void coordinate_descent(const int M, + const int N, + const double alpha, + const int warm_start, + Eigen::VectorXd &x, + const Eigen::MatrixXd &A, + const Eigen::VectorXd &b, + const Eigen::VectorXd &grad0, + bool *has_prod, + Eigen::MatrixXd &Prod, + Eigen::VectorXd &grad, + const double fnorm, + const Eigen::VectorXd &scale_beta, + const int verbosity) const; + + void run_enet_solution_path(const int maxorder, + Eigen::MatrixXd &A, + Eigen::VectorXd &b, + Eigen::MatrixXd &A_validation, + Eigen::VectorXd &b_validation, + const double fnorm, + const double fnorm_validation, + const std::string file_coef, + const int verbosity, + const Constraint *constraint, + const std::vector &alphas, + std::vector &training_error, + std::vector &validation_error, + std::vector> &nonzeros) const; + + void compute_alphas(std::vector &alphas) const; + }; + + inline double shrink(const double x, + const double a) + { + const auto xabs = std::abs(x); + const auto sign = static_cast((0.0 < x) - (x < 0.0)); + return sign * std::max(xabs - a, 0.0); + } + + extern "C" { + void dgelss_(int *m, + int *n, + int *nrhs, + double *a, + int *lda, + double *b, + int *ldb, + double *s, + double *rcond, + int *rank, + double *work, + int *lwork, + int *info); + + void dgglse_(int *m, + int *n, + int *p, + double *a, + int *lda, + double *b, + int *ldb, + double *c, + double *d, + double *x, + double *work, + int *lwork, + int *info); + + void dgeqp3_(int *m, + int *n, + double *a, + int *lda, + int *jpvt, + double *tau, + double *work, + int *lwork, + int *info); + } +} diff --git a/alm/patterndisp.cpp b/alm/patterndisp.cpp index 5a832028..88afbf9c 100644 --- a/alm/patterndisp.cpp +++ b/alm/patterndisp.cpp @@ -4,7 +4,7 @@ patterndisp.cpp Copyright (c) 2014, 2015, 2016 Terumasa Tadano This file is distributed under the terms of the MIT license. -Please see the file 'LICENCE.txt' in the root directory +Please see the file 'LICENCE.txt' in the root directory or http://opensource.org/licenses/mit-license.php for information. */ @@ -15,7 +15,7 @@ or http://opensource.org/licenses/mit-license.php for information. #include "error.h" #include "system.h" #include "fcs.h" -#include "interaction.h" +#include "cluster.h" #include "symmetry.h" #include "constants.h" #include "mathfunctions.h" @@ -25,45 +25,53 @@ or http://opensource.org/licenses/mit-license.php for information. using namespace ALM_NS; -Displace::Displace(ALM *alm) : Pointers(alm) +Displace::Displace() { + set_default_variables(); } Displace::~Displace() { - if (alm->mode == "suggest") { - memory->deallocate(pattern_all); - } + deallocate_variables(); } -void Displace::gen_displacement_pattern() +void Displace::gen_displacement_pattern(const Cluster *cluster, + const Symmetry *symmetry, + const Fcs *fcs, + const Constraint *constraint, + const System *system, + const int verbosity) { - int i, j, m, order; - int maxorder = interaction->maxorder; + int order; + const auto maxorder = cluster->get_maxorder(); std::string preferred_basis; std::vector group_tmp; - std::vector *constsym; + std::vector> *constsym; + std::vector> const_tmp; std::vector pairs; std::set *include_set; std::set *dispset; - std::vector *nequiv; + std::vector *nequiv; std::vector *fc_table, *fc_zeros; std::vector *const_fix_tmp; std::vector *const_relate_tmp; - boost::bimap *index_bimap_tmp; + boost::bimap *index_bimap_tmp; + const auto do_rref = true; - std::cout << " DISPLACEMENT PATTERN" << std::endl; - std::cout << " ====================" << std::endl << std::endl; + if (verbosity > 0) { + std::cout << " DISPLACEMENT PATTERN" << std::endl; + std::cout << " ====================" << std::endl << std::endl; + } // Decide preferred basis (Cartesian or Lattice) - int ncompat_cart = 0; - int ncompat_latt = 0; - for (auto it = symmetry->SymmData.begin(); it != symmetry->SymmData.end(); ++it) { - if ((*it).compatible_with_cartesian) ++ncompat_cart; - if ((*it).compatible_with_lattice) ++ncompat_latt; + auto ncompat_cart = 0; + auto ncompat_latt = 0; + for (const auto &it : symmetry->get_SymmData()) { + if (it.compatible_with_cartesian) ++ncompat_cart; + if (it.compatible_with_lattice) ++ncompat_latt; } if (ncompat_cart >= ncompat_latt) { preferred_basis = "Cartesian"; @@ -71,78 +79,96 @@ void Displace::gen_displacement_pattern() preferred_basis = "Lattice"; } - memory->allocate(fc_table, maxorder); - memory->allocate(fc_zeros, maxorder); - memory->allocate(constsym, maxorder); - memory->allocate(nequiv, maxorder); - memory->allocate(const_fix_tmp, maxorder); - memory->allocate(const_relate_tmp, maxorder); - memory->allocate(index_bimap_tmp, maxorder); + // std::cout << "Preferred_basis = " << preferred_basis << std::endl; + // std::cout << ncompat_cart << " " << ncompat_latt << std::endl; + + allocate(fc_table, maxorder); + allocate(fc_zeros, maxorder); + allocate(constsym, maxorder); + allocate(nequiv, maxorder); + allocate(const_fix_tmp, maxorder); + allocate(const_relate_tmp, maxorder); + allocate(index_bimap_tmp, maxorder); for (order = 0; order < maxorder; ++order) { - fcs->generate_force_constant_table(order, interaction->pairs[order], - symmetry->SymmData, preferred_basis, + + fcs->generate_force_constant_table(order, + system->get_supercell().number_of_atoms, + cluster->get_cluster_list(order), + symmetry, preferred_basis, fc_table[order], nequiv[order], fc_zeros[order], false); - constraint->get_symmetry_constraint(order, interaction->pairs[order], - symmetry->SymmData, preferred_basis, - fc_table[order], nequiv[order], - constsym[order]); - } + fcs->get_constraint_symmetry(system->get_supercell().number_of_atoms, + symmetry, + order, + preferred_basis, + fc_table[order], + nequiv[order].size(), + constraint->get_tolerance_constraint(), + constsym[order], do_rref); - constraint->get_mapping_constraint(maxorder, nequiv, constsym, const_fix_tmp, - const_relate_tmp, index_bimap_tmp, true); + } for (order = 0; order < maxorder; ++order) { - std::cout << " Number of free" << std::setw(9) - << interaction->str_order[order] << " FCs : " - << index_bimap_tmp[order].size() << std::endl; + const_fix_tmp[order].clear(); + } + + constraint->get_mapping_constraint(maxorder, + nequiv, + constsym, + const_fix_tmp, + const_relate_tmp, + index_bimap_tmp); + + if (verbosity > 0) { + for (order = 0; order < maxorder; ++order) { + std::cout << " Number of free" << std::setw(9) + << cluster->get_ordername(order) << " FCs : " + << index_bimap_tmp[order].size() << std::endl; + } + std::cout << std::endl; } - std::cout << std::endl; - memory->deallocate(constsym); - memory->deallocate(const_fix_tmp); - memory->deallocate(const_relate_tmp); - memory->deallocate(fc_zeros); - memory->allocate(include_set, maxorder); + deallocate(constsym); + deallocate(const_fix_tmp); + deallocate(const_relate_tmp); + deallocate(fc_zeros); + + allocate(include_set, maxorder); for (order = 0; order < maxorder; ++order) { include_set[order].clear(); - for (boost::bimap::const_iterator it = index_bimap_tmp[order].begin(); - it != index_bimap_tmp[order].end(); ++it) { - include_set[order].insert((*it).right); + for (const auto &it : index_bimap_tmp[order]) { + include_set[order].insert(it.right); } } - memory->deallocate(index_bimap_tmp); - + deallocate(index_bimap_tmp); - std::cout << " Generating displacement patterns in "; - // if (disp_basis[0] == 'C') { - std::cout << "Cartesian coordinate... "; - // } else { - // std::cout << "fractional coordinate..."; - // } + if (verbosity > 0) { + std::cout << " Generating displacement patterns in "; + std::cout << "Cartesian coordinate... "; + } - memory->allocate(dispset, maxorder); + allocate(dispset, maxorder); for (order = 0; order < maxorder; ++order) { - m = 0; + size_t m = 0; - for (i = 0; i < nequiv[order].size(); ++i) { + for (size_t i = 0; i < nequiv[order].size(); ++i) { if (include_set[order].find(i) != include_set[order].end()) { group_tmp.clear(); // Store first order + 1 indexes as a necessary displacement pattern. - // Here, duplicate entries will be removed. + // Here, duplicate entries will be removed. // For example, (iij) will be reduced to (ij). - for (j = 0; j < order + 1; ++j) { + for (auto j = 0; j < order + 1; ++j) { group_tmp.push_back(fc_table[order][m].elems[j]); } group_tmp.erase(std::unique(group_tmp.begin(), group_tmp.end()), @@ -156,37 +182,74 @@ void Displace::gen_displacement_pattern() m += nequiv[order][i]; } } - memory->deallocate(include_set); - memory->deallocate(nequiv); - memory->deallocate(fc_table); - - memory->allocate(pattern_all, maxorder); - generate_pattern_all(maxorder, pattern_all, + deallocate(include_set); + deallocate(nequiv); + deallocate(fc_table); + + allocate(pattern_all, maxorder); + // pattern_all is updated. + generate_pattern_all(maxorder, + system->get_supercell().number_of_atoms, + system->get_supercell().lattice_vector, + symmetry, dispset, preferred_basis); - memory->deallocate(dispset); - + deallocate(dispset); - std::cout << " done!" << std::endl; - std::cout << std::endl; + if (verbosity > 0) { + std::cout << " done!" << std::endl; + std::cout << std::endl; - for (order = 0; order < maxorder; ++order) { - std::cout << " Number of disp. patterns for " << std::setw(9) - << interaction->str_order[order] << " : " - << pattern_all[order].size() << std::endl; + for (order = 0; order < maxorder; ++order) { + std::cout << " Number of disp. patterns for " << std::setw(9) + << cluster->get_ordername(order) << " : " + << pattern_all[order].size() << std::endl; + } + std::cout << std::endl; } - std::cout << std::endl; } -void Displace::generate_pattern_all(const int N, - std::vector *pattern, - std::set *dispset_in, - const std::string preferred_basis) +void Displace::set_trim_dispsign_for_evenfunc(const bool trim_dispsign_for_evenfunc_in) +{ + trim_dispsign_for_evenfunc = trim_dispsign_for_evenfunc_in; +} + +std::string Displace::get_disp_basis() const { - int i, j; + return disp_basis; +} + +void Displace::set_disp_basis(const std::string disp_basis_in) +{ + disp_basis = disp_basis_in; +} + +const std::vector& Displace::get_pattern_all(const int order) const +{ + return pattern_all[order]; +} + +void Displace::set_default_variables() +{ + trim_dispsign_for_evenfunc = true; + disp_basis = "CART"; + pattern_all = nullptr; +} + +void Displace::deallocate_variables() +{ + deallocate(pattern_all); +} + +void Displace::generate_pattern_all(const int maxorder, + const size_t nat, + const double lavec[3][3], + const Symmetry *symmetry, + const std::set *dispset_in, + const std::string preferred_basis) const +{ + size_t i, j; int order; - int atom_tmp, natom_disp; - double sign_double; double disp_tmp[3]; std::vector atoms, vec_tmp, nums; @@ -194,16 +257,16 @@ void Displace::generate_pattern_all(const int N, std::vector> *sign_prod, sign_reduced; - memory->allocate(sign_prod, N); + allocate(sign_prod, maxorder); - for (order = 0; order < N; ++order) { + for (order = 0; order < maxorder; ++order) { vec_tmp.clear(); generate_signvecs(order + 1, sign_prod[order], vec_tmp); } - for (order = 0; order < N; ++order) { + for (order = 0; order < maxorder; ++order) { - pattern[order].clear(); + pattern_all[order].clear(); for (auto it = dispset_in[order].begin(); it != dispset_in[order].end(); ++it) { @@ -213,7 +276,7 @@ void Displace::generate_pattern_all(const int N, for (i = 0; i < (*it).atomset.size(); ++i) { - atom_tmp = (*it).atomset[i] / 3; + auto atom_tmp = (*it).atomset[i] / 3; nums.push_back((*it).atomset[i]); atoms.push_back(atom_tmp); @@ -226,10 +289,11 @@ void Displace::generate_pattern_all(const int N, for (j = 0; j < 3; ++j) directions.push_back(disp_tmp[j]); } - natom_disp = atoms.size(); + const auto natom_disp = atoms.size(); if (trim_dispsign_for_evenfunc) { - find_unique_sign_pairs(natom_disp, sign_prod[natom_disp - 1], + find_unique_sign_pairs(natom_disp, nat, symmetry, + sign_prod[natom_disp - 1], nums, sign_reduced, preferred_basis); } else { sign_reduced.clear(); @@ -242,25 +306,17 @@ void Displace::generate_pattern_all(const int N, std::copy(directions.begin(), directions.end(), std::back_inserter(directions_copy)); - for (auto it2 = sign_reduced.cbegin(); it2 != sign_reduced.cend(); ++it2) { + for (const auto &it2 : sign_reduced) { directions.clear(); - for (i = 0; i < (*it2).size(); ++i) { - sign_double = static_cast((*it2)[i]); + for (i = 0; i < it2.size(); ++i) { + const auto sign_double = static_cast(it2[i]); for (j = 0; j < 3; ++j) { disp_tmp[j] = directions_copy[3 * i + j] * sign_double; } - - // if (disp_basis[0] == 'F') { - // rotvec(disp_tmp, disp_tmp, system->rlavec); - // for (j = 0; j < 3; ++j) { - // disp_tmp[j] /= 2.0 * pi; - // } - // } - if (preferred_basis == "Lattice") { - rotvec(disp_tmp, disp_tmp, system->lavec); + rotvec(disp_tmp, disp_tmp, lavec); double norm = 0.0; for (j = 0; j < 3; ++j) norm += disp_tmp[j] * disp_tmp[j]; norm = std::sqrt(norm); @@ -271,17 +327,17 @@ void Displace::generate_pattern_all(const int N, directions.push_back(disp_tmp[j]); } } - pattern[order].push_back(AtomWithDirection(atoms, directions)); + pattern_all[order].emplace_back(atoms, directions); } } } - memory->deallocate(sign_prod); + deallocate(sign_prod); } void Displace::generate_signvecs(const int N, std::vector> &sign, - std::vector vec) + std::vector vec) const { // returns the product of signs ('+','-') @@ -304,16 +360,18 @@ void Displace::generate_signvecs(const int N, } } -void Displace::find_unique_sign_pairs(const int N, - std::vector> sign_in, - std::vector pair_in, +void Displace::find_unique_sign_pairs(const int natom_disp_in, + const size_t nat, + const Symmetry *symmetry, + const std::vector> sign_in, + const std::vector &pair_in, std::vector> &sign_out, - const std::string preferred_basis) + const std::string preferred_basis) const { - int isym, i, j, k; + size_t isym, i; + int j, k; int mapped_atom; int mapped_index; - int nat = system->nat; bool flag_avail; @@ -321,15 +379,15 @@ void Displace::find_unique_sign_pairs(const int N, double **disp, **disp_sym; std::vector symnum_vec; - std::vector::iterator loc; + std::vector::const_iterator loc; std::vector atom_tmp, pair_tmp; std::vector> sign_found; std::vector sign_tmp; std::vector list_disp_atom; std::vector index_for_sort; - memory->allocate(disp, nat, 3); - memory->allocate(disp_sym, nat, 3); + allocate(disp, nat, 3); + allocate(disp_sym, nat, 3); sign_out.clear(); symnum_vec.clear(); @@ -351,18 +409,20 @@ void Displace::find_unique_sign_pairs(const int N, disp[pair_in[i] / 3][pair_in[i] % 3] = 1.0; } + const size_t natom_disp = static_cast(natom_disp_in); + // Find symmetry operations which can be used to // reduce the number of sign patterns (+, -) of displacements - for (isym = 0; isym < symmetry->nsym; ++isym) { + for (isym = 0; isym < symmetry->get_nsym(); ++isym) { flag_avail = true; pair_tmp.clear(); - for (i = 0; i < N; ++i) { + for (i = 0; i < natom_disp; ++i) { if (!flag_avail) break; - mapped_atom = symmetry->map_sym[pair_in[i] / 3][isym]; + mapped_atom = symmetry->get_map_sym()[pair_in[i] / 3][isym]; mapped_index = 3 * mapped_atom + pair_in[i] % 3; loc = std::find(pair_in.begin(), pair_in.end(), mapped_index); @@ -384,7 +444,7 @@ void Displace::find_unique_sign_pairs(const int N, pair_tmp.clear(); for (i = 0; i < list_disp_atom.size(); ++i) { - mapped_atom = symmetry->map_sym[list_disp_atom[i]][isym]; + mapped_atom = symmetry->get_map_sym()[list_disp_atom[i]][isym]; for (j = 0; j < 3; ++j) { disp_sym[mapped_atom][j] = 0.0; @@ -392,17 +452,17 @@ void Displace::find_unique_sign_pairs(const int N, if (preferred_basis == "Cartesian") { for (k = 0; k < 3; ++k) { disp_sym[mapped_atom][j] - += symmetry->SymmData[isym].rotation_cart[j][k] * disp[list_disp_atom[i]][k]; + += symmetry->get_SymmData()[isym].rotation_cart[j][k] * disp[list_disp_atom[i]][k]; } } else if (preferred_basis == "Lattice") { for (k = 0; k < 3; ++k) { disp_sym[mapped_atom][j] - += static_cast(symmetry->SymmData[isym].rotation[j][k]) + += static_cast(symmetry->get_SymmData()[isym].rotation[j][k]) * disp[list_disp_atom[i]][k]; } } else { - error->exit("find_unique_sign_pairs", - "Invalid basis. This cannot happen."); + exit("find_unique_sign_pairs", + "Invalid basis. This cannot happen."); } disp_tmp = disp_sym[mapped_atom][j]; @@ -420,29 +480,27 @@ void Displace::find_unique_sign_pairs(const int N, } } - // Now find unique pairs of displacement directions + // Now find unique pairs of displacement directions sign_found.clear(); - for (std::vector>::const_iterator it = sign_in.begin(); - it != sign_in.end(); ++it) { + for (const auto &it : sign_in) { // if the sign has already been found before, cycle the loop. // else, add the current sign pairs to the return variable. - if (std::find(sign_found.begin(), sign_found.end(), (*it)) != sign_found.end()) { + if (std::find(sign_found.begin(), sign_found.end(), it) != sign_found.end()) { continue; - } else { - sign_out.push_back(*it); } + sign_out.push_back(it); - for (i = 0; i < system->nat; ++i) { + for (i = 0; i < nat; ++i) { for (j = 0; j < 3; ++j) { disp[i][j] = 0.0; } } - for (i = 0; i < N; ++i) { - disp[pair_in[i] / 3][pair_in[i] % 3] = static_cast((*it)[i]); + for (i = 0; i < natom_disp; ++i) { + disp[pair_in[i] / 3][pair_in[i] % 3] = static_cast(it[i]); } for (isym = 0; isym < symnum_vec.size(); ++isym) { @@ -450,25 +508,25 @@ void Displace::find_unique_sign_pairs(const int N, index_for_sort.clear(); for (i = 0; i < list_disp_atom.size(); ++i) { - mapped_atom = symmetry->map_sym[list_disp_atom[i]][symnum_vec[isym]]; + mapped_atom = symmetry->get_map_sym()[list_disp_atom[i]][symnum_vec[isym]]; for (j = 0; j < 3; ++j) { disp_sym[mapped_atom][j] = 0.0; if (preferred_basis == "Cartesian") { for (k = 0; k < 3; ++k) { disp_sym[mapped_atom][j] - += symmetry->SymmData[symnum_vec[isym]].rotation_cart[j][k] + += symmetry->get_SymmData()[symnum_vec[isym]].rotation_cart[j][k] * disp[list_disp_atom[i]][k]; } } else if (preferred_basis == "Lattice") { for (k = 0; k < 3; ++k) { disp_sym[mapped_atom][j] - += static_cast(symmetry->SymmData[symnum_vec[isym]].rotation[j][k]) + += static_cast(symmetry->get_SymmData()[symnum_vec[isym]].rotation[j][k]) * disp[list_disp_atom[i]][k]; } } else { - error->exit("find_unique_sign_pairs", - "Invalid basis. This cannot happen."); + exit("find_unique_sign_pairs", + "Invalid basis. This cannot happen."); } disp_tmp = disp_sym[mapped_atom][j]; @@ -476,9 +534,9 @@ void Displace::find_unique_sign_pairs(const int N, if (std::abs(disp_tmp) > eps) { if (disp_tmp < 0.0) { - index_for_sort.push_back(IndexWithSign(3 * mapped_atom + j, -1)); + index_for_sort.emplace_back(3 * mapped_atom + j, -1); } else { - index_for_sort.push_back(IndexWithSign(3 * mapped_atom + j, 1)); + index_for_sort.emplace_back(3 * mapped_atom + j, 1); } } } @@ -492,7 +550,7 @@ void Displace::find_unique_sign_pairs(const int N, sign_tmp.push_back(index_for_sort[i].sign); } - if ((sign_tmp.size() == N) && + if ((sign_tmp.size() == natom_disp) && (std::find(sign_found.begin(), sign_found.end(), sign_tmp) == sign_found.end())) { sign_found.push_back(sign_tmp); std::sort(sign_found.begin(), sign_found.end()); @@ -500,6 +558,6 @@ void Displace::find_unique_sign_pairs(const int N, } } - memory->deallocate(disp); - memory->deallocate(disp_sym); + deallocate(disp); + deallocate(disp_sym); } diff --git a/alm/patterndisp.h b/alm/patterndisp.h index 387acaa7..141c607b 100644 --- a/alm/patterndisp.h +++ b/alm/patterndisp.h @@ -4,16 +4,22 @@ Copyright (c) 2014 Terumasa Tadano This file is distributed under the terms of the MIT license. - Please see the file 'LICENCE.txt' in the root directory + Please see the file 'LICENCE.txt' in the root directory or http://opensource.org/licenses/mit-license.php for information. */ #pragma once -#include "pointers.h" +//#include "pointers.h" #include +#include #include #include +#include "cluster.h" +#include "symmetry.h" +#include "fcs.h" +#include "constraint.h" +#include "system.h" namespace ALM_NS { @@ -24,24 +30,19 @@ namespace ALM_NS DispAtomSet(); - DispAtomSet(std::vector vec) - { - for (auto it = vec.begin(); it != vec.end(); ++it) { - atomset.push_back((*it)); - } - } + DispAtomSet(std::vector atomset_in) : atomset(std::move(atomset_in)) {} }; class DirectionVec { public: - double direction[3]; + double direction[3]{}; DirectionVec(); - DirectionVec(double vec_in[3]) + DirectionVec(const double vec_in[3]) { - for (int i = 0; i < 3; ++i) direction[i] = vec_in[i]; + for (auto i = 0; i < 3; ++i) direction[i] = vec_in[i]; } }; @@ -53,11 +54,12 @@ namespace ALM_NS DispDirectionHarmonic(); - DispDirectionHarmonic(int n, std::vector list_in) + DispDirectionHarmonic(const int n, + const std::vector &list_in) { atom = n; - for (auto it = list_in.begin(); it != list_in.end(); ++it) { - directionlist.push_back(*it); + for (auto &it : list_in) { + directionlist.push_back(it); } } }; @@ -70,21 +72,16 @@ namespace ALM_NS AtomWithDirection(); - AtomWithDirection(std::vector a, std::vector b) - { - for (unsigned int i = 0; i < a.size(); ++i) { - atoms.push_back(a[i]); - } - for (unsigned int i = 0; i < b.size(); ++i) { - directions.push_back(b[i]); - } - } + AtomWithDirection(std::vector a, + std::vector b) : atoms(std::move(a)), directions(std::move(b)) {} - AtomWithDirection(int n, int *a, double **b) + AtomWithDirection(const int n, + const int *a, + const double **b) { - for (int i = 0; i < n; ++i) { + for (auto i = 0; i < n; ++i) { atoms.push_back(a[i]); - for (int j = 0; j < 3; ++j) { + for (auto j = 0; j < 3; ++j) { directions.push_back(b[i][j]); } } @@ -92,7 +89,8 @@ namespace ALM_NS }; - inline bool operator<(const DispAtomSet &a, const DispAtomSet &b) + inline bool operator<(const DispAtomSet &a, + const DispAtomSet &b) { return std::lexicographical_compare(a.atomset.begin(), a.atomset.end(), b.atomset.begin(), b.atomset.end()); @@ -106,45 +104,63 @@ namespace ALM_NS IndexWithSign(); - IndexWithSign(const int ind_in, const int sign_in) + IndexWithSign(const int ind_in, + const int sign_in) { ind = ind_in; sign = sign_in; } }; - inline bool operator<(const IndexWithSign &a, const IndexWithSign &b) + inline bool operator<(const IndexWithSign &a, + const IndexWithSign &b) { return a.ind < b.ind; } - class Displace: protected Pointers + class Displace { public: - Displace(class ALM *); + Displace(); ~Displace(); - bool trim_dispsign_for_evenfunc; + void gen_displacement_pattern(const Cluster *cluster, + const Symmetry *symmetry, + const Fcs *fcs, + const Constraint *constraint, + const System *system, + const int verbosity); + void set_trim_dispsign_for_evenfunc(const bool); + std::string get_disp_basis() const; + void set_disp_basis(const std::string); + const std::vector& get_pattern_all(const int) const; + + private: + bool trim_dispsign_for_evenfunc; std::string disp_basis; std::vector *pattern_all; - void gen_displacement_pattern(); - private: std::vector disp_harm, disp_harm_best; - void generate_pattern_all(const int, - std::vector *, - std::set *, - const std::string); + void set_default_variables(); + void deallocate_variables(); + void generate_pattern_all(const int maxorder, + const size_t nat, + const double lavec[3][3], + const Symmetry *symmetry, + const std::set *dispset_in, + const std::string preferred_basis) const; void generate_signvecs(const int, std::vector> &, - std::vector); - - void find_unique_sign_pairs(const int, - std::vector>, - std::vector, - std::vector> &, - const std::string); + std::vector) const; + + void find_unique_sign_pairs(const int natom_disp_in, + const size_t nat, + const Symmetry *symmetry, + const std::vector> sign_in, + const std::vector &pair_in, + std::vector> &sign_out, + const std::string preferred_basis) const; }; } diff --git a/alm/pointers.h b/alm/pointers.h deleted file mode 100644 index 77e7af4b..00000000 --- a/alm/pointers.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - pointers.h - - Copyright (c) 2014 Terumasa Tadano - - This file is distributed under the terms of the MIT license. - Please see the file 'LICENCE.txt' in the root directory - or http://opensource.org/licenses/mit-license.php for information. -*/ - -#pragma once - -#include "alamode.h" - -namespace ALM_NS -{ - class Pointers - { - public: - Pointers(ALM *ptr) : - alm(ptr), - memory(ptr->memory), - input(ptr->input), - system(ptr->system), - interaction(ptr->interaction), - fcs(ptr->fcs), - symmetry(ptr->symmetry), - fitting(ptr->fitting), - constraint(ptr->constraint), - files(ptr->files), - displace(ptr->displace), - writes(ptr->writes), - error(ptr->error), - timer(ptr->timer) - { - } - - virtual ~Pointers() - { - } - - protected: - ALM *alm; - Memory *&memory; - Input *&input; - System *&system; - Interaction *&interaction; - Fcs *&fcs; - Symmetry *&symmetry; - Fitting *&fitting; - Constraint *&constraint; - Files *&files; - Displace *&displace; - Writes *&writes; - Error *&error; - Timer *&timer; - }; -} diff --git a/alm/rref.cpp b/alm/rref.cpp new file mode 100644 index 00000000..cd21d2e5 --- /dev/null +++ b/alm/rref.cpp @@ -0,0 +1,248 @@ +#include "rref.h" +#include "constraint.h" +#include +#include +#include +#include + + +void rref(const size_t nrows, + const size_t ncols, + double **mat, + size_t &nrank, + const double tolerance) +{ + // Return the reduced row echelon form (rref) of matrix mat. + // In addition, rank of the matrix is estimated. + + size_t jcol; + double tmp; + + nrank = 0; + + size_t icol = 0; + + for (size_t irow = 0; irow < nrows; ++irow) { + + auto pivot = irow; + + while (std::abs(mat[pivot][icol]) < tolerance) { + ++pivot; + + if (pivot == nrows) { + pivot = irow; + ++icol; + + if (icol == ncols) break; + } + } + + if (icol == ncols) break; + + if (std::abs(mat[pivot][icol]) > tolerance) ++nrank; + + if (pivot != irow) { + //#pragma omp parallel for private(tmp) + for (jcol = icol; jcol < ncols; ++jcol) { + tmp = mat[pivot][jcol]; + mat[pivot][jcol] = mat[irow][jcol]; + mat[irow][jcol] = tmp; + } + } + + tmp = mat[irow][icol]; + tmp = 1.0 / tmp; + //#pragma omp parallel for + for (jcol = icol; jcol < ncols; ++jcol) { + mat[irow][jcol] *= tmp; + } + + for (auto jrow = 0; jrow < nrows; ++jrow) { + if (jrow == irow) continue; + + tmp = mat[jrow][icol]; + //#pragma omp parallel for + for (jcol = icol; jcol < ncols; ++jcol) { + mat[jrow][jcol] -= tmp * mat[irow][jcol]; + } + } + } +} + + +void rref(std::vector> &mat, + const double tolerance) +{ + // Return the reduced row echelon form (rref) of matrix mat. + // In addition, rank of the matrix is estimated. + + size_t jcol; + double tmp; + + size_t nrank = 0; + size_t icol = 0; + + const auto nrows = mat.size(); + const auto ncols = mat[0].size(); + + for (size_t irow = 0; irow < nrows; ++irow) { + + auto pivot = irow; + + while (std::abs(mat[pivot][icol]) < tolerance) { + ++pivot; + + if (pivot == nrows) { + pivot = irow; + ++icol; + + if (icol == ncols) break; + } + } + + if (icol == ncols) break; + + if (std::abs(mat[pivot][icol]) > tolerance) ++nrank; + + if (pivot != irow) { + for (jcol = icol; jcol < ncols; ++jcol) { + tmp = mat[pivot][jcol]; + mat[pivot][jcol] = mat[irow][jcol]; + mat[irow][jcol] = tmp; + } + } + + tmp = mat[irow][icol]; + tmp = 1.0 / tmp; + for (jcol = icol; jcol < ncols; ++jcol) { + mat[irow][jcol] *= tmp; + } + + for (size_t jrow = 0; jrow < nrows; ++jrow) { + if (jrow == irow) continue; + + tmp = mat[jrow][icol]; + for (jcol = icol; jcol < ncols; ++jcol) { + mat[jrow][jcol] -= tmp * mat[irow][jcol]; + } + } + } + + mat.erase(mat.begin() + nrank, mat.end()); + mat.shrink_to_fit(); +} + + +void rref_sparse(const size_t ncols, + ConstraintSparseForm &sp_constraint, + const double tolerance) +{ + // This function is somewhat sensitive to the numerical accuracy. + // The loss of numerical digits can lead to instability. + // Column ordering may improve the stability, but I'm not sure. + // Smaller tolerance is preferable. + + const auto nrows = sp_constraint.size(); + size_t jrow; + double scaling_factor; + double division_factor; + + // This parameter controls the stability and performance. + // Smaller value is more stable but little more costly. + // double zero_criterion = tolerance * 1.0e-3; + const auto zero_criterion = eps15; + + size_t nrank = 0; + size_t icol = 0; + + // std::set::iterator it_found; + std::map::iterator it_elem; + + for (size_t irow = 0; irow < nrows; ++irow) { + + auto pivot = irow; + + while (true) { + it_elem = sp_constraint[pivot].find(icol); + if (it_elem != sp_constraint[pivot].end()) { + if (std::abs(it_elem->second) >= tolerance) { + break; + } + } + + ++pivot; + if (pivot == nrows) { + pivot = irow; + ++icol; + + if (icol == ncols) break; + } + } + + if (icol == ncols) break; + + if (std::abs(it_elem->second) >= tolerance) ++nrank; + + if (pivot != irow) { + std::iter_swap(sp_constraint.begin() + irow, + sp_constraint.begin() + pivot); + } + + division_factor = 1.0 / it_elem->second; + for (auto &it : sp_constraint[irow]) { + it.second *= division_factor; + } + + for (jrow = 0; jrow < nrows; ++jrow) { + if (jrow == irow) continue; + + it_elem = sp_constraint[jrow].find(icol); + if (it_elem == sp_constraint[jrow].end()) continue; + scaling_factor = it_elem->second; + + // Subtract irow elements from jrow + for (const auto &it_now : sp_constraint[irow]) { + if (it_now.first < icol) { + continue; + } + auto it_other = sp_constraint[jrow].find(it_now.first); + if (it_other != sp_constraint[jrow].end()) { + it_other->second -= scaling_factor * it_now.second; + // Delete zero elements and remove from map. + // A smaller threshould is used for better stability. + if (std::abs(it_other->second) < zero_criterion) { + sp_constraint[jrow].erase(it_other); + } + } else { + sp_constraint[jrow][it_now.first] = -scaling_factor * it_now.second; + } + } + // Make sure to erase the icol element from the target row if it exists. + // When the original pivot element is large, the element after subtraction can sometimes be + // larger than the tolerance value because of the loss of significant digis. + auto it_other = sp_constraint[jrow].find(icol); + if (it_other != sp_constraint[jrow].end()) { + sp_constraint[jrow].erase(it_other); + } + } + } + + // Erase all elements smaller than the tolerance value + for (jrow = 0; jrow < nrows; ++jrow) { + auto it_other = sp_constraint[jrow].begin(); + while (it_other != sp_constraint[jrow].end()) { + if (std::abs(it_other->second) <= tolerance) { + sp_constraint[jrow].erase(it_other++); + } else { + ++it_other; + } + } + } + + // Remove emptry entries from the sp_constraint vector + sp_constraint.erase(std::remove_if(sp_constraint.begin(), + sp_constraint.end(), + [](const std::map &obj) { return obj.empty(); }), + sp_constraint.end()); + sp_constraint.shrink_to_fit(); +} diff --git a/alm/rref.h b/alm/rref.h new file mode 100644 index 00000000..1d8d8ce1 --- /dev/null +++ b/alm/rref.h @@ -0,0 +1,16 @@ +#pragma once + +#include "fcs.h" + +void rref(const size_t nrows, + const size_t ncols, + double **mat, + size_t &nrank, + const double tolerance = 1.0e-12); + +void rref(std::vector> &mat, + const double tolerance = 1.0e-12); + +void rref_sparse(const size_t ncols, + ConstraintSparseForm &sp_constraint, + const double tolerance = 1.0e-12); diff --git a/alm/symmetry.cpp b/alm/symmetry.cpp index a78a7c30..61f8398a 100644 --- a/alm/symmetry.cpp +++ b/alm/symmetry.cpp @@ -1,263 +1,265 @@ /* symmetry.cpp - Copyright (c) 2014, 2015, 2016 Terumasa Tadano + Copyright (c) 2014-2018 Terumasa Tadano This file is distributed under the terms of the MIT license. - Please see the file 'LICENCE.txt' in the root directory + Please see the file 'LICENCE.txt' in the root directory or http://opensource.org/licenses/mit-license.php for information. */ -#include -#include -#include -#include "mathfunctions.h" #include "symmetry.h" -#include "system.h" +#include "error.h" +#include "cluster.h" #include "memory.h" -#include "constants.h" +#include "mathfunctions.h" +#include "system.h" #include "timer.h" -#include "error.h" -#include "interaction.h" -#include "files.h" +#include +#include +#include +#include #include #include -#ifdef _USE_EIGEN -#include -#endif +extern "C" { +#include "spglib.h" +} using namespace ALM_NS; -Symmetry::Symmetry(ALM *alm) : Pointers(alm) +Symmetry::Symmetry() { + set_default_variables(); } Symmetry::~Symmetry() { - memory->deallocate(map_sym); - memory->deallocate(map_p2s); - memory->deallocate(map_s2p); - memory->deallocate(symnum_tran); - SymmData.clear(); + deallocate_variables(); } -void Symmetry::init() +double Symmetry::get_tolerance() const { - int i, j; - int nat = system->nat; + return tolerance; +} - std::cout << " SYMMETRY" << std::endl; - std::cout << " ========" << std::endl << std::endl; +void Symmetry::set_tolerance(const double tolerance_in) +{ + tolerance = tolerance_in; +} - setup_symmetry_operation(nat, nsym, - system->lavec, system->rlavec, - system->xcoord, system->kd); +int Symmetry::get_print_symmetry() const +{ + return printsymmetry; +} - std::cout << " Number of symmetry operations = " << SymmData.size() << std::endl; +void Symmetry::set_print_symmetry(const int printsymmetry_in) +{ + printsymmetry = printsymmetry_in; +} - // int nsym_fc; - - // if (nsym_fc == nsym) { - // std::cout << " All symmetry operations will be used to" << std::endl; - // std::cout << " reduce the number of force constants." << std::endl; - // } else { - // std::cout << " " << nsym_fc << " symmetry operations out of " - // << nsym << " will be used to reduce the number of parameters." << std::endl; - // std::cout << " Other " << nsym - nsym_fc - // << " symmetry operations will be imposed as constraints." << std::endl; - // } - // std::cout << std::endl; - - // int counter = 0; - // for (auto it = SymmData.begin(); it != SymmData.end(); ++it) { - // std::cout << "Symm. No. : " << std::setw(4) << counter + 1; - // std::cout << "( " << (*it).compatible_with_lattice << " " << (*it).compatible_with_cartesian << ")" << std::endl; - // for (i = 0; i < 3; ++i) { - // for (j = 0; j < 3; ++j) { - // std::cout << std::setw(15) << (*it).rotation[i][j]; - // } - // std::cout << " "; - // for (j = 0; j < 3; ++j) { - // std::cout << std::setw(15) << (*it).rotation_cart[i][j]; - // } - // - // std::cout << std::endl; - // } - // std::cout << std::endl; - // ++counter; - // } - - pure_translations(); - - memory->allocate(map_sym, nat, nsym); - memory->allocate(map_p2s, nat_prim, ntran); - memory->allocate(map_s2p, nat); - - genmaps(nat, system->xcoord, map_sym, map_p2s, map_s2p); +const std::vector& Symmetry::get_map_s2p() const +{ + return map_s2p; +} - std::cout << std::endl; - std::cout << " **Cell-Atom Correspondens Below**" << std::endl; - std::cout << std::setw(6) << " CELL" << " | " << std::setw(5) << "ATOM" << std::endl; +const std::vector>& Symmetry::get_map_p2s() const +{ + return map_p2s; +} - for (int i = 0; i < ntran; ++i) { - std::cout << std::setw(6) << i + 1 << " | "; - for (int j = 0; j < nat_prim; ++j) { - std::cout << std::setw(5) << map_p2s[j][i] + 1; - if ((j + 1) % 5 == 0) { - std::cout << std::endl << " | "; - } - } - std::cout << std::endl; - } - std::cout << std::endl; - timer->print_elapsed(); - std::cout << " -------------------------------------------------------------------" << std::endl; - std::cout << std::endl; +const std::vector& Symmetry::get_SymmData() const +{ + return SymmData; } -void Symmetry::setup_symmetry_operation(int nat, - unsigned int &nsym, - double aa[3][3], - double bb[3][3], - double **x, - int *kd) +const std::vector>& Symmetry::get_map_sym() const { - int i, j; + return map_sym; +} - SymmData.clear(); +const std::vector& Symmetry::get_symnum_tran() const +{ + return symnum_tran; +} - if (nsym == 0) { +size_t Symmetry::get_nsym() const +{ + return nsym; +} - // Automatically find symmetries. +size_t Symmetry::get_ntran() const +{ + return ntran; +} - std::cout << " NSYM = 0 : Trying to find symmetry operations." << std::endl; - std::cout << " Please be patient. " << std::endl; - std::cout << " This can take a while for a large supercell." << std::endl << std::endl; +size_t Symmetry::get_nat_prim() const +{ + return nat_prim; +} - findsym(nat, aa, x, SymmData); - // The order in SymmData changes for each run because it was generated - // with OpenMP. Therefore, we sort the list here to have the same result. - std::sort(SymmData.begin() + 1, SymmData.end()); - nsym = SymmData.size(); +void Symmetry::init(const System *system, + const int verbosity, + Timer *timer) +{ + timer->start_clock("symmetry"); - if (is_printsymmetry) { - std::ofstream ofs_sym; - std::cout << " PRINTSYM = 1: Symmetry information will be stored in SYMM_INFO file." - << std::endl << std::endl; - ofs_sym.open(file_sym.c_str(), std::ios::out); - ofs_sym << nsym << std::endl; + if (verbosity > 0) { + std::cout << " SYMMETRY" << std::endl; + std::cout << " ========" << std::endl << std::endl; + } - for (auto p = SymmData.begin(); p != SymmData.end(); ++p) { - for (i = 0; i < 3; ++i) { - for (j = 0; j < 3; ++j) { - ofs_sym << std::setw(4) << (*p).rotation[i][j]; - } - } - ofs_sym << " "; - for (i = 0; i < 3; ++i) { - ofs_sym << std::setprecision(15) << std::setw(21) << (*p).tran[i]; - } - ofs_sym << std::endl; - } + // nat_prim, ntran, nsym, SymmData, symnum_tran are set here. + // Symmdata[nsym], symnum_tran[ntran] + setup_symmetry_operation(system->get_supercell(), + system->get_periodicity(), + system->get_atomtype_group(), + system->get_spin(), + verbosity); + + + // set_primitive_lattice(system->lavec, system->supercell.number_of_atoms, + // system->kd, system->xcoord, + // lavec_prim, nat_prim, + // kd_prim, xcoord_prim, + // tolerance); + + map_sym.clear(); + map_sym.shrink_to_fit(); + map_sym.resize(system->get_supercell().number_of_atoms, std::vector(nsym)); + + map_p2s.clear(); + map_p2s.shrink_to_fit(); + map_p2s.resize(nat_prim, std::vector(ntran)); + + gen_mapping_information(system->get_supercell(), + system->get_atomtype_group()); + + if (verbosity > 0) { + print_symminfo_stdout(); + timer->print_elapsed(); + std::cout << " -------------------------------------------------------------------" << std::endl; + std::cout << std::endl; + } + + + timer->stop_clock("symmetry"); +} - ofs_sym.close(); +void Symmetry::set_default_variables() +{ + file_sym = "SYMM_INFO"; + + // Default values + nsym = 0; + printsymmetry = false; + ntran = 0; + nat_prim = 0; + tolerance = 1e-3; + use_internal_symm_finder = false; +} + +void Symmetry::deallocate_variables() {} + +void Symmetry::setup_symmetry_operation(const Cell &cell, + const int is_periodic[3], + const std::vector> &atomtype_group, + const Spin &spin, + const int verbosity) +{ + size_t i, j; + + SymmData.clear(); + + if (use_internal_symm_finder) { + // SymmData is written. + findsym_alm(cell, is_periodic, atomtype_group, spin); + } else { + std::string spgsymbol; + // SymmData is written. + const auto spgnum = findsym_spglib(cell, atomtype_group, spin, spgsymbol); + + if (verbosity > 0) { + std::cout << " Space group: " << spgsymbol << " (" << std::setw(3) << spgnum << ")" << std::endl; } - } else if (nsym == 1) { + } - // Identity operation only ! + // The order in SymmData changes for each run because it was generated + // with OpenMP. Therefore, we sort the list here to have the same result. + std::sort(SymmData.begin() + 1, SymmData.end()); + nsym = SymmData.size(); - std::cout << " NSYM = 1 : Only the identity matrix will be considered." - << std::endl << std::endl; + if (printsymmetry) { + std::ofstream ofs_sym; + if (verbosity > 0) { + std::cout << " PRINTSYM = 1: Symmetry information will be stored in SYMM_INFO file." + << std::endl << std::endl; + } - int rot_tmp[3][3]; - double rot_cart_tmp[3][3]; - double tran_tmp[3]; + ofs_sym.open(file_sym.c_str(), std::ios::out); + ofs_sym << nsym << std::endl; - for (i = 0; i < 3; ++i) { - for (j = 0; j < 3; ++j) { - if (i == j) { - rot_tmp[i][j] = 1; - rot_cart_tmp[i][j] = 1.0; - } else { - rot_tmp[i][j] = 0; - rot_cart_tmp[i][j] = 0.0; + for (auto &p : SymmData) { + for (i = 0; i < 3; ++i) { + for (j = 0; j < 3; ++j) { + ofs_sym << std::setw(4) << p.rotation[i][j]; } } - tran_tmp[i] = 0.0; + ofs_sym << " "; + for (i = 0; i < 3; ++i) { + ofs_sym << std::setprecision(15) << std::setw(21) << p.tran[i]; + } + ofs_sym << std::endl; } - SymmData.push_back(SymmetryOperation(rot_tmp, - tran_tmp, - rot_cart_tmp, - true, - true, - true)); + ofs_sym.close(); + } - } else { + ntran = 0; + for (i = 0; i < nsym; ++i) { + if (SymmData[i].is_translation) ++ntran; + } - std::cout << " NSYM > 1 : Symmetry operations will be read from SYMM_INFO file" - << std::endl << std::endl; - - int nsym2; - int rot_tmp[3][3]; - double rot_cart_tmp[3][3]; - double tran_tmp[3]; - std::ifstream ifs_sym; - - ifs_sym.open(file_sym.c_str(), std::ios::in); - ifs_sym >> nsym2; - - if (nsym != nsym2) - error->exit("setup_symmetry_operations", - "nsym in the given file and the input file are not consistent."); - - for (i = 0; i < nsym; ++i) { - ifs_sym - >> rot_tmp[0][0] >> rot_tmp[0][1] >> rot_tmp[0][2] - >> rot_tmp[1][0] >> rot_tmp[1][1] >> rot_tmp[1][2] - >> rot_tmp[2][0] >> rot_tmp[2][1] >> rot_tmp[2][2] - >> tran_tmp[0] >> tran_tmp[1] >> tran_tmp[2]; - - symop_in_cart(rot_cart_tmp, rot_tmp, system->lavec, system->rlavec); - SymmData.push_back(SymmetryOperation(rot_tmp, - tran_tmp, - rot_cart_tmp, - is_compatible(rot_tmp), - is_compatible(rot_cart_tmp), - is_translation(rot_tmp))); - } - ifs_sym.close(); + nat_prim = cell.number_of_atoms / ntran; + + if (cell.number_of_atoms % ntran) { + exit("setup_symmetry_operation", + "nat != nat_prim * ntran. Something is wrong in the structure."); } -#ifdef _DEBUG - // print_symmetrized_coordinate(x); -#endif + symnum_tran.clear(); + for (i = 0; i < nsym; ++i) { + if (SymmData[i].is_translation) symnum_tran.push_back(i); + } } -void Symmetry::findsym(int nat, - double aa[3][3], - double **x, - std::vector &symop_all) +void Symmetry::findsym_alm(const Cell &cell, + const int is_periodic[3], + const std::vector> &atomtype_group, + const Spin &spin) { std::vector LatticeSymmList; // Generate rotational matrices that don't change the metric tensor LatticeSymmList.clear(); - find_lattice_symmetry(aa, LatticeSymmList); + find_lattice_symmetry(cell.lattice_vector, LatticeSymmList); // Generate all the space group operations with translational vectors - symop_all.clear(); - find_crystal_symmetry(nat, system->nclassatom, system->atomlist_class, x, - LatticeSymmList, symop_all); + // The data is stored in SymmData. + SymmData.clear(); + find_crystal_symmetry(cell, + atomtype_group, + is_periodic, + spin, + LatticeSymmList); LatticeSymmList.clear(); } -void Symmetry::find_lattice_symmetry(double aa[3][3], - std::vector &LatticeSymmList) +void Symmetry::find_lattice_symmetry(const double aa[3][3], + std::vector &LatticeSymmList) const { /* Find the rotational matrices that leave the metric tensor invariant. @@ -270,7 +272,7 @@ void Symmetry::find_lattice_symmetry(double aa[3][3], int i, j, k; int m11, m12, m13, m21, m22, m23, m31, m32, m33; - int nsym_tmp = 0; + auto nsym_tmp = 0; int mat_tmp[3][3]; double det, res; double rot_tmp[3][3]; @@ -300,7 +302,7 @@ void Symmetry::find_lattice_symmetry(double aa[3][3], } // Identity matrix should be the first entry. - LatticeSymmList.push_back(mat_tmp); + LatticeSymmList.emplace_back(mat_tmp); for (m11 = -1; m11 <= 1; ++m11) { for (m12 = -1; m12 <= 1; ++m12) { @@ -361,7 +363,7 @@ void Symmetry::find_lattice_symmetry(double aa[3][3], mat_tmp[i][j] = static_cast(rot_tmp[i][j]); } } - LatticeSymmList.push_back(mat_tmp); + LatticeSymmList.emplace_back(mat_tmp); } } @@ -375,36 +377,36 @@ void Symmetry::find_lattice_symmetry(double aa[3][3], } if (LatticeSymmList.size() > 48) { - error->exit("find_lattice_symmetry", "Number of lattice symmetry is larger than 48."); + exit("find_lattice_symmetry", "Number of lattice symmetry is larger than 48."); } } -void Symmetry::find_crystal_symmetry(int nat, - int nclass, - std::vector *atomclass, - double **x, - std::vector LatticeSymmList, - std::vector &CrystalSymmList) +void Symmetry::find_crystal_symmetry(const Cell &cell, + const std::vector> &atomtype_group, + const int is_periodic[3], + const Spin &spin, + const std::vector &LatticeSymmList) { unsigned int i, j; unsigned int iat, jat, kat, lat; - double x_rot[3]; + double x_rot[3], x_tmp[3]; double rot[3][3], rot_tmp[3][3], rot_cart[3][3]; double mag[3], mag_rot[3]; double tran[3]; double x_rot_tmp[3]; double tmp[3]; double diff; + const auto nclass = atomtype_group.size(); int rot_int[3][3]; - int ii, jj, kk; + int ii; + size_t jj, kk; unsigned int itype; bool is_found; bool isok; bool mag_sym1, mag_sym2; - bool is_identity_matrix; @@ -422,41 +424,41 @@ void Symmetry::find_crystal_symmetry(int nat, tran[i] = 0.0; } - CrystalSymmList.push_back(SymmetryOperation(rot_int, - tran, - rot_cart, - is_compatible(rot_int), - is_compatible(rot_cart), - is_translation(rot_int))); + SymmData.emplace_back(rot_int, + tran, + rot_cart, + is_compatible(rot_int), + is_compatible(rot_cart), + is_translation(rot_int)); + for (auto &it_latsym : LatticeSymmList) { - for (auto it_latsym = LatticeSymmList.begin(); it_latsym != LatticeSymmList.end(); ++it_latsym) { - - iat = atomclass[0][0]; + iat = atomtype_group[0][0]; for (i = 0; i < 3; ++i) { for (j = 0; j < 3; ++j) { - rot[i][j] = static_cast((*it_latsym).mat[i][j]); + rot[i][j] = static_cast(it_latsym.mat[i][j]); } } - rotvec(x_rot, x[iat], rot); + for (i = 0; i < 3; ++i) x_tmp[i] = cell.x_fractional[iat][i]; + rotvec(x_rot, x_tmp, rot); #ifdef _OPENMP -#pragma omp parallel for private(jat, tran, isok, kat, x_rot_tmp, is_found, lat, tmp, diff, \ +#pragma omp parallel for private(jat, tran, isok, kat, x_tmp, x_rot_tmp, is_found, lat, tmp, diff, \ i, j, itype, jj, kk, is_identity_matrix, mag, mag_rot, rot_tmp, rot_cart, mag_sym1, mag_sym2) #endif - for (ii = 0; ii < atomclass[0].size(); ++ii) { - jat = atomclass[0][ii]; + for (ii = 0; ii < atomtype_group[0].size(); ++ii) { + jat = atomtype_group[0][ii]; for (i = 0; i < 3; ++i) { - tran[i] = x[jat][i] - x_rot[i]; + tran[i] = cell.x_fractional[jat][i] - x_rot[i]; tran[i] = tran[i] - nint(tran[i]); } - if ((std::abs(tran[0]) > eps12 && !interaction->is_periodic[0]) || - (std::abs(tran[1]) > eps12 && !interaction->is_periodic[1]) || - (std::abs(tran[2]) > eps12 && !interaction->is_periodic[2])) + if ((std::abs(tran[0]) > eps12 && !is_periodic[0]) || + (std::abs(tran[1]) > eps12 && !is_periodic[1]) || + (std::abs(tran[2]) > eps12 && !is_periodic[2])) continue; is_identity_matrix = @@ -470,11 +472,12 @@ void Symmetry::find_crystal_symmetry(int nat, for (itype = 0; itype < nclass; ++itype) { - for (jj = 0; jj < atomclass[itype].size(); ++jj) { + for (jj = 0; jj < atomtype_group[itype].size(); ++jj) { - kat = atomclass[itype][jj]; + kat = atomtype_group[itype][jj]; - rotvec(x_rot_tmp, x[kat], rot); + for (i = 0; i < 3; ++i) x_tmp[i] = cell.x_fractional[kat][i]; + rotvec(x_rot_tmp, x_tmp, rot); for (i = 0; i < 3; ++i) { x_rot_tmp[i] += tran[i]; @@ -482,12 +485,12 @@ void Symmetry::find_crystal_symmetry(int nat, is_found = false; - for (kk = 0; kk < atomclass[itype].size(); ++kk) { + for (kk = 0; kk < atomtype_group[itype].size(); ++kk) { - lat = atomclass[itype][kk]; + lat = atomtype_group[itype][kk]; for (i = 0; i < 3; ++i) { - tmp[i] = std::fmod(std::abs(x[lat][i] - x_rot_tmp[i]), 1.0); + tmp[i] = std::fmod(std::abs(cell.x_fractional[lat][i] - x_rot_tmp[i]), 1.0); tmp[i] = std::min(tmp[i], 1.0 - tmp[i]); } diff = tmp[0] * tmp[0] + tmp[1] * tmp[1] + tmp[2] * tmp[2]; @@ -502,8 +505,8 @@ void Symmetry::find_crystal_symmetry(int nat, } if (isok) { - matmul3(rot_tmp, rot, system->rlavec); - matmul3(rot_cart, system->lavec, rot_tmp); + matmul3(rot_tmp, rot, cell.reciprocal_lattice_vector); + matmul3(rot_cart, cell.lattice_vector, rot_tmp); for (i = 0; i < 3; ++i) { for (j = 0; j < 3; ++j) { @@ -511,13 +514,13 @@ void Symmetry::find_crystal_symmetry(int nat, } } - if (system->lspin && system->noncollinear) { + if (spin.lspin && spin.noncollinear) { + for (i = 0; i < 3; ++i) { - mag[i] = system->magmom[jat][i]; - mag_rot[i] = system->magmom[iat][i]; + mag[i] = spin.magmom[jat][i]; + mag_rot[i] = spin.magmom[iat][i]; } - rotvec(mag_rot, mag_rot, rot_cart); // In the case of improper rotation, the factor -1 should be multiplied @@ -538,7 +541,7 @@ void Symmetry::find_crystal_symmetry(int nat, if (!mag_sym1 && !mag_sym2) { isok = false; - } else if (!mag_sym1 && mag_sym2 && !trev_sym_mag) { + } else if (!mag_sym1 && mag_sym2 && !spin.time_reversal_symm) { isok = false; } } @@ -549,23 +552,112 @@ void Symmetry::find_crystal_symmetry(int nat, #ifdef _OPENMP #pragma omp critical #endif - CrystalSymmList.push_back(SymmetryOperation((*it_latsym).mat, - tran, - rot_cart, - is_compatible((*it_latsym).mat), - is_compatible(rot_cart), - is_translation((*it_latsym).mat))); + SymmData.emplace_back(it_latsym.mat, + tran, + rot_cart, + is_compatible(it_latsym.mat), + is_compatible(rot_cart), + is_translation(it_latsym.mat)); } } } } +int Symmetry::findsym_spglib(const Cell &cell, + const std::vector> &atomtype_group, + const Spin &spin, + std::string &spgsymbol) +{ + size_t i, j; + double (*position)[3]; + double (*translation)[3]; + int (*rotation)[3][3]; + char symbol[11]; + double aa_tmp[3][3]; + int *types_tmp; + + const auto nat = cell.number_of_atoms; + + if (spin.lspin && spin.noncollinear) { + exit("findsym_spglib", "NONCOLLINEAR spin is not supported in spglib."); + } + + allocate(position, nat); + allocate(types_tmp, nat); + + + for (i = 0; i < 3; ++i) { + for (j = 0; j < 3; ++j) { + aa_tmp[i][j] = cell.lattice_vector[i][j]; + } + } + for (i = 0; i < nat; ++i) { + for (j = 0; j < 3; ++j) { + position[i][j] = cell.x_fractional[i][j]; + } + } + + if (spin.lspin) { + for (i = 0; i < atomtype_group.size(); ++i) { + for (j = 0; j < atomtype_group[i].size(); ++j) { + types_tmp[atomtype_group[i][j]] = i; + } + } + } else { + for (i = 0; i < nat; ++i) { + types_tmp[i] = cell.kind[i]; + } + } + + // First find the number of symmetry operations + nsym = spg_get_multiplicity(aa_tmp, position, types_tmp, nat, tolerance); + + if (nsym == 0) exit("findsym_spglib", "Error occured in spg_get_multiplicity"); + + allocate(translation, nsym); + allocate(rotation, nsym); + + // Store symmetry operations + nsym = spg_get_symmetry(rotation, translation, nsym, + aa_tmp, position, types_tmp, nat, tolerance); + + const auto spgnum = spg_get_international(symbol, aa_tmp, position, types_tmp, nat, tolerance); + spgsymbol = std::string(symbol); + + // Copy symmetry information + SymmData.clear(); + double rot_cartesian[3][3]; + + for (i = 0; i < nsym; ++i) { + + symop_in_cart(rot_cartesian, + rotation[i], + cell.lattice_vector, + cell.reciprocal_lattice_vector); + + SymmData.emplace_back(rotation[i], + translation[i], + rot_cartesian, + is_compatible(rotation[i]), + is_compatible(rot_cartesian), + is_translation(rotation[i])); + + } + + + deallocate(rotation); + deallocate(translation); + deallocate(types_tmp); + deallocate(position); + + return spgnum; +} void Symmetry::symop_in_cart(double rot_cart[3][3], const int rot_lattice[3][3], const double lavec[3][3], - const double rlavec[3][3]) + const double rlavec[3][3]) const { int i, j; double sym_tmp[3][3]; @@ -588,19 +680,12 @@ void Symmetry::symop_in_cart(double rot_cart[3][3], } -void Symmetry::pure_translations() +void Symmetry::print_symminfo_stdout() const { - int i; - - ntran = 0; - for (i = 0; i < nsym; ++i) { - if (SymmData[i].is_translation) ++ntran; - } - - nat_prim = system->nat / ntran; - + std::cout << " Number of symmetry operations = " << SymmData.size() << std::endl; + std::cout << std::endl; if (ntran > 1) { - std::cout << " Given system is not primitive cell." << std::endl; + std::cout << " Given system is not a primitive cell." << std::endl; std::cout << " There are " << std::setw(5) << ntran << " translation operations." << std::endl; } else { @@ -608,42 +693,46 @@ void Symmetry::pure_translations() } std::cout << " Primitive cell contains " << nat_prim << " atoms" << std::endl; - if (system->nat % ntran) { - error->exit("pure_translations", - "nat != nat_prim * ntran. Something is wrong in the structure."); - } - - memory->allocate(symnum_tran, ntran); - - int isym = 0; + std::cout << std::endl; + std::cout << " **Cell-Atom Correspondens Below**" << std::endl; + std::cout << std::setw(6) << " CELL" << " | " << std::setw(5) << "ATOM" << std::endl; - for (i = 0; i < nsym; ++i) { - if (SymmData[i].is_translation) symnum_tran[isym++] = i; + for (size_t i = 0; i < ntran; ++i) { + std::cout << std::setw(6) << i + 1 << " | "; + for (size_t j = 0; j < nat_prim; ++j) { + std::cout << std::setw(5) << map_p2s[j][i] + 1; + if ((j + 1) % 5 == 0) { + std::cout << std::endl << " | "; + } + } + std::cout << std::endl; } + std::cout << std::endl; } -void Symmetry::genmaps(int nat, - double **x, - int **map_sym, - int **map_p2s, - Maps *map_s2p) +void Symmetry::gen_mapping_information(const Cell &cell, + const std::vector> &atomtype_group) { - int isym, iat, jat; - int i, j; - int itype; - int ii, jj; - double xnew[3]; + int isym; + size_t iat, jat; + size_t i, j; + size_t itype; + size_t ii, jj; + double xnew[3], x_tmp[3]; double tmp[3], diff; double rot_double[3][3]; - for (iat = 0; iat < nat; ++iat) { - for (isym = 0; isym < nsym; ++isym) { + for (iat = 0; iat < cell.number_of_atoms; ++iat) { + for (isym = 0; isym < SymmData.size(); ++isym) { map_sym[iat][isym] = -1; } } + // This part may be incompatible with the tolerance used in spglib + const auto natomtypes = atomtype_group.size(); + #ifdef _OPENMP -#pragma omp parallel for private(i, j, rot_double, itype, ii, iat, xnew, jj, jat, tmp, diff, isym) +#pragma omp parallel for private(i, j, rot_double, itype, ii, iat, x_tmp, xnew, jj, jat, tmp, diff, isym) #endif for (isym = 0; isym < nsym; ++isym) { @@ -653,22 +742,23 @@ void Symmetry::genmaps(int nat, } } - for (itype = 0; itype < system->nclassatom; ++itype) { + for (itype = 0; itype < natomtypes; ++itype) { - for (ii = 0; ii < system->atomlist_class[itype].size(); ++ii) { + for (ii = 0; ii < atomtype_group[itype].size(); ++ii) { - iat = system->atomlist_class[itype][ii]; + iat = atomtype_group[itype][ii]; - rotvec(xnew, x[iat], rot_double); + for (i = 0; i < 3; ++i) x_tmp[i] = cell.x_fractional[iat][i]; + rotvec(xnew, x_tmp, rot_double); for (i = 0; i < 3; ++i) xnew[i] += SymmData[isym].tran[i]; - for (jj = 0; jj < system->atomlist_class[itype].size(); ++jj) { + for (jj = 0; jj < atomtype_group[itype].size(); ++jj) { - jat = system->atomlist_class[itype][jj]; + jat = atomtype_group[itype][jj]; for (i = 0; i < 3; ++i) { - tmp[i] = std::fmod(std::abs(x[jat][i] - xnew[i]), 1.0); + tmp[i] = std::fmod(std::abs(cell.x_fractional[jat][i] - xnew[i]), 1.0); tmp[i] = std::min(tmp[i], 1.0 - tmp[i]); } diff = tmp[0] * tmp[0] + tmp[1] * tmp[1] + tmp[2] * tmp[2]; @@ -678,22 +768,24 @@ void Symmetry::genmaps(int nat, } } if (map_sym[iat][isym] == -1) { - error->exit("genmaps", - "cannot find symmetry for operation # ", - isym + 1); + exit("gen_mapping_information", + "cannot find symmetry for operation # ", + isym + 1); } } } } + // Generate map_p2s (primitive --> super) + bool *is_checked; - memory->allocate(is_checked, nat); + allocate(is_checked, cell.number_of_atoms); - for (i = 0; i < nat; ++i) is_checked[i] = false; + for (i = 0; i < cell.number_of_atoms; ++i) is_checked[i] = false; jat = 0; int atomnum_translated; - for (iat = 0; iat < nat; ++iat) { + for (iat = 0; iat < cell.number_of_atoms; ++iat) { if (is_checked[iat]) continue; for (i = 0; i < ntran; ++i) { @@ -704,7 +796,12 @@ void Symmetry::genmaps(int nat, ++jat; } - memory->deallocate(is_checked); + deallocate(is_checked); + + // Generate map_s2p (super --> primitive) + + map_s2p.clear(); + map_s2p.resize(cell.number_of_atoms); for (iat = 0; iat < nat_prim; ++iat) { for (i = 0; i < ntran; ++i) { @@ -715,11 +812,9 @@ void Symmetry::genmaps(int nat, } } -bool Symmetry::is_translation(const int rot[3][3]) +bool Symmetry::is_translation(const int rot[3][3]) const { - bool ret; - - ret = + const auto ret = rot[0][0] == 1 && rot[0][1] == 0 && rot[0][2] == 0 && rot[1][0] == 0 && rot[1][1] == 1 && rot[1][2] == 0 && rot[2][0] == 0 && rot[2][1] == 0 && rot[2][2] == 1; @@ -727,217 +822,84 @@ bool Symmetry::is_translation(const int rot[3][3]) return ret; } - template bool Symmetry::is_compatible(const T rot[3][3], const double tolerance_zero) { - int i, j; - int nfinite; + auto nfinite = 0; double rot_double[3][3]; - nfinite = 0; - for (i = 0; i < 3; ++i) { - for (j = 0; j < 3; ++j) { + for (auto i = 0; i < 3; ++i) { + for (auto j = 0; j < 3; ++j) { rot_double[i][j] = static_cast(rot[i][j]); if (std::abs(rot_double[i][j]) > tolerance_zero) ++nfinite; } } - if (nfinite == 3) return true; - - return false; + return (nfinite == 3); } -void Symmetry::print_symmetrized_coordinate(double **x) -{ - int i, j, k, l; - int isym = 0; - int nat = system->nat; - int m11, m12, m13, m21, m22, m23, m31, m32, m33; - int det; - double tran[3]; - double **x_symm, **x_avg; -#ifdef _USE_EIGEN - Eigen::Matrix3d rot; - Eigen::Vector3d wsi, usi, vsi, tmp; -#else - double rot[3][3]; - double wsi[3], usi[3], vsi[3], tmp[3]; -#endif - memory->allocate(x_symm, nat, 3); - memory->allocate(x_avg, nat, 3); +bool Symmetry::is_proper(const double rot[3][3]) const +{ + const auto det = rot[0][0] * (rot[1][1] * rot[2][2] - rot[2][1] * rot[1][2]) + - rot[1][0] * (rot[0][1] * rot[2][2] - rot[2][1] * rot[0][2]) + + rot[2][0] * (rot[0][1] * rot[1][2] - rot[1][1] * rot[0][2]); - for (i = 0; i < nat; ++i) { - for (j = 0; j < 3; ++j) { - x_avg[i][j] = 0.0; - } + if (std::abs(det - 1.0) < eps12) { + return true; } - - for (std::vector::iterator it = SymmData.begin(); - it != SymmData.end(); ++it) { - - ++isym; - std::cout << "Symmetry No. : " << std::setw(5) << isym << std::endl; - - m11 = (*it).rotation[0][0]; - m12 = (*it).rotation[0][1]; - m13 = (*it).rotation[0][2]; - m21 = (*it).rotation[1][0]; - m22 = (*it).rotation[1][1]; - m23 = (*it).rotation[1][2]; - m31 = (*it).rotation[2][0]; - m32 = (*it).rotation[2][1]; - m33 = (*it).rotation[2][2]; - - for (i = 0; i < 3; ++i) tran[i] = (*it).tran[i]; - - det = m11 * (m22 * m33 - m32 * m23) - - m21 * (m12 * m33 - m32 * m13) - + m31 * (m12 * m23 - m22 * m13); - -#ifdef _USE_EIGEN - rot(0, 0) = static_cast((m22 * m33 - m23 * m32) * det); - rot(0, 1) = static_cast((m23 * m31 - m21 * m33) * det); - rot(0, 2) = static_cast((m21 * m32 - m22 * m31) * det); - rot(1, 0) = static_cast((m32 * m13 - m33 * m12) * det); - rot(1, 1) = static_cast((m33 * m11 - m31 * m13) * det); - rot(1, 2) = static_cast((m31 * m12 - m32 * m11) * det); - rot(2, 0) = static_cast((m12 * m23 - m13 * m22) * det); - rot(2, 1) = static_cast((m13 * m21 - m11 * m23) * det); - rot(2, 2) = static_cast((m11 * m22 - m12 * m21) * det); -#else - rot[0][0] = static_cast((m22 * m33 - m23 * m32) * det); - rot[0][1] = static_cast((m23 * m31 - m21 * m33) * det); - rot[0][2] = static_cast((m21 * m32 - m22 * m31) * det); - rot[1][0] = static_cast((m32 * m13 - m33 * m12) * det); - rot[1][1] = static_cast((m33 * m11 - m31 * m13) * det); - rot[1][2] = static_cast((m31 * m12 - m32 * m11) * det); - rot[2][0] = static_cast((m12 * m23 - m13 * m22) * det); - rot[2][1] = static_cast((m13 * m21 - m11 * m23) * det); - rot[2][2] = static_cast((m11 * m22 - m12 * m21) * det); -#endif - - for (i = 0; i < nat; ++i) { - for (j = 0; j < 3; ++j) { -#ifdef _USE_EIGEN - wsi(j) = x[i][j] - tran[j]; -#else - wsi[j] = x[i][j] - tran[j]; -#endif - } - -#ifdef _USE_EIGEN - usi = rot * wsi; -#else - rotvec(usi, wsi, rot); -#endif - - l = -1; - - for (j = 0; j < nat; ++j) { - for (k = 0; k < 3; ++k) { -#ifdef _USE_EIGEN - vsi(k) = x[j][k]; - tmp(k) = std::fmod(std::abs(usi(k) - vsi(k)), 1.0); - // need "std" to specify floating point operation - // especially for Intel compiler (there was no problem in MSVC) - tmp(k) = std::min(tmp(k), 1.0 - tmp(k)) ; -#else - vsi[k] = x[j][k]; - tmp[k] = std::fmod(std::abs(usi[k] - vsi[k]), 1.0); - tmp[k] = std::min(tmp[k], 1.0 - tmp[k]); -#endif - } -#ifdef _USE_EIGEN - double diff = tmp.dot(tmp); -#else - double diff = tmp[0] * tmp[0] + tmp[1] * tmp[1] + tmp[2] * tmp[2]; -#endif - if (diff < tolerance * tolerance) { - l = j; - break; - } - } - if (l == -1) - error->exit("print_symmetrized_coordinate", - "This cannot happen."); - - for (j = 0; j < 3; ++j) { -#ifdef _USE_EIGEN - x_symm[l][j] = usi(j); -#else - x_symm[l][j] = usi[j]; -#endif - /* - do { - if (x_symm[l][j] < 0.0) { - x_symm[l][j] += 1.0; - } else if (x_symm[l][j] >= 1.0) { - x_symm[l][j] -= 1.0; - } - } while(x_symm[l][j] < 0.0 || x_symm[l][j] >= 1.0); - */ - } - - } - - for (i = 0; i < nat; ++i) { - for (j = 0; j < 3; ++j) { - std::cout << std::setw(20) << std::scientific << x_symm[i][j]; - } - std::cout << " ( "; - for (j = 0; j < 3; ++j) { - std::cout << std::setw(20) << std::scientific << x_symm[i][j] - x[i][j]; - } - std::cout << " )" << std::endl; - - for (j = 0; j < 3; ++j) { - x_avg[i][j] += x_symm[i][j]; - } - } - + if (std::abs(det + 1.0) < eps12) { + return false; } + exit("is_proper", "This cannot happen."); + return false; // dummy to avoid compiler warning +} - for (i = 0; i < nat; ++i) { +void Symmetry::set_primitive_lattice(const double aa[3][3], + const size_t nat, + const int *kd, + double **x, + double aa_prim[3][3], + size_t &nat_prim_out, + int *kd_prim, + double **x_prim, + const double symprec) const +{ + size_t i, j; + int *types_tmp; + double (*position)[3]; + + for (i = 0; i < 3; ++i) { for (j = 0; j < 3; ++j) { - x_avg[i][j] /= static_cast(SymmData.size()); + aa_prim[i][j] = aa[i][j]; } } - std::cout << "Symmetry Averaged Coordinate" << std::endl; + allocate(position, nat); + allocate(types_tmp, nat); + for (i = 0; i < nat; ++i) { for (j = 0; j < 3; ++j) { - std::cout << std::setw(20) << std::scientific - << std::setprecision(9) << x_avg[i][j]; + position[i][j] = x[i][j]; } - std::cout << std::endl; + types_tmp[i] = kd[i]; } - std::cout << std::endl; - - std::cout.setf(std::ios::floatfield); - memory->deallocate(x_symm); - memory->deallocate(x_avg); -} - -bool Symmetry::is_proper(const double rot[3][3]) -{ - double det; - bool ret; + // nat_prim = spg_find_primitive(aa_prim, position, types_tmp, nat, symprec); + nat_prim_out = spg_standardize_cell(aa_prim, + position, + types_tmp, + nat, 1, 0, + symprec); - det = rot[0][0] * (rot[1][1] * rot[2][2] - rot[2][1] * rot[1][2]) - - rot[1][0] * (rot[0][1] * rot[2][2] - rot[2][1] * rot[0][2]) - + rot[2][0] * (rot[0][1] * rot[1][2] - rot[1][1] * rot[0][2]); - - if (std::abs(det - 1.0) < eps12) { - ret = true; - } else if (std::abs(det + 1.0) < eps12) { - ret = false; - } else { - error->exit("is_proper", "This cannot happen."); + for (i = 0; i < nat_prim_out; ++i) { + for (j = 0; j < 3; ++j) { + x_prim[i][j] = position[i][j]; + } + kd_prim[i] = types_tmp[i]; } - return ret; + deallocate(position); + deallocate(types_tmp); } diff --git a/alm/symmetry.h b/alm/symmetry.h index 33511447..486d6cb0 100644 --- a/alm/symmetry.h +++ b/alm/symmetry.h @@ -1,31 +1,27 @@ /* symmetry.h - Copyright (c) 2014--2017 Terumasa Tadano + Copyright (c) 2014, 2015, 2016 Terumasa Tadano This file is distributed under the terms of the MIT license. - Please see the file 'LICENCE.txt' in the root directory + Please see the file 'LICENCE.txt' in the root directory or http://opensource.org/licenses/mit-license.php for information. */ #pragma once -#include "pointers.h" #include -#include #include - -#ifdef _USE_EIGEN -#include -#endif +#include "system.h" +#include "timer.h" namespace ALM_NS { class SymmetryOperation { public: - int rotation[3][3]; // in lattice basis - double tran[3]; // in Cartesian basis + int rotation[3][3]; // in lattice basis + double tran[3]; // in Cartesian basis double rotation_cart[3][3]; // in Cartesian basis bool compatible_with_lattice; bool compatible_with_cartesian; @@ -40,13 +36,13 @@ namespace ALM_NS const bool compatibility_cart, const bool is_trans_in) { - for (int i = 0; i < 3; ++i) { - for (int j = 0; j < 3; ++j) { + for (auto i = 0; i < 3; ++i) { + for (auto j = 0; j < 3; ++j) { rotation[i][j] = rot_in[i][j]; rotation_cart[i][j] = rot_cart_in[i][j]; } } - for (int i = 0; i < 3; ++i) { + for (auto i = 0; i < 3; ++i) { tran[i] = tran_in[i]; } compatible_with_lattice = compatibility_lat; @@ -58,13 +54,13 @@ namespace ALM_NS bool operator<(const SymmetryOperation &a) const { std::vector v1, v2; - for (int i = 0; i < 3; ++i) { - for (int j = 0; j < 3; ++j) { + for (auto i = 0; i < 3; ++i) { + for (auto j = 0; j < 3; ++j) { v1.push_back(static_cast(rotation[i][j])); v2.push_back(static_cast(a.rotation[i][j])); } } - for (int i = 0; i < 3; ++i) { + for (auto i = 0; i < 3; ++i) { if (tran[i] < 0.0) { v1.push_back(1.0 + tran[i]); } else { @@ -90,75 +86,110 @@ namespace ALM_NS RotationMatrix(const int rot[3][3]) { - for (int i = 0; i < 3; ++i) { - for (int j = 0; j < 3; ++j) { + for (auto i = 0; i < 3; ++i) { + for (auto j = 0; j < 3; ++j) { mat[i][j] = rot[i][j]; } } } }; - class Symmetry: protected Pointers + class Maps { public: - Symmetry(class ALM *); + int atom_num; + int tran_num; + }; + + class Symmetry + { + public: + Symmetry(); ~Symmetry(); - void init(); + void init(const System *system, + const int verbosity, + Timer *timer); + + double get_tolerance() const; + void set_tolerance(const double); + int get_print_symmetry() const; + void set_print_symmetry(const int); + const std::vector& get_map_s2p() const; + const std::vector>& get_map_p2s() const; + const std::vector& get_SymmData() const; + const std::vector>& get_map_sym() const; + const std::vector& get_symnum_tran() const; + size_t get_nsym() const; + size_t get_ntran() const; + size_t get_nat_prim() const; - unsigned int nsym, ntran, nat_prim; - int is_printsymmetry; - int multiply_data; - int *symnum_tran; + private: + size_t nsym, ntran, nat_prim; + std::vector> map_sym; // [nat, nsym] + std::vector> map_p2s; // [nat_prim, ntran] + std::vector map_s2p; // [nat] + std::vector SymmData; // [nsym] + std::vector symnum_tran; // [ntran] double tolerance; + bool use_internal_symm_finder; + int printsymmetry; - int **map_sym; - int **map_p2s; - - class Maps - { - public: - int atom_num; - int tran_num; - }; - - Maps *map_s2p; + void set_default_variables(); + void deallocate_variables(); + void setup_symmetry_operation(const Cell &, + const int [3], + const std::vector> &, + const Spin &, + const int); - int trev_sym_mag; + void gen_mapping_information(const Cell &, + const std::vector> &); - std::vector SymmData; - - private: + void findsym_alm(const Cell &, + const int [3], + const std::vector> &, + const Spin &); - void setup_symmetry_operation(int, unsigned int &, - double [3][3], double [3][3], - double **, int *); - void genmaps(int, double **, - int **, int **, - class Symmetry::Maps *); + int findsym_spglib(const Cell &, + const std::vector> &, + const Spin &, + std::string &); - void findsym(int, double [3][3], double **, - std::vector &); + bool is_translation(const int [3][3]) const; + bool is_proper(const double [3][3]) const; - bool is_translation(const int [3][3]); - bool is_proper(const double [3][3]); + void symop_in_cart(double [3][3], + const int [3][3], + const double [3][3], + const double [3][3]) const; - void symop_in_cart(double [3][3], const int [3][3], - const double [3][3], const double [3][3]); - void pure_translations(); - void print_symmetrized_coordinate(double **); + void print_symminfo_stdout() const; template - bool is_compatible(const T [3][3], const double tolerance_zero = 1.0e-5); - - void find_lattice_symmetry(double [3][3], std::vector &); - - void find_crystal_symmetry(int, int, - std::vector *, double **, - std::vector, - std::vector &); - - std::string file_sym = "SYMM_INFO"; + bool is_compatible(const T [3][3], + double tolerance_zero = 1.0e-5); + + void find_lattice_symmetry(const double [3][3], + std::vector &) const; + + void find_crystal_symmetry(const Cell &, + const std::vector> &, + const int [3], + const Spin &, + const std::vector &); + + void set_primitive_lattice(const double aa[3][3], + const size_t nat, + const int *kd, + double **x, + double aa_prim[3][3], + size_t &nat_prim, + int *kd_prim, + double **x_prim, + const double symprec) const; + + std::string file_sym; }; } diff --git a/alm/system.cpp b/alm/system.cpp index 3267c5f3..b4dd2ce3 100644 --- a/alm/system.cpp +++ b/alm/system.cpp @@ -4,180 +4,221 @@ Copyright (c) 2014, 2015, 2016 Terumasa Tadano This file is distributed under the terms of the MIT license. - Please see the file 'LICENCE.txt' in the root directory + Please see the file 'LICENCE.txt' in the root directory or http://opensource.org/licenses/mit-license.php for information. */ -#include -#include -#include #include "system.h" #include "constants.h" +#include "error.h" #include "mathfunctions.h" -#include "timer.h" #include "memory.h" -#include "error.h" -#include "constraint.h" -#include "fcs.h" -#include "symmetry.h" -#include "fitting.h" -#include "xml_parser.h" -#include -#include -#include -#include -#include +#include "timer.h" +#include +#include +#include using namespace ALM_NS; -System::System(ALM *alm): Pointers(alm) +System::System() { - kdname = nullptr; - kd = nullptr; - xcoord = nullptr; - magmom = nullptr; - x_cartesian = nullptr; - atomlist_class = nullptr; + set_default_variables(); } System::~System() { - if (kdname) { - memory->deallocate(kdname); - } - if (kd) { - memory->deallocate(kd); - } - if (xcoord) { - memory->deallocate(xcoord); - } - if (magmom) { - memory->deallocate(magmom); + deallocate_variables(); +} + +void System::init(const int verbosity, + Timer *timer) +{ + const auto nat = supercell.number_of_atoms; + + timer->start_clock("system"); + + // Set atomic types (kind + magmom) + set_atomtype_group(); + + const auto nneib = 27; + if (x_image) { + deallocate(x_image); } - if (x_cartesian) { - memory->deallocate(x_cartesian); + allocate(x_image, nneib, nat, 3); + + if (exist_image) { + deallocate(exist_image); } - if (atomlist_class) { - memory->deallocate(atomlist_class); + allocate(exist_image, nneib); + + generate_coordinate_of_periodic_images(); + + if (verbosity > 0) { + print_structure_stdout(supercell); + if (spin.lspin) print_magmom_stdout(); + timer->print_elapsed(); + std::cout << " -------------------------------------------------------------------" << std::endl; + std::cout << std::endl; } + + timer->stop_clock("system"); } -void System::init() +void System::set_supercell(const double lavec_in[3][3], + const size_t nat_in, + const int *kind_in, + const double xf_in[][3]) { - using namespace std; + size_t i, j; + std::vector unique_nums(nat_in); + auto wrong_number = false; + bool in_unique_nums; - int i, j; + for (i = 0; i < nat_in; i++) { + unique_nums[i] = 0; + } - cout << " SYSTEM" << endl; - cout << " ======" << endl << endl; + size_t nkd = 0; + for (i = 0; i < nat_in; i++) { + in_unique_nums = false; + for (j = 0; j < nkd; j++) { + if (unique_nums[j] == kind_in[i]) { + in_unique_nums = true; + break; + } + } + if (!in_unique_nums) { + unique_nums[nkd] = kind_in[i]; + nkd++; + } + } - recips(lavec, rlavec); + for (i = 0; i < nkd; i++) { + if (static_cast(unique_nums[i]) > nkd) { + std::cout << " WARNING : integers assigned to atoms are wrong. " + << " The numbers will be resorted." << std::endl; + wrong_number = true; + break; + } + } - cout.setf(ios::scientific); + for (i = 0; i < 3; ++i) { + for (j = 0; j < 3; ++j) { + supercell.lattice_vector[i][j] = lavec_in[i][j]; + } + } + set_reciprocal_latt(supercell.lattice_vector, + supercell.reciprocal_lattice_vector); + + supercell.volume = volume(supercell.lattice_vector, Direct); + supercell.number_of_atoms = nat_in; + supercell.number_of_elems = nkd; + supercell.kind.clear(); + supercell.kind.shrink_to_fit(); + supercell.x_fractional.clear(); + supercell.x_fractional.shrink_to_fit(); + supercell.x_cartesian.clear(); + supercell.x_cartesian.shrink_to_fit(); + + std::vector xtmp; + + if (!wrong_number) { + for (i = 0; i < nat_in; ++i) { + supercell.kind.push_back(kind_in[i]); + } + } else { + for (i = 0; i < nat_in; ++i) { + for (j = 0; j < nkd; j++) { + if (kind_in[i] == unique_nums[j]) { + supercell.kind.push_back(static_cast(j + 1)); + } + } + } + } - cout << " Lattice Vector" << endl; - cout << setw(16) << lavec[0][0]; - cout << setw(15) << lavec[1][0]; - cout << setw(15) << lavec[2][0]; - cout << " : a1" << endl; + xtmp.resize(3); + for (i = 0; i < nat_in; ++i) { + for (j = 0; j < 3; ++j) { + xtmp[j] = xf_in[i][j]; + } + supercell.x_fractional.push_back(xtmp); + } - cout << setw(16) << lavec[0][1]; - cout << setw(15) << lavec[1][1]; - cout << setw(15) << lavec[2][1]; - cout << " : a2" << endl; + double xf_tmp[3], xc_tmp[3]; - cout << setw(16) << lavec[0][2]; - cout << setw(15) << lavec[1][2]; - cout << setw(15) << lavec[2][2]; - cout << " : a3" << endl; - cout << endl; + for (const auto &xf : supercell.x_fractional) { + for (i = 0; i < 3; ++i) { + xf_tmp[i] = xf[i]; + } + rotvec(xc_tmp, xf_tmp, supercell.lattice_vector); + for (i = 0; i < 3; ++i) { + xtmp[i] = xc_tmp[i]; + } + supercell.x_cartesian.push_back(xtmp); + } - double vec_tmp[3][3]; - for (i = 0; i < 3; ++i) { + // This is needed to avoid segmentation fault. + spin.magmom.clear(); + std::vector vec(3); + for (i = 0; i < nat_in; ++i) { for (j = 0; j < 3; ++j) { - vec_tmp[i][j] = lavec[j][i]; + vec[j] = 0; } + spin.magmom.push_back(vec); } +} - cell_volume = volume(vec_tmp[0], vec_tmp[1], vec_tmp[2]); - cout << " Cell volume = " << cell_volume << " (a.u)^3" - << endl << endl; - - cout << " Reciprocal Lattice Vector" << std::endl; - cout << setw(16) << rlavec[0][0]; - cout << setw(15) << rlavec[0][1]; - cout << setw(15) << rlavec[0][2]; - cout << " : b1" << endl; +const Cell& System::get_supercell() const +{ + return supercell; +} - cout << setw(16) << rlavec[1][0]; - cout << setw(15) << rlavec[1][1]; - cout << setw(15) << rlavec[1][2]; - cout << " : b2" << endl; +double*** System::get_x_image() const +{ + return x_image; +} - cout << setw(16) << rlavec[2][0]; - cout << setw(15) << rlavec[2][1]; - cout << setw(15) << rlavec[2][2]; - cout << " : b3" << endl; - cout << endl; +int* System::get_exist_image() const +{ + return exist_image; +} - cout << " Atomic species:" << endl; - for (i = 0; i < nkd; ++i) { - cout << setw(6) << i + 1 << setw(5) << kdname[i] << endl; +void System::set_periodicity(const int is_periodic_in[3]) +{ + if (! is_periodic) { + // This should be already allocated though. + allocate(is_periodic, 3); } - cout << endl; - - cout << " Atomic positions in fractional basis and atomic species" << endl; - for (i = 0; i < nat; ++i) { - cout << setw(6) << i + 1; - cout << setw(15) << xcoord[i][0]; - cout << setw(15) << xcoord[i][1]; - cout << setw(15) << xcoord[i][2]; - cout << setw(5) << kd[i] << endl; + for (unsigned int i = 0; i < 3; i++) { + is_periodic[i] = is_periodic_in[i]; } - cout << endl << endl; - cout.unsetf(ios::scientific); +} - // Generate Cartesian coordinate +int* System::get_periodicity() const +{ + return is_periodic; +} - memory->allocate(x_cartesian, nat, 3); +void System::set_kdname(const std::string *kdname_in) +{ + const auto nkd = supercell.number_of_elems; - for (i = 0; i < nat; ++i) { - for (j = 0; j < 3; ++j) { - x_cartesian[i][j] = xcoord[i][j]; - } + if (kdname) { + deallocate(kdname); } - frac2cart(x_cartesian); - setup_atomic_class(kd); - - if (lspin) { - cout << " MAGMOM is given. The magnetic moments of each atom are as follows:" << endl; - for (i = 0; i < nat; ++i) { - cout << setw(6) << i + 1; - cout << setw(5) << magmom[i][0]; - cout << setw(5) << magmom[i][1]; - cout << setw(5) << magmom[i][2]; - cout << endl; - } - cout << endl; - if (noncollinear == 0) { - cout << " NONCOLLINEAR = 0: magnetic moments are considered as scalar variables." << endl; - } else if (noncollinear == 1) { - cout << " NONCOLLINEAR = 1: magnetic moments are considered as vector variables." << endl; - if (symmetry->trev_sym_mag) { - cout << " TREVSYM = 1: Time-reversal symmetry will be considered for generating magnetic space group" << endl; - } else { - cout << " TREVSYM = 0: Time-reversal symmetry will NOT be considered for generating magnetic space group" << endl; - } - } - cout << endl << endl; + allocate(kdname, nkd); + for (size_t i = 0; i < nkd; ++i) { + kdname[i] = kdname_in[i]; } +} - timer->print_elapsed(); - cout << " -------------------------------------------------------------------" << endl; - cout << endl; +std::string* System::get_kdname() const +{ + return kdname; } -void System::recips(double aa[3][3], double bb[3][3]) +void System::set_reciprocal_latt(const double aa[3][3], + double bb[3][3]) const { /* Calculate Reciprocal Lattice Vectors @@ -194,8 +235,8 @@ void System::recips(double aa[3][3], double bb[3][3]) b1 = t(b11, b12, b13) etc. */ - double det; - det = aa[0][0] * aa[1][1] * aa[2][2] + const auto det + = aa[0][0] * aa[1][1] * aa[2][2] + aa[1][0] * aa[2][1] * aa[0][2] + aa[2][0] * aa[0][1] * aa[1][2] - aa[0][0] * aa[2][1] * aa[1][2] @@ -203,10 +244,10 @@ void System::recips(double aa[3][3], double bb[3][3]) - aa[1][0] * aa[0][1] * aa[2][2]; if (std::abs(det) < eps12) { - error->exit("recips", "Lattice Vector is singular"); + exit("set_reciprocal_latt", "Lattice Vector is singular"); } - double factor = 2.0 * pi / det; + const auto factor = 2.0 * pi / det; bb[0][0] = (aa[1][1] * aa[2][2] - aa[1][2] * aa[2][1]) * factor; bb[0][1] = (aa[0][2] * aa[2][1] - aa[0][1] * aa[2][2]) * factor; @@ -221,403 +262,339 @@ void System::recips(double aa[3][3], double bb[3][3]) bb[2][2] = (aa[0][0] * aa[1][1] - aa[0][1] * aa[1][0]) * factor; } -void System::frac2cart(double **xf) +void System::frac2cart(double **xf) const { // x_cartesian = A x_fractional - int i, j; - double *x_tmp; - memory->allocate(x_tmp, 3); + allocate(x_tmp, 3); - for (i = 0; i < nat; ++i) { + for (size_t i = 0; i < supercell.number_of_atoms; ++i) { - rotvec(x_tmp, xf[i], lavec); + rotvec(x_tmp, xf[i], supercell.lattice_vector); - for (j = 0; j < 3; ++j) { + for (auto j = 0; j < 3; ++j) { xf[i][j] = x_tmp[j]; } } - memory->deallocate(x_tmp); + deallocate(x_tmp); } -void System::load_reference_system_xml(std::string file_reference_fcs, - const int order_fcs, - double *const_out) +double System::volume(const double latt_in[3][3], + const LatticeType type) const { - using namespace boost::property_tree; - ptree pt; - - int nat_ref, natmin_ref, ntran_ref; - int **intpair_ref; - std::string str_error; - double *fcs_ref; - int nfcs_ref; - - try { - read_xml(file_reference_fcs, pt); - } - catch (std::exception &e) { - if (order_fcs == 0) { - str_error = "Cannot open file FC2XML ( " + file_reference_fcs + " )"; - } else if (order_fcs == 1) { - str_error = "Cannot open file FC3XML ( " + file_reference_fcs + " )"; + int i, j; + double mat[3][3]; + + if (type == Direct) { + for (i = 0; i < 3; ++i) { + for (j = 0; j < 3; ++j) { + mat[i][j] = latt_in[j][i]; + } } - error->exit("load_reference_system_xml", str_error.c_str()); + } else if (type == Reciprocal) { + for (i = 0; i < 3; ++i) { + for (j = 0; j < 3; ++j) { + mat[i][j] = latt_in[i][j]; + } + } + } else { + exit("volume", "Invalid LatticeType is given"); } - nat_ref = boost::lexical_cast( - get_value_from_xml(pt, "Data.Structure.NumberOfAtoms")); - ntran_ref = boost::lexical_cast( - get_value_from_xml(pt, "Data.Symmetry.NumberOfTranslations")); - natmin_ref = nat_ref / ntran_ref; - - if (natmin_ref != symmetry->nat_prim) { - error->exit("load_reference_system_xml", - "The number of atoms in the primitive cell is not consistent."); - } + const auto vol = std::abs(mat[0][0] * (mat[1][1] * mat[2][2] - mat[1][2] * mat[2][1]) + + mat[0][1] * (mat[1][2] * mat[2][0] - mat[1][0] * mat[2][2]) + + mat[0][2] * (mat[1][0] * mat[2][1] - mat[1][1] * mat[2][0])); - if (order_fcs == 0) { - nfcs_ref = boost::lexical_cast( - get_value_from_xml(pt, "Data.ForceConstants.HarmonicUnique.NFC2")); + return vol; +} - if (nfcs_ref != fcs->nequiv[0].size()) { - error->exit("load_reference_system_xml", - "The number of harmonic force constants is not the same."); - } +void System::set_default_variables() +{ + kdname = nullptr; - } else if (order_fcs == 1) { - nfcs_ref = boost::lexical_cast( - get_value_from_xml(pt, "Data.ForceConstants.CubicUnique.NFC3")); + supercell.number_of_atoms = 0; + supercell.number_of_elems = 0; - if (nfcs_ref != fcs->nequiv[1].size()) { - error->exit("load_reference_system_xml", - "The number of cubic force constants is not the same."); - } - } - memory->allocate(fcs_ref, nfcs_ref); - memory->allocate(intpair_ref, nfcs_ref, 3); + allocate(is_periodic, 3); + is_periodic[0] = 1; + is_periodic[1] = 1; + is_periodic[2] = 1; - int counter = 0; + x_image = nullptr; + exist_image = nullptr; + str_magmom = ""; - if (order_fcs == 0) { - BOOST_FOREACH (const ptree::value_type& child_, pt.get_child("Data.ForceConstants.HarmonicUnique")) { - if (child_.first == "FC2") { - const ptree &child = child_.second; - const std::string str_intpair = child.get(".pairs"); - const std::string str_multiplicity = child.get(".multiplicity"); + spin.lspin = false; + spin.noncollinear = 0; + spin.time_reversal_symm = 1; +} - std::istringstream is(str_intpair); - is >> intpair_ref[counter][0] >> intpair_ref[counter][1]; - fcs_ref[counter] = boost::lexical_cast(child.data()); - ++counter; - } - } - } else if (order_fcs == 1) { - BOOST_FOREACH (const ptree::value_type& child_, pt.get_child("Data.ForceConstants.CubicUnique")) { - if (child_.first == "FC3") { - const ptree &child = child_.second; - const std::string str_intpair = child.get(".pairs"); - const std::string str_multiplicity = child.get(".multiplicity"); - - std::istringstream is(str_intpair); - is >> intpair_ref[counter][0] >> intpair_ref[counter][1] >> intpair_ref[counter][2]; - fcs_ref[counter] = boost::lexical_cast(child.data()); - ++counter; - } - } +void System::deallocate_variables() +{ + if (kdname) { + deallocate(kdname); } - - int i; - std::set list_found; - std::set::iterator iter_found; - int *ind; - int nterms = order_fcs + 2; - memory->allocate(ind, nterms); - - list_found.clear(); - - for (std::vector::iterator p = fcs->fc_table[order_fcs].begin(); - p != fcs->fc_table[order_fcs].end(); ++p) { - FcProperty list_tmp = *p; // Using copy constructor - for (i = 0; i < nterms; ++i) { - ind[i] = list_tmp.elems[i]; - } - list_found.insert(FcProperty(nterms, list_tmp.sign, - ind, list_tmp.mother)); + if (x_image) { + deallocate(x_image); + } + if (is_periodic) { + deallocate(is_periodic); } + if (exist_image) { + deallocate(exist_image); + } +} - for (i = 0; i < nfcs_ref; ++i) { - iter_found = list_found.find(FcProperty(nterms, 1.0, - intpair_ref[i], 1)); - if (iter_found == list_found.end()) { - error->exit("load_reference_system", - "Cannot find equivalent force constant, number: ", - i + 1); +void System::set_spin_variables(const size_t nat_in, + const bool lspin_in, + const int noncol_in, + const int trev_sym_in, + const double (*magmom_in)[3]) +{ + spin.lspin = lspin_in; + spin.noncollinear = noncol_in; + spin.time_reversal_symm = trev_sym_in; + spin.magmom.clear(); + + std::vector vec(3); + for (size_t i = 0; i < nat_in; ++i) { + for (auto j = 0; j < 3; ++j) { + vec[j] = magmom_in[i][j]; } - FcProperty arrtmp = *iter_found; - const_out[arrtmp.mother] = fcs_ref[i]; + spin.magmom.push_back(vec); } - - memory->deallocate(intpair_ref); - memory->deallocate(fcs_ref); - memory->deallocate(ind); - list_found.clear(); } -void System::load_reference_system() +const Spin& System::get_spin() const { - int i; - int iat, jat; - int icrd; + return spin; +} - unsigned int nat_s, nkd_s; - unsigned int natmin_ref, ntran_ref; - double lavec_s[3][3]; - int *kd_s; - double **xcoord_s; - int *map_ref; - int **map_p2s_s; - Symmetry::Maps *map_s2p_s; - std::ifstream ifs_fc2; - ifs_fc2.open(constraint->fc2_file.c_str(), std::ios::in); - if (!ifs_fc2) - error->exit("load_reference_system", - "cannot open file fc2_file"); +void System::set_str_magmom(std::string str_magmom_in) +{ + str_magmom = str_magmom_in; +} - bool is_found_system = false; +const std::string& System::get_str_magmom() const +{ + return str_magmom; +} - int nparam_harmonic_ref; - int nparam_harmonic = fcs->nequiv[0].size(); +const std::vector>& System::get_atomtype_group() const +{ + return atomtype_group; +} - std::string str_tmp; - while (!ifs_fc2.eof() && !is_found_system) { - std::getline(ifs_fc2, str_tmp); - if (str_tmp == "##SYSTEM INFO") { +void System::set_atomtype_group() +{ + // In the case of collinear calculation, spin moments are considered as scalar + // variables. Therefore, the same elements with different magnetic moments are + // considered as different types. In noncollinear calculations, + // magnetic moments are not considered in this stage. They will be treated + // separately in symmetry.cpp where spin moments will be rotated and flipped + // using time-reversal symmetry. - is_found_system = true; + unsigned int i; + AtomType type_tmp{}; + std::set set_type; + set_type.clear(); - std::getline(ifs_fc2, str_tmp); - for (i = 0; i < 3; ++i) { - ifs_fc2 >> lavec_s[0][i] >> lavec_s[1][i] >> lavec_s[2][i]; - } - ifs_fc2.ignore(); - std::getline(ifs_fc2, str_tmp); - ifs_fc2 >> nkd_s; - ifs_fc2.ignore(); - std::getline(ifs_fc2, str_tmp); - std::getline(ifs_fc2, str_tmp); - - ifs_fc2 >> nat_s >> natmin_ref >> ntran_ref; - - if (natmin_ref != symmetry->nat_prim) { - error->exit("load_reference_system", - "The number of atoms in the primitive cell is not consistent"); - } + for (i = 0; i < supercell.number_of_atoms; ++i) { + type_tmp.element = supercell.kind[i]; - if (nat_s != nat) { - std::cout << "The number of atoms in the reference system differs from input." << std::endl; - std::cout << "Trying to map the related force constants (^o^)" << std::endl << std::endl; - } + if (spin.noncollinear == 0) { + type_tmp.magmom = spin.magmom[i][2]; + } else { + type_tmp.magmom = 0.0; + } + set_type.insert(type_tmp); + } - memory->allocate(xcoord_s, nat_s, 3); - memory->allocate(kd_s, nat_s); - memory->allocate(map_p2s_s, natmin_ref, ntran_ref); - memory->allocate(map_s2p_s, nat_s); - - unsigned int ikd, itran, icell; - std::getline(ifs_fc2, str_tmp); - std::getline(ifs_fc2, str_tmp); - for (i = 0; i < nat_s; ++i) { - ifs_fc2 >> str_tmp >> ikd - >> xcoord_s[i][0] >> xcoord_s[i][1] >> xcoord_s[i][2] >> itran >> icell; - kd_s[i] = ikd; - map_p2s_s[icell - 1][itran - 1] = i; - map_s2p_s[i].atom_num = icell - 1; - map_s2p_s[i].tran_num = itran - 1; + const auto natomtypes = set_type.size(); + atomtype_group.resize(natomtypes); + + for (i = 0; i < supercell.number_of_atoms; ++i) { + int count = 0; + for (auto it : set_type) { + if (spin.noncollinear) { + if (supercell.kind[i] == it.element) { + atomtype_group[count].push_back(i); + } + } else { + if ((supercell.kind[i] == it.element) + && (std::abs(spin.magmom[i][2] - it.magmom) < eps6)) { + atomtype_group[count].push_back(i); + } } + ++count; } } - if (!is_found_system) { - error->exit("load_reference_system", - "SYSTEM INFO flag not found in the fc2_file"); - } + set_type.clear(); +} + +void System::generate_coordinate_of_periodic_images() +{ // - // Generate Mapping Information (big supercell -> small supercell) + // Generate Cartesian coordinates of atoms in the neighboring 27 supercells // - double *xtmp; - double *xdiff; - int **intpair_tmp; - - memory->allocate(xtmp, 3); - memory->allocate(xdiff, 3); - memory->allocate(map_ref, nat_s); - - bool map_found; - double dist; + unsigned int i; + int ia, ja, ka; - for (iat = 0; iat < nat_s; ++iat) { - map_found = false; + const auto nat = supercell.number_of_atoms; + const auto xf_in = supercell.x_fractional; - rotvec(xtmp, xcoord_s[iat], lavec_s); - rotvec(xtmp, xtmp, rlavec); + auto icell = 0; + for (i = 0; i < nat; ++i) { + for (unsigned int j = 0; j < 3; ++j) { + x_image[0][i][j] = xf_in[i][j]; + } + } + // Convert to Cartesian coordinate + frac2cart(x_image[0]); - for (icrd = 0; icrd < 3; ++icrd) xtmp[icrd] /= 2.0 * pi; + for (ia = -1; ia <= 1; ++ia) { + for (ja = -1; ja <= 1; ++ja) { + for (ka = -1; ka <= 1; ++ka) { - for (jat = 0; jat < nat; ++jat) { - for (icrd = 0; icrd < 3; ++icrd) { - xdiff[icrd] = xtmp[icrd] - xcoord[jat][icrd]; - xdiff[icrd] = std::fmod(xdiff[icrd], 1.0); - } - dist = xdiff[0] * xdiff[0] + xdiff[1] * xdiff[1] + xdiff[2] * xdiff[2]; + if (ia == 0 && ja == 0 && ka == 0) continue; - if (dist < eps12 && kd_s[iat] == kd[jat]) { - map_ref[iat] = jat; - map_found = true; - break; + ++icell; + for (i = 0; i < nat; ++i) { + x_image[icell][i][0] = xf_in[i][0] + static_cast(ia); + x_image[icell][i][1] = xf_in[i][1] + static_cast(ja); + x_image[icell][i][2] = xf_in[i][2] + static_cast(ka); + } + // Convert to Cartesian coordinate + frac2cart(x_image[icell]); } } - if (!map_found) { - error->exit("load_reference_system", - "Could not find an equivalent atom for atom ", - iat + 1); - } } - memory->deallocate(xtmp); - memory->deallocate(xdiff); - memory->deallocate(xcoord_s); - memory->deallocate(kd_s); + icell = 0; + exist_image[0] = 1; - ifs_fc2.clear(); - ifs_fc2.seekg(0, std::ios_base::beg); + for (ia = -1; ia <= 1; ++ia) { + for (ja = -1; ja <= 1; ++ja) { + for (ka = -1; ka <= 1; ++ka) { - double *fc2_ref; + if (ia == 0 && ja == 0 && ka == 0) continue; - bool is_found_fc2 = false; + ++icell; - while (!ifs_fc2.eof() && !is_found_fc2) { - std::getline(ifs_fc2, str_tmp); - if (str_tmp == "##HARMONIC FORCE CONSTANTS") { - ifs_fc2 >> nparam_harmonic_ref; - if (nparam_harmonic_ref < nparam_harmonic) { - error->exit("load_reference_system", - "Reference file doesn't contain necessary fc2. (too few)"); - } else if (nparam_harmonic_ref > nparam_harmonic) { - error->exit("load_reference_system", - "Reference file contains extra force constants."); - } + // When periodic flag is zero along an axis, + // periodic images along that axis cannot be considered. + if (((std::abs(ia) == 1) && (is_periodic[0] == 0)) || + ((std::abs(ja) == 1) && (is_periodic[1] == 0)) || + ((std::abs(ka) == 1) && (is_periodic[2] == 0))) { - is_found_fc2 = true; + exist_image[icell] = 0; - memory->allocate(fc2_ref, nparam_harmonic); - memory->allocate(intpair_tmp, nparam_harmonic, 2); + } else { - for (i = 0; i < nparam_harmonic; ++i) { - ifs_fc2 >> fc2_ref[i] >> intpair_tmp[i][0] >> intpair_tmp[i][1]; + exist_image[icell] = 1; + } } + } + } +} - std::set list_found; - std::set::iterator iter_found; - int *ind; - memory->allocate(ind, 2); - - list_found.clear(); - for (std::vector::iterator p = fcs->fc_table[0].begin(); - p != fcs->fc_table[0].end(); ++p) { - for (i = 0; i < 2; ++i) ind[i] = (*p).elems[i]; - list_found.insert(FcProperty(2, (*p).sign, ind, (*p).mother)); - } - for (i = 0; i < nparam_harmonic; ++i) { - constraint->const_mat[i][i] = 1.0; - } +void System::print_structure_stdout(const Cell &cell) +{ + using namespace std; + size_t i; - for (i = 0; i < nparam_harmonic; ++i) { + cout << " SYSTEM" << endl; + cout << " ======" << endl << endl; - iter_found = list_found.find(FcProperty(2, 1.0, intpair_tmp[i], 1)); - if (iter_found == list_found.end()) { - error->exit("load_reference_system", - "Cannot find equivalent force constant, number: ", - i + 1); - } - constraint->const_rhs[(*iter_found).mother] = fc2_ref[i]; - } + cout.setf(ios::scientific); - memory->deallocate(intpair_tmp); - memory->deallocate(ind); - memory->deallocate(fc2_ref); - list_found.clear(); - } - } + cout << " Lattice Vector" << endl; + cout << setw(16) << cell.lattice_vector[0][0]; + cout << setw(15) << cell.lattice_vector[1][0]; + cout << setw(15) << cell.lattice_vector[2][0]; + cout << " : a1" << endl; - if (!is_found_fc2) { - error->exit("load_reference_system", - "HARMONIC FORCE CONSTANTS flag not found in the fc2_file"); - } - ifs_fc2.close(); -} + cout << setw(16) << cell.lattice_vector[0][1]; + cout << setw(15) << cell.lattice_vector[1][1]; + cout << setw(15) << cell.lattice_vector[2][1]; + cout << " : a2" << endl; -double System::volume(double vec1[3], double vec2[3], double vec3[3]) -{ - double vol; + cout << setw(16) << cell.lattice_vector[0][2]; + cout << setw(15) << cell.lattice_vector[1][2]; + cout << setw(15) << cell.lattice_vector[2][2]; + cout << " : a3" << endl; + cout << endl; - vol = std::abs(vec1[0] * (vec2[1] * vec3[2] - vec2[2] * vec3[1]) - + vec1[1] * (vec2[2] * vec3[0] - vec2[0] * vec3[2]) - + vec1[2] * (vec2[0] * vec3[1] - vec2[1] * vec3[0])); + cout << " Cell volume = " << cell.volume << " (a.u)^3" + << endl << endl; - return vol; -} + cout << " Reciprocal Lattice Vector" << std::endl; + cout << setw(16) << supercell.reciprocal_lattice_vector[0][0]; + cout << setw(15) << supercell.reciprocal_lattice_vector[0][1]; + cout << setw(15) << supercell.reciprocal_lattice_vector[0][2]; + cout << " : b1" << endl; -void System::setup_atomic_class(int *kd) -{ - // In the case of collinear calculation, spin moments are considered as scalar - // variables. Therefore, the same elements with different magnetic moments are - // considered as different types. In noncollinear calculations, - // magnetic moments are not considered in this stage. They will be treated - // separately in symmetry.cpp where spin moments will be rotated and flipped - // using time-reversal symmetry. + cout << setw(16) << supercell.reciprocal_lattice_vector[1][0]; + cout << setw(15) << supercell.reciprocal_lattice_vector[1][1]; + cout << setw(15) << supercell.reciprocal_lattice_vector[1][2]; + cout << " : b2" << endl; - unsigned int i; - AtomType type_tmp; - std::set set_type; - set_type.clear(); + cout << setw(16) << supercell.reciprocal_lattice_vector[2][0]; + cout << setw(15) << supercell.reciprocal_lattice_vector[2][1]; + cout << setw(15) << supercell.reciprocal_lattice_vector[2][2]; + cout << " : b3" << endl; + cout << endl; - for (i = 0; i < nat; ++i) { - type_tmp.element = kd[i]; + cout << " Atomic species:" << endl; + for (i = 0; i < cell.number_of_elems; ++i) { + cout << setw(6) << i + 1 << setw(5) << kdname[i] << endl; + } + cout << endl; - if (noncollinear == 0) { - type_tmp.magmom = magmom[i][2]; - } else { - type_tmp.magmom = 0.0; - } - set_type.insert(type_tmp); + cout << " Atomic positions in fractional basis and atomic species" << endl; + for (i = 0; i < cell.number_of_atoms; ++i) { + cout << setw(6) << i + 1; + cout << setw(15) << cell.x_fractional[i][0]; + cout << setw(15) << cell.x_fractional[i][1]; + cout << setw(15) << cell.x_fractional[i][2]; + cout << setw(5) << cell.kind[i] << endl; } + cout << endl << endl; + cout.unsetf(ios::scientific); +} - nclassatom = set_type.size(); - memory->allocate(atomlist_class, nclassatom); +void System::print_magmom_stdout() const +{ + using namespace std; - for (i = 0; i < nat; ++i) { - int count = 0; - for (std::set::iterator it = set_type.begin(); - it != set_type.end(); ++it) { - if (noncollinear) { - if (kd[i] == (*it).element) { - atomlist_class[count].push_back(i); - } - } else { - if ((kd[i] == (*it).element) - && (std::abs(magmom[i][2] - (*it).magmom) < eps6)) { - atomlist_class[count].push_back(i); - } - } - ++count; + cout << " MAGMOM is given. The magnetic moments of each atom are as follows:" << endl; + for (size_t i = 0; i < supercell.number_of_atoms; ++i) { + cout << setw(6) << i + 1; + cout << setw(5) << spin.magmom[i][0]; + cout << setw(5) << spin.magmom[i][1]; + cout << setw(5) << spin.magmom[i][2]; + cout << endl; + } + cout << endl; + if (spin.noncollinear == 0) { + cout << " NONCOLLINEAR = 0: magnetic moments are considered as scalar variables." << endl; + } else if (spin.noncollinear == 1) { + cout << " NONCOLLINEAR = 1: magnetic moments are considered as vector variables." << endl; + if (spin.time_reversal_symm) { + cout << " TREVSYM = 1: Time-reversal symmetry will be considered for generating magnetic space group" + << endl; + } else { + cout << + " TREVSYM = 0: Time-reversal symmetry will NOT be considered for generating magnetic space group" + << endl; } } - set_type.clear(); + cout << endl << endl; } diff --git a/alm/system.h b/alm/system.h index 450ea699..c9075bb8 100644 --- a/alm/system.h +++ b/alm/system.h @@ -4,15 +4,15 @@ Copyright (c) 2014 Terumasa Tadano This file is distributed under the terms of the MIT license. - Please see the file 'LICENCE.txt' in the root directory + Please see the file 'LICENCE.txt' in the root directory or http://opensource.org/licenses/mit-license.php for information. */ #pragma once -#include "pointers.h" #include #include +#include "timer.h" namespace ALM_NS { @@ -26,45 +26,95 @@ namespace ALM_NS { if (this->element < a.element) { return true; - } else if (this->element == a.element) { + } + if (this->element == a.element) { return this->magmom < a.magmom; - } else { - return false; } + return false; } }; + class Cell + { + public: + double lattice_vector[3][3]; + double reciprocal_lattice_vector[3][3]; + double volume; + size_t number_of_atoms; + size_t number_of_elems; + std::vector kind; + std::vector> x_fractional; + std::vector> x_cartesian; + }; - class System: protected Pointers + class Spin { public: - System(class ALM *); - ~System(); - void init(); - void recips(double [3][3], double [3][3]); - void frac2cart(double **); - void load_reference_system(); - void load_reference_system_xml(std::string, const int, double *); - - int nat, nkd; - int ndata, nstart, nend, nskip; - int *kd; - double lavec[3][3], rlavec[3][3]; - double **xcoord; // fractional coordinate - double **x_cartesian; - double **magmom; + bool lspin; + int time_reversal_symm; int noncollinear; - std::string *kdname; + std::vector> magmom; + }; - unsigned int nclassatom; + class System + { + public: + System(); + ~System(); + void init(const int, + Timer *); + void frac2cart(double **) const; - std::vector *atomlist_class; - bool lspin; - double cell_volume; + void set_supercell(const double [3][3], + const size_t, + const int *, + const double [][3]); + void set_kdname(const std::string *); + void set_periodicity(const int [3]); + void set_spin_variables(const size_t nat, + const bool, + const int, + const int, + const double (*)[3]); + void set_str_magmom(std::string); + const Cell& get_supercell() const; + double*** get_x_image() const; + int* get_exist_image() const; + std::string* get_kdname() const; + int* get_periodicity() const; + const Spin& get_spin() const; + const std::string& get_str_magmom() const; + const std::vector>& get_atomtype_group() const; private: - double volume(double [3], double [3], double [3]); - void setup_atomic_class(int *); + // Variables for geometric structure + Cell supercell; + std::string *kdname; + int *is_periodic; // is_periodic[3]; + double ***x_image; + int *exist_image; + + // Variables for spins + Spin spin; + std::string str_magmom; + + // concatenate atomic kind and magmom (only for collinear case) + std::vector> atomtype_group; + + enum LatticeType { Direct, Reciprocal }; + + void set_reciprocal_latt(const double [3][3], + double [3][3]) const; + void set_default_variables(); + void deallocate_variables(); + + double volume(const double [3][3], + LatticeType) const; + void set_atomtype_group(); + + void generate_coordinate_of_periodic_images(); + void print_structure_stdout(const Cell &); + void print_magmom_stdout() const; }; } diff --git a/alm/timer.cpp b/alm/timer.cpp index e617b5c0..18f941f3 100644 --- a/alm/timer.cpp +++ b/alm/timer.cpp @@ -1,7 +1,7 @@ /* timer.cpp - Copyright (c) 2014 Terumasa Tadano + Copyright (c) 2014, 2015, 2016 Terumasa Tadano This file is distributed under the terms of the MIT license. Please see the file 'LICENCE.txt' in the root directory @@ -11,51 +11,85 @@ #include "timer.h" #include #include -#include #include using namespace ALM_NS; -Timer::Timer(ALM *alm): Pointers(alm) +Timer::Timer() { #if defined(WIN32) || defined(_WIN32) - QueryPerformanceCounter(&time_ref); + QueryPerformanceCounter(&walltime_ref); QueryPerformanceFrequency(&frequency); + cputime_ref = get_cputime(); #else - gettimeofday(&time_ref, NULL); + gettimeofday(&walltime_ref, nullptr); + cputime_ref = static_cast(clock()); #endif + lock = false; } Timer::~Timer() { + walltime.clear(); + cputime.clear(); } void Timer::reset() { #if defined(WIN32) || defined(_WIN32) - QueryPerformanceCounter(&time_ref); + QueryPerformanceCounter(&walltime_ref); #else - gettimeofday(&time_ref, NULL); + gettimeofday(&walltime_ref, nullptr); #endif } -double Timer::elapsed() +double Timer::elapsed_walltime() const { #if defined(WIN32) || defined(_WIN32) LARGE_INTEGER time_now; QueryPerformanceCounter(&time_now); - return static_cast(time_now.QuadPart - time_ref.QuadPart) + return static_cast(time_now.QuadPart - walltime_ref.QuadPart) / static_cast(frequency.QuadPart); #else timeval time_now; - gettimeofday(&time_now, NULL); - return (time_now.tv_sec - time_ref.tv_sec) + (time_now.tv_usec - time_ref.tv_usec) * 1.0e-6; + gettimeofday(&time_now, nullptr); + return (time_now.tv_sec - walltime_ref.tv_sec) + + (time_now.tv_usec - walltime_ref.tv_usec) * 1.0e-6; #endif } -void Timer::print_elapsed() +#if defined(WIN32) || defined(_WIN32) +double Timer::get_cputime() const +{ + FILETIME createTime; + FILETIME exitTime; + FILETIME kernelTime; + FILETIME userTime; + if (GetProcessTimes(GetCurrentProcess(), + &createTime, &exitTime, &kernelTime, &userTime) != -1) { + SYSTEMTIME userSystemTime; + if (FileTimeToSystemTime(&userTime, &userSystemTime) != -1) + return static_cast(userSystemTime.wHour) * 3600.0 + + static_cast(userSystemTime.wMinute) * 60.0 + + static_cast(userSystemTime.wSecond) + + static_cast(userSystemTime.wMilliseconds) / 1000.0; + } + return 0.0; +} +#endif + +double Timer::elapsed_cputime() const +{ +#if defined(WIN32) || defined(_WIN32) + return get_cputime() - cputime_ref; +#else + return (static_cast(clock()) - cputime_ref) / CLOCKS_PER_SEC; +#endif +} + +void Timer::print_elapsed() const { - std::cout << " Time Elapsed: " << elapsed() << " sec." + std::cout << " Time Elapsed: " << elapsed_walltime() << " sec." << std::endl << std::endl; } @@ -66,12 +100,10 @@ std::string Timer::DateAndTime() std::time(¤t); #if defined(WIN32) || defined(_WIN32) - errno_t err_t; - struct tm local; - + struct tm local{}; char str_now[32]; - err_t = localtime_s(&local, ¤t); + auto err_t = localtime_s(&local, ¤t); err_t = asctime_s(str_now, 32, &local); return str_now; #else @@ -81,3 +113,78 @@ std::string Timer::DateAndTime() return asctime(local); #endif } + + +void Timer::start_clock(const std::string str_tag) +{ + if (lock) { + std::cout << "Error: cannot start clock because it's occupied." << std::endl; + exit(1); + } + // Initialize the counter if the key is new + if (walltime.find(str_tag) == walltime.end()) { + walltime[str_tag] = 0.0; + } + if (cputime.find(str_tag) == cputime.end()) { + cputime[str_tag] = 0.0; + } + + wtime_tmp = elapsed_walltime(); + ctime_tmp = elapsed_cputime(); + + lock = true; +} + +void Timer::stop_clock(const std::string str_tag) +{ + if (!lock) { + std::cout << "Error: cannot stop clock because it's not initialized." << std::endl; + exit(1); + } + + auto it = walltime.find(str_tag); + + if (it == walltime.end()) { + std::cout << "Error: invalid tag for clock" << std::endl; + exit(1); + } + + auto time_tmp = (*it).second; + time_tmp += elapsed_walltime() - wtime_tmp; + walltime[str_tag] = time_tmp; + + it = cputime.find(str_tag); + if (it == cputime.end()) { + std::cout << "Error: invalid tag for clock" << std::endl; + exit(1); + } + + time_tmp = (*it).second; + time_tmp += elapsed_cputime() - ctime_tmp; + cputime[str_tag] = time_tmp; + + lock = false; +} + +double Timer::get_walltime(const std::string str_tag) +{ + const auto it = walltime.find(str_tag); + + if (it == walltime.end()) { + std::cout << "Error: invalid tag for clock" << std::endl; + exit(1); + } + return (*it).second; +} + + +double Timer::get_cputime(const std::string str_tag) +{ + const auto it = cputime.find(str_tag); + + if (it == cputime.end()) { + std::cout << "Error: invalid tag for clock" << std::endl; + exit(1); + } + return (*it).second; +} diff --git a/alm/timer.h b/alm/timer.h index 1c963a8d..7daf6620 100644 --- a/alm/timer.h +++ b/alm/timer.h @@ -11,7 +11,7 @@ #pragma once #include -#include "pointers.h" +#include #if defined(WIN32) || defined(_WIN32) #include @@ -22,23 +22,36 @@ namespace ALM_NS { - class Timer : protected Pointers + class Timer { public: - Timer(class ALM *); + Timer(); ~Timer(); - void reset(); - double elapsed(); - void print_elapsed(); - std::string DateAndTime(); + void print_elapsed() const; + void start_clock(std::string); + void stop_clock(std::string); + double get_walltime(std::string); + double get_cputime(std::string); + static std::string DateAndTime(); private: + void reset(); + double elapsed_walltime() const; + double elapsed_cputime() const; + std::map walltime; + std::map cputime; + double wtime_tmp, ctime_tmp; + bool lock; + #if defined(WIN32) || defined(_WIN32) - LARGE_INTEGER time_ref; + LARGE_INTEGER walltime_ref; LARGE_INTEGER frequency; + double get_cputime() const; + double cputime_ref; #else - timeval time_ref; + timeval walltime_ref; + double cputime_ref; #endif }; } diff --git a/alm/writer.cpp b/alm/writer.cpp new file mode 100644 index 00000000..0a5e9a42 --- /dev/null +++ b/alm/writer.cpp @@ -0,0 +1,983 @@ +/* + writer.cpp + + Copyright (c) 2014, 2015, 2016 Terumasa Tadano + + This file is distributed under the terms of the MIT license. + Please see the file 'LICENCE.txt' in the root directory + or http://opensource.org/licenses/mit-license.php for information. +*/ + +#include "writer.h" +#include "alm.h" +#include "constraint.h" +#include "error.h" +#include "fcs.h" +#include "files.h" +#include "optimize.h" +#include "cluster.h" +#include "memory.h" +#include "patterndisp.h" +#include "symmetry.h" +#include "system.h" +#include "timer.h" +#include "version.h" +#include +#include +#include +#include +#include + +using namespace ALM_NS; + +Writer::Writer() = default; + +Writer::~Writer() = default; + +void Writer::write_input_vars(const ALM *alm) const +{ + size_t i; + + const auto nat = alm->get_supercell().number_of_atoms; + const auto nkd = alm->get_supercell().number_of_elems; + + alm->timer->start_clock("writer"); + + std::cout << '\n'; + std::cout << " Input variables:\n"; + std::cout << " -------------------------------------------------------------------" << '\n'; + std::cout << " General:\n"; + std::cout << " PREFIX = " << alm->files->get_prefix() << '\n'; + std::cout << " MODE = " << alm->get_run_mode() << '\n'; + std::cout << " NAT = " << nat << "; NKD = " << nkd << '\n'; + std::cout << " PRINTSYM = " << alm->symmetry->get_print_symmetry() + << "; TOLERANCE = " << alm->symmetry->get_tolerance() << '\n'; + std::cout << " KD = "; + for (i = 0; i < nkd; ++i) std::cout << std::setw(4) << alm->get_kdname()[i]; + std::cout << '\n'; + std::cout << " PERIODIC = "; + for (i = 0; i < 3; ++i) std::cout << std::setw(3) << alm->get_periodicity()[i]; + std::cout << '\n'; + std::cout << " MAGMOM = " << alm->get_str_magmom() << '\n'; + //std::cout << " HESSIAN = " << alm->files->print_hessian << '\n'; + std::cout << '\n'; + + std::cout << " Interaction:\n"; + std::cout << " NORDER = " << alm->cluster->get_maxorder() << '\n'; + std::cout << " NBODY = "; + for (auto m = 0; m < alm->cluster->get_maxorder(); ++m) { + std::cout << std::setw(3) << alm->get_nbody_include()[m]; + } + std::cout << "\n\n"; + + if (alm->get_run_mode() == "suggest") { + std::cout << " DBASIS = " << alm->displace->get_disp_basis() << "\n\n"; + + } else if (alm->get_run_mode() == "optimize") { + const auto optctrl = alm->optimize->get_optimizer_control(); + std::vector str_linearmodel{"least-squares", "elastic-net"}; + std::cout << " Optimize:\n"; + std::cout << " LMODEL = " + << str_linearmodel[optctrl.linear_model - 1] << '\n'; + if (alm->files->get_datfile_train().filename_second.empty()) { + std::cout << " DFSET = " << alm->files->get_datfile_train().filename << '\n'; + } else { + std::cout << " DFILE = " << alm->files->get_datfile_train().filename << '\n'; + std::cout << " FFILE = " << alm->files->get_datfile_train().filename_second << '\n'; + } + std::cout << " NDATA = " << alm->files->get_datfile_train().ndata + << "; NSTART = " << alm->files->get_datfile_train().nstart + << "; NEND = " << alm->files->get_datfile_train().nend; + if (alm->files->get_datfile_train().skip_s + < alm->files->get_datfile_train().skip_e) { + std::cout << " SKIP = " << alm->files->get_datfile_train().skip_s + << "-" << alm->files->get_datfile_train().skip_e - 1 << "\n\n"; + } else { + std::cout << " SKIP = \n\n"; + } + + std::cout << " ICONST = " << alm->constraint->get_constraint_mode() << '\n'; + std::cout << " ROTAXIS = " << alm->constraint->get_rotation_axis() << '\n'; + std::cout << " FC2XML = " << alm->constraint->get_fc_file(2) << '\n'; + std::cout << " FC3XML = " << alm->constraint->get_fc_file(3) << "\n\n"; + std::cout << " SPARSE = " << optctrl.use_sparse_solver << '\n'; + std::cout << " SPARSESOLVER = " << optctrl.sparsesolver << '\n'; + std::cout << " CONV_TOL = " << optctrl.tolerance_iteration << '\n'; + std::cout << " MAXITER = " << optctrl.maxnum_iteration << "\n\n"; + if (optctrl.linear_model == 2) { + std::cout << " Elastic-net related variables:\n"; + std::cout << " CV = " << std::setw(5) << optctrl.cross_validation << '\n'; + std::cout << " DFSET_CV = " << alm->files->get_datfile_validation().filename << '\n'; + std::cout << " NDATA_CV = " << alm->files->get_datfile_validation().ndata + << "; NSTART_CV = " << alm->files->get_datfile_validation().nstart + << "; NEND_CV = " << alm->files->get_datfile_validation().nend << "\n\n"; + std::cout << " L1_RATIO = " << optctrl.l1_ratio << '\n'; + std::cout << " L1_ALPHA = " << optctrl.l1_alpha << '\n'; + std::cout << " CV_MINALPHA = " << optctrl.l1_alpha_min + << "; CV_MAXALPHA = " << optctrl.l1_alpha_max + << "; CV_NALPHA = " << optctrl.num_l1_alpha << '\n'; + std::cout << " STANDARDIZE = " << optctrl.standardize << '\n'; + std::cout << " ENET_DNORM = " << optctrl.displacement_normalization_factor << '\n'; + std::cout << " NWRITE = " << std::setw(5) << optctrl.output_frequency << '\n'; + std::cout << " DEBIAS_OLS = " << optctrl.debiase_after_l1opt << '\n'; + std::cout << '\n'; + } + } + std::cout << " -------------------------------------------------------------------\n\n"; + std::cout << std::flush; + alm->timer->stop_clock("writer"); +} + +void Writer::writeall(ALM *alm) const +{ + alm->timer->start_clock("writer"); + + if (alm->get_verbosity() > 0) + std::cout << " The following files are created:" << std::endl << std::endl; + + write_force_constants(alm); + // write_misc_xml breaks data in fcs. + write_misc_xml(alm); + if (alm->files->print_hessian) write_hessian(alm); + // write_in_QEformat(alm); + + const auto print_thirdorderpy_fc3 = false; + if (alm->cluster->get_maxorder() > 1 && print_thirdorderpy_fc3) { + write_fc3_thirdorderpy_format(alm); + } + + alm->timer->stop_clock("writer"); +} + +void Writer::write_force_constants(ALM *alm) const +{ + int order, j, l; + std::string *str_fcs; + std::ofstream ofs_fcs; + std::vector atom_tmp; + std::vector> cell_dummy; + + const auto maxorder = alm->cluster->get_maxorder(); + + ofs_fcs.open(alm->files->file_fcs.c_str(), std::ios::out); + if (!ofs_fcs) exit("write_force_constants", "cannot open fcs file"); + + ofs_fcs << " *********************** Force Constants (FCs) ***********************" << std::endl; + ofs_fcs << " * Force constants are printed in Rydberg atomic units. *" << std::endl; + ofs_fcs << " * FC2: Ry/a0^2 FC3: Ry/a0^3 FC4: Ry/a0^4 etc. *" << std::endl; + ofs_fcs << " * FC?: Ry/a0^? a0 = Bohr radius *" << std::endl; + ofs_fcs << " * *" << std::endl; + ofs_fcs << " * The value shown in the last column is the distance *" << std::endl; + ofs_fcs << " * between the most distant atomic pairs. *" << std::endl; + ofs_fcs << " *********************************************************************" << std::endl; + ofs_fcs << std::endl; + ofs_fcs << " ----------------------------------------------------------------------" << std::endl; + ofs_fcs << " Index FCs P Pairs Distance [Bohr]" << std::endl; + ofs_fcs << " (Global, Local) (Multiplicity) " << std::endl; + ofs_fcs << " ----------------------------------------------------------------------" << std::endl; + + allocate(str_fcs, maxorder); + + for (order = 0; order < maxorder; ++order) { + str_fcs[order] = "*FC" + std::to_string(order + 2); + } + + size_t k = 0; + + for (order = 0; order < maxorder; ++order) { + + size_t m = 0; + + if (!alm->fcs->get_nequiv()[order].empty()) { + + ofs_fcs << std::endl << std::setw(6) << str_fcs[order] << std::endl; + + for (unsigned int ui = 0; ui < alm->fcs->get_nequiv()[order].size(); ++ui) { + + ofs_fcs << std::setw(8) << k + 1 << std::setw(8) << ui + 1 + << std::setw(18) << std::setprecision(7) + << std::scientific << alm->optimize->get_params()[k]; + + atom_tmp.clear(); + for (l = 1; l < order + 2; ++l) { + atom_tmp.push_back(alm->fcs->get_fc_table()[order][m].elems[l] / 3); + } + j = alm->symmetry->get_map_s2p()[alm->fcs->get_fc_table()[order][m].elems[0] / 3].atom_num; + std::sort(atom_tmp.begin(), atom_tmp.end()); + + const auto iter_cluster + = alm->cluster->get_interaction_cluster(order, j). + find(InteractionCluster(atom_tmp, cell_dummy)); + + if (iter_cluster == alm->cluster->get_interaction_cluster(order, j).end()) { + std::cout << std::setw(5) << j; + for (l = 0; l < order + 1; ++l) { + std::cout << std::setw(5) << atom_tmp[l]; + } + std::cout << std::endl; + exit("write_force_constants", + "This cannot happen."); + } + + const auto multiplicity = (*iter_cluster).cell.size(); + const auto distmax = (*iter_cluster).distmax; + ofs_fcs << std::setw(4) << multiplicity; + + for (l = 0; l < order + 2; ++l) { + ofs_fcs << std::setw(7) + << easyvizint(alm->fcs->get_fc_table()[order][m].elems[l]); + } + ofs_fcs << std::setw(12) << std::setprecision(3) + << std::fixed << distmax << std::endl; + + m += alm->fcs->get_nequiv()[order][ui]; + ++k; + } + } + } + + ofs_fcs << std::endl; + + ofs_fcs.unsetf(std::ios::showpos); + + for (order = 0; order < maxorder; ++order) { + str_fcs[order] = "**FC" + std::to_string(order + 2); + } + + ofs_fcs << std::endl << std::endl; + ofs_fcs << " ------------------------ All FCs below ------------------------" << std::endl; + + auto ip = 0; + + for (order = 0; order < maxorder; ++order) { + + auto id = 0; + + if (!alm->fcs->get_nequiv()[order].empty()) { + ofs_fcs << std::endl << std::setw(6) << str_fcs[order] << std::endl; + + for (unsigned int iuniq = 0; iuniq < alm->fcs->get_nequiv()[order].size(); ++iuniq) { + + auto str_tmp = " # FC" + std::to_string(order + 2) + "_"; + str_tmp += std::to_string(iuniq + 1); + + ofs_fcs << str_tmp << std::setw(5) << alm->fcs->get_nequiv()[order][iuniq] + << std::setw(16) << std::scientific + << std::setprecision(7) << alm->optimize->get_params()[ip] << std::endl; + + for (j = 0; j < alm->fcs->get_nequiv()[order][iuniq]; ++j) { + ofs_fcs << std::setw(5) << j + 1 << std::setw(12) + << std::setprecision(5) << std::fixed << alm->fcs->get_fc_table()[order][id].sign; + for (k = 0; k < order + 2; ++k) { + ofs_fcs << std::setw(6) + << easyvizint(alm->fcs->get_fc_table()[order][id].elems[k]); + } + ofs_fcs << std::endl; + ++id; + } + ofs_fcs << std::endl; + ++ip; + } + } + } + deallocate(str_fcs); + ofs_fcs.close(); + + if (alm->get_verbosity() > 0) { + std::cout << " Force constants in a human-readable format : " + << alm->files->file_fcs << std::endl; + } +} + +void Writer::write_displacement_pattern(ALM *alm) const +{ + const auto maxorder = alm->cluster->get_maxorder(); + + std::ofstream ofs_pattern; + std::string file_disp_pattern; + + if (alm->get_verbosity() > 0) { + std::cout << " Suggested displacement patterns are printed in the following files: " << std::endl; + } + + for (auto order = 0; order < maxorder; ++order) { + + if (order == 0) { + file_disp_pattern = alm->files->get_prefix() + ".pattern_HARMONIC"; + } else { + file_disp_pattern = alm->files->get_prefix() + ".pattern_ANHARM" + + std::to_string(order + 2); + } + + ofs_pattern.open(file_disp_pattern.c_str(), std::ios::out); + if (!ofs_pattern) { + exit("write_displacement_pattern", + "Cannot open file_disp_pattern"); + } + + auto counter = 0; + + ofs_pattern << "Basis : " << alm->displace->get_disp_basis()[0] << std::endl; + + for (auto entry : alm->displace->get_pattern_all(order)) { + ++counter; + + ofs_pattern << std::setw(5) << counter << ":" + << std::setw(5) << entry.atoms.size() << std::endl; + for (size_t i = 0; i < entry.atoms.size(); ++i) { + ofs_pattern << std::setw(7) << entry.atoms[i] + 1; + for (auto j = 0; j < 3; ++j) { + ofs_pattern << std::setw(15) << entry.directions[3 * i + j]; + } + ofs_pattern << std::endl; + } + } + + ofs_pattern.close(); + + if (alm->get_verbosity() > 0) { + std::cout << " " << alm->cluster->get_ordername(order) + << " : " << file_disp_pattern << std::endl; + } + + } + if (alm->get_verbosity() > 0) std::cout << std::endl; +} + + +void Writer::write_misc_xml(ALM *alm) const +{ + SystemInfo system_structure; + + size_t i, j; + + for (i = 0; i < 3; ++i) { + for (j = 0; j < 3; ++j) { + system_structure.lattice_vector[i][j] + = alm->get_supercell().lattice_vector[i][j]; + } + } + + system_structure.nat = alm->get_supercell().number_of_atoms; + system_structure.natmin = alm->symmetry->get_nat_prim(); + system_structure.ntran = alm->symmetry->get_ntran(); + system_structure.nspecies = alm->get_supercell().number_of_elems; + + AtomProperty prop_tmp{}; + + for (i = 0; i < alm->get_supercell().number_of_atoms; ++i) { + prop_tmp.x = alm->get_supercell().x_fractional[i][0]; + prop_tmp.y = alm->get_supercell().x_fractional[i][1]; + prop_tmp.z = alm->get_supercell().x_fractional[i][2]; + prop_tmp.kind = alm->get_supercell().kind[i]; + prop_tmp.atom = alm->symmetry->get_map_s2p()[i].atom_num + 1; + prop_tmp.tran = alm->symmetry->get_map_s2p()[i].tran_num + 1; + + system_structure.atoms.emplace_back(AtomProperty(prop_tmp)); + } + + using boost::property_tree::ptree; + + ptree pt; + std::string str_pos[3]; + + pt.put("Data.ALM_version", ALAMODE_VERSION); + if (alm->files->get_datfile_train().filename_second.empty()) { + pt.put("Data.Optimize.DFSET", alm->files->get_datfile_train().filename); + } else { + pt.put("Data.Optimize.DFILE", alm->files->get_datfile_train().filename); + pt.put("Data.Optimize.FFILE", alm->files->get_datfile_train().filename_second); + } + + pt.put("Data.Optimize.Constraint", alm->constraint->get_constraint_mode()); + pt.put("Data.Structure.NumberOfAtoms", system_structure.nat); + pt.put("Data.Structure.NumberOfElements", system_structure.nspecies); + + for (i = 0; i < system_structure.nspecies; ++i) { + auto &child = pt.add("Data.Structure.AtomicElements.element", + alm->get_kdname()[i]); + child.put(".number", i + 1); + } + + for (i = 0; i < 3; ++i) { + str_pos[i].clear(); + for (j = 0; j < 3; ++j) { + str_pos[i] += " " + double2string(system_structure.lattice_vector[j][i]); + } + } + pt.put("Data.Structure.LatticeVector", ""); + pt.put("Data.Structure.LatticeVector.a1", str_pos[0]); + pt.put("Data.Structure.LatticeVector.a2", str_pos[1]); + pt.put("Data.Structure.LatticeVector.a3", str_pos[2]); + + std::stringstream ss; + ss << alm->get_periodicity()[0] << " " + << alm->get_periodicity()[1] << " " + << alm->get_periodicity()[2]; + pt.put("Data.Structure.Periodicity", ss.str()); + + pt.put("Data.Structure.Position", ""); + std::string str_tmp; + + for (i = 0; i < system_structure.nat; ++i) { + str_tmp.clear(); + for (j = 0; j < 3; ++j) str_tmp += " " + double2string(alm->get_supercell().x_fractional[i][j]); + auto &child = pt.add("Data.Structure.Position.pos", str_tmp); + child.put(".index", i + 1); + child.put(".element", alm->get_kdname()[alm->get_supercell().kind[i] - 1]); + } + + pt.put("Data.Symmetry.NumberOfTranslations", alm->symmetry->get_ntran()); + for (i = 0; i < system_structure.ntran; ++i) { + for (j = 0; j < system_structure.natmin; ++j) { + auto &child = pt.add("Data.Symmetry.Translations.map", + alm->symmetry->get_map_p2s()[j][i] + 1); + child.put(".tran", i + 1); + child.put(".atom", j + 1); + } + } + + if (alm->get_spin().lspin) { + pt.put("Data.MagneticMoments", ""); + pt.put("Data.MagneticMoments.Noncollinear", alm->get_spin().noncollinear); + pt.put("Data.MagneticMoments.TimeReversalSymmetry", alm->get_spin().time_reversal_symm); + for (i = 0; i < system_structure.nat; ++i) { + str_tmp.clear(); + for (j = 0; j < 3; ++j) str_tmp += " " + double2string(alm->get_spin().magmom[i][j], 5); + auto &child = pt.add("Data.MagneticMoments.mag", str_tmp); + child.put(".index", i + 1); + } + } + + pt.put("Data.ForceConstants", ""); + str_tmp.clear(); + + pt.put("Data.ForceConstants.HarmonicUnique.NFC2", alm->fcs->get_nequiv()[0].size()); + + size_t ihead = 0; + size_t k = 0; + const auto nelem = alm->cluster->get_maxorder() + 1; + int *pair_tmp; + std::vector atom_tmp; + std::vector> cell_dummy; + std::set::iterator iter_cluster; + size_t multiplicity; + + + allocate(pair_tmp, nelem); + + for (unsigned int ui = 0; ui < alm->fcs->get_nequiv()[0].size(); ++ui) { + + for (i = 0; i < 2; ++i) { + pair_tmp[i] = alm->fcs->get_fc_table()[0][ihead].elems[i] / 3; + } + j = alm->symmetry->get_map_s2p()[pair_tmp[0]].atom_num; + + atom_tmp.clear(); + atom_tmp.push_back(pair_tmp[1]); + + iter_cluster = alm->cluster->get_interaction_cluster(0, j).find( + InteractionCluster(atom_tmp, cell_dummy)); + if (iter_cluster == alm->cluster->get_interaction_cluster(0, j).end()) { + exit("load_reference_system_xml", + "Cubic force constant is not found."); + } + + multiplicity = (*iter_cluster).cell.size(); + + auto &child = pt.add("Data.ForceConstants.HarmonicUnique.FC2", + double2string(alm->optimize->get_params()[k])); + child.put(".pairs", + std::to_string(alm->fcs->get_fc_table()[0][ihead].elems[0]) + + " " + std::to_string(alm->fcs->get_fc_table()[0][ihead].elems[1])); + child.put(".multiplicity", multiplicity); + ihead += alm->fcs->get_nequiv()[0][ui]; + ++k; + } + ihead = 0; + + + if (alm->cluster->get_maxorder() > 1) { + + pt.put("Data.ForceConstants.CubicUnique.NFC3", alm->fcs->get_nequiv()[1].size()); + + for (unsigned int ui = 0; ui < alm->fcs->get_nequiv()[1].size(); ++ui) { + for (i = 0; i < 3; ++i) { + pair_tmp[i] = alm->fcs->get_fc_table()[1][ihead].elems[i] / 3; + } + j = alm->symmetry->get_map_s2p()[pair_tmp[0]].atom_num; + + atom_tmp.clear(); + for (i = 1; i < 3; ++i) { + atom_tmp.push_back(pair_tmp[i]); + } + std::sort(atom_tmp.begin(), atom_tmp.end()); + + iter_cluster = alm->cluster->get_interaction_cluster(1, j).find( + InteractionCluster(atom_tmp, cell_dummy)); + if (iter_cluster == alm->cluster->get_interaction_cluster(1, j).end()) { + exit("load_reference_system_xml", + "Cubic force constant is not found."); + } + multiplicity = (*iter_cluster).cell.size(); + + + auto &child = pt.add("Data.ForceConstants.CubicUnique.FC3", + double2string(alm->optimize->get_params()[k])); + child.put(".pairs", + std::to_string(alm->fcs->get_fc_table()[1][ihead].elems[0]) + + " " + std::to_string(alm->fcs->get_fc_table()[1][ihead].elems[1]) + + " " + std::to_string(alm->fcs->get_fc_table()[1][ihead].elems[2])); + child.put(".multiplicity", multiplicity); + ihead += alm->fcs->get_nequiv()[1][ui]; + ++k; + } + } + + size_t ip; + int imult; + std::string elementname = "Data.ForceConstants.HARMONIC.FC2"; + + std::sort(alm->fcs->get_fc_table()[0].begin(), alm->fcs->get_fc_table()[0].end()); + + for (const auto &it : alm->fcs->get_fc_table()[0]) { + + ip = it.mother; + + for (k = 0; k < 2; ++k) { + pair_tmp[k] = it.elems[k] / 3; + } + + j = alm->symmetry->get_map_s2p()[pair_tmp[0]].atom_num; + + atom_tmp.clear(); + atom_tmp.push_back(pair_tmp[1]); + + iter_cluster = alm->cluster->get_interaction_cluster(0, j).find( + InteractionCluster(atom_tmp, cell_dummy)); + + if (iter_cluster != alm->cluster->get_interaction_cluster(0, j).end()) { + multiplicity = (*iter_cluster).cell.size(); + + for (imult = 0; imult < multiplicity; ++imult) { + std::vector cell_now = (*iter_cluster).cell[imult]; + + ptree &child = pt.add(elementname, + double2string(alm->optimize->get_params()[ip] * it.sign + / static_cast(multiplicity))); + + child.put(".pair1", std::to_string(j + 1) + + " " + std::to_string(it.elems[0] % 3 + 1)); + + for (k = 1; k < 2; ++k) { + child.put(".pair" + std::to_string(k + 1), + std::to_string(pair_tmp[k] + 1) + + " " + std::to_string(it.elems[k] % 3 + 1) + + " " + std::to_string(cell_now[k - 1] + 1)); + } + } + } else { + exit("write_misc_xml", "This cannot happen."); + } + } + + auto ishift = alm->fcs->get_nequiv()[0].size(); + + // Print anharmonic force constants to the xml file. + + for (auto order = 1; order < alm->cluster->get_maxorder(); ++order) { + + std::sort(alm->fcs->get_fc_table()[order].begin(), + alm->fcs->get_fc_table()[order].end()); + + for (const auto &it : alm->fcs->get_fc_table()[order]) { + + ip = it.mother + ishift; + + // Save nonzero force constants only + if (std::abs(alm->optimize->get_params()[ip]) < eps) continue; + + for (k = 0; k < order + 2; ++k) { + pair_tmp[k] = it.elems[k] / 3; + } + j = alm->symmetry->get_map_s2p()[pair_tmp[0]].atom_num; + + atom_tmp.clear(); + + for (k = 1; k < order + 2; ++k) { + atom_tmp.push_back(pair_tmp[k]); + } + std::sort(atom_tmp.begin(), atom_tmp.end()); + + elementname = "Data.ForceConstants.ANHARM" + + std::to_string(order + 2) + + ".FC" + std::to_string(order + 2); + + iter_cluster = alm->cluster->get_interaction_cluster(order, j).find( + InteractionCluster(atom_tmp, cell_dummy)); + + if (iter_cluster != alm->cluster->get_interaction_cluster(order, j).end()) { + multiplicity = (*iter_cluster).cell.size(); + + for (imult = 0; imult < multiplicity; ++imult) { + auto cell_now = (*iter_cluster).cell[imult]; + + auto &child = pt.add(elementname, + double2string(alm->optimize->get_params()[ip] * it.sign + / static_cast(multiplicity))); + + child.put(".pair1", std::to_string(j + 1) + + " " + std::to_string(it.elems[0] % 3 + 1)); + + for (k = 1; k < order + 2; ++k) { + child.put(".pair" + std::to_string(k + 1), + std::to_string(pair_tmp[k] + 1) + + " " + std::to_string(it.elems[k] % 3 + 1) + + " " + std::to_string(cell_now[k - 1] + 1)); + } + } + } else { + exit("write_misc_xml", "This cannot happen."); + } + } + ishift += alm->fcs->get_nequiv()[order].size(); + } + + using namespace boost::property_tree::xml_parser; + const auto indent = 2; + + const auto file_xml = alm->files->get_prefix() + ".xml"; + +#if BOOST_VERSION >= 105600 + write_xml(file_xml, pt, std::locale(), + xml_writer_make_settings(' ', indent, + widen("utf-8"))); +#else + write_xml(file_xml, pt, std::locale(), + xml_writer_make_settings(' ', indent, widen("utf-8"))); +#endif + + deallocate(pair_tmp); + + if (alm->get_verbosity() > 0) { + std::cout << " Input data for the phonon code ANPHON : " << file_xml << std::endl; + } +} + +void Writer::write_hessian(ALM *alm) const +{ + size_t i, j; + int pair_tmp[2]; + int pair_tran[2]; + std::ofstream ofs_hes; + double **hessian; + + //ALMCore *alm = alm->get_alm(); + const auto nat3 = 3 * alm->get_supercell().number_of_atoms; + + allocate(hessian, nat3, nat3); + + for (i = 0; i < nat3; ++i) { + for (j = 0; j < nat3; ++j) { + hessian[i][j] = 0.0; + } + } + + for (const auto &it : alm->fcs->get_fc_table()[0]) { + + const auto ip = it.mother; + + for (i = 0; i < 2; ++i) pair_tmp[i] = it.elems[i] / 3; + for (size_t itran = 0; itran < alm->symmetry->get_ntran(); ++itran) { + for (i = 0; i < 2; ++i) { + pair_tran[i] = alm->symmetry->get_map_sym()[pair_tmp[i]][alm->symmetry->get_symnum_tran()[itran]]; + } + hessian[3 * pair_tran[0] + it.elems[0] % 3][3 * pair_tran[1] + it.elems[1] % 3] + = alm->optimize->get_params()[ip] * it.sign; + } + } + + ofs_hes.open(alm->files->file_hes.c_str(), std::ios::out); + if (!ofs_hes) exit("write_hessian", "cannot create hessian file"); + + ofs_hes << "# atom1, xyz1, atom2, xyz2, FC2 (Ryd/Bohr^2)" << std::endl; + for (i = 0; i < nat3; ++i) { + for (j = 0; j < nat3; ++j) { + ofs_hes << std::setw(5) << i / 3 + 1; + ofs_hes << std::setw(5) << i % 3 + 1; + ofs_hes << std::setw(6) << j / 3 + 1; + ofs_hes << std::setw(5) << j % 3 + 1; + ofs_hes << std::setw(25) << std::setprecision(15) + << std::scientific << hessian[i][j]; + ofs_hes << std::endl; + } + } + ofs_hes.close(); + deallocate(hessian); + + if (alm->get_verbosity()) { + std::cout << " Complete Hessian matrix : " << alm->files->file_hes << std::endl; + } +} + +std::string Writer::double2string(const double d, + const int nprec) const +{ + std::string rt; + std::stringstream ss; + + ss << std::scientific << std::setprecision(nprec) << d; + ss >> rt; + return rt; +} + +void Writer::write_in_QEformat(ALM *alm) const +{ + size_t i, j; + int pair_tmp[2]; + int pair_tran[2]; + std::ofstream ofs_hes; + double **hessian; + const auto nat3 = 3 * alm->get_supercell().number_of_atoms; + + allocate(hessian, nat3, nat3); + + for (i = 0; i < nat3; ++i) { + for (j = 0; j < nat3; ++j) { + hessian[i][j] = 0.0; + } + } + for (const auto &it : alm->fcs->get_fc_table()[0]) { + + const auto ip = it.mother; + + for (i = 0; i < 2; ++i) pair_tmp[i] = it.elems[i] / 3; + for (size_t itran = 0; itran < alm->symmetry->get_ntran(); ++itran) { + for (i = 0; i < 2; ++i) { + pair_tran[i] = alm->symmetry->get_map_sym()[pair_tmp[i]][alm->symmetry->get_symnum_tran()[itran]]; + } + hessian[3 * pair_tran[0] + it.elems[0] % 3][3 * pair_tran[1] + it.elems[1] % 3] + = alm->optimize->get_params()[ip] * it.sign; + } + } + + auto file_fc = alm->files->get_prefix() + ".fc"; + + ofs_hes.open(file_fc.c_str(), std::ios::out); + if (!ofs_hes) exit("write_in_QEformat", "cannot create fc file"); + + ofs_hes << " 1 1 1" << std::endl; + for (auto icrd = 0; icrd < 3; ++icrd) { + for (auto jcrd = 0; jcrd < 3; ++jcrd) { + for (i = 0; i < alm->get_supercell().number_of_atoms; ++i) { + for (j = 0; j < alm->get_supercell().number_of_atoms; ++j) { + ofs_hes << std::setw(3) << icrd + 1; + ofs_hes << std::setw(3) << jcrd + 1; + ofs_hes << std::setw(3) << i + 1; + ofs_hes << std::setw(3) << j + 1; + ofs_hes << std::endl; + ofs_hes << " 1 1 1 " << std::setw(20) << std::setprecision(13) + << std::scientific << hessian[3 * j + jcrd][3 * i + icrd]; + ofs_hes << std::endl; + } + } + } + } + ofs_hes.close(); + deallocate(hessian); +} + +void Writer::write_fc3_thirdorderpy_format(ALM *alm) const +{ + size_t i, j, k; + int pair_tmp[3], coord_tmp[3]; + std::ofstream ofs_fc3; + double ***fc3; + int ***has_element; + size_t nelems = 0; + const auto nat3 = 3 * alm->get_supercell().number_of_atoms; + const auto natmin = alm->symmetry->get_nat_prim(); + const auto nat = alm->get_supercell().number_of_atoms; + const auto ntran = alm->symmetry->get_ntran(); + + std::vector atom_tmp; + std::vector> cell_dummy; + std::set::iterator iter_cluster; + atom_tmp.resize(2); + cell_dummy.resize(2); + + double ***x_image = alm->get_x_image(); + + allocate(fc3, 3 * natmin, nat3, nat3); + allocate(has_element, natmin, nat, nat); + + for (i = 0; i < 3 * natmin; ++i) { + for (j = 0; j < nat3; ++j) { + for (k = 0; k < nat3; ++k) { + fc3[i][j][k] = 0.0; + + } + } + } + for (i = 0; i < natmin; ++i) { + for (j = 0; j < nat; ++j) { + for (k = 0; k < nat; ++k) { + has_element[i][j][k] = 0; + } + } + } + + const auto ishift = alm->fcs->get_nequiv()[0].size(); + + for (const auto &it : alm->fcs->get_fc_table()[1]) { + + const auto ip = it.mother + ishift; + + for (i = 0; i < 3; ++i) { + pair_tmp[i] = it.elems[i] / 3; + coord_tmp[i] = it.elems[i] % 3; + } + + j = alm->symmetry->get_map_s2p()[pair_tmp[0]].atom_num; + + if (pair_tmp[1] > pair_tmp[2]) { + atom_tmp[0] = pair_tmp[2]; + atom_tmp[1] = pair_tmp[1]; + } else { + atom_tmp[0] = pair_tmp[1]; + atom_tmp[1] = pair_tmp[2]; + } + iter_cluster = alm->cluster->get_interaction_cluster(1, j).find(InteractionCluster(atom_tmp, cell_dummy)); + + if (!has_element[j][pair_tmp[1]][pair_tmp[2]]) { + nelems += (*iter_cluster).cell.size(); + has_element[j][pair_tmp[1]][pair_tmp[2]] = 1; + } + fc3[3 * j + coord_tmp[0]][it.elems[1]][it.elems[2]] + = alm->optimize->get_params()[ip] * it.sign; + + if (it.elems[1] != it.elems[2]) { + if (!has_element[j][pair_tmp[2]][pair_tmp[1]]) { + nelems += (*iter_cluster).cell.size(); + has_element[j][pair_tmp[2]][pair_tmp[1]] = 1; + } + fc3[3 * j + coord_tmp[0]][it.elems[2]][it.elems[1]] + = alm->optimize->get_params()[ip] * it.sign; + } + } + + + auto file_fc3 = alm->files->get_prefix() + ".FORCE_CONSTANT_3RD"; + + ofs_fc3.open(file_fc3.c_str(), std::ios::out); + if (!ofs_fc3) exit("write_fc3_thirdorderpy_format", "cannot create the file"); + ofs_fc3 << nelems << std::endl; + + + bool swapped; + double vec1[3], vec2[3]; + auto ielem = 0; + const auto factor = Ryd / 1.6021766208e-19 / std::pow(Bohr_in_Angstrom, 3); + + for (i = 0; i < natmin; ++i) { + for (auto jtran = 0; jtran < ntran; ++jtran) { + for (j = 0; j < natmin; ++j) { + for (auto ktran = 0; ktran < ntran; ++ktran) { + for (k = 0; k < natmin; ++k) { + + const auto jat = alm->symmetry->get_map_p2s()[j][jtran]; + const auto kat = alm->symmetry->get_map_p2s()[k][ktran]; + + if (!has_element[i][jat][kat]) continue; + + if (jat > kat) { + atom_tmp[0] = kat; + atom_tmp[1] = jat; + swapped = true; + } else { + atom_tmp[0] = jat; + atom_tmp[1] = kat; + swapped = false; + } + + iter_cluster = alm->cluster->get_interaction_cluster(1, i).find( + InteractionCluster(atom_tmp, cell_dummy)); + if (iter_cluster == alm->cluster->get_interaction_cluster(1, i).end()) { + exit("write_misc_xml", "This cannot happen."); + } + + const auto multiplicity = (*iter_cluster).cell.size(); + + const auto jat0 = alm->symmetry->get_map_p2s()[alm->symmetry->get_map_s2p()[atom_tmp[0]]. + atom_num][0]; + const auto kat0 = alm->symmetry->get_map_p2s()[alm->symmetry->get_map_s2p()[atom_tmp[1]]. + atom_num][0]; + + for (size_t imult = 0; imult < multiplicity; ++imult) { + auto cell_now = (*iter_cluster).cell[imult]; + + for (auto m = 0; m < 3; ++m) { + vec1[m] = (x_image[0][atom_tmp[0]][m] + - x_image[0][jat0][m] + + x_image[cell_now[0]][0][m] + - x_image[0][0][m]) * Bohr_in_Angstrom; + vec2[m] = (x_image[0][atom_tmp[1]][m] + - x_image[0][kat0][m] + + x_image[cell_now[1]][0][m] + - x_image[0][0][m]) * Bohr_in_Angstrom; + } + + ++ielem; + ofs_fc3 << std::endl; + ofs_fc3 << ielem << std::endl; + ofs_fc3 << std::scientific; + ofs_fc3 << std::setprecision(10); + if (swapped) { + ofs_fc3 << std::setw(20) << vec2[0] << std::setw(20) << vec2[1] << std::setw(20) << vec2 + [2] << std::endl; + ofs_fc3 << std::setw(20) << vec1[0] << std::setw(20) << vec1[1] << std::setw(20) << vec1 + [2] << std::endl; + } else { + ofs_fc3 << std::setw(20) << vec1[0] << std::setw(20) << vec1[1] << std::setw(20) << vec1 + [2] << std::endl; + ofs_fc3 << std::setw(20) << vec2[0] << std::setw(20) << vec2[1] << std::setw(20) << vec2 + [2] << std::endl; + } + ofs_fc3 << std::setw(5) << i + 1; + ofs_fc3 << std::setw(5) << j + 1; + ofs_fc3 << std::setw(5) << k + 1 << std::endl; + + for (auto ii = 0; ii < 3; ++ii) { + for (auto jj = 0; jj < 3; ++jj) { + for (auto kk = 0; kk < 3; ++kk) { + ofs_fc3 << std::setw(2) << ii + 1; + ofs_fc3 << std::setw(3) << jj + 1; + ofs_fc3 << std::setw(3) << kk + 1; + ofs_fc3 << std::setw(20) + << fc3[3 * i + ii][3 * jat + jj][3 * kat + kk] + * factor / static_cast(multiplicity) << std::endl; + } + } + } + } + } + } + } + } + } + + ofs_fc3.close(); + deallocate(fc3); + deallocate(has_element); +} + +std::string Writer::easyvizint(const int n) const +{ + const auto atmn = n / 3 + 1; + const auto crdn = n % 3; + std::string str_crd[3] = {"x", "y", "z"}; + auto str_tmp = std::to_string(atmn); + str_tmp += str_crd[crdn]; + + return str_tmp; +} diff --git a/alm/writer.h b/alm/writer.h new file mode 100644 index 00000000..b8b47c8c --- /dev/null +++ b/alm/writer.h @@ -0,0 +1,76 @@ +/* + writer.h + + Copyright (c) 2014, 2015, 2016 Terumasa Tadano + + This file is distributed under the terms of the MIT license. + Please see the file 'LICENCE.txt' in the root directory + or http://opensource.org/licenses/mit-license.php for information. +*/ + +#pragma once + +#include +#include +#include "alm.h" + +namespace ALM_NS +{ + class AtomProperty + { + public: + double x, y, z; + int kind; + size_t atom, tran; + + AtomProperty() = default;; + + AtomProperty(const AtomProperty &other) = default; + + AtomProperty(const double *pos, + const int kind_in, + const int atom_in, + const int tran_in) + { + x = pos[0]; + y = pos[1]; + z = pos[2]; + kind = kind_in; + atom = atom_in; + tran = tran_in; + } + }; + + class SystemInfo + { + public: + double lattice_vector[3][3]; + std::vector atoms; + size_t nat, natmin, ntran; + size_t nspecies; + + SystemInfo() = default;; + }; + + class Writer + { + public: + Writer(); + ~Writer(); + + void writeall(ALM *) const; + void write_input_vars(const ALM *) const; + void write_displacement_pattern(ALM *) const; + + private: + void write_force_constants(ALM *) const; + void write_misc_xml(ALM *) const; + void write_hessian(ALM *) const; + void write_in_QEformat(ALM *) const; + void write_fc3_thirdorderpy_format(ALM *) const; + std::string easyvizint(int) const; + + std::string double2string(double, + int nprec = 15) const; + }; +} diff --git a/alm/writes.cpp b/alm/writes.cpp deleted file mode 100644 index f84e4271..00000000 --- a/alm/writes.cpp +++ /dev/null @@ -1,704 +0,0 @@ -/* - writes.cpp - - Copyright (c) 2014, 2015, 2016 Terumasa Tadano - - This file is distributed under the terms of the MIT license. - Please see the file 'LICENCE.txt' in the root directory - or http://opensource.org/licenses/mit-license.php for information. -*/ - -#include -#include -#include "writes.h" -#include "system.h" -#include "interaction.h" -#include "memory.h" -#include "symmetry.h" -#include "error.h" -#include "files.h" -#include "fcs.h" -#include "fitting.h" -#include "constraint.h" -#include "input.h" -#include "timer.h" -#include "patterndisp.h" -#include "version.h" -#include -#include -#include - -using namespace ALM_NS; - -Writes::Writes(ALM *alm): Pointers(alm) -{ -} - -Writes::~Writes() -{ -} - -void Writes::write_input_vars() -{ - unsigned int i; - - std::cout << std::endl; - std::cout << " Input variables:" << std::endl; - std::cout << " -------------------------------------------------------------------" << std::endl; - std::cout << " General:" << std::endl; - std::cout << " PREFIX = " << files->job_title << std::endl; - std::cout << " MODE = " << alm->mode << std::endl; - std::cout << " NAT = " << system->nat << "; NKD = " << system->nkd << std::endl; - std::cout << " NSYM = " << symmetry->nsym << "; PRINTSYM = " << symmetry->is_printsymmetry - << "; TOLERANCE = " << symmetry->tolerance << std::endl; - std::cout << " KD = "; - for (i = 0; i < system->nkd; ++i) std::cout << std::setw(4) << system->kdname[i]; - std::cout << std::endl; - std::cout << " PERIODIC = "; - for (i = 0; i < 3; ++i) std::cout << std::setw(3) << interaction->is_periodic[i]; - std::cout << std::endl; - std::cout << " MAGMOM = " << input->str_magmom << std::endl; - std::cout << " HESSIAN = " << writes->print_hessian << std::endl; - std::cout << std::endl; - - - std::cout << " Interaction:" << std::endl; - std::cout << " NORDER = " << interaction->maxorder << std::endl; - std::cout << " NBODY = "; - for (i = 0; i < interaction->maxorder; ++i) - std::cout << std::setw(3) << interaction->nbody_include[i]; - - std::cout << std::endl << std::endl; - - - if (alm->mode == "suggest") { - std::cout << " DBASIS = " << displace->disp_basis << std::endl; - std::cout << std::endl; - - } else if (alm->mode == "fitting") { - std::cout << " Fitting:" << std::endl; - std::cout << " DFILE = " << files->file_disp << std::endl; - std::cout << " FFILE = " << files->file_force << std::endl; - std::cout << " NDATA = " << system->ndata << "; NSTART = " << system->nstart - << "; NEND = " << system->nend << "; NSKIP = " << system->nskip << std::endl; - std::cout << " NBOOT = " << fitting->nboot << std::endl; - std::cout << " MULTDAT = " << symmetry->multiply_data << std::endl; - std::cout << " ICONST = " << constraint->constraint_mode << std::endl; - std::cout << " ROTAXIS = " << constraint->rotation_axis << std::endl; - std::cout << " FC2XML = " << constraint->fc2_file << std::endl; - std::cout << " FC3XML = " << constraint->fc3_file << std::endl; - std::cout << std::endl; - } - std::cout << " -------------------------------------------------------------------" << std::endl; - std::cout << std::endl; -} - -void Writes::writeall() -{ - std::cout << " The following files are created:" << std::endl << std::endl; - write_force_constants(); - write_misc_xml(); - if (print_hessian) write_hessian(); - std::cout << std::endl; -} - -void Writes::write_force_constants() -{ - int order, j, k, l, m; - unsigned int ui; - int multiplicity; - int maxorder = interaction->maxorder; - double distmax; - std::string *str_fcs; - std::string str_tmp; - std::ofstream ofs_fcs; - std::vector atom_tmp; - std::vector> cell_dummy; - std::set::iterator iter_cluster; - - ofs_fcs.open(files->file_fcs.c_str(), std::ios::out); - if (!ofs_fcs) error->exit("openfiles", "cannot open fcs file"); - - ofs_fcs << " *********************** Force Constants (FCs) ***********************" << std::endl; - ofs_fcs << " * Force constants are printed in Rydberg atomic units. *" << std::endl; - ofs_fcs << " * FC2: Ry/a0^2 FC3: Ry/a0^3 FC4: Ry/a0^4 etc. *" << std::endl; - ofs_fcs << " * FC?: Ry/a0^? a0 = Bohr radius *" << std::endl; - ofs_fcs << " * *" << std::endl; - ofs_fcs << " * The value shown in the last column is the distance *" << std::endl; - ofs_fcs << " * between the most distant atomic pairs. *" << std::endl; - ofs_fcs << " *********************************************************************" << std::endl; - ofs_fcs << std::endl; - ofs_fcs << " ----------------------------------------------------------------------" << std::endl; - ofs_fcs << " Index FCs P Pairs Distance [Bohr]" << std::endl; - ofs_fcs << " (Global, Local) (Multiplicity) " << std::endl; - ofs_fcs << " ----------------------------------------------------------------------" << std::endl; - - memory->allocate(str_fcs, maxorder); - - for (order = 0; order < maxorder; ++order) { - str_fcs[order] = "*FC" + boost::lexical_cast(order + 2); - } - - k = 0; - - for (order = 0; order < maxorder; ++order) { - - m = 0; - - if (fcs->nequiv[order].size() > 0) { - - ofs_fcs << std::endl << std::setw(6) << str_fcs[order] << std::endl; - - for (ui = 0; ui < fcs->nequiv[order].size(); ++ui) { - - ofs_fcs << std::setw(8) << k + 1 << std::setw(8) << ui + 1 - << std::setw(18) << std::setprecision(7) - << std::scientific << fitting->params[k]; - - atom_tmp.clear(); - for (l = 1; l < order + 2; ++l) { - atom_tmp.push_back(fcs->fc_table[order][m].elems[l] / 3); - } - j = symmetry->map_s2p[fcs->fc_table[order][m].elems[0] / 3].atom_num; - std::sort(atom_tmp.begin(), atom_tmp.end()); - - iter_cluster = interaction->mindist_cluster[order][j].find( - MinimumDistanceCluster(atom_tmp, cell_dummy)); - - if (iter_cluster != interaction->mindist_cluster[order][j].end()) { - multiplicity = (*iter_cluster).cell.size(); - distmax = (*iter_cluster).distmax; - } else { - std::cout << std::setw(5) << j; - for (l = 0; l < order + 1; ++l) { - std::cout << std::setw(5) << atom_tmp[l]; - } - std::cout << std::endl; - error->exit("write_force_constants", - "This cannot happen."); - } - ofs_fcs << std::setw(4) << multiplicity; - - for (l = 0; l < order + 2; ++l) { - ofs_fcs << std::setw(7) - << fcs->easyvizint(fcs->fc_table[order][m].elems[l]); - } - ofs_fcs << std::setw(12) << std::setprecision(3) - << std::fixed << distmax << std::endl; - - m += fcs->nequiv[order][ui]; - ++k; - } - } - } - - ofs_fcs << std::endl; - - if (constraint->extra_constraint_from_symmetry) { - - ofs_fcs << " -------------- Constraints from crystal symmetry --------------" << std::endl << std::endl;; - for (order = 0; order < maxorder; ++order) { - int nparam = fcs->nequiv[order].size(); - - - for (std::vector::iterator p = constraint->const_symmetry[order].begin(); - p != constraint->const_symmetry[order].end(); - ++p) { - ofs_fcs << " 0 = " << std::scientific << std::setprecision(6); - ConstraintClass const_pointer = *p; - for (j = 0; j < nparam; ++j) { - if (std::abs(const_pointer.w_const[j]) > eps8) { - str_tmp = " * (FC" + boost::lexical_cast(order + 2) - + "_" + boost::lexical_cast(j + 1) + ")"; - ofs_fcs << std::setw(10) << std::right - << std::showpos << const_pointer.w_const[j]; - ofs_fcs << std::setw(12) << std::left << str_tmp; - } - } - ofs_fcs << std::endl; - } - ofs_fcs << std::endl; - } - ofs_fcs << std::endl; - } - - ofs_fcs.unsetf(std::ios::showpos); - - for (order = 0; order < maxorder; ++order) { - str_fcs[order] = "**FC" + boost::lexical_cast(order + 2); - } - - ofs_fcs << std::endl << std::endl; - ofs_fcs << " ------------------------ All FCs below ------------------------" << std::endl; - - int ip = 0; - int id; - - for (order = 0; order < maxorder; ++order) { - - id = 0; - - if (fcs->nequiv[order].size() > 0) { - ofs_fcs << std::endl << std::setw(6) << str_fcs[order] << std::endl; - - for (unsigned int iuniq = 0; iuniq < fcs->nequiv[order].size(); ++iuniq) { - - str_tmp = " # FC" + boost::lexical_cast(order + 2) + "_"; - str_tmp += boost::lexical_cast(iuniq + 1); - - ofs_fcs << str_tmp << std::setw(5) << fcs->nequiv[order][iuniq] - << std::setw(16) << std::scientific - << std::setprecision(7) << fitting->params[ip] << std::endl; - - for (j = 0; j < fcs->nequiv[order][iuniq]; ++j) { - ofs_fcs << std::setw(5) << j + 1 << std::setw(12) - << std::setprecision(5) << std::fixed << fcs->fc_table[order][id].sign; - for (k = 0; k < order + 2; ++k) { - ofs_fcs << std::setw(6) - << fcs->easyvizint(fcs->fc_table[order][id].elems[k]); - } - ofs_fcs << std::endl; - ++id; - } - ofs_fcs << std::endl; - ++ip; - } - } - } - memory->deallocate(str_fcs); - ofs_fcs.close(); - - std::cout << " Force constants in a human-readable format : " - << files->file_fcs << std::endl; -} - -void Writes::write_displacement_pattern() -{ - int i, j; - int order; - int maxorder = interaction->maxorder; - int counter; - - std::ofstream ofs_pattern; - std::cout << std::endl; - std::cout << " Displacement patterns are saved in the following files: " << std::endl; - - for (order = 0; order < maxorder; ++order) { - ofs_pattern.open(files->file_disp_pattern[order].c_str(), std::ios::out); - if (!ofs_pattern) - error->exit("write_displacement_pattern", - "Cannot open file_disp_pattern"); - - counter = 0; - - ofs_pattern << "Basis : " << displace->disp_basis[0] << std::endl; - - for (auto it = displace->pattern_all[order].begin(); - it != displace->pattern_all[order].end(); ++it) { - AtomWithDirection entry = *it; - - ++counter; - - ofs_pattern << std::setw(5) << counter << ":" - << std::setw(5) << entry.atoms.size() << std::endl; - for (i = 0; i < entry.atoms.size(); ++i) { - ofs_pattern << std::setw(7) << entry.atoms[i] + 1; - for (j = 0; j < 3; ++j) { - ofs_pattern << std::setw(15) << entry.directions[3 * i + j]; - } - ofs_pattern << std::endl; - } - } - - ofs_pattern.close(); - - std::cout << " " << interaction->str_order[order] - << " : " << files->file_disp_pattern[order] << std::endl; - } - std::cout << std::endl; -} - -void Writes::write_misc_xml() -{ - SystemInfo system_structure; - - int i, j; - - for (i = 0; i < 3; ++i) { - for (j = 0; j < 3; ++j) { - system_structure.lattice_vector[i][j] = system->lavec[i][j]; - } - } - - system_structure.nat = system->nat; - system_structure.natmin = symmetry->nat_prim; - system_structure.ntran = symmetry->ntran; - system_structure.nspecies = system->nkd; - - AtomProperty prop_tmp; - - for (i = 0; i < system->nat; ++i) { - prop_tmp.x = system->xcoord[i][0]; - prop_tmp.y = system->xcoord[i][1]; - prop_tmp.z = system->xcoord[i][2]; - prop_tmp.kind = system->kd[i]; - prop_tmp.atom = symmetry->map_s2p[i].atom_num + 1; - prop_tmp.tran = symmetry->map_s2p[i].tran_num + 1; - - system_structure.atoms.push_back(AtomProperty(prop_tmp)); - } - - using boost::property_tree::ptree; - - ptree pt; - std::string str_pos[3]; - - pt.put("Data.ALM_version", ALAMODE_VERSION); - pt.put("Data.Fitting.DisplaceFile", files->file_disp); - pt.put("Data.Fitting.ForceFile", files->file_force); - pt.put("Data.Fitting.Constraint", constraint->constraint_mode); - - pt.put("Data.Structure.NumberOfAtoms", system_structure.nat); - pt.put("Data.Structure.NumberOfElements", system_structure.nspecies); - - for (i = 0; i < system_structure.nspecies; ++i) { - ptree &child = pt.add("Data.Structure.AtomicElements.element", - system->kdname[i]); - child.put(".number", i + 1); - } - - for (i = 0; i < 3; ++i) { - str_pos[i].clear(); - for (j = 0; j < 3; ++j) { - str_pos[i] += " " + double2string(system_structure.lattice_vector[j][i]); - } - } - pt.put("Data.Structure.LatticeVector", ""); - pt.put("Data.Structure.LatticeVector.a1", str_pos[0]); - pt.put("Data.Structure.LatticeVector.a2", str_pos[1]); - pt.put("Data.Structure.LatticeVector.a3", str_pos[2]); - - std::stringstream ss; - ss << interaction->is_periodic[0] << " " - << interaction->is_periodic[1] << " " - << interaction->is_periodic[2]; - pt.put("Data.Structure.Periodicity", ss.str()); - - pt.put("Data.Structure.Position", ""); - std::string str_tmp; - - for (i = 0; i < system_structure.nat; ++i) { - str_tmp.clear(); - for (j = 0; j < 3; ++j) str_tmp += " " + double2string(system->xcoord[i][j]); - ptree &child = pt.add("Data.Structure.Position.pos", str_tmp); - child.put(".index", i + 1); - child.put(".element", system->kdname[system->kd[i] - 1]); - } - - pt.put("Data.Symmetry.NumberOfTranslations", symmetry->ntran); - for (i = 0; i < system_structure.ntran; ++i) { - for (j = 0; j < system_structure.natmin; ++j) { - ptree &child = pt.add("Data.Symmetry.Translations.map", - symmetry->map_p2s[j][i] + 1); - child.put(".tran", i + 1); - child.put(".atom", j + 1); - } - } - - if (system->lspin) { - pt.put("Data.MagneticMoments", ""); - pt.put("Data.MagneticMoments.Noncollinear", system->noncollinear); - pt.put("Data.MagneticMoments.TimeReversalSymmetry", symmetry->trev_sym_mag); - for (i = 0; i < system_structure.nat; ++i) { - str_tmp.clear(); - for (j = 0; j < 3; ++j) str_tmp += " " + double2string(system->magmom[i][j], 5); - ptree &child = pt.add("Data.MagneticMoments.mag", str_tmp); - child.put(".index", i + 1); - } - } - - pt.put("Data.ForceConstants", ""); - str_tmp.clear(); - - pt.put("Data.ForceConstants.HarmonicUnique.NFC2", fcs->nequiv[0].size()); - - int ihead = 0; - int k = 0; - int nelem = interaction->maxorder + 1; - int *pair_tmp; - - memory->allocate(pair_tmp, nelem); - - for (unsigned int ui = 0; ui < fcs->nequiv[0].size(); ++ui) { - - for (i = 0; i < 2; ++i) { - pair_tmp[i] = fcs->fc_table[0][ihead].elems[i] / 3; - } - j = symmetry->map_s2p[pair_tmp[0]].atom_num; - - ptree &child = pt.add("Data.ForceConstants.HarmonicUnique.FC2", - double2string(fitting->params[k])); - child.put(".pairs", - boost::lexical_cast(fcs->fc_table[0][ihead].elems[0]) - + " " + boost::lexical_cast(fcs->fc_table[0][ihead].elems[1])); - child.put(".multiplicity", - interaction->mindist_pairs[pair_tmp[0]][pair_tmp[1]].size()); - ihead += fcs->nequiv[0][ui]; - ++k; - } - ihead = 0; - - std::vector atom_tmp; - std::vector> cell_dummy; - std::set::iterator iter_cluster; - int multiplicity; - - if (interaction->maxorder > 1) { - - pt.put("Data.ForceConstants.CubicUnique.NFC3", fcs->nequiv[1].size()); - - for (unsigned int ui = 0; ui < fcs->nequiv[1].size(); ++ui) { - for (i = 0; i < 3; ++i) { - pair_tmp[i] = fcs->fc_table[1][ihead].elems[i] / 3; - } - j = symmetry->map_s2p[pair_tmp[0]].atom_num; - - atom_tmp.clear(); - for (i = 1; i < 3; ++i) { - atom_tmp.push_back(pair_tmp[i]); - } - std::sort(atom_tmp.begin(), atom_tmp.end()); - - iter_cluster = interaction->mindist_cluster[1][j].find( - MinimumDistanceCluster(atom_tmp, cell_dummy)); - if (iter_cluster == interaction->mindist_cluster[1][j].end()) { - error->exit("load_reference_system_xml", - "Cubic force constant is not found."); - } else { - multiplicity = (*iter_cluster).cell.size(); - } - - ptree &child = pt.add("Data.ForceConstants.CubicUnique.FC3", - double2string(fitting->params[k])); - child.put(".pairs", - boost::lexical_cast(fcs->fc_table[1][ihead].elems[0]) - + " " + boost::lexical_cast(fcs->fc_table[1][ihead].elems[1]) - + " " + boost::lexical_cast(fcs->fc_table[1][ihead].elems[2])); - child.put(".multiplicity", multiplicity); - ihead += fcs->nequiv[1][ui]; - ++k; - } - } - - int ip, ishift; - - std::sort(fcs->fc_table[0].begin(), fcs->fc_table[0].end()); - - for (std::vector::iterator it = fcs->fc_table[0].begin(); - it != fcs->fc_table[0].end(); ++it) { - FcProperty fctmp = *it; - ip = fctmp.mother; - - for (k = 0; k < 2; ++k) { - pair_tmp[k] = fctmp.elems[k] / 3; - } - j = symmetry->map_s2p[pair_tmp[0]].atom_num; - for (std::vector::iterator it2 = interaction->mindist_pairs[pair_tmp[0]][pair_tmp[1]].begin(); - it2 != interaction->mindist_pairs[pair_tmp[0]][pair_tmp[1]].end(); ++it2) { - ptree &child = pt.add("Data.ForceConstants.HARMONIC.FC2", - double2string(fitting->params[ip] * fctmp.sign - / static_cast(interaction->mindist_pairs[pair_tmp[0]][pair_tmp[1]].size()))); - - child.put(".pair1", boost::lexical_cast(j + 1) - + " " + boost::lexical_cast(fctmp.elems[0] % 3 + 1)); - child.put(".pair2", boost::lexical_cast(pair_tmp[1] + 1) - + " " + boost::lexical_cast(fctmp.elems[1] % 3 + 1) - + " " + boost::lexical_cast((*it2).cell + 1)); - } - } - - ishift = fcs->nequiv[0].size(); - - // Print anharmonic force constants to the xml file. - - int imult; - - int order; - std::string elementname; - for (order = 1; order < interaction->maxorder; ++order) { - - std::sort(fcs->fc_table[order].begin(), fcs->fc_table[order].end()); - - for (std::vector::iterator it = fcs->fc_table[order].begin(); - it != fcs->fc_table[order].end(); ++it) { - FcProperty fctmp = *it; - ip = fctmp.mother + ishift; - - for (k = 0; k < order + 2; ++k) { - pair_tmp[k] = fctmp.elems[k] / 3; - } - j = symmetry->map_s2p[pair_tmp[0]].atom_num; - - atom_tmp.clear(); - - for (k = 1; k < order + 2; ++k) { - atom_tmp.push_back(pair_tmp[k]); - } - std::sort(atom_tmp.begin(), atom_tmp.end()); - - elementname = "Data.ForceConstants.ANHARM" - + boost::lexical_cast(order + 2) - + ".FC" + boost::lexical_cast(order + 2); - - - iter_cluster = interaction->mindist_cluster[order][j].find( - MinimumDistanceCluster(atom_tmp, cell_dummy)); - - if (iter_cluster != interaction->mindist_cluster[order][j].end()) { - multiplicity = (*iter_cluster).cell.size(); - - for (imult = 0; imult < multiplicity; ++imult) { - std::vector cell_now = (*iter_cluster).cell[imult]; - - ptree &child = pt.add(elementname, - double2string(fitting->params[ip] * fctmp.sign - / static_cast(multiplicity))); - - child.put(".pair1", boost::lexical_cast(j + 1) - + " " + boost::lexical_cast(fctmp.elems[0] % 3 + 1)); - - for (k = 1; k < order + 2; ++k) { - child.put(".pair" + boost::lexical_cast(k + 1), - boost::lexical_cast(pair_tmp[k] + 1) - + " " + boost::lexical_cast(fctmp.elems[k] % 3 + 1) - + " " + boost::lexical_cast(cell_now[k - 1] + 1)); - } - } - } else { - error->exit("write_misc_xml", "This cannot happen."); - } - } - ishift += fcs->nequiv[order].size(); - } - - using namespace boost::property_tree::xml_parser; - const int indent = 2; - - std::string file_xml = files->job_title + ".xml"; - -#if BOOST_VERSION >= 105600 - write_xml(file_xml, pt, std::locale(), - xml_writer_make_settings(' ', indent, - widen("utf-8"))); -#else - write_xml(file_xml, pt, std::locale(), - xml_writer_make_settings(' ', indent, widen("utf-8"))); -#endif - - memory->deallocate(pair_tmp); - - std::cout << " Input data for the phonon code ANPHON : " << file_xml << std::endl; -} - -void Writes::write_hessian() -{ - int i, j, itran, ip; - int pair_tmp[2]; - int pair_tran[2]; - std::ofstream ofs_hes; - double **hessian; - int nat3 = 3 * system->nat; - - memory->allocate(hessian, nat3, nat3); - - for (i = 0; i < nat3; ++i) { - for (j = 0; j < nat3; ++j) { - hessian[i][j] = 0.0; - } - } - - for (std::vector::iterator it = fcs->fc_table[0].begin(); - it != fcs->fc_table[0].end(); ++it) { - FcProperty fctmp = *it; - ip = fctmp.mother; - - for (i = 0; i < 2; ++i) pair_tmp[i] = fctmp.elems[i] / 3; - for (itran = 0; itran < symmetry->ntran; ++itran) { - for (i = 0; i < 2; ++i) { - pair_tran[i] = symmetry->map_sym[pair_tmp[i]][symmetry->symnum_tran[itran]]; - } - hessian[3 * pair_tran[0] + fctmp.elems[0] % 3][3 * pair_tran[1] + fctmp.elems[1] % 3] - = fitting->params[ip] * fctmp.sign; - } - } - - ofs_hes.open(files->file_hes.c_str(), std::ios::out); - if (!ofs_hes) error->exit("write_hessian", "cannot create hessian file"); - - ofs_hes << "# atom1, xyz1, atom2, xyz2, FC2 (Ryd/Bohr^2)" << std::endl; - for (i = 0; i < nat3; ++i) { - for (j = 0; j < nat3; ++j) { - ofs_hes << std::setw(5) << i / 3 + 1; - ofs_hes << std::setw(5) << i % 3 + 1; - ofs_hes << std::setw(6) << j / 3 + 1; - ofs_hes << std::setw(5) << j % 3 + 1; - ofs_hes << std::setw(25) << std::setprecision(15) - << std::scientific << hessian[i][j]; - ofs_hes << std::endl; - } - } - ofs_hes.close(); - memory->deallocate(hessian); - - std::cout << " Complete Hessian matrix : " << files->file_hes << std::endl; - - /* - std::string file_fc2 = files->job_title + ".fc2"; - std::ofstream ofs_fc2; - ofs_fc2.open(file_fc2.c_str(), std::ios::out); - ofs_fc2 << " # iat, icrd, jat, icrd, icell, relvec, fc2" << std::endl; - double vec[3]; - for (std::vector::iterator it = fcs->fc_table[0].begin(); - it != fcs->fc_table[0].end(); ++it) { - FcProperty fctmp = *it; - ip = fctmp.mother; - - for (i = 0; i < 2; ++i) pair_tmp[i] = fctmp.elems[i] / 3; - for (itran = 0; itran < symmetry->ntran; ++itran) { - for (i = 0; i < 2; ++i) { - pair_tran[i] = symmetry->map_sym[pair_tmp[i]][symmetry->symnum_tran[itran]]; - } - for (std::vector::iterator - it2 = interaction->mindist_pairs[pair_tran[0]][pair_tran[1]].begin(); - it2 != interaction->mindist_pairs[pair_tran[0]][pair_tran[1]].end(); ++it2) { - int multiplicity = interaction->mindist_pairs[pair_tran[0]][pair_tran[1]].size(); - for (i = 0; i < 3; ++i) { - vec[i] = interaction->x_image[(*it2).cell][pair_tran[1]][i] - - interaction->x_image[0][pair_tran[0]][i]; - } - ofs_fc2 << std::setw(5) << pair_tran[0] + 1 << std::setw(5) << fctmp.elems[0] % 3 + 1; - ofs_fc2 << std::setw(5) << pair_tran[1] + 1 << std::setw(5) << fctmp.elems[1] % 3 + 1; - ofs_fc2 << std::setw(5) << (*it2).cell + 1; - ofs_fc2 << std::setw(15) << vec[0]; - ofs_fc2 << std::setw(15) << vec[1]; - ofs_fc2 << std::setw(15) << vec[2]; - - ofs_fc2 << std::setw(15) - << fitting->params[ip] * fctmp.sign / static_cast(multiplicity); - ofs_fc2 << std::endl; - } - } - } - ofs_fc2.close(); - */ -} - -std::string Writes::double2string(const double d, const int nprec) -{ - std::string rt; - std::stringstream ss; - - ss << std::scientific << std::setprecision(nprec) << d; - ss >> rt; - return rt; -} diff --git a/alm/writes.h b/alm/writes.h deleted file mode 100644 index 7225e6bc..00000000 --- a/alm/writes.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - writes.h - - Copyright (c) 2014, 2015, 2016 Terumasa Tadano - - This file is distributed under the terms of the MIT license. - Please see the file 'LICENCE.txt' in the root directory - or http://opensource.org/licenses/mit-license.php for information. -*/ - -#pragma once - -#include "pointers.h" -#include -#include -#include - -namespace ALM_NS -{ - class AtomProperty - { - public: - double x, y, z; - int kind; - int atom, tran; - - AtomProperty() - { - }; - - AtomProperty(const AtomProperty &other) - : x(other.x), y(other.y), z(other.z), - kind(other.kind), atom(other.atom), tran(other.tran) - { - }; - - AtomProperty(const double *pos, - const int kind_in, - const int atom_in, - const int tran_in) - { - x = pos[0]; - y = pos[1]; - z = pos[2]; - kind = kind_in; - atom = atom_in; - tran = tran_in; - } - }; - - class SystemInfo - { - public: - double lattice_vector[3][3]; - std::vector atoms; - int nat, natmin, ntran; - int nspecies; - - SystemInfo() - { - }; - }; - - class Writes: protected Pointers - { - public: - Writes(class ALM *); - ~Writes(); - - bool print_hessian; - - void writeall(); - void write_input_vars(); - void write_displacement_pattern(); - - private: - void write_force_constants(); - void write_misc_xml(); - void write_hessian(); - - std::ofstream ofs_info; - std::string double2string(const double, const int nprec = 15); - }; -} diff --git a/analyzer/analyzer.vcxproj b/analyzer/analyzer.vcxproj index 434195d1..e79626ad 100644 --- a/analyzer/analyzer.vcxproj +++ b/analyzer/analyzer.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -21,32 +21,32 @@ {93B2B654-5EEE-46E4-8DCF-8E6051B6C1ED} analyzer - 8.1 + 10.0.17763.0 Application true - v140 + v141 MultiByte Application false - v140 + v141 true MultiByte Application true - v140 + v141 MultiByte Application false - v140 + v142 true MultiByte @@ -105,6 +105,7 @@ true true true + $(SolutionDir)include; true diff --git a/anphon/Makefile.linux b/anphon/Makefile.linux index 20c729aa..14746664 100644 --- a/anphon/Makefile.linux +++ b/anphon/Makefile.linux @@ -24,12 +24,7 @@ LIBS = ${LAPACK} PROG = anphon -CXXSRC= phonons.cpp error.cpp fcs_phonon.cpp parsephon.cpp dynamical.cpp \ - main.cpp memory.cpp system.cpp timer.cpp write_phonons.cpp kpoint.cpp \ - phonon_dos.cpp phonon_velocity.cpp integration.cpp relaxation.cpp \ - thermodynamics.cpp conductivity.cpp symmetry_core.cpp \ - mpi_common.cpp gruneisen.cpp isotope.cpp selfenergy.cpp \ - scph.cpp ewald.cpp +CXXSRC = $(wildcard *.cpp) OBJS= ${CXXSRC:.cpp=.o} diff --git a/anphon/Makefile.osx b/anphon/Makefile.osx_clang similarity index 81% rename from anphon/Makefile.osx rename to anphon/Makefile.osx_clang index 6278c281..21c57e3a 100644 --- a/anphon/Makefile.osx +++ b/anphon/Makefile.osx_clang @@ -5,15 +5,16 @@ # We recommend to use Intel c++ compiler. #----------------------------------------------- +# MPI version of clang++ MPICXX = mpic++ CXXFLAGS = -O3 -std=c++11 -INCLUDE = -I../include -I$(HOME)/include +INCLUDE = -I../include -I$(HOME)/include LINKER = ${MPICXX} ## Mavericks #LDFLAGS = -framework vecLib -## Yosemite +## Yosemite and newer LDFLAGS = -framework Accelerate LAPACK = -llapack @@ -30,8 +31,8 @@ PROG = anphon CXXSRC= phonons.cpp error.cpp fcs_phonon.cpp parsephon.cpp dynamical.cpp \ main.cpp memory.cpp system.cpp timer.cpp write_phonons.cpp kpoint.cpp \ - phonon_dos.cpp phonon_velocity.cpp integration.cpp relaxation.cpp \ - thermodynamics.cpp conductivity.cpp symmetry_core.cpp \ + phonon_dos.cpp phonon_velocity.cpp integration.cpp anharmonic_core.cpp \ + thermodynamics.cpp conductivity.cpp symmetry_core.cpp mode_analysis.cpp \ mpi_common.cpp gruneisen.cpp isotope.cpp selfenergy.cpp \ scph.cpp ewald.cpp diff --git a/anphon/Makefile.osx_gcc b/anphon/Makefile.osx_gcc new file mode 100644 index 00000000..e37df723 --- /dev/null +++ b/anphon/Makefile.osx_gcc @@ -0,0 +1,51 @@ +.SUFFIXES: .h .cpp +#----------------------------------------------- +# Makefile for the program 'ANPHON'. +# Please modify the variables properly. +# We recommend to use Intel c++ compiler. +#----------------------------------------------- + +# Use gcc to activate openmp parallelization +MPICXX = g++-8 +CXXFLAGS = -O2 -std=c++11 -fopenmp +INCLUDE = -I../include -I$(HOME)/include -I/usr/local/opt/openmpi/include + +LINKER = ${MPICXX} + +## Mavericks +#LDFLAGS = -framework vecLib +## Yosemite +LDFLAGS = -framework Accelerate + +LAPACK = -llapack -L/usr/local/opt/openmpi/lib -lmpi -lgomp +LIBS = ${LAPACK} -lfftw3 + +#---------------------------------------------- +# General rules +#---------------------------------------------- + +.cpp.o: + ${MPICXX} ${CXXFLAGS} ${INCLUDE} -c $< + +PROG = anphon + +CXXSRC = $(wildcard *.cpp) + +OBJS= ${CXXSRC:.cpp=.o} + +default: anphon + +all: ${PROG} + +anphon: ${OBJS} + ${LINKER} ${LDFLAGS} -o $@ ${OBJS} ${LIBS} + +clean: + rm -f ${OBJS} + +.PHONY: clean + +depend: + gcc -MM *.cpp > .depend + +-include .depend diff --git a/anphon/anharmonic_core.cpp b/anphon/anharmonic_core.cpp new file mode 100644 index 00000000..bfb45598 --- /dev/null +++ b/anphon/anharmonic_core.cpp @@ -0,0 +1,1446 @@ +/* +anharmonic_core.cpp + +Copyright (c) 2014, 2015, 2016 Terumasa Tadano + +This file is distributed under the terms of the MIT license. +Please see the file 'LICENCE.txt' in the root directory +or http://opensource.org/licenses/mit-license.php for information. +*/ + +#include "mpi_common.h" +#include "anharmonic_core.h" +#include "constants.h" +#include "dynamical.h" +#include "error.h" +#include "fcs_phonon.h" +#include "integration.h" +#include "kpoint.h" +#include "mathfunctions.h" +#include "memory.h" +#include "mode_analysis.h" +#include "system.h" +#include "thermodynamics.h" +#include +#include +#include + +#ifdef _OPENMP +#include +#endif + +using namespace PHON_NS; + +AnharmonicCore::AnharmonicCore(PHON *phon) : Pointers(phon) +{ + set_default_variables(); +} + +AnharmonicCore::~AnharmonicCore() +{ + deallocate_variables(); +}; + +void AnharmonicCore::set_default_variables() +{ + im = std::complex(0.0, 1.0); + quartic_mode = 0; + use_tuned_ver = true; + use_triplet_symmetry = true; + relvec_v3 = nullptr; + relvec_v4 = nullptr; + invmass_v3 = nullptr; + invmass_v4 = nullptr; + evec_index_v3 = nullptr; + evec_index_v4 = nullptr; + fcs_group_v3 = nullptr; + fcs_group_v4 = nullptr; + exp_phase = nullptr; + exp_phase3 = nullptr; + phi3_reciprocal = nullptr; + phi4_reciprocal = nullptr; +} + +void AnharmonicCore::deallocate_variables() +{ + if (relvec_v3) { + memory->deallocate(relvec_v3); + } + if (relvec_v4) { + memory->deallocate(relvec_v4); + } + if (invmass_v3) { + memory->deallocate(invmass_v3); + } + if (invmass_v4) { + memory->deallocate(invmass_v4); + } + if (evec_index_v3) { + memory->deallocate(evec_index_v3); + } + if (evec_index_v4) { + memory->deallocate(evec_index_v4); + } + if (fcs_group_v3) { + memory->deallocate(fcs_group_v3); + } + if (fcs_group_v4) { + memory->deallocate(fcs_group_v4); + } + if (exp_phase) { + memory->deallocate(exp_phase); + } + if (exp_phase3) { + memory->deallocate(exp_phase3); + } + if (phi3_reciprocal) { + memory->deallocate(phi3_reciprocal); + } + if (phi4_reciprocal) { + memory->deallocate(phi4_reciprocal); + } +} + + +void AnharmonicCore::setup() +{ + if (fcs_phonon->maxorder >= 2) setup_cubic(); + if (fcs_phonon->maxorder >= 3) setup_quartic(); + + sym_permutation = true; + use_tuned_ver = true; + + if (!mode_analysis->calc_fstate_k && kpoint->kpoint_mode == 2) { + int nk_tmp[3]; + nk_tmp[0] = kpoint->nkx; + nk_tmp[1] = kpoint->nky; + nk_tmp[2] = kpoint->nkz; + store_exponential_for_acceleration(nk_tmp, + nk_represent, + exp_phase, + exp_phase3); + } +} + + +void AnharmonicCore::prepare_relative_vector(const std::vector &fcs_in, + const unsigned int N, + double ***vec_out) const +{ + int i, j; + + double vec[3]; + double **xshift_s; + + std::vector atm_super, atm_prim; + std::vector xyz; + std::vector cells; + + double mat_convert[3][3]; + + for (i = 0; i < 3; ++i) { + for (j = 0; j < 3; ++j) { + mat_convert[i][j] = 0.0; + for (int k = 0; k < 3; ++k) { + mat_convert[i][j] += system->rlavec_p[i][k] * system->lavec_s_anharm[k][j]; + } + } + } + + memory->allocate(xshift_s, 27, 3); + + for (i = 0; i < 3; ++i) xshift_s[0][i] = 0.0; + + unsigned int icell = 0; + + for (int ix = -1; ix <= 1; ++ix) { + for (int iy = -1; iy <= 1; ++iy) { + for (int iz = -1; iz <= 1; ++iz) { + if (ix == 0 && iy == 0 && iz == 0) continue; + + ++icell; + + xshift_s[icell][0] = static_cast(ix); + xshift_s[icell][1] = static_cast(iy); + xshift_s[icell][2] = static_cast(iz); + } + } + } + + unsigned int icount = 0; + + for (const auto &it : fcs_in) { + + atm_super.clear(); + atm_prim.clear(); + xyz.clear(); + cells.clear(); + + for (i = 0; i < it.pairs.size(); ++i) { + unsigned int atm_p = it.pairs[i].index / 3; + unsigned int tran_tmp = it.pairs[i].tran; + unsigned int atm_s = system->map_p2s_anharm[atm_p][tran_tmp]; + + atm_prim.push_back(atm_p); + atm_super.push_back(atm_s); + cells.push_back(it.pairs[i].cell_s); + } + + + for (i = 0; i < N - 1; ++i) { + + for (j = 0; j < 3; ++j) { + vec[j] = system->xr_s_anharm[atm_super[i + 1]][j] + xshift_s[cells[i + 1]][j] + - system->xr_s_anharm[system->map_p2s_anharm[atm_prim[i + 1]][0]][j]; + } + + rotvec(vec, vec, mat_convert); + + for (j = 0; j < 3; ++j) { + vec_out[icount][i][j] = vec[j]; + } + } + ++icount; + } + memory->deallocate(xshift_s); +} + +void AnharmonicCore::prepare_relative_vector(const std::vector &fcs_in, + const unsigned int N, + const int number_of_groups, + std::vector *fcs_group, + std::vector *&vec_out) const +{ + int i, j, k; + + double vecs[3][3]; + double **xshift_s; + + std::vector atm_super, atm_prim; + std::vector cells; + + double mat_convert[3][3]; + + for (i = 0; i < 3; ++i) { + for (j = 0; j < 3; ++j) { + mat_convert[i][j] = 0.0; + for (k = 0; k < 3; ++k) { + mat_convert[i][j] += system->rlavec_p[i][k] * system->lavec_s_anharm[k][j]; + } + } + } + + memory->allocate(xshift_s, 27, 3); + + for (i = 0; i < 3; ++i) xshift_s[0][i] = 0.0; + + unsigned int icell = 0; + + for (int ix = -1; ix <= 1; ++ix) { + for (int iy = -1; iy <= 1; ++iy) { + for (int iz = -1; iz <= 1; ++iz) { + if (ix == 0 && iy == 0 && iz == 0) continue; + + ++icell; + + xshift_s[icell][0] = static_cast(ix); + xshift_s[icell][1] = static_cast(iy); + xshift_s[icell][2] = static_cast(iz); + } + } + } + + atm_prim.resize(N); + cells.resize(N); + atm_super.resize(N); + + unsigned int icount = 0; + + for (auto igroup = 0; igroup < number_of_groups; ++igroup) { + + unsigned int nsize_group = fcs_group[igroup].size(); + + for (j = 0; j < nsize_group; ++j) { + + for (i = 0; i < N; ++i) { + atm_prim[i] = fcs_in[icount].pairs[i].index / 3; + unsigned int tran_tmp = fcs_in[icount].pairs[i].tran; + cells[i] = fcs_in[icount].pairs[i].cell_s; + atm_super[i] = system->map_p2s_anharm[atm_prim[i]][tran_tmp]; + } + + for (i = 0; i < N - 1; ++i) { + for (k = 0; k < 3; ++k) { + vecs[i][k] = system->xr_s_anharm[atm_super[i + 1]][k] + xshift_s[cells[i + 1]][k] + - system->xr_s_anharm[system->map_p2s_anharm[atm_prim[i + 1]][0]][k]; + } + rotvec(vecs[i], vecs[i], mat_convert); + } + + if (N == 3) { + vec_out[igroup].emplace_back(vecs[0], vecs[1]); + } else if (N == 4) { + vec_out[igroup].emplace_back(vecs[0], vecs[1], vecs[2]); + } + ++icount; + } + } + + memory->deallocate(xshift_s); +} + + +void AnharmonicCore::prepare_group_of_force_constants(const std::vector &fcs_in, + const unsigned int N, + int &number_of_groups, + std::vector *&fcs_group_out) const +{ + // Find the number of groups which has different evecs. + + unsigned int i; + std::vector arr_old, arr_tmp; + + number_of_groups = 0; + + arr_old.clear(); + for (i = 0; i < N; ++i) { + arr_old.push_back(-1); + } + + for (const auto &it : fcs_in) { + + arr_tmp.clear(); + + for (i = 0; i < it.pairs.size(); ++i) { + arr_tmp.push_back(it.pairs[i].index); + } + + if (arr_tmp != arr_old) { + ++number_of_groups; + arr_old.clear(); + arr_old.reserve(arr_tmp.size()); + std::copy(arr_tmp.begin(), arr_tmp.end(), std::back_inserter(arr_old)); + } + } + + memory->allocate(fcs_group_out, number_of_groups); + + int igroup = -1; + + arr_old.clear(); + for (i = 0; i < N; ++i) { + arr_old.push_back(-1); + } + + for (const auto &it : fcs_in) { + + arr_tmp.clear(); + + for (i = 0; i < it.pairs.size(); ++i) { + arr_tmp.push_back(it.pairs[i].index); + } + + if (arr_tmp != arr_old) { + ++igroup; + arr_old.clear(); + arr_old.reserve(arr_tmp.size()); + std::copy(arr_tmp.begin(), arr_tmp.end(), std::back_inserter(arr_old)); + } + + fcs_group_out[igroup].push_back(it.fcs_val); + } +} + +std::complex AnharmonicCore::V3(const unsigned int ks[3]) +{ + return V3(ks, + dynamical->eval_phonon, + dynamical->evec_phonon); +} + +std::complex AnharmonicCore::V4(const unsigned int ks[4]) +{ + return V4(ks, + dynamical->eval_phonon, + dynamical->evec_phonon); +} + + +std::complex AnharmonicCore::V3(const unsigned int ks[3], + double **eval_phonon, + std::complex ***evec_phonon) +{ + int i; + unsigned int kn[3], sn[3]; + int ns = dynamical->neval; + + double omega[3]; + std::complex ret = std::complex(0.0, 0.0); + double ret_re = 0.0; + double ret_im = 0.0; + + for (i = 0; i < 3; ++i) { + kn[i] = ks[i] / ns; + sn[i] = ks[i] % ns; + omega[i] = eval_phonon[kn[i]][sn[i]]; + } + + // Return zero if any of the involving phonon has imaginary frequency + if (omega[0] < eps8 || omega[1] < eps8 || omega[2] < eps8) return 0.0; + + if (kn[1] != kindex_phi3_stored[0] || kn[2] != kindex_phi3_stored[1]) { + calc_phi3_reciprocal(kn[1], kn[2], phi3_reciprocal); + kindex_phi3_stored[0] = kn[1]; + kindex_phi3_stored[1] = kn[2]; + } +#ifdef _OPENMP +#pragma omp parallel for private(ret), reduction(+: ret_re, ret_im) +#endif + for (i = 0; i < ngroup_v3; ++i) { + ret = evec_phonon[kn[0]][sn[0]][evec_index_v3[i][0]] + * evec_phonon[kn[1]][sn[1]][evec_index_v3[i][1]] + * evec_phonon[kn[2]][sn[2]][evec_index_v3[i][2]] + * invmass_v3[i] * phi3_reciprocal[i]; + ret_re += ret.real(); + ret_im += ret.imag(); + } + + return std::complex(ret_re, ret_im) + / std::sqrt(omega[0] * omega[1] * omega[2]); +} + + +void AnharmonicCore::calc_phi3_reciprocal(const unsigned int ik1, + const unsigned int ik2, + std::complex *ret) +{ + int i, j; + unsigned int iloc; + double phase; + double dnk_represent = static_cast(nk_represent) / (2.0 * pi); + std::complex ret_in; + unsigned int nsize_group; + + unsigned int ielem = 0; + + if (use_tuned_ver) { + + if (tune_type == 0) { + +#pragma omp parallel for private(ret_in, nsize_group, j, phase, iloc) + for (i = 0; i < ngroup_v3; ++i) { + + ret_in = std::complex(0.0, 0.0); + nsize_group = fcs_group_v3[i].size(); + + for (j = 0; j < nsize_group; ++j) { + + phase = relvec_v3[i][j].vecs[0][0] * kpoint->xk[ik1][0] + + relvec_v3[i][j].vecs[0][1] * kpoint->xk[ik1][1] + + relvec_v3[i][j].vecs[0][2] * kpoint->xk[ik1][2] + + relvec_v3[i][j].vecs[1][0] * kpoint->xk[ik2][0] + + relvec_v3[i][j].vecs[1][1] * kpoint->xk[ik2][1] + + relvec_v3[i][j].vecs[1][2] * kpoint->xk[ik2][2]; + + unsigned int iloc = nint(phase * dnk_represent) % nk_represent + nk_represent - 1; + ret_in += fcs_group_v3[i][j] * exp_phase[iloc]; + } + ret[i] = ret_in; + } + + } else if (tune_type == 1) { + + // Tuned version is used when nk1=nk2=nk3 doesn't hold. + + int loc[3]; + double phase3[3]; + const auto inv2pi = 1.0 / (2.0 * pi); + +#pragma omp parallel for private(ret_in, nsize_group, j, phase3, loc) + for (i = 0; i < ngroup_v3; ++i) { + + ret_in = std::complex(0.0, 0.0); + nsize_group = fcs_group_v3[i].size(); + + for (j = 0; j < nsize_group; ++j) { + + for (auto ii = 0; ii < 3; ++ii) { + phase3[ii] + = relvec_v3[i][j].vecs[0][ii] * kpoint->xk[ik1][ii] + + relvec_v3[i][j].vecs[1][ii] * kpoint->xk[ik2][ii]; + + loc[ii] = nint(phase3[ii] * dnk[ii] * inv2pi) % nk_grid[ii] + nk_grid[ii] - 1; + } + + ret_in += fcs_group_v3[i][j] * exp_phase3[loc[0]][loc[1]][loc[2]]; + } + ret[i] = ret_in; + } + } + + } else { + // Original version +#pragma omp parallel for private(ret_in, nsize_group, phase) + for (i = 0; i < ngroup_v3; ++i) { + + ret_in = std::complex(0.0, 0.0); + nsize_group = fcs_group_v3[i].size(); + + for (j = 0; j < nsize_group; ++j) { + + phase + = relvec_v3[i][j].vecs[0][0] * kpoint->xk[ik1][0] + + relvec_v3[i][j].vecs[0][1] * kpoint->xk[ik1][1] + + relvec_v3[i][j].vecs[0][2] * kpoint->xk[ik1][2] + + relvec_v3[i][j].vecs[1][0] * kpoint->xk[ik2][0] + + relvec_v3[i][j].vecs[1][1] * kpoint->xk[ik2][1] + + relvec_v3[i][j].vecs[1][2] * kpoint->xk[ik2][2]; + + ret_in += fcs_group_v3[i][j] * std::exp(im * phase); + } + ret[i] = ret_in; + } + } +} + + +std::complex AnharmonicCore::V4(const unsigned int ks[4], + double **eval_phonon, + std::complex ***evec_phonon) +{ + int i; + int ns = dynamical->neval; + unsigned int kn[4], sn[4]; + double omega[4]; + double ret_re = 0.0; + double ret_im = 0.0; + std::complex ret = std::complex(0.0, 0.0); + + for (i = 0; i < 4; ++i) { + kn[i] = ks[i] / ns; + sn[i] = ks[i] % ns; + omega[i] = eval_phonon[kn[i]][sn[i]]; + } + // Return zero if any of the involving phonon has imaginary frequency + if (omega[0] < eps8 || omega[1] < eps8 || omega[2] < eps8 || omega[3] < eps8) return 0.0; + + if (kn[1] != kindex_phi4_stored[0] + || kn[2] != kindex_phi4_stored[1] + || kn[3] != kindex_phi4_stored[2]) { + + calc_phi4_reciprocal(kn[1], + kn[2], + kn[3], + phi4_reciprocal); + + kindex_phi4_stored[0] = kn[1]; + kindex_phi4_stored[1] = kn[2]; + kindex_phi4_stored[2] = kn[3]; + } + +#ifdef _OPENMP +#pragma omp parallel for private(ret), reduction(+: ret_re, ret_im) +#endif + for (i = 0; i < ngroup_v4; ++i) { + ret = evec_phonon[kn[0]][sn[0]][evec_index_v4[i][0]] + * evec_phonon[kn[1]][sn[1]][evec_index_v4[i][1]] + * evec_phonon[kn[2]][sn[2]][evec_index_v4[i][2]] + * evec_phonon[kn[3]][sn[3]][evec_index_v4[i][3]] + * invmass_v4[i] * phi4_reciprocal[i]; + ret_re += ret.real(); + ret_im += ret.imag(); + } + + return std::complex(ret_re, ret_im) + / std::sqrt(omega[0] * omega[1] * omega[2] * omega[3]); +} + + +void AnharmonicCore::calc_phi4_reciprocal(const unsigned int ik1, + const unsigned int ik2, + const unsigned int ik3, + std::complex *ret) +{ + int i, j; + unsigned int iloc; + double phase; + double dnk_represent = static_cast(nk_represent) / (2.0 * pi); + std::complex ret_in; + unsigned int nsize_group; + + unsigned int ielem = 0; + + if (use_tuned_ver) { + + if (tune_type == 0) { + +#pragma omp parallel for private(ret_in, nsize_group, j, phase, iloc) + for (i = 0; i < ngroup_v4; ++i) { + + ret_in = std::complex(0.0, 0.0); + nsize_group = fcs_group_v4[i].size(); + + for (j = 0; j < nsize_group; ++j) { + + phase = relvec_v4[i][j].vecs[0][0] * kpoint->xk[ik1][0] + + relvec_v4[i][j].vecs[0][1] * kpoint->xk[ik1][1] + + relvec_v4[i][j].vecs[0][2] * kpoint->xk[ik1][2] + + relvec_v4[i][j].vecs[1][0] * kpoint->xk[ik2][0] + + relvec_v4[i][j].vecs[1][1] * kpoint->xk[ik2][1] + + relvec_v4[i][j].vecs[1][2] * kpoint->xk[ik2][2] + + relvec_v4[i][j].vecs[2][0] * kpoint->xk[ik3][0] + + relvec_v4[i][j].vecs[2][1] * kpoint->xk[ik3][1] + + relvec_v4[i][j].vecs[2][2] * kpoint->xk[ik3][2]; + + unsigned int iloc = nint(phase * dnk_represent) % nk_represent + nk_represent - 1; + ret_in += fcs_group_v4[i][j] * exp_phase[iloc]; + } + ret[i] = ret_in; + } + + } else if (tune_type == 1) { + + // Tuned version is used when nk1=nk2=nk3 doesn't hold. + + int loc[3]; + double phase3[3]; + const auto inv2pi = 1.0 / (2.0 * pi); + +#pragma omp parallel for private(ret_in, nsize_group, j, phase3, loc) + for (i = 0; i < ngroup_v4; ++i) { + + ret_in = std::complex(0.0, 0.0); + nsize_group = fcs_group_v4[i].size(); + + for (j = 0; j < nsize_group; ++j) { + + for (auto ii = 0; ii < 3; ++ii) { + phase3[ii] + = relvec_v4[i][j].vecs[0][ii] * kpoint->xk[ik1][ii] + + relvec_v4[i][j].vecs[1][ii] * kpoint->xk[ik2][ii] + + relvec_v4[i][j].vecs[2][ii] * kpoint->xk[ik3][ii]; + + loc[ii] = nint(phase3[ii] * dnk[ii] * inv2pi) % nk_grid[ii] + nk_grid[ii] - 1; + } + + ret_in += fcs_group_v4[i][j] * exp_phase3[loc[0]][loc[1]][loc[2]]; + } + ret[i] = ret_in; + } + } + + } else { + // Original version +#pragma omp parallel for private(ret_in, nsize_group, phase) + for (i = 0; i < ngroup_v4; ++i) { + + ret_in = std::complex(0.0, 0.0); + nsize_group = fcs_group_v4[i].size(); + + for (j = 0; j < nsize_group; ++j) { + + phase + = relvec_v4[i][j].vecs[0][0] * kpoint->xk[ik1][0] + + relvec_v4[i][j].vecs[0][1] * kpoint->xk[ik1][1] + + relvec_v4[i][j].vecs[0][2] * kpoint->xk[ik1][2] + + relvec_v4[i][j].vecs[1][0] * kpoint->xk[ik2][0] + + relvec_v4[i][j].vecs[1][1] * kpoint->xk[ik2][1] + + relvec_v4[i][j].vecs[1][2] * kpoint->xk[ik2][2] + + relvec_v4[i][j].vecs[2][0] * kpoint->xk[ik3][0] + + relvec_v4[i][j].vecs[2][1] * kpoint->xk[ik3][1] + + relvec_v4[i][j].vecs[2][2] * kpoint->xk[ik3][2]; + + ret_in += fcs_group_v4[i][j] * std::exp(im * phase); + } + ret[i] = ret_in; + } + } +} + + +std::complex AnharmonicCore::V3_mode(int mode, + double *xk2, + double *xk3, + int is, + int js, + double **eval, + std::complex ***evec) const +{ + std::complex ctmp = std::complex(0.0, 0.0); + + // Return zero if any of the involving phonon has imaginary frequency + if (eval[0][mode] < eps8 || eval[1][is] < eps8 || eval[2][js] < eps8) return 0.0; + + unsigned int ielem = 0; + + for (int i = 0; i < ngroup_v3; ++i) { + + std::complex vec_tmp = evec[0][mode][evec_index_v3[i][0]] + * evec[1][is][evec_index_v3[i][1]] + * evec[2][js][evec_index_v3[i][2]] + * invmass_v3[i]; + + std::complex ret_in = std::complex(0.0, 0.0); + + int nsize_group = fcs_group_v3[i].size(); + + for (int j = 0; j < nsize_group; ++j) { + + double phase = relvec_v3[i][j].vecs[0][0] * xk2[0] + + relvec_v3[i][j].vecs[0][1] * xk2[1] + + relvec_v3[i][j].vecs[0][2] * xk2[2] + + relvec_v3[i][j].vecs[1][0] * xk3[0] + + relvec_v3[i][j].vecs[1][1] * xk3[1] + + relvec_v3[i][j].vecs[1][2] * xk3[2]; + + ret_in += fcs_group_v3[i][j] * std::exp(im * phase); + + ++ielem; + } + ctmp += ret_in * vec_tmp; + } + + return ctmp / std::sqrt(eval[0][mode] * eval[1][is] * eval[2][js]); +} + + +void AnharmonicCore::calc_damping_smearing(const unsigned int N, + double *T, + const double omega, + const unsigned int ik_in, + const unsigned int snum, + double *ret) +{ + // This function returns the imaginary part of phonon self-energy + // for the given frequency omega. + // Lorentzian or Gaussian smearing will be used. + // This version employs the crystal symmetry to reduce the computational cost + + int nk = kpoint->nk; + int ns = dynamical->neval; + int ns2 = ns * ns; + unsigned int i; + int ik; + unsigned int is, js; + unsigned int arr[3]; + + int k1, k2; + + double T_tmp; + double n1, n2; + double omega_inner[2]; + + double multi; + + for (i = 0; i < N; ++i) ret[i] = 0.0; + + double **v3_arr; + double ***delta_arr; + double ret_tmp; + + double f1, f2; + + double epsilon = integration->epsilon; + + std::vector triplet; + + kpoint->get_unique_triplet_k(ik_in, + use_triplet_symmetry, + sym_permutation, + triplet); + + int npair_uniq = triplet.size(); + + memory->allocate(v3_arr, npair_uniq, ns * ns); + memory->allocate(delta_arr, npair_uniq, ns * ns, 2); + + int knum = kpoint->kpoint_irred_all[ik_in][0].knum; + int knum_minus = kpoint->knum_minus[knum]; +#ifdef _OPENMP +#pragma omp parallel for private(multi, arr, k1, k2, is, js, omega_inner) +#endif + for (ik = 0; ik < npair_uniq; ++ik) { + multi = static_cast(triplet[ik].group.size()); + + arr[0] = ns * knum_minus + snum; + + k1 = triplet[ik].group[0].ks[0]; + k2 = triplet[ik].group[0].ks[1]; + + for (is = 0; is < ns; ++is) { + arr[1] = ns * k1 + is; + omega_inner[0] = dynamical->eval_phonon[k1][is]; + + for (js = 0; js < ns; ++js) { + arr[2] = ns * k2 + js; + omega_inner[1] = dynamical->eval_phonon[k2][js]; + + if (integration->ismear == 0) { + delta_arr[ik][ns * is + js][0] + = delta_lorentz(omega - omega_inner[0] - omega_inner[1], epsilon) + - delta_lorentz(omega + omega_inner[0] + omega_inner[1], epsilon); + delta_arr[ik][ns * is + js][1] + = delta_lorentz(omega - omega_inner[0] + omega_inner[1], epsilon) + - delta_lorentz(omega + omega_inner[0] - omega_inner[1], epsilon); + } else if (integration->ismear == 1) { + delta_arr[ik][ns * is + js][0] + = delta_gauss(omega - omega_inner[0] - omega_inner[1], epsilon) + - delta_gauss(omega + omega_inner[0] + omega_inner[1], epsilon); + delta_arr[ik][ns * is + js][1] + = delta_gauss(omega - omega_inner[0] + omega_inner[1], epsilon) + - delta_gauss(omega + omega_inner[0] - omega_inner[1], epsilon); + } + } + } + } + + for (ik = 0; ik < npair_uniq; ++ik) { + + k1 = triplet[ik].group[0].ks[0]; + k2 = triplet[ik].group[0].ks[1]; + + multi = static_cast(triplet[ik].group.size()); + + for (int ib = 0; ib < ns2; ++ib) { + is = ib / ns; + js = ib % ns; + + arr[0] = ns * knum_minus + snum; + arr[1] = ns * k1 + is; + arr[2] = ns * k2 + js; + + v3_arr[ik][ib] = std::norm(V3(arr, + dynamical->eval_phonon, + dynamical->evec_phonon)) * multi; + } + } + + for (i = 0; i < N; ++i) { + T_tmp = T[i]; + ret_tmp = 0.0; +#ifdef _OPENMP +#pragma omp parallel for private(k1, k2, is, js, omega_inner, n1, n2, f1, f2), reduction(+:ret_tmp) +#endif + for (ik = 0; ik < npair_uniq; ++ik) { + + k1 = triplet[ik].group[0].ks[0]; + k2 = triplet[ik].group[0].ks[1]; + + for (is = 0; is < ns; ++is) { + + omega_inner[0] = dynamical->eval_phonon[k1][is]; + + for (js = 0; js < ns; ++js) { + + omega_inner[1] = dynamical->eval_phonon[k2][js]; + + if (thermodynamics->classical) { + f1 = thermodynamics->fC(omega_inner[0], T_tmp); + f2 = thermodynamics->fC(omega_inner[1], T_tmp); + + n1 = f1 + f2; + n2 = f1 - f2; + } else { + f1 = thermodynamics->fB(omega_inner[0], T_tmp); + f2 = thermodynamics->fB(omega_inner[1], T_tmp); + + n1 = f1 + f2 + 1.0; + n2 = f1 - f2; + } + + ret_tmp += v3_arr[ik][ns * is + js] + * (n1 * delta_arr[ik][ns * is + js][0] + - n2 * delta_arr[ik][ns * is + js][1]); + } + } + } + ret[i] = ret_tmp; + } + + memory->deallocate(v3_arr); + memory->deallocate(delta_arr); + triplet.clear(); + + for (i = 0; i < N; ++i) ret[i] *= pi * std::pow(0.5, 4) / static_cast(nk); +} + + +void AnharmonicCore::calc_damping_tetrahedron(const unsigned int N, + double *T, + const double omega, + const unsigned int ik_in, + const unsigned int snum, + double *ret) +{ + // This function returns the imaginary part of phonon self-energy + // for the given frequency omega. + // Tetrahedron method will be used. + // This version employs the crystal symmetry to reduce the computational cost + + int nk = kpoint->nk; + int ns = dynamical->neval; + + int ik, ib; + int ns2 = ns * ns; + + unsigned int i; + unsigned int jk; + unsigned int is, js; + unsigned int k1, k2; + unsigned int arr[3]; + + double T_tmp; + double n1, n2; + double f1, f2; + double multi; + + double xk_tmp[3]; + double omega_inner[2]; + + double ret_tmp; + + int *kmap_identity; + double **energy_tmp; + double **weight_tetra; + double **v3_arr; + double ***delta_arr; + + std::vector triplet; + + for (i = 0; i < N; ++i) ret[i] = 0.0; + + kpoint->get_unique_triplet_k(ik_in, + use_triplet_symmetry, + sym_permutation, + triplet); + + unsigned int npair_uniq = triplet.size(); + + memory->allocate(v3_arr, npair_uniq, ns2); + memory->allocate(delta_arr, npair_uniq, ns2, 2); + + int knum = kpoint->kpoint_irred_all[ik_in][0].knum; + int knum_minus = kpoint->knum_minus[knum]; + + memory->allocate(kmap_identity, nk); + + for (i = 0; i < nk; ++i) kmap_identity[i] = i; + + +#ifdef _OPENMP +#pragma omp parallel private(is, js, k1, k2, xk_tmp, energy_tmp, i, weight_tetra, ik, jk, arr) +#endif + { + memory->allocate(energy_tmp, 3, nk); + memory->allocate(weight_tetra, 3, nk); + +#ifdef _OPENMP +#pragma omp for +#endif + for (ib = 0; ib < ns2; ++ib) { + is = ib / ns; + js = ib % ns; + + for (k1 = 0; k1 < nk; ++k1) { + + // Prepare two-phonon frequency for the tetrahedron method + + for (i = 0; i < 3; ++i) xk_tmp[i] = kpoint->xk[knum][i] - kpoint->xk[k1][i]; + + k2 = kpoint->get_knum(xk_tmp[0], xk_tmp[1], xk_tmp[2]); + + energy_tmp[0][k1] = dynamical->eval_phonon[k1][is] + dynamical->eval_phonon[k2][js]; + energy_tmp[1][k1] = dynamical->eval_phonon[k1][is] - dynamical->eval_phonon[k2][js]; + energy_tmp[2][k1] = -energy_tmp[1][k1]; + } + + for (i = 0; i < 3; ++i) { + integration->calc_weight_tetrahedron(nk, + kmap_identity, + weight_tetra[i], + energy_tmp[i], + omega); + } + + for (ik = 0; ik < npair_uniq; ++ik) { + jk = triplet[ik].group[0].ks[0]; + delta_arr[ik][ib][0] = weight_tetra[0][jk]; + delta_arr[ik][ib][1] = weight_tetra[1][jk] - weight_tetra[2][jk]; + } + } + + memory->deallocate(energy_tmp); + memory->deallocate(weight_tetra); + } + + for (ik = 0; ik < npair_uniq; ++ik) { + + k1 = triplet[ik].group[0].ks[0]; + k2 = triplet[ik].group[0].ks[1]; + + multi = static_cast(triplet[ik].group.size()); + + for (ib = 0; ib < ns2; ++ib) { + is = ib / ns; + js = ib % ns; + + if (delta_arr[ik][ib][0] > 0.0 || std::abs(delta_arr[ik][ib][1]) > 0.0) { + + arr[0] = ns * knum_minus + snum; + arr[1] = ns * k1 + is; + arr[2] = ns * k2 + js; + + v3_arr[ik][ib] = std::norm(V3(arr, + dynamical->eval_phonon, + dynamical->evec_phonon)) * multi; + + } else { + v3_arr[ik][ib] = 0.0; + } + } + } + + for (i = 0; i < N; ++i) { + T_tmp = T[i]; + ret_tmp = 0.0; +#ifdef _OPENMP +#pragma omp parallel for private(k1, k2, is, js, omega_inner, n1, n2, f1, f2), reduction(+:ret_tmp) +#endif + for (ik = 0; ik < npair_uniq; ++ik) { + + k1 = triplet[ik].group[0].ks[0]; + k2 = triplet[ik].group[0].ks[1]; + + for (is = 0; is < ns; ++is) { + + omega_inner[0] = dynamical->eval_phonon[k1][is]; + + for (js = 0; js < ns; ++js) { + + omega_inner[1] = dynamical->eval_phonon[k2][js]; + + if (thermodynamics->classical) { + f1 = thermodynamics->fC(omega_inner[0], T_tmp); + f2 = thermodynamics->fC(omega_inner[1], T_tmp); + + n1 = f1 + f2; + n2 = f1 - f2; + } else { + f1 = thermodynamics->fB(omega_inner[0], T_tmp); + f2 = thermodynamics->fB(omega_inner[1], T_tmp); + + n1 = f1 + f2 + 1.0; + n2 = f1 - f2; + } + + ret_tmp += v3_arr[ik][ns * is + js] + * (n1 * delta_arr[ik][ns * is + js][0] + - n2 * delta_arr[ik][ns * is + js][1]); + } + } + } + ret[i] = ret_tmp; + } + + memory->deallocate(v3_arr); + memory->deallocate(delta_arr); + memory->deallocate(kmap_identity); + + for (i = 0; i < N; ++i) ret[i] *= pi * std::pow(0.5, 4); +} + + +void AnharmonicCore::setup_cubic() +{ + int i; + double *invsqrt_mass_p; + + // Sort force_constant[1] using the operator defined in fcs_phonons.h + // This sorting is necessary. + std::sort(fcs_phonon->force_constant_with_cell[1].begin(), + fcs_phonon->force_constant_with_cell[1].end()); + prepare_group_of_force_constants(fcs_phonon->force_constant_with_cell[1], + 3, ngroup_v3, fcs_group_v3); + + memory->allocate(invmass_v3, ngroup_v3); + memory->allocate(evec_index_v3, ngroup_v3, 3); + memory->allocate(relvec_v3, ngroup_v3); + memory->allocate(phi3_reciprocal, ngroup_v3); + + prepare_relative_vector(fcs_phonon->force_constant_with_cell[1], + 3, + ngroup_v3, + fcs_group_v3, + relvec_v3); + + memory->allocate(invsqrt_mass_p, system->natmin); + + for (i = 0; i < system->natmin; ++i) { + invsqrt_mass_p[i] = std::sqrt(1.0 / system->mass[system->map_p2s[i][0]]); + } + + int k = 0; + for (i = 0; i < ngroup_v3; ++i) { + for (int j = 0; j < 3; ++j) { + evec_index_v3[i][j] = fcs_phonon->force_constant_with_cell[1][k].pairs[j].index; + } + invmass_v3[i] + = invsqrt_mass_p[evec_index_v3[i][0] / 3] + * invsqrt_mass_p[evec_index_v3[i][1] / 3] + * invsqrt_mass_p[evec_index_v3[i][2] / 3]; + k += fcs_group_v3[i].size(); + } + + memory->deallocate(invsqrt_mass_p); +} + +void AnharmonicCore::setup_quartic() +{ + int i; + double *invsqrt_mass_p; + std::sort(fcs_phonon->force_constant_with_cell[2].begin(), + fcs_phonon->force_constant_with_cell[2].end()); + prepare_group_of_force_constants(fcs_phonon->force_constant_with_cell[2], + 4, ngroup_v4, fcs_group_v4); + + memory->allocate(invmass_v4, ngroup_v4); + memory->allocate(evec_index_v4, ngroup_v4, 4); + memory->allocate(relvec_v4, ngroup_v4); + memory->allocate(phi4_reciprocal, ngroup_v4); + + prepare_relative_vector(fcs_phonon->force_constant_with_cell[2], + 4, + ngroup_v4, + fcs_group_v4, + relvec_v4); + + memory->allocate(invsqrt_mass_p, system->natmin); + + for (i = 0; i < system->natmin; ++i) { + invsqrt_mass_p[i] = std::sqrt(1.0 / system->mass[system->map_p2s[i][0]]); + } + + int k = 0; + for (i = 0; i < ngroup_v4; ++i) { + for (int j = 0; j < 4; ++j) { + evec_index_v4[i][j] = fcs_phonon->force_constant_with_cell[2][k].pairs[j].index; + } + invmass_v4[i] + = invsqrt_mass_p[evec_index_v4[i][0] / 3] + * invsqrt_mass_p[evec_index_v4[i][1] / 3] + * invsqrt_mass_p[evec_index_v4[i][2] / 3] + * invsqrt_mass_p[evec_index_v4[i][3] / 3]; + k += fcs_group_v4[i].size(); + } + + memory->deallocate(invsqrt_mass_p); +} + +void AnharmonicCore::store_exponential_for_acceleration(const int nk_in[3], + int &nkrep_out, + std::complex *exp_out, + std::complex ***exp3_out) +{ + // For accelerating function V3 and V4 by avoiding continual call of std::exp. + + MPI_Bcast(&use_tuned_ver, 1, MPI_LOGICAL, 0, MPI_COMM_WORLD); + + if (use_tuned_ver) { + + nk_grid[0] = nk_in[0]; + nk_grid[1] = nk_in[1]; + nk_grid[2] = nk_in[2]; + + for (int i = 0; i < 3; ++i) dnk[i] = static_cast(nk_grid[i]); + + if (nk_grid[0] == nk_grid[1] && nk_grid[1] == nk_grid[2]) { + nkrep_out = nk_grid[0]; + tune_type = 0; + + } else if (nk_grid[0] == nk_grid[1] && nk_grid[2] == 1) { + nkrep_out = nk_grid[0]; + tune_type = 0; + + } else if (nk_grid[1] == nk_grid[2] && nk_grid[0] == 1) { + nkrep_out = nk_grid[1]; + tune_type = 0; + + } else if (nk_grid[2] == nk_grid[0] && nk_grid[1] == 1) { + nkrep_out = nk_grid[2]; + tune_type = 0; + + } else if (nk_grid[0] == 1 && nk_grid[1] == 1) { + nkrep_out = nk_grid[2]; + tune_type = 0; + + } else if (nk_grid[1] == 1 && nk_grid[2] == 1) { + nkrep_out = nk_grid[0]; + tune_type = 0; + + } else if (nk_grid[2] == 1 && nk_grid[0] == 1) { + nkrep_out = nk_grid[1]; + tune_type = 0; + + } else { + tune_type = 1; + } + + int ii, jj, kk; + + if (tune_type == 0) { + + double phase; + + memory->allocate(exp_phase, 2 * nkrep_out - 1); +#ifdef _OPENMP +#pragma omp parallel for private(phase) +#endif + for (ii = 0; ii < 2 * nkrep_out - 1; ++ii) { + phase = 2.0 * pi * static_cast(ii - nkrep_out + 1) + / static_cast(nkrep_out); + exp_phase[ii] = std::exp(im * phase); + } + + } else if (tune_type == 1) { + + double phase[3]; + + memory->allocate(exp_phase3, + 2 * nk_grid[0] - 1, + 2 * nk_grid[1] - 1, + 2 * nk_grid[2] - 1); +#ifdef _OPENMP +#pragma omp parallel for private(phase, jj, kk) +#endif + for (ii = 0; ii < 2 * nk_grid[0] - 1; ++ii) { + phase[0] = 2.0 * pi * static_cast(ii - nk_grid[0] + 1) / dnk[0]; + for (int jj = 0; jj < 2 * nk_grid[1] - 1; ++jj) { + phase[1] = 2.0 * pi * static_cast(jj - nk_grid[1] + 1) / dnk[1]; + for (int kk = 0; kk < 2 * nk_grid[2] - 1; ++kk) { + phase[2] = 2.0 * pi * static_cast(kk - nk_grid[2] + 1) / dnk[2]; + exp_phase3[ii][jj][kk] = std::exp(im * (phase[0] + phase[1] + phase[2])); + } + } + } + } + } +} + + +void AnharmonicCore::calc_self3omega_tetrahedron(const double Temp, + double **eval, + std::complex ***evec, + const unsigned int ik_in, + const unsigned int snum, + const unsigned int nomega, + double *omega, + double *ret) +{ + // This function returns the imaginary part of phonon self-energy + // for the given frequency range of omega, phonon frequency (eval) and phonon eigenvectors (evec). + // The tetrahedron method will be used. + // This version employs the crystal symmetry to reduce the computational cost + // In addition, both MPI and OpenMP parallizations are used in a hybrid way inside this function. + + int nk = kpoint->nk; + int ns = dynamical->neval; + + int ik, ib, iomega; + int ns2 = ns * ns; + + unsigned int i; + unsigned int is, js; + unsigned int k1, k2; + unsigned int arr[3]; + unsigned int nk_tmp; + + double n1, n2; + double f1, f2; + double omega_inner[2]; + + int *kmap_identity, **kpairs; + double **energy_tmp; + double **weight_tetra; + double **v3_arr, *v3_arr_loc; + double *ret_private; + + std::vector triplet; + std::vector vk_l; + + int knum = kpoint->kpoint_irred_all[ik_in][0].knum; + int knum_minus = kpoint->knum_minus[knum]; + double omega0 = eval[knum_minus][snum]; + + kpoint->get_unique_triplet_k(ik_in, + false, + false, + triplet); + + unsigned int npair_uniq = triplet.size(); + + if (npair_uniq != nk) { + error->exit("hoge", "Something is wrong."); + } + + memory->allocate(kpairs, nk, 2); + memory->allocate(kmap_identity, nk); + + for (i = 0; i < nk; ++i) kmap_identity[i] = i; + + for (iomega = 0; iomega < nomega; ++iomega) ret[iomega] = 0.0; + + for (ik = 0; ik < npair_uniq; ++ik) { + kpairs[ik][0] = triplet[ik].group[0].ks[0]; + kpairs[ik][1] = triplet[ik].group[0].ks[1]; + } + + if (nk % mympi->nprocs != 0) { + nk_tmp = nk / mympi->nprocs + 1; + } else { + nk_tmp = nk / mympi->nprocs; + } + + vk_l.clear(); + + for (ik = 0; ik < nk; ++ik) { + if (ik % mympi->nprocs == mympi->my_rank) { + vk_l.push_back(ik); + } + } + + if (vk_l.size() < nk_tmp) { + vk_l.push_back(-1); + } + + memory->allocate(v3_arr_loc, ns2); + memory->allocate(v3_arr, nk_tmp * mympi->nprocs, ns2); + + for (ik = 0; ik < nk_tmp; ++ik) { + + int ik_now = vk_l[ik]; + + if (ik_now == -1) { + + for (ib = 0; ib < ns2; ++ib) v3_arr_loc[ib] = 0.0; // do nothing + + } else { +#ifdef _OPENMP +#pragma omp parallel for private(is, js, arr) +#endif + for (ib = 0; ib < ns2; ++ib) { + + is = ib / ns; + js = ib % ns; + + arr[0] = ns * knum_minus + snum; + arr[1] = ns * kpairs[ik_now][0] + is; + arr[2] = ns * kpairs[ik_now][1] + js; + + v3_arr_loc[ib] = std::norm(V3(arr, + dynamical->eval_phonon, + dynamical->evec_phonon)); + } + } + MPI_Gather(&v3_arr_loc[0], ns2, MPI_DOUBLE, + v3_arr[ik * mympi->nprocs], ns2, + MPI_DOUBLE, 0, MPI_COMM_WORLD); + } + memory->deallocate(v3_arr_loc); + + if (mympi->my_rank == 0) { + +#ifdef _OPENMP +#pragma omp parallel private(is, js, k1, k2, energy_tmp, i, \ + iomega, weight_tetra, ik, \ + omega_inner, f1, f2, n1, n2) +#endif + { + memory->allocate(energy_tmp, 2, nk); + memory->allocate(weight_tetra, 2, nk); +#ifdef _OPENMP + const int nthreads = omp_get_num_threads(); + const int ithread = omp_get_thread_num(); +#else + const int nthreads = 1; + const int ithread = 0; +#endif + +#ifdef _OPENMP +#pragma omp single +#endif + { + memory->allocate(ret_private, nthreads * nomega); + for (i = 0; i < nthreads * nomega; ++i) ret_private[i] = 0.0; + } +#ifdef _OPENMP +#pragma omp for +#endif + for (ib = 0; ib < ns2; ++ib) { + + is = ib / ns; + js = ib % ns; + + for (ik = 0; ik < nk; ++ik) { + k1 = kpairs[ik][0]; + k2 = kpairs[ik][1]; + + energy_tmp[0][ik] = eval[k1][is] + eval[k2][js]; + energy_tmp[1][ik] = eval[k1][is] - eval[k2][js]; + } + for (iomega = 0; iomega < nomega; ++iomega) { + for (i = 0; i < 2; ++i) { + integration->calc_weight_tetrahedron(nk, + kmap_identity, + weight_tetra[i], + energy_tmp[i], + omega[iomega]); + } + + for (ik = 0; ik < nk; ++ik) { + k1 = kpairs[ik][0]; + k2 = kpairs[ik][1]; + + omega_inner[0] = eval[k1][is]; + omega_inner[1] = eval[k2][js]; + if (thermodynamics->classical) { + f1 = thermodynamics->fC(omega_inner[0], Temp); + f2 = thermodynamics->fC(omega_inner[1], Temp); + n1 = f1 + f2; + n2 = f1 - f2; + } else { + f1 = thermodynamics->fB(omega_inner[0], Temp); + f2 = thermodynamics->fB(omega_inner[1], Temp); + n1 = f1 + f2 + 1.0; + n2 = f1 - f2; + } + + //#pragma omp critical + ret_private[nomega * ithread + iomega] + += v3_arr[ik][ib] * (n1 * weight_tetra[0][ik] - 2.0 * n2 * weight_tetra[1][ik]); + } + } + } +#ifdef _OPENMP +#pragma omp for +#endif + for (iomega = 0; iomega < nomega; ++iomega) { + for (int t = 0; t < nthreads; t++) { + ret[iomega] += ret_private[nomega * t + iomega]; + } + } + memory->deallocate(energy_tmp); + memory->deallocate(weight_tetra); + } +#ifdef _OPENMP +#pragma omp parallel for +#endif + for (iomega = 0; iomega < nomega; ++iomega) { + ret[iomega] *= pi * std::pow(0.5, 4); + } + memory->deallocate(ret_private); + } + + memory->deallocate(v3_arr); + memory->deallocate(kmap_identity); + memory->deallocate(kpairs); +} diff --git a/anphon/anharmonic_core.h b/anphon/anharmonic_core.h new file mode 100644 index 00000000..399bedd9 --- /dev/null +++ b/anphon/anharmonic_core.h @@ -0,0 +1,209 @@ +/* +anharmonic_core.h + +Copyright (c) 2014 Terumasa Tadano + +This file is distributed under the terms of the MIT license. +Please see the file 'LICENCE.txt' in the root directory +or http://opensource.org/licenses/mit-license.php for information. +*/ + +#pragma once + +#include "pointers.h" +#include +#include +#include "fcs_phonon.h" + +namespace PHON_NS +{ + class KsListMode + { + public: + double xk[3]; + int nmode; + + KsListMode(); + + KsListMode(double xk_in[3], + const int n) + { + for (int i = 0; i < 3; ++i) xk[i] = xk_in[i]; + nmode = n; + } + }; + + class KpointListWithCoordinate + { + public: + double xk[3]; + double x, y; + int plane; + int selection_type; + + KpointListWithCoordinate(); + + KpointListWithCoordinate(const std::vector &a, + const double x_in, + const double y_in, + const int plane_in, + const int selection_type_in) + { + for (int i = 0; i < 3; ++i) xk[i] = a[i]; + x = x_in; + y = y_in; + plane = plane_in; + selection_type = selection_type_in; + } + }; + + class RelativeVector + { + public: + double vecs[3][3]; + + RelativeVector(); + + // Constructor for cubic term + RelativeVector(const double vec1[3], + const double vec2[3]) + { + for (int i = 0; i < 3; ++i) { + vecs[0][i] = vec1[i]; + vecs[1][i] = vec2[i]; + vecs[2][i] = 0.0; + } + } + + // Constructor for quartic term + RelativeVector(const double vec1[3], + const double vec2[3], + const double vec3[3]) + { + for (int i = 0; i < 3; ++i) { + vecs[0][i] = vec1[i]; + vecs[1][i] = vec2[i]; + vecs[2][i] = vec3[i]; + } + } + }; + + + class AnharmonicCore : protected Pointers + { + public: + AnharmonicCore(class PHON *); + + ~AnharmonicCore(); + + void setup(); + + void calc_damping_smearing(unsigned int, + double *, + double, + unsigned int, + unsigned int, + double *); + + void calc_damping_tetrahedron(unsigned int, + double *, + double, + unsigned int, + unsigned int, + double *); + + int quartic_mode; + bool use_tuned_ver; + bool use_triplet_symmetry; + + std::complex V3(const unsigned int [3]); + std::complex V4(const unsigned int [4]); + + std::complex V3(const unsigned int [3], + double **, + std::complex ***); + + std::complex V4(const unsigned int [4], + double **, + std::complex ***); + + std::complex V3_mode(int, + double *, + double *, + int, + int, + double **, + std::complex ***) const; + + void prepare_relative_vector(const std::vector &, + unsigned int, + double ***) const; + + void prepare_relative_vector(const std::vector &, + unsigned int, + int, + std::vector *, + std::vector *&) const; + + void prepare_group_of_force_constants(const std::vector &, + unsigned int, + int &, + std::vector *&) const; + + + void calc_self3omega_tetrahedron(double, + double **, + std::complex ***, + unsigned int, + unsigned int, + unsigned int, + double *, + double *); + + + private: + void set_default_variables(); + void deallocate_variables(); + + std::complex im; + + double *invmass_v3; + double *invmass_v4; + int **evec_index_v3; + int **evec_index_v4; + int ngroup_v3; + int ngroup_v4; + std::vector *fcs_group_v3; + std::vector *fcs_group_v4; + std::complex *exp_phase, ***exp_phase3; + std::complex *phi3_reciprocal, *phi4_reciprocal; + std::vector *relvec_v3, *relvec_v4; + + int nk_grid[3]; + int nk_represent; + unsigned int tune_type; + double dnk[3]; + + bool sym_permutation; + + int kindex_phi3_stored[2] = {-1, -1}; + int kindex_phi4_stored[3] = {-1, -1, -1}; + + void setup_cubic(); + void setup_quartic(); + + void store_exponential_for_acceleration(const int nk_in[3], + int &, + std::complex *, + std::complex ***); + + void calc_phi3_reciprocal(unsigned int, + unsigned int, + std::complex *); + + void calc_phi4_reciprocal(unsigned int, + unsigned int, + unsigned int, + std::complex *); + }; +} diff --git a/anphon/anphon.vcxproj b/anphon/anphon.vcxproj index 9661b3f3..584b7f65 100644 --- a/anphon/anphon.vcxproj +++ b/anphon/anphon.vcxproj @@ -1,30 +1,52 @@  - + Debug Win32 + + Debug + x64 + Release Win32 + + Release + x64 + {80B34241-B404-47A5-B4C6-DA735D121433} anphon + 10.0.17763.0 Application true - v140 + v141 + MultiByte + + + Application + true + v141 MultiByte Application false - v140 + v142 + true + MultiByte + + + Application + false + v142 true MultiByte @@ -34,18 +56,32 @@ + + + + + + - $(UniversalCRT_IncludePath);$(MSMPI_INC);$(MSMPI_INC)x86;C:\fftw3\include;C:\boost\boost_1_60_0;C:\eigen_c++;$(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSDK_IncludePath) - $(UniversalCRT_LibraryPath_x86);$(MSMPI_LIB32);C:\fftw3\lib;$(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(WindowsSDK_LibraryPath_x86) + C:\boost\include\boost-1_67;$(UniversalCRT_IncludePath);$(MSMPI_INC);$(MSMPI_INC)x86;C:\fftw3\include;C:\boost\boost_1_60_0;C:\eigen_c++;$(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSDK_IncludePath);$(IncludePath) + $(UniversalCRT_LibraryPath_x86);$(MSMPI_LIB32);C:\fftw3\lib;$(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(WindowsSDK_LibraryPath_x86);$(LibraryPath) + + + C:\boost\include\boost-1_67;$(UniversalCRT_IncludePath);$(MSMPI_INC);$(MSMPI_INC)x64;C:\fftw3\include;C:\boost\boost_1_60_0;C:\eigen_c++;$(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSDK_IncludePath);$(IncludePath) + $(UniversalCRT_LibraryPath_x64);$(MSMPI_LIB64);C:\fftw3\lib;$(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(WindowsSDK_LibraryPath_x64);$(LibraryPath) C:\eigen_c++;$(UniversalCRT_IncludePath);$(MSMPI_INC);$(MSMPI_INC)x86;C:\fftw3\include;C:\boost\boost_1_60_0;$(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSDK_IncludePath) $(UniversalCRT_LibraryPath_x86);$(MSMPI_LIB32);C:\fftw3\lib;$(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(WindowsSDK_LibraryPath_x86); + + C:\eigen_c++;$(UniversalCRT_IncludePath);$(MSMPI_INC);$(MSMPI_INC)x86;C:\fftw3\include;C:\boost\boost_1_60_0;$(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSDK_IncludePath) + $(UniversalCRT_LibraryPath_x86);$(MSMPI_LIB32);C:\fftw3\lib;$(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(WindowsSDK_LibraryPath_x86); + Level3 @@ -58,6 +94,18 @@ msmpi.lib;libblas.lib;liblapack.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + Level3 + Disabled + $(SolutionDir)include;$(MSMPI_INC);C:\lapack + + + true + "C:\lapack" + msmpi.lib;libblas.lib;liblapack.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + Level3 @@ -77,6 +125,25 @@ msmpi.lib;libblas.lib;liblapack.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + Level3 + MaxSpeed + true + true + $(SolutionDir)include;C:\lapack + AdvancedVectorExtensions + true + 4018 + + + true + true + true + C:\lapack;C:\fftw3 + msmpi.lib;libblas.lib;liblapack.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + @@ -89,12 +156,13 @@ + - + @@ -114,13 +182,14 @@ + - + diff --git a/anphon/anphon.vcxproj.filters b/anphon/anphon.vcxproj.filters index 0bc93f01..9194f3d5 100644 --- a/anphon/anphon.vcxproj.filters +++ b/anphon/anphon.vcxproj.filters @@ -60,9 +60,6 @@ ソース ファイル - - ソース ファイル - ソース ファイル @@ -87,6 +84,12 @@ ソース ファイル + + ソース ファイル + + + ソース ファイル + @@ -134,9 +137,6 @@ ヘッダー ファイル - - ヘッダー ファイル - ヘッダー ファイル @@ -161,5 +161,11 @@ ヘッダー ファイル + + ヘッダー ファイル + + + ヘッダー ファイル + \ No newline at end of file diff --git a/anphon/conductivity.cpp b/anphon/conductivity.cpp index 4e3f57aa..a4c69d56 100644 --- a/anphon/conductivity.cpp +++ b/anphon/conductivity.cpp @@ -9,42 +9,73 @@ */ #include "mpi_common.h" -#include -#include -#include #include "conductivity.h" +#include "constants.h" #include "dynamical.h" #include "error.h" #include "integration.h" +#include "isotope.h" #include "kpoint.h" +#include "mathfunctions.h" #include "memory.h" -#include "parsephon.h" +#include "phonon_dos.h" #include "thermodynamics.h" #include "phonon_velocity.h" -#include "relaxation.h" +#include "anharmonic_core.h" #include "system.h" #include "write_phonons.h" -#include "constants.h" +#include +#include +#include #include #include -#include "mathfunctions.h" -#include "isotope.h" -#include "phonon_dos.h" using namespace PHON_NS; Conductivity::Conductivity(PHON *phon): Pointers(phon) { + set_default_variables(); } Conductivity::~Conductivity() { + deallocate_variables(); }; +void Conductivity::set_default_variables() +{ + calc_kappa_spec = 0; + ntemp = 0; + damping3 = nullptr; + kappa = nullptr; + kappa_spec = nullptr; + Temperature = nullptr; + vel = nullptr; +} + +void Conductivity::deallocate_variables() +{ + if (damping3) { + memory->deallocate(damping3); + } + if (kappa) { + memory->deallocate(kappa); + } + if (kappa_spec) { + memory->deallocate(kappa_spec); + } + if (Temperature) { + memory->deallocate(Temperature); + } + if (vel) { + memory->deallocate(vel); + } +} + + void Conductivity::setup_kappa() { unsigned int i, j, k; - unsigned int nks_total, nks_each_thread, nrem; nk = kpoint->nk; ns = dynamical->neval; @@ -56,9 +87,9 @@ void Conductivity::setup_kappa() Temperature[i] = system->Tmin + static_cast(i) * system->dT; } - nks_total = kpoint->nk_reduced * ns; - nks_each_thread = nks_total / mympi->nprocs; - nrem = nks_total - nks_each_thread * mympi->nprocs; + unsigned int nks_total = kpoint->nk_irred * ns; + unsigned int nks_each_thread = nks_total / mympi->nprocs; + unsigned int nrem = nks_total - nks_each_thread * mympi->nprocs; if (nrem > 0) { memory->allocate(damping3, (nks_each_thread + 1) * mympi->nprocs, ntemp); @@ -83,7 +114,7 @@ void Conductivity::setup_kappa() vks_job.clear(); - for (i = 0; i < kpoint->nk_reduced; ++i) { + for (i = 0; i < kpoint->nk_irred; ++i) { for (j = 0; j < ns; ++j) { vks_job.insert(i * ns + j); } @@ -94,11 +125,9 @@ void Conductivity::prepare_restart() { // Write phonon frequency to result file - int ik, is; int i; - std::set::iterator it_set; std::string line_tmp; - unsigned int nk_tmp, ns_tmp, nks_tmp; + unsigned int nk_tmp, ns_tmp; unsigned int multiplicity; int nks_done, *arr_done; @@ -115,11 +144,12 @@ void Conductivity::prepare_restart() writes->fs_result << "##Phonon Frequency" << std::endl; writes->fs_result << "#K-point (irreducible), Branch, Omega (cm^-1)" << std::endl; - for (i = 0; i < kpoint->nk_reduced; ++i) { - ik = kpoint->kpoint_irred_all[i][0].knum; - for (is = 0; is < dynamical->neval; ++is) { + for (i = 0; i < kpoint->nk_irred; ++i) { + int ik = kpoint->kpoint_irred_all[i][0].knum; + for (int is = 0; is < dynamical->neval; ++is) { writes->fs_result << std::setw(6) << i + 1 << std::setw(6) << is + 1; - writes->fs_result << std::setw(15) << writes->in_kayser(dynamical->eval_phonon[ik][is]) << std::endl; + writes->fs_result << std::setw(15) << writes->in_kayser(dynamical->eval_phonon[ik][is]) << std:: + endl; } } @@ -135,7 +165,7 @@ void Conductivity::prepare_restart() writes->fs_result >> nk_tmp >> ns_tmp; writes->fs_result >> multiplicity; - nks_tmp = (nk_tmp - 1) * ns + ns_tmp - 1; + unsigned int nks_tmp = (nk_tmp - 1) * ns + ns_tmp - 1; for (i = 0; i < multiplicity; ++i) { writes->fs_result >> vel_dummy[0] >> vel_dummy[1] >> vel_dummy[2]; @@ -154,68 +184,54 @@ void Conductivity::prepare_restart() writes->fs_result.open(writes->file_result.c_str(), std::ios::app | std::ios::out); } - // Add vks_done list here if (mympi->my_rank == 0) { nks_done = vks_done.size(); } MPI_Bcast(&nks_done, 1, MPI_INT, 0, MPI_COMM_WORLD); - memory->allocate(arr_done, nks_done); + nshift_restart = nks_done; - if (mympi->my_rank == 0) { - for (i = 0; i < nks_done; ++i) { - arr_done[i] = vks_done[i]; - } - } - MPI_Bcast(arr_done, nks_done, MPI_INT, 0, MPI_COMM_WORLD); + if (nks_done > 0) { + memory->allocate(arr_done, nks_done); - nshift_restart = nks_done; + if (mympi->my_rank == 0) { + for (i = 0; i < nks_done; ++i) { + arr_done[i] = vks_done[i]; + } + } + MPI_Bcast(&arr_done[0], nks_done, MPI_INT, 0, MPI_COMM_WORLD); - // Remove vks_done elements from vks_job + // Remove vks_done elements from vks_job - for (i = 0; i < nks_done; ++i) { + for (i = 0; i < nks_done; ++i) { - it_set = vks_job.find(arr_done[i]); + std::set::iterator it_set = vks_job.find(arr_done[i]); - if (it_set == vks_job.end()) { - error->exit("prepare_restart", "This cannot happen"); - } else { - vks_job.erase(it_set); + if (it_set == vks_job.end()) { + std::cout << " rank = " << mympi->my_rank + << " arr_done = " << arr_done[i] << std::endl; + error->exit("prepare_restart", "This cannot happen"); + } else { + vks_job.erase(it_set); + } } + memory->deallocate(arr_done); } - - memory->deallocate(arr_done); vks_done.clear(); } -void Conductivity::finish_kappa() -{ - if (mympi->my_rank == 0) { - memory->deallocate(vel); - memory->deallocate(kappa); - if (calc_kappa_spec) { - memory->deallocate(kappa_spec); - } - } - memory->deallocate(damping3); - memory->deallocate(Temperature); -} void Conductivity::calc_anharmonic_imagself() { - unsigned int nks_g; - unsigned int i, j; - unsigned int knum, snum; + unsigned int i; unsigned int *nks_thread; - int iks; - double omega; double *damping3_loc; // Distribute (k,s) to individual MPI threads - nks_g = vks_job.size(); + unsigned int nks_g = vks_job.size(); vks_l.clear(); unsigned int icount = 0; @@ -266,23 +282,33 @@ void Conductivity::calc_anharmonic_imagself() for (i = 0; i < nk_tmp; ++i) { - iks = vks_l[i]; + int iks = vks_l[i]; if (iks == -1) { - for (j = 0; j < ntemp; ++j) damping3_loc[j] = eps; // do nothing + for (unsigned int j = 0; j < ntemp; ++j) damping3_loc[j] = eps; // do nothing } else { - knum = kpoint->kpoint_irred_all[iks / ns][0].knum; - snum = iks % ns; + unsigned int knum = kpoint->kpoint_irred_all[iks / ns][0].knum; + unsigned int snum = iks % ns; - omega = dynamical->eval_phonon[knum][snum]; + double omega = dynamical->eval_phonon[knum][snum]; if (integration->ismear == 0 || integration->ismear == 1) { - relaxation->calc_damping_smearing(ntemp, Temperature, omega, iks / ns, snum, damping3_loc); + anharmonic_core->calc_damping_smearing(ntemp, + Temperature, + omega, + iks / ns, + snum, + damping3_loc); } else if (integration->ismear == -1) { - relaxation->calc_damping_tetrahedron(ntemp, Temperature, omega, iks / ns, snum, damping3_loc); + anharmonic_core->calc_damping_tetrahedron(ntemp, + Temperature, + omega, + iks / ns, + snum, + damping3_loc); } } @@ -299,28 +325,28 @@ void Conductivity::calc_anharmonic_imagself() memory->deallocate(damping3_loc); } -void Conductivity::write_result_gamma(const unsigned int ik, const unsigned int nshift, - double ***vel_in, double **damp_in) +void Conductivity::write_result_gamma(const unsigned int ik, + const unsigned int nshift, + double ***vel_in, + double **damp_in) const { unsigned int np = mympi->nprocs; - unsigned int j, k, iks_g; - unsigned int nk_equiv; - unsigned int ktmp; + unsigned int k; - for (j = 0; j < np; ++j) { + for (unsigned int j = 0; j < np; ++j) { - iks_g = ik * np + j + nshift; + unsigned int iks_g = ik * np + j + nshift; - if (iks_g >= kpoint->nk_reduced * ns) break; + if (iks_g >= kpoint->nk_irred * ns) break; writes->fs_result << "#GAMMA_EACH" << std::endl; writes->fs_result << iks_g / ns + 1 << " " << iks_g % ns + 1 << std::endl; - nk_equiv = kpoint->kpoint_irred_all[iks_g / ns].size(); + unsigned int nk_equiv = kpoint->kpoint_irred_all[iks_g / ns].size(); writes->fs_result << nk_equiv << std::endl; for (k = 0; k < nk_equiv; ++k) { - ktmp = kpoint->kpoint_irred_all[iks_g / ns][k].knum; + unsigned int ktmp = kpoint->kpoint_irred_all[iks_g / ns][k].knum; writes->fs_result << std::setw(15) << vel_in[ktmp][iks_g % ns][0]; writes->fs_result << std::setw(15) << vel_in[ktmp][iks_g % ns][1]; writes->fs_result << std::setw(15) << vel_in[ktmp][iks_g % ns][2] << std::endl; @@ -336,38 +362,32 @@ void Conductivity::write_result_gamma(const unsigned int ik, const unsigned int void Conductivity::compute_kappa() { - unsigned int i, j, k; + unsigned int i; unsigned int ik, is; unsigned int iks; - unsigned int knum, snum; - double omega; - unsigned int nk_equiv; - unsigned int ktmp; double factor_toSI = 1.0e+18 / (std::pow(Bohr_in_Angstrom, 3) * system->volume_p); if (mympi->my_rank == 0) { std::string file_kl; std::ofstream ofs_kl; - double vv_tmp; double damp_tmp; - int ieq; double **lifetime; double ****kappa_mode; - memory->allocate(lifetime, kpoint->nk_reduced * ns, ntemp); - memory->allocate(kappa_mode, ntemp, 9, ns, kpoint->nk_reduced); + memory->allocate(lifetime, kpoint->nk_irred * ns, ntemp); + memory->allocate(kappa_mode, ntemp, 9, ns, kpoint->nk_irred); - average_self_energy_at_degenerate_point(kpoint->nk_reduced * ns, ntemp, damping3); + average_self_energy_at_degenerate_point(kpoint->nk_irred * ns, ntemp, damping3); if (isotope->include_isotope) { - for (iks = 0; iks < kpoint->nk_reduced * ns; ++iks) { - snum = iks % ns; - if (relaxation->is_imaginary[iks / ns][snum]) { + for (iks = 0; iks < kpoint->nk_irred * ns; ++iks) { + unsigned int snum = iks % ns; + if (dynamical->is_imaginary[iks / ns][snum]) { for (i = 0; i < ntemp; ++i) { - lifetime[iks][i] = 0.0;; + lifetime[iks][i] = 0.0; } } else { for (i = 0; i < ntemp; ++i) { @@ -381,9 +401,9 @@ void Conductivity::compute_kappa() } } } else { - for (iks = 0; iks < kpoint->nk_reduced * ns; ++iks) { + for (iks = 0; iks < kpoint->nk_irred * ns; ++iks) { - if (relaxation->is_imaginary[iks / ns][iks % ns]) { + if (dynamical->is_imaginary[iks / ns][iks % ns]) { for (i = 0; i < ntemp; ++i) { lifetime[iks][i] = 0.0; } @@ -403,32 +423,33 @@ void Conductivity::compute_kappa() memory->allocate(kappa, ntemp, 3, 3); for (i = 0; i < ntemp; ++i) { - for (j = 0; j < 3; ++j) { - for (k = 0; k < 3; ++k) { + for (unsigned int j = 0; j < 3; ++j) { + for (unsigned int k = 0; k < 3; ++k) { if (Temperature[i] < eps) { // Set kappa as zero when T = 0. for (is = 0; is < ns; ++is) { - for (ik = 0; ik < kpoint->nk_reduced; ++ik) { + for (ik = 0; ik < kpoint->nk_irred; ++ik) { kappa_mode[i][3 * j + k][is][ik] = 0.0; } } } else { for (is = 0; is < ns; ++is) { - for (ik = 0; ik < kpoint->nk_reduced; ++ik) { - knum = kpoint->kpoint_irred_all[ik][0].knum; - omega = dynamical->eval_phonon[knum][is]; - vv_tmp = 0.0; - nk_equiv = kpoint->kpoint_irred_all[ik].size(); + for (ik = 0; ik < kpoint->nk_irred; ++ik) { + unsigned int knum = kpoint->kpoint_irred_all[ik][0].knum; + double omega = dynamical->eval_phonon[knum][is]; + double vv_tmp = 0.0; + unsigned int nk_equiv = kpoint->kpoint_irred_all[ik].size(); // Accumulate group velocity (diad product) for the reducible k points - for (ieq = 0; ieq < nk_equiv; ++ieq) { - ktmp = kpoint->kpoint_irred_all[ik][ieq].knum; + for (int ieq = 0; ieq < nk_equiv; ++ieq) { + unsigned int ktmp = kpoint->kpoint_irred_all[ik][ieq].knum; vv_tmp += vel[ktmp][is][j] * vel[ktmp][is][k]; } if (thermodynamics->classical) { - kappa_mode[i][3 * j + k][is][ik] = thermodynamics->Cv_classical(omega, Temperature[i]) + kappa_mode[i][3 * j + k][is][ik] = thermodynamics->Cv_classical( + omega, Temperature[i]) * vv_tmp * lifetime[ns * ik + is][i]; } else { kappa_mode[i][3 * j + k][is][ik] = thermodynamics->Cv(omega, Temperature[i]) @@ -446,7 +467,7 @@ void Conductivity::compute_kappa() kappa[i][j][k] = 0.0; for (is = 0; is < ns; ++is) { - for (ik = 0; ik < kpoint->nk_reduced; ++ik) { + for (ik = 0; ik < kpoint->nk_irred; ++ik) { kappa[i][j][k] += kappa_mode[i][3 * j + k][is][ik]; } } @@ -467,37 +488,34 @@ void Conductivity::compute_kappa() void Conductivity::average_self_energy_at_degenerate_point(const int n, const int m, - double **damping) + double **damping) const { - int i, j, k, l; - int nkr = kpoint->nk_reduced; - int ik; + int j, k, l; + int nkr = kpoint->nk_irred; double *eval_tmp; - double omega_now, omega_prev; double tol_omega = 1.0e-7; // Approximately equal to 0.01 cm^{-1} std::vector degeneracy_at_k; memory->allocate(eval_tmp, ns); - int ideg, is; double *damping_sum; memory->allocate(damping_sum, m); - for (i = 0; i < nkr; ++i) { - ik = kpoint->kpoint_irred_all[i][0].knum; + for (int i = 0; i < nkr; ++i) { + int ik = kpoint->kpoint_irred_all[i][0].knum; for (j = 0; j < ns; ++j) eval_tmp[j] = dynamical->eval_phonon[ik][j]; degeneracy_at_k.clear(); - omega_prev = eval_tmp[0]; - ideg = 1; + double omega_prev = eval_tmp[0]; + int ideg = 1; for (j = 1; j < ns; ++j) { - omega_now = eval_tmp[j]; + double omega_now = eval_tmp[j]; if (std::abs(omega_now - omega_prev) < tol_omega) { ++ideg; @@ -509,7 +527,7 @@ void Conductivity::average_self_energy_at_degenerate_point(const int n, } degeneracy_at_k.push_back(ideg); - is = 0; + int is = 0; for (j = 0; j < degeneracy_at_k.size(); ++j) { ideg = degeneracy_at_k[j]; @@ -565,7 +583,6 @@ void Conductivity::compute_frequency_resolved_kappa(const int ntemp, #endif { int k; - int ik, is; int knum; double *weight; memory->allocate(weight, nk); @@ -581,7 +598,7 @@ void Conductivity::compute_frequency_resolved_kappa(const int ntemp, } } - for (is = 0; is < ns; ++is) { + for (int is = 0; is < ns; ++is) { if (smearing_method == -1) { integration->calc_weight_tetrahedron(nk, kmap_identity, weight, eval[is], dos->energy_dos[i]); @@ -593,7 +610,7 @@ void Conductivity::compute_frequency_resolved_kappa(const int ntemp, for (j = 0; j < ntemp; ++j) { for (k = 0; k < 3; ++k) { - for (ik = 0; ik < kpoint->nk_reduced; ++ik) { + for (int ik = 0; ik < kpoint->nk_irred; ++ik) { knum = kpoint->kpoint_irred_all[ik][0].knum; kappa_spec[i][j][k] += kappa_mode[j][3 * k + k][is][ik] * weight[knum]; } diff --git a/anphon/conductivity.h b/anphon/conductivity.h index c5d5307b..cf1eb617 100644 --- a/anphon/conductivity.h +++ b/anphon/conductivity.h @@ -16,16 +16,17 @@ namespace PHON_NS { - class Conductivity: protected Pointers + class Conductivity : protected Pointers { public: Conductivity(class PHON *); + ~Conductivity(); + void setup_kappa(); void prepare_restart(); void calc_anharmonic_imagself(); void compute_kappa(); - void finish_kappa(); int calc_kappa_spec; unsigned int ntemp; @@ -35,21 +36,26 @@ namespace PHON_NS double *Temperature; private: + void set_default_variables(); + void deallocate_variables(); + double ***vel; unsigned int nk, ns; int nshift_restart; std::vector vks, vks_l, vks_done; std::set vks_job; - void write_result_gamma(const unsigned int, - const unsigned int, + void write_result_gamma(unsigned int, + unsigned int, double ***, - double **); - void average_self_energy_at_degenerate_point(const int, - const int, - double **); - void compute_frequency_resolved_kappa(const int, + double **) const; + + void average_self_energy_at_degenerate_point(int, + int, + double **) const; + + void compute_frequency_resolved_kappa(int, double ****, - const int); + int); }; } diff --git a/anphon/dynamical.cpp b/anphon/dynamical.cpp index 4699634f..49fa2e27 100644 --- a/anphon/dynamical.cpp +++ b/anphon/dynamical.cpp @@ -9,25 +9,25 @@ */ #include "mpi_common.h" +#include "constants.h" #include "dynamical.h" +#include "error.h" +#include "ewald.h" #include "system.h" #include "memory.h" #include "kpoint.h" -#include "fcs_phonon.h" -#include -#include -#include "constants.h" -#include "fcs_phonon.h" -#include -#include #include "timer.h" -#include "error.h" #include "symmetry_core.h" #include "mathfunctions.h" +#include "fcs_phonon.h" #include "write_phonons.h" -#include "phonon_dos.h" -#include "gruneisen.h" -#include "ewald.h" +#include +#include +#include +#include +#include +#include +#include #include @@ -35,22 +35,71 @@ using namespace PHON_NS; Dynamical::Dynamical(PHON *phon): Pointers(phon) { - index_bconnect = nullptr; - symmetrize_borncharge = 0; + set_default_variables(); } Dynamical::~Dynamical() { + deallocate_variables(); } -void Dynamical::setup_dynamical(std::string mode) +void Dynamical::set_default_variables() { - int i; - int ix, iy, iz; - int icell = 0; + neval = 0; + eigenvectors = true; + print_eigenvectors = false; + symmetrize_borncharge = 0; + nonanalytic = 0; + participation_ratio = false; + band_connection = 0; + na_sigma = 0.0; + file_born = ""; + UPLO = 'U'; + + eval_phonon = nullptr; + evec_phonon = nullptr; + index_bconnect = nullptr; + borncharge = nullptr; + + is_imaginary = nullptr; + + xshift_s = nullptr; + dymat = nullptr; + mindist_list = nullptr; +} + +void Dynamical::deallocate_variables() +{ + if (eval_phonon) { + memory->deallocate(eval_phonon); + } + if (evec_phonon) { + memory->deallocate(evec_phonon); + } + if (index_bconnect) { + memory->deallocate(index_bconnect); + } + if (borncharge) { + memory->deallocate(borncharge); + } + if (is_imaginary) { + memory->deallocate(is_imaginary); + } + if (xshift_s) { + memory->deallocate(xshift_s); + } + if (dymat) { + memory->deallocate(dymat); + } + if (mindist_list) { + memory->deallocate(mindist_list); + } +} + +void Dynamical::setup_dynamical(std::string mode) +{ neval = 3 * system->natmin; - UPLO = 'U'; if (mympi->my_rank == 0) { std::cout << std::endl; @@ -71,8 +120,6 @@ void Dynamical::setup_dynamical(std::string mode) std::cout << " NONANALYTIC = 2 : Non-analytic part of the dynamical matrix will be included " << std::endl; std::cout << " by the mixed-space approach." << std::endl; std::cout << std::endl; - //} - // Inserted } else if (nonanalytic == 3) { std::cout << std::endl; std::cout << " NONANALYTIC = 3 : Non-analytic part of the dynamical matrix will be included " << std::endl; @@ -83,11 +130,12 @@ void Dynamical::setup_dynamical(std::string mode) memory->allocate(xshift_s, 27, 3); - for (i = 0; i < 3; ++i) xshift_s[0][i] = 0.0; + for (int i = 0; i < 3; ++i) xshift_s[0][i] = 0.0; + int icell = 0; - for (ix = -1; ix <= 1; ++ix) { - for (iy = -1; iy <= 1; ++iy) { - for (iz = -1; iz <= 1; ++iz) { + for (int ix = -1; ix <= 1; ++ix) { + for (int iy = -1; iy <= 1; ++iy) { + for (int iz = -1; iz <= 1; ++iz) { if (ix == 0 && iy == 0 && iz == 0) continue; ++icell; @@ -99,21 +147,7 @@ void Dynamical::setup_dynamical(std::string mode) } } - if (mympi->my_rank == 0) { - eigenvectors = true; - - /* - if (phon->mode == "RTA" || phon->mode == "SCPH") { - eigenvectors = true; - } else { - if (print_eigenvectors || writes->print_msd || writes->print_xsf || writes->print_anime - || dos->projected_dos || gruneisen->print_gruneisen || dynamical->participation_ratio) { - eigenvectors = true; - } - } - */ - } - + if (mympi->my_rank == 0) eigenvectors = true; MPI_Bcast(&eigenvectors, 1, MPI_LOGICAL, 0, MPI_COMM_WORLD); MPI_Bcast(&nonanalytic, 1, MPI_UNSIGNED, 0, MPI_COMM_WORLD); @@ -140,38 +174,15 @@ void Dynamical::setup_dynamical(std::string mode) } -void PHON_NS::Dynamical::finish_dynamical() -{ - memory->deallocate(xshift_s); - - if (kpoint->kpoint_mode < 3) { - memory->deallocate(evec_phonon); - memory->deallocate(eval_phonon); - } - - if (nonanalytic) { - memory->deallocate(borncharge); - } - - if (index_bconnect) { - memory->deallocate(index_bconnect); - } -} - - -void Dynamical::prepare_mindist_list(std::vector **mindist_out) +void Dynamical::prepare_mindist_list(std::vector **mindist_out) const { unsigned int i, j; - unsigned int icell; unsigned int nneib = 27; - double dist_tmp; double ***xcrd; - unsigned int iat; - unsigned int nat = system->nat; - unsigned int natmin = system->natmin; - int isize, jsize, ksize; + auto nat = system->nat; + auto natmin = system->natmin; std::vector **distall; @@ -183,10 +194,10 @@ void Dynamical::prepare_mindist_list(std::vector **mindist_out) xcrd[0][i][j] = system->xr_s[i][j]; } } - icell = 0; - for (isize = -1; isize <= 1; ++isize) { - for (jsize = -1; jsize <= 1; ++jsize) { - for (ksize = -1; ksize <= 1; ++ksize) { + auto icell = 0; + for (int isize = -1; isize <= 1; ++isize) { + for (int jsize = -1; jsize <= 1; ++jsize) { + for (int ksize = -1; ksize <= 1; ++ksize) { if (isize == 0 && jsize == 0 && ksize == 0) continue; @@ -207,13 +218,13 @@ void Dynamical::prepare_mindist_list(std::vector **mindist_out) } for (i = 0; i < natmin; ++i) { - iat = system->map_p2s[i][0]; + unsigned int iat = system->map_p2s[i][0]; for (j = 0; j < nat; ++j) { distall[i][j].clear(); for (icell = 0; icell < nneib; ++icell) { - dist_tmp = distance(xcrd[0][iat], xcrd[icell][j]); - distall[i][j].push_back(DistWithCell(icell, dist_tmp)); + double dist_tmp = distance(xcrd[0][iat], xcrd[icell][j]); + distall[i][j].emplace_back(icell, dist_tmp); } std::sort(distall[i][j].begin(), distall[i][j].end()); } @@ -221,13 +232,12 @@ void Dynamical::prepare_mindist_list(std::vector **mindist_out) // Construct pairs of minimum distance. - double dist_min; for (i = 0; i < natmin; ++i) { for (j = 0; j < nat; ++j) { mindist_out[i][j].clear(); - dist_min = distall[i][j][0].dist; - for (auto it = distall[i][j].cbegin(); it != distall[i][j].cend(); ++it) { + double dist_min = distall[i][j][0].dist; + for (auto it = distall[i][j].begin(); it != distall[i][j].end(); ++it) { if (std::abs((*it).dist - dist_min) < 1.0e-3) { mindist_out[i][j].push_back((*it).cell); } @@ -240,7 +250,8 @@ void Dynamical::prepare_mindist_list(std::vector **mindist_out) } -double Dynamical::distance(double *x1, double *x2) +double Dynamical::distance(double *x1, + double *x2) const { return std::sqrt(std::pow(x1[0] - x2[0], 2) + std::pow(x1[1] - x2[1], 2) @@ -248,8 +259,12 @@ double Dynamical::distance(double *x1, double *x2) } -void Dynamical::eval_k(double *xk_in, double *kvec_in, std::vector fc2_ext, - double *eval_out, std::complex **evec_out, bool require_evec) +void Dynamical::eval_k(double *xk_in, + double *kvec_in, + std::vector fc2_ext, + double *eval_out, + std::complex **evec_out, + bool require_evec) { // Calculate phonon energy for the specific k-point given in fractional basis @@ -271,7 +286,7 @@ void Dynamical::eval_k(double *xk_in, double *kvec_in, std::vector *WORK; - LWORK = (2 * neval - 1) * 10; + int LWORK = (2 * neval - 1) * 10; memory->allocate(RWORK, 3 * neval - 2); memory->allocate(WORK, LWORK); @@ -345,8 +360,12 @@ void Dynamical::eval_k(double *xk_in, double *kvec_in, std::vector fc2_in, - double *eval_out, std::complex **evec_out, const bool require_evec, const int ik) +void Dynamical::eval_k_ewald(double *xk_in, + double *kvec_in, + std::vector fc2_in, + double *eval_out, + std::complex **evec_out, + const bool require_evec) const { // // Calculate phonon energy for the specific k-point given in fractional basis @@ -354,7 +373,6 @@ void Dynamical::eval_k_ewald(double *xk_in, double *kvec_in, std::vector **dymat_k, **mat_longrange; memory->allocate(dymat_k, neval, neval); @@ -363,7 +381,7 @@ void Dynamical::eval_k_ewald(double *xk_in, double *kvec_in, std::vectoradd_longrange_matrix(xk_in, mat_longrange, ik); + ewald->add_longrange_matrix(xk_in, kvec_in, mat_longrange); // Add calculated dynamical matrix of Coulomb parts for (i = 0; i < system->natmin; ++i) { @@ -378,16 +396,13 @@ void Dynamical::eval_k_ewald(double *xk_in, double *kvec_in, std::vector check; for (i = 0; i < system->natmin; ++i) { for (icrd = 0; icrd < 3; ++icrd) { for (jcrd = 0; jcrd < 3; ++jcrd) { - check = std::complex(0.0, 0.0); - count = 0; + std::complex check = std::complex(0.0, 0.0); + int count = 0; for (j = 0; j < system->natmin; ++j) { - mass = system->mass[system->map_p2s[i][0]] * system->mass[system->map_p2s[j][0]]; + double mass = system->mass[system->map_p2s[i][0]] * system->mass[system->map_p2s[j][0]]; check += std::sqrt(mass) * dymat_k[3 * i + icrd][3 * j + jcrd]; count += 1; } @@ -402,11 +417,11 @@ void Dynamical::eval_k_ewald(double *xk_in, double *kvec_in, std::vector *WORK; - LWORK = (2 * neval - 1) * 10; + int LWORK = (2 * neval - 1) * 10; memory->allocate(RWORK, 3 * neval - 2); memory->allocate(WORK, LWORK); @@ -450,39 +465,34 @@ void Dynamical::eval_k_ewald(double *xk_in, double *kvec_in, std::vector fc2_in, - std::complex **dymat_out) + const std::vector &fc2_in, + std::complex **dymat_out) const { - int i, j; - unsigned int atm1_s, atm2_s; - unsigned int atm1_p, atm2_p; - unsigned int xyz1, xyz2; - unsigned int icell; + int i; - int nmode = 3 * system->natmin; + auto nmode = 3 * system->natmin; double vec[3]; - double phase; std::complex im(0.0, 1.0); std::complex **ctmp; memory->allocate(ctmp, nmode, nmode); for (i = 0; i < nmode; ++i) { - for (j = 0; j < nmode; ++j) { + for (int j = 0; j < nmode; ++j) { dymat_out[i][j] = std::complex(0.0, 0.0); } } - for (auto it = fc2_in.cbegin(); it != fc2_in.cend(); ++it) { + for (const auto &it : fc2_in) { - atm1_p = (*it).atm1; - atm2_s = (*it).atm2; - xyz1 = (*it).xyz1; - xyz2 = (*it).xyz2; - icell = (*it).cell_s; + unsigned int atm1_p = it.atm1; + unsigned int atm2_s = it.atm2; + unsigned int xyz1 = it.xyz1; + unsigned int xyz2 = it.xyz2; + unsigned int icell = it.cell_s; - atm1_s = system->map_p2s[atm1_p][0]; - atm2_p = system->map_s2p[atm2_s].atom_num; + unsigned int atm1_s = system->map_p2s[atm1_p][0]; + unsigned int atm2_p = system->map_s2p[atm2_s].atom_num; for (i = 0; i < 3; ++i) { vec[i] = system->xr_s[atm2_s][i] + xshift_s[icell][i] @@ -492,10 +502,10 @@ void Dynamical::calc_analytic_k(double *xk_in, rotvec(vec, vec, system->lavec_s); rotvec(vec, vec, system->rlavec_p); - phase = vec[0] * xk_in[0] + vec[1] * xk_in[1] + vec[2] * xk_in[2]; + double phase = vec[0] * xk_in[0] + vec[1] * xk_in[1] + vec[2] * xk_in[2]; dymat_out[3 * atm1_p + xyz1][3 * atm2_p + xyz2] - += (*it).fcs_val * std::exp(im * phase) / std::sqrt(system->mass[atm1_s] * system->mass[atm2_s]); + += it.fcs_val * std::exp(im * phase) / std::sqrt(system->mass[atm1_s] * system->mass[atm2_s]); } } @@ -509,14 +519,11 @@ void Dynamical::calc_nonanalytic_k(double *xk_in, unsigned int i, j; unsigned int iat, jat; - unsigned int atm_p1, atm_p2; unsigned int natmin = system->natmin; double kepsilon[3]; double kz1[3], kz2[3]; - double denom, norm2; double born_tmp[3][3]; double xk_tmp[3], xdiff[3]; - double factor, phase; std::complex im(0.0, 1.0); @@ -527,14 +534,14 @@ void Dynamical::calc_nonanalytic_k(double *xk_in, } rotvec(kepsilon, kvec_na_in, dielec); - denom = kvec_na_in[0] * kepsilon[0] + double denom = kvec_na_in[0] * kepsilon[0] + kvec_na_in[1] * kepsilon[1] + kvec_na_in[2] * kepsilon[2]; if (denom > eps) { for (iat = 0; iat < natmin; ++iat) { - atm_p1 = system->map_p2s[iat][0]; + unsigned int atm_p1 = system->map_p2s[iat][0]; for (i = 0; i < 3; ++i) { for (j = 0; j < 3; ++j) { @@ -545,7 +552,7 @@ void Dynamical::calc_nonanalytic_k(double *xk_in, rotvec(kz1, kvec_na_in, born_tmp, 'T'); for (jat = 0; jat < natmin; ++jat) { - atm_p2 = system->map_p2s[jat][0]; + unsigned int atm_p2 = system->map_p2s[jat][0]; for (i = 0; i < 3; ++i) { @@ -569,9 +576,9 @@ void Dynamical::calc_nonanalytic_k(double *xk_in, } rotvec(xk_tmp, xk_in, system->rlavec_p, 'T'); - norm2 = xk_tmp[0] * xk_tmp[0] + xk_tmp[1] * xk_tmp[1] + xk_tmp[2] * xk_tmp[2]; + double norm2 = xk_tmp[0] * xk_tmp[0] + xk_tmp[1] * xk_tmp[1] + xk_tmp[2] * xk_tmp[2]; - factor = 8.0 * pi / system->volume_p * std::exp(-norm2 / std::pow(na_sigma, 2)); + double factor = 8.0 * pi / system->volume_p * std::exp(-norm2 / std::pow(na_sigma, 2)); for (i = 0; i < neval; ++i) { for (j = 0; j < neval; ++j) { @@ -592,7 +599,7 @@ void Dynamical::calc_nonanalytic_k(double *xk_in, rotvec(xdiff, xdiff, system->lavec_s); rotvec(xdiff, xdiff, system->rlavec_p); - phase = xk_in[0] * xdiff[0] + xk_in[1] * xdiff[1] + xk_in[2] * xdiff[2]; + double phase = xk_in[0] * xdiff[0] + xk_in[1] * xdiff[1] + xk_in[2] * xdiff[2]; for (i = 0; i < 3; ++i) { for (j = 0; j < 3; ++j) { @@ -604,26 +611,20 @@ void Dynamical::calc_nonanalytic_k(double *xk_in, } -void Dynamical::calc_nonanalytic_k2(double *xk_in, double *kvec_na_in, - std::vector fc2_in, +void Dynamical::calc_nonanalytic_k2(double *xk_in, + double *kvec_na_in, std::complex **dymat_na_out) { // Calculate the non-analytic part of dynamical matrices // by the mixed-space approach. - unsigned int i, j, k; - unsigned int iat, jat; - unsigned int atm_p1, atm_p2, atm_s2; + unsigned int i, j; unsigned int natmin = system->natmin; - unsigned int cell; double kepsilon[3]; double kz1[3], kz2[3]; - double denom; double born_tmp[3][3]; double vec[3]; - double factor, phase; std::complex im(0.0, 1.0); - std::complex exp_phase, exp_phase_tmp; for (i = 0; i < neval; ++i) { @@ -633,14 +634,14 @@ void Dynamical::calc_nonanalytic_k2(double *xk_in, double *kvec_na_in, } rotvec(kepsilon, kvec_na_in, dielec); - denom = kvec_na_in[0] * kepsilon[0] + double denom = kvec_na_in[0] * kepsilon[0] + kvec_na_in[1] * kepsilon[1] + kvec_na_in[2] * kepsilon[2]; if (denom > eps) { - for (iat = 0; iat < natmin; ++iat) { - atm_p1 = system->map_p2s[iat][0]; + for (unsigned int iat = 0; iat < natmin; ++iat) { + unsigned int atm_p1 = system->map_p2s[iat][0]; for (i = 0; i < 3; ++i) { for (j = 0; j < 3; ++j) { @@ -650,8 +651,8 @@ void Dynamical::calc_nonanalytic_k2(double *xk_in, double *kvec_na_in, rotvec(kz1, kvec_na_in, born_tmp, 'T'); - for (jat = 0; jat < natmin; ++jat) { - atm_p2 = system->map_p2s[jat][0]; + for (unsigned int jat = 0; jat < natmin; ++jat) { + unsigned int atm_p2 = system->map_p2s[jat][0]; for (i = 0; i < 3; ++i) { @@ -662,19 +663,19 @@ void Dynamical::calc_nonanalytic_k2(double *xk_in, double *kvec_na_in, rotvec(kz2, kvec_na_in, born_tmp, 'T'); - exp_phase = std::complex(0.0, 0.0); + std::complex exp_phase = std::complex(0.0, 0.0); for (i = 0; i < system->ntran; ++i) { - exp_phase_tmp = std::complex(0.0, 0.0); - atm_s2 = system->map_p2s[jat][i]; + std::complex exp_phase_tmp = std::complex(0.0, 0.0); + unsigned int atm_s2 = system->map_p2s[jat][i]; // Average over mirror atoms for (j = 0; j < mindist_list[iat][atm_s2].size(); ++j) { - cell = mindist_list[iat][atm_s2][j]; + unsigned int cell = mindist_list[iat][atm_s2][j]; - for (k = 0; k < 3; ++k) { + for (unsigned int k = 0; k < 3; ++k) { vec[k] = system->xr_s[system->map_p2s[jat][i]][k] + xshift_s[cell][k] - system->xr_s[atm_p2][k]; } @@ -682,7 +683,7 @@ void Dynamical::calc_nonanalytic_k2(double *xk_in, double *kvec_na_in, rotvec(vec, vec, system->lavec_s); rotvec(vec, vec, system->rlavec_p); - phase = vec[0] * xk_in[0] + vec[1] * xk_in[1] + vec[2] * xk_in[2]; + double phase = vec[0] * xk_in[0] + vec[1] * xk_in[1] + vec[2] * xk_in[2]; exp_phase_tmp += std::exp(im * phase); } @@ -701,7 +702,7 @@ void Dynamical::calc_nonanalytic_k2(double *xk_in, double *kvec_na_in, } } - factor = 8.0 * pi / system->volume_p; + double factor = 8.0 * pi / system->volume_p; for (i = 0; i < neval; ++i) { for (j = 0; j < neval; ++j) { @@ -713,8 +714,6 @@ void Dynamical::calc_nonanalytic_k2(double *xk_in, double *kvec_na_in, void Dynamical::diagonalize_dynamical_all() { - int ik; - unsigned int is; unsigned int nk = kpoint->nk; bool require_evec; @@ -733,18 +732,26 @@ void Dynamical::diagonalize_dynamical_all() // Calculate phonon eigenvalues and eigenvectors for all k-points #ifdef _OPENMP -#pragma omp parallel for private (is) +#pragma omp parallel for #endif - for (ik = 0; ik < nk; ++ik) { + for (int ik = 0; ik < nk; ++ik) { if (nonanalytic == 3) { - eval_k_ewald(kpoint->xk[ik], kpoint->kvec_na[ik], ewald->fc2_without_dipole, - eval_phonon[ik], evec_phonon[ik], require_evec, ik); + eval_k_ewald(kpoint->xk[ik], + kpoint->kvec_na[ik], + ewald->fc2_without_dipole, + eval_phonon[ik], + evec_phonon[ik], + require_evec); } else { - eval_k(kpoint->xk[ik], kpoint->kvec_na[ik], fcs_phonon->fc2_ext, - eval_phonon[ik], evec_phonon[ik], require_evec); + eval_k(kpoint->xk[ik], + kpoint->kvec_na[ik], + fcs_phonon->fc2_ext, + eval_phonon[ik], + evec_phonon[ik], + require_evec); } // Phonon energy is the square-root of the eigenvalue - for (is = 0; is < neval; ++is) { + for (unsigned int is = 0; is < neval; ++is) { eval_phonon[ik][is] = freq(eval_phonon[ik][is]); } } @@ -757,26 +764,29 @@ void Dynamical::diagonalize_dynamical_all() if (mympi->my_rank == 0) { std::cout << "done!" << std::endl; } + + if (kpoint->kpoint_mode == 2 && phon->mode == "RTA") { + detect_imaginary_branches(dynamical->eval_phonon); + } } -void Dynamical::modify_eigenvectors() +void Dynamical::modify_eigenvectors() const { bool *flag_done; unsigned int ik; - unsigned int is, js; - unsigned int nk_inv; + unsigned int js; std::complex *evec_tmp; - unsigned int nk = kpoint->nk; - unsigned int ns = neval; + auto nk = kpoint->nk; + auto ns = neval; - if (mympi->my_rank == 0) { - std::cout << " ********** NOTICE ********** " << std::endl; - std::cout << " For the brevity of the calculation, " << std::endl; - std::cout << " phonon eigenvectors will be modified" << std::endl; - std::cout << " so that e_{-ks}^{mu} = (e_{ks}^{mu})^{*}. " << std::endl; - } + /* if (mympi->my_rank == 0) { + std::cout << " ********** NOTICE ********** " << std::endl; + std::cout << " For the brevity of the calculation, " << std::endl; + std::cout << " phonon eigenvectors will be modified" << std::endl; + std::cout << " so that e_{-ks}^{mu} = (e_{ks}^{mu})^{*}. " << std::endl; + }*/ memory->allocate(flag_done, nk); memory->allocate(evec_tmp, ns); @@ -787,18 +797,15 @@ void Dynamical::modify_eigenvectors() if (!flag_done[ik]) { - nk_inv = kpoint->knum_minus[ik]; + unsigned int nk_inv = kpoint->knum_minus[ik]; - for (is = 0; is < ns; ++is) { + for (unsigned int is = 0; is < ns; ++is) { for (js = 0; js < ns; ++js) { evec_tmp[js] = evec_phonon[ik][is][js]; - // evec_tmp[js] = 0.5 * (std::conj(evec_phonon[ik][is][js]) + evec_phonon[nk_inv][is][js]); } for (js = 0; js < ns; ++js) { evec_phonon[nk_inv][is][js] = std::conj(evec_tmp[js]); - // evec_phonon[ik][is][js] = evec_tmp[js]; - // evec_phonon[nk_inv][is][js] = std::conj(evec_tmp[js]); } } @@ -811,10 +818,10 @@ void Dynamical::modify_eigenvectors() memory->deallocate(evec_tmp); MPI_Barrier(MPI_COMM_WORLD); - if (mympi->my_rank == 0) { - std::cout << " done !" << std::endl; - std::cout << " **************************************" << std::endl; - } + //if (mympi->my_rank == 0) { + // std::cout << " done !" << std::endl; + // std::cout << " **************************************" << std::endl; + //} } @@ -824,7 +831,6 @@ void Dynamical::load_born(const unsigned int flag_symmborn) unsigned int i, j, k; double sum_born[3][3]; - double res; std::ifstream ifs_born; ifs_born.open(file_born.c_str(), std::ios::in); @@ -883,7 +889,7 @@ void Dynamical::load_born(const unsigned int flag_symmborn) } } - res = 0.0; + double res = 0.0; for (i = 0; i < 3; ++i) { for (j = 0; j < 3; ++j) { res += std::pow(sum_born[i][j], 2); @@ -909,8 +915,7 @@ void Dynamical::load_born(const unsigned int flag_symmborn) // Symmetrize Born effective charges. Necessary to avoid the violation of ASR // particularly for NONANALYTIC=3 (Ewald summation). - int isym, iat, iat_sym; - int m; + int iat; double ***born_sym; double rot[3][3]; @@ -924,7 +929,7 @@ void Dynamical::load_born(const unsigned int flag_symmborn) } } - for (isym = 0; isym < symmetry->SymmListWithMap.size(); ++isym) { + for (int isym = 0; isym < symmetry->SymmListWithMap.size(); ++isym) { for (i = 0; i < 3; ++i) { for (j = 0; j < 3; ++j) { rot[i][j] = symmetry->SymmListWithMap[isym].rot[3 * i + j]; @@ -932,12 +937,12 @@ void Dynamical::load_born(const unsigned int flag_symmborn) } for (iat = 0; iat < system->natmin; ++iat) { - iat_sym = symmetry->SymmListWithMap[isym].mapping[iat]; + int iat_sym = symmetry->SymmListWithMap[isym].mapping[iat]; for (i = 0; i < 3; ++i) { for (j = 0; j < 3; ++j) { for (k = 0; k < 3; ++k) { - for (m = 0; m < 3; ++m) { + for (int m = 0; m < 3; ++m) { born_sym[iat_sym][i][j] += rot[i][k] * rot[j][m] * borncharge[iat][k][m]; } } @@ -999,13 +1004,13 @@ void Dynamical::load_born(const unsigned int flag_symmborn) } -double Dynamical::fold(double x) +double Dynamical::fold(const double x) const { return x - static_cast(nint(x)); } -double Dynamical::freq(const double x) +double Dynamical::freq(const double x) const { // Special treatment to avoid the divergence of computation. if (std::abs(x) < eps) return eps15; @@ -1018,26 +1023,23 @@ double Dynamical::freq(const double x) void Dynamical::calc_participation_ratio_all(std::complex ***evec, double **ret, - double ***ret_all) + double ***ret_all) const { - unsigned int ik, is; - unsigned int iat; - unsigned int nk = kpoint->nk; - unsigned int ns = dynamical->neval; - unsigned int natmin = system->natmin; + auto nk = kpoint->nk; + auto ns = dynamical->neval; + auto natmin = system->natmin; double *atomic_pr; - double sum; memory->allocate(atomic_pr, natmin); - for (ik = 0; ik < nk; ++ik) { - for (is = 0; is < ns; ++is) { + for (auto ik = 0; ik < nk; ++ik) { + for (auto is = 0; is < ns; ++is) { calc_atomic_participation_ratio(evec[ik][is], atomic_pr); - sum = 0.0; + double sum = 0.0; - for (iat = 0; iat < natmin; ++iat) { + for (auto iat = 0; iat < natmin; ++iat) { sum += atomic_pr[iat]; ret_all[ik][is][iat] = atomic_pr[iat]; } @@ -1050,11 +1052,11 @@ void Dynamical::calc_participation_ratio_all(std::complex ***evec, } -void Dynamical::calc_atomic_participation_ratio(std::complex *evec, double *ret) +void Dynamical::calc_atomic_participation_ratio(std::complex *evec, + double *ret) const { unsigned int iat; - unsigned int natmin = system->natmin; - double sum; + auto natmin = system->natmin; for (iat = 0; iat < natmin; ++iat) ret[iat] = 0.0; @@ -1064,7 +1066,7 @@ void Dynamical::calc_atomic_participation_ratio(std::complex *evec, doub + std::norm(evec[3 * iat + 2])) / system->mass[system->map_p2s[iat][0]]; } - sum = 0.0; + double sum = 0.0; for (iat = 0; iat < natmin; ++iat) sum += ret[iat] * ret[iat]; @@ -1074,12 +1076,11 @@ void Dynamical::calc_atomic_participation_ratio(std::complex *evec, doub void Dynamical::connect_band_by_eigen_similarity(std::complex ***evec, - int **index_sorted) + int **index_sorted) const { - int ik, is, js, ks; - unsigned int nk = kpoint->nk; - unsigned int ns = neval; - int loc; + int ik, is, js; + auto nk = kpoint->nk; + auto ns = neval; std::vector index; std::complex **evec_tmp; std::vector> abs_similarity; @@ -1117,12 +1118,12 @@ void Dynamical::connect_band_by_eigen_similarity(std::complex ***evec, } } else { #ifdef _OPENMP -#pragma omp parallel for private(js, ks, dprod) +#pragma omp parallel for private(js, dprod) #endif for (is = 0; is < ns; ++is) { for (js = 0; js < ns; ++js) { dprod = std::complex(0.0, 0.0); - for (ks = 0; ks < ns; ++ks) { + for (int ks = 0; ks < ns; ++ks) { dprod += std::conj(evec[ik][is][ks]) * evec_tmp[js][ks]; } abs_similarity[is][js] = std::abs(dprod); @@ -1137,11 +1138,13 @@ void Dynamical::connect_band_by_eigen_similarity(std::complex ***evec, // Argsort abs_similarity[is] (use C++11 lambda) iota(index.begin(), index.end(), 0); std::sort(index.begin(), index.end(), - [&abs_similarity, is](int i1, int i2) { + [&abs_similarity, is](int i1, + int i2) + { return abs_similarity[is][i1] > abs_similarity[is][i2]; }); - loc = index[0]; + int loc = index[0]; index_sorted[ik][loc] = is; found[loc] = 1; for (js = 0; js < ns; ++js) abs_similarity[js][loc] = -1.0; @@ -1158,3 +1161,66 @@ void Dynamical::connect_band_by_eigen_similarity(std::complex ***evec, } memory->deallocate(evec_tmp); } + + +void Dynamical::detect_imaginary_branches(double **eval) +{ + int ik, is; + auto nk = kpoint->nk; + auto ns = dynamical->neval; + auto nks = ns * nk; + int knum; + double omega; + + bool is_anyof_imaginary = false; + if (mympi->my_rank == 0) { + + memory->allocate(is_imaginary, kpoint->nk_irred, ns); + + for (ik = 0; ik < kpoint->nk_irred; ++ik) { + for (is = 0; is < ns; ++is) { + knum = kpoint->kpoint_irred_all[ik][0].knum; + omega = eval[knum][is]; + + if (omega < 0.0) { + is_imaginary[ik][is] = true; + is_anyof_imaginary = true; + } else { + is_imaginary[ik][is] = false; + } + } + } + + if (is_anyof_imaginary) { + int count = 0; + std::cout << std::endl; + std::cout << " WARNING: Imaginary frequency detected at the following branches:" << std::endl; + for (ik = 0; ik < kpoint->nk_irred; ++ik) { + for (is = 0; is < ns; ++is) { + if (is_imaginary[ik][is]) { + int ndup = kpoint->kpoint_irred_all[ik].size(); + count += ndup; + for (int i = 0; i < ndup; ++i) { + knum = kpoint->kpoint_irred_all[ik][i].knum; + omega = eval[knum][is]; + for (int j = 0; j < 3; ++j) { + std::cout << std::setw(15) << kpoint->xk[knum][j]; + } + std::cout << std::setw(4) << is + 1 << " :" + << std::setw(10) << std::fixed + << writes->in_kayser(omega) << " (cm^-1)" << std::endl; + std::cout << std::scientific; + } + } + } + } + std::cout << std::setw(5) << count << " imaginary branches out of " + << std::setw(5) << nks << " total branches." << std::endl; + std::cout << std::endl; + std::cout << " Phonon-phonon scattering rate and thermal conductivity involving these" << std::endl; + std::cout << " imaginary branches will be treated as zero in the following calculations." << std::endl; + std::cout << " If imaginary branches are acoustic phonons at Gamma point (0, 0, 0), " << std::endl; + std::cout << " you can safely ignore this message." << std::endl << std::endl << std::flush; + } + } +} diff --git a/anphon/dynamical.h b/anphon/dynamical.h index 9d84b345..95747036 100644 --- a/anphon/dynamical.h +++ b/anphon/dynamical.h @@ -26,11 +26,8 @@ namespace PHON_NS DistWithCell(); - DistWithCell(const int n, const double d) - { - cell = n; - dist = d; - } + DistWithCell(const int n, + const double d) : cell(n), dist(d) {}; }; inline bool operator<(const DistWithCell a, @@ -39,14 +36,12 @@ namespace PHON_NS return a.dist < b.dist; } - class Dynamical: protected Pointers + class Dynamical : protected Pointers { public: Dynamical(class PHON *); - ~Dynamical(); - void diagonalize_dynamical_all(); - void finish_dynamical(); + ~Dynamical(); unsigned int neval; bool eigenvectors; @@ -65,32 +60,45 @@ namespace PHON_NS double dielec[3][3]; double ***borncharge; + bool **is_imaginary; + + void diagonalize_dynamical_all(); void setup_dynamical(std::string); - void eval_k(double *, double *, + void eval_k(double *, + double *, std::vector, - double *, std::complex **, bool); - void modify_eigenvectors(); - void eval_k_ewald(double *, double *, + double *, + std::complex **, + bool); + + void modify_eigenvectors() const; + + void eval_k_ewald(double *, + double *, std::vector, - double *, std::complex **, bool, - const int); + double *, + std::complex **, + bool) const; - double fold(double); - double freq(const double); + double fold(const double) const; + double freq(const double) const; void calc_participation_ratio_all(std::complex ***, double **, - double ***); + double ***) const; void calc_analytic_k(double *, - std::vector, - std::complex **); - void calc_nonanalytic_k(double *, double *, + const std::vector &, + std::complex **) const; + + void calc_nonanalytic_k(double *, + double *, std::complex **); - void calc_nonanalytic_k2(double *, double *, - std::vector, + + void calc_nonanalytic_k2(double *, + double *, std::complex **); void calc_analytic_k_ewald(double *, @@ -98,16 +106,22 @@ namespace PHON_NS std::complex **); private: - + void set_default_variables(); + void deallocate_variables(); void load_born(const unsigned int); + void prepare_mindist_list(std::vector **) const; + + void calc_atomic_participation_ratio(std::complex *, + double *) const; - void prepare_mindist_list(std::vector **); - void calc_atomic_participation_ratio(std::complex *, double *); - double distance(double *, double *); - void connect_band_by_eigen_similarity(std::complex ***, int **); + double distance(double *, + double *) const; + + void connect_band_by_eigen_similarity(std::complex ***, + int **) const; + + void detect_imaginary_branches(double **); - // void calc_analytic_k(double *, double ****, std::complex **); - // void modify_eigenvectors_sym(); double **xshift_s; char UPLO; @@ -115,12 +129,30 @@ namespace PHON_NS std::vector **mindist_list; }; - extern "C" - { - void zheev_(const char *jobz, const char *uplo, int *n, std::complex *a, int *lda, - double *w, std::complex *work, int *lwork, double *rwork, int *info); - void zgemm_(const char *transa, const char *transb, int *m, int *n, int *k, - std::complex *alpha, std::complex *a, int *lda, std::complex *b, int *ldb, - std::complex *beta, std::complex *c, int *ldc); + extern "C" { + void zheev_(const char *jobz, + const char *uplo, + int *n, + std::complex *a, + int *lda, + double *w, + std::complex *work, + int *lwork, + double *rwork, + int *info); + + void zgemm_(const char *transa, + const char *transb, + int *m, + int *n, + int *k, + std::complex *alpha, + std::complex *a, + int *lda, + std::complex *b, + int *ldb, + std::complex *beta, + std::complex *c, + int *ldc); } } diff --git a/anphon/error.cpp b/anphon/error.cpp index ab4094d8..27e3a8f7 100644 --- a/anphon/error.cpp +++ b/anphon/error.cpp @@ -16,40 +16,43 @@ using namespace PHON_NS; -Error::Error(PHON *phon): Pointers(phon) -{ -} +Error::Error(PHON *phon): Pointers(phon) {} -Error::~Error() -{ -} +Error::~Error() {} -void Error::warn(const char *file, const char *message) +void Error::warn(const char *file, + const char *message) const { std::cout << "WARNING in " << file << " MESSAGE: " << message << std::endl; } -void Error::exit(const char *file, const char *message) +void Error::exit(const char *file, + const char *message) const { std::cout << "ERROR in " << file << " MESSAGE: " << message << std::endl; std::exit(EXIT_FAILURE); } -void Error::exit(const char *file, const char *message, int info) +void Error::exit(const char *file, + const char *message, + int info) const { MPI_Finalize(); std::cout << "ERROR in " << file << " MESSAGE: " << message << info << std::endl; std::exit(EXIT_FAILURE); } -void Error::exitall(const char *file, const char *message) +void Error::exitall(const char *file, + const char *message) const { MPI_Finalize(); std::cout << "ERROR in " << file << " MESSAGE: " << message << std::endl; std::exit(EXIT_FAILURE); } -void Error::exit(const char *file, const char *message, const char *info) +void Error::exit(const char *file, + const char *message, + const char *info) const { std::cout << "ERROR in " << file << " MESSAGE: " << message << info << std::endl; std::exit(EXIT_FAILURE); diff --git a/anphon/error.h b/anphon/error.h index 2e0d45db..ec30593a 100644 --- a/anphon/error.h +++ b/anphon/error.h @@ -10,7 +10,6 @@ #pragma once -#include #include "pointers.h" namespace PHON_NS @@ -19,12 +18,24 @@ namespace PHON_NS { public: Error(class PHON *); + ~Error(); - void warn(const char *, const char *); - void exit(const char *, const char *); - void exit(const char *, const char *, int); - void exitall(const char *, const char *); - void exit(const char *, const char *, const char *); + void warn(const char *, + const char *) const; + + void exit(const char *, + const char *) const; + + void exit(const char *, + const char *, + int) const; + + void exitall(const char *, + const char *) const; + + void exit(const char *, + const char *, + const char *) const; }; } diff --git a/anphon/ewald.cpp b/anphon/ewald.cpp index cee43939..eadaba0c 100644 --- a/anphon/ewald.cpp +++ b/anphon/ewald.cpp @@ -11,38 +11,61 @@ #include "mpi_common.h" #include "ewald.h" -#include "memory.h" +#include "constants.h" +#include "dynamical.h" #include "error.h" +#include "kpoint.h" +#include "mathfunctions.h" +#include "memory.h" +#include "parsephon.h" #include "system.h" -#include "constants.h" -#include "timer.h" +#include #include -#include -#include #include #include #include -#include "system.h" -#include "kpoint.h" -#include "dynamical.h" -#include "mathfunctions.h" -#include "parsephon.h" +#include + using namespace PHON_NS; Ewald::Ewald(PHON *phon): Pointers(phon) { + set_default_variables(); } Ewald::~Ewald() { - if (is_longrange) { + deallocate_variables(); +} + +void Ewald::set_default_variables() +{ + is_longrange = false; + print_fc2_ewald = false; + file_longrange = ""; + prec_ewald = 1.0e-12; + rate_ab = 1.0; + multiplicity = nullptr; + Born_charge = nullptr; + distall_ewald = nullptr; +} + + +void Ewald::deallocate_variables() +{ + if (multiplicity) { memory->deallocate(multiplicity); + } + if (Born_charge) { memory->deallocate(Born_charge); + } + if (distall_ewald) { memory->deallocate(distall_ewald); } } + void Ewald::init() { MPI_Bcast(&is_longrange, 1, MPI_LOGICAL, 0, MPI_COMM_WORLD); @@ -50,7 +73,6 @@ void Ewald::init() MPI_Bcast(&rate_ab, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD); if (is_longrange) { - int i, j, k; int nsize[3] = {1, 1, 1}; memory->allocate(multiplicity, system->nat, system->nat); @@ -59,9 +81,9 @@ void Ewald::init() get_pairs_of_minimum_distance(system->nat, nsize, system->xr_s); - for (i = 0; i < system->natmin; ++i) { - for (j = 0; j < 3; ++j) { - for (k = 0; k < 3; ++k) { + for (int i = 0; i < system->natmin; ++i) { + for (int j = 0; j < 3; ++j) { + for (int k = 0; k < 3; ++k) { Born_charge[i][j][k] = dynamical->borncharge[i][j][k]; } } @@ -76,9 +98,8 @@ void Ewald::init() void Ewald::prepare_Ewald(const double dielectric[3][3]) { - int i, j, icrd, jcrd; + int icrd; - double p; double lavec_norm[3], rlavec_norm[3]; double e_lavec[3], e_rlavec[3]; double lavec_enorm, rlavec_enorm, lavec_min[2], rlavec_min[2]; @@ -88,10 +109,10 @@ void Ewald::prepare_Ewald(const double dielectric[3][3]) std::cout << " Preparing for the Ewald summation ..." << std::endl << std::endl; } - p = - std::log(prec_ewald); + double p = - std::log(prec_ewald); for (icrd = 0; icrd < 3; ++icrd) { - for (jcrd = 0; jcrd < 3; ++jcrd) { + for (int jcrd = 0; jcrd < 3; ++jcrd) { epsilon[icrd][jcrd] = dielectric[icrd][jcrd]; } } @@ -190,8 +211,8 @@ void Ewald::prepare_Ewald(const double dielectric[3][3]) if (mympi->my_rank == 0) { std::cout << " Inverse dielectric tensor : " << std::endl; - for (i = 0; i < 3; ++i) { - for (j = 0; j < 3; ++j) { + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 3; ++j) { std::cout << std::setw(15) << epsilon_inv[i][j]; } std::cout << std::endl; @@ -207,9 +228,11 @@ void Ewald::prepare_Ewald(const double dielectric[3][3]) std::cout << " Lmax : " << std::setw(15) << Lmax_sub << std::endl; std::cout << " Gmax : " << std::setw(15) << Gmax_sub << std::endl; std::cout << " Maximum number of real-space cells : " - << std::setw(3) << nl_sub[0] << "x" << std::setw(3) << nl_sub[1] << "x" << std::setw(3) << nl_sub[2] << std::endl; + << std::setw(3) << nl_sub[0] << "x" << std::setw(3) << nl_sub[1] << "x" << std::setw(3) << nl_sub[2] << std + ::endl; std::cout << " Maximum number of reciprocal cells : " - << std::setw(3) << ng_sub[0] << "x" << std::setw(3) << ng_sub[1] << "x" << std::setw(3) << ng_sub[2] << std::endl; + << std::setw(3) << ng_sub[0] << "x" << std::setw(3) << ng_sub[1] << "x" << std::setw(3) << ng_sub[2] << std + ::endl; std::cout << std::endl; std::cout << " - Dynamical matrix" << std::endl; std::cout << " Lambda : " << std::setw(15) << lambda << std::endl; @@ -244,7 +267,7 @@ void Ewald::prepare_G() rotvec(g_tmp, g_tmp, system->rlavec_s, 'T'); gnorm = std::sqrt(g_tmp[0] * g_tmp[0] + g_tmp[1] * g_tmp[1] + g_tmp[2] * g_tmp[2]); if (gnorm <= Gmax_sub) { - G_vector_sub.push_back(Gvecs(g_tmp)); + G_vector_sub.emplace_back(g_tmp); } } } @@ -260,7 +283,7 @@ void Ewald::prepare_G() rotvec(g_tmp, g_tmp, system->rlavec_p, 'T'); gnorm = std::sqrt(g_tmp[0] * g_tmp[0] + g_tmp[1] * g_tmp[1] + g_tmp[2] * g_tmp[2]); if (gnorm <= Gmax) { - G_vector.push_back(Gvecs(g_tmp)); + G_vector.emplace_back(g_tmp); } } } @@ -268,31 +291,31 @@ void Ewald::prepare_G() } -void Ewald::get_pairs_of_minimum_distance(const int nat, const int nsize[3], double **xf) +void Ewald::get_pairs_of_minimum_distance(const int nat, + const int nsize[3], + double **xf) const { // Get pairs and multiplicities - int icell = 0, ncell; + int icell = 0; int iat, jat; - int icrd; - int isize, jsize, ksize; - double dist_tmp, dist_hold; + double dist_tmp; double ***xcrd; // fractional coordinate - ncell = (2 * nsize[0] + 1) * (2 * nsize[1] + 1) * (2 * nsize[2] + 1); + int ncell = (2 * nsize[0] + 1) * (2 * nsize[1] + 1) * (2 * nsize[2] + 1); memory->allocate(xcrd, ncell, nat, 3); for (iat = 0; iat < nat; ++iat) { - for (icrd = 0; icrd < 3; ++icrd) { + for (int icrd = 0; icrd < 3; ++icrd) { xcrd[0][iat][icrd] = xf[iat][icrd]; } rotvec(xcrd[0][iat], xcrd[0][iat], system->lavec_s); } - for (isize = -nsize[0]; isize <= nsize[0]; ++isize) { - for (jsize = -nsize[1]; jsize <= nsize[1]; ++jsize) { - for (ksize = -nsize[2]; ksize <= nsize[2]; ++ksize) { + for (int isize = -nsize[0]; isize <= nsize[0]; ++isize) { + for (int jsize = -nsize[1]; jsize <= nsize[1]; ++jsize) { + for (int ksize = -nsize[2]; ksize <= nsize[2]; ++ksize) { if (isize == 0 && jsize == 0 && ksize == 0) continue; ++icell; for (iat = 0; iat < nat; ++iat) { @@ -313,12 +336,12 @@ void Ewald::get_pairs_of_minimum_distance(const int nat, const int nsize[3], dou + std::pow(xcrd[0][iat][1] - xcrd[icell][jat][1], 2.0) + std::pow(xcrd[0][iat][2] - xcrd[icell][jat][2], 2.0)); - distall_ewald[iat][jat].push_back(DistInfo(icell, dist_tmp)); + distall_ewald[iat][jat].emplace_back(icell, dist_tmp); } std::sort(distall_ewald[iat][jat].begin(), distall_ewald[iat][jat].end()); } } - + double dist_hold = -1.0; for (iat = 0; iat < nat; ++iat) { for (jat = 0; jat < nat; ++jat) { multiplicity[iat][jat] = 0; @@ -384,9 +407,147 @@ void Ewald::compute_ewald_fcs() } } - for (auto it = fcs_phonon->fc2_ext.cbegin(); - it != fcs_phonon->fc2_ext.cend(); ++it) { - fcs_total[3 * (*it).atm1 + (*it).xyz1][3 * (*it).atm2 + (*it).xyz2] += (*it).fcs_val; + for (const auto &it : fcs_phonon->fc2_ext) { + fcs_total[3 * it.atm1 + it.xyz1][3 * it.atm2 + it.xyz2] += it.fcs_val; + } + + for (i = 0; i < 3 * natmin; ++i) { + for (j = 0; j < 3 * nat; ++j) { + fcs_other[i][j] = fcs_total[i][j] - fcs_ewald[i][j]; + } + } + FcsClassExtent fcext_tmp; + + for (iat = 0; iat < natmin; ++iat) { + atm_s = system->map_p2s[iat][0]; + + for (icrd = 0; icrd < 3; ++icrd) { + for (jat = 0; jat < nat; ++jat) { + for (jcrd = 0; jcrd < 3; ++jcrd) { + + fcext_tmp.atm1 = iat; + fcext_tmp.xyz1 = icrd; + fcext_tmp.atm2 = jat; + fcext_tmp.xyz2 = jcrd; + + int nmulti = multiplicity[atm_s][jat]; + fcext_tmp.fcs_val = fcs_other[3 * iat + icrd][3 * jat + jcrd] / static_cast(nmulti); + + if (std::abs(fcext_tmp.fcs_val) > eps15) { + + for (int icell = 0; icell < nmulti; ++icell) { + fcext_tmp.cell_s = distall_ewald[atm_s][jat][icell].cell; + fc2_without_dipole.push_back(fcext_tmp); + } + } + } + } + } + } + + + if (mympi->my_rank == 0) { + if (print_fc2_ewald) { + + std::ofstream ofs_fcs_ewald; + + ofs_fcs_ewald.open(file_fcs_ewald.c_str(), std::ios::out); + if (!ofs_fcs_ewald) error->exit("compute_ewald_fcs", "cannot open file PREFIX.fcs_ewald"); + + ofs_fcs_ewald << "# Harmonic force constants" << std::endl; + ofs_fcs_ewald << "# atom1, xyz1, atom2, xyz2, fc2 original, fc2 dipole-dipole, fc2_orig - fc2_dipole" << std + ::endl; + + for (iat = 0; iat < natmin; ++iat) { + for (icrd = 0; icrd < 3; ++icrd) { + for (jat = 0; jat < nat; ++jat) { + for (jcrd = 0; jcrd < 3; ++jcrd) { + ofs_fcs_ewald << std::setw(5) << iat + 1; + ofs_fcs_ewald << std::setw(5) << icrd + 1; + ofs_fcs_ewald << std::setw(5) << jat + 1; + ofs_fcs_ewald << std::setw(5) << jcrd + 1; + ofs_fcs_ewald << std::setw(15) << fcs_total[3 * iat + icrd][3 * jat + jcrd]; + ofs_fcs_ewald << std::setw(15) << fcs_ewald[3 * iat + icrd][3 * jat + jcrd]; + ofs_fcs_ewald << std::setw(15) << fcs_other[3 * iat + icrd][3 * jat + jcrd]; + ofs_fcs_ewald << std::endl; + } + } + } + } + ofs_fcs_ewald.close(); + } + } + + memory->deallocate(fcs_ewald); + memory->deallocate(fcs_total); + memory->deallocate(fcs_other); + + if (mympi->my_rank == 0) { + std::cout << " done." << std::endl; + if (print_fc2_ewald) { + std::cout << std::endl; + std::cout << " FC2_EWALD = 1: Dipole-dipole and short-ranged components of harmonic " << std::endl; + std::cout << " force constants are printed in " << file_fcs_ewald << std::endl; + } + } +} + +void Ewald::compute_ewald_fcs2() +{ + int i, j; + int iat, jat; + int icrd, jcrd; + int atm_s; + int nat = system->nat; + int natmin = system->natmin; + double **fcs_ewald; + double **fc_ewald_short, **fc_ewald_long; + double **fcs_total, **fcs_other; + std::string file_fcs_ewald = input->job_title + ".fc2_ewald"; + + if (mympi->my_rank == 0) { + std::cout << " Calculating long-range (dipole-dipole) FCs in the supercell ..."; + } + + std::vector> k_commensurate; + kpoint->get_commensurate_kpoints(system->lavec_s, + system->lavec_p, + k_commensurate); + + memory->allocate(fcs_ewald, 3 * natmin, 3 * nat); + memory->allocate(fc_ewald_short, 3, 3); + memory->allocate(fc_ewald_long, 3, 3); + + for (iat = 0; iat < natmin; ++iat) { + atm_s = system->map_p2s[iat][0]; + for (jat = 0; jat < nat; ++jat) { + calc_short_term_ewald_fcs(atm_s, jat, fc_ewald_short); + calc_long_term_ewald_fcs(atm_s, jat, fc_ewald_long); + + for (icrd = 0; icrd < 3; ++icrd) { + for (jcrd = 0; jcrd < 3; ++jcrd) { + fcs_ewald[3 * iat + icrd][3 * jat + jcrd] + = fc_ewald_short[icrd][jcrd] + fc_ewald_long[icrd][jcrd]; + } + } + } + } + + memory->deallocate(fc_ewald_short); + memory->deallocate(fc_ewald_long); + + + memory->allocate(fcs_total, 3 * natmin, 3 * nat); + memory->allocate(fcs_other, 3 * natmin, 3 * nat); + + for (i = 0; i < 3 * natmin; ++i) { + for (j = 0; j < 3 * nat; ++j) { + fcs_total[i][j] = 0.0; + } + } + + for (const auto &it : fcs_phonon->fc2_ext) { + fcs_total[3 * it.atm1 + it.xyz1][3 * it.atm2 + it.xyz2] += it.fcs_val; } for (i = 0; i < 3 * natmin; ++i) { @@ -395,7 +556,6 @@ void Ewald::compute_ewald_fcs() } } FcsClassExtent fcext_tmp; - int nmulti, icell; for (iat = 0; iat < natmin; ++iat) { atm_s = system->map_p2s[iat][0]; @@ -409,12 +569,12 @@ void Ewald::compute_ewald_fcs() fcext_tmp.atm2 = jat; fcext_tmp.xyz2 = jcrd; - nmulti = multiplicity[atm_s][jat]; + int nmulti = multiplicity[atm_s][jat]; fcext_tmp.fcs_val = fcs_other[3 * iat + icrd][3 * jat + jcrd] / static_cast(nmulti); if (std::abs(fcext_tmp.fcs_val) > eps15) { - for (icell = 0; icell < nmulti; ++icell) { + for (int icell = 0; icell < nmulti; ++icell) { fcext_tmp.cell_s = distall_ewald[atm_s][jat][icell].cell; fc2_without_dipole.push_back(fcext_tmp); } @@ -434,7 +594,8 @@ void Ewald::compute_ewald_fcs() if (!ofs_fcs_ewald) error->exit("compute_ewald_fcs", "cannot open file PREFIX.fcs_ewald"); ofs_fcs_ewald << "# Harmonic force constants" << std::endl; - ofs_fcs_ewald << "# atom1, xyz1, atom2, xyz2, fc2 original, fc2 dipole-dipole, fc2_orig - fc2_dipole" << std::endl; + ofs_fcs_ewald << "# atom1, xyz1, atom2, xyz2, fc2 original, fc2 dipole-dipole, fc2_orig - fc2_dipole" << std + ::endl; for (iat = 0; iat < natmin; ++iat) { for (icrd = 0; icrd < 3; ++icrd) { @@ -471,14 +632,16 @@ void Ewald::compute_ewald_fcs() } -void Ewald::calc_short_term_ewald_fcs(int iat, int jat, double **fc_l_out) +void Ewald::calc_short_term_ewald_fcs(const int iat, + const int jat, + double **fc_l_out) { // Real lattice sum part for FCs int i; int acrd, bcrd; int icrd, jcrd; - int ikd, jkd, icell, jcell, kcell; + int icell, jcell, kcell; int kat, kkd; double xnorm, tmp; double x_tmp[3], trans[3]; @@ -493,8 +656,8 @@ void Ewald::calc_short_term_ewald_fcs(int iat, int jat, double **fc_l_out) } } - ikd = system->map_s2p[iat].atom_num; - jkd = system->map_s2p[jat].atom_num; + int ikd = system->map_s2p[iat].atom_num; + int jkd = system->map_s2p[jat].atom_num; if (iat == jat) { @@ -644,42 +807,42 @@ void Ewald::calc_short_term_ewald_fcs(int iat, int jat, double **fc_l_out) } -void Ewald::calc_long_term_ewald_fcs(int iat, int jat, double **fc_g_out) +void Ewald::calc_long_term_ewald_fcs(const int iat, + const int jat, + double **fc_g_out) { // Reciprocal lattice sum part for FCs int i; int icrd, jcrd; - int acrd, bcrd, kat, ikd, jkd, kkd; + int acrd, bcrd; double gnorm2; double x_tmp[3], g_tmp[3], epsilon_gvector[3]; - double volume; double common_tmp; - double factor; for (icrd = 0; icrd < 3; ++icrd) { for (jcrd = 0; jcrd < 3; ++jcrd) { fc_g_out[icrd][jcrd] = 0.0; } } - volume = system->volume(system->lavec_s[0], system->lavec_s[1], system->lavec_s[2]); + double volume = system->volume(system->lavec_s[0], system->lavec_s[1], system->lavec_s[2]); - ikd = system->map_s2p[iat].atom_num; - jkd = system->map_s2p[jat].atom_num; + int ikd = system->map_s2p[iat].atom_num; + int jkd = system->map_s2p[jat].atom_num; - factor = 4.0 * pi / volume; + double factor = 4.0 * pi / volume; if (iat == jat) { - for (auto it = G_vector_sub.begin(); it != G_vector_sub.end(); ++it) { - for (i = 0; i < 3; ++i) g_tmp[i] = (*it).vec[i]; + for (const auto &it : G_vector_sub) { + for (i = 0; i < 3; ++i) g_tmp[i] = it.vec[i]; rotvec(epsilon_gvector, g_tmp, epsilon); gnorm2 = g_tmp[0] * epsilon_gvector[0] + g_tmp[1] * epsilon_gvector[1] + g_tmp[2] * epsilon_gvector[2]; - for (kat = 0; kat < system->nat; ++kat) { - kkd = system->map_s2p[kat].atom_num; + for (int kat = 0; kat < system->nat; ++kat) { + int kkd = system->map_s2p[kat].atom_num; for (i = 0; i < 3; ++i) { x_tmp[i] = system->xr_s[iat][i] - system->xr_s[kat][i]; @@ -704,8 +867,8 @@ void Ewald::calc_long_term_ewald_fcs(int iat, int jat, double **fc_g_out) } } - for (auto it = G_vector_sub.begin(); it != G_vector_sub.end(); ++it) { - for (i = 0; i < 3; ++i) g_tmp[i] = (*it).vec[i]; + for (const auto &it : G_vector_sub) { + for (i = 0; i < 3; ++i) g_tmp[i] = it.vec[i]; rotvec(epsilon_gvector, g_tmp, epsilon); gnorm2 = g_tmp[0] * epsilon_gvector[0] + g_tmp[1] * epsilon_gvector[1] @@ -733,12 +896,10 @@ void Ewald::calc_long_term_ewald_fcs(int iat, int jat, double **fc_g_out) } -void Ewald::add_longrange_matrix(double *xk_in, std::complex **dymat_k_out, int ik) +void Ewald::add_longrange_matrix(double *xk_in, + double *kvec_in, + std::complex **dymat_k_out) { - // - // Calculate a Coulombic (dipole-dipole) dynamical matrix and confirm Hermiticity - // - int i, j; int icrd, jcrd, iat, jat; int natmin = system->natmin; int neval = 3 * system->natmin; @@ -751,8 +912,8 @@ void Ewald::add_longrange_matrix(double *xk_in, std::complex **dymat_k_o rotvec(xk, xk_in, system->rlavec_p, 'T'); - for (i = 0; i < neval; ++i) { - for (j = 0; j < neval; ++j) { + for (int i = 0; i < neval; ++i) { + for (int j = 0; j < neval; ++j) { dymat_k_out[i][j] = std::complex(0.0, 0.0); } } @@ -760,7 +921,7 @@ void Ewald::add_longrange_matrix(double *xk_in, std::complex **dymat_k_o for (iat = 0; iat < natmin; ++iat) { for (jat = 0; jat < natmin; ++jat) { calc_short_term_dynamical_matrix(iat, jat, xk, dymat_tmp_l); - calc_long_term_dynamical_matrix(iat, jat, xk, dymat_tmp_g, ik); + calc_long_term_dynamical_matrix(iat, jat, xk, dymat_tmp_g, kvec_in); for (icrd = 0; icrd < 3; ++icrd) { for (jcrd = 0; jcrd < 3; ++jcrd) { dymat_k_out[3 * iat + icrd][3 * jat + jcrd] = dymat_tmp_l[icrd][jcrd] @@ -774,19 +935,18 @@ void Ewald::add_longrange_matrix(double *xk_in, std::complex **dymat_k_o memory->deallocate(dymat_tmp_g); - // Check - std::complex check; for (iat = 0; iat < natmin; ++iat) { for (icrd = 0; icrd < 3; ++icrd) { for (jat = 0; jat < natmin; ++jat) { for (jcrd = 0; jcrd < 3; ++jcrd) { // Hermiticity - check = dymat_k_out[3 * iat + icrd][3 * jat + jcrd] + std::complex check = dymat_k_out[3 * iat + icrd][3 * jat + jcrd] - std::conj(dymat_k_out[3 * jat + jcrd][3 * iat + icrd]); if (std::abs(check) > eps10) { std::cout << std::endl; - error->exit("add_longrange_matrix", "Hermiticity of Dynamical matrix is broken."); + error->exit("add_longrange_matrix", + "Hermiticity of Dynamical matrix is broken."); } } } @@ -795,16 +955,18 @@ void Ewald::add_longrange_matrix(double *xk_in, std::complex **dymat_k_o } -void Ewald::calc_short_term_dynamical_matrix(const int iat, const int jat, double *xk_in, +void Ewald::calc_short_term_dynamical_matrix(const int iat, + const int jat, + double *xk_in, std::complex **mat_out) { // Real lattice sum part for a dynamical matrix - int i, j; + int i; int icrd, jcrd, kat, acrd, bcrd; - int atm_s1, atm_s2, atm_s3; + int atm_s3; int icell, jcell, kcell; - double mi, mj, xnorm, phase; + double xnorm, phase; double x_tmp[3], trans[3]; std::complex im(0.0, 1.0); double **hmat_tmp; @@ -814,13 +976,13 @@ void Ewald::calc_short_term_dynamical_matrix(const int iat, const int jat, doubl memory->allocate(hmat_tmp, 3, 3); // Substitute quantities into variables - atm_s1 = system->map_p2s[iat][0]; - atm_s2 = system->map_p2s[jat][0]; - mi = system->mass[atm_s1]; - mj = system->mass[atm_s2]; + int atm_s1 = system->map_p2s[iat][0]; + int atm_s2 = system->map_p2s[jat][0]; + double mi = system->mass[atm_s1]; + double mj = system->mass[atm_s2]; for (i = 0; i < 3; ++i) { - for (j = 0; j < 3; ++j) { + for (int j = 0; j < 3; ++j) { mat_out[i][j] = std::complex(0.0, 0.0); } } @@ -986,30 +1148,30 @@ void Ewald::calc_short_term_dynamical_matrix(const int iat, const int jat, doubl } -void Ewald::calc_long_term_dynamical_matrix(const int iat, const int jat, double *xk_in, - std::complex **mat_out, const int ik) +void Ewald::calc_long_term_dynamical_matrix(const int iat, + const int jat, + double *xk_in, + std::complex **mat_out, + double *kvec_in) { // Real lattice sum part for a dynamical matrix - int i, j, kat; + int i, j; int icrd, jcrd, acrd, bcrd; - int l, atm_s1, atm_s2, atm_s3; - double mi, mj, vol_p, kd, phase; double vec[3], e_kvec[3]; std::complex im(0.0, 1.0); - std::complex exp_phase; double tmp; - atm_s1 = system->map_p2s[iat][0]; - atm_s2 = system->map_p2s[jat][0]; - mi = system->mass[atm_s1]; - mj = system->mass[atm_s2]; - vol_p = system->volume_p; + int atm_s1 = system->map_p2s[iat][0]; + int atm_s2 = system->map_p2s[jat][0]; + double mi = system->mass[atm_s1]; + double mj = system->mass[atm_s2]; + double vol_p = system->volume_p; for (i = 0; i < 3; ++i) { vec[i] = system->xr_s[atm_s1][i] - system->xr_s[atm_s2][i]; } rotvec(vec, vec, system->lavec_s); - phase = xk_in[0] * vec[0] + xk_in[1] * vec[1] + xk_in[2] * vec[2]; + double phase = xk_in[0] * vec[0] + xk_in[1] * vec[1] + xk_in[2] * vec[2]; rotvec(e_kvec, xk_in, epsilon); for (i = 0; i < 3; ++i) { @@ -1017,9 +1179,9 @@ void Ewald::calc_long_term_dynamical_matrix(const int iat, const int jat, double mat_out[i][j] = std::complex(0.0, 0.0); } } - kd = xk_in[0] * e_kvec[0] + xk_in[1] * e_kvec[1] + xk_in[2] * e_kvec[2]; + double kd = xk_in[0] * e_kvec[0] + xk_in[1] * e_kvec[1] + xk_in[2] * e_kvec[2]; - exp_phase = std::exp(im * phase); + std::complex exp_phase = std::exp(im * phase); if (std::sqrt(kd) > eps10) { @@ -1044,10 +1206,10 @@ void Ewald::calc_long_term_dynamical_matrix(const int iat, const int jat, double // Treat non-analytic term - double norm, kdirec[3], e_kdirec[3]; - for (i = 0; i < 3; ++i) kdirec[i] = kpoint->kvec_na[ik][i]; + double kdirec[3], e_kdirec[3]; + for (i = 0; i < 3; ++i) kdirec[i] = kvec_in[i]; rotvec(e_kdirec, kdirec, epsilon); - norm = kdirec[0] * e_kdirec[0] + kdirec[1] * e_kdirec[1] + kdirec[2] * e_kdirec[2]; + double norm = kdirec[0] * e_kdirec[0] + kdirec[1] * e_kdirec[1] + kdirec[2] * e_kdirec[2]; if (norm > eps) { for (icrd = 0; icrd < 3; ++icrd) { @@ -1067,32 +1229,30 @@ void Ewald::calc_long_term_dynamical_matrix(const int iat, const int jat, double } - // Reciprocal sum - double gd, gkd, phase_g1, phase_g2; double g[3], gk[3], vecl[3], g_tmp[3], gk_tmp[3]; double common; std::complex g_test; - for (auto it = G_vector.begin(); it != G_vector.end(); ++it) { - for (l = 0; l < 3; ++l) { - g[l] = (*it).vec[l]; + for (auto &it : G_vector) { + for (int l = 0; l < 3; ++l) { + g[l] = it.vec[l]; gk[l] = g[l] + xk_in[l]; } if (iat == jat) { rotvec(g_tmp, g, epsilon); - gd = g[0] * g_tmp[0] + g[1] * g_tmp[1] + g[2] * g_tmp[2]; + double gd = g[0] * g_tmp[0] + g[1] * g_tmp[1] + g[2] * g_tmp[2]; common = std::exp(-0.25 * gd / std::pow(lambda, 2.0)) / gd; - for (kat = 0; kat < system->natmin; ++kat) { - atm_s3 = system->map_p2s[kat][0]; + for (int kat = 0; kat < system->natmin; ++kat) { + int atm_s3 = system->map_p2s[kat][0]; for (i = 0; i < 3; ++i) { vecl[i] = system->xr_s[atm_s1][i] - system->xr_s[atm_s3][i]; } rotvec(vecl, vecl, system->lavec_s); - phase_g1 = g[0] * vecl[0] + g[1] * vecl[1] + g[2] * vecl[2]; + double phase_g1 = g[0] * vecl[0] + g[1] * vecl[1] + g[2] * vecl[2]; exp_phase = std::exp(im * phase_g1); for (icrd = 0; icrd < 3; ++icrd) { @@ -1113,8 +1273,8 @@ void Ewald::calc_long_term_dynamical_matrix(const int iat, const int jat, double } rotvec(gk_tmp, gk, epsilon); - gkd = gk[0] * gk_tmp[0] + gk[1] * gk_tmp[1] + gk[2] * gk_tmp[2]; - phase_g2 = gk[0] * vec[0] + gk[1] * vec[1] + gk[2] * vec[2]; + double gkd = gk[0] * gk_tmp[0] + gk[1] * gk_tmp[1] + gk[2] * gk_tmp[2]; + double phase_g2 = gk[0] * vec[0] + gk[1] * vec[1] + gk[2] * vec[2]; common = 2.0 * std::exp(-0.25 * gkd / std::pow(lambda, 2.0)) / gkd; exp_phase = std::exp(im * phase_g2); @@ -1142,13 +1302,13 @@ void Ewald::calc_long_term_dynamical_matrix(const int iat, const int jat, double } -void Ewald::calc_anisotropic_hmat(double lambda_in, double *x, double **hmat_out) +void Ewald::calc_anisotropic_hmat(const double lambda_in, + const double *x, + double **hmat_out) { - int i; int icrd, jcrd; - double yd, yd_inv, yd2, yd2_inv, common_tmp[2]; + double common_tmp[2]; double x_tmp[3], y_tmp[3]; - double erfc_y, exp_y2, two_over_sqrtpi; for (icrd = 0; icrd < 3; ++icrd) { for (jcrd = 0; jcrd < 3; ++jcrd) { @@ -1156,24 +1316,25 @@ void Ewald::calc_anisotropic_hmat(double lambda_in, double *x, double **hmat_out } } - for (i = 0; i < 3; ++i) { + for (int i = 0; i < 3; ++i) { y_tmp[i] = x[i] * lambda_in; } rotvec(x_tmp, y_tmp, epsilon_inv); - yd = std::sqrt(x_tmp[0] * y_tmp[0] + x_tmp[1] * y_tmp[1] + x_tmp[2] * y_tmp[2]); + double yd = std::sqrt(x_tmp[0] * y_tmp[0] + x_tmp[1] * y_tmp[1] + x_tmp[2] * y_tmp[2]); if (yd == 0.0) { error->exit("ewald->calc_hmat", "components of hmat diverge."); } - yd_inv = 1.0 / yd; - yd2 = std::pow(yd, 2.0); - yd2_inv = yd_inv * yd_inv; - erfc_y = boost::math::erfc(yd); - exp_y2 = std::exp(-yd2); - two_over_sqrtpi = 2.0 / std::sqrt(pi); - - common_tmp[0] = (3.0 * yd_inv * yd2_inv * erfc_y + two_over_sqrtpi * (3.0 * yd2_inv + 2.0) * exp_y2) * yd2_inv / std::sqrt(det_epsilon); + double yd_inv = 1.0 / yd; + double yd2 = std::pow(yd, 2.0); + double yd2_inv = yd_inv * yd_inv; + double erfc_y = boost::math::erfc(yd); + double exp_y2 = std::exp(-yd2); + double two_over_sqrtpi = 2.0 / std::sqrt(pi); + + common_tmp[0] = (3.0 * yd_inv * yd2_inv * erfc_y + two_over_sqrtpi * (3.0 * yd2_inv + 2.0) * exp_y2) + * yd2_inv / std::sqrt(det_epsilon); common_tmp[1] = (yd_inv * yd2_inv * erfc_y + two_over_sqrtpi * yd2_inv * exp_y2) / std::sqrt(det_epsilon); for (icrd = 0; icrd < 3; ++icrd) { diff --git a/anphon/ewald.h b/anphon/ewald.h index e2335214..09619b39 100644 --- a/anphon/ewald.h +++ b/anphon/ewald.h @@ -43,29 +43,23 @@ namespace PHON_NS DistInfo(); - DistInfo(const int n, const double d) - { - cell = n; - dist = d; - } + DistInfo(const int n, + const double d) : cell(n), dist(d) {}; + + DistInfo(const DistInfo &obj) : cell(obj.cell), dist(obj.dist) {}; - DistInfo(const DistInfo &obj) + bool operator<(const DistInfo &obj) const { - cell = obj.cell; - dist = obj.dist; + return dist < obj.dist; } }; - inline bool operator<(const DistInfo a, const DistInfo b) - { - return a.dist < b.dist; - } - - class Ewald: protected Pointers + class Ewald : protected Pointers { public: Ewald(class PHON *); + ~Ewald(); bool is_longrange, print_fc2_ewald; @@ -81,7 +75,10 @@ namespace PHON_NS std::vector fc2_without_dipole; void init(); - void add_longrange_matrix(double *, std::complex **, int); + + void add_longrange_matrix(double *, + double *, + std::complex **); private: @@ -97,20 +94,46 @@ namespace PHON_NS std::vector **distall_ewald; + void set_default_variables(); + void deallocate_variables(); + void prepare_Ewald(const double [3][3]); void prepare_G(); void compute_ewald_fcs(); - void get_pairs_of_minimum_distance(const int, const int [3], double **); - - void calc_longrange_fcs(int, int, int, int, int, double *); - void calc_short_term_ewald_fcs(const int, const int, double **); - void calc_long_term_ewald_fcs(int, int, double **); - - void calc_short_term_dynamical_matrix(const int, const int, - double *, std::complex **); - void calc_long_term_dynamical_matrix(const int, const int, - double *, std::complex **, const int); - - void calc_anisotropic_hmat(double, double *, double **); + void compute_ewald_fcs2(); + + void get_pairs_of_minimum_distance(int, + const int [3], + double **) const; + + void calc_longrange_fcs(int, + int, + int, + int, + int, + double *); + + void calc_short_term_ewald_fcs(int, + int, + double **); + + void calc_long_term_ewald_fcs(int, + int, + double **); + + void calc_short_term_dynamical_matrix(int, + int, + double *, + std::complex **); + + void calc_long_term_dynamical_matrix(int, + int, + double *, + std::complex **, + double *); + + void calc_anisotropic_hmat(double, + const double *, + double **); }; } diff --git a/anphon/fcs_phonon.cpp b/anphon/fcs_phonon.cpp index 8f128187..fb1da03c 100644 --- a/anphon/fcs_phonon.cpp +++ b/anphon/fcs_phonon.cpp @@ -9,38 +9,57 @@ or http://opensource.org/licenses/mit-license.php for information. */ #include "mpi_common.h" -#include "dynamical.h" -#include "kpoint.h" #include "fcs_phonon.h" -#include "system.h" -#include "memory.h" -#include "error.h" -#include "phonons.h" -#include "relaxation.h" #include "constants.h" +#include "error.h" #include "gruneisen.h" -#include "xml_parser.h" +#include "memory.h" +#include "phonons.h" +#include "anharmonic_core.h" +#include "system.h" +#include "thermodynamics.h" #include +#include #include -#include #include #include #include #include -#include #include using namespace PHON_NS; Fcs_phonon::Fcs_phonon(PHON *phon): Pointers(phon) { + set_default_variables(); } Fcs_phonon::~Fcs_phonon() { - memory->deallocate(force_constant_with_cell); + deallocate_variables(); } +void Fcs_phonon::set_default_variables() +{ + maxorder = 0; + file_fcs = ""; + file_fc2 = ""; + update_fc2 = false; + force_constant = nullptr; + force_constant_with_cell = nullptr; +} + +void Fcs_phonon::deallocate_variables() +{ + if (force_constant) { + memory->deallocate(force_constant); + } + if (force_constant_with_cell) { + memory->deallocate(force_constant_with_cell); + } +} + + void Fcs_phonon::setup(std::string mode) { unsigned int i; @@ -50,15 +69,16 @@ void Fcs_phonon::setup(std::string mode) std::cout << " ==============" << std::endl << std::endl; } - MPI_Bcast(&relaxation->quartic_mode, 1, MPI_INT, 0, MPI_COMM_WORLD); + MPI_Bcast(&anharmonic_core->quartic_mode, 1, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(&gruneisen->print_gruneisen, 1, MPI_LOGICAL, 0, MPI_COMM_WORLD); + MPI_Bcast(&thermodynamics->calc_FE_bubble, 1, MPI_LOGICAL, 0, MPI_COMM_WORLD); if (mode == "PHONONS") { require_cubic = false; require_quartic = false; maxorder = 1; - if (gruneisen->print_gruneisen) { + if (gruneisen->print_gruneisen || thermodynamics->calc_FE_bubble) { require_cubic = true; maxorder = 2; } @@ -66,7 +86,7 @@ void Fcs_phonon::setup(std::string mode) require_cubic = true; maxorder = 2; - if (relaxation->quartic_mode > 0) { + if (anharmonic_core->quartic_mode > 0) { require_quartic = true; maxorder = 3; } @@ -75,7 +95,7 @@ void Fcs_phonon::setup(std::string mode) } else if (mode == "RTA") { require_cubic = true; - if (relaxation->quartic_mode > 0) { + if (anharmonic_core->quartic_mode > 0) { maxorder = 3; require_quartic = true; } else { @@ -86,7 +106,7 @@ void Fcs_phonon::setup(std::string mode) require_cubic = true; require_quartic = true; maxorder = 3; - relaxation->quartic_mode = 1; + anharmonic_core->quartic_mode = 1; } memory->allocate(force_constant_with_cell, maxorder); @@ -108,8 +128,12 @@ void Fcs_phonon::setup(std::string mode) std::cout << std::endl; memory->allocate(maxdev, maxorder); - examine_translational_invariance(maxorder, system->nat_anharm, system->natmin, - maxdev, fc2_ext, force_constant_with_cell); + examine_translational_invariance(maxorder, + system->nat_anharm, + system->natmin, + maxdev, + fc2_ext, + force_constant_with_cell); std::cout << " Maximum deviation from the translational invariance: " << std::endl; for (i = 0; i < maxorder; ++i) { @@ -155,48 +179,44 @@ void Fcs_phonon::load_fc2_xml() fc2_ext.clear(); BOOST_FOREACH (const ptree::value_type& child_, pt.get_child("Data.ForceConstants.HARMONIC")) { - const ptree &child = child_.second; - const std::string str_p1 = child.get(".pair1"); - const std::string str_p2 = child.get(".pair2"); + const ptree &child = child_.second; + const std::string str_p1 = child.get(".pair1"); + const std::string str_p2 = child.get(".pair2"); - ss1.str(""); - ss2.str(""); - ss1.clear(); - ss2.clear(); + ss1.str(""); + ss2.str(""); + ss1.clear(); + ss2.clear(); - ss1 << str_p1; - ss2 << str_p2; + ss1 << str_p1; + ss2 << str_p2; - ss1 >> atm1 >> xyz1; - ss2 >> atm2 >> xyz2 >> cell_s; + ss1 >> atm1 >> xyz1; + ss2 >> atm2 >> xyz2 >> cell_s; - fcext_tmp.atm1 = atm1 - 1; - fcext_tmp.xyz1 = xyz1 - 1; - fcext_tmp.atm2 = atm2 - 1; - fcext_tmp.xyz2 = xyz2 - 1; - fcext_tmp.cell_s = cell_s - 1; - fcext_tmp.fcs_val = boost::lexical_cast(child.data()); + fcext_tmp.atm1 = atm1 - 1; + fcext_tmp.xyz1 = xyz1 - 1; + fcext_tmp.atm2 = atm2 - 1; + fcext_tmp.xyz2 = xyz2 - 1; + fcext_tmp.cell_s = cell_s - 1; + fcext_tmp.fcs_val = boost::lexical_cast(child.data()); - fc2_ext.push_back(fcext_tmp); - } + fc2_ext.push_back(fcext_tmp); + } + pt.clear(); } -void Fcs_phonon::load_fcs_xml() +void Fcs_phonon::load_fcs_xml() const { using namespace boost::property_tree; ptree pt; - unsigned int order; std::string str_tag; unsigned int i; unsigned int atmn, xyz, cell_s; - double fcs_val; - std::vector tri_vec; std::stringstream ss; - std::string str_pairs; - std::string str_attr; AtomCellSuper ivec_tmp; std::vector ivec_with_cell, ivec_copy; @@ -212,12 +232,12 @@ void Fcs_phonon::load_fcs_xml() error->exit("load_fcs_xml", str_error.c_str()); } - for (order = 0; order < maxorder; ++order) { + for (unsigned int order = 0; order < maxorder; ++order) { if (order == 0) { str_tag = "Data.ForceConstants.HARMONIC"; } else { - str_tag = "Data.ForceConstants.ANHARM" + boost::lexical_cast(order + 2); + str_tag = "Data.ForceConstants.ANHARM" + std::to_string(order + 2); } boost::optional child_ = pt.get_child_optional(str_tag); @@ -228,84 +248,81 @@ void Fcs_phonon::load_fcs_xml() } BOOST_FOREACH (const ptree::value_type& child_, pt.get_child(str_tag)) { - const ptree &child = child_.second; + const ptree &child = child_.second; - fcs_val = boost::lexical_cast(child.data()); + double fcs_val = boost::lexical_cast(child.data()); - ivec_with_cell.clear(); + ivec_with_cell.clear(); - for (i = 0; i < order + 2; ++i) { - str_attr = ".pair" + boost::lexical_cast(i + 1); - str_pairs = child.get(str_attr); + for (i = 0; i < order + 2; ++i) { + std::string str_attr = ".pair" + std::to_string(i + 1); + std::string str_pairs = child.get(str_attr); - ss.str(""); - ss.clear(); - ss << str_pairs; + ss.str(""); + ss.clear(); + ss << str_pairs; - if (i == 0) { + if (i == 0) { - ss >> atmn >> xyz; - if (update_fc2) { - ivec_tmp.index = 3 * system->map_p2s_anharm_orig[atmn - 1][0] + xyz - 1; - } else { - ivec_tmp.index = 3 * system->map_p2s_anharm[atmn - 1][0] + xyz - 1; - } - ivec_tmp.cell_s = 0; - ivec_tmp.tran = 0; // dummy - ivec_with_cell.push_back(ivec_tmp); + ss >> atmn >> xyz; + if (update_fc2) { + ivec_tmp.index = 3 * system->map_p2s_anharm_orig[atmn - 1][0] + xyz - 1; } else { - - ss >> atmn >> xyz >> cell_s; - - ivec_tmp.index = 3 * (atmn - 1) + xyz - 1; - ivec_tmp.cell_s = cell_s - 1; - ivec_tmp.tran = 0; // dummy - ivec_with_cell.push_back(ivec_tmp); + ivec_tmp.index = 3 * system->map_p2s_anharm[atmn - 1][0] + xyz - 1; } + ivec_tmp.cell_s = 0; + ivec_tmp.tran = 0; // dummy + ivec_with_cell.push_back(ivec_tmp); + } else { + ss >> atmn >> xyz >> cell_s; + + ivec_tmp.index = 3 * (atmn - 1) + xyz - 1; + ivec_tmp.cell_s = cell_s - 1; + ivec_tmp.tran = 0; // dummy + ivec_with_cell.push_back(ivec_tmp); } - if (std::abs(fcs_val) > eps) { + } + + if (std::abs(fcs_val) > eps) { - do { + do { - ivec_copy.clear(); + ivec_copy.clear(); - for (i = 0; i < ivec_with_cell.size(); ++i) { - atmn = ivec_with_cell[i].index / 3; - xyz = ivec_with_cell[i].index % 3; - ivec_tmp.index = 3 * system->map_s2p_anharm[atmn].atom_num + xyz; - ivec_tmp.cell_s = ivec_with_cell[i].cell_s; - ivec_tmp.tran = system->map_s2p_anharm[atmn].tran_num; - ivec_copy.push_back(ivec_tmp); - } + for (i = 0; i < ivec_with_cell.size(); ++i) { + atmn = ivec_with_cell[i].index / 3; + xyz = ivec_with_cell[i].index % 3; + ivec_tmp.index = 3 * system->map_s2p_anharm[atmn].atom_num + xyz; + ivec_tmp.cell_s = ivec_with_cell[i].cell_s; + ivec_tmp.tran = system->map_s2p_anharm[atmn].tran_num; + ivec_copy.push_back(ivec_tmp); + } - force_constant_with_cell[order].push_back(FcsArrayWithCell(fcs_val, ivec_copy)); + force_constant_with_cell[order].emplace_back(fcs_val, ivec_copy); - } while (std::next_permutation(ivec_with_cell.begin() + 1, ivec_with_cell.end())); - } + } while (std::next_permutation(ivec_with_cell.begin() + 1, ivec_with_cell.end())); } + } } std::cout << "done !" << std::endl; } -void Fcs_phonon::MPI_Bcast_fc_class(const unsigned int N) +void Fcs_phonon::MPI_Bcast_fc_class(const unsigned int N) const { - unsigned int i; int j, k; - int len; - int nelem; double *fcs_tmp; unsigned int ***ind; Triplet tri_tmp; std::vector tri_vec; - for (i = 0; i < N; ++i) { + for (unsigned int i = 0; i < N; ++i) { - len = force_constant[i].size(); - nelem = i + 2; + int len = force_constant[i].size(); + int nelem = i + 2; MPI_Bcast(&len, 1, MPI_INT, 0, MPI_COMM_WORLD); @@ -340,7 +357,7 @@ void Fcs_phonon::MPI_Bcast_fc_class(const unsigned int N) tri_vec.push_back(tri_tmp); } - force_constant[i].push_back(FcsClass(fcs_tmp[j], tri_vec)); + force_constant[i].emplace_back(fcs_tmp[j], tri_vec); } } @@ -354,10 +371,9 @@ void Fcs_phonon::MPI_Bcast_fc2_ext() unsigned int i; double *fcs_tmp; unsigned int **ind; - unsigned int nfcs; FcsClassExtent fcext_tmp; - nfcs = fc2_ext.size(); + unsigned int nfcs = fc2_ext.size(); MPI_Bcast(&nfcs, 1, MPI_UNSIGNED, 0, MPI_COMM_WORLD); memory->allocate(fcs_tmp, nfcs); @@ -392,10 +408,12 @@ void Fcs_phonon::MPI_Bcast_fc2_ext() } -void Fcs_phonon::examine_translational_invariance(const int n, const unsigned int nat, - const unsigned int natmin, double *ret, +void Fcs_phonon::examine_translational_invariance(const int n, + const unsigned int nat, + const unsigned int natmin, + double *ret, std::vector &fc2, - std::vector *fcs) + std::vector *fcs) const { int i, j, k, l, m; @@ -406,7 +424,6 @@ void Fcs_phonon::examine_translational_invariance(const int n, const unsigned in bool force_asr = false; FcsClassExtent fc2_tmp; - std::vector::iterator it_target; for (i = 0; i < n; ++i) ret[i] = 0.0; @@ -421,12 +438,13 @@ void Fcs_phonon::examine_translational_invariance(const int n, const unsigned in sum2[j][k] = 0.0; } } - for (auto it = fc2.cbegin(); it != fc2.cend(); ++it) { - sum2[3 * (*it).atm1 + (*it).xyz1][(*it).xyz2] += (*it).fcs_val; + for (const auto &it : fc2) { + sum2[3 * it.atm1 + it.xyz1][it.xyz2] += it.fcs_val; } if (force_asr) { - std::cout << " force_asr = true: Modify harmonic force constans so that the ASR is satisfied." << std::endl; + std::cout << " force_asr = true: Modify harmonic force constans so that the ASR is satisfied." << std:: + endl; for (j = 0; j < natmin; ++j) { for (k = 0; k < 3; ++k) { for (m = 0; m < 3; ++m) { @@ -436,7 +454,7 @@ void Fcs_phonon::examine_translational_invariance(const int n, const unsigned in fc2_tmp.xyz2 = m; fc2_tmp.cell_s = 0; fc2_tmp.fcs_val = sum2[3 * j + k][m]; - it_target = std::find(fc2.begin(), fc2.end(), fc2_tmp); + const auto it_target = std::find(fc2.begin(), fc2.end(), fc2_tmp); if (std::abs(fc2_tmp.fcs_val) > eps12) { if (it_target != fc2.end()) { fc2[it_target - fc2.begin()].fcs_val -= fc2_tmp.fcs_val; @@ -454,8 +472,8 @@ void Fcs_phonon::examine_translational_invariance(const int n, const unsigned in } } - for (auto it = fc2.cbegin(); it != fc2.cend(); ++it) { - sum2[3 * (*it).atm1 + (*it).xyz1][(*it).xyz2] += (*it).fcs_val; + for (const auto &it : fc2) { + sum2[3 * it.atm1 + it.xyz1][it.xyz2] += it.fcs_val; } } @@ -510,15 +528,15 @@ void Fcs_phonon::examine_translational_invariance(const int n, const unsigned in } } - for (auto it = fcs[i].cbegin(); it != fcs[i].cend(); ++it) { - j = (*it).pairs[0].index; - k = 3 * system->map_p2s_anharm[(*it).pairs[1].index / 3][(*it).pairs[1].tran] - + (*it).pairs[1].index % 3; - l = 3 * system->map_p2s_anharm[(*it).pairs[2].index / 3][(*it).pairs[2].tran] - + (*it).pairs[2].index % 3; - m = (*it).pairs[3].index % 3; + for (const auto &it : fcs[i]) { + j = it.pairs[0].index; + k = 3 * system->map_p2s_anharm[it.pairs[1].index / 3][it.pairs[1].tran] + + it.pairs[1].index % 3; + l = 3 * system->map_p2s_anharm[it.pairs[2].index / 3][it.pairs[2].tran] + + it.pairs[2].index % 3; + m = it.pairs[3].index % 3; - sum4[j][k][l][m] += (*it).fcs_val; + sum4[j][k][l][m] += it.fcs_val; } for (j = 0; j < 3 * natmin; ++j) { @@ -541,22 +559,19 @@ void Fcs_phonon::examine_translational_invariance(const int n, const unsigned in } -void Fcs_phonon::MPI_Bcast_fcs_array(const unsigned int N) +void Fcs_phonon::MPI_Bcast_fcs_array(const unsigned int N) const { - unsigned int i; int j, k; - int len; - int nelem; double *fcs_tmp; unsigned int ***ind; AtomCellSuper ivec_tmp; std::vector ivec_array; - for (i = 0; i < N; ++i) { + for (unsigned int i = 0; i < N; ++i) { - len = force_constant_with_cell[i].size(); - nelem = i + 2; + int len = force_constant_with_cell[i].size(); + int nelem = i + 2; MPI_Bcast(&len, 1, MPI_INT, 0, MPI_COMM_WORLD); @@ -591,8 +606,8 @@ void Fcs_phonon::MPI_Bcast_fcs_array(const unsigned int N) ivec_array.push_back(ivec_tmp); } - force_constant_with_cell[i].push_back(FcsArrayWithCell(fcs_tmp[j], - ivec_array)); + force_constant_with_cell[i].emplace_back(fcs_tmp[j], + ivec_array); } } diff --git a/anphon/fcs_phonon.h b/anphon/fcs_phonon.h index 6f6e5b06..b640cae7 100644 --- a/anphon/fcs_phonon.h +++ b/anphon/fcs_phonon.h @@ -28,19 +28,13 @@ namespace PHON_NS std::vector elems; double fcs_val; - FcsClass() - { - }; + FcsClass() {}; - FcsClass(const FcsClass &obj) - { - fcs_val = obj.fcs_val; - for (auto it = obj.elems.cbegin(); it != obj.elems.cend(); ++it) { - elems.push_back(*it); - } - } + FcsClass(const FcsClass &obj) : elems(obj.elems), fcs_val(obj.fcs_val) {}; - FcsClass(const unsigned int n, const double val, const Triplet *arr) + FcsClass(const unsigned int n, + const double val, + const Triplet *arr) { fcs_val = val; for (unsigned int i = 0; i < n; ++i) { @@ -48,27 +42,23 @@ namespace PHON_NS } } - FcsClass(const double val, const std::vector vec) + FcsClass(const double val, + const std::vector &vec) + : elems(vec), fcs_val(val) {}; + + bool operator<(const FcsClass &obj) const { - fcs_val = val; - for (auto it = vec.cbegin(); it != vec.cend(); ++it) { - elems.push_back(*it); + std::vector a_tmp, b_tmp; + a_tmp.clear(); + b_tmp.clear(); + for (int i = 0; i < obj.elems.size(); ++i) { + a_tmp.push_back(3 * elems[i].atom + elems[i].xyz); + b_tmp.push_back(3 * obj.elems[i].atom + obj.elems[i].xyz); } + return lexicographical_compare(a_tmp.begin(), a_tmp.end(), b_tmp.begin(), b_tmp.end()); } }; - inline bool operator<(const FcsClass &a, const FcsClass &b) - { - std::vector a_tmp, b_tmp; - a_tmp.clear(); - b_tmp.clear(); - for (int i = 0; i < a.elems.size(); ++i) { - a_tmp.push_back(3 * a.elems[i].atom + a.elems[i].xyz); - b_tmp.push_back(3 * b.elems[i].atom + b.elems[i].xyz); - } - return lexicographical_compare(a_tmp.begin(), a_tmp.end(), b_tmp.begin(), b_tmp.end()); - } - class FcsClassExtent { public: @@ -77,9 +67,7 @@ namespace PHON_NS unsigned int cell_s; double fcs_val; - FcsClassExtent() - { - }; + FcsClassExtent() {}; FcsClassExtent(const FcsClassExtent &obj) { @@ -106,7 +94,8 @@ namespace PHON_NS unsigned int cell_s; }; - inline bool operator<(const AtomCellSuper &a, const AtomCellSuper &b) + inline bool operator<(const AtomCellSuper &a, + const AtomCellSuper &b) { return a.index < b.index; } @@ -117,46 +106,40 @@ namespace PHON_NS std::vector pairs; double fcs_val; - FcsArrayWithCell() - { - }; + FcsArrayWithCell() {}; - FcsArrayWithCell(const double fcs_in, const std::vector pairs_in) - { - fcs_val = fcs_in; + FcsArrayWithCell(const double fcs_in, + const std::vector &pairs_in) + : pairs(pairs_in), fcs_val(fcs_in) {}; - for (auto it = pairs_in.cbegin(); it != pairs_in.cend(); ++it) { - pairs.push_back(*it); + bool operator<(const FcsArrayWithCell &obj) const + { + std::vector index_a, index_b; + index_a.clear(); + index_b.clear(); + for (int i = 0; i < pairs.size(); ++i) { + index_a.push_back(pairs[i].index); + index_b.push_back(obj.pairs[i].index); + } + for (int i = 0; i < pairs.size(); ++i) { + index_a.push_back(pairs[i].tran); + index_a.push_back(pairs[i].cell_s); + index_b.push_back(obj.pairs[i].tran); + index_b.push_back(obj.pairs[i].cell_s); } + return lexicographical_compare(index_a.begin(), index_a.end(), index_b.begin(), index_b.end()); } }; - inline bool operator<(const FcsArrayWithCell &a, const FcsArrayWithCell &b) - { - std::vector index_a, index_b; - index_a.clear(); - index_b.clear(); - for (int i = 0; i < a.pairs.size(); ++i) { - index_a.push_back(a.pairs[i].index); - index_b.push_back(b.pairs[i].index); - } - for (int i = 0; i < a.pairs.size(); ++i) { - index_a.push_back(a.pairs[i].tran); - index_a.push_back(a.pairs[i].cell_s); - index_b.push_back(b.pairs[i].tran); - index_b.push_back(b.pairs[i].cell_s); - } - return lexicographical_compare(index_a.begin(), index_a.end(), index_b.begin(), index_b.end()); - } - - - class Fcs_phonon: protected Pointers + class Fcs_phonon : protected Pointers { public: Fcs_phonon(class PHON *); + ~Fcs_phonon(); void setup(std::string); + unsigned int maxorder; std::string file_fcs, file_fc2; @@ -170,17 +153,20 @@ namespace PHON_NS bool require_cubic; bool require_quartic; + void set_default_variables(); + void deallocate_variables(); void load_fc2_xml(); - void load_fcs_xml(); + void load_fcs_xml() const; - void examine_translational_invariance(const int, const unsigned int, const unsigned int, + void examine_translational_invariance(int, + unsigned int, + unsigned int, double *, std::vector &, - std::vector *); - + std::vector *) const; - void MPI_Bcast_fc_class(const unsigned int); - void MPI_Bcast_fcs_array(const unsigned int); + void MPI_Bcast_fc_class(unsigned int) const; + void MPI_Bcast_fcs_array(unsigned int) const; void MPI_Bcast_fc2_ext(); }; } diff --git a/anphon/gruneisen.cpp b/anphon/gruneisen.cpp index 7df5f766..794a0663 100644 --- a/anphon/gruneisen.cpp +++ b/anphon/gruneisen.cpp @@ -9,53 +9,75 @@ or http://opensource.org/licenses/mit-license.php for information. */ #include "mpi_common.h" -#include -#include -#include +#include "gruneisen.h" +#include "constants.h" #include "dynamical.h" #include "error.h" #include "fcs_phonon.h" -#include "gruneisen.h" -#include "pointers.h" #include "kpoint.h" +#include "mathfunctions.h" #include "memory.h" -#include "system.h" #include "parsephon.h" -#include "write_phonons.h" -#include "mathfunctions.h" -#include "relaxation.h" +#include "pointers.h" +#include "system.h" +#include "anharmonic_core.h" #include "version.h" +#include +#include #include #include #include #include +#include using namespace PHON_NS; Gruneisen::Gruneisen(PHON *phon): Pointers(phon) { + set_default_variables(); }; Gruneisen::~Gruneisen() { + deallocate_variables(); }; +void Gruneisen::set_default_variables() +{ + delta_a = 0.01; + print_gruneisen = false; + print_newfcs = false; + gruneisen = nullptr; + xshift_s = nullptr; +} + +void Gruneisen::deallocate_variables() +{ + if (gruneisen) { + memory->deallocate(gruneisen); + } + if (xshift_s) { + memory->deallocate(xshift_s); + } + delta_fc2.clear(); + delta_fc3.clear(); +} + + void Gruneisen::setup() { MPI_Bcast(&delta_a, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD); MPI_Bcast(&print_newfcs, 1, MPI_LOGICAL, 0, MPI_COMM_WORLD); - int i, icell, ix, iy, iz; - memory->allocate(xshift_s, 27, 3); - for (i = 0; i < 3; ++i) xshift_s[0][i] = 0.0; + for (int i = 0; i < 3; ++i) xshift_s[0][i] = 0.0; - icell = 0; + int icell = 0; - for (ix = -1; ix <= 1; ++ix) { - for (iy = -1; iy <= 1; ++iy) { - for (iz = -1; iz <= 1; ++iz) { + for (int ix = -1; ix <= 1; ++ix) { + for (int iy = -1; iy <= 1; ++iy) { + for (int iz = -1; iz <= 1; ++iz) { if (ix == 0 && iy == 0 && iz == 0) continue; ++icell; @@ -71,7 +93,7 @@ void Gruneisen::setup() prepare_delta_fcs(fcs_phonon->force_constant_with_cell[1], delta_fc2); } - if (print_newfcs && relaxation->quartic_mode > 0) { + if (print_newfcs && anharmonic_core->quartic_mode > 0) { prepare_delta_fcs(fcs_phonon->force_constant_with_cell[2], delta_fc3); } if (print_gruneisen) { @@ -81,7 +103,7 @@ void Gruneisen::setup() if (mympi->my_rank == 0) { if (print_newfcs) { std::cout << std::endl; - if (relaxation->quartic_mode > 0) { + if (anharmonic_core->quartic_mode > 0) { std::cout << " NEWFCS = 1 : Harmonic and cubic force constants of " << std::endl; } else { std::cout << " NEWFCS = 1 : Harmonic force constants of " << std::endl; @@ -93,28 +115,11 @@ void Gruneisen::setup() // print_stress_energy(); } -void Gruneisen::finish_gruneisen() -{ - if (print_gruneisen) memory->deallocate(gruneisen); - - if (print_gruneisen || print_newfcs) { - - - delta_fc2.clear(); - delta_fc3.clear(); - - } - memory->deallocate(xshift_s); -} - void Gruneisen::calc_gruneisen() { - unsigned int is, ik; - unsigned int i, j; - unsigned int ns = dynamical->neval; - unsigned int nk = kpoint->nk; - double gamma_imag; + auto ns = dynamical->neval; + auto nk = kpoint->nk; std::complex **dfc2_reciprocal; memory->allocate(dfc2_reciprocal, ns, ns); @@ -124,23 +129,23 @@ void Gruneisen::calc_gruneisen() std::cout << " GRUNEISEN = 1 : Calculating Gruneisen parameters ... "; } - for (ik = 0; ik < nk; ++ik) { + for (auto ik = 0; ik < nk; ++ik) { calc_dfc2_reciprocal(dfc2_reciprocal, kpoint->xk[ik]); - for (is = 0; is < ns; ++is) { + for (auto is = 0; is < ns; ++is) { gruneisen[ik][is] = std::complex(0.0, 0.0); - for (i = 0; i < ns; ++i) { - for (j = 0; j < ns; ++j) { + for (unsigned int i = 0; i < ns; ++i) { + for (unsigned int j = 0; j < ns; ++j) { gruneisen[ik][is] += std::conj(dynamical->evec_phonon[ik][is][i]) * dfc2_reciprocal[i][j] * dynamical->evec_phonon[ik][is][j]; } } - gamma_imag = gruneisen[ik][is].imag(); + double gamma_imag = gruneisen[ik][is].imag(); if (std::abs(gamma_imag) > eps10) { error->warn("calc_gruneisen", "Gruneisen parameter is not real"); } @@ -159,39 +164,35 @@ void Gruneisen::calc_gruneisen() } } -void Gruneisen::calc_dfc2_reciprocal(std::complex **dphi2, double *xk_in) +void Gruneisen::calc_dfc2_reciprocal(std::complex **dphi2, + const double *xk_in) { - unsigned int i, j; + unsigned int i; unsigned int ns = dynamical->neval; - unsigned int atm1, atm2, xyz1, xyz2; - unsigned int atm1_s, atm2_s; - unsigned int tran, cell_s; - double vec[3]; - double phase; std::complex im(0.0, 1.0); for (i = 0; i < ns; ++i) { - for (j = 0; j < ns; ++j) { + for (unsigned int j = 0; j < ns; ++j) { dphi2[i][j] = std::complex(0.0, 0.0); } } - for (auto it = delta_fc2.cbegin(); it != delta_fc2.cend(); ++it) { + for (const auto &it : delta_fc2) { - atm1 = (*it).pairs[0].index / 3; - xyz1 = (*it).pairs[0].index % 3; - atm2 = (*it).pairs[1].index / 3; - xyz2 = (*it).pairs[1].index % 3; + unsigned int atm1 = it.pairs[0].index / 3; + unsigned int xyz1 = it.pairs[0].index % 3; + unsigned int atm2 = it.pairs[1].index / 3; + unsigned int xyz2 = it.pairs[1].index % 3; - tran = (*it).pairs[1].tran; - cell_s = (*it).pairs[1].cell_s; + unsigned int tran = it.pairs[1].tran; + unsigned int cell_s = it.pairs[1].cell_s; - atm1_s = system->map_p2s_anharm[atm1][0]; - atm2_s = system->map_p2s_anharm[atm2][tran]; + unsigned int atm1_s = system->map_p2s_anharm[atm1][0]; + unsigned int atm2_s = system->map_p2s_anharm[atm2][tran]; for (i = 0; i < 3; ++i) { @@ -202,18 +203,18 @@ void Gruneisen::calc_dfc2_reciprocal(std::complex **dphi2, double *xk_in rotvec(vec, vec, system->lavec_s_anharm); rotvec(vec, vec, system->rlavec_p); - phase = vec[0] * xk_in[0] + vec[1] * xk_in[1] + vec[2] * xk_in[2]; + double phase = vec[0] * xk_in[0] + vec[1] * xk_in[1] + vec[2] * xk_in[2]; dphi2[3 * atm1 + xyz1][3 * atm2 + xyz2] - += (*it).fcs_val * std::exp(im * phase) + += it.fcs_val * std::exp(im * phase) / std::sqrt(system->mass_anharm[atm1_s] * system->mass_anharm[atm2_s]); } } -void Gruneisen::prepare_delta_fcs(const std::vector fcs_in, - std::vector &delta_fcs) +void Gruneisen::prepare_delta_fcs(const std::vector &fcs_in, + std::vector &delta_fcs) const { unsigned int i; double vec[3]; @@ -227,19 +228,18 @@ void Gruneisen::prepare_delta_fcs(const std::vector fcs_in, AtomCellSuper pairs_tmp; unsigned int norder = fcs_in[0].pairs.size(); - unsigned int nelems; unsigned int nmulti; delta_fcs.clear(); fcs_aligned.clear(); for (auto it = fcs_in.cbegin(); it != fcs_in.cend(); ++it) { - fcs_aligned.push_back(FcsAlignedForGruneisen((*it).fcs_val, (*it).pairs)); + fcs_aligned.emplace_back((*it).fcs_val, (*it).pairs); } std::sort(fcs_aligned.begin(), fcs_aligned.end()); index_old.clear(); - nelems = 2 * (norder - 2) + 1; + unsigned int nelems = 2 * (norder - 2) + 1; for (i = 0; i < nelems; ++i) index_old.push_back(-1); index_with_cell.clear(); @@ -270,21 +270,21 @@ void Gruneisen::prepare_delta_fcs(const std::vector fcs_in, fcs_tmp /= static_cast(nmulti); if (std::abs(fcs_tmp) > eps15) { - for (auto it2 = set_index_uniq.cbegin(); it2 != set_index_uniq.cend(); ++it2) { + for (const auto &it2 : set_index_uniq) { pairs_vec.clear(); - pairs_tmp.index = (*it2)[0]; + pairs_tmp.index = it2[0]; pairs_tmp.tran = 0; pairs_tmp.cell_s = 0; pairs_vec.push_back(pairs_tmp); for (i = 1; i < norder - 1; ++i) { - pairs_tmp.index = (*it2)[3 * i - 2]; - pairs_tmp.tran = (*it2)[3 * i - 1]; - pairs_tmp.cell_s = (*it2)[3 * i]; + pairs_tmp.index = it2[3 * i - 2]; + pairs_tmp.tran = it2[3 * i - 1]; + pairs_tmp.cell_s = it2[3 * i]; pairs_vec.push_back(pairs_tmp); } - delta_fcs.push_back(FcsArrayWithCell(fcs_tmp, pairs_vec)); + delta_fcs.emplace_back(fcs_tmp, pairs_vec); } } set_index_uniq.clear(); @@ -299,7 +299,9 @@ void Gruneisen::prepare_delta_fcs(const std::vector fcs_in, set_index_uniq.insert(index_with_cell); for (i = 0; i < 3; ++i) { - vec[i] = system->xr_s_anharm[system->map_p2s_anharm[(*it).pairs[norder - 1].index / 3][(*it).pairs[norder - 1].tran]][i] + vec[i] = system->xr_s_anharm[system->map_p2s_anharm[(*it).pairs[norder - 1].index / 3][(*it).pairs[norder - + 1].tran]] + [i] - system->xr_s_anharm[system->map_p2s_anharm[(*it).pairs[0].index / 3][0]][i] + xshift_s[(*it).pairs[norder - 1].cell_s][i]; } @@ -313,21 +315,21 @@ void Gruneisen::prepare_delta_fcs(const std::vector fcs_in, fcs_tmp /= static_cast(nmulti); if (std::abs(fcs_tmp) > eps15) { - for (auto it2 = set_index_uniq.cbegin(); it2 != set_index_uniq.cend(); ++it2) { + for (const auto &it2 : set_index_uniq) { pairs_vec.clear(); - pairs_tmp.index = (*it2)[0]; + pairs_tmp.index = it2[0]; pairs_tmp.tran = 0; pairs_tmp.cell_s = 0; pairs_vec.push_back(pairs_tmp); for (i = 1; i < norder - 1; ++i) { - pairs_tmp.index = (*it2)[3 * i - 2]; - pairs_tmp.tran = (*it2)[3 * i - 1]; - pairs_tmp.cell_s = (*it2)[3 * i]; + pairs_tmp.index = it2[3 * i - 2]; + pairs_tmp.tran = it2[3 * i - 1]; + pairs_tmp.cell_s = it2[3 * i]; pairs_vec.push_back(pairs_tmp); } - delta_fcs.push_back(FcsArrayWithCell(fcs_tmp, pairs_vec)); + delta_fcs.emplace_back(fcs_tmp, pairs_vec); } } @@ -345,9 +347,7 @@ void Gruneisen::write_new_fcsxml_all() } else { std::cout << " NEWFCS = 1 : Following XML files are created. " << std::endl; - std::string file_xml; - - file_xml = input->job_title + "_+.xml"; + std::string file_xml = input->job_title + "_+.xml"; write_new_fcsxml(file_xml, delta_a); std::cout << " " << std::setw(input->job_title.length() + 12) << std::left << file_xml; @@ -428,78 +428,76 @@ void Gruneisen::write_new_fcsxml(const std::string filename_xml, pt.put("Data.ForceConstants", ""); str_tmp.clear(); - for (auto it = fcs_phonon->force_constant_with_cell[0].cbegin(); - it != fcs_phonon->force_constant_with_cell[0].cend(); ++it) { + for (const auto &it : fcs_phonon->force_constant_with_cell[0]) { - ptree &child = pt.add("Data.ForceConstants.HARMONIC.FC2", double2string((*it).fcs_val)); + ptree &child = pt.add("Data.ForceConstants.HARMONIC.FC2", double2string(it.fcs_val)); child.put(".pair1", - boost::lexical_cast((*it).pairs[0].index / 3 + 1) - + " " + boost::lexical_cast((*it).pairs[0].index % 3 + 1)); + std::to_string(it.pairs[0].index / 3 + 1) + + " " + std::to_string(it.pairs[0].index % 3 + 1)); child.put(".pair2", - boost::lexical_cast(system->map_p2s[(*it).pairs[1].index / 3][(*it).pairs[1].tran] + 1) - + " " + boost::lexical_cast((*it).pairs[1].index % 3 + 1) - + " " + boost::lexical_cast((*it).pairs[1].cell_s + 1)); + std::to_string(system->map_p2s[it.pairs[1].index / 3][it.pairs[1].tran] + 1) + + " " + std::to_string(it.pairs[1].index % 3 + 1) + + " " + std::to_string(it.pairs[1].cell_s + 1)); } - for (auto it = delta_fc2.cbegin(); it != delta_fc2.cend(); ++it) { + for (const auto &it : delta_fc2) { - if (std::abs((*it).fcs_val) < eps12) continue; + if (std::abs(it.fcs_val) < eps12) continue; ptree &child = pt.add("Data.ForceConstants.HARMONIC.FC2", - double2string(change_ratio_of_a * (*it).fcs_val)); + double2string(change_ratio_of_a * it.fcs_val)); child.put(".pair1", - boost::lexical_cast((*it).pairs[0].index / 3 + 1) - + " " + boost::lexical_cast((*it).pairs[0].index % 3 + 1)); + std::to_string(it.pairs[0].index / 3 + 1) + + " " + std::to_string(it.pairs[0].index % 3 + 1)); child.put(".pair2", - boost::lexical_cast(system->map_p2s[(*it).pairs[1].index / 3][(*it).pairs[1].tran] + 1) - + " " + boost::lexical_cast((*it).pairs[1].index % 3 + 1) - + " " + boost::lexical_cast((*it).pairs[1].cell_s + 1)); + std::to_string(system->map_p2s[it.pairs[1].index / 3][it.pairs[1].tran] + 1) + + " " + std::to_string(it.pairs[1].index % 3 + 1) + + " " + std::to_string(it.pairs[1].cell_s + 1)); } - if (relaxation->quartic_mode) { - for (auto it = fcs_phonon->force_constant_with_cell[1].cbegin(); - it != fcs_phonon->force_constant_with_cell[1].cend(); ++it) { + if (anharmonic_core->quartic_mode) { + for (const auto &it : fcs_phonon->force_constant_with_cell[1]) { - if ((*it).pairs[1].index > (*it).pairs[2].index) continue; + if (it.pairs[1].index > it.pairs[2].index) continue; ptree &child = pt.add("Data.ForceConstants.ANHARM3.FC3", - double2string((*it).fcs_val)); + double2string(it.fcs_val)); child.put(".pair1", - boost::lexical_cast((*it).pairs[0].index / 3 + 1) - + " " + boost::lexical_cast((*it).pairs[0].index % 3 + 1)); + std::to_string(it.pairs[0].index / 3 + 1) + + " " + std::to_string(it.pairs[0].index % 3 + 1)); child.put(".pair2", - boost::lexical_cast(system->map_p2s[(*it).pairs[1].index / 3][(*it).pairs[1].tran] + 1) - + " " + boost::lexical_cast((*it).pairs[1].index % 3 + 1) - + " " + boost::lexical_cast((*it).pairs[1].cell_s + 1)); + std::to_string(system->map_p2s[it.pairs[1].index / 3][it.pairs[1].tran] + 1) + + " " + std::to_string(it.pairs[1].index % 3 + 1) + + " " + std::to_string(it.pairs[1].cell_s + 1)); child.put(".pair3", - boost::lexical_cast(system->map_p2s[(*it).pairs[2].index / 3][(*it).pairs[2].tran] + 1) - + " " + boost::lexical_cast((*it).pairs[2].index % 3 + 1) - + " " + boost::lexical_cast((*it).pairs[2].cell_s + 1)); + std::to_string(system->map_p2s[it.pairs[2].index / 3][it.pairs[2].tran] + 1) + + " " + std::to_string(it.pairs[2].index % 3 + 1) + + " " + std::to_string(it.pairs[2].cell_s + 1)); } - for (auto it = delta_fc3.cbegin(); it != delta_fc3.cend(); ++it) { + for (const auto &it : delta_fc3) { - if (std::abs((*it).fcs_val) < eps12) continue; + if (std::abs(it.fcs_val) < eps12) continue; - if ((*it).pairs[1].index > (*it).pairs[2].index) continue; + if (it.pairs[1].index > it.pairs[2].index) continue; ptree &child = pt.add("Data.ForceConstants.ANHARM3.FC3", - double2string(change_ratio_of_a * (*it).fcs_val)); + double2string(change_ratio_of_a * it.fcs_val)); child.put(".pair1", - boost::lexical_cast((*it).pairs[0].index / 3 + 1) - + " " + boost::lexical_cast((*it).pairs[0].index % 3 + 1)); + std::to_string(it.pairs[0].index / 3 + 1) + + " " + std::to_string(it.pairs[0].index % 3 + 1)); child.put(".pair2", - boost::lexical_cast(system->map_p2s[(*it).pairs[1].index / 3][(*it).pairs[1].tran] + 1) - + " " + boost::lexical_cast((*it).pairs[1].index % 3 + 1) - + " " + boost::lexical_cast((*it).pairs[1].cell_s + 1)); + std::to_string(system->map_p2s[it.pairs[1].index / 3][it.pairs[1].tran] + 1) + + " " + std::to_string(it.pairs[1].index % 3 + 1) + + " " + std::to_string(it.pairs[1].cell_s + 1)); child.put(".pair3", - boost::lexical_cast(system->map_p2s[(*it).pairs[2].index / 3][(*it).pairs[2].tran] + 1) - + " " + boost::lexical_cast((*it).pairs[2].index % 3 + 1) - + " " + boost::lexical_cast((*it).pairs[2].cell_s + 1)); + std::to_string(system->map_p2s[it.pairs[2].index / 3][it.pairs[2].tran] + 1) + + " " + std::to_string(it.pairs[2].index % 3 + 1) + + " " + std::to_string(it.pairs[2].cell_s + 1)); } } @@ -516,7 +514,7 @@ void Gruneisen::write_new_fcsxml(const std::string filename_xml, } -std::string Gruneisen::double2string(const double d) +std::string Gruneisen::double2string(const double d) const { std::string rt; std::stringstream ss; diff --git a/anphon/gruneisen.h b/anphon/gruneisen.h index 72ce59dc..c56f9ea8 100644 --- a/anphon/gruneisen.h +++ b/anphon/gruneisen.h @@ -18,100 +18,115 @@ namespace PHON_NS { - // class FcsClassGru { - // public: - // std::vector elems; - // double fcs_val; - // - // FcsClassGru(); - // FcsClassGru(const int n, int *arr, double fcs) { - // for (int i = 0; i < n; ++i) { - // elems.push_back(arr[i]); - // } - // fcs_val = fcs; - // } - // }; - // - // inline bool operator<(const FcsClassGru &a, const FcsClassGru &b) { - // return std::lexicographical_compare(a.elems.begin(), a.elems.end(), b.elems.begin(), b.elems.end()); - // } - class FcsAlignedForGruneisen { public: std::vector pairs; double fcs_val; - FcsAlignedForGruneisen() - { - }; + FcsAlignedForGruneisen() { }; - FcsAlignedForGruneisen(const double fcs_in, const std::vector pairs_in) - { - fcs_val = fcs_in; + FcsAlignedForGruneisen(const double fcs_in, + const std::vector &pairs_in) + : pairs(pairs_in), fcs_val(fcs_in) {}; - for (auto it = pairs_in.cbegin(); it != pairs_in.cend(); ++it) { - pairs.push_back(*it); + bool operator<(const FcsAlignedForGruneisen &obj) const + { + std::vector array_a, array_b; + array_a.clear(); + array_b.clear(); + int len = pairs.size(); + for (int i = 0; i < len - 1; ++i) { + array_a.push_back(pairs[i].index); + array_a.push_back(pairs[i].tran); + array_b.push_back(obj.pairs[i].index); + array_b.push_back(obj.pairs[i].tran); + } + for (int i = 0; i < len - 1; ++i) { + array_a.push_back(pairs[i].cell_s); + array_b.push_back(obj.pairs[i].cell_s); } + + array_a.push_back(pairs[len - 1].index); + array_a.push_back(pairs[len - 1].tran); + array_b.push_back(obj.pairs[len - 1].index); + array_b.push_back(obj.pairs[len - 1].tran); + return std::lexicographical_compare(array_a.begin(), array_a.end(), + array_b.begin(), array_b.end()); } }; - inline bool operator<(const FcsAlignedForGruneisen &a, const FcsAlignedForGruneisen &b) - { - std::vector array_a, array_b; - array_a.clear(); - array_b.clear(); - int len = a.pairs.size(); - for (int i = 0; i < len - 1; ++i) { - array_a.push_back(a.pairs[i].index); - // array_a.push_back(a.pairs[i].index/3); - array_a.push_back(a.pairs[i].tran); - // array_a.push_back(a.pairs[i].cell_s); - // array_a.push_back(a.pairs[i].index%3); - array_b.push_back(b.pairs[i].index); - // array_b.push_back(b.pairs[i].index/3); - array_b.push_back(b.pairs[i].tran); - // array_b.push_back(b.pairs[i].cell_s); - // array_b.push_back(b.pairs[i].index%3); - } - for (int i = 0; i < len - 1; ++i) { - array_a.push_back(a.pairs[i].cell_s); - array_b.push_back(b.pairs[i].cell_s); - } + //inline bool operator<(const FcsAlignedForGruneisen &a, const FcsAlignedForGruneisen &b) + //{ + // std::vector array_a, array_b; + // array_a.clear(); + // array_b.clear(); + // int len = a.pairs.size(); + // for (int i = 0; i < len - 1; ++i) { + // array_a.push_back(a.pairs[i].index); + // // array_a.push_back(a.pairs[i].index/3); + // array_a.push_back(a.pairs[i].tran); + // // array_a.push_back(a.pairs[i].cell_s); + // // array_a.push_back(a.pairs[i].index%3); + // array_b.push_back(b.pairs[i].index); + // // array_b.push_back(b.pairs[i].index/3); + // array_b.push_back(b.pairs[i].tran); + // // array_b.push_back(b.pairs[i].cell_s); + // // array_b.push_back(b.pairs[i].index%3); + // } + // for (int i = 0; i < len - 1; ++i) { + // array_a.push_back(a.pairs[i].cell_s); + // array_b.push_back(b.pairs[i].cell_s); + // } - array_a.push_back(a.pairs[len - 1].index); - array_a.push_back(a.pairs[len - 1].tran); - array_b.push_back(b.pairs[len - 1].index); - array_b.push_back(b.pairs[len - 1].tran); - return std::lexicographical_compare(array_a.begin(), array_a.end(), - array_b.begin(), array_b.end()); - } + // array_a.push_back(a.pairs[len - 1].index); + // array_a.push_back(a.pairs[len - 1].tran); + // array_b.push_back(b.pairs[len - 1].index); + // array_b.push_back(b.pairs[len - 1].tran); + // return std::lexicographical_compare(array_a.begin(), array_a.end(), + // array_b.begin(), array_b.end()); + //} - class Gruneisen: protected Pointers + class Gruneisen : protected Pointers { public: Gruneisen(class PHON *); + ~Gruneisen(); double delta_a; bool print_gruneisen; bool print_newfcs; + void setup(); + std::complex **gruneisen; + void calc_gruneisen(); - void finish_gruneisen(); void write_new_fcsxml_all(); private: + void set_default_variables(); + void deallocate_variables(); + double **xshift_s; std::vector delta_fc2, delta_fc3; - void prepare_delta_fcs(const std::vector, - std::vector &); - void calc_dfc2_reciprocal(std::complex **, double *); - void write_new_fcsxml(const std::string, const double); - std::string double2string(const double); + + void prepare_delta_fcs(const std::vector &, + std::vector &) const; + + void calc_dfc2_reciprocal(std::complex **, + const double *); + + void write_new_fcsxml(std::string, + double); + + std::string double2string(double) const; + // double calc_stress_energy2(const std::vector); - void calc_stress_energy3(const std::vector, double ****); + void calc_stress_energy3(std::vector, + double ****); + void print_stress_energy(); }; } diff --git a/anphon/integration.cpp b/anphon/integration.cpp index 73140eb7..0be9eeae 100644 --- a/anphon/integration.cpp +++ b/anphon/integration.cpp @@ -10,34 +10,53 @@ #include "mpi_common.h" #include "integration.h" +#include "error.h" #include "kpoint.h" +#include "mathfunctions.h" #include "memory.h" #include "system.h" -#include "error.h" #include #include #include #include -#include "mathfunctions.h" using namespace PHON_NS; Integration::Integration(PHON *phon): Pointers(phon) { + set_default_variables(); } Integration::~Integration() { + deallocate_variables(); }; +void Integration::set_default_variables() +{ + use_tetrahedron = true; + ismear = -1; + epsilon = 0.0; + ntetra = 0; + tetras = nullptr; +} + +void Integration::deallocate_variables() +{ + if (tetras) { + memory->deallocate(tetras); + } +} + + void Integration::setup_integration() { MPI_Bcast(&ismear, 1, MPI_INT, 0, MPI_COMM_WORLD); - unsigned int nk = kpoint->nk; - unsigned int nkx = kpoint->nkx; - unsigned int nky = kpoint->nky; - unsigned int nkz = kpoint->nkz; + auto nk = kpoint->nk; + auto nkx = kpoint->nkx; + auto nky = kpoint->nky; + auto nkz = kpoint->nkz; if (mympi->my_rank == 0) { std::cout << std::endl; @@ -65,39 +84,31 @@ void Integration::setup_integration() MPI_Bcast(&epsilon, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD); } -void Integration::finish_integration() -{ - if (ismear == -1) { - memory->deallocate(tetras); - } -} -void Integration::prepare_tetrahedron(const int nk1, const int nk2, const int nk3) +void Integration::prepare_tetrahedron(const int nk1, + const int nk2, + const int nk3) const { - int i, j, k, ii, jj, kk; - int n1, n2, n3, n4, n5, n6, n7, n8; - int m; - int nk23 = nk2 * nk3; - for (i = 0; i < nk1; ++i) { - for (j = 0; j < nk2; ++j) { - for (k = 0; k < nk3; ++k) { + for (int i = 0; i < nk1; ++i) { + for (int j = 0; j < nk2; ++j) { + for (int k = 0; k < nk3; ++k) { - ii = (i + 1) % nk1; - jj = (j + 1) % nk2; - kk = (k + 1) % nk3; + int ii = (i + 1) % nk1; + int jj = (j + 1) % nk2; + int kk = (k + 1) % nk3; - n1 = k + j * nk3 + i * nk23; - n2 = k + j * nk3 + ii * nk23; - n3 = k + jj * nk3 + i * nk23; - n4 = k + jj * nk3 + ii * nk23; - n5 = kk + j * nk3 + i * nk23; - n6 = kk + j * nk3 + ii * nk23; - n7 = kk + jj * nk3 + i * nk23; - n8 = kk + jj * nk3 + ii * nk23; + int n1 = k + j * nk3 + i * nk23; + int n2 = k + j * nk3 + ii * nk23; + int n3 = k + jj * nk3 + i * nk23; + int n4 = k + jj * nk3 + ii * nk23; + int n5 = kk + j * nk3 + i * nk23; + int n6 = kk + j * nk3 + ii * nk23; + int n7 = kk + jj * nk3 + i * nk23; + int n8 = kk + jj * nk3 + ii * nk23; - m = 6 * (k + j * nk3 + i * nk23); + int m = 6 * (k + j * nk3 + i * nk23); tetras[m][0] = n1; tetras[m][1] = n2; @@ -143,7 +154,9 @@ void Integration::prepare_tetrahedron(const int nk1, const int nk2, const int nk } } -double Integration::do_tetrahedron(double *energy, double *f, const double e_ref) +double Integration::do_tetrahedron(double *energy, + double *f, + const double e_ref) { /* This function returns the summation of the given function f_{k} @@ -153,27 +166,22 @@ double Integration::do_tetrahedron(double *energy, double *f, const double e_ref */ - unsigned int i, j; - int knum; - double ret = 0.0; - double e1, e2, e3, e4; double I1, I2, I3, I4; - double f1, f2, f3, f4; double frac3 = 1.0 / 3.0; - double g, vol, vol_tot; + double g; tetra_pair pair; - vol_tot = 0.0; + double vol_tot = 0.0; - for (i = 0; i < ntetra; ++i) { + for (unsigned int i = 0; i < ntetra; ++i) { tetra_data.clear(); - for (j = 0; j < 4; ++j) { - knum = tetras[i][j]; + for (unsigned int j = 0; j < 4; ++j) { + int knum = tetras[i][j]; pair.e = energy[knum]; pair.f = f[knum]; tetra_data.push_back(pair); @@ -181,17 +189,17 @@ double Integration::do_tetrahedron(double *energy, double *f, const double e_ref std::sort(tetra_data.begin(), tetra_data.end()); - e1 = tetra_data[0].e; - e2 = tetra_data[1].e; - e3 = tetra_data[2].e; - e4 = tetra_data[3].e; + double e1 = tetra_data[0].e; + double e2 = tetra_data[1].e; + double e3 = tetra_data[2].e; + double e4 = tetra_data[3].e; - f1 = tetra_data[0].f; - f2 = tetra_data[1].f; - f3 = tetra_data[2].f; - f4 = tetra_data[3].f; + double f1 = tetra_data[0].f; + double f2 = tetra_data[1].f; + double f3 = tetra_data[2].f; + double f4 = tetra_data[3].f; - vol = volume(tetras[i]); + double vol = volume(tetras[i]); vol_tot += vol; if (e3 <= e_ref && e_ref < e4) { @@ -205,13 +213,15 @@ double Integration::do_tetrahedron(double *energy, double *f, const double e_ref ret += vol * g * (I1 * f1 + I2 * f2 + I3 * f3 + I4 * f4); } else if (e2 <= e_ref && e_ref < e3) { - g = 3.0 * ((e2 - e1) + 2.0 * (e_ref - e2) - (e4 + e3 - e2 - e1) - * std::pow((e_ref - e2), 2) / ((e3 - e2) * (e4 - e2))) / ((e3 - e1) * (e4 - e1)); + g = 3.0 * (e2 - e1 + 2.0 * (e_ref - e2) - (e4 + e3 - e2 - e1) + * std::pow(e_ref - e2, 2) / ((e3 - e2) * (e4 - e2))) / ((e3 - e1) * (e4 - e1)); - I1 = frac3 * fij(e1, e4, e_ref) * g + fij(e1, e3, e_ref) * fij(e3, e1, e_ref) * fij(e2, e3, e_ref) / (e4 - e1); + I1 = frac3 * fij(e1, e4, e_ref) * g + fij(e1, e3, e_ref) * fij(e3, e1, e_ref) * fij(e2, e3, e_ref) / (e4 - + e1); I2 = frac3 * fij(e2, e3, e_ref) * g + std::pow(fij(e2, e4, e_ref), 2) * fij(e3, e2, e_ref) / (e4 - e1); I3 = frac3 * fij(e3, e2, e_ref) * g + std::pow(fij(e3, e1, e_ref), 2) * fij(e2, e3, e_ref) / (e4 - e1); - I4 = frac3 * fij(e4, e1, e_ref) * g + fij(e4, e2, e_ref) * fij(e2, e4, e_ref) * fij(e3, e2, e_ref) / (e4 - e1); + I4 = frac3 * fij(e4, e1, e_ref) * g + fij(e4, e2, e_ref) * fij(e2, e4, e_ref) * fij(e3, e2, e_ref) / (e4 - + e1); ret += vol * (I1 * f1 + I2 * f2 + I3 * f3 + I4 * f4); @@ -232,39 +242,36 @@ double Integration::do_tetrahedron(double *energy, double *f, const double e_ref return ret / vol_tot; } -double Integration::dos_integration(double *energy, const double e_ref) +double Integration::dos_integration(double *energy, + const double e_ref) { double dos_ret = 0.0; - - unsigned int i, j; std::vector e_tetra; - double e1, e2, e3, e4; - double vol, vol_tot; - vol_tot = 0.0; + double vol_tot = 0.0; - for (i = 0; i < ntetra; ++i) { + for (auto i = 0; i < ntetra; ++i) { e_tetra.clear(); - for (j = 0; j < 4; ++j) { + for (auto j = 0; j < 4; ++j) { e_tetra.push_back(energy[tetras[i][j]]); } std::sort(e_tetra.begin(), e_tetra.end()); - e1 = e_tetra[0]; - e2 = e_tetra[1]; - e3 = e_tetra[2]; - e4 = e_tetra[3]; + double e1 = e_tetra[0]; + double e2 = e_tetra[1]; + double e3 = e_tetra[2]; + double e4 = e_tetra[3]; - vol = volume(tetras[i]); + double vol = volume(tetras[i]); vol_tot += vol; if (e3 <= e_ref && e_ref < e4) { - dos_ret += vol * (3.0 * std::pow((e4 - e_ref), 2) / ((e4 - e1) * (e4 - e2) * (e4 - e3))); + dos_ret += vol * (3.0 * std::pow(e4 - e_ref, 2) / ((e4 - e1) * (e4 - e2) * (e4 - e3))); } else if (e2 <= e_ref && e_ref < e3) { - dos_ret += vol * 3.0 * ((e2 - e1) + 2.0 * (e_ref - e2) - (e4 + e3 - e2 - e1) - * std::pow((e_ref - e2), 2) / ((e3 - e2) * (e4 - e2))) / ((e3 - e1) * (e4 - e1)); + dos_ret += vol * 3.0 * (e2 - e1 + 2.0 * (e_ref - e2) - (e4 + e3 - e2 - e1) + * std::pow(e_ref - e2, 2) / ((e3 - e2) * (e4 - e2))) / ((e3 - e1) * (e4 - e1)); } else if (e1 <= e_ref && e_ref < e2) { - dos_ret += vol * 3.0 * std::pow((e_ref - e1), 2) / ((e2 - e1) * (e3 - e1) * (e4 - e1)); + dos_ret += vol * 3.0 * std::pow(e_ref - e1, 2) / ((e2 - e1) * (e3 - e1) * (e4 - e1)); } } @@ -273,21 +280,16 @@ double Integration::dos_integration(double *energy, const double e_ref) void Integration::calc_weight_tetrahedron(const int nk_irreducible, - int *map_to_irreducible_k, + const int *map_to_irreducible_k, double *weight, - double *energy, + const double *energy, const double e_ref) { - int i, j; - double vol; - double vol_tot; + int i; double g; - double I1, I2, I3, I4; - int k1, k2, k3, k4; - double e1, e2, e3, e4; - vol_tot = 0.0; + double vol_tot = 0.0; // std::vector tetra_data; // TetraWithKnum pair; double e_tmp[4]; @@ -297,51 +299,29 @@ void Integration::calc_weight_tetrahedron(const int nk_irreducible, for (i = 0; i < ntetra; ++i) { - for (j = 0; j < 4; ++j) { + for (int j = 0; j < 4; ++j) { e_tmp[j] = energy[tetras[i][j]]; kindex[j] = map_to_irreducible_k[tetras[i][j]]; } insertion_sort(e_tmp, sort_arg, 4); - e1 = e_tmp[0]; - e2 = e_tmp[1]; - e3 = e_tmp[2]; - e4 = e_tmp[3]; - - k1 = kindex[sort_arg[0]]; - k2 = kindex[sort_arg[1]]; - k3 = kindex[sort_arg[2]]; - k4 = kindex[sort_arg[3]]; - + double e1 = e_tmp[0]; + double e2 = e_tmp[1]; + double e3 = e_tmp[2]; + double e4 = e_tmp[3]; - /* - tetra_data.clear(); + int k1 = kindex[sort_arg[0]]; + int k2 = kindex[sort_arg[1]]; + int k3 = kindex[sort_arg[2]]; + int k4 = kindex[sort_arg[3]]; - for (j = 0; j < 4; ++j) { - pair.e = energy[tetras[i][j]]; - pair.knum = map_to_irreducible_k[tetras[i][j]]; - tetra_data.push_back(pair); - } - - std::sort(tetra_data.begin(), tetra_data.end()); - - e1 = tetra_data[0].e; - e2 = tetra_data[1].e; - e3 = tetra_data[2].e; - e4 = tetra_data[3].e; - - k1 = tetra_data[0].knum; - k2 = tetra_data[1].knum; - k3 = tetra_data[2].knum; - k4 = tetra_data[3].knum; - */ - vol = volume(tetras[i]); + double vol = volume(tetras[i]); vol_tot += vol; - I1 = 0.0; - I2 = 0.0; - I3 = 0.0; - I4 = 0.0; + double I1 = 0.0; + double I2 = 0.0; + double I3 = 0.0; + double I4 = 0.0; if (e3 <= e_ref && e_ref < e4) { // g = 3.0 * std::pow(e4 - e_ref, 2) / ((e4 - e1) * (e4 - e2) * (e4 - e3)); @@ -355,8 +335,8 @@ void Integration::calc_weight_tetrahedron(const int nk_irreducible, } else if (e2 <= e_ref && e_ref < e3) { // g = 3.0 * ((e2 - e1) + 2.0 * (e_ref - e2) - (e4 + e3 - e2 - e1) // * std::pow((e_ref - e2), 2) / ((e3 - e2) * (e4 - e2))) / ((e3 - e1) * (e4 - e1)); - g = ((e2 - e1) + 2.0 * (e_ref - e2) - (e4 + e3 - e2 - e1) - * std::pow((e_ref - e2), 2) / ((e3 - e2) * (e4 - e2))) / ((e3 - e1) * (e4 - e1)); + g = (e2 - e1 + 2.0 * (e_ref - e2) - (e4 + e3 - e2 - e1) + * std::pow(e_ref - e2, 2) / ((e3 - e2) * (e4 - e2))) / ((e3 - e1) * (e4 - e1)); I1 = g * fij(e1, e4, e_ref) + fij(e1, e3, e_ref) * fij(e3, e1, e_ref) * fij(e2, e3, e_ref) / (e4 - e1); I2 = g * fij(e2, e3, e_ref) + std::pow(fij(e2, e4, e_ref), 2) * fij(e3, e2, e_ref) / (e4 - e1); @@ -382,11 +362,11 @@ void Integration::calc_weight_tetrahedron(const int nk_irreducible, for (i = 0; i < nk_irreducible; ++i) weight[i] /= vol_tot; } -void PHON_NS::Integration::calc_weight_smearing(const std::vector> &kpinfo, - double *weight, - double *energy, - const double e_ref, - const int smearing_method) +void Integration::calc_weight_smearing(const std::vector> &kpinfo, + double *weight, + double *energy, + const double e_ref, + const int smearing_method) const { unsigned int i; unsigned int knum; @@ -406,13 +386,13 @@ void PHON_NS::Integration::calc_weight_smearing(const std::vectorxk[klist[1]][i] - kpoint->xk[klist[0]][i]); k2[i] = refold(kpoint->xk[klist[2]][i] - kpoint->xk[klist[0]][i]); k3[i] = refold(kpoint->xk[klist[3]][i] - kpoint->xk[klist[0]][i]); @@ -451,42 +429,43 @@ double Integration::volume(int *klist) rotvec(k2, k2, system->rlavec_p, 'T'); rotvec(k3, k3, system->rlavec_p, 'T'); - vol = std::abs(k1[0] * (k2[1] * k3[2] - k2[2] * k3[1]) + double vol = std::abs(k1[0] * (k2[1] * k3[2] - k2[2] * k3[1]) + k1[1] * (k2[2] * k3[0] - k2[0] * k3[2]) + k1[2] * (k2[0] * k3[1] - k2[1] * k3[0])); return vol; } -double Integration::fij(const double ei, const double ej, const double e) +double Integration::fij(const double ei, + const double ej, + const double e) const { return (e - ej) / (ei - ej); } -double Integration::refold(double x) +double Integration::refold(double x) const { if (std::abs(x) > 0.5) { if (x < 0.0) { return x + 1.0; - } else { - return x - 1.0; } - } else { - return x; + return x - 1.0; } + return x; } -void Integration::insertion_sort(double *a, int *ind, int n) +void Integration::insertion_sort(double *a, + int *ind, + int n) const { - int i, j; - double tmp; + int i; for (i = 0; i < n; ++i) ind[i] = i; for (i = 1; i < n; ++i) { - tmp = a[i]; + double tmp = a[i]; - j = i; + int j = i; while (j > 0 && tmp < a[j - 1]) { a[j] = a[j - 1]; ind[j] = ind[j - 1]; diff --git a/anphon/integration.h b/anphon/integration.h index 4ef0d90f..01a48116 100644 --- a/anphon/integration.h +++ b/anphon/integration.h @@ -23,7 +23,8 @@ namespace PHON_NS double f; }; - inline bool operator<(const tetra_pair &a, const tetra_pair &b) + inline bool operator<(const tetra_pair &a, + const tetra_pair &b) { return a.e < b.e; } @@ -34,12 +35,13 @@ namespace PHON_NS int knum; }; - inline bool operator<(const TetraWithKnum &a, const TetraWithKnum &b) + inline bool operator<(const TetraWithKnum &a, + const TetraWithKnum &b) { return a.e < b.e; } - class Integration: protected Pointers + class Integration : protected Pointers { public: Integration(class PHON *); @@ -50,36 +52,68 @@ namespace PHON_NS double epsilon; void setup_integration(); - void finish_integration(); - double do_tetrahedron(double *, double *, const double); - double dos_integration(double *, const double); - void calc_weight_tetrahedron(const int, int *, - double *, double *, - const double); + + double do_tetrahedron(double *, + double *, + double); + + double dos_integration(double *, + double); + + void calc_weight_tetrahedron(int, + const int *, + double *, + const double *, + double); + void calc_weight_smearing(const std::vector> &, - double *, double *, - const double, const int); - void calc_weight_smearing(const int, const int, int *, - double *, double *, const double, - const int); + double *, + double *, + double, + int) const; + + void calc_weight_smearing(int, + int, + const int *, + double *, + double *, + double, + int) const; private: + void set_default_variables(); + void deallocate_variables(); + unsigned int ntetra; int **tetras; - void prepare_tetrahedron(const int, const int, const int); - inline double fij(const double, const double, const double); - inline double volume(int *); + + void prepare_tetrahedron(int, + int, + int) const; + + inline double fij(double, + double, + double) const; + + inline double volume(const int *); + std::vector tetra_data; - inline double refold(double); - void insertion_sort(double *, int *, const int); + + inline double refold(double) const; + + void insertion_sort(double *, + int *, + int) const; }; - inline double delta_lorentz(const double omega, const double epsilon) + inline double delta_lorentz(const double omega, + const double epsilon) { return inverse_pi * epsilon / (omega * omega + epsilon * epsilon); } - inline double delta_gauss(const double omega, const double epsilon) + inline double delta_gauss(const double omega, + const double epsilon) { return std::exp(- omega * omega / (epsilon * epsilon)) / (epsilon * std::sqrt(pi)); } diff --git a/anphon/isotope.cpp b/anphon/isotope.cpp index 414acfa2..e2287ce0 100644 --- a/anphon/isotope.cpp +++ b/anphon/isotope.cpp @@ -10,39 +10,63 @@ #include "mpi_common.h" #include "isotope.h" +#include "constants.h" +#include "dynamical.h" +#include "error.h" +#include "integration.h" +#include "kpoint.h" #include "memory.h" #include "system.h" -#include "dynamical.h" #include -#include "kpoint.h" #include -#include "constants.h" -#include "integration.h" using namespace PHON_NS; Isotope::Isotope(PHON *phon): Pointers(phon) { + set_default_variables(); }; Isotope::~Isotope() { - if (phon->mode == "RTA" && include_isotope) { + deallocate_variables(); +}; + +void Isotope::set_default_variables() +{ + include_isotope = false; + isotope_factor = nullptr; + gamma_isotope = nullptr; +} + +void Isotope::deallocate_variables() +{ + if (isotope_factor) { memory->deallocate(isotope_factor); + } + if (gamma_isotope) { memory->deallocate(gamma_isotope); } -}; +} void Isotope::setup_isotope_scattering() { - int i; int nkd = system->nkd; MPI_Bcast(&include_isotope, 1, MPI_INT, 0, MPI_COMM_WORLD); if (include_isotope) { + if (mympi->my_rank == 0) { + if (!isotope_factor) { + memory->allocate(isotope_factor, nkd); + set_isotope_factor_from_database(nkd, + system->symbol_kd, + isotope_factor); + } + } + if (mympi->my_rank > 0) { memory->allocate(isotope_factor, nkd); } @@ -53,55 +77,50 @@ void Isotope::setup_isotope_scattering() std::cout << " ISOTOPE >= 1: Isotope scattering effects will be considered" << std::endl; std::cout << " with the following scattering factors." << std::endl; - for (i = 0; i < nkd; ++i) { + for (int i = 0; i < nkd; ++i) { std::cout << std::setw(5) << system->symbol_kd[i] << ":"; std::cout << std::scientific << std::setw(17) << isotope_factor[i] << std::endl; } std::cout << std::endl; } - memory->allocate(gamma_isotope, kpoint->nk_reduced, dynamical->neval); + memory->allocate(gamma_isotope, kpoint->nk_irred, dynamical->neval); } } void Isotope::calc_isotope_selfenergy(const int knum, const int snum, const double omega, - double &ret) + double &ret) const { // Compute phonon selfenergy of phonon (knum, snum) // due to phonon-isotope scatterings. // Delta functions are replaced by smearing functions with width EPSILON. - int iat, icrd; - int ik, is; - double prod; - std::complex dprod; int nk = kpoint->nk; int ns = dynamical->neval; int natmin = system->natmin; - double omega1; double epsilon = integration->epsilon; ret = 0.0; - for (ik = 0; ik < nk; ++ik) { - for (is = 0; is < ns; ++is) { + for (int ik = 0; ik < nk; ++ik) { + for (int is = 0; is < ns; ++is) { - prod = 0.0; + double prod = 0.0; - for (iat = 0; iat < natmin; ++iat) { + for (int iat = 0; iat < natmin; ++iat) { - dprod = std::complex(0.0, 0.0); - for (icrd = 0; icrd < 3; ++icrd) { + std::complex dprod = std::complex(0.0, 0.0); + for (int icrd = 0; icrd < 3; ++icrd) { dprod += std::conj(dynamical->evec_phonon[ik][is][3 * iat + icrd]) * dynamical->evec_phonon[knum][snum][3 * iat + icrd]; } prod += isotope_factor[system->kd[system->map_p2s[iat][0]]] * std::norm(dprod); } - omega1 = dynamical->eval_phonon[ik][is]; + double omega1 = dynamical->eval_phonon[ik][is]; if (integration->ismear == 0) { ret += omega1 * delta_lorentz(omega - omega1, epsilon) * prod; @@ -118,16 +137,13 @@ void Isotope::calc_isotope_selfenergy(const int knum, void Isotope::calc_isotope_selfenergy_tetra(const int knum, const int snum, const double omega, - double &ret) + double &ret) const { // Compute phonon selfenergy of phonon (knum, snum) // due to phonon-isotope scatterings. // This version employs the tetrahedron method. - int iat, icrd; int ik, is; - double prod; - std::complex dprod; int nk = kpoint->nk; int ns = dynamical->neval; int natmin = system->natmin; @@ -149,12 +165,12 @@ void Isotope::calc_isotope_selfenergy_tetra(const int knum, for (ik = 0; ik < nk; ++ik) { for (is = 0; is < ns; ++is) { - prod = 0.0; + double prod = 0.0; - for (iat = 0; iat < natmin; ++iat) { + for (int iat = 0; iat < natmin; ++iat) { - dprod = std::complex(0.0, 0.0); - for (icrd = 0; icrd < 3; ++icrd) { + std::complex dprod = std::complex(0.0, 0.0); + for (int icrd = 0; icrd < 3; ++icrd) { dprod += std::conj(dynamical->evec_phonon[ik][is][3 * iat + icrd]) * dynamical->evec_phonon[knum][snum][3 * iat + icrd]; } @@ -174,12 +190,11 @@ void Isotope::calc_isotope_selfenergy_tetra(const int knum, void Isotope::calc_isotope_selfenergy_all() { - int i, j; + int i; int nk = kpoint->nk; int ns = dynamical->neval; - int nks = kpoint->nk_reduced * ns; - int knum, snum; - double tmp, omega; + int nks = kpoint->nk_irred * ns; + double tmp; double *gamma_tmp, *gamma_loc; if (include_isotope) { @@ -194,9 +209,9 @@ void Isotope::calc_isotope_selfenergy_all() for (i = 0; i < nks; ++i) gamma_loc[i] = 0.0; for (i = mympi->my_rank; i < nks; i += mympi->nprocs) { - knum = kpoint->kpoint_irred_all[i / ns][0].knum; - snum = i % ns; - omega = dynamical->eval_phonon[knum][snum]; + int knum = kpoint->kpoint_irred_all[i / ns][0].knum; + int snum = i % ns; + double omega = dynamical->eval_phonon[knum][snum]; if (integration->ismear == -1) { calc_isotope_selfenergy_tetra(knum, snum, omega, tmp); } else { @@ -208,8 +223,8 @@ void Isotope::calc_isotope_selfenergy_all() MPI_Reduce(&gamma_loc[0], &gamma_tmp[0], nks, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); - for (i = 0; i < kpoint->nk_reduced; ++i) { - for (j = 0; j < ns; ++j) { + for (i = 0; i < kpoint->nk_irred; ++i) { + for (int j = 0; j < ns; ++j) { gamma_isotope[i][j] = gamma_tmp[ns * i + j]; } } @@ -222,3 +237,22 @@ void Isotope::calc_isotope_selfenergy_all() } } } + +void Isotope::set_isotope_factor_from_database(const int nkd, + const std::string *symbol_in, + double *isofact_out) +{ + for (int i = 0; i < nkd; ++i) { + int atom_number = system->get_atomic_number_by_name(symbol_in[i]); + if (atom_number >= isotope_factors.size() || atom_number == -1) { + error->exit("set_isotope_factor_from_database", + "The isotope factor for the given element doesn't exist in the database.\nTherefore, please input ISOFACT manually."); + } + double isofact_tmp = isotope_factors[atom_number]; + if (isofact_tmp < -0.5) { + error->exit("set_isotope_factor_from_database", + "One of the elements in the KD-tag is unstable. \nTherefore, please input ISOFACT manually."); + } + isofact_out[i] = isofact_tmp; + } +} diff --git a/anphon/isotope.h b/anphon/isotope.h index 86052359..28ac4c1e 100644 --- a/anphon/isotope.h +++ b/anphon/isotope.h @@ -8,31 +8,61 @@ or http://opensource.org/licenses/mit-license.php for information. */ -#include "mpi_common.h" #include "pointers.h" - +#include namespace PHON_NS { - class Isotope: protected Pointers + class Isotope : protected Pointers { public: Isotope(class PHON *); + ~Isotope(); int include_isotope; double *isotope_factor; - double **gamma_isotope; void setup_isotope_scattering(); void calc_isotope_selfenergy_all(); private: - void calc_isotope_selfenergy(const int, const int, - const double, double &); - void calc_isotope_selfenergy_tetra(const int, const int, - const double, double &); + void set_default_variables(); + void deallocate_variables(); + + void calc_isotope_selfenergy(int, + int, + double, + double &) const; + + void calc_isotope_selfenergy_tetra(int, + int, + double, + double &) const; + + void set_isotope_factor_from_database(const int, + const std::string *, + double *); + + std::vector isotope_factors{ + 0.00011460742533846188, 8.141017510851699e-08, 0.001458820047621947, 0.0, 0.0013539153245004177, + 7.387230454537788e-05, 1.8376657914224594e-05, 3.3588025065260784e-05, 0.0, 0.0008278312160539562, 0.0, + 0.0007398827105109379, 0.0, 0.00020070043953754622, 0.0, 0.00016512811739588583, 0.0005827012790438193, + 3.4803742597617525e-05, 0.0001640001019257936, 0.00029756377957496945, 0.0, 0.00028645556480110174, + 9.548320927761995e-07, 0.0001328704171052577, 0.0, 8.244411853712163e-05, 0.0, 0.00043070442089852476, + 0.00021093312802220393, 0.0005931533235650079, 0.00019712731536263687, 0.000586966208421238, 0.0, + 0.0004627901461335774, 0.00015627716697599108, 0.00024880742737704476, 0.00010969638987469167, + 6.099700015374489e-05, 0.0, 0.00034262903024295327, 0.0, 0.0005961083777486782, -1, 0.0004066661504740231, + 0.0, 0.0003094784411091063, 8.579847704787673e-05, 0.0002716036180261363, 1.245588189674909e-05, + 0.0003340852797872776, 6.607553852631361e-05, 0.0002839333030058624, 0.0, 0.0002675566535085368, 0.0, + 6.237013178021676e-05, 4.5917491111023726e-08, 2.2495590932891925e-05, 0.0, 0.00023237187990100274, -1, + 0.000334685954430736, 4.3279441126609935e-05, 0.0001276749037273739, 0.0, 5.198070714285335e-05, 0.0, + 7.23248017569606e-05, 0.0, 8.556028002982757e-05, 8.300794202558322e-07, 5.253850496170609e-05, + 3.6715121208243084e-09, 6.966807117351981e-05, 2.7084982818795603e-05, 7.452354225251159e-05, + 2.5378700157091918e-05, 3.4285145177491544e-05, 0.0, 6.525193204276608e-05, 1.9964351041965618e-05, + 1.9437780365209887e-05, 0.0, -1, -1, -1, -1, -1, -1, 0.0, 0.0, 1.1564592331193284e-06, -1, -1 + }; // Precalculated isotope factors. For unstable elements, the value is set to -1. }; } diff --git a/anphon/kpoint.cpp b/anphon/kpoint.cpp index 73299973..ad78893b 100644 --- a/anphon/kpoint.cpp +++ b/anphon/kpoint.cpp @@ -8,61 +8,79 @@ Please see the file 'LICENCE.txt' in the root directory or http://opensource.org/licenses/mit-license.php for information. */ -#include "mpi_common.h" +#include "mpi_common.h" #include "kpoint.h" +#include "constants.h" #include "memory.h" #include "error.h" #include "system.h" -#include "phonon_dos.h" #include "symmetry_core.h" -#include "dynamical.h" #include "timer.h" #include #include #include #include #include -#include #include "parsephon.h" -#include "relaxation.h" #include "mathfunctions.h" -#ifdef _USE_BOOST -#include -#endif - -#ifdef _USE_EIGEN -#include -#include -#endif using namespace PHON_NS; Kpoint::Kpoint(PHON *phon) : Pointers(phon) { + set_default_variables(); } Kpoint::~Kpoint() { - if (kpoint_mode < 3) { - memory->deallocate(xk); - memory->deallocate(kvec_na); + deallocate_variables(); +} - if (kpoint_mode == 2) { - memory->deallocate(knum_minus); - } +void Kpoint::set_default_variables() +{ + xk = nullptr; + kaxis = nullptr; + kvec_na = nullptr; + knum_minus = nullptr; + nkx = 0; + nky = 0; + nkz = 0; + nk = 0; + kp_planes = nullptr; + kp_planes_tri = nullptr; + small_group_of_k = nullptr; +} - if (kpoint_mode == 1) { - if (mympi->my_rank == 0) memory->deallocate(kaxis); - } + +void Kpoint::deallocate_variables() +{ + if (xk) { + memory->deallocate(xk); + } + if (kaxis) { + memory->deallocate(kaxis); + } + if (kvec_na) { + memory->deallocate(kvec_na); } - if (small_group_of_k) + if (knum_minus) { + memory->deallocate(knum_minus); + } + if (kp_planes) { + memory->deallocate(kp_planes); + } + if (kp_planes_tri) { + memory->deallocate(kp_planes_tri); + } + if (small_group_of_k) { memory->deallocate(small_group_of_k); + } } -void Kpoint::kpoint_setups(std::string mode) + +void Kpoint::kpoint_setups(const std::string mode) { - small_group_of_k = nullptr; symmetry->symmetry_flag = true; unsigned int i, j; @@ -71,10 +89,8 @@ void Kpoint::kpoint_setups(std::string mode) MPI_Bcast(&kpoint_mode, 1, MPI_INT, 0, MPI_COMM_WORLD); if (mympi->my_rank == 0) { - std::cout << " k points" << std::endl; std::cout << " ========" << std::endl << std::endl; - } switch (kpoint_mode) { @@ -119,14 +135,14 @@ void Kpoint::kpoint_setups(std::string mode) std::cout << " ("; for (int k = 0; k < 3; ++k) { std::cout << std::setprecision(4) << std::setw(8) - << std::atof((kpInp[i].kpelem[k + 1]).c_str()); + << std::atof(kpInp[i].kpelem[k + 1].c_str()); } std::cout << ")"; std::cout << std::setw(3) << kpInp[i].kpelem[4]; std::cout << " ("; for (int k = 0; k < 3; ++k) { std::cout << std::setprecision(4) << std::setw(8) - << std::atof((kpInp[i].kpelem[k + 5]).c_str()); + << std::atof(kpInp[i].kpelem[k + 5].c_str()); } std::cout << ")"; std::cout << std::setw(4) << kpInp[i].kpelem[8] << std::endl; @@ -144,10 +160,13 @@ void Kpoint::kpoint_setups(std::string mode) std::cout << " KPMODE = 2: Uniform grid" << std::endl; } - setup_kpoint_mesh(kpInp, nk, nkx, nky, nkz, xk, - kvec_na, symmetry->symmetry_flag, kpoint_irred_all); + setup_kpoint_mesh(kpInp, nk, nkx, nky, nkz, + xk, + kvec_na, + symmetry->symmetry_flag, + kpoint_irred_all); - nk_reduced = kpoint_irred_all.size(); + nk_irred = kpoint_irred_all.size(); weight_k.clear(); for (i = 0; i < kpoint_irred_all.size(); ++i) { @@ -179,13 +198,13 @@ void Kpoint::kpoint_setups(std::string mode) memory->allocate(knum_minus, nk); gen_nkminus(nk, knum_minus, xk); - for (i = 0; i < nk_reduced; ++i) { + for (i = 0; i < nk_irred; ++i) { for (j = 0; j < kpoint_irred_all[i].size(); ++j) { kmap_to_irreducible.insert(std::map::value_type(kpoint_irred_all[i][j].knum, i)); } } // Compute small group of every irreducible k points for later use - memory->allocate(small_group_of_k, nk_reduced); + memory->allocate(small_group_of_k, nk_irred); calc_small_groups_k_irred(small_group_of_k); break; @@ -210,17 +229,16 @@ void Kpoint::kpoint_setups(std::string mode) break; default: - error->exit("read_kpoints", "This cannot happen."); + error->exit("setup_kpoints", "This cannot happen."); } } -void Kpoint::setup_kpoint_given(std::vector &kpinfo, +void Kpoint::setup_kpoint_given(const std::vector &kpinfo, unsigned int &n, double **&k, - double **&kdirec) + double **&kdirec) const { - int i, j; - double norm; + int i; n = kpinfo.size(); MPI_Bcast(&n, 1, MPI_UNSIGNED, 0, MPI_COMM_WORLD); @@ -229,19 +247,15 @@ void Kpoint::setup_kpoint_given(std::vector &kpinfo, memory->allocate(kdirec, n, 3); if (mympi->my_rank == 0) { - j = 0; - for (auto it = kpinfo.cbegin(); it != kpinfo.cend(); ++it) { + int j = 0; + for (const auto &it : kpinfo) { for (i = 0; i < 3; ++i) { -#ifdef _USE_BOOST - k[j][i] = boost::lexical_cast((*it).kpelem[i]); -#else - k[j][i] = std::atof(((*it).kpelem[i]).c_str()); -#endif + k[j][i] = std::atof(it.kpelem[i].c_str()); } rotvec(kdirec[j], k[j], system->rlavec_p, 'T'); - norm = kdirec[j][0] * kdirec[j][0] + double norm = kdirec[j][0] * kdirec[j][0] + kdirec[j][1] * kdirec[j][1] + kdirec[j][2] * kdirec[j][2]; @@ -257,23 +271,22 @@ void Kpoint::setup_kpoint_given(std::vector &kpinfo, MPI_Bcast(&kdirec[0][0], 3 * n, MPI_DOUBLE, 0, MPI_COMM_WORLD); } -void Kpoint::setup_kpoint_band(std::vector &kpinfo, +void Kpoint::setup_kpoint_band(const std::vector &kpinfo, unsigned int &n, double **&xk, double **&kdirec, - double *&axis) + double *&axis) const { - int i, j, k; + int j, k; if (mympi->my_rank == 0) { - unsigned int npath; std::string **kp_symbol; unsigned int *nk_path; double **k_start, **k_end; - npath = kpinfo.size(); + unsigned int npath = kpinfo.size(); memory->allocate(kp_symbol, npath, 2); memory->allocate(k_start, npath, 3); @@ -281,24 +294,18 @@ void Kpoint::setup_kpoint_band(std::vector &kpinfo, memory->allocate(nk_path, npath); n = 0; - i = 0; - for (auto it = kpinfo.cbegin(); it != kpinfo.cend(); ++it) { - kp_symbol[i][0] = (*it).kpelem[0]; - kp_symbol[i][1] = (*it).kpelem[4]; -#ifdef _USE_BOOST - for (j = 0; j < 3; ++j) { - k_start[i][j] = boost::lexical_cast((*it).kpelem[j + 1]); - k_end[i][j] = boost::lexical_cast((*it).kpelem[j + 5]); - } - nkp[i] = boost::lexical_cast((*it).kpelem[8]); -#else + int i = 0; + + for (const auto &it : kpinfo) { + kp_symbol[i][0] = it.kpelem[0]; + kp_symbol[i][1] = it.kpelem[4]; + for (j = 0; j < 3; ++j) { - k_start[i][j] = std::atof(((*it).kpelem[j + 1]).c_str()); - k_end[i][j] = std::atof(((*it).kpelem[j + 5]).c_str()); + k_start[i][j] = std::atof(it.kpelem[j + 1].c_str()); + k_end[i][j] = std::atof(it.kpelem[j + 5].c_str()); } - nk_path[i] = std::atoi(((*it).kpelem[8]).c_str()); -#endif + nk_path[i] = std::atoi(it.kpelem[8].c_str()); n += nk_path[i]; ++i; } @@ -308,7 +315,6 @@ void Kpoint::setup_kpoint_band(std::vector &kpinfo, memory->allocate(axis, n); unsigned int ik = 0; - double norm; double direc_tmp[3], tmp[3]; for (i = 0; i < npath; ++i) { @@ -317,7 +323,7 @@ void Kpoint::setup_kpoint_band(std::vector &kpinfo, } rotvec(direc_tmp, direc_tmp, system->rlavec_p, 'T'); - norm = std::pow(direc_tmp[0], 2) + double norm = std::pow(direc_tmp[0], 2) + std::pow(direc_tmp[1], 2) + std::pow(direc_tmp[2], 2); norm = std::sqrt(norm); @@ -369,31 +375,25 @@ void Kpoint::setup_kpoint_band(std::vector &kpinfo, MPI_Bcast(&kdirec[0][0], 3 * n, MPI_DOUBLE, 0, MPI_COMM_WORLD); } -void PHON_NS::Kpoint::setup_kpoint_mesh(std::vector &kpinfo, - unsigned int &nk, - unsigned int &nkx, - unsigned int &nky, - unsigned int &nkz, - double **&xk, - double **&kdirec, - const bool usesym, - std::vector> &kp_irreducible) +void Kpoint::setup_kpoint_mesh(const std::vector &kpinfo, + unsigned int &nk, + unsigned int &nkx, + unsigned int &nky, + unsigned int &nkz, + double **&xk, + double **&kdirec, + const bool usesym, + std::vector> &kp_irreducible) const { - int i, j; + int j; unsigned int nk_tmp[3]; - double norm; if (mympi->my_rank == 0) { -#ifdef _USE_BOOST - nkx = boost::lexical_cast(kpinfo[0].kpelem[0]); - nky = boost::lexical_cast(kpinfo[0].kpelem[1]); - nkz = boost::lexical_cast(kpinfo[0].kpelem[2]); -#else - nkx = std::atoi((kpinfo[0].kpelem[0]).c_str()); - nky = std::atoi((kpinfo[0].kpelem[1]).c_str()); - nkz = std::atoi((kpinfo[0].kpelem[2]).c_str()); -#endif + nkx = std::atoi(kpinfo[0].kpelem[0].c_str()); + nky = std::atoi(kpinfo[0].kpelem[1].c_str()); + nkz = std::atoi(kpinfo[0].kpelem[2].c_str()); + nk = nkx * nky * nkz; memory->allocate(xk, nk, 3); @@ -405,11 +405,11 @@ void PHON_NS::Kpoint::setup_kpoint_mesh(std::vector &kpinfo, gen_kmesh(usesym, nk_tmp, xk, kp_irreducible); - for (i = 0; i < nk; ++i) { + for (int i = 0; i < nk; ++i) { for (j = 0; j < 3; ++j) kdirec[i][j] = xk[i][j]; rotvec(kdirec[i], kdirec[i], system->rlavec_p, 'T'); - norm = kdirec[i][0] * kdirec[i][0] + double norm = kdirec[i][0] * kdirec[i][0] + kdirec[i][1] * kdirec[i][1] + kdirec[i][2] * kdirec[i][2]; @@ -435,9 +435,9 @@ void PHON_NS::Kpoint::setup_kpoint_mesh(std::vector &kpinfo, mpi_broadcast_kpoint_vector(kp_irreducible); } -void PHON_NS::Kpoint::mpi_broadcast_kpoint_vector(std::vector> &kp_irreducible) +void Kpoint::mpi_broadcast_kpoint_vector(std::vector> &kp_irreducible) const { - int i, j, k, ik; + int i, j, ik; double **xk_tmp; unsigned int *knum_tmp; unsigned int *kequiv_tmp; @@ -462,7 +462,7 @@ void PHON_NS::Kpoint::mpi_broadcast_kpoint_vector(std::vectordeallocate(kequiv_tmp); } -void PHON_NS::Kpoint::mpi_broadcast_kplane_vector(const unsigned int nplane, - std::vector *&kp_plane) +void Kpoint::mpi_broadcast_kplane_vector(const unsigned int nplane, + std::vector *&kp_plane) const { - int i, j; - int nkp; + int j; int **naxis; double **xk_plane; - for (i = 0; i < nplane; ++i) { - nkp = kp_plane[i].size(); + for (int i = 0; i < nplane; ++i) { + int nkp = kp_plane[i].size(); MPI_Bcast(&nkp, 1, MPI_INT, 0, MPI_COMM_WORLD); @@ -531,7 +530,7 @@ void PHON_NS::Kpoint::mpi_broadcast_kplane_vector(const unsigned int nplane, if (mympi->my_rank > 0) { for (j = 0; j < nkp; ++j) { - kp_plane[i].push_back(KpointPlane(xk_plane[j], naxis[j])); + kp_plane[i].emplace_back(xk_plane[j], naxis[j]); } } memory->deallocate(naxis); @@ -540,7 +539,7 @@ void PHON_NS::Kpoint::mpi_broadcast_kplane_vector(const unsigned int nplane, } -void Kpoint::setup_kpoint_plane(std::vector &kpinfo, +void Kpoint::setup_kpoint_plane(const std::vector &kpinfo, unsigned int &nplane, std::vector *&kp_plane) { @@ -552,16 +551,6 @@ void Kpoint::setup_kpoint_plane(std::vector &kpinfo, if (mympi->my_rank == 0) { gen_kpoints_plane(kpinfo, kp_plane, kp_planes_tri); - - // for (i = 0; i < nplane; ++i) { - // for (std::vector::const_iterator it = kp_planes_tri[i].begin(); it != kp_planes_tri[i].end(); ++it) { - // std::cout << (*it).index << std::endl; - // std::cout << (*it).xk1[0] << " " << (*it).xk1[1] << " " << (*it).xk1[2] << std::endl; - // std::cout << (*it).xk2[0] << " " << (*it).xk2[1] << " " << (*it).xk2[2] << std::endl; - // std::cout << (*it).xk3[0] << " " << (*it).xk3[1] << " " << (*it).xk3[2] << std::endl; - // std::cout << (*it).inside_FBZ << std::endl; - // } - // } } mpi_broadcast_kplane_vector(nplane, kp_plane); @@ -571,10 +560,9 @@ void Kpoint::setup_kpoint_plane(std::vector &kpinfo, void Kpoint::gen_kmesh(const bool usesym, const unsigned int nk_in[3], double **xk_out, - std::vector> &kplist_out) + std::vector> &kplist_out) const { - unsigned int ix, iy, iz; - unsigned int i, ik; + unsigned int ik; double **xkr; unsigned int nk_tot = nk_in[0] * nk_in[1] * nk_in[2]; @@ -583,9 +571,9 @@ void Kpoint::gen_kmesh(const bool usesym, memory->allocate(xkr, nk_tot, 3); - for (ix = 0; ix < nk_in[0]; ++ix) { - for (iy = 0; iy < nk_in[1]; ++iy) { - for (iz = 0; iz < nk_in[2]; ++iz) { + for (unsigned int ix = 0; ix < nk_in[0]; ++ix) { + for (unsigned int iy = 0; iy < nk_in[1]; ++iy) { + for (unsigned int iz = 0; iz < nk_in[2]; ++iz) { ik = iz + iy * nk_in[2] + ix * nk_in[2] * nk_in[1]; xkr[ik][0] = static_cast(ix) / static_cast(nk_in[0]); xkr[ik][1] = static_cast(iy) / static_cast(nk_in[1]); @@ -602,7 +590,7 @@ void Kpoint::gen_kmesh(const bool usesym, reduce_kpoints(nsym, xkr, nk_in, kplist_out); for (ik = 0; ik < nk_tot; ++ik) { - for (i = 0; i < 3; ++i) { + for (unsigned int i = 0; i < 3; ++i) { xk_out[ik][i] = xkr[ik][i] - static_cast(nint(xkr[ik][i])); } } @@ -613,12 +601,11 @@ void Kpoint::gen_kmesh(const bool usesym, void Kpoint::reduce_kpoints(const unsigned int nsym, double **xkr, const unsigned int nk_in[3], - std::vector> &kplist_out) + std::vector> &kplist_out) const { unsigned int ik; unsigned int i, j; - int nloc, isym; - unsigned int nk_tot; + int isym; bool *k_found; @@ -654,7 +641,7 @@ void Kpoint::reduce_kpoints(const unsigned int nsym, kplist_out.clear(); - nk_tot = nk_in[0] * nk_in[1] * nk_in[2]; + auto nk_tot = nk_in[0] * nk_in[1] * nk_in[2]; memory->allocate(k_found, nk_tot); for (ik = 0; ik < nk_tot; ++ik) k_found[ik] = false; @@ -673,9 +660,7 @@ void Kpoint::reduce_kpoints(const unsigned int nsym, for (i = 0; i < 3; ++i) xk_sym[i] = xk_sym[i] - nint(xk_sym[i]); - // nloc = get_knum(xk_sym[0], xk_sym[1], xk_sym[2]); - - nloc = get_knum(xk_sym, nk_in); + int nloc = get_knum(xk_sym, nk_in); if (nloc == -1) { @@ -691,7 +676,7 @@ void Kpoint::reduce_kpoints(const unsigned int nsym, ktmp.push_back(xk_sym[1]); ktmp.push_back(xk_sym[2]); - k_group.push_back(KpointList(nloc, ktmp)); + k_group.emplace_back(nloc, ktmp); } } @@ -701,7 +686,7 @@ void Kpoint::reduce_kpoints(const unsigned int nsym, if (symmetry->time_reversal_sym) { for (i = 0; i < 3; ++i) xk_sym[i] *= -1.0; - // nloc = get_knum(xk_sym[0], xk_sym[1], xk_sym[2]); + nloc = get_knum(xk_sym, nk_in); if (nloc == -1) { @@ -717,7 +702,7 @@ void Kpoint::reduce_kpoints(const unsigned int nsym, ktmp.push_back(xk_sym[1]); ktmp.push_back(xk_sym[2]); - k_group.push_back(KpointList(nloc, ktmp)); + k_group.emplace_back(nloc, ktmp); } } } @@ -729,39 +714,31 @@ void Kpoint::reduce_kpoints(const unsigned int nsym, memory->deallocate(symop_k); } -void Kpoint::gen_kpoints_plane(std::vector kplist, +void Kpoint::gen_kpoints_plane(const std::vector &kplist, std::vector *kpout, std::vector *kpout_tri) { - int i, j; + int j; int nplane = kplist.size(); - int N1, N2; int ik1, ik2; - int number_of_tiles, number_of_triangle_tiles; int **triangle; - double frac1, frac2; double xk_tmp[3]; double xk0[3], xk1[3], xk2[3], xk3[3]; double **xk; - double dprod, norm1, norm2, costheta; int n_in[2]; - int m; - int n1, n2, n3, n4; - bool is_inside_FBZ; - int itri; - for (i = 0; i < nplane; ++i) { - N1 = std::atoi(kplist[i].kpelem[3].c_str()); - N2 = std::atoi(kplist[i].kpelem[7].c_str()); + for (int i = 0; i < nplane; ++i) { + int N1 = std::atoi(kplist[i].kpelem[3].c_str()); + int N2 = std::atoi(kplist[i].kpelem[7].c_str()); n_in[0] = N1; n_in[1] = N2; - frac1 = 1.0 / static_cast(N1 - 1); - frac2 = 1.0 / static_cast(N2 - 1); + double frac1 = 1.0 / static_cast(N1 - 1); + double frac2 = 1.0 / static_cast(N2 - 1); for (j = 0; j < 3; ++j) { xk0[j] = 0.0; @@ -769,22 +746,22 @@ void Kpoint::gen_kpoints_plane(std::vector kplist, xk2[j] = std::atof(kplist[i].kpelem[4 + j].c_str()); } - dprod = 0.0; - norm1 = 0.0; - norm2 = 0.0; + double dprod = 0.0; + double norm1 = 0.0; + double norm2 = 0.0; for (j = 0; j < 3; ++j) { dprod += xk1[j] * xk2[j]; norm1 += xk1[j] * xk1[j]; norm2 += xk2[j] * xk2[j]; } - costheta = dprod / std::sqrt(norm1 * norm2); + double costheta = dprod / std::sqrt(norm1 * norm2); if (std::abs(std::abs(costheta) - 1.0) < eps12) { error->exit("gen_kpoints_plane", "Two vectors have to be linearly independent with each other."); } - kp_plane_geometry.push_back(KpointPlaneGeometry(xk0, xk1, xk2, n_in)); + kp_plane_geometry.emplace_back(xk0, xk1, xk2, n_in); for (ik1 = 0; ik1 < N1; ++ik1) { for (ik2 = 0; ik2 < N2; ++ik2) { @@ -796,14 +773,14 @@ void Kpoint::gen_kpoints_plane(std::vector kplist, if (in_first_BZ(xk_tmp)) { n_in[0] = ik1; n_in[1] = ik2; - kpout[i].push_back(KpointPlane(xk_tmp, n_in)); + kpout[i].emplace_back(xk_tmp, n_in); } } } memory->allocate(xk, N1 * N2, 3); - m = 0; + int m = 0; for (ik1 = 0; ik1 < N1; ++ik1) { for (ik2 = 0; ik2 < N2; ++ik2) { @@ -815,18 +792,18 @@ void Kpoint::gen_kpoints_plane(std::vector kplist, } } - number_of_tiles = (N1 - 1) * (N2 - 1); - number_of_triangle_tiles = 2 * number_of_tiles; + int number_of_tiles = (N1 - 1) * (N2 - 1); + int number_of_triangle_tiles = 2 * number_of_tiles; memory->allocate(triangle, number_of_triangle_tiles, 3); for (ik1 = 0; ik1 < N1 - 1; ++ik1) { for (ik2 = 0; ik2 < N2 - 1; ++ik2) { - n1 = ik2 + ik1 * N2; - n2 = ik2 + (ik1 + 1) * N2; - n3 = (ik2 + 1) + ik1 * N2; - n4 = (ik2 + 1) + (ik1 + 1) * N2; + int n1 = ik2 + ik1 * N2; + int n2 = ik2 + (ik1 + 1) * N2; + int n3 = ik2 + 1 + ik1 * N2; + int n4 = ik2 + 1 + (ik1 + 1) * N2; m = 2 * (ik2 + ik1 * (N2 - 1)); @@ -843,7 +820,7 @@ void Kpoint::gen_kpoints_plane(std::vector kplist, } } - for (itri = 0; itri < number_of_triangle_tiles; ++itri) { + for (int itri = 0; itri < number_of_triangle_tiles; ++itri) { for (j = 0; j < 3; ++j) { xk1[j] = xk[triangle[itri][0]][j]; @@ -851,9 +828,9 @@ void Kpoint::gen_kpoints_plane(std::vector kplist, xk3[j] = xk[triangle[itri][2]][j]; } - is_inside_FBZ = in_first_BZ(xk1) || in_first_BZ(xk2) || in_first_BZ(xk3); + bool is_inside_FBZ = in_first_BZ(xk1) || in_first_BZ(xk2) || in_first_BZ(xk3); if (is_inside_FBZ) { - kpout_tri[i].push_back(KpointPlaneTriangle(itri, triangle[itri])); + kpout_tri[i].emplace_back(itri, triangle[itri]); } } @@ -864,14 +841,11 @@ void Kpoint::gen_kpoints_plane(std::vector kplist, void Kpoint::gen_nkminus(const unsigned int nk, unsigned int *minus_k, - double **xk_in) + double **xk_in) const { - unsigned int ik; - int ik_minus; + for (unsigned int ik = 0; ik < nk; ++ik) { - for (ik = 0; ik < nk; ++ik) { - - ik_minus = get_knum(-xk[ik][0], -xk[ik][1], -xk[ik][2]); + int ik_minus = get_knum(-xk[ik][0], -xk[ik][1], -xk[ik][2]); if (ik_minus == -1) error->exit("gen_nkminus", @@ -885,7 +859,7 @@ void Kpoint::gen_nkminus(const unsigned int nk, int Kpoint::get_knum(const double kx, const double ky, - const double kz) + const double kz) const { double diff[3]; double dkx = static_cast(nkx); @@ -896,83 +870,61 @@ int Kpoint::get_knum(const double kx, diff[1] = static_cast(nint(ky * dky)) - ky * dky; diff[2] = static_cast(nint(kz * dkz)) - kz * dkz; - double norm = - std::sqrt(diff[0] * diff[0] - + diff[1] * diff[1] - + diff[2] * diff[2]); - - if (norm >= eps12) { - - return -1; - - } else { + double norm = std::sqrt(diff[0] * diff[0] + + diff[1] * diff[1] + + diff[2] * diff[2]); - int iloc, jloc, kloc; + if (norm >= eps12) return -1; - iloc = (nint(kx * dkx + 2.0 * dkx)) % nkx; - jloc = (nint(ky * dky + 2.0 * dky)) % nky; - kloc = (nint(kz * dkz + 2.0 * dkz)) % nkz; + int iloc = nint(kx * dkx + 2.0 * dkx) % nkx; + int jloc = nint(ky * dky + 2.0 * dky) % nky; + int kloc = nint(kz * dkz + 2.0 * dkz) % nkz; - return kloc + nkz * jloc + nky * nkz * iloc; - } + return kloc + nkz * jloc + nky * nkz * iloc; } int Kpoint::get_knum(const double xk[3], - const unsigned int nk[3]) + const unsigned int nk[3]) const { int i; double diff[3]; double dnk[3]; - double norm; for (i = 0; i < 3; ++i) dnk[i] = static_cast(nk[i]); for (i = 0; i < 3; ++i) diff[i] = static_cast(nint(xk[i] * dnk[i])) - xk[i] * dnk[i]; - norm = std::sqrt(diff[0] * diff[0] + double norm = std::sqrt(diff[0] * diff[0] + diff[1] * diff[1] + diff[2] * diff[2]); - if (norm >= eps12) { - - return -1; - - } else { + if (norm >= eps12) return -1; - int iloc, jloc, kloc; + int iloc = nint(xk[0] * dnk[0] + 2.0 * dnk[0]) % nk[0]; + int jloc = nint(xk[1] * dnk[1] + 2.0 * dnk[1]) % nk[1]; + int kloc = nint(xk[2] * dnk[2] + 2.0 * dnk[2]) % nk[2]; - iloc = (nint(xk[0] * dnk[0] + 2.0 * dnk[0])) % nk[0]; - jloc = (nint(xk[1] * dnk[1] + 2.0 * dnk[1])) % nk[1]; - kloc = (nint(xk[2] * dnk[2] + 2.0 * dnk[2])) % nk[2]; - - return kloc + nk[2] * jloc + nk[1] * nk[2] * iloc; - } + return kloc + nk[2] * jloc + nk[1] * nk[2] * iloc; } -bool Kpoint::in_first_BZ(double *xk_in) +bool Kpoint::in_first_BZ(const double *xk_in) const { - int i, j, k; + int i; int nmax = 1; double tmp[3]; - double dist, dist_min; - int iloc; - int ncount; - - bool ret; - for (i = 0; i < 3; ++i) tmp[i] = xk_in[i]; rotvec(tmp, tmp, system->rlavec_p, 'T'); - dist_min = std::sqrt(tmp[0] * tmp[0] + tmp[1] * tmp[1] + tmp[2] * tmp[2]); + double dist_min = std::sqrt(tmp[0] * tmp[0] + tmp[1] * tmp[1] + tmp[2] * tmp[2]); - ncount = 0; + int ncount = 0; - iloc = ncount; + int iloc = ncount; for (i = -nmax; i <= nmax; ++i) { - for (j = -nmax; j <= nmax; ++j) { - for (k = -nmax; k <= nmax; ++k) { + for (int j = -nmax; j <= nmax; ++j) { + for (int k = -nmax; k <= nmax; ++k) { if (i == 0 && j == 0 && k == 0) continue; @@ -983,7 +935,7 @@ bool Kpoint::in_first_BZ(double *xk_in) tmp[2] = xk_in[2] - static_cast(k); rotvec(tmp, tmp, system->rlavec_p, 'T'); - dist = std::sqrt(tmp[0] * tmp[0] + tmp[1] * tmp[1] + tmp[2] * tmp[2]); + double dist = std::sqrt(tmp[0] * tmp[0] + tmp[1] * tmp[1] + tmp[2] * tmp[2]); if (dist < dist_min) { iloc = ncount; @@ -993,13 +945,7 @@ bool Kpoint::in_first_BZ(double *xk_in) } } - if (iloc == 0) { - ret = true; - } else { - ret = false; - } - - return ret; + return iloc == 0; } @@ -1011,12 +957,10 @@ void Kpoint::generate_irreducible_kmap(int *kequiv, const unsigned int n3, double **xk_in, const int nsymop, - int ***symrot) + int ***symrot) const { - int i, j, k; - int isym; + int i, j; int nktot = n1 * n2 * n3; - int ksym; double xk_orig[3], xk_sym[3]; double srot[3][3], srot_inv[3][3], srot_inv_t[3][3]; @@ -1029,10 +973,10 @@ void Kpoint::generate_irreducible_kmap(int *kequiv, for (j = 0; j < 3; ++j) xk_orig[j] = xk_in[i][j]; - for (isym = 0; isym < nsymop; ++isym) { + for (int isym = 0; isym < nsymop; ++isym) { for (j = 0; j < 3; ++j) { - for (k = 0; k < 3; ++k) { + for (int k = 0; k < 3; ++k) { srot[j][k] = symrot[isym][j][k]; } } @@ -1042,7 +986,7 @@ void Kpoint::generate_irreducible_kmap(int *kequiv, rotvec(xk_sym, xk_orig, srot_inv_t); - ksym = get_knum(xk_sym[0], xk_sym[1], xk_sym[2]); + int ksym = get_knum(xk_sym[0], xk_sym[1], xk_sym[2]); if (ksym > kequiv[i]) { kequiv[ksym] = i; @@ -1072,19 +1016,18 @@ void Kpoint::generate_irreducible_kmap(int *kequiv, void Kpoint::calc_small_groups_k_irred(std::vector *small_group) { - for (int ik = 0; ik < nk_reduced; ++ik) { + for (int ik = 0; ik < nk_irred; ++ik) { small_group[ik] = get_small_group_of_k(kpoint_irred_all[ik][0].knum); } } -std::vector Kpoint::get_small_group_of_k(const int ik) +std::vector Kpoint::get_small_group_of_k(const int ik) const { - int isym, ksym; std::vector small_group; int i = 0; small_group.clear(); - for (isym = 0; isym < symmetry->nsym; ++isym) { - ksym = knum_sym(ik, isym); + for (int isym = 0; isym < symmetry->nsym; ++isym) { + int ksym = knum_sym(ik, isym); if (ksym == ik) { small_group.push_back(isym); } @@ -1092,11 +1035,11 @@ std::vector Kpoint::get_small_group_of_k(const int ik) return small_group; } -void Kpoint::get_small_group_k(double *xk_in, +void Kpoint::get_small_group_k(const double *xk_in, std::vector &sym_list, - double S_avg[3][3]) + double S_avg[3][3]) const { - int i, j, isym; + int i, j; double srot[3][3]; double srot_inv[3][3], srot_inv_t[3][3]; double xk_orig[3], xk_sym[3]; @@ -1109,7 +1052,7 @@ void Kpoint::get_small_group_k(double *xk_in, } } - for (isym = 0; isym < symmetry->nsym; ++isym) { + for (int isym = 0; isym < symmetry->nsym; ++isym) { for (i = 0; i < 3; ++i) { for (j = 0; j < 3; ++j) { @@ -1147,11 +1090,11 @@ void Kpoint::get_small_group_k(double *xk_in, } int Kpoint::knum_sym(const int ik_in, - const int symop_num) + const int symop_num) const { // Returns kpoint index of S(symop_num)*xk[ik_in] // Works only for gamma-centered mesh calculations - int i, j; + int i; double srot[3][3]; double srot_inv[3][3], srot_inv_t[3][3]; @@ -1162,7 +1105,7 @@ int Kpoint::knum_sym(const int ik_in, } for (i = 0; i < 3; ++i) { - for (j = 0; j < 3; ++j) { + for (int j = 0; j < 3; ++j) { srot[i][j] = static_cast(symmetry->SymmList[symop_num].rot[i][j]); } } @@ -1177,7 +1120,194 @@ int Kpoint::knum_sym(const int ik_in, xk_sym[i] = xk_sym[i] - nint(xk_sym[i]); } - int ret = get_knum(xk_sym[0], xk_sym[1], xk_sym[2]); + return get_knum(xk_sym[0], xk_sym[1], xk_sym[2]); +} + +void Kpoint::get_commensurate_kpoints(const double lavec_super[3][3], + const double lavec_prim[3][3], + std::vector> &klist) const +{ + int i, j; + double inv_lavec_super[3][3]; + double convmat[3][3]; + + invmat3(inv_lavec_super, lavec_super); + matmul3(convmat, inv_lavec_super, lavec_prim); + transpose3(convmat, convmat); + + double det = convmat[0][0] * (convmat[1][1] * convmat[2][2] - convmat[2][1] * convmat[1][2]) + - convmat[1][0] * (convmat[0][1] * convmat[2][2] - convmat[2][1] * convmat[0][2]) + + convmat[2][0] * (convmat[0][1] * convmat[1][2] - convmat[1][1] * convmat[0][2]); + + int nkmax = static_cast(std::ceil(1.0 / det)); + + + double tol = 1.0e-6; + int max_denom = 10000; // for safety + int k; + + for (i = 0; i < 3; ++i) { + for (j = 0; j < 3; ++j) { + + double frac = std::abs(convmat[i][j]); + + if (frac < tol) { + convmat[i][j] = 0.0; + } else { + bool found_denom = false; + for (k = 1; k < max_denom; ++k) { + if (std::abs(frac * static_cast(k) - 1.0) < tol) { + found_denom = true; + break; + } + } + if (found_denom) { + int sign = (0.0 < convmat[i][j]) - (convmat[i][j] < 0.0); + convmat[i][j] = static_cast(sign) / static_cast(k); + } else { + error->exit("get_commensurate_kpoints", + "The denominator of the conversion matrix > 10000"); + } + } + } + } + + int nmax_cell = static_cast(nkmax) / 2 + 1; + std::vector signs({-1, 1}); + std::vector> comb; + comb.clear(); + for (i = 0; i < nmax_cell; ++i) { + for (j = 0; j < nmax_cell; ++j) { + for (k = 0; k < nmax_cell; ++k) { + for (const auto &sx : signs) { + for (const auto &sy : signs) { + for (const auto &sz : signs) { + comb.push_back({i * sx, j * sy, k * sz}); + } + } + } + } + } + } + + double qtmp[3], qdiff[3]; + + for (const auto &p : comb) { + for (i = 0; i < 3; ++i) qtmp[i] = p[i]; + rotvec(qtmp, qtmp, convmat); + + for (i = 0; i < 3; ++i) { + qtmp[i] = std::fmod(qtmp[i], 1.0); + if (qtmp[i] >= 0.5) { + qtmp[i] -= 1.0; + } else if (qtmp[i] < -0.5) { + qtmp[i] += 1.0; + } + } + + bool new_entry = true; + + for (const auto &elem : klist) { + + for (i = 0; i < 3; ++i) { + qdiff[i] = std::fmod(qtmp[i] - elem[i], 1.0); + if (qdiff[i] >= 0.5) { + qdiff[i] -= 1.0; + } else if (qdiff[i] < -0.5) { + qdiff[i] += 1.0; + } + } + + double norm = std::sqrt(qdiff[0] * qdiff[0] + + qdiff[1] * qdiff[1] + + qdiff[2] * qdiff[2]); + + if (norm < tol) { + new_entry = false; + break; + } + } + if (new_entry) klist.push_back({qtmp[0], qtmp[1], qtmp[2]}); + + if (klist.size() == nkmax) break; + } +} + + +void Kpoint::get_unique_triplet_k(const int ik, + const bool use_triplet_symmetry, + const bool use_permutation_symmetry, + std::vector &triplet, + const int sign) +{ + // This function returns the irreducible set of (k2, k3) satisfying the momentum conservation. + // When sign = -1 (default), pairs satisfying - k1 + k2 + k3 = G are returned. + // When sign = 1, pairs satisfying k1 + k2 + k3 = G are returned. + // + + int i; + int num_group_k; + int ks_in[2]; + int knum = kpoint_irred_all[ik][0].knum; + bool *flag_found; + std::vector kslist; + double xk[3], xk1[3], xk2[3]; + + memory->allocate(flag_found, nk); + + if (use_triplet_symmetry) { + num_group_k = small_group_of_k[ik].size(); + } else { + num_group_k = 1; + } + + for (i = 0; i < 3; ++i) xk[i] = this->xk[knum][i]; + for (i = 0; i < nk; ++i) flag_found[i] = false; + + triplet.clear(); + + for (int ik1 = 0; ik1 < nk; ++ik1) { + + for (i = 0; i < 3; ++i) xk1[i] = this->xk[ik1][i]; + + if (sign == -1) { + for (i = 0; i < 3; ++i) xk2[i] = xk[i] - xk1[i]; + } else if (sign == 1) { + for (i = 0; i < 3; ++i) xk2[i] = -xk[i] - xk1[i]; + } else { + error->exit("get_unituq_triplet_k", "Invalid sign"); + } + + int ik2 = get_knum(xk2[0], xk2[1], xk2[2]); + + kslist.clear(); + + if (ik1 > ik2 && use_permutation_symmetry) continue; + + // Add symmety-connected triplets to kslist + for (int isym = 0; isym < num_group_k; ++isym) { + + ks_in[0] = knum_sym(ik1, small_group_of_k[ik][isym]); + ks_in[1] = knum_sym(ik2, small_group_of_k[ik][isym]); + + if (!flag_found[ks_in[0]]) { + kslist.emplace_back(2, ks_in, small_group_of_k[ik][isym]); + flag_found[ks_in[0]] = true; + } + + if (ks_in[0] != ks_in[1] && use_permutation_symmetry && !flag_found[ks_in[1]]) { + int tmp = ks_in[0]; + ks_in[0] = ks_in[1]; + ks_in[1] = tmp; + + kslist.emplace_back(2, ks_in, small_group_of_k[ik][isym]); + flag_found[ks_in[0]] = true; + } + } + if (!kslist.empty()) { + triplet.emplace_back(kslist); + } + } - return ret; + memory->deallocate(flag_found); } diff --git a/anphon/kpoint.h b/anphon/kpoint.h index cc423373..eb3c3632 100644 --- a/anphon/kpoint.h +++ b/anphon/kpoint.h @@ -11,12 +11,9 @@ or http://opensource.org/licenses/mit-license.php for information. #pragma once #include "pointers.h" -#include #include #include -#include #include -#include "constants.h" namespace PHON_NS { @@ -26,25 +23,13 @@ namespace PHON_NS std::vector kval; unsigned int knum; - KpointList() - { - }; + KpointList() {}; - KpointList(const KpointList &obj) - { - knum = obj.knum; - for (auto it = obj.kval.cbegin(); it != obj.kval.cend(); ++it) { - kval.push_back(*it); - } - } + KpointList(const KpointList &obj) : kval(obj.kval), knum(obj.knum) {}; - KpointList(const unsigned int knum_in, const std::vector vec) - { - knum = knum_in; - for (auto it = vec.cbegin(); it != vec.cend(); ++it) { - kval.push_back(*it); - } - } + KpointList(const unsigned int knum_in, + const std::vector &vec) + : kval(vec), knum(knum_in) {}; }; class KpointInp @@ -52,16 +37,9 @@ namespace PHON_NS public: std::vector kpelem; - KpointInp() - { - }; + KpointInp() {}; - KpointInp(const std::vector &obj) - { - for (auto it = obj.cbegin(); it != obj.cend(); ++it) { - kpelem.push_back(*it); - } - } + KpointInp(const std::vector &obj) : kpelem(obj) {}; }; class KpointPlaneGeometry @@ -71,14 +49,12 @@ namespace PHON_NS double xk_edges[2][3]; int npoints[2]; - KpointPlaneGeometry() - { - }; + KpointPlaneGeometry() {}; - KpointPlaneGeometry(double *xk_origin_in, - double *xk_edge1_in, - double *xk_edge2_in, - int *num) + KpointPlaneGeometry(const double *xk_origin_in, + const double *xk_edge1_in, + const double *xk_edge2_in, + const int *num) { for (int i = 0; i < 3; ++i) { xk_origin[i] = xk_origin_in[i]; @@ -97,11 +73,10 @@ namespace PHON_NS double k[3]; int n[2]; - KpointPlane() - { - }; + KpointPlane() {}; - KpointPlane(double *xk_in, int *n_in) + KpointPlane(const double *xk_in, + const int *n_in) { for (int i = 0; i < 3; ++i) k[i] = xk_in[i]; for (int i = 0; i < 2; ++i) n[i] = n_in[i]; @@ -114,11 +89,10 @@ namespace PHON_NS int index; int knum[3]; - KpointPlaneTriangle() - { - }; + KpointPlaneTriangle() {}; - KpointPlaneTriangle(int index_in, int *nk_in) + KpointPlaneTriangle(int index_in, + const int *nk_in) { index = index_in; @@ -128,10 +102,48 @@ namespace PHON_NS } }; + class KsList + { + public: + std::vector ks; + int symnum; + + KsList(); + + KsList(const KsList &a) : ks(a.ks), symnum(a.symnum) {}; + + KsList(const int n, + int *ks_in, + const int sym) + { + for (int i = 0; i < n; ++i) { + ks.push_back(ks_in[i]); + } + symnum = sym; + } + + bool operator<(const KsList &obj) const + { + return std::lexicographical_compare(ks.begin(), ks.end(), + obj.ks.begin(), obj.ks.end()); + } + }; + + class KsListGroup + { + public: + std::vector group; + + KsListGroup(); + + KsListGroup(const std::vector &a) : group(a) {}; + }; + class Kpoint : protected Pointers { public: Kpoint(class PHON *); + ~Kpoint(); void kpoint_setups(std::string); @@ -146,68 +158,108 @@ namespace PHON_NS double **kvec_na; std::vector kpInp; - std::vector weight_k; + std::vector weight_k; // Weight of each kpoint used for integration std::vector> kpoint_irred_all; unsigned int nplanes; std::vector *kp_planes; std::vector kp_plane_geometry; std::vector *kp_planes_tri; - unsigned int nk_reduced; + unsigned int nk_irred; // Number of irreducible k points std::map kmap_to_irreducible; std::vector *small_group_of_k; - int get_knum(const double, const double, const double); - int get_knum(const double [3], const unsigned int [3]); + int get_knum(double, + double, + double) const; - void generate_irreducible_kmap(int *, unsigned int &, - std::vector &, - const unsigned int, const unsigned int, const unsigned int, - double **, const int, int ***); + int get_knum(const double [3], + const unsigned int [3]) const; - void gen_kmesh(const bool, const unsigned int [3], + void generate_irreducible_kmap(int *, + unsigned int &, + std::vector &, + unsigned int, + unsigned int, + unsigned int, + double **, + int, + int ***) const; + + void gen_kmesh(bool, + const unsigned int [3], double **, - std::vector> &); + std::vector> &) const; + + void get_small_group_k(const double *, + std::vector &, + double [3][3]) const; + + int knum_sym(int, + int) const; - void get_small_group_k(double *, std::vector &, double [3][3]); - int knum_sym(const int, const int); + void get_commensurate_kpoints(const double [3][3], + const double [3][3], + std::vector> &) const; + void get_unique_triplet_k(const int, + const bool, + const bool, + std::vector &, + const int sign = -1); private: - void setup_kpoint_given(std::vector &, + void set_default_variables(); + void deallocate_variables(); + + void setup_kpoint_given(const std::vector &, unsigned int &, - double **&, double **&); + double **&, + double **&) const; - void setup_kpoint_band(std::vector &, + void setup_kpoint_band(const std::vector &, unsigned int &, - double **&, double **&, double *&); + double **&, + double **&, + double *&) const; - void setup_kpoint_mesh(std::vector &, - unsigned int &, unsigned int &, unsigned int &, unsigned int &, - double **&, double **&, - const bool, - std::vector> &); + void setup_kpoint_mesh(const std::vector &, + unsigned int &, + unsigned int &, + unsigned int &, + unsigned int &, + double **&, + double **&, + bool, + std::vector> &) const; - void setup_kpoint_plane(std::vector &, + void setup_kpoint_plane(const std::vector &, unsigned int &, std::vector *&); - void reduce_kpoints(const unsigned int, double **, + void reduce_kpoints(unsigned int, + double **, const unsigned int [3], - std::vector> &); + std::vector> &) const; - void gen_nkminus(const unsigned int, unsigned int *, double **); + void gen_nkminus(unsigned int, + unsigned int *, + double **) const; - void gen_kpoints_plane(std::vector, + void gen_kpoints_plane(const std::vector &, std::vector *, std::vector *); - bool in_first_BZ(double *); + bool in_first_BZ(const double *) const; + + void mpi_broadcast_kpoint_vector(std::vector> &) const; + + void mpi_broadcast_kplane_vector(unsigned int, + std::vector *&) const; - void mpi_broadcast_kpoint_vector(std::vector> &); - void mpi_broadcast_kplane_vector(const unsigned int, std::vector *&); void calc_small_groups_k_irred(std::vector *); - std::vector get_small_group_of_k(const int); + + std::vector get_small_group_of_k(int) const; }; } diff --git a/anphon/main.cpp b/anphon/main.cpp index e376aa0e..138b1e59 100644 --- a/anphon/main.cpp +++ b/anphon/main.cpp @@ -8,13 +8,13 @@ or http://opensource.org/licenses/mit-license.php for information. */ -#include "mpi_common.h" #include "phonons.h" #include using namespace PHON_NS; -int main(int argc, char **argv) +int main(int argc, + char **argv) { MPI_Init(&argc, &argv); diff --git a/anphon/memory.cpp b/anphon/memory.cpp index e5a75efb..c2d9cd3d 100644 --- a/anphon/memory.cpp +++ b/anphon/memory.cpp @@ -8,15 +8,10 @@ or http://opensource.org/licenses/mit-license.php for information. */ -#include "mpi_common.h" #include "memory.h" using namespace PHON_NS; -Memory::Memory(PHON *phon) : Pointers(phon) -{ -} +Memory::Memory(PHON *phon) : Pointers(phon) {} -Memory::~Memory() -{ -}; +Memory::~Memory() {}; diff --git a/anphon/memory.h b/anphon/memory.h index e7dc6655..7c1fc8ac 100644 --- a/anphon/memory.h +++ b/anphon/memory.h @@ -17,20 +17,22 @@ namespace PHON_NS { - class Memory: protected Pointers + class Memory : protected Pointers { public: Memory(class PHON *); + ~Memory(); // allocator template - T* allocate(T *&arr, const unsigned int n1) + T* allocate(T *&arr, + const unsigned int n1) { #ifdef _SX arr = new T [n1]; -#else +#else try { arr = new T [n1]; } @@ -45,7 +47,9 @@ namespace PHON_NS } template - T** allocate(T **&arr, const unsigned int n1, const unsigned int n2) + T** allocate(T **&arr, + const unsigned int n1, + const unsigned int n2) { #ifdef _SX arr = new T *[n1]; @@ -64,7 +68,8 @@ namespace PHON_NS catch (std::bad_alloc &ba) { std::cout << " Caught an exception when trying to allocate 2-dimensional array" << std::endl; std::cout << " " << ba.what() << " : Array shape = " << n1 << "x" << n2 << std::endl; - std::cout << " " << ba.what() << " : Array size (MB) = " << memsize_in_MB(sizeof(T), n1, n2) << std::endl; + std::cout << " " << ba.what() << " : Array size (MB) = " << memsize_in_MB(sizeof(T), n1, n2) << std:: + endl; exit(EXIT_FAILURE); } #endif @@ -72,7 +77,10 @@ namespace PHON_NS } template - T*** allocate(T ***&arr, const unsigned int n1, const unsigned int n2, const unsigned int n3) + T*** allocate(T ***&arr, + const unsigned int n1, + const unsigned int n2, + const unsigned int n3) { #ifdef _SX arr = new T **[n1]; @@ -99,7 +107,8 @@ namespace PHON_NS catch (std::bad_alloc &ba) { std::cout << " Caught an exception when trying to allocate 3-dimensional array" << std::endl; std::cout << " " << ba.what() << " : Array shape = " << n1 << "x" << n2 << "x" << n3 << std::endl; - std::cout << " " << ba.what() << " : Array size (MB) = " << memsize_in_MB(sizeof(T), n1, n2, n3) << std::endl; + std::cout << " " << ba.what() << " : Array size (MB) = " << memsize_in_MB(sizeof(T), n1, n2, n3) << std + ::endl; exit(EXIT_FAILURE); } #endif @@ -107,7 +116,11 @@ namespace PHON_NS } template - T**** allocate(T ****&arr, const unsigned int n1, const unsigned int n2, const unsigned int n3, const unsigned int n4) + T**** allocate(T ****&arr, + const unsigned int n1, + const unsigned int n2, + const unsigned int n3, + const unsigned int n4) { #ifdef _SX arr = new T ***[n1]; @@ -143,8 +156,10 @@ namespace PHON_NS } catch (std::bad_alloc &ba) { std::cout << " Caught an exception when trying to allocate 4-dimensional array" << std::endl; - std::cout << " " << ba.what() << " : Array shape = " << n1 << "x" << n2 << "x" << n3 << "x" << n4 << std::endl; - std::cout << " " << ba.what() << " : Array size (MB) = " << memsize_in_MB(sizeof(T), n1, n2, n3, n4) << std::endl; + std::cout << " " << ba.what() << " : Array shape = " << n1 << "x" << n2 << "x" << n3 << "x" << n4 << std + ::endl; + std::cout << " " << ba.what() << " : Array size (MB) = " << memsize_in_MB(sizeof(T), n1, n2, n3, n4) << + std::endl; exit(EXIT_FAILURE); } #endif @@ -185,25 +200,35 @@ namespace PHON_NS // memsize calculator - unsigned long memsize_in_MB(const int size_of_one, const unsigned int n1) + unsigned long memsize_in_MB(const int size_of_one, + const unsigned int n1) { unsigned long n = n1 * size_of_one; return n / 1000000; } - unsigned long memsize_in_MB(const int size_of_one, const unsigned int n1, const unsigned int n2) + unsigned long memsize_in_MB(const int size_of_one, + const unsigned int n1, + const unsigned int n2) { unsigned long n = n1 * n2 * size_of_one; return n / 1000000; } - unsigned long memsize_in_MB(const int size_of_one, const unsigned int n1, const unsigned int n2, const unsigned int n3) + unsigned long memsize_in_MB(const int size_of_one, + const unsigned int n1, + const unsigned int n2, + const unsigned int n3) { unsigned long n = n1 * n2 * n3 * size_of_one; return n / 1000000; } - unsigned long memsize_in_MB(const int size_of_one, const unsigned int n1, const unsigned int n2, const unsigned int n3, const unsigned int n4) + unsigned long memsize_in_MB(const int size_of_one, + const unsigned int n1, + const unsigned int n2, + const unsigned int n3, + const unsigned int n4) { unsigned long n = n1 * n2 * n3 * n4 * size_of_one; return n / 1000000; diff --git a/anphon/mode_analysis.cpp b/anphon/mode_analysis.cpp new file mode 100644 index 00000000..1d38d575 --- /dev/null +++ b/anphon/mode_analysis.cpp @@ -0,0 +1,1918 @@ +/* + mode_analysis.cpp + +Copyright (c) 2018 Terumasa Tadano + +This file is distributed under the terms of the MIT license. +Please see the file 'LICENCE.txt' in the root directory +or http://opensource.org/licenses/mit-license.php for information. +*/ + +#include "mpi_common.h" +#include "mode_analysis.h" +#include "anharmonic_core.h" +#include "dynamical.h" +#include "error.h" +#include "kpoint.h" +#include "mathfunctions.h" +#include "memory.h" +#include "integration.h" +#include "parsephon.h" +#include "phonon_dos.h" +#include "selfenergy.h" +#include "symmetry_core.h" +#include "system.h" +#include "thermodynamics.h" +#include "write_phonons.h" +#include +#include +#include + + +using namespace PHON_NS; + +ModeAnalysis::ModeAnalysis(PHON *phon) : Pointers(phon) +{ + set_default_variables(); +} + +ModeAnalysis::~ModeAnalysis() +{ + deallocate_variables(); +} + +void ModeAnalysis::set_default_variables() +{ + ks_analyze_mode = false; + calc_imagpart = true; + calc_realpart = false; + calc_fstate_omega = false; + calc_fstate_k = false; + print_V3 = false; + spectral_func = false; +} + +void ModeAnalysis::deallocate_variables() const {} + + +void ModeAnalysis::setup_mode_analysis() +{ + // Judge if ks_analyze_mode should be turned on or not. + + unsigned int i; + + if (mympi->my_rank == 0) { + if (!ks_input.empty()) { + ks_analyze_mode = true; + + std::cout << std::endl; + std::cout << " KS_INPUT-tag is given : Analysis on the specified phonon modes" << std::endl; + std::cout << " will be performed instead of thermal conductivity calculation." << std::endl; + std::cout << std::endl; + + std::ifstream ifs_ks; + ifs_ks.open(ks_input.c_str(), std::ios::in); + if (!ifs_ks) + error->exit("setup_mode_analysis", + "Cannot open file KS_INPUT"); + + unsigned int nlist; + double ktmp[3]; + unsigned int snum_tmp; + + ifs_ks >> nlist; + + if (nlist <= 0) + error->exit("setup_mode_analysis", + "First line in KS_INPUT files should be a positive integer."); + + if (calc_fstate_k) { + kslist_fstate_k.clear(); + + for (i = 0; i < nlist; ++i) { + ifs_ks >> ktmp[0] >> ktmp[1] >> ktmp[2] >> snum_tmp; + + if (snum_tmp <= 0 || snum_tmp > dynamical->neval) { + error->exit("setup_mode_analysis", + "Mode index out of range."); + } + + kslist_fstate_k.emplace_back(ktmp, snum_tmp - 1); + } + std::cout << " The number of entries = " + << kslist_fstate_k.size() << std::endl; + } else { + kslist.clear(); + for (i = 0; i < nlist; ++i) { + ifs_ks >> ktmp[0] >> ktmp[1] >> ktmp[2] >> snum_tmp; + int knum_tmp = kpoint->get_knum(ktmp[0], ktmp[1], ktmp[2]); + + if (knum_tmp == -1) + error->exit("setup_mode_analysis", + "Given kpoint does not exist in given k-point grid."); + if (snum_tmp <= 0 || snum_tmp > dynamical->neval) { + error->exit("setup_mode_analysis", "Mode index out of range."); + } + kslist.push_back(knum_tmp * dynamical->neval + snum_tmp - 1); + } + std::cout << " The number of entries = " << kslist.size() << std::endl; + } + + ifs_ks.close(); + } else { + ks_analyze_mode = false; + } + } + + MPI_Bcast(&ks_analyze_mode, 1, MPI_LOGICAL, 0, MPI_COMM_WORLD); + MPI_Bcast(&calc_realpart, 1, MPI_LOGICAL, 0, MPI_COMM_WORLD); + MPI_Bcast(&calc_fstate_k, 1, MPI_LOGICAL, 0, MPI_COMM_WORLD); + MPI_Bcast(&calc_fstate_omega, 1, MPI_LOGICAL, 0, MPI_COMM_WORLD); + + unsigned int nlist; + + if (kpoint->kpoint_mode == 3) { + + if (!ks_analyze_mode) { + error->exit("setup_mode_analysis", "KPMODE = 3 must be used with FSTATE_K = 1"); + } + double **vec_tmp; + unsigned int *mode_tmp; + + + // Broadcast kslist_fstate_k + + nlist = kslist_fstate_k.size(); + MPI_Bcast(&nlist, 1, MPI_UNSIGNED, 0, MPI_COMM_WORLD); + + memory->allocate(vec_tmp, nlist, 3); + memory->allocate(mode_tmp, nlist); + + if (mympi->my_rank == 0) { + for (i = 0; i < nlist; ++i) { + for (int j = 0; j < 3; ++j) { + vec_tmp[i][j] = kslist_fstate_k[i].xk[j]; + } + mode_tmp[i] = kslist_fstate_k[i].nmode; + } + } + + MPI_Bcast(&vec_tmp[0][0], 3 * nlist, MPI_DOUBLE, 0, MPI_COMM_WORLD); + MPI_Bcast(&mode_tmp[0], nlist, MPI_INT, 0, MPI_COMM_WORLD); + + if (mympi->my_rank > 0) { + kslist_fstate_k.clear(); + + for (i = 0; i < nlist; ++i) { + kslist_fstate_k.emplace_back(vec_tmp[i], mode_tmp[i]); + } + } + + memory->deallocate(vec_tmp); + memory->deallocate(mode_tmp); + + } else { + + unsigned int *kslist_arr; + nlist = kslist.size(); + + // Broadcast kslist + + MPI_Bcast(&nlist, 1, MPI_UNSIGNED, 0, MPI_COMM_WORLD); + memory->allocate(kslist_arr, nlist); + + if (mympi->my_rank == 0) { + for (i = 0; i < nlist; ++i) kslist_arr[i] = kslist[i]; + } + MPI_Bcast(&kslist_arr[0], nlist, MPI_UNSIGNED, 0, MPI_COMM_WORLD); + + if (mympi->my_rank > 0) { + kslist.clear(); + for (i = 0; i < nlist; ++i) kslist.push_back(kslist_arr[i]); + } + memory->deallocate(kslist_arr); + } + + + if (ks_analyze_mode) { + if (kpoint->kpoint_mode == 2 && anharmonic_core->use_triplet_symmetry) { + anharmonic_core->use_triplet_symmetry = false; + if (mympi->my_rank == 0) { + std::cout << std::endl; + std::cout << " TRISYM was automatically set to 0." << std::endl; + std::cout << std::endl; + } + } + + if (anharmonic_core->quartic_mode > 0) { + // This is for quartic vertexes. + + if (mympi->my_rank == 0) { + std::cout << " QUARTIC = 1 : Frequency shift due to the loop diagram associated with" << std::endl; + std::cout << " quartic anharmonicity will be calculated." << std::endl; + std::cout << " Please check the accuracy of the quartic IFCs " << std::endl; + std::cout << " before doing serious calculations." << std::endl; + std::cout << std::endl; + } + } + + if (calc_realpart && integration->ismear != 0) { + error->exit("setup_mode_analysis", + "Sorry. REALPART = 1 can be used only with ISMEAR = 0"); + } + + if (spectral_func && integration->ismear != -1) { + error->exit("setup_mode_analysis", + "Sorry. SELF_W = 1 can be used only with the tetrahedron method (ISMEAR = -1)."); + } + + if (calc_fstate_k && kpoint->kpoint_mode != 3) { + error->exit("setup_mode_analysis", + "KPMODE should be 3 when FSTATE_K = 1."); + } + if (!calc_fstate_k && kpoint->kpoint_mode == 3) { + error->exit("setup_mode_analysis", + "KPMODE = 3 works only when FSTATE_K = 1"); + } + + if (calc_fstate_k && (calc_fstate_omega || print_V3 || spectral_func || calc_realpart)) { + error->warn("setup_mode_analysis", + "FSTATE_K = 1 shouldn't be set with the followings: PRINTV3=1, REALPART=1, FSTATE_W=1, SELF_W=1"); + } + + dynamical->modify_eigenvectors(); + } +} + +void ModeAnalysis::run_mode_analysis() +{ + double Tmax = system->Tmax; + double Tmin = system->Tmin; + double dT = system->dT; + double *T_arr; + + unsigned int NT = static_cast((Tmax - Tmin) / dT) + 1; + memory->allocate(T_arr, NT); + for (unsigned int i = 0; i < NT; ++i) T_arr[i] = Tmin + static_cast(i) * dT; + + double epsilon = integration->epsilon; + + if (calc_fstate_k) { + + // Momentum-resolved final state amplitude + print_momentum_resolved_final_state(NT, T_arr, epsilon); + + } else { + + print_selfenergy(NT, T_arr); + + if (print_V3) print_V3_elements(); + // if (print_V3) print_Phi3_elements(); + + if (calc_fstate_omega) print_frequency_resolved_final_state(NT, T_arr); + + if (spectral_func) print_spectral_function(NT, T_arr); + + } + + memory->deallocate(T_arr); +} + + +void ModeAnalysis::print_selfenergy(const int NT, + double *T_arr) +{ + int ns = dynamical->neval; + int j; + + std::ofstream ofs_linewidth, ofs_shift; + + double *damping_a = nullptr; + std::complex *self_tadpole = nullptr; + std::complex *self_a = nullptr; + std::complex *self_b = nullptr; + std::complex *self_c = nullptr; + std::complex *self_d = nullptr; + std::complex *self_e = nullptr; + std::complex *self_f = nullptr; + std::complex *self_g = nullptr; + std::complex *self_h = nullptr; + std::complex *self_i = nullptr; + std::complex *self_j = nullptr; + + if (mympi->my_rank == 0) { + std::cout << std::endl; + std::cout << " Calculate the line width (FWHM) of phonons" << std::endl; + std::cout << " due to 3-phonon interactions for given " + << kslist.size() << " modes." << std::endl; + + if (calc_realpart) { + if (anharmonic_core->quartic_mode == 1) { + std::cout << " REALPART = 1 and " << std::endl; + std::cout << " QUARTIC = 1 : Additionally, frequency shift of phonons due to 3-phonon" << std:: + endl; + std::cout << " and 4-phonon interactions will be calculated." << std::endl; + } else { + std::cout << " REALPART = 1 : Additionally, frequency shift of phonons due to 3-phonon" << std:: + endl; + std::cout << " interactions will be calculated." << std::endl; + } + } + + if (anharmonic_core->quartic_mode == 2) { + std::cout << std::endl; + std::cout << " QUARTIC = 2 : Additionally, phonon line width due to 4-phonon" << std::endl; + std::cout << " interactions will be calculated." << std::endl; + std::cout << " WARNING : This is very very expensive." << std::endl; + } + } + + memory->allocate(damping_a, NT); + memory->allocate(self_a, NT); + memory->allocate(self_b, NT); + memory->allocate(self_tadpole, NT); + + if (anharmonic_core->quartic_mode == 2) { + memory->allocate(self_c, NT); + memory->allocate(self_d, NT); + memory->allocate(self_e, NT); + memory->allocate(self_f, NT); + memory->allocate(self_g, NT); + memory->allocate(self_h, NT); + memory->allocate(self_i, NT); + memory->allocate(self_j, NT); + } + + for (int i = 0; i < kslist.size(); ++i) { + int knum = kslist[i] / ns; + int snum = kslist[i] % ns; + + double omega = dynamical->eval_phonon[knum][snum]; + + if (mympi->my_rank == 0) { + std::cout << std::endl; + std::cout << " Number : " << std::setw(5) << i + 1 << std::endl; + std::cout << " Phonon at k = ("; + for (j = 0; j < 3; ++j) { + std::cout << std::setw(10) << std::fixed << kpoint->xk[knum][j]; + if (j < 2) std::cout << ","; + } + std::cout << ")" << std::endl; + std::cout << " Mode index = " << std::setw(5) << snum + 1 << std::endl; + std::cout << " Frequency (cm^-1) : " + << std::setw(15) << writes->in_kayser(omega) << std::endl; + } + + int ik_irred = kpoint->kmap_to_irreducible[knum]; + + if (integration->ismear == -1) { + anharmonic_core->calc_damping_tetrahedron(NT, T_arr, omega, ik_irred, snum, damping_a); + } else { + selfenergy->selfenergy_a(NT, T_arr, omega, knum, snum, self_a); + for (j = 0; j < NT; ++j) damping_a[j] = self_a[j].imag(); + } + if (anharmonic_core->quartic_mode == 2) { + selfenergy->selfenergy_c(NT, T_arr, omega, knum, snum, self_c); + // selfenergy->selfenergy_d(NT, T_arr, omega, knum, snum, self_d); + // selfenergy->selfenergy_e(NT, T_arr, omega, knum, snum, self_e); + // selfenergy->selfenergy_f(NT, T_arr, omega, knum, snum, self_f); + // selfenergy->selfenergy_g(NT, T_arr, omega, knum, snum, self_g); + // selfenergy->selfenergy_h(NT, T_arr, omega, knum, snum, self_h); + // selfenergy->selfenergy_i(NT, T_arr, omega, knum, snum, self_i); + // selfenergy->selfenergy_j(NT, T_arr, omega, knum, snum, self_j); + } + + if (mympi->my_rank == 0) { + std::string file_linewidth = input->job_title + ".Gamma." + std::to_string(i + 1); + ofs_linewidth.open(file_linewidth.c_str(), std::ios::out); + if (!ofs_linewidth) + error->exit("print_selfenergy", + "Cannot open file file_linewidth"); + + ofs_linewidth << "# xk = "; + + for (j = 0; j < 3; ++j) { + ofs_linewidth << std::setw(15) << kpoint->xk[knum][j]; + } + ofs_linewidth << std::endl; + ofs_linewidth << "# mode = " << snum + 1 << std::endl; + ofs_linewidth << "# Frequency = " << writes->in_kayser(omega) << std::endl; + ofs_linewidth << "## Temperature dependence of 2*Gamma (FWHM) for the given mode" << std::endl; + ofs_linewidth << "## T[K], 2*Gamma3 (cm^-1) (bubble)"; + if (anharmonic_core->quartic_mode == 2) ofs_linewidth << ", 2*Gamma4(cm^-1) <-- specific diagram only"; + ofs_linewidth << std::endl; + + for (j = 0; j < NT; ++j) { + ofs_linewidth << std::setw(10) << T_arr[j] + << std::setw(15) << writes->in_kayser(2.0 * damping_a[j]); + + if (anharmonic_core->quartic_mode == 2) { + // ofs_mode_tau << std::setw(15) << writes->in_kayser(damp4[j]); + ofs_linewidth << std::setw(15) << writes->in_kayser(2.0 * self_c[j].imag()); + ofs_linewidth << std::setw(15) << writes->in_kayser(2.0 * self_d[j].imag()); + ofs_linewidth << std::setw(15) << writes->in_kayser(2.0 * self_e[j].imag()); + ofs_linewidth << std::setw(15) << writes->in_kayser(2.0 * self_f[j].imag()); + ofs_linewidth << std::setw(15) << writes->in_kayser(2.0 * self_g[j].imag()); + ofs_linewidth << std::setw(15) << writes->in_kayser(2.0 * self_h[j].imag()); + ofs_linewidth << std::setw(15) << writes->in_kayser(2.0 * self_i[j].imag()); + ofs_linewidth << std::setw(15) << writes->in_kayser(2.0 * self_j[j].imag()); + } + + ofs_linewidth << std::endl; + } + ofs_linewidth.close(); + std::cout << " Phonon line-width is printed in " << file_linewidth << std::endl; + } + + + if (calc_realpart) { + selfenergy->selfenergy_tadpole(NT, T_arr, omega, knum, snum, self_tadpole); + // selfenergy->selfenergy_a(NT, T_arr, omega, knum, snum, self_a); + + if (anharmonic_core->quartic_mode == 1) { + selfenergy->selfenergy_b(NT, T_arr, omega, knum, snum, self_b); + } + + if (mympi->my_rank == 0) { + std::string file_shift = input->job_title + ".Shift." + std::to_string(i + 1); + ofs_shift.open(file_shift.c_str(), std::ios::out); + if (!ofs_shift) + error->exit("print_selfenergy", + "Cannot open file file_shift"); + + ofs_shift << "# xk = "; + + for (j = 0; j < 3; ++j) { + ofs_shift << std::setw(15) << kpoint->xk[knum][j]; + } + ofs_shift << std::endl; + ofs_shift << "# mode = " << snum + 1 << std::endl; + ofs_shift << "# Frequency = " << writes->in_kayser(omega) << std::endl; + ofs_shift << "## T[K], Shift3 (cm^-1) (tadpole), Shift3 (cm^-1) (bubble)"; + if (anharmonic_core->quartic_mode == 1) ofs_shift << ", Shift4 (cm^-1) (loop)"; + ofs_shift << ", Shifted frequency (cm^-1)"; + ofs_shift << std::endl; + + + for (j = 0; j < NT; ++j) { + ofs_shift << std::setw(10) << T_arr[j]; + ofs_shift << std::setw(15) << writes->in_kayser(-self_tadpole[j].real()); + ofs_shift << std::setw(15) << writes->in_kayser(-self_a[j].real()); + + double omega_shift = omega - self_tadpole[j].real() - self_a[j].real(); + + if (anharmonic_core->quartic_mode == 1) { + ofs_shift << std::setw(15) << writes->in_kayser(-self_b[j].real()); + omega_shift -= self_b[j].real(); + } + ofs_shift << std::setw(15) << writes->in_kayser(omega_shift); + ofs_shift << std::endl; + } + + ofs_shift.close(); + std::cout << " Phonon frequency shift is printed in " << file_shift << std::endl; + } + } + } + + if (damping_a) { + memory->deallocate(damping_a); + } + if (self_tadpole) { + memory->deallocate(self_tadpole); + } + if (self_a) { + memory->deallocate(self_a); + } + if (self_b) { + memory->deallocate(self_b); + } + if (self_c) { + memory->deallocate(self_c); + } + if (self_d) { + memory->deallocate(self_d); + } + if (self_e) { + memory->deallocate(self_e); + } + if (self_f) { + memory->deallocate(self_f); + } + if (self_g) { + memory->deallocate(self_g); + } + if (self_h) { + memory->deallocate(self_h); + } + if (self_i) { + memory->deallocate(self_i); + } + if (self_j) { + memory->deallocate(self_j); + } +} + + +void ModeAnalysis::print_frequency_resolved_final_state(const unsigned int NT, + double *T_arr) +{ + int i, j; + double ***gamma_final; + double *freq_array; + std::ofstream ofs_omega; + int ns = dynamical->neval; + + memory->allocate(gamma_final, NT, dos->n_energy, 2); + memory->allocate(freq_array, dos->n_energy); + + for (i = 0; i < dos->n_energy; ++i) { + freq_array[i] = dos->energy_dos[i] * time_ry / Hz_to_kayser; + } + + if (mympi->my_rank == 0) { + std::cout << std::endl; + std::cout << " FSTATE_W = 1 : Calculate the frequency-resolved final state amplitude" << std::endl; + std::cout << " due to 3-phonon interactions." << std::endl; + } + + for (i = 0; i < kslist.size(); ++i) { + unsigned int knum = kslist[i] / ns; + unsigned int snum = kslist[i] % ns; + + double omega0 = dynamical->eval_phonon[knum][snum]; + + if (mympi->my_rank == 0) { + std::cout << std::endl; + std::cout << " Number : " << std::setw(5) << i + 1 << std::endl; + std::cout << " Phonon at k = ("; + for (j = 0; j < 3; ++j) { + std::cout << std::setw(10) << std::fixed << kpoint->xk[knum][j]; + if (j < 2) std::cout << ","; + } + std::cout << ")" << std::endl; + std::cout << " Mode index = " << std::setw(5) << snum + 1 << std::endl; + std::cout << " Frequency (cm^-1) : " << std::setw(15) + << writes->in_kayser(omega0) << std::endl; + } + + if (integration->ismear == -1) { + calc_frequency_resolved_final_state_tetrahedron(NT, + T_arr, + omega0, + dos->n_energy, + freq_array, + kpoint->kmap_to_irreducible[knum], + snum, + gamma_final); + } else { + calc_frequency_resolved_final_state(NT, + T_arr, + omega0, + dos->n_energy, + freq_array, + kpoint->kmap_to_irreducible[knum], + snum, + gamma_final); + } + + + if (mympi->my_rank == 0) { + std::string file_omega = input->job_title + ".fw." + std::to_string(i + 1); + ofs_omega.open(file_omega.c_str(), std::ios::out); + if (!ofs_omega) + error->exit("print_frequency_resolved_final_state", + "Cannot open file file_omega"); + + ofs_omega << "# xk = "; + + for (j = 0; j < 3; ++j) { + ofs_omega << std::setw(15) << kpoint->xk[knum][j]; + } + ofs_omega << std::endl; + ofs_omega << "# mode = " << snum << std::endl; + ofs_omega << "# Frequency = " << writes->in_kayser(omega0) << std::endl; + + ofs_omega << "## Frequency-resolved final state amplitude for given modes" << std::endl; + ofs_omega << "## Gamma[omega][temperature] (absorption, emission)"; + ofs_omega << std::endl; + + ofs_omega << "## "; + for (j = 0; j < NT; ++j) { + ofs_omega << std::setw(10) << T_arr[j]; + } + ofs_omega << std::endl; + for (int ienergy = 0; ienergy < dos->n_energy; ++ienergy) { + double omega = dos->energy_dos[ienergy]; + + ofs_omega << std::setw(10) << omega; + for (j = 0; j < NT; ++j) { + ofs_omega << std::setw(15) << gamma_final[j][ienergy][1]; + ofs_omega << std::setw(15) << gamma_final[j][ienergy][0]; + } + + ofs_omega << std::endl; + } + ofs_omega.close(); + std::cout << " Frequency-resolved final state amplitude is printed in " << file_omega << std::endl; + } + } + + memory->deallocate(freq_array); + memory->deallocate(gamma_final); +} + + +void ModeAnalysis::calc_frequency_resolved_final_state(const unsigned int N, + double *T, + const double omega0, + const unsigned int M, + const double *omega, + const unsigned int ik_in, + const unsigned int snum, + double ***ret) const +{ + int i, j; + + unsigned int arr[3]; + double omega_inner[2]; + double n1, n2; + double f1, f2; + double prod_tmp[2]; + double ***ret_mpi; + int nk = kpoint->nk; + int ns = dynamical->neval; + + double epsilon = integration->epsilon; + + std::vector triplet; + + kpoint->get_unique_triplet_k(ik_in, + anharmonic_core->use_triplet_symmetry, + false, + triplet); + memory->allocate(ret_mpi, N, M, 2); + + for (i = 0; i < N; ++i) { + for (j = 0; j < M; ++j) { + ret_mpi[i][j][0] = 0.0; + ret_mpi[i][j][1] = 0.0; + } + } + + for (int ik = mympi->my_rank; ik < triplet.size(); ik += mympi->nprocs) { + double multi = static_cast(triplet[ik].group.size()); + int knum = kpoint->kpoint_irred_all[ik_in][0].knum; + int knum_minus = kpoint->knum_minus[knum]; + + arr[0] = ns * knum_minus + snum; + int k1 = triplet[ik].group[0].ks[0]; + int k2 = triplet[ik].group[0].ks[1]; + + for (int is = 0; is < ns; ++is) { + for (int js = 0; js < ns; ++js) { + arr[1] = ns * k1 + is; + arr[2] = ns * k2 + js; + + omega_inner[0] = dynamical->eval_phonon[k1][is]; + omega_inner[1] = dynamical->eval_phonon[k2][js]; + + double v3_tmp = std::norm(anharmonic_core->V3(arr)); + + for (i = 0; i < N; ++i) { + double T_tmp = T[i]; + + if (thermodynamics->classical) { + f1 = thermodynamics->fC(omega_inner[0], T_tmp); + f2 = thermodynamics->fC(omega_inner[1], T_tmp); + n1 = f1 + f2; + n2 = f1 - f2; + } else { + f1 = thermodynamics->fB(omega_inner[0], T_tmp); + f2 = thermodynamics->fB(omega_inner[1], T_tmp); + n1 = f1 + f2 + 1.0; + n2 = f1 - f2; + } + + if (integration->ismear == 0) { + prod_tmp[0] = n1 + * (delta_lorentz(omega0 - omega_inner[0] - omega_inner[1], epsilon) + - delta_lorentz(omega0 + omega_inner[0] + omega_inner[1], epsilon)); + prod_tmp[1] = n2 + * (delta_lorentz(omega0 + omega_inner[0] - omega_inner[1], epsilon) + - delta_lorentz(omega0 - omega_inner[0] + omega_inner[1], epsilon)); + + for (j = 0; j < M; ++j) { + ret_mpi[i][j][0] += v3_tmp * multi + * delta_lorentz(omega[j] - omega_inner[0], epsilon) + * prod_tmp[0]; + ret_mpi[i][j][1] += v3_tmp * multi + * delta_lorentz(omega[j] - omega_inner[0], epsilon) + * prod_tmp[1]; + } + } else if (integration->ismear == 1) { + prod_tmp[0] = n1 + * (delta_gauss(omega0 - omega_inner[0] - omega_inner[1], epsilon) + - delta_gauss(omega0 + omega_inner[0] + omega_inner[1], epsilon)); + prod_tmp[1] = n2 + * (delta_gauss(omega0 + omega_inner[0] - omega_inner[1], epsilon) + - delta_gauss(omega0 - omega_inner[0] + omega_inner[1], epsilon)); + + for (j = 0; j < M; ++j) { + ret_mpi[i][j][0] += v3_tmp * multi + * delta_gauss(omega[j] - omega_inner[0], epsilon) + * prod_tmp[0]; + ret_mpi[i][j][1] += v3_tmp * multi + * delta_gauss(omega[j] - omega_inner[0], epsilon) + * prod_tmp[1]; + } + } + } + } + } + } + for (i = 0; i < N; ++i) { + for (j = 0; j < M; ++j) { + ret_mpi[i][j][0] *= pi * std::pow(0.5, 4) / static_cast(nk); + ret_mpi[i][j][1] *= pi * std::pow(0.5, 4) / static_cast(nk); + } + } + + MPI_Reduce(&ret_mpi[0][0][0], &ret[0][0][0], 2 * N * M, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); + + memory->deallocate(ret_mpi); + triplet.clear(); +} + + +void ModeAnalysis::calc_frequency_resolved_final_state_tetrahedron(const unsigned int N, + double *T, + const double omega0, + const unsigned int M, + const double *omega, + const unsigned int ik_in, + const unsigned int snum, + double ***ret) const +{ + int i, j; + int ik; + unsigned int jk; + + unsigned int is, js; + unsigned int k1, k2; + unsigned int arr[3]; + + double omega_inner[2]; + double n1, n2; + double f1, f2; + double xk_tmp[3]; + double v3_tmp; + int nk = kpoint->nk; + int ns = dynamical->neval; + int ns2 = ns * ns; + + int *kmap_identity; + double **energy_tmp; + double **weight_tetra; + double **v3_arr; + double ***delta_arr; + double prod_tmp[2]; + + double epsilon = integration->epsilon; + + std::vector triplet; + + kpoint->get_unique_triplet_k(ik_in, + anharmonic_core->use_triplet_symmetry, + false, + triplet); + + for (i = 0; i < N; ++i) { + for (j = 0; j < M; ++j) { + ret[i][j][0] = 0.0; + ret[i][j][1] = 0.0; + } + } + + unsigned int npair_uniq = triplet.size(); + + memory->allocate(v3_arr, npair_uniq, ns2); + memory->allocate(delta_arr, npair_uniq, ns2, 2); + + int knum = kpoint->kpoint_irred_all[ik_in][0].knum; + int knum_minus = kpoint->knum_minus[knum]; + + memory->allocate(kmap_identity, nk); + + for (i = 0; i < nk; ++i) kmap_identity[i] = i; + + +#ifdef _OPENMP +#pragma omp parallel private(is, js, k1, k2, xk_tmp, energy_tmp, i, weight_tetra, ik, jk, arr) +#endif + { + memory->allocate(energy_tmp, 3, nk); + memory->allocate(weight_tetra, 3, nk); + +#ifdef _OPENMP +#pragma omp for +#endif + for (int ib = 0; ib < ns2; ++ib) { + is = ib / ns; + js = ib % ns; + + for (k1 = 0; k1 < nk; ++k1) { + // Prepare two-phonon frequency for the tetrahedron method + + for (i = 0; i < 3; ++i) xk_tmp[i] = kpoint->xk[knum][i] - kpoint->xk[k1][i]; + + k2 = kpoint->get_knum(xk_tmp[0], xk_tmp[1], xk_tmp[2]); + + energy_tmp[0][k1] = dynamical->eval_phonon[k1][is] + dynamical->eval_phonon[k2][js]; + energy_tmp[1][k1] = dynamical->eval_phonon[k1][is] - dynamical->eval_phonon[k2][js]; + energy_tmp[2][k1] = -energy_tmp[1][k1]; + } + + for (i = 0; i < 3; ++i) { + integration->calc_weight_tetrahedron(nk, + kmap_identity, + weight_tetra[i], + energy_tmp[i], + omega0); + } + + // Loop for irreducible k points + for (ik = 0; ik < npair_uniq; ++ik) { + delta_arr[ik][ib][0] = 0.0; + delta_arr[ik][ib][1] = 0.0; + + for (i = 0; i < triplet[ik].group.size(); ++i) { + jk = triplet[ik].group[i].ks[0]; + delta_arr[ik][ib][0] += weight_tetra[0][jk]; + delta_arr[ik][ib][1] += weight_tetra[1][jk] - weight_tetra[2][jk]; + } + + // Calculate the matrix element V3 only when the weight is nonzero. + if (delta_arr[ik][ib][0] > 0.0 || std::abs(delta_arr[ik][ib][1]) > 0.0) { + k1 = triplet[ik].group[0].ks[0]; + k2 = triplet[ik].group[0].ks[1]; + + arr[0] = ns * knum_minus + snum; + arr[1] = ns * k1 + is; + arr[2] = ns * k2 + js; + + v3_arr[ik][ib] = std::norm(anharmonic_core->V3(arr)); + } else { + v3_arr[ik][ib] = 0.0; + } + } + } + + memory->deallocate(energy_tmp); + memory->deallocate(weight_tetra); + } + + + for (ik = 0; ik < npair_uniq; ++ik) { + for (is = 0; is < ns; ++is) { + for (js = 0; js < ns; ++js) { + v3_tmp = v3_arr[ik][ns * is + js]; + + if (v3_tmp > eps) { + k1 = triplet[ik].group[0].ks[0]; + k2 = triplet[ik].group[0].ks[1]; + omega_inner[0] = dynamical->eval_phonon[k1][is]; + omega_inner[1] = dynamical->eval_phonon[k2][js]; + +#ifdef _OPENMP +#pragma omp parallel for private(f1, f2, n1, n2, prod_tmp, j) +#endif + for (i = 0; i < N; ++i) { + if (thermodynamics->classical) { + f1 = thermodynamics->fC(omega_inner[0], T[i]); + f2 = thermodynamics->fC(omega_inner[1], T[i]); + + n1 = f1 + f2; + n2 = f1 - f2; + } else { + f1 = thermodynamics->fB(omega_inner[0], T[i]); + f2 = thermodynamics->fB(omega_inner[1], T[i]); + + n1 = f1 + f2 + 1.0; + n2 = f1 - f2; + } + + prod_tmp[0] = v3_tmp * n1 * delta_arr[ik][ns * is + js][0]; + prod_tmp[1] = -v3_tmp * n2 * delta_arr[ik][ns * is + js][1]; + + for (j = 0; j < M; ++j) { + ret[i][j][0] += prod_tmp[0] * delta_gauss(omega[j] - omega_inner[0], epsilon); + ret[i][j][1] += prod_tmp[1] * delta_gauss(omega[j] - omega_inner[0], epsilon); + } + } + } + } + } + } + + for (i = 0; i < N; ++i) { +#ifdef _OPENMP +#pragma omp parallel for +#endif + for (j = 0; j < M; ++j) { + ret[i][j][0] *= pi * std::pow(0.5, 4); + ret[i][j][1] *= pi * std::pow(0.5, 4); + } + } + + memory->deallocate(v3_arr); + memory->deallocate(delta_arr); + memory->deallocate(kmap_identity); + + triplet.clear(); +} + + +void ModeAnalysis::print_momentum_resolved_final_state(const unsigned int NT, + double *T_arr, + double epsilon) +{ + int i, j, k, l; + int iT; + int is, js; + int mode; + double xk1[3], xk2[3], xk3[3]; + double kvec[3]; + double f1, f2, n1, n2; + double norm; + double **eval, **eval2; + double **gamma_k; + int ns = dynamical->neval; + + std::complex ***evec; + + std::ofstream ofs_mode_tau; + + if (mympi->my_rank == 0) { + std::cout << std::endl; + if (integration->ismear == -1) { + std::cout << " ISMEAR = -1: Tetrahedron method will be used." << std::endl; + std::cout << " Sorry. Currently, ISMEAR = -1 cannot be used with FSTATE_K = 1."; + error->exit("calc_momentum_resolved_final_state", "exit."); + } else if (integration->ismear == 0) { + std::cout << " ISMEAR = 0: Lorentzian broadening with epsilon = " + << std::fixed << std::setprecision(2) << epsilon << " (cm^-1)" << std::endl; + } else if (integration->ismear == 1) { + std::cout << " ISMEAR = 1: Gaussian broadening with epsilon = " + << std::fixed << std::setprecision(2) << epsilon << " (cm^-1)" << std::endl; + } else { + error->exit("print_momentum_resolved_final_state", "Invalid ISMEAR"); + } + + std::cout << std::endl; + std::cout << " FSTATE_K = 1 : Calculate the momentum-resolved final state amplitude" << std::endl; + std::cout << " due to 3-phonon interactions for given " + << kslist_fstate_k.size() << " entries." << std::endl; + std::cout << std::endl; + } + + double **xk_plane, **xk_plane2; + double **kvec_plane; + double xk_vec1[3], xk_vec2[3]; + double *eval_tmp; + double omega_sum[3]; + double frac; + int knum_triangle[3]; + std::vector> ***kplist_conserved; + std::vector ***kplist_for_target_mode; + std::vector xk_vec; + double xk_norm[3], xk_tmp[3]; + double norm1, dprod; + double theta; + + memory->allocate(kplist_conserved, ns, ns, 2); + memory->allocate(kplist_for_target_mode, ns, ns, kslist_fstate_k.size()); + + double theta_ref = 0.0; + + // Loop over k point planes + + for (i = 0; i < kpoint->kp_plane_geometry.size(); ++i) { + int nk1_plane = kpoint->kp_plane_geometry[i].npoints[0]; + int nk2_plane = kpoint->kp_plane_geometry[i].npoints[1]; + + double div1 = 1.0 / static_cast(nk1_plane - 1); + double div2 = 1.0 / static_cast(nk2_plane - 1); + + int nk_plane = nk1_plane * nk2_plane; + + for (j = 0; j < 3; ++j) { + xk_vec1[j] = kpoint->kp_plane_geometry[i].xk_edges[0][j] + - kpoint->kp_plane_geometry[i].xk_origin[j]; + xk_vec2[j] = kpoint->kp_plane_geometry[i].xk_edges[1][j] + - kpoint->kp_plane_geometry[i].xk_origin[j]; + } + + + for (j = 0; j < 3; ++j) { + xk_norm[j] = xk_vec1[j]; + } + + rotvec(xk_norm, xk_norm, system->rlavec_p, 'T'); + double norm_ref = std::sqrt(xk_norm[0] * xk_norm[0] + + xk_norm[1] * xk_norm[1] + + xk_norm[2] * xk_norm[2]); + + memory->allocate(xk_plane, nk_plane, 3); + memory->allocate(xk_plane2, nk_plane, 3); + memory->allocate(kvec_plane, nk_plane, 3); + memory->allocate(eval, nk_plane, ns); + memory->allocate(eval2, nk_plane, ns); + memory->allocate(eval_tmp, ns); + memory->allocate(evec, 1, 1, 1); + + // Constructing xk's for the plane + int m = 0; + for (j = 0; j < nk1_plane; ++j) { + for (k = 0; k < nk2_plane; ++k) { + for (l = 0; l < 3; ++l) { + xk_plane[m][l] = kpoint->kp_plane_geometry[i].xk_origin[l] + + xk_vec1[l] * static_cast(j) * div1 + + xk_vec2[l] * static_cast(k) * div2; + } + ++m; + } + } + + // Get frequencies of each k point + + for (j = 0; j < nk_plane; ++j) { + for (k = 0; k < 3; ++k) kvec_plane[j][k] = dynamical->fold(xk_plane[j][k]); + rotvec(kvec_plane[j], kvec_plane[j], system->rlavec_p, 'T'); + norm = std::sqrt(kvec_plane[j][0] * kvec_plane[j][0] + + kvec_plane[j][1] * kvec_plane[j][1] + + kvec_plane[j][2] * kvec_plane[j][2]); + + if (norm > eps) { + for (k = 0; k < 3; ++k) kvec_plane[j][k] /= norm; + } + } + + for (j = 0; j < nk_plane; ++j) { + dynamical->eval_k(xk_plane[j], + kvec_plane[j], + fcs_phonon->fc2_ext, + eval[j], + evec[0], + false); + for (k = 0; k < ns; ++k) { + eval[j][k] = dynamical->freq(eval[j][k]); + } + } + + // Loop over k points to analyze the final state amplitude + + for (j = 0; j < kslist_fstate_k.size(); ++j) { + for (k = 0; k < 3; ++k) xk1[k] = kslist_fstate_k[j].xk[k]; + mode = kslist_fstate_k[j].nmode; + + for (k = 0; k < 3; ++k) kvec[k] = kslist_fstate_k[j].xk[k]; + rotvec(kvec, kvec, system->rlavec_p, 'T'); + norm = std::sqrt(kvec[0] * kvec[0] + + kvec[1] * kvec[1] + + kvec[2] * kvec[2]); + + if (norm > eps) { + for (k = 0; k < 3; ++k) kvec[k] /= norm; + } + + // for (k = 0; k < 3; ++k) xk1[k] = dynamical->fold(xk1[k]); + + dynamical->eval_k(xk1, + kvec, + fcs_phonon->fc2_ext, + eval_tmp, + evec[0], + false); + for (k = 0; k < ns; ++k) eval_tmp[k] = dynamical->freq(eval_tmp[k]); + + // Calculate xk's for the third index that satisfy the momentum conservation + + for (k = 0; k < nk_plane; ++k) { + for (l = 0; l < 3; ++l) { + xk_plane2[k][l] = dynamical->fold(xk1[l] - xk_plane[k][l]); + } + } + + // Get frequencies of each k point + + for (k = 0; k < nk_plane; ++k) { + for (l = 0; l < 3; ++l) kvec_plane[k][l] = xk_plane2[k][l]; + rotvec(kvec_plane[k], kvec_plane[k], system->rlavec_p, 'T'); + norm = std::sqrt(kvec_plane[k][0] * kvec_plane[k][0] + + kvec_plane[k][1] * kvec_plane[k][1] + + kvec_plane[k][2] * kvec_plane[k][2]); + + if (norm > eps) { + for (l = 0; l < 3; ++l) kvec_plane[k][l] /= norm; + } + } + + for (k = 0; k < nk_plane; ++k) { + dynamical->eval_k(xk_plane2[k], + kvec_plane[k], + fcs_phonon->fc2_ext, + eval2[k], + evec[0], + false); + for (l = 0; l < ns; ++l) { + eval2[k][l] = dynamical->freq(eval2[k][l]); + } + } + + // Find a list of k points which satisfy the energy conservation + + for (const auto &it : kpoint->kp_planes_tri[i]) { + // K point indexes for each triangle + for (k = 0; k < 3; ++k) knum_triangle[k] = it.knum[k]; + + //for (k=0; k<3; ++k) std::cout << " " << knum_triangle[k]; + //std::cout << std::endl; + + + //for (k = 0; k < 3; ++k) { + // std::cout << "xk1 = " << xk1[0] << " " << xk1[1] << " " << xk1[2] << std::endl; + // std::cout << "xk2 = " << xk_plane[knum_triangle[k]][0] << " " << xk_plane[knum_triangle[k]][1] << " " << xk_plane[knum_triangle[k]][2] << std::endl; + // std::cout << "xk3 = " << xk_plane2[knum_triangle[k]][0] << " " << xk_plane2[knum_triangle[k]][1] << " " << xk_plane2[knum_triangle[k]][2] << std::endl; + // std::cout << std::endl; + //} + + for (is = 0; is < ns; ++is) { + for (js = 0; js < ns; ++js) { + // The case of delta(w1 - w2 - w3) + + // std::cout << "is = " << is << " js = " << js << std::endl; + for (k = 0; k < 3; ++k) { + omega_sum[k] = eval_tmp[mode] + - eval[knum_triangle[k]][is] + - eval2[knum_triangle[k]][js]; + //std::cout << " " << writes->in_kayser(eval_tmp[mode]) + //<< " " << writes->in_kayser(eval[knum_triangle[k]][is]) + //<< " " << writes->in_kayser(eval2[knum_triangle[k]][js]) << std::endl; + } + if (omega_sum[0] > 0.0 && omega_sum[1] > 0.0 && omega_sum[2] > 0.0 || + omega_sum[0] < 0.0 && omega_sum[1] < 0.0 && omega_sum[2] < 0.0) + continue; + + if (omega_sum[0] * omega_sum[1] < 0.0) { + xk_vec.clear(); + + frac = -omega_sum[0] / (omega_sum[1] - omega_sum[0]); + + for (k = 0; k < 3; ++k) { + xk_vec.push_back((1.0 - frac) * xk_plane[knum_triangle[0]][k] + + frac * xk_plane[knum_triangle[1]][k]); + } + kplist_conserved[is][js][0].push_back(xk_vec); + } + + if (omega_sum[0] * omega_sum[2] < 0.0) { + xk_vec.clear(); + + frac = -omega_sum[0] / (omega_sum[2] - omega_sum[0]); + + for (k = 0; k < 3; ++k) { + xk_vec.push_back((1.0 - frac) * xk_plane[knum_triangle[0]][k] + + frac * xk_plane[knum_triangle[2]][k]); + } + kplist_conserved[is][js][0].push_back(xk_vec); + } + + if (omega_sum[1] * omega_sum[2] < 0.0) { + xk_vec.clear(); + + frac = -omega_sum[1] / (omega_sum[2] - omega_sum[1]); + + for (k = 0; k < 3; ++k) { + xk_vec.push_back((1.0 - frac) * xk_plane[knum_triangle[1]][k] + + frac * xk_plane[knum_triangle[2]][k]); + } + kplist_conserved[is][js][0].push_back(xk_vec); + } + + // The case of delta(w1 - w2 + w3) + + for (k = 0; k < 3; ++k) { + omega_sum[k] = eval_tmp[mode] + - eval[knum_triangle[k]][is] + + eval2[knum_triangle[k]][js]; + } + if (omega_sum[0] > 0.0 && omega_sum[1] > 0.0 && omega_sum[2] > 0.0 || + omega_sum[0] < 0.0 && omega_sum[1] < 0.0 && omega_sum[2] < 0.0) + continue; + + if (omega_sum[0] * omega_sum[1] < 0.0) { + xk_vec.clear(); + + frac = -omega_sum[0] / (omega_sum[1] - omega_sum[0]); + + for (k = 0; k < 3; ++k) { + xk_vec.push_back((1.0 - frac) * xk_plane[knum_triangle[0]][k] + + frac * xk_plane[knum_triangle[1]][k]); + } + kplist_conserved[is][js][1].push_back(xk_vec); + } + + if (omega_sum[0] * omega_sum[2] < 0.0) { + xk_vec.clear(); + + frac = -omega_sum[0] / (omega_sum[2] - omega_sum[0]); + + for (k = 0; k < 3; ++k) { + xk_vec.push_back((1.0 - frac) * xk_plane[knum_triangle[0]][k] + + frac * xk_plane[knum_triangle[2]][k]); + } + kplist_conserved[is][js][1].push_back(xk_vec); + } + + if (omega_sum[1] * omega_sum[2] < 0.0) { + xk_vec.clear(); + + frac = -omega_sum[1] / (omega_sum[2] - omega_sum[1]); + + for (k = 0; k < 3; ++k) { + xk_vec.push_back((1.0 - frac) * xk_plane[knum_triangle[1]][k] + + frac * xk_plane[knum_triangle[2]][k]); + } + kplist_conserved[is][js][1].push_back(xk_vec); + } + } + } + } + + for (is = 0; is < ns; ++is) { + for (js = 0; js < ns; ++js) { + for (auto it2 = kplist_conserved[is][js][0].begin(); + it2 != kplist_conserved[is][js][0].end(); ++it2) { + for (k = 0; k < 3; ++k) { + xk_tmp[k] = (*it2)[k]; + } + rotvec(xk_tmp, xk_tmp, system->rlavec_p, 'T'); + + norm1 = 0.0; + dprod = 0.0; + for (k = 0; k < 3; ++k) { + norm1 += xk_tmp[k] * xk_tmp[k]; + dprod += xk_tmp[k] * xk_norm[k]; + } + theta = std::acos(dprod / (norm_ref * std::sqrt(norm1))); + + kplist_for_target_mode[is][js][j].emplace_back(*it2, + std::cos(theta + theta_ref) * std::sqrt(norm1), + std::sin(theta + theta_ref) * std::sqrt(norm1), + i, 0); + } + + for (auto it2 = kplist_conserved[is][js][1].begin(); + it2 != kplist_conserved[is][js][1].end(); ++it2) { + for (k = 0; k < 3; ++k) { + xk_tmp[k] = (*it2)[k]; + } + rotvec(xk_tmp, xk_tmp, system->rlavec_p, 'T'); + + norm1 = 0.0; + dprod = 0.0; + for (k = 0; k < 3; ++k) { + norm1 += xk_tmp[k] * xk_tmp[k]; + dprod += xk_tmp[k] * xk_norm[k]; + } + theta = std::acos(dprod / (norm_ref * std::sqrt(norm1))); + + kplist_for_target_mode[is][js][j].emplace_back(*it2, + std::cos(theta + theta_ref) * std::sqrt(norm1), + std::sin(theta + theta_ref) * std::sqrt(norm1), + i, 1); + } + + kplist_conserved[is][js][0].clear(); + kplist_conserved[is][js][1].clear(); + } + } + } + + memory->deallocate(xk_plane); + memory->deallocate(xk_plane2); + memory->deallocate(kvec_plane); + memory->deallocate(eval); + memory->deallocate(eval2); + memory->deallocate(eval_tmp); + memory->deallocate(evec); + + rotvec(xk_vec1, xk_vec1, system->rlavec_p, 'T'); + rotvec(xk_vec2, xk_vec2, system->rlavec_p, 'T'); + + norm1 = 0.0; + double norm2 = 0.0; + dprod = 0.0; + for (j = 0; j < 3; ++j) { + norm1 += xk_vec1[j] * xk_vec1[j]; + norm2 += xk_vec2[j] * xk_vec2[j]; + dprod += xk_vec1[j] * xk_vec2[j]; + } + theta = std::acos(dprod / std::sqrt(norm1 * norm2)); + + theta_ref += theta; + } + + memory->deallocate(kplist_conserved); + + + std::vector> **final_state_xy; + std::vector triplet_xyG; + std::vector small_group_k; + int selection_type; + + int isym; + + + double srot[3][3]; + double xk_sym[3]; + double srot_inv[3][3], srot_inv_t[3][3]; + double ***symop_k; + + memory->allocate(symop_k, symmetry->nsym, 3, 3); + memory->allocate(final_state_xy, kslist_fstate_k.size(), NT); + + memory->allocate(eval, 3, ns); + memory->allocate(evec, 3, ns, ns); + + for (i = 0; i < kslist_fstate_k.size(); ++i) { + for (j = 0; j < 3; ++j) xk1[j] = -kslist_fstate_k[i].xk[j]; + mode = kslist_fstate_k[i].nmode; + + for (j = 0; j < 3; ++j) kvec[j] = dynamical->fold(xk1[j]); + rotvec(kvec, kvec, system->rlavec_p, 'T'); + norm = std::sqrt(kvec[0] * kvec[0] + kvec[1] * kvec[1] + kvec[2] * kvec[2]); + + if (norm > eps) for (j = 0; j < 3; ++j) kvec[j] /= norm; + for (j = 0; j < 3; ++j) xk1[j] = dynamical->fold(xk1[j]); + + dynamical->eval_k(xk1, kvec, fcs_phonon->fc2_ext, eval[0], evec[0], true); + for (j = 0; j < ns; ++j) eval[0][j] = dynamical->freq(eval[0][j]); + + small_group_k.clear(); + + for (isym = 0; isym < symmetry->nsym; ++isym) { + for (j = 0; j < 3; ++j) { + for (k = 0; k < 3; ++k) { + srot[j][k] = static_cast(symmetry->SymmList[isym].rot[j][k]); + } + } + + invmat3(srot_inv, srot); + transpose3(srot_inv_t, srot_inv); + + for (j = 0; j < 3; ++j) { + for (k = 0; k < 3; ++k) { + symop_k[isym][j][k] = srot_inv_t[j][k]; + } + } + + rotvec(xk_sym, xk1, symop_k[isym]); + + for (j = 0; j < 3; ++j) { + xk_sym[j] = xk_sym[j] - nint(xk_sym[j]); + xk_sym[j] = std::fmod(xk_sym[j], 1.0); + } + + double diff = 0.0; + for (j = 0; j < 3; ++j) { + diff += std::pow(std::fmod(xk_sym[j] - xk1[j], 1.0), 2); + } + if (std::sqrt(diff) < eps8) { + small_group_k.push_back(isym); + } + } + + if (mympi->my_rank == 0) { + std::cout << " Number : " << std::setw(5) << i + 1 << std::endl; + std::cout << " Phonon at k = ("; + for (j = 0; j < 3; ++j) { + std::cout << std::setw(10) << std::fixed << kslist_fstate_k[i].xk[j]; + if (j < 2) std::cout << ","; + } + std::cout << ")" << std::endl; + std::cout << " Mode index = " << std::setw(5) << mode + 1 << std::endl; + std::cout << " Frequency (cm^-1) : " << std::setw(15) + << writes->in_kayser(eval[0][mode]) << std::endl; + + int count_kp = 0; + + for (is = 0; is < ns; ++is) { + for (js = 0; js < ns; ++js) { + count_kp += kplist_for_target_mode[is][js][i].size(); + } + } + std::cout << " Number of k points satisfying the selection rule : " + << count_kp << std::endl; + std::cout << " Number of symmetry operations at k point : " + << small_group_k.size() << std::endl << std::endl; + } + + for (is = 0; is < ns; ++is) { + for (js = 0; js < ns; ++js) { + int nklist = kplist_for_target_mode[is][js][i].size(); + + if (nklist == 0) continue; + + memory->allocate(gamma_k, nklist, NT); + + for (k = 0; k < nklist; ++k) { + for (l = 0; l < NT; ++l) { + gamma_k[k][l] = 0.0; + } + } + + for (k = 0; k < nklist; ++k) { + for (l = 0; l < 3; ++l) + xk2[l] = dynamical->fold(kplist_for_target_mode[is][js][i][k].xk[l]); + + for (isym = 0; isym < small_group_k.size(); ++isym) { + rotvec(xk_sym, xk2, symop_k[small_group_k[isym]]); + + for (l = 0; l < 3; ++l) xk3[l] = dynamical->fold(-xk1[l] - xk_sym[l]); + + for (l = 0; l < 3; ++l) kvec[l] = xk_sym[l]; + rotvec(kvec, kvec, system->rlavec_p, 'T'); + norm = std::sqrt(kvec[0] * kvec[0] + kvec[1] * kvec[1] + kvec[2] * kvec[2]); + + if (norm > eps) for (l = 0; l < 3; ++l) kvec[l] /= norm; + + dynamical->eval_k(xk_sym, kvec, fcs_phonon->fc2_ext, eval[1], evec[1], true); + + for (l = 0; l < 3; ++l) kvec[l] = xk3[l]; + rotvec(kvec, kvec, system->rlavec_p, 'T'); + norm = std::sqrt(kvec[0] * kvec[0] + kvec[1] * kvec[1] + kvec[2] * kvec[2]); + + if (norm > eps) for (l = 0; l < 3; ++l) kvec[l] /= norm; + + dynamical->eval_k(xk3, kvec, fcs_phonon->fc2_ext, eval[2], evec[2], true); + + for (l = 0; l < ns; ++l) { + eval[1][l] = dynamical->freq(eval[1][l]); + eval[2][l] = dynamical->freq(eval[2][l]); + } + + double V3norm = std::norm(anharmonic_core->V3_mode(mode, xk_sym, xk3, is, js, eval, evec)); + + for (iT = 0; iT < NT; ++iT) { + double T_tmp = T_arr[iT]; + + if (thermodynamics->classical) { + f1 = thermodynamics->fC(eval[1][is], T_tmp); + f2 = thermodynamics->fC(eval[2][js], T_tmp); + n1 = f1 + f2; + n2 = f1 - f2; + } else { + f1 = thermodynamics->fB(eval[1][is], T_tmp); + f2 = thermodynamics->fB(eval[2][js], T_tmp); + n1 = f1 + f2 + 1.0; + n2 = f1 - f2; + } + + + if (selection_type == 0) { + gamma_k[k][iT] += V3norm * n1; + } else if (selection_type == 1) { + gamma_k[k][iT] += V3norm * n2; + } + } + } + + for (iT = 0; iT < NT; ++iT) + gamma_k[k][iT] *= pi * std::pow(0.5, 4) / static_cast(small_group_k.size()); + + double pos_x = kplist_for_target_mode[is][js][i][k].x; + double pos_y = kplist_for_target_mode[is][js][i][k].y; + selection_type = kplist_for_target_mode[is][js][i][k].selection_type; + + for (iT = 0; iT < NT; ++iT) { + triplet_xyG.clear(); + triplet_xyG.push_back(pos_x); + triplet_xyG.push_back(pos_y); + triplet_xyG.push_back(gamma_k[k][iT]); + final_state_xy[i][iT].push_back(triplet_xyG); + } + } + memory->deallocate(gamma_k); + } + } + + if (mympi->my_rank == 0) { + std::string file_mode_tau = input->job_title + ".fk." + std::to_string(i + 1); + ofs_mode_tau.open(file_mode_tau.c_str(), std::ios::out); + if (!ofs_mode_tau) + error->exit("compute_mode_tau", + "Cannot open file file_mode_tau"); + + ofs_mode_tau << "## Momentum-resolved final state amplitude" << std::endl; + + ofs_mode_tau << "# " << "Gamma at "; + for (l = 0; l < 3; ++l) ofs_mode_tau << std::setw(10) << -xk1[l]; + ofs_mode_tau << " , mode = " << mode + 1 << std::endl; + ofs_mode_tau << " # Temperature [K], coordinate in FBZ, final state amplitude" << std::endl; + for (iT = 0; iT < NT; ++iT) { + for (k = 0; k < final_state_xy[i][iT].size(); ++k) { + ofs_mode_tau << std::setw(10) << T_arr[iT]; + ofs_mode_tau << std::setw(15) << final_state_xy[i][iT][k][0]; + ofs_mode_tau << std::setw(15) << final_state_xy[i][iT][k][1]; + ofs_mode_tau << std::setw(15) << final_state_xy[i][iT][k][2] << std::endl; + } + } + + ofs_mode_tau.close(); + std::cout << " The result is saved in " << file_mode_tau << std::endl; + std::cout << std::endl; + } + } + + memory->deallocate(kplist_for_target_mode); + memory->deallocate(final_state_xy); + memory->deallocate(symop_k); + memory->deallocate(eval); + memory->deallocate(evec); +} + +void ModeAnalysis::print_V3_elements() +{ + int j; + int ns = dynamical->neval; + double **v3norm; + std::ofstream ofs_V3; + + std::vector triplet; + + for (int i = 0; i < kslist.size(); ++i) { + int knum = kslist[i] / ns; + int snum = kslist[i] % ns; + + double omega = dynamical->eval_phonon[knum][snum]; + + if (mympi->my_rank == 0) { + std::cout << std::endl; + std::cout << " Number : " << std::setw(5) << i + 1 << std::endl; + std::cout << " Phonon at k = ("; + for (j = 0; j < 3; ++j) { + std::cout << std::setw(10) << std::fixed << kpoint->xk[knum][j]; + if (j < 2) std::cout << ","; + } + std::cout << ")" << std::endl; + std::cout << " Mode index = " << std::setw(5) << snum + 1 << std::endl; + std::cout << " Frequency (cm^-1) : " + << std::setw(15) << writes->in_kayser(omega) << std::endl; + } + + int ik_irred = kpoint->kmap_to_irreducible[knum]; + + kpoint->get_unique_triplet_k(ik_irred, + anharmonic_core->use_triplet_symmetry, + true, + triplet); + unsigned int nk_size = triplet.size(); + + memory->allocate(v3norm, nk_size, ns * ns); + + calc_V3norm2(ik_irred, snum, v3norm); + + if (mympi->my_rank == 0) { + std::string file_V3 = input->job_title + ".V3." + std::to_string(i + 1); + ofs_V3.open(file_V3.c_str(), std::ios::out); + if (!ofs_V3) + error->exit("run_mode_analysis", + "Cannot open file file_V3"); + + ofs_V3 << "# xk = "; + + for (j = 0; j < 3; ++j) { + ofs_V3 << std::setw(15) << kpoint->xk[knum][j]; + } + ofs_V3 << std::endl; + ofs_V3 << "# mode = " << snum + 1 << std::endl; + ofs_V3 << "# Frequency = " << writes->in_kayser(omega) << std::endl; + ofs_V3 << "## Matrix elements |V3|^2 for given mode" << std::endl; + ofs_V3 << "## q', j', omega(q'j') (cm^-1), q'', j'', "; + ofs_V3 << "omega(q''j'') (cm^-1), |V3(-qj,q'j',q''j'')|^2 (cm^-2), multiplicity" << std::endl; + + for (j = 0; j < nk_size; ++j) { + int multi = triplet[j].group.size(); + unsigned int k1 = triplet[j].group[0].ks[0]; + unsigned int k2 = triplet[j].group[0].ks[1]; + + unsigned int ib = 0; + + for (unsigned int is = 0; is < ns; ++is) { + for (unsigned int js = 0; js < ns; ++js) { + ofs_V3 << std::setw(5) << k1 + 1 << std::setw(5) << is + 1; + ofs_V3 << std::setw(15) + << writes->in_kayser(dynamical->eval_phonon[k1][is]); + ofs_V3 << std::setw(5) << k2 + 1 << std::setw(5) << js + 1; + ofs_V3 << std::setw(15) + << writes->in_kayser(dynamical->eval_phonon[k2][js]); + ofs_V3 << std::setw(15) << v3norm[j][ib]; + ofs_V3 << std::setw(5) << multi; + ofs_V3 << std::endl; + + ++ib; + } + ofs_V3 << std::endl; + } + } + + ofs_V3.close(); + } + memory->deallocate(v3norm); + } +} + + +void ModeAnalysis::calc_V3norm2(const unsigned int ik_in, + const unsigned int snum, + double **ret) const +{ + unsigned int is, js; + unsigned int k1, k2; + unsigned int arr[3]; + int ns = dynamical->neval; + + int ns2 = ns * ns; + + double factor = std::pow(0.5, 3) * std::pow(Hz_to_kayser / time_ry, 2); + std::vector triplet; + + unsigned int knum = kpoint->kpoint_irred_all[ik_in][0].knum; + unsigned int knum_minus = kpoint->knum_minus[knum]; + + kpoint->get_unique_triplet_k(ik_in, + anharmonic_core->use_triplet_symmetry, + true, + triplet); +#ifdef _OPENMP +#pragma omp parallel for private(is, js, k1, k2, arr) +#endif + for (int ib = 0; ib < ns2; ++ib) { + is = ib / ns; + js = ib % ns; + + for (unsigned int ik = 0; ik < triplet.size(); ++ik) { + k1 = triplet[ik].group[0].ks[0]; + k2 = triplet[ik].group[0].ks[1]; + + arr[0] = ns * knum_minus + snum; + arr[1] = ns * k1 + is; + arr[2] = ns * k2 + js; + + ret[ik][ib] = std::norm(anharmonic_core->V3(arr)) * factor; + } + } +} + + +void ModeAnalysis::print_Phi3_elements() +{ + int j; + int ns = dynamical->neval; + std::complex **phi3; + std::ofstream ofs_V3; + + std::vector triplet; + + for (int i = 0; i < kslist.size(); ++i) { + int knum = kslist[i] / ns; + int snum = kslist[i] % ns; + + double omega = dynamical->eval_phonon[knum][snum]; + + if (mympi->my_rank == 0) { + std::cout << std::endl; + std::cout << " Number : " << std::setw(5) << i + 1 << std::endl; + std::cout << " Phonon at k = ("; + for (j = 0; j < 3; ++j) { + std::cout << std::setw(10) << std::fixed << kpoint->xk[knum][j]; + if (j < 2) std::cout << ","; + } + std::cout << ")" << std::endl; + std::cout << " Mode index = " << std::setw(5) << snum + 1 << std::endl; + std::cout << " Frequency (cm^-1) : " + << std::setw(15) << writes->in_kayser(omega) << std::endl; + } + + int ik_irred = kpoint->kmap_to_irreducible[knum]; + + kpoint->get_unique_triplet_k(ik_irred, + anharmonic_core->use_triplet_symmetry, + true, + triplet, 1); + unsigned int nk_size = triplet.size(); + + memory->allocate(phi3, nk_size, ns * ns); + + calc_Phi3(knum, snum, triplet, phi3); + + if (mympi->my_rank == 0) { + std::string file_V3 = input->job_title + ".Phi3." + std::to_string(i + 1); + ofs_V3.open(file_V3.c_str(), std::ios::out); + if (!ofs_V3) + error->exit("print_phi3_element", + "Cannot open file file_V3"); + + ofs_V3 << "# xk = "; + + for (j = 0; j < 3; ++j) { + ofs_V3 << std::setw(15) << kpoint->xk[knum][j]; + } + ofs_V3 << std::endl; + ofs_V3 << "# mode = " << snum + 1 << std::endl; + ofs_V3 << "# Frequency = " << writes->in_kayser(omega) << std::endl; + ofs_V3 << "## Matrix elements Phi3 for given mode" << std::endl; + ofs_V3 << "## q', j', omega(q'j') (cm^-1), q'', j'', omega(q''j'') (cm^-1), "; + ofs_V3 << "Phi3(qj,q'j',q''j'') (Ry/(u^{1/2}Bohr)^{3}), multiplicity" << std::endl; + + for (j = 0; j < nk_size; ++j) { + int multi = triplet[j].group.size(); + unsigned int k1 = triplet[j].group[0].ks[0]; + unsigned int k2 = triplet[j].group[0].ks[1]; + + unsigned int ib = 0; + + for (unsigned int is = 0; is < ns; ++is) { + for (unsigned int js = 0; js < ns; ++js) { + ofs_V3 << std::setw(5) << k1 + 1 << std::setw(5) << is + 1; + ofs_V3 << std::setw(15) + << writes->in_kayser(dynamical->eval_phonon[k1][is]); + ofs_V3 << std::setw(5) << k2 + 1 << std::setw(5) << js + 1; + ofs_V3 << std::setw(15) + << writes->in_kayser(dynamical->eval_phonon[k2][js]); + ofs_V3 << std::setw(15) << phi3[j][ib].real(); + ofs_V3 << std::setw(15) << phi3[j][ib].imag(); + ofs_V3 << std::setw(5) << multi; + ofs_V3 << std::endl; + + ++ib; + } + ofs_V3 << std::endl; + } + } + + ofs_V3.close(); + } + memory->deallocate(phi3); + } +} + + +void ModeAnalysis::calc_Phi3(const unsigned int knum, + const unsigned int snum, + const std::vector &triplet, + std::complex **ret) const +{ + unsigned int is, js; + unsigned int k1, k2; + unsigned int arr[3]; + int ns = dynamical->neval; + int ns2 = ns * ns; + double omega[3]; + + double factor = std::pow(amu_ry, 1.5); + +#ifdef _OPENMP +#pragma omp parallel for private(is, js, k1, k2, arr, omega) +#endif + for (int ib = 0; ib < ns2; ++ib) { + is = ib / ns; + js = ib % ns; + + for (unsigned int ik = 0; ik < triplet.size(); ++ik) { + k1 = triplet[ik].group[0].ks[0]; + k2 = triplet[ik].group[0].ks[1]; + + arr[0] = ns * knum + snum; + arr[1] = ns * k1 + is; + arr[2] = ns * k2 + js; + + omega[0] = dynamical->eval_phonon[knum][snum]; + omega[1] = dynamical->eval_phonon[k1][is]; + omega[2] = dynamical->eval_phonon[k2][js]; + + ret[ik][ib] = anharmonic_core->V3(arr) * factor + * std::sqrt(omega[0] * omega[1] * omega[2]); + } + } +} + + +void ModeAnalysis::print_spectral_function(const int NT, + double *T_arr) +{ + int ns = dynamical->neval; + int i, j; + int iomega; + double **self3_imag, **self3_real; + std::ofstream ofs_self; + double *omega_array; + double Omega_min = dos->emin; + double Omega_max = dos->emax; + double delta_omega = dos->delta_e; + double omega2[2]; + + int nomega = static_cast((Omega_max - Omega_min) / delta_omega) + 1; + + memory->allocate(omega_array, nomega); + memory->allocate(self3_imag, NT, nomega); + memory->allocate(self3_real, NT, nomega); + + for (i = 0; i < nomega; ++i) { + omega_array[i] = Omega_min + delta_omega * static_cast(i); + omega_array[i] *= time_ry / Hz_to_kayser; + } + + for (i = 0; i < kslist.size(); ++i) { + int knum = kslist[i] / ns; + int snum = kslist[i] % ns; + int ik_irred = kpoint->kmap_to_irreducible[knum]; + + if (mympi->my_rank == 0) { + std::cout << std::endl; + std::cout << " SELF_W = 1: Calculate bubble selfenergy with frequency dependency" << std::endl; + std::cout << " for given " << kslist.size() << " modes." << std::endl; + std::cout << std::endl; + std::cout << " Number : " << std::setw(5) << i + 1 << std::endl; + std::cout << " Phonon at k = ("; + for (j = 0; j < 3; ++j) { + std::cout << std::setw(10) << std::fixed << kpoint->xk[knum][j]; + if (j < 2) std::cout << ","; + } + std::cout << ")" << std::endl; + std::cout << " Mode index = " << std::setw(5) << snum + 1 << std::endl; + + std::string file_self = input->job_title + ".Self." + std::to_string(i + 1); + ofs_self.open(file_self.c_str(), std::ios::out); + if (!ofs_self) error->exit("run_mode_analysis", "Cannot open file file_shift"); + + ofs_self << "# xk = "; + + for (j = 0; j < 3; ++j) { + ofs_self << std::setw(15) << kpoint->xk[knum][j]; + } + ofs_self << std::endl; + ofs_self << "# mode = " << snum + 1 << std::endl; + ofs_self << "## T[K], Freq (cm^-1), omega (cm^-1), Self.real (cm^-1), Self.imag (cm^-1)"; + ofs_self << std::endl; + } + + for (int iT = 0; iT < NT; ++iT) { + double T_now = T_arr[iT]; + double omega = dynamical->eval_phonon[knum][snum]; + + if (mympi->my_rank == 0) { + std::cout << " Temperature (K) : " << std::setw(15) << T_now << std::endl; + std::cout << " Frequency (cm^-1) : " << std::setw(15) << writes->in_kayser(omega) << std::endl; + } + + anharmonic_core->calc_self3omega_tetrahedron(T_now, + dynamical->eval_phonon, + dynamical->evec_phonon, + ik_irred, + snum, + nomega, + omega_array, + self3_imag[iT]); + + // Calculate real part of the self-energy by Kramers-Kronig relation + for (iomega = 0; iomega < nomega; ++iomega) { + double self_tmp = 0.0; + omega2[0] = omega_array[iomega] * omega_array[iomega]; + for (int jomega = 0; jomega < nomega; ++jomega) { + if (jomega == iomega) continue; + omega2[1] = omega_array[jomega] * omega_array[jomega]; + self_tmp += omega_array[jomega] * self3_imag[iT][jomega] / (omega2[1] - omega2[0]); + } + self3_real[iT][iomega] = 2.0 * delta_omega * time_ry * self_tmp / (pi * Hz_to_kayser); + } + + if (mympi->my_rank == 0) { + for (iomega = 0; iomega < nomega; ++iomega) { + ofs_self << std::setw(10) << T_now << std::setw(15) << writes->in_kayser(omega); + ofs_self << std::setw(10) << writes->in_kayser(omega_array[iomega]) + << std::setw(15) << writes->in_kayser(self3_real[iT][iomega]) + << std::setw(15) << writes->in_kayser(self3_imag[iT][iomega]) << std::endl; + } + ofs_self << std::endl; + } + } + if (mympi->my_rank == 0) ofs_self.close(); + } + + memory->deallocate(omega_array); + memory->deallocate(self3_imag); + memory->deallocate(self3_real); +} diff --git a/anphon/mode_analysis.h b/anphon/mode_analysis.h new file mode 100644 index 00000000..2dfe9f49 --- /dev/null +++ b/anphon/mode_analysis.h @@ -0,0 +1,94 @@ +/* + mode_analysis.h + +Copyright (c) 2018 Terumasa Tadano + +This file is distributed under the terms of the MIT license. +Please see the file 'LICENCE.txt' in the root directory +or http://opensource.org/licenses/mit-license.php for information. +*/ + +#pragma once + +#include "pointers.h" +#include +#include +#include +#include "anharmonic_core.h" +#include "kpoint.h" + +namespace PHON_NS +{ + class ModeAnalysis : protected Pointers + { + public: + ModeAnalysis(class PHON *); + + ~ModeAnalysis(); + + void run_mode_analysis(); + + void setup_mode_analysis(); + + bool ks_analyze_mode; + bool calc_imagpart; + bool calc_realpart; + bool calc_fstate_omega; + bool calc_fstate_k; + bool print_V3; + bool spectral_func; + + std::string ks_input; + std::vector kslist; + + private: + void set_default_variables(); + void deallocate_variables() const; + + std::vector kslist_fstate_k; + + void calc_frequency_resolved_final_state(const unsigned int, + double *, + const double, + const unsigned int, + const double *, + const unsigned int, + const unsigned int, + double ***) const; + + void calc_frequency_resolved_final_state_tetrahedron(const unsigned int, + double *, + const double, + const unsigned int, + const double *, + const unsigned int, + const unsigned int, + double ***) const; + + void print_momentum_resolved_final_state(const unsigned int, + double *, + const double); + + void print_frequency_resolved_final_state(const unsigned int, + double *); + + void print_V3_elements(); + + void print_Phi3_elements(); + + void calc_V3norm2(const unsigned int, + const unsigned int, + double **) const; + + void calc_Phi3(unsigned int, + unsigned int, + const std::vector &, + std::complex **) const; + + void print_selfenergy(const int, + double *); + + void print_spectral_function(const int, + double *); + }; +} diff --git a/anphon/mpi_common.cpp b/anphon/mpi_common.cpp index 37dda5bf..4a166681 100644 --- a/anphon/mpi_common.cpp +++ b/anphon/mpi_common.cpp @@ -9,26 +9,25 @@ */ #include "mpi_common.h" -#include #include #include using namespace PHON_NS; -MyMPI::MyMPI(PHON *phon, MPI_Comm comm): Pointers(phon) +MyMPI::MyMPI(PHON *phon, + MPI_Comm comm): Pointers(phon) { MPI_Comm_rank(comm, &my_rank); MPI_Comm_size(comm, &nprocs); } -MyMPI::~MyMPI() -{ -} +MyMPI::~MyMPI() {} -void MyMPI::MPI_Bcast_string(std::string &str, int root, MPI_Comm comm) +void MyMPI::MPI_Bcast_string(std::string &str, + int root, + MPI_Comm comm) const { - int len; - len = str.length(); + int len = str.length(); MPI_Bcast(&len, 1, MPI_INT, 0, comm); // limited to 512 characters diff --git a/anphon/mpi_common.h b/anphon/mpi_common.h index 2b27b98f..6ddb71e6 100644 --- a/anphon/mpi_common.h +++ b/anphon/mpi_common.h @@ -21,13 +21,17 @@ namespace PHON_NS { - class MyMPI: protected Pointers + class MyMPI : protected Pointers { public: - MyMPI(class PHON *, MPI_Comm); + MyMPI(class PHON *, + MPI_Comm); + ~MyMPI(); - void MPI_Bcast_string(std::string &, int, MPI_Comm); + void MPI_Bcast_string(std::string &, + int, + MPI_Comm) const; int my_rank; int nprocs; diff --git a/anphon/parsephon.cpp b/anphon/parsephon.cpp index 59bbcfa3..b1e451b6 100644 --- a/anphon/parsephon.cpp +++ b/anphon/parsephon.cpp @@ -8,52 +8,53 @@ or http://opensource.org/licenses/mit-license.php for information. */ -#include "mpi_common.h" #include "parsephon.h" +#include "conductivity.h" +#include "dynamical.h" #include "error.h" +#include "ewald.h" +#include "fcs_phonon.h" #include "gruneisen.h" -#include "system.h" +#include "integration.h" +#include "isotope.h" #include "kpoint.h" -#include "fcs_phonon.h" -#include "dynamical.h" +#include "memory.h" +#include "phonon_dos.h" +#include "phonon_velocity.h" +#include "anharmonic_core.h" +#include "mode_analysis.h" +#include "scph.h" +#include "symmetry_core.h" +#include "system.h" +#include "thermodynamics.h" #include "write_phonons.h" +#include +#include +#include #include #include -#include -#include -#include "relaxation.h" -#include "conductivity.h" -#include "symmetry_core.h" -#include #include #include -#include "phonon_dos.h" -#include -#include -#include "memory.h" -#include "isotope.h" -#include "phonon_velocity.h" -#include "integration.h" -#include "scph.h" -#include "ewald.h" -#include "thermodynamics.h" +#include +#include #include - #include -#include using namespace PHON_NS; Input::Input(PHON *phon): Pointers(phon) { + from_stdin = false; + job_title = ""; } Input::~Input() { - if (!from_stdin && mympi->my_rank == 0) ifs_input.close(); + if (ifs_input.is_open()) ifs_input.close(); } -void Input::parce_input(int narg, char **arg) +void Input::parce_input(int narg, + char **arg) { if (narg == 1) { @@ -80,12 +81,7 @@ void Input::parce_input(int narg, char **arg) "&cell entry not found in the input file"); parse_cell_parameter(); - bool use_defaults_for_analysis; - if (!locate_tag("&analysis")) { - use_defaults_for_analysis = true; - } else { - use_defaults_for_analysis = false; - } + bool use_defaults_for_analysis = !locate_tag("&analysis"); parse_analysis_vars(use_defaults_for_analysis); if (!locate_tag("&kpoint")) @@ -107,65 +103,46 @@ void Input::parse_general_vars() // Read input parameters in the &general-field. int i; - int nsym, nbands, ismear, nkd; - unsigned int nonanalytic; - double *masskd; - double Tmin, Tmax, dT, na_sigma, epsilon; - double emin, emax, delta_e; - double tolerance; - double prec_ewald; - bool printsymmetry; - bool restart; - bool sym_time_reversal, use_triplet_symmetry; - bool selenergy_offdiagonal; - bool update_fc2; - bool classical; - unsigned int bornsym; - unsigned int band_connection; - + int nkd; struct stat st; - std::string prefix, mode, fcsinfo, fc2info; - std::string borninfo, file_result; - std::string *kdname; std::string str_tmp; - std::string str_allowed_list = "PREFIX MODE NSYM TOLERANCE PRINTSYM FCSXML FC2XML TMIN TMAX DT \ - NBANDS NONANALYTIC BORNINFO NA_SIGMA ISMEAR EPSILON EMIN EMAX DELTA_E \ - RESTART TREVSYM NKD KD MASS TRISYM PREC_EWALD CLASSICAL BCONNECT BORNSYM"; - std::string str_no_defaults = "PREFIX MODE FCSXML NKD KD MASS"; - std::vector no_defaults; + std::vector input_list{ + "PREFIX", "MODE", "NSYM", "TOLERANCE", "PRINTSYM", "FCSXML", "FC2XML", + "TMIN", "TMAX", "DT", "NBANDS", "NONANALYTIC", "BORNINFO", "NA_SIGMA", + "ISMEAR", "EPSILON", "EMIN", "EMAX", "DELTA_E", "RESTART", "TREVSYM", + "NKD", "KD", "MASS", "TRISYM", "PREC_EWALD", "CLASSICAL", "BCONNECT", "BORNSYM" + }; + + std::vector no_defaults{"PREFIX", "MODE", "FCSXML", "NKD", "KD"}; std::vector kdname_v, masskd_v; std::map general_var_dict; + double *masskd = nullptr; + std::string *kdname = nullptr; + if (from_stdin) { std::cin.ignore(); } else { ifs_input.ignore(); } - get_var_dict(str_allowed_list, general_var_dict); -#if _USE_BOOST - boost::split(no_defaults, str_no_defaults, boost::is_space()); -#else - no_defaults = my_split(str_no_defaults, ' '); -#endif + get_var_dict(input_list, general_var_dict); - for (auto it = no_defaults.begin(); it != no_defaults.end(); ++it) { - if (general_var_dict.find(*it) == general_var_dict.end()) { + for (auto &no_default : no_defaults) { + if (general_var_dict.find(no_default) == general_var_dict.end()) { error->exit("parse_general_vars", "The following variable is not found in &general input region: ", - (*it).c_str()); + no_default.c_str()); } } - prefix = general_var_dict["PREFIX"]; - mode = general_var_dict["MODE"]; - - file_result = prefix + ".result"; + std::string prefix = general_var_dict["PREFIX"]; + std::string mode = general_var_dict["MODE"]; + std::string file_result = prefix + ".result"; std::transform(mode.begin(), mode.end(), mode.begin(), toupper); - assign_val(nsym, "NSYM", general_var_dict); - fcsinfo = general_var_dict["FCSXML"]; + std::string fcsinfo = general_var_dict["FCSXML"]; assign_val(nkd, "NKD", general_var_dict); split_str_by_space(general_var_dict["KD"], kdname_v); @@ -180,56 +157,54 @@ void Input::parse_general_vars() } } - split_str_by_space(general_var_dict["MASS"], masskd_v); + if (!general_var_dict["MASS"].empty()) { + split_str_by_space(general_var_dict["MASS"], masskd_v); - if (masskd_v.size() != nkd) { - error->exit("parse_general_vars", - "The number of entries for MASS is inconsistent with NKD"); - } else { - memory->allocate(masskd, nkd); - for (i = 0; i < nkd; ++i) { - masskd[i] = my_cast(masskd_v[i]); + if (masskd_v.size() != nkd) { + error->exit("parse_general_vars", + "The number of entries for MASS is inconsistent with NKD"); + } else { + memory->allocate(masskd, nkd); + for (i = 0; i < nkd; ++i) { + masskd[i] = my_cast(masskd_v[i]); + } } } + // Default values - Tmin = 0.0; - Tmax = 1000.0; - dT = 10.0; + double Tmin = 0.0; + double Tmax = 1000.0; + double dT = 10.0; - emin = 0.0; - emax = 1000.0; - delta_e = 10.0; + double emin = 0.0; + double emax = 1000.0; + double delta_e = 10.0; - nonanalytic = 0; - nsym = 0; - tolerance = 1.0e-6; - printsymmetry = false; - sym_time_reversal = false; - use_triplet_symmetry = true; - classical = false; - band_connection = 0; - bornsym = 0; + unsigned int nonanalytic = 0; + int nsym = 0; + double tolerance = 1.0e-6; + bool printsymmetry = false; + bool sym_time_reversal = false; + bool use_triplet_symmetry = true; + bool classical = false; + unsigned int band_connection = 0; + unsigned int bornsym = 0; - prec_ewald = 1.0e-12; + double prec_ewald = 1.0e-12; // if file_result exists in the current directory, // restart mode will be automatically turned on. + bool restart = stat(file_result.c_str(), &st) == 0; - if (stat(file_result.c_str(), &st) == 0) { - restart = true; - } else { - restart = false; - } + int nbands = -1; + std::string borninfo = ""; + std::string fc2info = ""; - nbands = -1; - borninfo = ""; - fc2info = ""; - - ismear = -1; - epsilon = 10.0; - na_sigma = 0.1; + int ismear = -1; + double epsilon = 10.0; + double na_sigma = 0.1; // Assign given values @@ -271,24 +246,25 @@ void Input::parse_general_vars() error->exit("parse_general_vars", "PREC_EWALD should be a small positive value."); } - ewald->is_longrange = 1; + ewald->is_longrange = true; ewald->file_longrange = boost::lexical_cast(general_var_dict["BORNINFO"]); ewald->prec_ewald = prec_ewald; ewald->rate_ab = 6.0 / pi; } else { - ewald->is_longrange = 0; + ewald->is_longrange = false; } if (nonanalytic > 3) { - error->exit("parse_general_vars", "NONANALYTIC-tag can take 0, 1, 2, or 3."); - } - if (nonanalytic == 3) { - if (mode == "SCPH") { - error->exit("parse_general_vars", - "Sorry. NONANALYTIC=3 is not supported for MODE = SCPH."); - } + error->exit("parse_general_vars", + "NONANALYTIC-tag can take 0, 1, 2, or 3."); } + // if (nonanalytic == 3) { + // if (mode == "SCPH") { + // error->exit("parse_general_vars", + // "Sorry. NONANALYTIC=3 is not supported for MODE = SCPH."); + // } + // } // Copy the values to appropriate classes. @@ -306,14 +282,24 @@ void Input::parse_general_vars() system->dT = dT; system->nkd = nkd; - memory->allocate(system->mass_kd, nkd); memory->allocate(system->symbol_kd, nkd); for (i = 0; i < nkd; ++i) { - system->mass_kd[i] = masskd[i]; system->symbol_kd[i] = kdname[i]; } - memory->deallocate(masskd); - memory->deallocate(kdname); + if (kdname) { + memory->deallocate(kdname); + } + + if (!general_var_dict["MASS"].empty()) { + memory->allocate(system->mass_kd, nkd); + for (i = 0; i < nkd; ++i) { + system->mass_kd[i] = masskd[i]; + } + } + if (masskd) { + memory->deallocate(masskd); + } + dos->emax = emax; dos->emin = emin; @@ -327,16 +313,11 @@ void Input::parse_general_vars() dynamical->band_connection = band_connection; integration->epsilon = epsilon; fcs_phonon->file_fcs = fcsinfo; - if (!fc2info.empty()) { - update_fc2 = true; - } else { - update_fc2 = false; - } fcs_phonon->file_fc2 = fc2info; - fcs_phonon->update_fc2 = update_fc2; + fcs_phonon->update_fc2 = !fc2info.empty(); thermodynamics->classical = classical; integration->ismear = ismear; - relaxation->use_triplet_symmetry = use_triplet_symmetry; + anharmonic_core->use_triplet_symmetry = use_triplet_symmetry; general_var_dict.clear(); } @@ -345,22 +326,13 @@ void Input::parse_scph_vars() { // Read input parameters in the &scph-field. - int i; - unsigned int maxiter; - unsigned int ialgo_scph; - double tolerance_scph; - double mixalpha; - bool restart_scph; - bool selenergy_offdiagonal; - bool lower_temp, warm_start; - struct stat st; - std::string file_dymat; - std::string str_tmp; - std::string str_allowed_list = "KMESH_SCPH KMESH_INTERPOLATE MIXALPHA MAXITER RESTART_SCPH IALGO \ - SELF_OFFDIAG TOL_SCPH LOWER_TEMP WARMSTART"; - std::string str_no_defaults = "KMESH_SCPH KMESH_INTERPOLATE"; - std::vector no_defaults; + std::vector input_list{ + "KMESH_SCPH", "KMESH_INTERPOLATE", "MIXALPHA", "MAXITER", + "RESTART_SCPH", "IALGO", "SELF_OFFDIAG", "TOL_SCPH", + "LOWER_TEMP", "WARMSTART" + }; + std::vector no_defaults{"KMESH_SCPH", "KMESH_INTERPOLATE"}; std::vector kmesh_v, kmesh_interpolate_v; std::map scph_var_dict; @@ -370,41 +342,32 @@ void Input::parse_scph_vars() ifs_input.ignore(); } - get_var_dict(str_allowed_list, scph_var_dict); -#if _USE_BOOST - boost::split(no_defaults, str_no_defaults, boost::is_space()); -#else - no_defaults = my_split(str_no_defaults, ' '); -#endif + get_var_dict(input_list, scph_var_dict); - for (auto it = no_defaults.begin(); it != no_defaults.end(); ++it) { - if (scph_var_dict.find(*it) == scph_var_dict.end()) { + for (auto &no_default : no_defaults) { + if (scph_var_dict.find(no_default) == scph_var_dict.end()) { error->exit("parse_general_vars", "The following variable is not found in &scph input region: ", - (*it).c_str()); + no_default.c_str()); } } - file_dymat = this->job_title + ".scph_dymat"; + std::string file_dymat = this->job_title + ".scph_dymat"; // Default values - tolerance_scph = 1.0e-10; - maxiter = 1000; - mixalpha = 0.1; - selenergy_offdiagonal = true; - ialgo_scph = 0; - lower_temp = true; - warm_start = true; + double tolerance_scph = 1.0e-10; + unsigned int maxiter = 1000; + double mixalpha = 0.1; + bool selenergy_offdiagonal = true; + unsigned int ialgo_scph = 0; + bool lower_temp = true; + bool warm_start = true; // if file_dymat exists in the current directory, // restart mode will be automatically turned on for SCPH calculations. - if (stat(file_dymat.c_str(), &st) == 0) { - restart_scph = true; - } else { - restart_scph = false; - } + bool restart_scph = stat(file_dymat.c_str(), &st) == 0; // Assign given values @@ -417,7 +380,7 @@ void Input::parse_scph_vars() assign_val(lower_temp, "LOWER_TEMP", scph_var_dict); assign_val(warm_start, "WARMSTART", scph_var_dict); - str_tmp = scph_var_dict["KMESH_SCPH"]; + std::string str_tmp = scph_var_dict["KMESH_SCPH"]; if (!str_tmp.empty()) { @@ -466,7 +429,7 @@ void Input::parse_scph_vars() // Copy the values to appropriate classes. - for (i = 0; i < 3; ++i) { + for (int i = 0; i < 3; ++i) { scph->kmesh_scph[i] = kmesh_v[i]; scph->kmesh_interpolate[i] = kmesh_interpolate_v[i]; } @@ -491,77 +454,72 @@ void Input::parse_analysis_vars(const bool use_default_values) // Read input parameters in the &analysis field. int i; - std::string str_allowed_list = "PRINTEVEC PRINTXSF PRINTVEL QUARTIC KS_INPUT ATOMPROJ REALPART \ - ISOTOPE ISOFACT FSTATE_W FSTATE_K PRINTMSD PDOS TDOS GRUNEISEN NEWFCS DELTA_A \ - ANIME ANIME_CELLSIZE ANIME_FORMAT SPS PRINTV3 PRINTPR FC2_EWALD KAPPA_SPEC \ - SELF_W"; - - bool fstate_omega, fstate_k; - bool ks_analyze_mode, atom_project_mode, calc_realpart; - bool print_vel, print_evec, print_msd; - bool projected_dos, print_gruneisen, print_newfcs; - bool two_phonon_dos; - bool print_xsf, print_anime; - bool print_V3, participation_ratio; - bool print_fc2_ewald; - bool print_self_consistent_fc2; - bool bubble_omega; - - int quartic_mode; - int include_isotope; - int scattering_phase_space; - int calculate_kappa_spec; + std::vector input_list{ + "PRINTEVEC", "PRINTXSF", "PRINTVEL", "QUARTIC", "KS_INPUT", + "REALPART", "ISOTOPE", "ISOFACT", + "FSTATE_W", "FSTATE_K", "PRINTMSD", "DOS", "PDOS", "TDOS", + "GRUNEISEN", "NEWFCS", "DELTA_A", "ANIME", "ANIME_CELLSIZE", + "ANIME_FORMAT", "SPS", "PRINTV3", "PRINTPR", "FC2_EWALD", + "KAPPA_SPEC", "SELF_W", "UCORR", "SHIFT_UCORR" + }; + +#ifdef _FE_BUBBLE + input_list.push_back("FE_BUBBLE"); +#endif + unsigned int cellsize[3]; - double delta_a; - double *isotope_factor; + double *isotope_factor = nullptr; std::string ks_input, anime_format; std::map analysis_var_dict; std::vector isofact_v, anime_kpoint, anime_cellsize; // Default values - print_xsf = false; - print_anime = false; + bool print_xsf = false; + bool print_anime = false; - print_vel = false; - print_evec = false; - print_msd = false; + bool print_vel = false; + bool print_evec = false; + bool print_msd = false; + bool print_ucorr = false; - projected_dos = false; - two_phonon_dos = false; - scattering_phase_space = 0; - print_gruneisen = false; - print_newfcs = false; - print_V3 = false; - participation_ratio = false; + bool compute_dos = true; + bool projected_dos = false; + bool two_phonon_dos = false; + int scattering_phase_space = 0; + bool print_gruneisen = false; + bool print_newfcs = false; + bool print_V3 = false; + bool participation_ratio = false; - delta_a = 0.001; + double delta_a = 0.001; - quartic_mode = 0; - ks_analyze_mode = false; - atom_project_mode = false; - calc_realpart = false; - include_isotope = 0; - fstate_omega = false; - fstate_k = false; - bubble_omega = false; + int quartic_mode = 0; + bool calc_realpart = false; + int include_isotope = 0; + bool fstate_omega = false; + bool fstate_k = false; + bool bubble_omega = false; - calculate_kappa_spec = 0; + int calculate_kappa_spec = 0; - print_fc2_ewald = false; - print_self_consistent_fc2 = false; + bool print_fc2_ewald = false; + bool print_self_consistent_fc2 = false; + bool calc_FE_bubble = false; // Assign values to variables if (!use_default_values) { - get_var_dict(str_allowed_list, analysis_var_dict); + get_var_dict(input_list, analysis_var_dict); assign_val(print_vel, "PRINTVEL", analysis_var_dict); assign_val(print_evec, "PRINTEVEC", analysis_var_dict); assign_val(print_msd, "PRINTMSD", analysis_var_dict); + assign_val(print_ucorr, "UCORR", analysis_var_dict); + assign_val(compute_dos, "DOS", analysis_var_dict); assign_val(projected_dos, "PDOS", analysis_var_dict); assign_val(two_phonon_dos, "TDOS", analysis_var_dict); assign_val(scattering_phase_space, "SPS", analysis_var_dict); @@ -570,7 +528,6 @@ void Input::parse_analysis_vars(const bool use_default_values) assign_val(delta_a, "DELTA_A", analysis_var_dict); assign_val(quartic_mode, "QUARTIC", analysis_var_dict); - assign_val(atom_project_mode, "ATOMPROJ", analysis_var_dict); assign_val(calc_realpart, "REALPART", analysis_var_dict); assign_val(include_isotope, "ISOTOPE", analysis_var_dict); assign_val(fstate_omega, "FSTATE_W", analysis_var_dict); @@ -583,6 +540,9 @@ void Input::parse_analysis_vars(const bool use_default_values) assign_val(print_V3, "PRINTV3", analysis_var_dict); assign_val(participation_ratio, "PRINTPR", analysis_var_dict); assign_val(print_fc2_ewald, "FC2_EWALD", analysis_var_dict); +#ifdef _FE_BUBBLE + assign_val(calc_FE_bubble, "FE_BUBBLE", analysis_var_dict); +#endif if (analysis_var_dict.find("ANIME") == analysis_var_dict.end()) { print_anime = false; @@ -592,17 +552,21 @@ void Input::parse_analysis_vars(const bool use_default_values) } if (include_isotope) { - split_str_by_space(analysis_var_dict["ISOFACT"], isofact_v); - if (isofact_v.size() != system->nkd) { - error->exit("parse_analysis_vars", - "The number of entries for ISOFACT is inconsistent with NKD"); - } else { - memory->allocate(isotope_factor, system->nkd); - for (i = 0; i < system->nkd; ++i) { - isotope_factor[i] = my_cast(isofact_v[i]); + if (!analysis_var_dict["ISOFACT"].empty()) { + split_str_by_space(analysis_var_dict["ISOFACT"], isofact_v); + + if (isofact_v.size() != system->nkd) { + error->exit("parse_analysis_vars", + "The number of entries for ISOFACT is inconsistent with NKD"); + } else { + memory->allocate(isotope_factor, system->nkd); + for (i = 0; i < system->nkd; ++i) { + isotope_factor[i] = my_cast(isofact_v[i]); + } } } + } if (print_anime) { @@ -646,6 +610,35 @@ void Input::parse_analysis_vars(const bool use_default_values) } } + if (print_ucorr) { + std::string str_shift_ucorr; + std::vector list_shift_ucorr; + assign_val(str_shift_ucorr, "SHIFT_UCORR", analysis_var_dict); + + if (!str_shift_ucorr.empty()) { + int shift_ucorr[3]; + split_str_by_space(str_shift_ucorr, list_shift_ucorr); + if (list_shift_ucorr.size() != 3) { + error->exit("parse_analysis_vars", + "The number of entries for SHIFT_UCORR must be 3."); + } + + for (i = 0; i < 3; ++i) { + try { + shift_ucorr[i] = boost::lexical_cast(list_shift_ucorr[i]); + } + catch (std::exception &e) { + std::cout << e.what() << std::endl; + error->exit("parse_analysis_vars", + "SHIFT_UCORR must be an array of integers."); + } + } + for (i = 0; i < 3; ++i) { + writes->shift_ucorr[i] = shift_ucorr[i]; + } + } + } + // Copy the values to appropriate classes phonon_velocity->print_velocity = print_vel; @@ -653,6 +646,7 @@ void Input::parse_analysis_vars(const bool use_default_values) dynamical->participation_ratio = participation_ratio; writes->print_xsf = print_xsf; writes->print_anime = print_anime; + writes->print_ucorr = print_ucorr; if (print_anime) { for (i = 0; i < 3; ++i) { @@ -664,32 +658,38 @@ void Input::parse_analysis_vars(const bool use_default_values) writes->print_msd = print_msd; + dos->compute_dos = compute_dos; dos->projected_dos = projected_dos; dos->two_phonon_dos = two_phonon_dos; dos->scattering_phase_space = scattering_phase_space; conductivity->calc_kappa_spec = calculate_kappa_spec; - relaxation->quartic_mode = quartic_mode; - relaxation->atom_project_mode = atom_project_mode; - relaxation->calc_realpart = calc_realpart; - relaxation->calc_fstate_omega = fstate_omega; - relaxation->calc_fstate_k = fstate_k; - relaxation->print_V3 = print_V3; - relaxation->spectral_func = bubble_omega; + anharmonic_core->quartic_mode = quartic_mode; + + mode_analysis->ks_input = ks_input; + mode_analysis->calc_realpart = calc_realpart; + mode_analysis->calc_fstate_omega = fstate_omega; + mode_analysis->calc_fstate_k = fstate_k; + mode_analysis->print_V3 = print_V3; + mode_analysis->spectral_func = bubble_omega; isotope->include_isotope = include_isotope; - relaxation->ks_input = ks_input; gruneisen->print_gruneisen = print_gruneisen; gruneisen->print_newfcs = print_newfcs; gruneisen->delta_a = delta_a; + thermodynamics->calc_FE_bubble = calc_FE_bubble; ewald->print_fc2_ewald = print_fc2_ewald; if (include_isotope) { - memory->allocate(isotope->isotope_factor, system->nkd); - for (i = 0; i < system->nkd; ++i) { - isotope->isotope_factor[i] = isotope_factor[i]; + if (!analysis_var_dict["ISOFACT"].empty()) { + memory->allocate(isotope->isotope_factor, system->nkd); + for (i = 0; i < system->nkd; ++i) { + isotope->isotope_factor[i] = isotope_factor[i]; + } } + } + if (isotope_factor) { memory->deallocate(isotope_factor); } @@ -727,7 +727,7 @@ void Input::parse_cell_parameter() line_wo_comment = line.substr(0, pos_first_comment_tag); } - boost::trim_if(line_wo_comment, boost::is_any_of("\t\r\n ")); + trim_if(line_wo_comment, boost::is_any_of("\t\r\n ")); if (line_wo_comment.empty()) continue; if (is_endof_entry(line_wo_comment)) break; @@ -747,7 +747,7 @@ void Input::parse_cell_parameter() line_wo_comment = line.substr(0, pos_first_comment_tag); } - boost::trim_if(line_wo_comment, boost::is_any_of("\t\r\n ")); + trim_if(line_wo_comment, boost::is_any_of("\t\r\n ")); if (line_wo_comment.empty()) continue; if (is_endof_entry(line_wo_comment)) break; @@ -757,15 +757,16 @@ void Input::parse_cell_parameter() } if (line_vec.size() != 4) { - error->exit("parse_cell_parameter", "Too few or too much lines for the &cell field.\n \ + error->exit("parse_cell_parameter", + "Too few or too much lines for the &cell field.\n \ The number of valid lines for the &cell field should be 4."); } for (i = 0; i < 4; ++i) { line = line_vec[i]; - boost::split(line_split, line, - boost::is_any_of("\t "), boost::token_compress_on); + split(line_split, line, + boost::is_any_of("\t "), boost::token_compress_on); if (i == 0) { // Lattice factor a @@ -801,7 +802,7 @@ void Input::parse_kpoints() { // Read the settings in the &kpoint field. - int i, kpmode; + int kpmode; std::string line, line_wo_comment, str_tmp; std::vector kpelem, line_vec; std::string::size_type pos_first_comment_tag; @@ -821,7 +822,7 @@ void Input::parse_kpoints() line_wo_comment = line.substr(0, pos_first_comment_tag); } - boost::trim_if(line_wo_comment, boost::is_any_of("\t\r\n ")); + trim_if(line_wo_comment, boost::is_any_of("\t\r\n ")); if (line_wo_comment.empty()) continue; if (is_endof_entry(line_wo_comment)) break; @@ -841,7 +842,7 @@ void Input::parse_kpoints() line_wo_comment = line.substr(0, pos_first_comment_tag); } - boost::trim_if(line_wo_comment, boost::is_any_of("\t\r\n ")); + trim_if(line_wo_comment, boost::is_any_of("\t\r\n ")); if (line_wo_comment.empty()) continue; if (is_endof_entry(line_wo_comment)) break; @@ -850,9 +851,9 @@ void Input::parse_kpoints() } } - for (i = 0; i < line_vec.size(); ++i) { + for (int i = 0; i < line_vec.size(); ++i) { line = line_vec[i]; - boost::split(kpelem, line, boost::is_any_of("\t "), boost::token_compress_on); + split(kpelem, line, boost::is_any_of("\t "), boost::token_compress_on); if (i == 0) { // kpmode @@ -932,49 +933,39 @@ int Input::locate_tag(std::string key) } return ret; - } else { - - ifs_input.clear(); - ifs_input.seekg(0, std::ios_base::beg); + } + ifs_input.clear(); + ifs_input.seekg(0, std::ios_base::beg); - while (ifs_input >> line) { + while (ifs_input >> line) { #ifdef _USE_BOOST boost::to_lower(line); boost::trim(line); #else - std::transform(line.begin(), line.end(), line.begin(), tolower); - line2 = line; - line = trim(line2); + std::transform(line.begin(), line.end(), line.begin(), tolower); + line2 = line; + line = trim(line2); #endif - if (line == key) { - ret = 1; - break; - } + if (line == key) { + ret = 1; + break; } - return ret; } + return ret; } -void Input::get_var_dict(const std::string keywords, +void Input::get_var_dict(const std::vector &input_list, std::map &var_dict) { std::string line, key, val; std::string line_wo_comment, line_tmp; std::string::size_type pos_first_comment_tag; std::vector str_entry, str_varval; - - std::set keyword_set; -#ifdef _USE_BOOST - boost::split(keyword_set, keywords, boost::is_space()); -#else - std::vector strvec_tmp; - strvec_tmp = my_split(keywords, ' '); - for (auto it = strvec_tmp.begin(); it != strvec_tmp.end(); ++it) { - keyword_set.insert(*it); + + for (const auto &it : input_list) { + keyword_set.insert(it); } - strvec_tmp.clear(); -#endif var_dict.clear(); @@ -1013,12 +1004,12 @@ void Input::get_var_dict(const std::string keywords, #ifdef _USE_BOOST std::string str_tmp = boost::trim_copy(*it); #else - std::string str_tmp = trim((*it)); + std::string str_tmp = trim(*it); #endif if (!str_tmp.empty()) { #ifdef _USE_BOOST boost::split(str_varval, str_tmp, boost::is_any_of("=")); -#else +#else str_varval = my_split(str_tmp, '='); #endif if (str_varval.size() != 2) { @@ -1080,14 +1071,14 @@ void Input::get_var_dict(const std::string keywords, #else str_entry = my_split(line_wo_comment, ';'); #endif - for (auto it = str_entry.begin(); it != str_entry.end(); ++it) { + for (auto &it : str_entry) { // Split the input entry by '=' #ifdef _USE_BOOST std::string str_tmp = boost::trim_copy(*it); #else - std::string str_tmp = trim((*it)); + std::string str_tmp = trim(it); #endif if (!str_tmp.empty()) { #ifdef _USE_BOOST @@ -1137,17 +1128,13 @@ void Input::get_var_dict(const std::string keywords, } -bool Input::is_endof_entry(const std::string str) +bool Input::is_endof_entry(const std::string str) const { - if (str[0] == '/') { - return true; - } else { - return false; - } + return str[0] == '/'; } void Input::split_str_by_space(const std::string str, - std::vector &str_vec) + std::vector &str_vec) const { std::string str_tmp; std::istringstream is(str); @@ -1177,9 +1164,8 @@ void Input::assign_val(T &val, val = boost::lexical_cast(dict[key]); } catch (std::exception &e) { - std::string str_tmp; std::cout << e.what() << std::endl; - str_tmp = "Invalid entry for the " + key + " tag.\n"; + std::string str_tmp = "Invalid entry for the " + key + " tag.\n"; str_tmp += " Please check the input value."; error->exit("assign_val", str_tmp.c_str()); } diff --git a/anphon/parsephon.h b/anphon/parsephon.h index b7cdd77d..1b0a3842 100644 --- a/anphon/parsephon.h +++ b/anphon/parsephon.h @@ -14,7 +14,6 @@ #include #include #include -#include #include #include #include @@ -24,14 +23,15 @@ namespace PHON_NS { - class Input: protected Pointers + class Input : protected Pointers { public: Input(class PHON *); + ~Input(); - void parce_input(int, char **); - template - T_to my_cast(T_from const &); + + void parce_input(int, + char **); std::string job_title; @@ -45,15 +45,25 @@ namespace PHON_NS void parse_scph_vars(); void parse_cell_parameter(); void parse_kpoints(); - void get_var_dict(std::string, std::map &); - void split_str_by_space(const std::string, std::vector &); - bool is_endof_entry(const std::string); + void get_var_dict(const std::vector &, + std::map &); + + void split_str_by_space(const std::string, + std::vector &) const; + + bool is_endof_entry(const std::string) const; + + template + T_to my_cast(T_from const &); + template - void assign_val(T &, const std::string, + void assign_val(T &, + const std::string, std::map); - std::vector my_split(const std::string &str, char delim) + std::vector my_split(const std::string &str, + char delim) { std::istringstream iss(str); std::string str_tmp; diff --git a/anphon/phonon_dos.cpp b/anphon/phonon_dos.cpp index dac68ba0..a4dd6bff 100644 --- a/anphon/phonon_dos.cpp +++ b/anphon/phonon_dos.cpp @@ -18,11 +18,8 @@ or http://opensource.org/licenses/mit-license.php for information. #include "dynamical.h" #include "write_phonons.h" #include "integration.h" -#include #include -#include #include -#include "parsephon.h" #include "symmetry_core.h" #include "thermodynamics.h" @@ -30,29 +27,56 @@ using namespace PHON_NS; Dos::Dos(PHON *phon): Pointers(phon) { + set_default_variables(); } Dos::~Dos() { - if (flag_dos) { + deallocate_variables(); +} + +void Dos::set_default_variables() +{ + flag_dos = false; + compute_dos = true; + projected_dos = false; + two_phonon_dos = false; + scattering_phase_space = 0; + energy_dos = nullptr; + dos_phonon = nullptr; + pdos_phonon = nullptr; + dos2_phonon = nullptr; + sps3_mode = nullptr; + sps3_with_bose = nullptr; + kmap_irreducible = nullptr; +} + +void Dos::deallocate_variables() +{ + if (energy_dos) { memory->deallocate(energy_dos); + } + if (dos_phonon) { memory->deallocate(dos_phonon); - if (projected_dos) { - memory->deallocate(pdos_phonon); - } - if (two_phonon_dos) { - memory->deallocate(dos2_phonon); - } - if (scattering_phase_space == 1) { - memory->deallocate(sps3_mode); - } else if (scattering_phase_space == 2) { - memory->deallocate(sps3_with_bose); - } - + } + if (pdos_phonon) { + memory->deallocate(pdos_phonon); + } + if (dos2_phonon) { + memory->deallocate(dos2_phonon); + } + if (sps3_mode) { + memory->deallocate(sps3_mode); + } + if (sps3_with_bose) { + memory->deallocate(sps3_with_bose); + } + if (kmap_irreducible) { memory->deallocate(kmap_irreducible); } } + void Dos::setup() { // This function must not be called before dynamica->setup_dynamical() @@ -62,6 +86,7 @@ void Dos::setup() MPI_Bcast(&emin, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD); MPI_Bcast(&emax, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD); MPI_Bcast(&delta_e, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD); + MPI_Bcast(&compute_dos, 1, MPI_LOGICAL, 0, MPI_COMM_WORLD); MPI_Bcast(&projected_dos, 1, MPI_LOGICAL, 0, MPI_COMM_WORLD); MPI_Bcast(&two_phonon_dos, 1, MPI_LOGICAL, 0, MPI_COMM_WORLD); MPI_Bcast(&scattering_phase_space, 1, MPI_INT, 0, MPI_COMM_WORLD); @@ -73,34 +98,37 @@ void Dos::setup() } if (flag_dos && delta_e < eps12) - error->exit("dos_setup()", "Too small delta_e"); + error->exit("Dos::setup()", "Too small delta_e"); if (flag_dos) { n_energy = static_cast((emax - emin) / delta_e); memory->allocate(energy_dos, n_energy); - memory->allocate(dos_phonon, n_energy); for (i = 0; i < n_energy; ++i) { energy_dos[i] = emin + delta_e * static_cast(i); } + if (compute_dos) { + memory->allocate(dos_phonon, n_energy); + } + if (projected_dos) { memory->allocate(pdos_phonon, system->natmin, n_energy); } if (two_phonon_dos) { - memory->allocate(dos2_phonon, kpoint->nk_reduced, n_energy, 4); + memory->allocate(dos2_phonon, kpoint->nk_irred, n_energy, 4); } if (scattering_phase_space == 1) { - memory->allocate(sps3_mode, kpoint->nk_reduced, dynamical->neval, 2); + memory->allocate(sps3_mode, kpoint->nk_irred, dynamical->neval, 2); } else if (scattering_phase_space == 2) { double Tmin = system->Tmin; double Tmax = system->Tmax; double dT = system->dT; unsigned int NT = static_cast((Tmax - Tmin) / dT) + 1; - memory->allocate(sps3_with_bose, kpoint->nk_reduced, + memory->allocate(sps3_with_bose, kpoint->nk_irred, dynamical->neval, NT, 2); } @@ -127,22 +155,22 @@ void Dos::setup() void Dos::calc_dos_all() { - unsigned int j, k; unsigned int nk = kpoint->nk; unsigned int neval = dynamical->neval; double **eval; - bool print_w = true; - memory->allocate(eval, neval, nk); - for (j = 0; j < nk; ++j) { - for (k = 0; k < neval; ++k) { + for (unsigned int j = 0; j < nk; ++j) { + for (unsigned int k = 0; k < neval; ++k) { eval[k][j] = writes->in_kayser(dynamical->eval_phonon[j][k]); } } - calc_dos(nk_irreducible, kmap_irreducible, eval, n_energy, energy_dos, - dos_phonon, neval, integration->ismear, kpoint->kpoint_irred_all); + + if (compute_dos) { + calc_dos(nk_irreducible, kmap_irreducible, eval, n_energy, energy_dos, + dos_phonon, neval, integration->ismear, kpoint->kpoint_irred_all); + } if (projected_dos) { calc_atom_projected_dos(nk, eval, n_energy, energy_dos, @@ -173,25 +201,24 @@ void Dos::calc_dos(const unsigned int nk_irreducible, double *ret, const unsigned int neval, const int smearing_method, - std::vector> &kpinfo) + std::vector> &kpinfo) const { - int i, j, k; double *weight; - if (mympi->my_rank == 0) std::cout << " Calculating phonon DOS ..."; +// if (mympi->my_rank == 0) std::cout << " Calculating phonon DOS ..."; #ifdef _OPENMP -#pragma omp parallel private (weight, k) +#pragma omp parallel private (weight) #endif { memory->allocate(weight, nk_irreducible); #ifdef _OPENMP #pragma omp for #endif - for (i = 0; i < n; ++i) { + for (int i = 0; i < n; ++i) { ret[i] = 0.0; - for (k = 0; k < neval; ++k) { + for (int k = 0; k < neval; ++k) { if (smearing_method == -1) { integration->calc_weight_tetrahedron(nk_irreducible, map_k, weight, eval[k], energy[i]); @@ -200,7 +227,7 @@ void Dos::calc_dos(const unsigned int nk_irreducible, eval[k], energy[i], smearing_method); } - for (j = 0; j < nk_irreducible; ++j) { + for (int j = 0; j < nk_irreducible; ++j) { ret[i] += weight[j]; } } @@ -208,7 +235,7 @@ void Dos::calc_dos(const unsigned int nk_irreducible, memory->deallocate(weight); } - if (mympi->my_rank == 0) std::cout << " done." << std::endl; +// if (mympi->my_rank == 0) std::cout << " done." << std::endl; } void Dos::calc_atom_projected_dos(const unsigned int nk, @@ -219,13 +246,11 @@ void Dos::calc_atom_projected_dos(const unsigned int nk, const unsigned int neval, const unsigned int natmin, const int smearing_method, - std::complex ***evec) + std::complex ***evec) const { // Calculate atom projected phonon-DOS int i; - unsigned int j, k; - unsigned int imode, iat, icrd; int *kmap_identity; double *weight; double **proj; @@ -239,20 +264,20 @@ void Dos::calc_atom_projected_dos(const unsigned int nk, for (i = 0; i < nk; ++i) kmap_identity[i] = i; - for (iat = 0; iat < natmin; ++iat) { + for (unsigned int iat = 0; iat < natmin; ++iat) { - for (imode = 0; imode < neval; ++imode) { + for (unsigned int imode = 0; imode < neval; ++imode) { for (i = 0; i < nk; ++i) { proj[imode][i] = 0.0; - for (icrd = 0; icrd < 3; ++icrd) { + for (unsigned int icrd = 0; icrd < 3; ++icrd) { proj[imode][i] += std::norm(evec[i][imode][3 * iat + icrd]); } } } #ifdef _OPENMP -#pragma omp parallel private (weight, k, j) +#pragma omp parallel private (weight) #endif { memory->allocate(weight, nk); @@ -262,7 +287,7 @@ void Dos::calc_atom_projected_dos(const unsigned int nk, for (i = 0; i < n; ++i) { ret[iat][i] = 0.0; - for (k = 0; k < neval; ++k) { + for (unsigned int k = 0; k < neval; ++k) { if (smearing_method == -1) { integration->calc_weight_tetrahedron(nk, kmap_identity, weight, eval[k], energy[i]); @@ -272,7 +297,7 @@ void Dos::calc_atom_projected_dos(const unsigned int nk, smearing_method); } - for (j = 0; j < nk; ++j) { + for (unsigned int j = 0; j < nk; ++j) { ret[iat][i] += proj[k][j] * weight[j]; } } @@ -292,17 +317,15 @@ void Dos::calc_two_phonon_dos(const unsigned int n, double *energy, double ***ret, const int smearing_method, - std::vector> kpinfo) + const std::vector> &kpinfo) const { int i, j; - int is, js, ik, jk; + int jk; int k; - int ib; - int knum; unsigned int nk = kpoint->nk; unsigned int ns = dynamical->neval; - unsigned int nk_reduced = kpoint->nk_reduced; + unsigned int nk_reduced = kpoint->nk_irred; int ns2 = ns * ns; @@ -330,9 +353,9 @@ void Dos::calc_two_phonon_dos(const unsigned int n, for (i = 0; i < nk; ++i) kmap_identity[i] = i; - for (ik = 0; ik < nk_reduced; ++ik) { + for (int ik = 0; ik < nk_reduced; ++ik) { - knum = kpinfo[ik][0].knum; + int knum = kpinfo[ik][0].knum; for (jk = 0; jk < nk; ++jk) { for (i = 0; i < 3; ++i) xk_tmp[i] = kpoint->xk[knum][i] + kpoint->xk[jk][i]; @@ -345,10 +368,10 @@ void Dos::calc_two_phonon_dos(const unsigned int n, } } - for (ib = 0; ib < ns2; ++ib) { + for (int ib = 0; ib < ns2; ++ib) { - is = ib / ns; - js = ib % ns; + int is = ib / ns; + int js = ib % ns; #ifdef _OPENMP #pragma omp parallel for private(loc) #endif @@ -409,26 +432,18 @@ void Dos::calc_two_phonon_dos(const unsigned int n, void Dos::calc_total_scattering_phase_space(double **omega, const int smearing_method, - std::vector> kpinfo, + const std::vector> &kpinfo, double ***ret_mode, - double &ret) + double &ret) const { int i, j; - int is, ik; - int knum; unsigned int nk = kpoint->nk; unsigned int ns = dynamical->neval; int ns2 = ns * ns; - int ib; int *kmap_identity; - double multi; - double omega0; - double sps_tmp1, sps_tmp2; - double sps_sum1, sps_sum2; - if (mympi->my_rank == 0) { std::cout << " SPS = 1 : Calculating three-phonon scattering phase space ... "; } @@ -438,28 +453,28 @@ void Dos::calc_total_scattering_phase_space(double **omega, for (i = 0; i < nk; ++i) kmap_identity[i] = i; ret = 0.0; - sps_sum1 = 0.0; - sps_sum2 = 0.0; + double sps_sum1 = 0.0; + double sps_sum2 = 0.0; - for (ik = 0; ik < kpinfo.size(); ++ik) { + for (int ik = 0; ik < kpinfo.size(); ++ik) { - knum = kpinfo[ik][0].knum; - multi = static_cast(kpinfo[ik].size()) / static_cast(nk); + int knum = kpinfo[ik][0].knum; + double multi = static_cast(kpinfo[ik].size()) / static_cast(nk); - for (is = 0; is < ns; ++is) { + for (int is = 0; is < ns; ++is) { - omega0 = writes->in_kayser(omega[knum][is]); + double omega0 = writes->in_kayser(omega[knum][is]); - sps_tmp1 = 0.0; - sps_tmp2 = 0.0; + double sps_tmp1 = 0.0; + double sps_tmp2 = 0.0; #ifdef _OPENMP #pragma omp parallel -#endif +#endif { double **e_tmp; double *weight; int js, ks; - int jk, loc; + int loc; double xk_tmp[3]; memory->allocate(weight, nk); @@ -467,12 +482,12 @@ void Dos::calc_total_scattering_phase_space(double **omega, #ifdef _OPENMP #pragma omp for private(i, j), reduction(+: sps_tmp1, sps_tmp2) #endif - for (ib = 0; ib < ns2; ++ib) { + for (int ib = 0; ib < ns2; ++ib) { js = ib / ns; ks = ib % ns; - for (jk = 0; jk < nk; ++jk) { + for (int jk = 0; jk < nk; ++jk) { for (i = 0; i < 3; ++i) xk_tmp[i] = kpoint->xk[knum][i] + kpoint->xk[jk][i]; loc = kpoint->get_knum(xk_tmp[0], xk_tmp[1], xk_tmp[2]); @@ -527,44 +542,33 @@ void Dos::calc_total_scattering_phase_space(double **omega, } } -void Dos::calc_dos_scph(double ***eval_anharm, double **dos_scph) +void Dos::calc_dos_from_given_frequency(double **eval_in, + double *dos_out) const { - int i; - unsigned int j, k; - unsigned int iT; - unsigned int nk = kpoint->nk; - unsigned int neval = dynamical->neval; + const auto nk = kpoint->nk; + const auto neval = dynamical->neval; double **eval; - double Tmin = system->Tmin; - double Tmax = system->Tmax; - double dT = system->dT; - unsigned int NT = static_cast((Tmax - Tmin) / dT) + 1; - memory->allocate(eval, neval, nk); - - for (iT = 0; iT < NT; ++iT) { - - std::cout << " T = " << std::setw(5) << Tmin + static_cast(iT) * dT << std::endl; - - for (j = 0; j < nk; ++j) { - for (k = 0; k < neval; ++k) { - eval[k][j] = writes->in_kayser(eval_anharm[iT][j][k]); - } + for (unsigned int j = 0; j < nk; ++j) { + for (unsigned int k = 0; k < neval; ++k) { + eval[k][j] = writes->in_kayser(eval_in[j][k]); } - - calc_dos(nk_irreducible, kmap_irreducible, eval, n_energy, energy_dos, - dos_scph[iT], neval, integration->ismear, kpoint->kpoint_irred_all); } + + calc_dos(nk_irreducible, kmap_irreducible, eval, n_energy, energy_dos, + dos_out, neval, integration->ismear, kpoint->kpoint_irred_all); + + memory->deallocate(eval); } void Dos::calc_scattering_phase_space_with_Bose(double **eval, const int smearing_method, - std::vector> kp_info, - double ****ret) + const std::vector> &kp_info, + double ****ret) const { - unsigned int i, j, k; - unsigned int knum, snum; + unsigned int i, j; + unsigned int knum; double xk_tmp[3]; double **ret_mode; double omega0; @@ -572,12 +576,10 @@ void Dos::calc_scattering_phase_space_with_Bose(double **eval, double Tmax = system->Tmax; double dT = system->dT; double *temperature; - int N; int ik, iT; - unsigned int nk_irred = kpoint->nk_reduced; + unsigned int nk_irred = kpoint->nk_irred; unsigned int nk = kpoint->nk; unsigned int ns = dynamical->neval; - unsigned int k1, k2; unsigned int imode; unsigned int *k2_arr; unsigned int ns2 = ns * ns; @@ -585,17 +587,14 @@ void Dos::calc_scattering_phase_space_with_Bose(double **eval, double omega_max = emax; double omega_min = emin; - unsigned int nks_total, nks_each_thread; - unsigned int nrem; std::vector ks_g, ks_l; - int iks; if (mympi->my_rank == 0) { std::cout << " SPS = 2 : Calculating three-phonon scattering phase space" << std::endl; std::cout << " with the Bose distribution function ..."; } - N = static_cast((Tmax - Tmin) / dT) + 1; + int N = static_cast((Tmax - Tmin) / dT) + 1; memory->allocate(temperature, N); for (i = 0; i < N; ++i) temperature[i] = Tmin + static_cast(i) * dT; @@ -603,7 +602,7 @@ void Dos::calc_scattering_phase_space_with_Bose(double **eval, for (i = 0; i < nk_irred; ++i) { for (j = 0; j < ns; ++j) { - for (k = 0; k < N; ++k) { + for (unsigned int k = 0; k < N; ++k) { ret[i][j][k][0] = 0.0; ret[i][j][k][1] = 0.0; } @@ -612,9 +611,9 @@ void Dos::calc_scattering_phase_space_with_Bose(double **eval, memory->allocate(ret_mode, N, 2); - nks_total = nk_irred * ns; - nks_each_thread = nks_total / mympi->nprocs; - nrem = nks_total - nks_each_thread * mympi->nprocs; + unsigned int nks_total = nk_irred * ns; + unsigned int nks_each_thread = nks_total / mympi->nprocs; + unsigned int nrem = nks_total - nks_each_thread * mympi->nprocs; if (nrem > 0) { memory->allocate(recv_buf, (nks_each_thread + 1) * mympi->nprocs, 2 * N); @@ -638,7 +637,7 @@ void Dos::calc_scattering_phase_space_with_Bose(double **eval, ks_l.clear(); unsigned int count = 0; - for (auto it = ks_g.cbegin(); it != ks_g.cend(); ++it) { + for (auto it = ks_g.begin(); it != ks_g.end(); ++it) { if (count % mympi->nprocs == mympi->my_rank) { ks_l.push_back(*it); } @@ -655,7 +654,7 @@ void Dos::calc_scattering_phase_space_with_Bose(double **eval, for (i = 0; i < nks_tmp; ++i) { - iks = ks_l[i]; + int iks = ks_l[i]; if (iks == -1) { @@ -667,11 +666,11 @@ void Dos::calc_scattering_phase_space_with_Bose(double **eval, } else { knum = kp_info[iks / ns][0].knum; - snum = iks % ns; + unsigned int snum = iks % ns; - for (k1 = 0; k1 < nk; ++k1) { + for (unsigned int k1 = 0; k1 < nk; ++k1) { for (j = 0; j < 3; ++j) xk_tmp[j] = kpoint->xk[knum][j] - kpoint->xk[k1][j]; - k2 = kpoint->get_knum(xk_tmp[0], xk_tmp[1], xk_tmp[2]); + unsigned int k2 = kpoint->get_knum(xk_tmp[0], xk_tmp[1], xk_tmp[2]); k2_arr[k1] = k2; } @@ -720,13 +719,12 @@ void Dos::calc_scattering_phase_space_with_Bose_mode(const unsigned int nk, double *temperature, unsigned int *k_pair, const int smearing_method, - double **ret) + double **ret) const { int ib; unsigned int i, is, js, k1, k2; - unsigned int iT; unsigned int ns2 = ns * ns; - double omega0, omega1, omega2; + double omega1, omega2; double temp; double ret1, ret2; double n1, n2, f1, f2; @@ -742,8 +740,8 @@ void Dos::calc_scattering_phase_space_with_Bose_mode(const unsigned int nk, memory->allocate(kmap_identity, nk); for (i = 0; i < nk; ++i) kmap_identity[i] = i; + double omega0 = writes->in_kayser(omega); - omega0 = writes->in_kayser(omega); #ifdef _OPENMP #pragma omp parallel private(i, is, js, k1, k2, omega1, omega2, energy_tmp, weight) #endif @@ -793,7 +791,7 @@ void Dos::calc_scattering_phase_space_with_Bose_mode(const unsigned int nk, } - for (iT = 0; iT < N; ++iT) { + for (unsigned int iT = 0; iT < N; ++iT) { temp = temperature[iT]; ret1 = 0.0; ret2 = 0.0; diff --git a/anphon/phonon_dos.h b/anphon/phonon_dos.h index 99ebf8af..3b596c06 100644 --- a/anphon/phonon_dos.h +++ b/anphon/phonon_dos.h @@ -17,16 +17,19 @@ namespace PHON_NS { - class Dos: protected Pointers + class Dos : protected Pointers { public: Dos(class PHON *); + ~Dos(); void setup(); + void calc_dos_all(); bool flag_dos; + bool compute_dos; bool projected_dos, two_phonon_dos; int scattering_phase_space; @@ -40,38 +43,62 @@ namespace PHON_NS double ****sps3_with_bose; - void calc_dos_scph(double ***, double **); + void calc_dos_from_given_frequency(double **, + double *) const; private: + void set_default_variables(); + void deallocate_variables(); + unsigned int nk_irreducible; int *kmap_irreducible; std::vector k_irreducible; - void calc_dos(const unsigned int, int *, - double **, const unsigned int, double *, - double *, const unsigned int, const int, - std::vector> &); - - void calc_atom_projected_dos(const unsigned int, double **, - const unsigned int, double *, double **, - const unsigned int, const unsigned int, const int, - std::complex ***); - - void calc_two_phonon_dos(const unsigned int, double *, double ***, const int, - std::vector>); - - void calc_total_scattering_phase_space(double **, const int, - std::vector>, - double ***, double &); - - void calc_scattering_phase_space_with_Bose(double **, const int, - std::vector>, - double ****); - - void calc_scattering_phase_space_with_Bose_mode(const unsigned int, - const unsigned int, - const unsigned int, - const double, double **, double *, - unsigned int *, const int, double **); + void calc_dos(unsigned int, + int *, + double **, + unsigned int, + double *, + double *, + unsigned int, + int, + std::vector> &) const; + + void calc_atom_projected_dos(unsigned int, + double **, + unsigned int, + double *, + double **, + unsigned int, + unsigned int, + int, + std::complex ***) const; + + void calc_two_phonon_dos(unsigned int, + double *, + double ***, + int, + const std::vector> &) const; + + void calc_total_scattering_phase_space(double **, + int, + const std::vector> &, + double ***, + double &) const; + + void calc_scattering_phase_space_with_Bose(double **, + int, + const std::vector> &, + double ****) const; + + void calc_scattering_phase_space_with_Bose_mode(unsigned int, + unsigned int, + unsigned int, + double, + double **, + double *, + unsigned int *, + int, + double **) const; }; } diff --git a/anphon/phonon_velocity.cpp b/anphon/phonon_velocity.cpp index 8ab69eae..29c92561 100644 --- a/anphon/phonon_velocity.cpp +++ b/anphon/phonon_velocity.cpp @@ -9,23 +9,35 @@ or http://opensource.org/licenses/mit-license.php for information. */ #include "mpi_common.h" -#include -#include -#include "fcs_phonon.h" #include "phonon_velocity.h" -#include "kpoint.h" -#include "memory.h" +#include "constants.h" #include "dynamical.h" -#include "system.h" #include "error.h" -#include "write_phonons.h" -#include "constants.h" +#include "fcs_phonon.h" +#include "kpoint.h" #include "mathfunctions.h" +#include "memory.h" +#include "system.h" +#include using namespace PHON_NS; Phonon_velocity::Phonon_velocity(PHON *phon): Pointers(phon) { + set_default_variables(); +} + +Phonon_velocity::~Phonon_velocity() +{ + deallocate_variables(); +} + +void Phonon_velocity::set_default_variables() +{ + print_velocity = false; + phvel = nullptr; + phvel_xyz = nullptr; + memory->allocate(xshift_s, 27, 3); for (int i = 0; i < 3; ++i) xshift_s[0][i] = 0.0; @@ -45,20 +57,20 @@ Phonon_velocity::Phonon_velocity(PHON *phon): Pointers(phon) } } -Phonon_velocity::~Phonon_velocity() +void Phonon_velocity::deallocate_variables() { - if (phon->mode == "PHONONS") { - if (print_velocity) { - memory->deallocate(phvel); - - if (print_velocity_xyz) { - memory->deallocate(phvel_xyz); - } - } + if (phvel) { + memory->deallocate(phvel); + } + if (phvel_xyz) { + memory->deallocate(phvel_xyz); + } + if (xshift_s) { + memory->deallocate(xshift_s); } - memory->deallocate(xshift_s); } + void Phonon_velocity::calc_group_velocity(const int kpmode) { MPI_Bcast(&print_velocity, 1, MPI_LOGICAL, 0, MPI_COMM_WORLD); @@ -87,10 +99,9 @@ void Phonon_velocity::calc_group_velocity(const int kpmode) void Phonon_velocity::calc_phonon_vel_band(double **phvel_out) { unsigned int i; - unsigned int ik, idiff; + unsigned int idiff; unsigned int nk = kpoint->nk; unsigned int n = dynamical->neval; - unsigned int ndiff; double **xk_shift; double *xk_tmp; double **omega_shift, *omega_tmp; @@ -105,7 +116,7 @@ void Phonon_velocity::calc_phonon_vel_band(double **phvel_out) std::cout << " Calculating group velocities of phonon along given k path ... "; } - ndiff = 2; + unsigned int ndiff = 2; memory->allocate(xk_shift, ndiff, 3); memory->allocate(omega_shift, ndiff, n); memory->allocate(omega_tmp, ndiff); @@ -113,7 +124,7 @@ void Phonon_velocity::calc_phonon_vel_band(double **phvel_out) memory->allocate(xk_tmp, 3); - for (ik = 0; ik < nk; ++ik) { + for (unsigned int ik = 0; ik < nk; ++ik) { // Represent the given kpoint in Cartesian coordinate rotvec(xk_tmp, kpoint->xk[ik], system->rlavec_p, 'T'); @@ -167,7 +178,6 @@ void Phonon_velocity::calc_phonon_vel_band(double **phvel_out) void Phonon_velocity::calc_phonon_vel_mesh(double **phvel_out, double ***phvel3_out) { - unsigned int i, j, k; unsigned int nk = kpoint->nk; unsigned int ns = dynamical->neval; double **vel; @@ -178,16 +188,16 @@ void Phonon_velocity::calc_phonon_vel_mesh(double **phvel_out, memory->allocate(vel, ns, 3); - for (i = 0; i < nk; ++i) { + for (unsigned int i = 0; i < nk; ++i) { phonon_vel_k(kpoint->xk[i], vel); // phonon_vel_k2(kpoint->xk[i], // dynamical->eval_phonon[i], // dynamical->evec_phonon[i], // vel); - for (j = 0; j < ns; ++j) { + for (unsigned int j = 0; j < ns; ++j) { rotvec(vel[j], vel[j], system->lavec_p); - for (k = 0; k < 3; ++k) { + for (unsigned int k = 0; k < 3; ++k) { vel[j][k] /= 2.0 * pi; phvel3_out[i][j][k] = vel[j][k]; } @@ -204,21 +214,19 @@ void Phonon_velocity::calc_phonon_vel_mesh(double **phvel_out, } } -void Phonon_velocity::phonon_vel_k(double *xk_in, +void Phonon_velocity::phonon_vel_k(const double *xk_in, double **vel_out) { - unsigned int i, j; + unsigned int j; unsigned int idiff; - unsigned int ndiff; unsigned int n = dynamical->neval; double **xk_shift; std::complex **evec_tmp; double **omega_shift, *omega_tmp; double **kvec_na_tmp; - double norm; double h = 1.0e-4; - ndiff = 2; + unsigned int ndiff = 2; memory->allocate(omega_shift, ndiff, n); memory->allocate(xk_shift, ndiff, 3); @@ -226,7 +234,7 @@ void Phonon_velocity::phonon_vel_k(double *xk_in, memory->allocate(evec_tmp, 1, 1); memory->allocate(kvec_na_tmp, 2, 3); - for (i = 0; i < 3; ++i) { + for (unsigned int i = 0; i < 3; ++i) { for (j = 0; j < 3; ++j) { xk_shift[0][j] = xk_in[j]; @@ -244,7 +252,7 @@ void Phonon_velocity::phonon_vel_k(double *xk_in, rotvec(kvec_na_tmp[0], kvec_na_tmp[0], system->rlavec_p, 'T'); rotvec(kvec_na_tmp[1], kvec_na_tmp[1], system->rlavec_p, 'T'); - norm = std::sqrt(kvec_na_tmp[0][0] * kvec_na_tmp[0][0] + double norm = std::sqrt(kvec_na_tmp[0][0] * kvec_na_tmp[0][0] + kvec_na_tmp[0][1] * kvec_na_tmp[0][1] + kvec_na_tmp[0][2] * kvec_na_tmp[0][2]); @@ -284,7 +292,7 @@ void Phonon_velocity::phonon_vel_k(double *xk_in, double Phonon_velocity::diff(double *f, const unsigned int n, - double h) + double h) const { double df; @@ -297,12 +305,12 @@ double Phonon_velocity::diff(double *f, return df; } -void Phonon_velocity::phonon_vel_k2(double *xk_in, - double *omega_in, +void Phonon_velocity::phonon_vel_k2(const double *xk_in, + const double *omega_in, std::complex **evec_in, double **vel_out) { - unsigned int i, j, k, l, m; + unsigned int i, j, l, m; unsigned int icrd; int nmode = 3 * system->natmin; @@ -316,7 +324,8 @@ void Phonon_velocity::phonon_vel_k2(double *xk_in, if (dynamical->nonanalytic) { - error->exit("phonon_vel_k2", "Sorry. Analytic calculation of \ + error->exit("phonon_vel_k2", + "Sorry. Analytic calculation of \ group velocity is not supported for NONANALYTIC>0."); } @@ -333,15 +342,14 @@ void Phonon_velocity::phonon_vel_k2(double *xk_in, double tol_omega = 1.0e-7; // Approximately equal to 0.01 cm^{-1} std::vector degeneracy_at_k; - double omega_now, omega_prev; degeneracy_at_k.clear(); - omega_prev = omega_in[0]; + double omega_prev = omega_in[0]; int ideg = 1; for (i = 1; i < nmode; ++i) { - omega_now = omega_in[i]; + double omega_now = omega_in[i]; if (std::abs(omega_now - omega_prev) < tol_omega) { ++ideg; @@ -388,7 +396,7 @@ void Phonon_velocity::phonon_vel_k2(double *xk_in, for (icrd = 0; icrd < 3; ++icrd) { for (j = 0; j < ideg; ++j) { - for (k = 0; k < ideg; ++k) { + for (unsigned int k = 0; k < ideg; ++k) { mat_tmp[icrd][j][k] = czero; for (l = 0; l < nmode; ++l) { @@ -464,20 +472,15 @@ void Phonon_velocity::phonon_vel_k2(double *xk_in, } -void Phonon_velocity::calc_derivative_dynmat_k(double *xk_in, - std::vector fc2_in, - std::complex ***ddyn_out) +void Phonon_velocity::calc_derivative_dynmat_k(const double *xk_in, + const std::vector &fc2_in, + std::complex ***ddyn_out) const { int i, j, k; - unsigned int atm1_s, atm2_s; - unsigned int atm1_p, atm2_p; - unsigned int xyz1, xyz2; - unsigned int icell; int nmode = 3 * system->natmin; double vec[3]; - double phase; std::complex im(0.0, 1.0); for (k = 0; k < 3; ++k) { @@ -488,16 +491,16 @@ void Phonon_velocity::calc_derivative_dynmat_k(double *xk_in, } } - for (auto it = fc2_in.cbegin(); it != fc2_in.cend(); ++it) { + for (const auto &it : fc2_in) { - atm1_p = (*it).atm1; - atm2_s = (*it).atm2; - xyz1 = (*it).xyz1; - xyz2 = (*it).xyz2; - icell = (*it).cell_s; + unsigned int atm1_p = it.atm1; + unsigned int atm2_s = it.atm2; + unsigned int xyz1 = it.xyz1; + unsigned int xyz2 = it.xyz2; + unsigned int icell = it.cell_s; - atm1_s = system->map_p2s[atm1_p][0]; - atm2_p = system->map_s2p[atm2_s].atom_num; + unsigned int atm1_s = system->map_p2s[atm1_p][0]; + unsigned int atm2_p = system->map_s2p[atm2_s].atom_num; for (i = 0; i < 3; ++i) { vec[i] = system->xr_s[atm2_s][i] + xshift_s[icell][i] @@ -507,11 +510,12 @@ void Phonon_velocity::calc_derivative_dynmat_k(double *xk_in, rotvec(vec, vec, system->lavec_s); rotvec(vec, vec, system->rlavec_p); - phase = vec[0] * xk_in[0] + vec[1] * xk_in[1] + vec[2] * xk_in[2]; + double phase = vec[0] * xk_in[0] + vec[1] * xk_in[1] + vec[2] * xk_in[2]; for (k = 0; k < 3; ++k) { ddyn_out[k][3 * atm1_p + xyz1][3 * atm2_p + xyz2] - += (*it).fcs_val * std::exp(im * phase) * vec[k] / std::sqrt(system->mass[atm1_s] * system->mass[atm2_s]); + += it.fcs_val * std::exp(im * phase) * vec[k] / std::sqrt( + system->mass[atm1_s] * system->mass[atm2_s]); } } @@ -528,9 +532,8 @@ void Phonon_velocity::calc_derivative_dynmat_k(double *xk_in, void Phonon_velocity::diagonalize_hermite_mat(const int n, std::complex **mat_in, - double *eval_out) + double *eval_out) const { - int i, j, k; std::complex *mat_1D; int LWORK = (2 * n - 1) * 10; int INFO; @@ -544,9 +547,9 @@ void Phonon_velocity::diagonalize_hermite_mat(const int n, memory->allocate(RWORK, 3 * n - 2); memory->allocate(WORK, LWORK); - k = 0; - for (j = 0; j < n; ++j) { - for (i = 0; i < n; ++i) { + int k = 0; + for (int j = 0; j < n; ++j) { + for (int i = 0; i < n; ++i) { mat_1D[k++] = mat_in[i][j]; } } diff --git a/anphon/phonon_velocity.h b/anphon/phonon_velocity.h index bfe45274..77b5a029 100644 --- a/anphon/phonon_velocity.h +++ b/anphon/phonon_velocity.h @@ -11,17 +11,23 @@ #pragma once #include "pointers.h" +#include "fcs_phonon.h" +#include +#include namespace PHON_NS { - class Phonon_velocity: protected Pointers + class Phonon_velocity : protected Pointers { public: Phonon_velocity(class PHON *); + ~Phonon_velocity(); - void calc_group_velocity(const int); - void phonon_vel_k(double *, double **); + void calc_group_velocity(int); + + void phonon_vel_k(const double *, + double **); bool print_velocity; double **phvel; @@ -30,20 +36,32 @@ namespace PHON_NS private: double **xshift_s; - double diff(double *, const unsigned int, double); + + double diff(double *, + unsigned int, + double) const; + + void set_default_variables(); + void deallocate_variables(); void calc_phonon_vel_band(double **); - void calc_phonon_vel_mesh(double **, double ***); - void phonon_vel_k2(double *, - double *, + + void calc_phonon_vel_mesh(double **, + double ***); + + void phonon_vel_k2(const double *, + const double *, std::complex **, double **); - void calc_derivative_dynmat_k(double *, - std::vector, - std::complex ***); - void diagonalize_hermite_mat(const int, + + void calc_derivative_dynmat_k(const double *, + const std::vector &, + std::complex ***) const; + + void diagonalize_hermite_mat(int, std::complex **, - double *); + double *) const; + bool print_velocity_xyz; }; } diff --git a/anphon/phonons.cpp b/anphon/phonons.cpp index 0a9b1fad..d1403f63 100644 --- a/anphon/phonons.cpp +++ b/anphon/phonons.cpp @@ -27,7 +27,8 @@ #include "write_phonons.h" #include "phonon_dos.h" #include "integration.h" -#include "relaxation.h" +#include "anharmonic_core.h" +#include "mode_analysis.h" #include "conductivity.h" #include "isotope.h" #include "selfenergy.h" @@ -41,7 +42,9 @@ using namespace PHON_NS; -PHON::PHON(int narg, char **arg, MPI_Comm comm) +PHON::PHON(int narg, + char **arg, + MPI_Comm comm) { mympi = new MyMPI(this, comm); input = new Input(this); @@ -115,7 +118,8 @@ void PHON::create_pointers() integration = new Integration(this); phonon_velocity = new Phonon_velocity(this); thermodynamics = new Thermodynamics(this); - relaxation = new Relaxation(this); + anharmonic_core = new AnharmonicCore(this); + mode_analysis = new ModeAnalysis(this); selfenergy = new Selfenergy(this); conductivity = new Conductivity(this); writes = new Writes(this); @@ -126,7 +130,7 @@ void PHON::create_pointers() ewald = new Ewald(this); } -void PHON::destroy_pointers() +void PHON::destroy_pointers() const { delete memory; delete timer; @@ -139,7 +143,8 @@ void PHON::destroy_pointers() delete integration; delete phonon_velocity; delete thermodynamics; - delete relaxation; + delete anharmonic_core; + delete mode_analysis; delete selfenergy; delete conductivity; delete writes; @@ -150,7 +155,7 @@ void PHON::destroy_pointers() delete ewald; } -void PHON::setup_base() +void PHON::setup_base() const { system->setup(); symmetry->setup_symmetry(); @@ -160,6 +165,8 @@ void PHON::setup_base() dos->setup(); thermodynamics->setup(); ewald->init(); + anharmonic_core->setup(); + if (mympi->my_rank == 0) { std::cout << " Now, move on to phonon calculations." << std::endl; if (thermodynamics->classical) { @@ -201,6 +208,10 @@ void PHON::execute_phonons() gruneisen->calc_gruneisen(); } + if (thermodynamics->calc_FE_bubble) { + thermodynamics->compute_free_energy_bubble(); + } + if (mympi->my_rank == 0) { writes->print_phonon_energy(); writes->write_phonon_info(); @@ -209,13 +220,6 @@ void PHON::execute_phonons() gruneisen->write_new_fcsxml_all(); } } - - dynamical->finish_dynamical(); - gruneisen->finish_gruneisen(); - - if (dos->flag_dos) { - integration->finish_integration(); - } } void PHON::execute_RTA() @@ -250,12 +254,11 @@ void PHON::execute_RTA() isotope->setup_isotope_scattering(); isotope->calc_isotope_selfenergy_all(); - // relaxation->setup_mode_analysis(); - relaxation->setup_relaxation(); + mode_analysis->setup_mode_analysis(); selfenergy->setup_selfenergy(); - if (relaxation->ks_analyze_mode) { - relaxation->perform_mode_analysis(); + if (mode_analysis->ks_analyze_mode) { + mode_analysis->run_mode_analysis(); } else { writes->setup_result_io(); conductivity->setup_kappa(); @@ -265,17 +268,6 @@ void PHON::execute_RTA() writes->write_kappa(); writes->write_selfenergy_isotope(); } - - if (kpoint->kpoint_mode == 2) { - integration->finish_integration(); - } - - dynamical->finish_dynamical(); - relaxation->finish_relaxation(); - - if (!relaxation->ks_analyze_mode) { - conductivity->finish_kappa(); - } } void PHON::execute_self_consistent_phonon() @@ -290,7 +282,6 @@ void PHON::execute_self_consistent_phonon() } setup_base(); - dos->setup(); dynamical->diagonalize_dynamical_all(); @@ -300,12 +291,4 @@ void PHON::execute_self_consistent_phonon() scph->setup_scph(); scph->exec_scph(); - - if (kpoint->kpoint_mode == 2) { - integration->finish_integration(); - } - - dynamical->finish_dynamical(); - - scph->finish_scph(); } diff --git a/anphon/phonons.h b/anphon/phonons.h index e284a27a..a2801dc9 100644 --- a/anphon/phonons.h +++ b/anphon/phonons.h @@ -23,7 +23,10 @@ namespace PHON_NS class PHON { public: - PHON(int, char **, MPI_Comm); + PHON(int, + char **, + MPI_Comm); + virtual ~PHON(); class Memory *memory; @@ -38,7 +41,8 @@ namespace PHON_NS class Dynamical *dynamical; class Phonon_velocity *phonon_velocity; class Thermodynamics *thermodynamics; - class Relaxation *relaxation; + class AnharmonicCore *anharmonic_core; + class ModeAnalysis *mode_analysis; class Selfenergy *selfenergy; class Conductivity *conductivity; class Writes *writes; @@ -50,7 +54,7 @@ namespace PHON_NS class Ewald *ewald; void create_pointers(); - void destroy_pointers(); + void destroy_pointers() const; std::string mode; bool restart_flag; @@ -58,6 +62,6 @@ namespace PHON_NS void execute_phonons(); void execute_RTA(); void execute_self_consistent_phonon(); - void setup_base(); + void setup_base() const; }; } diff --git a/anphon/pointers.h b/anphon/pointers.h index 6b681003..52c36e48 100644 --- a/anphon/pointers.h +++ b/anphon/pointers.h @@ -30,7 +30,8 @@ namespace PHON_NS dynamical(ptr->dynamical), phonon_velocity(ptr->phonon_velocity), thermodynamics(ptr->thermodynamics), - relaxation(ptr->relaxation), + anharmonic_core(ptr->anharmonic_core), + mode_analysis(ptr->mode_analysis), selfenergy(ptr->selfenergy), conductivity(ptr->conductivity), writes(ptr->writes), @@ -40,13 +41,9 @@ namespace PHON_NS isotope(ptr->isotope), scph(ptr->scph), ewald(ptr->ewald), - timer(ptr->timer) - { - } + timer(ptr->timer) { } - virtual ~Pointers() - { - } + virtual ~Pointers() { } protected: PHON *phon; @@ -61,7 +58,8 @@ namespace PHON_NS Dynamical *&dynamical; Phonon_velocity *&phonon_velocity; Thermodynamics *&thermodynamics; - Relaxation *&relaxation; + AnharmonicCore *&anharmonic_core; + ModeAnalysis *&mode_analysis; Selfenergy *&selfenergy; Conductivity *&conductivity; Writes *&writes; diff --git a/anphon/relaxation.cpp b/anphon/relaxation.cpp deleted file mode 100644 index 43be072d..00000000 --- a/anphon/relaxation.cpp +++ /dev/null @@ -1,3153 +0,0 @@ -/* -relaxation.cpp - -Copyright (c) 2014, 2015, 2016 Terumasa Tadano - -This file is distributed under the terms of the MIT license. -Please see the file 'LICENCE.txt' in the root directory -or http://opensource.org/licenses/mit-license.php for information. -*/ - -#include "mpi_common.h" -#include -#include -#include -#include -#include -#include - -#ifdef _OPENMP -#include -#endif - -#include "conductivity.h" -#include "dynamical.h" -#include "error.h" -#include "fcs_phonon.h" -#include "integration.h" -#include "kpoint.h" -#include "memory.h" -#include "parsephon.h" -#include "phonon_dos.h" -#include "thermodynamics.h" -#include "relaxation.h" -#include "selfenergy.h" -#include "symmetry_core.h" -#include "system.h" -#include "write_phonons.h" -#include "constants.h" -#include "mathfunctions.h" -#include "timer.h" - -using namespace PHON_NS; - -Relaxation::Relaxation(PHON *phon) : Pointers(phon) -{ - im = std::complex(0.0, 1.0); -} - -Relaxation::~Relaxation() -{ -}; - -void Relaxation::setup_relaxation() -{ - nk = kpoint->nk; - ns = dynamical->neval; - nks = ns * nk; - int nk_tmp[3]; - - if (mympi->my_rank == 0) { - std::cout << std::endl; - std::cout << " -----------------------------------------------------------------" << std::endl << std::endl; - std::cout << " Now, move on to phonon lifetime calculations." << std::endl; - } - - setup_mode_analysis(); - setup_cubic(); - sym_permutation = true; - - if (ks_analyze_mode) { - - if (kpoint->kpoint_mode == 2 && use_triplet_symmetry) { - use_triplet_symmetry = false; - if (mympi->my_rank == 0) { - std::cout << std::endl; - std::cout << " TRISYM was automatically set to 0." << std::endl; - std::cout << std::endl; - } - } - - if (calc_fstate_omega) sym_permutation = false; - - if (quartic_mode > 0) { - - // This is for quartic vertexes. - - if (mympi->my_rank == 0) { - std::cout << " QUARTIC = 1 : Frequency shift due to the loop diagram associated with" << std::endl; - std::cout << " quartic anharmonicity will be calculated." << std::endl; - std::cout << " Please check the accuracy of the quartic IFCs " << std::endl; - std::cout << " before doing serious calculations." << std::endl; - std::cout << std::endl; - } - - setup_quartic(); - } - - if (calc_realpart && integration->ismear != 0) { - error->exit("setup_relaxation", - "Sorry. REALPART = 1 can be used only with ISMEAR = 0"); - } - - if (spectral_func && integration->ismear != -1) { - error->exit("setup_relaxation", - "Sorry. SELF_W = 1 can be used only with the tetrahedron method (ISMEAR = -1)."); - } - - dynamical->modify_eigenvectors(); - } - - if (calc_fstate_k) { - use_tuned_ver = false; - } else { - use_tuned_ver = true; - nk_tmp[0] = kpoint->nkx; - nk_tmp[1] = kpoint->nky; - nk_tmp[2] = kpoint->nkz; - store_exponential_for_acceleration(nk_tmp, nk_represent, - exp_phase, exp_phase3); - } - - if (phon->mode == "RTA") { - detect_imaginary_branches(dynamical->eval_phonon); - } -} - -void Relaxation::finish_relaxation() -{ - memory->deallocate(vec_for_v3); - memory->deallocate(invmass_for_v3); - memory->deallocate(evec_index); - memory->deallocate(fcs_group); - memory->deallocate(is_imaginary); - - if (use_tuned_ver) { - if (tune_type == 0) { - memory->deallocate(exp_phase); - } else if (tune_type == 1) { - memory->deallocate(exp_phase3); - } - } - - if (ks_analyze_mode && (quartic_mode > 0)) { - memory->deallocate(vec_for_v4); - memory->deallocate(invmass_for_v4); - memory->deallocate(evec_index4); - memory->deallocate(fcs_group2); - } -} - -void Relaxation::detect_imaginary_branches(double **eval) -{ - int ik, is, i, j; - nk = kpoint->nk; - ns = dynamical->neval; - nks = ns * nk; - int knum; - double omega; - bool is_anyof_imaginary; - int ndup; - - memory->allocate(is_imaginary, kpoint->nk_reduced, ns); - - is_anyof_imaginary = false; - - for (ik = 0; ik < kpoint->nk_reduced; ++ik) { - for (is = 0; is < ns; ++is) { - knum = kpoint->kpoint_irred_all[ik][0].knum; - omega = eval[knum][is]; - - if (omega < 0.0) { - is_imaginary[ik][is] = true; - is_anyof_imaginary = true; - } else { - is_imaginary[ik][is] = false; - } - } - } - if (mympi->my_rank == 0) { - - if (is_anyof_imaginary) { - int count = 0; - std::cout << std::endl; - std::cout << " WARNING: Imaginary frequency detected at the following branches:" << std::endl; - for (ik = 0; ik < kpoint->nk_reduced; ++ik) { - for (is = 0; is < ns; ++is) { - if (is_imaginary[ik][is]) { - ndup = kpoint->kpoint_irred_all[ik].size(); - count += ndup; - for (i = 0; i < ndup; ++i) { - knum = kpoint->kpoint_irred_all[ik][i].knum; - omega = eval[knum][is]; - for (j = 0; j < 3; ++j) { - std::cout << std::setw(15) << kpoint->xk[knum][j]; - } - std::cout << std::setw(4) << is + 1 << " :" - << std::setw(10) << std::fixed - << writes->in_kayser(omega) << " (cm^-1)" << std::endl; - std::cout << std::scientific; - } - } - } - } - std::cout << std::setw(5) << count << " imaginary branches out of " - << std::setw(5) << nks << " total branches." << std::endl; - std::cout << std::endl; - std::cout << " Phonon-phonon scattering rate and thermal conductivity involving these" << std::endl; - std::cout << " imaginary branches will be treated as zero in the following calculations." << std::endl; - std::cout << " If imaginary branches are acoustic phonons at Gamma point (0, 0, 0), " << std::endl; - std::cout << " you can safely ignore this message." << std::endl << std::endl << std::flush; - } - } -} - -void Relaxation::prepare_relative_vector(std::vector fcs_in, - const unsigned int N, - double ***vec_out) -{ - int i, j, k; - int ix, iy, iz; - - double vec[3]; - double **xshift_s; - - unsigned int icell; - - std::vector atm_super, atm_prim; - std::vector xyz; - std::vector cells; - - double mat_convert[3][3]; - - for (i = 0; i < 3; ++i) { - for (j = 0; j < 3; ++j) { - mat_convert[i][j] = 0.0; - for (k = 0; k < 3; ++k) { - mat_convert[i][j] += system->rlavec_p[i][k] * system->lavec_s_anharm[k][j]; - } - } - } - - memory->allocate(xshift_s, 27, 3); - - for (i = 0; i < 3; ++i) xshift_s[0][i] = 0.0; - - icell = 0; - - for (ix = -1; ix <= 1; ++ix) { - for (iy = -1; iy <= 1; ++iy) { - for (iz = -1; iz <= 1; ++iz) { - if (ix == 0 && iy == 0 && iz == 0) continue; - - ++icell; - - xshift_s[icell][0] = static_cast(ix); - xshift_s[icell][1] = static_cast(iy); - xshift_s[icell][2] = static_cast(iz); - } - } - } - - unsigned int atm_p, atm_s; - unsigned int tran_tmp; - unsigned int icount = 0; - - for (auto it = fcs_in.cbegin(); it != fcs_in.cend(); ++it) { - - atm_super.clear(); - atm_prim.clear(); - xyz.clear(); - cells.clear(); - - for (i = 0; i < (*it).pairs.size(); ++i) { - atm_p = (*it).pairs[i].index / 3; - tran_tmp = (*it).pairs[i].tran; - atm_s = system->map_p2s_anharm[atm_p][tran_tmp]; - - atm_prim.push_back(atm_p); - atm_super.push_back(atm_s); - cells.push_back((*it).pairs[i].cell_s); - } - - - for (i = 0; i < N - 1; ++i) { - - for (j = 0; j < 3; ++j) { - vec[j] = system->xr_s_anharm[atm_super[i + 1]][j] + xshift_s[cells[i + 1]][j] - - system->xr_s_anharm[system->map_p2s_anharm[atm_prim[i + 1]][0]][j]; - } - - rotvec(vec, vec, mat_convert); - - for (j = 0; j < 3; ++j) { - // vec_out[j][i][icount] = vec[j]; - vec_out[icount][i][j] = vec[j]; - } - } - ++icount; - } - memory->deallocate(xshift_s); -} - -void Relaxation::prepare_group_of_force_constants(std::vector fcs_in, - const unsigned int N, - int &number_of_groups, - std::vector *&fcs_group_out) -{ - // Find the number of groups which has different evecs. - - unsigned int i; - std::vector arr_old, arr_tmp; - - number_of_groups = 0; - - arr_old.clear(); - for (i = 0; i < N; ++i) { - arr_old.push_back(-1); - } - - for (auto it = fcs_in.cbegin(); it != fcs_in.cend(); ++it) { - - arr_tmp.clear(); - - for (i = 0; i < (*it).pairs.size(); ++i) { - arr_tmp.push_back((*it).pairs[i].index); - } - - if (arr_tmp != arr_old) { - ++number_of_groups; - arr_old.clear(); - arr_old.reserve(arr_tmp.size()); - std::copy(arr_tmp.begin(), arr_tmp.end(), std::back_inserter(arr_old)); - } - } - - memory->allocate(fcs_group_out, number_of_groups); - - int igroup = -1; - - arr_old.clear(); - for (i = 0; i < N; ++i) { - arr_old.push_back(-1); - } - - for (auto it = fcs_in.cbegin(); it != fcs_in.cend(); ++it) { - - arr_tmp.clear(); - - for (i = 0; i < (*it).pairs.size(); ++i) { - arr_tmp.push_back((*it).pairs[i].index); - } - - if (arr_tmp != arr_old) { - ++igroup; - arr_old.clear(); - arr_old.reserve(arr_tmp.size()); - std::copy(arr_tmp.begin(), arr_tmp.end(), std::back_inserter(arr_old)); - } - - fcs_group_out[igroup].push_back((*it).fcs_val); - } -} - -void Relaxation::setup_mode_analysis() -{ - // Judge if ks_analyze_mode should be turned on or not. - - unsigned int i; - - if (mympi->my_rank == 0) { - if (!ks_input.empty()) { - std::cout << std::endl; - std::cout << " KS_INPUT-tag is given : Analysis on the specified phonon modes" << std::endl; - std::cout << " will be performed instead of thermal conductivity calculation." << std::endl; - std::cout << std::endl; - - std::ifstream ifs_ks; - ifs_ks.open(ks_input.c_str(), std::ios::in); - if (!ifs_ks) - error->exit("setup_mode_analysis", - "Cannot open file KS_INPUT"); - - unsigned int nlist; - double ktmp[3]; - unsigned int snum_tmp; - int knum_tmp; - - ifs_ks >> nlist; - - if (nlist <= 0) - error->exit("setup_mode_analysis", - "First line in KS_INPUT files should be a positive integer."); - - if (calc_fstate_k) { - kslist_fstate_k.clear(); - - for (i = 0; i < nlist; ++i) { - - ifs_ks >> ktmp[0] >> ktmp[1] >> ktmp[2] >> snum_tmp; - - if (snum_tmp <= 0 || snum_tmp > dynamical->neval) { - error->exit("setup_mode_analysis", - "Mode index out of range."); - } - - kslist_fstate_k.push_back(KsListMode(ktmp, snum_tmp - 1)); - } - std::cout << " The number of entries = " - << kslist_fstate_k.size() << std::endl; - - } else { - kslist.clear(); - for (i = 0; i < nlist; ++i) { - - ifs_ks >> ktmp[0] >> ktmp[1] >> ktmp[2] >> snum_tmp; - knum_tmp = kpoint->get_knum(ktmp[0], ktmp[1], ktmp[2]); - - if (knum_tmp == -1) - error->exit("setup_mode_analysis", - "Given kpoint does not exist in given k-point grid."); - if (snum_tmp <= 0 || snum_tmp > dynamical->neval) { - error->exit("setup_mode_analysis", "Mode index out of range."); - } - kslist.push_back(knum_tmp * dynamical->neval + snum_tmp - 1); - } - std::cout << " The number of entries = " << kslist.size() << std::endl; - } - - ks_analyze_mode = true; - ifs_ks.close(); - - } else { - - ks_analyze_mode = false; - - } - } - MPI_Bcast(&ks_analyze_mode, 1, MPI_LOGICAL, 0, MPI_COMM_WORLD); - MPI_Bcast(&calc_realpart, 1, MPI_LOGICAL, 0, MPI_COMM_WORLD); - MPI_Bcast(&atom_project_mode, 1, MPI_LOGICAL, 0, MPI_COMM_WORLD); - MPI_Bcast(&calc_fstate_k, 1, MPI_LOGICAL, 0, MPI_COMM_WORLD); - MPI_Bcast(&calc_fstate_omega, 1, MPI_LOGICAL, 0, MPI_COMM_WORLD); - - unsigned int *kslist_arr; - unsigned int nlist; - double **vec_tmp; - unsigned int *mode_tmp; - - if (kpoint->kpoint_mode == 3) { - int j; - - // Broadcast kslist_fstate_k - - nlist = kslist_fstate_k.size(); - MPI_Bcast(&nlist, 1, MPI_UNSIGNED, 0, MPI_COMM_WORLD); - - memory->allocate(vec_tmp, nlist, 3); - memory->allocate(mode_tmp, nlist); - - if (mympi->my_rank == 0) { - for (i = 0; i < nlist; ++i) { - for (j = 0; j < 3; ++j) { - vec_tmp[i][j] = kslist_fstate_k[i].xk[j]; - } - mode_tmp[i] = kslist_fstate_k[i].nmode; - } - } - - MPI_Bcast(&vec_tmp[0][0], 3 * nlist, MPI_DOUBLE, 0, MPI_COMM_WORLD); - MPI_Bcast(&mode_tmp[0], nlist, MPI_INT, 0, MPI_COMM_WORLD); - - if (mympi->my_rank > 0) { - kslist_fstate_k.clear(); - - for (i = 0; i < nlist; ++i) { - kslist_fstate_k.push_back(KsListMode(vec_tmp[i], mode_tmp[i])); - } - } - - memory->deallocate(vec_tmp); - memory->deallocate(mode_tmp); - - } else { - nlist = kslist.size(); - - // Broadcast kslist - - MPI_Bcast(&nlist, 1, MPI_UNSIGNED, 0, MPI_COMM_WORLD); - memory->allocate(kslist_arr, nlist); - - if (mympi->my_rank == 0) { - for (i = 0; i < nlist; ++i) kslist_arr[i] = kslist[i]; - } - MPI_Bcast(&kslist_arr[0], nlist, MPI_UNSIGNED, 0, MPI_COMM_WORLD); - - if (mympi->my_rank > 0) { - kslist.clear(); - for (i = 0; i < nlist; ++i) kslist.push_back(kslist_arr[i]); - } - memory->deallocate(kslist_arr); - } -} - -std::complex Relaxation::V3(const unsigned int ks[3]) -{ - unsigned int i, j, ielem; - unsigned int kn[3], sn[3]; - unsigned int nsize_group; - - double phase, omega[3]; - double phase3[3]; - - std::complex ret = std::complex(0.0, 0.0); - std::complex ret_in, vec_tmp; - - int iloc, loc[3]; - int ii; - double inv2pi = 1.0 / (2.0 * pi); - double dnk_represent = static_cast(nk_represent); - - dnk_represent *= inv2pi; - - for (i = 0; i < 3; ++i) { - kn[i] = ks[i] / ns; - sn[i] = ks[i] % ns; - omega[i] = dynamical->eval_phonon[kn[i]][sn[i]]; - } - // Return zero if any of the involving phonon has imaginary frequency - if (omega[0] < 0.0 || omega[1] < 0.0 || omega[2] < 0.0) return 0.0; - - ielem = 0; - - if (use_tuned_ver) { - if (tune_type == 0) { - - // Tuned version used when nk1=nk2=nk3. - for (i = 0; i < ngroup; ++i) { - - vec_tmp - = dynamical->evec_phonon[kn[0]][sn[0]][evec_index[i][0]] - * dynamical->evec_phonon[kn[1]][sn[1]][evec_index[i][1]] - * dynamical->evec_phonon[kn[2]][sn[2]][evec_index[i][2]] - * invmass_for_v3[i]; - - ret_in = std::complex(0.0, 0.0); - - nsize_group = fcs_group[i].size(); - - for (j = 0; j < nsize_group; ++j) { - - phase - = vec_for_v3[ielem][0][0] * kpoint->xk[kn[1]][0] - + vec_for_v3[ielem][0][1] * kpoint->xk[kn[1]][1] - + vec_for_v3[ielem][0][2] * kpoint->xk[kn[1]][2] - + vec_for_v3[ielem][1][0] * kpoint->xk[kn[2]][0] - + vec_for_v3[ielem][1][1] * kpoint->xk[kn[2]][1] - + vec_for_v3[ielem][1][2] * kpoint->xk[kn[2]][2]; - - iloc = nint(phase * dnk_represent) % nk_represent + nk_represent - 1; - ret_in += fcs_group[i][j] * exp_phase[iloc]; - - ++ielem; - } - ret += ret_in * vec_tmp; - } - } else if (tune_type == 1) { - - // Tuned version used when nk1=nk2=nk3 is not met. - for (i = 0; i < ngroup; ++i) { - - vec_tmp - = dynamical->evec_phonon[kn[0]][sn[0]][evec_index[i][0]] - * dynamical->evec_phonon[kn[1]][sn[1]][evec_index[i][1]] - * dynamical->evec_phonon[kn[2]][sn[2]][evec_index[i][2]] - * invmass_for_v3[i]; - - ret_in = std::complex(0.0, 0.0); - - nsize_group = fcs_group[i].size(); - - for (j = 0; j < nsize_group; ++j) { - - for (ii = 0; ii < 3; ++ii) { - phase3[ii] - = vec_for_v3[ielem][0][ii] * kpoint->xk[kn[1]][ii] - + vec_for_v3[ielem][1][ii] * kpoint->xk[kn[2]][ii]; - - loc[ii] = nint(phase3[ii] * dnk[ii] * inv2pi) % nk_grid[ii] + nk_grid[ii] - 1; - } - - ret_in += fcs_group[i][j] * exp_phase3[loc[0]][loc[1]][loc[2]]; - - ++ielem; - } - ret += ret_in * vec_tmp; - } - } - - } else { - // Original version - for (i = 0; i < ngroup; ++i) { - - vec_tmp - = dynamical->evec_phonon[kn[0]][sn[0]][evec_index[i][0]] - * dynamical->evec_phonon[kn[1]][sn[1]][evec_index[i][1]] - * dynamical->evec_phonon[kn[2]][sn[2]][evec_index[i][2]] - * invmass_for_v3[i]; - - ret_in = std::complex(0.0, 0.0); - - nsize_group = fcs_group[i].size(); - - for (j = 0; j < nsize_group; ++j) { - - phase - = vec_for_v3[ielem][0][0] * kpoint->xk[kn[1]][0] - + vec_for_v3[ielem][0][1] * kpoint->xk[kn[1]][1] - + vec_for_v3[ielem][0][2] * kpoint->xk[kn[1]][2] - + vec_for_v3[ielem][1][0] * kpoint->xk[kn[2]][0] - + vec_for_v3[ielem][1][1] * kpoint->xk[kn[2]][1] - + vec_for_v3[ielem][1][2] * kpoint->xk[kn[2]][2]; - - ret_in += fcs_group[i][j] * std::exp(im * phase); - - ++ielem; - } - ret += ret_in * vec_tmp; - } - } - - return ret / std::sqrt(omega[0] * omega[1] * omega[2]); -} - - -std::complex Relaxation::V4(const unsigned int ks[4]) -{ - int ii; - unsigned int i, j, ielem; - unsigned int kn[4], sn[4]; - - double phase, phase3[3]; - double omega[4]; - - std::complex ctmp, ret_in, vec_tmp; - std::complex ret = std::complex(0.0, 0.0); - - int iloc, loc[3]; - double inv2pi = 1.0 / (2.0 * pi); - double dnk_represent = static_cast(nk_represent); - - dnk_represent *= inv2pi; - - for (i = 0; i < 4; ++i) { - kn[i] = ks[i] / ns; - sn[i] = ks[i] % ns; - omega[i] = dynamical->eval_phonon[kn[i]][sn[i]]; - } - - ielem = 0; - - if (use_tuned_ver) { - if (tune_type == 0) { - for (i = 0; i < ngroup2; ++i) { - - vec_tmp - = dynamical->evec_phonon[kn[0]][sn[0]][evec_index4[i][0]] - * dynamical->evec_phonon[kn[1]][sn[1]][evec_index4[i][1]] - * dynamical->evec_phonon[kn[2]][sn[2]][evec_index4[i][2]] - * dynamical->evec_phonon[kn[3]][sn[3]][evec_index4[i][3]] - * invmass_for_v4[i]; - - ret_in = std::complex(0.0, 0.0); - - for (j = 0; j < fcs_group2[i].size(); ++j) { - phase - = vec_for_v4[ielem][0][0] * kpoint->xk[kn[1]][0] - + vec_for_v4[ielem][0][1] * kpoint->xk[kn[1]][1] - + vec_for_v4[ielem][0][2] * kpoint->xk[kn[1]][2] - + vec_for_v4[ielem][1][0] * kpoint->xk[kn[2]][0] - + vec_for_v4[ielem][1][1] * kpoint->xk[kn[2]][1] - + vec_for_v4[ielem][1][2] * kpoint->xk[kn[2]][2] - + vec_for_v4[ielem][2][0] * kpoint->xk[kn[3]][0] - + vec_for_v4[ielem][2][1] * kpoint->xk[kn[3]][1] - + vec_for_v4[ielem][2][2] * kpoint->xk[kn[3]][2]; - - iloc = nint(phase * dnk_represent) % nk_represent + nk_represent - 1; - - ctmp = fcs_group2[i][j] * exp_phase[iloc]; - ret_in += ctmp; - - ++ielem; - } - ret += ret_in * vec_tmp; - } - } else if (tune_type == 1) { - for (i = 0; i < ngroup2; ++i) { - - vec_tmp - = dynamical->evec_phonon[kn[0]][sn[0]][evec_index4[i][0]] - * dynamical->evec_phonon[kn[1]][sn[1]][evec_index4[i][1]] - * dynamical->evec_phonon[kn[2]][sn[2]][evec_index4[i][2]] - * dynamical->evec_phonon[kn[3]][sn[3]][evec_index4[i][3]] - * invmass_for_v4[i]; - - ret_in = std::complex(0.0, 0.0); - - for (j = 0; j < fcs_group2[i].size(); ++j) { - - for (ii = 0; ii < 3; ++ii) { - phase3[ii] - = vec_for_v4[ielem][0][ii] * kpoint->xk[kn[1]][ii] - + vec_for_v4[ielem][1][ii] * kpoint->xk[kn[2]][ii] - + vec_for_v4[ielem][2][ii] * kpoint->xk[kn[3]][ii]; - - loc[ii] = nint(phase3[ii] * dnk[ii] * inv2pi) % nk_grid[ii] + nk_grid[ii] - 1; - } - - ctmp = fcs_group2[i][j] * exp_phase3[loc[0]][loc[1]][loc[2]]; - ret_in += ctmp; - - ++ielem; - } - ret += ret_in * vec_tmp; - } - } - - } else { - for (i = 0; i < ngroup2; ++i) { - - vec_tmp - = dynamical->evec_phonon[kn[0]][sn[0]][evec_index4[i][0]] - * dynamical->evec_phonon[kn[1]][sn[1]][evec_index4[i][1]] - * dynamical->evec_phonon[kn[2]][sn[2]][evec_index4[i][2]] - * dynamical->evec_phonon[kn[3]][sn[3]][evec_index4[i][3]] - * invmass_for_v4[i]; - - ret_in = std::complex(0.0, 0.0); - - for (j = 0; j < fcs_group2[i].size(); ++j) { - phase - = vec_for_v4[ielem][0][0] * kpoint->xk[kn[1]][0] - + vec_for_v4[ielem][0][1] * kpoint->xk[kn[1]][1] - + vec_for_v4[ielem][0][2] * kpoint->xk[kn[1]][2] - + vec_for_v4[ielem][1][0] * kpoint->xk[kn[2]][0] - + vec_for_v4[ielem][1][1] * kpoint->xk[kn[2]][1] - + vec_for_v4[ielem][1][2] * kpoint->xk[kn[2]][2] - + vec_for_v4[ielem][2][0] * kpoint->xk[kn[3]][0] - + vec_for_v4[ielem][2][1] * kpoint->xk[kn[3]][1] - + vec_for_v4[ielem][2][2] * kpoint->xk[kn[3]][2]; - - ctmp = fcs_group2[i][j] * std::exp(im * phase); - ret_in += ctmp; - - ++ielem; - } - ret += ret_in * vec_tmp; - } - } - - - return ret / std::sqrt(omega[0] * omega[1] * omega[2] * omega[3]); -} - - -std::complex Relaxation::V3_mode(int mode, - double *xk2, - double *xk3, - int is, - int js, - double **eval, - std::complex ***evec) -{ - int i, j; - int ielem; - int nsize_group; - - double phase; - std::complex ctmp = std::complex(0.0, 0.0); - std::complex vec_tmp, ret_in; - - // Return zero if any of the involving phonon has imaginary frequency - if (eval[0][mode] < 0.0 || eval[1][is] < 0.0 || eval[2][js] < 0.0) return 0.0; - - ielem = 0; - - for (i = 0; i < ngroup; ++i) { - - vec_tmp - = evec[0][mode][evec_index[i][0]] - * evec[1][is][evec_index[i][1]] - * evec[2][js][evec_index[i][2]] - * invmass_for_v3[i]; - - ret_in = std::complex(0.0, 0.0); - - nsize_group = fcs_group[i].size(); - - for (j = 0; j < nsize_group; ++j) { - - phase - = vec_for_v3[ielem][0][0] * xk2[0] - + vec_for_v3[ielem][0][1] * xk2[1] - + vec_for_v3[ielem][0][2] * xk2[2] - + vec_for_v3[ielem][1][0] * xk3[0] - + vec_for_v3[ielem][1][1] * xk3[1] - + vec_for_v3[ielem][1][2] * xk3[2]; - - ret_in += fcs_group[i][j] * std::exp(im * phase); - - ++ielem; - } - ctmp += ret_in * vec_tmp; - } - - return ctmp / std::sqrt(eval[0][mode] * eval[1][is] * eval[2][js]); -} - - -void Relaxation::calc_damping_smearing(const unsigned int N, - double *T, - const double omega, - const unsigned int ik_in, - const unsigned int snum, - double *ret) -{ - // This function returns the imaginary part of phonon self-energy - // for the given frequency omega. - // Lorentzian or Gaussian smearing will be used. - // This version employs the crystal symmetry to reduce the computational cost - - unsigned int i; - int ik; - unsigned int is, js; - unsigned int arr[3]; - - int k1, k2; - int npair_uniq; - - double T_tmp; - double n1, n2; - double omega_inner[2]; - - int knum, knum_minus; - double multi; - - for (i = 0; i < N; ++i) ret[i] = 0.0; - - double **v3_arr; - double ***delta_arr; - double ret_tmp; - - double f1, f2; - - double epsilon = integration->epsilon; - - std::vector triplet; - - get_unique_triplet_k(ik_in, - use_triplet_symmetry, - sym_permutation, - triplet); - - npair_uniq = triplet.size(); - - memory->allocate(v3_arr, npair_uniq, ns * ns); - memory->allocate(delta_arr, npair_uniq, ns * ns, 2); - - knum = kpoint->kpoint_irred_all[ik_in][0].knum; - knum_minus = kpoint->knum_minus[knum]; -#ifdef _OPENMP -#pragma omp parallel for private(multi, arr, k1, k2, is, js, omega_inner) -#endif - for (ik = 0; ik < npair_uniq; ++ik) { - multi = static_cast(triplet[ik].group.size()); - - arr[0] = ns * knum_minus + snum; - - k1 = triplet[ik].group[0].ks[0]; - k2 = triplet[ik].group[0].ks[1]; - - for (is = 0; is < ns; ++is) { - arr[1] = ns * k1 + is; - omega_inner[0] = dynamical->eval_phonon[k1][is]; - - for (js = 0; js < ns; ++js) { - arr[2] = ns * k2 + js; - omega_inner[1] = dynamical->eval_phonon[k2][js]; - - v3_arr[ik][ns * is + js] = std::norm(V3(arr)) * multi; - - if (integration->ismear == 0) { - delta_arr[ik][ns * is + js][0] - = delta_lorentz(omega - omega_inner[0] - omega_inner[1], epsilon) - - delta_lorentz(omega + omega_inner[0] + omega_inner[1], epsilon); - delta_arr[ik][ns * is + js][1] - = delta_lorentz(omega - omega_inner[0] + omega_inner[1], epsilon) - - delta_lorentz(omega + omega_inner[0] - omega_inner[1], epsilon); - } else if (integration->ismear == 1) { - delta_arr[ik][ns * is + js][0] - = delta_gauss(omega - omega_inner[0] - omega_inner[1], epsilon) - - delta_gauss(omega + omega_inner[0] + omega_inner[1], epsilon); - delta_arr[ik][ns * is + js][1] - = delta_gauss(omega - omega_inner[0] + omega_inner[1], epsilon) - - delta_gauss(omega + omega_inner[0] - omega_inner[1], epsilon); - } - } - } - } - - for (i = 0; i < N; ++i) { - T_tmp = T[i]; - ret_tmp = 0.0; -#ifdef _OPENMP -#pragma omp parallel for private(k1, k2, is, js, omega_inner, n1, n2, f1, f2), reduction(+:ret_tmp) -#endif - for (ik = 0; ik < npair_uniq; ++ik) { - - k1 = triplet[ik].group[0].ks[0]; - k2 = triplet[ik].group[0].ks[1]; - - for (is = 0; is < ns; ++is) { - - omega_inner[0] = dynamical->eval_phonon[k1][is]; - - for (js = 0; js < ns; ++js) { - - omega_inner[1] = dynamical->eval_phonon[k2][js]; - - if (thermodynamics->classical) { - f1 = thermodynamics->fC(omega_inner[0], T_tmp); - f2 = thermodynamics->fC(omega_inner[1], T_tmp); - - n1 = f1 + f2; - n2 = f1 - f2; - } else { - f1 = thermodynamics->fB(omega_inner[0], T_tmp); - f2 = thermodynamics->fB(omega_inner[1], T_tmp); - - n1 = f1 + f2 + 1.0; - n2 = f1 - f2; - } - - ret_tmp += v3_arr[ik][ns * is + js] - * (n1 * delta_arr[ik][ns * is + js][0] - - n2 * delta_arr[ik][ns * is + js][1]); - } - } - } - ret[i] = ret_tmp; - } - - memory->deallocate(v3_arr); - memory->deallocate(delta_arr); - triplet.clear(); - - for (i = 0; i < N; ++i) ret[i] *= pi * std::pow(0.5, 4) / static_cast(nk); -} - -void Relaxation::calc_damping_tetrahedron(const unsigned int N, - double *T, - const double omega, - const unsigned int ik_in, - const unsigned int snum, - double *ret) -{ - // This function returns the imaginary part of phonon self-energy - // for the given frequency omega. - // Tetrahedron method will be used. - // This version employs the crystal symmetry to reduce the computational cost - - int ik, ib; - int ns2 = ns * ns; - - unsigned int i; - unsigned int jk; - unsigned int is, js; - unsigned int k1, k2; - unsigned int arr[3]; - unsigned int npair_uniq; - - int knum, knum_minus; - - double T_tmp; - double n1, n2; - double f1, f2; - - double xk_tmp[3]; - double omega_inner[2]; - - double ret_tmp; - - int *kmap_identity; - double **energy_tmp; - double **weight_tetra; - double **v3_arr; - double ***delta_arr; - - std::vector triplet; - - for (i = 0; i < N; ++i) ret[i] = 0.0; - - get_unique_triplet_k(ik_in, - use_triplet_symmetry, - sym_permutation, - triplet); - - npair_uniq = triplet.size(); - - memory->allocate(v3_arr, npair_uniq, ns2); - memory->allocate(delta_arr, npair_uniq, ns2, 2); - - knum = kpoint->kpoint_irred_all[ik_in][0].knum; - knum_minus = kpoint->knum_minus[knum]; - - memory->allocate(kmap_identity, nk); - - for (i = 0; i < nk; ++i) kmap_identity[i] = i; - - -#ifdef _OPENMP -#pragma omp parallel private(is, js, k1, k2, xk_tmp, energy_tmp, i, weight_tetra, ik, jk, arr) -#endif - { - memory->allocate(energy_tmp, 3, nk); - memory->allocate(weight_tetra, 3, nk); - -#ifdef _OPENMP -#pragma omp for -#endif - for (ib = 0; ib < ns2; ++ib) { - is = ib / ns; - js = ib % ns; - - for (k1 = 0; k1 < nk; ++k1) { - - // Prepare two-phonon frequency for the tetrahedron method - - for (i = 0; i < 3; ++i) xk_tmp[i] = kpoint->xk[knum][i] - kpoint->xk[k1][i]; - - k2 = kpoint->get_knum(xk_tmp[0], xk_tmp[1], xk_tmp[2]); - - energy_tmp[0][k1] = dynamical->eval_phonon[k1][is] + dynamical->eval_phonon[k2][js]; - energy_tmp[1][k1] = dynamical->eval_phonon[k1][is] - dynamical->eval_phonon[k2][js]; - energy_tmp[2][k1] = -energy_tmp[1][k1]; - } - - for (i = 0; i < 3; ++i) { - integration->calc_weight_tetrahedron(nk, kmap_identity, - weight_tetra[i], energy_tmp[i], omega); - } - - // Loop for irreducible k points - for (ik = 0; ik < npair_uniq; ++ik) { - - delta_arr[ik][ib][0] = 0.0; - delta_arr[ik][ib][1] = 0.0; - - for (i = 0; i < triplet[ik].group.size(); ++i) { - jk = triplet[ik].group[i].ks[0]; - delta_arr[ik][ib][0] += weight_tetra[0][jk]; - delta_arr[ik][ib][1] += weight_tetra[1][jk] - weight_tetra[2][jk]; - } - - // Calculate the matrix element V3 only when the weight is nonzero. - if (delta_arr[ik][ib][0] > 0.0 || std::abs(delta_arr[ik][ib][1]) > 0.0) { - k1 = triplet[ik].group[0].ks[0]; - k2 = triplet[ik].group[0].ks[1]; - - arr[0] = ns * knum_minus + snum; - arr[1] = ns * k1 + is; - arr[2] = ns * k2 + js; - - v3_arr[ik][ib] = std::norm(V3(arr)); - } else { - v3_arr[ik][ib] = 0.0; - } - } - } - - memory->deallocate(energy_tmp); - memory->deallocate(weight_tetra); - } - - for (i = 0; i < N; ++i) { - T_tmp = T[i]; - ret_tmp = 0.0; -#ifdef _OPENMP -#pragma omp parallel for private(k1, k2, is, js, omega_inner, n1, n2, f1, f2), reduction(+:ret_tmp) -#endif - for (ik = 0; ik < npair_uniq; ++ik) { - - k1 = triplet[ik].group[0].ks[0]; - k2 = triplet[ik].group[0].ks[1]; - - for (is = 0; is < ns; ++is) { - - omega_inner[0] = dynamical->eval_phonon[k1][is]; - - for (js = 0; js < ns; ++js) { - - omega_inner[1] = dynamical->eval_phonon[k2][js]; - - if (thermodynamics->classical) { - f1 = thermodynamics->fC(omega_inner[0], T_tmp); - f2 = thermodynamics->fC(omega_inner[1], T_tmp); - - n1 = f1 + f2; - n2 = f1 - f2; - } else { - f1 = thermodynamics->fB(omega_inner[0], T_tmp); - f2 = thermodynamics->fB(omega_inner[1], T_tmp); - - n1 = f1 + f2 + 1.0; - n2 = f1 - f2; - } - - ret_tmp += v3_arr[ik][ns * is + js] - * (n1 * delta_arr[ik][ns * is + js][0] - - n2 * delta_arr[ik][ns * is + js][1]); - } - } - } - ret[i] = ret_tmp; - } - - memory->deallocate(v3_arr); - memory->deallocate(delta_arr); - memory->deallocate(kmap_identity); - - for (i = 0; i < N; ++i) ret[i] *= pi * std::pow(0.5, 4); -} - - -void Relaxation::calc_frequency_resolved_final_state(const unsigned int N, - double *T, - const double omega0, - const unsigned int M, - const double *omega, - const unsigned int ik_in, - const unsigned int snum, - double ***ret) -{ - int i, j, ik; - - double multi; - int knum, knum_minus; - int k1, k2; - int is, js; - unsigned int arr[3]; - double omega_inner[2]; - double v3_tmp; - double T_tmp; - double n1, n2; - double f1, f2; - double prod_tmp[2]; - double ***ret_mpi; - - double epsilon = integration->epsilon; - - std::vector triplet; - - get_unique_triplet_k(ik_in, - use_triplet_symmetry, - sym_permutation, - triplet); - - - memory->allocate(ret_mpi, N, M, 2); - - for (i = 0; i < N; ++i) { - for (j = 0; j < M; ++j) { - ret_mpi[i][j][0] = 0.0; - ret_mpi[i][j][1] = 0.0; - } - } - - for (ik = mympi->my_rank; ik < triplet.size(); ik += mympi->nprocs) { - - multi = static_cast(triplet[ik].group.size()); - knum = kpoint->kpoint_irred_all[ik_in][0].knum; - knum_minus = kpoint->knum_minus[knum]; - - arr[0] = ns * knum_minus + snum; - k1 = triplet[ik].group[0].ks[0]; - k2 = triplet[ik].group[0].ks[1]; - - for (is = 0; is < ns; ++is) { - for (js = 0; js < ns; ++js) { - arr[1] = ns * k1 + is; - arr[2] = ns * k2 + js; - - omega_inner[0] = dynamical->eval_phonon[k1][is]; - omega_inner[1] = dynamical->eval_phonon[k2][js]; - - v3_tmp = std::norm(V3(arr)); - - for (i = 0; i < N; ++i) { - T_tmp = T[i]; - - if (thermodynamics->classical) { - f1 = thermodynamics->fC(omega_inner[0], T_tmp); - f2 = thermodynamics->fC(omega_inner[1], T_tmp); - n1 = f1 + f2; - n2 = f1 - f2; - } else { - f1 = thermodynamics->fB(omega_inner[0], T_tmp); - f2 = thermodynamics->fB(omega_inner[1], T_tmp); - n1 = f1 + f2 + 1.0; - n2 = f1 - f2; - } - - if (integration->ismear == 0) { - prod_tmp[0] = n1 - * (delta_lorentz(omega0 - omega_inner[0] - omega_inner[1], epsilon) - - delta_lorentz(omega0 + omega_inner[0] + omega_inner[1], epsilon)); - prod_tmp[1] = n2 - * (delta_lorentz(omega0 + omega_inner[0] - omega_inner[1], epsilon) - - delta_lorentz(omega0 - omega_inner[0] + omega_inner[1], epsilon)); - - for (j = 0; j < M; ++j) { - ret_mpi[i][j][0] += v3_tmp * multi - * delta_lorentz(omega[j] - omega_inner[0], epsilon) - * prod_tmp[0]; - ret_mpi[i][j][1] += v3_tmp * multi - * delta_lorentz(omega[j] - omega_inner[0], epsilon) - * prod_tmp[1]; - } - } else if (integration->ismear == 1) { - prod_tmp[0] = n1 - * (delta_gauss(omega0 - omega_inner[0] - omega_inner[1], epsilon) - - delta_gauss(omega0 + omega_inner[0] + omega_inner[1], epsilon)); - prod_tmp[1] = n2 - * (delta_gauss(omega0 + omega_inner[0] - omega_inner[1], epsilon) - - delta_gauss(omega0 - omega_inner[0] + omega_inner[1], epsilon)); - - for (j = 0; j < M; ++j) { - ret_mpi[i][j][0] += v3_tmp * multi - * delta_gauss(omega[j] - omega_inner[0], epsilon) - * prod_tmp[0]; - ret_mpi[i][j][1] += v3_tmp * multi - * delta_gauss(omega[j] - omega_inner[0], epsilon) - * prod_tmp[1]; - } - } - - } - } - } - } - for (i = 0; i < N; ++i) { - for (j = 0; j < M; ++j) { - ret_mpi[i][j][0] *= pi * std::pow(0.5, 4) / static_cast(nk); - ret_mpi[i][j][1] *= pi * std::pow(0.5, 4) / static_cast(nk); - } - } - - MPI_Reduce(&ret_mpi[0][0][0], &ret[0][0][0], 2 * N * M, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); - - memory->deallocate(ret_mpi); - triplet.clear(); -} - - -void Relaxation::calc_frequency_resolved_final_state_tetrahedron(const unsigned int N, - double *T, - const double omega0, - const unsigned int M, - const double *omega, - const unsigned int ik_in, - const unsigned int snum, - double ***ret) -{ - int i, j; - int ik, ib; - unsigned int jk; - - double multi; - int knum, knum_minus; - unsigned int is, js; - unsigned int k1, k2; - unsigned int arr[3]; - unsigned int npair_uniq; - - double omega_inner[2]; - double T_tmp; - double n1, n2; - double f1, f2; - double xk_tmp[3]; - double v3_tmp; - - int ns2 = ns * ns; - - int *kmap_identity; - double **energy_tmp; - double **weight_tetra; - double **v3_arr; - double ***delta_arr; - double prod_tmp[2]; - - double epsilon = integration->epsilon; - - std::vector triplet; - - get_unique_triplet_k(ik_in, - use_triplet_symmetry, - sym_permutation, - triplet); - - for (i = 0; i < N; ++i) { - for (j = 0; j < M; ++j) { - ret[i][j][0] = 0.0; - ret[i][j][1] = 0.0; - } - } - - npair_uniq = triplet.size(); - - memory->allocate(v3_arr, npair_uniq, ns2); - memory->allocate(delta_arr, npair_uniq, ns2, 2); - - knum = kpoint->kpoint_irred_all[ik_in][0].knum; - knum_minus = kpoint->knum_minus[knum]; - - memory->allocate(kmap_identity, nk); - - for (i = 0; i < nk; ++i) kmap_identity[i] = i; - - -#ifdef _OPENMP -#pragma omp parallel private(is, js, k1, k2, xk_tmp, energy_tmp, i, weight_tetra, ik, jk, arr) -#endif - { - memory->allocate(energy_tmp, 3, nk); - memory->allocate(weight_tetra, 3, nk); - -#ifdef _OPENMP -#pragma omp for -#endif - for (ib = 0; ib < ns2; ++ib) { - is = ib / ns; - js = ib % ns; - - for (k1 = 0; k1 < nk; ++k1) { - - // Prepare two-phonon frequency for the tetrahedron method - - for (i = 0; i < 3; ++i) xk_tmp[i] = kpoint->xk[knum][i] - kpoint->xk[k1][i]; - - k2 = kpoint->get_knum(xk_tmp[0], xk_tmp[1], xk_tmp[2]); - - energy_tmp[0][k1] = dynamical->eval_phonon[k1][is] + dynamical->eval_phonon[k2][js]; - energy_tmp[1][k1] = dynamical->eval_phonon[k1][is] - dynamical->eval_phonon[k2][js]; - energy_tmp[2][k1] = -energy_tmp[1][k1]; - } - - for (i = 0; i < 3; ++i) { - integration->calc_weight_tetrahedron(nk, - kmap_identity, - weight_tetra[i], - energy_tmp[i], - omega0); - } - - // Loop for irreducible k points - for (ik = 0; ik < npair_uniq; ++ik) { - - delta_arr[ik][ib][0] = 0.0; - delta_arr[ik][ib][1] = 0.0; - - for (i = 0; i < triplet[ik].group.size(); ++i) { - jk = triplet[ik].group[i].ks[0]; - delta_arr[ik][ib][0] += weight_tetra[0][jk]; - delta_arr[ik][ib][1] += weight_tetra[1][jk] - weight_tetra[2][jk]; - } - - // Calculate the matrix element V3 only when the weight is nonzero. - if (delta_arr[ik][ib][0] > 0.0 || std::abs(delta_arr[ik][ib][1]) > 0.0) { - k1 = triplet[ik].group[0].ks[0]; - k2 = triplet[ik].group[0].ks[1]; - - arr[0] = ns * knum_minus + snum; - arr[1] = ns * k1 + is; - arr[2] = ns * k2 + js; - - v3_arr[ik][ib] = std::norm(V3(arr)); - } else { - v3_arr[ik][ib] = 0.0; - } - } - } - - memory->deallocate(energy_tmp); - memory->deallocate(weight_tetra); - } - - - for (ik = 0; ik < npair_uniq; ++ik) { - - for (is = 0; is < ns; ++is) { - for (js = 0; js < ns; ++js) { - - v3_tmp = v3_arr[ik][ns * is + js]; - - if (v3_tmp > eps) { - - k1 = triplet[ik].group[0].ks[0]; - k2 = triplet[ik].group[0].ks[1]; - omega_inner[0] = dynamical->eval_phonon[k1][is]; - omega_inner[1] = dynamical->eval_phonon[k2][js]; - -#ifdef _OPENMP -#pragma omp parallel for private(f1, f2, n1, n2, prod_tmp, j) -#endif - for (i = 0; i < N; ++i) { - - if (thermodynamics->classical) { - f1 = thermodynamics->fC(omega_inner[0], T[i]); - f2 = thermodynamics->fC(omega_inner[1], T[i]); - - n1 = f1 + f2; - n2 = f1 - f2; - } else { - f1 = thermodynamics->fB(omega_inner[0], T[i]); - f2 = thermodynamics->fB(omega_inner[1], T[i]); - - n1 = f1 + f2 + 1.0; - n2 = f1 - f2; - } - - prod_tmp[0] = v3_tmp * n1 * delta_arr[ik][ns * is + js][0]; - prod_tmp[1] = -v3_tmp * n2 * delta_arr[ik][ns * is + js][1]; - - for (j = 0; j < M; ++j) { - ret[i][j][0] += prod_tmp[0] * delta_gauss(omega[j] - omega_inner[0], epsilon); - ret[i][j][1] += prod_tmp[1] * delta_gauss(omega[j] - omega_inner[0], epsilon); - } - } - - } - } - } - } - - for (i = 0; i < N; ++i) { -#ifdef _OPENMP -#pragma omp parallel for -#endif - for (j = 0; j < M; ++j) { - ret[i][j][0] *= pi * std::pow(0.5, 4); - ret[i][j][1] *= pi * std::pow(0.5, 4); - } - } - - memory->deallocate(v3_arr); - memory->deallocate(delta_arr); - memory->deallocate(kmap_identity); - - triplet.clear(); -} - -void Relaxation::perform_mode_analysis() -{ - unsigned int i, j; - unsigned int NT; - unsigned int knum, snum; - - double Tmax = system->Tmax; - double Tmin = system->Tmin; - double dT = system->dT; - double omega; - double *T_arr; - - std::ofstream ofs_linewidth, ofs_shift, ofs_fstate_w; - std::string file_linewidth, file_shift, file_fstate_w; - - - NT = static_cast((Tmax - Tmin) / dT) + 1; - memory->allocate(T_arr, NT); - for (i = 0; i < NT; ++i) T_arr[i] = Tmin + static_cast(i) * dT; - - double epsilon = integration->epsilon; - - if (print_V3) { - - double **v3norm; - std::string file_V3; - std::ofstream ofs_V3; - - int ik_irred, multi; - unsigned int nk_size; - unsigned int ib, is, js, k1, k2; - std::vector triplet; - - for (i = 0; i < kslist.size(); ++i) { - knum = kslist[i] / ns; - snum = kslist[i] % ns; - - omega = dynamical->eval_phonon[knum][snum]; - - if (mympi->my_rank == 0) { - std::cout << std::endl; - std::cout << " Number : " << std::setw(5) << i + 1 << std::endl; - std::cout << " Phonon at k = ("; - for (j = 0; j < 3; ++j) { - std::cout << std::setw(10) << std::fixed << kpoint->xk[knum][j]; - if (j < 2) std::cout << ","; - } - std::cout << ")" << std::endl; - std::cout << " Mode index = " << std::setw(5) << snum + 1 << std::endl; - std::cout << " Frequency (cm^-1) : " - << std::setw(15) << writes->in_kayser(omega) << std::endl; - } - - ik_irred = kpoint->kmap_to_irreducible[knum]; - - get_unique_triplet_k(ik_irred, - use_triplet_symmetry, - sym_permutation, - triplet); - nk_size = triplet.size(); - - memory->allocate(v3norm, nk_size, ns * ns); - - calc_V3norm2(ik_irred, snum, v3norm); - - if (mympi->my_rank == 0) { - - file_V3 = input->job_title + ".V3." + boost::lexical_cast(i + 1); - ofs_V3.open(file_V3.c_str(), std::ios::out); - if (!ofs_V3) - error->exit("perform_mode_analysis", - "Cannot open file file_V3"); - - ofs_V3 << "# xk = "; - - for (j = 0; j < 3; ++j) { - ofs_V3 << std::setw(15) << kpoint->xk[knum][j]; - } - ofs_V3 << std::endl; - ofs_V3 << "# mode = " << snum + 1 << std::endl; - ofs_V3 << "# Frequency = " << writes->in_kayser(omega) << std::endl; - ofs_V3 << "## Matrix elements |V3|^2 for given mode" << std::endl; - ofs_V3 << "## q', j', omega(q'j') (cm^-1), q'', j'', "; - ofs_V3 << "omega(q''j'') (cm^-1), |V3(-qj,q'j',q''j'')|^2 (cm^-2), multiplicity" << std::endl; - - for (j = 0; j < nk_size; ++j) { - multi = static_cast(triplet[j].group.size()); - k1 = triplet[j].group[0].ks[0]; - k2 = triplet[j].group[0].ks[1]; - - ib = 0; - - for (is = 0; is < ns; ++is) { - for (js = 0; js < ns; ++js) { - ofs_V3 << std::setw(5) << k1 + 1 << std::setw(5) << is + 1; - ofs_V3 << std::setw(15) - << writes->in_kayser(dynamical->eval_phonon[k1][is]); - ofs_V3 << std::setw(5) << k2 + 1 << std::setw(5) << js + 1; - ofs_V3 << std::setw(15) - << writes->in_kayser(dynamical->eval_phonon[k2][js]); - ofs_V3 << std::setw(15) << v3norm[j][ib]; - ofs_V3 << std::setw(5) << multi; - ofs_V3 << std::endl; - - ++ib; - } - ofs_V3 << std::endl; - } - } - - ofs_V3.close(); - - } - memory->deallocate(v3norm); - } - - } else if (calc_fstate_k) { - - // Momentum-resolved final state amplitude - print_momentum_resolved_final_state(NT, T_arr, epsilon); - - } else if (calc_fstate_omega) { - - print_frequency_resolved_final_state(NT, T_arr); - - } else if (spectral_func) { - - int ik_irred, iomega, iT; - double **self3_imag, **self3_real; - std::string file_self; - std::ofstream ofs_self; - double *omega_array; - double Omega_min = dos->emin; - double Omega_max = dos->emax; - double delta_omega = dos->delta_e; - double T_now, omega2[2]; - - int nomega = static_cast((Omega_max - Omega_min) / delta_omega) + 1; - - memory->allocate(omega_array, nomega); - memory->allocate(self3_imag, NT, nomega); - memory->allocate(self3_real, NT, nomega); - - for (i = 0; i < nomega; ++i) { - omega_array[i] = Omega_min + delta_omega * static_cast(i); - omega_array[i] *= time_ry / Hz_to_kayser; - } - - for (i = 0; i < relaxation->kslist.size(); ++i) { - knum = relaxation->kslist[i] / ns; - snum = relaxation->kslist[i] % ns; - ik_irred = kpoint->kmap_to_irreducible[knum]; - - if (mympi->my_rank == 0) { - std::cout << std::endl; - std::cout << " SELF_W = 1: Calculate bubble selfenergy with frequency dependency" << std::endl; - std::cout << " for given " << kslist.size() << " modes." << std::endl; - std::cout << std::endl; - std::cout << " Number : " << std::setw(5) << i + 1 << std::endl; - std::cout << " Phonon at k = ("; - for (j = 0; j < 3; ++j) { - std::cout << std::setw(10) << std::fixed << kpoint->xk[knum][j]; - if (j < 2) std::cout << ","; - } - std::cout << ")" << std::endl; - std::cout << " Mode index = " << std::setw(5) << snum + 1 << std::endl; - - file_self = input->job_title + ".Self." + boost::lexical_cast(i + 1); - ofs_self.open(file_self.c_str(), std::ios::out); - if (!ofs_self) error->exit("perform_mode_analysis", "Cannot open file file_shift"); - - ofs_self << "# xk = "; - - for (j = 0; j < 3; ++j) { - ofs_self << std::setw(15) << kpoint->xk[knum][j]; - } - ofs_self << std::endl; - ofs_self << "# mode = " << snum + 1 << std::endl; - ofs_self << "## T[K], Freq (cm^-1), omega (cm^-1), Self.real (cm^-1), Self.imag (cm^-1)"; - ofs_self << std::endl; - } - - for (iT = 0; iT < NT; ++iT) { - T_now = T_arr[iT]; - omega = dynamical->eval_phonon[knum][snum]; - - if (mympi->my_rank == 0) { - std::cout << " Temperature (K) : " << std::setw(15) << T_now << std::endl; - std::cout << " Frequency (cm^-1) : " << std::setw(15) << writes->in_kayser(omega) << std::endl; - } - - calc_self3omega_tetrahedron(T_now, - dynamical->eval_phonon, - dynamical->evec_phonon, - ik_irred, - snum, - nomega, - omega_array, - self3_imag[iT]); - - // Calculate real part of the self-energy by Kramers-Kronig relation - for (iomega = 0; iomega < nomega; ++iomega) { - double self_tmp = 0.0; - omega2[0] = omega_array[iomega] * omega_array[iomega]; - for (int jomega = 0; jomega < nomega; ++jomega) { - if (jomega == iomega) continue; - omega2[1] = omega_array[jomega] * omega_array[jomega]; - self_tmp += omega_array[jomega] * self3_imag[iT][jomega] / (omega2[1] - omega2[0]); - } - self3_real[iT][iomega] = 2.0 * delta_omega * time_ry * self_tmp / (pi * Hz_to_kayser); - } - - if (mympi->my_rank == 0) { - - for (iomega = 0; iomega < nomega; ++iomega) { - ofs_self << std::setw(10) << T_now << std::setw(15) << writes->in_kayser(omega); - ofs_self << std::setw(10) << writes->in_kayser(omega_array[iomega]) - << std::setw(15) << writes->in_kayser(self3_real[iT][iomega]) - << std::setw(15) << writes->in_kayser(self3_imag[iT][iomega]) << std::endl; - } - ofs_self << std::endl; - } - - } - if (mympi->my_rank == 0) ofs_self.close(); - } - - memory->deallocate(omega_array); - memory->deallocate(self3_imag); - memory->deallocate(self3_real); - - } else { - - double *damping_a; - double omega_shift; - std::complex *self_tadpole; - std::complex *self_a, *self_b, *self_c, *self_d, *self_e; - std::complex *self_f, *self_g, *self_h, *self_i, *self_j; - - if (mympi->my_rank == 0) { - std::cout << std::endl; - std::cout << " Calculate the line width (FWHM) of phonons" << std::endl; - std::cout << " due to 3-phonon interactions for given " - << kslist.size() << " modes." << std::endl; - - if (calc_realpart) { - if (quartic_mode == 1) { - std::cout << " REALPART = 1 and " << std::endl; - std::cout << " QUARTIC = 1 : Additionally, frequency shift of phonons due to 3-phonon" << std::endl; - std::cout << " and 4-phonon interactions will be calculated." << std::endl; - } else { - std::cout << " REALPART = 1 : Additionally, frequency shift of phonons due to 3-phonon" << std::endl; - std::cout << " interactions will be calculated." << std::endl; - } - } - - if (quartic_mode == 2) { - std::cout << std::endl; - std::cout << " QUARTIC = 2 : Additionally, phonon line width due to 4-phonon" << std::endl; - std::cout << " interactions will be calculated." << std::endl; - std::cout << " WARNING : This is very very expensive." << std::endl; - } - } - - memory->allocate(damping_a, NT); - memory->allocate(self_a, NT); - memory->allocate(self_b, NT); - memory->allocate(self_tadpole, NT); - - if (quartic_mode == 2) { - memory->allocate(self_c, NT); - memory->allocate(self_d, NT); - memory->allocate(self_e, NT); - memory->allocate(self_f, NT); - memory->allocate(self_g, NT); - memory->allocate(self_h, NT); - memory->allocate(self_i, NT); - memory->allocate(self_j, NT); - } - - for (i = 0; i < kslist.size(); ++i) { - knum = kslist[i] / ns; - snum = kslist[i] % ns; - - omega = dynamical->eval_phonon[knum][snum]; - - if (mympi->my_rank == 0) { - std::cout << std::endl; - std::cout << " Number : " << std::setw(5) << i + 1 << std::endl; - std::cout << " Phonon at k = ("; - for (j = 0; j < 3; ++j) { - std::cout << std::setw(10) << std::fixed << kpoint->xk[knum][j]; - if (j < 2) std::cout << ","; - } - std::cout << ")" << std::endl; - std::cout << " Mode index = " << std::setw(5) << snum + 1 << std::endl; - std::cout << " Frequency (cm^-1) : " - << std::setw(15) << writes->in_kayser(omega) << std::endl; - } - - int ik_irred = kpoint->kmap_to_irreducible[knum]; - - if (integration->ismear == -1) { - calc_damping_tetrahedron(NT, T_arr, omega, ik_irred, snum, damping_a); - } else { - selfenergy->selfenergy_a(NT, T_arr, omega, knum, snum, self_a); - for (j = 0; j < NT; ++j) damping_a[j] = self_a[j].imag(); - } - if (quartic_mode == 2) { - selfenergy->selfenergy_c(NT, T_arr, omega, knum, snum, self_c); - // selfenergy->selfenergy_d(NT, T_arr, omega, knum, snum, self_d); - // selfenergy->selfenergy_e(NT, T_arr, omega, knum, snum, self_e); - // selfenergy->selfenergy_f(NT, T_arr, omega, knum, snum, self_f); - // selfenergy->selfenergy_g(NT, T_arr, omega, knum, snum, self_g); - // selfenergy->selfenergy_h(NT, T_arr, omega, knum, snum, self_h); - // selfenergy->selfenergy_i(NT, T_arr, omega, knum, snum, self_i); - // selfenergy->selfenergy_j(NT, T_arr, omega, knum, snum, self_j); - } - - if (mympi->my_rank == 0) { - file_linewidth = input->job_title + ".Gamma." + boost::lexical_cast(i + 1); - ofs_linewidth.open(file_linewidth.c_str(), std::ios::out); - if (!ofs_linewidth) - error->exit("perform_mode_analysis", - "Cannot open file file_linewidth"); - - ofs_linewidth << "# xk = "; - - for (j = 0; j < 3; ++j) { - ofs_linewidth << std::setw(15) << kpoint->xk[knum][j]; - } - ofs_linewidth << std::endl; - ofs_linewidth << "# mode = " << snum + 1 << std::endl; - ofs_linewidth << "# Frequency = " << writes->in_kayser(omega) << std::endl; - ofs_linewidth << "## Temperature dependence of 2*Gamma (FWHM) for the given mode" << std::endl; - ofs_linewidth << "## T[K], 2*Gamma3 (cm^-1) (bubble)"; - if (quartic_mode == 2) ofs_linewidth << ", 2*Gamma4(cm^-1) <-- specific diagram only"; - ofs_linewidth << std::endl; - - for (j = 0; j < NT; ++j) { - ofs_linewidth << std::setw(10) << T_arr[j] - << std::setw(15) << writes->in_kayser(2.0 * damping_a[j]); - - if (quartic_mode == 2) { - // ofs_mode_tau << std::setw(15) << writes->in_kayser(damp4[j]); - ofs_linewidth << std::setw(15) << writes->in_kayser(2.0 * self_c[j].imag()); - ofs_linewidth << std::setw(15) << writes->in_kayser(2.0 * self_d[j].imag()); - ofs_linewidth << std::setw(15) << writes->in_kayser(2.0 * self_e[j].imag()); - ofs_linewidth << std::setw(15) << writes->in_kayser(2.0 * self_f[j].imag()); - ofs_linewidth << std::setw(15) << writes->in_kayser(2.0 * self_g[j].imag()); - ofs_linewidth << std::setw(15) << writes->in_kayser(2.0 * self_h[j].imag()); - ofs_linewidth << std::setw(15) << writes->in_kayser(2.0 * self_i[j].imag()); - ofs_linewidth << std::setw(15) << writes->in_kayser(2.0 * self_j[j].imag()); - } - - ofs_linewidth << std::endl; - } - ofs_linewidth.close(); - std::cout << " Phonon line-width is printed in " << file_linewidth << std::endl; - } - - - if (calc_realpart) { - - selfenergy->selfenergy_tadpole(NT, T_arr, omega, knum, snum, self_tadpole); - // selfenergy->selfenergy_a(NT, T_arr, omega, knum, snum, self_a); - - if (quartic_mode == 1) { - selfenergy->selfenergy_b(NT, T_arr, omega, knum, snum, self_b); - } - - if (mympi->my_rank == 0) { - - file_shift = input->job_title + ".Shift." + boost::lexical_cast(i + 1); - ofs_shift.open(file_shift.c_str(), std::ios::out); - if (!ofs_shift) - error->exit("perform_mode_analysis", - "Cannot open file file_shift"); - - ofs_shift << "# xk = "; - - for (j = 0; j < 3; ++j) { - ofs_shift << std::setw(15) << kpoint->xk[knum][j]; - } - ofs_shift << std::endl; - ofs_shift << "# mode = " << snum + 1 << std::endl; - ofs_shift << "# Frequency = " << writes->in_kayser(omega) << std::endl; - ofs_shift << "## T[K], Shift3 (cm^-1) (tadpole), Shift3 (cm^-1) (bubble)"; - if (quartic_mode == 1) ofs_shift << ", Shift4 (cm^-1) (loop)"; - ofs_shift << ", Shifted frequency (cm^-1)"; - ofs_shift << std::endl; - - - for (j = 0; j < NT; ++j) { - ofs_shift << std::setw(10) << T_arr[j]; - ofs_shift << std::setw(15) << writes->in_kayser(-self_tadpole[j].real()); - ofs_shift << std::setw(15) << writes->in_kayser(-self_a[j].real()); - - omega_shift = omega - self_tadpole[j].real() - self_a[j].real(); - - if (quartic_mode == 1) { - ofs_shift << std::setw(15) << writes->in_kayser(-self_b[j].real()); - omega_shift -= self_b[j].real(); - } - ofs_shift << std::setw(15) << writes->in_kayser(omega_shift); - ofs_shift << std::endl; - - } - - ofs_shift.close(); - std::cout << " Phonon frequency shift is printed in " << file_shift << std::endl; - } - } - } - - memory->deallocate(damping_a); - memory->deallocate(self_a); - memory->deallocate(self_b); - memory->deallocate(self_tadpole); - - if (quartic_mode == 2) { - memory->deallocate(self_c); - memory->deallocate(self_d); - memory->deallocate(self_e); - memory->deallocate(self_f); - memory->deallocate(self_g); - memory->deallocate(self_h); - memory->deallocate(self_i); - memory->deallocate(self_j); - } - - } - memory->deallocate(T_arr); -} - -void Relaxation::print_frequency_resolved_final_state(const unsigned int NT, - double *T_arr) -{ - int i, j; - unsigned int knum, snum; - double omega, omega0; - double ***gamma_final; - double *freq_array; - int ienergy; - std::ofstream ofs_omega; - std::string file_omega; - - memory->allocate(gamma_final, NT, dos->n_energy, 2); - memory->allocate(freq_array, dos->n_energy); - - for (i = 0; i < dos->n_energy; ++i) { - freq_array[i] = dos->energy_dos[i] * time_ry / Hz_to_kayser; - } - - if (mympi->my_rank == 0) { - - std::cout << std::endl; - std::cout << " FSTATE_W = 1 : Calculate the frequency-resolved final state amplitude" << std::endl; - std::cout << " due to 3-phonon interactions." << std::endl; - } - - for (i = 0; i < kslist.size(); ++i) { - knum = kslist[i] / ns; - snum = kslist[i] % ns; - - omega0 = dynamical->eval_phonon[knum][snum]; - - if (mympi->my_rank == 0) { - std::cout << std::endl; - std::cout << " Number : " << std::setw(5) << i + 1 << std::endl; - std::cout << " Phonon at k = ("; - for (j = 0; j < 3; ++j) { - std::cout << std::setw(10) << std::fixed << kpoint->xk[knum][j]; - if (j < 2) std::cout << ","; - } - std::cout << ")" << std::endl; - std::cout << " Mode index = " << std::setw(5) << snum + 1 << std::endl; - std::cout << " Frequency (cm^-1) : " << std::setw(15) - << writes->in_kayser(omega0) << std::endl; - } - - if (integration->ismear == -1) { - calc_frequency_resolved_final_state_tetrahedron(NT, - T_arr, - omega0, - dos->n_energy, - freq_array, - kpoint->kmap_to_irreducible[knum], - snum, - gamma_final); - } else { - calc_frequency_resolved_final_state(NT, - T_arr, - omega0, - dos->n_energy, - freq_array, - kpoint->kmap_to_irreducible[knum], - snum, - gamma_final); - } - - - if (mympi->my_rank == 0) { - - file_omega = input->job_title + ".fw." + boost::lexical_cast(i + 1); - ofs_omega.open(file_omega.c_str(), std::ios::out); - if (!ofs_omega) - error->exit("print_frequency_resolved_final_state", - "Cannot open file file_omega"); - - ofs_omega << "# xk = "; - - for (j = 0; j < 3; ++j) { - ofs_omega << std::setw(15) << kpoint->xk[knum][j]; - } - ofs_omega << std::endl; - ofs_omega << "# mode = " << snum << std::endl; - ofs_omega << "# Frequency = " << writes->in_kayser(omega0) << std::endl; - - ofs_omega << "## Frequency-resolved final state amplitude for given modes" << std::endl; - ofs_omega << "## Gamma[omega][temperature] (absorption, emission)"; - ofs_omega << std::endl; - - ofs_omega << "## "; - for (j = 0; j < NT; ++j) { - ofs_omega << std::setw(10) << T_arr[j]; - } - ofs_omega << std::endl; - for (ienergy = 0; ienergy < dos->n_energy; ++ienergy) { - omega = dos->energy_dos[ienergy]; - - ofs_omega << std::setw(10) << omega; - for (j = 0; j < NT; ++j) { - ofs_omega << std::setw(15) << gamma_final[j][ienergy][1]; - ofs_omega << std::setw(15) << gamma_final[j][ienergy][0]; - } - - ofs_omega << std::endl; - } - ofs_omega.close(); - std::cout << " Frequency-resolved final state amplitude is printed in " << file_omega << std::endl; - } - } - - memory->deallocate(freq_array); - memory->deallocate(gamma_final); -} - -void Relaxation::print_momentum_resolved_final_state(const unsigned int NT, - double *T_arr, - double epsilon) -{ - int i, j, k, l, m; - int iT; - int is, js; - int nklist; - int mode; - double xk1[3], xk2[3], xk3[3]; - double kvec[3]; - double f1, f2, n1, n2; - double norm, T_tmp; - double V3norm; - double **eval, **eval2; - double **gamma_k; - - std::complex ***evec; - - std::ofstream ofs_mode_tau; - std::string file_mode_tau; - - if (mympi->my_rank == 0) { - std::cout << std::endl; - if (integration->ismear == -1) { - std::cout << " ISMEAR = -1: Tetrahedron method will be used." << std::endl; - std::cout << " Sorry. Currently, ISMEAR = -1 cannot be used with FSTATE_K = 1."; - error->exit("calc_momentum_resolved_final_state", "exit."); - } else if (integration->ismear == 0) { - std::cout << " ISMEAR = 0: Lorentzian broadening with epsilon = " - << std::fixed << std::setprecision(2) << epsilon << " (cm^-1)" << std::endl; - } else if (integration->ismear == 1) { - std::cout << " ISMEAR = 1: Gaussian broadening with epsilon = " - << std::fixed << std::setprecision(2) << epsilon << " (cm^-1)" << std::endl; - } else { - error->exit("setup_relaxation", "Invalid ksum_mode"); - } - - std::cout << std::endl; - std::cout << " FSTATE_K = 1 : Calculate the momentum-resolved final state amplitude" << std::endl; - std::cout << " due to 3-phonon interactions for given " - << kslist_fstate_k.size() << " entries." << std::endl; - std::cout << std::endl; - } - - double **xk_plane, **xk_plane2; - double **kvec_plane; - int nk1_plane, nk2_plane, nk_plane; - double xk_vec1[3], xk_vec2[3]; - double div1, div2; - double *eval_tmp; - double omega_sum[3]; - double frac; - int knum_triangle[3]; - std::vector> ***kplist_conserved; - std::vector ***kplist_for_target_mode; - std::vector xk_vec; - double xk_norm[3], xk_tmp[3]; - double norm1, norm2, dprod, norm_ref; - double theta, theta_ref; - - memory->allocate(kplist_conserved, ns, ns, 2); - memory->allocate(kplist_for_target_mode, ns, ns, kslist_fstate_k.size()); - - theta_ref = 0.0; - - // Loop over k point planes - - for (i = 0; i < kpoint->kp_plane_geometry.size(); ++i) { - - nk1_plane = kpoint->kp_plane_geometry[i].npoints[0]; - nk2_plane = kpoint->kp_plane_geometry[i].npoints[1]; - - div1 = 1.0 / static_cast(nk1_plane - 1); - div2 = 1.0 / static_cast(nk2_plane - 1); - - nk_plane = nk1_plane * nk2_plane; - - for (j = 0; j < 3; ++j) { - xk_vec1[j] = kpoint->kp_plane_geometry[i].xk_edges[0][j] - - kpoint->kp_plane_geometry[i].xk_origin[j]; - xk_vec2[j] = kpoint->kp_plane_geometry[i].xk_edges[1][j] - - kpoint->kp_plane_geometry[i].xk_origin[j]; - } - - - for (j = 0; j < 3; ++j) { - xk_norm[j] = xk_vec1[j]; - } - - rotvec(xk_norm, xk_norm, system->rlavec_p, 'T'); - norm_ref = std::sqrt(xk_norm[0] * xk_norm[0] - + xk_norm[1] * xk_norm[1] - + xk_norm[2] * xk_norm[2]); - - memory->allocate(xk_plane, nk_plane, 3); - memory->allocate(xk_plane2, nk_plane, 3); - memory->allocate(kvec_plane, nk_plane, 3); - memory->allocate(eval, nk_plane, ns); - memory->allocate(eval2, nk_plane, ns); - memory->allocate(eval_tmp, ns); - memory->allocate(evec, 1, 1, 1); - - // Constructing xk's for the plane - m = 0; - for (j = 0; j < nk1_plane; ++j) { - for (k = 0; k < nk2_plane; ++k) { - for (l = 0; l < 3; ++l) { - xk_plane[m][l] = kpoint->kp_plane_geometry[i].xk_origin[l] - + xk_vec1[l] * static_cast(j) * div1 - + xk_vec2[l] * static_cast(k) * div2; - } - ++m; - } - } - - // Get frequencies of each k point - - for (j = 0; j < nk_plane; ++j) { - - for (k = 0; k < 3; ++k) kvec_plane[j][k] = dynamical->fold(xk_plane[j][k]); - rotvec(kvec_plane[j], kvec_plane[j], system->rlavec_p, 'T'); - norm = std::sqrt(kvec_plane[j][0] * kvec_plane[j][0] - + kvec_plane[j][1] * kvec_plane[j][1] - + kvec_plane[j][2] * kvec_plane[j][2]); - - if (norm > eps) { - for (k = 0; k < 3; ++k) kvec_plane[j][k] /= norm; - } - } - - for (j = 0; j < nk_plane; ++j) { - dynamical->eval_k(xk_plane[j], kvec_plane[j], - fcs_phonon->fc2_ext, eval[j], evec[0], false); - for (k = 0; k < ns; ++k) { - eval[j][k] = dynamical->freq(eval[j][k]); - } - } - - // Loop over k points to analyze the final state amplitude - - for (j = 0; j < kslist_fstate_k.size(); ++j) { - - for (k = 0; k < 3; ++k) xk1[k] = -kslist_fstate_k[j].xk[k]; - mode = kslist_fstate_k[j].nmode; - - for (k = 0; k < 3; ++k) kvec[k] = dynamical->fold(xk1[k]); - rotvec(kvec, kvec, system->rlavec_p, 'T'); - norm = std::sqrt(kvec[0] * kvec[0] - + kvec[1] * kvec[1] - + kvec[2] * kvec[2]); - - if (norm > eps) { - for (k = 0; k < 3; ++k) kvec[k] /= norm; - } - - for (k = 0; k < 3; ++k) xk1[k] = dynamical->fold(xk1[k]); - - dynamical->eval_k(xk1, kvec, fcs_phonon->fc2_ext, eval_tmp, evec[0], false); - for (k = 0; k < ns; ++k) eval_tmp[k] = dynamical->freq(eval_tmp[k]); - - // Calculate xk's for the third index that satisfy the momentum conservation - - for (k = 0; k < nk_plane; ++k) { - for (l = 0; l < 3; ++l) { - xk_plane2[k][l] = dynamical->fold(-xk1[l] - xk_plane[k][l]); - } - } - - // Get frequencies of each k point - - for (k = 0; k < nk_plane; ++k) { - for (l = 0; l < 3; ++l) kvec_plane[k][l] = xk_plane2[k][l]; - rotvec(kvec_plane[k], kvec_plane[k], system->rlavec_p, 'T'); - norm = std::sqrt(kvec_plane[k][0] * kvec_plane[k][0] - + kvec_plane[k][1] * kvec_plane[k][1] - + kvec_plane[k][2] * kvec_plane[k][2]); - - if (norm > eps) { - for (l = 0; l < 3; ++l) kvec_plane[k][l] /= norm; - } - } - - for (k = 0; k < nk_plane; ++k) { - dynamical->eval_k(xk_plane2[k], kvec_plane[k], - fcs_phonon->fc2_ext, eval2[k], evec[0], false); - for (l = 0; l < ns; ++l) { - eval2[k][l] = dynamical->freq(eval2[k][l]); - } - } - - // Find a list of k points which satisfy the energy conservation - - for (auto it = kpoint->kp_planes_tri[i].cbegin(); - it != kpoint->kp_planes_tri[i].cend(); ++it) { - - // K point indexes for each triangle - for (k = 0; k < 3; ++k) knum_triangle[k] = (*it).knum[k]; - - for (is = 0; is < ns; ++is) { - for (js = 0; js < ns; ++js) { - - // The case of delta(w1 - w2 - w3) - - for (k = 0; k < 3; ++k) { - omega_sum[k] = eval_tmp[mode] - - eval[knum_triangle[k]][is] - - eval2[knum_triangle[k]][js]; - } - if ((omega_sum[0] > 0.0 && omega_sum[1] > 0.0 && omega_sum[2] > 0.0) || - (omega_sum[0] < 0.0 && omega_sum[1] < 0.0 && omega_sum[2] < 0.0)) - continue; - - if (omega_sum[0] * omega_sum[1] < 0.0) { - xk_vec.clear(); - - frac = -omega_sum[0] / (omega_sum[1] - omega_sum[0]); - - for (k = 0; k < 3; ++k) { - xk_vec.push_back((1.0 - frac) * xk_plane[knum_triangle[0]][k] - + frac * xk_plane[knum_triangle[1]][k]); - } - kplist_conserved[is][js][0].push_back(xk_vec); - } - - if (omega_sum[0] * omega_sum[2] < 0.0) { - xk_vec.clear(); - - frac = -omega_sum[0] / (omega_sum[2] - omega_sum[0]); - - for (k = 0; k < 3; ++k) { - xk_vec.push_back((1.0 - frac) * xk_plane[knum_triangle[0]][k] - + frac * xk_plane[knum_triangle[2]][k]); - } - kplist_conserved[is][js][0].push_back(xk_vec); - } - - if (omega_sum[1] * omega_sum[2] < 0.0) { - xk_vec.clear(); - - frac = -omega_sum[1] / (omega_sum[2] - omega_sum[1]); - - for (k = 0; k < 3; ++k) { - xk_vec.push_back((1.0 - frac) * xk_plane[knum_triangle[1]][k] - + frac * xk_plane[knum_triangle[2]][k]); - } - kplist_conserved[is][js][0].push_back(xk_vec); - } - - // The case of delta(w1 - w2 + w3) - - for (k = 0; k < 3; ++k) { - omega_sum[k] = eval_tmp[mode] - - eval[knum_triangle[k]][is] - + eval2[knum_triangle[k]][js]; - } - if ((omega_sum[0] > 0.0 && omega_sum[1] > 0.0 && omega_sum[2] > 0.0) || - (omega_sum[0] < 0.0 && omega_sum[1] < 0.0 && omega_sum[2] < 0.0)) - continue; - - if (omega_sum[0] * omega_sum[1] < 0.0) { - xk_vec.clear(); - - frac = -omega_sum[0] / (omega_sum[1] - omega_sum[0]); - - for (k = 0; k < 3; ++k) { - xk_vec.push_back((1.0 - frac) * xk_plane[knum_triangle[0]][k] - + frac * xk_plane[knum_triangle[1]][k]); - } - kplist_conserved[is][js][1].push_back(xk_vec); - } - - if (omega_sum[0] * omega_sum[2] < 0.0) { - xk_vec.clear(); - - frac = -omega_sum[0] / (omega_sum[2] - omega_sum[0]); - - for (k = 0; k < 3; ++k) { - xk_vec.push_back((1.0 - frac) * xk_plane[knum_triangle[0]][k] - + frac * xk_plane[knum_triangle[2]][k]); - } - kplist_conserved[is][js][1].push_back(xk_vec); - } - - if (omega_sum[1] * omega_sum[2] < 0.0) { - xk_vec.clear(); - - frac = -omega_sum[1] / (omega_sum[2] - omega_sum[1]); - - for (k = 0; k < 3; ++k) { - xk_vec.push_back((1.0 - frac) * xk_plane[knum_triangle[1]][k] - + frac * xk_plane[knum_triangle[2]][k]); - } - kplist_conserved[is][js][1].push_back(xk_vec); - } - } - } - } - - for (is = 0; is < ns; ++is) { - for (js = 0; js < ns; ++js) { - - for (auto it2 = kplist_conserved[is][js][0].cbegin(); - it2 != kplist_conserved[is][js][0].cend(); ++it2) { - - for (k = 0; k < 3; ++k) { - xk_tmp[k] = (*it2)[k]; - } - rotvec(xk_tmp, xk_tmp, system->rlavec_p, 'T'); - - norm1 = 0.0; - dprod = 0.0; - for (k = 0; k < 3; ++k) { - norm1 += xk_tmp[k] * xk_tmp[k]; - dprod += xk_tmp[k] * xk_norm[k]; - } - theta = std::acos(dprod / (norm_ref * std::sqrt(norm1))); - - kplist_for_target_mode[is][js][j].push_back( - KpointListWithCoordinate(*it2, - std::cos(theta + theta_ref) * std::sqrt(norm1), - std::sin(theta + theta_ref) * std::sqrt(norm1), - i, 0)); - } - - for (auto it2 = kplist_conserved[is][js][1].cbegin(); - it2 != kplist_conserved[is][js][1].cend(); ++it2) { - - for (k = 0; k < 3; ++k) { - xk_tmp[k] = (*it2)[k]; - } - rotvec(xk_tmp, xk_tmp, system->rlavec_p, 'T'); - - norm1 = 0.0; - dprod = 0.0; - for (k = 0; k < 3; ++k) { - norm1 += xk_tmp[k] * xk_tmp[k]; - dprod += xk_tmp[k] * xk_norm[k]; - } - theta = std::acos(dprod / (norm_ref * std::sqrt(norm1))); - - kplist_for_target_mode[is][js][j].push_back( - KpointListWithCoordinate(*it2, - std::cos(theta + theta_ref) * std::sqrt(norm1), - std::sin(theta + theta_ref) * std::sqrt(norm1), - i, 1)); - } - - kplist_conserved[is][js][0].clear(); - kplist_conserved[is][js][1].clear(); - } - } - } - - memory->deallocate(xk_plane); - memory->deallocate(xk_plane2); - memory->deallocate(kvec_plane); - memory->deallocate(eval); - memory->deallocate(eval2); - memory->deallocate(eval_tmp); - memory->deallocate(evec); - - rotvec(xk_vec1, xk_vec1, system->rlavec_p, 'T'); - rotvec(xk_vec2, xk_vec2, system->rlavec_p, 'T'); - - norm1 = 0.0; - norm2 = 0.0; - dprod = 0.0; - for (j = 0; j < 3; ++j) { - norm1 += xk_vec1[j] * xk_vec1[j]; - norm2 += xk_vec2[j] * xk_vec2[j]; - dprod += xk_vec1[j] * xk_vec2[j]; - } - theta = std::acos(dprod / std::sqrt(norm1 * norm2)); - - theta_ref += theta; - } - - memory->deallocate(kplist_conserved); - - - std::vector> **final_state_xy; - std::vector triplet_xyG; - std::vector small_group_k; - double pos_x, pos_y; - int selection_type; - - int isym; - - - double srot[3][3]; - double xk_sym[3]; - double srot_inv[3][3], srot_inv_t[3][3]; - double ***symop_k; - double diff; - - memory->allocate(symop_k, symmetry->nsym, 3, 3); - memory->allocate(final_state_xy, kslist_fstate_k.size(), NT); - - memory->allocate(eval, 3, ns); - memory->allocate(evec, 3, ns, ns); - - for (i = 0; i < kslist_fstate_k.size(); ++i) { - - for (j = 0; j < 3; ++j) xk1[j] = -kslist_fstate_k[i].xk[j]; - mode = kslist_fstate_k[i].nmode; - - for (j = 0; j < 3; ++j) kvec[j] = dynamical->fold(xk1[j]); - rotvec(kvec, kvec, system->rlavec_p, 'T'); - norm = std::sqrt(kvec[0] * kvec[0] + kvec[1] * kvec[1] + kvec[2] * kvec[2]); - - if (norm > eps) for (j = 0; j < 3; ++j) kvec[j] /= norm; - for (j = 0; j < 3; ++j) xk1[j] = dynamical->fold(xk1[j]); - - dynamical->eval_k(xk1, kvec, fcs_phonon->fc2_ext, eval[0], evec[0], true); - for (j = 0; j < ns; ++j) eval[0][j] = dynamical->freq(eval[0][j]); - - small_group_k.clear(); - - for (isym = 0; isym < symmetry->nsym; ++isym) { - for (j = 0; j < 3; ++j) { - for (k = 0; k < 3; ++k) { - srot[j][k] = static_cast(symmetry->SymmList[isym].rot[j][k]); - } - } - - invmat3(srot_inv, srot); - transpose3(srot_inv_t, srot_inv); - - for (j = 0; j < 3; ++j) { - for (k = 0; k < 3; ++k) { - symop_k[isym][j][k] = srot_inv_t[j][k]; - } - } - - rotvec(xk_sym, xk1, symop_k[isym]); - - for (j = 0; j < 3; ++j) xk_sym[j] = xk_sym[j] - nint(xk_sym[j]); - - diff = 0.0; - for (j = 0; j < 3; ++j) diff += std::pow(xk_sym[j] - xk1[j], 2); - - if (std::sqrt(diff) < eps8) { - small_group_k.push_back(isym); - } - - } - - if (mympi->my_rank == 0) { - std::cout << " Number : " << std::setw(5) << i + 1 << std::endl; - std::cout << " Phonon at k = ("; - for (j = 0; j < 3; ++j) { - std::cout << std::setw(10) << std::fixed << kslist_fstate_k[i].xk[j]; - if (j < 2) std::cout << ","; - } - std::cout << ")" << std::endl; - std::cout << " Mode index = " << std::setw(5) << mode + 1 << std::endl; - std::cout << " Frequency (cm^-1) : " << std::setw(15) - << writes->in_kayser(eval[0][mode]) << std::endl; - - int count_kp = 0; - - for (is = 0; is < ns; ++is) { - for (js = 0; js < ns; ++js) { - count_kp += kplist_for_target_mode[is][js][i].size(); - } - } - std::cout << " Number of k points satisfying the selection rule : " - << count_kp << std::endl; - std::cout << " Number of symmetry operations at k point : " - << small_group_k.size() << std::endl << std::endl; - } - - for (is = 0; is < ns; ++is) { - for (js = 0; js < ns; ++js) { - - nklist = kplist_for_target_mode[is][js][i].size(); - - if (nklist == 0) continue; - - memory->allocate(gamma_k, nklist, NT); - - for (k = 0; k < nklist; ++k) { - for (l = 0; l < NT; ++l) { - gamma_k[k][l] = 0.0; - } - } - - for (k = 0; k < nklist; ++k) { - - for (l = 0; l < 3; ++l) - xk2[l] = dynamical->fold(kplist_for_target_mode[is][js][i][k].xk[l]); - - for (isym = 0; isym < small_group_k.size(); ++isym) { - - rotvec(xk_sym, xk2, symop_k[small_group_k[isym]]); - - for (l = 0; l < 3; ++l) xk3[l] = dynamical->fold(-xk1[l] - xk_sym[l]); - - for (l = 0; l < 3; ++l) kvec[l] = xk_sym[l]; - rotvec(kvec, kvec, system->rlavec_p, 'T'); - norm = std::sqrt(kvec[0] * kvec[0] + kvec[1] * kvec[1] + kvec[2] * kvec[2]); - - if (norm > eps) for (l = 0; l < 3; ++l) kvec[l] /= norm; - - dynamical->eval_k(xk_sym, kvec, fcs_phonon->fc2_ext, eval[1], evec[1], true); - - for (l = 0; l < 3; ++l) kvec[l] = xk3[l]; - rotvec(kvec, kvec, system->rlavec_p, 'T'); - norm = std::sqrt(kvec[0] * kvec[0] + kvec[1] * kvec[1] + kvec[2] * kvec[2]); - - if (norm > eps) for (l = 0; l < 3; ++l) kvec[l] /= norm; - - dynamical->eval_k(xk3, kvec, fcs_phonon->fc2_ext, eval[2], evec[2], true); - - for (l = 0; l < ns; ++l) { - eval[1][l] = dynamical->freq(eval[1][l]); - eval[2][l] = dynamical->freq(eval[2][l]); - } - - V3norm = std::norm(V3_mode(mode, xk_sym, xk3, is, js, eval, evec)); - - for (iT = 0; iT < NT; ++iT) { - T_tmp = T_arr[iT]; - - if (thermodynamics->classical) { - f1 = thermodynamics->fC(eval[1][is], T_tmp); - f2 = thermodynamics->fC(eval[2][js], T_tmp); - n1 = f1 + f2; - n2 = f1 - f2; - } else { - f1 = thermodynamics->fB(eval[1][is], T_tmp); - f2 = thermodynamics->fB(eval[2][js], T_tmp); - n1 = f1 + f2 + 1.0; - n2 = f1 - f2; - } - - - if (selection_type == 0) { - gamma_k[k][iT] += V3norm * n1; - } else if (selection_type == 1) { - gamma_k[k][iT] += V3norm * n2; - } - } - } - - for (iT = 0; iT < NT; ++iT) - gamma_k[k][iT] *= pi * std::pow(0.5, 4) / static_cast(small_group_k.size()); - - pos_x = kplist_for_target_mode[is][js][i][k].x; - pos_y = kplist_for_target_mode[is][js][i][k].y; - selection_type = kplist_for_target_mode[is][js][i][k].selection_type; - - for (iT = 0; iT < NT; ++iT) { - triplet_xyG.clear(); - triplet_xyG.push_back(pos_x); - triplet_xyG.push_back(pos_y); - triplet_xyG.push_back(gamma_k[k][iT]); - final_state_xy[i][iT].push_back(triplet_xyG); - } - - } - memory->deallocate(gamma_k); - } - } - - if (mympi->my_rank == 0) { - - file_mode_tau = input->job_title + ".fk." + boost::lexical_cast(i + 1); - ofs_mode_tau.open(file_mode_tau.c_str(), std::ios::out); - if (!ofs_mode_tau) - error->exit("compute_mode_tau", - "Cannot open file file_mode_tau"); - - ofs_mode_tau << "## Momentum-resolved final state amplitude" << std::endl; - - ofs_mode_tau << "# " << "Gamma at "; - for (l = 0; l < 3; ++l) ofs_mode_tau << std::setw(10) << -xk1[l]; - ofs_mode_tau << " , mode = " << mode + 1 << std::endl; - ofs_mode_tau << " # Temperature [K], coordinate in FBZ, final state amplitude" << std::endl; - for (iT = 0; iT < NT; ++iT) { - for (k = 0; k < final_state_xy[i][iT].size(); ++k) { - ofs_mode_tau << std::setw(10) << T_arr[iT]; - ofs_mode_tau << std::setw(15) << final_state_xy[i][iT][k][0]; - ofs_mode_tau << std::setw(15) << final_state_xy[i][iT][k][1]; - ofs_mode_tau << std::setw(15) << final_state_xy[i][iT][k][2] << std::endl; - } - } - - ofs_mode_tau.close(); - std::cout << " The result is saved in " << file_mode_tau << std::endl; - std::cout << std::endl; - } - } - - memory->deallocate(kplist_for_target_mode); - memory->deallocate(final_state_xy); - memory->deallocate(symop_k); - memory->deallocate(eval); - memory->deallocate(evec); -} - - -bool Relaxation::is_proper(const int isym) -{ - int i, j; - double det; - double S[3][3]; - bool ret; - - for (i = 0; i < 3; ++i) { - for (j = 0; j < 3; ++j) { - S[i][j] = static_cast(symmetry->SymmList[isym].rot[i][j]); - } - } - - det = S[0][0] * (S[1][1] * S[2][2] - S[2][1] * S[1][2]) - - S[1][0] * (S[0][1] * S[2][2] - S[2][1] * S[0][2]) - + S[2][0] * (S[0][1] * S[1][2] - S[1][1] * S[0][2]); - - if (std::abs(det - 1.0) < eps12) { - ret = true; - } else if (std::abs(det + 1.0) < eps12) { - ret = false; - } else { - error->exit("is_proper", "This cannot happen."); - } - - return ret; -} - -bool Relaxation::is_symmorphic(const int isym) -{ - int i; - double tran[3]; - bool ret; - - for (i = 0; i < 3; ++i) tran[i] = symmetry->SymmList[isym].tran[i]; - - if ((std::abs(tran[0]) < eps) && - (std::abs(tran[1]) < eps) && - (std::abs(tran[2]) < eps)) { - ret = true; - } else { - ret = false; - } - return ret; -} - -void Relaxation::get_unique_triplet_k(const int ik, - const bool use_triplet_symmetry, - const bool use_permutation_symmetry, - std::vector &triplet) -{ - int i, ik1, ik2, isym; - int num_group_k, tmp; - int ks_in[2]; - int knum = kpoint->kpoint_irred_all[ik][0].knum; - bool *flag_found; - std::vector kslist; - double xk[3], xk1[3], xk2[3]; - - memory->allocate(flag_found, kpoint->nk); - - if (use_triplet_symmetry) { - num_group_k = kpoint->small_group_of_k[ik].size(); - } else { - num_group_k = 1; - } - - for (i = 0; i < 3; ++i) xk[i] = kpoint->xk[knum][i]; - for (i = 0; i < kpoint->nk; ++i) flag_found[i] = false; - - triplet.clear(); - - for (ik1 = 0; ik1 < nk; ++ik1) { - - for (i = 0; i < 3; ++i) xk1[i] = kpoint->xk[ik1][i]; - for (i = 0; i < 3; ++i) xk2[i] = xk[i] - xk1[i]; - - ik2 = kpoint->get_knum(xk2[0], xk2[1], xk2[2]); - - kslist.clear(); - - if (ik1 > ik2 && use_permutation_symmetry) continue; - - // Add symmety-connected triplets to kslist - for (isym = 0; isym < num_group_k; ++isym) { - - ks_in[0] = kpoint->knum_sym(ik1, kpoint->small_group_of_k[ik][isym]); - ks_in[1] = kpoint->knum_sym(ik2, kpoint->small_group_of_k[ik][isym]); - - if (!flag_found[ks_in[0]]) { - kslist.push_back(KsList(2, ks_in, kpoint->small_group_of_k[ik][isym])); - flag_found[ks_in[0]] = true; - } - - if (ks_in[0] != ks_in[1] && use_permutation_symmetry && (!flag_found[ks_in[1]])) { - tmp = ks_in[0]; - ks_in[0] = ks_in[1]; - ks_in[1] = tmp; - - kslist.push_back(KsList(2, ks_in, kpoint->small_group_of_k[ik][isym])); - flag_found[ks_in[0]] = true; - } - } - if (kslist.size() > 0) { - triplet.push_back(kslist); - } - } - - memory->deallocate(flag_found); -} - - -void Relaxation::calc_V3norm2(const unsigned int ik_in, - const unsigned int snum, - double **ret) -{ - int ib; - unsigned int ik; - unsigned int is, js; - unsigned int k1, k2; - unsigned int arr[3]; - unsigned int knum, knum_minus; - - int ns2 = ns * ns; - - double factor = std::pow(0.5, 3) * std::pow(Hz_to_kayser / time_ry, 2); - std::vector triplet; - - knum = kpoint->kpoint_irred_all[ik_in][0].knum; - knum_minus = kpoint->knum_minus[knum]; - - get_unique_triplet_k(ik_in, - use_triplet_symmetry, - sym_permutation, - triplet); -#ifdef _OPENMP -#pragma omp parallel for private(is, js, ik, k1, k2, arr) -#endif - for (ib = 0; ib < ns2; ++ib) { - is = ib / ns; - js = ib % ns; - - for (ik = 0; ik < triplet.size(); ++ik) { - - k1 = triplet[ik].group[0].ks[0]; - k2 = triplet[ik].group[0].ks[1]; - - arr[0] = ns * knum_minus + snum; - arr[1] = ns * k1 + is; - arr[2] = ns * k2 + js; - - ret[ik][ib] = std::norm(V3(arr)) * factor; - } - } -} - -void Relaxation::setup_cubic() -{ - int i, j, k; - double *invsqrt_mass_p; - - // Sort force_constant[1] using the operator defined in fcs_phonons.h - // This sorting is necessary. - std::sort(fcs_phonon->force_constant_with_cell[1].begin(), - fcs_phonon->force_constant_with_cell[1].end()); - prepare_group_of_force_constants(fcs_phonon->force_constant_with_cell[1], - 3, ngroup, fcs_group); - - memory->allocate(vec_for_v3, fcs_phonon->force_constant_with_cell[1].size(), 2, 3); - - memory->allocate(invmass_for_v3, ngroup); - memory->allocate(evec_index, ngroup, 3); - - prepare_relative_vector(fcs_phonon->force_constant_with_cell[1], 3, vec_for_v3); - - memory->allocate(invsqrt_mass_p, system->natmin); - - for (i = 0; i < system->natmin; ++i) { - invsqrt_mass_p[i] = std::sqrt(1.0 / system->mass[system->map_p2s[i][0]]); - } - - k = 0; - for (i = 0; i < ngroup; ++i) { - for (j = 0; j < 3; ++j) { - evec_index[i][j] = fcs_phonon->force_constant_with_cell[1][k].pairs[j].index; - } - invmass_for_v3[i] - = invsqrt_mass_p[evec_index[i][0] / 3] - * invsqrt_mass_p[evec_index[i][1] / 3] - * invsqrt_mass_p[evec_index[i][2] / 3]; - k += fcs_group[i].size(); - } - - memory->deallocate(invsqrt_mass_p); -} - -void Relaxation::setup_quartic() -{ - int i, j, k; - double *invsqrt_mass_p; - std::sort(fcs_phonon->force_constant_with_cell[2].begin(), - fcs_phonon->force_constant_with_cell[2].end()); - prepare_group_of_force_constants(fcs_phonon->force_constant_with_cell[2], - 4, ngroup2, fcs_group2); - - memory->allocate(vec_for_v4, fcs_phonon->force_constant_with_cell[2].size(), 3, 3); - - memory->allocate(invmass_for_v4, ngroup2); - memory->allocate(evec_index4, ngroup2, 4); - - prepare_relative_vector(fcs_phonon->force_constant_with_cell[2], 4, vec_for_v4); - - memory->allocate(invsqrt_mass_p, system->natmin); - - for (i = 0; i < system->natmin; ++i) { - invsqrt_mass_p[i] = std::sqrt(1.0 / system->mass[system->map_p2s[i][0]]); - } - - k = 0; - for (i = 0; i < ngroup2; ++i) { - for (j = 0; j < 4; ++j) { - evec_index4[i][j] = fcs_phonon->force_constant_with_cell[2][k].pairs[j].index; - } - invmass_for_v4[i] - = invsqrt_mass_p[evec_index4[i][0] / 3] - * invsqrt_mass_p[evec_index4[i][1] / 3] - * invsqrt_mass_p[evec_index4[i][2] / 3] - * invsqrt_mass_p[evec_index4[i][3] / 3]; - k += fcs_group2[i].size(); - } - - memory->deallocate(invsqrt_mass_p); -} - -void Relaxation::store_exponential_for_acceleration(const int nk_in[3], - int &nkrep_out, - std::complex *exp_out, - std::complex ***exp3_out) -{ - // For accelerating function V3 and V4 by avoiding continual call of std::exp. - - int i; - - MPI_Bcast(&use_tuned_ver, 1, MPI_LOGICAL, 0, MPI_COMM_WORLD); - - if (use_tuned_ver) { - - nk_grid[0] = nk_in[0]; - nk_grid[1] = nk_in[1]; - nk_grid[2] = nk_in[2]; - - for (i = 0; i < 3; ++i) dnk[i] = static_cast(nk_grid[i]); - - if (nk_grid[0] == nk_grid[1] && nk_grid[1] == nk_grid[2]) { - nkrep_out = nk_grid[0]; - tune_type = 0; - - } else if (nk_grid[0] == nk_grid[1] && nk_grid[2] == 1) { - nkrep_out = nk_grid[0]; - tune_type = 0; - - } else if (nk_grid[1] == nk_grid[2] && nk_grid[0] == 1) { - nkrep_out = nk_grid[1]; - tune_type = 0; - - } else if (nk_grid[2] == nk_grid[0] && nk_grid[1] == 1) { - nkrep_out = nk_grid[2]; - tune_type = 0; - - } else if (nk_grid[0] == 1 && nk_grid[1] == 1) { - nkrep_out = nk_grid[2]; - tune_type = 0; - - } else if (nk_grid[1] == 1 && nk_grid[2] == 1) { - nkrep_out = nk_grid[0]; - tune_type = 0; - - } else if (nk_grid[2] == 1 && nk_grid[0] == 1) { - nkrep_out = nk_grid[1]; - tune_type = 0; - - } else { - tune_type = 1; - } - - int ii, jj, kk; - - if (tune_type == 0) { - - double phase; - - memory->allocate(exp_phase, 2 * nkrep_out - 1); -#ifdef _OPENMP -#pragma omp parallel for private(phase) -#endif - for (ii = 0; ii < 2 * nkrep_out - 1; ++ii) { - phase = 2.0 * pi * static_cast(ii - nkrep_out + 1) - / static_cast(nkrep_out); - exp_phase[ii] = std::exp(im * phase); - } - - } else if (tune_type == 1) { - - double phase[3]; - - memory->allocate(exp_phase3, - 2 * nk_grid[0] - 1, - 2 * nk_grid[1] - 1, - 2 * nk_grid[2] - 1); -#ifdef _OPENMP -#pragma omp parallel for private(phase, jj, kk) -#endif - for (ii = 0; ii < 2 * nk_grid[0] - 1; ++ii) { - phase[0] = 2.0 * pi * static_cast(ii - nk_grid[0] + 1) / dnk[0]; - for (jj = 0; jj < 2 * nk_grid[1] - 1; ++jj) { - phase[1] = 2.0 * pi * static_cast(jj - nk_grid[1] + 1) / dnk[1]; - for (kk = 0; kk < 2 * nk_grid[2] - 1; ++kk) { - phase[2] = 2.0 * pi * static_cast(kk - nk_grid[2] + 1) / dnk[2]; - exp_phase3[ii][jj][kk] = std::exp(im * (phase[0] + phase[1] + phase[2])); - } - } - } - } - } -} - - -void Relaxation::calc_self3omega_tetrahedron(const double Temp, - double **eval, - std::complex ***evec, - const unsigned int ik_in, - const unsigned int snum, - const unsigned int nomega, - double *omega, - double *ret) -{ - // This function returns the imaginary part of phonon self-energy - // for the given frequency range of omega, phonon frequency (eval) and phonon eigenvectors (evec). - // The tetrahedron method will be used. - // This version employs the crystal symmetry to reduce the computational cost - // In addition, both MPI and OpenMP parallizations are used in a hybrid way inside this function. - - int ik, ib, iomega; - int ns2 = ns * ns; - - unsigned int i; - unsigned int is, js; - unsigned int k1, k2; - unsigned int arr[3]; - unsigned int npair_uniq; - unsigned int nk_tmp; - - int ik_now; - - double n1, n2; - double f1, f2; - double omega_inner[2]; - - int *kmap_identity, **kpairs; - double **energy_tmp; - double **weight_tetra; - double **v3_arr, *v3_arr_loc; - double *ret_private; - - std::vector triplet; - std::vector vk_l; - - int knum = kpoint->kpoint_irred_all[ik_in][0].knum; - int knum_minus = kpoint->knum_minus[knum]; - double omega0 = eval[knum_minus][snum]; - - get_unique_triplet_k(ik_in, - false, - false, - triplet); - - npair_uniq = triplet.size(); - - if (npair_uniq != nk) { - error->exit("hoge", "Something is wrong."); - } - - memory->allocate(kpairs, nk, 2); - memory->allocate(kmap_identity, nk); - - for (i = 0; i < nk; ++i) kmap_identity[i] = i; - - for (iomega = 0; iomega < nomega; ++iomega) ret[iomega] = 0.0; - - for (ik = 0; ik < npair_uniq; ++ik) { - kpairs[ik][0] = triplet[ik].group[0].ks[0]; - kpairs[ik][1] = triplet[ik].group[0].ks[1]; - } - - if (nk % mympi->nprocs != 0) { - nk_tmp = nk / mympi->nprocs + 1; - } else { - nk_tmp = nk / mympi->nprocs; - } - - vk_l.clear(); - - for (ik = 0; ik < nk; ++ik) { - if (ik % mympi->nprocs == mympi->my_rank) { - vk_l.push_back(ik); - } - } - - if (vk_l.size() < nk_tmp) { - vk_l.push_back(-1); - } - - memory->allocate(v3_arr_loc, ns2); - memory->allocate(v3_arr, nk_tmp * mympi->nprocs, ns2); - - for (ik = 0; ik < nk_tmp; ++ik) { - - ik_now = vk_l[ik]; - - if (ik_now == -1) { - - for (ib = 0; ib < ns2; ++ib) v3_arr_loc[ib] = 0.0; // do nothing - - } else { -#ifdef _OPENMP -#pragma omp parallel for private(is, js, arr) -#endif - for (ib = 0; ib < ns2; ++ib) { - - is = ib / ns; - js = ib % ns; - - arr[0] = ns * knum_minus + snum; - arr[1] = ns * kpairs[ik_now][0] + is; - arr[2] = ns * kpairs[ik_now][1] + js; - - v3_arr_loc[ib] = std::norm(V3(arr)); - } - } - MPI_Gather(&v3_arr_loc[0], ns2, MPI_DOUBLE, - v3_arr[ik * mympi->nprocs], ns2, - MPI_DOUBLE, 0, MPI_COMM_WORLD); - } - memory->deallocate(v3_arr_loc); - - if (mympi->my_rank == 0) { - -#ifdef _OPENMP -#pragma omp parallel private(is, js, k1, k2, energy_tmp, i, \ - iomega, weight_tetra, ik, \ - omega_inner, f1, f2, n1, n2) -#endif - { - memory->allocate(energy_tmp, 2, nk); - memory->allocate(weight_tetra, 2, nk); -#ifdef _OPENMP - const int nthreads = omp_get_num_threads(); - const int ithread = omp_get_thread_num(); -#else - const int nthreads = 1; - const int ithread = 0; -#endif - -#ifdef _OPENMP -#pragma omp single -#endif - { - memory->allocate(ret_private, nthreads * nomega); - for (i = 0; i < nthreads * nomega; ++i) ret_private[i] = 0.0; - } -#ifdef _OPENMP -#pragma omp for -#endif - for (ib = 0; ib < ns2; ++ib) { - - is = ib / ns; - js = ib % ns; - - for (ik = 0; ik < nk; ++ik) { - k1 = kpairs[ik][0]; - k2 = kpairs[ik][1]; - - energy_tmp[0][ik] = eval[k1][is] + eval[k2][js]; - energy_tmp[1][ik] = eval[k1][is] - eval[k2][js]; - } - for (iomega = 0; iomega < nomega; ++iomega) { - for (i = 0; i < 2; ++i) { - integration->calc_weight_tetrahedron(nk, - kmap_identity, - weight_tetra[i], - energy_tmp[i], - omega[iomega]); - } - - for (ik = 0; ik < nk; ++ik) { - k1 = kpairs[ik][0]; - k2 = kpairs[ik][1]; - - omega_inner[0] = eval[k1][is]; - omega_inner[1] = eval[k2][js]; - if (thermodynamics->classical) { - f1 = thermodynamics->fC(omega_inner[0], Temp); - f2 = thermodynamics->fC(omega_inner[1], Temp); - n1 = f1 + f2; - n2 = f1 - f2; - } else { - f1 = thermodynamics->fB(omega_inner[0], Temp); - f2 = thermodynamics->fB(omega_inner[1], Temp); - n1 = f1 + f2 + 1.0; - n2 = f1 - f2; - } - - //#pragma omp critical - ret_private[nomega * ithread + iomega] - += v3_arr[ik][ib] * (n1 * weight_tetra[0][ik] - 2.0 * n2 * weight_tetra[1][ik]); - } - } - } -#ifdef _OPENMP -#pragma omp for -#endif - for (iomega = 0; iomega < nomega; ++iomega) { - for (int t = 0; t < nthreads; t++) { - ret[iomega] += ret_private[nomega * t + iomega]; - } - } - memory->deallocate(energy_tmp); - memory->deallocate(weight_tetra); - } -#ifdef _OPENMP -#pragma omp parallel for -#endif - for (iomega = 0; iomega < nomega; ++iomega) { - ret[iomega] *= pi * std::pow(0.5, 4); - } - memory->deallocate(ret_private); - } - - memory->deallocate(v3_arr); - memory->deallocate(kmap_identity); - memory->deallocate(kpairs); -} diff --git a/anphon/relaxation.h b/anphon/relaxation.h deleted file mode 100644 index 3ed53761..00000000 --- a/anphon/relaxation.h +++ /dev/null @@ -1,220 +0,0 @@ -/* -relaxation.h - -Copyright (c) 2014 Terumasa Tadano - -This file is distributed under the terms of the MIT license. -Please see the file 'LICENCE.txt' in the root directory -or http://opensource.org/licenses/mit-license.php for information. -*/ - -#pragma once - -#include "pointers.h" -#include -#include -#include -#include "fcs_phonon.h" - -namespace PHON_NS -{ - class KsList - { - public: - std::vector ks; - int symnum; - - KsList(); - - KsList(const KsList &a) - { - for (auto p = a.ks.cbegin(); p != a.ks.cend(); ++p) { - ks.push_back(*p); - } - symnum = a.symnum; - } - - KsList(const int n, int *ks_in, const int sym) - { - for (int i = 0; i < n; ++i) { - ks.push_back(ks_in[i]); - } - symnum = sym; - } - }; - - inline bool operator<(const KsList a, const KsList b) - { - return std::lexicographical_compare(a.ks.begin(), a.ks.end(), - b.ks.begin(), b.ks.end()); - } - - class KsListGroup - { - public: - std::vector group; - - KsListGroup(); - - KsListGroup(const std::vector &a) - { - for (auto it = a.cbegin(); it != a.cend(); ++it) { - group.push_back(*it); - } - } - }; - - class KsListMode - { - public: - double xk[3]; - int nmode; - - KsListMode(); - - KsListMode(double xk_in[3], const int n) - { - for (int i = 0; i < 3; ++i) xk[i] = xk_in[i]; - nmode = n; - } - }; - - class KpointListWithCoordinate - { - public: - double xk[3]; - double x, y; - int plane; - int selection_type; - - KpointListWithCoordinate(); - - KpointListWithCoordinate(const std::vector &a, - const double x_in, - const double y_in, - const int plane_in, - const int selection_type_in) - { - for (int i = 0; i < 3; ++i) xk[i] = a[i]; - x = x_in; - y = y_in; - plane = plane_in; - selection_type = selection_type_in; - } - }; - - - class Relaxation : protected Pointers - { - public: - Relaxation(class PHON *); - ~Relaxation(); - - void setup_relaxation(); - void finish_relaxation(); - void perform_mode_analysis(); - void setup_mode_analysis(); - - void calc_damping_smearing(const unsigned int, double *, const double, - const unsigned int, const unsigned int, - double *); - - void calc_damping_tetrahedron(const unsigned int, double *, const double, - const unsigned int, const unsigned int, - double *); - - int quartic_mode; - bool ks_analyze_mode; - bool atom_project_mode; - bool calc_realpart; - bool calc_fstate_omega; - bool calc_fstate_k; - bool print_V3; - bool use_tuned_ver; - bool spectral_func; - - bool use_triplet_symmetry; - bool **is_imaginary; - - std::string ks_input; - std::vector kslist; - - - std::complex V3(const unsigned int [3]); - std::complex V4(const unsigned int [4]); - - - std::complex V3_mode(int, double *, double *, - int, int, double **, - std::complex ***); - - void calc_V3norm2(const unsigned int, const unsigned int, double **); - - void prepare_relative_vector(std::vector, - const unsigned int, double ***); - - void prepare_group_of_force_constants(std::vector, - const unsigned int, int &, - std::vector *&); - - void detect_imaginary_branches(double **); - - private: - unsigned int nk, ns, nks; - std::vector kslist_fstate_k; - std::complex im; - - double ***vec_for_v3, *invmass_for_v3; - double ***vec_for_v4, *invmass_for_v4; - int **evec_index; - int **evec_index4; - - bool sym_permutation; - - std::vector *pair_uniq; - - bool is_proper(const int); - bool is_symmorphic(const int); - - void setup_cubic(); - void setup_quartic(); - void store_exponential_for_acceleration(const int nk[3], int &, - std::complex *, - std::complex ***); - - void calc_frequency_resolved_final_state(const unsigned int, double *, const double, - const unsigned int, const double *, - const unsigned int, const unsigned int, - double ***); - void calc_frequency_resolved_final_state_tetrahedron(const unsigned int, - double *, const double, - const unsigned int, const double *, - const unsigned int, const unsigned int, - double ***); - - void print_momentum_resolved_final_state(const unsigned int, double *, const double); - void print_frequency_resolved_final_state(const unsigned int, double *); - - void calc_self3omega_tetrahedron(const double, double **, - std::complex ***, - const unsigned int, const unsigned int, - const unsigned int, double *, double *); - - - void get_unique_triplet_k(const int, - const bool, - const bool, - std::vector &); - - int ngroup; - int ngroup2; - std::vector *fcs_group; - std::vector *fcs_group2; - std::complex *exp_phase, ***exp_phase3; - - int nk_grid[3]; - int nk_represent; - unsigned int tune_type; - double dnk[3]; - }; -} diff --git a/anphon/scph.cpp b/anphon/scph.cpp index 1ee007fa..2c9101a3 100644 --- a/anphon/scph.cpp +++ b/anphon/scph.cpp @@ -12,7 +12,8 @@ #include "scph.h" #include "dynamical.h" #include "kpoint.h" -#include "relaxation.h" +#include "anharmonic_core.h" +#include "ewald.h" #include "memory.h" #include "thermodynamics.h" #include "write_phonons.h" @@ -24,7 +25,7 @@ #include "phonon_dos.h" #include "symmetry_core.h" #include -#include +#include #include #include #include @@ -32,6 +33,9 @@ #include #include #include "timer.h" +#include +#include +#include #if defined(WIN32) || defined(_WIN32) #pragma comment(lib, "libfftw3-3.lib") @@ -43,13 +47,118 @@ using namespace PHON_NS; Scph::Scph(PHON *phon): Pointers(phon) { - im = std::complex(0.0, 1.0); + set_default_variables(); } Scph::~Scph() { -}; + deallocate_variables(); +} + +void Scph::set_default_variables() +{ + im = std::complex(0.0, 1.0); + restart_scph = false; + warmstart_scph = false; + lower_temp = true; + tolerance_scph = 1.0e-10; + mixalpha = 0.1; + maxiter = 100; + print_self_consistent_fc2 = false; + selfenergy_offdiagonal = true; + relax_coordinate = false; + + xk_scph = nullptr; + kvec_na_scph = nullptr; + xk_interpolate = nullptr; + vec_for_v3 = nullptr; + vec_for_v4 = nullptr; + invmass_for_v3 = nullptr; + invmass_for_v4 = nullptr; + evec_index3 = nullptr; + evec_index4 = nullptr; + kmap_interpolate_to_scph = nullptr; + evec_harmonic = nullptr; + fcs_group = nullptr; + fcs_group2 = nullptr; + omega2_harmonic = nullptr; + mat_transform_sym = nullptr; + small_group_at_k = nullptr; + symop_minus_at_k = nullptr; + kpoint_map_symmetry = nullptr; + exp_phase = nullptr; + exp_phase3 = nullptr; + mindist_list_scph = nullptr; +} + + +void Scph::deallocate_variables() +{ + if (xk_scph) { + memory->deallocate(xk_scph); + } + if (kvec_na_scph) { + memory->deallocate(kvec_na_scph); + } + if (xk_interpolate) { + memory->deallocate(xk_interpolate); + } + if (kmap_interpolate_to_scph) { + memory->deallocate(kmap_interpolate_to_scph); + } + if (mindist_list_scph) { + memory->deallocate(mindist_list_scph); + } + if (evec_harmonic) { + memory->deallocate(evec_harmonic); + } + if (omega2_harmonic) { + memory->deallocate(omega2_harmonic); + } + if (vec_for_v3) { + memory->deallocate(vec_for_v3); + } + if (vec_for_v4) { + memory->deallocate(vec_for_v4); + } + if (invmass_for_v3) { + memory->deallocate(invmass_for_v3); + } + if (invmass_for_v4) { + memory->deallocate(invmass_for_v4); + } + if (evec_index3) { + memory->deallocate(evec_index3); + } + if (evec_index4) { + memory->deallocate(evec_index4); + } + if (fcs_group) { + memory->deallocate(fcs_group); + } + if (fcs_group2) { + memory->deallocate(fcs_group2); + } + if (exp_phase) { + memory->deallocate(exp_phase); + } + if (exp_phase3) { + memory->deallocate(exp_phase3); + } + if (mat_transform_sym) { + memory->deallocate(mat_transform_sym); + } + if (small_group_at_k) { + memory->deallocate(small_group_at_k); + } + if (symop_minus_at_k) { + memory->deallocate(symop_minus_at_k); + } + if (kpoint_map_symmetry) { + memory->deallocate(kpoint_map_symmetry); + } +} void Scph::setup_scph() { @@ -63,31 +172,23 @@ void Scph::setup_scph() setup_transform_symmetry(); } - void Scph::exec_scph() { - // - // SCPH calculation - // - unsigned int iT, NT; - unsigned int nk_ref = kpoint->nk; - unsigned int ns = dynamical->neval; - double Tmin = system->Tmin; - double Tmax = system->Tmax; - double dT = system->dT; + const auto nk_ref = kpoint->nk; + const auto ns = dynamical->neval; + const auto Tmin = system->Tmin; + const auto Tmax = system->Tmax; + const auto dT = system->dT; - double ***eval_anharm; - std::complex ****evec_anharm; + std::complex ****delta_dymat_scph = nullptr; - NT = static_cast((Tmax - Tmin) / dT) + 1; + const auto NT = static_cast((Tmax - Tmin) / dT) + 1; MPI_Bcast(&restart_scph, 1, MPI_LOGICAL, 0, MPI_COMM_WORLD); MPI_Bcast(&selfenergy_offdiagonal, 1, MPI_LOGICAL, 0, MPI_COMM_WORLD); MPI_Bcast(&ialgo, 1, MPI_UNSIGNED, 0, MPI_COMM_WORLD); memory->allocate(delta_dymat_scph, NT, ns, ns, nk_interpolate); - memory->allocate(eval_anharm, NT, nk_ref, ns); - memory->allocate(evec_anharm, NT, nk_ref, ns, ns); if (restart_scph) { @@ -96,6 +197,10 @@ void Scph::exec_scph() } else { + if (dynamical->nonanalytic == 3) { + error->exit("exec_scph", + "Sorry, NONANALYTIC=3 can't be used for the main loop of the SCPH calculation."); + } // Solve the SCPH equation and obtain the correction to the dynamical matrix exec_scph_main(delta_dymat_scph); @@ -105,47 +210,191 @@ void Scph::exec_scph() } } - for (iT = 0; iT < NT; ++iT) { - exec_interpolation(delta_dymat_scph[iT], eval_anharm[iT], evec_anharm[iT]); + if (kpoint->kpoint_mode == 2) { + if (thermodynamics->calc_FE_bubble) { + compute_free_energy_bubble_SCPH(kmesh_interpolate, + delta_dymat_scph); + } } + + postprocess(delta_dymat_scph); + + memory->deallocate(delta_dymat_scph); +} + +void Scph::postprocess(std::complex ****delta_dymat_scph) +{ + double ***eval_anharm = nullptr; + const auto nk_ref = kpoint->nk; + const auto ns = dynamical->neval; + const auto Tmin = system->Tmin; + const auto Tmax = system->Tmax; + const auto dT = system->dT; + const auto NT = static_cast((Tmax - Tmin) / dT) + 1; + if (mympi->my_rank == 0) { + + std::cout << '\n'; + std::cout << " Running postprocess of SCPH (calculation of free energy, MSD, DOS)" << std::endl; + std::cout << " The number of temperature points: " << std::setw(4) << NT << std::endl; + std::cout << " "; + + std::complex ***evec_tmp = nullptr; + + memory->allocate(eval_anharm, NT, nk_ref, ns); + memory->allocate(evec_tmp, nk_ref, ns, ns); + + double **dos_scph = nullptr; + double ***pdos_scph = nullptr; + double *heat_capacity = nullptr; + double *FE_QHA = nullptr; + double *dFE_scph = nullptr; + double **msd_scph = nullptr; + double ***ucorr_scph = nullptr; + + if (kpoint->kpoint_mode == 2) { + if (dos->compute_dos) { + memory->allocate(dos_scph, NT, dos->n_energy); + + if (dos->projected_dos) { + memory->allocate(pdos_scph, NT, ns, dos->n_energy); + } + } + memory->allocate(heat_capacity, NT); + memory->allocate(FE_QHA, NT); + memory->allocate(dFE_scph, NT); + + if (writes->print_msd) { + memory->allocate(msd_scph, NT, ns); + } + if (writes->print_ucorr) { + memory->allocate(ucorr_scph, NT, ns, ns); + } + } + + for (auto iT = 0; iT < NT; ++iT) { + auto T = Tmin + dT * static_cast(iT); + + exec_interpolation(kmesh_interpolate, + delta_dymat_scph[iT], + nk_ref, + kpoint->xk, + kpoint->kvec_na, + eval_anharm[iT], + evec_tmp); + + if (kpoint->kpoint_mode == 2) { + + if (dos->compute_dos) { + dos->calc_dos_from_given_frequency(eval_anharm[iT], + dos_scph[iT]); + } + + heat_capacity[iT] = thermodynamics->Cv_tot(T, + kpoint->nk_irred, + ns, + kpoint->kpoint_irred_all, + &kpoint->weight_k[0], + eval_anharm[iT]); + + FE_QHA[iT] = thermodynamics->free_energy_QHA(T, + kpoint->nk_irred, + ns, + kpoint->kpoint_irred_all, + &kpoint->weight_k[0], + eval_anharm[iT]); + + dFE_scph[iT] = thermodynamics->FE_scph_correction(iT, + eval_anharm[iT], + evec_tmp); + + if (writes->print_msd) { + double shift[3]{0.0, 0.0, 0.0}; + + for (auto is = 0; is < ns; ++is) { + msd_scph[iT][is] = thermodynamics->disp_corrfunc(T, is, is, + shift, kpoint->nk, + ns, + kpoint->xk, + eval_anharm[iT], + evec_tmp); + } + } + + if (writes->print_ucorr) { + double shift[3]; + for (auto i = 0; i < 3; ++i) shift[i] = static_cast(writes->shift_ucorr[i]); + + for (auto is = 0; is < ns; ++is) { + for (auto js = 0; js < ns; ++js) { + ucorr_scph[iT][is][js] = thermodynamics->disp_corrfunc(T, is, js, + shift, kpoint->nk, + ns, + kpoint->xk, + eval_anharm[iT], + evec_tmp); + } + } + } + } + + std::cout << '.' << std::flush; + if (iT % 25 == 24) { + std::cout << std::endl; + std::cout << std::setw(3); + } + } + std::cout << "\n\n"; + if (kpoint->kpoint_mode == 0) { - write_scph_energy(eval_anharm); + writes->write_scph_energy(eval_anharm); } else if (kpoint->kpoint_mode == 1) { - write_scph_bands(eval_anharm); + writes->write_scph_bands(eval_anharm); } else if (kpoint->kpoint_mode == 2) { - write_scph_dos(eval_anharm); - // write_scph_thermodynamics(eval_anharm); + if (dos->compute_dos) { + writes->write_scph_dos(dos_scph); + } + writes->write_scph_thermodynamics(heat_capacity, FE_QHA, dFE_scph); if (writes->print_msd) { - write_scph_msd(eval_anharm, evec_anharm); + writes->write_scph_msd(msd_scph); + } + if (writes->print_ucorr) { + writes->write_scph_ucorr(ucorr_scph); } } - } + memory->deallocate(eval_anharm); + memory->deallocate(evec_tmp); - memory->deallocate(eval_anharm); - memory->deallocate(evec_anharm); - memory->deallocate(delta_dymat_scph); + if (dos_scph) memory->deallocate(dos_scph); + if (pdos_scph) memory->deallocate(pdos_scph); + if (heat_capacity) memory->deallocate(heat_capacity); + if (FE_QHA) memory->deallocate(FE_QHA); + if (dFE_scph) memory->deallocate(dFE_scph); + + //std::cout << "\n done.\n" << std::flush; + } } void Scph::load_scph_dymat_from_file(std::complex ****dymat_out) { - unsigned int ns = dynamical->neval; - unsigned int NT; - double Tmin = system->Tmin; - double Tmax = system->Tmax; - double dT = system->dT; - NT = static_cast((Tmax - Tmin) / dT) + 1; + const auto ns = dynamical->neval; + const auto Tmin = system->Tmin; + const auto Tmax = system->Tmax; + const auto dT = system->dT; + auto NT = static_cast((Tmax - Tmin) / dT) + 1; + std::vector Temp_array(NT); + + for (int i = 0; i < NT; ++i) { + Temp_array[i] = Tmin + dT * static_cast(i); + } if (mympi->my_rank == 0) { - int iT, ik, is, js; - unsigned int nk = nk_scph; - unsigned int nk_ref = kpoint->nk; - bool consider_offdiagonal = selfenergy_offdiagonal; + auto consider_offdiagonal = selfenergy_offdiagonal; double temp; std::ifstream ifs_dymat; - std::string file_dymat = input->job_title + ".scph_dymat"; + auto file_dymat = input->job_title + ".scph_dymat"; bool consider_offdiag_tmp; unsigned int nk_interpolate_ref[3]; unsigned int nk_scph_tmp[3]; @@ -182,34 +431,54 @@ void Scph::load_scph_dymat_from_file(std::complex ****dymat_out) error->exit("load_scph_dymat_from_file", "The number of KMESH_SCPH is not consistent"); } - if (std::abs(Tmin_tmp - Tmin) > eps12 || - std::abs(Tmax_tmp - Tmax) > eps12 || - std::abs(dT_tmp - dT) > eps12) { - error->exit("load_scph_dymat_from_file", - "The temperature information is not consistent"); - } if (nonanalytic_tmp != dynamical->nonanalytic) { - error->exit("load_scph_dymat_from_file", - "The nonanalytic mode is not consistent"); + error->warn("load_scph_dymat_from_file", + "The NONANALYTIC tag is not consistent"); } if (consider_offdiag_tmp != consider_offdiagonal) { error->exit("load_scph_dymat_from_file", - "The off-diagonal mode is not consistent"); + "The SELF_OFFDIAG tag is not consistent"); + } + + // Check if the precalculated data for the given temperature range exists + int NT_ref = static_cast((Tmax_tmp - Tmin_tmp) / dT_tmp) + 1; + std::vector Temp_array_ref(NT_ref); + for (int i = 0; i < NT_ref; ++i) { + Temp_array_ref[i] = Tmin_tmp + dT_tmp * static_cast(i); + } + std::vector flag_load(NT_ref); + for (int i = 0; i < NT_ref; ++i) { + flag_load[i] = 0; + for (int j = 0; j < NT; ++j) { + if (std::abs(Temp_array_ref[i] - Temp_array[j]) < eps6) { + flag_load[i] = 1; + break; + } + } } - for (iT = 0; iT < NT; ++iT) { + int icount = 0; + for (int iT = 0; iT < NT_ref; ++iT) { ifs_dymat >> str_dummy >> temp; - for (is = 0; is < ns; ++is) { - for (js = 0; js < ns; ++js) { - for (ik = 0; ik < nk_interpolate; ++ik) { + for (int is = 0; is < ns; ++is) { + for (int js = 0; js < ns; ++js) { + for (int ik = 0; ik < nk_interpolate; ++ik) { ifs_dymat >> dymat_real >> dymat_imag; - dymat_out[iT][is][js][ik] - = std::complex(dymat_real, dymat_imag); + if (flag_load[iT]) { + dymat_out[icount][is][js][ik] + = std::complex(dymat_real, dymat_imag); + } } } } + if (flag_load[iT]) icount += 1; } ifs_dymat.close(); + + if (icount != NT) { + error->exit("load_scph_dymat_from_file", + "The temperature information is not consistent"); + } std::cout << " done." << std::endl; } // Broadcast to all MPI threads @@ -219,17 +488,14 @@ void Scph::load_scph_dymat_from_file(std::complex ****dymat_out) void Scph::store_scph_dymat_to_file(std::complex ****dymat_in) { int i; - int iT, ik, is, js; - unsigned int ns = dynamical->neval; - double Tmin = system->Tmin; - double Tmax = system->Tmax; - double dT = system->dT; - double temp; - unsigned int NT; + const auto ns = dynamical->neval; + const auto Tmin = system->Tmin; + const auto Tmax = system->Tmax; + const auto dT = system->dT; std::ofstream ofs_dymat; - std::string file_dymat = input->job_title + ".scph_dymat"; + auto file_dymat = input->job_title + ".scph_dymat"; - NT = static_cast((Tmax - Tmin) / dT) + 1; + const auto NT = static_cast((Tmax - Tmin) / dT) + 1; ofs_dymat.open(file_dymat.c_str(), std::ios::out); @@ -251,12 +517,12 @@ void Scph::store_scph_dymat_to_file(std::complex ****dymat_in) ofs_dymat << std::setw(5) << dynamical->nonanalytic; ofs_dymat << std::setw(5) << selfenergy_offdiagonal << std::endl; - for (iT = 0; iT < NT; ++iT) { - temp = Tmin + static_cast(iT) * dT; + for (auto iT = 0; iT < NT; ++iT) { + const auto temp = Tmin + static_cast(iT) * dT; ofs_dymat << "# " << temp << std::endl; - for (is = 0; is < ns; ++is) { - for (js = 0; js < ns; ++js) { - for (ik = 0; ik < nk_interpolate; ++ik) { + for (auto is = 0; is < ns; ++is) { + for (auto js = 0; js < ns; ++js) { + for (auto ik = 0; ik < nk_interpolate; ++ik) { ofs_dymat << std::setprecision(15) << std::setw(25) << dymat_in[iT][is][js][ik].real(); ofs_dymat << std::setprecision(15) @@ -267,36 +533,37 @@ void Scph::store_scph_dymat_to_file(std::complex ****dymat_in) } } ofs_dymat.close(); + std::cout << " " << std::setw(input->job_title.length() + 12) << std::left << file_dymat; + std::cout << " : Anharmonic dynamical matrix (restart file)" << std::endl; } void Scph::exec_scph_main(std::complex ****dymat_anharm) { - int i, iT, ik, is, js; - unsigned int nk = nk_scph; - unsigned int ns = dynamical->neval; - unsigned int NT; - unsigned int nk_reduced_scph = kp_irred_scph.size(); - unsigned int nk_irred_interpolate = kp_irred_interpolate.size(); - double Tmin = system->Tmin; - double Tmax = system->Tmax; - double dT = system->dT; - double temp; + int iT, ik, is; + const auto nk = nk_scph; + const auto ns = dynamical->neval; + const auto nk_reduced_scph = kp_irred_scph.size(); + const auto nk_irred_interpolate = kp_irred_interpolate.size(); + const auto Tmin = system->Tmin; + const auto Tmax = system->Tmax; + const auto dT = system->dT; double ***omega2_anharm; std::complex ***evec_anharm_tmp; std::complex ***v3_array_all; std::complex ***v4_array_all; - bool converged_prev; std::vector vec_temp; - NT = static_cast((Tmax - Tmin) / dT) + 1; + const auto NT = static_cast((Tmax - Tmin) / dT) + 1; // Find the degeneracy at each irreducible k points. std::vector *degeneracy_at_k; memory->allocate(degeneracy_at_k, nk_reduced_scph); - find_degeneracy(degeneracy_at_k, nk_reduced_scph, - kp_irred_scph, eval_harmonic); + find_degeneracy(degeneracy_at_k, + nk_reduced_scph, + kp_irred_scph, + omega2_harmonic); // Compute matrix element of 4-phonon interaction @@ -308,15 +575,21 @@ void Scph::exec_scph_main(std::complex ****dymat_anharm) // Calculate v4 array. // This operation is the most expensive part of the calculation. if (selfenergy_offdiagonal & (ialgo == 1)) { - compute_V4_array_all2(v4_array_all, evec_harmonic, selfenergy_offdiagonal); + compute_V4_elements_mpi_over_band(v4_array_all, + evec_harmonic, + selfenergy_offdiagonal); } else { - compute_V4_array_all(v4_array_all, evec_harmonic, - selfenergy_offdiagonal, relax_coordinate); + compute_V4_elements_mpi_over_kpoint(v4_array_all, + evec_harmonic, + selfenergy_offdiagonal, + relax_coordinate); } if (relax_coordinate) { memory->allocate(v3_array_all, nk, ns, ns * ns); - compute_V3_array_all(v3_array_all, evec_harmonic, selfenergy_offdiagonal); + compute_V3_elements_mpi_over_kpoint(v3_array_all, + evec_harmonic, + selfenergy_offdiagonal); } if (mympi->my_rank == 0) { @@ -336,10 +609,10 @@ void Scph::exec_scph_main(std::complex ****dymat_anharm) } } - converged_prev = false; + auto converged_prev = false; - for (i = 0; i < vec_temp.size(); ++i) { - temp = vec_temp[i]; + for (int i = 0; i < vec_temp.size(); ++i) { + const auto temp = vec_temp[i]; iT = static_cast((temp - Tmin) / dT); @@ -347,7 +620,7 @@ void Scph::exec_scph_main(std::complex ****dymat_anharm) for (ik = 0; ik < nk; ++ik) { for (is = 0; is < ns; ++is) { - for (js = 0; js < ns; ++js) { + for (int js = 0; js < ns; ++js) { evec_anharm_tmp[ik][is][js] = evec_harmonic[ik][is][js]; } } @@ -368,11 +641,18 @@ void Scph::exec_scph_main(std::complex ****dymat_anharm) } } - compute_anharmonic_frequency(v4_array_all, omega2_anharm[iT], - evec_anharm_tmp, temp, degeneracy_at_k, - converged_prev, cmat_convert, + compute_anharmonic_frequency(v4_array_all, + omega2_anharm[iT], + evec_anharm_tmp, + temp, + degeneracy_at_k, + converged_prev, + cmat_convert, selfenergy_offdiagonal); - calc_new_dymat_with_evec(dymat_anharm[iT], omega2_anharm[iT], evec_anharm_tmp); + + calc_new_dymat_with_evec(dymat_anharm[iT], + omega2_anharm[iT], + evec_anharm_tmp); if (!warmstart_scph) converged_prev = false; } @@ -390,36 +670,28 @@ void Scph::exec_scph_main(std::complex ****dymat_anharm) } -void Scph::compute_V3_array_all(std::complex ***v3_out, - std::complex ***evec_in, - const bool self_offdiag) +void Scph::compute_V3_elements_mpi_over_kpoint(std::complex ***v3_out, + std::complex ***evec_in, + const bool self_offdiag) { // Calculate the matrix elements of quartic terms in reciprocal space. // This is the most expensive part of the SCPH calculation. - int ik_mpi; - unsigned int nk_reduced_scph = kp_irred_scph.size(); - unsigned int nk_reduced_interpolate = kp_irred_interpolate.size(); - unsigned int ns = dynamical->neval; - unsigned int ns2 = ns * ns; - unsigned int ns3 = ns * ns * ns; - unsigned int ns4 = ns * ns * ns * ns; - unsigned int ik, jk, is, js, ks, ls; - unsigned int knum, knum_minus, jk_minus; - unsigned int nsize = fcs_phonon->force_constant_with_cell[1].size(); - double phase, phase3[3]; - int loc, loc3[3]; + auto ns = dynamical->neval; + auto ns2 = ns * ns; + auto ns3 = ns * ns * ns; + unsigned int is, js, ks; + double phase3[3]; + int loc3[3]; unsigned int **ind; - unsigned int i, j, k, ielem; - std::complex sum_tmp; + unsigned int i, j; std::complex ret; long int ii; - double inv2pi = 1.0 / (2.0 * pi); - double dnk_represent = static_cast(nk_represent); - - double factor = std::pow(0.5, 2) / static_cast(nk_scph); - static std::complex complex_zero = std::complex(0.0, 0.0); + const auto inv2pi = 1.0 / (2.0 * pi); + const auto dnk_represent = static_cast(nk_represent); + const auto factor = std::pow(0.5, 2) / static_cast(nk_scph); + static auto complex_zero = std::complex(0.0, 0.0); std::complex *v3_array_at_kpair; std::complex ***v3_mpi; @@ -437,25 +709,24 @@ void Scph::compute_V3_array_all(std::complex ***v3_out, memory->allocate(ind, ngroup, 3); memory->allocate(v3_mpi, nk_scph, ns, ns2); - for (ik = mympi->my_rank; ik < nk_scph; ik += mympi->nprocs) { + for (unsigned int ik = mympi->my_rank; ik < nk_scph; ik += mympi->nprocs) { for (is = 0; is < ngroup; ++is) v3_array_at_kpair[is] = complex_zero; - ielem = 0; + unsigned int ielem = 0; for (i = 0; i < ngroup; ++i) { - sum_tmp = std::complex(0.0, 0.0); + std::complex sum_tmp = std::complex(0.0, 0.0); for (j = 0; j < 3; ++j) ind[i][j] = evec_index3[ielem][j]; if (tune_type == 0) { for (j = 0; j < fcs_group[i].size(); ++j) { - phase - = xk_scph[ik][0] * (vec_for_v3[ielem][0][0] - vec_for_v3[ielem][1][0]) + const auto phase = xk_scph[ik][0] * (vec_for_v3[ielem][0][0] - vec_for_v3[ielem][1][0]) + xk_scph[ik][1] * (vec_for_v3[ielem][0][1] - vec_for_v3[ielem][1][1]) + xk_scph[ik][2] * (vec_for_v3[ielem][0][2] - vec_for_v3[ielem][1][2]); - loc = nint(phase * dnk_represent * inv2pi) % nk_represent + nk_represent - 1; + const int loc = nint(phase * dnk_represent * inv2pi) % nk_represent + nk_represent - 1; sum_tmp += fcs_group[i][j] * invmass_for_v3[ielem] * exp_phase[loc]; @@ -503,7 +774,8 @@ void Scph::compute_V3_array_all(std::complex ***v3_out, ret += v3_array_at_kpair[i] * evec_in[0][is][ind[i][0]] - * evec_in[ik][js][ind[i][1]] * std::conj(evec_in[ik][ks][ind[i][2]]); + * evec_in[ik][js][ind[i][1]] + * std::conj(evec_in[ik][ks][ind[i][2]]); } v3_mpi[ik][is][ns * js + ks] = factor * ret; @@ -526,7 +798,8 @@ void Scph::compute_V3_array_all(std::complex ***v3_out, ret += v3_array_at_kpair[i] * evec_in[0][is][ind[i][0]] - * evec_in[ik][js][ind[i][1]] * std::conj(evec_in[ik][ks][ind[i][2]]); + * evec_in[ik][js][ind[i][1]] + * std::conj(evec_in[ik][ks][ind[i][2]]); } v3_mpi[ik][is][ns * js + ks] = factor * ret; @@ -544,7 +817,8 @@ void Scph::compute_V3_array_all(std::complex ***v3_out, ret += v3_array_at_kpair[i] * evec_in[0][is][ind[i][0]] - * evec_in[ik][js][ind[i][1]] * std::conj(evec_in[ik][js][ind[i][2]]); + * evec_in[ik][js][ind[i][1]] + * std::conj(evec_in[ik][js][ind[i][2]]); } v3_mpi[ik][is][(ns + 1) * js] = factor * ret; @@ -565,54 +839,7 @@ void Scph::compute_V3_array_all(std::complex ***v3_out, memory->deallocate(v3_mpi); - bool *is_acoustic; - memory->allocate(is_acoustic, ns); - int nacoustic; - auto threshould = eps12; - - do { - nacoustic = 0; - for (is = 0; is < ns; ++is) { - if (std::abs(eval_harmonic[0][is]) < threshould) { - is_acoustic[is] = true; - ++nacoustic; - } else { - is_acoustic[is] = false; - } - } - if (nacoustic > 3) { - error->exit("compute_V4_array_all", - "Could not assign acoustic modes at Gamma."); - } - threshould *= 2.0; - } while (nacoustic < 3); - - // Set V3 to zeros so as to avoid mixing with gamma acoustic modes - // jk = 0; - for (is = 0; is < ns; ++is) { - for (ks = 0; ks < ns; ++ks) { - for (ls = 0; ls < ns; ++ls) { - if (is_acoustic[ks] || is_acoustic[ls]) { - v3_out[0][is][ns * ks + ls] = complex_zero; - } - } - } - } - - // ik = 0; - for (jk = 0; jk < nk_scph; ++jk) { - for (is = 0; is < ns; ++is) { - if (is_acoustic[is]) { - for (ks = 0; ks < ns; ++ks) { - for (ls = 0; ls < ns; ++ls) { - v3_out[jk][is][ns * ks + ls] = complex_zero; - } - } - } - } - } - - memory->deallocate(is_acoustic); + zerofill_elements_acoustic_at_gamma(omega2_harmonic, v3_out, 3); if (mympi->my_rank == 0) { std::cout << " done !" << std::endl; @@ -620,41 +847,35 @@ void Scph::compute_V3_array_all(std::complex ***v3_out, } } -void Scph::compute_V4_array_all(std::complex ***v4_out, - std::complex ***evec_in, - const bool self_offdiag, - const bool relax) +void Scph::compute_V4_elements_mpi_over_kpoint(std::complex ***v4_out, + std::complex ***evec_in, + const bool self_offdiag, + const bool relax) { // Calculate the matrix elements of quartic terms in reciprocal space. // This is the most expensive part of the SCPH calculation. - int nk2_prod, ik_prod; - unsigned int nk_reduced_scph = kp_irred_scph.size(); - unsigned int nk_reduced_interpolate = kp_irred_interpolate.size(); - unsigned int ns = dynamical->neval; - unsigned int ns2 = ns * ns; - unsigned int ns3 = ns * ns * ns; - unsigned int ns4 = ns * ns * ns * ns; - unsigned int ik, jk, is, js, ks, ls; - unsigned int knum, knum_minus, jk_minus; - unsigned int nsize = fcs_phonon->force_constant_with_cell[2].size(); - double phase, phase3[3]; - int loc, loc3[3]; + const auto nk_reduced_interpolate = kp_irred_interpolate.size(); + const auto ns = dynamical->neval; + const auto ns2 = ns * ns; + const auto ns3 = ns * ns * ns; + const auto ns4 = ns * ns * ns * ns; + unsigned int is, js, ks, ls; + double phase3[3]; + int loc3[3]; unsigned int **ind; - unsigned int i, j, k, ielem; - std::complex sum_tmp; + unsigned int i, j; std::complex ret; long int ii; - double inv2pi = 1.0 / (2.0 * pi); - double dnk_represent = static_cast(nk_represent); - - double factor = std::pow(0.5, 2) / static_cast(nk_scph); - static std::complex complex_zero = std::complex(0.0, 0.0); + const auto inv2pi = 1.0 / (2.0 * pi); + const auto dnk_represent = static_cast(nk_represent); + const auto factor = std::pow(0.5, 2) / static_cast(nk_scph); + static auto complex_zero = std::complex(0.0, 0.0); std::complex *v4_array_at_kpair; std::complex ***v4_mpi; - nk2_prod = nk_reduced_interpolate * nk_scph; + const auto nk2_prod = nk_reduced_interpolate * nk_scph; if (mympi->my_rank == 0) { if (self_offdiag) { @@ -668,35 +889,31 @@ void Scph::compute_V4_array_all(std::complex ***v4_out, memory->allocate(ind, ngroup2, 4); memory->allocate(v4_mpi, nk2_prod, ns2, ns2); - for (ik_prod = mympi->my_rank; ik_prod < nk2_prod; ik_prod += mympi->nprocs) { - ik = ik_prod / nk_scph; - jk = ik_prod % nk_scph; + for (int ik_prod = mympi->my_rank; ik_prod < nk2_prod; ik_prod += mympi->nprocs) { + const auto ik = ik_prod / nk_scph; + const auto jk = ik_prod % nk_scph; - knum = kmap_interpolate_to_scph[kp_irred_interpolate[ik][0].knum]; - - knum_minus = knum_minus_scph[knum]; - jk_minus = knum_minus_scph[jk]; + const unsigned int knum = kmap_interpolate_to_scph[kp_irred_interpolate[ik][0].knum]; for (is = 0; is < ngroup2; ++is) v4_array_at_kpair[is] = complex_zero; - ielem = 0; + unsigned int ielem = 0; for (i = 0; i < ngroup2; ++i) { - sum_tmp = std::complex(0.0, 0.0); + auto sum_tmp = std::complex(0.0, 0.0); for (j = 0; j < 4; ++j) ind[i][j] = evec_index4[ielem][j]; if (tune_type == 0) { for (j = 0; j < fcs_group2[i].size(); ++j) { - phase - = - xk_scph[knum][0] * vec_for_v4[ielem][0][0] + const auto phase = - xk_scph[knum][0] * vec_for_v4[ielem][0][0] - xk_scph[knum][1] * vec_for_v4[ielem][0][1] - xk_scph[knum][2] * vec_for_v4[ielem][0][2] + xk_scph[jk][0] * (vec_for_v4[ielem][1][0] - vec_for_v4[ielem][2][0]) + xk_scph[jk][1] * (vec_for_v4[ielem][1][1] - vec_for_v4[ielem][2][1]) + xk_scph[jk][2] * (vec_for_v4[ielem][1][2] - vec_for_v4[ielem][2][2]); - loc = nint(phase * dnk_represent * inv2pi) % nk_represent + nk_represent - 1; + const auto loc = nint(phase * dnk_represent * inv2pi) % nk_represent + nk_represent - 1; sum_tmp += fcs_group2[i][j] * invmass_for_v4[ielem] * exp_phase[loc]; @@ -747,8 +964,10 @@ void Scph::compute_V4_array_all(std::complex ***v4_out, for (i = 0; i < ngroup2; ++i) { ret += v4_array_at_kpair[i] - * evec_in[knum][is][ind[i][0]] * std::conj(evec_in[knum][js][ind[i][1]]) - * evec_in[jk][ks][ind[i][2]] * std::conj(evec_in[jk][ls][ind[i][3]]); + * evec_in[knum][is][ind[i][0]] + * std::conj(evec_in[knum][js][ind[i][1]]) + * evec_in[jk][ks][ind[i][2]] + * std::conj(evec_in[jk][ls][ind[i][3]]); } v4_mpi[ik_prod][ns * is + js][ns * ks + ls] = factor * ret; @@ -774,8 +993,10 @@ void Scph::compute_V4_array_all(std::complex ***v4_out, for (i = 0; i < ngroup2; ++i) { ret += v4_array_at_kpair[i] - * evec_in[knum][is][ind[i][0]] * std::conj(evec_in[knum][js][ind[i][1]]) - * evec_in[jk][ks][ind[i][2]] * std::conj(evec_in[jk][ls][ind[i][3]]); + * evec_in[knum][is][ind[i][0]] + * std::conj(evec_in[knum][js][ind[i][1]]) + * evec_in[jk][ks][ind[i][2]] + * std::conj(evec_in[jk][ls][ind[i][3]]); } v4_mpi[ik_prod][ns * is + js][ns * ks + ls] = factor * ret; @@ -793,8 +1014,10 @@ void Scph::compute_V4_array_all(std::complex ***v4_out, for (i = 0; i < ngroup2; ++i) { ret += v4_array_at_kpair[i] - * evec_in[knum][is][ind[i][0]] * std::conj(evec_in[knum][is][ind[i][1]]) - * evec_in[jk][js][ind[i][2]] * std::conj(evec_in[jk][js][ind[i][3]]); + * evec_in[knum][is][ind[i][0]] + * std::conj(evec_in[knum][is][ind[i][1]]) + * evec_in[jk][js][ind[i][2]] + * std::conj(evec_in[jk][js][ind[i][3]]); } v4_mpi[ik_prod][(ns + 1) * is][(ns + 1) * js] = factor * ret; @@ -815,59 +1038,9 @@ void Scph::compute_V4_array_all(std::complex ***v4_out, memory->deallocate(v4_mpi); - bool *is_acoustic; - memory->allocate(is_acoustic, ns); - int nacoustic; - auto threshould = eps12; - do { - nacoustic = 0; - for (is = 0; is < ns; ++is) { - if (std::abs(eval_harmonic[0][is]) < threshould) { - is_acoustic[is] = true; - ++nacoustic; - } else { - is_acoustic[is] = false; - } - } - if (nacoustic > 3) { - error->exit("compute_V4_array_all", - "Could not assign acoustic modes at Gamma."); - } - threshould *= 2.0; - } while (nacoustic < 3); - - // Set V4 to zeros so as to avoid mixing with gamma acoustic modes - // jk = 0; - for (ik = 0; ik < nk_reduced_interpolate; ++ik) { - for (is = 0; is < ns; ++is) { - for (js = 0; js < ns; ++js) { - for (ks = 0; ks < ns; ++ks) { - for (ls = 0; ls < ns; ++ls) { - if (is_acoustic[ks] || is_acoustic[ls]) { - v4_out[nk_scph * ik][ns * is + js][ns * ks + ls] = complex_zero; - } - } - } - } - } - } - // ik = 0; - for (jk = 0; jk < nk_scph; ++jk) { - for (is = 0; is < ns; ++is) { - for (js = 0; js < ns; ++js) { - if (is_acoustic[is] || is_acoustic[js]) { - for (ks = 0; ks < ns; ++ks) { - for (ls = 0; ls < ns; ++ls) { - v4_out[jk][ns * is + js][ns * ks + ls] = complex_zero; - } - } - } - } - } - } + zerofill_elements_acoustic_at_gamma(omega2_harmonic, v4_out, 4); - memory->deallocate(is_acoustic); if (mympi->my_rank == 0) { std::cout << " done !" << std::endl; @@ -875,66 +1048,53 @@ void Scph::compute_V4_array_all(std::complex ***v4_out, } } -void Scph::compute_V4_array_all2(std::complex ***v4_out, - std::complex ***evec_in, - const bool self_offdiag) +void Scph::compute_V4_elements_mpi_over_band(std::complex ***v4_out, + std::complex ***evec_in, + const bool self_offdiag) { // Calculate the matrix elements of quartic terms in reciprocal space. // This is the most expensive part of the SCPH calculation. - int nk2_prod, ik_prod; - unsigned int nk_reduced_scph = kp_irred_scph.size(); - unsigned int nk_reduced_interpolate = kp_irred_interpolate.size(); - unsigned int ns = dynamical->neval; - unsigned int ns2 = ns * ns; - unsigned int ns3 = ns * ns * ns; - unsigned int ns4 = ns * ns * ns * ns; + int ik_prod; + auto nk_reduced_interpolate = kp_irred_interpolate.size(); + auto ns = dynamical->neval; + auto ns2 = ns * ns; + auto ns4 = ns * ns * ns * ns; int is, js; - unsigned int ik, jk, ks, ls; - unsigned int knum, knum_minus, jk_minus; - unsigned int nsize = fcs_phonon->force_constant_with_cell[2].size(); - double phase, phase3[3]; - int loc, loc3[3]; + unsigned int knum; + double phase3[3]; + int loc3[3]; unsigned int **ind; - unsigned int i, j, k, ielem; - std::complex sum_tmp; - std::complex ret; - long int ii; - long int icount; - long int nset_tot, nset_each, nres; - long int nstart, nend; + unsigned int i, j; long int *nset_mpi; - int ik_old, ik_now, jk_old, jk_now; - int is_now, js_now, is_prod; - - double inv2pi = 1.0 / (2.0 * pi); - double dnk_represent = static_cast(nk_represent); - - double factor = std::pow(0.5, 2) / static_cast(nk_scph); - static std::complex complex_zero = std::complex(0.0, 0.0); + auto inv2pi = 1.0 / (2.0 * pi); + auto dnk_represent = static_cast(nk_represent); + auto factor = std::pow(0.5, 2) / static_cast(nk_scph); + static auto complex_zero = std::complex(0.0, 0.0); std::complex *v4_array_at_kpair; std::complex ***v4_mpi; std::vector ik_vec, jk_vec, is_vec, js_vec; - nk2_prod = nk_reduced_interpolate * nk_scph; + auto nk2_prod = nk_reduced_interpolate * nk_scph; if (mympi->my_rank == 0) { if (self_offdiag) { std::cout << " IALGO = 1 : Use different algorithm efficient when ns >> nk" << std::endl; std::cout << " SELF_OFFDIAG = 1: Calculating all components of v4_array ... "; } else { - error->exit("compute_V4_array_all2", + error->exit("compute_V4_elements_mpi_over_kpoint", "This function can be used only when SELF_OFFDIAG = 1"); } } memory->allocate(nset_mpi, mympi->nprocs); - nset_tot = nk2_prod * ((ns2 - ns) / 2 + ns); - nset_each = nset_tot / mympi->nprocs; - nres = nset_tot - nset_each * mympi->nprocs; + long int nset_tot = nk2_prod * ((ns2 - ns) / 2 + ns); + long int nset_each = nset_tot / mympi->nprocs; + long int nres = nset_tot - nset_each * mympi->nprocs; + for (i = 0; i < mympi->nprocs; ++i) { nset_mpi[i] = nset_each; if (nres > i) { @@ -943,11 +1103,11 @@ void Scph::compute_V4_array_all2(std::complex ***v4_out, } MPI_Bcast(&nset_mpi[0], mympi->nprocs, MPI_LONG, 0, MPI_COMM_WORLD); - nstart = 0; + long int nstart = 0; for (i = 0; i < mympi->my_rank; ++i) { nstart += nset_mpi[i]; } - nend = nstart + nset_mpi[mympi->my_rank]; + long int nend = nstart + nset_mpi[mympi->my_rank]; nset_each = nset_mpi[mympi->my_rank]; memory->deallocate(nset_mpi); @@ -956,7 +1116,7 @@ void Scph::compute_V4_array_all2(std::complex ***v4_out, is_vec.clear(); js_vec.clear(); - icount = 0; + long int icount = 0; for (ik_prod = 0; ik_prod < nk2_prod; ++ik_prod) { for (is = 0; is < ns; ++is) { for (js = 0; js < ns; ++js) { @@ -987,49 +1147,45 @@ void Scph::compute_V4_array_all2(std::complex ***v4_out, } } - ik_old = -1; - jk_old = -1; + int ik_old = -1; + int jk_old = -1; if (mympi->my_rank == 0) { std::cout << " Total number of sets to compute : " << nset_each << std::endl; } - for (ii = 0; ii < nset_each; ++ii) { + for (long int ii = 0; ii < nset_each; ++ii) { - ik_now = ik_vec[ii]; - jk_now = jk_vec[ii]; - is_now = is_vec[ii]; - js_now = js_vec[ii]; + auto ik_now = ik_vec[ii]; + auto jk_now = jk_vec[ii]; + auto is_now = is_vec[ii]; + auto js_now = js_vec[ii]; - if (!((ik_now == ik_old) && (jk_now == jk_old))) { + if (!(ik_now == ik_old && jk_now == jk_old)) { // Update v4_array_at_kpair and ind knum = kmap_interpolate_to_scph[kp_irred_interpolate[ik_now][0].knum]; - knum_minus = knum_minus_scph[knum]; - jk_minus = knum_minus_scph[jk_now]; - for (is = 0; is < ngroup2; ++is) v4_array_at_kpair[is] = complex_zero; - ielem = 0; + unsigned int ielem = 0; for (i = 0; i < ngroup2; ++i) { - sum_tmp = std::complex(0.0, 0.0); + std::complex sum_tmp = std::complex(0.0, 0.0); for (j = 0; j < 4; ++j) ind[i][j] = evec_index4[ielem][j]; if (tune_type == 0) { for (j = 0; j < fcs_group2[i].size(); ++j) { - phase - = - xk_scph[knum][0] * vec_for_v4[ielem][0][0] + auto phase = - xk_scph[knum][0] * vec_for_v4[ielem][0][0] - xk_scph[knum][1] * vec_for_v4[ielem][0][1] - xk_scph[knum][2] * vec_for_v4[ielem][0][2] + xk_scph[jk_now][0] * (vec_for_v4[ielem][1][0] - vec_for_v4[ielem][2][0]) + xk_scph[jk_now][1] * (vec_for_v4[ielem][1][1] - vec_for_v4[ielem][2][1]) + xk_scph[jk_now][2] * (vec_for_v4[ielem][1][2] - vec_for_v4[ielem][2][2]); - loc = nint(phase * dnk_represent * inv2pi) % nk_represent + nk_represent - 1; + auto loc = nint(phase * dnk_represent * inv2pi) % nk_represent + nk_represent - 1; sum_tmp += fcs_group2[i][j] * invmass_for_v4[ielem] * exp_phase[loc]; @@ -1038,7 +1194,7 @@ void Scph::compute_V4_array_all2(std::complex ***v4_out, } else if (tune_type == 1) { for (j = 0; j < fcs_group2[i].size(); ++j) { - for (k = 0; k < 3; ++k) { + for (unsigned int k = 0; k < 3; ++k) { phase3[k] = - xk_scph[knum][k] * vec_for_v4[ielem][0][k] + xk_scph[jk_now][k] * (vec_for_v4[ielem][1][k] - vec_for_v4[ielem][2][k]); loc3[k] = nint(phase3[k] * dnk[k] * inv2pi) % nk_grid[k] + nk_grid[k] - 1; @@ -1057,21 +1213,23 @@ void Scph::compute_V4_array_all2(std::complex ***v4_out, } ik_prod = ik_now * nk_scph + jk_now; - is_prod = ns * is_now + js_now; + int is_prod = ns * is_now + js_now; -#pragma omp parallel for private (ks, ls, ret, i) +#pragma omp parallel for private (i) for (js = 0; js < ns2; ++js) { - ks = js / ns; - ls = js % ns; + unsigned int ks = js / ns; + unsigned int ls = js % ns; - ret = std::complex(0.0, 0.0); + auto ret = std::complex(0.0, 0.0); for (i = 0; i < ngroup2; ++i) { ret += v4_array_at_kpair[i] - * evec_in[knum][is_now][ind[i][0]] * std::conj(evec_in[knum][js_now][ind[i][1]]) - * evec_in[jk_now][ks][ind[i][2]] * std::conj(evec_in[jk_now][ls][ind[i][3]]); + * evec_in[knum][is_now][ind[i][0]] + * std::conj(evec_in[knum][js_now][ind[i][1]]) + * evec_in[jk_now][ks][ind[i][2]] + * std::conj(evec_in[jk_now][ls][ind[i][3]]); } v4_mpi[ik_prod][is_prod][js] = factor * ret; @@ -1095,15 +1253,41 @@ void Scph::compute_V4_array_all2(std::complex ***v4_out, memory->deallocate(v4_mpi); + zerofill_elements_acoustic_at_gamma(omega2_harmonic, v4_out, 4); + + if (mympi->my_rank == 0) { + std::cout << " done !" << std::endl; + timer->print_elapsed(); + } +} + +void Scph::zerofill_elements_acoustic_at_gamma(double **omega2, + std::complex ***v_elems, + const int fc_order) const +{ + // Set V3 or V4 elements involving acoustic modes at Gamma point + // exactly zero. + + int jk; + int is, js, ks, ls; + const auto ns = dynamical->neval; bool *is_acoustic; memory->allocate(is_acoustic, ns); int nacoustic; - auto threshould = eps12; + auto threshould = 1.0e-24; + const auto nk_reduced_interpolate = kp_irred_interpolate.size(); + static auto complex_zero = std::complex(0.0, 0.0); + + + if (fc_order < 3 && fc_order > 4) { + error->exit("zerofill_elements_acoustic_at_gamma", + "The fc_order must be either 3 or 4."); + } do { nacoustic = 0; for (is = 0; is < ns; ++is) { - if (std::abs(eval_harmonic[0][is]) < threshould) { + if (std::abs(omega2[0][is]) < threshould) { is_acoustic[is] = true; ++nacoustic; } else { @@ -1111,68 +1295,105 @@ void Scph::compute_V4_array_all2(std::complex ***v4_out, } } if (nacoustic > 3) { - error->exit("compute_V4_array_all2", + error->exit("zerofill_elements_acoustic_at_gamma", "Could not assign acoustic modes at Gamma."); } threshould *= 2.0; } while (nacoustic < 3); - // Set V4 to zeros so as to avoid mixing with gamma acoustic modes - // jk = 0; - for (ik = 0; ik < nk_reduced_interpolate; ++ik) { + + if (fc_order == 3) { + + // Set V3 to zeros so as to avoid mixing with gamma acoustic modes + // jk = 0; for (is = 0; is < ns; ++is) { - for (js = 0; js < ns; ++js) { - for (ks = 0; ks < ns; ++ks) { - for (ls = 0; ls < ns; ++ls) { - if (is_acoustic[ks] || is_acoustic[ls]) { - v4_out[nk_scph * ik][ns * is + js][ns * ks + ls] = complex_zero; + for (ks = 0; ks < ns; ++ks) { + for (ls = 0; ls < ns; ++ls) { + if (is_acoustic[ks] || is_acoustic[ls]) { + v_elems[0][is][ns * ks + ls] = complex_zero; + } + } + } + } + + // ik = 0; + for (jk = 0; jk < nk_scph; ++jk) { + for (is = 0; is < ns; ++is) { + if (is_acoustic[is]) { + for (ks = 0; ks < ns; ++ks) { + for (ls = 0; ls < ns; ++ls) { + v_elems[jk][is][ns * ks + ls] = complex_zero; } } } } } - } - // ik = 0; - for (jk = 0; jk < nk_scph; ++jk) { - for (is = 0; is < ns; ++is) { - for (js = 0; js < ns; ++js) { - if (is_acoustic[is] || is_acoustic[js]) { + + } else if (fc_order == 4) { + // Set V4 to zeros so as to avoid mixing with gamma acoustic modes + // jk = 0; + for (int ik = 0; ik < nk_reduced_interpolate; ++ik) { + for (is = 0; is < ns; ++is) { + for (js = 0; js < ns; ++js) { for (ks = 0; ks < ns; ++ks) { for (ls = 0; ls < ns; ++ls) { - v4_out[jk][ns * is + js][ns * ks + ls] = complex_zero; + if (is_acoustic[ks] || is_acoustic[ls]) { + v_elems[nk_scph * ik][ns * is + js][ns * ks + ls] = complex_zero; + } + } + } + } + } + } + // ik = 0; + for (jk = 0; jk < nk_scph; ++jk) { + for (is = 0; is < ns; ++is) { + for (js = 0; js < ns; ++js) { + if (is_acoustic[is] || is_acoustic[js]) { + for (ks = 0; ks < ns; ++ks) { + for (ls = 0; ls < ns; ++ls) { + v_elems[jk][ns * is + js][ns * ks + ls] = complex_zero; + } } } } } } + } memory->deallocate(is_acoustic); - - if (mympi->my_rank == 0) { - std::cout << " done !" << std::endl; - timer->print_elapsed(); - } } + void Scph::setup_kmesh() { unsigned int ik; unsigned int i; - unsigned int ns = dynamical->neval; - int ik_minus, loc; double xtmp[3]; - double norm; - // Set up k points for SCPH equation + // Setup k points for SCPH equation MPI_Bcast(&kmesh_scph[0], 3, MPI_UNSIGNED, 0, MPI_COMM_WORLD); MPI_Bcast(&kmesh_interpolate[0], 3, MPI_UNSIGNED, 0, MPI_COMM_WORLD); + // Set up k points for Fourier interpolation nk_scph = kmesh_scph[0] * kmesh_scph[1] * kmesh_scph[2]; + nk_interpolate = kmesh_interpolate[0] * kmesh_interpolate[1] * kmesh_interpolate[2]; + memory->allocate(xk_scph, nk_scph, 3); + memory->allocate(xk_interpolate, nk_interpolate, 3); memory->allocate(kvec_na_scph, nk_scph, 3); - kpoint->gen_kmesh(true, kmesh_scph, xk_scph, kp_irred_scph); + kpoint->gen_kmesh(true, + kmesh_scph, + xk_scph, + kp_irred_scph); + + kpoint->gen_kmesh(true, + kmesh_interpolate, + xk_interpolate, + kp_irred_interpolate); + for (ik = 0; ik < nk_scph; ++ik) { for (i = 0; i < 3; ++i) { @@ -1184,34 +1405,13 @@ void Scph::setup_kmesh() for (i = 0; i < 3; ++i) xtmp[i] = xk_scph[ik][i]; rotvec(xtmp, xtmp, system->rlavec_p, 'T'); - norm = xtmp[0] * xtmp[0] + xtmp[1] * xtmp[1] + xtmp[2] * xtmp[2]; + const auto norm = xtmp[0] * xtmp[0] + xtmp[1] * xtmp[1] + xtmp[2] * xtmp[2]; if (norm > eps) { for (i = 0; i < 3; ++i) kvec_na_scph[ik][i] = xk_scph[ik][i] / std::sqrt(norm); } } - memory->allocate(knum_minus_scph, nk_scph); - - for (ik = 0; ik < nk_scph; ++ik) { - for (i = 0; i < 3; ++i) xtmp[i] = -xk_scph[ik][i]; - - ik_minus = kpoint->get_knum(xtmp, kmesh_scph); - - if (ik_minus == -1) error->exit("setup_kmesh", "Could not find the k point."); - if (ik_minus < ik) continue; - - knum_minus_scph[ik] = ik_minus; - knum_minus_scph[ik_minus] = ik; - } - - // Set up k points for Fourier interpolation - - nk_interpolate = kmesh_interpolate[0] * kmesh_interpolate[1] * kmesh_interpolate[2]; - memory->allocate(xk_interpolate, nk_interpolate, 3); - kpoint->gen_kmesh(true, kmesh_interpolate, - xk_interpolate, kp_irred_interpolate); - if (mympi->my_rank == 0) { std::cout << " Setting up the SCPH calculations ..." << std::endl << std::endl; std::cout << " Gamma-centered uniform grid with the following mesh density:" << std::endl; @@ -1238,7 +1438,7 @@ void Scph::setup_kmesh() for (ik = 0; ik < nk_interpolate; ++ik) { for (i = 0; i < 3; ++i) xtmp[i] = xk_interpolate[ik][i]; - loc = kpoint->get_knum(xtmp, kmesh_scph); + const auto loc = kpoint->get_knum(xtmp, kmesh_scph); if (loc == -1) error->exit("setup_kmesh", @@ -1250,34 +1450,28 @@ void Scph::setup_kmesh() void Scph::setup_transform_symmetry() { - unsigned int i; + // Construct small_group_at_k, symop_minus_at_k, and + // mat_transport_sym. + unsigned int ik; unsigned int is, js; - unsigned int iat, jat, icrd, jcrd; - unsigned int knum; - unsigned int isym; - unsigned int natmin = system->natmin; - unsigned int ns = dynamical->neval; - double phase; + unsigned int icrd, jcrd; double x1[3], x2[3], k[3], k_minus[3], Sk[3], xtmp[3]; double S_cart[3][3], S_frac[3][3], S_frac_inv[3][3]; double S_recip[3][3]; std::complex im(0.0, 1.0); - int knum_sym, knum_minus; - std::complex **gamma_tmp; - std::complex **dymat, **dymat_sym; - Eigen::MatrixXcd Dymat(ns, ns), Gamma(ns, ns), Dymat2(ns, ns); - Eigen::MatrixXcd Mat(ns, ns); bool *flag; + const auto natmin = system->natmin; + const auto ns = dynamical->neval; + const auto nk_irred_interpolate = kp_irred_interpolate.size(); + memory->allocate(gamma_tmp, ns, ns); - memory->allocate(dymat, ns, ns); - memory->allocate(dymat_sym, ns, ns); - memory->allocate(mat_transform_sym, kp_irred_interpolate.size(), + memory->allocate(mat_transform_sym, nk_irred_interpolate, symmetry->nsym, ns, ns); - memory->allocate(small_group_at_k, kp_irred_interpolate.size()); - memory->allocate(symop_minus_at_k, kp_irred_interpolate.size()); + memory->allocate(small_group_at_k, nk_irred_interpolate); + memory->allocate(symop_minus_at_k, nk_irred_interpolate); memory->allocate(kpoint_map_symmetry, nk_interpolate); memory->allocate(flag, nk_interpolate); @@ -1286,47 +1480,41 @@ void Scph::setup_transform_symmetry() } for (ik = 0; ik < kp_irred_interpolate.size(); ++ik) { - knum = kp_irred_interpolate[ik][0].knum; + small_group_at_k[ik].clear(); + symop_minus_at_k[ik].clear(); + + const auto knum = kp_irred_interpolate[ik][0].knum; for (icrd = 0; icrd < 3; ++icrd) { k[icrd] = xk_interpolate[knum][icrd]; k_minus[icrd] = -k[icrd]; } - knum_minus = kpoint->get_knum(k_minus, kmesh_interpolate); - - dynamical->calc_analytic_k(k, fcs_phonon->fc2_ext, dymat); - - isym = 0; + const auto knum_minus = kpoint->get_knum(k_minus, kmesh_interpolate); - small_group_at_k[ik].clear(); - symop_minus_at_k[ik].clear(); + unsigned int isym = 0; - for (auto it = symmetry->SymmListWithMap.cbegin(); - it != symmetry->SymmListWithMap.cend(); ++it) { + for (const auto &it : symmetry->SymmListWithMap) { for (icrd = 0; icrd < 3; ++icrd) { for (jcrd = 0; jcrd < 3; ++jcrd) { - S_cart[icrd][jcrd] = (*it).rot[3 * icrd + jcrd]; - S_frac[icrd][jcrd] = (*it).rot_real[3 * icrd + jcrd]; - S_recip[icrd][jcrd] = (*it).rot_reciprocal[3 * icrd + jcrd]; + S_cart[icrd][jcrd] = it.rot[3 * icrd + jcrd]; + S_frac[icrd][jcrd] = it.rot_real[3 * icrd + jcrd]; + S_recip[icrd][jcrd] = it.rot_reciprocal[3 * icrd + jcrd]; } } invmat3(S_frac_inv, S_frac); - rotvec(Sk, k, S_recip); - for (i = 0; i < 3; ++i) Sk[i] = Sk[i] - nint(Sk[i]); - knum_sym = kpoint->get_knum(Sk, kmesh_interpolate); + for (auto i = 0; i < 3; ++i) Sk[i] = Sk[i] - nint(Sk[i]); + + const auto knum_sym = kpoint->get_knum(Sk, kmesh_interpolate); if (knum_sym == -1) - error->exit("modify_eigenvectors_sym", + error->exit("setup_transform_symmetry", "kpoint not found"); - if (knum_sym == knum) { - small_group_at_k[ik].push_back(isym); - } - if (knum_sym == knum_minus) { - symop_minus_at_k[ik].push_back(isym); - } + + if (knum_sym == knum) small_group_at_k[ik].push_back(isym); + if (knum_sym == knum_minus) symop_minus_at_k[ik].push_back(isym); if (!flag[knum_sym]) { kpoint_map_symmetry[knum_sym].symmetry_op = isym; @@ -1336,81 +1524,34 @@ void Scph::setup_transform_symmetry() } for (is = 0; is < ns; ++is) { - for (js = 0; js < ns; ++js) { - gamma_tmp[is][js] = std::complex(0.0, 0.0); - } - } - - for (jat = 0; jat < natmin; ++jat) { - iat = (*it).mapping[jat]; - - // Fractional coordinates of x1 and x2 - for (icrd = 0; icrd < 3; ++icrd) { - x1[icrd] = system->xr_p[system->map_p2s[iat][0]][icrd]; - x2[icrd] = system->xr_p[system->map_p2s[jat][0]][icrd]; - } - - rotvec(xtmp, x1, S_frac_inv); - for (icrd = 0; icrd < 3; ++icrd) { - xtmp[icrd] = xtmp[icrd] - x2[icrd]; - } - - phase = 2.0 * pi * (k[0] * xtmp[0] + k[1] * xtmp[1] + k[2] * xtmp[2]); - - for (icrd = 0; icrd < 3; ++icrd) { - for (jcrd = 0; jcrd < 3; ++jcrd) { - gamma_tmp[3 * iat + icrd][3 * jat + jcrd] - = S_cart[icrd][jcrd] * std::exp(im * phase); - } - } - } - -#ifdef _DEBUG - Eigen::MatrixXcd Dymat3(ns,ns); - dynamical->calc_analytic_k(Sk, fcs_phonon->fc2_ext, dymat_sym); - - for (is = 0; is < ns; ++is) { - for (js = 0; js < ns; ++js) { - Dymat(is,js) = dymat[is][js]; - Gamma(is,js) = gamma_tmp[is][js]; - } - } - Dymat2 = Gamma * Dymat * (Gamma.transpose()).conjugate(); - - double diff = 0.0; - for (is = 0; is < ns; ++is) { - for (js = 0; js < ns; ++js) { - diff += std::norm(Dymat2(is,js) - dymat_sym[is][js]); - } - } - std::cout << "DIFF = " << std::sqrt(diff) << std::endl; - if (std::sqrt(diff) > eps12) { - for (is = 0; is < ns; ++is) { - for (js = 0; js < ns; ++js) { - Dymat3(is,js) = dymat_sym[is][js]; - } + for (js = 0; js < ns; ++js) { + gamma_tmp[is][js] = std::complex(0.0, 0.0); } - std::cout << "isym = " << std::setw(4) << isym + 1 << std::endl; - std::cout << " k = "; + } + + for (unsigned int jat = 0; jat < natmin; ++jat) { + const auto iat = it.mapping[jat]; + + // Fractional coordinates of x1 and x2 for (icrd = 0; icrd < 3; ++icrd) { - std::cout << std::setw(15) << k[icrd]; + x1[icrd] = system->xr_p[system->map_p2s[iat][0]][icrd]; + x2[icrd] = system->xr_p[system->map_p2s[jat][0]][icrd]; } - std::cout << std::endl; - std::cout << "Sk = "; + + rotvec(xtmp, x1, S_frac_inv); for (icrd = 0; icrd < 3; ++icrd) { - std::cout << std::setw(15) << Sk[icrd]; + xtmp[icrd] = xtmp[icrd] - x2[icrd]; } - std::cout << std::endl; - std::cout << " D(k):" << std::endl; - std::cout << Dymat << std::endl; - std::cout << " D(Sk) transform : " << std::endl; - std::cout << Dymat2 << std::endl; - std::cout << " D(Sk) exact : " << std::endl; - std::cout << Dymat3 << std::endl; - std::cout << std::endl; + auto phase = 2.0 * pi * (k[0] * xtmp[0] + k[1] * xtmp[1] + k[2] * xtmp[2]); + + for (icrd = 0; icrd < 3; ++icrd) { + for (jcrd = 0; jcrd < 3; ++jcrd) { + gamma_tmp[3 * iat + icrd][3 * jat + jcrd] + = S_cart[icrd][jcrd] * std::exp(im * phase); + } + } } -#endif for (is = 0; is < ns; ++is) { for (js = 0; js < ns; ++js) { @@ -1422,23 +1563,24 @@ void Scph::setup_transform_symmetry() } } - memory->deallocate(dymat); - memory->deallocate(dymat_sym); memory->deallocate(gamma_tmp); + memory->deallocate(flag); } + void Scph::symmetrize_dynamical_matrix(const unsigned int ik, - Eigen::MatrixXcd &dymat) + Eigen::MatrixXcd &dymat) const { + // Symmetrize the dynamical matrix of given index ik. using namespace Eigen; unsigned int i, isym; unsigned int is, js; - unsigned int ns = dynamical->neval; + const auto ns = dynamical->neval; MatrixXcd dymat_sym = MatrixXcd::Zero(ns, ns); MatrixXcd dymat_tmp(ns, ns), gamma(ns, ns); - unsigned int nsym_small = small_group_at_k[ik].size(); - unsigned int nsym_minus = symop_minus_at_k[ik].size(); + const auto nsym_small = small_group_at_k[ik].size(); + const auto nsym_minus = symop_minus_at_k[ik].size(); for (i = 0; i < nsym_minus; ++i) { isym = symop_minus_at_k[ik][i]; @@ -1449,7 +1591,7 @@ void Scph::symmetrize_dynamical_matrix(const unsigned int ik, } } - dymat_tmp = gamma * dymat * (gamma.transpose()).conjugate(); + dymat_tmp = gamma * dymat * gamma.transpose().conjugate(); dymat_sym += dymat_tmp.conjugate(); } @@ -1462,7 +1604,7 @@ void Scph::symmetrize_dynamical_matrix(const unsigned int ik, } } - dymat_tmp = gamma * dymat * (gamma.transpose()).conjugate(); + dymat_tmp = gamma * dymat * gamma.transpose().conjugate(); dymat_sym += dymat_tmp; } @@ -1470,13 +1612,12 @@ void Scph::symmetrize_dynamical_matrix(const unsigned int ik, dymat = dymat_sym / static_cast(nsym_small + nsym_minus); } -void Scph::replicate_dymat_for_all_kpoints(std::complex ***dymat_inout) +void Scph::replicate_dymat_for_all_kpoints(std::complex ***dymat_inout) const { using namespace Eigen; - unsigned int i, isym; + unsigned int i; unsigned int is, js; - unsigned int ik_irred, ik_orig; - unsigned int ns = dynamical->neval; + const auto ns = dynamical->neval; MatrixXcd dymat_tmp(ns, ns), gamma(ns, ns), dymat(ns, ns); std::complex ***dymat_all; @@ -1485,9 +1626,9 @@ void Scph::replicate_dymat_for_all_kpoints(std::complex ***dymat_inout) for (i = 0; i < nk_interpolate; ++i) { - ik_irred = kpoint_map_symmetry[i].knum_irred_orig; - ik_orig = kpoint_map_symmetry[i].knum_orig; - isym = kpoint_map_symmetry[i].symmetry_op; + const auto ik_irred = kpoint_map_symmetry[i].knum_irred_orig; + const auto ik_orig = kpoint_map_symmetry[i].knum_orig; + const auto isym = kpoint_map_symmetry[i].symmetry_op; for (is = 0; is < ns; ++is) { for (js = 0; js < ns; ++js) { @@ -1495,7 +1636,7 @@ void Scph::replicate_dymat_for_all_kpoints(std::complex ***dymat_inout) dymat(is, js) = dymat_inout[is][js][ik_orig]; } } - dymat_tmp = gamma * dymat * (gamma.transpose()).conjugate(); + dymat_tmp = gamma * dymat * gamma.transpose().conjugate(); for (is = 0; is < ns; ++is) { for (js = 0; js < ns; ++js) { @@ -1516,34 +1657,24 @@ void Scph::replicate_dymat_for_all_kpoints(std::complex ***dymat_inout) void Scph::setup_eigvecs() { - int ik; - unsigned int is; - unsigned int nk = kpoint->nk; - unsigned int ns = dynamical->neval; + const auto ns = dynamical->neval; if (mympi->my_rank == 0) { std::cout << std::endl << " Diagonalizing dynamical matrices for all k points ... "; } - memory->allocate(eval_harmonic, nk_scph, ns); memory->allocate(evec_harmonic, nk_scph, ns, ns); memory->allocate(omega2_harmonic, nk_scph, ns); // Calculate phonon eigenvalues and eigenvectors for all k-points for scph -#pragma omp parallel for private (is) - for (ik = 0; ik < nk_scph; ++ik) { +#pragma omp parallel for + for (int ik = 0; ik < nk_scph; ++ik) { dynamical->eval_k(xk_scph[ik], kvec_na_scph[ik], - fcs_phonon->fc2_ext, eval_harmonic[ik], + fcs_phonon->fc2_ext, omega2_harmonic[ik], evec_harmonic[ik], true); - - // Phonon energy is the square-root of the eigenvalue - for (is = 0; is < ns; ++is) { - omega2_harmonic[ik][is] = eval_harmonic[ik][is]; - eval_harmonic[ik][is] = dynamical->freq(eval_harmonic[ik][is]); - } } if (mympi->my_rank == 0) { @@ -1553,9 +1684,7 @@ void Scph::setup_eigvecs() void Scph::setup_pp_interaction() { - unsigned int nk = nk_scph; - unsigned int ns = dynamical->neval; - unsigned int nks = ns * nk; + // Prepare information for calculating ph-ph interaction coefficients. unsigned int i, j; double *invsqrt_mass_p; @@ -1568,7 +1697,7 @@ void Scph::setup_pp_interaction() } } - if (relaxation->quartic_mode != 1) { + if (anharmonic_core->quartic_mode != 1) { error->exit("setup_pp_interaction", "quartic_mode should be 1 for SCPH"); } @@ -1585,8 +1714,8 @@ void Scph::setup_pp_interaction() std::sort(fcs_phonon->force_constant_with_cell[1].begin(), fcs_phonon->force_constant_with_cell[1].end()); - relaxation->prepare_group_of_force_constants(fcs_phonon->force_constant_with_cell[1], 3, - ngroup, fcs_group); + anharmonic_core->prepare_group_of_force_constants(fcs_phonon->force_constant_with_cell[1], 3, + ngroup, fcs_group); memory->allocate(vec_for_v3, fcs_phonon->force_constant_with_cell[1].size(), 2, 3); memory->allocate(invmass_for_v3, fcs_phonon->force_constant_with_cell[1].size()); @@ -1594,17 +1723,16 @@ void Scph::setup_pp_interaction() j = 0; - for (auto it = fcs_phonon->force_constant_with_cell[1].cbegin(); - it != fcs_phonon->force_constant_with_cell[1].cend(); ++it) { + for (const auto &it : fcs_phonon->force_constant_with_cell[1]) { invmass_for_v3[j] - = invsqrt_mass_p[(*it).pairs[0].index / 3] - * invsqrt_mass_p[(*it).pairs[1].index / 3] - * invsqrt_mass_p[(*it).pairs[2].index / 3]; + = invsqrt_mass_p[it.pairs[0].index / 3] + * invsqrt_mass_p[it.pairs[1].index / 3] + * invsqrt_mass_p[it.pairs[2].index / 3]; ++j; } - relaxation->prepare_relative_vector(fcs_phonon->force_constant_with_cell[1], - 3, vec_for_v3); + anharmonic_core->prepare_relative_vector(fcs_phonon->force_constant_with_cell[1], + 3, vec_for_v3); for (i = 0; i < fcs_phonon->force_constant_with_cell[1].size(); ++i) { for (j = 0; j < 3; ++j) { @@ -1618,8 +1746,8 @@ void Scph::setup_pp_interaction() std::sort(fcs_phonon->force_constant_with_cell[2].begin(), fcs_phonon->force_constant_with_cell[2].end()); - relaxation->prepare_group_of_force_constants(fcs_phonon->force_constant_with_cell[2], 4, - ngroup2, fcs_group2); + anharmonic_core->prepare_group_of_force_constants(fcs_phonon->force_constant_with_cell[2], 4, + ngroup2, fcs_group2); memory->allocate(vec_for_v4, fcs_phonon->force_constant_with_cell[2].size(), 3, 3); memory->allocate(invmass_for_v4, fcs_phonon->force_constant_with_cell[2].size()); @@ -1627,18 +1755,17 @@ void Scph::setup_pp_interaction() j = 0; - for (auto it = fcs_phonon->force_constant_with_cell[2].cbegin(); - it != fcs_phonon->force_constant_with_cell[2].cend(); ++it) { + for (const auto &it : fcs_phonon->force_constant_with_cell[2]) { invmass_for_v4[j] - = invsqrt_mass_p[(*it).pairs[0].index / 3] - * invsqrt_mass_p[(*it).pairs[1].index / 3] - * invsqrt_mass_p[(*it).pairs[2].index / 3] - * invsqrt_mass_p[(*it).pairs[3].index / 3]; + = invsqrt_mass_p[it.pairs[0].index / 3] + * invsqrt_mass_p[it.pairs[1].index / 3] + * invsqrt_mass_p[it.pairs[2].index / 3] + * invsqrt_mass_p[it.pairs[3].index / 3]; ++j; } - relaxation->prepare_relative_vector(fcs_phonon->force_constant_with_cell[2], - 4, vec_for_v4); + anharmonic_core->prepare_relative_vector(fcs_phonon->force_constant_with_cell[2], + 4, vec_for_v4); for (i = 0; i < fcs_phonon->force_constant_with_cell[2].size(); ++i) { for (j = 0; j < 4; ++j) { @@ -1688,15 +1815,13 @@ void Scph::setup_pp_interaction() tune_type = 1; } - int ii, jj, kk; + int ii; if (tune_type == 0) { - double phase; - memory->allocate(exp_phase, 2 * nk_represent - 1); for (ii = 0; ii < 2 * nk_represent - 1; ++ii) { - phase = 2.0 * pi * static_cast(ii - nk_represent + 1) + const auto phase = 2.0 * pi * static_cast(ii - nk_represent + 1) / static_cast(nk_represent); exp_phase[ii] = std::exp(im * phase); } @@ -1709,9 +1834,9 @@ void Scph::setup_pp_interaction() for (ii = 0; ii < 2 * nk_grid[0] - 1; ++ii) { phase[0] = 2.0 * pi * static_cast(ii - nk_grid[0] + 1) / dnk[0]; - for (jj = 0; jj < 2 * nk_grid[1] - 1; ++jj) { + for (int jj = 0; jj < 2 * nk_grid[1] - 1; ++jj) { phase[1] = 2.0 * pi * static_cast(jj - nk_grid[1] + 1) / dnk[1]; - for (kk = 0; kk < 2 * nk_grid[2] - 1; ++kk) { + for (int kk = 0; kk < 2 * nk_grid[2] - 1; ++kk) { phase[2] = 2.0 * pi * static_cast(kk - nk_grid[2] + 1) / dnk[2]; exp_phase3[ii][jj][kk] = std::exp(im * (phase[0] + phase[1] + phase[2])); } @@ -1726,34 +1851,32 @@ void Scph::setup_pp_interaction() void Scph::setup_transform_ifc() { + // Compute mindist_list_scph necessary to calculate dynamical matrix + // from the real-space force constants + int i, j; int ix, iy, iz; - int nkx, nky, nkz; - unsigned int nk = nk_interpolate; - unsigned int nat = system->natmin; - unsigned int ns = dynamical->neval; - unsigned int iat, jat; - unsigned int icell; - unsigned int nat_ext = nat * nk; - unsigned int ncell, ncell_s; + const auto nk = nk_interpolate; + const auto nat = system->natmin; + unsigned int iat; int **shift_cell, **shift_cell_super; double **xf_p; double ****x_all; - nkx = kmesh_interpolate[0]; - nky = kmesh_interpolate[1]; - nkz = kmesh_interpolate[2]; + const int nkx = kmesh_interpolate[0]; + const int nky = kmesh_interpolate[1]; + const int nkz = kmesh_interpolate[2]; - ncell = nk; - ncell_s = 27; + const auto ncell = nk; + const auto ncell_s = 27; memory->allocate(shift_cell, ncell, 3); memory->allocate(shift_cell_super, ncell_s, 3); memory->allocate(xf_p, nat, 3); memory->allocate(x_all, ncell_s, ncell, nat, 3); - icell = 0; + unsigned int icell = 0; for (ix = 0; ix < nkx; ++ix) { for (iy = 0; iy < nky; ++iy) { for (iz = 0; iz < nkz; ++iz) { @@ -1804,25 +1927,25 @@ void Scph::setup_transform_ifc() } } - double dist, dist_min; + double dist; std::vector dist_tmp; - ShiftCell shift_tmp; + ShiftCell shift_tmp{}; std::vector vec_tmp; memory->allocate(mindist_list_scph, nat, nat, ncell); for (iat = 0; iat < nat; ++iat) { - for (jat = 0; jat < nat; ++jat) { + for (unsigned int jat = 0; jat < nat; ++jat) { for (icell = 0; icell < ncell; ++icell) { dist_tmp.clear(); for (i = 0; i < ncell_s; ++i) { dist = distance(x_all[0][0][iat], x_all[i][icell][jat]); - dist_tmp.push_back(DistList(i, dist)); + dist_tmp.emplace_back(i, dist); } std::sort(dist_tmp.begin(), dist_tmp.end()); - dist_min = dist_tmp[0].dist; + const auto dist_min = dist_tmp[0].dist; mindist_list_scph[iat][jat][icell].dist = dist_min; for (i = 0; i < ncell_s; ++i) { @@ -1852,59 +1975,24 @@ void Scph::setup_transform_ifc() } -void Scph::finish_scph() -{ - memory->deallocate(xk_scph); - memory->deallocate(kvec_na_scph); - memory->deallocate(knum_minus_scph); - memory->deallocate(xk_interpolate); - memory->deallocate(kmap_interpolate_to_scph); - memory->deallocate(mindist_list_scph); - - memory->deallocate(eval_harmonic); - memory->deallocate(evec_harmonic); - memory->deallocate(omega2_harmonic); - - memory->deallocate(vec_for_v4); - memory->deallocate(invmass_for_v4); - memory->deallocate(evec_index4); - - memory->deallocate(mat_transform_sym); - memory->deallocate(small_group_at_k); - memory->deallocate(symop_minus_at_k); - memory->deallocate(kpoint_map_symmetry); - - if (relax_coordinate) { - memory->deallocate(vec_for_v3); - memory->deallocate(invmass_for_v3); - memory->deallocate(evec_index3); - } - - if (tune_type == 0) { - memory->deallocate(exp_phase); - } else if (tune_type == 1) { - memory->deallocate(exp_phase3); - } -} - -void Scph::exec_interpolation(std::complex ***dymat_r, +void Scph::exec_interpolation(const unsigned int kmesh_orig[3], + std::complex ***dymat_r, + const unsigned int nk_dense, + double **xk_dense, + double **kvec_dense, double **eval_out, std::complex ***evec_out) { - unsigned int i, j, ik, is; - unsigned int ns = dynamical->neval; - unsigned int nk = nk_interpolate; - unsigned int nk1 = kmesh_interpolate[0]; - unsigned int nk2 = kmesh_interpolate[1]; - unsigned int nk3 = kmesh_interpolate[2]; - unsigned int nk_ref = kpoint->nk; - - double eval_tmp; - double *eval_real; + unsigned int i, j, is; + const auto ns = dynamical->neval; + const auto nk1 = kmesh_orig[0]; + const auto nk2 = kmesh_orig[1]; + const auto nk3 = kmesh_orig[2]; + double *eval_real; std::complex **mat_tmp; std::complex **mat_harmonic, **mat_harmonic_na; - std::vector eval_vec; + std::vector eval_vec(ns); memory->allocate(mat_tmp, ns, ns); memory->allocate(eval_real, ns); @@ -1914,89 +2002,19 @@ void Scph::exec_interpolation(std::complex ***dymat_r, memory->allocate(mat_harmonic_na, ns, ns); } - for (ik = 0; ik < nk_ref; ++ik) { - dynamical->calc_analytic_k(kpoint->xk[ik], fcs_phonon->fc2_ext, mat_harmonic); - r2q(kpoint->xk[ik], nk, nk1, nk2, nk3, ns, dymat_r, mat_tmp); - - for (i = 0; i < ns; ++i) { - for (j = 0; j < ns; ++j) { - mat_tmp[i][j] += mat_harmonic[i][j]; - } - } - - if (dynamical->nonanalytic) { - - if (dynamical->nonanalytic == 1) { - dynamical->calc_nonanalytic_k(kpoint->xk[ik], kpoint->kvec_na[ik], - mat_harmonic_na); - } else if (dynamical->nonanalytic == 2) { - dynamical->calc_nonanalytic_k2(kpoint->xk[ik], kpoint->kvec_na[ik], - fcs_phonon->fc2_ext, mat_harmonic_na); - } - - for (i = 0; i < ns; ++i) { - for (j = 0; j < ns; ++j) { - mat_tmp[i][j] += mat_harmonic_na[i][j]; - } - } - } - - diagonalize_interpolated_matrix(mat_tmp, eval_real, evec_out[ik], true); + for (int ik = 0; ik < nk_dense; ++ik) { - eval_vec.clear(); - - for (is = 0; is < ns; ++is) { - eval_tmp = eval_real[is]; - - if (eval_tmp < 0.0) { - eval_vec.push_back(-std::sqrt(-eval_tmp)); - } else { - eval_vec.push_back(std::sqrt(eval_tmp)); - } + if (dynamical->nonanalytic == 3) { + dynamical->calc_analytic_k(xk_dense[ik], + ewald->fc2_without_dipole, + mat_harmonic); + } else { + dynamical->calc_analytic_k(xk_dense[ik], + fcs_phonon->fc2_ext, + mat_harmonic); } - for (is = 0; is < ns; ++is) eval_out[ik][is] = eval_vec[is]; - - } - - memory->deallocate(eval_real); - memory->deallocate(mat_tmp); - memory->deallocate(mat_harmonic); - - if (dynamical->nonanalytic) { - memory->deallocate(mat_harmonic_na); - } -} - -void Scph::exec_interpolation2(std::complex ***dymat_r, - double **eval_out, - std::complex ***evec_out) -{ - unsigned int i, j, ik, is; - unsigned int ns = dynamical->neval; - unsigned int nk = nk_interpolate; - unsigned int nk1 = kmesh_interpolate[0]; - unsigned int nk2 = kmesh_interpolate[1]; - unsigned int nk3 = kmesh_interpolate[2]; - unsigned int nk_ref = scph->nk_scph; - - double eval_tmp; - double *eval_real; - - std::complex **mat_tmp; - std::complex **mat_harmonic, **mat_harmonic_na; - std::vector eval_vec; - - memory->allocate(mat_tmp, ns, ns); - memory->allocate(eval_real, ns); - memory->allocate(mat_harmonic, ns, ns); - if (dynamical->nonanalytic) { - memory->allocate(mat_harmonic_na, ns, ns); - } - - for (ik = 0; ik < nk_ref; ++ik) { - dynamical->calc_analytic_k(xk_scph[ik], fcs_phonon->fc2_ext, mat_harmonic); - r2q(xk_scph[ik], nk, nk1, nk2, nk3, ns, dymat_r, mat_tmp); + r2q(xk_dense[ik], nk1, nk2, nk3, ns, dymat_r, mat_tmp); for (i = 0; i < ns; ++i) { for (j = 0; j < ns; ++j) { @@ -2007,11 +2025,18 @@ void Scph::exec_interpolation2(std::complex ***dymat_r, if (dynamical->nonanalytic) { if (dynamical->nonanalytic == 1) { - dynamical->calc_nonanalytic_k(scph->xk_scph[ik], scph->kvec_na_scph[ik], + dynamical->calc_nonanalytic_k(xk_dense[ik], + kvec_dense[ik], mat_harmonic_na); } else if (dynamical->nonanalytic == 2) { - dynamical->calc_nonanalytic_k2(scph->xk_scph[ik], scph->kvec_na_scph[ik], - fcs_phonon->fc2_ext, mat_harmonic_na); + dynamical->calc_nonanalytic_k2(xk_dense[ik], + kvec_dense[ik], + mat_harmonic_na); + + } else if (dynamical->nonanalytic == 3) { + ewald->add_longrange_matrix(xk_dense[ik], + kvec_dense[ik], + mat_harmonic_na); } for (i = 0; i < ns; ++i) { @@ -2020,16 +2045,16 @@ void Scph::exec_interpolation2(std::complex ***dymat_r, } } } + diagonalize_interpolated_matrix(mat_tmp, eval_real, evec_out[ik], true); - eval_vec.clear(); for (is = 0; is < ns; ++is) { - eval_tmp = eval_real[is]; + const auto eval_tmp = eval_real[is]; if (eval_tmp < 0.0) { - eval_vec.push_back(-std::sqrt(-eval_tmp)); + eval_vec[is] = -std::sqrt(-eval_tmp); } else { - eval_vec.push_back(std::sqrt(eval_tmp)); + eval_vec[is] = std::sqrt(eval_tmp); } } @@ -2046,46 +2071,40 @@ void Scph::exec_interpolation2(std::complex ***dymat_r, } } -void Scph::r2q(double *xk_in, - unsigned int nk, - unsigned int nx, - unsigned int ny, - unsigned int nz, - unsigned int ns, + +void Scph::r2q(const double *xk_in, + const unsigned int nx, + const unsigned int ny, + const unsigned int nz, + const unsigned int ns, std::complex ***dymat_r_in, - std::complex **dymat_k_out) + std::complex **dymat_k_out) const { - unsigned int icell, ncell; - unsigned int i, j; - double phase; - unsigned int iat, jat; std::complex im(0.0, 1.0); - std::complex exp_phase; - ncell = nx * ny * nz; + const auto ncell = nx * ny * nz; - for (i = 0; i < ns; ++i) { + for (unsigned int i = 0; i < ns; ++i) { - iat = i / 3; + const auto iat = i / 3; - for (j = 0; j < ns; ++j) { + for (unsigned int j = 0; j < ns; ++j) { - jat = j / 3; + const auto jat = j / 3; dymat_k_out[i][j] = std::complex(0.0, 0.0); - for (icell = 0; icell < ncell; ++icell) { + for (unsigned int icell = 0; icell < ncell; ++icell) { - exp_phase = std::complex(0.0, 0.0); + auto exp_phase = std::complex(0.0, 0.0); // This operation is necessary for the Hermiticity of the dynamical matrix. - for (auto it = mindist_list_scph[iat][jat][icell].shift.cbegin(); - it != mindist_list_scph[iat][jat][icell].shift.cend(); ++it) { + for (const auto &it : mindist_list_scph[iat][jat][icell].shift) { - phase = 2.0 * pi - * (static_cast((*it).sx) * xk_in[0] - + static_cast((*it).sy) * xk_in[1] - + static_cast((*it).sz) * xk_in[2]); + auto phase = 2.0 * pi + * (static_cast(it.sx) * xk_in[0] + + static_cast(it.sy) * xk_in[1] + + static_cast(it.sz) * xk_in[2]); exp_phase += std::exp(im * phase); } @@ -2102,18 +2121,18 @@ void Scph::r2q(double *xk_in, void Scph::diagonalize_interpolated_matrix(std::complex **mat_in, double *eval_out, std::complex **evec_out, - const bool require_evec) + const bool require_evec) const { - unsigned int i, j, k; - char JOBZ, UPLO; - int INFO, LWORK; + unsigned int i, j; + char JOBZ; + int INFO; double *RWORK; std::complex *amat; std::complex *WORK; int ns = dynamical->neval; - LWORK = (2 * ns - 1) * 10; + int LWORK = (2 * ns - 1) * 10; memory->allocate(RWORK, 3 * ns - 2); memory->allocate(WORK, LWORK); @@ -2124,11 +2143,11 @@ void Scph::diagonalize_interpolated_matrix(std::complex **mat_in, JOBZ = 'N'; } - UPLO = 'U'; + char UPLO = 'U'; memory->allocate(amat, ns * ns); - k = 0; + unsigned int k = 0; for (j = 0; j < ns; ++j) { for (i = 0; i < ns; ++i) { amat[k++] = mat_in[i][j]; @@ -2156,26 +2175,24 @@ void Scph::diagonalize_interpolated_matrix(std::complex **mat_in, void Scph::find_degeneracy(std::vector *degeneracy_out, const unsigned int nk_irred, - std::vector> kp_info, - double **eval) + const std::vector> &kp_info, + double **eval) const { - unsigned int ik, is; - unsigned int knum; - unsigned int ns = dynamical->neval; - double omega_prev, omega_now; - int ideg; - double tol_omega = 1.0e-5; + // eval is omega^2 in atomic unit + + const auto ns = dynamical->neval; + const auto tol_omega = 1.0e-10; - for (ik = 0; ik < nk_irred; ++ik) { - knum = kp_info[ik][0].knum; + for (unsigned int ik = 0; ik < nk_irred; ++ik) { + const auto knum = kp_info[ik][0].knum; degeneracy_out[ik].clear(); - omega_prev = eval[knum][0]; - ideg = 1; + auto omega_prev = eval[knum][0]; + auto ideg = 1; - for (is = 1; is < ns; ++is) { - omega_now = eval[knum][is]; + for (unsigned int is = 1; is < ns; ++is) { + const auto omega_now = eval[knum][is]; if (std::abs(omega_now - omega_prev) < tol_omega) { ++ideg; @@ -2196,18 +2213,16 @@ void Scph::calc_new_dymat_with_evec(std::complex ***dymat_out, { std::complex *polarization_matrix, *mat_tmp; std::complex *eigval_matrix, *dmat; - std::complex alpha, *beta; + std::complex *beta; std::complex ***dymat_q, **dymat_harmonic; std::complex im(0.0, 1.0); unsigned int ik, is, js; - int knum; int ns = dynamical->neval; - unsigned int ns2 = ns * ns; - unsigned int m; + const unsigned int ns2 = ns * ns; - alpha = std::complex(1.0, 0.0); + auto alpha = std::complex(1.0, 0.0); char TRANSA[] = "N"; char TRANSB[] = "C"; @@ -2224,13 +2239,13 @@ void Scph::calc_new_dymat_with_evec(std::complex ***dymat_out, for (ik = 0; ik < nk_interpolate; ++ik) { - knum = kmap_interpolate_to_scph[ik]; + const auto knum = kmap_interpolate_to_scph[ik]; // create eigval matrix for (is = 0; is < ns2; ++is) eigval_matrix[is] = std::complex(0.0, 0.0); - m = 0; + unsigned int m = 0; for (is = 0; is < ns; ++is) { for (js = 0; js < ns; ++js) { if (is == js) { @@ -2266,7 +2281,8 @@ void Scph::calc_new_dymat_with_evec(std::complex ***dymat_out, // Subtract harmonic contribution - dynamical->calc_analytic_k(xk_interpolate[ik], fcs_phonon->fc2_ext, + dynamical->calc_analytic_k(xk_interpolate[ik], + fcs_phonon->fc2_ext, dymat_harmonic); for (is = 0; is < ns; ++is) { @@ -2283,34 +2299,13 @@ void Scph::calc_new_dymat_with_evec(std::complex ***dymat_out, memory->deallocate(dmat); memory->deallocate(dymat_harmonic); - unsigned int nk1 = kmesh_interpolate[0]; - unsigned int nk2 = kmesh_interpolate[1]; - unsigned int nk3 = kmesh_interpolate[2]; - unsigned int i, j; - - - /* - fftw_plan plan; - - for (i = 0; i < ns; ++i) { - for (j = 0; j < ns; ++j) { - plan = fftw_plan_dft_3d(nk1, nk2, nk3, reinterpret_cast(dymat_q[i][j]), - reinterpret_cast(dymat_out[i][j]), FFTW_FORWARD, FFTW_ESTIMATE); - fftw_execute(plan); - fftw_destroy_plan(plan); - - for (ik = 0; ik < nk_interpolate; ++ik) dymat_out[i][j][ik] /= static_cast(nk_interpolate); - } - } - */ - + const auto nk1 = kmesh_interpolate[0]; + const auto nk2 = kmesh_interpolate[1]; + const auto nk3 = kmesh_interpolate[2]; - double phase; - int icell, nmulti; - std::complex cexp_phase; std::vector> xk_dup; - icell = 0; + int icell = 0; for (int ix = 0; ix < nk1; ++ix) { for (int iy = 0; iy < nk2; ++iy) { @@ -2326,13 +2321,13 @@ void Scph::calc_new_dymat_with_evec(std::complex ***dymat_out, duplicate_xk_boundary(xk_interpolate[ik], xk_dup); - cexp_phase = std::complex(0.0, 0.0); + auto cexp_phase = std::complex(0.0, 0.0); - for (i = 0; i < xk_dup.size(); ++i) { + for (const auto &i : xk_dup) { - phase = 2.0 * pi * (xk_dup[i][0] * static_cast(ix) - + xk_dup[i][1] * static_cast(iy) - + xk_dup[i][2] * static_cast(iz)); + auto phase = 2.0 * pi * (i[0] * static_cast(ix) + + i[1] * static_cast(iy) + + i[2] * static_cast(iz)); cexp_phase += std::exp(-im * phase); } @@ -2379,37 +2374,32 @@ void Scph::compute_anharmonic_frequency(std::complex ***v4_array_all, int ik, jk; unsigned int i; - unsigned int is, js, ks, ls; + unsigned int is, js, ks; unsigned int kk; - unsigned int nk = nk_scph; - unsigned int ns = dynamical->neval; + const auto nk = nk_scph; + const auto ns = dynamical->neval; unsigned int knum, knum_interpolate; - unsigned int nk_irred_interpolate = kp_irred_interpolate.size(); - unsigned int nk1 = kmesh_interpolate[0]; - unsigned int nk2 = kmesh_interpolate[1]; - unsigned int nk3 = kmesh_interpolate[2]; - int icount; + const auto nk_irred_interpolate = kp_irred_interpolate.size(); + const auto nk1 = kmesh_interpolate[0]; + const auto nk2 = kmesh_interpolate[1]; + const auto nk3 = kmesh_interpolate[2]; int iloop; - MatrixXd mat_evec(ns, ns); MatrixXd omega_now(nk, ns), omega_old(nk, ns); - MatrixXd omega2_harmonic(nk, ns); + MatrixXd omega2_HA(nk, ns); MatrixXcd mat_tmp(ns, ns), evec_tmp(ns, ns); - VectorXd eval_tmp(ns), eval_orig(ns); - MatrixXcd Dymat(ns, ns), Dymat_sym(ns, ns); + VectorXd eval_tmp(ns); + MatrixXcd Dymat(ns, ns); MatrixXcd Fmat(ns, ns); MatrixXcd Qmat = MatrixXcd::Zero(ns, ns); MatrixXcd Cmat(ns, ns), Dmat(ns, ns); - double omega_tmp, diff; - double omega1, n1; + double diff; double conv_tol = tolerance_scph; - double T_in; double alpha = mixalpha; double **eval_interpolate; - double omega2_tmp; double re_tmp, im_tmp; bool has_negative; @@ -2423,8 +2413,8 @@ void Scph::compute_anharmonic_frequency(std::complex ***v4_array_all, std::complex ***dymat_q; std::complex ***Fmat0; - static std::complex complex_one = std::complex(1.0, 0.0); - static std::complex complex_zero = std::complex(0.0, 0.0); + const auto complex_one = std::complex(1.0, 0.0); + const auto complex_zero = std::complex(0.0, 0.0); SelfAdjointEigenSolver saes; @@ -2439,7 +2429,7 @@ void Scph::compute_anharmonic_frequency(std::complex ***v4_array_all, memory->allocate(dymat_harmonic, nk_interpolate, ns, ns); memory->allocate(Fmat0, nk_irred_interpolate, ns, ns); - T_in = temp; + const auto T_in = temp; std::cout << " Temperature = " << T_in << " K" << std::endl; @@ -2447,7 +2437,6 @@ void Scph::compute_anharmonic_frequency(std::complex ***v4_array_all, for (ik = 0; ik < nk; ++ik) { for (is = 0; is < ns; ++is) { - omega_tmp = eval_harmonic[ik][is]; // This is harmonic frequency if (flag_converged) { if (omega2_out[ik][is] < 0.0 && std::abs(omega2_out[ik][is]) > 1.0e-16) { @@ -2460,14 +2449,14 @@ void Scph::compute_anharmonic_frequency(std::complex ***v4_array_all, omega_now(ik, is) = std::sqrt(omega2_out[ik][is]); } } else { - omega_now(ik, is) = std::abs(omega_tmp); + if (omega2_harmonic[ik][is] < 0.0) { + omega_now(ik, is) = std::sqrt(-omega2_harmonic[ik][is]); + } else { + omega_now(ik, is) = std::sqrt(omega2_harmonic[ik][is]); + } } - if (omega_tmp < 0.0) { - omega2_harmonic(ik, is) = -std::pow(omega_tmp, 2.0); - } else { - omega2_harmonic(ik, is) = std::pow(omega_tmp, 2.0); - } + omega2_HA(ik, is) = omega2_harmonic[ik][is]; for (js = 0; js < ns; ++js) { evec_initial[ik][is][js] = evec_harmonic[ik][is][js]; @@ -2494,8 +2483,8 @@ void Scph::compute_anharmonic_frequency(std::complex ***v4_array_all, for (js = 0; js < ns; ++js) { mat_omega2_harmonic[ik][is][js] = complex_zero; } - mat_omega2_harmonic[ik][is][is] = std::complex(omega2_harmonic(knum, is), 0.0); - eval_interpolate[knum][is] = omega2_harmonic(knum, is); + mat_omega2_harmonic[ik][is][is] = std::complex(omega2_HA(knum, is), 0.0); + eval_interpolate[knum][is] = omega2_HA(knum, is); } dynamical->calc_analytic_k(xk_interpolate[ik], fcs_phonon->fc2_ext, @@ -2518,23 +2507,24 @@ void Scph::compute_anharmonic_frequency(std::complex ***v4_array_all, } } - icount = 0; + int icount = 0; // Main loop for (iloop = 0; iloop < maxiter; ++iloop) { for (ik = 0; ik < nk; ++ik) { for (is = 0; is < ns; ++is) { - omega1 = omega_now(ik, is); + auto omega1 = omega_now(ik, is); if (std::abs(omega1) < eps8) { Qmat(is, is) = complex_zero; } else { // Note that the missing factor 2 in the denominator of Qmat is // already considered in the v4_array_all. if (thermodynamics->classical) { - Qmat(is, is) = std::complex(2.0 * T_in * thermodynamics->T_to_Ryd / (omega1 * omega1), 0.0); + Qmat(is, is) = std::complex(2.0 * T_in * thermodynamics->T_to_Ryd / (omega1 * omega1), + 0.0); } else { - n1 = thermodynamics->fB(omega1, T_in); + auto n1 = thermodynamics->fB(omega1, T_in); Qmat(is, is) = std::complex((2.0 * n1 + 1.0) / omega1, 0.0); } } @@ -2590,13 +2580,14 @@ void Scph::compute_anharmonic_frequency(std::complex ***v4_array_all, re_tmp = 0.0; im_tmp = 0.0; -#pragma omp parallel for private(jk,kk,ks,ls), reduction(+:re_tmp, im_tmp) +#pragma omp parallel for private(jk,kk,ks), reduction(+:re_tmp, im_tmp) for (jk = 0; jk < nk; ++jk) { kk = nk * ik + jk; for (ks = 0; ks < ns; ++ks) { - ctmp = v4_array_all[kk][i][(ns + 1) * ks] * dmat_convert[jk][ks][ks]; + ctmp = v4_array_all[kk][i][(ns + 1) * ks] + * dmat_convert[jk][ks][ks]; re_tmp += ctmp.real(); im_tmp += ctmp.imag(); } @@ -2615,14 +2606,15 @@ void Scph::compute_anharmonic_frequency(std::complex ***v4_array_all, re_tmp = 0.0; im_tmp = 0.0; -#pragma omp parallel for private(jk,kk,ks,ls), reduction(+:re_tmp, im_tmp) +#pragma omp parallel for private(jk,kk,ks), reduction(+:re_tmp, im_tmp) for (jk = 0; jk < nk; ++jk) { kk = nk * ik + jk; for (ks = 0; ks < ns; ++ks) { - for (ls = 0; ls < ns; ++ls) { - ctmp = v4_array_all[kk][i][ns * ks + ls] * dmat_convert[jk][ks][ls]; + for (unsigned int ls = 0; ls < ns; ++ls) { + ctmp = v4_array_all[kk][i][ns * ks + ls] + * dmat_convert[jk][ks][ls]; re_tmp += ctmp.real(); im_tmp += ctmp.imag(); } @@ -2639,7 +2631,7 @@ void Scph::compute_anharmonic_frequency(std::complex ***v4_array_all, for (is = 0; is < ns; ++is) { - omega2_tmp = eval_tmp(is); + double omega2_tmp = eval_tmp(is); if (omega2_tmp < 0.0 && std::abs(omega2_tmp) > 1.0e-16) { @@ -2756,15 +2748,12 @@ void Scph::compute_anharmonic_frequency(std::complex ***v4_array_all, } } - // Inverse Fourier transform of delta Dymat. - fftw_plan plan; - for (is = 0; is < ns; ++is) { for (js = 0; js < ns; ++js) { - plan = fftw_plan_dft_3d(nk1, nk2, nk3, - reinterpret_cast(dymat_q[is][js]), - reinterpret_cast(dymat_new[is][js]), - FFTW_FORWARD, FFTW_ESTIMATE); + fftw_plan plan = fftw_plan_dft_3d(nk1, nk2, nk3, + reinterpret_cast(dymat_q[is][js]), + reinterpret_cast(dymat_new[is][js]), + FFTW_FORWARD, FFTW_ESTIMATE); fftw_execute(plan); fftw_destroy_plan(plan); @@ -2773,20 +2762,12 @@ void Scph::compute_anharmonic_frequency(std::complex ***v4_array_all, } } - exec_interpolation2(dymat_new, eval_interpolate, evec_new); - -#ifdef _DEBUG - for (ik = 0; ik < nk; ++ik) { - std::cout << " ik = " << std::setw(4) << ik + 1 << " : "; - for (i = 0; i < 3; ++i) std::cout << std::setw(15) << xk_scph[ik][i]; - std::cout << std::endl; - for (is = 0; is < ns; ++is) { - std::cout << std::setw(15) << eval_harmonic[ik][is]; - std::cout << std::setw(15) << eval_interpolate[ik][is]; - std::cout << std::setw(15) << eval_harmonic[ik][is] - eval_interpolate[ik][is] << std::endl; - } - } -#endif + exec_interpolation(kmesh_interpolate, + dymat_new, + nk, + xk_scph, + kvec_na_scph, + eval_interpolate, evec_new); for (ik = 0; ik < nk; ++ik) { @@ -2849,9 +2830,8 @@ void Scph::compute_anharmonic_frequency(std::complex ***v4_array_all, if (!has_negative) { std::cout << " DIFF < SCPH_TOL : break SCPH loop" << std::endl; break; - } else { - std::cout << " DIFF < SCPH_TOL but a negative frequency is detected." << std::endl; } + std::cout << " DIFF < SCPH_TOL but a negative frequency is detected." << std::endl; } } @@ -2916,317 +2896,78 @@ void Scph::compute_anharmonic_frequency(std::complex ***v4_array_all, } -void Scph::write_scph_energy(double ***eval) -{ - unsigned int ik, is; - unsigned int iT; - unsigned int nk = kpoint->nk; - unsigned int ns = dynamical->neval; - double Tmin = system->Tmin; - double Tmax = system->Tmax; - double dT = system->dT; - double temp; - unsigned int NT = static_cast((Tmax - Tmin) / dT) + 1; - - std::ofstream ofs_energy; - std::string file_energy = input->job_title + ".scph_eval"; - - ofs_energy.open(file_energy.c_str(), std::ios::out); - if (!ofs_energy) error->exit("write_scph_energy", "cannot open file_energy"); - - ofs_energy << "# K point, mode, Temperature [K], Eigenvalues [cm^-1]" << std::endl; - - - for (ik = 0; ik < nk; ++ik) { - for (is = 0; is < ns; ++is) { - for (iT = 0; iT < NT; ++iT) { - temp = Tmin + static_cast(iT) * dT; - - ofs_energy << std::setw(5) << ik + 1; - ofs_energy << std::setw(5) << is + 1; - ofs_energy << std::setw(8) << temp; - ofs_energy << std::setw(15) << writes->in_kayser(eval[iT][ik][is]); - ofs_energy << std::endl; - } - ofs_energy << std::endl; - } - ofs_energy << std::endl; - } - - ofs_energy.close(); -} - -void Scph::write_scph_bands(double ***eval) +void Scph::compute_free_energy_bubble_SCPH(const unsigned int kmesh[3], + std::complex ****delta_dymat_scph) { - std::ofstream ofs_bands; - std::string file_bands = input->job_title + ".scph_bands"; - - ofs_bands.open(file_bands.c_str(), std::ios::out); - if (!ofs_bands) error->exit("write_scph_bands", "cannot open file_bands"); - - unsigned int i, j; - unsigned int nk = kpoint->nk; - - double *kaxis = kpoint->kaxis; - double temp; - unsigned int iT; - double Tmin = system->Tmin; - double Tmax = system->Tmax; - double dT = system->dT; - unsigned int NT = static_cast((Tmax - Tmin) / dT) + 1; - unsigned int ns = dynamical->neval; - int kcount = 0; - - std::string str_tmp = "NONE"; - std::string str_kpath = ""; - std::string str_kval = ""; - - for (i = 0; i < kpoint->kpInp.size(); ++i) { - if (str_tmp != kpoint->kpInp[i].kpelem[0]) { - str_tmp = kpoint->kpInp[i].kpelem[0]; - str_kpath += " " + str_tmp; - - std::ostringstream ss; - ss << std::fixed << std::setprecision(6) << kpoint->kaxis[kcount]; - str_kval += " " + ss.str(); - } - kcount += std::atoi(kpoint->kpInp[i].kpelem[8].c_str()); - - if (str_tmp != kpoint->kpInp[i].kpelem[4]) { - str_tmp = kpoint->kpInp[i].kpelem[4]; - str_kpath += " " + str_tmp; + const auto NT = static_cast((system->Tmax - system->Tmin) / system->dT) + 1; + const auto nk_ref = kpoint->nk; + const auto ns = dynamical->neval; + double ***eval; + std::complex ****evec; - std::ostringstream ss; - ss << std::fixed << std::setprecision(6) << kpoint->kaxis[kcount - 1]; - str_kval += " " + ss.str(); - } - } + if (mympi->my_rank == 0) { + std::cout << std::endl; + std::cout << " -----------------------------------------------------------------" + << std::endl; + std::cout << " Calculating the vibrational free energy from the Bubble diagram " << std::endl; + std::cout << " on top of the SCPH calculation." << std::endl; + std::cout << '\n'; + std::cout << " This calculation requires allocation of additional memory:" << std::endl; - ofs_bands << "# " << str_kpath << std::endl; - ofs_bands << "#" << str_kval << std::endl; - ofs_bands << "# Temperature [K], k-axis, Eigenvalues [cm^-1]" << std::endl; + size_t nsize = nk_ref * ns * ns * NT * sizeof(std::complex) + + nk_ref * ns * NT * sizeof(double); - for (iT = 0; iT < NT; ++iT) { - temp = Tmin + static_cast(iT) * dT; + const auto nsize_dble = static_cast(nsize) / 100000000.0; + std::cout << " Estimated memory usage per MPI process: " << std::setw(10) + << std::fixed << std::setprecision(4) << nsize_dble << " GByte." << std::endl; - for (i = 0; i < nk; ++i) { - ofs_bands << std::setw(15) << std::fixed << temp; - ofs_bands << std::setw(15) << std::fixed << kaxis[i]; - for (j = 0; j < ns; ++j) { - ofs_bands << std::setw(15) << std::scientific << writes->in_kayser(eval[iT][i][j]); - } - ofs_bands << std::endl; - } - ofs_bands << std::endl; + std::cout << " To avoid possible faults associated with insufficient memory,\n" + " please reduce the number of MPI processes per node and/or\n" + " the number of temperagure grids.\n\n"; } - ofs_bands.close(); - - std::cout << " " << std::setw(input->job_title.length() + 12) << std::left << file_bands; - std::cout << " : SCPH band structure" << std::endl; -} - -void Scph::write_scph_dos(double ***eval) -{ - unsigned int iT; - unsigned int j; - unsigned int nk = kpoint->nk; - unsigned int ns = dynamical->neval; - double Tmin = system->Tmin; - double Tmax = system->Tmax; - double dT = system->dT; - unsigned int NT = static_cast((Tmax - Tmin) / dT) + 1; - - double **dos_scph; - - memory->allocate(dos_scph, NT, dos->n_energy); - dos->calc_dos_scph(eval, dos_scph); + memory->allocate(thermodynamics->FE_bubble, NT); + memory->allocate(eval, NT, nk_ref, ns); + memory->allocate(evec, NT, nk_ref, ns, ns); // This requires lots of RAM - std::ofstream ofs_dos; - std::string file_dos = input->job_title + ".scph_dos"; + for (auto iT = 0; iT < NT; ++iT) { + const auto temp = system->Tmin + system->dT * float(iT); - ofs_dos.open(file_dos.c_str(), std::ios::out); - if (!ofs_dos) error->exit("write_scph_dos", "cannot open file_dos"); - - ofs_dos << "# "; - - for (iT = 0; iT < NT; ++iT) { - ofs_dos << std::setw(15) << Tmin + static_cast(iT) * dT; - } - ofs_dos << std::endl; - - for (j = 0; j < dos->n_energy; ++j) { - ofs_dos << std::setw(15) << dos->energy_dos[j]; - - for (iT = 0; iT < NT; ++iT) { - ofs_dos << std::setw(15) << dos_scph[iT][j]; - } - ofs_dos << std::endl; + exec_interpolation(kmesh, + delta_dymat_scph[iT], + nk_ref, + kpoint->xk, + kpoint->kvec_na, + eval[iT], + evec[iT]); } - ofs_dos << std::endl; - - ofs_dos.close(); + thermodynamics->compute_FE_bubble_SCPH(eval, evec, thermodynamics->FE_bubble); - memory->deallocate(dos_scph); -} - -void Scph::write_scph_thermodynamics(double ***eval) -{ - // This function is incorrect. Don't use it. - int i; - unsigned int iT; - unsigned int ik, is; - unsigned int nk = kpoint->nk; - unsigned int ns = dynamical->neval; - double Tmin = system->Tmin; - double Tmax = system->Tmax; - double dT = system->dT; - unsigned int NT = static_cast((Tmax - Tmin) / dT) + 1; - double temp; - double tmp1, tmp2, tmp3, tmp4; - double omega, x; - double T_to_Ryd = thermodynamics->T_to_Ryd; - - int N = nk * ns; - - std::ofstream ofs_thermo; - std::string file_thermo = input->job_title + ".scph_thermo"; - ofs_thermo.open(file_thermo.c_str(), std::ios::out); - if (!ofs_thermo) - error->exit("write_scph_thermodynamics", - "cannot open file_thermo"); - ofs_thermo << "# Temperature [K], Heat capacity / kB, Entropy / kB, Internal energy [Ry], Free energy [Ry]" << std::endl; - - for (iT = 0; iT < NT; ++iT) { - - temp = Tmin + static_cast(iT) * dT; - - tmp1 = 0.0; - tmp2 = 0.0; - tmp3 = 0.0; - tmp4 = 0.0; - -#pragma omp parallel for private(ik, is, omega, x), reduction(+:tmp1,tmp2,tmp3,tmp4) - for (i = 0; i < N; ++i) { - ik = i / ns; - is = i % ns; - omega = eval[iT][ik][is]; - - if (omega <= eps8) continue; - - tmp1 += thermodynamics->Cv(omega, temp); - tmp3 += omega * thermodynamics->coth_T(omega, temp); - - if (std::abs(temp) < eps) { - tmp4 += 0.5 * omega; - } else { - x = omega / (temp * T_to_Ryd); - tmp2 += std::log(1.0 - std::exp(-x)) - x / (std::exp(x) - 1.0); - tmp4 += 0.5 * x + std::log(1.0 - std::exp(-x)); - } - } - - tmp1 /= static_cast(nk); - tmp2 *= 0.5 / static_cast(nk); - tmp3 *= -k_Boltzmann / static_cast(nk); - if (std::abs(temp) < eps) { - tmp4 /= static_cast(nk); - } else { - tmp4 *= temp * T_to_Ryd / static_cast(nk); - } + memory->deallocate(eval); + memory->deallocate(evec); - ofs_thermo << std::setw(16) << std::fixed << temp; - ofs_thermo << std::setw(18) << std::scientific << tmp1 / k_Boltzmann; - ofs_thermo << std::setw(18) << tmp2 / k_Boltzmann; - ofs_thermo << std::setw(18) << tmp3; - ofs_thermo << std::setw(18) << tmp4 << std::endl; + if (mympi->my_rank == 0) { + std::cout << " done!" << std::endl << std::endl; } - - ofs_thermo.close(); } -void Scph::write_scph_msd(double ***eval, - std::complex ****evec) -{ - unsigned int i, iT; - unsigned int ik, is; - unsigned int nk = kpoint->nk; - unsigned int ns = dynamical->neval; - double Tmin = system->Tmin; - double Tmax = system->Tmax; - double dT = system->dT; - unsigned int NT = static_cast((Tmax - Tmin) / dT) + 1; - double *Cv; - double temp; - double tmp; - double omega; - double **msd; - - memory->allocate(Cv, NT); - memory->allocate(msd, NT, ns); - - for (iT = 0; iT < NT; ++iT) { - - temp = Tmin + static_cast(iT) * dT; - - for (i = 0; i < ns; ++i) { - tmp = 0.0; - - for (ik = 0; ik < nk; ++ik) { - for (is = 0; is < ns; ++is) { - omega = eval[iT][ik][is]; - - if (omega < eps8) continue; - if (thermodynamics->classical) { - tmp += std::norm(evec[iT][ik][is][i]) - * thermodynamics->fC(omega, temp) / omega; - } else { - tmp += std::norm(evec[iT][ik][is][i]) - * (thermodynamics->fB(omega, temp) + 0.5) / omega; - } - } - } - msd[iT][i] = tmp * std::pow(Bohr_in_Angstrom, 2.0) - / (static_cast(nk) * system->mass[system->map_p2s[i / 3][0]]); - } - } - - std::ofstream ofs_msd; - std::string file_msd = input->job_title + ".scph_msd"; - ofs_msd.open(file_msd.c_str(), std::ios::out); - if (!ofs_msd) error->exit("write_scph_msd", "cannot open file_thermo"); - ofs_msd << "# Mean Square Displacements at a function of temperature." << std::endl; - ofs_msd << "# Temperature [K], <(u_{1}^{x})^{2}>, <(u_{1}^{y})^{2}>, <(u_{1}^{z})^{2}>, .... [Angstrom^2]" << std::endl; - - for (iT = 0; iT < NT; ++iT) { - temp = Tmin + static_cast(iT) * dT; - - ofs_msd << std::setw(15) << temp; - for (i = 0; i < ns; ++i) { - ofs_msd << std::setw(15) << msd[iT][i]; - } - ofs_msd << std::endl; - } - - ofs_msd.close(); - - memory->deallocate(msd); -} -double Scph::distance(double *x1, double *x2) +double Scph::distance(double *x1, + double *x2) const { - double dist; - dist = std::pow(x1[0] - x2[0], 2) + std::pow(x1[1] - x2[1], 2) + std::pow(x1[2] - x2[2], 2); + auto dist = std::pow(x1[0] - x2[0], 2) + + std::pow(x1[1] - x2[1], 2) + + std::pow(x1[2] - x2[2], 2); dist = std::sqrt(dist); return dist; } void Scph::duplicate_xk_boundary(double *xk_in, - std::vector> &vec_xk) + std::vector> &vec_xk) const { - int i, j, k, l; + int i; int n[3]; double sign[3]; std::vector vec_tmp; @@ -3243,13 +2984,13 @@ void Scph::duplicate_xk_boundary(double *xk_in, for (i = 0; i < n[0]; ++i) { sign[0] = 1.0 - 2.0 * static_cast(i); - for (j = 0; j < n[1]; ++j) { + for (int j = 0; j < n[1]; ++j) { sign[1] = 1.0 - 2.0 * static_cast(j); - for (k = 0; k < n[2]; ++k) { + for (int k = 0; k < n[2]; ++k) { sign[2] = 1.0 - 2.0 * static_cast(k); vec_tmp.clear(); - for (l = 0; l < 3; ++l) { + for (int l = 0; l < 3; ++l) { vec_tmp.push_back(sign[l] * xk_in[l]); } vec_xk.push_back(vec_tmp); @@ -3263,28 +3004,23 @@ void Scph::write_anharmonic_correction_fc2(std::complex ****delta_dymat, const unsigned int NT) { unsigned int i, j; - unsigned int iT; - double Tmin = system->Tmin; - double Tmax = system->Tmax; - double dT = system->dT; - double temp; + const auto Tmin = system->Tmin; + const auto dT = system->dT; double ***delta_fc2; double **xtmp; - unsigned int ncell; - unsigned int ns = dynamical->neval; + const auto ns = dynamical->neval; unsigned int is, js, icell; - unsigned int iat, jat, icrd, jcrd; - unsigned int nmulti; + unsigned int iat, jat; std::ofstream ofs_fc2; - std::string file_fc2 = input->job_title + ".scph_fc2_correction"; + auto file_fc2 = input->job_title + ".scph_dfc2"; ofs_fc2.open(file_fc2.c_str(), std::ios::out); if (!ofs_fc2) error->exit("write_anharmonic_correction_fc2", "Cannot open file_fc2"); - ncell = kmesh_interpolate[0] * kmesh_interpolate[1] * kmesh_interpolate[2]; + const auto ncell = kmesh_interpolate[0] * kmesh_interpolate[1] * kmesh_interpolate[2]; memory->allocate(delta_fc2, ns, ns, ncell); @@ -3300,7 +3036,7 @@ void Scph::write_anharmonic_correction_fc2(std::complex ****delta_dymat, for (i = 0; i < 3; ++i) { for (j = 0; j < 3; ++j) { - ofs_fc2 << std::setw(15) << system->lavec_p[j][i]; + ofs_fc2 << std::setw(20) << system->lavec_p[j][i]; } ofs_fc2 << std::endl; } @@ -3319,8 +3055,8 @@ void Scph::write_anharmonic_correction_fc2(std::complex ****delta_dymat, memory->deallocate(xtmp); - for (iT = 0; iT < NT; ++iT) { - temp = Tmin + dT * static_cast(iT); + for (unsigned int iT = 0; iT < NT; ++iT) { + const auto temp = Tmin + dT * static_cast(iT); ofs_fc2 << "# Temp = " << temp << std::endl; @@ -3345,13 +3081,13 @@ void Scph::write_anharmonic_correction_fc2(std::complex ****delta_dymat, for (is = 0; is < ns; ++is) { iat = is / 3; - icrd = is % 3; + const auto icrd = is % 3; for (js = 0; js < ns; ++js) { jat = js / 3; - jcrd = js % 3; + const auto jcrd = js % 3; - nmulti = mindist_list_scph[iat][jat][icell].shift.size(); + const auto nmulti = mindist_list_scph[iat][jat][icell].shift.size(); for (auto it = mindist_list_scph[iat][jat][icell].shift.cbegin(); it != mindist_list_scph[iat][jat][icell].shift.cend(); ++it) { @@ -3376,52 +3112,56 @@ void Scph::write_anharmonic_correction_fc2(std::complex ****delta_dymat, memory->deallocate(delta_fc2); ofs_fc2.close(); + std::cout << " " << std::setw(input->job_title.length() + 12) << std::left << file_fc2; + std::cout << " : Anharmonic corrections to the second-order IFCs" << std::endl; } void Scph::mpi_bcast_complex(std::complex ****data, const int NT, const int nk, - const int ns) + const int ns) const { #ifdef MPI_COMPLEX16 MPI_Bcast(&data[0][0][0][0], NT * nk * ns * ns, MPI_COMPLEX16, 0, MPI_COMM_WORLD); +#elif defined MPI_DOUBLE_COMPLEX + MPI_Bcast(&data[0][0][0][0], NT * nk * ns * ns, MPI_DOUBLE_COMPLEX, 0, MPI_COMM_WORLD); #else - unsigned int i, iT, ik, is, js; - double ****data_real, ****data_imag; + unsigned int iT, ik, is, js; + double ***data_real, ***data_imag; - memory->allocate(data_real, NT, ns, ns, nk); - memory->allocate(data_imag, NT, ns, ns, nk); + memory->allocate(data_real, ns, ns, nk); + memory->allocate(data_imag, ns, ns, nk); - if (mympi->my_rank == 0) { - for (iT = 0; iT < NT; ++iT) { + for (iT = 0; iT < NT; ++iT) { + + if (mympi->my_rank == 0) { for (is = 0; is < ns; ++is) { for (js = 0; js < ns; ++js) { for (ik = 0; ik < nk; ++ik) { - data_real[iT][is][js][ik] = data[iT][is][js][ik].real(); - data_imag[iT][is][js][ik] = data[iT][is][js][ik].imag(); + data_real[is][js][ik] = data[iT][is][js][ik].real(); + data_imag[is][js][ik] = data[iT][is][js][ik].imag(); } } } } - } - MPI_Bcast(&data_real[0][0][0][0], NT * nk * ns * ns, MPI_DOUBLE, 0, MPI_COMM_WORLD); - MPI_Bcast(&data_imag[0][0][0][0], NT * nk * ns * ns, MPI_DOUBLE, 0, MPI_COMM_WORLD); + MPI_Bcast(&data_real[0][0][0], nk * ns * ns, MPI_DOUBLE, 0, MPI_COMM_WORLD); + MPI_Bcast(&data_imag[0][0][0], nk * ns * ns, MPI_DOUBLE, 0, MPI_COMM_WORLD); - if (mympi->my_rank > 0) { - for (iT = 0; iT < NT; ++iT) { - for (is = 0; is < ns; ++is) { - for (js = 0; js < ns; ++js) { - for (ik = 0; ik < nk; ++ik) { - data[iT][is][js][ik] - = std::complex(data_real[iT][is][js][ik], - data_imag[iT][is][js][ik]); + if (mympi->my_rank > 0) { + for (iT = 0; iT < NT; ++iT) { + for (is = 0; is < ns; ++is) { + for (js = 0; js < ns; ++js) { + for (ik = 0; ik < nk; ++ik) { + data[iT][is][js][ik] + = std::complex(data_real[is][js][ik], + data_imag[is][js][ik]); + } } } } } - } memory->deallocate(data_real); diff --git a/anphon/scph.h b/anphon/scph.h index 4c10979d..55f8bc04 100644 --- a/anphon/scph.h +++ b/anphon/scph.h @@ -25,18 +25,15 @@ namespace PHON_NS DistList(); - DistList(const unsigned int cell_s_, const double dist_) + DistList(const unsigned int cell_s_, + const double dist_) : cell_s(cell_s_), dist(dist_) {}; + + bool operator<(const DistList &obj) const { - cell_s = cell_s_; - dist = dist_; + return dist < obj.dist; } }; - inline bool operator<(const DistList a, const DistList b) - { - return a.dist < b.dist; - } - struct ShiftCell { public: @@ -63,6 +60,7 @@ namespace PHON_NS public: Scph(class PHON *phon); + ~Scph(); unsigned int kmesh_scph[3]; @@ -81,7 +79,6 @@ namespace PHON_NS void exec_scph(); void setup_scph(); - void finish_scph(); double mixalpha; unsigned int maxiter; @@ -91,105 +88,147 @@ namespace PHON_NS private: + // Information of kmesh for SCPH calculation unsigned int nk_scph; unsigned int nk_interpolate; + int *kmap_interpolate_to_scph; + // Information for calculating the ph-ph interaction coefficients double ***vec_for_v3, *invmass_for_v3; double ***vec_for_v4, *invmass_for_v4; int **evec_index3; int **evec_index4; - int *kmap_interpolate_to_scph; - - double **eval_harmonic; - std::complex ***evec_harmonic; - std::complex ****delta_dymat_scph; - - std::complex im; - std::complex ***V4_inner; int ngroup, ngroup2; std::vector *fcs_group; std::vector *fcs_group2; - unsigned int *knum_minus_scph; - double ***eval_anharmonic; - double **omega2_harmonic; - std::complex ****mat_transform_sym; - std::vector *small_group_at_k; - std::vector *symop_minus_at_k; - KpointSymmetry *kpoint_map_symmetry; - std::complex *exp_phase, ***exp_phase3; int nk_grid[3]; int nk_represent; unsigned int tune_type; double dnk[3]; + + // Information of harmonic dynamical matrix + std::complex im; + double **omega2_harmonic; + std::complex ***evec_harmonic; MinimumDistList ***mindist_list_scph; + // Local variables for handling symmetry of dynamical matrix + std::complex ****mat_transform_sym; + std::vector *small_group_at_k; + std::vector *symop_minus_at_k; + KpointSymmetry *kpoint_map_symmetry; + + + void set_default_variables(); + void deallocate_variables(); + void setup_kmesh(); void setup_eigvecs(); void setup_pp_interaction(); void setup_transform_ifc(); void setup_transform_symmetry(); - void write_scph_energy(double ***); - void write_scph_bands(double ***); - void write_scph_dos(double ***); - void write_scph_thermodynamics(double ***); - void write_scph_msd(double ***, std::complex ****); + void load_scph_dymat_from_file(std::complex ****); void store_scph_dymat_to_file(std::complex ****); void exec_scph_main(std::complex ****); - void compute_V4_array_all(std::complex ***, - std::complex ***, const bool, const bool); - - void compute_V4_array_all2(std::complex ***, - std::complex ***, const bool); + void postprocess(std::complex ****delta_dymat_scph); - void compute_V3_array_all(std::complex ***, - std::complex ***, const bool); - - void calc_new_dymat_with_evec(std::complex ***, - double **, std::complex ***); + void compute_V4_elements_mpi_over_kpoint(std::complex ***, + std::complex ***, + bool, + bool); - void compute_anharmonic_frequency(std::complex ***, double **, - std::complex ***, const double, - std::vector *, bool &, std::complex ***, - const bool); + void compute_V4_elements_mpi_over_band(std::complex ***, + std::complex ***, + bool); - void exec_interpolation(std::complex ***, - double **, std::complex ***); - void exec_interpolation2(std::complex ***, - double **, std::complex ***); + void compute_V3_elements_mpi_over_kpoint(std::complex ***, + std::complex ***, + bool); - void r2q(double *, const unsigned int, const unsigned int, - const unsigned int, const unsigned int, const unsigned int, - std::complex ***, std::complex **); + void zerofill_elements_acoustic_at_gamma(double **, + std::complex ***, + const int) const; - void diagonalize_interpolated_matrix(std::complex **, double *, - std::complex **, const bool); + void calc_new_dymat_with_evec(std::complex ***, + double **, + std::complex ***); + + void compute_anharmonic_frequency(std::complex ***, + double **, + std::complex ***, + double, + std::vector *, + bool &, + std::complex ***, + bool); + + void exec_interpolation(const unsigned int [3], + std::complex ***, + unsigned int, + double **, + double **, + double **, + std::complex ***); + + void r2q(const double *, + unsigned int, + unsigned int, + unsigned int, + unsigned int, + std::complex ***, + std::complex **) const; + + void diagonalize_interpolated_matrix(std::complex **, + double *, + std::complex **, + bool) const; + + void find_degeneracy(std::vector *, + unsigned int, + const std::vector> &, + double **) const; + + double distance(double *, + double *) const; + + void symmetrize_dynamical_matrix(unsigned int, + Eigen::MatrixXcd &) const; + + void replicate_dymat_for_all_kpoints(std::complex ***) const; + + void duplicate_xk_boundary(double *, + std::vector> &) const; + + void write_anharmonic_correction_fc2(std::complex ****, + unsigned int); - void find_degeneracy(std::vector *, const unsigned int, - std::vector>, double **); + void mpi_bcast_complex(std::complex ****, + int, + int, + int) const; - double distance(double *, double *); - void symmetrize_dynamical_matrix(const unsigned int, Eigen::MatrixXcd &); - void replicate_dymat_for_all_kpoints(std::complex ***); - void duplicate_xk_boundary(double *, std::vector> &); - void write_anharmonic_correction_fc2(std::complex ****, const unsigned int); - void mpi_bcast_complex(std::complex ****, - const int, const int, const int); + void compute_free_energy_bubble_SCPH(const unsigned int [3], + std::complex ****); }; - extern "C" - { - void zgemm_(const char *transa, const char *transb, int *m, int *n, - int *k, std::complex *alpha, std::complex *a, int *lda, - std::complex *b, int *ldb, std::complex *beta, - std::complex *c, int *ldc); - - void zgeev_(const char *jobvl, const char *jobvr, int *n, std::complex *a, int *lda, - std::complex *w, std::complex *vl, int *ldvl, std::complex *vr, int *ldvr, - std::complex *work, int *lwork, double *rwork, int *info); + extern "C" { + void zgemm_(const char *transa, + const char *transb, + int *m, + int *n, + int *k, + std::complex *alpha, + std::complex *a, + int *lda, + std::complex *b, + int *ldb, + std::complex *beta, + std::complex *c, + int *ldc); } } diff --git a/anphon/selfenergy.cpp b/anphon/selfenergy.cpp index b1cf66a1..8b5a84b9 100644 --- a/anphon/selfenergy.cpp +++ b/anphon/selfenergy.cpp @@ -11,7 +11,7 @@ #include "mpi_common.h" #include "selfenergy.h" #include "constants.h" -#include "relaxation.h" +#include "anharmonic_core.h" #include "dynamical.h" #include "kpoint.h" #include "memory.h" @@ -26,9 +26,7 @@ Selfenergy::Selfenergy(PHON *phon): Pointers(phon) im = std::complex(0.0, 1.0); } -Selfenergy::~Selfenergy() -{ -} +Selfenergy::~Selfenergy() {} void Selfenergy::setup_selfenergy() { @@ -40,7 +38,7 @@ void Selfenergy::setup_selfenergy() void Selfenergy::mpi_reduce_complex(unsigned int N, std::complex *in_mpi, - std::complex *out) + std::complex *out) const { #ifdef MPI_COMPLEX16 MPI_Reduce(&in_mpi[0], &out[0], N, MPI_COMPLEX16, MPI_SUM, 0, MPI_COMM_WORLD); @@ -76,19 +74,13 @@ void Selfenergy::selfenergy_tadpole(const unsigned int N, const double omega, const unsigned int knum, const unsigned int snum, - std::complex *ret) + std::complex *ret) const { unsigned int i; - unsigned int ik2; - unsigned int is1, is2; unsigned int arr_cubic1[3], arr_cubic2[3]; - std::complex v3_tmp1, v3_tmp2; std::complex *ret_mpi, *ret_tmp; - double T_tmp; double n2; - double omega1, omega2; - double factor; arr_cubic1[0] = ns * kpoint->knum_minus[knum] + snum; arr_cubic1[1] = ns * knum + snum; @@ -98,29 +90,29 @@ void Selfenergy::selfenergy_tadpole(const unsigned int N, for (i = 0; i < N; ++i) ret[i] = std::complex(0.0, 0.0); - for (is1 = 0; is1 < ns; ++is1) { + for (unsigned int is1 = 0; is1 < ns; ++is1) { arr_cubic1[2] = is1; arr_cubic2[0] = is1; - omega1 = dynamical->eval_phonon[0][is1]; + double omega1 = dynamical->eval_phonon[0][is1]; if (omega1 < eps8) continue; - v3_tmp1 = relaxation->V3(arr_cubic1); + std::complex v3_tmp1 = anharmonic_core->V3(arr_cubic1); for (i = 0; i < N; ++i) ret_mpi[i] = std::complex(0.0, 0.0); - for (ik2 = mympi->my_rank; ik2 < nk; ik2 += mympi->nprocs) { - for (is2 = 0; is2 < ns; ++is2) { + for (unsigned int ik2 = mympi->my_rank; ik2 < nk; ik2 += mympi->nprocs) { + for (unsigned int is2 = 0; is2 < ns; ++is2) { arr_cubic2[1] = ns * ik2 + is2; arr_cubic2[2] = ns * kpoint->knum_minus[ik2] + is2; - v3_tmp2 = relaxation->V3(arr_cubic2); - omega2 = dynamical->eval_phonon[ik2][is2]; + std::complex v3_tmp2 = anharmonic_core->V3(arr_cubic2); + double omega2 = dynamical->eval_phonon[ik2][is2]; if (omega2 < eps8) continue; for (i = 0; i < N; ++i) { - T_tmp = T[i]; + double T_tmp = T[i]; if (thermodynamics->classical) { n2 = thermodynamics->fC(omega2, T_tmp); ret_mpi[i] += v3_tmp2 * 2.0 * n2; @@ -138,7 +130,7 @@ void Selfenergy::selfenergy_tadpole(const unsigned int N, } } - factor = -1.0 / (static_cast(nk) * std::pow(2.0, 3)); + double factor = -1.0 / (static_cast(nk) * std::pow(2.0, 3)); for (i = 0; i < N; ++i) ret[i] *= factor; memory->deallocate(ret_tmp); @@ -150,7 +142,7 @@ void Selfenergy::selfenergy_a(const unsigned int N, const double omega, const unsigned int knum, const unsigned int snum, - std::complex *ret) + std::complex *ret) const { /* @@ -161,12 +153,8 @@ void Selfenergy::selfenergy_a(const unsigned int N, */ unsigned int i; - unsigned int ik1, ik2; - unsigned int is1, is2; unsigned int arr_cubic[3]; double xk_tmp[3]; - double v3_tmp; - std::complex omega_shift; std::complex omega_sum[2]; std::complex *ret_mpi; @@ -174,51 +162,46 @@ void Selfenergy::selfenergy_a(const unsigned int N, unsigned int nky = kpoint->nky; unsigned int nkz = kpoint->nkz; - unsigned int iloc, jloc, kloc; - - double T_tmp; double n1, n2; double f1, f2; - double omega1, omega2; - double factor; arr_cubic[0] = ns * kpoint->knum_minus[knum] + snum; - omega_shift = omega + im * epsilon; + std::complex omega_shift = omega + im * epsilon; memory->allocate(ret_mpi, N); for (i = 0; i < N; ++i) ret_mpi[i] = std::complex(0.0, 0.0); - for (ik1 = mympi->my_rank; ik1 < nk; ik1 += mympi->nprocs) { + for (unsigned int ik1 = mympi->my_rank; ik1 < nk; ik1 += mympi->nprocs) { xk_tmp[0] = kpoint->xk[knum][0] - kpoint->xk[ik1][0]; xk_tmp[1] = kpoint->xk[knum][1] - kpoint->xk[ik1][1]; xk_tmp[2] = kpoint->xk[knum][2] - kpoint->xk[ik1][2]; - iloc = (nint(xk_tmp[0] * static_cast(nkx) + static_cast(2 * nkx))) % nkx; - jloc = (nint(xk_tmp[1] * static_cast(nky) + static_cast(2 * nky))) % nky; - kloc = (nint(xk_tmp[2] * static_cast(nkz) + static_cast(2 * nkz))) % nkz; + unsigned int iloc = nint(xk_tmp[0] * static_cast(nkx) + static_cast(2 * nkx)) % nkx; + unsigned int jloc = nint(xk_tmp[1] * static_cast(nky) + static_cast(2 * nky)) % nky; + unsigned int kloc = nint(xk_tmp[2] * static_cast(nkz) + static_cast(2 * nkz)) % nkz; - ik2 = kloc + nkz * jloc + nky * nkz * iloc; + unsigned int ik2 = kloc + nkz * jloc + nky * nkz * iloc; - for (is1 = 0; is1 < ns; ++is1) { + for (unsigned int is1 = 0; is1 < ns; ++is1) { arr_cubic[1] = ns * ik1 + is1; - omega1 = dynamical->eval_phonon[ik1][is1]; + double omega1 = dynamical->eval_phonon[ik1][is1]; - for (is2 = 0; is2 < ns; ++is2) { + for (unsigned int is2 = 0; is2 < ns; ++is2) { arr_cubic[2] = ns * ik2 + is2; - omega2 = dynamical->eval_phonon[ik2][is2]; + double omega2 = dynamical->eval_phonon[ik2][is2]; - v3_tmp = std::norm(relaxation->V3(arr_cubic)); + double v3_tmp = std::norm(anharmonic_core->V3(arr_cubic)); omega_sum[0] = 1.0 / (omega_shift + omega1 + omega2) - 1.0 / (omega_shift - omega1 - omega2); omega_sum[1] = 1.0 / (omega_shift + omega1 - omega2) - 1.0 / (omega_shift - omega1 + omega2); for (i = 0; i < N; ++i) { - T_tmp = T[i]; + double T_tmp = T[i]; if (thermodynamics->classical) { n1 = thermodynamics->fC(omega1, T_tmp); n2 = thermodynamics->fC(omega2, T_tmp); @@ -236,7 +219,7 @@ void Selfenergy::selfenergy_a(const unsigned int N, } } - factor = 1.0 / (static_cast(nk) * std::pow(2.0, 4)); + double factor = 1.0 / (static_cast(nk) * std::pow(2.0, 4)); for (i = 0; i < N; ++i) ret_mpi[i] *= factor; mpi_reduce_complex(N, ret_mpi, ret); @@ -249,7 +232,7 @@ void Selfenergy::selfenergy_b(const unsigned int N, const double omega, const unsigned int knum, const unsigned int snum, - std::complex *ret) + std::complex *ret) const { /* Diagram (b) @@ -259,15 +242,10 @@ void Selfenergy::selfenergy_b(const unsigned int N, */ unsigned int i; - unsigned int ik1; - unsigned int is1; unsigned int arr_quartic[4]; - double omega1; double n1; - double factor; - std::complex v4_tmp; std::complex *ret_mpi; memory->allocate(ret_mpi, N); @@ -278,16 +256,16 @@ void Selfenergy::selfenergy_b(const unsigned int N, arr_quartic[3] = ns * knum + snum; - for (ik1 = mympi->my_rank; ik1 < nk; ik1 += mympi->nprocs) { - for (is1 = 0; is1 < ns; ++is1) { + for (unsigned int ik1 = mympi->my_rank; ik1 < nk; ik1 += mympi->nprocs) { + for (unsigned int is1 = 0; is1 < ns; ++is1) { arr_quartic[1] = ns * ik1 + is1; arr_quartic[2] = ns * kpoint->knum_minus[ik1] + is1; - omega1 = dynamical->eval_phonon[ik1][is1]; + double omega1 = dynamical->eval_phonon[ik1][is1]; if (omega1 < eps8) continue; - v4_tmp = relaxation->V4(arr_quartic); + std::complex v4_tmp = anharmonic_core->V4(arr_quartic); if (thermodynamics->classical) { for (i = 0; i < N; ++i) { @@ -304,7 +282,7 @@ void Selfenergy::selfenergy_b(const unsigned int N, } } - factor = -1.0 / (static_cast(nk) * std::pow(2.0, 3)); + double factor = -1.0 / (static_cast(nk) * std::pow(2.0, 3)); for (i = 0; i < N; ++i) ret_mpi[i] *= factor; mpi_reduce_complex(N, ret_mpi, ret); @@ -318,7 +296,7 @@ void Selfenergy::selfenergy_c(const unsigned int N, const double omega, const unsigned int knum, const unsigned int snum, - std::complex *ret) + std::complex *ret) const { /* @@ -329,64 +307,54 @@ void Selfenergy::selfenergy_c(const unsigned int N, */ unsigned int i; - unsigned int ik1, ik2, ik3; - unsigned int is1, is2, is3; unsigned int arr_quartic[4]; - unsigned int iloc, jloc, kloc; unsigned int nkx = kpoint->nkx; unsigned int nky = kpoint->nky; unsigned int nkz = kpoint->nkz; double xk_tmp[3]; - double v4_tmp; - double omega1, omega2, omega3; - double n1, n2, n3; - double n12, n23, n31; - double T_tmp; - double factor; - std::complex omega_shift; std::complex omega_sum[4]; std::complex *ret_mpi; memory->allocate(ret_mpi, N); - omega_shift = omega + im * epsilon; + std::complex omega_shift = omega + im * epsilon; for (i = 0; i < N; ++i) ret_mpi[i] = std::complex(0.0, 0.0); arr_quartic[0] = ns * kpoint->knum_minus[knum] + snum; - for (ik1 = mympi->my_rank; ik1 < nk; ik1 += mympi->nprocs) { - for (ik2 = 0; ik2 < nk; ++ik2) { + for (unsigned int ik1 = mympi->my_rank; ik1 < nk; ik1 += mympi->nprocs) { + for (unsigned int ik2 = 0; ik2 < nk; ++ik2) { xk_tmp[0] = kpoint->xk[knum][0] - kpoint->xk[ik1][0] - kpoint->xk[ik2][0]; xk_tmp[1] = kpoint->xk[knum][1] - kpoint->xk[ik1][1] - kpoint->xk[ik2][1]; xk_tmp[2] = kpoint->xk[knum][2] - kpoint->xk[ik1][2] - kpoint->xk[ik2][2]; - iloc = (nint(xk_tmp[0] * static_cast(nkx) + static_cast(2 * nkx))) % nkx; - jloc = (nint(xk_tmp[1] * static_cast(nky) + static_cast(2 * nky))) % nky; - kloc = (nint(xk_tmp[2] * static_cast(nkz) + static_cast(2 * nkz))) % nkz; + unsigned int iloc = nint(xk_tmp[0] * static_cast(nkx) + static_cast(2 * nkx)) % nkx; + unsigned int jloc = nint(xk_tmp[1] * static_cast(nky) + static_cast(2 * nky)) % nky; + unsigned int kloc = nint(xk_tmp[2] * static_cast(nkz) + static_cast(2 * nkz)) % nkz; - ik3 = kloc + nkz * jloc + nky * nkz * iloc; + unsigned int ik3 = kloc + nkz * jloc + nky * nkz * iloc; - for (is1 = 0; is1 < ns; ++is1) { + for (unsigned int is1 = 0; is1 < ns; ++is1) { arr_quartic[1] = ns * ik1 + is1; - omega1 = dynamical->eval_phonon[ik1][is1]; + double omega1 = dynamical->eval_phonon[ik1][is1]; - for (is2 = 0; is2 < ns; ++is2) { + for (unsigned int is2 = 0; is2 < ns; ++is2) { arr_quartic[2] = ns * ik2 + is2; - omega2 = dynamical->eval_phonon[ik2][is2]; + double omega2 = dynamical->eval_phonon[ik2][is2]; - for (is3 = 0; is3 < ns; ++is3) { + for (unsigned int is3 = 0; is3 < ns; ++is3) { arr_quartic[3] = ns * ik3 + is3; - omega3 = dynamical->eval_phonon[ik3][is3]; + double omega3 = dynamical->eval_phonon[ik3][is3]; - v4_tmp = std::norm(relaxation->V4(arr_quartic)); + double v4_tmp = std::norm(anharmonic_core->V4(arr_quartic)); omega_sum[0] = 1.0 / (omega_shift - omega1 - omega2 - omega3) @@ -402,15 +370,15 @@ void Selfenergy::selfenergy_c(const unsigned int N, - 1.0 / (omega_shift + omega1 - omega2 + omega3); for (i = 0; i < N; ++i) { - T_tmp = T[i]; + double T_tmp = T[i]; - n1 = thermodynamics->fB(omega1, T_tmp); - n2 = thermodynamics->fB(omega2, T_tmp); - n3 = thermodynamics->fB(omega3, T_tmp); + double n1 = thermodynamics->fB(omega1, T_tmp); + double n2 = thermodynamics->fB(omega2, T_tmp); + double n3 = thermodynamics->fB(omega3, T_tmp); - n12 = n1 * n2; - n23 = n2 * n3; - n31 = n3 * n1; + double n12 = n1 * n2; + double n23 = n2 * n3; + double n31 = n3 * n1; ret_mpi[i] += v4_tmp * ((n12 + n23 + n31 + n1 + n2 + n3 + 1.0) * omega_sum[0] @@ -424,7 +392,7 @@ void Selfenergy::selfenergy_c(const unsigned int N, } } - factor = -1.0 / (std::pow(static_cast(nk), 2) * std::pow(2.0, 5) * 3.0); + double factor = -1.0 / (std::pow(static_cast(nk), 2) * std::pow(2.0, 5) * 3.0); for (i = 0; i < N; ++i) ret_mpi[i] *= factor; mpi_reduce_complex(N, ret_mpi, ret); @@ -438,7 +406,7 @@ void Selfenergy::selfenergy_d(const unsigned int N, const double omega, const unsigned int knum, const unsigned int snum, - std::complex *ret) + std::complex *ret) const { /* @@ -450,94 +418,84 @@ void Selfenergy::selfenergy_d(const unsigned int N, */ unsigned int i; - unsigned int ik1, ik2, ik3, ik4; - unsigned int is1, is2, is3, is4; unsigned int arr_cubic1[3], arr_cubic2[3]; unsigned int arr_quartic[4]; - unsigned int iloc, jloc, kloc; unsigned int nkx = kpoint->nkx; unsigned int nky = kpoint->nky; unsigned int nkz = kpoint->nkz; double xk_tmp[3]; - double n1, n2, n3, n4; - double omega1, omega2, omega3, omega4; - double T_tmp; - double factor; - std::complex v3_tmp1, v3_tmp2, v4_tmp; - std::complex v_prod; - std::complex omega_shift; std::complex omega_sum[4]; std::complex *ret_mpi; memory->allocate(ret_mpi, N); - omega_shift = omega + im * epsilon; + std::complex omega_shift = omega + im * epsilon; for (i = 0; i < N; ++i) ret[i] = std::complex(0.0, 0.0); arr_cubic1[0] = ns * kpoint->knum_minus[knum] + snum; arr_cubic2[2] = ns * knum + snum; - for (ik1 = mympi->my_rank; ik1 < nk; ik1 += mympi->nprocs) { + for (unsigned int ik1 = mympi->my_rank; ik1 < nk; ik1 += mympi->nprocs) { xk_tmp[0] = kpoint->xk[knum][0] - kpoint->xk[ik1][0]; xk_tmp[1] = kpoint->xk[knum][1] - kpoint->xk[ik1][1]; xk_tmp[2] = kpoint->xk[knum][2] - kpoint->xk[ik1][2]; - iloc = (nint(xk_tmp[0] * static_cast(nkx) + static_cast(2 * nkx))) % nkx; - jloc = (nint(xk_tmp[1] * static_cast(nky) + static_cast(2 * nky))) % nky; - kloc = (nint(xk_tmp[2] * static_cast(nkz) + static_cast(2 * nkz))) % nkz; + unsigned int iloc = nint(xk_tmp[0] * static_cast(nkx) + static_cast(2 * nkx)) % nkx; + unsigned int jloc = nint(xk_tmp[1] * static_cast(nky) + static_cast(2 * nky)) % nky; + unsigned int kloc = nint(xk_tmp[2] * static_cast(nkz) + static_cast(2 * nkz)) % nkz; - ik2 = kloc + nkz * jloc + nky * nkz * iloc; + unsigned int ik2 = kloc + nkz * jloc + nky * nkz * iloc; - for (ik3 = 0; ik3 < nk; ++ik3) { + for (unsigned int ik3 = 0; ik3 < nk; ++ik3) { xk_tmp[0] = kpoint->xk[knum][0] - kpoint->xk[ik3][0]; xk_tmp[1] = kpoint->xk[knum][1] - kpoint->xk[ik3][1]; xk_tmp[2] = kpoint->xk[knum][2] - kpoint->xk[ik3][2]; - iloc = (nint(xk_tmp[0] * static_cast(nkx) + static_cast(2 * nkx))) % nkx; - jloc = (nint(xk_tmp[1] * static_cast(nky) + static_cast(2 * nky))) % nky; - kloc = (nint(xk_tmp[2] * static_cast(nkz) + static_cast(2 * nkz))) % nkz; + iloc = nint(xk_tmp[0] * static_cast(nkx) + static_cast(2 * nkx)) % nkx; + jloc = nint(xk_tmp[1] * static_cast(nky) + static_cast(2 * nky)) % nky; + kloc = nint(xk_tmp[2] * static_cast(nkz) + static_cast(2 * nkz)) % nkz; - ik4 = kloc + nkz * jloc + nky * nkz * iloc; + unsigned int ik4 = kloc + nkz * jloc + nky * nkz * iloc; - for (is1 = 0; is1 < ns; ++is1) { + for (unsigned int is1 = 0; is1 < ns; ++is1) { - omega1 = dynamical->eval_phonon[ik1][is1]; + double omega1 = dynamical->eval_phonon[ik1][is1]; arr_cubic2[0] = ns * kpoint->knum_minus[ik1] + is1; arr_quartic[0] = ns * ik1 + is1; - for (is2 = 0; is2 < ns; ++is2) { + for (unsigned int is2 = 0; is2 < ns; ++is2) { - omega2 = dynamical->eval_phonon[ik2][is2]; + double omega2 = dynamical->eval_phonon[ik2][is2]; arr_cubic2[1] = ns * kpoint->knum_minus[ik2] + is2; arr_quartic[1] = ns * ik2 + is2; - v3_tmp2 = relaxation->V3(arr_cubic2); + std::complex v3_tmp2 = anharmonic_core->V3(arr_cubic2); - for (is3 = 0; is3 < ns; ++is3) { + for (unsigned int is3 = 0; is3 < ns; ++is3) { - omega3 = dynamical->eval_phonon[ik3][is3]; + double omega3 = dynamical->eval_phonon[ik3][is3]; arr_cubic1[1] = ns * ik3 + is3; arr_quartic[2] = ns * kpoint->knum_minus[ik3] + is3; - for (is4 = 0; is4 < ns; ++is4) { + for (unsigned int is4 = 0; is4 < ns; ++is4) { - omega4 = dynamical->eval_phonon[ik4][is4]; + double omega4 = dynamical->eval_phonon[ik4][is4]; arr_cubic1[2] = ns * ik4 + is4; arr_quartic[3] = ns * kpoint->knum_minus[ik4] + is4; - v3_tmp1 = relaxation->V3(arr_cubic1); - v4_tmp = relaxation->V4(arr_quartic); + std::complex v3_tmp1 = anharmonic_core->V3(arr_cubic1); + std::complex v4_tmp = anharmonic_core->V4(arr_quartic); - v_prod = v3_tmp1 * v3_tmp2 * v4_tmp; + std::complex v_prod = v3_tmp1 * v3_tmp2 * v4_tmp; omega_sum[0] = 1.0 / (omega_shift + omega1 + omega2) @@ -553,12 +511,12 @@ void Selfenergy::selfenergy_d(const unsigned int N, - 1.0 / (omega_shift - omega3 + omega4); for (i = 0; i < N; ++i) { - T_tmp = T[i]; + double T_tmp = T[i]; - n1 = thermodynamics->fB(omega1, T_tmp); - n2 = thermodynamics->fB(omega2, T_tmp); - n3 = thermodynamics->fB(omega3, T_tmp); - n4 = thermodynamics->fB(omega4, T_tmp); + double n1 = thermodynamics->fB(omega1, T_tmp); + double n2 = thermodynamics->fB(omega2, T_tmp); + double n3 = thermodynamics->fB(omega3, T_tmp); + double n4 = thermodynamics->fB(omega4, T_tmp); ret_mpi[i] += v_prod * ((1.0 + n1 + n2) * omega_sum[0] + (n2 - n1) * omega_sum[1]) @@ -571,7 +529,7 @@ void Selfenergy::selfenergy_d(const unsigned int N, } } - factor = -1.0 / (std::pow(static_cast(nk), 2) * std::pow(2.0, 7)); + double factor = -1.0 / (std::pow(static_cast(nk), 2) * std::pow(2.0, 7)); for (i = 0; i < N; ++i) ret_mpi[i] *= factor; mpi_reduce_complex(N, ret_mpi, ret); @@ -584,7 +542,7 @@ void Selfenergy::selfenergy_e(const unsigned int N, const double omega, const unsigned int knum, const unsigned int snum, - std::complex *ret) + std::complex *ret) const { /* @@ -596,31 +554,22 @@ void Selfenergy::selfenergy_e(const unsigned int N, */ unsigned int i; - unsigned int ik1, ik2, ik3, ik4; - unsigned int is1, is2, is3, is4; - unsigned int iloc, jloc, kloc; + unsigned int is3, is4; unsigned int arr_cubic1[3], arr_cubic2[3]; unsigned int arr_quartic[4]; unsigned int nkx = kpoint->nkx; unsigned int nky = kpoint->nky; unsigned int nkz = kpoint->nkz; - int ip1, ip4; - double T_tmp; - double factor; - double omega1, omega2, omega3, omega4; - double dp1, dp4; - double dp1_inv; - double n1, n2, n3, n4; + double omega3, omega4; + double n1, n3, n4; double xk_tmp[3]; double D12[2]; double T_inv; std::complex v3_tmp1, v3_tmp2, v4_tmp; std::complex v_prod; - std::complex omega_shift; - std::complex omega_sum; std::complex omega_sum14[4], omega_sum24[4]; std::complex omega_prod[6]; std::complex *prod_tmp; @@ -629,39 +578,39 @@ void Selfenergy::selfenergy_e(const unsigned int N, memory->allocate(ret_mpi, N); memory->allocate(prod_tmp, N); - omega_shift = omega + im * epsilon; + std::complex omega_shift = omega + im * epsilon; for (i = 0; i < N; ++i) ret_mpi[i] = std::complex(0.0, 0.0); arr_cubic1[0] = ns * kpoint->knum_minus[knum] + snum; arr_cubic2[2] = ns * knum + snum; - for (ik1 = mympi->my_rank; ik1 < nk; ik1 += mympi->nprocs) { + for (unsigned int ik1 = mympi->my_rank; ik1 < nk; ik1 += mympi->nprocs) { - ik2 = ik1; + unsigned int ik2 = ik1; xk_tmp[0] = kpoint->xk[knum][0] - kpoint->xk[ik1][0]; xk_tmp[1] = kpoint->xk[knum][1] - kpoint->xk[ik1][1]; xk_tmp[2] = kpoint->xk[knum][2] - kpoint->xk[ik1][2]; - iloc = (nint(xk_tmp[0] * static_cast(nkx) + static_cast(2 * nkx))) % nkx; - jloc = (nint(xk_tmp[1] * static_cast(nky) + static_cast(2 * nky))) % nky; - kloc = (nint(xk_tmp[2] * static_cast(nkz) + static_cast(2 * nkz))) % nkz; + unsigned int iloc = nint(xk_tmp[0] * static_cast(nkx) + static_cast(2 * nkx)) % nkx; + unsigned int jloc = nint(xk_tmp[1] * static_cast(nky) + static_cast(2 * nky)) % nky; + unsigned int kloc = nint(xk_tmp[2] * static_cast(nkz) + static_cast(2 * nkz)) % nkz; - ik4 = kloc + nkz * jloc + nky * nkz * iloc; + unsigned int ik4 = kloc + nkz * jloc + nky * nkz * iloc; - for (ik3 = 0; ik3 < nk; ++ik3) { + for (unsigned int ik3 = 0; ik3 < nk; ++ik3) { - for (is1 = 0; is1 < ns; ++is1) { + for (unsigned int is1 = 0; is1 < ns; ++is1) { - omega1 = dynamical->eval_phonon[ik1][is1]; + double omega1 = dynamical->eval_phonon[ik1][is1]; arr_cubic1[1] = ns * ik1 + is1; arr_quartic[0] = ns * kpoint->knum_minus[ik1] + is1; - for (is2 = 0; is2 < ns; ++is2) { + for (unsigned int is2 = 0; is2 < ns; ++is2) { - omega2 = dynamical->eval_phonon[ik2][is2]; + double omega2 = dynamical->eval_phonon[ik2][is2]; arr_cubic2[0] = ns * kpoint->knum_minus[ik2] + is2; arr_quartic[3] = ns * ik2 + is2; @@ -675,7 +624,7 @@ void Selfenergy::selfenergy_e(const unsigned int N, arr_quartic[1] = ns * ik3 + is3; arr_quartic[2] = ns * kpoint->knum_minus[ik3] + is3; - v4_tmp = relaxation->V4(arr_quartic); + v4_tmp = anharmonic_core->V4(arr_quartic); for (is4 = 0; is4 < ns; ++is4) { @@ -684,21 +633,21 @@ void Selfenergy::selfenergy_e(const unsigned int N, arr_cubic1[2] = ns * ik4 + is4; arr_cubic2[1] = ns * kpoint->knum_minus[ik4] + is4; - v3_tmp1 = relaxation->V3(arr_cubic1); - v3_tmp2 = relaxation->V3(arr_cubic2); + v3_tmp1 = anharmonic_core->V3(arr_cubic1); + v3_tmp2 = anharmonic_core->V3(arr_cubic2); v_prod = v3_tmp1 * v3_tmp2 * v4_tmp; for (i = 0; i < N; ++i) prod_tmp[i] = std::complex(0.0, 0.0); - for (ip1 = 1; ip1 >= -1; ip1 -= 2) { - dp1 = static_cast(ip1) * omega1; - dp1_inv = 1.0 / dp1; + for (int ip1 = 1; ip1 >= -1; ip1 -= 2) { + double dp1 = static_cast(ip1) * omega1; + double dp1_inv = 1.0 / dp1; - for (ip4 = 1; ip4 >= -1; ip4 -= 2) { - dp4 = static_cast(ip4) * omega4; + for (int ip4 = 1; ip4 >= -1; ip4 -= 2) { + double dp4 = static_cast(ip4) * omega4; - omega_sum = 1.0 / (omega_shift + dp1 + dp4); + std::complex omega_sum = 1.0 / (omega_shift + dp1 + dp4); for (i = 0; i < N; ++i) { T_tmp = T[i]; @@ -744,7 +693,7 @@ void Selfenergy::selfenergy_e(const unsigned int N, arr_quartic[1] = ns * ik3 + is3; arr_quartic[2] = ns * kpoint->knum_minus[ik3] + is3; - v4_tmp = relaxation->V4(arr_quartic); + v4_tmp = anharmonic_core->V4(arr_quartic); for (is4 = 0; is4 < ns; ++is4) { @@ -753,8 +702,8 @@ void Selfenergy::selfenergy_e(const unsigned int N, arr_cubic1[2] = ns * ik4 + is4; arr_cubic2[1] = ns * kpoint->knum_minus[ik4] + is4; - v3_tmp1 = relaxation->V3(arr_cubic1); - v3_tmp2 = relaxation->V3(arr_cubic2); + v3_tmp1 = anharmonic_core->V3(arr_cubic1); + v3_tmp2 = anharmonic_core->V3(arr_cubic2); v_prod = v3_tmp1 * v3_tmp2 * v4_tmp; @@ -781,7 +730,7 @@ void Selfenergy::selfenergy_e(const unsigned int N, T_tmp = T[i]; n1 = thermodynamics->fB(omega1, T_tmp); - n2 = thermodynamics->fB(omega2, T_tmp); + double n2 = thermodynamics->fB(omega2, T_tmp); n3 = thermodynamics->fB(omega3, T_tmp); n4 = thermodynamics->fB(omega4, T_tmp); @@ -805,7 +754,7 @@ void Selfenergy::selfenergy_e(const unsigned int N, } } - factor = -1.0 / (std::pow(static_cast(nk), 2) * std::pow(2.0, 6)); + double factor = -1.0 / (std::pow(static_cast(nk), 2) * std::pow(2.0, 6)); // factor = -1.0 / (std::pow(static_cast(nk), 2) * std::pow(2.0, 7)); for (i = 0; i < N; ++i) ret_mpi[i] *= factor; @@ -820,7 +769,7 @@ void Selfenergy::selfenergy_f(const unsigned int N, const double omega, const unsigned int knum, const unsigned int snum, - std::complex *ret) + std::complex *ret) const { /* Diagram (f) @@ -830,116 +779,107 @@ void Selfenergy::selfenergy_f(const unsigned int N, */ unsigned int i; - unsigned int ik1, ik2, ik3, ik4, ik5; - unsigned int is1, is2, is3, is4, is5; unsigned int arr_cubic1[3], arr_cubic2[3], arr_cubic3[3], arr_cubic4[3]; - unsigned int iloc, jloc, kloc; unsigned int nkx = kpoint->nkx; unsigned int nky = kpoint->nky; unsigned int nkz = kpoint->nkz; - int ip1, ip2, ip3, ip4, ip5; + int ip1, ip2, ip3, ip4; - double omega1, omega2, omega3, omega4, omega5; - double n1, n2, n3, n4, n5; + double n1, n2, n3, n4; double xk_tmp[3]; - double dp1, dp2, dp3, dp4, dp5; + double dp1, dp2, dp3, dp4; double T_tmp; - double dp1_inv; - double factor; - double D15, D134, D345; + double D134; double T_inv; std::complex omega_sum[3]; - std::complex v3_tmp1, v3_tmp2, v3_tmp3, v3_tmp4; - std::complex v3_prod; - std::complex omega_shift; std::complex *ret_mpi; memory->allocate(ret_mpi, N); - omega_shift = omega + im * epsilon; + std::complex omega_shift = omega + im * epsilon; for (i = 0; i < N; ++i) ret_mpi[i] = std::complex(0.0, 0.0); arr_cubic1[0] = ns * kpoint->knum_minus[knum] + snum; arr_cubic4[2] = ns * knum + snum; - for (ik1 = mympi->my_rank; ik1 < nk; ik1 += mympi->nprocs) { + for (unsigned int ik1 = mympi->my_rank; ik1 < nk; ik1 += mympi->nprocs) { - ik5 = ik1; + unsigned int ik5 = ik1; xk_tmp[0] = kpoint->xk[knum][0] - kpoint->xk[ik1][0]; xk_tmp[1] = kpoint->xk[knum][1] - kpoint->xk[ik1][1]; xk_tmp[2] = kpoint->xk[knum][2] - kpoint->xk[ik1][2]; - iloc = (nint(xk_tmp[0] * static_cast(nkx) + static_cast(2 * nkx))) % nkx; - jloc = (nint(xk_tmp[1] * static_cast(nky) + static_cast(2 * nky))) % nky; - kloc = (nint(xk_tmp[2] * static_cast(nkz) + static_cast(2 * nkz))) % nkz; + unsigned int iloc = nint(xk_tmp[0] * static_cast(nkx) + static_cast(2 * nkx)) % nkx; + unsigned int jloc = nint(xk_tmp[1] * static_cast(nky) + static_cast(2 * nky)) % nky; + unsigned int kloc = nint(xk_tmp[2] * static_cast(nkz) + static_cast(2 * nkz)) % nkz; - ik2 = kloc + nkz * jloc + nky * nkz * iloc; + unsigned int ik2 = kloc + nkz * jloc + nky * nkz * iloc; - for (ik3 = 0; ik3 < nk; ++ik3) { + for (unsigned int ik3 = 0; ik3 < nk; ++ik3) { xk_tmp[0] = kpoint->xk[ik1][0] - kpoint->xk[ik3][0]; xk_tmp[1] = kpoint->xk[ik1][1] - kpoint->xk[ik3][1]; xk_tmp[2] = kpoint->xk[ik1][2] - kpoint->xk[ik3][2]; - iloc = (nint(xk_tmp[0] * static_cast(nkx) + static_cast(2 * nkx))) % nkx; - jloc = (nint(xk_tmp[1] * static_cast(nky) + static_cast(2 * nky))) % nky; - kloc = (nint(xk_tmp[2] * static_cast(nkz) + static_cast(2 * nkz))) % nkz; + iloc = nint(xk_tmp[0] * static_cast(nkx) + static_cast(2 * nkx)) % nkx; + jloc = nint(xk_tmp[1] * static_cast(nky) + static_cast(2 * nky)) % nky; + kloc = nint(xk_tmp[2] * static_cast(nkz) + static_cast(2 * nkz)) % nkz; - ik4 = kloc + nkz * jloc + nky * nkz * iloc; + unsigned int ik4 = kloc + nkz * jloc + nky * nkz * iloc; - for (is1 = 0; is1 < ns; ++is1) { + for (unsigned int is1 = 0; is1 < ns; ++is1) { - omega1 = dynamical->eval_phonon[ik1][is1]; + double omega1 = dynamical->eval_phonon[ik1][is1]; arr_cubic1[1] = ns * ik1 + is1; arr_cubic2[0] = ns * kpoint->knum_minus[ik1] + is1; - for (is2 = 0; is2 < ns; ++is2) { + for (unsigned int is2 = 0; is2 < ns; ++is2) { - omega2 = dynamical->eval_phonon[ik2][is2]; + double omega2 = dynamical->eval_phonon[ik2][is2]; arr_cubic1[2] = ns * ik2 + is2; arr_cubic4[1] = ns * kpoint->knum_minus[ik2] + is2; - v3_tmp1 = relaxation->V3(arr_cubic1); + std::complex v3_tmp1 = anharmonic_core->V3(arr_cubic1); - for (is5 = 0; is5 < ns; ++is5) { + for (unsigned int is5 = 0; is5 < ns; ++is5) { - omega5 = dynamical->eval_phonon[ik5][is5]; + double omega5 = dynamical->eval_phonon[ik5][is5]; arr_cubic3[2] = ns * ik5 + is5; arr_cubic4[0] = ns * kpoint->knum_minus[ik5] + is5; - v3_tmp4 = relaxation->V3(arr_cubic4); + std::complex v3_tmp4 = anharmonic_core->V3(arr_cubic4); - for (is3 = 0; is3 < ns; ++is3) { + for (unsigned int is3 = 0; is3 < ns; ++is3) { - omega3 = dynamical->eval_phonon[ik3][is3]; + double omega3 = dynamical->eval_phonon[ik3][is3]; arr_cubic2[1] = ns * ik3 + is3; arr_cubic3[0] = ns * kpoint->knum_minus[ik3] + is3; - for (is4 = 0; is4 < ns; ++is4) { + for (unsigned int is4 = 0; is4 < ns; ++is4) { - omega4 = dynamical->eval_phonon[ik4][is4]; + double omega4 = dynamical->eval_phonon[ik4][is4]; arr_cubic2[2] = ns * ik4 + is4; arr_cubic3[1] = ns * kpoint->knum_minus[ik4] + is4; - v3_tmp2 = relaxation->V3(arr_cubic2); - v3_tmp3 = relaxation->V3(arr_cubic3); + std::complex v3_tmp2 = anharmonic_core->V3(arr_cubic2); + std::complex v3_tmp3 = anharmonic_core->V3(arr_cubic3); - v3_prod = v3_tmp1 * v3_tmp2 * v3_tmp3 * v3_tmp4; + std::complex v3_prod = v3_tmp1 * v3_tmp2 * v3_tmp3 * v3_tmp4; if (std::abs(omega1 - omega5) < eps) { for (ip1 = 1; ip1 >= -1; ip1 -= 2) { dp1 = static_cast(ip1) * omega1; - dp1_inv = 1.0 / dp1; + double dp1_inv = 1.0 / dp1; for (ip2 = 1; ip2 >= -1; ip2 -= 2) { dp2 = static_cast(ip2) * omega2; @@ -972,10 +912,12 @@ void Selfenergy::selfenergy_f(const unsigned int N, += v3_prod * static_cast(ip2 * ip3 * ip4) * (omega_sum[1] * (n2 * omega_sum[0] - * ((1.0 + n3 + n4) * omega_sum[0] + (1.0 + n2 + n4) * dp1_inv) + * ((1.0 + n3 + n4) * omega_sum[0] + (1.0 + n2 + n4) + * dp1_inv) + (1.0 + n3) * (1.0 + n4) * D134 * (D134 + dp1_inv)) + (1.0 + n1) * (1.0 + n3 + n4) * D134 - * omega_sum[0] * (omega_sum[0] + D134 + dp1_inv + n1 * T_inv)); + * omega_sum[0] * (omega_sum[0] + D134 + dp1_inv + n1 * + T_inv)); } } } @@ -987,10 +929,10 @@ void Selfenergy::selfenergy_f(const unsigned int N, for (ip1 = 1; ip1 >= -1; ip1 -= 2) { dp1 = static_cast(ip1) * omega1; - for (ip5 = 1; ip5 >= -1; ip5 -= 2) { - dp5 = static_cast(ip5) * omega5; + for (int ip5 = 1; ip5 >= -1; ip5 -= 2) { + double dp5 = static_cast(ip5) * omega5; - D15 = 1.0 / (dp1 - dp5); + double D15 = 1.0 / (dp1 - dp5); for (ip2 = 1; ip2 >= -1; ip2 -= 2) { dp2 = static_cast(ip2) * omega2; @@ -1005,7 +947,7 @@ void Selfenergy::selfenergy_f(const unsigned int N, dp4 = static_cast(ip4) * omega4; D134 = 1.0 / (dp1 + dp3 + dp4); - D345 = 1.0 / (dp5 + dp3 + dp4); + double D345 = 1.0 / (dp5 + dp3 + dp4); omega_sum[2] = 1.0 / (omega_shift + dp2 + dp3 + dp4); for (i = 0; i < N; ++i) { @@ -1015,10 +957,11 @@ void Selfenergy::selfenergy_f(const unsigned int N, n2 = thermodynamics->fB(dp2, T_tmp); n3 = thermodynamics->fB(dp3, T_tmp); n4 = thermodynamics->fB(dp4, T_tmp); - n5 = thermodynamics->fB(dp5, T_tmp); + double n5 = thermodynamics->fB(dp5, T_tmp); ret_mpi[i] - += v3_prod * static_cast(ip1 * ip2 * ip3 * ip4 * ip5) + += v3_prod * static_cast(ip1 * ip2 * ip3 * ip4 * + ip5) * ((1.0 + n3 + n4) * (-(1.0 + n1 + n2) * D15 * D134 * omega_sum[0] + (1.0 + n5 + n2) * D15 * D345 * omega_sum[1]) @@ -1039,7 +982,7 @@ void Selfenergy::selfenergy_f(const unsigned int N, } } - factor = 1.0 / (std::pow(static_cast(nk), 2) * std::pow(2.0, 7)); + double factor = 1.0 / (std::pow(static_cast(nk), 2) * std::pow(2.0, 7)); for (i = 0; i < N; ++i) ret_mpi[i] *= factor; mpi_reduce_complex(N, ret_mpi, ret); @@ -1053,7 +996,7 @@ void Selfenergy::selfenergy_g(const unsigned int N, const double omega, const unsigned int knum, const unsigned int snum, - std::complex *ret) + std::complex *ret) const { /* Diagram (g) @@ -1062,9 +1005,6 @@ void Selfenergy::selfenergy_g(const unsigned int N, */ unsigned int i; - unsigned int ik1, ik2, ik3, ik4; - unsigned int is1, is2, is3, is4; - unsigned int iloc, jloc, kloc; unsigned int nkx = kpoint->nkx; unsigned int nky = kpoint->nky; @@ -1072,115 +1012,105 @@ void Selfenergy::selfenergy_g(const unsigned int N, unsigned int arr_quartic[4], arr_cubic1[3], arr_cubic2[3]; - int ip1, ip2, ip3, ip4; - - double omega1, omega2, omega3, omega4; - double dp1, dp2, dp3, dp4; - double n1, n2, n3, n4; - double D124; - double xk_tmp[3]; - double T_tmp; - double factor; - std::complex omega_shift; std::complex omega_sum[2]; - std::complex v3_tmp1, v3_tmp2, v4_tmp; - std::complex v_prod; std::complex *ret_mpi; memory->allocate(ret_mpi, N); - omega_shift = omega + im * epsilon; + std::complex omega_shift = omega + im * epsilon; for (i = 0; i < N; ++i) ret_mpi[i] = std::complex(0.0, 0.0); arr_quartic[0] = ns * kpoint->knum_minus[knum] + snum; arr_cubic2[2] = ns * knum + snum; - for (ik1 = mympi->my_rank; ik1 < nk; ik1 += mympi->nprocs) { + for (unsigned int ik1 = mympi->my_rank; ik1 < nk; ik1 += mympi->nprocs) { - for (ik2 = 0; ik2 < nk; ++ik2) { + for (unsigned int ik2 = 0; ik2 < nk; ++ik2) { xk_tmp[0] = kpoint->xk[knum][0] - kpoint->xk[ik1][0] - kpoint->xk[ik2][0]; xk_tmp[1] = kpoint->xk[knum][1] - kpoint->xk[ik1][1] - kpoint->xk[ik2][1]; xk_tmp[2] = kpoint->xk[knum][2] - kpoint->xk[ik1][2] - kpoint->xk[ik2][2]; - iloc = (nint(xk_tmp[0] * static_cast(nkx) + static_cast(2 * nkx))) % nkx; - jloc = (nint(xk_tmp[1] * static_cast(nky) + static_cast(2 * nky))) % nky; - kloc = (nint(xk_tmp[2] * static_cast(nkz) + static_cast(2 * nkz))) % nkz; + unsigned int iloc = nint(xk_tmp[0] * static_cast(nkx) + static_cast(2 * nkx)) % nkx; + unsigned int jloc = nint(xk_tmp[1] * static_cast(nky) + static_cast(2 * nky)) % nky; + unsigned int kloc = nint(xk_tmp[2] * static_cast(nkz) + static_cast(2 * nkz)) % nkz; - ik3 = kloc + nkz * jloc + nky * nkz * iloc; + unsigned int ik3 = kloc + nkz * jloc + nky * nkz * iloc; xk_tmp[0] = kpoint->xk[knum][0] - kpoint->xk[ik3][0]; xk_tmp[1] = kpoint->xk[knum][1] - kpoint->xk[ik3][1]; xk_tmp[2] = kpoint->xk[knum][2] - kpoint->xk[ik3][2]; - iloc = (nint(xk_tmp[0] * static_cast(nkx) + static_cast(2 * nkx))) % nkx; - jloc = (nint(xk_tmp[1] * static_cast(nky) + static_cast(2 * nky))) % nky; - kloc = (nint(xk_tmp[2] * static_cast(nkz) + static_cast(2 * nkz))) % nkz; + iloc = nint(xk_tmp[0] * static_cast(nkx) + static_cast(2 * nkx)) % nkx; + jloc = nint(xk_tmp[1] * static_cast(nky) + static_cast(2 * nky)) % nky; + kloc = nint(xk_tmp[2] * static_cast(nkz) + static_cast(2 * nkz)) % nkz; - ik4 = kloc + nkz * jloc + nky * nkz * iloc; + unsigned int ik4 = kloc + nkz * jloc + nky * nkz * iloc; - for (is1 = 0; is1 < ns; ++is1) { - omega1 = dynamical->eval_phonon[ik1][is1]; + for (unsigned int is1 = 0; is1 < ns; ++is1) { + double omega1 = dynamical->eval_phonon[ik1][is1]; arr_quartic[1] = ns * ik1 + is1; arr_cubic1[0] = ns * kpoint->knum_minus[ik1] + is1; - for (is2 = 0; is2 < ns; ++is2) { - omega2 = dynamical->eval_phonon[ik2][is2]; + for (unsigned int is2 = 0; is2 < ns; ++is2) { + double omega2 = dynamical->eval_phonon[ik2][is2]; arr_quartic[2] = ns * ik2 + is2; arr_cubic1[1] = ns * kpoint->knum_minus[ik2] + is2; - for (is3 = 0; is3 < ns; ++is3) { - omega3 = dynamical->eval_phonon[ik3][is3]; + for (unsigned int is3 = 0; is3 < ns; ++is3) { + double omega3 = dynamical->eval_phonon[ik3][is3]; arr_quartic[3] = ns * ik3 + is3; arr_cubic2[0] = ns * kpoint->knum_minus[ik3] + is3; - v4_tmp = relaxation->V4(arr_quartic); + std::complex v4_tmp = anharmonic_core->V4(arr_quartic); - for (is4 = 0; is4 < ns; ++is4) { - omega4 = dynamical->eval_phonon[ik4][is4]; + for (unsigned int is4 = 0; is4 < ns; ++is4) { + double omega4 = dynamical->eval_phonon[ik4][is4]; arr_cubic1[2] = ns * ik4 + is4; arr_cubic2[1] = ns * kpoint->knum_minus[ik4] + is4; - v3_tmp1 = relaxation->V3(arr_cubic1); - v3_tmp2 = relaxation->V3(arr_cubic2); + std::complex v3_tmp1 = anharmonic_core->V3(arr_cubic1); + std::complex v3_tmp2 = anharmonic_core->V3(arr_cubic2); - v_prod = v4_tmp * v3_tmp1 * v3_tmp2; + std::complex v_prod = v4_tmp * v3_tmp1 * v3_tmp2; - for (ip1 = 1; ip1 >= -1; ip1 -= 2) { - dp1 = static_cast(ip1) * omega1; - for (ip2 = 1; ip2 >= -1; ip2 -= 2) { - dp2 = static_cast(ip2) * omega2; - for (ip3 = 1; ip3 >= -1; ip3 -= 2) { - dp3 = static_cast(ip3) * omega3; + for (int ip1 = 1; ip1 >= -1; ip1 -= 2) { + double dp1 = static_cast(ip1) * omega1; + for (int ip2 = 1; ip2 >= -1; ip2 -= 2) { + double dp2 = static_cast(ip2) * omega2; + for (int ip3 = 1; ip3 >= -1; ip3 -= 2) { + double dp3 = static_cast(ip3) * omega3; omega_sum[1] = 1.0 / (omega_shift + dp1 + dp2 + dp3); - for (ip4 = 1; ip4 >= -1; ip4 -= 2) { - dp4 = static_cast(ip4) * omega4; + for (int ip4 = 1; ip4 >= -1; ip4 -= 2) { + double dp4 = static_cast(ip4) * omega4; omega_sum[0] = 1.0 / (omega_shift + dp3 + dp4); - D124 = 1.0 / (dp1 + dp2 - dp4); + double D124 = 1.0 / (dp1 + dp2 - dp4); for (i = 0; i < N; ++i) { - T_tmp = T[i]; + double T_tmp = T[i]; - n1 = thermodynamics->fB(dp1, T_tmp); - n2 = thermodynamics->fB(dp2, T_tmp); - n3 = thermodynamics->fB(dp3, T_tmp); - n4 = thermodynamics->fB(dp4, T_tmp); + double n1 = thermodynamics->fB(dp1, T_tmp); + double n2 = thermodynamics->fB(dp2, T_tmp); + double n3 = thermodynamics->fB(dp3, T_tmp); + double n4 = thermodynamics->fB(dp4, T_tmp); ret_mpi[i] += v_prod * static_cast(ip1 * ip2 * ip3 * ip4) * D124 - * ((1.0 + n1 + n2 + n3 + n4 + n1 * n3 + n1 * n4 + n2 * n3 + n2 * n4) * omega_sum[0] - - (1.0 + n1 + n2 + n3 + n1 * n2 + n2 * n3 + n1 * n3) * omega_sum[1]); + * ((1.0 + n1 + n2 + n3 + n4 + n1 * n3 + n1 * n4 + n2 * n3 + n2 * n4) + * omega_sum[0] + - (1.0 + n1 + n2 + n3 + n1 * n2 + n2 * n3 + n1 * n3) * omega_sum + [1]); } } @@ -1194,7 +1124,7 @@ void Selfenergy::selfenergy_g(const unsigned int N, } } - factor = -1.0 / (std::pow(static_cast(nk), 2) * std::pow(2.0, 6)); + double factor = -1.0 / (std::pow(static_cast(nk), 2) * std::pow(2.0, 6)); for (i = 0; i < N; ++i) ret_mpi[i] *= factor; mpi_reduce_complex(N, ret_mpi, ret); @@ -1207,7 +1137,7 @@ void Selfenergy::selfenergy_h(const unsigned int N, const double omega, const unsigned int knum, const unsigned int snum, - std::complex *ret) + std::complex *ret) const { /* Diagram (h) @@ -1217,159 +1147,144 @@ void Selfenergy::selfenergy_h(const unsigned int N, */ unsigned int i; - unsigned int ik1, ik2, ik3, ik4, ik5; - unsigned int is1, is2, is3, is4, is5; unsigned int arr_cubic1[3], arr_cubic2[3], arr_cubic3[3], arr_cubic4[3]; unsigned int nkx = kpoint->nkx; unsigned int nky = kpoint->nky; unsigned int nkz = kpoint->nkz; - unsigned int iloc, jloc, kloc; - - int ip1, ip2, ip3, ip4, ip5; - - double T_tmp; double xk_tmp[3]; - double factor; - double omega1, omega2, omega3, omega4, omega5; - double dp1, dp2, dp3, dp4, dp5; - double n1, n2, n3, n4, n5; - double D1, D2, D1_inv, D2_inv, D12_inv; - double N12, N35, N34; double N_prod[4]; - std::complex v3_tmp1, v3_tmp2, v3_tmp3, v3_tmp4; - std::complex v_prod; - std::complex omega_shift; std::complex omega_sum[4]; std::complex *ret_mpi; memory->allocate(ret_mpi, N); - omega_shift = omega + im * epsilon; + std::complex omega_shift = omega + im * epsilon; for (i = 0; i < N; ++i) ret_mpi[i] = std::complex(0.0, 0.0); arr_cubic1[0] = ns * kpoint->knum_minus[knum] + snum; arr_cubic4[2] = ns * knum + snum; - for (ik1 = mympi->my_rank; ik1 < nk; ik1 += mympi->nprocs) { + for (unsigned int ik1 = mympi->my_rank; ik1 < nk; ik1 += mympi->nprocs) { xk_tmp[0] = kpoint->xk[knum][0] - kpoint->xk[ik1][0]; xk_tmp[1] = kpoint->xk[knum][1] - kpoint->xk[ik1][1]; xk_tmp[2] = kpoint->xk[knum][2] - kpoint->xk[ik1][2]; - iloc = (nint(xk_tmp[0] * static_cast(nkx) + static_cast(2 * nkx))) % nkx; - jloc = (nint(xk_tmp[1] * static_cast(nky) + static_cast(2 * nky))) % nky; - kloc = (nint(xk_tmp[2] * static_cast(nkz) + static_cast(2 * nkz))) % nkz; + unsigned int iloc = nint(xk_tmp[0] * static_cast(nkx) + static_cast(2 * nkx)) % nkx; + unsigned int jloc = nint(xk_tmp[1] * static_cast(nky) + static_cast(2 * nky)) % nky; + unsigned int kloc = nint(xk_tmp[2] * static_cast(nkz) + static_cast(2 * nkz)) % nkz; - ik2 = kloc + nkz * jloc + nky * nkz * iloc; + unsigned int ik2 = kloc + nkz * jloc + nky * nkz * iloc; - for (ik3 = 0; ik3 < nk; ++ik3) { + for (unsigned int ik3 = 0; ik3 < nk; ++ik3) { xk_tmp[0] = kpoint->xk[ik1][0] - kpoint->xk[ik3][0]; xk_tmp[1] = kpoint->xk[ik1][1] - kpoint->xk[ik3][1]; xk_tmp[2] = kpoint->xk[ik1][2] - kpoint->xk[ik3][2]; - iloc = (nint(xk_tmp[0] * static_cast(nkx) + static_cast(2 * nkx))) % nkx; - jloc = (nint(xk_tmp[1] * static_cast(nky) + static_cast(2 * nky))) % nky; - kloc = (nint(xk_tmp[2] * static_cast(nkz) + static_cast(2 * nkz))) % nkz; + iloc = nint(xk_tmp[0] * static_cast(nkx) + static_cast(2 * nkx)) % nkx; + jloc = nint(xk_tmp[1] * static_cast(nky) + static_cast(2 * nky)) % nky; + kloc = nint(xk_tmp[2] * static_cast(nkz) + static_cast(2 * nkz)) % nkz; - ik5 = kloc + nkz * jloc + nky * nkz * iloc; + unsigned int ik5 = kloc + nkz * jloc + nky * nkz * iloc; xk_tmp[0] = kpoint->xk[knum][0] - kpoint->xk[ik5][0]; xk_tmp[1] = kpoint->xk[knum][1] - kpoint->xk[ik5][1]; xk_tmp[2] = kpoint->xk[knum][2] - kpoint->xk[ik5][2]; - iloc = (nint(xk_tmp[0] * static_cast(nkx) + static_cast(2 * nkx))) % nkx; - jloc = (nint(xk_tmp[1] * static_cast(nky) + static_cast(2 * nky))) % nky; - kloc = (nint(xk_tmp[2] * static_cast(nkz) + static_cast(2 * nkz))) % nkz; + iloc = nint(xk_tmp[0] * static_cast(nkx) + static_cast(2 * nkx)) % nkx; + jloc = nint(xk_tmp[1] * static_cast(nky) + static_cast(2 * nky)) % nky; + kloc = nint(xk_tmp[2] * static_cast(nkz) + static_cast(2 * nkz)) % nkz; - ik4 = kloc + nkz * jloc + nky * nkz * iloc; + unsigned int ik4 = kloc + nkz * jloc + nky * nkz * iloc; - for (is1 = 0; is1 < ns; ++is1) { - omega1 = dynamical->eval_phonon[ik1][is1]; + for (unsigned int is1 = 0; is1 < ns; ++is1) { + double omega1 = dynamical->eval_phonon[ik1][is1]; arr_cubic1[1] = ns * ik1 + is1; arr_cubic2[0] = ns * kpoint->knum_minus[ik1] + is1; - for (is2 = 0; is2 < ns; ++is2) { - omega2 = dynamical->eval_phonon[ik2][is2]; + for (unsigned int is2 = 0; is2 < ns; ++is2) { + double omega2 = dynamical->eval_phonon[ik2][is2]; arr_cubic1[2] = ns * ik2 + is2; arr_cubic3[0] = ns * kpoint->knum_minus[ik2] + is2; - v3_tmp1 = relaxation->V3(arr_cubic1); + std::complex v3_tmp1 = anharmonic_core->V3(arr_cubic1); - for (is3 = 0; is3 < ns; ++ is3) { - omega3 = dynamical->eval_phonon[ik3][is3]; + for (unsigned int is3 = 0; is3 < ns; ++ is3) { + double omega3 = dynamical->eval_phonon[ik3][is3]; arr_cubic2[1] = ns * ik3 + is3; arr_cubic3[1] = ns * kpoint->knum_minus[ik3] + is3; - for (is4 = 0; is4 < ns; ++is4) { - omega4 = dynamical->eval_phonon[ik4][is4]; + for (unsigned int is4 = 0; is4 < ns; ++is4) { + double omega4 = dynamical->eval_phonon[ik4][is4]; arr_cubic3[2] = ns * ik4 + is4; arr_cubic4[0] = ns * kpoint->knum_minus[ik4] + is4; - v3_tmp3 = relaxation->V3(arr_cubic3); + std::complex v3_tmp3 = anharmonic_core->V3(arr_cubic3); - for (is5 = 0; is5 < ns; ++is5) { - omega5 = dynamical->eval_phonon[ik5][is5]; + for (unsigned int is5 = 0; is5 < ns; ++is5) { + double omega5 = dynamical->eval_phonon[ik5][is5]; arr_cubic2[2] = ns * ik5 + is5; arr_cubic4[1] = ns * kpoint->knum_minus[ik5] + is5; - v3_tmp2 = relaxation->V3(arr_cubic2); - v3_tmp4 = relaxation->V3(arr_cubic4); + std::complex v3_tmp2 = anharmonic_core->V3(arr_cubic2); + std::complex v3_tmp4 = anharmonic_core->V3(arr_cubic4); - v_prod = v3_tmp1 * v3_tmp2 * v3_tmp3 * v3_tmp4; + std::complex v_prod = v3_tmp1 * v3_tmp2 * v3_tmp3 * v3_tmp4; - for (ip1 = 1; ip1 >= -1; ip1 -= 2) { - dp1 = static_cast(ip1) * omega1; + for (int ip1 = 1; ip1 >= -1; ip1 -= 2) { + double dp1 = static_cast(ip1) * omega1; - for (ip2 = 1; ip2 >= -1; ip2 -= 2) { - dp2 = static_cast(ip2) * omega2; + for (int ip2 = 1; ip2 >= -1; ip2 -= 2) { + double dp2 = static_cast(ip2) * omega2; omega_sum[0] = 1.0 / (omega_shift + dp1 - dp2); - for (ip3 = 1; ip3 >= -1; ip3 -= 2) { - dp3 = static_cast(ip3) * omega3; + for (int ip3 = 1; ip3 >= -1; ip3 -= 2) { + double dp3 = static_cast(ip3) * omega3; - for (ip4 = 1; ip4 >= -1; ip4 -= 2) { - dp4 = static_cast(ip4) * omega4; + for (int ip4 = 1; ip4 >= -1; ip4 -= 2) { + double dp4 = static_cast(ip4) * omega4; - D2 = dp4 - dp3 - dp2; - D2_inv = 1.0 / D2; + double D2 = dp4 - dp3 - dp2; + double D2_inv = 1.0 / D2; omega_sum[3] = 1.0 / (omega_shift + dp1 + dp3 - dp4); - for (ip5 = 1; ip5 >= -1; ip5 -= 2) { - dp5 = static_cast(ip5) * omega5; + for (int ip5 = 1; ip5 >= -1; ip5 -= 2) { + double dp5 = static_cast(ip5) * omega5; - D1 = dp5 - dp3 - dp1; - D1_inv = 1.0 / D1; - D12_inv = D1_inv * D2_inv; + double D1 = dp5 - dp3 - dp1; + double D1_inv = 1.0 / D1; + double D12_inv = D1_inv * D2_inv; omega_sum[1] = 1.0 / (omega_shift - dp4 + dp5); omega_sum[2] = 1.0 / (omega_shift - dp2 - dp3 + dp5); for (i = 0; i < N; ++i) { - T_tmp = T[i]; + double T_tmp = T[i]; - n1 = thermodynamics->fB(dp1, T_tmp); - n2 = thermodynamics->fB(dp2, T_tmp); - n3 = thermodynamics->fB(dp3, T_tmp); - n4 = thermodynamics->fB(dp4, T_tmp); - n5 = thermodynamics->fB(dp5, T_tmp); + double n1 = thermodynamics->fB(dp1, T_tmp); + double n2 = thermodynamics->fB(dp2, T_tmp); + double n3 = thermodynamics->fB(dp3, T_tmp); + double n4 = thermodynamics->fB(dp4, T_tmp); + double n5 = thermodynamics->fB(dp5, T_tmp); - N12 = n1 - n2; - N34 = n3 - n4; - N35 = n3 - n5; + double N12 = n1 - n2; + double N34 = n3 - n4; + double N35 = n3 - n5; N_prod[0] = N12 * (1.0 + n3); - N_prod[1] = (1.0 + n2 + n3) * (1.0 + n5) - (1.0 + n1 + n3) * (1.0 + n4); - N_prod[2] = ((1.0 + n2) * N35 - n3 * (1.0 + n5)); + N_prod[1] = (1.0 + n2 + n3) * (1.0 + n5) - (1.0 + n1 + n3) * ( + 1.0 + n4); + N_prod[2] = (1.0 + n2) * N35 - n3 * (1.0 + n5); N_prod[3] = -((1.0 + n1) * N34 - n3 * (1.0 + n4)); ret_mpi[i] @@ -1395,7 +1310,7 @@ void Selfenergy::selfenergy_h(const unsigned int N, } } - factor = 1.0 / (std::pow(static_cast(nk), 2) * std::pow(2.0, 7)); + double factor = 1.0 / (std::pow(static_cast(nk), 2) * std::pow(2.0, 7)); for (i = 0; i < N; ++i) ret_mpi[i] *= factor; mpi_reduce_complex(N, ret_mpi, ret); @@ -1409,7 +1324,7 @@ void Selfenergy::selfenergy_i(const unsigned int N, const double omega, const unsigned int knum, const unsigned int snum, - std::complex *ret) + std::complex *ret) const { /* @@ -1422,29 +1337,25 @@ void Selfenergy::selfenergy_i(const unsigned int N, */ unsigned int i; - unsigned int ik1, ik2, ik3, ik4; - unsigned int is1, is2, is3, is4; + unsigned int is1, is3; unsigned int arr_quartic[4]; unsigned int arr_cubic1[3], arr_cubic2[3]; - unsigned int iloc, jloc, kloc; unsigned int nkx = kpoint->nkx; unsigned int nky = kpoint->nky; unsigned int nkz = kpoint->nkz; - int ip1, ip2, ip3, ip4; + int ip1, ip2, ip3; - double omega1, omega2, omega3, omega4; - double n1, n2, n3, n4; - double dp1, dp2, dp3, dp4; - double D24, D123, D134; - double dp2_inv; + double omega1, omega3; + double n1, n2, n3; + double dp1, dp2, dp3; + double D123; double T_tmp; - double factor; double xk_tmp[3]; double N_prod[2]; double T_inv; - std::complex v4_tmp, v3_tmp1, v3_tmp2; + std::complex v3_tmp1, v3_tmp2; std::complex v_prod; std::complex *ret_mpi; @@ -1455,33 +1366,33 @@ void Selfenergy::selfenergy_i(const unsigned int N, arr_quartic[0] = ns * kpoint->knum_minus[knum] + snum; arr_quartic[3] = ns * knum + snum; - for (ik1 = mympi->my_rank; ik1 < nk; ik1 += mympi->nprocs) { - for (ik2 = 0; ik2 < nk; ++ik2) { + for (unsigned int ik1 = mympi->my_rank; ik1 < nk; ik1 += mympi->nprocs) { + for (unsigned int ik2 = 0; ik2 < nk; ++ik2) { - ik4 = ik2; + unsigned int ik4 = ik2; xk_tmp[0] = kpoint->xk[ik2][0] - kpoint->xk[ik1][0]; xk_tmp[1] = kpoint->xk[ik2][1] - kpoint->xk[ik1][1]; xk_tmp[2] = kpoint->xk[ik2][2] - kpoint->xk[ik1][2]; - iloc = (nint(xk_tmp[0] * static_cast(nkx) + static_cast(2 * nkx))) % nkx; - jloc = (nint(xk_tmp[1] * static_cast(nky) + static_cast(2 * nky))) % nky; - kloc = (nint(xk_tmp[2] * static_cast(nkz) + static_cast(2 * nkz))) % nkz; + unsigned int iloc = nint(xk_tmp[0] * static_cast(nkx) + static_cast(2 * nkx)) % nkx; + unsigned int jloc = nint(xk_tmp[1] * static_cast(nky) + static_cast(2 * nky)) % nky; + unsigned int kloc = nint(xk_tmp[2] * static_cast(nkz) + static_cast(2 * nkz)) % nkz; - ik3 = kloc + nkz * jloc + nky * nkz * iloc; + unsigned int ik3 = kloc + nkz * jloc + nky * nkz * iloc; - for (is2 = 0; is2 < ns; ++is2) { - omega2 = dynamical->eval_phonon[ik2][is2]; + for (unsigned int is2 = 0; is2 < ns; ++is2) { + double omega2 = dynamical->eval_phonon[ik2][is2]; arr_quartic[1] = ns * ik2 + is2; arr_cubic2[0] = ns * kpoint->knum_minus[ik2] + is2; - for (is4 = 0; is4 < ns; ++is4) { - omega4 = dynamical->eval_phonon[ik4][is4]; + for (unsigned int is4 = 0; is4 < ns; ++is4) { + double omega4 = dynamical->eval_phonon[ik4][is4]; arr_quartic[2] = ns * kpoint->knum_minus[ik4] + is4; arr_cubic1[2] = ns * ik4 + is4; - v4_tmp = relaxation->V4(arr_quartic); + std::complex v4_tmp = anharmonic_core->V4(arr_quartic); if (std::abs(omega2 - omega4) < eps) { @@ -1497,8 +1408,8 @@ void Selfenergy::selfenergy_i(const unsigned int N, arr_cubic1[0] = ns * kpoint->knum_minus[ik1] + is1; arr_cubic2[1] = ns * ik1 + is1; - v3_tmp1 = relaxation->V3(arr_cubic1); - v3_tmp2 = relaxation->V3(arr_cubic2); + v3_tmp1 = anharmonic_core->V3(arr_cubic1); + v3_tmp2 = anharmonic_core->V3(arr_cubic2); v_prod = v4_tmp * v3_tmp1 * v3_tmp2; @@ -1508,7 +1419,7 @@ void Selfenergy::selfenergy_i(const unsigned int N, for (ip2 = 1; ip2 >= -1; ip2 -= 2) { dp2 = static_cast(ip2) * omega2; - dp2_inv = 1.0 / dp2; + double dp2_inv = 1.0 / dp2; for (ip3 = 1; ip3 >= -1; ip3 -= 2) { dp3 = static_cast(ip3) * omega3; @@ -1533,7 +1444,8 @@ void Selfenergy::selfenergy_i(const unsigned int N, ret_mpi[i] += v_prod * static_cast(ip1 * ip3) - * (D123 * (N_prod[0] * D123 + N_prod[1] * T_inv + N_prod[0] * dp2_inv)); + * (D123 * (N_prod[0] * D123 + N_prod[1] * T_inv + N_prod[0] * + dp2_inv)); } } } @@ -1554,8 +1466,8 @@ void Selfenergy::selfenergy_i(const unsigned int N, arr_cubic1[0] = ns * kpoint->knum_minus[ik1] + is1; arr_cubic2[1] = ns * ik1 + is1; - v3_tmp1 = relaxation->V3(arr_cubic1); - v3_tmp2 = relaxation->V3(arr_cubic2); + v3_tmp1 = anharmonic_core->V3(arr_cubic1); + v3_tmp2 = anharmonic_core->V3(arr_cubic2); v_prod = v4_tmp * v3_tmp1 * v3_tmp2; @@ -1570,11 +1482,11 @@ void Selfenergy::selfenergy_i(const unsigned int N, dp3 = static_cast(ip3) * omega3; D123 = 1.0 / (dp1 - dp2 + dp3); - for (ip4 = 1; ip4 >= -1; ip4 -= 2) { - dp4 = static_cast(ip4) * omega4; + for (int ip4 = 1; ip4 >= -1; ip4 -= 2) { + double dp4 = static_cast(ip4) * omega4; - D24 = 1.0 / (dp2 - dp4); - D134 = 1.0 / (dp1 + dp3 - dp4); + double D24 = 1.0 / (dp2 - dp4); + double D134 = 1.0 / (dp1 + dp3 - dp4); for (i = 0; i < N; ++i) { T_tmp = T[i]; @@ -1582,7 +1494,7 @@ void Selfenergy::selfenergy_i(const unsigned int N, n1 = thermodynamics->fB(dp1, T_tmp); n2 = thermodynamics->fB(dp2, T_tmp); n3 = thermodynamics->fB(dp3, T_tmp); - n4 = thermodynamics->fB(dp4, T_tmp); + double n4 = thermodynamics->fB(dp4, T_tmp); ret_mpi[i] += v_prod * static_cast(ip1 * ip2 * ip3 * ip4) @@ -1601,7 +1513,7 @@ void Selfenergy::selfenergy_i(const unsigned int N, } } - factor = -1.0 / (std::pow(static_cast(nk), 2) * std::pow(2.0, 7)); + double factor = -1.0 / (std::pow(static_cast(nk), 2) * std::pow(2.0, 7)); for (i = 0; i < N; ++i) ret_mpi[i] *= factor; mpi_reduce_complex(N, ret_mpi, ret); @@ -1615,7 +1527,7 @@ void Selfenergy::selfenergy_j(const unsigned int N, const double omega, const unsigned int knum, const unsigned int snum, - std::complex *ret) + std::complex *ret) const { /* @@ -1627,22 +1539,19 @@ void Selfenergy::selfenergy_j(const unsigned int N, */ unsigned int i; - unsigned int ik1, ik2, ik3; - unsigned int is1, is2, is3; + unsigned int is2; unsigned int arr_quartic1[4], arr_quartic2[4]; unsigned int nkx = kpoint->nkx; unsigned int nky = kpoint->nky; unsigned int nkz = kpoint->nkz; double T_tmp; - double factor; - double n1, n2, n3; - double omega1, omega2, omega3; - double omega1_inv; + double n1, n2; + double omega2; double D13[2]; double T_inv; - std::complex v4_tmp1, v4_tmp2; + std::complex v4_tmp2; std::complex v_prod; std::complex *ret_mpi; @@ -1653,29 +1562,29 @@ void Selfenergy::selfenergy_j(const unsigned int N, arr_quartic1[0] = ns * kpoint->knum_minus[knum] + snum; arr_quartic1[3] = ns * knum + snum; - for (ik1 = mympi->my_rank; ik1 < nk; ik1 += mympi->nprocs) { + for (unsigned int ik1 = mympi->my_rank; ik1 < nk; ik1 += mympi->nprocs) { - ik3 = ik1; + unsigned int ik3 = ik1; - for (ik2 = 0; ik2 < nk; ++ik2) { + for (unsigned int ik2 = 0; ik2 < nk; ++ik2) { - for (is1 = 0; is1 < ns; ++is1) { - omega1 = dynamical->eval_phonon[ik1][is1]; + for (unsigned int is1 = 0; is1 < ns; ++is1) { + double omega1 = dynamical->eval_phonon[ik1][is1]; arr_quartic1[1] = ns * ik1 + is1; arr_quartic2[0] = ns * kpoint->knum_minus[ik1] + is1; - for (is3 = 0; is3 < ns; ++is3) { - omega3 = dynamical->eval_phonon[ik1][is3]; + for (unsigned int is3 = 0; is3 < ns; ++is3) { + double omega3 = dynamical->eval_phonon[ik1][is3]; arr_quartic1[2] = ns * kpoint->knum_minus[ik3] + is3; arr_quartic2[3] = ns * ik3 + is3; - v4_tmp1 = relaxation->V4(arr_quartic1); + std::complex v4_tmp1 = anharmonic_core->V4(arr_quartic1); if (std::abs(omega1 - omega3) < eps) { - omega1_inv = 1.0 / omega1; + double omega1_inv = 1.0 / omega1; for (is2 = 0; is2 < ns; ++is2) { omega2 = dynamical->eval_phonon[ik2][is2]; @@ -1683,7 +1592,7 @@ void Selfenergy::selfenergy_j(const unsigned int N, arr_quartic2[1] = ns * ik2 + is2; arr_quartic2[2] = ns * kpoint->knum_minus[ik2] + is2; - v4_tmp2 = relaxation->V4(arr_quartic2); + v4_tmp2 = anharmonic_core->V4(arr_quartic2); v_prod = v4_tmp1 * v4_tmp2; @@ -1716,7 +1625,7 @@ void Selfenergy::selfenergy_j(const unsigned int N, arr_quartic2[1] = ns * ik2 + is2; arr_quartic2[2] = ns * kpoint->knum_minus[ik2] + is2; - v4_tmp2 = relaxation->V4(arr_quartic2); + v4_tmp2 = anharmonic_core->V4(arr_quartic2); v_prod = v4_tmp1 * v4_tmp2; @@ -1725,7 +1634,7 @@ void Selfenergy::selfenergy_j(const unsigned int N, n1 = thermodynamics->fB(omega1, T_tmp); n2 = thermodynamics->fB(omega2, T_tmp); - n3 = thermodynamics->fB(omega3, T_tmp); + double n3 = thermodynamics->fB(omega3, T_tmp); ret_mpi[i] += v_prod * 2.0 @@ -1738,7 +1647,7 @@ void Selfenergy::selfenergy_j(const unsigned int N, } } - factor = -1.0 / (std::pow(static_cast(nk), 2) * std::pow(2.0, 6)); + double factor = -1.0 / (std::pow(static_cast(nk), 2) * std::pow(2.0, 6)); for (i = 0; i < N; ++i) ret_mpi[i] *= factor; diff --git a/anphon/selfenergy.h b/anphon/selfenergy.h index e88b0f5d..85ef5689 100644 --- a/anphon/selfenergy.h +++ b/anphon/selfenergy.h @@ -21,59 +21,95 @@ namespace PHON_NS { public: Selfenergy(class PHON *phon); + ~Selfenergy(); void setup_selfenergy(); - void selfenergy_tadpole(const unsigned int, double *, const double, - const unsigned int, const unsigned int, - std::complex *); - - void selfenergy_a(const unsigned int, double *, const double, - const unsigned int, const unsigned int, - std::complex *); - - void selfenergy_b(const unsigned int, double *, const double, - const unsigned int, const unsigned int, - std::complex *); - - void selfenergy_c(const unsigned int, double *, const double, - const unsigned int, const unsigned int, - std::complex *); - - void selfenergy_d(const unsigned int, double *, const double, - const unsigned int, const unsigned int, - std::complex *); - - void selfenergy_e(const unsigned int, double *, const double, - const unsigned int, const unsigned int, - std::complex *); - void selfenergy_f(const unsigned int, double *, const double, - const unsigned int, const unsigned int, - std::complex *); - - void selfenergy_g(const unsigned int, double *, const double, - const unsigned int, const unsigned int, - std::complex *); - - void selfenergy_h(const unsigned int, double *, const double, - const unsigned int, const unsigned int, - std::complex *); - - void selfenergy_i(const unsigned int, double *, const double, - const unsigned int, const unsigned int, - std::complex *); - - void selfenergy_j(const unsigned int, double *, const double, - const unsigned int, const unsigned int, - std::complex *); + void selfenergy_tadpole(const unsigned int, + double *, + const double, + const unsigned int, + const unsigned int, + std::complex *) const; + + void selfenergy_a(const unsigned int, + double *, + const double, + const unsigned int, + const unsigned int, + std::complex *) const; + + void selfenergy_b(const unsigned int, + double *, + const double, + const unsigned int, + const unsigned int, + std::complex *) const; + + void selfenergy_c(const unsigned int, + double *, + const double, + const unsigned int, + const unsigned int, + std::complex *) const; + + void selfenergy_d(const unsigned int, + double *, + const double, + const unsigned int, + const unsigned int, + std::complex *) const; + + void selfenergy_e(const unsigned int, + double *, + const double, + const unsigned int, + const unsigned int, + std::complex *) const; + + void selfenergy_f(const unsigned int, + double *, + const double, + const unsigned int, + const unsigned int, + std::complex *) const; + + void selfenergy_g(const unsigned int, + double *, + const double, + const unsigned int, + const unsigned int, + std::complex *) const; + + void selfenergy_h(const unsigned int, + double *, + const double, + const unsigned int, + const unsigned int, + std::complex *) const; + + void selfenergy_i(const unsigned int, + double *, + const double, + const unsigned int, + const unsigned int, + std::complex *) const; + + void selfenergy_j(const unsigned int, + double *, + const double, + const unsigned int, + const unsigned int, + std::complex *) const; private: std::complex im; unsigned int ns, nk; double epsilon; + void mpi_reduce_complex(unsigned int, std::complex *, - std::complex *); + std::complex *) const; }; } diff --git a/anphon/symmetry_core.cpp b/anphon/symmetry_core.cpp index 3928dcfb..f97a5828 100644 --- a/anphon/symmetry_core.cpp +++ b/anphon/symmetry_core.cpp @@ -10,48 +10,50 @@ #include "mpi_common.h" #include "symmetry_core.h" -#include "memory.h" #include "constants.h" #include "error.h" +#include "mathfunctions.h" +#include "memory.h" #include "system.h" #include #include #include -#include -#include "mathfunctions.h" - -#ifdef _USE_EIGEN -#include -#endif using namespace PHON_NS; Symmetry::Symmetry(PHON *phon): Pointers(phon) { - file_sym = "SYMM_INFO_PRIM"; - time_reversal_sym = false; + set_default_variables(); } -Symmetry::~Symmetry() +Symmetry::~Symmetry() {} + + +void Symmetry::set_default_variables() { + file_sym = "SYMM_INFO_PRIM"; + time_reversal_sym = false; + nsym = 0; + symmetry_flag = true; + printsymmetry = false; + tolerance = 1.0e-3; } + void Symmetry::setup_symmetry() { - unsigned int natmin = system->natmin; + const auto natmin = system->natmin; double **xtmp; unsigned int *kdtmp; memory->allocate(xtmp, natmin, 3); memory->allocate(kdtmp, natmin); - unsigned int i, j; - - for (i = 0; i < natmin; ++i) { + for (auto i = 0; i < natmin; ++i) { rotvec(xtmp[i], system->xr_s[system->map_p2s[i][0]], system->lavec_s); rotvec(xtmp[i], xtmp[i], system->rlavec_p); - for (j = 0; j < 3; ++j) xtmp[i][j] /= 2.0 * pi; + for (auto j = 0; j < 3; ++j) xtmp[i][j] /= 2.0 * pi; kdtmp[i] = system->kd[system->map_p2s[i][0]]; } @@ -61,8 +63,12 @@ void Symmetry::setup_symmetry() if (mympi->my_rank == 0) { std::cout << " Symmetry" << std::endl; std::cout << " ========" << std::endl << std::endl; - setup_symmetry_operation(natmin, nsym, system->lavec_p, - system->rlavec_p, xtmp, kdtmp); + setup_symmetry_operation(natmin, + nsym, + system->lavec_p, + system->rlavec_p, + xtmp, + kdtmp); } MPI_Bcast(&nsym, 1, MPI_UNSIGNED, 0, MPI_COMM_WORLD); @@ -73,6 +79,8 @@ void Symmetry::setup_symmetry() << nsym << std::endl << std::endl; gensym_withmap(xtmp, kdtmp); } + memory->deallocate(xtmp); + memory->deallocate(kdtmp); } void Symmetry::setup_symmetry_operation(int N, @@ -105,15 +113,15 @@ void Symmetry::setup_symmetry_operation(int N, ofs_sym.open(file_sym.c_str(), std::ios::out); ofs_sym << nsym << std::endl; - for (auto p = SymmList.begin(); p != SymmList.end(); ++p) { + for (const auto &p : SymmList) { for (i = 0; i < 3; ++i) { for (j = 0; j < 3; ++j) { - ofs_sym << std::setw(4) << (*p).rot[i][j]; + ofs_sym << std::setw(4) << p.rot[i][j]; } } ofs_sym << " "; for (i = 0; i < 3; ++i) { - ofs_sym << std::setprecision(15) << std::setw(20) << (*p).tran[i]; + ofs_sym << std::setprecision(15) << std::setw(20) << p.tran[i]; } ofs_sym << std::endl; } @@ -142,7 +150,7 @@ void Symmetry::setup_symmetry_operation(int N, tran_tmp[i] = 0.0; } - SymmList.push_back(SymmetryOperation(rot_tmp, tran_tmp)); + SymmList.emplace_back(rot_tmp, tran_tmp); } else { @@ -168,7 +176,7 @@ void Symmetry::setup_symmetry_operation(int N, >> rot_tmp[2][0] >> rot_tmp[2][1] >> rot_tmp[2][2] >> tran_tmp[0] >> tran_tmp[1] >> tran_tmp[2]; - SymmList.push_back(SymmetryOperation(rot_tmp, tran_tmp)); + SymmList.emplace_back(rot_tmp, tran_tmp); } ifs_sym.close(); } @@ -195,7 +203,7 @@ void Symmetry::findsym(int N, } void Symmetry::find_lattice_symmetry(double aa[3][3], - std::vector &LatticeSymmList) + std::vector &LatticeSymmList) const { /* Find the rotational matrices that leave the metric tensor invariant. @@ -206,11 +214,9 @@ void Symmetry::find_lattice_symmetry(double aa[3][3], */ int i, j, k; - int m11, m12, m13, m21, m22, m23, m31, m32, m33; int nsym_tmp = 0; int mat_tmp[3][3]; - double det, res; double rot_tmp[3][3]; double aa_rot[3][3]; @@ -238,24 +244,24 @@ void Symmetry::find_lattice_symmetry(double aa[3][3], } // Identity matrix should be the first entry. - LatticeSymmList.push_back(mat_tmp); - - for (m11 = -1; m11 <= 1; ++m11) { - for (m12 = -1; m12 <= 1; ++m12) { - for (m13 = -1; m13 <= 1; ++m13) { - for (m21 = -1; m21 <= 1; ++m21) { - for (m22 = -1; m22 <= 1; ++m22) { - for (m23 = -1; m23 <= 1; ++m23) { - for (m31 = -1; m31 <= 1; ++m31) { - for (m32 = -1; m32 <= 1; ++m32) { - for (m33 = -1; m33 <= 1; ++m33) { + LatticeSymmList.emplace_back(mat_tmp); + + for (int m11 = -1; m11 <= 1; ++m11) { + for (int m12 = -1; m12 <= 1; ++m12) { + for (int m13 = -1; m13 <= 1; ++m13) { + for (int m21 = -1; m21 <= 1; ++m21) { + for (int m22 = -1; m22 <= 1; ++m22) { + for (int m23 = -1; m23 <= 1; ++m23) { + for (int m31 = -1; m31 <= 1; ++m31) { + for (int m32 = -1; m32 <= 1; ++m32) { + for (int m33 = -1; m33 <= 1; ++m33) { if (m11 == 1 && m12 == 0 && m13 == 0 && m21 == 0 && m22 == 1 && m23 == 0 && m31 == 0 && m32 == 0 && m33 == 1) continue; - det = m11 * (m22 * m33 - m32 * m23) + double det = m11 * (m22 * m33 - m32 * m23) - m21 * (m12 * m33 - m32 * m13) + m31 * (m12 * m23 - m22 * m13); @@ -283,7 +289,7 @@ void Symmetry::find_lattice_symmetry(double aa[3][3], } } - res = 0.0; + double res = 0.0; for (i = 0; i < 3; ++i) { for (j = 0; j < 3; ++j) { res += std::pow(metric_tensor[i][j] - metric_tensor_rot[i][j], 2.0); @@ -299,7 +305,7 @@ void Symmetry::find_lattice_symmetry(double aa[3][3], mat_tmp[i][j] = static_cast(rot_tmp[i][j]); } } - LatticeSymmList.push_back(mat_tmp); + LatticeSymmList.emplace_back(mat_tmp); } } @@ -321,11 +327,11 @@ void Symmetry::find_crystal_symmetry(int N, int nclass, std::vector *atomclass, double **x, - std::vector LatticeSymmList, - std::vector &CrystalSymmList) + const std::vector &LatticeSymmList, + std::vector &CrystalSymmList) const { unsigned int i, j; - unsigned int iat, jat, kat, lat; + unsigned int jat, kat, lat; double x_rot[3]; double rot[3][3], rot_tmp[3][3], rot_cart[3][3]; double tran[3]; @@ -336,13 +342,9 @@ void Symmetry::find_crystal_symmetry(int N, int rot_int[3][3]; - int ii, jj, kk; - unsigned int itype; - bool is_found; bool isok; bool mag_sym1, mag_sym2; - bool is_identity_matrix; @@ -358,16 +360,15 @@ void Symmetry::find_crystal_symmetry(int N, tran[i] = 0.0; } - CrystalSymmList.push_back(SymmetryOperation(rot_int, tran)); - + CrystalSymmList.emplace_back(rot_int, tran); - for (auto it_latsym = LatticeSymmList.begin(); it_latsym != LatticeSymmList.end(); ++it_latsym) { + for (const auto &it_latsym : LatticeSymmList) { - iat = atomclass[0][0]; + unsigned int iat = atomclass[0][0]; for (i = 0; i < 3; ++i) { for (j = 0; j < 3; ++j) { - rot[i][j] = static_cast((*it_latsym).mat[i][j]); + rot[i][j] = static_cast(it_latsym.mat[i][j]); } } @@ -375,9 +376,9 @@ void Symmetry::find_crystal_symmetry(int N, #ifdef _OPENMP #pragma omp parallel for private(jat, tran, isok, kat, x_rot_tmp, is_found, lat, tmp, diff, \ - i, j, itype, jj, kk, is_identity_matrix, mag, mag_rot, rot_tmp, rot_cart, mag_sym1, mag_sym2) + i, j, is_identity_matrix, mag, mag_rot, rot_tmp, rot_cart, mag_sym1, mag_sym2) #endif - for (ii = 0; ii < atomclass[0].size(); ++ii) { + for (int ii = 0; ii < atomclass[0].size(); ++ii) { jat = atomclass[0][ii]; for (i = 0; i < 3; ++i) { @@ -388,16 +389,16 @@ void Symmetry::find_crystal_symmetry(int N, isok = true; is_identity_matrix = - (std::pow(rot[0][0] - 1.0, 2) + std::pow(rot[0][1], 2) + std::pow(rot[0][2], 2) + std::pow(rot[0][0] - 1.0, 2) + std::pow(rot[0][1], 2) + std::pow(rot[0][2], 2) + std::pow(rot[1][0], 2) + std::pow(rot[1][1] - 1.0, 2) + std::pow(rot[1][2], 2) + std::pow(rot[2][0], 2) + std::pow(rot[2][1], 2) + std::pow(rot[2][2] - 1.0, 2) - + std::pow(tran[0], 2) + std::pow(tran[1], 2) + std::pow(tran[2], 2)) < eps12; + + std::pow(tran[0], 2) + std::pow(tran[1], 2) + std::pow(tran[2], 2) < eps12; if (is_identity_matrix) continue; - for (itype = 0; itype < nclass; ++itype) { + for (unsigned int itype = 0; itype < nclass; ++itype) { - for (jj = 0; jj < atomclass[itype].size(); ++jj) { + for (int jj = 0; jj < atomclass[itype].size(); ++jj) { kat = atomclass[itype][jj]; @@ -409,7 +410,7 @@ void Symmetry::find_crystal_symmetry(int N, is_found = false; - for (kk = 0; kk < atomclass[itype].size(); ++kk) { + for (int kk = 0; kk < atomclass[itype].size(); ++kk) { lat = atomclass[itype][kk]; @@ -440,7 +441,7 @@ void Symmetry::find_crystal_symmetry(int N, for (i = 0; i < 3; ++i) { for (j = 0; j < 3; ++j) { - rot_cart[i][j] /= (2.0 * pi); + rot_cart[i][j] /= 2.0 * pi; } } rotvec(mag_rot, mag_rot, rot_cart); @@ -453,13 +454,13 @@ void Symmetry::find_crystal_symmetry(int N, } } - mag_sym1 = (std::pow(mag[0] - mag_rot[0], 2.0) + mag_sym1 = std::pow(mag[0] - mag_rot[0], 2.0) + std::pow(mag[1] - mag_rot[1], 2.0) - + std::pow(mag[2] - mag_rot[2], 2.0)) < eps6; + + std::pow(mag[2] - mag_rot[2], 2.0) < eps6; - mag_sym2 = (std::pow(mag[0] + mag_rot[0], 2.0) + mag_sym2 = std::pow(mag[0] + mag_rot[0], 2.0) + std::pow(mag[1] + mag_rot[1], 2.0) - + std::pow(mag[2] + mag_rot[2], 2.0)) < eps6; + + std::pow(mag[2] + mag_rot[2], 2.0) < eps6; if (!mag_sym1 && !mag_sym2) { isok = false; @@ -473,7 +474,7 @@ void Symmetry::find_crystal_symmetry(int N, #ifdef _OPENMP #pragma omp critical #endif - CrystalSymmList.push_back(SymmetryOperation((*it_latsym).mat, tran)); + CrystalSymmList.emplace_back(it_latsym.mat, tran); } } @@ -482,32 +483,30 @@ void Symmetry::find_crystal_symmetry(int N, void Symmetry::gensym_withmap(double **x, - unsigned int *kd) + const unsigned int *kd) { // Generate symmetry operations in Cartesian coordinate with the atom-mapping information. double S[3][3], T[3][3], S_recip[3][3], mat_tmp[3][3]; double shift[3], x_mod[3], tmp[3]; - double diff; unsigned int *map_tmp; - int i, j, k; - int num_mapped; + int i, j; unsigned int natmin = system->natmin; SymmListWithMap.clear(); memory->allocate(map_tmp, natmin); - for (auto isym = SymmList.begin(); isym != SymmList.end(); ++isym) { + for (const auto &isym : SymmList) { for (i = 0; i < 3; ++i) { for (j = 0; j < 3; ++j) { - T[i][j] = static_cast((*isym).rot[i][j]); + T[i][j] = static_cast(isym.rot[i][j]); } } for (i = 0; i < 3; ++i) { - shift[i] = (*isym).tran[i]; + shift[i] = isym.tran[i]; } invmat3(mat_tmp, T); @@ -536,17 +535,17 @@ void Symmetry::gensym_withmap(double **x, x_mod[j] += shift[j]; } - num_mapped = -1; + int num_mapped = -1; for (j = 0; j < natmin; ++j) { if (kd[j] == kd[i]) { - for (k = 0; k < 3; ++k) { + for (int k = 0; k < 3; ++k) { tmp[k] = std::fmod(std::abs(x_mod[k] - x[j][k]), 1.0); tmp[k] = std::min(tmp[k], 1.0 - tmp[k]); } - diff = tmp[0] * tmp[0] + tmp[1] * tmp[1] + tmp[2] * tmp[2]; + double diff = tmp[0] * tmp[0] + tmp[1] * tmp[1] + tmp[2] * tmp[2]; if (diff < tolerance * tolerance) { num_mapped = j; break; @@ -562,13 +561,17 @@ void Symmetry::gensym_withmap(double **x, // Add to vector - SymmListWithMap.push_back(SymmetryOperationWithMapping(S, T, S_recip, - map_tmp, natmin, shift)); + SymmListWithMap.emplace_back(S, + T, + S_recip, + map_tmp, + natmin, + shift); } } -void Symmetry::broadcast_symmlist(std::vector &sym) +void Symmetry::broadcast_symmlist(std::vector &sym) const { int i, j, k; int n; @@ -603,7 +606,7 @@ void Symmetry::broadcast_symmlist(std::vector &sym) } tran[j] = tran_tmp[i][j]; } - sym.push_back(SymmetryOperation(rot, tran)); + sym.emplace_back(rot, tran); } } @@ -611,12 +614,11 @@ void Symmetry::broadcast_symmlist(std::vector &sym) memory->deallocate(tran_tmp); } -bool Symmetry::is_proper(double rot[3][3]) +bool Symmetry::is_proper(double rot[3][3]) const { - double det; - bool ret; + bool ret = false; - det = rot[0][0] * (rot[1][1] * rot[2][2] - rot[2][1] * rot[1][2]) + double det = rot[0][0] * (rot[1][1] * rot[2][2] - rot[2][1] * rot[1][2]) - rot[1][0] * (rot[0][1] * rot[2][2] - rot[2][1] * rot[0][2]) + rot[2][0] * (rot[0][1] * rot[1][2] - rot[1][1] * rot[0][2]); diff --git a/anphon/symmetry_core.h b/anphon/symmetry_core.h index 09a196ee..869908db 100644 --- a/anphon/symmetry_core.h +++ b/anphon/symmetry_core.h @@ -13,11 +13,6 @@ #include "pointers.h" #include #include -#include - -#ifdef _USE_EIGEN -#include -#endif namespace PHON_NS { @@ -29,7 +24,8 @@ namespace PHON_NS SymmetryOperation(); - SymmetryOperation(const int rot_in[3][3], const double tran_in[3]) + SymmetryOperation(const int rot_in[3][3], + const double tran_in[3]) { for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { @@ -87,8 +83,8 @@ namespace PHON_NS class SymmetryOperationWithMapping { public: - std::vector rot; // Rotation matrix in Cartesian basis - std::vector rot_real; // Rotation matrix in fractional basis + std::vector rot; // Rotation matrix in Cartesian basis + std::vector rot_real; // Rotation matrix in fractional basis std::vector rot_reciprocal; // Rotation matrix in reciprocal (fractional) basis std::vector mapping; double shift[3]; // Translation vector in fractional basis @@ -121,10 +117,11 @@ namespace PHON_NS }; - class Symmetry: protected Pointers + class Symmetry : protected Pointers { public: Symmetry(class PHON *); + ~Symmetry(); unsigned int nsym; @@ -141,22 +138,34 @@ namespace PHON_NS std::string file_sym; - void setup_symmetry_operation(int, unsigned int &, double [3][3], double [3][3], - double **, unsigned int *); - - void findsym(int, double [3][3], double **, + void set_default_variables(); + void setup_symmetry_operation(int, + unsigned int &, + double [3][3], + double [3][3], + double **, + unsigned int *); + + void findsym(int, + double [3][3], + double **, std::vector &); - void gensym_withmap(double **, unsigned int *); - bool is_proper(double [3][3]); - void find_lattice_symmetry(double [3][3], std::vector &); - void find_crystal_symmetry(int, int, - std::vector *, double **x, - std::vector, - std::vector &); + void gensym_withmap(double **, + const unsigned int *); + + bool is_proper(double [3][3]) const; + + void find_lattice_symmetry(double [3][3], + std::vector &) const; - void find_nnp_for_translation(unsigned int &, std::vector); + void find_crystal_symmetry(int, + int, + std::vector *, + double **x, + const std::vector &, + std::vector &) const; - void broadcast_symmlist(std::vector &); + void broadcast_symmlist(std::vector &) const; }; } diff --git a/anphon/system.cpp b/anphon/system.cpp index 0704e8c4..ebd9f10a 100644 --- a/anphon/system.cpp +++ b/anphon/system.cpp @@ -31,28 +31,91 @@ using namespace PHON_NS; System::System(PHON *phon): Pointers(phon) { + set_default_variables(); } System::~System() { - memory->deallocate(xr_p); - memory->deallocate(xr_s); - memory->deallocate(xr_s_anharm); - memory->deallocate(kd); - memory->deallocate(kd_anharm); - memory->deallocate(xc); - memory->deallocate(mass); - memory->deallocate(map_p2s); - memory->deallocate(map_p2s_anharm); - memory->deallocate(map_s2p); - memory->deallocate(map_s2p_anharm); - memory->deallocate(mass_kd); - memory->deallocate(magmom); - if (fcs_phonon->update_fc2) { + deallocate_variables(); +} + +void System::set_default_variables() +{ + xr_p = nullptr; + xr_s = nullptr; + xc = nullptr; + xr_s_anharm = nullptr; + kd = nullptr; + kd_anharm = nullptr; + mass_kd = nullptr; + mass = nullptr; + mass_anharm = nullptr; + symbol_kd = nullptr; + map_p2s = nullptr; + map_p2s_anharm = nullptr; + map_p2s_anharm_orig = nullptr; + map_s2p = nullptr; + map_s2p_anharm = nullptr; + magmom = nullptr; + atomlist_class = nullptr; +} + +void System::deallocate_variables() +{ + if (xr_p) { + memory->deallocate(xr_p); + } + if (xr_s) { + memory->deallocate(xr_s); + } + if (xc) { + memory->deallocate(xc); + } + if (xr_s_anharm) { + memory->deallocate(xr_s_anharm); + } + if (kd) { + memory->deallocate(kd); + } + if (kd_anharm) { + memory->deallocate(kd_anharm); + } + if (mass_kd) { + memory->deallocate(mass_kd); + } + if (mass) { + memory->deallocate(mass); + } + if (mass_anharm) { + memory->deallocate(mass_anharm); + } + if (symbol_kd) { + memory->deallocate(symbol_kd); + } + if (map_p2s) { + memory->deallocate(map_p2s); + } + if (map_p2s_anharm) { + memory->deallocate(map_p2s_anharm); + } + if (map_s2p) { + memory->deallocate(map_s2p); + } + if (map_s2p_anharm) { + memory->deallocate(map_s2p_anharm); + } + if (magmom) { + memory->deallocate(magmom); + } + if (map_p2s_anharm_orig) { memory->deallocate(map_p2s_anharm_orig); } + if (atomlist_class) { + memory->deallocate(atomlist_class); + } } + void System::setup() { using namespace std; @@ -62,6 +125,13 @@ void System::setup() unsigned int *kd_prim; double **xtmp; + if (mympi->my_rank == 0) { + + if (!mass_kd) { + memory->allocate(mass_kd, nkd); + set_mass_elem_from_database(nkd, symbol_kd, mass_kd); + } + } load_system_info_from_XML(); recips(lavec_s, rlavec_s); @@ -252,7 +322,8 @@ void System::setup() if (symmetry->trev_sym_mag) { cout << " Time-reversal symmetry will be considered for generating magnetic space group" << endl; } else { - cout << " Time-reversal symmetry will NOT be considered for generating magnetic space group" << endl; + cout << " Time-reversal symmetry will NOT be considered for generating magnetic space group" << + endl; } } cout << endl; @@ -311,7 +382,6 @@ void System::load_system_info_from_XML() int i; using namespace boost::property_tree; ptree pt; - int nkd_tmp; std::map dict_atomic_kind; @@ -330,7 +400,7 @@ void System::load_system_info_from_XML() nat = boost::lexical_cast( get_value_from_xml(pt, "Data.Structure.NumberOfAtoms")); - nkd_tmp = boost::lexical_cast( + int nkd_tmp = boost::lexical_cast( get_value_from_xml(pt, "Data.Structure.NumberOfElements")); @@ -353,7 +423,7 @@ void System::load_system_info_from_XML() ss.clear(); ss << get_value_from_xml(pt, "Data.Structure.LatticeVector.a" - + boost::lexical_cast(i + 1)); + + std::to_string(i + 1)); ss >> lavec_s[0][i] >> lavec_s[1][i] >> lavec_s[2][i]; } @@ -363,31 +433,31 @@ void System::load_system_info_from_XML() memory->allocate(kd, nat); BOOST_FOREACH (const ptree::value_type& child_, pt.get_child("Data.Structure.AtomicElements")) { - const ptree &child = child_.second; - const unsigned int icount_kd = child.get(".number"); - dict_atomic_kind[boost::lexical_cast(child_.second.data())] = icount_kd - 1; - } + const ptree &child = child_.second; + const unsigned int icount_kd = child.get(".number"); + dict_atomic_kind[boost::lexical_cast(child_.second.data())] = icount_kd - 1; + } unsigned int index; BOOST_FOREACH (const ptree::value_type& child_, pt.get_child("Data.Structure.Position")) { - const ptree &child = child_.second; - const std::string str_index = child.get(".index"); - const std::string str_element = child.get(".element"); + const ptree &child = child_.second; + const std::string str_index = child.get(".index"); + const std::string str_element = child.get(".element"); - ss.str(""); - ss.clear(); - ss << child.data(); + ss.str(""); + ss.clear(); + ss << child.data(); - index = boost::lexical_cast(str_index) - 1; + index = boost::lexical_cast(str_index) - 1; - if (index >= nat) - error->exit("load_system_info_xml", - "index is out of range"); + if (index >= nat) + error->exit("load_system_info_xml", + "index is out of range"); - kd[index] = dict_atomic_kind[str_element]; - ss >> xr_s[index][0] >> xr_s[index][1] >> xr_s[index][2]; - } + kd[index] = dict_atomic_kind[str_element]; + ss >> xr_s[index][0] >> xr_s[index][1] >> xr_s[index][2]; + } dict_atomic_kind.clear(); @@ -396,27 +466,25 @@ void System::load_system_info_from_XML() memory->allocate(map_p2s, natmin, ntran); memory->allocate(map_s2p, nat); - unsigned int tran, atom_p, atom_s; - BOOST_FOREACH (const ptree::value_type& child_, pt.get_child("Data.Symmetry.Translations")) { - const ptree &child = child_.second; - const std::string str_tran = child.get(".tran"); - const std::string str_atom = child.get(".atom"); - - tran = boost::lexical_cast(str_tran) - 1; - atom_p = boost::lexical_cast(str_atom) - 1; - atom_s = boost::lexical_cast(child.data()) - 1; + const ptree &child = child_.second; + const std::string str_tran = child.get(".tran"); + const std::string str_atom = child.get(".atom"); - if (tran >= ntran || atom_p >= natmin || atom_s >= nat) { - error->exit("load_system_info_xml", - "index is out of range"); - } + unsigned int tran = boost::lexical_cast(str_tran) - 1; + unsigned int atom_p = boost::lexical_cast(str_atom) - 1; + unsigned int atom_s = boost::lexical_cast(child.data()) - 1; - map_p2s[atom_p][tran] = atom_s; - map_s2p[atom_s].atom_num = atom_p; - map_s2p[atom_s].tran_num = tran; + if (tran >= ntran || atom_p >= natmin || atom_s >= nat) { + error->exit("load_system_info_xml", + "index is out of range"); } + map_p2s[atom_p][tran] = atom_s; + map_s2p[atom_s].atom_num = atom_p; + map_s2p[atom_s].tran_num = tran; + } + // Parse magnetic moments double **magmom_tmp; @@ -426,25 +494,25 @@ void System::load_system_info_from_XML() lspin = true; try { BOOST_FOREACH (const ptree::value_type& child_, pt.get_child("Data.MagneticMoments")) { - if (child_.first == "mag") { - const ptree &child = child_.second; - const std::string str_index = child.get(".index"); + if (child_.first == "mag") { + const ptree &child = child_.second; + const std::string str_index = child.get(".index"); - ss.str(""); - ss.clear(); - ss << child.data(); + ss.str(""); + ss.clear(); + ss << child.data(); - index = boost::lexical_cast(str_index) - 1; + index = boost::lexical_cast(str_index) - 1; - if (index >= nat) - error->exit("load_system_info_xml", - "index is out of range"); + if (index >= nat) + error->exit("load_system_info_xml", + "index is out of range"); - ss >> magmom_tmp[index][0] - >> magmom_tmp[index][1] - >> magmom_tmp[index][2]; - } + ss >> magmom_tmp[index][0] + >> magmom_tmp[index][1] + >> magmom_tmp[index][2]; } + } } catch (...) { @@ -514,8 +582,6 @@ void System::load_system_info_from_XML() // When FC2XML is given, structural information is updated only for harmonic terms. - int natmin_tmp; - try { read_xml(fcs_phonon->file_fc2, pt); } @@ -543,7 +609,7 @@ void System::load_system_info_from_XML() get_value_from_xml(pt, "Data.Symmetry.NumberOfTranslations")); - natmin_tmp = nat / ntran; + int natmin_tmp = nat / ntran; if (natmin_tmp != natmin) error->exit("load_system_info_from_XML", @@ -564,7 +630,7 @@ void System::load_system_info_from_XML() ss.clear(); ss << get_value_from_xml(pt, "Data.Structure.LatticeVector.a" - + boost::lexical_cast(i + 1)); + + std::to_string(i + 1)); ss >> lavec_s[0][i] >> lavec_s[1][i] >> lavec_s[2][i]; } @@ -574,31 +640,29 @@ void System::load_system_info_from_XML() memory->allocate(kd, nat); BOOST_FOREACH (const ptree::value_type& child_, pt.get_child("Data.Structure.AtomicElements")) { - const ptree &child = child_.second; - const unsigned int icount_kd = child.get(".number"); - dict_atomic_kind[boost::lexical_cast(child_.second.data())] = icount_kd - 1; - } - - unsigned int index; + const ptree &child = child_.second; + const unsigned int icount_kd = child.get(".number"); + dict_atomic_kind[boost::lexical_cast(child_.second.data())] = icount_kd - 1; + } BOOST_FOREACH (const ptree::value_type& child_, pt.get_child("Data.Structure.Position")) { - const ptree &child = child_.second; - const std::string str_index = child.get(".index"); - const std::string str_element = child.get(".element"); + const ptree &child = child_.second; + const std::string str_index = child.get(".index"); + const std::string str_element = child.get(".element"); - ss.str(""); - ss.clear(); - ss << child.data(); + ss.str(""); + ss.clear(); + ss << child.data(); - index = boost::lexical_cast(str_index) - 1; + unsigned int index = boost::lexical_cast(str_index) - 1; - if (index >= nat) - error->exit("load_system_info_xml", - "index is out of range"); + if (index >= nat) + error->exit("load_system_info_xml", + "index is out of range"); - kd[index] = dict_atomic_kind[str_element]; - ss >> xr_s[index][0] >> xr_s[index][1] >> xr_s[index][2]; - } + kd[index] = dict_atomic_kind[str_element]; + ss >> xr_s[index][0] >> xr_s[index][1] >> xr_s[index][2]; + } dict_atomic_kind.clear(); @@ -607,28 +671,25 @@ void System::load_system_info_from_XML() memory->allocate(map_p2s, natmin, ntran); memory->allocate(map_s2p, nat); - unsigned int tran, atom_p, atom_s; - BOOST_FOREACH (const ptree::value_type& child_, pt.get_child("Data.Symmetry.Translations")) { - const ptree &child = child_.second; - const std::string str_tran = child.get(".tran"); - const std::string str_atom = child.get(".atom"); - - tran = boost::lexical_cast(str_tran) - 1; - atom_p = boost::lexical_cast(str_atom) - 1; - atom_s = boost::lexical_cast(child.data()) - 1; + const ptree &child = child_.second; + const std::string str_tran = child.get(".tran"); + const std::string str_atom = child.get(".atom"); - if (tran >= ntran || atom_p >= natmin || atom_s >= nat) { - error->exit("load_system_info_xml", "index is out of range"); - } + unsigned int tran = boost::lexical_cast(str_tran) - 1; + unsigned int atom_p = boost::lexical_cast(str_atom) - 1; + unsigned int atom_s = boost::lexical_cast(child.data()) - 1; - map_p2s[atom_p][tran] = atom_s; - map_s2p[atom_s].atom_num = atom_p; - map_s2p[atom_s].tran_num = tran; + if (tran >= ntran || atom_p >= natmin || atom_s >= nat) { + error->exit("load_system_info_xml", "index is out of range"); } - + map_p2s[atom_p][tran] = atom_s; + map_s2p[atom_s].atom_num = atom_p; + map_s2p[atom_s].tran_num = tran; + } } + } MPI_Bcast(&lavec_s[0][0], 9, MPI_DOUBLE, 0, MPI_COMM_WORLD); @@ -665,16 +726,16 @@ void System::load_system_info_from_XML() MPI_Bcast(&kd_anharm[0], nat_anharm, MPI_UNSIGNED, 0, MPI_COMM_WORLD); MPI_Bcast(&map_p2s[0][0], natmin * ntran, MPI_UNSIGNED, 0, MPI_COMM_WORLD); MPI_Bcast(&map_p2s_anharm[0][0], natmin * ntran_anharm, MPI_UNSIGNED, 0, MPI_COMM_WORLD); - MPI_Bcast(&map_s2p[0], nat * sizeof(map_s2p[0]), MPI_BYTE, 0, MPI_COMM_WORLD); - MPI_Bcast(&map_s2p_anharm[0], nat_anharm * sizeof(map_s2p_anharm[0]), MPI_BYTE, 0, MPI_COMM_WORLD); + MPI_Bcast(&map_s2p[0], nat * sizeof map_s2p[0], MPI_BYTE, 0, MPI_COMM_WORLD); + MPI_Bcast(&map_s2p_anharm[0], nat_anharm * sizeof map_s2p_anharm[0], MPI_BYTE, 0, MPI_COMM_WORLD); if (lspin) MPI_Bcast(&magmom[0][0], 3 * natmin, MPI_DOUBLE, 0, MPI_COMM_WORLD); } -void System::recips(double vec[3][3], double inverse[3][3]) +void System::recips(double vec[3][3], + double inverse[3][3]) const { - double det; - det = vec[0][0] * vec[1][1] * vec[2][2] + double det = vec[0][0] * vec[1][1] * vec[2][2] + vec[1][0] * vec[2][1] * vec[0][2] + vec[2][0] * vec[0][1] * vec[1][2] - vec[0][0] * vec[2][1] * vec[1][2] @@ -700,11 +761,11 @@ void System::recips(double vec[3][3], double inverse[3][3]) inverse[2][2] = (vec[0][0] * vec[1][1] - vec[0][1] * vec[1][0]) * factor; } -double System::volume(double vec1[3], double vec2[3], double vec3[3]) +double System::volume(double vec1[3], + double vec2[3], + double vec3[3]) const { - double vol; - - vol = std::abs(vec1[0] * (vec2[1] * vec3[2] - vec2[2] * vec3[1]) + double vol = std::abs(vec1[0] * (vec2[1] * vec3[2] - vec2[2] * vec3[1]) + vec1[1] * (vec2[2] * vec3[0] - vec2[0] * vec3[2]) + vec1[2] * (vec2[0] * vec3[1] - vec2[1] * vec3[0])); @@ -751,8 +812,8 @@ void System::setup_atomic_class(unsigned int N, atomlist_class[count].push_back(i); } } else { - if ((kd[i] == (*it).element) && - (std::abs(magmom[i][2] - (*it).magmom) < eps6)) { + if (kd[i] == (*it).element && + std::abs(magmom[i][2] - (*it).magmom) < eps6) { atomlist_class[count].push_back(i); } } @@ -771,8 +832,7 @@ void System::check_consistency_primitive_lattice() // This operation is necessary for obtaining correct computational results. int i, j, k; - int iloc; - double xdiff[3], norm; + double xdiff[3]; double **x_harm, **x_anharm; memory->allocate(x_harm, natmin, 3); @@ -795,7 +855,7 @@ void System::check_consistency_primitive_lattice() for (i = 0; i < natmin; ++i) { - iloc = -1; + int iloc = -1; for (j = 0; j < natmin; ++j) { @@ -804,7 +864,7 @@ void System::check_consistency_primitive_lattice() xdiff[k] = xdiff[k] - static_cast(nint(xdiff[k])); } - norm = xdiff[0] * xdiff[0] + xdiff[1] * xdiff[1] + xdiff[2] * xdiff[2]; + double norm = xdiff[0] * xdiff[0] + xdiff[1] * xdiff[1] + xdiff[2] * xdiff[2]; if (norm < eps4 && kd[map_p2s[j][0]] == kd_anharm[map_p2s_anharm[i][0]]) { iloc = j; break; @@ -857,3 +917,38 @@ void System::check_consistency_primitive_lattice() memory->deallocate(map_p2s_tmp); map_anh2harm.clear(); } + +int System::get_atomic_number_by_name(const std::string kdname_in) +{ + std::string kdname_copy = kdname_in; + kdname_copy[0] = toupper(kdname_copy[0]); + + int ret = -1; + + for (int i = 0; i < element_names.size(); ++i) { + if (kdname_copy == element_names[i]) { + ret = i; + break; + } + } + return ret; +} + +void System::set_mass_elem_from_database(const int nkd, + const std::string *symbol_in, + double *mass_kd_out) +{ + for (int i = 0; i < nkd; ++i) { + int atom_number = get_atomic_number_by_name(symbol_in[i]); + if (atom_number >= element_names.size() || atom_number == -1) { + error->exit("set_mass_elem_from_database", + "Atomic mass for the given element doesn't exist in the database.\nTherefore, please input MASS manually."); + } + double mass_tmp = atomic_masses[atom_number]; + if (mass_tmp < 0.0) { + error->exit("set_mass_elem_from_database", + "One of the elements in the KD-tag is unstable. \nTherefore, please input MASS manually."); + } + mass_kd_out[i] = mass_tmp; + } +} diff --git a/anphon/system.h b/anphon/system.h index 49d36f0b..7fae7ab6 100644 --- a/anphon/system.h +++ b/anphon/system.h @@ -35,10 +35,11 @@ namespace PHON_NS } }; - class System: protected Pointers + class System : protected Pointers { public: System(class PHON *); + ~System(); void setup(); @@ -75,16 +76,54 @@ namespace PHON_NS double *mass_kd, *mass, *mass_anharm; double Tmin, Tmax, dT; - double volume(double [3], double [3], double [3]); + + double volume(double [3], + double [3], + double [3]) const; bool lspin, trevsym_mag; int noncollinear; + int get_atomic_number_by_name(const std::string); + private: + void set_default_variables(); + void deallocate_variables(); + + void set_mass_elem_from_database(const int, + const std::string *, + double *); void load_system_info_from_XML(); - void recips(double [3][3], double [3][3]); - void setup_atomic_class(unsigned int, unsigned int *, double **); + + void recips(double [3][3], + double [3][3]) const; + + void setup_atomic_class(unsigned int, + unsigned int *, + double **); + void check_consistency_primitive_lattice(); + + std::vector element_names{ + "H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", "Na", "Mg", "Al", "Si", "P", "S", "Cl", "Ar", + "K", "Ca", "Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn", "Ga", "Ge", "As", "Se", "Br", "Kr", + "Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag", "Cd", "In", "Sn", "Sb", "Te", "I", "Xe", + "Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu", "Hf", + "Ta", "W", "Re", "Os", "Ir", "Pt", "Au", "Hg", "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr", "Ra", "Ac", "Th", + "Pa", "U", "Np", "Pu" + }; + std::vector atomic_masses{ + 1.007941, 4.002602, 6.940037, 9.012183, 10.811028, 12.010736, 14.006703, 15.999405, 18.998403, 20.180046, + 22.989769, 24.305052, 26.981539, 28.085499, 30.973762, 32.064787, 35.452938, 39.947799, 39.098301, + 40.078023, 44.955908, 47.866745, 50.941465, 51.996132, 54.938044, 55.845144, 58.933194, 58.693347, + 63.546040, 65.377783, 69.723066, 72.627550, 74.921595, 78.959389, 79.903528, 83.798000, 85.467664, + 87.616644, 88.905840, 91.223642, 92.906373, 95.959789, -1, 101.064940, 102.905498, 106.415328, + 107.868150, 112.411558, 114.818087, 118.710113, 121.759784, 127.603126, 126.904472, 131.292761, 132.905452, + 137.326892, 138.905469, 140.115731, 140.907658, 144.241596, -1, 150.366356, 151.964378, 157.252131, + 158.925355, 162.499473, 164.930329, 167.259083, 168.934218, 173.054150, 174.966815, 178.484979, 180.947876, + 183.841778, 186.206705, 190.224860, 192.216052, 195.084457, 196.966569, 200.599167, 204.383413, 207.216908, + 208.980399, -1, -1, -1, -1, -1, -1, 232.038056, 231.035884, 238.028910, -1, -1 + }; // For unstable elements, the atomic mass is set to -1 }; } diff --git a/anphon/thermodynamics.cpp b/anphon/thermodynamics.cpp index cb57a4cb..82d2762a 100644 --- a/anphon/thermodynamics.cpp +++ b/anphon/thermodynamics.cpp @@ -9,23 +9,32 @@ */ #include "mpi_common.h" +#include "thermodynamics.h" +#include "anharmonic_core.h" +#include "constants.h" #include "dynamical.h" -#include "error.h" #include "kpoint.h" -#include "thermodynamics.h" +#include "mathfunctions.h" +#include "memory.h" #include "pointers.h" #include "system.h" -#include "constants.h" +#include +#include using namespace PHON_NS; Thermodynamics::Thermodynamics(PHON *phon): Pointers(phon) { T_to_Ryd = k_Boltzmann / Ryd; + calc_FE_bubble = false; + FE_bubble = nullptr; } Thermodynamics::~Thermodynamics() { + if (FE_bubble) { + memory->deallocate(FE_bubble); + } }; void Thermodynamics::setup() @@ -34,280 +43,243 @@ void Thermodynamics::setup() } double Thermodynamics::Cv(const double omega, - const double T) + const double temp_in) const { - if (std::abs(T) < eps) return 0.0; + if (std::abs(temp_in) < eps) return 0.0; - double x = omega / (T_to_Ryd * T); + const auto x = omega / (T_to_Ryd * temp_in); return k_Boltzmann * std::pow(x / (2.0 * sinh(0.5 * x)), 2); } double Thermodynamics::Cv_classical(const double omega, - const double T) + const double temp_in) const { - if (std::abs(T) < eps) return 0.0; + if (std::abs(temp_in) < eps) return 0.0; return k_Boltzmann; } double Thermodynamics::fB(const double omega, - const double T) + const double temp_in) const { - if (std::abs(T) < eps || omega < eps8) return 0.0; + if (std::abs(temp_in) < eps || omega < eps8) return 0.0; - double x = omega / (T_to_Ryd * T); + const auto x = omega / (T_to_Ryd * temp_in); return 1.0 / (std::exp(x) - 1.0); } double Thermodynamics::fC(const double omega, - const double T) + const double temp_in) const { - if (std::abs(T) < eps || omega < eps8) return 0.0; + if (std::abs(temp_in) < eps || omega < eps8) return 0.0; - double x = omega / (T_to_Ryd * T); + const auto x = omega / (T_to_Ryd * temp_in); return 1.0 / x; } -double Thermodynamics::Cv_tot(const double T) +double Thermodynamics::Cv_tot(const double temp_in, + const unsigned int nk_irred, + const unsigned int ns, + const std::vector> &kp_irred, + double *weight_k_irred, + double **eval_in) const { int i; unsigned int ik, is; - unsigned int nk = kpoint->nk; - unsigned int ns = dynamical->neval; double omega; - double ret = 0.0; - int N = nk * ns; + auto ret = 0.0; + + const auto N = nk_irred * ns; + int ik_irred; if (classical) { -#pragma omp parallel for private(ik, is, omega), reduction(+:ret) +#pragma omp parallel for private(ik_irred, ik, is, omega), reduction(+:ret) for (i = 0; i < N; ++i) { - ik = i / ns; + ik_irred = i / ns; + ik = kp_irred[ik_irred][0].knum; is = i % ns; - omega = dynamical->eval_phonon[ik][is]; - if (omega < 0.0) continue; + omega = eval_in[ik][is]; + + if (omega < eps8) continue; - ret += Cv_classical(omega, T); + ret += Cv_classical(omega, temp_in) * weight_k_irred[ik_irred]; } } else { -#pragma omp parallel for private(ik, is, omega), reduction(+:ret) +#pragma omp parallel for private(ik_irred, ik, is, omega), reduction(+:ret) for (i = 0; i < N; ++i) { - ik = i / ns; + ik_irred = i / ns; + ik = kp_irred[ik_irred][0].knum; is = i % ns; - omega = dynamical->eval_phonon[ik][is]; - if (omega < 0.0) continue; - - ret += Cv(omega, T); - } - } - - return ret / static_cast(nk); -} + omega = eval_in[ik][is]; -double Thermodynamics::Cv_Debye(const double T, - const double TD) -{ - unsigned int natmin = system->natmin; - unsigned int i; - double d_theta, theta, theta_max; - unsigned int ntheta; - - double x, y; - double ret; - d_theta = 0.001; - - if (TD < eps) { - error->exit("Cv_Debye", "Too small TD"); - } - if (T < 0.0) { - error->exit("Cv_Debye", "Negative T"); - } + if (omega < eps8) continue; - if (T < eps) { - return 0.0; - } else { - x = TD / T; - theta_max = atan(x); - - ret = 0.0; - ntheta = static_cast(theta_max / d_theta); - - for (i = 0; i < ntheta; ++i) { - theta = static_cast(i) * d_theta; - y = tan(theta); - if (y > eps) { - ret += std::pow(y, 4) * std::exp(y) - / std::pow((std::exp(y) - 1.0) * cos(theta), 2); - } + ret += Cv(omega, temp_in) * weight_k_irred[ik_irred]; } - y = tan(theta_max); - ret += 0.5 * std::pow(y, 4) * std::exp(y) - / std::pow((std::exp(y) - 1.0) * cos(theta_max), 2); - - return 9.0 * static_cast(natmin) * k_Boltzmann - * ret * d_theta / std::pow(x, 3); } -} - -void Thermodynamics::Debye_T(const double T, - double &TD) -{ - double TD_old; - double diff_C; - double fdegfree = 1.0 / static_cast(3.0 * system->natmin); - - double Cv_tot_tmp = Cv_tot(T); - - if (T > eps) { - - do { - diff_C = fdegfree * (Cv_tot_tmp - Cv_Debye(T, TD)) / k_Boltzmann; - TD_old = TD; - TD = TD_old - diff_C * 10.0; - } while (std::abs(diff_C) > 1.0e-5); - } + return ret; } -double Thermodynamics::internal_energy(const double T) +double Thermodynamics::internal_energy(const double temp_in, + const unsigned int nk_irred, + const unsigned int ns, + const std::vector> &kp_irred, + double *weight_k_irred, + double **eval_in) const { int i; unsigned int ik, is; - unsigned int nk = kpoint->nk; - unsigned int ns = dynamical->neval; double omega; - double ret = 0.0; + auto ret = 0.0; - int N = nk * ns; + const auto N = nk_irred * ns; + int ik_irred; if (classical) { -#pragma omp parallel for private(ik, is, omega), reduction(+:ret) +#pragma omp parallel for private(ik_irred, ik, is, omega), reduction(+:ret) for (i = 0; i < N; ++i) { - ik = i / ns; + ik_irred = i / ns; + ik = kp_irred[ik_irred][0].knum; is = i % ns; - omega = dynamical->eval_phonon[ik][is]; + omega = eval_in[ik][is]; if (omega < eps8) continue; - ret += T_to_Ryd * T; + ret += T_to_Ryd * temp_in * weight_k_irred[ik_irred]; } ret *= 2.0; + } else { -#pragma omp parallel for private(ik, is, omega), reduction(+:ret) +#pragma omp parallel for private(ik_irred, ik, is, omega), reduction(+:ret) for (i = 0; i < N; ++i) { - ik = i / ns; + ik_irred = i / ns; + ik = kp_irred[ik_irred][0].knum; is = i % ns; - omega = dynamical->eval_phonon[ik][is]; + omega = eval_in[ik][is]; if (omega < eps8) continue; - ret += omega * coth_T(omega, T); + ret += omega * coth_T(omega, temp_in) * weight_k_irred[ik_irred]; } - } - return ret * 0.5 / static_cast(nk); + } + return ret * 0.5; } -double Thermodynamics::vibrational_entropy(const double T) +double Thermodynamics::vibrational_entropy(const double temp_in, + const unsigned int nk_irred, + const unsigned int ns, + const std::vector> &kp_irred, + double *weight_k_irred, + double **eval_in) const { int i; unsigned int ik, is; - unsigned int nk = kpoint->nk; - unsigned int ns = dynamical->neval; double omega, x; - double ret = 0.0; + auto ret = 0.0; - int N = nk * ns; + const auto N = nk_irred * ns; + int ik_irred; if (classical) { -#pragma omp parallel for private(ik, is, omega, x), reduction(+:ret) +#pragma omp parallel for private(ik_irred, ik, is, omega, x), reduction(+:ret) for (i = 0; i < N; ++i) { - ik = i / ns; + ik_irred = i / ns; + ik = kp_irred[ik_irred][0].knum; is = i % ns; - omega = dynamical->eval_phonon[ik][is]; + omega = eval_in[ik][is]; - if (omega < eps8 || std::abs(T) < eps) continue; + if (omega < eps8 || std::abs(temp_in) < eps) continue; - x = omega / (T * T_to_Ryd); - ret += std::log(x) - 1.0; + x = omega / (temp_in * T_to_Ryd); + ret += (std::log(x) - 1.0) * weight_k_irred[ik_irred]; } + } else { -#pragma omp parallel for private(ik, is, omega, x), reduction(+:ret) +#pragma omp parallel for private(ik_irred, ik, is, omega, x), reduction(+:ret) for (i = 0; i < N; ++i) { - ik = i / ns; + ik_irred = i / ns; + ik = kp_irred[ik_irred][0].knum; is = i % ns; - omega = dynamical->eval_phonon[ik][is]; + omega = eval_in[ik][is]; - if (omega < eps8 || std::abs(T) < eps) continue; + if (omega < eps8 || std::abs(temp_in) < eps) continue; - x = omega / (T * T_to_Ryd); - ret += std::log(1.0 - std::exp(-x)) - x / (std::exp(x) - 1.0); + x = omega / (temp_in * T_to_Ryd); + ret += (std::log(1.0 - std::exp(-x)) - x / (std::exp(x) - 1.0)) * weight_k_irred[ik_irred]; } } - - - return -k_Boltzmann * ret / static_cast(nk); + return -k_Boltzmann * ret; } -double Thermodynamics::free_energy(const double T) +double Thermodynamics::free_energy_QHA(const double temp_in, + const unsigned int nk_irred, + const unsigned int ns, + const std::vector> &kp_irred, + double *weight_k_irred, + double **eval_in) const { int i; unsigned int ik, is; - unsigned int nk = kpoint->nk; - unsigned int ns = dynamical->neval; double omega, x; - double ret = 0.0; + auto ret = 0.0; - int N = nk * ns; + const auto N = nk_irred * ns; + int ik_irred; if (classical) { -#pragma omp parallel for private(ik, is, omega, x), reduction(+:ret) +#pragma omp parallel for private(ik_irred, ik, is, omega, x), reduction(+:ret) for (i = 0; i < N; ++i) { - ik = i / ns; + ik_irred = i / ns; + ik = kp_irred[ik_irred][0].knum; is = i % ns; - omega = dynamical->eval_phonon[ik][is]; + omega = eval_in[ik][is]; if (omega < eps8) continue; - x = omega / (T * T_to_Ryd); - ret += std::log(x); + if (std::abs(temp_in) > eps) { + x = omega / (temp_in * T_to_Ryd); + ret += std::log(x) * weight_k_irred[ik_irred]; + } } - return T * T_to_Ryd * ret / static_cast(nk); - - } else { -#pragma omp parallel for private(ik, is, omega, x), reduction(+:ret) - for (i = 0; i < N; ++i) { - ik = i / ns; - is = i % ns; - omega = dynamical->eval_phonon[ik][is]; - - if (omega < eps8) continue; + return temp_in * T_to_Ryd * ret; - if (std::abs(T) < eps) { - ret += 0.5 * omega; - } else { - x = omega / (T * T_to_Ryd); - ret += 0.5 * x + std::log(1.0 - std::exp(-x)); - } + } +#pragma omp parallel for private(ik_irred, ik, is, omega, x), reduction(+:ret) + for (i = 0; i < N; ++i) { + ik_irred = i / ns; + ik = kp_irred[ik_irred][0].knum; + is = i % ns; + omega = eval_in[ik][is]; + + if (omega < eps8) continue; + + if (std::abs(temp_in) < eps) { + ret += 0.5 * omega * weight_k_irred[ik_irred]; + } else { + x = omega / (temp_in * T_to_Ryd); + ret += (0.5 * x + std::log(1.0 - std::exp(-x))) * weight_k_irred[ik_irred]; } + } - if (std::abs(T) < eps) return ret / static_cast(nk); + if (std::abs(temp_in) < eps) return ret; - return T * T_to_Ryd * ret / static_cast(nk); - } + return temp_in * T_to_Ryd * ret; } double Thermodynamics::disp2_avg(const double T, const unsigned int ns1, - const unsigned int ns2) + const unsigned int ns2) const { int i; double ret = 0.0; unsigned int ik, is; - unsigned int nk = kpoint->nk; - unsigned int ns = dynamical->neval; + const auto nk = kpoint->nk; + const auto ns = dynamical->neval; double omega; int N = nk * ns; @@ -352,14 +324,426 @@ double Thermodynamics::disp2_avg(const double T, return ret; } +double Thermodynamics::disp_corrfunc(const double T_in, + const unsigned int ncrd1, + const unsigned int ncrd2, + const double cell_shift[3], + const unsigned int nk, + const unsigned int ns, + double **xk_in, + double **eval_in, + std::complex ***evec_in) const +{ + int i; + int N = nk * ns; + unsigned int ik, is; + double omega; + double phase; + const std::complex im(0.0, 1.0); + double ret = 0.0; + + if (classical) { +#pragma omp parallel for private(ik, is, omega, phase), reduction(+:ret) + for (i = 0; i < N; ++i) { + ik = i / ns; + is = i % ns; + omega = eval_in[ik][is]; + + if (omega < eps8) continue; + + phase = 2.0 * pi * (xk_in[ik][0] * cell_shift[0] + + xk_in[ik][1] * cell_shift[1] + + xk_in[ik][2] * cell_shift[2]); + + ret += real(std::conj(evec_in[ik][is][ncrd1]) + * evec_in[ik][is][ncrd2] + * std::exp(phase)) + * T_in * T_to_Ryd / (omega * omega); + + } + + } else { +#pragma omp parallel for private(ik, is, omega, phase), reduction(+:ret) + for (i = 0; i < N; ++i) { + ik = i / ns; + is = i % ns; + omega = eval_in[ik][is]; + + if (omega < eps8) continue; + + phase = 2.0 * pi * (xk_in[ik][0] * cell_shift[0] + + xk_in[ik][1] * cell_shift[1] + + xk_in[ik][2] * cell_shift[2]); + + ret += real(std::conj(evec_in[ik][is][ncrd1]) + * evec_in[ik][is][ncrd2] + * std::exp(im * phase)) + * (fB(omega, T_in) + 0.5) / omega; + } + } + + ret *= 1.0 / (static_cast(nk) + * std::sqrt(system->mass[system->map_p2s[ncrd1 / 3][0]] + * system->mass[system->map_p2s[ncrd2 / 3][0]])); + + return ret; +} + + double Thermodynamics::coth_T(const double omega, - const double T) + const double T) const { // This function returns coth(hbar*omega/2*kB*T) // if T = 0.0 and omega > 0, coth(hbar*omega/(2*kB*T)) = 1.0 if (T < eps) return 1.0; - double x = omega / (T_to_Ryd * T * 2.0); + const auto x = omega / (T_to_Ryd * T * 2.0); return 1.0 + 2.0 / (std::exp(2.0 * x) - 1.0); } + + +void Thermodynamics::compute_free_energy_bubble() +{ + const auto NT = static_cast((system->Tmax - system->Tmin) / system->dT) + 1; + + if (mympi->my_rank == 0) { + std::cout << std::endl; + std::cout << " -----------------------------------------------------------------" + << std::endl; + std::cout << " Calculating the vibrational free energy from the Bubble diagram " << std::endl; + } + + memory->allocate(FE_bubble, NT); + + compute_FE_bubble(dynamical->eval_phonon, + dynamical->evec_phonon, + FE_bubble); + + if (mympi->my_rank == 0) { + std::cout << " done!" << std::endl << std::endl; + } +} + + +void Thermodynamics::compute_FE_bubble(double **eval, + std::complex ***evec, + double *FE_bubble) const +{ + // This function calculates the free energy of the bubble diagram + int i; + double omega_sum[2]; + double nsum[2]; + const auto nk = kpoint->nk; + const auto nk_reduced = kpoint->kpoint_irred_all.size(); + const auto ns = dynamical->neval; + unsigned int i0, iT; + unsigned int arr_cubic[3]; + const int nks0 = nk_reduced * ns; + const auto NT = static_cast((system->Tmax - system->Tmin) / system->dT) + 1; + const auto factor = -1.0 / (static_cast(nk * nk) * 48.0); + + double n0, n1, n2; + double *FE_local; + double *FE_tmp; + + memory->allocate(FE_local, NT); + memory->allocate(FE_tmp, NT); + std::vector triplet; + + std::vector vks_l; + vks_l.clear(); + + for (i0 = 0; i0 < nks0; ++i0) { + if (i0 % mympi->nprocs == mympi->my_rank) { + vks_l.push_back(i0); + } + } + + unsigned int nk_tmp; + + if (nks0 % mympi->nprocs != 0) { + nk_tmp = nks0 / mympi->nprocs + 1; + } else { + nk_tmp = nks0 / mympi->nprocs; + } + if (vks_l.size() < nk_tmp) { + vks_l.push_back(-1); + } + + for (iT = 0; iT < NT; ++iT) FE_local[iT] = 0.0; + + for (i0 = 0; i0 < nk_tmp; ++i0) { + + if (vks_l[i0] != -1) { + + const auto ik0 = kpoint->kpoint_irred_all[vks_l[i0] / ns][0].knum; + const auto is0 = vks_l[i0] % ns; + + kpoint->get_unique_triplet_k(vks_l[i0] / ns, + anharmonic_core->use_triplet_symmetry, + true, + triplet, 1); + + const int npair_uniq = triplet.size(); + + arr_cubic[0] = ns * ik0 + is0; + + for (iT = 0; iT < NT; ++iT) FE_tmp[iT] = 0.0; + + for (int ik = 0; ik < npair_uniq; ++ik) { + int multi = triplet[ik].group.size(); + + arr_cubic[0] = ns * ik0 + is0; + + const unsigned int ik1 = triplet[ik].group[0].ks[0]; + const unsigned int ik2 = triplet[ik].group[0].ks[1]; + + for (unsigned int is1 = 0; is1 < ns; ++is1) { + arr_cubic[1] = ns * ik1 + is1; + + for (unsigned int is2 = 0; is2 < ns; ++is2) { + arr_cubic[2] = ns * ik2 + is2; + + const auto omega0 = eval[ik0][is0]; + const auto omega1 = eval[ik1][is1]; + const auto omega2 = eval[ik2][is2]; + + if (omega0 < eps8 || omega1 < eps8 || omega2 < eps8) continue; + + omega_sum[0] = 1.0 / (omega0 + omega1 + omega2); + omega_sum[1] = 1.0 / (-omega0 + omega1 + omega2); + + const auto v3_tmp = std::norm(anharmonic_core->V3(arr_cubic)) + * static_cast(multi); + + + for (iT = 0; iT < NT; ++iT) { + const auto temp = system->Tmin + static_cast(iT) * system->dT; + + if (classical) { + n0 = fC(omega0, temp); + n1 = fC(omega1, temp); + n2 = fC(omega2, temp); + + nsum[0] = n0 * (n1 + n2) + n1 * n2; + nsum[1] = n0 * (n1 + n2) - n1 * n2; + } else { + n0 = fB(omega0, temp); + n1 = fB(omega1, temp); + n2 = fB(omega2, temp); + + nsum[0] = (1.0 + n0) * (1.0 + n1 + n2) + n1 * n2; + nsum[1] = n0 * n1 - n1 * n2 + n2 * n0 + n0; + } + + FE_tmp[iT] += v3_tmp * (nsum[0] * omega_sum[0] + 3.0 * nsum[1] * omega_sum[1]); + } + } + } + } + const auto weight = static_cast(kpoint->kpoint_irred_all[vks_l[i0] / ns].size()); + for (iT = 0; iT < NT; ++iT) FE_local[iT] += FE_tmp[iT] * weight; + } + } + + MPI_Allreduce(&FE_local[0], &FE_bubble[0], NT, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD); + + for (iT = 0; iT < NT; ++iT) { + FE_bubble[iT] *= factor; + } + + memory->deallocate(FE_local); + memory->deallocate(FE_tmp); +} + + +void Thermodynamics::compute_FE_bubble_SCPH(double ***eval_in, + std::complex ****evec_in, + double *FE_bubble) +{ + // This function calculates the free energy from the bubble diagram + // at the given temperature and lattice dynamics wavefunction + int i; + int ik; + int multi; + double omega0, omega1, omega2, omega_sum[2]; + double n0, n1, n2, nsum[2]; + unsigned int nk = kpoint->nk; + unsigned int nk_reduced = kpoint->kpoint_irred_all.size(); + unsigned int ns = dynamical->neval; + double v3_tmp; + unsigned int ik0, ik1, ik2, is0, is1, is2, i0, iT; + unsigned int arr_cubic[3]; + int nks0 = nk_reduced * ns; + unsigned int NT = static_cast((system->Tmax - system->Tmin) / system->dT) + 1; + double temp; + double factor = -1.0 / (static_cast(nk * nk) * 48.0); + + double *FE_local; + double *FE_tmp; + + memory->allocate(FE_local, NT); + memory->allocate(FE_tmp, NT); + std::vector triplet; + + std::vector vks_l; + vks_l.clear(); + + for (i0 = 0; i0 < nks0; ++i0) { + if (i0 % mympi->nprocs == mympi->my_rank) { + vks_l.push_back(i0); + } + } + + unsigned int nk_tmp; + + if (nks0 % mympi->nprocs != 0) { + nk_tmp = nks0 / mympi->nprocs + 1; + } else { + nk_tmp = nks0 / mympi->nprocs; + } + if (vks_l.size() < nk_tmp) { + vks_l.push_back(-1); + } + + for (iT = 0; iT < NT; ++iT) FE_local[iT] = 0.0; + + if (mympi->my_rank == 0) { + std::cout << " Total number of modes per MPI process: " << nk_tmp << std::endl; + } + + for (i0 = 0; i0 < nk_tmp; ++i0) { + + if (vks_l[i0] != -1) { + + ik0 = kpoint->kpoint_irred_all[vks_l[i0] / ns][0].knum; + is0 = vks_l[i0] % ns; + + kpoint->get_unique_triplet_k(vks_l[i0] / ns, + anharmonic_core->use_triplet_symmetry, + true, + triplet, 1); + + int npair_uniq = triplet.size(); + + arr_cubic[0] = ns * ik0 + is0; + + for (iT = 0; iT < NT; ++iT) FE_tmp[iT] = 0.0; + + for (ik = 0; ik < npair_uniq; ++ik) { + multi = static_cast(triplet[ik].group.size()); + + arr_cubic[0] = ns * ik0 + is0; + + ik1 = triplet[ik].group[0].ks[0]; + ik2 = triplet[ik].group[0].ks[1]; + + + for (is1 = 0; is1 < ns; ++is1) { + arr_cubic[1] = ns * ik1 + is1; + + for (is2 = 0; is2 < ns; ++is2) { + arr_cubic[2] = ns * ik2 + is2; + + for (iT = 0; iT < NT; ++iT) { + + temp = system->Tmin + static_cast(iT) * system->dT; + + omega0 = eval_in[iT][ik0][is0]; + omega1 = eval_in[iT][ik1][is1]; + omega2 = eval_in[iT][ik2][is2]; + + if (omega0 < eps8 || omega1 < eps8 || omega2 < eps8) continue; + + + omega_sum[0] = 1.0 / (omega0 + omega1 + omega2); + omega_sum[1] = 1.0 / (-omega0 + omega1 + omega2); + + v3_tmp = std::norm(anharmonic_core->V3(arr_cubic, eval_in[iT], evec_in[iT])) + * static_cast(multi); + + if (classical) { + n0 = fC(omega0, temp); + n1 = fC(omega1, temp); + n2 = fC(omega2, temp); + + nsum[0] = n0 * (n1 + n2) + n1 * n2; + nsum[1] = n0 * (n1 + n2) - n1 * n2; + } else { + n0 = fB(omega0, temp); + n1 = fB(omega1, temp); + n2 = fB(omega2, temp); + + nsum[0] = (1.0 + n0) * (1.0 + n1 + n2) + n1 * n2; + nsum[1] = n0 * n1 - n1 * n2 + n2 * n0 + n0; + } + + FE_tmp[iT] += v3_tmp * (nsum[0] * omega_sum[0] + 3.0 * nsum[1] * omega_sum[1]); + } + } + } + } + double weight = static_cast(kpoint->kpoint_irred_all[vks_l[i0] / ns].size()); + for (iT = 0; iT < NT; ++iT) FE_local[iT] += FE_tmp[iT] * weight; + } + } + + MPI_Allreduce(&FE_local[0], &FE_bubble[0], NT, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD); + + for (iT = 0; iT < NT; ++iT) { + FE_bubble[iT] *= factor; + } + + memory->deallocate(FE_local); + memory->deallocate(FE_tmp); +} + + +double Thermodynamics::FE_scph_correction(unsigned int iT, + double **eval, + std::complex ***evec) const +{ + const auto nk = kpoint->nk; + const auto ns = dynamical->neval; + const auto temp = system->Tmin + static_cast(iT) * system->dT; + const auto N = nk * ns; + + double ret = 0.0; + +#pragma omp parallel for reduction(+ : ret) + for (int i = 0; i < N; ++i) { + int ik = i / ns; + int is = i % ns; + double omega = eval[ik][is]; + if (std::abs(omega) < eps6) continue; + + std::complex tmp_c = std::complex(0.0, 0.0); + + for (int js = 0; js < ns; ++js) { + double omega2_harm = dynamical->eval_phonon[ik][js]; + if (omega2_harm >= 0.0) { + omega2_harm = std::pow(omega2_harm, 2); + } else { + omega2_harm = -std::pow(omega2_harm, 2); + } + + for (int ks = 0; ks < ns; ++ks) { + for (int ls = 0; ls < ns; ++ls) { + tmp_c += omega2_harm + * dynamical->evec_phonon[ik][js][ks] + * std::conj(dynamical->evec_phonon[ik][js][ls]) + * std::conj(evec[ik][is][ks]) * evec[ik][is][ls]; + } + } + } + + if (thermodynamics->classical) { + ret += (tmp_c.real() - omega * omega) * thermodynamics->fC(omega, temp) / (4.0 * omega); + } else { + ret += (tmp_c.real() - omega * omega) * (1.0 + 2.0 * thermodynamics->fB(omega, temp)) / (8.0 * omega); + } + } + + return ret / static_cast(nk); +} diff --git a/anphon/thermodynamics.h b/anphon/thermodynamics.h index d3e6fbb8..77a6e6c7 100644 --- a/anphon/thermodynamics.h +++ b/anphon/thermodynamics.h @@ -11,33 +11,97 @@ #pragma once #include "pointers.h" +#include +#include +#include "kpoint.h" namespace PHON_NS { - class Thermodynamics: protected Pointers + class Thermodynamics : protected Pointers { public: Thermodynamics(class PHON *); + ~Thermodynamics(); double T_to_Ryd; bool classical; + bool calc_FE_bubble; + double *FE_bubble; + void setup(); - double Cv(const double, const double); - double fB(const double, const double); - double fC(const double, const double); + double Cv(const double omega, + const double temp_in) const; - double Cv_tot(const double); - double internal_energy(const double); - double vibrational_entropy(const double); - double free_energy(const double); - double Cv_Debye(const double, const double); - double Cv_classical(const double, const double); - void Debye_T(const double, double &); - double disp2_avg(const double, const unsigned int, const unsigned int); + double Cv_classical(const double omega, + const double temp_in) const; - public: - double coth_T(const double, const double); + double fB(const double omega, + const double temp_in) const; + + double fC(const double omega, + const double temp_in) const; + + double Cv_tot(const double temp_in, + const unsigned int nk_irred, + const unsigned int ns, + const std::vector> &kp_irred, + double *weight_k_irred, + double **eval_in) const; + + double internal_energy(const double temp_in, + const unsigned int nk_irred, + const unsigned int ns, + const std::vector> &kp_irred, + double *weight_k_irred, + double **eval_in) const; + + double vibrational_entropy(const double temp_in, + const unsigned int nk_irred, + const unsigned int ns, + const std::vector> &kp_irred, + double *weight_k_irred, + double **eval_in) const; + + double free_energy_QHA(const double temp_in, + const unsigned int nk_irred, + const unsigned int ns, + const std::vector> &kp_irred, + double *weight_k_irred, + double **eval_in) const; + + + double disp2_avg(double, + unsigned int, + unsigned int) const; + + double disp_corrfunc(const double T_in, + const unsigned int ncrd1, + const unsigned int ncrd2, + const double cell_shift[3], + const unsigned int nk, + const unsigned int ns, + double **xk_in, + double **eval_in, + std::complex ***evec_in) const; + + double coth_T(double, + double) const; + + void compute_free_energy_bubble(); + + + void compute_FE_bubble(double **, + std::complex ***, + double *) const; + + void compute_FE_bubble_SCPH(double ***eval_in, + std::complex ****evec_in, + double *FE_bubble); + + double FE_scph_correction(unsigned int, + double **, + std::complex ***) const; }; } diff --git a/anphon/timer.cpp b/anphon/timer.cpp index fd978943..aab66edf 100644 --- a/anphon/timer.cpp +++ b/anphon/timer.cpp @@ -27,9 +27,7 @@ Timer::Timer(PHON *phon): Pointers(phon) #endif } -Timer::~Timer() -{ -} +Timer::~Timer() {} void Timer::reset() { @@ -40,7 +38,7 @@ void Timer::reset() #endif } -double Timer::elapsed() +double Timer::elapsed() const { #if defined(WIN32) || defined(_WIN32) LARGE_INTEGER time_now; @@ -53,24 +51,23 @@ double Timer::elapsed() #endif } -void Timer::print_elapsed() +void Timer::print_elapsed() const { std::cout << std::endl << " Time Elapsed: " << elapsed() << " sec." << std::endl << std::endl; } -std::string Timer::DateAndTime() +std::string Timer::DateAndTime() const { time_t current; std::time(¤t); #if defined(WIN32) || defined(_WIN32) - errno_t err_t; struct tm local; char str_now[32]; - err_t = localtime_s(&local, ¤t); + errno_t err_t = localtime_s(&local, ¤t); err_t = asctime_s(str_now, 32, &local); return str_now; #else diff --git a/anphon/timer.h b/anphon/timer.h index 40d1e6f6..c38d162c 100644 --- a/anphon/timer.h +++ b/anphon/timer.h @@ -29,9 +29,10 @@ namespace PHON_NS ~Timer(); void reset(); - double elapsed(); - void print_elapsed(); - std::string DateAndTime(); + double elapsed() const; + void print_elapsed() const; + + std::string DateAndTime() const; private: #if defined(WIN32) || defined(_WIN32) diff --git a/anphon/write_phonons.cpp b/anphon/write_phonons.cpp index 17a192bd..05fc3c3c 100644 --- a/anphon/write_phonons.cpp +++ b/anphon/write_phonons.cpp @@ -11,7 +11,6 @@ or http://opensource.org/licenses/mit-license.php for information. #include "mpi_common.h" #include #include -#include #include "constants.h" #include "conductivity.h" #include "dynamical.h" @@ -24,7 +23,7 @@ or http://opensource.org/licenses/mit-license.php for information. #include "phonon_dos.h" #include "thermodynamics.h" #include "phonon_velocity.h" -#include "relaxation.h" +#include "anharmonic_core.h" #include "symmetry_core.h" #include "system.h" #include "write_phonons.h" @@ -41,11 +40,13 @@ using namespace PHON_NS; Writes::Writes(PHON *phon): Pointers(phon) { Ry_to_kayser = Hz_to_kayser / time_ry; + shift_ucorr[0] = 0; + shift_ucorr[1] = 0; + shift_ucorr[2] = 0; + print_ucorr = false; }; -Writes::~Writes() -{ -}; +Writes::~Writes() {}; void Writes::write_input_vars() { @@ -69,8 +70,10 @@ void Writes::write_input_vars() } std::cout << std::endl; std::cout << " MASS = "; - for (i = 0; i < system->nkd; ++i) { - std::cout << std::setw(10) << system->mass_kd[i]; + if (system->mass_kd) { + for (i = 0; i < system->nkd; ++i) { + std::cout << std::setw(10) << system->mass_kd[i]; + } } std::cout << std::endl; std::cout << " NSYM = " << symmetry->nsym << "; TOLERANCE = " << symmetry->tolerance; @@ -106,7 +109,7 @@ void Writes::write_input_vars() if (phon->mode == "RTA") { std::cout << " RESTART = " << phon->restart_flag << std::endl; - std::cout << " TRISYM = " << relaxation->use_triplet_symmetry << std::endl; + std::cout << " TRISYM = " << anharmonic_core->use_triplet_symmetry << std::endl; std::cout << std::endl; } else if (phon->mode == "SCPH") { std::cout << " Scph:" << std::endl; @@ -162,7 +165,7 @@ void Writes::write_input_vars() std::cout << " NEWFCS = " << gruneisen->print_newfcs; if (gruneisen->print_newfcs) { std::cout << "; DELTA_A = " << gruneisen->delta_a << std::endl; - std::cout << " QUARTIC = " << relaxation->quartic_mode; + std::cout << " QUARTIC = " << anharmonic_core->quartic_mode; } std::cout << std::endl; @@ -170,25 +173,26 @@ void Writes::write_input_vars() std::cout << " ISOTOPE = " << isotope->include_isotope << std::endl; if (isotope->include_isotope) { std::cout << " ISOFACT = "; - for (i = 0; i < system->nkd; ++i) { - std::cout << std::scientific - << std::setw(13) << isotope->isotope_factor[i]; + if (isotope->isotope_factor) { + for (i = 0; i < system->nkd; ++i) { + std::cout << std::scientific + << std::setw(13) << isotope->isotope_factor[i]; + } } std::cout << std::endl; } std::cout << " KAPPA_SPEC = " << conductivity->calc_kappa_spec << std::endl; - // std::cout << " KS_INPUT = " << relaxation->ks_input << std::endl; - // std::cout << " QUARTIC = " << relaxation->quartic_mode << std::endl; - // std::cout << " REALPART = " << relaxation->calc_realpart << std::endl; - // std::cout << " ATOMPROJ = " << relaxation->atom_project_mode << std::endl; - // std::cout << " FSTATE_W = " << relaxation->calc_fstate_omega << std::endl; - // std::cout << " FSTATE_K = " << relaxation->calc_fstate_k << std::endl; + // std::cout << " KS_INPUT = " << anharmonic_core->ks_input << std::endl; + // std::cout << " QUARTIC = " << anharmonic_core->quartic_mode << std::endl; + // std::cout << " REALPART = " << anharmonic_core->calc_realpart << std::endl; + // std::cout << " ATOMPROJ = " << anharmonic_core->atom_project_mode << std::endl; + // std::cout << " FSTATE_W = " << anharmonic_core->calc_fstate_omega << std::endl; + // std::cout << " FSTATE_K = " << anharmonic_core->calc_fstate_k << std::endl; } else if (phon->mode == "SCPH") { - - + // Do nothing } else { error->exit("write_input_vars", "This cannot happen"); } @@ -224,9 +228,7 @@ void Writes::setup_result_io() double epsilon_tmp, T1, T2, delta_T; - bool found_tag; - - found_tag = false; + bool found_tag = false; while (fs_result >> line_tmp) { if (line_tmp == "#SYSTEM") { found_tag = true; @@ -261,7 +263,7 @@ void Writes::setup_result_io() if (!(kpoint->nkx == nk_tmp[0] && kpoint->nky == nk_tmp[1] && kpoint->nkz == nk_tmp[2] && - kpoint->nk_reduced == nksym_tmp)) { + kpoint->nk_irred == nksym_tmp)) { error->exit("setup_result_io", "KPOINT information is not consistent"); } @@ -320,7 +322,7 @@ void Writes::setup_result_io() error->exit("setup_result_io", "Smearing method is not consistent"); } - if ((ismear != -1) && (std::abs(epsilon_tmp - integration->epsilon * Ry_to_kayser) >= eps4)) { + if (ismear != -1 && std::abs(epsilon_tmp - integration->epsilon * Ry_to_kayser) >= eps4) { std::cout << "epsilon from file : " << std::setw(15) << std::setprecision(10) << epsilon_tmp * Ry_to_kayser << std::endl; std::cout << "epsilon from input: " << std::setw(15) @@ -365,9 +367,9 @@ void Writes::setup_result_io() fs_result << "#KPOINT" << std::endl; fs_result << kpoint->nkx << " " << kpoint->nky << " " << kpoint->nkz << std::endl; - fs_result << kpoint->nk_reduced << std::endl; + fs_result << kpoint->nk_irred << std::endl; - for (int i = 0; i < kpoint->nk_reduced; ++i) { + for (int i = 0; i < kpoint->nk_irred; ++i) { fs_result << std::setw(6) << i + 1 << ":"; for (int j = 0; j < 3; ++j) { fs_result << std::setw(15) @@ -402,15 +404,14 @@ void Writes::setup_result_io() } } -void Writes::print_phonon_energy() +void Writes::print_phonon_energy() const { unsigned int i; unsigned int ik, is; - unsigned int nk = kpoint->nk; - unsigned int ns = dynamical->neval; - unsigned int knum; + const auto nk = kpoint->nk; + const auto ns = dynamical->neval; - double kayser_to_THz = 0.0299792458; + const auto kayser_to_THz = 0.0299792458; std::cout << std::endl; std::cout << " -----------------------------------------------------------------" << std::endl << std::endl; @@ -459,7 +460,7 @@ void Writes::print_phonon_energy() std::cout << " Mode, Frequency " << std::endl; - knum = kpoint->kpoint_irred_all[ik][0].knum; + const auto knum = kpoint->kpoint_irred_all[ik][0].knum; for (is = 0; is < ns; ++is) { std::cout << std::setw(7) << is + 1; @@ -505,7 +506,10 @@ void Writes::write_phonon_info() } if (dos->flag_dos) { - write_phonon_dos(); + + if (dos->compute_dos || dos->projected_dos) { + write_phonon_dos(); + } if (dos->two_phonon_dos) { write_two_phonon_dos(); @@ -519,6 +523,7 @@ void Writes::write_phonon_info() write_thermodynamics(); if (print_msd) write_msd(); + if (print_ucorr) write_disp_correlation(); } if (print_xsf) { @@ -550,7 +555,7 @@ void Writes::write_phonon_info() } } -void Writes::write_phonon_bands() +void Writes::write_phonon_bands() const { std::ofstream ofs_bands; std::string file_bands = input->job_title + ".bands"; @@ -570,8 +575,8 @@ void Writes::write_phonon_bands() int kcount = 0; std::string str_tmp = "NONE"; - std::string str_kpath = ""; - std::string str_kval = ""; + std::string str_kpath; + std::string str_kval; for (i = 0; i < kpoint->kpInp.size(); ++i) { if (str_tmp != kpoint->kpInp[i].kpelem[0]) { @@ -624,7 +629,7 @@ void Writes::write_phonon_bands() if (dynamical->band_connection == 2) { std::ofstream ofs_connect; - std::string file_connect = input->job_title + ".connection"; + auto file_connect = input->job_title + ".connection"; ofs_connect.open(file_connect.c_str(), std::ios::out); if (!ofs_connect) @@ -648,26 +653,25 @@ void Writes::write_phonon_bands() } } -void Writes::write_phonon_vel() +void Writes::write_phonon_vel() const { std::ofstream ofs_vel; - std::string file_vel = input->job_title + ".phvel"; + auto file_vel = input->job_title + ".phvel"; ofs_vel.open(file_vel.c_str(), std::ios::out); if (!ofs_vel) error->exit("write_phonon_vel", "cannot open file_vel"); - unsigned int i, j; - unsigned int nk = kpoint->nk; + const auto nk = kpoint->nk; - double *kaxis = kpoint->kaxis; - double Ry_to_SI_vel = Bohr_in_Angstrom * 1.0e-10 / time_ry; + auto kaxis = kpoint->kaxis; + const auto Ry_to_SI_vel = Bohr_in_Angstrom * 1.0e-10 / time_ry; ofs_vel << "# k-axis, |Velocity| [m / sec]" << std::endl; ofs_vel.setf(std::ios::fixed); - for (i = 0; i < nk; ++i) { + for (unsigned int i = 0; i < nk; ++i) { ofs_vel << std::setw(8) << kaxis[i]; - for (j = 0; j < nbands; ++j) { + for (unsigned int j = 0; j < nbands; ++j) { ofs_vel << std::setw(15) << std::abs(phonon_velocity->phvel[i][j] * Ry_to_SI_vel); } @@ -680,33 +684,32 @@ void Writes::write_phonon_vel() std::cout << " : Phonon velocity along given k path" << std::endl; } -void Writes::write_phonon_vel_all() +void Writes::write_phonon_vel_all() const { std::ofstream ofs_vel; - std::string file_vel = input->job_title + ".phvel_all"; + auto file_vel = input->job_title + ".phvel_all"; ofs_vel.open(file_vel.c_str(), std::ios::out); if (!ofs_vel) error->exit("write_phonon_vel_all", "cannot open file_vel_all"); - unsigned int i, j, k, ii; - unsigned int knum; - unsigned int nk = kpoint->nk; - unsigned int ns = dynamical->neval; + unsigned int k; + auto nk = kpoint->nk; + auto ns = dynamical->neval; - double Ry_to_SI_vel = Bohr_in_Angstrom * 1.0e-10 / time_ry; - double **eval = dynamical->eval_phonon; + const auto Ry_to_SI_vel = Bohr_in_Angstrom * 1.0e-10 / time_ry; + const auto eval = dynamical->eval_phonon; ofs_vel << "# Phonon group velocity at all reducible k points." << std::endl; ofs_vel << "# irred. knum, knum, mode num, frequency [cm^-1], " "|velocity| [m/sec], velocity_(x,y,z) [m/sec]" << std::endl << std::endl; ofs_vel.setf(std::ios::fixed); - for (i = 0; i < kpoint->nk_reduced; ++i) { + for (unsigned int i = 0; i < kpoint->nk_irred; ++i) { ofs_vel << "# Irreducible k point : " << std::setw(8) << i + 1; ofs_vel << " (" << std::setw(4) << kpoint->kpoint_irred_all[i].size() << ")" << std::endl; - for (j = 0; j < kpoint->kpoint_irred_all[i].size(); ++j) { - knum = kpoint->kpoint_irred_all[i][j].knum; + for (unsigned int j = 0; j < kpoint->kpoint_irred_all[i].size(); ++j) { + const auto knum = kpoint->kpoint_irred_all[i][j].knum; ofs_vel << "## xk = "; for (k = 0; k < 3; ++k) @@ -722,7 +725,7 @@ void Writes::write_phonon_vel_all() << std::setprecision(2) << in_kayser(eval[knum][k]); ofs_vel << std::setw(10) << std::fixed << std::setprecision(2) << phonon_velocity->phvel[knum][k] * Ry_to_SI_vel; - for (ii = 0; ii < 3; ++ii) { + for (unsigned int ii = 0; ii < 3; ++ii) { ofs_vel << std::setw(10) << std::fixed << std::setprecision(2) << phonon_velocity->phvel_xyz[knum][k][ii] * Ry_to_SI_vel; } @@ -740,11 +743,11 @@ void Writes::write_phonon_vel_all() std::cout << " : Phonon velocity at all k points" << std::endl; } -void Writes::write_phonon_dos() +void Writes::write_phonon_dos() const { - int i, iat; + int i; std::ofstream ofs_dos; - std::string file_dos = input->job_title + ".dos"; + auto file_dos = input->job_title + ".dos"; ofs_dos.open(file_dos.c_str(), std::ios::out); if (!ofs_dos) error->exit("write_phonon_dos", "cannot open file_dos"); @@ -768,7 +771,11 @@ void Writes::write_phonon_dos() ofs_dos << std::endl; memory->deallocate(nat_each_kd); - ofs_dos << "# Energy [cm^-1], TOTAL-DOS"; + if (dos->compute_dos) { + ofs_dos << "# Energy [cm^-1], TOTAL-DOS"; + } else { + ofs_dos << "# Energy [cm^-1]"; + } if (dos->projected_dos) { ofs_dos << ", Atom Projected-DOS"; } @@ -776,10 +783,12 @@ void Writes::write_phonon_dos() ofs_dos.setf(std::ios::scientific); for (i = 0; i < dos->n_energy; ++i) { - ofs_dos << std::setw(15) << dos->energy_dos[i] - << std::setw(15) << dos->dos_phonon[i]; + ofs_dos << std::setw(15) << dos->energy_dos[i]; + if (dos->compute_dos) { + ofs_dos << std::setw(15) << dos->dos_phonon[i]; + } if (dos->projected_dos) { - for (iat = 0; iat < system->natmin; ++iat) { + for (int iat = 0; iat < system->natmin; ++iat) { ofs_dos << std::setw(15) << dos->pdos_phonon[iat][i]; } } @@ -790,36 +799,34 @@ void Writes::write_phonon_dos() std::cout << " " << std::setw(input->job_title.length() + 12) << std::left << file_dos; - if (dos->projected_dos) { + if (dos->projected_dos & dos->compute_dos) { std::cout << " : Phonon DOS and atom projected DOS" << std::endl; + } else if (dos->projected_dos) { + std::cout << " : Atom projected phonon DOS" << std::endl; } else { std::cout << " : Phonon DOS" << std::endl; } } -void Writes::write_two_phonon_dos() +void Writes::write_two_phonon_dos() const { - int i, j; - int ik; - - std::string file_tdos; std::ofstream ofs_tdos; - file_tdos = input->job_title + ".tdos"; + auto file_tdos = input->job_title + ".tdos"; ofs_tdos.open(file_tdos.c_str(), std::ios::out); ofs_tdos << "# Two-phonon DOS (TDOS) for all irreducible k points. " << std::endl; ofs_tdos << "# Energy [cm^-1], emission delta(e-e1-e2), absorption delta (e-e1+e2)" << std::endl; - int n = dos->n_energy; + const auto n = dos->n_energy; - for (ik = 0; ik < kpoint->nk_reduced; ++ik) { + for (auto ik = 0; ik < kpoint->nk_irred; ++ik) { ofs_tdos << "# Irred. kpoint : " << std::setw(5) << ik + 1 << std::endl; - for (i = 0; i < n; ++i) { + for (auto i = 0; i < n; ++i) { ofs_tdos << std::setw(15) << dos->emin + dos->delta_e * static_cast(i); - for (j = 0; j < 2; ++j) ofs_tdos << std::setw(15) << dos->dos2_phonon[ik][i][j]; + for (auto j = 0; j < 2; ++j) ofs_tdos << std::setw(15) << dos->dos2_phonon[ik][i][j]; ofs_tdos << std::endl; } ofs_tdos << std::endl; @@ -831,15 +838,11 @@ void Writes::write_two_phonon_dos() std::cout << " : Two-phonon DOS" << std::endl; } -void Writes::write_scattering_phase_space() +void Writes::write_scattering_phase_space() const { - int ik, is; - unsigned int knum; - - std::string file_sps; std::ofstream ofs_sps; - file_sps = input->job_title + ".sps"; + auto file_sps = input->job_title + ".sps"; ofs_sps.open(file_sps.c_str(), std::ios::out); ofs_sps << "# Total scattering phase space (cm): " @@ -847,10 +850,10 @@ void Writes::write_scattering_phase_space() ofs_sps << "# Mode decomposed scattering phase space are printed below." << std::endl; ofs_sps << "# Irred. k, mode, omega (cm^-1), P+ (absorption) (cm), P- (emission) (cm)" << std::endl; - for (ik = 0; ik < kpoint->nk_reduced; ++ik) { - knum = kpoint->kpoint_irred_all[ik][0].knum; + for (auto ik = 0; ik < kpoint->nk_irred; ++ik) { + const auto knum = kpoint->kpoint_irred_all[ik][0].knum; - for (is = 0; is < dynamical->neval; ++is) { + for (auto is = 0; is < dynamical->neval; ++is) { ofs_sps << std::setw(5) << ik + 1; ofs_sps << std::setw(5) << is + 1; ofs_sps << std::setw(15) << in_kayser(dynamical->eval_phonon[knum][is]); @@ -868,22 +871,19 @@ void Writes::write_scattering_phase_space() } -void Writes::write_scattering_amplitude() +void Writes::write_scattering_amplitude() const { int i, j; unsigned int knum; - unsigned int is; - unsigned int ns = dynamical->neval; + const auto ns = dynamical->neval; - std::string file_w = input->job_title + ".sps_Bose"; + auto file_w = input->job_title + ".sps_Bose"; std::ofstream ofs_w; - double Tmin = system->Tmin; - double Tmax = system->Tmax; - double dT = system->dT; - unsigned int NT = static_cast((Tmax - Tmin) / dT) + 1; - - double omega; + const auto Tmin = system->Tmin; + const auto Tmax = system->Tmax; + const auto dT = system->dT; + const auto NT = static_cast((Tmax - Tmin) / dT) + 1; ofs_w.open(file_w.c_str(), std::ios::out); @@ -904,9 +904,9 @@ void Writes::write_scattering_amplitude() knum = kpoint->kpoint_irred_all[i][0].knum; - for (is = 0; is < ns; ++is) { + for (unsigned int is = 0; is < ns; ++is) { - omega = in_kayser(dynamical->eval_phonon[knum][is]); + const auto omega = in_kayser(dynamical->eval_phonon[knum][is]); for (j = 0; j < NT; ++j) { ofs_w << std::setw(5) << i + 1 << std::setw(5) << is + 1 << std::setw(15) << omega; @@ -927,10 +927,10 @@ void Writes::write_scattering_amplitude() << "with the Bose distribution function" << std::endl; } -void Writes::write_normal_mode_direction() +void Writes::write_normal_mode_direction() const { std::ofstream ofs_anime; - std::string file_anime = input->job_title + ".axsf"; + auto file_anime = input->job_title + ".axsf"; ofs_anime.open(file_anime.c_str(), std::ios::out); if (!ofs_anime) error->exit("write_mode_anime", "cannot open file_anime"); @@ -938,10 +938,10 @@ void Writes::write_normal_mode_direction() ofs_anime.setf(std::ios::scientific); unsigned int i, j, k; - unsigned int natmin = system->natmin; - unsigned int nk = kpoint->nk; + const auto natmin = system->natmin; + const auto nk = kpoint->nk; - double force_factor = 100.0; + const auto force_factor = 100.0; double **xmod; std::string *kd_tmp; @@ -972,20 +972,16 @@ void Writes::write_normal_mode_direction() kd_tmp[i] = system->symbol_kd[system->kd[k]]; } - unsigned int ik, imode; - double norm; - std::complex evec_tmp; - unsigned int m; i = 0; - for (ik = 0; ik < nk; ++ik) { - for (imode = 0; imode < nbands; ++imode) { + for (unsigned int ik = 0; ik < nk; ++ik) { + for (unsigned int imode = 0; imode < nbands; ++imode) { ofs_anime << "PRIMCOORD " << std::setw(10) << i + 1 << std::endl; ofs_anime << std::setw(10) << natmin << std::setw(10) << 1 << std::endl; - norm = 0.0; + auto norm = 0.0; for (j = 0; j < 3 * natmin; ++j) { - evec_tmp = dynamical->evec_phonon[ik][imode][j]; + auto evec_tmp = dynamical->evec_phonon[ik][imode][j]; norm += std::pow(evec_tmp.real(), 2) + std::pow(evec_tmp.imag(), 2); } @@ -993,7 +989,7 @@ void Writes::write_normal_mode_direction() for (j = 0; j < natmin; ++j) { - m = system->map_p2s[j][0]; + const auto m = system->map_p2s[j][0]; ofs_anime << std::setw(10) << kd_tmp[j]; @@ -1020,14 +1016,13 @@ void Writes::write_normal_mode_direction() std::cout << " : XcrysDen AXSF file to visualize phonon mode directions" << std::endl; } -void Writes::write_eigenvectors() +void Writes::write_eigenvectors() const { - unsigned int i, j, k; - unsigned int nk = kpoint->nk; - unsigned int neval = dynamical->neval; - double omega2; + unsigned int i, j; + const auto nk = kpoint->nk; + const auto neval = dynamical->neval; std::ofstream ofs_evec; - std::string file_evec = input->job_title + ".evec"; + auto file_evec = input->job_title + ".evec"; ofs_evec.open(file_evec.c_str(), std::ios::out); if (!ofs_evec) error->exit("write_eigenvectors", "cannot open file_evec"); @@ -1064,7 +1059,7 @@ void Writes::write_eigenvectors() } ofs_evec << std::endl; for (j = 0; j < nbands; ++j) { - omega2 = dynamical->eval_phonon[i][j]; + auto omega2 = dynamical->eval_phonon[i][j]; if (omega2 >= 0.0) { omega2 = omega2 * omega2; } else { @@ -1074,7 +1069,7 @@ void Writes::write_eigenvectors() ofs_evec << "### mode " << std::setw(8) << j + 1 << " : "; ofs_evec << std::setw(15) << omega2 << std::endl; - for (k = 0; k < neval; ++k) { + for (unsigned int k = 0; k < neval; ++k) { ofs_evec << std::setw(15) << real(dynamical->evec_phonon[i][j][k]); ofs_evec << std::setw(15) << imag(dynamical->evec_phonon[i][j][k]) << std::endl; } @@ -1088,48 +1083,76 @@ void Writes::write_eigenvectors() std::cout << " : Eigenvector of all k points" << std::endl; } -double Writes::in_kayser(const double x) +double Writes::in_kayser(const double x) const { return x * Ry_to_kayser; } -void Writes::write_thermodynamics() +void Writes::write_thermodynamics() const { - unsigned int i, NT; - double Tmin = system->Tmin; - double Tmax = system->Tmax; - double dT = system->dT; - - double T; - std::string file_thermo; + const auto Tmin = system->Tmin; + const auto Tmax = system->Tmax; + const auto dT = system->dT; - NT = static_cast((Tmax - Tmin) / dT) + 1; + const auto NT = static_cast((Tmax - Tmin) / dT) + 1; std::ofstream ofs_thermo; - file_thermo = input->job_title + ".thermo"; + auto file_thermo = input->job_title + ".thermo"; ofs_thermo.open(file_thermo.c_str(), std::ios::out); - if (!ofs_thermo) error->exit("write_thermodynamics", "cannot open file_cv"); - ofs_thermo << "# Temperature [K], Heat capacity / kB, Entropy / kB, Internal energy [Ry], Free energy [Ry]" << std::endl; - - - // for (i = 0; i <= NT; ++i) { - // - // T = Tmin + dT * static_cast(i); - // std::cout << " T = " << std::setw(15) << T; - // TD = 1000.0; - // phonon_thermodynamics->Debye_T(T, TD); - // std::cout << "TD = " << TD << std::endl; - // } + if (!ofs_thermo) error->exit("write_thermodynamics", "cannot open file_thermo"); + if (thermodynamics->calc_FE_bubble) { + ofs_thermo << "# The bubble free-energy is also shown." << std::endl; + ofs_thermo << + "# Temperature [K], Heat capacity / kB, Entropy / kB, Internal energy [Ry], Free energy (QHA) [Ry], Free energy (Bubble) [Ry]" + << std::endl; + } else { + ofs_thermo << + "# Temperature [K], Heat capacity / kB, Entropy / kB, Internal energy [Ry], Free energy (QHA) [Ry]" + << std::endl; + } + if (thermodynamics->classical) { + ofs_thermo << "# CLASSICAL = 1: use classical statistics" << std::endl; + } - for (i = 0; i < NT; ++i) { - T = Tmin + dT * static_cast(i); + for (unsigned int i = 0; i < NT; ++i) { + auto T = Tmin + dT * static_cast(i); + + const auto heat_capacity = thermodynamics->Cv_tot(T, + kpoint->nk_irred, + dynamical->neval, + kpoint->kpoint_irred_all, + &kpoint->weight_k[0], + dynamical->eval_phonon); + + const auto Svib = thermodynamics->vibrational_entropy(T, kpoint->nk_irred, dynamical->neval, + kpoint->kpoint_irred_all, + &kpoint->weight_k[0], dynamical->eval_phonon); + + const auto Uvib = thermodynamics->internal_energy(T, + kpoint->nk_irred, + dynamical->neval, + kpoint->kpoint_irred_all, + &kpoint->weight_k[0], + dynamical->eval_phonon); + + const auto FE_QHA = thermodynamics->free_energy_QHA(T, + kpoint->nk_irred, + dynamical->neval, + kpoint->kpoint_irred_all, + &kpoint->weight_k[0], + dynamical->eval_phonon); ofs_thermo << std::setw(16) << std::fixed << T; - ofs_thermo << std::setw(18) << std::scientific << thermodynamics->Cv_tot(T) / k_Boltzmann; - ofs_thermo << std::setw(18) << thermodynamics->vibrational_entropy(T) / k_Boltzmann; - ofs_thermo << std::setw(18) << thermodynamics->internal_energy(T); - ofs_thermo << std::setw(18) << thermodynamics->free_energy(T) << std::endl; + ofs_thermo << std::setw(18) << std::scientific << heat_capacity / k_Boltzmann; + ofs_thermo << std::setw(18) << Svib / k_Boltzmann; + ofs_thermo << std::setw(18) << Uvib; + ofs_thermo << std::setw(18) << FE_QHA; + + if (thermodynamics->calc_FE_bubble) { + ofs_thermo << std::setw(18) << thermodynamics->FE_bubble[i]; + } + ofs_thermo << std::endl; } ofs_thermo.close(); @@ -1147,21 +1170,19 @@ void Writes::write_gruneisen() std::ofstream ofs_gruneisen; - std::string file_gru = input->job_title + ".gruneisen"; + auto file_gru = input->job_title + ".gruneisen"; ofs_gruneisen.open(file_gru.c_str(), std::ios::out); if (!ofs_gruneisen) error->exit("write_gruneisen", "cannot open file_vel"); - unsigned int i, j; - unsigned int nk = kpoint->nk; - - double *kaxis = kpoint->kaxis; + auto nk = kpoint->nk; + auto kaxis = kpoint->kaxis; ofs_gruneisen << "# k-axis, gamma" << std::endl; ofs_gruneisen.setf(std::ios::fixed); - for (i = 0; i < nk; ++i) { + for (unsigned int i = 0; i < nk; ++i) { ofs_gruneisen << std::setw(8) << kaxis[i]; - for (j = 0; j < nbands; ++j) { + for (unsigned int j = 0; j < nbands; ++j) { ofs_gruneisen << std::setw(15) << gruneisen->gruneisen[i][j].real(); } ofs_gruneisen << std::endl; @@ -1175,25 +1196,23 @@ void Writes::write_gruneisen() } else { std::ofstream ofs_gruall; - std::string file_gruall; - file_gruall = input->job_title + ".gru_all"; + auto file_gruall = input->job_title + ".gru_all"; ofs_gruall.open(file_gruall.c_str(), std::ios::out); if (!ofs_gruall) error->exit("write_gruneisen", "cannot open file_gruall"); - unsigned int i, j, k; - unsigned int nk = kpoint->nk; - unsigned int ns = dynamical->neval; + auto nk = kpoint->nk; + auto ns = dynamical->neval; ofs_gruall << "# knum, snum, omega [cm^-1], gruneisen parameter" << std::endl; - for (i = 0; i < nk; ++i) { + for (unsigned int i = 0; i < nk; ++i) { ofs_gruall << "# knum = " << i; - for (k = 0; k < 3; ++k) { + for (unsigned int k = 0; k < 3; ++k) { ofs_gruall << std::setw(15) << kpoint->xk[i][k]; } ofs_gruall << std::endl; - for (j = 0; j < ns; ++j) { + for (unsigned int j = 0; j < ns; ++j) { ofs_gruall << std::setw(5) << i; ofs_gruall << std::setw(5) << j; ofs_gruall << std::setw(15) << in_kayser(dynamical->eval_phonon[i][j]); @@ -1210,37 +1229,35 @@ void Writes::write_gruneisen() } } -void Writes::write_msd() +void Writes::write_msd() const { // Write room mean square displacement of atoms std::string file_rmsd = input->job_title + ".msd"; std::ofstream ofs_rmsd; - unsigned int i, j; - unsigned int NT; - unsigned int ns = dynamical->neval; + const auto ns = dynamical->neval; - double Tmin = system->Tmin; - double Tmax = system->Tmax; - double dT = system->dT; - double T, d2_tmp; + const auto Tmin = system->Tmin; + const auto Tmax = system->Tmax; + const auto dT = system->dT; ofs_rmsd.open(file_rmsd.c_str(), std::ios::out); if (!ofs_rmsd) error->exit("write_rmsd", "Could not open file_rmsd"); ofs_rmsd << "# Mean Square Displacements at a function of temperature." << std::endl; - ofs_rmsd << "# Temperature [K], <(u_{1}^{x})^{2}>, <(u_{1}^{y})^{2}>, <(u_{1}^{z})^{2}>, .... [Angstrom^2]" << std::endl; + ofs_rmsd << "# Temperature [K], <(u_{1}^{x})^{2}>, <(u_{1}^{y})^{2}>, <(u_{1}^{z})^{2}>, .... [Angstrom^2]" << std:: + endl; - NT = static_cast((Tmax - Tmin) / dT) + 1; + const auto NT = static_cast((Tmax - Tmin) / dT) + 1; - for (i = 0; i < NT; ++i) { + for (unsigned int i = 0; i < NT; ++i) { - T = Tmin + static_cast(i) * dT; + const auto T = Tmin + static_cast(i) * dT; ofs_rmsd << std::setw(15) << T; - for (j = 0; j < ns; ++j) { - d2_tmp = thermodynamics->disp2_avg(T, j, j); + for (unsigned int j = 0; j < ns; ++j) { + const auto d2_tmp = thermodynamics->disp2_avg(T, j, j); ofs_rmsd << std::setw(15) << d2_tmp * std::pow(Bohr_in_Angstrom, 2.0); } ofs_rmsd << std::endl; @@ -1251,7 +1268,159 @@ void Writes::write_msd() std::cout << " : Mean-square-displacement (MSD)" << std::endl; } -void Writes::write_kappa() + +void Writes::write_scph_msd(double **msd_scph) const +{ + const auto ns = dynamical->neval; + const auto Tmin = system->Tmin; + const auto Tmax = system->Tmax; + const auto dT = system->dT; + const auto NT = static_cast((Tmax - Tmin) / dT) + 1; + + std::ofstream ofs_msd; + auto file_msd = input->job_title + ".scph_msd"; + ofs_msd.open(file_msd.c_str(), std::ios::out); + if (!ofs_msd) error->exit("write_scph_msd", "cannot open file_thermo"); + ofs_msd << "# Mean Square Displacements at a function of temperature." << std::endl; + ofs_msd << "# Temperature [K], <(u_{1}^{x})^{2}>, <(u_{1}^{y})^{2}>, <(u_{1}^{z})^{2}>, .... [Angstrom^2]" << std:: + endl; + + for (unsigned int iT = 0; iT < NT; ++iT) { + const auto temp = Tmin + static_cast(iT) * dT; + + ofs_msd << std::setw(15) << temp; + for (unsigned int i = 0; i < ns; ++i) { + ofs_msd << std::setw(15) << msd_scph[iT][i] * std::pow(Bohr_in_Angstrom, 2.0); + } + ofs_msd << std::endl; + } + + ofs_msd.close(); + std::cout << " " << std::setw(input->job_title.length() + 12) << std::left << file_msd; + std::cout << " : Mean-square-displacement (SCPH level)" << std::endl; +} + + +void Writes::write_disp_correlation() const +{ + auto file_ucorr = input->job_title + ".ucorr"; + std::ofstream ofs; + + const auto ns = dynamical->neval; + const auto Tmin = system->Tmin; + const auto Tmax = system->Tmax; + const auto dT = system->dT; + const auto NT = static_cast((Tmax - Tmin) / dT) + 1; + + ofs.open(file_ucorr.c_str(), std::ios::out); + if (!ofs) error->exit("write_disp_correlation", "Could not open file_rmsd"); + + ofs << "# Displacement-displacement correlation function at various temperatures." << std::endl; + if (thermodynamics->classical) ofs << "# CLASSICAL = 1: classical statistics is used.\n"; + + double shift[3]; + + for (auto i = 0; i < 3; ++i) { + shift[i] = static_cast(shift_ucorr[i]); + } + + ofs << + "# Temperature [K], (atom1,crd1), (atom2,crd2), SHIFT_UCORR, [Angstrom^2]\n"; + + for (unsigned int i = 0; i < NT; ++i) { + + const auto T = Tmin + static_cast(i) * dT; + + for (unsigned int j = 0; j < ns; ++j) { + for (unsigned int k = 0; k < ns; ++k) { + + const auto ucorr = thermodynamics->disp_corrfunc(T, j, k, + shift, + kpoint->nk, + ns, + kpoint->xk, + dynamical->eval_phonon, + dynamical->evec_phonon); + + ofs << std::setw(17) << T; + ofs << std::setw(11) << j / 3 + 1; + ofs << std::setw(3) << j % 3 + 1; + ofs << std::setw(11) << k / 3 + 1; + ofs << std::setw(3) << k % 3 + 1; + ofs << std::setw(4) << shift_ucorr[0]; + ofs << std::setw(4) << shift_ucorr[1]; + ofs << std::setw(4) << shift_ucorr[2]; + ofs << std::setw(15) << ucorr * std::pow(Bohr_in_Angstrom, 2.0); + ofs << '\n'; + } + } + ofs << '\n'; + } + ofs << std::flush; + ofs.close(); + + std::cout << " " << std::setw(input->job_title.length() + 12) << std::left << file_ucorr; + std::cout << " : displacement correlation functions" << std::endl; +} + + +void Writes::write_scph_ucorr(double ***ucorr_scph) const +{ + auto file_ucorr = input->job_title + ".scph_ucorr"; + std::ofstream ofs; + + const auto ns = dynamical->neval; + const auto Tmin = system->Tmin; + const auto Tmax = system->Tmax; + const auto dT = system->dT; + const auto NT = static_cast((Tmax - Tmin) / dT) + 1; + + ofs.open(file_ucorr.c_str(), std::ios::out); + if (!ofs) error->exit("write_disp_correlation", "Could not open file_rmsd"); + + ofs << "# Displacement-displacement correlation function at various temperatures.\n"; + ofs << "# Self-consistent phonon frequencies and eigenvectors are used.\n"; + if (thermodynamics->classical) ofs << "# CLASSICAL = 1: classical statistics is used.\n"; + + double shift[3]; + + for (auto i = 0; i < 3; ++i) { + shift[i] = static_cast(shift_ucorr[i]); + } + + ofs << + "# Temperature [K], (atom1,crd1), (atom2,crd2), SHIFT_UCORR, [Angstrom^2]\n"; + + for (unsigned int i = 0; i < NT; ++i) { + + const auto T = Tmin + static_cast(i) * dT; + + for (unsigned int j = 0; j < ns; ++j) { + for (unsigned int k = 0; k < ns; ++k) { + + ofs << std::setw(17) << T; + ofs << std::setw(11) << j / 3 + 1; + ofs << std::setw(3) << j % 3 + 1; + ofs << std::setw(11) << k / 3 + 1; + ofs << std::setw(3) << k % 3 + 1; + ofs << std::setw(4) << writes->shift_ucorr[0]; + ofs << std::setw(4) << writes->shift_ucorr[1]; + ofs << std::setw(4) << writes->shift_ucorr[2]; + ofs << std::setw(15) << ucorr_scph[i][j][k] * std::pow(Bohr_in_Angstrom, 2.0); + ofs << '\n'; + } + } + ofs << '\n'; + } + ofs << std::flush; + ofs.close(); + + std::cout << " " << std::setw(input->job_title.length() + 12) << std::left << file_ucorr; + std::cout << " : displacement correlation functions (SCPH level)" << std::endl; +} + + +void Writes::write_kappa() const { // Write lattice thermal conductivity @@ -1291,7 +1460,8 @@ void Writes::write_kappa() ofs_kl.open(file_kappa2.c_str(), std::ios::out); if (!ofs_kl) error->exit("write_kappa", "Could not open file_kappa2"); - ofs_kl << "# Temperature [K], Frequency [cm^-1], Thermal Conductivity Spectra (xx, yy, zz) [W/mK * cm]" << std::endl; + ofs_kl << "# Temperature [K], Frequency [cm^-1], Thermal Conductivity Spectra (xx, yy, zz) [W/mK * cm]" << + std::endl; if (isotope->include_isotope) { ofs_kl << "# Isotope effects are included." << std::endl; @@ -1323,11 +1493,10 @@ void Writes::write_kappa() } } -void Writes::write_selfenergy_isotope() +void Writes::write_selfenergy_isotope() const { - unsigned int i, k; + unsigned int k; unsigned int ns = dynamical->neval; - unsigned int knum; double **eval = dynamical->eval_phonon; double **gamma_iso = isotope->gamma_isotope; @@ -1340,14 +1509,15 @@ void Writes::write_selfenergy_isotope() ofs_iso.open(file_iso.c_str(), std::ios::out); if (!ofs_iso) error->exit("write_selfenergy_isotope", "Could not open file_iso"); - ofs_iso << "# Phonon selfenergy due to phonon-isotope scatterings for the irreducible k points." << std::endl; + ofs_iso << "# Phonon selfenergy due to phonon-isotope scatterings for the irreducible k points." << std:: + endl; ofs_iso << "# Irred. knum, mode num, frequency [cm^-1], Gamma_iso [cm^-1]" << std::endl << std::endl; - for (i = 0; i < kpoint->nk_reduced; ++i) { + for (unsigned int i = 0; i < kpoint->nk_irred; ++i) { ofs_iso << "# Irreducible k point : " << std::setw(8) << i + 1; ofs_iso << " (" << std::setw(4) << kpoint->kpoint_irred_all[i].size() << ")" << std::endl; - knum = kpoint->kpoint_irred_all[i][0].knum; + unsigned int knum = kpoint->kpoint_irred_all[i][0].knum; ofs_iso << "## xk = " << std::setw(3); for (k = 0; k < 3; ++k) ofs_iso << std::setw(15) << kpoint->xk[knum][k]; @@ -1374,15 +1544,13 @@ void Writes::write_selfenergy_isotope() } void Writes::write_normal_mode_animation(const double xk_in[3], - const unsigned int ncell[3]) + const unsigned int ncell[3]) const { unsigned int i, j, k; unsigned int iband, istep; unsigned int ns = dynamical->neval; unsigned int natmin = system->natmin; unsigned int nsuper = ncell[0] * ncell[1] * ncell[2]; - unsigned int ix, iy, iz; - unsigned int icell; unsigned int nsteps = 20; unsigned int ntmp = nbands; unsigned int ndigits = 0; @@ -1390,7 +1558,7 @@ void Writes::write_normal_mode_animation(const double xk_in[3], double phase_time; double max_disp_factor = 0.1; double lavec_super[3][3]; - double norm, dmod[3]; + double dmod[3]; double xk[3], kvec[3]; double *eval, **evec_mag, **evec_theta; @@ -1429,7 +1597,7 @@ void Writes::write_normal_mode_animation(const double xk_in[3], } rotvec(kvec, xk, system->rlavec_p, 'T'); - norm = std::sqrt(kvec[0] * kvec[0] + kvec[1] * kvec[1] + kvec[2] * kvec[2]); + double norm = std::sqrt(kvec[0] * kvec[0] + kvec[1] * kvec[1] + kvec[2] * kvec[2]); if (norm > eps) { for (i = 0; i < 3; ++i) kvec[i] /= norm; } @@ -1468,11 +1636,11 @@ void Writes::write_normal_mode_animation(const double xk_in[3], } // Prepare fractional coordinates of atoms in the supercell - icell = 0; + unsigned int icell = 0; - for (ix = 0; ix < ncell[0]; ++ix) { - for (iy = 0; iy < ncell[1]; ++iy) { - for (iz = 0; iz < ncell[2]; ++iz) { + for (unsigned int ix = 0; ix < ncell[0]; ++ix) { + for (unsigned int iy = 0; iy < ncell[1]; ++iy) { + for (unsigned int iz = 0; iz < ncell[2]; ++iz) { phase_cell[icell] = 2.0 * pi * (xk_in[0] * static_cast(ix) + xk_in[1] * static_cast(iy) @@ -1514,18 +1682,16 @@ void Writes::write_normal_mode_animation(const double xk_in[3], if (mass[i] < mass_min) mass_min = mass[i]; } - double max_disp_mag, disp_mag_tmp; - for (i = 0; i < ns; ++i) { - max_disp_mag = 0.0; + double max_disp_mag = 0.0; for (j = 0; j < ns; ++j) { disp_mag[i][j] = std::sqrt(mass_min / mass[j / 3]) * evec_mag[i][j]; } for (j = 0; j < natmin; ++j) { - disp_mag_tmp = 0.0; + double disp_mag_tmp = 0.0; for (k = 0; k < 3; ++k) disp_mag_tmp += std::pow(disp_mag[i][3 * j + k], 2); disp_mag_tmp = std::sqrt(disp_mag_tmp); max_disp_mag = std::max(max_disp_mag, disp_mag_tmp); @@ -1684,7 +1850,7 @@ void Writes::write_normal_mode_animation(const double xk_in[3], } -void Writes::write_participation_ratio() +void Writes::write_participation_ratio() const { unsigned int i, j, k; unsigned int knum; @@ -1746,7 +1912,7 @@ void Writes::write_participation_ratio() ofs_pr << "# irred. kpoint, mode, frequency[kpoint][mode] (cm^-1), PR[kpoint][mode]" << std::endl; - for (i = 0; i < kpoint->nk_reduced; ++i) { + for (i = 0; i < kpoint->nk_irred; ++i) { knum = kpoint->kpoint_irred_all[i][0].knum; ofs_pr << "#" << std::setw(8) << i + 1; ofs_pr << " xk = "; @@ -1769,7 +1935,7 @@ void Writes::write_participation_ratio() ofs_apr << "# Atomic participation ratio of each phonon modes at k points" << std::endl; - if ((kpoint->kpoint_mode == 0) || (kpoint->kpoint_mode == 1)) { + if (kpoint->kpoint_mode == 0 || kpoint->kpoint_mode == 1) { ofs_apr << "# kpoint, mode, atom, APR[kpoint][mode][atom]" << std::endl; @@ -1795,7 +1961,7 @@ void Writes::write_participation_ratio() ofs_apr << "# irred. kpoint, mode, atom, frequency[kpoint][mode] (cm^-1), APR[kpoint][mode][atom]" << std::endl; - for (i = 0; i < kpoint->nk_reduced; ++i) { + for (i = 0; i < kpoint->nk_irred; ++i) { knum = kpoint->kpoint_irred_all[i][0].knum; ofs_apr << "#" << std::setw(8) << i + 1; @@ -1827,3 +1993,194 @@ void Writes::write_participation_ratio() std::cout << " " << std::setw(input->job_title.length() + 12) << std::left << file_apr; std::cout << " : Atomic participation ratio for all k points" << std::endl; } + + +void Writes::write_scph_energy(double ***eval) const +{ + unsigned int nk = kpoint->nk; + unsigned int ns = dynamical->neval; + double Tmin = system->Tmin; + double Tmax = system->Tmax; + double dT = system->dT; + unsigned int NT = static_cast((Tmax - Tmin) / dT) + 1; + + std::ofstream ofs_energy; + std::string file_energy = input->job_title + ".scph_eval"; + + ofs_energy.open(file_energy.c_str(), std::ios::out); + if (!ofs_energy) error->exit("write_scph_energy", "cannot open file_energy"); + + ofs_energy << "# K point, mode, Temperature [K], Eigenvalues [cm^-1]" << std::endl; + + + for (unsigned int ik = 0; ik < nk; ++ik) { + for (unsigned int is = 0; is < ns; ++is) { + for (unsigned int iT = 0; iT < NT; ++iT) { + double temp = Tmin + static_cast(iT) * dT; + + ofs_energy << std::setw(5) << ik + 1; + ofs_energy << std::setw(5) << is + 1; + ofs_energy << std::setw(8) << temp; + ofs_energy << std::setw(15) << writes->in_kayser(eval[iT][ik][is]); + ofs_energy << std::endl; + } + ofs_energy << std::endl; + } + ofs_energy << std::endl; + } + + ofs_energy.close(); +} + +void Writes::write_scph_bands(double ***eval) const +{ + std::ofstream ofs_bands; + std::string file_bands = input->job_title + ".scph_bands"; + + ofs_bands.open(file_bands.c_str(), std::ios::out); + if (!ofs_bands) error->exit("write_scph_bands", "cannot open file_bands"); + + unsigned int i; + unsigned int nk = kpoint->nk; + + double *kaxis = kpoint->kaxis; + double Tmin = system->Tmin; + double Tmax = system->Tmax; + double dT = system->dT; + unsigned int NT = static_cast((Tmax - Tmin) / dT) + 1; + unsigned int ns = dynamical->neval; + int kcount = 0; + + std::string str_tmp = "NONE"; + std::string str_kpath = ""; + std::string str_kval = ""; + + for (i = 0; i < kpoint->kpInp.size(); ++i) { + if (str_tmp != kpoint->kpInp[i].kpelem[0]) { + str_tmp = kpoint->kpInp[i].kpelem[0]; + str_kpath += " " + str_tmp; + + std::ostringstream ss; + ss << std::fixed << std::setprecision(6) << kpoint->kaxis[kcount]; + str_kval += " " + ss.str(); + } + kcount += std::atoi(kpoint->kpInp[i].kpelem[8].c_str()); + + if (str_tmp != kpoint->kpInp[i].kpelem[4]) { + str_tmp = kpoint->kpInp[i].kpelem[4]; + str_kpath += " " + str_tmp; + + std::ostringstream ss; + ss << std::fixed << std::setprecision(6) << kpoint->kaxis[kcount - 1]; + str_kval += " " + ss.str(); + } + } + + ofs_bands << "# " << str_kpath << std::endl; + ofs_bands << "#" << str_kval << std::endl; + ofs_bands << "# Temperature [K], k-axis, Eigenvalues [cm^-1]" << std::endl; + + for (unsigned int iT = 0; iT < NT; ++iT) { + double temp = Tmin + static_cast(iT) * dT; + + for (i = 0; i < nk; ++i) { + ofs_bands << std::setw(15) << std::fixed << temp; + ofs_bands << std::setw(15) << std::fixed << kaxis[i]; + for (unsigned int j = 0; j < ns; ++j) { + ofs_bands << std::setw(15) << std::scientific << writes->in_kayser(eval[iT][i][j]); + } + ofs_bands << std::endl; + } + ofs_bands << std::endl; + } + + ofs_bands.close(); + std::cout << " " << std::setw(input->job_title.length() + 12) << std::left << file_bands; + std::cout << " : SCPH band structure" << std::endl; +} + +void Writes::write_scph_dos(double **dos_scph) const +{ + unsigned int iT; + const auto Tmin = system->Tmin; + const auto Tmax = system->Tmax; + const auto dT = system->dT; + const auto NT = static_cast((Tmax - Tmin) / dT) + 1; + + std::ofstream ofs_dos; + auto file_dos = input->job_title + ".scph_dos"; + + ofs_dos.open(file_dos.c_str(), std::ios::out); + if (!ofs_dos) error->exit("write_scph_dos", "cannot open file_dos"); + + ofs_dos << "# "; + + for (iT = 0; iT < NT; ++iT) { + ofs_dos << std::setw(15) << Tmin + static_cast(iT) * dT; + } + ofs_dos << std::endl; + + for (unsigned int j = 0; j < dos->n_energy; ++j) { + ofs_dos << std::setw(15) << dos->energy_dos[j]; + + for (iT = 0; iT < NT; ++iT) { + ofs_dos << std::setw(15) << dos_scph[iT][j]; + } + ofs_dos << std::endl; + } + + ofs_dos << std::endl; + ofs_dos.close(); + std::cout << " " << std::setw(input->job_title.length() + 12) << std::left << file_dos; + std::cout << " : SCPH DOS" << std::endl; +} + +void Writes::write_scph_thermodynamics(double *heat_capacity, + double *FE_QHA, + double *dFE_scph) const +{ + const auto Tmin = system->Tmin; + const auto Tmax = system->Tmax; + const auto dT = system->dT; + const auto NT = static_cast((Tmax - Tmin) / dT) + 1; + + std::ofstream ofs_thermo; + auto file_thermo = input->job_title + ".scph_thermo"; + ofs_thermo.open(file_thermo.c_str(), std::ios::out); + if (!ofs_thermo) + error->exit("write_scph_thermodynamics", + "cannot open file_thermo"); + + if (thermodynamics->calc_FE_bubble) { + ofs_thermo << "# The bubble free-energy calculated on top of the SCPH wavefunction is also shown." << std::endl; + ofs_thermo << + "# Temperature [K], Cv [in kB unit], F_{vib} (QHA term) [Ry], F_{vib} (SCPH correction) [Ry], F_{vib} (Bubble correction) [Ry]" + << std::endl; + } else { + ofs_thermo << "# Temperature [K], Cv [in kB unit], F_{vib} (QHA term) [Ry], F_{vib} (SCPH correction) [Ry]" + << std::endl; + } + + if (thermodynamics->classical) { + ofs_thermo << "# CLASSICAL = 1: Use classical limit." << std::endl; + } + + for (unsigned int iT = 0; iT < NT; ++iT) { + + const auto temp = Tmin + static_cast(iT) * dT; + + ofs_thermo << std::setw(16) << std::fixed << temp; + ofs_thermo << std::setw(18) << std::scientific << heat_capacity[iT] / k_Boltzmann; + ofs_thermo << std::setw(18) << FE_QHA[iT]; + ofs_thermo << std::setw(18) << dFE_scph[iT]; + + if (thermodynamics->calc_FE_bubble) { + ofs_thermo << std::setw(18) << thermodynamics->FE_bubble[iT]; + } + ofs_thermo << std::endl; + } + + ofs_thermo.close(); + std::cout << " " << std::setw(input->job_title.length() + 12) << std::left << file_thermo; + std::cout << " : SCPH heat capcaity and free energy" << std::endl; +} diff --git a/anphon/write_phonons.h b/anphon/write_phonons.h index c53eb520..239a31cb 100644 --- a/anphon/write_phonons.h +++ b/anphon/write_phonons.h @@ -17,49 +17,68 @@ namespace PHON_NS { - class Writes: protected Pointers + class Writes : protected Pointers { public: Writes(class PHON *); + ~Writes(); + void write_phonon_info(); - void print_phonon_energy(); + void print_phonon_energy() const; void write_gruneisen(); void setup_result_io(); void write_input_vars(); - void write_kappa(); - void write_selfenergy_isotope(); + void write_kappa() const; + void write_selfenergy_isotope() const; bool print_xsf; bool print_msd; + bool print_ucorr; bool print_anime; unsigned int anime_cellsize[3]; double anime_kpoint[3]; + int shift_ucorr[3]; + + double in_kayser(const double) const; - double in_kayser(const double); int nbands; std::string file_result; std::string anime_format; std::fstream fs_result; + void write_scph_energy(double ***) const; + void write_scph_bands(double ***) const; + void write_scph_dos(double **) const; + void write_scph_thermodynamics(double *heat_capacity, + double *FE_QHA, + double *dFE_scph) const; + void write_scph_msd(double **) const; + void write_scph_ucorr(double ***ucorr_scph) const; + private: - void write_phonon_bands(); - void write_phonon_vel(); - void write_phonon_vel_all(); - void write_phonon_dos(); - void write_two_phonon_dos(); - void write_scattering_phase_space(); - void write_scattering_amplitude(); - void write_normal_mode_direction(); - void write_normal_mode_animation(const double [3], const unsigned int [3]); - void write_eigenvectors(); - void write_thermodynamics(); - void write_msd(); - void write_participation_ratio(); + void write_phonon_bands() const; + void write_phonon_vel() const; + void write_phonon_vel_all() const; + void write_phonon_dos() const; + void write_two_phonon_dos() const; + void write_scattering_phase_space() const; + void write_scattering_amplitude() const; + void write_normal_mode_direction() const; + + void write_normal_mode_animation(const double [3], + const unsigned int [3]) const; + + void write_eigenvectors() const; + void write_thermodynamics() const; + void write_msd() const; + void write_disp_correlation() const; + + void write_participation_ratio() const; double Ry_to_kayser; }; diff --git a/docs/img/Si_phband_DFT.png b/docs/img/Si_phband_DFT.png index 9f7f8e8f..93010484 100644 Binary files a/docs/img/Si_phband_DFT.png and b/docs/img/Si_phband_DFT.png differ diff --git a/docs/img/Si_phdos_DFT.png b/docs/img/Si_phdos_DFT.png index c2646d08..e4de34ef 100644 Binary files a/docs/img/Si_phdos_DFT.png and b/docs/img/Si_phdos_DFT.png differ diff --git a/docs/img/si_cumulative.png b/docs/img/si_cumulative.png index 14f3a1a7..c3c2a231 100644 Binary files a/docs/img/si_cumulative.png and b/docs/img/si_cumulative.png differ diff --git a/docs/img/si_kappa.png b/docs/img/si_kappa.png index c0b43997..e2e02107 100644 Binary files a/docs/img/si_kappa.png and b/docs/img/si_kappa.png differ diff --git a/docs/img/si_kappa_spec.png b/docs/img/si_kappa_spec.png index 9104cb12..d119eb97 100644 Binary files a/docs/img/si_kappa_spec.png and b/docs/img/si_kappa_spec.png differ diff --git a/docs/img/si_tau.png b/docs/img/si_tau.png index 45c74270..1d59f39f 100644 Binary files a/docs/img/si_tau.png and b/docs/img/si_tau.png differ diff --git a/docs/source/alm_root.rst b/docs/source/alm_root.rst new file mode 100644 index 00000000..cb14e417 --- /dev/null +++ b/docs/source/alm_root.rst @@ -0,0 +1,9 @@ +ALM: Force constant calculator +============================== + +.. toctree:: + :maxdepth: 2 + + almdir/inputalm + almdir/outputalm + almdir/formalism_alm \ No newline at end of file diff --git a/docs/source/formalism/formalism_alm.rst b/docs/source/almdir/formalism_alm.rst similarity index 53% rename from docs/source/formalism/formalism_alm.rst rename to docs/source/almdir/formalism_alm.rst index aec8c3a9..83d71761 100644 --- a/docs/source/formalism/formalism_alm.rst +++ b/docs/source/almdir/formalism_alm.rst @@ -1,5 +1,5 @@ -Formalism for program alm -========================= +ALM: Theoretical background +============================= Interatomic force constants (IFCs) ---------------------------------- @@ -23,7 +23,7 @@ The are several relationships between IFCs which may be used to reduce the numbe * Permutation - Firstly, IFCs should be invariant under the exchange of triplet :math:`(\ell,\kappa,\mu)`, e.g. + IFC should be invariant under the exchange of the triplet :math:`(\ell,\kappa,\mu)`, e.g., .. math:: @@ -31,7 +31,7 @@ The are several relationships between IFCs which may be used to reduce the numbe * Periodicity - Secondly, since IFCs should depend on interatomic distances, they are invariant under a translation in units of lattice vector, namely + Since IFCs should depend on interatomic distances, they are invariant under a translation in units of the lattice vector, namely .. math:: @@ -52,7 +52,7 @@ The are several relationships between IFCs which may be used to reduce the numbe .. Note:: - In the current implementation of *alm*, independent IFCs are searched in Cartesian coordinate where the matrix element :math:`O_{\mu\nu}` is 0 or :math:`\pm1` in all symmetry operations except for those of **hexagonal** (trigonal) lattice. Also, except for hexagonal (trigonal) systems, the product :math:`O_{\nu_{1}\mu_{1}}\cdots O_{\nu_{n}\mu_{n}}` in the left hand side of equation :eq:`ifcsym1` becomes non-zero only for a specific pair of :math:`\{\nu\}` (and becomes 0 for all other :math:`\{\nu\}`\ s). Therefore, let :math:`\{\nu^{\prime}\}` be such a pair of :math:`\{\nu\}`, the equation :eq:`ifcsym1` can be reduced to + In the implementation of ALM, symmetricaly independent IFCs are searched in Cartesian coordinate where the matrix element :math:`O_{\mu\nu}` is 0 or :math:`\pm1` in all symmetry operations except for those of **hexagonal** (trigonal) lattice. Also, except for hexagonal (trigonal) systems, the product :math:`O_{\nu_{1}\mu_{1}}\cdots O_{\nu_{n}\mu_{n}}` in the left hand side of equation :eq:`ifcsym1` becomes non-zero only for a specific pair of :math:`\{\nu\}` (and becomes 0 for all other :math:`\{\nu\}`\ s). Therefore, let :math:`\{\nu^{\prime}\}` be such a pair of :math:`\{\nu\}`, the equation :eq:`ifcsym1` can be reduced to .. math:: :label: ifcsym2 @@ -76,7 +76,7 @@ The constraints for translational invariance are given by \sum_{\ell_{1}\kappa_{1}}\Phi_{\mu_{1}\mu_{2}\dots\mu_{n}}(\ell_{1}\kappa_{1};\ell_{2}\kappa_{2};\dots;\ell_{n}\kappa_{n}) = 0, -which should be satisfied for arbitrary pairs of :math:`\ell_{2}\kappa_{2},\dots,\ell_{n}\kappa_{n}` and :math:`\mu_{1},\dots,\mu_{n}`. The code *alm* imposes equation :eq:`consttran` by default (``ICONST = 1``). +which should be satisfied for arbitrary pairs of :math:`\ell_{2}\kappa_{2},\dots,\ell_{n}\kappa_{n}` and :math:`\mu_{1},\dots,\mu_{n}`. The code **alm** imposes equation :eq:`consttran` by default (``ICONST = 1``). The constraints for rotational invariance are @@ -115,26 +115,72 @@ When ``NORDER = 1``, equation :eq:`constrot1` will be considered if ``ICONST = 2 .. _fitting_formalism: -Estimate IFCs by least-square fitting -------------------------------------- +Estimate IFCs by linear regression +---------------------------------- + +Basic notations ++++++++++++++++ -The code **alm** extracts harmonic and anharmonic IFCs from a displacement-force data set by solving the following linear least-square problem: +From the symmetrically independent set of IFCs and the constraints between them for satisfying the translational and/or rotational invariance, we can construct an irreducible set of IFCs :math:`\{\Phi_{i}\}`. Let us denote a column vector comprising the :math:`N` irreducible set of IFCs as :math:`\boldsymbol{\Phi}`. Then, the Taylor expansion potential (TEP) defined by equation :eq:`U_Taylor` is written as .. math:: - :label: lsq + U_{\mathrm{TEP}} = \boldsymbol{b}^{T}\boldsymbol{\Phi}. + +Here, :math:`\boldsymbol{b} \in \mathbb{R}^{1\times N}` is a function of atomic displacements :math:`\{u_{i}\}` defined as :math:`\boldsymbol{b} = \partial U / \partial \boldsymbol{\Phi}`. The atomic forces based on the TEP is then given as + +.. math:: + :label: force_tep + + \boldsymbol{F}_{\mathrm{TEP}} = - \frac{\partial U_{\mathrm{TEP}}}{\partial \boldsymbol{u}} = - \frac{\partial \boldsymbol{b}^{T}}{\partial \boldsymbol{u}} \boldsymbol{\Phi} = A \boldsymbol{\Phi}, + +where :math:`A \in \mathbb{R}^{3N_{s} \times N}` with :math:`N_{s}` being the number of atoms in the supercell, +and :math:`\boldsymbol{u}^{T} = (u_{1}^{x}, u_{1}^{y}, u_{1}^{z}, \dots, u_{N_{s}}^{x}, u_{N_{s}}^{y}, u_{N_{s}}^{z})` is the vector comprising :math:`3N_{s}` atomic displacements in the supercell. +Note that the matrix :math:`A` and force vector :math:`\boldsymbol{F}_{\mathrm{TEP}}` depend on the atomic configuration of the supercell. +To make this point clearer, let us denote them as :math:`A(\boldsymbol{u})` and :math:`\boldsymbol{F}_{\mathrm{TEP}}(\boldsymbol{u})`. + +To estimate the IFC vector :math:`\boldsymbol{\Phi}` by linear regression, it is usually necessary to consider several different displacement patterns. +Let us suppose we have :math:`N_d` displacement patterns and atomic forces for each pattern obtained by DFT. +Then, equation :eq:`force_tep` defined for each displacement pattern can be combined to a single equation as + +.. math:: + \boldsymbol{\mathscr{F}}_{\mathrm{TEP}} = \mathbb{A} \boldsymbol{\Phi}, + +where :math:`\boldsymbol{\mathscr{F}}^{T} = [\boldsymbol{F}^{T}(\boldsymbol{u}_{1}), \dots, \boldsymbol{F}^{T}(\boldsymbol{u}_{N_d})]` and +:math:`\mathbb{A}^{T} = [A^{T}(\boldsymbol{u}_{1}),\dots,A^{T}(\boldsymbol{u}_{N_d})]`. - \text{minimize} \ \ \chi^{2} = \sum_{t}^{m} \sum_{i} \|F_{i,t}^{\mathrm{DFT}} - F_{i,t}^{\mathrm{ALM}} \|^{2}. -Here, :math:`m` is the number of atomic configurations and the index :math:`i = (\ell,\kappa,\mu)` is the triplet of coordinates. -The model force :math:`F_{i,t}^{\mathrm{ALM}}` is a linear function of IFCs :math:`\{\Phi\}` which can be obtained by differentiating :math:`U` (Eq. :eq:`U_Taylor`) by :math:`u_{i}`. -The parameters (IFCs) are determined so as to best mimic the atomic forces obtained by DFT calculations, :math:`F_{i,t}^{\mathrm{DFT}}`. +Ordinary least-squares +++++++++++++++++++++++ -To evaluate goodness of fit, **alm** reports the relative error :math:`\sigma` defined by +In the ordinary least-squares (``LMODEL = least-squares``), IFCs are estimated by solving the following problem: + +.. math:: + :label: lsq + + \boldsymbol{\Phi}_{\mathrm{OLS}} = \mathop{\rm argmin}\limits_{\boldsymbol{\Phi}} \frac{1}{2N_{d}} \|\boldsymbol{\mathscr{F}}_{\mathrm{DFT}} - \boldsymbol{\mathscr{F}}_{\mathrm{TEP}} \|^{2}_{2} = \mathop{\rm argmin}\limits_{\boldsymbol{\Phi}} \frac{1}{2N_{d}} \|\boldsymbol{\mathscr{F}}_{\mathrm{DFT}} - \mathbb{A} \boldsymbol{\Phi} \|^{2}_{2}. + +Therefore, the IFCs are determined so that the residual sum of squares (RSS) is minimized. +To determine all elements of :math:`\boldsymbol{\Phi}_{\mathrm{OLS}}` uniquely, :math:`\mathbb{A}^{T}\mathbb{A}` must be full rank. When the fitting is successful, **alm** reports the relative fitting error :math:`\sigma` defined by .. math:: :label: fitting_error - \sigma = \sqrt{\frac{\chi^{2}}{\sum_{t}^{m}\sum_{i} (F_{i,t}^{\mathrm{DFT}})^{2}}}, + \sigma = \sqrt{\frac{\|\boldsymbol{\mathscr{F}}_{\mathrm{DFT}} - \mathbb{A} \boldsymbol{\Phi} \|^{2}_{2}}{\|\boldsymbol{\mathscr{F}}_{\mathrm{DFT}}\|_{2}^{2}}}, + +where the denominator is the square sum of the DFT forces. + +.. _alm_theory_enet: + +Elastic-net regression +++++++++++++++++++++++ + +In the elasitc-net optimization (``LMODEL = elastic-net``), IFCs are estimated by solving the following optimization problem: + +.. math:: + :label: enet + + \boldsymbol{\Phi}_{\mathrm{enet}} = \mathop{\rm argmin}\limits_{\boldsymbol{\Phi}} \frac{1}{2N_{d}} \|\boldsymbol{\mathscr{F}}_{\mathrm{DFT}} - \mathbb{A} \boldsymbol{\Phi} \|^{2}_{2} + \alpha \beta \| \boldsymbol{\Phi} \|_{1} + \frac{1}{2} \alpha (1-\beta) \| \boldsymbol{\Phi} \|_{2}^{2}, -where the numerator is the residual of fit and the denominator is the square sum of DFT forces. +where :math:`\alpha` is a hyperparameter that controls the trade-off between the sparsity and accuracy of the model, and :math:`\beta \; (0 < \beta \leq 1)` is a hyperparameter that controls the ratio of the :math:`L_{1}` and :math:`L_{2}` regularization terms. :math:`\alpha` and :math:`\beta` must be given by input tags ``L1_ALPHA`` and ``L1_RATIO``, respectively. +An optimal value of :math:`\alpha` can be estimated, for example, by cross-validation (CV). A :math:`n`\ -fold CV can be performed by setting the ``CV``-tag properly. diff --git a/docs/source/almdir/inputalm.rst b/docs/source/almdir/inputalm.rst new file mode 100644 index 00000000..35cb375a --- /dev/null +++ b/docs/source/almdir/inputalm.rst @@ -0,0 +1,728 @@ +.. raw:: html + + + +.. role:: red + +ALM: Input files +---------------- + +.. _reference_input_alm: + +Format of input files +~~~~~~~~~~~~~~~~~~~~~ + +Each input file should consist of entry fields. +Available entry fields are + +**&general**, **&interaction**, **&cutoff**, **&cell**, **&position**, and **&optimize** (**&fitting**). + + +Each entry field starts from the key label **&field** and ends at the terminate character "/". (This is equivalent to Fortran namelist.) + +For example, &general entry field of program *alm* should be given like + +:: + + &general + # Comment line + PREFIX = prefix + MODE = fitting + / + +Multiple entries can be put in a single line. Also, characters put on the right of sharp (“#”) are neglected. Therefore, the above example is equivalent to the following:: + + &general + PREFIX = prefix; MODE = fitting # Comment line + / + +Each variable must be given inside the appropriate entry field. + + +.. _label_inputvar_alm: + +List of supported input variables +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. csv-table:: + :widths: 20, 20, 20, 20, 20 + + **&general** + :ref:`HESSIAN `, :ref:`KD `, :ref:`MODE `, :ref:`NAT `, :ref:`NKD ` + :ref:`PERIODIC `, :ref:`PREFIX `, :ref:`PRINTSYM `, :ref:`TOLERANCE ` + **&interaction** + :ref:`NBODY `, :ref:`NORDER ` + **&optimize** + :ref:`CONV_TOL `, :ref:`CV `, :ref:`CV_MINALPHA `, :ref:`DEBIAS_OLS `, :ref:`DFILE ` + :ref:`DFSET `, :ref:`DFSET_CV `, :ref:`ENET_DNORM `, :ref:`FC2XML `, :ref:`FC3XML ` + :ref:`FFILE `, :ref:`ICONST `, :ref:`L1_ALPHA `, :ref:`L1_RATIO `, :ref:`LMODEL ` + :ref:`MAXITER `, :ref:`NDATA `, :ref:`NDATA_CV `, :ref:`NSTART NEND `, :ref:`NSTART_CV NEND_CV ` + :ref:`ROTAXIS `, :ref:`SKIP `, :ref:`SOLUTION_PATH `, :ref:`SPARSE `, :ref:`SPARSESOLVER ` + :ref:`STANDARDIZE ` + +Description of input variables +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +"&general"-field +++++++++++++++++ + +.. _alm_prefix: + +* **PREFIX**-tag : Job prefix to be used for names of output files + + :Default: None + :Type: String + +```` + +.. _alm_mode: + +* **MODE**-tag = optimize | suggest | fitting + + ============================ =========================================================== + optimize (:red:`>= 1.1.0`) | Estimate harmonic and anharmonic IFCs. + | This mode requires an appropriate &optimize field. + + fitting (:red:`deprecated`) | An alias of ``MODE = optimize`` + + suggest | Suggests the displacement patterns necessary + | to estimate harmonic and anharmonic IFCS. + ============================ =========================================================== + + :Default: None + :Type: String + +```` + +.. _alm_nat: + +* **NAT**-tag : Number of atoms in the supercell + + :Default: None + :Type: Integer + +```` + +.. _alm_nkd: + +* **NKD**-tag : Number of atomic species + + :Default: None + :Type: Integer + +```` + +.. _alm_kd: + +* **KD**-tag = Name[1], ... , Name[``NKD``] + + :Default: None + :Type: Array of strings + :Example: In the case of GaAs with ``NKD = 2``, it should be ``KD = Ga As``. + +```` + +.. _alm_tolerance: + +* TOLERANCE-tag : Tolerance for finding symmetry operations + + :Default: 1.0e-3 + :Type: Double + +```` + +.. _alm_printsym: + +* PRINTSYM-tag = 0 | 1 + + === ==================================================== + 0 Symmetry operations won’t be saved in “SYMM_INFO” + 1 Symmetry operations will be saved in “SYMM_INFO” + === ==================================================== + + :Default: 0 + :type: Integer + +```` + +.. _alm_periodic: + +* PERIODIC-tag = PERIODIC[1], PERIODIC[2], PERIODIC[3] + + ===== ==================================================== + 0 | Do not consider periodic boundary conditions when + | searching for interacting atoms. + + 1 | Consider periodic boundary conditions when + | searching for interacting atoms. + ===== ==================================================== + + :Default: 1 1 1 + :type: Array of integers + :Description: This tag is useful for generating interacting atoms in low dimensional systems. When ``PERIODIC[i]`` is zero, periodic boundary condition is turned off along the direction of the lattice vector :math:`\boldsymbol{a}_{i}`. + +```` + +.. _alm_hessian: + +* HESSIAN-tag = 0 | 1 + + ===== ===================================================================== + 0 Do not save the Hessian matrix + 1 Save the entire Hessian matrix of the supercell as PREFIX.hessian. + ===== ===================================================================== + + :Default: 0 + :type: Integer + +```` + +"&interaction"-field +++++++++++++++++++++ + +.. _alm_norder: + + +* **NORDER**-tag : The order of force constants to be calculated. Anharmonic terms up to :math:`(m+1)`\ th order will be considered with ``NORDER`` = :math:`m`. + + :Default: None + :Type: Integer + :Example: ``NORDER = 1`` for calculate harmonic terms only, ``NORDER = 2`` to include cubic terms as well, and so on. + +```` + +.. _alm_nbody: + + +* NBODY-tag : Entry for excluding multiple-body interactions from anharmonic force constants + + :Default: ``NBODY`` = [2, 3, 4, ..., ``NORDER`` + 1] + :Type: Array of integers + :Description: This tag may be useful for excluding multi-body clusters which are supposedly less important. For example, a set of fourth-order IFCs :math:`\{\Phi_{ijkl}\}`, where :math:`i, j, k`, and :math:`l` label atoms in the supercell, can be categorized into four different subsets; **on-site**, **two-body**, **three-body**, and **four-body** terms. Neglecting the Cartesian coordinates of IFCs for simplicity, each subset contains the IFC elements shown as follows: + + =========== ========================================================================= + on-site | :math:`\{\Phi_{iiii}\}` + two-body | :math:`\{\Phi_{iijj}\}`, :math:`\{\Phi_{iiij}\}` (:math:`i\neq j`) + three-body | :math:`\{\Phi_{iijk}\}` (:math:`i\neq j, i\neq k, j \neq k`) + four-body | :math:`\{\Phi_{ijkl}\}` (all subscripts are different from each other) + =========== ========================================================================= + + Since the four-body clusters are expected to be less important than the three-body and less-body clusters, you may want to exclude the four-body terms from the Taylor expansion potential because the number of such terms is huge. This can be done by setting the ``NBODY`` tag as ``NBODY = 2 3 3`` together with ``NORDER = 3``. + + :More examples: ``NORDER = 2; NBODY = 2 2`` includes harmonic and cubic IFCs but excludes three-body clusters from the cubic terms. + + ``NORDER = 5; NBODY = 2 3 3 2 2`` includes anharmonic terms up to the sixth-order, where the four-body clusters are excluded from the fourth-order IFCs, and the multi (:math:`\geq 3`)-body clusters are excluded from the fifth- and sixth-order IFCs. + +```` + +"&cutoff"-field ++++++++++++++++ + +In this entry field, one needs to specify cutoff radii of interaction for each order in units of Bohr. +In the current implementation, cutoff radii should be defined for every possible pair of atomic elements. +For example, the cutoff entry for a harmonic calculation (``NORDER = 1``) of Si (``NKD = 1``) should be like +:: + + &cutoff + Si-Si 10.0 + / + +This means that the cutoff radius of 10 :math:`a_{0}` is used for harmonic Si-Si terms. +Please note that the first column should be two character strings, which are contained in the ``KD``-tag, +connected by a hyphen (’-’). + +When one wants to consider cubic terms (``NORDER = 2``), please specify the cutoff radius for cubic terms in the third column as the following:: + + + &cutoff + Si-Si 10.0 5.6 # Pair r_{2} r_{3} + / + +Instead of giving specific cutoff radii, one can write "None" as follows:: + + &cutoff + Si-Si None 5.6 + / + +which means that all possible harmonic terms between Si-Si atoms will be included. + +.. caution:: + + Setting 'None' for anharmonic terms can greatly increase the number of parameters and thereby increase the computational cost. + +When there are more than two atomic elements, please specify the cutoff radii between every possible pair of atomic elements. In the case of MgO (``NKD = 2``), the cutoff entry should be like +:: + + &cutoff + Mg-Mg 8.0 + O-O 8.0 + Mg-O 10.0 + / + +which can equivalently be written by using the wild card (’*’) as +:: + + &cutoff + *-* 8.0 + Mg-O 10.0 # Overwrite the cutoff radius for Mg-O harmonic interactions + / + +.. important:: + + Cutoff radii specified by an earlier entry are overwritten by a new entry that comes later. + +Once the cutoff radii are properly given, harmonic force constants +:math:`\Phi_{i,j}^{\mu,\nu}` satisfying :math:`r_{ij} \le r_{c}^{\mathrm{KD}[i]-\mathrm{KD}[j]}` will be searched. + +In the case of cubic terms, force constants :math:`\Phi_{ijk}^{\mu\nu\lambda}` satisfying :math:`r_{ij} \le r_{c}^{\mathrm{KD}[i]-\mathrm{KD}[j]}`, :math:`r_{ik} \le r_{c}^{\mathrm{KD}[i]-\mathrm{KD}[k]}`, and +:math:`r_{jk} \le r_{c}^{\mathrm{KD}[j]-\mathrm{KD}[k]}` will be searched and determined by fitting. + +```` + +"&cell"-field ++++++++++++++ + +Please give the cell parameters in this entry in units of Bohr as the following:: + + &cell + a + a11 a12 a13 + a21 a22 a23 + a31 a32 a33 + / + +The cell parameters are then given by :math:`\vec{a}_{1} = a \times (a_{11}, a_{12}, a_{13})`, +:math:`\vec{a}_{2} = a \times (a_{21}, a_{22}, a_{23})`, and :math:`\vec{a}_{3} = a \times (a_{31}, a_{32}, a_{33})`. + +```` + +"&position"-field ++++++++++++++++++ + +In this field, one needs to specify the atomic element and fractional coordinate of atoms in the supercell. +Each line should be +:: + + ikd xf[1] xf[2] xf[3] + +where `ikd` is an integer specifying the atomic element (`ikd` = 1, ..., ``NKD``) and `xf[i]` is the +fractional coordinate of an atom. There should be ``NAT`` such lines in the &position entry field. + + +```` + +"&optimize"-field ("&fitting"-field) +++++++++++++++++++++++++++++++++++++ + +This field is necessary when ``MODE = optimize`` (or a deprecated option ``MODE = fitting``). + +.. _alm_lmodel: + +* LMODEL-tag : Choice of the linear model used for estimating force constants + + =================================== ========================== + "least-squares", "LS", "OLS", 1 Ordinary least square + "elastic-net", "enet", 2 Elastic net + =================================== ========================== + + :Default: least-squares + :Type: String + :Description: When ``LMODEL = ols``, the force constants are estimated from the displacement-force datasets via the ordinary least-squares (OLS), which is usually sufficient to calculate harmonic and third-order force constants. + + The elastic net (``LMODEL = enet``) should be useful to calculate the fourth-order (and higher-order) force constants. When the elastic net is selected, the users have to set the following related tags: ``CV``, ``L1_RATIO``, ``L1_ALPHA``, ``CV_MAXALPHA``, ``CV_MINALPHA``, ``CV_NALPHA``, ``STANDARDIZE``, ``ENET_DNORM``, ``MAXITER``, ``CONV_TOL``, ``NWRITE``, ``SOLUTION_PATH``, ``DEBIAS_OLS`` + +```` + +.. _alm_dfset: + +* **DFSET**-tag: File name containing displacement-force datasets for training + + .. versionadded:: 1.1.0 + + :Default: None + :Type: String + :Description: The format of ``DFSET`` can be found :ref:`here ` + +```` + +.. _alm_dfile: + +* DFILE-tag: File name containing atomic displacements in Cartesian coordinate + + .. deprecated:: 1.1.0 + Use ``DFSET`` instead. + + :Default: None + :Type: String + :Description: The format of ``DFILE`` can be found :ref:`here `. This tag is deprecated and will be removed in a future major release. Please use ``DFSET`` instead. + + + +```` + +.. _alm_ffile: + +* FFILE-tag: File name containing atomic forces in Cartesian coordinate + + .. deprecated:: 1.1.0 + Use ``DFSET`` instead. + + :Default: None + :Type: String + :Description: The format of ``FFILE`` can be found :ref:`here `. This tag is deprecated and will be removed in a future major release. Please use ``DFSET`` instead. + +```` + +.. _alm_ndata: + +* NDATA-tag : Number of displacement-force data sets + + :Default: None + :Type: Integer + :Description: If ``NDATA`` is not given, the code reads all lines of ``DFSET`` (excluding comment lines) and estimates ``NDATA`` by dividing the line number by ``NAT``. If the number of lines is not divisible by ``NAT``, an error is raised. ``DFSET`` should contain at least ``NDATA``:math:`\times` ``NAT`` lines. + +```` + +.. _alm_nstart: + +* NSTART, NEND-tags : Specifies the range of data to be used for fitting + + :Default: ``NSTART = 1``, ``NEND = NDATA`` + :Type: Integer + :Example: To use the data in the range of [20:30] out of 50 entries, the tags should be ``NSTART = 20`` and ``NEND = 30``. + +```` + +.. _alm_skip: + +* SKIP-tag : Specifies the range of data to be skipped for training + + :Default: None + :Type: Two integers connected by a hyphen + :Description: ``SKIP`` =\ :math:`i`-:math:`j` skips the data in the range of [:math:`i`:\ :math:`j`]. The :math:`i` and :math:`j` must satisfy :math:`1\leq i \leq j \leq` ``NDATA``. This option may be useful when doing cross-validation manually (``CV=-1``). + +```` + +.. _alm_iconst: + +* ICONST-tag = 0 | 1 | 2 | 3 | 11 + + ===== ============================================================================================= + 0 No constraints + 1 | Constraint for translational invariance is imposed between IFCs. + | Available only when ``LMODEL = ols``. + 11 | Same as ``ICONST = 1`` but the constraint is imposed *algebraically* rather than numerically. + | Select this option when ``LMODEL = enet``. + 2 | In addition to ``ICONST = 1``, constraints for rotational invariance will be + | imposed up to (``NORDER`` + 1)th order. Available only when ``LMODEL = ols``. + 3 | In addition to ``ICONST = 2``, constraints for rotational invariance between (``NORDER`` + 1)th order + | and (``NORDER`` + 2)th order, which are zero, will be considered. + | Available only when ``LMODEL = ols``. + ===== ============================================================================================= + + :Default: 11 + :Type: Integer + :Description: See :ref:`this page` for the numerical formulae. + +```` + +.. _alm_rotaxis: + + +* ROTAXIS-tag : Rotation axis used to estimate constraints for rotational invariance. This entry is necessary when ``ICONST = 2, 3``. + + :Default: None + :Type: String + :Example: When one wants to consider the rotational invariance around the :math:`x`\ -axis, one should give ``ROTAXIS = x``. If one needs additional constraints for the rotation around the :math:`y`\ -axis, ``ROTAXIS`` should be ``ROTAXIS = xy``. + +```` + +.. _alm_fc2xml: + +* FC2XML-tag : XML file to which the harmonic terms are fixed upon fitting + + :Default: None + :Type: String + :Description: When ``FC2XML``-tag is given, harmonic force constants are fixed to the values stored in the ``FC2XML`` file. This may be useful for optimizing cubic and higher-order terms without changing the harmonic terms. Please make sure that the number of harmonic terms in the new computational condition is the same as that in the ``FC2XML`` file. + +```` + +.. _alm_fc3xml: + +* FC3XML-tag : XML file to which the cubic terms are fixed upon fitting + + :Default: None + :Type: String + :Description: Same as the ``FC2XML``-tag, but ``FC3XML`` is to fix cubic force constants. + +```` + +.. _alm_sparse: + +* SPARSE-tag = 0 | 1 + + ===== ============================================================== + 0 Use a direct solver (SVD or QRD) to estimate force constants + 1 Use a sparse solver to estimate force constants + ===== ============================================================== + + :Default: 0 + :Type: Integer + :Description: When you want to calculate force constants of a large system and generate training datasets by displacing only a few atoms from equilibrium positions, the resulting sensing matrix becomes large but sparse. For such matrices, a sparse solver is expected to be more efficient than SVD or QRD in terms of both memory usage and computational time. When ``SPARSE = 1`` is set, the code uses a sparse solver implemented in Eigen3 library. You can change the solver type via ``SPARSESOLVER``. Effective when ``LMODEL = ols``. + +```` + +.. _alm_sparsesolver: + +* SPARSESOLVER-tag : Type of the sparse solver to use + + :Default: SimplicialLDLT + :Type: String + :Description: Currently, only the sparse solvers of Eigen3 library can be used. Available options are `SimplicialLDLT`, `SparseQR`, `ConjugateGradient`, `LeastSquaresConjugateGradient`, and `BiCGSTAB`. When an iterative algorithm (conjugate gradient) is selected, a stopping criterion can be specified by the ``CONV_TOL`` and ``MAXITER`` tags. Effective when ``LMODEL = ols`` and ``SPARSE = 1``. + + + .. seealso:: + Eigen documentation page: `Solving Sparse Linear Systems `__ + +```` + +.. _alm_maxiter: + +* MAXITER-tag : Number of maximum iterations in iterative algorithms + + :Default: 10,000 + :Type: Integer + :Description: Effective when an iterative solver is selected via ``SPARSESOLVER`` (when ``LMODEL = ols``) or when ``LMODEL = enet``. + +```` + +.. _alm_conv_tol: + +* CONV_TOL-tag : Convergence criterion of iterative algorithms + + :Default: 1.0e-8 + :Type: Double + :Description: When ``LMODEL = ols`` and an iterative solver is selected via ``SPARSESOLVER``, ``CONV_TOL`` value is passed to the Eigen3 function via `setTolerance()`. + When ``LMODEL = enet``, the coordinate descent iteration stops at :math:`i`\ th iteration if :math:`\sqrt{\frac{1}{N}|\boldsymbol{\Phi}_{i} - \boldsymbol{\Phi}_{i-1}|_{2}^{2}} <` ``CONV_TOL`` is satisfied, where :math:`N` is the length of the vector :math:`\boldsymbol{\Phi}`. + + + .. seealso:: + Eigen documentation page: `IterativeSolverBase `__ + +```` + +.. _alm_l1_ratio: + +* L1_RATIO-tag : The ratio of the L1 regularization term + + :Default: 1.0 (LASSO) + :Type: Double + :Description: The ``L1_RATIO`` changes the regularization term as ``L1_ALPHA`` :math:`\times` [``L1_RATIO`` :math:`|\boldsymbol{\Phi}|_{1}` + :math:`\frac{1}{2}` (1-``L1_RATIO``) :math:`|\boldsymbol{\Phi}|_{2}^{2}`]. Therefore, ``L1_RATIO = 1`` corresponds to LASSO. ``L1_RATIO`` must be ``0 < L1_ratio <= 1``. Effective when ``LMODEL = enet``. See also :ref:`here `. + +```` + +.. _alm_l1_alpha: + +* L1_ALPHA-tag : The coefficient of the L1 regularization term + + :Default: 0.0 + :Type: Double + :Description: This tag is used only when ``LMODEL = enet`` and ``CV = 0``. See also :ref:`here `. + +```` + +.. _alm_cv: + +* CV-tag : Cross-validation mode for elastic net + + ===== =================================================================================================================== + 0 | Cross-validation mode is off. + | The elastic net optimization is solved with the given ``L1_ALPHA`` value. + | The force constants are written to ``PREFIX``.fcs and ``PREFIX``.xml. + + >= 2 | ``CV``-fold cross-validation is performed *automatically*. + | ``NDATA`` training datasets are divided into ``CV`` subsets, and ``CV`` different combinations of + | training-validation datasets are created internally. For each combination, the elastic net + | optimization is solved with the various ``L1_ALPHA`` values defined by the ``CV_MINALPHA``, + | ``CV_MAXALPHA``, and ``CV_NALPHA`` tags. The result of each cross-validation is stored in + | ``PREFIX``.enet_cvset[1, ..., ``CV``], and their average and deviation are stored in ``PREFIX``.cvscore. + + -1 | The cross-validation is performed *manually*. + | The Taylor expansion potential is trained by using the training datasets in ``DFSET``, and + | the validation score is calculated by using the data in ``DFSET_CV`` for various ``L1_ALPHA`` values + | defined the ``CV_MINALPHA``, ``CV_MAXALPHA``, and ``CV_NALPHA`` tags. + | After the calculation, the fitting and validation errors are stored in ``PREFIX``.enet_cv. + | This option may be convenient for a large-scale problem since multiple optimization tasks with + | different training-validation datasets can be done in parallel. + ===== =================================================================================================================== + + :Default: 0 + :Type: Integer + :Description: This tag is used only when ``LMODEL = enet``. + + +```` + +.. _alm_dfset_cv: + +* DFSET_CV-tag : File name containing displacement-force datasets used for manual cross-validation + + :Default: ``DFSET_CV = DFSET`` + :Type: String + :Description: This tag is used only when ``LMODEL = enet`` and ``CV = -1``. + +```` + +.. _alm_ndata_cv: + +* NDATA_CV-tag : Number of displacement-force validation datasets + + :Default: None + :Type: Integer + :Description: This tag is used only when ``LMODEL = enet`` and ``CV = -1``. + +```` + +.. _alm_nstart_cv: + +* NSTART_CV, NEND_CV-tags : Specifies the range of data to be used for validation + + :Default: ``NSTART_CV = 1``, ``NEND_CV = NDATA_CV`` + :Type: Integer + :Example: This tag is used only when ``LMODEL = enet`` and ``CV = -1``. + +```` + + +.. _alm_cv_minalpha: + +* CV_MINALPHA, CV_MAXALPHA, CV_NALPHA-tags : Options to specify the ``L1_ALPHA`` values used in cross-validation + + :Default: ``CV_MINALPHA = 1.0e-4``, ``CV_MAXALPHA = 1.0``, ``CV_NALPHA = 1`` + :Type: Double, Double, Integer + :Description: ``CV_NALPHA`` values of ``L1_ALPHA`` are generated from ``CV_MINALPHA`` to ``CV_MAXALPHA`` in logarithmic scale. A recommended value of ``CV_MAXALPHA`` is printed out to the log file. This tag is used only when ``LMODEL = enet`` and the cross-validation mode is on (``CV > 0`` or ``CV = -1``). + +```` + +.. _alm_standardize: + +* STANDARDIZE-tag = 0 | 1 + + ===== ============================================================================================= + 0 Do not standardize the sensing matrix + 1 | Each column of the sensing matrix is standardized in such a way that its mean value + | becomes 0 and standard deviation becomes 1. + ===== ============================================================================================= + + :Default: 1 + :Type: Integer + :Description: This option influences the optimal ``L1_ALPHA`` value. So, if you change the ``STANDARDIZE`` option, you have to rerun the cross-validation. Effective only when ``LMODEL = enet``. + + +```` + +.. _alm_enet_dnorm: + +* ENET_DNORM-tag : Normalization factor of atomic displacements + + :Default: 1.0 + :Type: Double + :Description: The normalization factor of atomic displacement :math:`u_{0}` in units of Bohr. When :math:`u_{0} (\neq 1)` is given, the displacement data are scaled as :math:`u_{i} \rightarrow u_{i}/u_{0}` before constructing the sensing matrix. This option influences the optimal ``L1_ALPHA`` value. So, if you change the ``ENET_DNORM`` value, you will have to rerun the cross-validation. Effective only when ``LMODEL = enet`` and ``STANDARDIZE = 0``. + +```` + + + +.. _alm_solution_path: + +* SOLUTION_PATH-tag = 0 | 1 + + ===== ============================================================================================= + 0 Do not save the solution path. + 1 Save the solution path of each cross-validation combination in ``PREFIX``.solution_path. + ===== ============================================================================================= + + :Default: 0 + :Type: Integer + :Description: Effective when ``LMODEL = enet`` and the cross-validation mode is on. + +```` + +.. _alm_debias_ols: + +* DEBIAS_OLS-tag = 0 | 1 + + ===== ============================================================================================= + 0 Save the solution of the elastic net problem to ``PREFIX``.fcs and ``PREFIX``.xml. + 1 | After the solution of the elastic net optimization problem is obtained, + | only non-zero coefficients are collected, and the ordinary least-squares fitting is + | solved again with the non-zero coefficients before saving the results to ``PREFIX``.fcs and + | ``PREFIX``.xml. This might be useful to reduce the bias of the elastic net solution. + ===== ============================================================================================= + + :Default: 0 + :Type: Integer + :Description: Effective when ``LMODEL = enet`` and ``CV = 0``. + + +```` + + +How to make a DFSET file +~~~~~~~~~~~~~~~~~~~~~~~~ + +.. _label_format_DFSET: + +Format of ``DFSET`` (recommended as of ver. 1.1.0) +++++++++++++++++++++++++++++++++++++++++++++++++++ + +The displacement-force data sets obtained by first-principles (or classical force-field) calculations +have to be saved to a file, say *DFSET*. Then, the force constants are estimated by setting ``DFSET =`` *DFSET* and with ``MODE = optimize``. + +The *DFSET* file must contain the atomic displacements and corresponding forces in Cartesian coordinate for at least ``NDATA`` structures (displacement patterns) +in the following format: + +.. math:: + :nowrap: + + # Structure number 1 (this is just a comment line) + \begin{eqnarray*} + u_{x}(1) & u_{y}(1) & u_{z}(1) & f_{x}(1) & f_{y}(1) & f_{z}(1) \\ + u_{x}(2) & u_{y}(2) & u_{z}(2) & f_{x}(2) & f_{y}(2) & f_{z}(2) \\ + & \vdots & & & \vdots & \\ + u_{x}(\mathrm{NAT}) & u_{y}(\mathrm{NAT}) & u_{z}(\mathrm{NAT}) & f_{x}(\mathrm{NAT}) & f_{y}(\mathrm{NAT}) & f_{z}(\mathrm{NAT}) + \end{eqnarray*} + # Structure number 2 + \begin{eqnarray*} + u_{x}(1) & u_{y}(1) & u_{z}(1) & f_{x}(1) & f_{y}(1) & f_{z}(1) \\ + & \vdots & & & \vdots & + \end{eqnarray*} + +Here, ``NAT`` is the number of atoms in the supercell. +The unit of displacements and forces must be **Bohr** and **Ryd/Bohr**, respectively. + +.. _label_format_DFILE: + +Format of ``DFILE`` and ``FFILE`` (deprecated) +++++++++++++++++++++++++++++++++++++++++++++++ + +.. deprecated:: 1.1.0 + Use ``DFSET`` instead. + +The displacement-force data sets obtained by first-principles (or classical force-field) calculations +have to be saved to ``DFILE`` and ``FFILE`` to estimate IFCs with ``MODE = fitting``. +In ``DFILE``, please explicitly specify the atomic displacements :math:`u_{\alpha}(\ell\kappa)` **in units of Bohr** as follows: + +.. math:: + :nowrap: + + \begin{eqnarray*} + u_{x}(1) & u_{y}(1) & u_{z}(1) \\ + u_{x}(2) & u_{y}(2) & u_{z}(2) \\ + & \vdots & \\ + u_{x}(\mathrm{NAT}) & u_{y}(\mathrm{NAT}) & u_{z}(\mathrm{NAT}) + \end{eqnarray*} + +When there are ``NAT`` atoms in the supercell and ``NDATA`` data sets, +there should be ``NAT`` :math:`\times` ``NDATA`` lines in the ``DFILE`` without blank lines. +In ``FFILE``, please specify the corresponding atomic forces **in units of Ryd/Bohr**. diff --git a/docs/source/almdir/outputalm.rst b/docs/source/almdir/outputalm.rst new file mode 100644 index 00000000..9a8601d0 --- /dev/null +++ b/docs/source/almdir/outputalm.rst @@ -0,0 +1,26 @@ +ALM: Output files +----------------- + +* ``PREFIX``.pattern_HARMONIC, ``PREFIX``.pattern_ANHARM? + + In these files, displacement patterns are printed in units of + :math:`\boldsymbol{e}_{x,y,z}`. + These files are created when ``MODE = suggest``. + Patterns for anharmonic force constants are printed only when ``NORDER > 1``. + +* ``PREFIX``.fcs + + Harmonic and anharmonic force constants in Rydberg atomic units. + In the first section, only symmetry-reduced force constants are printed. + All symmetry-related force constants are shown in the following section + with the symmetry prefactor (:math:`\pm 1`). + Created when ``MODE = fitting``. + +* ``PREFIX``.xml + + An XML file containing the necessary information for performing + phonon calculations. + The files can be read by *anphon* using the ``FCSXML``-tag. + Created when ``MODE = fitting``. + + diff --git a/docs/source/anphon_root.rst b/docs/source/anphon_root.rst new file mode 100644 index 00000000..a88cf962 --- /dev/null +++ b/docs/source/anphon_root.rst @@ -0,0 +1,9 @@ +ANPHON: Anharmonic phonon calculator +==================================== + +.. toctree:: + :maxdepth: 2 + + anphondir/inputanphon + anphondir/outputanphon + anphondir/formalism_anphon \ No newline at end of file diff --git a/docs/source/formalism/formalism_anphon.rst b/docs/source/anphondir/formalism_anphon.rst similarity index 95% rename from docs/source/formalism/formalism_anphon.rst rename to docs/source/anphondir/formalism_anphon.rst index 763eba10..decd8240 100644 --- a/docs/source/formalism/formalism_anphon.rst +++ b/docs/source/anphondir/formalism_anphon.rst @@ -1,5 +1,5 @@ -Formalism for program anphon -============================ +ANPHON: Theoretical background +============================== .. |umulaut_u| unicode:: U+00FC .. |umulaut_o| unicode:: U+00F6 @@ -103,8 +103,21 @@ given as follows: F &= \frac{1}{N_{q}}\sum_{\boldsymbol{q},j}\left[ \frac{\hbar\omega_{\boldsymbol{q}j}}{2} + kT\log{\left( 1 - e^{-\hbar\omega_{\boldsymbol{q}j}/kT}\right)} \right]. \end{align*} -Here, :math:`k` is the Boltzmann constant. These quantities will be saved in the ``PREFIX``.thermo file. +Here, :math:`k` is the Boltzmann constant. These quantities are saved in the ``PREFIX``.thermo file. +When the self-consistent phonon mode (``MODE = SCPH``) is selected, the anharmonic free-energy +defined by the following equation will be calculated and saved in the ``PREFIX``.scph_thermo file: + +.. math:: + :nowrap: + + \begin{align*} + F^{\mathrm{SCP}} &= \frac{1}{N_{q}}\sum_{\boldsymbol{q},j}\left[ \frac{\hbar\Omega_{\boldsymbol{q}j}}{2} + kT\log{\left( 1 - e^{-\hbar\Omega_{\boldsymbol{q}j}/kT}\right)} \right] \\ + & - \frac{1}{N_{q}}\sum_{\boldsymbol{q},j}\left[ \Omega_{\boldsymbol{q}j}^{2} - (C_{\boldsymbol{q}}^{\dagger}\Lambda_{\boldsymbol{q}}^{(\mathrm{HA})}C_{\boldsymbol{q}})_{jj} \right] + \times \frac{\hbar [1 + 2n_{\boldsymbol{q}j} ]}{2\Omega_{\boldsymbol{q}j}}. + \end{align*} + +Details of the derivation of the above expression can be found in Ref. [7]_. Mean square displacement @@ -324,7 +337,7 @@ The phonon lifetime is estimated using the Matthiessen's rule as \tau_{\boldsymbol{q}j}^{-1}(T) = 2 (\Gamma_{\boldsymbol{q}j}^{\mathrm{anh}}(T) + \Gamma_{\boldsymbol{q}j}^{\mathrm{iso}}). -The lattice thermal conductivity will be written to the file ``PREFIX``.kl. +The lattice thermal conductivity is saved in the file ``PREFIX``.kl. The spectra of the lattice thermal conductivity :math:`\kappa_{\mathrm{ph}}^{\mu\mu}(\omega)` can also be calculated by setting ``KAPPA_SPEC = 1`` in the ``&analysis`` field. :math:`\kappa_{\mathrm{ph}}^{\mu\mu}(\omega)` is defined as @@ -357,7 +370,7 @@ To calculate this, please use the ``--calc cumulative2`` flag and specify the di Delta function -------------- -In order to compute the phonon DOSs and the imaginary part of phonon self-energies, +To compute the phonon DOSs and the imaginary part of phonon self-energies, it is necessary to evaluate the Brillouin-zone integration containing Dirac's delta function. For that purpose, we provide 3 options through the ``ISMEAR``-tag. @@ -423,7 +436,7 @@ can be finer than the :math:`\boldsymbol{q}` grid. After the SCPH iteration conv &\Delta D(\boldsymbol{q}) = D_{\mathrm{SCPH}}(\boldsymbol{q}) - D_{\mathrm{Harmonic}}(\boldsymbol{q}), \\ &D_{\mathrm{SCPH}}(\boldsymbol{q}) = W_{\boldsymbol{q}}C_{\boldsymbol{q}}^{[n]}\Lambda_{\boldsymbol{q}}^{[n]}C_{\boldsymbol{q}}^{[n]\dagger}W_{\boldsymbol{q}}^{\dagger}. -:math:`\Delta D(\boldsymbol{r}(\ell))` is saved in ``PREFIX.scph_fc2_correction``. +:math:`\Delta D(\boldsymbol{r}(\ell))` is saved in ``PREFIX.scph_dfc2``. The most computationally expensive part is the calculation of matrix elements of :math:`F_{\boldsymbol{q}\boldsymbol{q}_{1},ijk\ell}`. When ``SELF_OFFDIAG = 0`` (default), the code only computes the elements of :math:`F_{\boldsymbol{q}\boldsymbol{q}_{1},iikk}`. @@ -445,3 +458,5 @@ When ``SELF_OFFDIAG = 1``, the off-diagonal elements are also calculated, and th .. [5] P\. E. Bl\ |umulaut_o|\ chl, O. Jepsen, and O. K. Andersen, Phys. Rev. B **49**, 1450555 (1994). .. [6] T\. Tadano and S. Tsuneyuki, Phys. Rev. B **92**, 054301 (2015). + +.. [7] Y.\ Oba, T. Tadano, R. Akashi, and S. Tsuneyuki, Phys. Rev. Materials **3**, 033601 (2019). diff --git a/docs/source/input/inputanphon.rst b/docs/source/anphondir/inputanphon.rst similarity index 79% rename from docs/source/input/inputanphon.rst rename to docs/source/anphondir/inputanphon.rst index 86258079..95ea7a69 100644 --- a/docs/source/input/inputanphon.rst +++ b/docs/source/anphondir/inputanphon.rst @@ -1,8 +1,8 @@ .. |umulaut_u| unicode:: U+00FC -Making input files for *anphon* -------------------------------- +ANPHON: Input files +------------------- Format of input files ~~~~~~~~~~~~~~~~~~~~~ @@ -17,12 +17,37 @@ The format of the input file is the same as that of *alm* which can be found :re .. _label_inputvar_anphon: -List of input variables -~~~~~~~~~~~~~~~~~~~~~~~ +List of supported input variables +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. csv-table:: + :widths: 20, 20, 20, 20, 20 + + **&general** + :ref:`BCONNECT `, :ref:`BORNINFO `, :ref:`BORNSYM `, :ref:`CLASSICAL `, :ref:`EMIN ` + :ref:`EPSILON `, :ref:`FC2XML `, :ref:`FCSXML `, :ref:`ISMEAR `, :ref:`KD ` + :ref:`MASS `, :ref:`MODE `, :ref:`NA_SIGMA `, :ref:`NKD `, :ref:`NONANALYTIC ` + :ref:`PREFIX `, :ref:`PRINTSYM `, :ref:`RESTART `, :ref:`TMIN `, :ref:`TOLERANCE ` + :ref:`TRISYM ` + **&scph** + :ref:`IALGO `, :ref:`KMESH_INTERPOLATE `, :ref:`KMESH_SCPH `, :ref:`LOWER_TEMP `, :ref:`MAXITER ` + :ref:`MIXALPHA `, :ref:`RESTART_SCPH `, :ref:`SELF_OFFDIAG `, :ref:`TOL_SCPH `, :ref:`WARMSTART ` + **&analysis** + :ref:`ANIME `, :ref:`ANIME_CELLSIZE `, :ref:`GRUNEISEN `, :ref:`ISOFACT ` + :ref:`ISOTOPE `, :ref:`KAPPA_SPEC `, :ref:`PDOS `, :ref:`PRINTEVEC `, :ref:`PRINTMSD ` + :ref:`PRINTPR `, :ref:`PRINTVEL `, :ref:`PRINTXSF `, :ref:`SPS `, :ref:`TDOS ` + + + + +Description of input variables +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "&general"-field ++++++++++++++++ +.. _anphon_prefix: + * **PREFIX**-tag : Job prefix to be used for names of output files :Default: None @@ -30,6 +55,8 @@ List of input variables ```` +.. _anphon_mode: + * **MODE**-tag = phonons | RTA ========= ============================================================== @@ -49,6 +76,8 @@ List of input variables ```` +.. _anphon_nkd: + * **NKD**-tag : Number of atomic species :Default: None @@ -56,6 +85,8 @@ List of input variables ```` +.. _anphon_kd: + * **KD**-tag = Name[1], ... , Name[``NKD``] :Default: None @@ -64,14 +95,18 @@ List of input variables ```` -* **MASS**-tag = mass[1], ... , mass[``NKD``] +.. _anphon_mass: - :Default: None +* MASS-tag = mass[1], ... , mass[``NKD``] + + :Default: Standard atomic weight of elements given by the ``KD``-tag :Type: Array of double :Example: In the case of Bi\ :sub:`2`\ Te\ :sub:`3` with ``NKD = 2``, ``MASS`` should be ``MASS = 208.98 127.60``. ```` +.. _anphon_fcsxml: + * **FCSXML**-tag : XML file containing force constants generated by the program *alm* :Default: None @@ -79,29 +114,17 @@ List of input variables ```` +.. _anphon_fc2xml: + * FC2XML-tag : XML file containing harmonic force constants for different size of supercell :Default: None :Type: String - :Description: When ``FC2XML`` is given, the harmonic force constants in this file will be used for calculating dynamical matrices. It is possible to use different size of supercell for harmonic and anharmonic terms, which are specified by ``FC2XML`` and ``FCSXML`` respectively. + :Description: When ``FC2XML`` is given, the harmonic force constants in this file are used for calculating dynamical matrices. It is possible to use different size of supercell for harmonic and anharmonic terms, which are specified by ``FC2XML`` and ``FCSXML`` respectively. ```` -* NSYM-tag = 0 | 1 | nsym - - ===== ====================================================================== - 0 | The program automatically generates the crystal symmetry - | operations (rotational and translational parts). - | When ``PRINTSYM = 1``, symmetry operations will be saved - | in the file “SYMM_INFO_PRIM”. - 1 | Only the identity operation will be considered. - nsym | "nsym" symmetry operations will be read from "SYMM_INFO_PRIM" file. - ===== ====================================================================== - - :Default: 0 - :Type: Integer - -```` +.. _anphon_tolerance: * TOLERANCE-tag : Tolerance for finding symmetry operations @@ -110,6 +133,8 @@ List of input variables ```` +.. _anphon_printsym: + * PRINTSYM-tag = 0 | 1 === ======================================================= @@ -122,6 +147,8 @@ List of input variables ```` +.. _anphon_nonanalytic: + * NONANALYTIC-tag = 0 | 1 | 2 | 3 === =================================================================================== @@ -140,15 +167,19 @@ List of input variables ```` -* **NA_SIGMA**-tag : Damping factor for the non-analytic term +.. _anphon_na_sigma: + +* NA_SIGMA-tag : Damping factor for the non-analytic term - :Default: None + :Default: 0.0 :Type: Double - :Description: This entry is necessary when ``NONANALYTIC = 1``. The definition of ``NA_SIGMA`` is described in the formalism section. + :Description: Used when ``NONANALYTIC = 1``. The definition of ``NA_SIGMA`` is described in the formalism section. ```` -* **BORNINFO**-tag : File containing the macroscopic dielectric tensor and Born effective charges for the non-analytic correction +.. _anphon_borninfo: + +* BORNINFO-tag : File containing the macroscopic dielectric tensor and Born effective charges for the non-analytic correction :Default: None :Type: String @@ -156,6 +187,8 @@ List of input variables ```` +.. _anphon_bornsym: + * BORNSYM-tag = 0 | 1 === ================================================================= @@ -168,6 +201,8 @@ List of input variables ```` +.. _anphon_tmin: + * TMIN, TMAX, DT-tags : Temperature range and its stride in units of Kelvin :Default: ``TMIN = 0``, ``TMAX = 1000``, ``DT = 10`` @@ -175,6 +210,8 @@ List of input variables ```` +.. _anphon_emin: + * EMIN, EMAX, DELTA_E-tags : Energy range and its stride in units of kayser (cm\ :sup:`-1`) :Default: ``EMIN = 0``, ``EMAX = 1000``, ``DELTA_E = 10`` @@ -182,6 +219,8 @@ List of input variables ```` +.. _anphon_ismear: + * ISMEAR-tag = -1 | 0 | 1 === ======================================================= @@ -196,6 +235,8 @@ List of input variables ```` +.. _anphon_epsilon: + * EPSILON-tag : Smearing width in units of Kayser (cm\ :sup:`-1`) :Default: 10.0 @@ -204,6 +245,8 @@ List of input variables ```` +.. _anphon_bconnect: + * BCONNECT-tag = 0 | 1 | 2 === =================================================================================== @@ -211,7 +254,7 @@ List of input variables 1 | Phonon band is connected by using the similarity of eigenvectors. - 2 | Same as ``BCONNECT=1``. In addition, information of the connectivity is + 2 | Same as ``BCONNECT=1``. In addition, information about the connectivity is | saved as ``PREFIX.connection``. === =================================================================================== @@ -223,6 +266,8 @@ List of input variables ```` +.. _anphon_classical: + * CLASSICAL-tag = 0 | 1 === ======================================================= @@ -232,10 +277,12 @@ List of input variables :Default: 0 :Type: Integer - :Description: When ``CLASSICAL = 1``, all thermodynamic functions including the occupation function, heat capacity, and mean square displacements are calculated using the classical formlae. This option may be useful when comparing the lattice dynamics and molecular dynamics results. + :Description: When ``CLASSICAL = 1``, all thermodynamic functions including the occupation function, heat capacity, and mean square displacements are calculated using the classical formulae. This option may be useful when comparing the lattice dynamics and molecular dynamics results. ```` +.. _anphon_trisym: + * TRISYM-tag : Flag to use symmetry operations to reduce the number of triples of :math:`k` points for self-energy calculations === ======================================================= @@ -255,6 +302,8 @@ List of input variables ```` +.. _anphon_restart: + * RESTART-tag : Flag to restart the calculation when ``MODE = RTA`` === ======================================================= @@ -270,7 +319,9 @@ List of input variables "&scph"-field (Read only when ``MODE = SCPH``) ++++++++++++++++++++++++++++++++++++++++++++++ -* KMESH_INTERPOLATE = k1, k2, k3 +.. _anphon_kmesh_interpolate: + +* KMESH_INTERPOLATE-tag = k1, k2, k3 :Default: None :Type: Array of integers @@ -279,7 +330,9 @@ List of input variables ```` -* KMESH_SCPH = k1, k2, k3 +.. _anphon_kmesh_scph: + +* KMESH_SCPH-tag = k1, k2, k3 :Default: None :Type: Array of integers @@ -288,7 +341,9 @@ List of input variables ```` -* SELF_OFFDIAG = 0 | 1 +.. _anphon_self_offdiag: + +* SELF_OFFDIAG-tag = 0 | 1 === ================================================================================ 0 Neglect the off-diagonal elements of the loop diagram in the SCPH calculation @@ -301,6 +356,8 @@ List of input variables ```` +.. _anphon_tol_scph: + * TOL_SCPH-tag: Stopping criterion of the SCPH iteration :Default: 1.0e-10 @@ -309,6 +366,8 @@ List of input variables ```` +.. _anphon_mixalpha: + * MIXALPHA-tag: Mixing parameter used in the SCPH iteration :Default: 0.1 @@ -316,6 +375,8 @@ List of input variables ```` +.. _anphon_maxiter: + * MAXITER-tag: Maximum number of the SCPH iteration :Default: 1000 @@ -323,7 +384,9 @@ List of input variables ```` -* LOWER_TEMP = 0 | 1 +.. _anphon_lower_temp: + +* LOWER_TEMP-tag = 0 | 1 === =============================================================================== 0 The SCPH iteration start from ``TMIN`` to ``TMAX``. (Raise the temperature) @@ -335,7 +398,9 @@ List of input variables ```` -* WARMSTART = 0 | 1 +.. _anphon_warmstart: + +* WARMSTART-tag = 0 | 1 === =============================================================================== 0 SCPH iteration is initialized by harmonic frequencies and eigenvectors @@ -348,7 +413,9 @@ List of input variables ```` -* IALGO = 0 | 1 +.. _anphon_ialgo: + +* IALGO-tag = 0 | 1 === =============================================================================== 0 MPI parallelization for the :math:`k` point @@ -361,7 +428,9 @@ List of input variables ```` -* RESTART_SCPH = 0 | 1 +.. _anphon_restart_scph: + +* RESTART_SCPH-tag = 0 | 1 === ============================================================== 0 Perform a SCPH calculation from scratch @@ -447,6 +516,8 @@ The first entry **KPMODE** specifies the types of calculation which is followed "&analysis"-field +++++++++++++++++ +.. _anphon_gruneisen: + * GRUNEISEN-tag = 0 | 1 === =================================================================== @@ -465,6 +536,8 @@ The first entry **KPMODE** specifies the types of calculation which is followed ```` +.. _anphon_printevec: + * PRINTEVEC-tag = 0 | 1 === =================================================================== @@ -477,6 +550,8 @@ The first entry **KPMODE** specifies the types of calculation which is followed ```` +.. _anphon_printxsf: + * PRINTXSF-tag = 0 | 1 === =================================================================== @@ -491,6 +566,8 @@ The first entry **KPMODE** specifies the types of calculation which is followed ```` +.. _anphon_printvel: + * PRINTVEL-tag = 0 | 1 === =================================================================== @@ -504,6 +581,8 @@ The first entry **KPMODE** specifies the types of calculation which is followed ```` +.. _anphon_printmsd: + * PRINTMSD-tag = 0 | 1 === =================================================================== @@ -517,6 +596,8 @@ The first entry **KPMODE** specifies the types of calculation which is followed ```` +.. _anphon_pdos: + * PDOS-tag = 0 | 1 === =================================================================== @@ -530,6 +611,8 @@ The first entry **KPMODE** specifies the types of calculation which is followed ```` +.. _anphon_tdos: + * TDOS-tag = 0 | 1 === =================================================================== @@ -547,12 +630,14 @@ The first entry **KPMODE** specifies the types of calculation which is followed ```` +.. _anphon_sps: + * SPS-tag = 0 | 1 | 2 === ==================================================================================== 0 Do not compute scattering phase space - 1 Total and mode-decomposed scattering phase space involving three-phonon processes - will be stored in ``PREFIX``.sps + 1 | Total and mode-decomposed scattering phase space involving + | the three-phonon processes will be stored in ``PREFIX``.sps 2 Three-phonon scattering phase space with the Bose factor will be stored in ``PREFIX``.sps_Bose === ==================================================================================== @@ -564,12 +649,14 @@ The first entry **KPMODE** specifies the types of calculation which is followed ```` +.. _anphon_printpr: + * PRINTPR-tag = 0 | 1 === ==================================================================================== 0 Do not compute the (atomic) participation ratio - 1 Compute participation ratio and atomic participation ratio, which will be - stored in ``PREFIX``.pr and ``PREFIX``.apr respectively. + 1 | Compute participation ratio and atomic participation ratio, which will be + | stored in ``PREFIX``.pr and ``PREFIX``.apr respectively. === ==================================================================================== :Default: 0 @@ -579,6 +666,8 @@ The first entry **KPMODE** specifies the types of calculation which is followed ```` +.. _anphon_kappa_spec: + * KAPPA_SPEC-tag = 0 | 1 === ==================================================================================== @@ -594,13 +683,15 @@ The first entry **KPMODE** specifies the types of calculation which is followed ```` +.. _anphon_isotope: + * ISOTOPE-tag = 0 | 1 === ========================================================================= 0 Do not consider phonon-isotope scatterings 1 Consider phonon-isotope scatterings - 2 Consider phonon-isotope scatterings as in ``ISOTOPE = 1`` and - the corresponding selfenergy will be stored in ``PREFIX``.gamma_isotope + 2 | Consider phonon-isotope scatterings as in ``ISOTOPE = 1`` and + | the calculated selfenergy is stored in ``PREFIX``.gamma_isotope === ========================================================================= :Default: 0 @@ -609,9 +700,11 @@ The first entry **KPMODE** specifies the types of calculation which is followed ```` +.. _anphon_isofact: + * ISOFACT-tag = isofact[1], ... , isofact[``NKD``] - :Default: 0 + :Default: Automatically calculated from the ``KD`` tag :Type: Array of doubles :Description: Isotope factor is a dimensionless value defined by :math:`\sum_{i} f_{i} (1 - m_{i}/\bar{m})^{2}`. Here, :math:`f_{i}` is the fraction of the :math:`i`\ th isotope of an element having mass :math:`m_{i}`, @@ -621,6 +714,25 @@ The first entry **KPMODE** specifies the types of calculation which is followed ```` +.. .. _anphon_fe_bubble: + +.. * FE_BUBBLE-tag = 0 | 1 + +.. === ==================================================================================== +.. 0 Do not compute the vibrational free-energy associated with the bubble diagram +.. 1 | Compute the vibrational free-energy associated with the bubble diagram and +.. | save it in ``PREFIX``.thermo (when ``MODE = phonons``) or ``PREFIX``.scph_thermo (when ``MODE = SCPH``). +.. === ==================================================================================== + +.. :Default: 0 +.. :Type: Integer +.. :Description: This tag is used when *KPMODE* = 2. + + +.. ```` + +.. _anphon_anime: + * ANIME-tag = k1, k2, k3 :Default: None @@ -633,6 +745,8 @@ The first entry **KPMODE** specifies the types of calculation which is followed ```` +.. _anphon_anime_cellsize: + * ANIME_CELLSIZE-tag = L1, L2, L3 :Default: None @@ -642,6 +756,8 @@ The first entry **KPMODE** specifies the types of calculation which is followed ```` +.. _anphon_anime_format: + * ANIME_FORMAT = xsf | xyz :Default: xyz diff --git a/docs/source/output.rst b/docs/source/anphondir/outputanphon.rst similarity index 78% rename from docs/source/output.rst rename to docs/source/anphondir/outputanphon.rst index faaa9a8d..ea2e4d06 100644 --- a/docs/source/output.rst +++ b/docs/source/anphondir/outputanphon.rst @@ -1,37 +1,8 @@ -List of output files +ANPHON: Output files -------------------- .. _reference_output: - -Output files of alm -~~~~~~~~~~~~~~~~~~~ - -* ``PREFIX``.pattern_HARMONIC, ``PREFIX``.pattern_ANHARM? - - In these files, displacement patterns are printed in units of :math:`\boldsymbol{e}_{x,y,z}`. - These files are created when ``MODE = suggest``. - Patterns for anharmonic force constants are printed only when ``NORDER > 1``. - -* ``PREFIX``.fcs - - Harmonic and anharmonic force constants in Rydberg atomic units. - In the first section, only symmetry-reduced force constants are printed. - All symmetry-related force constants are shown in the following section with the symmetry prefactor (:math:`\pm 1`). - Created when ``MODE = fitting``. - -* ``PREFIX``.xml - - A XML file containing necessary information for performing phonon calculations. - The files can be read by *anphon* using the ``FCSXML``-tag. - Created when ``MODE = fitting``. - - -```` - -Output files of anphon -~~~~~~~~~~~~~~~~~~~~~~ - .. |umulaut_u| unicode:: U+00FC @@ -54,6 +25,8 @@ Output files of anphon Constant volume heat capacity, vibrational entropy, internal energy, and vibrational free energy. Created when ``MODE = phonons`` with **KPMODE** = 2. + When ``FE_BUBBLE = 1`` is set in the **&analysis** field, an additional bubble correction term + to the vibrational free energy is also calculated. * ``PREFIX``.msd @@ -130,7 +103,7 @@ Output files of anphon * ``PREFIX``.kl_spec - Spectra of lattice thermal conductivity. Only diagonal components will be saved. + Spectra of lattice thermal conductivity. Only diagonal components are saved. Created when ``MODE = RTA`` and ``KAPPA_SPEC = 1``. * ``PREFIX``.gamma_isotope @@ -147,9 +120,26 @@ Output files of anphon * ``PREFIX``.scph_bands - Anharmonic phonon dispersion curves. The format is same as the ``PREFIX``.bands. + Anharmonic phonon dispersion curves. + +* ``PREFIX``.scph_dos + + Anharmonic phonon DOS. Created when ``MODE = SCPH`` and ``DOS = 1`` with **KPMODE** = 2. + + +* ``PREFIX``.scph_thermo + + Constant volume heat capacity, vibrational entropy, and vibrational free energy calculated based on the self-consistent phonon calculation. + Created when ``MODE = SCPH`` with **KPMODE** = 2. + +.. When ``FE_BUBBLE = 1`` is set in the **&analysis** field, an additional bubble correction term +.. to the vibrational free energy is also calculated. + +* ``PREFIX``.scph_msd + + Mean square displacement calculated within the SCPH theory. Created when ``MODE = SCPH`` and ``PRINTMSD = 1`` with **KPMODE** = 2. -* ``PREFIX``.scph_fc2_correction +* ``PREFIX``.scph_dfc2 This file contains :math:`\Delta D(\boldsymbol{q}) = D_{\mathrm{SCPH}}(\boldsymbol{q}) - D_{\mathrm{Harmonic}}(\boldsymbol{q})`. For the definition, see the :ref:`formalism of the SCPH calculation `. diff --git a/docs/source/conf.py b/docs/source/conf.py index 67eb28ed..ea1ded15 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -60,9 +60,9 @@ # built documents. # # The short X.Y version. -version = '1.0' +version = '1.1' # The full version, including alpha/beta/rc tags. -release = '1.0.2' +release = '1.1.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. @@ -107,7 +107,7 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -html_theme = 'default' +html_theme = 'sphinx_rtd_theme' # 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 @@ -191,16 +191,16 @@ # -- Options for LaTeX output --------------------------------------------- latex_elements = { -# The paper size ('letterpaper' or 'a4paper'). -#'papersize': 'letterpaper', + # The paper size ('letterpaper' or 'a4paper'). + # 'papersize': 'letterpaper', -# The font size ('10pt', '11pt' or '12pt'). -#'pointsize': '10pt', -#'inputenc': '', -# + # The font size ('10pt', '11pt' or '12pt'). + # 'pointsize': '10pt', + # 'inputenc': '', + # -# Additional stuff for the LaTeX preamble. -'preamble': ''' + # Additional stuff for the LaTeX preamble. + 'preamble': ''' \usepackage{bm} ''', @@ -210,8 +210,8 @@ # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - ('index', 'ALAMODE.tex', u'ALAMODE Documentation', - u'Terumasa Tadano', 'manual'), + ('index', 'ALAMODE.tex', u'ALAMODE Documentation', + u'Terumasa Tadano', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of @@ -254,9 +254,9 @@ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - ('index', 'ALAMODE', u'ALAMODE Documentation', - u'Terumasa Tadano', 'ALAMODE', 'One line description of project.', - 'Miscellaneous'), + ('index', 'ALAMODE', u'ALAMODE Documentation', + u'Terumasa Tadano', 'ALAMODE', 'One line description of project.', + 'Miscellaneous'), ] # Documents to append as an appendix to all manuals. diff --git a/docs/source/faq.rst b/docs/source/faq.rst new file mode 100644 index 00000000..e1461092 --- /dev/null +++ b/docs/source/faq.rst @@ -0,0 +1,4 @@ +.. _label_faq: + +FAQ +=== \ No newline at end of file diff --git a/docs/source/index.rst b/docs/source/index.rst index 7cde891b..b00c4716 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -11,7 +11,7 @@ Users Guide ----------- .. toctree:: - :maxdepth: 2 + :maxdepth: 3 :numbered: 2 :glob: @@ -19,13 +19,10 @@ Users Guide download install quickstart + alm_root + anphon_root tutorial - input/inputalm - input/inputanphon - output - formalism/formalism_alm.rst - formalism/formalism_anphon.rst - + faq Indices and tables diff --git a/docs/source/input/inputalm.rst b/docs/source/input/inputalm.rst deleted file mode 100644 index 3d759eeb..00000000 --- a/docs/source/input/inputalm.rst +++ /dev/null @@ -1,374 +0,0 @@ - -Making input files for *alm* ----------------------------- - -.. _reference_input_alm: - -Format of input files -~~~~~~~~~~~~~~~~~~~~~ - -Each input file should consist of entry fields. -Available entry fields are - -**&general**, **&interaction**, **&cutoff**, **&cell**, **&position**, and **&fitting**. - - -Each entry field starts from the key label **&field** and ends at the terminate character "/". (This is equivalent to Fortran namelist.) - -For example, &general entry field of program *alm* should be given like - -:: - - &general - # Comment line - PREFIX = prefix - MODE = fitting - / - -Multiple entries can be put in a single line. Also, characters put on the right of sharp (“#”) will be neglected. Therefore, the above example is equivalent to the following:: - - &general - PREFIX = prefix; MODE = fitting # Comment line - / - -Each variable should be written inside the appropriate entry field. - - -.. _label_inputvar_alm: - -List of input variables -~~~~~~~~~~~~~~~~~~~~~~~ - - -"&general"-field -++++++++++++++++ - - -* **PREFIX**-tag : Job prefix to be used for names of output files - - :Default: None - :Type: String - -```` - -* **MODE**-tag = fitting | suggest - - ========= =========================================================== - fitting | Perform fittings to estimate harmonic and anharmonic IFCs. - | This mode requires appropriate DFILE and FFILE. - - suggest | This mode suggests the displacement patterns necessary - | to estimate harmonic and anharmonic IFCS. - ========= =========================================================== - - :Default: None - :Type: String - -```` - -* **NAT**-tag : Number of atoms in the supercell - - :Default: None - :Type: Integer - -```` - -* **NKD**-tag : Number of atomic species - - :Default: None - :Type: Integer - -```` - -* **KD**-tag = Name[1], ... , Name[``NKD``] - - :Default: None - :Type: Array of strings - :Example: In the case of GaAs with ``NKD = 2``, it should be ``KD = Ga As``. - -```` - -* NSYM-tag = 0 | 1 | nsym - - ===== ========================================================== - 0 | The program automatically generates the crystal symmetry - | operations (rotational and translational parts). - | When ``PRINTSYM = 1``, symmetry operations will be saved - | in the file “SYMM_INFO”. - - 1 | Only the identity operation will be considered. - nsym | "nsym" symmetry operations will be read from "SYMM_INFO" - | file. - ===== ========================================================== - - :Default: 0 - :Type: Integer - -```` - -* TOLERANCE-tag : Tolerance for finding symmetry operations - - :Default: 1.0e-6 - :Type: Double - -```` - -* PRINTSYM-tag = 0 | 1 - - === ==================================================== - 0 Symmetry operations won’t be saved in “SYMM_INFO” - 1 Symmetry operations will be saved in “SYMM_INFO” - === ==================================================== - - :Default: 0 - :type: Integer - -```` - -* PERIODIC-tag = PERIODIC[1], PERIODIC[2], PERIODIC[3] - - ===== ==================================================== - 0 | Do not consider periodic boundary conditions when - | searching for interacting atoms. - - 1 | Consider periodic boundary conditions when - | searching for interacting atoms. - ===== ==================================================== - - :Default: 1 1 1 - :type: Array of integers - :Description: This tag is useful for generating interacting atoms in low dimensional systems. When ``PERIODIC[i]`` is zero, periodic boundary condition is turned off along the direction of the lattice vector :math:`\boldsymbol{a}_{i}`. - -```` - -* HESSIAN-tag = 0 | 1 - - ===== ===================================================================== - 0 Do not save the Hessian matrix - 1 Save the entire Hessian matrix of the supercell as PREFIX.hessian. - ===== ===================================================================== - - :Default: 0 - :type: Integer - -```` - -"&interaction"-field -++++++++++++++++++++ - - -* **NORDER**-tag : The order of force constants to be calculated. Anharmonic terms up to :math:`(m+1)`\ th order will be considered with ``NORDER`` = :math:`m`. - - :Default: None - :Type: Integer - :Example: ``NORDER`` should be 1 for harmonic calculations, and 2 to include cubic terms. - -```` - -* NBODY-tag : Entry for excluding multiple-body interactions from anharmonic force constants - - :Default: ``NBODY`` = [2, 3, 4, ..., ``NORDER`` + 1] - :Type: Array of integers - :Example: If one wants to exclude three-body interactions from cubic force constants, one should explicitly give ``NBODY = 2 2``. - -```` - -"&cutoff"-field -+++++++++++++++ - -In this entry field, one needs to specify cutoff radii of interaction for each order in units of Bohr. -In the current implementation, cutoff radii should be defined for every possible pair of atomic elements. -For example, the cutoff entry for a harmonic calculation (``NORDER = 1``) of Si (``NKD = 1``) should be like -:: - - &cutoff - Si-Si 10.0 - / - -This means that the cutoff radii of 10 :math:`a_{0}` will be used for harmonic Si-Si terms. -Please note that the first column should be two character strings, which are contained in the ``KD``-tag, -connected by a hyphen (’-’). - -When one wants to consider cubic terms (``NORDER = 2``), please specify the cutoff radius for cubic terms in the third column as the following:: - - - &cutoff - Si-Si 10.0 5.6 # Pair r_{2} r_{3} - / - -Instead of giving specific cutoff radii, one can write "None" as follows:: - - &cutoff - Si-Si None 5.6 - / - -which means that all possible harmonic terms between Si-Si atoms will be included. - -.. caution:: - - Setting 'None' for anharmonic terms can greatly increase the number of parameters and thereby increase the computational cost. - -When there are more than two atomic elements, please specify the cutoff radii between every possible pair of atomic elements. In the case of MgO (``NKD = 2``), the cutoff entry should be like -:: - - &cutoff - Mg-Mg 8.0 - O-O 8.0 - Mg-O 10.0 - / - -which can equivalently be written by using the wild card (’*’) as -:: - - &cutoff - *-* 8.0 - Mg-O 10.0 # Overwrite the cutoff radius for Mg-O harmonic interactions - / - -.. important:: - - Cutoff radii specified by an earlier entry will be overwritten by a new entry that comes later. - -Once the cutoff radii are properly given, harmonic force constants -:math:`\Phi_{i,j}^{\mu,\nu}` satisfying :math:`r_{ij} \le r_{c}^{\mathrm{KD}[i]-\mathrm{KD}[j]}` will be searched. - -In the case of cubic terms, force constants :math:`\Phi_{ijk}^{\mu\nu\lambda}` satisfying :math:`r_{ij} \le r_{c}^{\mathrm{KD}[i]-\mathrm{KD}[j]}`, :math:`r_{ik} \le r_{c}^{\mathrm{KD}[i]-\mathrm{KD}[k]}`, and -:math:`r_{jk} \le r_{c}^{\mathrm{KD}[j]-\mathrm{KD}[k]}` will be searched and determined by fitting. - -```` - -"&cell"-field -+++++++++++++ - -Please give the cell parameters in this entry in units of Bohr as the following:: - - &cell - a - a11 a12 a13 - a21 a22 a23 - a31 a32 a33 - / - -The cell parameters are then given by :math:`\vec{a}_{1} = a \times (a_{11}, a_{12}, a_{13})`, -:math:`\vec{a}_{2} = a \times (a_{21}, a_{22}, a_{23})`, and :math:`\vec{a}_{3} = a \times (a_{31}, a_{32}, a_{33})`. - -```` - -"&position"-field -+++++++++++++++++ - -In this field, one needs to specify the atomic element and fractional coordinate of atoms in the supercell. -Each line should be -:: - - ikd xf[1] xf[2] xf[3] - -where `ikd` is an integer specifying the atomic element (`ikd` = 1, ..., ``NKD``) and `xf[i]` is the -fractional coordinate of an atom. There should be ``NAT`` such lines in the &position entry field. - - -```` - -"&fitting"-field -+++++++++++++++++ - -This field is necessary when ``MODE = fitting``. - -* **DFILE**-tag : File name containing atomic displacements in Cartesian coordinate - - :Default: None - :Type: String - :Description: The format of ``DFILE`` can be found :ref:`here ` - -```` - -* **FFILE**-tag : File name containing atomic forces in Cartesian coordinate - - :Default: None - :Type: String - :Description: The format of ``FFILE`` can be found :ref:`here ` - -```` - -* **NDATA**-tag : Number of displacement-force data sets - - :Default: None - :Type: Integer - :Description: ``DFILE`` and ``FFILE`` should contain at least ``NDATA``:math:`\times` ``NAT`` lines. - -```` - -* NSTART, NEND-tags : Specifies the range of data to be used for fitting - - :Default: ``NSTART = 1``, ``NEND = NDATA`` - :Type: Integer - :Example: To use the data in the range of [20:30] out of 50 entries, the tags should be ``NSTART = 20`` and ``NEND = 30``. - -```` - -* ICONST-tag = 0 | 1 | 2 | 3 - - ===== ========================================================================= - 0 No constraints - 1 Constraints for translational invariance will be imposed between IFCs. - 2 | In addition to ``ICONST = 1``, constraints for rotational invariance - | will be imposed up to (``NORDER`` + 1)th order. - 3 | In addition to ``ICONST = 2``, constraints for rotational invariance - | between (``NORDER`` + 1)th order and (``NORDER`` + 2)th order, which - | are zero, will be considered. - 11 | Same as ``ICONST = 1`` but the constraint is imposed algebraically - | rather than numerically. - ===== ========================================================================= - - :Default: 1 - :Type: Integer - :Description: See :ref:`this page` for the numerical formulae. - -```` - -* ROTAXIS-tag : Rotation axis used to estimate constraints for rotational invariance. This entry is necessary when ``ICONST = 2, 3``. - - :Default: None - :Type: String - :Example: When one wants to consider the rotational invariance around the :math:`x`\ -axis, one should give ``ROTAXIS = x``. If one needs additional constraints for the rotation around the :math:`y`\ -axis, ``ROTAXIS`` should be ``ROTAXIS = xy``. - -```` - -* FC2XML-tag : XML file to which the harmonic terms will be fixed upon fitting - - :Default: None - :Type: String - :Description: When ``FC2XML``-tag is given, harmonic force constants will be fixed to the values stored in the ``FC2XML`` file. This may be useful for optimizing cubic and higher-order terms without changing the harmonic terms. Please make sure that the number of harmonic terms in the new computational condition is the same as that in the ``FC2XML`` file. - -```` - -* FC3XML-tag : XML file to which the cubic terms will be fixed upon fitting - - :Default: None - :Type: String - :Description: Same as the ``FC2XML``-tag, but ``FC3XML`` is to fix cubic force constants. - -```` - -.. _label_format_DFILE: - -Format of DFILE and FFILE -~~~~~~~~~~~~~~~~~~~~~~~~~ - -The displacement-force data sets obtained by first-principles (or classical force-field) calculations -have to be saved to ``DFILE`` and ``FFILE`` to estimate IFCs with ``MODE = fitting``. -In ``DFILE``, please explicitly specify the atomic displacements :math:`u_{\alpha}(\ell\kappa)` **in units of Bohr** as follows: - -.. math:: - :nowrap: - - \begin{eqnarray*} - u_{x}(1) & u_{y}(1) & u_{z}(1) \\ - u_{x}(2) & u_{y}(2) & u_{z}(2) \\ - & \vdots & \\ - u_{x}(\mathrm{NAT}) & u_{y}(\mathrm{NAT}) & u_{z}(\mathrm{NAT}) - \end{eqnarray*} - -When there are ``NAT`` atoms in the supercell and ``NDATA`` data sets, -there should be ``NAT`` :math:`\times` ``NDATA`` lines in the ``DFILE`` without blank lines. -In ``FFILE``, please specify the corresponding atomic forces **in units of Ryd/Bohr**. diff --git a/docs/source/install.rst b/docs/source/install.rst index a370e19e..89f83779 100644 --- a/docs/source/install.rst +++ b/docs/source/install.rst @@ -9,17 +9,18 @@ Mandatory requirements * C++ compiler (Intel compiler is recommended.) * LAPACK library -* MPI library (Either OpenMPI, MPICH2, or IntelMPI) +* MPI library (OpenMPI, MPICH2, IntelMPI, etc.) * `Boost C++ library `_ * FFTW library * `Eigen3 library `_ +* `spglib `_ In addition to the above requirements, users have to get and install a first-principles package -(such as VASP_, Wien2k_, QUANTUM-ESPRESSO_, or xTAPP_) or another force field package (such as +(such as VASP_, QUANTUM-ESPRESSO_, OpenMX_, or xTAPP_) or another force field package (such as LAMMPS_) by themselves in order to compute harmonic and anharmonic force constants. .. _VASP : http://www.vasp.at -.. _Wien2k : http://www.wien2k.at +.. _OpenMX : http://www.openmx-square.org .. _QUANTUM-ESPRESSO : http://www.quantum-espresso.org .. _xTAPP : http://frodo.wpi-aimr.tohoku.ac.jp/xtapp/index.html .. _LAMMPS : http://lammps.sandia.gov @@ -31,7 +32,7 @@ Optional requirements * Python (> 2.6), Numpy, and Matplotlib * XcrySDen_ or VMD_ -We provide some small scripts written in Python (Python 2) for visualizing phonon dispersion relations, phonon DOSs, etc. +We provide some small scripts written in Python for visualizing phonon dispersion relations, phonon DOSs, etc. To use these scripts, one need to install the above Python packages. Additionally, XcrySDen is necessary to visualize the normal mode directions and animate the normal mode. VMD may be more useful to make an animation, but it may be replaced by any other visualization software which supports the XYZ format. @@ -44,43 +45,77 @@ How to install .. highlight:: bash -0. Install the LAPACK, MPI, FFTW, Boost C++, and Eigen3 libraries. +Here, we do not explain how to install a C++ compiler, LAPACK, MPI, and FFTW libraries because they are usually available on supercomputing systems. - To install the Boost C++ library, please download a source file from the `webpage `_ and - unpack the file. Then, copy the 'boost' subdirectory to the include folder in the home directory (or anywhere you like). - This can be done as follows:: +Boost C++ and Eigen3 libraries (header files only) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Some header files of Boost C++ and Eigen3 libraries are necessary to build ALAMODE binaries. +Here, we install header files of these libraries in ``$(HOME)/include``. +You can skip this part if these libraries are already installed on your system. + +To install the Boost C++ library, please download a source file from the `webpage `_ and +unpack the file. Then, copy the 'boost' subdirectory to ``$(HOME)/include``. +This can be done as follows:: - $ cd - $ mkdir etc; cd etc - (Download a source file and mv it to ~/etc) - $ tar xvf boost_x_yy_z.tar.bz2 - $ cd ../ - $ mkdir include; cd include - $ ln -s ../etc/boost_x_yy_z/boost . + $ cd + $ mkdir etc; cd etc + (Download a source file and mv it to ~/etc) + $ tar xvf boost_x_yy_z.tar.bz2 + $ cd ../ + $ mkdir include; cd include + $ ln -s ../etc/boost_x_yy_z/boost . + +In this example, we place the boost files in ``$(HOME)/etc`` and create a symbolic link to the ``$(HOME)/boost_x_yy_z/boost`` in ``$(HOME)/include``. +Instead of installing from source, you can install the Boost library with `Homebrew `_ on Mac OSX. + +In the same way, please install the Eigen3 include files as follows:: + + $ cd + $ mkdir etc; cd etc + (Download a source file and mv it to ~/etc) + $ tar xvf eigen-eigen-*.tar.bz2 (* is an array of letters and digits) + $ cd ../ + $ cd include + $ ln -s ../etc/eigen-eigen-*/Eigen . + + +If you have followed the instruction, you will see the following results:: + + $ pwd + /home/tadano/include + $ ls -l + total 0 + lrwxrwxrwx 1 tadano sim00 25 May 17 2017 boost -> ../etc/boost_1_64_0/boost + lrwxrwxrwx 1 tadano sim00 38 May 17 2017 Eigen -> ../etc/eigen-eigen-67e894c6cd8f/Eigen/ + - In this example, we made a symbolic link to the 'boost' subdirectory in ``$HOME/include``. - Instead of installing from source, you can install the Boost library with `Homebrew `_ on Mac OSX. +spglib +~~~~~~ - In the same way, please install the Eigen3 include files as follows:: +ALAMODE uses spglib to handle symmetries of crystal structures. +Please install it by following the instruction on the `spglib webpage `_. +Here, we assume spglib is installed in ``$(SPGLIB_ROOT)``. - $ cd - $ mkdir etc; cd etc - (Download a source file and mv it to ~/etc) - $ tar xvf eigen-eigen-*.tar.bz2 (* is an array of letters and digits) - $ cd ../ - $ cd include - $ ln -s ../etc/eigen-eigen-*/Eigen . +Download ALAMODE source +~~~~~~~~~~~~~~~~~~~~~~~ -1. Download the package of ALAMODE from the download page or clone from the git repository. +From the download page:: -2. Change directory to the location of the file and untar the file as follows:: + $ (visit https://sourceforge.net/projects/alamode/files/latest/download?source=files to download the latest version source) + $ tar xvzf alamode-x.y.z.tar.gz + $ cd alamode-x.y.z - $ tar -xvzf alamode-x.y.z.tar.gz +From GitHub repository:: - This will create a directory alamode-x.y.z containing the following subdirectories: - - * alm/ : Source files for alm (force constant calculation) - * anphon/ : Source files for anphon (phonon calculation) + $ git clone https://github.com/ttadano/alamode.git + $ cd alamode + $ git checkout master + +The meaning of each subdirectory is as follows: + + * alm/ : Source files of alm (force constant calculator) + * anphon/ : Source files of anphon (anharmonic phonon calculator) * external/ : Third-party include files * include/ : Commonly-used include files * tools/ : Small auxiliary programs and scripts @@ -88,33 +123,54 @@ How to install * example/ : Example files -.. highlight:: makefile +Build ALAMODE by Makefile +~~~~~~~~~~~~~~~~~~~~~~~~~ + +ALAMODE contains two major codes, **alm** and **anphon**, and other small utility scripts. +In directories ``alm/``, ``anphon/``, and ``tools``, we provide sample Makefiles for Linux (Intel compiler) and Mac OSX (gcc, clang). +Please copy either of them, edit the options appropriately, and issue ``make`` command as follows:: + + + $ cd alm/ + $ cp Makefile.linux Makefile + (Edit Makefile here) + $ make -j + + $ cd ../anphon/ + $ cp Makefile.linux Makefile + (Edit Makefile here) + $ make -j + + $ cd ../tools/ + (Edit Makefile here) + $ make -j +An example of the Makefiles is shown below: -3. Edit the Makefiles +.. literalinclude:: ../../alm/Makefile.linux + :caption: **ALM Makefile.linux** + :language: makefile + :linenos: + :lines: 7-17 - In directories alm/ and anphon/, we provide sample Makefiles for Linux (with Intel compiler) and Mac OSX (with gcc). - Please copy one of them as ``Makefile`` and modify it appropriately for your environment. +The default options are expected to work with modern Intel compilers. - Here's a typical setting for Linux with Intel compiler:: +.. note:: + To build the binaries with the example Makefiles, you need to set ``SPGLIB_ROOT`` beforehand from the terminal as:: - CXX = icpc - CXXFLAGS = -O2 -xHOST -openmp -std=c++11 - INCLUDE = -I../include -I$(HOME)/include + $ export SPGLIB_ROOT=/path/to/spglib/installdir - CXXL = ${CXX} - LDFLAGS = -mkl - LAPACK = - LIBS = ${LAPACK} +Edit LD_LIBRARY_PATH in bashrc +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - To enable OpenMP parallelization, please add the ``-openmp`` (Intel) or ``-fopenmp`` (gcc) option in ``CXXFLAGS``. - In addition, the directory containing the boost/ and Eigen/ subdirectories must be given in ``INCLUDE``. +Finally, add the following line in ``$(HOME)/.bashrc`` (or ``.zshrc`` etc.):: -4. Make executables by ``make`` command. + (bash, zsh) + export LD_LIBRARY_PATH=/path/to/spglib/installdir/lib:$LD_LIBRARY_PATH - If the compilation is successful, the binary file named **alm** (**anphon**) is created in the alm/ (anphon/) directory. - To use some auxiliary scripts for post-processing and data conversion, please compile the programs in the tools directory as well. - See README.md in the tools directory for details about the auxiliary programs. + (csh, tcsh) + setenv LD_LIBRARY_PATH /path/to/spglib/installdir/lib:$LD_LIBRARY_PATH +This is necessary when you link spglib dynamically. diff --git a/docs/source/intro.rst b/docs/source/intro.rst index 6d655938..fd7d7379 100644 --- a/docs/source/intro.rst +++ b/docs/source/intro.rst @@ -40,7 +40,7 @@ Harmonic properties * Animation and visualization of phonon modes (requires VMD or XCrysDen) * 3-phonon scattering phase space * Phonon-isotope scattering rate -* Participation ratio for analyzing localization of phonon modes +* Participation ratio for analyzing the localization of phonon modes Anharmonic properties ^^^^^^^^^^^^^^^^^^^^^ @@ -53,8 +53,8 @@ Anharmonic properties * Phonon linewidth due to 3-phonon interactions * Phonon frequency shift due to 3- and 4-phonon interactions * Temperature-dependent effective potential method -* Self-consisitent phonon (SCPH) calculation - +* Self-consistent phonon (SCPH) calculation +* Anharmonic vibrational free-energy Links ----- @@ -88,9 +88,14 @@ If you use the self-consistent phonon (SCPH) method, please cite the following p T\. Tadano and S. Tsuneyuki, Phys. Rev. B **92**\ , 054301 (2015). [`Link `__] +If you use ALAMODE to compute anharmonic vibrational free-energies in your research paper, +please cite the following paper as well: + + Y\. Oba, T. Tadano, R. Akashi, and S. Tsuneyuki, Phys. Rev. Materials **3**\, 033601 (2019). + [`Link `__] -Acknowledgement ---------------- +Acknowledgment +-------------- This project is/was partially supported by the following projects: @@ -105,7 +110,7 @@ Author & Contact -| International Center for Young Scientists (ICYS), +| Research Center for Magnetic and Spintronic Materials (CMSM), | National Institute for Material Science (NIMS), | Japan diff --git a/docs/source/quickstart.rst b/docs/source/quickstart.rst index 9cd105b6..36c8ee5b 100644 --- a/docs/source/quickstart.rst +++ b/docs/source/quickstart.rst @@ -55,10 +55,10 @@ Program *alm* estimates harmonic and anharmonic interatomic force constants (IFC We are willing to support other software if necessary. -5. Estimate IFCs by a least-squares fitting +5. Estimate IFCs by linear regression - In order to perform a fitting, please change the variable ``MODE`` of the input file `alm.in` to ``MODE = fitting``. - In addition please add the ``&fitting`` entry with appropriate ``NDATA``, ``DFILE``, and ``FFILE``. (``DFILE`` should be like ``DFILE = disp_all.dat``.) Then, IFCs can be estimated by executing + In order to perform a fitting, please change the variable ``MODE`` of the input file `alm.in` to ``MODE = optimize``. + In addition please add the ``&optimize`` entry with appropriate ``DFSET``. Then, IFCs can be estimated by executing :: @@ -77,7 +77,7 @@ Program anphon To perform phonon calculations and thermal conductivity calculations, one needs to prepare another input file, say `anphon.in`, for the program *anphon*. - If one wants to perform (harmonic) phonon calculations, one should write ``MODE = phonons`` in the ``&general`` entry of anphon.in. Please make sure that ``FCSXML`` variable being set to the XML file generated by *alm*. + If one wants to perform (harmonic) phonon calculations, one should write ``MODE = phonons`` in the ``&general`` entry of anphon.in. Please make sure that ``FCSXML`` variable is set to the XML file generated by *alm*. If one wants to conduct thermal conductivity calculations instead of usual phonon calculations, please switch to ``MODE = RTA`` with appropriate ``FCSXML`` containing cubic IFCs. diff --git a/docs/source/tutorial_pages/01_silicon.rst b/docs/source/tutorial_pages/01_silicon.rst index 6e834c98..9a911375 100644 --- a/docs/source/tutorial_pages/01_silicon.rst +++ b/docs/source/tutorial_pages/01_silicon.rst @@ -69,25 +69,30 @@ Using the script :red:`displace.py` in the tools/ directory, you can generate th **QE** :: - $ python displace.py --QE=si222.pw.in --mag=0.02 si222.pattern_HARMONIC + $ python displace.py --QE=si222.pw.in --mag=0.01 si222.pattern_HARMONIC **VASP** :: - $ python displace.py --VASP=POSCAR.orig --mag=0.02 si222.pattern_HARMONIC + $ python displace.py --VASP=POSCAR.orig --mag=0.01 si222.pattern_HARMONIC **xTAPP** :: - $ python displace.py --xTAPP=si222.cg --mag=0.02 si222.pattern_HARMONIC + $ python displace.py --xTAPP=si222.cg --mag=0.01 si222.pattern_HARMONIC + + **OpenMX** + :: + + $ python displace.py --OpenMX=si222.dat --mag=0.01 si222.pattern_HARMONIC The ``--mag`` option specifies the displacement length in units of Angstrom. -You need to specify an input file with equilibrium atomic positions either by the ``--QE``, ``--VASP``, ``--xTAPP``, or ``--LAMMPS``. +You need to specify an input file with equilibrium atomic positions either by the ``--QE``, ``--VASP``, ``--xTAPP``, ``--OpenMX`` or ``--LAMMPS``. Then, calculate atomic forces for all the configurations. This can be done with a simple shell script as follows:: - !#/bin/bash + #!/bin/bash # Assume we have 20 displaced configurations for QE [disp01.pw.in,..., disp20.pw.in]. @@ -109,26 +114,29 @@ The next step is to collect the displacement data and force data by the Python s **QE** :: - $ python extract.py --QE=si222.pw.in --get=disp *.pw.out > disp.dat - $ python extract.py --QE=si222.pw.in --get=force *.pw.out > force.dat + $ python extract.py --QE=si222.pw.in *.pw.out > DFSET_harmonic **VASP** :: - $ python extract.py --VASP=POSCAR.orig --get=disp vasprun*.xml > disp.dat - $ python extract.py --VASP=POSCAR.orig --get=force vasprun*.xml > force.dat + $ python extract.py --VASP=POSCAR.orig vasprun*.xml > DFSET_harmonic **xTAPP** :: - $ python extract.py --xTAPP=si222.cg --get=disp *.str > disp.dat - $ python extract.py --xTAPP=si222.cg --get=force *.str > force.dat + $ python extract.py --xTAPP=si222.cg *.str > DFSET_harmonic -In the above examples, atomic displacements of all the configurations are merged as *disp.dat*, and the corresponding atomic forces are saved in the file *force.dat*. These files will be used in the following fitting procedure as ``DFILE`` and ``FFILE``. (See :ref:`Format of DFILE and FFILE`). + **OpenMX** + :: + + $ python extract.py --OpenMX=si222.dat *.out > DFSET_harmonic + +In the above examples, atomic displacements and corresponding atomic forces of all the configurations are merged as :red:`DFSET_harmonic`. +These files will be used in the following fitting procedure as ``DFSET`` (See :ref:`Format of DFSET `). .. Note:: - For your convenience, we provide the :red:`disp.dat` and :red:`force.dat` files in the reference/ subdirectory. These files were generated by the Quantum-ESPRESSO package with ``--mag=0.02``. You can proceed to the next step by copying these files to the working directory. + For your convenience, we provide the :red:`DFSET_harmonic` file in the reference/ subdirectory. These files are generated by the Quantum-ESPRESSO package with ``--mag=0.02``. You can proceed to the next step by copying these files to the working directory. .. _tutorial_Si_step3: @@ -137,21 +145,19 @@ In the above examples, atomic displacements of all the configurations are merged ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Edit the file :red:`si_alm.in` to perform least-square fitting. -Change the ``MODE = suggest`` to ``MODE = fitting`` as follows:: +Change the ``MODE = suggest`` to ``MODE = optimize`` as follows:: &general PREFIX = si222 - MODE = fitting # <-- here + MODE = optimize # <-- here NAT = 64; NKD = 1 KD = Si / -Also, add the **&fitting** field as:: +Also, add the **&optimize** field as:: &fitting - NDATA = 1 - DFILE = disp.dat - FFILE = force.dat + DFSET = DFSET_harmonic / Then, execute **alm** again @@ -159,7 +165,7 @@ Then, execute **alm** again $ alm si_alm.in > si_alm.log2 -This time **alm** extract harmonic IFCs from the given displacement-force data set (disp.dat and force.dat above). +This time **alm** extract harmonic IFCs from the given displacement-force data set (``DFSET_harmonic``). You can find files :red:`si222.fcs` and :red:`si222.xml` in the working directory. The file :red:`si222.fcs` contains all IFCs in Rydberg atomic units. @@ -178,7 +184,7 @@ Try :: $ grep "Fitting error" si_alm2.log - Fitting error (%) : 1.47766 + Fitting error (%) : 0.567187 The other file :red:`si222.xml` contains crystal structure, symmetry, IFCs, and all other information necessary for subsequent phonon calculations. @@ -297,18 +303,16 @@ Then, execute **alm** which creates files si222_cubic.pattern_HARMONIC and :red:`si222_cubic.pattern_ANHARM3`. -Then, calculate atomic forces of displaced configurations given in the file :red:`si222_cubic.pattern_ANHARM3`, and collect the displacement (force) data to a file :red:`disp3.dat` (:red:`force3.dat`) as you did for harmonic IFCs in Steps 3 and 4. +Then, calculate atomic forces of displaced configurations given in the file :red:`si222_cubic.pattern_ANHARM3`, and collect the displacement and force datasets to a file :red:`DFSET_cubic` as you did for harmonic IFCs in Steps 3 and 4. .. Note:: - Since making :red:`disp3.dat` and :red:`force3.dat` requires moderate computational resources, you can skip this procedure by copying files :red:`reference/disp3.dat` and :red:`reference/force3.dat` to the working directory. The files we provide were generated by the Quantum-ESPRESSO package with ``--mag=0.04``. + Since making :red:`DFSET_cubic` requires moderate computational resources, you can skip this procedure by copying file :red:`reference/DFSET_cubic` to the working directory. The file we provide is generated by the Quantum-ESPRESSO package with ``--mag=0.04``. -In :red:`si_alm2.in`, change ``MODE = suggest`` to ``MODE = fitting`` and add the following:: +In :red:`si_alm2.in`, change ``MODE = suggest`` to ``MODE = optimize`` and add the following:: - &fitting - NDATA = 20 - DFILE = disp3.dat - FFILE = force3.dat + &optimize + DFSET = DFSET_cubic FC2XML = si222.xml # Fix harmonic IFCs / @@ -321,18 +325,15 @@ Then, execute **alm** again which creates files :red:`si222_cubic.fcs` and :red:`si222_cubic.xml`. This time cubic IFCs are also included in these files. .. Note:: - In the above example, we obtained cubic IFCs by least square fitting with harmonic IFCs being fixed to the value of the previous harmonic calculation. You can also estimate both harmonic and cubic IFCs simultaneously instead. To do this, merge :red:`disp.dat` and :red:`disp3.dat` ( and force files) as + In the above example, we obtained cubic IFCs by least square fitting with harmonic IFCs being fixed to the value of the previous harmonic calculation. You can also estimate both harmonic and cubic IFCs simultaneously instead. To do this, merge :red:`DFSET_harmonic` and :red:`DFSET_cubic` as :: - $ cat disp.dat disp3.dat > disp_merged.dat - $ cat force.dat force3.dat > force_merged.dat + $ cat DFSET_harmonic DFSET_cubic > DFSET_merged and change the **&fitting** field as the following:: &fitting - NDATA = 21 - DFILE = disp_merged.dat - FFILE = force_merged.dat + DFSET = DFSET_merged / @@ -418,13 +419,13 @@ Phonon lifetime The file :red:`si222.result` contains phonon linewidths at irreducible :math:`k` points. You can extract phonon lifetime from this file as follows:: - $ analyze_phonons.py --calc tau --temp 300 si222.result > tau300K.dat + $ analyze_phonons.py --calc tau --temp 300 si222.result > tau300K_10.dat $ gnuplot gnuplot> set xrange [1:] gnuplot> set logscale y gnuplot> set xlabel "Phonon frequency (cm^{-1})" gnuplot> set ylabel "Phonon lifetime (ps)" - gnuplot> plot "tau300K.dat" using 3:4 w p + gnuplot> plot "tau300K_10.dat" using 3:4 w p .. figure:: ../img/si_tau.png :scale: 40% @@ -440,12 +441,12 @@ Cumulative thermal conductivity Following the procedure below, you can obtain the :ref:`cumulative thermal conductivity `:: - $ analyze_phonons.py --calc cumulative --temp 300 --length 10000:5 si222.result > cumulative_300K.dat + $ analyze_phonons.py --calc cumulative --temp 300 --length 10000:5 si222.result > cumulative_300K_10.dat $ gnuplot gnuplot> set logscale x gnuplot> set xlabel "L (nm)" gnuplot> set ylabel "Cumulative kappa (W/mK)" - gnuplot> plot "cumulative_300K.dat" using 1:2 w lp + gnuplot> plot "cumulative_300K_10.dat" using 1:2 w lp .. figure:: ../img/si_cumulative.png :scale: 40% @@ -453,7 +454,7 @@ Following the procedure below, you can obtain the :ref:`cumulative thermal condu Cumulative thermal conductivity of Si at 300 K (click to enlarge) -To draw a smooth line, you will have to use a denser :math:`q` grid as shown in the figure by the orange line, +To draw a smooth line, you have to use a denser :math:`q` grid as shown in the figure by the orange line, which are obtained with :math:`20\times 20\times 20\ q` points. Thermal conductivity spectrum @@ -495,19 +496,19 @@ The frequency range is specified with the ``EMIN``, ``EMAX``, and ``DELTA_E`` ta After the calculation finishes, you can find the file :red:`si222.kl_spec` which contains the spectra of thermal conductivity at various temperatures. You can plot the data at room temperature as follows:: - $ awk '{if ($1 == 300.0) print $0}' si222.kl_spec > si222_300K.kl_spec + $ awk '{if ($1 == 300.0) print $0}' si222.kl_spec > si222_300K_10.kl_spec $ gnuplot gnuplot> set xlabel "Frequency (cm^{-1})" gnuplot> set ylabel "Spectrum of kappa (W/mK/cm^{-1})" - gnuplot> plot "si222_300K.kl_spec" using 2:3 w l lt 2 lw 2 + gnuplot> plot "si222_300K_10.kl_spec" using 2:3 w l lt 2 lw 2 .. figure:: ../img/si_kappa_spec.png :scale: 40% :align: center - Spectrum of thermal conductivity of Si at 300 K (click to enlarge) + The spectrum of thermal conductivity of Si at 300 K (click to enlarge) -In the above figure, the computational result with :math:`20\times 20\times 20\ q` points is also shown by dashed line. -From the figure, we can see that low-energy phonons below 200 cm\ :math:`^{-1}` account for more than 80% of the total thermal conductivity at 300 K. +In the above figure, the computational result with :math:`20\times 20\times 20\ q` points is also shown by the dashed line. +From the figure, we can observe that low-energy phonons below 200 cm\ :math:`^{-1}` account for more than 80% of the total thermal conductivity at 300 K. diff --git a/docs/source/tutorial_pages/02_silicon_lammps.rst b/docs/source/tutorial_pages/02_silicon_lammps.rst index 2530d518..25d92a8c 100644 --- a/docs/source/tutorial_pages/02_silicon_lammps.rst +++ b/docs/source/tutorial_pages/02_silicon_lammps.rst @@ -38,30 +38,27 @@ This should finish in a few seconds. :: - !#/bin/bash + #!/bin/bash cp harm1.lammps tmp.lammps lmp_serial < in.sw > log.lammps - cp DISP DISP.harm1 - cp FORCE FORCE.harm1 + cp XFSET XFSET.harm1 for ((i=1;i<=20;i++)) do num=`echo $i | awk '{printf("%02d",$1)}'` cp cubic${num}.lammps tmp.lammps lmp_serial < in.sw > log.lammps - cp DISP DISP.cubic${num} - cp FORCE FORCE.cubic${num} + cp XFSET XFSET.cubic${num} done After the force calculations are finished, displacement and force data sets can be generated as follows:: - $ python extract.py --LAMMPS=Si222.lammps --get=disp DISP.harm1 > disp.dat - $ python extract.py --LAMMPS=Si222.lammps --get=force FORCE.harm1 > force.dat + .. bash:: + $ python extract.py --LAMMPS=Si222.lammps XFSET.harm1 > DFSET_harmonic - $ python extract.py --LAMMPS=Si222.lammps --get=disp DISP.cubic* > disp3.dat - $ python extract.py --LAMMPS=Si222.lammps --get=force FORCE.cubic* > force3.dat + $ python extract.py --LAMMPS=Si222.lammps XFSET.cubic* > DFSET_harmonic Then, using these files and following exactly the same procedure as the last tutorial section, you can calculate phonons and thermal conductivity of Si using the SW potential. diff --git a/example/PbTe/reference/PbTe_scph4-4.scph_bands.bz2 b/example/PbTe/reference/PbTe_scph4-4.scph_bands.bz2 index f7f8a9f1..66bcd38d 100644 Binary files a/example/PbTe/reference/PbTe_scph4-4.scph_bands.bz2 and b/example/PbTe/reference/PbTe_scph4-4.scph_bands.bz2 differ diff --git a/example/PbTe/reference/PbTe_scph4-4.scph_dfc2.bz2 b/example/PbTe/reference/PbTe_scph4-4.scph_dfc2.bz2 new file mode 100644 index 00000000..21562fb8 Binary files /dev/null and b/example/PbTe/reference/PbTe_scph4-4.scph_dfc2.bz2 differ diff --git a/example/PbTe/reference/PbTe_scph4-4.scph_dos.bz2 b/example/PbTe/reference/PbTe_scph4-4.scph_dos.bz2 new file mode 100644 index 00000000..4a71cc53 Binary files /dev/null and b/example/PbTe/reference/PbTe_scph4-4.scph_dos.bz2 differ diff --git a/example/PbTe/reference/PbTe_scph4-4.scph_dymat.bz2 b/example/PbTe/reference/PbTe_scph4-4.scph_dymat.bz2 index 1ac62638..0612791c 100644 Binary files a/example/PbTe/reference/PbTe_scph4-4.scph_dymat.bz2 and b/example/PbTe/reference/PbTe_scph4-4.scph_dymat.bz2 differ diff --git a/example/PbTe/reference/PbTe_scph4-4.scph_fc2_correction.bz2 b/example/PbTe/reference/PbTe_scph4-4.scph_fc2_correction.bz2 deleted file mode 100644 index fc8b6dd4..00000000 Binary files a/example/PbTe/reference/PbTe_scph4-4.scph_fc2_correction.bz2 and /dev/null differ diff --git a/example/PbTe/reference/PbTe_scph4-4.scph_msd.bz2 b/example/PbTe/reference/PbTe_scph4-4.scph_msd.bz2 new file mode 100644 index 00000000..b8c3b1ec Binary files /dev/null and b/example/PbTe/reference/PbTe_scph4-4.scph_msd.bz2 differ diff --git a/example/PbTe/reference/PbTe_scph4-4.scph_thermo.bz2 b/example/PbTe/reference/PbTe_scph4-4.scph_thermo.bz2 new file mode 100644 index 00000000..5054fbb1 Binary files /dev/null and b/example/PbTe/reference/PbTe_scph4-4.scph_thermo.bz2 differ diff --git a/example/PbTe/reference/scph.log b/example/PbTe/reference/scph.log index 2cb98a16..19f833ca 100644 --- a/example/PbTe/reference/scph.log +++ b/example/PbTe/reference/scph.log @@ -1,11 +1,11 @@ +-----------------------------------------------------------------+ + Program ANPHON + - + Ver.1.0.0 + + + Ver. 1.0.2 + +-----------------------------------------------------------------+ - Job started at Mon Nov 20 15:07:21 2017 + Job started at Wed May 1 19:58:58 2019 - The number of MPI processes: 4 + The number of MPI processes: 2 Input variables: @@ -26,6 +26,9 @@ ISMEAR = -1; EPSILON = 10 + CLASSICAL = 0 + BCONNECT = 0 + Scph: KMESH_INTERPOLATE = 4 4 4 KMESH_SCPH = 4 4 4 @@ -36,7 +39,7 @@ LOWER_TEMP = 1 WARMSTART = 1 - TOL_SCPH = 1e-08 + TOL_SCPH = 1e-10 MAXITER = 500 MIXALPHA = 0.1 @@ -110,11 +113,11 @@ Number of paths : 3 List of k paths : - 1: G ( 0.0000 0.0000 0.0000) X ( 0.5000 0.5000 0.0000) 21 - 2: X ( 0.5000 0.5000 1.0000) G ( 0.0000 0.0000 0.0000) 21 - 3: G ( 0.0000 0.0000 0.0000) L ( 0.5000 0.5000 0.5000) 21 + 1: G ( 0.0000 0.0000 0.0000) X ( 0.5000 0.5000 0.0000) 41 + 2: X ( 0.5000 0.5000 1.0000) G ( 0.0000 0.0000 0.0000) 41 + 3: G ( 0.0000 0.0000 0.0000) L ( 0.5000 0.5000 0.5000) 41 - Number of k points : 63 + Number of k points : 123 Force constant ============== @@ -164,7 +167,7 @@ Preparing for calculating V4 ... done! SELF_OFFDIAG = 0: Calculating diagonal components of v4_array ... done ! - Time Elapsed: 7.1726e+01 sec. + Time Elapsed: 8.7548e+01 sec. Temperature = 1.0000e+03 K SCPH ITER 1 : DIFF = N/A @@ -213,5170 +216,5594 @@ SCPH ITER 44 : DIFF = 1.1553e-08 SCPH ITER 45 : DIFF = 1.0143e-08 SCPH ITER 46 : DIFF = 8.9043e-09 + SCPH ITER 47 : DIFF = 7.8171e-09 + SCPH ITER 48 : DIFF = 6.8626e-09 + SCPH ITER 49 : DIFF = 6.0246e-09 + SCPH ITER 50 : DIFF = 5.2889e-09 + SCPH ITER 51 : DIFF = 4.6430e-09 + SCPH ITER 52 : DIFF = 4.0760e-09 + SCPH ITER 53 : DIFF = 3.5782e-09 + SCPH ITER 54 : DIFF = 3.1412e-09 + SCPH ITER 55 : DIFF = 2.7576e-09 + SCPH ITER 56 : DIFF = 2.4208e-09 + SCPH ITER 57 : DIFF = 2.1252e-09 + SCPH ITER 58 : DIFF = 1.8656e-09 + SCPH ITER 59 : DIFF = 1.6378e-09 + SCPH ITER 60 : DIFF = 1.4377e-09 + SCPH ITER 61 : DIFF = 1.2622e-09 + SCPH ITER 62 : DIFF = 1.1080e-09 + SCPH ITER 63 : DIFF = 9.7268e-10 + SCPH ITER 64 : DIFF = 8.5389e-10 + SCPH ITER 65 : DIFF = 7.4961e-10 + SCPH ITER 66 : DIFF = 6.5807e-10 + SCPH ITER 67 : DIFF = 5.7771e-10 + SCPH ITER 68 : DIFF = 5.0716e-10 + SCPH ITER 69 : DIFF = 4.4523e-10 + SCPH ITER 70 : DIFF = 3.9087e-10 + SCPH ITER 71 : DIFF = 3.4313e-10 + SCPH ITER 72 : DIFF = 3.0124e-10 + SCPH ITER 73 : DIFF = 2.6446e-10 + SCPH ITER 74 : DIFF = 2.3220e-10 + SCPH ITER 75 : DIFF = 2.0383e-10 + SCPH ITER 76 : DIFF = 1.7899e-10 + SCPH ITER 77 : DIFF = 1.5717e-10 + SCPH ITER 78 : DIFF = 1.3794e-10 + SCPH ITER 79 : DIFF = 1.2110e-10 + SCPH ITER 80 : DIFF = 1.0633e-10 + SCPH ITER 81 : DIFF = 9.3363e-11 DIFF < SCPH_TOL : break SCPH loop - Temp = 1.0000e+03 : convergence achieved in 46 iterations. + Temp = 1.0000e+03 : convergence achieved in 81 iterations. New eigenvalues - ik_interpolate = 1 is = 1 omega2 = 1.0398e-22 - ik_interpolate = 1 is = 2 omega2 = 1.3235e-22 - ik_interpolate = 1 is = 3 omega2 = 1.7395e-22 - ik_interpolate = 1 is = 4 omega2 = 4.1449e-07 - ik_interpolate = 1 is = 5 omega2 = 4.1449e-07 - ik_interpolate = 1 is = 6 omega2 = 4.1449e-07 - - ik_interpolate = 2 is = 1 omega2 = 1.5227e-07 - ik_interpolate = 2 is = 2 omega2 = 1.5227e-07 - ik_interpolate = 2 is = 3 omega2 = 2.6953e-07 - ik_interpolate = 2 is = 4 omega2 = 8.1361e-07 - ik_interpolate = 2 is = 5 omega2 = 8.1361e-07 - ik_interpolate = 2 is = 6 omega2 = 1.3121e-06 - - ik_interpolate = 3 is = 1 omega2 = 3.3307e-07 - ik_interpolate = 3 is = 2 omega2 = 3.3307e-07 - ik_interpolate = 3 is = 3 omega2 = 7.0191e-07 - ik_interpolate = 3 is = 4 omega2 = 8.2741e-07 - ik_interpolate = 3 is = 5 omega2 = 8.2741e-07 - ik_interpolate = 3 is = 6 omega2 = 9.9002e-07 - - ik_interpolate = 4 is = 1 omega2 = 1.5227e-07 - ik_interpolate = 4 is = 2 omega2 = 1.5227e-07 - ik_interpolate = 4 is = 3 omega2 = 2.6953e-07 - ik_interpolate = 4 is = 4 omega2 = 8.1361e-07 - ik_interpolate = 4 is = 5 omega2 = 8.1361e-07 - ik_interpolate = 4 is = 6 omega2 = 1.3121e-06 - - ik_interpolate = 5 is = 1 omega2 = 1.5227e-07 - ik_interpolate = 5 is = 2 omega2 = 1.5227e-07 - ik_interpolate = 5 is = 3 omega2 = 2.6953e-07 - ik_interpolate = 5 is = 4 omega2 = 8.1361e-07 - ik_interpolate = 5 is = 5 omega2 = 8.1361e-07 - ik_interpolate = 5 is = 6 omega2 = 1.3121e-06 - - ik_interpolate = 6 is = 1 omega2 = 4.4208e-08 - ik_interpolate = 6 is = 2 omega2 = 4.4208e-08 - ik_interpolate = 6 is = 3 omega2 = 4.8333e-07 - ik_interpolate = 6 is = 4 omega2 = 6.0496e-07 - ik_interpolate = 6 is = 5 omega2 = 6.0496e-07 - ik_interpolate = 6 is = 6 omega2 = 8.7737e-07 - - ik_interpolate = 7 is = 1 omega2 = 1.7337e-07 - ik_interpolate = 7 is = 2 omega2 = 1.9599e-07 - ik_interpolate = 7 is = 3 omega2 = 2.8282e-07 - ik_interpolate = 7 is = 4 omega2 = 7.7513e-07 - ik_interpolate = 7 is = 5 omega2 = 8.5179e-07 - ik_interpolate = 7 is = 6 omega2 = 9.9302e-07 - - ik_interpolate = 8 is = 1 omega2 = 8.2074e-08 - ik_interpolate = 8 is = 2 omega2 = 3.1262e-07 - ik_interpolate = 8 is = 3 omega2 = 5.7929e-07 - ik_interpolate = 8 is = 4 omega2 = 6.8774e-07 - ik_interpolate = 8 is = 5 omega2 = 7.9247e-07 - ik_interpolate = 8 is = 6 omega2 = 9.3830e-07 - - ik_interpolate = 9 is = 1 omega2 = 3.3307e-07 - ik_interpolate = 9 is = 2 omega2 = 3.3307e-07 - ik_interpolate = 9 is = 3 omega2 = 7.0191e-07 - ik_interpolate = 9 is = 4 omega2 = 8.2741e-07 - ik_interpolate = 9 is = 5 omega2 = 8.2741e-07 - ik_interpolate = 9 is = 6 omega2 = 9.9002e-07 - - ik_interpolate = 10 is = 1 omega2 = 1.7337e-07 - ik_interpolate = 10 is = 2 omega2 = 1.9599e-07 - ik_interpolate = 10 is = 3 omega2 = 2.8282e-07 - ik_interpolate = 10 is = 4 omega2 = 7.7513e-07 - ik_interpolate = 10 is = 5 omega2 = 8.5179e-07 - ik_interpolate = 10 is = 6 omega2 = 9.9302e-07 - - ik_interpolate = 11 is = 1 omega2 = 6.3968e-08 - ik_interpolate = 11 is = 2 omega2 = 6.3968e-08 - ik_interpolate = 11 is = 3 omega2 = 1.1572e-07 - ik_interpolate = 11 is = 4 omega2 = 6.5720e-07 - ik_interpolate = 11 is = 5 omega2 = 6.5720e-07 - ik_interpolate = 11 is = 6 omega2 = 7.4614e-07 - - ik_interpolate = 12 is = 1 omega2 = 1.7337e-07 - ik_interpolate = 12 is = 2 omega2 = 1.9599e-07 - ik_interpolate = 12 is = 3 omega2 = 2.8282e-07 - ik_interpolate = 12 is = 4 omega2 = 7.7513e-07 - ik_interpolate = 12 is = 5 omega2 = 8.5179e-07 - ik_interpolate = 12 is = 6 omega2 = 9.9302e-07 - - ik_interpolate = 13 is = 1 omega2 = 1.5227e-07 - ik_interpolate = 13 is = 2 omega2 = 1.5227e-07 - ik_interpolate = 13 is = 3 omega2 = 2.6953e-07 - ik_interpolate = 13 is = 4 omega2 = 8.1361e-07 - ik_interpolate = 13 is = 5 omega2 = 8.1361e-07 - ik_interpolate = 13 is = 6 omega2 = 1.3121e-06 - - ik_interpolate = 14 is = 1 omega2 = 8.2074e-08 - ik_interpolate = 14 is = 2 omega2 = 3.1262e-07 - ik_interpolate = 14 is = 3 omega2 = 5.7929e-07 - ik_interpolate = 14 is = 4 omega2 = 6.8774e-07 - ik_interpolate = 14 is = 5 omega2 = 7.9247e-07 - ik_interpolate = 14 is = 6 omega2 = 9.3830e-07 - - ik_interpolate = 15 is = 1 omega2 = 1.7337e-07 - ik_interpolate = 15 is = 2 omega2 = 1.9599e-07 - ik_interpolate = 15 is = 3 omega2 = 2.8282e-07 - ik_interpolate = 15 is = 4 omega2 = 7.7513e-07 - ik_interpolate = 15 is = 5 omega2 = 8.5179e-07 - ik_interpolate = 15 is = 6 omega2 = 9.9302e-07 - - ik_interpolate = 16 is = 1 omega2 = 4.4208e-08 - ik_interpolate = 16 is = 2 omega2 = 4.4208e-08 - ik_interpolate = 16 is = 3 omega2 = 4.8333e-07 - ik_interpolate = 16 is = 4 omega2 = 6.0496e-07 - ik_interpolate = 16 is = 5 omega2 = 6.0496e-07 - ik_interpolate = 16 is = 6 omega2 = 8.7737e-07 - - ik_interpolate = 17 is = 1 omega2 = 1.5227e-07 - ik_interpolate = 17 is = 2 omega2 = 1.5227e-07 - ik_interpolate = 17 is = 3 omega2 = 2.6953e-07 - ik_interpolate = 17 is = 4 omega2 = 8.1361e-07 - ik_interpolate = 17 is = 5 omega2 = 8.1361e-07 - ik_interpolate = 17 is = 6 omega2 = 1.3121e-06 - - ik_interpolate = 18 is = 1 omega2 = 4.4208e-08 - ik_interpolate = 18 is = 2 omega2 = 4.4208e-08 - ik_interpolate = 18 is = 3 omega2 = 4.8333e-07 - ik_interpolate = 18 is = 4 omega2 = 6.0496e-07 - ik_interpolate = 18 is = 5 omega2 = 6.0496e-07 - ik_interpolate = 18 is = 6 omega2 = 8.7737e-07 - - ik_interpolate = 19 is = 1 omega2 = 1.7337e-07 - ik_interpolate = 19 is = 2 omega2 = 1.9599e-07 - ik_interpolate = 19 is = 3 omega2 = 2.8282e-07 - ik_interpolate = 19 is = 4 omega2 = 7.7513e-07 - ik_interpolate = 19 is = 5 omega2 = 8.5179e-07 - ik_interpolate = 19 is = 6 omega2 = 9.9302e-07 - - ik_interpolate = 20 is = 1 omega2 = 8.2074e-08 - ik_interpolate = 20 is = 2 omega2 = 3.1262e-07 - ik_interpolate = 20 is = 3 omega2 = 5.7929e-07 - ik_interpolate = 20 is = 4 omega2 = 6.8774e-07 - ik_interpolate = 20 is = 5 omega2 = 7.9247e-07 - ik_interpolate = 20 is = 6 omega2 = 9.3830e-07 - - ik_interpolate = 21 is = 1 omega2 = 4.4208e-08 - ik_interpolate = 21 is = 2 omega2 = 4.4208e-08 - ik_interpolate = 21 is = 3 omega2 = 4.8333e-07 - ik_interpolate = 21 is = 4 omega2 = 6.0496e-07 - ik_interpolate = 21 is = 5 omega2 = 6.0496e-07 - ik_interpolate = 21 is = 6 omega2 = 8.7737e-07 - - ik_interpolate = 22 is = 1 omega2 = 1.5227e-07 - ik_interpolate = 22 is = 2 omega2 = 1.5227e-07 - ik_interpolate = 22 is = 3 omega2 = 2.6953e-07 - ik_interpolate = 22 is = 4 omega2 = 8.1361e-07 - ik_interpolate = 22 is = 5 omega2 = 8.1361e-07 - ik_interpolate = 22 is = 6 omega2 = 1.3121e-06 - - ik_interpolate = 23 is = 1 omega2 = 8.2074e-08 - ik_interpolate = 23 is = 2 omega2 = 3.1262e-07 - ik_interpolate = 23 is = 3 omega2 = 5.7929e-07 - ik_interpolate = 23 is = 4 omega2 = 6.8774e-07 - ik_interpolate = 23 is = 5 omega2 = 7.9247e-07 - ik_interpolate = 23 is = 6 omega2 = 9.3830e-07 - - ik_interpolate = 24 is = 1 omega2 = 1.7337e-07 - ik_interpolate = 24 is = 2 omega2 = 1.9599e-07 - ik_interpolate = 24 is = 3 omega2 = 2.8282e-07 - ik_interpolate = 24 is = 4 omega2 = 7.7513e-07 - ik_interpolate = 24 is = 5 omega2 = 8.5179e-07 - ik_interpolate = 24 is = 6 omega2 = 9.9302e-07 - - ik_interpolate = 25 is = 1 omega2 = 1.7337e-07 - ik_interpolate = 25 is = 2 omega2 = 1.9599e-07 - ik_interpolate = 25 is = 3 omega2 = 2.8282e-07 - ik_interpolate = 25 is = 4 omega2 = 7.7513e-07 - ik_interpolate = 25 is = 5 omega2 = 8.5179e-07 - ik_interpolate = 25 is = 6 omega2 = 9.9302e-07 - - ik_interpolate = 26 is = 1 omega2 = 8.2074e-08 - ik_interpolate = 26 is = 2 omega2 = 3.1262e-07 - ik_interpolate = 26 is = 3 omega2 = 5.7929e-07 - ik_interpolate = 26 is = 4 omega2 = 6.8774e-07 - ik_interpolate = 26 is = 5 omega2 = 7.9247e-07 - ik_interpolate = 26 is = 6 omega2 = 9.3830e-07 - - ik_interpolate = 27 is = 1 omega2 = 1.7337e-07 - ik_interpolate = 27 is = 2 omega2 = 1.9599e-07 - ik_interpolate = 27 is = 3 omega2 = 2.8282e-07 - ik_interpolate = 27 is = 4 omega2 = 7.7513e-07 - ik_interpolate = 27 is = 5 omega2 = 8.5179e-07 - ik_interpolate = 27 is = 6 omega2 = 9.9302e-07 - - ik_interpolate = 28 is = 1 omega2 = 1.0249e-07 - ik_interpolate = 28 is = 2 omega2 = 1.0249e-07 - ik_interpolate = 28 is = 3 omega2 = 4.2019e-07 - ik_interpolate = 28 is = 4 omega2 = 7.1954e-07 - ik_interpolate = 28 is = 5 omega2 = 7.1954e-07 - ik_interpolate = 28 is = 6 omega2 = 8.6238e-07 - - ik_interpolate = 29 is = 1 omega2 = 8.2074e-08 - ik_interpolate = 29 is = 2 omega2 = 3.1262e-07 - ik_interpolate = 29 is = 3 omega2 = 5.7929e-07 - ik_interpolate = 29 is = 4 omega2 = 6.8774e-07 - ik_interpolate = 29 is = 5 omega2 = 7.9247e-07 - ik_interpolate = 29 is = 6 omega2 = 9.3830e-07 - - ik_interpolate = 30 is = 1 omega2 = 1.7337e-07 - ik_interpolate = 30 is = 2 omega2 = 1.9599e-07 - ik_interpolate = 30 is = 3 omega2 = 2.8282e-07 - ik_interpolate = 30 is = 4 omega2 = 7.7513e-07 - ik_interpolate = 30 is = 5 omega2 = 8.5179e-07 - ik_interpolate = 30 is = 6 omega2 = 9.9302e-07 - - ik_interpolate = 31 is = 1 omega2 = 1.0249e-07 - ik_interpolate = 31 is = 2 omega2 = 1.0249e-07 - ik_interpolate = 31 is = 3 omega2 = 4.2019e-07 - ik_interpolate = 31 is = 4 omega2 = 7.1954e-07 - ik_interpolate = 31 is = 5 omega2 = 7.1954e-07 - ik_interpolate = 31 is = 6 omega2 = 8.6238e-07 - - ik_interpolate = 32 is = 1 omega2 = 1.7337e-07 - ik_interpolate = 32 is = 2 omega2 = 1.9599e-07 - ik_interpolate = 32 is = 3 omega2 = 2.8282e-07 - ik_interpolate = 32 is = 4 omega2 = 7.7513e-07 - ik_interpolate = 32 is = 5 omega2 = 8.5179e-07 - ik_interpolate = 32 is = 6 omega2 = 9.9302e-07 - - ik_interpolate = 33 is = 1 omega2 = 3.3307e-07 - ik_interpolate = 33 is = 2 omega2 = 3.3307e-07 - ik_interpolate = 33 is = 3 omega2 = 7.0191e-07 - ik_interpolate = 33 is = 4 omega2 = 8.2741e-07 - ik_interpolate = 33 is = 5 omega2 = 8.2741e-07 - ik_interpolate = 33 is = 6 omega2 = 9.9002e-07 - - ik_interpolate = 34 is = 1 omega2 = 1.7337e-07 - ik_interpolate = 34 is = 2 omega2 = 1.9599e-07 - ik_interpolate = 34 is = 3 omega2 = 2.8282e-07 - ik_interpolate = 34 is = 4 omega2 = 7.7513e-07 - ik_interpolate = 34 is = 5 omega2 = 8.5179e-07 - ik_interpolate = 34 is = 6 omega2 = 9.9302e-07 - - ik_interpolate = 35 is = 1 omega2 = 6.3968e-08 - ik_interpolate = 35 is = 2 omega2 = 6.3968e-08 - ik_interpolate = 35 is = 3 omega2 = 1.1572e-07 - ik_interpolate = 35 is = 4 omega2 = 6.5720e-07 - ik_interpolate = 35 is = 5 omega2 = 6.5720e-07 - ik_interpolate = 35 is = 6 omega2 = 7.4614e-07 - - ik_interpolate = 36 is = 1 omega2 = 1.7337e-07 - ik_interpolate = 36 is = 2 omega2 = 1.9599e-07 - ik_interpolate = 36 is = 3 omega2 = 2.8282e-07 - ik_interpolate = 36 is = 4 omega2 = 7.7513e-07 - ik_interpolate = 36 is = 5 omega2 = 8.5179e-07 - ik_interpolate = 36 is = 6 omega2 = 9.9302e-07 - - ik_interpolate = 37 is = 1 omega2 = 1.7337e-07 - ik_interpolate = 37 is = 2 omega2 = 1.9599e-07 - ik_interpolate = 37 is = 3 omega2 = 2.8282e-07 - ik_interpolate = 37 is = 4 omega2 = 7.7513e-07 - ik_interpolate = 37 is = 5 omega2 = 8.5179e-07 - ik_interpolate = 37 is = 6 omega2 = 9.9302e-07 - - ik_interpolate = 38 is = 1 omega2 = 8.2074e-08 - ik_interpolate = 38 is = 2 omega2 = 3.1262e-07 - ik_interpolate = 38 is = 3 omega2 = 5.7929e-07 - ik_interpolate = 38 is = 4 omega2 = 6.8774e-07 - ik_interpolate = 38 is = 5 omega2 = 7.9247e-07 - ik_interpolate = 38 is = 6 omega2 = 9.3830e-07 - - ik_interpolate = 39 is = 1 omega2 = 1.7337e-07 - ik_interpolate = 39 is = 2 omega2 = 1.9599e-07 - ik_interpolate = 39 is = 3 omega2 = 2.8282e-07 - ik_interpolate = 39 is = 4 omega2 = 7.7513e-07 - ik_interpolate = 39 is = 5 omega2 = 8.5179e-07 - ik_interpolate = 39 is = 6 omega2 = 9.9302e-07 - - ik_interpolate = 40 is = 1 omega2 = 1.0249e-07 - ik_interpolate = 40 is = 2 omega2 = 1.0249e-07 - ik_interpolate = 40 is = 3 omega2 = 4.2019e-07 - ik_interpolate = 40 is = 4 omega2 = 7.1954e-07 - ik_interpolate = 40 is = 5 omega2 = 7.1954e-07 - ik_interpolate = 40 is = 6 omega2 = 8.6238e-07 - - ik_interpolate = 41 is = 1 omega2 = 6.3968e-08 - ik_interpolate = 41 is = 2 omega2 = 6.3968e-08 - ik_interpolate = 41 is = 3 omega2 = 1.1572e-07 - ik_interpolate = 41 is = 4 omega2 = 6.5720e-07 - ik_interpolate = 41 is = 5 omega2 = 6.5720e-07 - ik_interpolate = 41 is = 6 omega2 = 7.4614e-07 - - ik_interpolate = 42 is = 1 omega2 = 1.7337e-07 - ik_interpolate = 42 is = 2 omega2 = 1.9599e-07 - ik_interpolate = 42 is = 3 omega2 = 2.8282e-07 - ik_interpolate = 42 is = 4 omega2 = 7.7513e-07 - ik_interpolate = 42 is = 5 omega2 = 8.5179e-07 - ik_interpolate = 42 is = 6 omega2 = 9.9302e-07 - - ik_interpolate = 43 is = 1 omega2 = 3.3307e-07 - ik_interpolate = 43 is = 2 omega2 = 3.3307e-07 - ik_interpolate = 43 is = 3 omega2 = 7.0191e-07 - ik_interpolate = 43 is = 4 omega2 = 8.2741e-07 - ik_interpolate = 43 is = 5 omega2 = 8.2741e-07 - ik_interpolate = 43 is = 6 omega2 = 9.9002e-07 - - ik_interpolate = 44 is = 1 omega2 = 1.7337e-07 - ik_interpolate = 44 is = 2 omega2 = 1.9599e-07 - ik_interpolate = 44 is = 3 omega2 = 2.8282e-07 - ik_interpolate = 44 is = 4 omega2 = 7.7513e-07 - ik_interpolate = 44 is = 5 omega2 = 8.5179e-07 - ik_interpolate = 44 is = 6 omega2 = 9.9302e-07 - - ik_interpolate = 45 is = 1 omega2 = 1.7337e-07 - ik_interpolate = 45 is = 2 omega2 = 1.9599e-07 - ik_interpolate = 45 is = 3 omega2 = 2.8282e-07 - ik_interpolate = 45 is = 4 omega2 = 7.7513e-07 - ik_interpolate = 45 is = 5 omega2 = 8.5179e-07 - ik_interpolate = 45 is = 6 omega2 = 9.9302e-07 - - ik_interpolate = 46 is = 1 omega2 = 1.0249e-07 - ik_interpolate = 46 is = 2 omega2 = 1.0249e-07 - ik_interpolate = 46 is = 3 omega2 = 4.2019e-07 - ik_interpolate = 46 is = 4 omega2 = 7.1954e-07 - ik_interpolate = 46 is = 5 omega2 = 7.1954e-07 - ik_interpolate = 46 is = 6 omega2 = 8.6238e-07 - - ik_interpolate = 47 is = 1 omega2 = 1.7337e-07 - ik_interpolate = 47 is = 2 omega2 = 1.9599e-07 - ik_interpolate = 47 is = 3 omega2 = 2.8282e-07 - ik_interpolate = 47 is = 4 omega2 = 7.7513e-07 - ik_interpolate = 47 is = 5 omega2 = 8.5179e-07 - ik_interpolate = 47 is = 6 omega2 = 9.9302e-07 - - ik_interpolate = 48 is = 1 omega2 = 8.2074e-08 - ik_interpolate = 48 is = 2 omega2 = 3.1262e-07 - ik_interpolate = 48 is = 3 omega2 = 5.7929e-07 - ik_interpolate = 48 is = 4 omega2 = 6.8774e-07 - ik_interpolate = 48 is = 5 omega2 = 7.9247e-07 - ik_interpolate = 48 is = 6 omega2 = 9.3830e-07 - - ik_interpolate = 49 is = 1 omega2 = 1.5227e-07 - ik_interpolate = 49 is = 2 omega2 = 1.5227e-07 - ik_interpolate = 49 is = 3 omega2 = 2.6953e-07 - ik_interpolate = 49 is = 4 omega2 = 8.1361e-07 - ik_interpolate = 49 is = 5 omega2 = 8.1361e-07 - ik_interpolate = 49 is = 6 omega2 = 1.3121e-06 - - ik_interpolate = 50 is = 1 omega2 = 8.2074e-08 - ik_interpolate = 50 is = 2 omega2 = 3.1262e-07 - ik_interpolate = 50 is = 3 omega2 = 5.7929e-07 - ik_interpolate = 50 is = 4 omega2 = 6.8774e-07 - ik_interpolate = 50 is = 5 omega2 = 7.9247e-07 - ik_interpolate = 50 is = 6 omega2 = 9.3830e-07 - - ik_interpolate = 51 is = 1 omega2 = 1.7337e-07 - ik_interpolate = 51 is = 2 omega2 = 1.9599e-07 - ik_interpolate = 51 is = 3 omega2 = 2.8282e-07 - ik_interpolate = 51 is = 4 omega2 = 7.7513e-07 - ik_interpolate = 51 is = 5 omega2 = 8.5179e-07 - ik_interpolate = 51 is = 6 omega2 = 9.9302e-07 - - ik_interpolate = 52 is = 1 omega2 = 4.4208e-08 - ik_interpolate = 52 is = 2 omega2 = 4.4208e-08 - ik_interpolate = 52 is = 3 omega2 = 4.8333e-07 - ik_interpolate = 52 is = 4 omega2 = 6.0496e-07 - ik_interpolate = 52 is = 5 omega2 = 6.0496e-07 - ik_interpolate = 52 is = 6 omega2 = 8.7737e-07 - - ik_interpolate = 53 is = 1 omega2 = 8.2074e-08 - ik_interpolate = 53 is = 2 omega2 = 3.1262e-07 - ik_interpolate = 53 is = 3 omega2 = 5.7929e-07 - ik_interpolate = 53 is = 4 omega2 = 6.8774e-07 - ik_interpolate = 53 is = 5 omega2 = 7.9247e-07 - ik_interpolate = 53 is = 6 omega2 = 9.3830e-07 - - ik_interpolate = 54 is = 1 omega2 = 1.7337e-07 - ik_interpolate = 54 is = 2 omega2 = 1.9599e-07 - ik_interpolate = 54 is = 3 omega2 = 2.8282e-07 - ik_interpolate = 54 is = 4 omega2 = 7.7513e-07 - ik_interpolate = 54 is = 5 omega2 = 8.5179e-07 - ik_interpolate = 54 is = 6 omega2 = 9.9302e-07 - - ik_interpolate = 55 is = 1 omega2 = 1.0249e-07 - ik_interpolate = 55 is = 2 omega2 = 1.0249e-07 - ik_interpolate = 55 is = 3 omega2 = 4.2019e-07 - ik_interpolate = 55 is = 4 omega2 = 7.1954e-07 - ik_interpolate = 55 is = 5 omega2 = 7.1954e-07 - ik_interpolate = 55 is = 6 omega2 = 8.6238e-07 - - ik_interpolate = 56 is = 1 omega2 = 1.7337e-07 - ik_interpolate = 56 is = 2 omega2 = 1.9599e-07 - ik_interpolate = 56 is = 3 omega2 = 2.8282e-07 - ik_interpolate = 56 is = 4 omega2 = 7.7513e-07 - ik_interpolate = 56 is = 5 omega2 = 8.5179e-07 - ik_interpolate = 56 is = 6 omega2 = 9.9302e-07 - - ik_interpolate = 57 is = 1 omega2 = 1.7337e-07 - ik_interpolate = 57 is = 2 omega2 = 1.9599e-07 - ik_interpolate = 57 is = 3 omega2 = 2.8282e-07 - ik_interpolate = 57 is = 4 omega2 = 7.7513e-07 - ik_interpolate = 57 is = 5 omega2 = 8.5179e-07 - ik_interpolate = 57 is = 6 omega2 = 9.9302e-07 - - ik_interpolate = 58 is = 1 omega2 = 1.0249e-07 - ik_interpolate = 58 is = 2 omega2 = 1.0249e-07 - ik_interpolate = 58 is = 3 omega2 = 4.2019e-07 - ik_interpolate = 58 is = 4 omega2 = 7.1954e-07 - ik_interpolate = 58 is = 5 omega2 = 7.1954e-07 - ik_interpolate = 58 is = 6 omega2 = 8.6238e-07 - - ik_interpolate = 59 is = 1 omega2 = 1.7337e-07 - ik_interpolate = 59 is = 2 omega2 = 1.9599e-07 - ik_interpolate = 59 is = 3 omega2 = 2.8282e-07 - ik_interpolate = 59 is = 4 omega2 = 7.7513e-07 - ik_interpolate = 59 is = 5 omega2 = 8.5179e-07 - ik_interpolate = 59 is = 6 omega2 = 9.9302e-07 - - ik_interpolate = 60 is = 1 omega2 = 8.2074e-08 - ik_interpolate = 60 is = 2 omega2 = 3.1262e-07 - ik_interpolate = 60 is = 3 omega2 = 5.7929e-07 - ik_interpolate = 60 is = 4 omega2 = 6.8774e-07 - ik_interpolate = 60 is = 5 omega2 = 7.9247e-07 - ik_interpolate = 60 is = 6 omega2 = 9.3830e-07 - - ik_interpolate = 61 is = 1 omega2 = 4.4208e-08 - ik_interpolate = 61 is = 2 omega2 = 4.4208e-08 - ik_interpolate = 61 is = 3 omega2 = 4.8333e-07 - ik_interpolate = 61 is = 4 omega2 = 6.0496e-07 - ik_interpolate = 61 is = 5 omega2 = 6.0496e-07 - ik_interpolate = 61 is = 6 omega2 = 8.7737e-07 - - ik_interpolate = 62 is = 1 omega2 = 1.7337e-07 - ik_interpolate = 62 is = 2 omega2 = 1.9599e-07 - ik_interpolate = 62 is = 3 omega2 = 2.8282e-07 - ik_interpolate = 62 is = 4 omega2 = 7.7513e-07 - ik_interpolate = 62 is = 5 omega2 = 8.5179e-07 - ik_interpolate = 62 is = 6 omega2 = 9.9302e-07 - - ik_interpolate = 63 is = 1 omega2 = 8.2074e-08 - ik_interpolate = 63 is = 2 omega2 = 3.1262e-07 - ik_interpolate = 63 is = 3 omega2 = 5.7929e-07 - ik_interpolate = 63 is = 4 omega2 = 6.8774e-07 - ik_interpolate = 63 is = 5 omega2 = 7.9247e-07 - ik_interpolate = 63 is = 6 omega2 = 9.3830e-07 - - ik_interpolate = 64 is = 1 omega2 = 1.5227e-07 - ik_interpolate = 64 is = 2 omega2 = 1.5227e-07 - ik_interpolate = 64 is = 3 omega2 = 2.6953e-07 - ik_interpolate = 64 is = 4 omega2 = 8.1361e-07 - ik_interpolate = 64 is = 5 omega2 = 8.1361e-07 - ik_interpolate = 64 is = 6 omega2 = 1.3121e-06 + ik_interpolate = 1 is = 1 omega2 = 5.5583e-22 + ik_interpolate = 1 is = 2 omega2 = 7.4115e-22 + ik_interpolate = 1 is = 3 omega2 = 7.9413e-22 + ik_interpolate = 1 is = 4 omega2 = 4.1427e-07 + ik_interpolate = 1 is = 5 omega2 = 4.1427e-07 + ik_interpolate = 1 is = 6 omega2 = 4.1427e-07 + + ik_interpolate = 2 is = 1 omega2 = 1.5224e-07 + ik_interpolate = 2 is = 2 omega2 = 1.5224e-07 + ik_interpolate = 2 is = 3 omega2 = 2.6952e-07 + ik_interpolate = 2 is = 4 omega2 = 8.1347e-07 + ik_interpolate = 2 is = 5 omega2 = 8.1347e-07 + ik_interpolate = 2 is = 6 omega2 = 1.3120e-06 + + ik_interpolate = 3 is = 1 omega2 = 3.3300e-07 + ik_interpolate = 3 is = 2 omega2 = 3.3300e-07 + ik_interpolate = 3 is = 3 omega2 = 7.0186e-07 + ik_interpolate = 3 is = 4 omega2 = 8.2734e-07 + ik_interpolate = 3 is = 5 omega2 = 8.2734e-07 + ik_interpolate = 3 is = 6 omega2 = 9.8994e-07 + + ik_interpolate = 4 is = 1 omega2 = 1.5224e-07 + ik_interpolate = 4 is = 2 omega2 = 1.5224e-07 + ik_interpolate = 4 is = 3 omega2 = 2.6952e-07 + ik_interpolate = 4 is = 4 omega2 = 8.1347e-07 + ik_interpolate = 4 is = 5 omega2 = 8.1347e-07 + ik_interpolate = 4 is = 6 omega2 = 1.3120e-06 + + ik_interpolate = 5 is = 1 omega2 = 1.5224e-07 + ik_interpolate = 5 is = 2 omega2 = 1.5224e-07 + ik_interpolate = 5 is = 3 omega2 = 2.6952e-07 + ik_interpolate = 5 is = 4 omega2 = 8.1347e-07 + ik_interpolate = 5 is = 5 omega2 = 8.1347e-07 + ik_interpolate = 5 is = 6 omega2 = 1.3120e-06 + + ik_interpolate = 6 is = 1 omega2 = 4.4204e-08 + ik_interpolate = 6 is = 2 omega2 = 4.4204e-08 + ik_interpolate = 6 is = 3 omega2 = 4.8327e-07 + ik_interpolate = 6 is = 4 omega2 = 6.0476e-07 + ik_interpolate = 6 is = 5 omega2 = 6.0476e-07 + ik_interpolate = 6 is = 6 omega2 = 8.7730e-07 + + ik_interpolate = 7 is = 1 omega2 = 1.7334e-07 + ik_interpolate = 7 is = 2 omega2 = 1.9596e-07 + ik_interpolate = 7 is = 3 omega2 = 2.8281e-07 + ik_interpolate = 7 is = 4 omega2 = 7.7499e-07 + ik_interpolate = 7 is = 5 omega2 = 8.5164e-07 + ik_interpolate = 7 is = 6 omega2 = 9.9288e-07 + + ik_interpolate = 8 is = 1 omega2 = 8.2072e-08 + ik_interpolate = 8 is = 2 omega2 = 3.1255e-07 + ik_interpolate = 8 is = 3 omega2 = 5.7923e-07 + ik_interpolate = 8 is = 4 omega2 = 6.8756e-07 + ik_interpolate = 8 is = 5 omega2 = 7.9239e-07 + ik_interpolate = 8 is = 6 omega2 = 9.3822e-07 + + ik_interpolate = 9 is = 1 omega2 = 3.3300e-07 + ik_interpolate = 9 is = 2 omega2 = 3.3300e-07 + ik_interpolate = 9 is = 3 omega2 = 7.0186e-07 + ik_interpolate = 9 is = 4 omega2 = 8.2734e-07 + ik_interpolate = 9 is = 5 omega2 = 8.2734e-07 + ik_interpolate = 9 is = 6 omega2 = 9.8994e-07 + + ik_interpolate = 10 is = 1 omega2 = 1.7334e-07 + ik_interpolate = 10 is = 2 omega2 = 1.9596e-07 + ik_interpolate = 10 is = 3 omega2 = 2.8281e-07 + ik_interpolate = 10 is = 4 omega2 = 7.7499e-07 + ik_interpolate = 10 is = 5 omega2 = 8.5164e-07 + ik_interpolate = 10 is = 6 omega2 = 9.9288e-07 + + ik_interpolate = 11 is = 1 omega2 = 6.3956e-08 + ik_interpolate = 11 is = 2 omega2 = 6.3956e-08 + ik_interpolate = 11 is = 3 omega2 = 1.1571e-07 + ik_interpolate = 11 is = 4 omega2 = 6.5701e-07 + ik_interpolate = 11 is = 5 omega2 = 6.5701e-07 + ik_interpolate = 11 is = 6 omega2 = 7.4596e-07 + + ik_interpolate = 12 is = 1 omega2 = 1.7334e-07 + ik_interpolate = 12 is = 2 omega2 = 1.9596e-07 + ik_interpolate = 12 is = 3 omega2 = 2.8281e-07 + ik_interpolate = 12 is = 4 omega2 = 7.7499e-07 + ik_interpolate = 12 is = 5 omega2 = 8.5164e-07 + ik_interpolate = 12 is = 6 omega2 = 9.9288e-07 + + ik_interpolate = 13 is = 1 omega2 = 1.5224e-07 + ik_interpolate = 13 is = 2 omega2 = 1.5224e-07 + ik_interpolate = 13 is = 3 omega2 = 2.6952e-07 + ik_interpolate = 13 is = 4 omega2 = 8.1347e-07 + ik_interpolate = 13 is = 5 omega2 = 8.1347e-07 + ik_interpolate = 13 is = 6 omega2 = 1.3120e-06 + + ik_interpolate = 14 is = 1 omega2 = 8.2072e-08 + ik_interpolate = 14 is = 2 omega2 = 3.1255e-07 + ik_interpolate = 14 is = 3 omega2 = 5.7923e-07 + ik_interpolate = 14 is = 4 omega2 = 6.8756e-07 + ik_interpolate = 14 is = 5 omega2 = 7.9239e-07 + ik_interpolate = 14 is = 6 omega2 = 9.3822e-07 + + ik_interpolate = 15 is = 1 omega2 = 1.7334e-07 + ik_interpolate = 15 is = 2 omega2 = 1.9596e-07 + ik_interpolate = 15 is = 3 omega2 = 2.8281e-07 + ik_interpolate = 15 is = 4 omega2 = 7.7499e-07 + ik_interpolate = 15 is = 5 omega2 = 8.5164e-07 + ik_interpolate = 15 is = 6 omega2 = 9.9288e-07 + + ik_interpolate = 16 is = 1 omega2 = 4.4204e-08 + ik_interpolate = 16 is = 2 omega2 = 4.4204e-08 + ik_interpolate = 16 is = 3 omega2 = 4.8327e-07 + ik_interpolate = 16 is = 4 omega2 = 6.0476e-07 + ik_interpolate = 16 is = 5 omega2 = 6.0476e-07 + ik_interpolate = 16 is = 6 omega2 = 8.7730e-07 + + ik_interpolate = 17 is = 1 omega2 = 1.5224e-07 + ik_interpolate = 17 is = 2 omega2 = 1.5224e-07 + ik_interpolate = 17 is = 3 omega2 = 2.6952e-07 + ik_interpolate = 17 is = 4 omega2 = 8.1347e-07 + ik_interpolate = 17 is = 5 omega2 = 8.1347e-07 + ik_interpolate = 17 is = 6 omega2 = 1.3120e-06 + + ik_interpolate = 18 is = 1 omega2 = 4.4204e-08 + ik_interpolate = 18 is = 2 omega2 = 4.4204e-08 + ik_interpolate = 18 is = 3 omega2 = 4.8327e-07 + ik_interpolate = 18 is = 4 omega2 = 6.0476e-07 + ik_interpolate = 18 is = 5 omega2 = 6.0476e-07 + ik_interpolate = 18 is = 6 omega2 = 8.7730e-07 + + ik_interpolate = 19 is = 1 omega2 = 1.7334e-07 + ik_interpolate = 19 is = 2 omega2 = 1.9596e-07 + ik_interpolate = 19 is = 3 omega2 = 2.8281e-07 + ik_interpolate = 19 is = 4 omega2 = 7.7499e-07 + ik_interpolate = 19 is = 5 omega2 = 8.5164e-07 + ik_interpolate = 19 is = 6 omega2 = 9.9288e-07 + + ik_interpolate = 20 is = 1 omega2 = 8.2072e-08 + ik_interpolate = 20 is = 2 omega2 = 3.1255e-07 + ik_interpolate = 20 is = 3 omega2 = 5.7923e-07 + ik_interpolate = 20 is = 4 omega2 = 6.8756e-07 + ik_interpolate = 20 is = 5 omega2 = 7.9239e-07 + ik_interpolate = 20 is = 6 omega2 = 9.3822e-07 + + ik_interpolate = 21 is = 1 omega2 = 4.4204e-08 + ik_interpolate = 21 is = 2 omega2 = 4.4204e-08 + ik_interpolate = 21 is = 3 omega2 = 4.8327e-07 + ik_interpolate = 21 is = 4 omega2 = 6.0476e-07 + ik_interpolate = 21 is = 5 omega2 = 6.0476e-07 + ik_interpolate = 21 is = 6 omega2 = 8.7730e-07 + + ik_interpolate = 22 is = 1 omega2 = 1.5224e-07 + ik_interpolate = 22 is = 2 omega2 = 1.5224e-07 + ik_interpolate = 22 is = 3 omega2 = 2.6952e-07 + ik_interpolate = 22 is = 4 omega2 = 8.1347e-07 + ik_interpolate = 22 is = 5 omega2 = 8.1347e-07 + ik_interpolate = 22 is = 6 omega2 = 1.3120e-06 + + ik_interpolate = 23 is = 1 omega2 = 8.2072e-08 + ik_interpolate = 23 is = 2 omega2 = 3.1255e-07 + ik_interpolate = 23 is = 3 omega2 = 5.7923e-07 + ik_interpolate = 23 is = 4 omega2 = 6.8756e-07 + ik_interpolate = 23 is = 5 omega2 = 7.9239e-07 + ik_interpolate = 23 is = 6 omega2 = 9.3822e-07 + + ik_interpolate = 24 is = 1 omega2 = 1.7334e-07 + ik_interpolate = 24 is = 2 omega2 = 1.9596e-07 + ik_interpolate = 24 is = 3 omega2 = 2.8281e-07 + ik_interpolate = 24 is = 4 omega2 = 7.7499e-07 + ik_interpolate = 24 is = 5 omega2 = 8.5164e-07 + ik_interpolate = 24 is = 6 omega2 = 9.9288e-07 + + ik_interpolate = 25 is = 1 omega2 = 1.7334e-07 + ik_interpolate = 25 is = 2 omega2 = 1.9596e-07 + ik_interpolate = 25 is = 3 omega2 = 2.8281e-07 + ik_interpolate = 25 is = 4 omega2 = 7.7499e-07 + ik_interpolate = 25 is = 5 omega2 = 8.5164e-07 + ik_interpolate = 25 is = 6 omega2 = 9.9288e-07 + + ik_interpolate = 26 is = 1 omega2 = 8.2072e-08 + ik_interpolate = 26 is = 2 omega2 = 3.1255e-07 + ik_interpolate = 26 is = 3 omega2 = 5.7923e-07 + ik_interpolate = 26 is = 4 omega2 = 6.8756e-07 + ik_interpolate = 26 is = 5 omega2 = 7.9239e-07 + ik_interpolate = 26 is = 6 omega2 = 9.3822e-07 + + ik_interpolate = 27 is = 1 omega2 = 1.7334e-07 + ik_interpolate = 27 is = 2 omega2 = 1.9596e-07 + ik_interpolate = 27 is = 3 omega2 = 2.8281e-07 + ik_interpolate = 27 is = 4 omega2 = 7.7499e-07 + ik_interpolate = 27 is = 5 omega2 = 8.5164e-07 + ik_interpolate = 27 is = 6 omega2 = 9.9288e-07 + + ik_interpolate = 28 is = 1 omega2 = 1.0248e-07 + ik_interpolate = 28 is = 2 omega2 = 1.0248e-07 + ik_interpolate = 28 is = 3 omega2 = 4.2013e-07 + ik_interpolate = 28 is = 4 omega2 = 7.1936e-07 + ik_interpolate = 28 is = 5 omega2 = 7.1936e-07 + ik_interpolate = 28 is = 6 omega2 = 8.6229e-07 + + ik_interpolate = 29 is = 1 omega2 = 8.2072e-08 + ik_interpolate = 29 is = 2 omega2 = 3.1255e-07 + ik_interpolate = 29 is = 3 omega2 = 5.7923e-07 + ik_interpolate = 29 is = 4 omega2 = 6.8756e-07 + ik_interpolate = 29 is = 5 omega2 = 7.9239e-07 + ik_interpolate = 29 is = 6 omega2 = 9.3822e-07 + + ik_interpolate = 30 is = 1 omega2 = 1.7334e-07 + ik_interpolate = 30 is = 2 omega2 = 1.9596e-07 + ik_interpolate = 30 is = 3 omega2 = 2.8281e-07 + ik_interpolate = 30 is = 4 omega2 = 7.7499e-07 + ik_interpolate = 30 is = 5 omega2 = 8.5164e-07 + ik_interpolate = 30 is = 6 omega2 = 9.9288e-07 + + ik_interpolate = 31 is = 1 omega2 = 1.0248e-07 + ik_interpolate = 31 is = 2 omega2 = 1.0248e-07 + ik_interpolate = 31 is = 3 omega2 = 4.2013e-07 + ik_interpolate = 31 is = 4 omega2 = 7.1936e-07 + ik_interpolate = 31 is = 5 omega2 = 7.1936e-07 + ik_interpolate = 31 is = 6 omega2 = 8.6229e-07 + + ik_interpolate = 32 is = 1 omega2 = 1.7334e-07 + ik_interpolate = 32 is = 2 omega2 = 1.9596e-07 + ik_interpolate = 32 is = 3 omega2 = 2.8281e-07 + ik_interpolate = 32 is = 4 omega2 = 7.7499e-07 + ik_interpolate = 32 is = 5 omega2 = 8.5164e-07 + ik_interpolate = 32 is = 6 omega2 = 9.9288e-07 + + ik_interpolate = 33 is = 1 omega2 = 3.3300e-07 + ik_interpolate = 33 is = 2 omega2 = 3.3300e-07 + ik_interpolate = 33 is = 3 omega2 = 7.0186e-07 + ik_interpolate = 33 is = 4 omega2 = 8.2734e-07 + ik_interpolate = 33 is = 5 omega2 = 8.2734e-07 + ik_interpolate = 33 is = 6 omega2 = 9.8994e-07 + + ik_interpolate = 34 is = 1 omega2 = 1.7334e-07 + ik_interpolate = 34 is = 2 omega2 = 1.9596e-07 + ik_interpolate = 34 is = 3 omega2 = 2.8281e-07 + ik_interpolate = 34 is = 4 omega2 = 7.7499e-07 + ik_interpolate = 34 is = 5 omega2 = 8.5164e-07 + ik_interpolate = 34 is = 6 omega2 = 9.9288e-07 + + ik_interpolate = 35 is = 1 omega2 = 6.3956e-08 + ik_interpolate = 35 is = 2 omega2 = 6.3956e-08 + ik_interpolate = 35 is = 3 omega2 = 1.1571e-07 + ik_interpolate = 35 is = 4 omega2 = 6.5701e-07 + ik_interpolate = 35 is = 5 omega2 = 6.5701e-07 + ik_interpolate = 35 is = 6 omega2 = 7.4596e-07 + + ik_interpolate = 36 is = 1 omega2 = 1.7334e-07 + ik_interpolate = 36 is = 2 omega2 = 1.9596e-07 + ik_interpolate = 36 is = 3 omega2 = 2.8281e-07 + ik_interpolate = 36 is = 4 omega2 = 7.7499e-07 + ik_interpolate = 36 is = 5 omega2 = 8.5164e-07 + ik_interpolate = 36 is = 6 omega2 = 9.9288e-07 + + ik_interpolate = 37 is = 1 omega2 = 1.7334e-07 + ik_interpolate = 37 is = 2 omega2 = 1.9596e-07 + ik_interpolate = 37 is = 3 omega2 = 2.8281e-07 + ik_interpolate = 37 is = 4 omega2 = 7.7499e-07 + ik_interpolate = 37 is = 5 omega2 = 8.5164e-07 + ik_interpolate = 37 is = 6 omega2 = 9.9288e-07 + + ik_interpolate = 38 is = 1 omega2 = 8.2072e-08 + ik_interpolate = 38 is = 2 omega2 = 3.1255e-07 + ik_interpolate = 38 is = 3 omega2 = 5.7923e-07 + ik_interpolate = 38 is = 4 omega2 = 6.8756e-07 + ik_interpolate = 38 is = 5 omega2 = 7.9239e-07 + ik_interpolate = 38 is = 6 omega2 = 9.3822e-07 + + ik_interpolate = 39 is = 1 omega2 = 1.7334e-07 + ik_interpolate = 39 is = 2 omega2 = 1.9596e-07 + ik_interpolate = 39 is = 3 omega2 = 2.8281e-07 + ik_interpolate = 39 is = 4 omega2 = 7.7499e-07 + ik_interpolate = 39 is = 5 omega2 = 8.5164e-07 + ik_interpolate = 39 is = 6 omega2 = 9.9288e-07 + + ik_interpolate = 40 is = 1 omega2 = 1.0248e-07 + ik_interpolate = 40 is = 2 omega2 = 1.0248e-07 + ik_interpolate = 40 is = 3 omega2 = 4.2013e-07 + ik_interpolate = 40 is = 4 omega2 = 7.1936e-07 + ik_interpolate = 40 is = 5 omega2 = 7.1936e-07 + ik_interpolate = 40 is = 6 omega2 = 8.6229e-07 + + ik_interpolate = 41 is = 1 omega2 = 6.3956e-08 + ik_interpolate = 41 is = 2 omega2 = 6.3956e-08 + ik_interpolate = 41 is = 3 omega2 = 1.1571e-07 + ik_interpolate = 41 is = 4 omega2 = 6.5701e-07 + ik_interpolate = 41 is = 5 omega2 = 6.5701e-07 + ik_interpolate = 41 is = 6 omega2 = 7.4596e-07 + + ik_interpolate = 42 is = 1 omega2 = 1.7334e-07 + ik_interpolate = 42 is = 2 omega2 = 1.9596e-07 + ik_interpolate = 42 is = 3 omega2 = 2.8281e-07 + ik_interpolate = 42 is = 4 omega2 = 7.7499e-07 + ik_interpolate = 42 is = 5 omega2 = 8.5164e-07 + ik_interpolate = 42 is = 6 omega2 = 9.9288e-07 + + ik_interpolate = 43 is = 1 omega2 = 3.3300e-07 + ik_interpolate = 43 is = 2 omega2 = 3.3300e-07 + ik_interpolate = 43 is = 3 omega2 = 7.0186e-07 + ik_interpolate = 43 is = 4 omega2 = 8.2734e-07 + ik_interpolate = 43 is = 5 omega2 = 8.2734e-07 + ik_interpolate = 43 is = 6 omega2 = 9.8994e-07 + + ik_interpolate = 44 is = 1 omega2 = 1.7334e-07 + ik_interpolate = 44 is = 2 omega2 = 1.9596e-07 + ik_interpolate = 44 is = 3 omega2 = 2.8281e-07 + ik_interpolate = 44 is = 4 omega2 = 7.7499e-07 + ik_interpolate = 44 is = 5 omega2 = 8.5164e-07 + ik_interpolate = 44 is = 6 omega2 = 9.9288e-07 + + ik_interpolate = 45 is = 1 omega2 = 1.7334e-07 + ik_interpolate = 45 is = 2 omega2 = 1.9596e-07 + ik_interpolate = 45 is = 3 omega2 = 2.8281e-07 + ik_interpolate = 45 is = 4 omega2 = 7.7499e-07 + ik_interpolate = 45 is = 5 omega2 = 8.5164e-07 + ik_interpolate = 45 is = 6 omega2 = 9.9288e-07 + + ik_interpolate = 46 is = 1 omega2 = 1.0248e-07 + ik_interpolate = 46 is = 2 omega2 = 1.0248e-07 + ik_interpolate = 46 is = 3 omega2 = 4.2013e-07 + ik_interpolate = 46 is = 4 omega2 = 7.1936e-07 + ik_interpolate = 46 is = 5 omega2 = 7.1936e-07 + ik_interpolate = 46 is = 6 omega2 = 8.6229e-07 + + ik_interpolate = 47 is = 1 omega2 = 1.7334e-07 + ik_interpolate = 47 is = 2 omega2 = 1.9596e-07 + ik_interpolate = 47 is = 3 omega2 = 2.8281e-07 + ik_interpolate = 47 is = 4 omega2 = 7.7499e-07 + ik_interpolate = 47 is = 5 omega2 = 8.5164e-07 + ik_interpolate = 47 is = 6 omega2 = 9.9288e-07 + + ik_interpolate = 48 is = 1 omega2 = 8.2072e-08 + ik_interpolate = 48 is = 2 omega2 = 3.1255e-07 + ik_interpolate = 48 is = 3 omega2 = 5.7923e-07 + ik_interpolate = 48 is = 4 omega2 = 6.8756e-07 + ik_interpolate = 48 is = 5 omega2 = 7.9239e-07 + ik_interpolate = 48 is = 6 omega2 = 9.3822e-07 + + ik_interpolate = 49 is = 1 omega2 = 1.5224e-07 + ik_interpolate = 49 is = 2 omega2 = 1.5224e-07 + ik_interpolate = 49 is = 3 omega2 = 2.6952e-07 + ik_interpolate = 49 is = 4 omega2 = 8.1347e-07 + ik_interpolate = 49 is = 5 omega2 = 8.1347e-07 + ik_interpolate = 49 is = 6 omega2 = 1.3120e-06 + + ik_interpolate = 50 is = 1 omega2 = 8.2072e-08 + ik_interpolate = 50 is = 2 omega2 = 3.1255e-07 + ik_interpolate = 50 is = 3 omega2 = 5.7923e-07 + ik_interpolate = 50 is = 4 omega2 = 6.8756e-07 + ik_interpolate = 50 is = 5 omega2 = 7.9239e-07 + ik_interpolate = 50 is = 6 omega2 = 9.3822e-07 + + ik_interpolate = 51 is = 1 omega2 = 1.7334e-07 + ik_interpolate = 51 is = 2 omega2 = 1.9596e-07 + ik_interpolate = 51 is = 3 omega2 = 2.8281e-07 + ik_interpolate = 51 is = 4 omega2 = 7.7499e-07 + ik_interpolate = 51 is = 5 omega2 = 8.5164e-07 + ik_interpolate = 51 is = 6 omega2 = 9.9288e-07 + + ik_interpolate = 52 is = 1 omega2 = 4.4204e-08 + ik_interpolate = 52 is = 2 omega2 = 4.4204e-08 + ik_interpolate = 52 is = 3 omega2 = 4.8327e-07 + ik_interpolate = 52 is = 4 omega2 = 6.0476e-07 + ik_interpolate = 52 is = 5 omega2 = 6.0476e-07 + ik_interpolate = 52 is = 6 omega2 = 8.7730e-07 + + ik_interpolate = 53 is = 1 omega2 = 8.2072e-08 + ik_interpolate = 53 is = 2 omega2 = 3.1255e-07 + ik_interpolate = 53 is = 3 omega2 = 5.7923e-07 + ik_interpolate = 53 is = 4 omega2 = 6.8756e-07 + ik_interpolate = 53 is = 5 omega2 = 7.9239e-07 + ik_interpolate = 53 is = 6 omega2 = 9.3822e-07 + + ik_interpolate = 54 is = 1 omega2 = 1.7334e-07 + ik_interpolate = 54 is = 2 omega2 = 1.9596e-07 + ik_interpolate = 54 is = 3 omega2 = 2.8281e-07 + ik_interpolate = 54 is = 4 omega2 = 7.7499e-07 + ik_interpolate = 54 is = 5 omega2 = 8.5164e-07 + ik_interpolate = 54 is = 6 omega2 = 9.9288e-07 + + ik_interpolate = 55 is = 1 omega2 = 1.0248e-07 + ik_interpolate = 55 is = 2 omega2 = 1.0248e-07 + ik_interpolate = 55 is = 3 omega2 = 4.2013e-07 + ik_interpolate = 55 is = 4 omega2 = 7.1936e-07 + ik_interpolate = 55 is = 5 omega2 = 7.1936e-07 + ik_interpolate = 55 is = 6 omega2 = 8.6229e-07 + + ik_interpolate = 56 is = 1 omega2 = 1.7334e-07 + ik_interpolate = 56 is = 2 omega2 = 1.9596e-07 + ik_interpolate = 56 is = 3 omega2 = 2.8281e-07 + ik_interpolate = 56 is = 4 omega2 = 7.7499e-07 + ik_interpolate = 56 is = 5 omega2 = 8.5164e-07 + ik_interpolate = 56 is = 6 omega2 = 9.9288e-07 + + ik_interpolate = 57 is = 1 omega2 = 1.7334e-07 + ik_interpolate = 57 is = 2 omega2 = 1.9596e-07 + ik_interpolate = 57 is = 3 omega2 = 2.8281e-07 + ik_interpolate = 57 is = 4 omega2 = 7.7499e-07 + ik_interpolate = 57 is = 5 omega2 = 8.5164e-07 + ik_interpolate = 57 is = 6 omega2 = 9.9288e-07 + + ik_interpolate = 58 is = 1 omega2 = 1.0248e-07 + ik_interpolate = 58 is = 2 omega2 = 1.0248e-07 + ik_interpolate = 58 is = 3 omega2 = 4.2013e-07 + ik_interpolate = 58 is = 4 omega2 = 7.1936e-07 + ik_interpolate = 58 is = 5 omega2 = 7.1936e-07 + ik_interpolate = 58 is = 6 omega2 = 8.6229e-07 + + ik_interpolate = 59 is = 1 omega2 = 1.7334e-07 + ik_interpolate = 59 is = 2 omega2 = 1.9596e-07 + ik_interpolate = 59 is = 3 omega2 = 2.8281e-07 + ik_interpolate = 59 is = 4 omega2 = 7.7499e-07 + ik_interpolate = 59 is = 5 omega2 = 8.5164e-07 + ik_interpolate = 59 is = 6 omega2 = 9.9288e-07 + + ik_interpolate = 60 is = 1 omega2 = 8.2072e-08 + ik_interpolate = 60 is = 2 omega2 = 3.1255e-07 + ik_interpolate = 60 is = 3 omega2 = 5.7923e-07 + ik_interpolate = 60 is = 4 omega2 = 6.8756e-07 + ik_interpolate = 60 is = 5 omega2 = 7.9239e-07 + ik_interpolate = 60 is = 6 omega2 = 9.3822e-07 + + ik_interpolate = 61 is = 1 omega2 = 4.4204e-08 + ik_interpolate = 61 is = 2 omega2 = 4.4204e-08 + ik_interpolate = 61 is = 3 omega2 = 4.8327e-07 + ik_interpolate = 61 is = 4 omega2 = 6.0476e-07 + ik_interpolate = 61 is = 5 omega2 = 6.0476e-07 + ik_interpolate = 61 is = 6 omega2 = 8.7730e-07 + + ik_interpolate = 62 is = 1 omega2 = 1.7334e-07 + ik_interpolate = 62 is = 2 omega2 = 1.9596e-07 + ik_interpolate = 62 is = 3 omega2 = 2.8281e-07 + ik_interpolate = 62 is = 4 omega2 = 7.7499e-07 + ik_interpolate = 62 is = 5 omega2 = 8.5164e-07 + ik_interpolate = 62 is = 6 omega2 = 9.9288e-07 + + ik_interpolate = 63 is = 1 omega2 = 8.2072e-08 + ik_interpolate = 63 is = 2 omega2 = 3.1255e-07 + ik_interpolate = 63 is = 3 omega2 = 5.7923e-07 + ik_interpolate = 63 is = 4 omega2 = 6.8756e-07 + ik_interpolate = 63 is = 5 omega2 = 7.9239e-07 + ik_interpolate = 63 is = 6 omega2 = 9.3822e-07 + + ik_interpolate = 64 is = 1 omega2 = 1.5224e-07 + ik_interpolate = 64 is = 2 omega2 = 1.5224e-07 + ik_interpolate = 64 is = 3 omega2 = 2.6952e-07 + ik_interpolate = 64 is = 4 omega2 = 8.1347e-07 + ik_interpolate = 64 is = 5 omega2 = 8.1347e-07 + ik_interpolate = 64 is = 6 omega2 = 1.3120e-06 Temperature = 9.0000e+02 K SCPH ITER 1 : DIFF = N/A - SCPH ITER 2 : DIFF = 1.4253e-07 - SCPH ITER 3 : DIFF = 1.2527e-07 - SCPH ITER 4 : DIFF = 1.1010e-07 - SCPH ITER 5 : DIFF = 9.6775e-08 - SCPH ITER 6 : DIFF = 8.5065e-08 - SCPH ITER 7 : DIFF = 7.4774e-08 - SCPH ITER 8 : DIFF = 6.5731e-08 - SCPH ITER 9 : DIFF = 5.7783e-08 - SCPH ITER 10 : DIFF = 5.0797e-08 - SCPH ITER 11 : DIFF = 4.4657e-08 - SCPH ITER 12 : DIFF = 3.9259e-08 - SCPH ITER 13 : DIFF = 3.4515e-08 - SCPH ITER 14 : DIFF = 3.0344e-08 - SCPH ITER 15 : DIFF = 2.6678e-08 - SCPH ITER 16 : DIFF = 2.3455e-08 - SCPH ITER 17 : DIFF = 2.0621e-08 - SCPH ITER 18 : DIFF = 1.8130e-08 - SCPH ITER 19 : DIFF = 1.5940e-08 - SCPH ITER 20 : DIFF = 1.4015e-08 - SCPH ITER 21 : DIFF = 1.2322e-08 - SCPH ITER 22 : DIFF = 1.0834e-08 - SCPH ITER 23 : DIFF = 9.5253e-09 + SCPH ITER 2 : DIFF = 1.4098e-07 + SCPH ITER 3 : DIFF = 1.2390e-07 + SCPH ITER 4 : DIFF = 1.0890e-07 + SCPH ITER 5 : DIFF = 9.5721e-08 + SCPH ITER 6 : DIFF = 8.4139e-08 + SCPH ITER 7 : DIFF = 7.3960e-08 + SCPH ITER 8 : DIFF = 6.5016e-08 + SCPH ITER 9 : DIFF = 5.7154e-08 + SCPH ITER 10 : DIFF = 5.0244e-08 + SCPH ITER 11 : DIFF = 4.4171e-08 + SCPH ITER 12 : DIFF = 3.8833e-08 + SCPH ITER 13 : DIFF = 3.4140e-08 + SCPH ITER 14 : DIFF = 3.0014e-08 + SCPH ITER 15 : DIFF = 2.6388e-08 + SCPH ITER 16 : DIFF = 2.3200e-08 + SCPH ITER 17 : DIFF = 2.0397e-08 + SCPH ITER 18 : DIFF = 1.7933e-08 + SCPH ITER 19 : DIFF = 1.5767e-08 + SCPH ITER 20 : DIFF = 1.3862e-08 + SCPH ITER 21 : DIFF = 1.2188e-08 + SCPH ITER 22 : DIFF = 1.0716e-08 + SCPH ITER 23 : DIFF = 9.4217e-09 + SCPH ITER 24 : DIFF = 8.2838e-09 + SCPH ITER 25 : DIFF = 7.2833e-09 + SCPH ITER 26 : DIFF = 6.4037e-09 + SCPH ITER 27 : DIFF = 5.6303e-09 + SCPH ITER 28 : DIFF = 4.9503e-09 + SCPH ITER 29 : DIFF = 4.3524e-09 + SCPH ITER 30 : DIFF = 3.8268e-09 + SCPH ITER 31 : DIFF = 3.3646e-09 + SCPH ITER 32 : DIFF = 2.9583e-09 + SCPH ITER 33 : DIFF = 2.6010e-09 + SCPH ITER 34 : DIFF = 2.2869e-09 + SCPH ITER 35 : DIFF = 2.0107e-09 + SCPH ITER 36 : DIFF = 1.7678e-09 + SCPH ITER 37 : DIFF = 1.5543e-09 + SCPH ITER 38 : DIFF = 1.3666e-09 + SCPH ITER 39 : DIFF = 1.2015e-09 + SCPH ITER 40 : DIFF = 1.0564e-09 + SCPH ITER 41 : DIFF = 9.2883e-10 + SCPH ITER 42 : DIFF = 8.1665e-10 + SCPH ITER 43 : DIFF = 7.1801e-10 + SCPH ITER 44 : DIFF = 6.3129e-10 + SCPH ITER 45 : DIFF = 5.5504e-10 + SCPH ITER 46 : DIFF = 4.8800e-10 + SCPH ITER 47 : DIFF = 4.2906e-10 + SCPH ITER 48 : DIFF = 3.7723e-10 + SCPH ITER 49 : DIFF = 3.3166e-10 + SCPH ITER 50 : DIFF = 2.9160e-10 + SCPH ITER 51 : DIFF = 2.5638e-10 + SCPH ITER 52 : DIFF = 2.2542e-10 + SCPH ITER 53 : DIFF = 1.9818e-10 + SCPH ITER 54 : DIFF = 1.7424e-10 + SCPH ITER 55 : DIFF = 1.5321e-10 + SCPH ITER 56 : DIFF = 1.3471e-10 + SCPH ITER 57 : DIFF = 1.1845e-10 + SCPH ITER 58 : DIFF = 1.0416e-10 + SCPH ITER 59 : DIFF = 9.1577e-11 DIFF < SCPH_TOL : break SCPH loop - Temp = 9.0000e+02 : convergence achieved in 23 iterations. + Temp = 9.0000e+02 : convergence achieved in 59 iterations. New eigenvalues - ik_interpolate = 1 is = 1 omega2 = 1.1047e-22 - ik_interpolate = 1 is = 2 omega2 = 1.6441e-22 - ik_interpolate = 1 is = 3 omega2 = 2.5451e-22 - ik_interpolate = 1 is = 4 omega2 = 3.9131e-07 - ik_interpolate = 1 is = 5 omega2 = 3.9131e-07 - ik_interpolate = 1 is = 6 omega2 = 3.9131e-07 - - ik_interpolate = 2 is = 1 omega2 = 1.5001e-07 - ik_interpolate = 2 is = 2 omega2 = 1.5001e-07 - ik_interpolate = 2 is = 3 omega2 = 2.6883e-07 - ik_interpolate = 2 is = 4 omega2 = 8.0034e-07 - ik_interpolate = 2 is = 5 omega2 = 8.0034e-07 - ik_interpolate = 2 is = 6 omega2 = 1.2987e-06 - - ik_interpolate = 3 is = 1 omega2 = 3.2790e-07 - ik_interpolate = 3 is = 2 omega2 = 3.2790e-07 - ik_interpolate = 3 is = 3 omega2 = 7.0053e-07 - ik_interpolate = 3 is = 4 omega2 = 8.2355e-07 - ik_interpolate = 3 is = 5 omega2 = 8.2355e-07 - ik_interpolate = 3 is = 6 omega2 = 9.8498e-07 - - ik_interpolate = 4 is = 1 omega2 = 1.5001e-07 - ik_interpolate = 4 is = 2 omega2 = 1.5001e-07 - ik_interpolate = 4 is = 3 omega2 = 2.6883e-07 - ik_interpolate = 4 is = 4 omega2 = 8.0034e-07 - ik_interpolate = 4 is = 5 omega2 = 8.0034e-07 - ik_interpolate = 4 is = 6 omega2 = 1.2987e-06 - - ik_interpolate = 5 is = 1 omega2 = 1.5001e-07 - ik_interpolate = 5 is = 2 omega2 = 1.5001e-07 - ik_interpolate = 5 is = 3 omega2 = 2.6883e-07 - ik_interpolate = 5 is = 4 omega2 = 8.0034e-07 - ik_interpolate = 5 is = 5 omega2 = 8.0034e-07 - ik_interpolate = 5 is = 6 omega2 = 1.2987e-06 - - ik_interpolate = 6 is = 1 omega2 = 4.3992e-08 - ik_interpolate = 6 is = 2 omega2 = 4.3992e-08 - ik_interpolate = 6 is = 3 omega2 = 4.7735e-07 - ik_interpolate = 6 is = 4 omega2 = 5.8524e-07 - ik_interpolate = 6 is = 5 omega2 = 5.8524e-07 - ik_interpolate = 6 is = 6 omega2 = 8.7344e-07 - - ik_interpolate = 7 is = 1 omega2 = 1.7117e-07 - ik_interpolate = 7 is = 2 omega2 = 1.9316e-07 + ik_interpolate = 1 is = 1 omega2 = 2.4953e-22 + ik_interpolate = 1 is = 2 omega2 = 3.3233e-22 + ik_interpolate = 1 is = 3 omega2 = 4.2400e-22 + ik_interpolate = 1 is = 4 omega2 = 3.9155e-07 + ik_interpolate = 1 is = 5 omega2 = 3.9155e-07 + ik_interpolate = 1 is = 6 omega2 = 3.9155e-07 + + ik_interpolate = 2 is = 1 omega2 = 1.5004e-07 + ik_interpolate = 2 is = 2 omega2 = 1.5004e-07 + ik_interpolate = 2 is = 3 omega2 = 2.6885e-07 + ik_interpolate = 2 is = 4 omega2 = 8.0049e-07 + ik_interpolate = 2 is = 5 omega2 = 8.0049e-07 + ik_interpolate = 2 is = 6 omega2 = 1.2988e-06 + + ik_interpolate = 3 is = 1 omega2 = 3.2797e-07 + ik_interpolate = 3 is = 2 omega2 = 3.2797e-07 + ik_interpolate = 3 is = 3 omega2 = 7.0057e-07 + ik_interpolate = 3 is = 4 omega2 = 8.2362e-07 + ik_interpolate = 3 is = 5 omega2 = 8.2362e-07 + ik_interpolate = 3 is = 6 omega2 = 9.8506e-07 + + ik_interpolate = 4 is = 1 omega2 = 1.5004e-07 + ik_interpolate = 4 is = 2 omega2 = 1.5004e-07 + ik_interpolate = 4 is = 3 omega2 = 2.6885e-07 + ik_interpolate = 4 is = 4 omega2 = 8.0049e-07 + ik_interpolate = 4 is = 5 omega2 = 8.0049e-07 + ik_interpolate = 4 is = 6 omega2 = 1.2988e-06 + + ik_interpolate = 5 is = 1 omega2 = 1.5004e-07 + ik_interpolate = 5 is = 2 omega2 = 1.5004e-07 + ik_interpolate = 5 is = 3 omega2 = 2.6885e-07 + ik_interpolate = 5 is = 4 omega2 = 8.0049e-07 + ik_interpolate = 5 is = 5 omega2 = 8.0049e-07 + ik_interpolate = 5 is = 6 omega2 = 1.2988e-06 + + ik_interpolate = 6 is = 1 omega2 = 4.3995e-08 + ik_interpolate = 6 is = 2 omega2 = 4.3995e-08 + ik_interpolate = 6 is = 3 omega2 = 4.7743e-07 + ik_interpolate = 6 is = 4 omega2 = 5.8545e-07 + ik_interpolate = 6 is = 5 omega2 = 5.8545e-07 + ik_interpolate = 6 is = 6 omega2 = 8.7351e-07 + + ik_interpolate = 7 is = 1 omega2 = 1.7119e-07 + ik_interpolate = 7 is = 2 omega2 = 1.9319e-07 ik_interpolate = 7 is = 3 omega2 = 2.8386e-07 - ik_interpolate = 7 is = 4 omega2 = 7.6237e-07 - ik_interpolate = 7 is = 5 omega2 = 8.3871e-07 - ik_interpolate = 7 is = 6 omega2 = 9.7995e-07 + ik_interpolate = 7 is = 4 omega2 = 7.6252e-07 + ik_interpolate = 7 is = 5 omega2 = 8.3887e-07 + ik_interpolate = 7 is = 6 omega2 = 9.8011e-07 ik_interpolate = 8 is = 1 omega2 = 8.2097e-08 - ik_interpolate = 8 is = 2 omega2 = 3.0680e-07 - ik_interpolate = 8 is = 3 omega2 = 5.7573e-07 - ik_interpolate = 8 is = 4 omega2 = 6.6964e-07 - ik_interpolate = 8 is = 5 omega2 = 7.8775e-07 - ik_interpolate = 8 is = 6 omega2 = 9.3332e-07 - - ik_interpolate = 9 is = 1 omega2 = 3.2790e-07 - ik_interpolate = 9 is = 2 omega2 = 3.2790e-07 - ik_interpolate = 9 is = 3 omega2 = 7.0053e-07 - ik_interpolate = 9 is = 4 omega2 = 8.2355e-07 - ik_interpolate = 9 is = 5 omega2 = 8.2355e-07 - ik_interpolate = 9 is = 6 omega2 = 9.8498e-07 - - ik_interpolate = 10 is = 1 omega2 = 1.7117e-07 - ik_interpolate = 10 is = 2 omega2 = 1.9316e-07 + ik_interpolate = 8 is = 2 omega2 = 3.0687e-07 + ik_interpolate = 8 is = 3 omega2 = 5.7578e-07 + ik_interpolate = 8 is = 4 omega2 = 6.6985e-07 + ik_interpolate = 8 is = 5 omega2 = 7.8783e-07 + ik_interpolate = 8 is = 6 omega2 = 9.3340e-07 + + ik_interpolate = 9 is = 1 omega2 = 3.2797e-07 + ik_interpolate = 9 is = 2 omega2 = 3.2797e-07 + ik_interpolate = 9 is = 3 omega2 = 7.0057e-07 + ik_interpolate = 9 is = 4 omega2 = 8.2362e-07 + ik_interpolate = 9 is = 5 omega2 = 8.2362e-07 + ik_interpolate = 9 is = 6 omega2 = 9.8506e-07 + + ik_interpolate = 10 is = 1 omega2 = 1.7119e-07 + ik_interpolate = 10 is = 2 omega2 = 1.9319e-07 ik_interpolate = 10 is = 3 omega2 = 2.8386e-07 - ik_interpolate = 10 is = 4 omega2 = 7.6237e-07 - ik_interpolate = 10 is = 5 omega2 = 8.3871e-07 - ik_interpolate = 10 is = 6 omega2 = 9.7995e-07 - - ik_interpolate = 11 is = 1 omega2 = 6.2739e-08 - ik_interpolate = 11 is = 2 omega2 = 6.2739e-08 - ik_interpolate = 11 is = 3 omega2 = 1.1338e-07 - ik_interpolate = 11 is = 4 omega2 = 6.3858e-07 - ik_interpolate = 11 is = 5 omega2 = 6.3858e-07 - ik_interpolate = 11 is = 6 omega2 = 7.2799e-07 - - ik_interpolate = 12 is = 1 omega2 = 1.7117e-07 - ik_interpolate = 12 is = 2 omega2 = 1.9316e-07 + ik_interpolate = 10 is = 4 omega2 = 7.6252e-07 + ik_interpolate = 10 is = 5 omega2 = 8.3887e-07 + ik_interpolate = 10 is = 6 omega2 = 9.8011e-07 + + ik_interpolate = 11 is = 1 omega2 = 6.2751e-08 + ik_interpolate = 11 is = 2 omega2 = 6.2751e-08 + ik_interpolate = 11 is = 3 omega2 = 1.1340e-07 + ik_interpolate = 11 is = 4 omega2 = 6.3879e-07 + ik_interpolate = 11 is = 5 omega2 = 6.3879e-07 + ik_interpolate = 11 is = 6 omega2 = 7.2819e-07 + + ik_interpolate = 12 is = 1 omega2 = 1.7119e-07 + ik_interpolate = 12 is = 2 omega2 = 1.9319e-07 ik_interpolate = 12 is = 3 omega2 = 2.8386e-07 - ik_interpolate = 12 is = 4 omega2 = 7.6237e-07 - ik_interpolate = 12 is = 5 omega2 = 8.3871e-07 - ik_interpolate = 12 is = 6 omega2 = 9.7995e-07 + ik_interpolate = 12 is = 4 omega2 = 7.6252e-07 + ik_interpolate = 12 is = 5 omega2 = 8.3887e-07 + ik_interpolate = 12 is = 6 omega2 = 9.8011e-07 - ik_interpolate = 13 is = 1 omega2 = 1.5001e-07 - ik_interpolate = 13 is = 2 omega2 = 1.5001e-07 - ik_interpolate = 13 is = 3 omega2 = 2.6883e-07 - ik_interpolate = 13 is = 4 omega2 = 8.0034e-07 - ik_interpolate = 13 is = 5 omega2 = 8.0034e-07 - ik_interpolate = 13 is = 6 omega2 = 1.2987e-06 + ik_interpolate = 13 is = 1 omega2 = 1.5004e-07 + ik_interpolate = 13 is = 2 omega2 = 1.5004e-07 + ik_interpolate = 13 is = 3 omega2 = 2.6885e-07 + ik_interpolate = 13 is = 4 omega2 = 8.0049e-07 + ik_interpolate = 13 is = 5 omega2 = 8.0049e-07 + ik_interpolate = 13 is = 6 omega2 = 1.2988e-06 ik_interpolate = 14 is = 1 omega2 = 8.2097e-08 - ik_interpolate = 14 is = 2 omega2 = 3.0680e-07 - ik_interpolate = 14 is = 3 omega2 = 5.7573e-07 - ik_interpolate = 14 is = 4 omega2 = 6.6964e-07 - ik_interpolate = 14 is = 5 omega2 = 7.8775e-07 - ik_interpolate = 14 is = 6 omega2 = 9.3332e-07 - - ik_interpolate = 15 is = 1 omega2 = 1.7117e-07 - ik_interpolate = 15 is = 2 omega2 = 1.9316e-07 + ik_interpolate = 14 is = 2 omega2 = 3.0687e-07 + ik_interpolate = 14 is = 3 omega2 = 5.7578e-07 + ik_interpolate = 14 is = 4 omega2 = 6.6985e-07 + ik_interpolate = 14 is = 5 omega2 = 7.8783e-07 + ik_interpolate = 14 is = 6 omega2 = 9.3340e-07 + + ik_interpolate = 15 is = 1 omega2 = 1.7119e-07 + ik_interpolate = 15 is = 2 omega2 = 1.9319e-07 ik_interpolate = 15 is = 3 omega2 = 2.8386e-07 - ik_interpolate = 15 is = 4 omega2 = 7.6237e-07 - ik_interpolate = 15 is = 5 omega2 = 8.3871e-07 - ik_interpolate = 15 is = 6 omega2 = 9.7995e-07 - - ik_interpolate = 16 is = 1 omega2 = 4.3992e-08 - ik_interpolate = 16 is = 2 omega2 = 4.3992e-08 - ik_interpolate = 16 is = 3 omega2 = 4.7735e-07 - ik_interpolate = 16 is = 4 omega2 = 5.8524e-07 - ik_interpolate = 16 is = 5 omega2 = 5.8524e-07 - ik_interpolate = 16 is = 6 omega2 = 8.7344e-07 - - ik_interpolate = 17 is = 1 omega2 = 1.5001e-07 - ik_interpolate = 17 is = 2 omega2 = 1.5001e-07 - ik_interpolate = 17 is = 3 omega2 = 2.6883e-07 - ik_interpolate = 17 is = 4 omega2 = 8.0034e-07 - ik_interpolate = 17 is = 5 omega2 = 8.0034e-07 - ik_interpolate = 17 is = 6 omega2 = 1.2987e-06 - - ik_interpolate = 18 is = 1 omega2 = 4.3992e-08 - ik_interpolate = 18 is = 2 omega2 = 4.3992e-08 - ik_interpolate = 18 is = 3 omega2 = 4.7735e-07 - ik_interpolate = 18 is = 4 omega2 = 5.8524e-07 - ik_interpolate = 18 is = 5 omega2 = 5.8524e-07 - ik_interpolate = 18 is = 6 omega2 = 8.7344e-07 - - ik_interpolate = 19 is = 1 omega2 = 1.7117e-07 - ik_interpolate = 19 is = 2 omega2 = 1.9316e-07 + ik_interpolate = 15 is = 4 omega2 = 7.6252e-07 + ik_interpolate = 15 is = 5 omega2 = 8.3887e-07 + ik_interpolate = 15 is = 6 omega2 = 9.8011e-07 + + ik_interpolate = 16 is = 1 omega2 = 4.3995e-08 + ik_interpolate = 16 is = 2 omega2 = 4.3995e-08 + ik_interpolate = 16 is = 3 omega2 = 4.7743e-07 + ik_interpolate = 16 is = 4 omega2 = 5.8545e-07 + ik_interpolate = 16 is = 5 omega2 = 5.8545e-07 + ik_interpolate = 16 is = 6 omega2 = 8.7351e-07 + + ik_interpolate = 17 is = 1 omega2 = 1.5004e-07 + ik_interpolate = 17 is = 2 omega2 = 1.5004e-07 + ik_interpolate = 17 is = 3 omega2 = 2.6885e-07 + ik_interpolate = 17 is = 4 omega2 = 8.0049e-07 + ik_interpolate = 17 is = 5 omega2 = 8.0049e-07 + ik_interpolate = 17 is = 6 omega2 = 1.2988e-06 + + ik_interpolate = 18 is = 1 omega2 = 4.3995e-08 + ik_interpolate = 18 is = 2 omega2 = 4.3995e-08 + ik_interpolate = 18 is = 3 omega2 = 4.7743e-07 + ik_interpolate = 18 is = 4 omega2 = 5.8545e-07 + ik_interpolate = 18 is = 5 omega2 = 5.8545e-07 + ik_interpolate = 18 is = 6 omega2 = 8.7351e-07 + + ik_interpolate = 19 is = 1 omega2 = 1.7119e-07 + ik_interpolate = 19 is = 2 omega2 = 1.9319e-07 ik_interpolate = 19 is = 3 omega2 = 2.8386e-07 - ik_interpolate = 19 is = 4 omega2 = 7.6237e-07 - ik_interpolate = 19 is = 5 omega2 = 8.3871e-07 - ik_interpolate = 19 is = 6 omega2 = 9.7995e-07 + ik_interpolate = 19 is = 4 omega2 = 7.6252e-07 + ik_interpolate = 19 is = 5 omega2 = 8.3887e-07 + ik_interpolate = 19 is = 6 omega2 = 9.8011e-07 ik_interpolate = 20 is = 1 omega2 = 8.2097e-08 - ik_interpolate = 20 is = 2 omega2 = 3.0680e-07 - ik_interpolate = 20 is = 3 omega2 = 5.7573e-07 - ik_interpolate = 20 is = 4 omega2 = 6.6964e-07 - ik_interpolate = 20 is = 5 omega2 = 7.8775e-07 - ik_interpolate = 20 is = 6 omega2 = 9.3332e-07 - - ik_interpolate = 21 is = 1 omega2 = 4.3992e-08 - ik_interpolate = 21 is = 2 omega2 = 4.3992e-08 - ik_interpolate = 21 is = 3 omega2 = 4.7735e-07 - ik_interpolate = 21 is = 4 omega2 = 5.8524e-07 - ik_interpolate = 21 is = 5 omega2 = 5.8524e-07 - ik_interpolate = 21 is = 6 omega2 = 8.7344e-07 - - ik_interpolate = 22 is = 1 omega2 = 1.5001e-07 - ik_interpolate = 22 is = 2 omega2 = 1.5001e-07 - ik_interpolate = 22 is = 3 omega2 = 2.6883e-07 - ik_interpolate = 22 is = 4 omega2 = 8.0034e-07 - ik_interpolate = 22 is = 5 omega2 = 8.0034e-07 - ik_interpolate = 22 is = 6 omega2 = 1.2987e-06 + ik_interpolate = 20 is = 2 omega2 = 3.0687e-07 + ik_interpolate = 20 is = 3 omega2 = 5.7578e-07 + ik_interpolate = 20 is = 4 omega2 = 6.6985e-07 + ik_interpolate = 20 is = 5 omega2 = 7.8783e-07 + ik_interpolate = 20 is = 6 omega2 = 9.3340e-07 + + ik_interpolate = 21 is = 1 omega2 = 4.3995e-08 + ik_interpolate = 21 is = 2 omega2 = 4.3995e-08 + ik_interpolate = 21 is = 3 omega2 = 4.7743e-07 + ik_interpolate = 21 is = 4 omega2 = 5.8545e-07 + ik_interpolate = 21 is = 5 omega2 = 5.8545e-07 + ik_interpolate = 21 is = 6 omega2 = 8.7351e-07 + + ik_interpolate = 22 is = 1 omega2 = 1.5004e-07 + ik_interpolate = 22 is = 2 omega2 = 1.5004e-07 + ik_interpolate = 22 is = 3 omega2 = 2.6885e-07 + ik_interpolate = 22 is = 4 omega2 = 8.0049e-07 + ik_interpolate = 22 is = 5 omega2 = 8.0049e-07 + ik_interpolate = 22 is = 6 omega2 = 1.2988e-06 ik_interpolate = 23 is = 1 omega2 = 8.2097e-08 - ik_interpolate = 23 is = 2 omega2 = 3.0680e-07 - ik_interpolate = 23 is = 3 omega2 = 5.7573e-07 - ik_interpolate = 23 is = 4 omega2 = 6.6964e-07 - ik_interpolate = 23 is = 5 omega2 = 7.8775e-07 - ik_interpolate = 23 is = 6 omega2 = 9.3332e-07 - - ik_interpolate = 24 is = 1 omega2 = 1.7117e-07 - ik_interpolate = 24 is = 2 omega2 = 1.9316e-07 + ik_interpolate = 23 is = 2 omega2 = 3.0687e-07 + ik_interpolate = 23 is = 3 omega2 = 5.7578e-07 + ik_interpolate = 23 is = 4 omega2 = 6.6985e-07 + ik_interpolate = 23 is = 5 omega2 = 7.8783e-07 + ik_interpolate = 23 is = 6 omega2 = 9.3340e-07 + + ik_interpolate = 24 is = 1 omega2 = 1.7119e-07 + ik_interpolate = 24 is = 2 omega2 = 1.9319e-07 ik_interpolate = 24 is = 3 omega2 = 2.8386e-07 - ik_interpolate = 24 is = 4 omega2 = 7.6237e-07 - ik_interpolate = 24 is = 5 omega2 = 8.3871e-07 - ik_interpolate = 24 is = 6 omega2 = 9.7995e-07 + ik_interpolate = 24 is = 4 omega2 = 7.6252e-07 + ik_interpolate = 24 is = 5 omega2 = 8.3887e-07 + ik_interpolate = 24 is = 6 omega2 = 9.8011e-07 - ik_interpolate = 25 is = 1 omega2 = 1.7117e-07 - ik_interpolate = 25 is = 2 omega2 = 1.9316e-07 + ik_interpolate = 25 is = 1 omega2 = 1.7119e-07 + ik_interpolate = 25 is = 2 omega2 = 1.9319e-07 ik_interpolate = 25 is = 3 omega2 = 2.8386e-07 - ik_interpolate = 25 is = 4 omega2 = 7.6237e-07 - ik_interpolate = 25 is = 5 omega2 = 8.3871e-07 - ik_interpolate = 25 is = 6 omega2 = 9.7995e-07 + ik_interpolate = 25 is = 4 omega2 = 7.6252e-07 + ik_interpolate = 25 is = 5 omega2 = 8.3887e-07 + ik_interpolate = 25 is = 6 omega2 = 9.8011e-07 ik_interpolate = 26 is = 1 omega2 = 8.2097e-08 - ik_interpolate = 26 is = 2 omega2 = 3.0680e-07 - ik_interpolate = 26 is = 3 omega2 = 5.7573e-07 - ik_interpolate = 26 is = 4 omega2 = 6.6964e-07 - ik_interpolate = 26 is = 5 omega2 = 7.8775e-07 - ik_interpolate = 26 is = 6 omega2 = 9.3332e-07 - - ik_interpolate = 27 is = 1 omega2 = 1.7117e-07 - ik_interpolate = 27 is = 2 omega2 = 1.9316e-07 + ik_interpolate = 26 is = 2 omega2 = 3.0687e-07 + ik_interpolate = 26 is = 3 omega2 = 5.7578e-07 + ik_interpolate = 26 is = 4 omega2 = 6.6985e-07 + ik_interpolate = 26 is = 5 omega2 = 7.8783e-07 + ik_interpolate = 26 is = 6 omega2 = 9.3340e-07 + + ik_interpolate = 27 is = 1 omega2 = 1.7119e-07 + ik_interpolate = 27 is = 2 omega2 = 1.9319e-07 ik_interpolate = 27 is = 3 omega2 = 2.8386e-07 - ik_interpolate = 27 is = 4 omega2 = 7.6237e-07 - ik_interpolate = 27 is = 5 omega2 = 8.3871e-07 - ik_interpolate = 27 is = 6 omega2 = 9.7995e-07 + ik_interpolate = 27 is = 4 omega2 = 7.6252e-07 + ik_interpolate = 27 is = 5 omega2 = 8.3887e-07 + ik_interpolate = 27 is = 6 omega2 = 9.8011e-07 - ik_interpolate = 28 is = 1 omega2 = 1.0150e-07 - ik_interpolate = 28 is = 2 omega2 = 1.0150e-07 - ik_interpolate = 28 is = 3 omega2 = 4.1509e-07 - ik_interpolate = 28 is = 4 omega2 = 7.0156e-07 - ik_interpolate = 28 is = 5 omega2 = 7.0156e-07 - ik_interpolate = 28 is = 6 omega2 = 8.5557e-07 + ik_interpolate = 28 is = 1 omega2 = 1.0151e-07 + ik_interpolate = 28 is = 2 omega2 = 1.0151e-07 + ik_interpolate = 28 is = 3 omega2 = 4.1515e-07 + ik_interpolate = 28 is = 4 omega2 = 7.0176e-07 + ik_interpolate = 28 is = 5 omega2 = 7.0176e-07 + ik_interpolate = 28 is = 6 omega2 = 8.5566e-07 ik_interpolate = 29 is = 1 omega2 = 8.2097e-08 - ik_interpolate = 29 is = 2 omega2 = 3.0680e-07 - ik_interpolate = 29 is = 3 omega2 = 5.7573e-07 - ik_interpolate = 29 is = 4 omega2 = 6.6964e-07 - ik_interpolate = 29 is = 5 omega2 = 7.8775e-07 - ik_interpolate = 29 is = 6 omega2 = 9.3332e-07 - - ik_interpolate = 30 is = 1 omega2 = 1.7117e-07 - ik_interpolate = 30 is = 2 omega2 = 1.9316e-07 + ik_interpolate = 29 is = 2 omega2 = 3.0687e-07 + ik_interpolate = 29 is = 3 omega2 = 5.7578e-07 + ik_interpolate = 29 is = 4 omega2 = 6.6985e-07 + ik_interpolate = 29 is = 5 omega2 = 7.8783e-07 + ik_interpolate = 29 is = 6 omega2 = 9.3340e-07 + + ik_interpolate = 30 is = 1 omega2 = 1.7119e-07 + ik_interpolate = 30 is = 2 omega2 = 1.9319e-07 ik_interpolate = 30 is = 3 omega2 = 2.8386e-07 - ik_interpolate = 30 is = 4 omega2 = 7.6237e-07 - ik_interpolate = 30 is = 5 omega2 = 8.3871e-07 - ik_interpolate = 30 is = 6 omega2 = 9.7995e-07 - - ik_interpolate = 31 is = 1 omega2 = 1.0150e-07 - ik_interpolate = 31 is = 2 omega2 = 1.0150e-07 - ik_interpolate = 31 is = 3 omega2 = 4.1509e-07 - ik_interpolate = 31 is = 4 omega2 = 7.0156e-07 - ik_interpolate = 31 is = 5 omega2 = 7.0156e-07 - ik_interpolate = 31 is = 6 omega2 = 8.5557e-07 - - ik_interpolate = 32 is = 1 omega2 = 1.7117e-07 - ik_interpolate = 32 is = 2 omega2 = 1.9316e-07 + ik_interpolate = 30 is = 4 omega2 = 7.6252e-07 + ik_interpolate = 30 is = 5 omega2 = 8.3887e-07 + ik_interpolate = 30 is = 6 omega2 = 9.8011e-07 + + ik_interpolate = 31 is = 1 omega2 = 1.0151e-07 + ik_interpolate = 31 is = 2 omega2 = 1.0151e-07 + ik_interpolate = 31 is = 3 omega2 = 4.1515e-07 + ik_interpolate = 31 is = 4 omega2 = 7.0176e-07 + ik_interpolate = 31 is = 5 omega2 = 7.0176e-07 + ik_interpolate = 31 is = 6 omega2 = 8.5566e-07 + + ik_interpolate = 32 is = 1 omega2 = 1.7119e-07 + ik_interpolate = 32 is = 2 omega2 = 1.9319e-07 ik_interpolate = 32 is = 3 omega2 = 2.8386e-07 - ik_interpolate = 32 is = 4 omega2 = 7.6237e-07 - ik_interpolate = 32 is = 5 omega2 = 8.3871e-07 - ik_interpolate = 32 is = 6 omega2 = 9.7995e-07 - - ik_interpolate = 33 is = 1 omega2 = 3.2790e-07 - ik_interpolate = 33 is = 2 omega2 = 3.2790e-07 - ik_interpolate = 33 is = 3 omega2 = 7.0053e-07 - ik_interpolate = 33 is = 4 omega2 = 8.2355e-07 - ik_interpolate = 33 is = 5 omega2 = 8.2355e-07 - ik_interpolate = 33 is = 6 omega2 = 9.8498e-07 - - ik_interpolate = 34 is = 1 omega2 = 1.7117e-07 - ik_interpolate = 34 is = 2 omega2 = 1.9316e-07 + ik_interpolate = 32 is = 4 omega2 = 7.6252e-07 + ik_interpolate = 32 is = 5 omega2 = 8.3887e-07 + ik_interpolate = 32 is = 6 omega2 = 9.8011e-07 + + ik_interpolate = 33 is = 1 omega2 = 3.2797e-07 + ik_interpolate = 33 is = 2 omega2 = 3.2797e-07 + ik_interpolate = 33 is = 3 omega2 = 7.0057e-07 + ik_interpolate = 33 is = 4 omega2 = 8.2362e-07 + ik_interpolate = 33 is = 5 omega2 = 8.2362e-07 + ik_interpolate = 33 is = 6 omega2 = 9.8506e-07 + + ik_interpolate = 34 is = 1 omega2 = 1.7119e-07 + ik_interpolate = 34 is = 2 omega2 = 1.9319e-07 ik_interpolate = 34 is = 3 omega2 = 2.8386e-07 - ik_interpolate = 34 is = 4 omega2 = 7.6237e-07 - ik_interpolate = 34 is = 5 omega2 = 8.3871e-07 - ik_interpolate = 34 is = 6 omega2 = 9.7995e-07 - - ik_interpolate = 35 is = 1 omega2 = 6.2739e-08 - ik_interpolate = 35 is = 2 omega2 = 6.2739e-08 - ik_interpolate = 35 is = 3 omega2 = 1.1338e-07 - ik_interpolate = 35 is = 4 omega2 = 6.3858e-07 - ik_interpolate = 35 is = 5 omega2 = 6.3858e-07 - ik_interpolate = 35 is = 6 omega2 = 7.2799e-07 - - ik_interpolate = 36 is = 1 omega2 = 1.7117e-07 - ik_interpolate = 36 is = 2 omega2 = 1.9316e-07 + ik_interpolate = 34 is = 4 omega2 = 7.6252e-07 + ik_interpolate = 34 is = 5 omega2 = 8.3887e-07 + ik_interpolate = 34 is = 6 omega2 = 9.8011e-07 + + ik_interpolate = 35 is = 1 omega2 = 6.2751e-08 + ik_interpolate = 35 is = 2 omega2 = 6.2751e-08 + ik_interpolate = 35 is = 3 omega2 = 1.1340e-07 + ik_interpolate = 35 is = 4 omega2 = 6.3879e-07 + ik_interpolate = 35 is = 5 omega2 = 6.3879e-07 + ik_interpolate = 35 is = 6 omega2 = 7.2819e-07 + + ik_interpolate = 36 is = 1 omega2 = 1.7119e-07 + ik_interpolate = 36 is = 2 omega2 = 1.9319e-07 ik_interpolate = 36 is = 3 omega2 = 2.8386e-07 - ik_interpolate = 36 is = 4 omega2 = 7.6237e-07 - ik_interpolate = 36 is = 5 omega2 = 8.3871e-07 - ik_interpolate = 36 is = 6 omega2 = 9.7995e-07 + ik_interpolate = 36 is = 4 omega2 = 7.6252e-07 + ik_interpolate = 36 is = 5 omega2 = 8.3887e-07 + ik_interpolate = 36 is = 6 omega2 = 9.8011e-07 - ik_interpolate = 37 is = 1 omega2 = 1.7117e-07 - ik_interpolate = 37 is = 2 omega2 = 1.9316e-07 + ik_interpolate = 37 is = 1 omega2 = 1.7119e-07 + ik_interpolate = 37 is = 2 omega2 = 1.9319e-07 ik_interpolate = 37 is = 3 omega2 = 2.8386e-07 - ik_interpolate = 37 is = 4 omega2 = 7.6237e-07 - ik_interpolate = 37 is = 5 omega2 = 8.3871e-07 - ik_interpolate = 37 is = 6 omega2 = 9.7995e-07 + ik_interpolate = 37 is = 4 omega2 = 7.6252e-07 + ik_interpolate = 37 is = 5 omega2 = 8.3887e-07 + ik_interpolate = 37 is = 6 omega2 = 9.8011e-07 ik_interpolate = 38 is = 1 omega2 = 8.2097e-08 - ik_interpolate = 38 is = 2 omega2 = 3.0680e-07 - ik_interpolate = 38 is = 3 omega2 = 5.7573e-07 - ik_interpolate = 38 is = 4 omega2 = 6.6964e-07 - ik_interpolate = 38 is = 5 omega2 = 7.8775e-07 - ik_interpolate = 38 is = 6 omega2 = 9.3332e-07 - - ik_interpolate = 39 is = 1 omega2 = 1.7117e-07 - ik_interpolate = 39 is = 2 omega2 = 1.9316e-07 + ik_interpolate = 38 is = 2 omega2 = 3.0687e-07 + ik_interpolate = 38 is = 3 omega2 = 5.7578e-07 + ik_interpolate = 38 is = 4 omega2 = 6.6985e-07 + ik_interpolate = 38 is = 5 omega2 = 7.8783e-07 + ik_interpolate = 38 is = 6 omega2 = 9.3340e-07 + + ik_interpolate = 39 is = 1 omega2 = 1.7119e-07 + ik_interpolate = 39 is = 2 omega2 = 1.9319e-07 ik_interpolate = 39 is = 3 omega2 = 2.8386e-07 - ik_interpolate = 39 is = 4 omega2 = 7.6237e-07 - ik_interpolate = 39 is = 5 omega2 = 8.3871e-07 - ik_interpolate = 39 is = 6 omega2 = 9.7995e-07 - - ik_interpolate = 40 is = 1 omega2 = 1.0150e-07 - ik_interpolate = 40 is = 2 omega2 = 1.0150e-07 - ik_interpolate = 40 is = 3 omega2 = 4.1509e-07 - ik_interpolate = 40 is = 4 omega2 = 7.0156e-07 - ik_interpolate = 40 is = 5 omega2 = 7.0156e-07 - ik_interpolate = 40 is = 6 omega2 = 8.5557e-07 - - ik_interpolate = 41 is = 1 omega2 = 6.2739e-08 - ik_interpolate = 41 is = 2 omega2 = 6.2739e-08 - ik_interpolate = 41 is = 3 omega2 = 1.1338e-07 - ik_interpolate = 41 is = 4 omega2 = 6.3858e-07 - ik_interpolate = 41 is = 5 omega2 = 6.3858e-07 - ik_interpolate = 41 is = 6 omega2 = 7.2799e-07 - - ik_interpolate = 42 is = 1 omega2 = 1.7117e-07 - ik_interpolate = 42 is = 2 omega2 = 1.9316e-07 + ik_interpolate = 39 is = 4 omega2 = 7.6252e-07 + ik_interpolate = 39 is = 5 omega2 = 8.3887e-07 + ik_interpolate = 39 is = 6 omega2 = 9.8011e-07 + + ik_interpolate = 40 is = 1 omega2 = 1.0151e-07 + ik_interpolate = 40 is = 2 omega2 = 1.0151e-07 + ik_interpolate = 40 is = 3 omega2 = 4.1515e-07 + ik_interpolate = 40 is = 4 omega2 = 7.0176e-07 + ik_interpolate = 40 is = 5 omega2 = 7.0176e-07 + ik_interpolate = 40 is = 6 omega2 = 8.5566e-07 + + ik_interpolate = 41 is = 1 omega2 = 6.2751e-08 + ik_interpolate = 41 is = 2 omega2 = 6.2751e-08 + ik_interpolate = 41 is = 3 omega2 = 1.1340e-07 + ik_interpolate = 41 is = 4 omega2 = 6.3879e-07 + ik_interpolate = 41 is = 5 omega2 = 6.3879e-07 + ik_interpolate = 41 is = 6 omega2 = 7.2819e-07 + + ik_interpolate = 42 is = 1 omega2 = 1.7119e-07 + ik_interpolate = 42 is = 2 omega2 = 1.9319e-07 ik_interpolate = 42 is = 3 omega2 = 2.8386e-07 - ik_interpolate = 42 is = 4 omega2 = 7.6237e-07 - ik_interpolate = 42 is = 5 omega2 = 8.3871e-07 - ik_interpolate = 42 is = 6 omega2 = 9.7995e-07 - - ik_interpolate = 43 is = 1 omega2 = 3.2790e-07 - ik_interpolate = 43 is = 2 omega2 = 3.2790e-07 - ik_interpolate = 43 is = 3 omega2 = 7.0053e-07 - ik_interpolate = 43 is = 4 omega2 = 8.2355e-07 - ik_interpolate = 43 is = 5 omega2 = 8.2355e-07 - ik_interpolate = 43 is = 6 omega2 = 9.8498e-07 - - ik_interpolate = 44 is = 1 omega2 = 1.7117e-07 - ik_interpolate = 44 is = 2 omega2 = 1.9316e-07 + ik_interpolate = 42 is = 4 omega2 = 7.6252e-07 + ik_interpolate = 42 is = 5 omega2 = 8.3887e-07 + ik_interpolate = 42 is = 6 omega2 = 9.8011e-07 + + ik_interpolate = 43 is = 1 omega2 = 3.2797e-07 + ik_interpolate = 43 is = 2 omega2 = 3.2797e-07 + ik_interpolate = 43 is = 3 omega2 = 7.0057e-07 + ik_interpolate = 43 is = 4 omega2 = 8.2362e-07 + ik_interpolate = 43 is = 5 omega2 = 8.2362e-07 + ik_interpolate = 43 is = 6 omega2 = 9.8506e-07 + + ik_interpolate = 44 is = 1 omega2 = 1.7119e-07 + ik_interpolate = 44 is = 2 omega2 = 1.9319e-07 ik_interpolate = 44 is = 3 omega2 = 2.8386e-07 - ik_interpolate = 44 is = 4 omega2 = 7.6237e-07 - ik_interpolate = 44 is = 5 omega2 = 8.3871e-07 - ik_interpolate = 44 is = 6 omega2 = 9.7995e-07 + ik_interpolate = 44 is = 4 omega2 = 7.6252e-07 + ik_interpolate = 44 is = 5 omega2 = 8.3887e-07 + ik_interpolate = 44 is = 6 omega2 = 9.8011e-07 - ik_interpolate = 45 is = 1 omega2 = 1.7117e-07 - ik_interpolate = 45 is = 2 omega2 = 1.9316e-07 + ik_interpolate = 45 is = 1 omega2 = 1.7119e-07 + ik_interpolate = 45 is = 2 omega2 = 1.9319e-07 ik_interpolate = 45 is = 3 omega2 = 2.8386e-07 - ik_interpolate = 45 is = 4 omega2 = 7.6237e-07 - ik_interpolate = 45 is = 5 omega2 = 8.3871e-07 - ik_interpolate = 45 is = 6 omega2 = 9.7995e-07 - - ik_interpolate = 46 is = 1 omega2 = 1.0150e-07 - ik_interpolate = 46 is = 2 omega2 = 1.0150e-07 - ik_interpolate = 46 is = 3 omega2 = 4.1509e-07 - ik_interpolate = 46 is = 4 omega2 = 7.0156e-07 - ik_interpolate = 46 is = 5 omega2 = 7.0156e-07 - ik_interpolate = 46 is = 6 omega2 = 8.5557e-07 - - ik_interpolate = 47 is = 1 omega2 = 1.7117e-07 - ik_interpolate = 47 is = 2 omega2 = 1.9316e-07 + ik_interpolate = 45 is = 4 omega2 = 7.6252e-07 + ik_interpolate = 45 is = 5 omega2 = 8.3887e-07 + ik_interpolate = 45 is = 6 omega2 = 9.8011e-07 + + ik_interpolate = 46 is = 1 omega2 = 1.0151e-07 + ik_interpolate = 46 is = 2 omega2 = 1.0151e-07 + ik_interpolate = 46 is = 3 omega2 = 4.1515e-07 + ik_interpolate = 46 is = 4 omega2 = 7.0176e-07 + ik_interpolate = 46 is = 5 omega2 = 7.0176e-07 + ik_interpolate = 46 is = 6 omega2 = 8.5566e-07 + + ik_interpolate = 47 is = 1 omega2 = 1.7119e-07 + ik_interpolate = 47 is = 2 omega2 = 1.9319e-07 ik_interpolate = 47 is = 3 omega2 = 2.8386e-07 - ik_interpolate = 47 is = 4 omega2 = 7.6237e-07 - ik_interpolate = 47 is = 5 omega2 = 8.3871e-07 - ik_interpolate = 47 is = 6 omega2 = 9.7995e-07 + ik_interpolate = 47 is = 4 omega2 = 7.6252e-07 + ik_interpolate = 47 is = 5 omega2 = 8.3887e-07 + ik_interpolate = 47 is = 6 omega2 = 9.8011e-07 ik_interpolate = 48 is = 1 omega2 = 8.2097e-08 - ik_interpolate = 48 is = 2 omega2 = 3.0680e-07 - ik_interpolate = 48 is = 3 omega2 = 5.7573e-07 - ik_interpolate = 48 is = 4 omega2 = 6.6964e-07 - ik_interpolate = 48 is = 5 omega2 = 7.8775e-07 - ik_interpolate = 48 is = 6 omega2 = 9.3332e-07 - - ik_interpolate = 49 is = 1 omega2 = 1.5001e-07 - ik_interpolate = 49 is = 2 omega2 = 1.5001e-07 - ik_interpolate = 49 is = 3 omega2 = 2.6883e-07 - ik_interpolate = 49 is = 4 omega2 = 8.0034e-07 - ik_interpolate = 49 is = 5 omega2 = 8.0034e-07 - ik_interpolate = 49 is = 6 omega2 = 1.2987e-06 + ik_interpolate = 48 is = 2 omega2 = 3.0687e-07 + ik_interpolate = 48 is = 3 omega2 = 5.7578e-07 + ik_interpolate = 48 is = 4 omega2 = 6.6985e-07 + ik_interpolate = 48 is = 5 omega2 = 7.8783e-07 + ik_interpolate = 48 is = 6 omega2 = 9.3340e-07 + + ik_interpolate = 49 is = 1 omega2 = 1.5004e-07 + ik_interpolate = 49 is = 2 omega2 = 1.5004e-07 + ik_interpolate = 49 is = 3 omega2 = 2.6885e-07 + ik_interpolate = 49 is = 4 omega2 = 8.0049e-07 + ik_interpolate = 49 is = 5 omega2 = 8.0049e-07 + ik_interpolate = 49 is = 6 omega2 = 1.2988e-06 ik_interpolate = 50 is = 1 omega2 = 8.2097e-08 - ik_interpolate = 50 is = 2 omega2 = 3.0680e-07 - ik_interpolate = 50 is = 3 omega2 = 5.7573e-07 - ik_interpolate = 50 is = 4 omega2 = 6.6964e-07 - ik_interpolate = 50 is = 5 omega2 = 7.8775e-07 - ik_interpolate = 50 is = 6 omega2 = 9.3332e-07 - - ik_interpolate = 51 is = 1 omega2 = 1.7117e-07 - ik_interpolate = 51 is = 2 omega2 = 1.9316e-07 + ik_interpolate = 50 is = 2 omega2 = 3.0687e-07 + ik_interpolate = 50 is = 3 omega2 = 5.7578e-07 + ik_interpolate = 50 is = 4 omega2 = 6.6985e-07 + ik_interpolate = 50 is = 5 omega2 = 7.8783e-07 + ik_interpolate = 50 is = 6 omega2 = 9.3340e-07 + + ik_interpolate = 51 is = 1 omega2 = 1.7119e-07 + ik_interpolate = 51 is = 2 omega2 = 1.9319e-07 ik_interpolate = 51 is = 3 omega2 = 2.8386e-07 - ik_interpolate = 51 is = 4 omega2 = 7.6237e-07 - ik_interpolate = 51 is = 5 omega2 = 8.3871e-07 - ik_interpolate = 51 is = 6 omega2 = 9.7995e-07 + ik_interpolate = 51 is = 4 omega2 = 7.6252e-07 + ik_interpolate = 51 is = 5 omega2 = 8.3887e-07 + ik_interpolate = 51 is = 6 omega2 = 9.8011e-07 - ik_interpolate = 52 is = 1 omega2 = 4.3992e-08 - ik_interpolate = 52 is = 2 omega2 = 4.3992e-08 - ik_interpolate = 52 is = 3 omega2 = 4.7735e-07 - ik_interpolate = 52 is = 4 omega2 = 5.8524e-07 - ik_interpolate = 52 is = 5 omega2 = 5.8524e-07 - ik_interpolate = 52 is = 6 omega2 = 8.7344e-07 + ik_interpolate = 52 is = 1 omega2 = 4.3995e-08 + ik_interpolate = 52 is = 2 omega2 = 4.3995e-08 + ik_interpolate = 52 is = 3 omega2 = 4.7743e-07 + ik_interpolate = 52 is = 4 omega2 = 5.8545e-07 + ik_interpolate = 52 is = 5 omega2 = 5.8545e-07 + ik_interpolate = 52 is = 6 omega2 = 8.7351e-07 ik_interpolate = 53 is = 1 omega2 = 8.2097e-08 - ik_interpolate = 53 is = 2 omega2 = 3.0680e-07 - ik_interpolate = 53 is = 3 omega2 = 5.7573e-07 - ik_interpolate = 53 is = 4 omega2 = 6.6964e-07 - ik_interpolate = 53 is = 5 omega2 = 7.8775e-07 - ik_interpolate = 53 is = 6 omega2 = 9.3332e-07 - - ik_interpolate = 54 is = 1 omega2 = 1.7117e-07 - ik_interpolate = 54 is = 2 omega2 = 1.9316e-07 + ik_interpolate = 53 is = 2 omega2 = 3.0687e-07 + ik_interpolate = 53 is = 3 omega2 = 5.7578e-07 + ik_interpolate = 53 is = 4 omega2 = 6.6985e-07 + ik_interpolate = 53 is = 5 omega2 = 7.8783e-07 + ik_interpolate = 53 is = 6 omega2 = 9.3340e-07 + + ik_interpolate = 54 is = 1 omega2 = 1.7119e-07 + ik_interpolate = 54 is = 2 omega2 = 1.9319e-07 ik_interpolate = 54 is = 3 omega2 = 2.8386e-07 - ik_interpolate = 54 is = 4 omega2 = 7.6237e-07 - ik_interpolate = 54 is = 5 omega2 = 8.3871e-07 - ik_interpolate = 54 is = 6 omega2 = 9.7995e-07 - - ik_interpolate = 55 is = 1 omega2 = 1.0150e-07 - ik_interpolate = 55 is = 2 omega2 = 1.0150e-07 - ik_interpolate = 55 is = 3 omega2 = 4.1509e-07 - ik_interpolate = 55 is = 4 omega2 = 7.0156e-07 - ik_interpolate = 55 is = 5 omega2 = 7.0156e-07 - ik_interpolate = 55 is = 6 omega2 = 8.5557e-07 - - ik_interpolate = 56 is = 1 omega2 = 1.7117e-07 - ik_interpolate = 56 is = 2 omega2 = 1.9316e-07 + ik_interpolate = 54 is = 4 omega2 = 7.6252e-07 + ik_interpolate = 54 is = 5 omega2 = 8.3887e-07 + ik_interpolate = 54 is = 6 omega2 = 9.8011e-07 + + ik_interpolate = 55 is = 1 omega2 = 1.0151e-07 + ik_interpolate = 55 is = 2 omega2 = 1.0151e-07 + ik_interpolate = 55 is = 3 omega2 = 4.1515e-07 + ik_interpolate = 55 is = 4 omega2 = 7.0176e-07 + ik_interpolate = 55 is = 5 omega2 = 7.0176e-07 + ik_interpolate = 55 is = 6 omega2 = 8.5566e-07 + + ik_interpolate = 56 is = 1 omega2 = 1.7119e-07 + ik_interpolate = 56 is = 2 omega2 = 1.9319e-07 ik_interpolate = 56 is = 3 omega2 = 2.8386e-07 - ik_interpolate = 56 is = 4 omega2 = 7.6237e-07 - ik_interpolate = 56 is = 5 omega2 = 8.3871e-07 - ik_interpolate = 56 is = 6 omega2 = 9.7995e-07 + ik_interpolate = 56 is = 4 omega2 = 7.6252e-07 + ik_interpolate = 56 is = 5 omega2 = 8.3887e-07 + ik_interpolate = 56 is = 6 omega2 = 9.8011e-07 - ik_interpolate = 57 is = 1 omega2 = 1.7117e-07 - ik_interpolate = 57 is = 2 omega2 = 1.9316e-07 + ik_interpolate = 57 is = 1 omega2 = 1.7119e-07 + ik_interpolate = 57 is = 2 omega2 = 1.9319e-07 ik_interpolate = 57 is = 3 omega2 = 2.8386e-07 - ik_interpolate = 57 is = 4 omega2 = 7.6237e-07 - ik_interpolate = 57 is = 5 omega2 = 8.3871e-07 - ik_interpolate = 57 is = 6 omega2 = 9.7995e-07 - - ik_interpolate = 58 is = 1 omega2 = 1.0150e-07 - ik_interpolate = 58 is = 2 omega2 = 1.0150e-07 - ik_interpolate = 58 is = 3 omega2 = 4.1509e-07 - ik_interpolate = 58 is = 4 omega2 = 7.0156e-07 - ik_interpolate = 58 is = 5 omega2 = 7.0156e-07 - ik_interpolate = 58 is = 6 omega2 = 8.5557e-07 - - ik_interpolate = 59 is = 1 omega2 = 1.7117e-07 - ik_interpolate = 59 is = 2 omega2 = 1.9316e-07 + ik_interpolate = 57 is = 4 omega2 = 7.6252e-07 + ik_interpolate = 57 is = 5 omega2 = 8.3887e-07 + ik_interpolate = 57 is = 6 omega2 = 9.8011e-07 + + ik_interpolate = 58 is = 1 omega2 = 1.0151e-07 + ik_interpolate = 58 is = 2 omega2 = 1.0151e-07 + ik_interpolate = 58 is = 3 omega2 = 4.1515e-07 + ik_interpolate = 58 is = 4 omega2 = 7.0176e-07 + ik_interpolate = 58 is = 5 omega2 = 7.0176e-07 + ik_interpolate = 58 is = 6 omega2 = 8.5566e-07 + + ik_interpolate = 59 is = 1 omega2 = 1.7119e-07 + ik_interpolate = 59 is = 2 omega2 = 1.9319e-07 ik_interpolate = 59 is = 3 omega2 = 2.8386e-07 - ik_interpolate = 59 is = 4 omega2 = 7.6237e-07 - ik_interpolate = 59 is = 5 omega2 = 8.3871e-07 - ik_interpolate = 59 is = 6 omega2 = 9.7995e-07 + ik_interpolate = 59 is = 4 omega2 = 7.6252e-07 + ik_interpolate = 59 is = 5 omega2 = 8.3887e-07 + ik_interpolate = 59 is = 6 omega2 = 9.8011e-07 ik_interpolate = 60 is = 1 omega2 = 8.2097e-08 - ik_interpolate = 60 is = 2 omega2 = 3.0680e-07 - ik_interpolate = 60 is = 3 omega2 = 5.7573e-07 - ik_interpolate = 60 is = 4 omega2 = 6.6964e-07 - ik_interpolate = 60 is = 5 omega2 = 7.8775e-07 - ik_interpolate = 60 is = 6 omega2 = 9.3332e-07 - - ik_interpolate = 61 is = 1 omega2 = 4.3992e-08 - ik_interpolate = 61 is = 2 omega2 = 4.3992e-08 - ik_interpolate = 61 is = 3 omega2 = 4.7735e-07 - ik_interpolate = 61 is = 4 omega2 = 5.8524e-07 - ik_interpolate = 61 is = 5 omega2 = 5.8524e-07 - ik_interpolate = 61 is = 6 omega2 = 8.7344e-07 - - ik_interpolate = 62 is = 1 omega2 = 1.7117e-07 - ik_interpolate = 62 is = 2 omega2 = 1.9316e-07 + ik_interpolate = 60 is = 2 omega2 = 3.0687e-07 + ik_interpolate = 60 is = 3 omega2 = 5.7578e-07 + ik_interpolate = 60 is = 4 omega2 = 6.6985e-07 + ik_interpolate = 60 is = 5 omega2 = 7.8783e-07 + ik_interpolate = 60 is = 6 omega2 = 9.3340e-07 + + ik_interpolate = 61 is = 1 omega2 = 4.3995e-08 + ik_interpolate = 61 is = 2 omega2 = 4.3995e-08 + ik_interpolate = 61 is = 3 omega2 = 4.7743e-07 + ik_interpolate = 61 is = 4 omega2 = 5.8545e-07 + ik_interpolate = 61 is = 5 omega2 = 5.8545e-07 + ik_interpolate = 61 is = 6 omega2 = 8.7351e-07 + + ik_interpolate = 62 is = 1 omega2 = 1.7119e-07 + ik_interpolate = 62 is = 2 omega2 = 1.9319e-07 ik_interpolate = 62 is = 3 omega2 = 2.8386e-07 - ik_interpolate = 62 is = 4 omega2 = 7.6237e-07 - ik_interpolate = 62 is = 5 omega2 = 8.3871e-07 - ik_interpolate = 62 is = 6 omega2 = 9.7995e-07 + ik_interpolate = 62 is = 4 omega2 = 7.6252e-07 + ik_interpolate = 62 is = 5 omega2 = 8.3887e-07 + ik_interpolate = 62 is = 6 omega2 = 9.8011e-07 ik_interpolate = 63 is = 1 omega2 = 8.2097e-08 - ik_interpolate = 63 is = 2 omega2 = 3.0680e-07 - ik_interpolate = 63 is = 3 omega2 = 5.7573e-07 - ik_interpolate = 63 is = 4 omega2 = 6.6964e-07 - ik_interpolate = 63 is = 5 omega2 = 7.8775e-07 - ik_interpolate = 63 is = 6 omega2 = 9.3332e-07 - - ik_interpolate = 64 is = 1 omega2 = 1.5001e-07 - ik_interpolate = 64 is = 2 omega2 = 1.5001e-07 - ik_interpolate = 64 is = 3 omega2 = 2.6883e-07 - ik_interpolate = 64 is = 4 omega2 = 8.0034e-07 - ik_interpolate = 64 is = 5 omega2 = 8.0034e-07 - ik_interpolate = 64 is = 6 omega2 = 1.2987e-06 + ik_interpolate = 63 is = 2 omega2 = 3.0687e-07 + ik_interpolate = 63 is = 3 omega2 = 5.7578e-07 + ik_interpolate = 63 is = 4 omega2 = 6.6985e-07 + ik_interpolate = 63 is = 5 omega2 = 7.8783e-07 + ik_interpolate = 63 is = 6 omega2 = 9.3340e-07 + + ik_interpolate = 64 is = 1 omega2 = 1.5004e-07 + ik_interpolate = 64 is = 2 omega2 = 1.5004e-07 + ik_interpolate = 64 is = 3 omega2 = 2.6885e-07 + ik_interpolate = 64 is = 4 omega2 = 8.0049e-07 + ik_interpolate = 64 is = 5 omega2 = 8.0049e-07 + ik_interpolate = 64 is = 6 omega2 = 1.2988e-06 Temperature = 8.0000e+02 K SCPH ITER 1 : DIFF = N/A - SCPH ITER 2 : DIFF = 1.3400e-07 - SCPH ITER 3 : DIFF = 1.1796e-07 - SCPH ITER 4 : DIFF = 1.0384e-07 - SCPH ITER 5 : DIFF = 9.1415e-08 - SCPH ITER 6 : DIFF = 8.0481e-08 - SCPH ITER 7 : DIFF = 7.0857e-08 - SCPH ITER 8 : DIFF = 6.2386e-08 - SCPH ITER 9 : DIFF = 5.4928e-08 - SCPH ITER 10 : DIFF = 4.8364e-08 - SCPH ITER 11 : DIFF = 4.2585e-08 - SCPH ITER 12 : DIFF = 3.7497e-08 - SCPH ITER 13 : DIFF = 3.3017e-08 - SCPH ITER 14 : DIFF = 2.9073e-08 - SCPH ITER 15 : DIFF = 2.5601e-08 - SCPH ITER 16 : DIFF = 2.2543e-08 - SCPH ITER 17 : DIFF = 1.9851e-08 - SCPH ITER 18 : DIFF = 1.7480e-08 - SCPH ITER 19 : DIFF = 1.5393e-08 - SCPH ITER 20 : DIFF = 1.3555e-08 - SCPH ITER 21 : DIFF = 1.1936e-08 - SCPH ITER 22 : DIFF = 1.0511e-08 - SCPH ITER 23 : DIFF = 9.2559e-09 + SCPH ITER 2 : DIFF = 1.3554e-07 + SCPH ITER 3 : DIFF = 1.1931e-07 + SCPH ITER 4 : DIFF = 1.0503e-07 + SCPH ITER 5 : DIFF = 9.2464e-08 + SCPH ITER 6 : DIFF = 8.1404e-08 + SCPH ITER 7 : DIFF = 7.1670e-08 + SCPH ITER 8 : DIFF = 6.3101e-08 + SCPH ITER 9 : DIFF = 5.5558e-08 + SCPH ITER 10 : DIFF = 4.8918e-08 + SCPH ITER 11 : DIFF = 4.3073e-08 + SCPH ITER 12 : DIFF = 3.7927e-08 + SCPH ITER 13 : DIFF = 3.3396e-08 + SCPH ITER 14 : DIFF = 2.9406e-08 + SCPH ITER 15 : DIFF = 2.5894e-08 + SCPH ITER 16 : DIFF = 2.2801e-08 + SCPH ITER 17 : DIFF = 2.0078e-08 + SCPH ITER 18 : DIFF = 1.7680e-08 + SCPH ITER 19 : DIFF = 1.5569e-08 + SCPH ITER 20 : DIFF = 1.3710e-08 + SCPH ITER 21 : DIFF = 1.2073e-08 + SCPH ITER 22 : DIFF = 1.0631e-08 + SCPH ITER 23 : DIFF = 9.3620e-09 + SCPH ITER 24 : DIFF = 8.2442e-09 + SCPH ITER 25 : DIFF = 7.2599e-09 + SCPH ITER 26 : DIFF = 6.3931e-09 + SCPH ITER 27 : DIFF = 5.6298e-09 + SCPH ITER 28 : DIFF = 4.9577e-09 + SCPH ITER 29 : DIFF = 4.3658e-09 + SCPH ITER 30 : DIFF = 3.8445e-09 + SCPH ITER 31 : DIFF = 3.3855e-09 + SCPH ITER 32 : DIFF = 2.9813e-09 + SCPH ITER 33 : DIFF = 2.6254e-09 + SCPH ITER 34 : DIFF = 2.3120e-09 + SCPH ITER 35 : DIFF = 2.0359e-09 + SCPH ITER 36 : DIFF = 1.7929e-09 + SCPH ITER 37 : DIFF = 1.5788e-09 + SCPH ITER 38 : DIFF = 1.3903e-09 + SCPH ITER 39 : DIFF = 1.2243e-09 + SCPH ITER 40 : DIFF = 1.0781e-09 + SCPH ITER 41 : DIFF = 9.4941e-10 + SCPH ITER 42 : DIFF = 8.3606e-10 + SCPH ITER 43 : DIFF = 7.3623e-10 + SCPH ITER 44 : DIFF = 6.4833e-10 + SCPH ITER 45 : DIFF = 5.7092e-10 + SCPH ITER 46 : DIFF = 5.0275e-10 + SCPH ITER 47 : DIFF = 4.4272e-10 + SCPH ITER 48 : DIFF = 3.8986e-10 + SCPH ITER 49 : DIFF = 3.4331e-10 + SCPH ITER 50 : DIFF = 3.0232e-10 + SCPH ITER 51 : DIFF = 2.6622e-10 + SCPH ITER 52 : DIFF = 2.3443e-10 + SCPH ITER 53 : DIFF = 2.0646e-10 + SCPH ITER 54 : DIFF = 1.8181e-10 + SCPH ITER 55 : DIFF = 1.6009e-10 + SCPH ITER 56 : DIFF = 1.4096e-10 + SCPH ITER 57 : DIFF = 1.2415e-10 + SCPH ITER 58 : DIFF = 1.0933e-10 + SCPH ITER 59 : DIFF = 9.6309e-11 DIFF < SCPH_TOL : break SCPH loop - Temp = 8.0000e+02 : convergence achieved in 23 iterations. + Temp = 8.0000e+02 : convergence achieved in 59 iterations. New eigenvalues - ik_interpolate = 1 is = 1 omega2 = 0.0000e+00 - ik_interpolate = 1 is = 2 omega2 = 6.6174e-23 - ik_interpolate = 1 is = 3 omega2 = 1.0855e-22 - ik_interpolate = 1 is = 4 omega2 = 3.6800e-07 - ik_interpolate = 1 is = 5 omega2 = 3.6800e-07 - ik_interpolate = 1 is = 6 omega2 = 3.6800e-07 - - ik_interpolate = 2 is = 1 omega2 = 1.4775e-07 - ik_interpolate = 2 is = 2 omega2 = 1.4775e-07 - ik_interpolate = 2 is = 3 omega2 = 2.6813e-07 - ik_interpolate = 2 is = 4 omega2 = 7.8698e-07 - ik_interpolate = 2 is = 5 omega2 = 7.8698e-07 - ik_interpolate = 2 is = 6 omega2 = 1.2852e-06 - - ik_interpolate = 3 is = 1 omega2 = 3.2271e-07 - ik_interpolate = 3 is = 2 omega2 = 3.2271e-07 - ik_interpolate = 3 is = 3 omega2 = 6.9915e-07 - ik_interpolate = 3 is = 4 omega2 = 8.1966e-07 - ik_interpolate = 3 is = 5 omega2 = 8.1966e-07 - ik_interpolate = 3 is = 6 omega2 = 9.7992e-07 - - ik_interpolate = 4 is = 1 omega2 = 1.4775e-07 - ik_interpolate = 4 is = 2 omega2 = 1.4775e-07 - ik_interpolate = 4 is = 3 omega2 = 2.6813e-07 - ik_interpolate = 4 is = 4 omega2 = 7.8698e-07 - ik_interpolate = 4 is = 5 omega2 = 7.8698e-07 - ik_interpolate = 4 is = 6 omega2 = 1.2852e-06 - - ik_interpolate = 5 is = 1 omega2 = 1.4775e-07 - ik_interpolate = 5 is = 2 omega2 = 1.4775e-07 - ik_interpolate = 5 is = 3 omega2 = 2.6813e-07 - ik_interpolate = 5 is = 4 omega2 = 7.8698e-07 - ik_interpolate = 5 is = 5 omega2 = 7.8698e-07 - ik_interpolate = 5 is = 6 omega2 = 1.2852e-06 - - ik_interpolate = 6 is = 1 omega2 = 4.3777e-08 - ik_interpolate = 6 is = 2 omega2 = 4.3777e-08 - ik_interpolate = 6 is = 3 omega2 = 4.7134e-07 - ik_interpolate = 6 is = 4 omega2 = 5.6539e-07 - ik_interpolate = 6 is = 5 omega2 = 5.6539e-07 - ik_interpolate = 6 is = 6 omega2 = 8.6949e-07 - - ik_interpolate = 7 is = 1 omega2 = 1.6895e-07 - ik_interpolate = 7 is = 2 omega2 = 1.9031e-07 + ik_interpolate = 1 is = 1 omega2 = 4.2281e-22 + ik_interpolate = 1 is = 2 omega2 = 4.4860e-22 + ik_interpolate = 1 is = 3 omega2 = 5.8236e-22 + ik_interpolate = 1 is = 4 omega2 = 3.6823e-07 + ik_interpolate = 1 is = 5 omega2 = 3.6823e-07 + ik_interpolate = 1 is = 6 omega2 = 3.6823e-07 + + ik_interpolate = 2 is = 1 omega2 = 1.4778e-07 + ik_interpolate = 2 is = 2 omega2 = 1.4778e-07 + ik_interpolate = 2 is = 3 omega2 = 2.6814e-07 + ik_interpolate = 2 is = 4 omega2 = 7.8713e-07 + ik_interpolate = 2 is = 5 omega2 = 7.8713e-07 + ik_interpolate = 2 is = 6 omega2 = 1.2853e-06 + + ik_interpolate = 3 is = 1 omega2 = 3.2278e-07 + ik_interpolate = 3 is = 2 omega2 = 3.2278e-07 + ik_interpolate = 3 is = 3 omega2 = 6.9919e-07 + ik_interpolate = 3 is = 4 omega2 = 8.1973e-07 + ik_interpolate = 3 is = 5 omega2 = 8.1973e-07 + ik_interpolate = 3 is = 6 omega2 = 9.8000e-07 + + ik_interpolate = 4 is = 1 omega2 = 1.4778e-07 + ik_interpolate = 4 is = 2 omega2 = 1.4778e-07 + ik_interpolate = 4 is = 3 omega2 = 2.6814e-07 + ik_interpolate = 4 is = 4 omega2 = 7.8713e-07 + ik_interpolate = 4 is = 5 omega2 = 7.8713e-07 + ik_interpolate = 4 is = 6 omega2 = 1.2853e-06 + + ik_interpolate = 5 is = 1 omega2 = 1.4778e-07 + ik_interpolate = 5 is = 2 omega2 = 1.4778e-07 + ik_interpolate = 5 is = 3 omega2 = 2.6814e-07 + ik_interpolate = 5 is = 4 omega2 = 7.8713e-07 + ik_interpolate = 5 is = 5 omega2 = 7.8713e-07 + ik_interpolate = 5 is = 6 omega2 = 1.2853e-06 + + ik_interpolate = 6 is = 1 omega2 = 4.3780e-08 + ik_interpolate = 6 is = 2 omega2 = 4.3780e-08 + ik_interpolate = 6 is = 3 omega2 = 4.7141e-07 + ik_interpolate = 6 is = 4 omega2 = 5.6560e-07 + ik_interpolate = 6 is = 5 omega2 = 5.6560e-07 + ik_interpolate = 6 is = 6 omega2 = 8.6955e-07 + + ik_interpolate = 7 is = 1 omega2 = 1.6898e-07 + ik_interpolate = 7 is = 2 omega2 = 1.9034e-07 ik_interpolate = 7 is = 3 omega2 = 2.8491e-07 - ik_interpolate = 7 is = 4 omega2 = 7.4953e-07 - ik_interpolate = 7 is = 5 omega2 = 8.2555e-07 - ik_interpolate = 7 is = 6 omega2 = 9.6680e-07 + ik_interpolate = 7 is = 4 omega2 = 7.4967e-07 + ik_interpolate = 7 is = 5 omega2 = 8.2570e-07 + ik_interpolate = 7 is = 6 omega2 = 9.6695e-07 ik_interpolate = 8 is = 1 omega2 = 8.2123e-08 - ik_interpolate = 8 is = 2 omega2 = 3.0095e-07 - ik_interpolate = 8 is = 3 omega2 = 5.7215e-07 - ik_interpolate = 8 is = 4 omega2 = 6.5143e-07 - ik_interpolate = 8 is = 5 omega2 = 7.8302e-07 - ik_interpolate = 8 is = 6 omega2 = 9.2831e-07 - - ik_interpolate = 9 is = 1 omega2 = 3.2271e-07 - ik_interpolate = 9 is = 2 omega2 = 3.2271e-07 - ik_interpolate = 9 is = 3 omega2 = 6.9915e-07 - ik_interpolate = 9 is = 4 omega2 = 8.1966e-07 - ik_interpolate = 9 is = 5 omega2 = 8.1966e-07 - ik_interpolate = 9 is = 6 omega2 = 9.7992e-07 - - ik_interpolate = 10 is = 1 omega2 = 1.6895e-07 - ik_interpolate = 10 is = 2 omega2 = 1.9031e-07 + ik_interpolate = 8 is = 2 omega2 = 3.0102e-07 + ik_interpolate = 8 is = 3 omega2 = 5.7220e-07 + ik_interpolate = 8 is = 4 omega2 = 6.5163e-07 + ik_interpolate = 8 is = 5 omega2 = 7.8309e-07 + ik_interpolate = 8 is = 6 omega2 = 9.2839e-07 + + ik_interpolate = 9 is = 1 omega2 = 3.2278e-07 + ik_interpolate = 9 is = 2 omega2 = 3.2278e-07 + ik_interpolate = 9 is = 3 omega2 = 6.9919e-07 + ik_interpolate = 9 is = 4 omega2 = 8.1973e-07 + ik_interpolate = 9 is = 5 omega2 = 8.1973e-07 + ik_interpolate = 9 is = 6 omega2 = 9.8000e-07 + + ik_interpolate = 10 is = 1 omega2 = 1.6898e-07 + ik_interpolate = 10 is = 2 omega2 = 1.9034e-07 ik_interpolate = 10 is = 3 omega2 = 2.8491e-07 - ik_interpolate = 10 is = 4 omega2 = 7.4953e-07 - ik_interpolate = 10 is = 5 omega2 = 8.2555e-07 - ik_interpolate = 10 is = 6 omega2 = 9.6680e-07 - - ik_interpolate = 11 is = 1 omega2 = 6.1508e-08 - ik_interpolate = 11 is = 2 omega2 = 6.1508e-08 - ik_interpolate = 11 is = 3 omega2 = 1.1103e-07 - ik_interpolate = 11 is = 4 omega2 = 6.1985e-07 - ik_interpolate = 11 is = 5 omega2 = 6.1985e-07 - ik_interpolate = 11 is = 6 omega2 = 7.0974e-07 - - ik_interpolate = 12 is = 1 omega2 = 1.6895e-07 - ik_interpolate = 12 is = 2 omega2 = 1.9031e-07 + ik_interpolate = 10 is = 4 omega2 = 7.4967e-07 + ik_interpolate = 10 is = 5 omega2 = 8.2570e-07 + ik_interpolate = 10 is = 6 omega2 = 9.6695e-07 + + ik_interpolate = 11 is = 1 omega2 = 6.1519e-08 + ik_interpolate = 11 is = 2 omega2 = 6.1519e-08 + ik_interpolate = 11 is = 3 omega2 = 1.1105e-07 + ik_interpolate = 11 is = 4 omega2 = 6.2005e-07 + ik_interpolate = 11 is = 5 omega2 = 6.2005e-07 + ik_interpolate = 11 is = 6 omega2 = 7.0993e-07 + + ik_interpolate = 12 is = 1 omega2 = 1.6898e-07 + ik_interpolate = 12 is = 2 omega2 = 1.9034e-07 ik_interpolate = 12 is = 3 omega2 = 2.8491e-07 - ik_interpolate = 12 is = 4 omega2 = 7.4953e-07 - ik_interpolate = 12 is = 5 omega2 = 8.2555e-07 - ik_interpolate = 12 is = 6 omega2 = 9.6680e-07 + ik_interpolate = 12 is = 4 omega2 = 7.4967e-07 + ik_interpolate = 12 is = 5 omega2 = 8.2570e-07 + ik_interpolate = 12 is = 6 omega2 = 9.6695e-07 - ik_interpolate = 13 is = 1 omega2 = 1.4775e-07 - ik_interpolate = 13 is = 2 omega2 = 1.4775e-07 - ik_interpolate = 13 is = 3 omega2 = 2.6813e-07 - ik_interpolate = 13 is = 4 omega2 = 7.8698e-07 - ik_interpolate = 13 is = 5 omega2 = 7.8698e-07 - ik_interpolate = 13 is = 6 omega2 = 1.2852e-06 + ik_interpolate = 13 is = 1 omega2 = 1.4778e-07 + ik_interpolate = 13 is = 2 omega2 = 1.4778e-07 + ik_interpolate = 13 is = 3 omega2 = 2.6814e-07 + ik_interpolate = 13 is = 4 omega2 = 7.8713e-07 + ik_interpolate = 13 is = 5 omega2 = 7.8713e-07 + ik_interpolate = 13 is = 6 omega2 = 1.2853e-06 ik_interpolate = 14 is = 1 omega2 = 8.2123e-08 - ik_interpolate = 14 is = 2 omega2 = 3.0095e-07 - ik_interpolate = 14 is = 3 omega2 = 5.7215e-07 - ik_interpolate = 14 is = 4 omega2 = 6.5143e-07 - ik_interpolate = 14 is = 5 omega2 = 7.8302e-07 - ik_interpolate = 14 is = 6 omega2 = 9.2831e-07 - - ik_interpolate = 15 is = 1 omega2 = 1.6895e-07 - ik_interpolate = 15 is = 2 omega2 = 1.9031e-07 + ik_interpolate = 14 is = 2 omega2 = 3.0102e-07 + ik_interpolate = 14 is = 3 omega2 = 5.7220e-07 + ik_interpolate = 14 is = 4 omega2 = 6.5163e-07 + ik_interpolate = 14 is = 5 omega2 = 7.8309e-07 + ik_interpolate = 14 is = 6 omega2 = 9.2839e-07 + + ik_interpolate = 15 is = 1 omega2 = 1.6898e-07 + ik_interpolate = 15 is = 2 omega2 = 1.9034e-07 ik_interpolate = 15 is = 3 omega2 = 2.8491e-07 - ik_interpolate = 15 is = 4 omega2 = 7.4953e-07 - ik_interpolate = 15 is = 5 omega2 = 8.2555e-07 - ik_interpolate = 15 is = 6 omega2 = 9.6680e-07 - - ik_interpolate = 16 is = 1 omega2 = 4.3777e-08 - ik_interpolate = 16 is = 2 omega2 = 4.3777e-08 - ik_interpolate = 16 is = 3 omega2 = 4.7134e-07 - ik_interpolate = 16 is = 4 omega2 = 5.6539e-07 - ik_interpolate = 16 is = 5 omega2 = 5.6539e-07 - ik_interpolate = 16 is = 6 omega2 = 8.6949e-07 - - ik_interpolate = 17 is = 1 omega2 = 1.4775e-07 - ik_interpolate = 17 is = 2 omega2 = 1.4775e-07 - ik_interpolate = 17 is = 3 omega2 = 2.6813e-07 - ik_interpolate = 17 is = 4 omega2 = 7.8698e-07 - ik_interpolate = 17 is = 5 omega2 = 7.8698e-07 - ik_interpolate = 17 is = 6 omega2 = 1.2852e-06 - - ik_interpolate = 18 is = 1 omega2 = 4.3777e-08 - ik_interpolate = 18 is = 2 omega2 = 4.3777e-08 - ik_interpolate = 18 is = 3 omega2 = 4.7134e-07 - ik_interpolate = 18 is = 4 omega2 = 5.6539e-07 - ik_interpolate = 18 is = 5 omega2 = 5.6539e-07 - ik_interpolate = 18 is = 6 omega2 = 8.6949e-07 - - ik_interpolate = 19 is = 1 omega2 = 1.6895e-07 - ik_interpolate = 19 is = 2 omega2 = 1.9031e-07 + ik_interpolate = 15 is = 4 omega2 = 7.4967e-07 + ik_interpolate = 15 is = 5 omega2 = 8.2570e-07 + ik_interpolate = 15 is = 6 omega2 = 9.6695e-07 + + ik_interpolate = 16 is = 1 omega2 = 4.3780e-08 + ik_interpolate = 16 is = 2 omega2 = 4.3780e-08 + ik_interpolate = 16 is = 3 omega2 = 4.7141e-07 + ik_interpolate = 16 is = 4 omega2 = 5.6560e-07 + ik_interpolate = 16 is = 5 omega2 = 5.6560e-07 + ik_interpolate = 16 is = 6 omega2 = 8.6955e-07 + + ik_interpolate = 17 is = 1 omega2 = 1.4778e-07 + ik_interpolate = 17 is = 2 omega2 = 1.4778e-07 + ik_interpolate = 17 is = 3 omega2 = 2.6814e-07 + ik_interpolate = 17 is = 4 omega2 = 7.8713e-07 + ik_interpolate = 17 is = 5 omega2 = 7.8713e-07 + ik_interpolate = 17 is = 6 omega2 = 1.2853e-06 + + ik_interpolate = 18 is = 1 omega2 = 4.3780e-08 + ik_interpolate = 18 is = 2 omega2 = 4.3780e-08 + ik_interpolate = 18 is = 3 omega2 = 4.7141e-07 + ik_interpolate = 18 is = 4 omega2 = 5.6560e-07 + ik_interpolate = 18 is = 5 omega2 = 5.6560e-07 + ik_interpolate = 18 is = 6 omega2 = 8.6955e-07 + + ik_interpolate = 19 is = 1 omega2 = 1.6898e-07 + ik_interpolate = 19 is = 2 omega2 = 1.9034e-07 ik_interpolate = 19 is = 3 omega2 = 2.8491e-07 - ik_interpolate = 19 is = 4 omega2 = 7.4953e-07 - ik_interpolate = 19 is = 5 omega2 = 8.2555e-07 - ik_interpolate = 19 is = 6 omega2 = 9.6680e-07 + ik_interpolate = 19 is = 4 omega2 = 7.4967e-07 + ik_interpolate = 19 is = 5 omega2 = 8.2570e-07 + ik_interpolate = 19 is = 6 omega2 = 9.6695e-07 ik_interpolate = 20 is = 1 omega2 = 8.2123e-08 - ik_interpolate = 20 is = 2 omega2 = 3.0095e-07 - ik_interpolate = 20 is = 3 omega2 = 5.7215e-07 - ik_interpolate = 20 is = 4 omega2 = 6.5143e-07 - ik_interpolate = 20 is = 5 omega2 = 7.8302e-07 - ik_interpolate = 20 is = 6 omega2 = 9.2831e-07 - - ik_interpolate = 21 is = 1 omega2 = 4.3777e-08 - ik_interpolate = 21 is = 2 omega2 = 4.3777e-08 - ik_interpolate = 21 is = 3 omega2 = 4.7134e-07 - ik_interpolate = 21 is = 4 omega2 = 5.6539e-07 - ik_interpolate = 21 is = 5 omega2 = 5.6539e-07 - ik_interpolate = 21 is = 6 omega2 = 8.6949e-07 - - ik_interpolate = 22 is = 1 omega2 = 1.4775e-07 - ik_interpolate = 22 is = 2 omega2 = 1.4775e-07 - ik_interpolate = 22 is = 3 omega2 = 2.6813e-07 - ik_interpolate = 22 is = 4 omega2 = 7.8698e-07 - ik_interpolate = 22 is = 5 omega2 = 7.8698e-07 - ik_interpolate = 22 is = 6 omega2 = 1.2852e-06 + ik_interpolate = 20 is = 2 omega2 = 3.0102e-07 + ik_interpolate = 20 is = 3 omega2 = 5.7220e-07 + ik_interpolate = 20 is = 4 omega2 = 6.5163e-07 + ik_interpolate = 20 is = 5 omega2 = 7.8309e-07 + ik_interpolate = 20 is = 6 omega2 = 9.2839e-07 + + ik_interpolate = 21 is = 1 omega2 = 4.3780e-08 + ik_interpolate = 21 is = 2 omega2 = 4.3780e-08 + ik_interpolate = 21 is = 3 omega2 = 4.7141e-07 + ik_interpolate = 21 is = 4 omega2 = 5.6560e-07 + ik_interpolate = 21 is = 5 omega2 = 5.6560e-07 + ik_interpolate = 21 is = 6 omega2 = 8.6955e-07 + + ik_interpolate = 22 is = 1 omega2 = 1.4778e-07 + ik_interpolate = 22 is = 2 omega2 = 1.4778e-07 + ik_interpolate = 22 is = 3 omega2 = 2.6814e-07 + ik_interpolate = 22 is = 4 omega2 = 7.8713e-07 + ik_interpolate = 22 is = 5 omega2 = 7.8713e-07 + ik_interpolate = 22 is = 6 omega2 = 1.2853e-06 ik_interpolate = 23 is = 1 omega2 = 8.2123e-08 - ik_interpolate = 23 is = 2 omega2 = 3.0095e-07 - ik_interpolate = 23 is = 3 omega2 = 5.7215e-07 - ik_interpolate = 23 is = 4 omega2 = 6.5143e-07 - ik_interpolate = 23 is = 5 omega2 = 7.8302e-07 - ik_interpolate = 23 is = 6 omega2 = 9.2831e-07 - - ik_interpolate = 24 is = 1 omega2 = 1.6895e-07 - ik_interpolate = 24 is = 2 omega2 = 1.9031e-07 + ik_interpolate = 23 is = 2 omega2 = 3.0102e-07 + ik_interpolate = 23 is = 3 omega2 = 5.7220e-07 + ik_interpolate = 23 is = 4 omega2 = 6.5163e-07 + ik_interpolate = 23 is = 5 omega2 = 7.8309e-07 + ik_interpolate = 23 is = 6 omega2 = 9.2839e-07 + + ik_interpolate = 24 is = 1 omega2 = 1.6898e-07 + ik_interpolate = 24 is = 2 omega2 = 1.9034e-07 ik_interpolate = 24 is = 3 omega2 = 2.8491e-07 - ik_interpolate = 24 is = 4 omega2 = 7.4953e-07 - ik_interpolate = 24 is = 5 omega2 = 8.2555e-07 - ik_interpolate = 24 is = 6 omega2 = 9.6680e-07 + ik_interpolate = 24 is = 4 omega2 = 7.4967e-07 + ik_interpolate = 24 is = 5 omega2 = 8.2570e-07 + ik_interpolate = 24 is = 6 omega2 = 9.6695e-07 - ik_interpolate = 25 is = 1 omega2 = 1.6895e-07 - ik_interpolate = 25 is = 2 omega2 = 1.9031e-07 + ik_interpolate = 25 is = 1 omega2 = 1.6898e-07 + ik_interpolate = 25 is = 2 omega2 = 1.9034e-07 ik_interpolate = 25 is = 3 omega2 = 2.8491e-07 - ik_interpolate = 25 is = 4 omega2 = 7.4953e-07 - ik_interpolate = 25 is = 5 omega2 = 8.2555e-07 - ik_interpolate = 25 is = 6 omega2 = 9.6680e-07 + ik_interpolate = 25 is = 4 omega2 = 7.4967e-07 + ik_interpolate = 25 is = 5 omega2 = 8.2570e-07 + ik_interpolate = 25 is = 6 omega2 = 9.6695e-07 ik_interpolate = 26 is = 1 omega2 = 8.2123e-08 - ik_interpolate = 26 is = 2 omega2 = 3.0095e-07 - ik_interpolate = 26 is = 3 omega2 = 5.7215e-07 - ik_interpolate = 26 is = 4 omega2 = 6.5143e-07 - ik_interpolate = 26 is = 5 omega2 = 7.8302e-07 - ik_interpolate = 26 is = 6 omega2 = 9.2831e-07 - - ik_interpolate = 27 is = 1 omega2 = 1.6895e-07 - ik_interpolate = 27 is = 2 omega2 = 1.9031e-07 + ik_interpolate = 26 is = 2 omega2 = 3.0102e-07 + ik_interpolate = 26 is = 3 omega2 = 5.7220e-07 + ik_interpolate = 26 is = 4 omega2 = 6.5163e-07 + ik_interpolate = 26 is = 5 omega2 = 7.8309e-07 + ik_interpolate = 26 is = 6 omega2 = 9.2839e-07 + + ik_interpolate = 27 is = 1 omega2 = 1.6898e-07 + ik_interpolate = 27 is = 2 omega2 = 1.9034e-07 ik_interpolate = 27 is = 3 omega2 = 2.8491e-07 - ik_interpolate = 27 is = 4 omega2 = 7.4953e-07 - ik_interpolate = 27 is = 5 omega2 = 8.2555e-07 - ik_interpolate = 27 is = 6 omega2 = 9.6680e-07 + ik_interpolate = 27 is = 4 omega2 = 7.4967e-07 + ik_interpolate = 27 is = 5 omega2 = 8.2570e-07 + ik_interpolate = 27 is = 6 omega2 = 9.6695e-07 - ik_interpolate = 28 is = 1 omega2 = 1.0050e-07 - ik_interpolate = 28 is = 2 omega2 = 1.0050e-07 - ik_interpolate = 28 is = 3 omega2 = 4.0995e-07 - ik_interpolate = 28 is = 4 omega2 = 6.8347e-07 - ik_interpolate = 28 is = 5 omega2 = 6.8347e-07 - ik_interpolate = 28 is = 6 omega2 = 8.4872e-07 + ik_interpolate = 28 is = 1 omega2 = 1.0051e-07 + ik_interpolate = 28 is = 2 omega2 = 1.0051e-07 + ik_interpolate = 28 is = 3 omega2 = 4.1002e-07 + ik_interpolate = 28 is = 4 omega2 = 6.8366e-07 + ik_interpolate = 28 is = 5 omega2 = 6.8366e-07 + ik_interpolate = 28 is = 6 omega2 = 8.4881e-07 ik_interpolate = 29 is = 1 omega2 = 8.2123e-08 - ik_interpolate = 29 is = 2 omega2 = 3.0095e-07 - ik_interpolate = 29 is = 3 omega2 = 5.7215e-07 - ik_interpolate = 29 is = 4 omega2 = 6.5143e-07 - ik_interpolate = 29 is = 5 omega2 = 7.8302e-07 - ik_interpolate = 29 is = 6 omega2 = 9.2831e-07 - - ik_interpolate = 30 is = 1 omega2 = 1.6895e-07 - ik_interpolate = 30 is = 2 omega2 = 1.9031e-07 + ik_interpolate = 29 is = 2 omega2 = 3.0102e-07 + ik_interpolate = 29 is = 3 omega2 = 5.7220e-07 + ik_interpolate = 29 is = 4 omega2 = 6.5163e-07 + ik_interpolate = 29 is = 5 omega2 = 7.8309e-07 + ik_interpolate = 29 is = 6 omega2 = 9.2839e-07 + + ik_interpolate = 30 is = 1 omega2 = 1.6898e-07 + ik_interpolate = 30 is = 2 omega2 = 1.9034e-07 ik_interpolate = 30 is = 3 omega2 = 2.8491e-07 - ik_interpolate = 30 is = 4 omega2 = 7.4953e-07 - ik_interpolate = 30 is = 5 omega2 = 8.2555e-07 - ik_interpolate = 30 is = 6 omega2 = 9.6680e-07 - - ik_interpolate = 31 is = 1 omega2 = 1.0050e-07 - ik_interpolate = 31 is = 2 omega2 = 1.0050e-07 - ik_interpolate = 31 is = 3 omega2 = 4.0995e-07 - ik_interpolate = 31 is = 4 omega2 = 6.8347e-07 - ik_interpolate = 31 is = 5 omega2 = 6.8347e-07 - ik_interpolate = 31 is = 6 omega2 = 8.4872e-07 - - ik_interpolate = 32 is = 1 omega2 = 1.6895e-07 - ik_interpolate = 32 is = 2 omega2 = 1.9031e-07 + ik_interpolate = 30 is = 4 omega2 = 7.4967e-07 + ik_interpolate = 30 is = 5 omega2 = 8.2570e-07 + ik_interpolate = 30 is = 6 omega2 = 9.6695e-07 + + ik_interpolate = 31 is = 1 omega2 = 1.0051e-07 + ik_interpolate = 31 is = 2 omega2 = 1.0051e-07 + ik_interpolate = 31 is = 3 omega2 = 4.1002e-07 + ik_interpolate = 31 is = 4 omega2 = 6.8366e-07 + ik_interpolate = 31 is = 5 omega2 = 6.8366e-07 + ik_interpolate = 31 is = 6 omega2 = 8.4881e-07 + + ik_interpolate = 32 is = 1 omega2 = 1.6898e-07 + ik_interpolate = 32 is = 2 omega2 = 1.9034e-07 ik_interpolate = 32 is = 3 omega2 = 2.8491e-07 - ik_interpolate = 32 is = 4 omega2 = 7.4953e-07 - ik_interpolate = 32 is = 5 omega2 = 8.2555e-07 - ik_interpolate = 32 is = 6 omega2 = 9.6680e-07 - - ik_interpolate = 33 is = 1 omega2 = 3.2271e-07 - ik_interpolate = 33 is = 2 omega2 = 3.2271e-07 - ik_interpolate = 33 is = 3 omega2 = 6.9915e-07 - ik_interpolate = 33 is = 4 omega2 = 8.1966e-07 - ik_interpolate = 33 is = 5 omega2 = 8.1966e-07 - ik_interpolate = 33 is = 6 omega2 = 9.7992e-07 - - ik_interpolate = 34 is = 1 omega2 = 1.6895e-07 - ik_interpolate = 34 is = 2 omega2 = 1.9031e-07 + ik_interpolate = 32 is = 4 omega2 = 7.4967e-07 + ik_interpolate = 32 is = 5 omega2 = 8.2570e-07 + ik_interpolate = 32 is = 6 omega2 = 9.6695e-07 + + ik_interpolate = 33 is = 1 omega2 = 3.2278e-07 + ik_interpolate = 33 is = 2 omega2 = 3.2278e-07 + ik_interpolate = 33 is = 3 omega2 = 6.9919e-07 + ik_interpolate = 33 is = 4 omega2 = 8.1973e-07 + ik_interpolate = 33 is = 5 omega2 = 8.1973e-07 + ik_interpolate = 33 is = 6 omega2 = 9.8000e-07 + + ik_interpolate = 34 is = 1 omega2 = 1.6898e-07 + ik_interpolate = 34 is = 2 omega2 = 1.9034e-07 ik_interpolate = 34 is = 3 omega2 = 2.8491e-07 - ik_interpolate = 34 is = 4 omega2 = 7.4953e-07 - ik_interpolate = 34 is = 5 omega2 = 8.2555e-07 - ik_interpolate = 34 is = 6 omega2 = 9.6680e-07 - - ik_interpolate = 35 is = 1 omega2 = 6.1508e-08 - ik_interpolate = 35 is = 2 omega2 = 6.1508e-08 - ik_interpolate = 35 is = 3 omega2 = 1.1103e-07 - ik_interpolate = 35 is = 4 omega2 = 6.1985e-07 - ik_interpolate = 35 is = 5 omega2 = 6.1985e-07 - ik_interpolate = 35 is = 6 omega2 = 7.0974e-07 - - ik_interpolate = 36 is = 1 omega2 = 1.6895e-07 - ik_interpolate = 36 is = 2 omega2 = 1.9031e-07 + ik_interpolate = 34 is = 4 omega2 = 7.4967e-07 + ik_interpolate = 34 is = 5 omega2 = 8.2570e-07 + ik_interpolate = 34 is = 6 omega2 = 9.6695e-07 + + ik_interpolate = 35 is = 1 omega2 = 6.1519e-08 + ik_interpolate = 35 is = 2 omega2 = 6.1519e-08 + ik_interpolate = 35 is = 3 omega2 = 1.1105e-07 + ik_interpolate = 35 is = 4 omega2 = 6.2005e-07 + ik_interpolate = 35 is = 5 omega2 = 6.2005e-07 + ik_interpolate = 35 is = 6 omega2 = 7.0993e-07 + + ik_interpolate = 36 is = 1 omega2 = 1.6898e-07 + ik_interpolate = 36 is = 2 omega2 = 1.9034e-07 ik_interpolate = 36 is = 3 omega2 = 2.8491e-07 - ik_interpolate = 36 is = 4 omega2 = 7.4953e-07 - ik_interpolate = 36 is = 5 omega2 = 8.2555e-07 - ik_interpolate = 36 is = 6 omega2 = 9.6680e-07 + ik_interpolate = 36 is = 4 omega2 = 7.4967e-07 + ik_interpolate = 36 is = 5 omega2 = 8.2570e-07 + ik_interpolate = 36 is = 6 omega2 = 9.6695e-07 - ik_interpolate = 37 is = 1 omega2 = 1.6895e-07 - ik_interpolate = 37 is = 2 omega2 = 1.9031e-07 + ik_interpolate = 37 is = 1 omega2 = 1.6898e-07 + ik_interpolate = 37 is = 2 omega2 = 1.9034e-07 ik_interpolate = 37 is = 3 omega2 = 2.8491e-07 - ik_interpolate = 37 is = 4 omega2 = 7.4953e-07 - ik_interpolate = 37 is = 5 omega2 = 8.2555e-07 - ik_interpolate = 37 is = 6 omega2 = 9.6680e-07 + ik_interpolate = 37 is = 4 omega2 = 7.4967e-07 + ik_interpolate = 37 is = 5 omega2 = 8.2570e-07 + ik_interpolate = 37 is = 6 omega2 = 9.6695e-07 ik_interpolate = 38 is = 1 omega2 = 8.2123e-08 - ik_interpolate = 38 is = 2 omega2 = 3.0095e-07 - ik_interpolate = 38 is = 3 omega2 = 5.7215e-07 - ik_interpolate = 38 is = 4 omega2 = 6.5143e-07 - ik_interpolate = 38 is = 5 omega2 = 7.8302e-07 - ik_interpolate = 38 is = 6 omega2 = 9.2831e-07 - - ik_interpolate = 39 is = 1 omega2 = 1.6895e-07 - ik_interpolate = 39 is = 2 omega2 = 1.9031e-07 + ik_interpolate = 38 is = 2 omega2 = 3.0102e-07 + ik_interpolate = 38 is = 3 omega2 = 5.7220e-07 + ik_interpolate = 38 is = 4 omega2 = 6.5163e-07 + ik_interpolate = 38 is = 5 omega2 = 7.8309e-07 + ik_interpolate = 38 is = 6 omega2 = 9.2839e-07 + + ik_interpolate = 39 is = 1 omega2 = 1.6898e-07 + ik_interpolate = 39 is = 2 omega2 = 1.9034e-07 ik_interpolate = 39 is = 3 omega2 = 2.8491e-07 - ik_interpolate = 39 is = 4 omega2 = 7.4953e-07 - ik_interpolate = 39 is = 5 omega2 = 8.2555e-07 - ik_interpolate = 39 is = 6 omega2 = 9.6680e-07 - - ik_interpolate = 40 is = 1 omega2 = 1.0050e-07 - ik_interpolate = 40 is = 2 omega2 = 1.0050e-07 - ik_interpolate = 40 is = 3 omega2 = 4.0995e-07 - ik_interpolate = 40 is = 4 omega2 = 6.8347e-07 - ik_interpolate = 40 is = 5 omega2 = 6.8347e-07 - ik_interpolate = 40 is = 6 omega2 = 8.4872e-07 - - ik_interpolate = 41 is = 1 omega2 = 6.1508e-08 - ik_interpolate = 41 is = 2 omega2 = 6.1508e-08 - ik_interpolate = 41 is = 3 omega2 = 1.1103e-07 - ik_interpolate = 41 is = 4 omega2 = 6.1985e-07 - ik_interpolate = 41 is = 5 omega2 = 6.1985e-07 - ik_interpolate = 41 is = 6 omega2 = 7.0974e-07 - - ik_interpolate = 42 is = 1 omega2 = 1.6895e-07 - ik_interpolate = 42 is = 2 omega2 = 1.9031e-07 + ik_interpolate = 39 is = 4 omega2 = 7.4967e-07 + ik_interpolate = 39 is = 5 omega2 = 8.2570e-07 + ik_interpolate = 39 is = 6 omega2 = 9.6695e-07 + + ik_interpolate = 40 is = 1 omega2 = 1.0051e-07 + ik_interpolate = 40 is = 2 omega2 = 1.0051e-07 + ik_interpolate = 40 is = 3 omega2 = 4.1002e-07 + ik_interpolate = 40 is = 4 omega2 = 6.8366e-07 + ik_interpolate = 40 is = 5 omega2 = 6.8366e-07 + ik_interpolate = 40 is = 6 omega2 = 8.4881e-07 + + ik_interpolate = 41 is = 1 omega2 = 6.1519e-08 + ik_interpolate = 41 is = 2 omega2 = 6.1519e-08 + ik_interpolate = 41 is = 3 omega2 = 1.1105e-07 + ik_interpolate = 41 is = 4 omega2 = 6.2005e-07 + ik_interpolate = 41 is = 5 omega2 = 6.2005e-07 + ik_interpolate = 41 is = 6 omega2 = 7.0993e-07 + + ik_interpolate = 42 is = 1 omega2 = 1.6898e-07 + ik_interpolate = 42 is = 2 omega2 = 1.9034e-07 ik_interpolate = 42 is = 3 omega2 = 2.8491e-07 - ik_interpolate = 42 is = 4 omega2 = 7.4953e-07 - ik_interpolate = 42 is = 5 omega2 = 8.2555e-07 - ik_interpolate = 42 is = 6 omega2 = 9.6680e-07 - - ik_interpolate = 43 is = 1 omega2 = 3.2271e-07 - ik_interpolate = 43 is = 2 omega2 = 3.2271e-07 - ik_interpolate = 43 is = 3 omega2 = 6.9915e-07 - ik_interpolate = 43 is = 4 omega2 = 8.1966e-07 - ik_interpolate = 43 is = 5 omega2 = 8.1966e-07 - ik_interpolate = 43 is = 6 omega2 = 9.7992e-07 - - ik_interpolate = 44 is = 1 omega2 = 1.6895e-07 - ik_interpolate = 44 is = 2 omega2 = 1.9031e-07 + ik_interpolate = 42 is = 4 omega2 = 7.4967e-07 + ik_interpolate = 42 is = 5 omega2 = 8.2570e-07 + ik_interpolate = 42 is = 6 omega2 = 9.6695e-07 + + ik_interpolate = 43 is = 1 omega2 = 3.2278e-07 + ik_interpolate = 43 is = 2 omega2 = 3.2278e-07 + ik_interpolate = 43 is = 3 omega2 = 6.9919e-07 + ik_interpolate = 43 is = 4 omega2 = 8.1973e-07 + ik_interpolate = 43 is = 5 omega2 = 8.1973e-07 + ik_interpolate = 43 is = 6 omega2 = 9.8000e-07 + + ik_interpolate = 44 is = 1 omega2 = 1.6898e-07 + ik_interpolate = 44 is = 2 omega2 = 1.9034e-07 ik_interpolate = 44 is = 3 omega2 = 2.8491e-07 - ik_interpolate = 44 is = 4 omega2 = 7.4953e-07 - ik_interpolate = 44 is = 5 omega2 = 8.2555e-07 - ik_interpolate = 44 is = 6 omega2 = 9.6680e-07 + ik_interpolate = 44 is = 4 omega2 = 7.4967e-07 + ik_interpolate = 44 is = 5 omega2 = 8.2570e-07 + ik_interpolate = 44 is = 6 omega2 = 9.6695e-07 - ik_interpolate = 45 is = 1 omega2 = 1.6895e-07 - ik_interpolate = 45 is = 2 omega2 = 1.9031e-07 + ik_interpolate = 45 is = 1 omega2 = 1.6898e-07 + ik_interpolate = 45 is = 2 omega2 = 1.9034e-07 ik_interpolate = 45 is = 3 omega2 = 2.8491e-07 - ik_interpolate = 45 is = 4 omega2 = 7.4953e-07 - ik_interpolate = 45 is = 5 omega2 = 8.2555e-07 - ik_interpolate = 45 is = 6 omega2 = 9.6680e-07 - - ik_interpolate = 46 is = 1 omega2 = 1.0050e-07 - ik_interpolate = 46 is = 2 omega2 = 1.0050e-07 - ik_interpolate = 46 is = 3 omega2 = 4.0995e-07 - ik_interpolate = 46 is = 4 omega2 = 6.8347e-07 - ik_interpolate = 46 is = 5 omega2 = 6.8347e-07 - ik_interpolate = 46 is = 6 omega2 = 8.4872e-07 - - ik_interpolate = 47 is = 1 omega2 = 1.6895e-07 - ik_interpolate = 47 is = 2 omega2 = 1.9031e-07 + ik_interpolate = 45 is = 4 omega2 = 7.4967e-07 + ik_interpolate = 45 is = 5 omega2 = 8.2570e-07 + ik_interpolate = 45 is = 6 omega2 = 9.6695e-07 + + ik_interpolate = 46 is = 1 omega2 = 1.0051e-07 + ik_interpolate = 46 is = 2 omega2 = 1.0051e-07 + ik_interpolate = 46 is = 3 omega2 = 4.1002e-07 + ik_interpolate = 46 is = 4 omega2 = 6.8366e-07 + ik_interpolate = 46 is = 5 omega2 = 6.8366e-07 + ik_interpolate = 46 is = 6 omega2 = 8.4881e-07 + + ik_interpolate = 47 is = 1 omega2 = 1.6898e-07 + ik_interpolate = 47 is = 2 omega2 = 1.9034e-07 ik_interpolate = 47 is = 3 omega2 = 2.8491e-07 - ik_interpolate = 47 is = 4 omega2 = 7.4953e-07 - ik_interpolate = 47 is = 5 omega2 = 8.2555e-07 - ik_interpolate = 47 is = 6 omega2 = 9.6680e-07 + ik_interpolate = 47 is = 4 omega2 = 7.4967e-07 + ik_interpolate = 47 is = 5 omega2 = 8.2570e-07 + ik_interpolate = 47 is = 6 omega2 = 9.6695e-07 ik_interpolate = 48 is = 1 omega2 = 8.2123e-08 - ik_interpolate = 48 is = 2 omega2 = 3.0095e-07 - ik_interpolate = 48 is = 3 omega2 = 5.7215e-07 - ik_interpolate = 48 is = 4 omega2 = 6.5143e-07 - ik_interpolate = 48 is = 5 omega2 = 7.8302e-07 - ik_interpolate = 48 is = 6 omega2 = 9.2831e-07 - - ik_interpolate = 49 is = 1 omega2 = 1.4775e-07 - ik_interpolate = 49 is = 2 omega2 = 1.4775e-07 - ik_interpolate = 49 is = 3 omega2 = 2.6813e-07 - ik_interpolate = 49 is = 4 omega2 = 7.8698e-07 - ik_interpolate = 49 is = 5 omega2 = 7.8698e-07 - ik_interpolate = 49 is = 6 omega2 = 1.2852e-06 + ik_interpolate = 48 is = 2 omega2 = 3.0102e-07 + ik_interpolate = 48 is = 3 omega2 = 5.7220e-07 + ik_interpolate = 48 is = 4 omega2 = 6.5163e-07 + ik_interpolate = 48 is = 5 omega2 = 7.8309e-07 + ik_interpolate = 48 is = 6 omega2 = 9.2839e-07 + + ik_interpolate = 49 is = 1 omega2 = 1.4778e-07 + ik_interpolate = 49 is = 2 omega2 = 1.4778e-07 + ik_interpolate = 49 is = 3 omega2 = 2.6814e-07 + ik_interpolate = 49 is = 4 omega2 = 7.8713e-07 + ik_interpolate = 49 is = 5 omega2 = 7.8713e-07 + ik_interpolate = 49 is = 6 omega2 = 1.2853e-06 ik_interpolate = 50 is = 1 omega2 = 8.2123e-08 - ik_interpolate = 50 is = 2 omega2 = 3.0095e-07 - ik_interpolate = 50 is = 3 omega2 = 5.7215e-07 - ik_interpolate = 50 is = 4 omega2 = 6.5143e-07 - ik_interpolate = 50 is = 5 omega2 = 7.8302e-07 - ik_interpolate = 50 is = 6 omega2 = 9.2831e-07 - - ik_interpolate = 51 is = 1 omega2 = 1.6895e-07 - ik_interpolate = 51 is = 2 omega2 = 1.9031e-07 + ik_interpolate = 50 is = 2 omega2 = 3.0102e-07 + ik_interpolate = 50 is = 3 omega2 = 5.7220e-07 + ik_interpolate = 50 is = 4 omega2 = 6.5163e-07 + ik_interpolate = 50 is = 5 omega2 = 7.8309e-07 + ik_interpolate = 50 is = 6 omega2 = 9.2839e-07 + + ik_interpolate = 51 is = 1 omega2 = 1.6898e-07 + ik_interpolate = 51 is = 2 omega2 = 1.9034e-07 ik_interpolate = 51 is = 3 omega2 = 2.8491e-07 - ik_interpolate = 51 is = 4 omega2 = 7.4953e-07 - ik_interpolate = 51 is = 5 omega2 = 8.2555e-07 - ik_interpolate = 51 is = 6 omega2 = 9.6680e-07 + ik_interpolate = 51 is = 4 omega2 = 7.4967e-07 + ik_interpolate = 51 is = 5 omega2 = 8.2570e-07 + ik_interpolate = 51 is = 6 omega2 = 9.6695e-07 - ik_interpolate = 52 is = 1 omega2 = 4.3777e-08 - ik_interpolate = 52 is = 2 omega2 = 4.3777e-08 - ik_interpolate = 52 is = 3 omega2 = 4.7134e-07 - ik_interpolate = 52 is = 4 omega2 = 5.6539e-07 - ik_interpolate = 52 is = 5 omega2 = 5.6539e-07 - ik_interpolate = 52 is = 6 omega2 = 8.6949e-07 + ik_interpolate = 52 is = 1 omega2 = 4.3780e-08 + ik_interpolate = 52 is = 2 omega2 = 4.3780e-08 + ik_interpolate = 52 is = 3 omega2 = 4.7141e-07 + ik_interpolate = 52 is = 4 omega2 = 5.6560e-07 + ik_interpolate = 52 is = 5 omega2 = 5.6560e-07 + ik_interpolate = 52 is = 6 omega2 = 8.6955e-07 ik_interpolate = 53 is = 1 omega2 = 8.2123e-08 - ik_interpolate = 53 is = 2 omega2 = 3.0095e-07 - ik_interpolate = 53 is = 3 omega2 = 5.7215e-07 - ik_interpolate = 53 is = 4 omega2 = 6.5143e-07 - ik_interpolate = 53 is = 5 omega2 = 7.8302e-07 - ik_interpolate = 53 is = 6 omega2 = 9.2831e-07 - - ik_interpolate = 54 is = 1 omega2 = 1.6895e-07 - ik_interpolate = 54 is = 2 omega2 = 1.9031e-07 + ik_interpolate = 53 is = 2 omega2 = 3.0102e-07 + ik_interpolate = 53 is = 3 omega2 = 5.7220e-07 + ik_interpolate = 53 is = 4 omega2 = 6.5163e-07 + ik_interpolate = 53 is = 5 omega2 = 7.8309e-07 + ik_interpolate = 53 is = 6 omega2 = 9.2839e-07 + + ik_interpolate = 54 is = 1 omega2 = 1.6898e-07 + ik_interpolate = 54 is = 2 omega2 = 1.9034e-07 ik_interpolate = 54 is = 3 omega2 = 2.8491e-07 - ik_interpolate = 54 is = 4 omega2 = 7.4953e-07 - ik_interpolate = 54 is = 5 omega2 = 8.2555e-07 - ik_interpolate = 54 is = 6 omega2 = 9.6680e-07 - - ik_interpolate = 55 is = 1 omega2 = 1.0050e-07 - ik_interpolate = 55 is = 2 omega2 = 1.0050e-07 - ik_interpolate = 55 is = 3 omega2 = 4.0995e-07 - ik_interpolate = 55 is = 4 omega2 = 6.8347e-07 - ik_interpolate = 55 is = 5 omega2 = 6.8347e-07 - ik_interpolate = 55 is = 6 omega2 = 8.4872e-07 - - ik_interpolate = 56 is = 1 omega2 = 1.6895e-07 - ik_interpolate = 56 is = 2 omega2 = 1.9031e-07 + ik_interpolate = 54 is = 4 omega2 = 7.4967e-07 + ik_interpolate = 54 is = 5 omega2 = 8.2570e-07 + ik_interpolate = 54 is = 6 omega2 = 9.6695e-07 + + ik_interpolate = 55 is = 1 omega2 = 1.0051e-07 + ik_interpolate = 55 is = 2 omega2 = 1.0051e-07 + ik_interpolate = 55 is = 3 omega2 = 4.1002e-07 + ik_interpolate = 55 is = 4 omega2 = 6.8366e-07 + ik_interpolate = 55 is = 5 omega2 = 6.8366e-07 + ik_interpolate = 55 is = 6 omega2 = 8.4881e-07 + + ik_interpolate = 56 is = 1 omega2 = 1.6898e-07 + ik_interpolate = 56 is = 2 omega2 = 1.9034e-07 ik_interpolate = 56 is = 3 omega2 = 2.8491e-07 - ik_interpolate = 56 is = 4 omega2 = 7.4953e-07 - ik_interpolate = 56 is = 5 omega2 = 8.2555e-07 - ik_interpolate = 56 is = 6 omega2 = 9.6680e-07 + ik_interpolate = 56 is = 4 omega2 = 7.4967e-07 + ik_interpolate = 56 is = 5 omega2 = 8.2570e-07 + ik_interpolate = 56 is = 6 omega2 = 9.6695e-07 - ik_interpolate = 57 is = 1 omega2 = 1.6895e-07 - ik_interpolate = 57 is = 2 omega2 = 1.9031e-07 + ik_interpolate = 57 is = 1 omega2 = 1.6898e-07 + ik_interpolate = 57 is = 2 omega2 = 1.9034e-07 ik_interpolate = 57 is = 3 omega2 = 2.8491e-07 - ik_interpolate = 57 is = 4 omega2 = 7.4953e-07 - ik_interpolate = 57 is = 5 omega2 = 8.2555e-07 - ik_interpolate = 57 is = 6 omega2 = 9.6680e-07 - - ik_interpolate = 58 is = 1 omega2 = 1.0050e-07 - ik_interpolate = 58 is = 2 omega2 = 1.0050e-07 - ik_interpolate = 58 is = 3 omega2 = 4.0995e-07 - ik_interpolate = 58 is = 4 omega2 = 6.8347e-07 - ik_interpolate = 58 is = 5 omega2 = 6.8347e-07 - ik_interpolate = 58 is = 6 omega2 = 8.4872e-07 - - ik_interpolate = 59 is = 1 omega2 = 1.6895e-07 - ik_interpolate = 59 is = 2 omega2 = 1.9031e-07 + ik_interpolate = 57 is = 4 omega2 = 7.4967e-07 + ik_interpolate = 57 is = 5 omega2 = 8.2570e-07 + ik_interpolate = 57 is = 6 omega2 = 9.6695e-07 + + ik_interpolate = 58 is = 1 omega2 = 1.0051e-07 + ik_interpolate = 58 is = 2 omega2 = 1.0051e-07 + ik_interpolate = 58 is = 3 omega2 = 4.1002e-07 + ik_interpolate = 58 is = 4 omega2 = 6.8366e-07 + ik_interpolate = 58 is = 5 omega2 = 6.8366e-07 + ik_interpolate = 58 is = 6 omega2 = 8.4881e-07 + + ik_interpolate = 59 is = 1 omega2 = 1.6898e-07 + ik_interpolate = 59 is = 2 omega2 = 1.9034e-07 ik_interpolate = 59 is = 3 omega2 = 2.8491e-07 - ik_interpolate = 59 is = 4 omega2 = 7.4953e-07 - ik_interpolate = 59 is = 5 omega2 = 8.2555e-07 - ik_interpolate = 59 is = 6 omega2 = 9.6680e-07 + ik_interpolate = 59 is = 4 omega2 = 7.4967e-07 + ik_interpolate = 59 is = 5 omega2 = 8.2570e-07 + ik_interpolate = 59 is = 6 omega2 = 9.6695e-07 ik_interpolate = 60 is = 1 omega2 = 8.2123e-08 - ik_interpolate = 60 is = 2 omega2 = 3.0095e-07 - ik_interpolate = 60 is = 3 omega2 = 5.7215e-07 - ik_interpolate = 60 is = 4 omega2 = 6.5143e-07 - ik_interpolate = 60 is = 5 omega2 = 7.8302e-07 - ik_interpolate = 60 is = 6 omega2 = 9.2831e-07 - - ik_interpolate = 61 is = 1 omega2 = 4.3777e-08 - ik_interpolate = 61 is = 2 omega2 = 4.3777e-08 - ik_interpolate = 61 is = 3 omega2 = 4.7134e-07 - ik_interpolate = 61 is = 4 omega2 = 5.6539e-07 - ik_interpolate = 61 is = 5 omega2 = 5.6539e-07 - ik_interpolate = 61 is = 6 omega2 = 8.6949e-07 - - ik_interpolate = 62 is = 1 omega2 = 1.6895e-07 - ik_interpolate = 62 is = 2 omega2 = 1.9031e-07 + ik_interpolate = 60 is = 2 omega2 = 3.0102e-07 + ik_interpolate = 60 is = 3 omega2 = 5.7220e-07 + ik_interpolate = 60 is = 4 omega2 = 6.5163e-07 + ik_interpolate = 60 is = 5 omega2 = 7.8309e-07 + ik_interpolate = 60 is = 6 omega2 = 9.2839e-07 + + ik_interpolate = 61 is = 1 omega2 = 4.3780e-08 + ik_interpolate = 61 is = 2 omega2 = 4.3780e-08 + ik_interpolate = 61 is = 3 omega2 = 4.7141e-07 + ik_interpolate = 61 is = 4 omega2 = 5.6560e-07 + ik_interpolate = 61 is = 5 omega2 = 5.6560e-07 + ik_interpolate = 61 is = 6 omega2 = 8.6955e-07 + + ik_interpolate = 62 is = 1 omega2 = 1.6898e-07 + ik_interpolate = 62 is = 2 omega2 = 1.9034e-07 ik_interpolate = 62 is = 3 omega2 = 2.8491e-07 - ik_interpolate = 62 is = 4 omega2 = 7.4953e-07 - ik_interpolate = 62 is = 5 omega2 = 8.2555e-07 - ik_interpolate = 62 is = 6 omega2 = 9.6680e-07 + ik_interpolate = 62 is = 4 omega2 = 7.4967e-07 + ik_interpolate = 62 is = 5 omega2 = 8.2570e-07 + ik_interpolate = 62 is = 6 omega2 = 9.6695e-07 ik_interpolate = 63 is = 1 omega2 = 8.2123e-08 - ik_interpolate = 63 is = 2 omega2 = 3.0095e-07 - ik_interpolate = 63 is = 3 omega2 = 5.7215e-07 - ik_interpolate = 63 is = 4 omega2 = 6.5143e-07 - ik_interpolate = 63 is = 5 omega2 = 7.8302e-07 - ik_interpolate = 63 is = 6 omega2 = 9.2831e-07 - - ik_interpolate = 64 is = 1 omega2 = 1.4775e-07 - ik_interpolate = 64 is = 2 omega2 = 1.4775e-07 - ik_interpolate = 64 is = 3 omega2 = 2.6813e-07 - ik_interpolate = 64 is = 4 omega2 = 7.8698e-07 - ik_interpolate = 64 is = 5 omega2 = 7.8698e-07 - ik_interpolate = 64 is = 6 omega2 = 1.2852e-06 + ik_interpolate = 63 is = 2 omega2 = 3.0102e-07 + ik_interpolate = 63 is = 3 omega2 = 5.7220e-07 + ik_interpolate = 63 is = 4 omega2 = 6.5163e-07 + ik_interpolate = 63 is = 5 omega2 = 7.8309e-07 + ik_interpolate = 63 is = 6 omega2 = 9.2839e-07 + + ik_interpolate = 64 is = 1 omega2 = 1.4778e-07 + ik_interpolate = 64 is = 2 omega2 = 1.4778e-07 + ik_interpolate = 64 is = 3 omega2 = 2.6814e-07 + ik_interpolate = 64 is = 4 omega2 = 7.8713e-07 + ik_interpolate = 64 is = 5 omega2 = 7.8713e-07 + ik_interpolate = 64 is = 6 omega2 = 1.2853e-06 Temperature = 7.0000e+02 K SCPH ITER 1 : DIFF = N/A - SCPH ITER 2 : DIFF = 1.2766e-07 - SCPH ITER 3 : DIFF = 1.1257e-07 - SCPH ITER 4 : DIFF = 9.9269e-08 - SCPH ITER 5 : DIFF = 8.7541e-08 - SCPH ITER 6 : DIFF = 7.7202e-08 - SCPH ITER 7 : DIFF = 6.8086e-08 - SCPH ITER 8 : DIFF = 6.0048e-08 - SCPH ITER 9 : DIFF = 5.2961e-08 - SCPH ITER 10 : DIFF = 4.6711e-08 - SCPH ITER 11 : DIFF = 4.1199e-08 - SCPH ITER 12 : DIFF = 3.6339e-08 - SCPH ITER 13 : DIFF = 3.2052e-08 - SCPH ITER 14 : DIFF = 2.8271e-08 - SCPH ITER 15 : DIFF = 2.4937e-08 - SCPH ITER 16 : DIFF = 2.1996e-08 - SCPH ITER 17 : DIFF = 1.9402e-08 - SCPH ITER 18 : DIFF = 1.7114e-08 - SCPH ITER 19 : DIFF = 1.5096e-08 - SCPH ITER 20 : DIFF = 1.3316e-08 - SCPH ITER 21 : DIFF = 1.1746e-08 - SCPH ITER 22 : DIFF = 1.0361e-08 - SCPH ITER 23 : DIFF = 9.1394e-09 + SCPH ITER 2 : DIFF = 1.2904e-07 + SCPH ITER 3 : DIFF = 1.1378e-07 + SCPH ITER 4 : DIFF = 1.0034e-07 + SCPH ITER 5 : DIFF = 8.8483e-08 + SCPH ITER 6 : DIFF = 7.8033e-08 + SCPH ITER 7 : DIFF = 6.8818e-08 + SCPH ITER 8 : DIFF = 6.0694e-08 + SCPH ITER 9 : DIFF = 5.3530e-08 + SCPH ITER 10 : DIFF = 4.7213e-08 + SCPH ITER 11 : DIFF = 4.1642e-08 + SCPH ITER 12 : DIFF = 3.6729e-08 + SCPH ITER 13 : DIFF = 3.2396e-08 + SCPH ITER 14 : DIFF = 2.8575e-08 + SCPH ITER 15 : DIFF = 2.5205e-08 + SCPH ITER 16 : DIFF = 2.2232e-08 + SCPH ITER 17 : DIFF = 1.9610e-08 + SCPH ITER 18 : DIFF = 1.7298e-08 + SCPH ITER 19 : DIFF = 1.5258e-08 + SCPH ITER 20 : DIFF = 1.3459e-08 + SCPH ITER 21 : DIFF = 1.1872e-08 + SCPH ITER 22 : DIFF = 1.0472e-08 + SCPH ITER 23 : DIFF = 9.2376e-09 + SCPH ITER 24 : DIFF = 8.1485e-09 + SCPH ITER 25 : DIFF = 7.1878e-09 + SCPH ITER 26 : DIFF = 6.3404e-09 + SCPH ITER 27 : DIFF = 5.5929e-09 + SCPH ITER 28 : DIFF = 4.9335e-09 + SCPH ITER 29 : DIFF = 4.3519e-09 + SCPH ITER 30 : DIFF = 3.8389e-09 + SCPH ITER 31 : DIFF = 3.3863e-09 + SCPH ITER 32 : DIFF = 2.9871e-09 + SCPH ITER 33 : DIFF = 2.6349e-09 + SCPH ITER 34 : DIFF = 2.3243e-09 + SCPH ITER 35 : DIFF = 2.0503e-09 + SCPH ITER 36 : DIFF = 1.8086e-09 + SCPH ITER 37 : DIFF = 1.5954e-09 + SCPH ITER 38 : DIFF = 1.4073e-09 + SCPH ITER 39 : DIFF = 1.2414e-09 + SCPH ITER 40 : DIFF = 1.0950e-09 + SCPH ITER 41 : DIFF = 9.6592e-10 + SCPH ITER 42 : DIFF = 8.5204e-10 + SCPH ITER 43 : DIFF = 7.5159e-10 + SCPH ITER 44 : DIFF = 6.6298e-10 + SCPH ITER 45 : DIFF = 5.8482e-10 + SCPH ITER 46 : DIFF = 5.1587e-10 + SCPH ITER 47 : DIFF = 4.5505e-10 + SCPH ITER 48 : DIFF = 4.0140e-10 + SCPH ITER 49 : DIFF = 3.5407e-10 + SCPH ITER 50 : DIFF = 3.1233e-10 + SCPH ITER 51 : DIFF = 2.7550e-10 + SCPH ITER 52 : DIFF = 2.4302e-10 + SCPH ITER 53 : DIFF = 2.1436e-10 + SCPH ITER 54 : DIFF = 1.8909e-10 + SCPH ITER 55 : DIFF = 1.6679e-10 + SCPH ITER 56 : DIFF = 1.4713e-10 + SCPH ITER 57 : DIFF = 1.2978e-10 + SCPH ITER 58 : DIFF = 1.1448e-10 + SCPH ITER 59 : DIFF = 1.0100e-10 + SCPH ITER 60 : DIFF = 8.9113e-11 DIFF < SCPH_TOL : break SCPH loop - Temp = 7.0000e+02 : convergence achieved in 23 iterations. + Temp = 7.0000e+02 : convergence achieved in 60 iterations. New eigenvalues ik_interpolate = 1 is = 1 omega2 = 0.0000e+00 ik_interpolate = 1 is = 2 omega2 = 0.0000e+00 ik_interpolate = 1 is = 3 omega2 = 0.0000e+00 - ik_interpolate = 1 is = 4 omega2 = 3.4401e-07 - ik_interpolate = 1 is = 5 omega2 = 3.4401e-07 - ik_interpolate = 1 is = 6 omega2 = 3.4401e-07 - - ik_interpolate = 2 is = 1 omega2 = 1.4540e-07 - ik_interpolate = 2 is = 2 omega2 = 1.4540e-07 - ik_interpolate = 2 is = 3 omega2 = 2.6739e-07 - ik_interpolate = 2 is = 4 omega2 = 7.7319e-07 - ik_interpolate = 2 is = 5 omega2 = 7.7319e-07 - ik_interpolate = 2 is = 6 omega2 = 1.2712e-06 - - ik_interpolate = 3 is = 1 omega2 = 3.1734e-07 - ik_interpolate = 3 is = 2 omega2 = 3.1734e-07 - ik_interpolate = 3 is = 3 omega2 = 6.9767e-07 - ik_interpolate = 3 is = 4 omega2 = 8.1558e-07 - ik_interpolate = 3 is = 5 omega2 = 8.1558e-07 - ik_interpolate = 3 is = 6 omega2 = 9.7463e-07 - - ik_interpolate = 4 is = 1 omega2 = 1.4540e-07 - ik_interpolate = 4 is = 2 omega2 = 1.4540e-07 - ik_interpolate = 4 is = 3 omega2 = 2.6739e-07 - ik_interpolate = 4 is = 4 omega2 = 7.7319e-07 - ik_interpolate = 4 is = 5 omega2 = 7.7319e-07 - ik_interpolate = 4 is = 6 omega2 = 1.2712e-06 - - ik_interpolate = 5 is = 1 omega2 = 1.4540e-07 - ik_interpolate = 5 is = 2 omega2 = 1.4540e-07 - ik_interpolate = 5 is = 3 omega2 = 2.6739e-07 - ik_interpolate = 5 is = 4 omega2 = 7.7319e-07 - ik_interpolate = 5 is = 5 omega2 = 7.7319e-07 - ik_interpolate = 5 is = 6 omega2 = 1.2712e-06 - - ik_interpolate = 6 is = 1 omega2 = 4.3555e-08 - ik_interpolate = 6 is = 2 omega2 = 4.3555e-08 - ik_interpolate = 6 is = 3 omega2 = 4.6513e-07 - ik_interpolate = 6 is = 4 omega2 = 5.4495e-07 - ik_interpolate = 6 is = 5 omega2 = 5.4495e-07 - ik_interpolate = 6 is = 6 omega2 = 8.6534e-07 - - ik_interpolate = 7 is = 1 omega2 = 1.6667e-07 - ik_interpolate = 7 is = 2 omega2 = 1.8737e-07 + ik_interpolate = 1 is = 4 omega2 = 3.4424e-07 + ik_interpolate = 1 is = 5 omega2 = 3.4424e-07 + ik_interpolate = 1 is = 6 omega2 = 3.4424e-07 + + ik_interpolate = 2 is = 1 omega2 = 1.4543e-07 + ik_interpolate = 2 is = 2 omega2 = 1.4543e-07 + ik_interpolate = 2 is = 3 omega2 = 2.6740e-07 + ik_interpolate = 2 is = 4 omega2 = 7.7334e-07 + ik_interpolate = 2 is = 5 omega2 = 7.7334e-07 + ik_interpolate = 2 is = 6 omega2 = 1.2713e-06 + + ik_interpolate = 3 is = 1 omega2 = 3.1740e-07 + ik_interpolate = 3 is = 2 omega2 = 3.1740e-07 + ik_interpolate = 3 is = 3 omega2 = 6.9771e-07 + ik_interpolate = 3 is = 4 omega2 = 8.1565e-07 + ik_interpolate = 3 is = 5 omega2 = 8.1565e-07 + ik_interpolate = 3 is = 6 omega2 = 9.7471e-07 + + ik_interpolate = 4 is = 1 omega2 = 1.4543e-07 + ik_interpolate = 4 is = 2 omega2 = 1.4543e-07 + ik_interpolate = 4 is = 3 omega2 = 2.6740e-07 + ik_interpolate = 4 is = 4 omega2 = 7.7334e-07 + ik_interpolate = 4 is = 5 omega2 = 7.7334e-07 + ik_interpolate = 4 is = 6 omega2 = 1.2713e-06 + + ik_interpolate = 5 is = 1 omega2 = 1.4543e-07 + ik_interpolate = 5 is = 2 omega2 = 1.4543e-07 + ik_interpolate = 5 is = 3 omega2 = 2.6740e-07 + ik_interpolate = 5 is = 4 omega2 = 7.7334e-07 + ik_interpolate = 5 is = 5 omega2 = 7.7334e-07 + ik_interpolate = 5 is = 6 omega2 = 1.2713e-06 + + ik_interpolate = 6 is = 1 omega2 = 4.3558e-08 + ik_interpolate = 6 is = 2 omega2 = 4.3558e-08 + ik_interpolate = 6 is = 3 omega2 = 4.6520e-07 + ik_interpolate = 6 is = 4 omega2 = 5.4515e-07 + ik_interpolate = 6 is = 5 omega2 = 5.4515e-07 + ik_interpolate = 6 is = 6 omega2 = 8.6541e-07 + + ik_interpolate = 7 is = 1 omega2 = 1.6669e-07 + ik_interpolate = 7 is = 2 omega2 = 1.8740e-07 ik_interpolate = 7 is = 3 omega2 = 2.8597e-07 - ik_interpolate = 7 is = 4 omega2 = 7.3626e-07 - ik_interpolate = 7 is = 5 omega2 = 8.1196e-07 - ik_interpolate = 7 is = 6 omega2 = 9.5322e-07 - - ik_interpolate = 8 is = 1 omega2 = 8.2149e-08 - ik_interpolate = 8 is = 2 omega2 = 2.9491e-07 - ik_interpolate = 8 is = 3 omega2 = 5.6843e-07 - ik_interpolate = 8 is = 4 omega2 = 6.3265e-07 - ik_interpolate = 8 is = 5 omega2 = 7.7807e-07 - ik_interpolate = 8 is = 6 omega2 = 9.2309e-07 - - ik_interpolate = 9 is = 1 omega2 = 3.1734e-07 - ik_interpolate = 9 is = 2 omega2 = 3.1734e-07 - ik_interpolate = 9 is = 3 omega2 = 6.9767e-07 - ik_interpolate = 9 is = 4 omega2 = 8.1558e-07 - ik_interpolate = 9 is = 5 omega2 = 8.1558e-07 - ik_interpolate = 9 is = 6 omega2 = 9.7463e-07 - - ik_interpolate = 10 is = 1 omega2 = 1.6667e-07 - ik_interpolate = 10 is = 2 omega2 = 1.8737e-07 + ik_interpolate = 7 is = 4 omega2 = 7.3641e-07 + ik_interpolate = 7 is = 5 omega2 = 8.1211e-07 + ik_interpolate = 7 is = 6 omega2 = 9.5337e-07 + + ik_interpolate = 8 is = 1 omega2 = 8.2150e-08 + ik_interpolate = 8 is = 2 omega2 = 2.9497e-07 + ik_interpolate = 8 is = 3 omega2 = 5.6848e-07 + ik_interpolate = 8 is = 4 omega2 = 6.3284e-07 + ik_interpolate = 8 is = 5 omega2 = 7.7814e-07 + ik_interpolate = 8 is = 6 omega2 = 9.2316e-07 + + ik_interpolate = 9 is = 1 omega2 = 3.1740e-07 + ik_interpolate = 9 is = 2 omega2 = 3.1740e-07 + ik_interpolate = 9 is = 3 omega2 = 6.9771e-07 + ik_interpolate = 9 is = 4 omega2 = 8.1565e-07 + ik_interpolate = 9 is = 5 omega2 = 8.1565e-07 + ik_interpolate = 9 is = 6 omega2 = 9.7471e-07 + + ik_interpolate = 10 is = 1 omega2 = 1.6669e-07 + ik_interpolate = 10 is = 2 omega2 = 1.8740e-07 ik_interpolate = 10 is = 3 omega2 = 2.8597e-07 - ik_interpolate = 10 is = 4 omega2 = 7.3626e-07 - ik_interpolate = 10 is = 5 omega2 = 8.1196e-07 - ik_interpolate = 10 is = 6 omega2 = 9.5322e-07 - - ik_interpolate = 11 is = 1 omega2 = 6.0245e-08 - ik_interpolate = 11 is = 2 omega2 = 6.0245e-08 - ik_interpolate = 11 is = 3 omega2 = 1.0864e-07 - ik_interpolate = 11 is = 4 omega2 = 6.0055e-07 - ik_interpolate = 11 is = 5 omega2 = 6.0055e-07 - ik_interpolate = 11 is = 6 omega2 = 6.9092e-07 - - ik_interpolate = 12 is = 1 omega2 = 1.6667e-07 - ik_interpolate = 12 is = 2 omega2 = 1.8737e-07 + ik_interpolate = 10 is = 4 omega2 = 7.3641e-07 + ik_interpolate = 10 is = 5 omega2 = 8.1211e-07 + ik_interpolate = 10 is = 6 omega2 = 9.5337e-07 + + ik_interpolate = 11 is = 1 omega2 = 6.0256e-08 + ik_interpolate = 11 is = 2 omega2 = 6.0256e-08 + ik_interpolate = 11 is = 3 omega2 = 1.0866e-07 + ik_interpolate = 11 is = 4 omega2 = 6.0075e-07 + ik_interpolate = 11 is = 5 omega2 = 6.0075e-07 + ik_interpolate = 11 is = 6 omega2 = 6.9111e-07 + + ik_interpolate = 12 is = 1 omega2 = 1.6669e-07 + ik_interpolate = 12 is = 2 omega2 = 1.8740e-07 ik_interpolate = 12 is = 3 omega2 = 2.8597e-07 - ik_interpolate = 12 is = 4 omega2 = 7.3626e-07 - ik_interpolate = 12 is = 5 omega2 = 8.1196e-07 - ik_interpolate = 12 is = 6 omega2 = 9.5322e-07 - - ik_interpolate = 13 is = 1 omega2 = 1.4540e-07 - ik_interpolate = 13 is = 2 omega2 = 1.4540e-07 - ik_interpolate = 13 is = 3 omega2 = 2.6739e-07 - ik_interpolate = 13 is = 4 omega2 = 7.7319e-07 - ik_interpolate = 13 is = 5 omega2 = 7.7319e-07 - ik_interpolate = 13 is = 6 omega2 = 1.2712e-06 - - ik_interpolate = 14 is = 1 omega2 = 8.2149e-08 - ik_interpolate = 14 is = 2 omega2 = 2.9491e-07 - ik_interpolate = 14 is = 3 omega2 = 5.6843e-07 - ik_interpolate = 14 is = 4 omega2 = 6.3265e-07 - ik_interpolate = 14 is = 5 omega2 = 7.7807e-07 - ik_interpolate = 14 is = 6 omega2 = 9.2309e-07 - - ik_interpolate = 15 is = 1 omega2 = 1.6667e-07 - ik_interpolate = 15 is = 2 omega2 = 1.8737e-07 + ik_interpolate = 12 is = 4 omega2 = 7.3641e-07 + ik_interpolate = 12 is = 5 omega2 = 8.1211e-07 + ik_interpolate = 12 is = 6 omega2 = 9.5337e-07 + + ik_interpolate = 13 is = 1 omega2 = 1.4543e-07 + ik_interpolate = 13 is = 2 omega2 = 1.4543e-07 + ik_interpolate = 13 is = 3 omega2 = 2.6740e-07 + ik_interpolate = 13 is = 4 omega2 = 7.7334e-07 + ik_interpolate = 13 is = 5 omega2 = 7.7334e-07 + ik_interpolate = 13 is = 6 omega2 = 1.2713e-06 + + ik_interpolate = 14 is = 1 omega2 = 8.2150e-08 + ik_interpolate = 14 is = 2 omega2 = 2.9497e-07 + ik_interpolate = 14 is = 3 omega2 = 5.6848e-07 + ik_interpolate = 14 is = 4 omega2 = 6.3284e-07 + ik_interpolate = 14 is = 5 omega2 = 7.7814e-07 + ik_interpolate = 14 is = 6 omega2 = 9.2316e-07 + + ik_interpolate = 15 is = 1 omega2 = 1.6669e-07 + ik_interpolate = 15 is = 2 omega2 = 1.8740e-07 ik_interpolate = 15 is = 3 omega2 = 2.8597e-07 - ik_interpolate = 15 is = 4 omega2 = 7.3626e-07 - ik_interpolate = 15 is = 5 omega2 = 8.1196e-07 - ik_interpolate = 15 is = 6 omega2 = 9.5322e-07 - - ik_interpolate = 16 is = 1 omega2 = 4.3555e-08 - ik_interpolate = 16 is = 2 omega2 = 4.3555e-08 - ik_interpolate = 16 is = 3 omega2 = 4.6513e-07 - ik_interpolate = 16 is = 4 omega2 = 5.4495e-07 - ik_interpolate = 16 is = 5 omega2 = 5.4495e-07 - ik_interpolate = 16 is = 6 omega2 = 8.6534e-07 - - ik_interpolate = 17 is = 1 omega2 = 1.4540e-07 - ik_interpolate = 17 is = 2 omega2 = 1.4540e-07 - ik_interpolate = 17 is = 3 omega2 = 2.6739e-07 - ik_interpolate = 17 is = 4 omega2 = 7.7319e-07 - ik_interpolate = 17 is = 5 omega2 = 7.7319e-07 - ik_interpolate = 17 is = 6 omega2 = 1.2712e-06 - - ik_interpolate = 18 is = 1 omega2 = 4.3555e-08 - ik_interpolate = 18 is = 2 omega2 = 4.3555e-08 - ik_interpolate = 18 is = 3 omega2 = 4.6513e-07 - ik_interpolate = 18 is = 4 omega2 = 5.4495e-07 - ik_interpolate = 18 is = 5 omega2 = 5.4495e-07 - ik_interpolate = 18 is = 6 omega2 = 8.6534e-07 - - ik_interpolate = 19 is = 1 omega2 = 1.6667e-07 - ik_interpolate = 19 is = 2 omega2 = 1.8737e-07 + ik_interpolate = 15 is = 4 omega2 = 7.3641e-07 + ik_interpolate = 15 is = 5 omega2 = 8.1211e-07 + ik_interpolate = 15 is = 6 omega2 = 9.5337e-07 + + ik_interpolate = 16 is = 1 omega2 = 4.3558e-08 + ik_interpolate = 16 is = 2 omega2 = 4.3558e-08 + ik_interpolate = 16 is = 3 omega2 = 4.6520e-07 + ik_interpolate = 16 is = 4 omega2 = 5.4515e-07 + ik_interpolate = 16 is = 5 omega2 = 5.4515e-07 + ik_interpolate = 16 is = 6 omega2 = 8.6541e-07 + + ik_interpolate = 17 is = 1 omega2 = 1.4543e-07 + ik_interpolate = 17 is = 2 omega2 = 1.4543e-07 + ik_interpolate = 17 is = 3 omega2 = 2.6740e-07 + ik_interpolate = 17 is = 4 omega2 = 7.7334e-07 + ik_interpolate = 17 is = 5 omega2 = 7.7334e-07 + ik_interpolate = 17 is = 6 omega2 = 1.2713e-06 + + ik_interpolate = 18 is = 1 omega2 = 4.3558e-08 + ik_interpolate = 18 is = 2 omega2 = 4.3558e-08 + ik_interpolate = 18 is = 3 omega2 = 4.6520e-07 + ik_interpolate = 18 is = 4 omega2 = 5.4515e-07 + ik_interpolate = 18 is = 5 omega2 = 5.4515e-07 + ik_interpolate = 18 is = 6 omega2 = 8.6541e-07 + + ik_interpolate = 19 is = 1 omega2 = 1.6669e-07 + ik_interpolate = 19 is = 2 omega2 = 1.8740e-07 ik_interpolate = 19 is = 3 omega2 = 2.8597e-07 - ik_interpolate = 19 is = 4 omega2 = 7.3626e-07 - ik_interpolate = 19 is = 5 omega2 = 8.1196e-07 - ik_interpolate = 19 is = 6 omega2 = 9.5322e-07 - - ik_interpolate = 20 is = 1 omega2 = 8.2149e-08 - ik_interpolate = 20 is = 2 omega2 = 2.9491e-07 - ik_interpolate = 20 is = 3 omega2 = 5.6843e-07 - ik_interpolate = 20 is = 4 omega2 = 6.3265e-07 - ik_interpolate = 20 is = 5 omega2 = 7.7807e-07 - ik_interpolate = 20 is = 6 omega2 = 9.2309e-07 - - ik_interpolate = 21 is = 1 omega2 = 4.3555e-08 - ik_interpolate = 21 is = 2 omega2 = 4.3555e-08 - ik_interpolate = 21 is = 3 omega2 = 4.6513e-07 - ik_interpolate = 21 is = 4 omega2 = 5.4495e-07 - ik_interpolate = 21 is = 5 omega2 = 5.4495e-07 - ik_interpolate = 21 is = 6 omega2 = 8.6534e-07 - - ik_interpolate = 22 is = 1 omega2 = 1.4540e-07 - ik_interpolate = 22 is = 2 omega2 = 1.4540e-07 - ik_interpolate = 22 is = 3 omega2 = 2.6739e-07 - ik_interpolate = 22 is = 4 omega2 = 7.7319e-07 - ik_interpolate = 22 is = 5 omega2 = 7.7319e-07 - ik_interpolate = 22 is = 6 omega2 = 1.2712e-06 - - ik_interpolate = 23 is = 1 omega2 = 8.2149e-08 - ik_interpolate = 23 is = 2 omega2 = 2.9491e-07 - ik_interpolate = 23 is = 3 omega2 = 5.6843e-07 - ik_interpolate = 23 is = 4 omega2 = 6.3265e-07 - ik_interpolate = 23 is = 5 omega2 = 7.7807e-07 - ik_interpolate = 23 is = 6 omega2 = 9.2309e-07 - - ik_interpolate = 24 is = 1 omega2 = 1.6667e-07 - ik_interpolate = 24 is = 2 omega2 = 1.8737e-07 + ik_interpolate = 19 is = 4 omega2 = 7.3641e-07 + ik_interpolate = 19 is = 5 omega2 = 8.1211e-07 + ik_interpolate = 19 is = 6 omega2 = 9.5337e-07 + + ik_interpolate = 20 is = 1 omega2 = 8.2150e-08 + ik_interpolate = 20 is = 2 omega2 = 2.9497e-07 + ik_interpolate = 20 is = 3 omega2 = 5.6848e-07 + ik_interpolate = 20 is = 4 omega2 = 6.3284e-07 + ik_interpolate = 20 is = 5 omega2 = 7.7814e-07 + ik_interpolate = 20 is = 6 omega2 = 9.2316e-07 + + ik_interpolate = 21 is = 1 omega2 = 4.3558e-08 + ik_interpolate = 21 is = 2 omega2 = 4.3558e-08 + ik_interpolate = 21 is = 3 omega2 = 4.6520e-07 + ik_interpolate = 21 is = 4 omega2 = 5.4515e-07 + ik_interpolate = 21 is = 5 omega2 = 5.4515e-07 + ik_interpolate = 21 is = 6 omega2 = 8.6541e-07 + + ik_interpolate = 22 is = 1 omega2 = 1.4543e-07 + ik_interpolate = 22 is = 2 omega2 = 1.4543e-07 + ik_interpolate = 22 is = 3 omega2 = 2.6740e-07 + ik_interpolate = 22 is = 4 omega2 = 7.7334e-07 + ik_interpolate = 22 is = 5 omega2 = 7.7334e-07 + ik_interpolate = 22 is = 6 omega2 = 1.2713e-06 + + ik_interpolate = 23 is = 1 omega2 = 8.2150e-08 + ik_interpolate = 23 is = 2 omega2 = 2.9497e-07 + ik_interpolate = 23 is = 3 omega2 = 5.6848e-07 + ik_interpolate = 23 is = 4 omega2 = 6.3284e-07 + ik_interpolate = 23 is = 5 omega2 = 7.7814e-07 + ik_interpolate = 23 is = 6 omega2 = 9.2316e-07 + + ik_interpolate = 24 is = 1 omega2 = 1.6669e-07 + ik_interpolate = 24 is = 2 omega2 = 1.8740e-07 ik_interpolate = 24 is = 3 omega2 = 2.8597e-07 - ik_interpolate = 24 is = 4 omega2 = 7.3626e-07 - ik_interpolate = 24 is = 5 omega2 = 8.1196e-07 - ik_interpolate = 24 is = 6 omega2 = 9.5322e-07 + ik_interpolate = 24 is = 4 omega2 = 7.3641e-07 + ik_interpolate = 24 is = 5 omega2 = 8.1211e-07 + ik_interpolate = 24 is = 6 omega2 = 9.5337e-07 - ik_interpolate = 25 is = 1 omega2 = 1.6667e-07 - ik_interpolate = 25 is = 2 omega2 = 1.8737e-07 + ik_interpolate = 25 is = 1 omega2 = 1.6669e-07 + ik_interpolate = 25 is = 2 omega2 = 1.8740e-07 ik_interpolate = 25 is = 3 omega2 = 2.8597e-07 - ik_interpolate = 25 is = 4 omega2 = 7.3626e-07 - ik_interpolate = 25 is = 5 omega2 = 8.1196e-07 - ik_interpolate = 25 is = 6 omega2 = 9.5322e-07 - - ik_interpolate = 26 is = 1 omega2 = 8.2149e-08 - ik_interpolate = 26 is = 2 omega2 = 2.9491e-07 - ik_interpolate = 26 is = 3 omega2 = 5.6843e-07 - ik_interpolate = 26 is = 4 omega2 = 6.3265e-07 - ik_interpolate = 26 is = 5 omega2 = 7.7807e-07 - ik_interpolate = 26 is = 6 omega2 = 9.2309e-07 - - ik_interpolate = 27 is = 1 omega2 = 1.6667e-07 - ik_interpolate = 27 is = 2 omega2 = 1.8737e-07 + ik_interpolate = 25 is = 4 omega2 = 7.3641e-07 + ik_interpolate = 25 is = 5 omega2 = 8.1211e-07 + ik_interpolate = 25 is = 6 omega2 = 9.5337e-07 + + ik_interpolate = 26 is = 1 omega2 = 8.2150e-08 + ik_interpolate = 26 is = 2 omega2 = 2.9497e-07 + ik_interpolate = 26 is = 3 omega2 = 5.6848e-07 + ik_interpolate = 26 is = 4 omega2 = 6.3284e-07 + ik_interpolate = 26 is = 5 omega2 = 7.7814e-07 + ik_interpolate = 26 is = 6 omega2 = 9.2316e-07 + + ik_interpolate = 27 is = 1 omega2 = 1.6669e-07 + ik_interpolate = 27 is = 2 omega2 = 1.8740e-07 ik_interpolate = 27 is = 3 omega2 = 2.8597e-07 - ik_interpolate = 27 is = 4 omega2 = 7.3626e-07 - ik_interpolate = 27 is = 5 omega2 = 8.1196e-07 - ik_interpolate = 27 is = 6 omega2 = 9.5322e-07 - - ik_interpolate = 28 is = 1 omega2 = 9.9489e-08 - ik_interpolate = 28 is = 2 omega2 = 9.9489e-08 - ik_interpolate = 28 is = 3 omega2 = 4.0464e-07 - ik_interpolate = 28 is = 4 omega2 = 6.6481e-07 - ik_interpolate = 28 is = 5 omega2 = 6.6481e-07 - ik_interpolate = 28 is = 6 omega2 = 8.4162e-07 - - ik_interpolate = 29 is = 1 omega2 = 8.2149e-08 - ik_interpolate = 29 is = 2 omega2 = 2.9491e-07 - ik_interpolate = 29 is = 3 omega2 = 5.6843e-07 - ik_interpolate = 29 is = 4 omega2 = 6.3265e-07 - ik_interpolate = 29 is = 5 omega2 = 7.7807e-07 - ik_interpolate = 29 is = 6 omega2 = 9.2309e-07 - - ik_interpolate = 30 is = 1 omega2 = 1.6667e-07 - ik_interpolate = 30 is = 2 omega2 = 1.8737e-07 + ik_interpolate = 27 is = 4 omega2 = 7.3641e-07 + ik_interpolate = 27 is = 5 omega2 = 8.1211e-07 + ik_interpolate = 27 is = 6 omega2 = 9.5337e-07 + + ik_interpolate = 28 is = 1 omega2 = 9.9496e-08 + ik_interpolate = 28 is = 2 omega2 = 9.9496e-08 + ik_interpolate = 28 is = 3 omega2 = 4.0471e-07 + ik_interpolate = 28 is = 4 omega2 = 6.6500e-07 + ik_interpolate = 28 is = 5 omega2 = 6.6500e-07 + ik_interpolate = 28 is = 6 omega2 = 8.4171e-07 + + ik_interpolate = 29 is = 1 omega2 = 8.2150e-08 + ik_interpolate = 29 is = 2 omega2 = 2.9497e-07 + ik_interpolate = 29 is = 3 omega2 = 5.6848e-07 + ik_interpolate = 29 is = 4 omega2 = 6.3284e-07 + ik_interpolate = 29 is = 5 omega2 = 7.7814e-07 + ik_interpolate = 29 is = 6 omega2 = 9.2316e-07 + + ik_interpolate = 30 is = 1 omega2 = 1.6669e-07 + ik_interpolate = 30 is = 2 omega2 = 1.8740e-07 ik_interpolate = 30 is = 3 omega2 = 2.8597e-07 - ik_interpolate = 30 is = 4 omega2 = 7.3626e-07 - ik_interpolate = 30 is = 5 omega2 = 8.1196e-07 - ik_interpolate = 30 is = 6 omega2 = 9.5322e-07 - - ik_interpolate = 31 is = 1 omega2 = 9.9489e-08 - ik_interpolate = 31 is = 2 omega2 = 9.9489e-08 - ik_interpolate = 31 is = 3 omega2 = 4.0464e-07 - ik_interpolate = 31 is = 4 omega2 = 6.6481e-07 - ik_interpolate = 31 is = 5 omega2 = 6.6481e-07 - ik_interpolate = 31 is = 6 omega2 = 8.4162e-07 - - ik_interpolate = 32 is = 1 omega2 = 1.6667e-07 - ik_interpolate = 32 is = 2 omega2 = 1.8737e-07 + ik_interpolate = 30 is = 4 omega2 = 7.3641e-07 + ik_interpolate = 30 is = 5 omega2 = 8.1211e-07 + ik_interpolate = 30 is = 6 omega2 = 9.5337e-07 + + ik_interpolate = 31 is = 1 omega2 = 9.9496e-08 + ik_interpolate = 31 is = 2 omega2 = 9.9496e-08 + ik_interpolate = 31 is = 3 omega2 = 4.0471e-07 + ik_interpolate = 31 is = 4 omega2 = 6.6500e-07 + ik_interpolate = 31 is = 5 omega2 = 6.6500e-07 + ik_interpolate = 31 is = 6 omega2 = 8.4171e-07 + + ik_interpolate = 32 is = 1 omega2 = 1.6669e-07 + ik_interpolate = 32 is = 2 omega2 = 1.8740e-07 ik_interpolate = 32 is = 3 omega2 = 2.8597e-07 - ik_interpolate = 32 is = 4 omega2 = 7.3626e-07 - ik_interpolate = 32 is = 5 omega2 = 8.1196e-07 - ik_interpolate = 32 is = 6 omega2 = 9.5322e-07 - - ik_interpolate = 33 is = 1 omega2 = 3.1734e-07 - ik_interpolate = 33 is = 2 omega2 = 3.1734e-07 - ik_interpolate = 33 is = 3 omega2 = 6.9767e-07 - ik_interpolate = 33 is = 4 omega2 = 8.1558e-07 - ik_interpolate = 33 is = 5 omega2 = 8.1558e-07 - ik_interpolate = 33 is = 6 omega2 = 9.7463e-07 - - ik_interpolate = 34 is = 1 omega2 = 1.6667e-07 - ik_interpolate = 34 is = 2 omega2 = 1.8737e-07 + ik_interpolate = 32 is = 4 omega2 = 7.3641e-07 + ik_interpolate = 32 is = 5 omega2 = 8.1211e-07 + ik_interpolate = 32 is = 6 omega2 = 9.5337e-07 + + ik_interpolate = 33 is = 1 omega2 = 3.1740e-07 + ik_interpolate = 33 is = 2 omega2 = 3.1740e-07 + ik_interpolate = 33 is = 3 omega2 = 6.9771e-07 + ik_interpolate = 33 is = 4 omega2 = 8.1565e-07 + ik_interpolate = 33 is = 5 omega2 = 8.1565e-07 + ik_interpolate = 33 is = 6 omega2 = 9.7471e-07 + + ik_interpolate = 34 is = 1 omega2 = 1.6669e-07 + ik_interpolate = 34 is = 2 omega2 = 1.8740e-07 ik_interpolate = 34 is = 3 omega2 = 2.8597e-07 - ik_interpolate = 34 is = 4 omega2 = 7.3626e-07 - ik_interpolate = 34 is = 5 omega2 = 8.1196e-07 - ik_interpolate = 34 is = 6 omega2 = 9.5322e-07 - - ik_interpolate = 35 is = 1 omega2 = 6.0245e-08 - ik_interpolate = 35 is = 2 omega2 = 6.0245e-08 - ik_interpolate = 35 is = 3 omega2 = 1.0864e-07 - ik_interpolate = 35 is = 4 omega2 = 6.0055e-07 - ik_interpolate = 35 is = 5 omega2 = 6.0055e-07 - ik_interpolate = 35 is = 6 omega2 = 6.9092e-07 - - ik_interpolate = 36 is = 1 omega2 = 1.6667e-07 - ik_interpolate = 36 is = 2 omega2 = 1.8737e-07 + ik_interpolate = 34 is = 4 omega2 = 7.3641e-07 + ik_interpolate = 34 is = 5 omega2 = 8.1211e-07 + ik_interpolate = 34 is = 6 omega2 = 9.5337e-07 + + ik_interpolate = 35 is = 1 omega2 = 6.0256e-08 + ik_interpolate = 35 is = 2 omega2 = 6.0256e-08 + ik_interpolate = 35 is = 3 omega2 = 1.0866e-07 + ik_interpolate = 35 is = 4 omega2 = 6.0075e-07 + ik_interpolate = 35 is = 5 omega2 = 6.0075e-07 + ik_interpolate = 35 is = 6 omega2 = 6.9111e-07 + + ik_interpolate = 36 is = 1 omega2 = 1.6669e-07 + ik_interpolate = 36 is = 2 omega2 = 1.8740e-07 ik_interpolate = 36 is = 3 omega2 = 2.8597e-07 - ik_interpolate = 36 is = 4 omega2 = 7.3626e-07 - ik_interpolate = 36 is = 5 omega2 = 8.1196e-07 - ik_interpolate = 36 is = 6 omega2 = 9.5322e-07 + ik_interpolate = 36 is = 4 omega2 = 7.3641e-07 + ik_interpolate = 36 is = 5 omega2 = 8.1211e-07 + ik_interpolate = 36 is = 6 omega2 = 9.5337e-07 - ik_interpolate = 37 is = 1 omega2 = 1.6667e-07 - ik_interpolate = 37 is = 2 omega2 = 1.8737e-07 + ik_interpolate = 37 is = 1 omega2 = 1.6669e-07 + ik_interpolate = 37 is = 2 omega2 = 1.8740e-07 ik_interpolate = 37 is = 3 omega2 = 2.8597e-07 - ik_interpolate = 37 is = 4 omega2 = 7.3626e-07 - ik_interpolate = 37 is = 5 omega2 = 8.1196e-07 - ik_interpolate = 37 is = 6 omega2 = 9.5322e-07 - - ik_interpolate = 38 is = 1 omega2 = 8.2149e-08 - ik_interpolate = 38 is = 2 omega2 = 2.9491e-07 - ik_interpolate = 38 is = 3 omega2 = 5.6843e-07 - ik_interpolate = 38 is = 4 omega2 = 6.3265e-07 - ik_interpolate = 38 is = 5 omega2 = 7.7807e-07 - ik_interpolate = 38 is = 6 omega2 = 9.2309e-07 - - ik_interpolate = 39 is = 1 omega2 = 1.6667e-07 - ik_interpolate = 39 is = 2 omega2 = 1.8737e-07 + ik_interpolate = 37 is = 4 omega2 = 7.3641e-07 + ik_interpolate = 37 is = 5 omega2 = 8.1211e-07 + ik_interpolate = 37 is = 6 omega2 = 9.5337e-07 + + ik_interpolate = 38 is = 1 omega2 = 8.2150e-08 + ik_interpolate = 38 is = 2 omega2 = 2.9497e-07 + ik_interpolate = 38 is = 3 omega2 = 5.6848e-07 + ik_interpolate = 38 is = 4 omega2 = 6.3284e-07 + ik_interpolate = 38 is = 5 omega2 = 7.7814e-07 + ik_interpolate = 38 is = 6 omega2 = 9.2316e-07 + + ik_interpolate = 39 is = 1 omega2 = 1.6669e-07 + ik_interpolate = 39 is = 2 omega2 = 1.8740e-07 ik_interpolate = 39 is = 3 omega2 = 2.8597e-07 - ik_interpolate = 39 is = 4 omega2 = 7.3626e-07 - ik_interpolate = 39 is = 5 omega2 = 8.1196e-07 - ik_interpolate = 39 is = 6 omega2 = 9.5322e-07 - - ik_interpolate = 40 is = 1 omega2 = 9.9489e-08 - ik_interpolate = 40 is = 2 omega2 = 9.9489e-08 - ik_interpolate = 40 is = 3 omega2 = 4.0464e-07 - ik_interpolate = 40 is = 4 omega2 = 6.6481e-07 - ik_interpolate = 40 is = 5 omega2 = 6.6481e-07 - ik_interpolate = 40 is = 6 omega2 = 8.4162e-07 - - ik_interpolate = 41 is = 1 omega2 = 6.0245e-08 - ik_interpolate = 41 is = 2 omega2 = 6.0245e-08 - ik_interpolate = 41 is = 3 omega2 = 1.0864e-07 - ik_interpolate = 41 is = 4 omega2 = 6.0055e-07 - ik_interpolate = 41 is = 5 omega2 = 6.0055e-07 - ik_interpolate = 41 is = 6 omega2 = 6.9092e-07 - - ik_interpolate = 42 is = 1 omega2 = 1.6667e-07 - ik_interpolate = 42 is = 2 omega2 = 1.8737e-07 + ik_interpolate = 39 is = 4 omega2 = 7.3641e-07 + ik_interpolate = 39 is = 5 omega2 = 8.1211e-07 + ik_interpolate = 39 is = 6 omega2 = 9.5337e-07 + + ik_interpolate = 40 is = 1 omega2 = 9.9496e-08 + ik_interpolate = 40 is = 2 omega2 = 9.9496e-08 + ik_interpolate = 40 is = 3 omega2 = 4.0471e-07 + ik_interpolate = 40 is = 4 omega2 = 6.6500e-07 + ik_interpolate = 40 is = 5 omega2 = 6.6500e-07 + ik_interpolate = 40 is = 6 omega2 = 8.4171e-07 + + ik_interpolate = 41 is = 1 omega2 = 6.0256e-08 + ik_interpolate = 41 is = 2 omega2 = 6.0256e-08 + ik_interpolate = 41 is = 3 omega2 = 1.0866e-07 + ik_interpolate = 41 is = 4 omega2 = 6.0075e-07 + ik_interpolate = 41 is = 5 omega2 = 6.0075e-07 + ik_interpolate = 41 is = 6 omega2 = 6.9111e-07 + + ik_interpolate = 42 is = 1 omega2 = 1.6669e-07 + ik_interpolate = 42 is = 2 omega2 = 1.8740e-07 ik_interpolate = 42 is = 3 omega2 = 2.8597e-07 - ik_interpolate = 42 is = 4 omega2 = 7.3626e-07 - ik_interpolate = 42 is = 5 omega2 = 8.1196e-07 - ik_interpolate = 42 is = 6 omega2 = 9.5322e-07 - - ik_interpolate = 43 is = 1 omega2 = 3.1734e-07 - ik_interpolate = 43 is = 2 omega2 = 3.1734e-07 - ik_interpolate = 43 is = 3 omega2 = 6.9767e-07 - ik_interpolate = 43 is = 4 omega2 = 8.1558e-07 - ik_interpolate = 43 is = 5 omega2 = 8.1558e-07 - ik_interpolate = 43 is = 6 omega2 = 9.7463e-07 - - ik_interpolate = 44 is = 1 omega2 = 1.6667e-07 - ik_interpolate = 44 is = 2 omega2 = 1.8737e-07 + ik_interpolate = 42 is = 4 omega2 = 7.3641e-07 + ik_interpolate = 42 is = 5 omega2 = 8.1211e-07 + ik_interpolate = 42 is = 6 omega2 = 9.5337e-07 + + ik_interpolate = 43 is = 1 omega2 = 3.1740e-07 + ik_interpolate = 43 is = 2 omega2 = 3.1740e-07 + ik_interpolate = 43 is = 3 omega2 = 6.9771e-07 + ik_interpolate = 43 is = 4 omega2 = 8.1565e-07 + ik_interpolate = 43 is = 5 omega2 = 8.1565e-07 + ik_interpolate = 43 is = 6 omega2 = 9.7471e-07 + + ik_interpolate = 44 is = 1 omega2 = 1.6669e-07 + ik_interpolate = 44 is = 2 omega2 = 1.8740e-07 ik_interpolate = 44 is = 3 omega2 = 2.8597e-07 - ik_interpolate = 44 is = 4 omega2 = 7.3626e-07 - ik_interpolate = 44 is = 5 omega2 = 8.1196e-07 - ik_interpolate = 44 is = 6 omega2 = 9.5322e-07 + ik_interpolate = 44 is = 4 omega2 = 7.3641e-07 + ik_interpolate = 44 is = 5 omega2 = 8.1211e-07 + ik_interpolate = 44 is = 6 omega2 = 9.5337e-07 - ik_interpolate = 45 is = 1 omega2 = 1.6667e-07 - ik_interpolate = 45 is = 2 omega2 = 1.8737e-07 + ik_interpolate = 45 is = 1 omega2 = 1.6669e-07 + ik_interpolate = 45 is = 2 omega2 = 1.8740e-07 ik_interpolate = 45 is = 3 omega2 = 2.8597e-07 - ik_interpolate = 45 is = 4 omega2 = 7.3626e-07 - ik_interpolate = 45 is = 5 omega2 = 8.1196e-07 - ik_interpolate = 45 is = 6 omega2 = 9.5322e-07 - - ik_interpolate = 46 is = 1 omega2 = 9.9489e-08 - ik_interpolate = 46 is = 2 omega2 = 9.9489e-08 - ik_interpolate = 46 is = 3 omega2 = 4.0464e-07 - ik_interpolate = 46 is = 4 omega2 = 6.6481e-07 - ik_interpolate = 46 is = 5 omega2 = 6.6481e-07 - ik_interpolate = 46 is = 6 omega2 = 8.4162e-07 - - ik_interpolate = 47 is = 1 omega2 = 1.6667e-07 - ik_interpolate = 47 is = 2 omega2 = 1.8737e-07 + ik_interpolate = 45 is = 4 omega2 = 7.3641e-07 + ik_interpolate = 45 is = 5 omega2 = 8.1211e-07 + ik_interpolate = 45 is = 6 omega2 = 9.5337e-07 + + ik_interpolate = 46 is = 1 omega2 = 9.9496e-08 + ik_interpolate = 46 is = 2 omega2 = 9.9496e-08 + ik_interpolate = 46 is = 3 omega2 = 4.0471e-07 + ik_interpolate = 46 is = 4 omega2 = 6.6500e-07 + ik_interpolate = 46 is = 5 omega2 = 6.6500e-07 + ik_interpolate = 46 is = 6 omega2 = 8.4171e-07 + + ik_interpolate = 47 is = 1 omega2 = 1.6669e-07 + ik_interpolate = 47 is = 2 omega2 = 1.8740e-07 ik_interpolate = 47 is = 3 omega2 = 2.8597e-07 - ik_interpolate = 47 is = 4 omega2 = 7.3626e-07 - ik_interpolate = 47 is = 5 omega2 = 8.1196e-07 - ik_interpolate = 47 is = 6 omega2 = 9.5322e-07 - - ik_interpolate = 48 is = 1 omega2 = 8.2149e-08 - ik_interpolate = 48 is = 2 omega2 = 2.9491e-07 - ik_interpolate = 48 is = 3 omega2 = 5.6843e-07 - ik_interpolate = 48 is = 4 omega2 = 6.3265e-07 - ik_interpolate = 48 is = 5 omega2 = 7.7807e-07 - ik_interpolate = 48 is = 6 omega2 = 9.2309e-07 - - ik_interpolate = 49 is = 1 omega2 = 1.4540e-07 - ik_interpolate = 49 is = 2 omega2 = 1.4540e-07 - ik_interpolate = 49 is = 3 omega2 = 2.6739e-07 - ik_interpolate = 49 is = 4 omega2 = 7.7319e-07 - ik_interpolate = 49 is = 5 omega2 = 7.7319e-07 - ik_interpolate = 49 is = 6 omega2 = 1.2712e-06 - - ik_interpolate = 50 is = 1 omega2 = 8.2149e-08 - ik_interpolate = 50 is = 2 omega2 = 2.9491e-07 - ik_interpolate = 50 is = 3 omega2 = 5.6843e-07 - ik_interpolate = 50 is = 4 omega2 = 6.3265e-07 - ik_interpolate = 50 is = 5 omega2 = 7.7807e-07 - ik_interpolate = 50 is = 6 omega2 = 9.2309e-07 - - ik_interpolate = 51 is = 1 omega2 = 1.6667e-07 - ik_interpolate = 51 is = 2 omega2 = 1.8737e-07 + ik_interpolate = 47 is = 4 omega2 = 7.3641e-07 + ik_interpolate = 47 is = 5 omega2 = 8.1211e-07 + ik_interpolate = 47 is = 6 omega2 = 9.5337e-07 + + ik_interpolate = 48 is = 1 omega2 = 8.2150e-08 + ik_interpolate = 48 is = 2 omega2 = 2.9497e-07 + ik_interpolate = 48 is = 3 omega2 = 5.6848e-07 + ik_interpolate = 48 is = 4 omega2 = 6.3284e-07 + ik_interpolate = 48 is = 5 omega2 = 7.7814e-07 + ik_interpolate = 48 is = 6 omega2 = 9.2316e-07 + + ik_interpolate = 49 is = 1 omega2 = 1.4543e-07 + ik_interpolate = 49 is = 2 omega2 = 1.4543e-07 + ik_interpolate = 49 is = 3 omega2 = 2.6740e-07 + ik_interpolate = 49 is = 4 omega2 = 7.7334e-07 + ik_interpolate = 49 is = 5 omega2 = 7.7334e-07 + ik_interpolate = 49 is = 6 omega2 = 1.2713e-06 + + ik_interpolate = 50 is = 1 omega2 = 8.2150e-08 + ik_interpolate = 50 is = 2 omega2 = 2.9497e-07 + ik_interpolate = 50 is = 3 omega2 = 5.6848e-07 + ik_interpolate = 50 is = 4 omega2 = 6.3284e-07 + ik_interpolate = 50 is = 5 omega2 = 7.7814e-07 + ik_interpolate = 50 is = 6 omega2 = 9.2316e-07 + + ik_interpolate = 51 is = 1 omega2 = 1.6669e-07 + ik_interpolate = 51 is = 2 omega2 = 1.8740e-07 ik_interpolate = 51 is = 3 omega2 = 2.8597e-07 - ik_interpolate = 51 is = 4 omega2 = 7.3626e-07 - ik_interpolate = 51 is = 5 omega2 = 8.1196e-07 - ik_interpolate = 51 is = 6 omega2 = 9.5322e-07 - - ik_interpolate = 52 is = 1 omega2 = 4.3555e-08 - ik_interpolate = 52 is = 2 omega2 = 4.3555e-08 - ik_interpolate = 52 is = 3 omega2 = 4.6513e-07 - ik_interpolate = 52 is = 4 omega2 = 5.4495e-07 - ik_interpolate = 52 is = 5 omega2 = 5.4495e-07 - ik_interpolate = 52 is = 6 omega2 = 8.6534e-07 - - ik_interpolate = 53 is = 1 omega2 = 8.2149e-08 - ik_interpolate = 53 is = 2 omega2 = 2.9491e-07 - ik_interpolate = 53 is = 3 omega2 = 5.6843e-07 - ik_interpolate = 53 is = 4 omega2 = 6.3265e-07 - ik_interpolate = 53 is = 5 omega2 = 7.7807e-07 - ik_interpolate = 53 is = 6 omega2 = 9.2309e-07 - - ik_interpolate = 54 is = 1 omega2 = 1.6667e-07 - ik_interpolate = 54 is = 2 omega2 = 1.8737e-07 + ik_interpolate = 51 is = 4 omega2 = 7.3641e-07 + ik_interpolate = 51 is = 5 omega2 = 8.1211e-07 + ik_interpolate = 51 is = 6 omega2 = 9.5337e-07 + + ik_interpolate = 52 is = 1 omega2 = 4.3558e-08 + ik_interpolate = 52 is = 2 omega2 = 4.3558e-08 + ik_interpolate = 52 is = 3 omega2 = 4.6520e-07 + ik_interpolate = 52 is = 4 omega2 = 5.4515e-07 + ik_interpolate = 52 is = 5 omega2 = 5.4515e-07 + ik_interpolate = 52 is = 6 omega2 = 8.6541e-07 + + ik_interpolate = 53 is = 1 omega2 = 8.2150e-08 + ik_interpolate = 53 is = 2 omega2 = 2.9497e-07 + ik_interpolate = 53 is = 3 omega2 = 5.6848e-07 + ik_interpolate = 53 is = 4 omega2 = 6.3284e-07 + ik_interpolate = 53 is = 5 omega2 = 7.7814e-07 + ik_interpolate = 53 is = 6 omega2 = 9.2316e-07 + + ik_interpolate = 54 is = 1 omega2 = 1.6669e-07 + ik_interpolate = 54 is = 2 omega2 = 1.8740e-07 ik_interpolate = 54 is = 3 omega2 = 2.8597e-07 - ik_interpolate = 54 is = 4 omega2 = 7.3626e-07 - ik_interpolate = 54 is = 5 omega2 = 8.1196e-07 - ik_interpolate = 54 is = 6 omega2 = 9.5322e-07 - - ik_interpolate = 55 is = 1 omega2 = 9.9489e-08 - ik_interpolate = 55 is = 2 omega2 = 9.9489e-08 - ik_interpolate = 55 is = 3 omega2 = 4.0464e-07 - ik_interpolate = 55 is = 4 omega2 = 6.6481e-07 - ik_interpolate = 55 is = 5 omega2 = 6.6481e-07 - ik_interpolate = 55 is = 6 omega2 = 8.4162e-07 - - ik_interpolate = 56 is = 1 omega2 = 1.6667e-07 - ik_interpolate = 56 is = 2 omega2 = 1.8737e-07 + ik_interpolate = 54 is = 4 omega2 = 7.3641e-07 + ik_interpolate = 54 is = 5 omega2 = 8.1211e-07 + ik_interpolate = 54 is = 6 omega2 = 9.5337e-07 + + ik_interpolate = 55 is = 1 omega2 = 9.9496e-08 + ik_interpolate = 55 is = 2 omega2 = 9.9496e-08 + ik_interpolate = 55 is = 3 omega2 = 4.0471e-07 + ik_interpolate = 55 is = 4 omega2 = 6.6500e-07 + ik_interpolate = 55 is = 5 omega2 = 6.6500e-07 + ik_interpolate = 55 is = 6 omega2 = 8.4171e-07 + + ik_interpolate = 56 is = 1 omega2 = 1.6669e-07 + ik_interpolate = 56 is = 2 omega2 = 1.8740e-07 ik_interpolate = 56 is = 3 omega2 = 2.8597e-07 - ik_interpolate = 56 is = 4 omega2 = 7.3626e-07 - ik_interpolate = 56 is = 5 omega2 = 8.1196e-07 - ik_interpolate = 56 is = 6 omega2 = 9.5322e-07 + ik_interpolate = 56 is = 4 omega2 = 7.3641e-07 + ik_interpolate = 56 is = 5 omega2 = 8.1211e-07 + ik_interpolate = 56 is = 6 omega2 = 9.5337e-07 - ik_interpolate = 57 is = 1 omega2 = 1.6667e-07 - ik_interpolate = 57 is = 2 omega2 = 1.8737e-07 + ik_interpolate = 57 is = 1 omega2 = 1.6669e-07 + ik_interpolate = 57 is = 2 omega2 = 1.8740e-07 ik_interpolate = 57 is = 3 omega2 = 2.8597e-07 - ik_interpolate = 57 is = 4 omega2 = 7.3626e-07 - ik_interpolate = 57 is = 5 omega2 = 8.1196e-07 - ik_interpolate = 57 is = 6 omega2 = 9.5322e-07 - - ik_interpolate = 58 is = 1 omega2 = 9.9489e-08 - ik_interpolate = 58 is = 2 omega2 = 9.9489e-08 - ik_interpolate = 58 is = 3 omega2 = 4.0464e-07 - ik_interpolate = 58 is = 4 omega2 = 6.6481e-07 - ik_interpolate = 58 is = 5 omega2 = 6.6481e-07 - ik_interpolate = 58 is = 6 omega2 = 8.4162e-07 - - ik_interpolate = 59 is = 1 omega2 = 1.6667e-07 - ik_interpolate = 59 is = 2 omega2 = 1.8737e-07 + ik_interpolate = 57 is = 4 omega2 = 7.3641e-07 + ik_interpolate = 57 is = 5 omega2 = 8.1211e-07 + ik_interpolate = 57 is = 6 omega2 = 9.5337e-07 + + ik_interpolate = 58 is = 1 omega2 = 9.9496e-08 + ik_interpolate = 58 is = 2 omega2 = 9.9496e-08 + ik_interpolate = 58 is = 3 omega2 = 4.0471e-07 + ik_interpolate = 58 is = 4 omega2 = 6.6500e-07 + ik_interpolate = 58 is = 5 omega2 = 6.6500e-07 + ik_interpolate = 58 is = 6 omega2 = 8.4171e-07 + + ik_interpolate = 59 is = 1 omega2 = 1.6669e-07 + ik_interpolate = 59 is = 2 omega2 = 1.8740e-07 ik_interpolate = 59 is = 3 omega2 = 2.8597e-07 - ik_interpolate = 59 is = 4 omega2 = 7.3626e-07 - ik_interpolate = 59 is = 5 omega2 = 8.1196e-07 - ik_interpolate = 59 is = 6 omega2 = 9.5322e-07 - - ik_interpolate = 60 is = 1 omega2 = 8.2149e-08 - ik_interpolate = 60 is = 2 omega2 = 2.9491e-07 - ik_interpolate = 60 is = 3 omega2 = 5.6843e-07 - ik_interpolate = 60 is = 4 omega2 = 6.3265e-07 - ik_interpolate = 60 is = 5 omega2 = 7.7807e-07 - ik_interpolate = 60 is = 6 omega2 = 9.2309e-07 - - ik_interpolate = 61 is = 1 omega2 = 4.3555e-08 - ik_interpolate = 61 is = 2 omega2 = 4.3555e-08 - ik_interpolate = 61 is = 3 omega2 = 4.6513e-07 - ik_interpolate = 61 is = 4 omega2 = 5.4495e-07 - ik_interpolate = 61 is = 5 omega2 = 5.4495e-07 - ik_interpolate = 61 is = 6 omega2 = 8.6534e-07 - - ik_interpolate = 62 is = 1 omega2 = 1.6667e-07 - ik_interpolate = 62 is = 2 omega2 = 1.8737e-07 + ik_interpolate = 59 is = 4 omega2 = 7.3641e-07 + ik_interpolate = 59 is = 5 omega2 = 8.1211e-07 + ik_interpolate = 59 is = 6 omega2 = 9.5337e-07 + + ik_interpolate = 60 is = 1 omega2 = 8.2150e-08 + ik_interpolate = 60 is = 2 omega2 = 2.9497e-07 + ik_interpolate = 60 is = 3 omega2 = 5.6848e-07 + ik_interpolate = 60 is = 4 omega2 = 6.3284e-07 + ik_interpolate = 60 is = 5 omega2 = 7.7814e-07 + ik_interpolate = 60 is = 6 omega2 = 9.2316e-07 + + ik_interpolate = 61 is = 1 omega2 = 4.3558e-08 + ik_interpolate = 61 is = 2 omega2 = 4.3558e-08 + ik_interpolate = 61 is = 3 omega2 = 4.6520e-07 + ik_interpolate = 61 is = 4 omega2 = 5.4515e-07 + ik_interpolate = 61 is = 5 omega2 = 5.4515e-07 + ik_interpolate = 61 is = 6 omega2 = 8.6541e-07 + + ik_interpolate = 62 is = 1 omega2 = 1.6669e-07 + ik_interpolate = 62 is = 2 omega2 = 1.8740e-07 ik_interpolate = 62 is = 3 omega2 = 2.8597e-07 - ik_interpolate = 62 is = 4 omega2 = 7.3626e-07 - ik_interpolate = 62 is = 5 omega2 = 8.1196e-07 - ik_interpolate = 62 is = 6 omega2 = 9.5322e-07 - - ik_interpolate = 63 is = 1 omega2 = 8.2149e-08 - ik_interpolate = 63 is = 2 omega2 = 2.9491e-07 - ik_interpolate = 63 is = 3 omega2 = 5.6843e-07 - ik_interpolate = 63 is = 4 omega2 = 6.3265e-07 - ik_interpolate = 63 is = 5 omega2 = 7.7807e-07 - ik_interpolate = 63 is = 6 omega2 = 9.2309e-07 - - ik_interpolate = 64 is = 1 omega2 = 1.4540e-07 - ik_interpolate = 64 is = 2 omega2 = 1.4540e-07 - ik_interpolate = 64 is = 3 omega2 = 2.6739e-07 - ik_interpolate = 64 is = 4 omega2 = 7.7319e-07 - ik_interpolate = 64 is = 5 omega2 = 7.7319e-07 - ik_interpolate = 64 is = 6 omega2 = 1.2712e-06 + ik_interpolate = 62 is = 4 omega2 = 7.3641e-07 + ik_interpolate = 62 is = 5 omega2 = 8.1211e-07 + ik_interpolate = 62 is = 6 omega2 = 9.5337e-07 + + ik_interpolate = 63 is = 1 omega2 = 8.2150e-08 + ik_interpolate = 63 is = 2 omega2 = 2.9497e-07 + ik_interpolate = 63 is = 3 omega2 = 5.6848e-07 + ik_interpolate = 63 is = 4 omega2 = 6.3284e-07 + ik_interpolate = 63 is = 5 omega2 = 7.7814e-07 + ik_interpolate = 63 is = 6 omega2 = 9.2316e-07 + + ik_interpolate = 64 is = 1 omega2 = 1.4543e-07 + ik_interpolate = 64 is = 2 omega2 = 1.4543e-07 + ik_interpolate = 64 is = 3 omega2 = 2.6740e-07 + ik_interpolate = 64 is = 4 omega2 = 7.7334e-07 + ik_interpolate = 64 is = 5 omega2 = 7.7334e-07 + ik_interpolate = 64 is = 6 omega2 = 1.2713e-06 Temperature = 6.0000e+02 K SCPH ITER 1 : DIFF = N/A - SCPH ITER 2 : DIFF = 1.1993e-07 - SCPH ITER 3 : DIFF = 1.0595e-07 - SCPH ITER 4 : DIFF = 9.3603e-08 - SCPH ITER 5 : DIFF = 8.2700e-08 - SCPH ITER 6 : DIFF = 7.3069e-08 - SCPH ITER 7 : DIFF = 6.4561e-08 - SCPH ITER 8 : DIFF = 5.7046e-08 - SCPH ITER 9 : DIFF = 5.0406e-08 - SCPH ITER 10 : DIFF = 4.4541e-08 - SCPH ITER 11 : DIFF = 3.9358e-08 - SCPH ITER 12 : DIFF = 3.4779e-08 - SCPH ITER 13 : DIFF = 3.0734e-08 - SCPH ITER 14 : DIFF = 2.7159e-08 - SCPH ITER 15 : DIFF = 2.4000e-08 - SCPH ITER 16 : DIFF = 2.1209e-08 - SCPH ITER 17 : DIFF = 1.8743e-08 - SCPH ITER 18 : DIFF = 1.6563e-08 - SCPH ITER 19 : DIFF = 1.4637e-08 - SCPH ITER 20 : DIFF = 1.2935e-08 - SCPH ITER 21 : DIFF = 1.1431e-08 - SCPH ITER 22 : DIFF = 1.0102e-08 - SCPH ITER 23 : DIFF = 8.9276e-09 + SCPH ITER 2 : DIFF = 1.2116e-07 + SCPH ITER 3 : DIFF = 1.0703e-07 + SCPH ITER 4 : DIFF = 9.4562e-08 + SCPH ITER 5 : DIFF = 8.3547e-08 + SCPH ITER 6 : DIFF = 7.3817e-08 + SCPH ITER 7 : DIFF = 6.5222e-08 + SCPH ITER 8 : DIFF = 5.7630e-08 + SCPH ITER 9 : DIFF = 5.0922e-08 + SCPH ITER 10 : DIFF = 4.4996e-08 + SCPH ITER 11 : DIFF = 3.9761e-08 + SCPH ITER 12 : DIFF = 3.5135e-08 + SCPH ITER 13 : DIFF = 3.1048e-08 + SCPH ITER 14 : DIFF = 2.7437e-08 + SCPH ITER 15 : DIFF = 2.4246e-08 + SCPH ITER 16 : DIFF = 2.1426e-08 + SCPH ITER 17 : DIFF = 1.8934e-08 + SCPH ITER 18 : DIFF = 1.6732e-08 + SCPH ITER 19 : DIFF = 1.4787e-08 + SCPH ITER 20 : DIFF = 1.3068e-08 + SCPH ITER 21 : DIFF = 1.1548e-08 + SCPH ITER 22 : DIFF = 1.0205e-08 + SCPH ITER 23 : DIFF = 9.0190e-09 + SCPH ITER 24 : DIFF = 7.9704e-09 + SCPH ITER 25 : DIFF = 7.0438e-09 + SCPH ITER 26 : DIFF = 6.2249e-09 + SCPH ITER 27 : DIFF = 5.5012e-09 + SCPH ITER 28 : DIFF = 4.8617e-09 + SCPH ITER 29 : DIFF = 4.2965e-09 + SCPH ITER 30 : DIFF = 3.7970e-09 + SCPH ITER 31 : DIFF = 3.3556e-09 + SCPH ITER 32 : DIFF = 2.9655e-09 + SCPH ITER 33 : DIFF = 2.6208e-09 + SCPH ITER 34 : DIFF = 2.3161e-09 + SCPH ITER 35 : DIFF = 2.0468e-09 + SCPH ITER 36 : DIFF = 1.8089e-09 + SCPH ITER 37 : DIFF = 1.5986e-09 + SCPH ITER 38 : DIFF = 1.4128e-09 + SCPH ITER 39 : DIFF = 1.2485e-09 + SCPH ITER 40 : DIFF = 1.1034e-09 + SCPH ITER 41 : DIFF = 9.7512e-10 + SCPH ITER 42 : DIFF = 8.6175e-10 + SCPH ITER 43 : DIFF = 7.6157e-10 + SCPH ITER 44 : DIFF = 6.7303e-10 + SCPH ITER 45 : DIFF = 5.9479e-10 + SCPH ITER 46 : DIFF = 5.2564e-10 + SCPH ITER 47 : DIFF = 4.6453e-10 + SCPH ITER 48 : DIFF = 4.1053e-10 + SCPH ITER 49 : DIFF = 3.6280e-10 + SCPH ITER 50 : DIFF = 3.2062e-10 + SCPH ITER 51 : DIFF = 2.8334e-10 + SCPH ITER 52 : DIFF = 2.5040e-10 + SCPH ITER 53 : DIFF = 2.2130e-10 + SCPH ITER 54 : DIFF = 1.9559e-10 + SCPH ITER 55 : DIFF = 1.7285e-10 + SCPH ITER 56 : DIFF = 1.5273e-10 + SCPH ITER 57 : DIFF = 1.3497e-10 + SCPH ITER 58 : DIFF = 1.1928e-10 + SCPH ITER 59 : DIFF = 1.0544e-10 + SCPH ITER 60 : DIFF = 9.3157e-11 DIFF < SCPH_TOL : break SCPH loop - Temp = 6.0000e+02 : convergence achieved in 23 iterations. + Temp = 6.0000e+02 : convergence achieved in 60 iterations. New eigenvalues - ik_interpolate = 1 is = 1 omega2 = 1.0346e-22 - ik_interpolate = 1 is = 2 omega2 = 1.5882e-22 - ik_interpolate = 1 is = 3 omega2 = 1.6124e-22 - ik_interpolate = 1 is = 4 omega2 = 3.1928e-07 - ik_interpolate = 1 is = 5 omega2 = 3.1928e-07 - ik_interpolate = 1 is = 6 omega2 = 3.1928e-07 - - ik_interpolate = 2 is = 1 omega2 = 1.4296e-07 - ik_interpolate = 2 is = 2 omega2 = 1.4296e-07 - ik_interpolate = 2 is = 3 omega2 = 2.6661e-07 - ik_interpolate = 2 is = 4 omega2 = 7.5892e-07 - ik_interpolate = 2 is = 5 omega2 = 7.5892e-07 - ik_interpolate = 2 is = 6 omega2 = 1.2567e-06 - - ik_interpolate = 3 is = 1 omega2 = 3.1177e-07 - ik_interpolate = 3 is = 2 omega2 = 3.1177e-07 - ik_interpolate = 3 is = 3 omega2 = 6.9607e-07 - ik_interpolate = 3 is = 4 omega2 = 8.1130e-07 - ik_interpolate = 3 is = 5 omega2 = 8.1130e-07 - ik_interpolate = 3 is = 6 omega2 = 9.6910e-07 - - ik_interpolate = 4 is = 1 omega2 = 1.4296e-07 - ik_interpolate = 4 is = 2 omega2 = 1.4296e-07 - ik_interpolate = 4 is = 3 omega2 = 2.6661e-07 - ik_interpolate = 4 is = 4 omega2 = 7.5892e-07 - ik_interpolate = 4 is = 5 omega2 = 7.5892e-07 - ik_interpolate = 4 is = 6 omega2 = 1.2567e-06 - - ik_interpolate = 5 is = 1 omega2 = 1.4296e-07 - ik_interpolate = 5 is = 2 omega2 = 1.4296e-07 - ik_interpolate = 5 is = 3 omega2 = 2.6661e-07 - ik_interpolate = 5 is = 4 omega2 = 7.5892e-07 - ik_interpolate = 5 is = 5 omega2 = 7.5892e-07 - ik_interpolate = 5 is = 6 omega2 = 1.2567e-06 - - ik_interpolate = 6 is = 1 omega2 = 4.3326e-08 - ik_interpolate = 6 is = 2 omega2 = 4.3326e-08 - ik_interpolate = 6 is = 3 omega2 = 4.5870e-07 - ik_interpolate = 6 is = 4 omega2 = 5.2383e-07 - ik_interpolate = 6 is = 5 omega2 = 5.2383e-07 - ik_interpolate = 6 is = 6 omega2 = 8.6099e-07 - - ik_interpolate = 7 is = 1 omega2 = 1.6429e-07 - ik_interpolate = 7 is = 2 omega2 = 1.8432e-07 + ik_interpolate = 1 is = 1 omega2 = 1.7205e-22 + ik_interpolate = 1 is = 2 omega2 = 1.7231e-22 + ik_interpolate = 1 is = 3 omega2 = 1.9537e-22 + ik_interpolate = 1 is = 4 omega2 = 3.1950e-07 + ik_interpolate = 1 is = 5 omega2 = 3.1950e-07 + ik_interpolate = 1 is = 6 omega2 = 3.1950e-07 + + ik_interpolate = 2 is = 1 omega2 = 1.4299e-07 + ik_interpolate = 2 is = 2 omega2 = 1.4299e-07 + ik_interpolate = 2 is = 3 omega2 = 2.6662e-07 + ik_interpolate = 2 is = 4 omega2 = 7.5906e-07 + ik_interpolate = 2 is = 5 omega2 = 7.5906e-07 + ik_interpolate = 2 is = 6 omega2 = 1.2569e-06 + + ik_interpolate = 3 is = 1 omega2 = 3.1183e-07 + ik_interpolate = 3 is = 2 omega2 = 3.1183e-07 + ik_interpolate = 3 is = 3 omega2 = 6.9611e-07 + ik_interpolate = 3 is = 4 omega2 = 8.1136e-07 + ik_interpolate = 3 is = 5 omega2 = 8.1136e-07 + ik_interpolate = 3 is = 6 omega2 = 9.6917e-07 + + ik_interpolate = 4 is = 1 omega2 = 1.4299e-07 + ik_interpolate = 4 is = 2 omega2 = 1.4299e-07 + ik_interpolate = 4 is = 3 omega2 = 2.6662e-07 + ik_interpolate = 4 is = 4 omega2 = 7.5906e-07 + ik_interpolate = 4 is = 5 omega2 = 7.5906e-07 + ik_interpolate = 4 is = 6 omega2 = 1.2569e-06 + + ik_interpolate = 5 is = 1 omega2 = 1.4299e-07 + ik_interpolate = 5 is = 2 omega2 = 1.4299e-07 + ik_interpolate = 5 is = 3 omega2 = 2.6662e-07 + ik_interpolate = 5 is = 4 omega2 = 7.5906e-07 + ik_interpolate = 5 is = 5 omega2 = 7.5906e-07 + ik_interpolate = 5 is = 6 omega2 = 1.2569e-06 + + ik_interpolate = 6 is = 1 omega2 = 4.3328e-08 + ik_interpolate = 6 is = 2 omega2 = 4.3328e-08 + ik_interpolate = 6 is = 3 omega2 = 4.5877e-07 + ik_interpolate = 6 is = 4 omega2 = 5.2404e-07 + ik_interpolate = 6 is = 5 omega2 = 5.2404e-07 + ik_interpolate = 6 is = 6 omega2 = 8.6106e-07 + + ik_interpolate = 7 is = 1 omega2 = 1.6432e-07 + ik_interpolate = 7 is = 2 omega2 = 1.8435e-07 ik_interpolate = 7 is = 3 omega2 = 2.8703e-07 - ik_interpolate = 7 is = 4 omega2 = 7.2253e-07 - ik_interpolate = 7 is = 5 omega2 = 7.9789e-07 - ik_interpolate = 7 is = 6 omega2 = 9.3916e-07 - - ik_interpolate = 8 is = 1 omega2 = 8.2176e-08 - ik_interpolate = 8 is = 2 omega2 = 2.8865e-07 - ik_interpolate = 8 is = 3 omega2 = 5.6454e-07 - ik_interpolate = 8 is = 4 omega2 = 6.1323e-07 - ik_interpolate = 8 is = 5 omega2 = 7.7289e-07 - ik_interpolate = 8 is = 6 omega2 = 9.1763e-07 - - ik_interpolate = 9 is = 1 omega2 = 3.1177e-07 - ik_interpolate = 9 is = 2 omega2 = 3.1177e-07 - ik_interpolate = 9 is = 3 omega2 = 6.9607e-07 - ik_interpolate = 9 is = 4 omega2 = 8.1130e-07 - ik_interpolate = 9 is = 5 omega2 = 8.1130e-07 - ik_interpolate = 9 is = 6 omega2 = 9.6910e-07 - - ik_interpolate = 10 is = 1 omega2 = 1.6429e-07 - ik_interpolate = 10 is = 2 omega2 = 1.8432e-07 + ik_interpolate = 7 is = 4 omega2 = 7.2268e-07 + ik_interpolate = 7 is = 5 omega2 = 7.9804e-07 + ik_interpolate = 7 is = 6 omega2 = 9.3930e-07 + + ik_interpolate = 8 is = 1 omega2 = 8.2177e-08 + ik_interpolate = 8 is = 2 omega2 = 2.8872e-07 + ik_interpolate = 8 is = 3 omega2 = 5.6459e-07 + ik_interpolate = 8 is = 4 omega2 = 6.1343e-07 + ik_interpolate = 8 is = 5 omega2 = 7.7296e-07 + ik_interpolate = 8 is = 6 omega2 = 9.1770e-07 + + ik_interpolate = 9 is = 1 omega2 = 3.1183e-07 + ik_interpolate = 9 is = 2 omega2 = 3.1183e-07 + ik_interpolate = 9 is = 3 omega2 = 6.9611e-07 + ik_interpolate = 9 is = 4 omega2 = 8.1136e-07 + ik_interpolate = 9 is = 5 omega2 = 8.1136e-07 + ik_interpolate = 9 is = 6 omega2 = 9.6917e-07 + + ik_interpolate = 10 is = 1 omega2 = 1.6432e-07 + ik_interpolate = 10 is = 2 omega2 = 1.8435e-07 ik_interpolate = 10 is = 3 omega2 = 2.8703e-07 - ik_interpolate = 10 is = 4 omega2 = 7.2253e-07 - ik_interpolate = 10 is = 5 omega2 = 7.9789e-07 - ik_interpolate = 10 is = 6 omega2 = 9.3916e-07 - - ik_interpolate = 11 is = 1 omega2 = 5.8949e-08 - ik_interpolate = 11 is = 2 omega2 = 5.8949e-08 - ik_interpolate = 11 is = 3 omega2 = 1.0620e-07 - ik_interpolate = 11 is = 4 omega2 = 5.8061e-07 - ik_interpolate = 11 is = 5 omega2 = 5.8061e-07 - ik_interpolate = 11 is = 6 omega2 = 6.7148e-07 - - ik_interpolate = 12 is = 1 omega2 = 1.6429e-07 - ik_interpolate = 12 is = 2 omega2 = 1.8432e-07 + ik_interpolate = 10 is = 4 omega2 = 7.2268e-07 + ik_interpolate = 10 is = 5 omega2 = 7.9804e-07 + ik_interpolate = 10 is = 6 omega2 = 9.3930e-07 + + ik_interpolate = 11 is = 1 omega2 = 5.8959e-08 + ik_interpolate = 11 is = 2 omega2 = 5.8959e-08 + ik_interpolate = 11 is = 3 omega2 = 1.0621e-07 + ik_interpolate = 11 is = 4 omega2 = 5.8081e-07 + ik_interpolate = 11 is = 5 omega2 = 5.8081e-07 + ik_interpolate = 11 is = 6 omega2 = 6.7167e-07 + + ik_interpolate = 12 is = 1 omega2 = 1.6432e-07 + ik_interpolate = 12 is = 2 omega2 = 1.8435e-07 ik_interpolate = 12 is = 3 omega2 = 2.8703e-07 - ik_interpolate = 12 is = 4 omega2 = 7.2253e-07 - ik_interpolate = 12 is = 5 omega2 = 7.9789e-07 - ik_interpolate = 12 is = 6 omega2 = 9.3916e-07 - - ik_interpolate = 13 is = 1 omega2 = 1.4296e-07 - ik_interpolate = 13 is = 2 omega2 = 1.4296e-07 - ik_interpolate = 13 is = 3 omega2 = 2.6661e-07 - ik_interpolate = 13 is = 4 omega2 = 7.5892e-07 - ik_interpolate = 13 is = 5 omega2 = 7.5892e-07 - ik_interpolate = 13 is = 6 omega2 = 1.2567e-06 - - ik_interpolate = 14 is = 1 omega2 = 8.2176e-08 - ik_interpolate = 14 is = 2 omega2 = 2.8865e-07 - ik_interpolate = 14 is = 3 omega2 = 5.6454e-07 - ik_interpolate = 14 is = 4 omega2 = 6.1323e-07 - ik_interpolate = 14 is = 5 omega2 = 7.7289e-07 - ik_interpolate = 14 is = 6 omega2 = 9.1763e-07 - - ik_interpolate = 15 is = 1 omega2 = 1.6429e-07 - ik_interpolate = 15 is = 2 omega2 = 1.8432e-07 + ik_interpolate = 12 is = 4 omega2 = 7.2268e-07 + ik_interpolate = 12 is = 5 omega2 = 7.9804e-07 + ik_interpolate = 12 is = 6 omega2 = 9.3930e-07 + + ik_interpolate = 13 is = 1 omega2 = 1.4299e-07 + ik_interpolate = 13 is = 2 omega2 = 1.4299e-07 + ik_interpolate = 13 is = 3 omega2 = 2.6662e-07 + ik_interpolate = 13 is = 4 omega2 = 7.5906e-07 + ik_interpolate = 13 is = 5 omega2 = 7.5906e-07 + ik_interpolate = 13 is = 6 omega2 = 1.2569e-06 + + ik_interpolate = 14 is = 1 omega2 = 8.2177e-08 + ik_interpolate = 14 is = 2 omega2 = 2.8872e-07 + ik_interpolate = 14 is = 3 omega2 = 5.6459e-07 + ik_interpolate = 14 is = 4 omega2 = 6.1343e-07 + ik_interpolate = 14 is = 5 omega2 = 7.7296e-07 + ik_interpolate = 14 is = 6 omega2 = 9.1770e-07 + + ik_interpolate = 15 is = 1 omega2 = 1.6432e-07 + ik_interpolate = 15 is = 2 omega2 = 1.8435e-07 ik_interpolate = 15 is = 3 omega2 = 2.8703e-07 - ik_interpolate = 15 is = 4 omega2 = 7.2253e-07 - ik_interpolate = 15 is = 5 omega2 = 7.9789e-07 - ik_interpolate = 15 is = 6 omega2 = 9.3916e-07 - - ik_interpolate = 16 is = 1 omega2 = 4.3326e-08 - ik_interpolate = 16 is = 2 omega2 = 4.3326e-08 - ik_interpolate = 16 is = 3 omega2 = 4.5870e-07 - ik_interpolate = 16 is = 4 omega2 = 5.2383e-07 - ik_interpolate = 16 is = 5 omega2 = 5.2383e-07 - ik_interpolate = 16 is = 6 omega2 = 8.6099e-07 - - ik_interpolate = 17 is = 1 omega2 = 1.4296e-07 - ik_interpolate = 17 is = 2 omega2 = 1.4296e-07 - ik_interpolate = 17 is = 3 omega2 = 2.6661e-07 - ik_interpolate = 17 is = 4 omega2 = 7.5892e-07 - ik_interpolate = 17 is = 5 omega2 = 7.5892e-07 - ik_interpolate = 17 is = 6 omega2 = 1.2567e-06 - - ik_interpolate = 18 is = 1 omega2 = 4.3326e-08 - ik_interpolate = 18 is = 2 omega2 = 4.3326e-08 - ik_interpolate = 18 is = 3 omega2 = 4.5870e-07 - ik_interpolate = 18 is = 4 omega2 = 5.2383e-07 - ik_interpolate = 18 is = 5 omega2 = 5.2383e-07 - ik_interpolate = 18 is = 6 omega2 = 8.6099e-07 - - ik_interpolate = 19 is = 1 omega2 = 1.6429e-07 - ik_interpolate = 19 is = 2 omega2 = 1.8432e-07 + ik_interpolate = 15 is = 4 omega2 = 7.2268e-07 + ik_interpolate = 15 is = 5 omega2 = 7.9804e-07 + ik_interpolate = 15 is = 6 omega2 = 9.3930e-07 + + ik_interpolate = 16 is = 1 omega2 = 4.3328e-08 + ik_interpolate = 16 is = 2 omega2 = 4.3328e-08 + ik_interpolate = 16 is = 3 omega2 = 4.5877e-07 + ik_interpolate = 16 is = 4 omega2 = 5.2404e-07 + ik_interpolate = 16 is = 5 omega2 = 5.2404e-07 + ik_interpolate = 16 is = 6 omega2 = 8.6106e-07 + + ik_interpolate = 17 is = 1 omega2 = 1.4299e-07 + ik_interpolate = 17 is = 2 omega2 = 1.4299e-07 + ik_interpolate = 17 is = 3 omega2 = 2.6662e-07 + ik_interpolate = 17 is = 4 omega2 = 7.5906e-07 + ik_interpolate = 17 is = 5 omega2 = 7.5906e-07 + ik_interpolate = 17 is = 6 omega2 = 1.2569e-06 + + ik_interpolate = 18 is = 1 omega2 = 4.3328e-08 + ik_interpolate = 18 is = 2 omega2 = 4.3328e-08 + ik_interpolate = 18 is = 3 omega2 = 4.5877e-07 + ik_interpolate = 18 is = 4 omega2 = 5.2404e-07 + ik_interpolate = 18 is = 5 omega2 = 5.2404e-07 + ik_interpolate = 18 is = 6 omega2 = 8.6106e-07 + + ik_interpolate = 19 is = 1 omega2 = 1.6432e-07 + ik_interpolate = 19 is = 2 omega2 = 1.8435e-07 ik_interpolate = 19 is = 3 omega2 = 2.8703e-07 - ik_interpolate = 19 is = 4 omega2 = 7.2253e-07 - ik_interpolate = 19 is = 5 omega2 = 7.9789e-07 - ik_interpolate = 19 is = 6 omega2 = 9.3916e-07 - - ik_interpolate = 20 is = 1 omega2 = 8.2176e-08 - ik_interpolate = 20 is = 2 omega2 = 2.8865e-07 - ik_interpolate = 20 is = 3 omega2 = 5.6454e-07 - ik_interpolate = 20 is = 4 omega2 = 6.1323e-07 - ik_interpolate = 20 is = 5 omega2 = 7.7289e-07 - ik_interpolate = 20 is = 6 omega2 = 9.1763e-07 - - ik_interpolate = 21 is = 1 omega2 = 4.3326e-08 - ik_interpolate = 21 is = 2 omega2 = 4.3326e-08 - ik_interpolate = 21 is = 3 omega2 = 4.5870e-07 - ik_interpolate = 21 is = 4 omega2 = 5.2383e-07 - ik_interpolate = 21 is = 5 omega2 = 5.2383e-07 - ik_interpolate = 21 is = 6 omega2 = 8.6099e-07 - - ik_interpolate = 22 is = 1 omega2 = 1.4296e-07 - ik_interpolate = 22 is = 2 omega2 = 1.4296e-07 - ik_interpolate = 22 is = 3 omega2 = 2.6661e-07 - ik_interpolate = 22 is = 4 omega2 = 7.5892e-07 - ik_interpolate = 22 is = 5 omega2 = 7.5892e-07 - ik_interpolate = 22 is = 6 omega2 = 1.2567e-06 - - ik_interpolate = 23 is = 1 omega2 = 8.2176e-08 - ik_interpolate = 23 is = 2 omega2 = 2.8865e-07 - ik_interpolate = 23 is = 3 omega2 = 5.6454e-07 - ik_interpolate = 23 is = 4 omega2 = 6.1323e-07 - ik_interpolate = 23 is = 5 omega2 = 7.7289e-07 - ik_interpolate = 23 is = 6 omega2 = 9.1763e-07 - - ik_interpolate = 24 is = 1 omega2 = 1.6429e-07 - ik_interpolate = 24 is = 2 omega2 = 1.8432e-07 + ik_interpolate = 19 is = 4 omega2 = 7.2268e-07 + ik_interpolate = 19 is = 5 omega2 = 7.9804e-07 + ik_interpolate = 19 is = 6 omega2 = 9.3930e-07 + + ik_interpolate = 20 is = 1 omega2 = 8.2177e-08 + ik_interpolate = 20 is = 2 omega2 = 2.8872e-07 + ik_interpolate = 20 is = 3 omega2 = 5.6459e-07 + ik_interpolate = 20 is = 4 omega2 = 6.1343e-07 + ik_interpolate = 20 is = 5 omega2 = 7.7296e-07 + ik_interpolate = 20 is = 6 omega2 = 9.1770e-07 + + ik_interpolate = 21 is = 1 omega2 = 4.3328e-08 + ik_interpolate = 21 is = 2 omega2 = 4.3328e-08 + ik_interpolate = 21 is = 3 omega2 = 4.5877e-07 + ik_interpolate = 21 is = 4 omega2 = 5.2404e-07 + ik_interpolate = 21 is = 5 omega2 = 5.2404e-07 + ik_interpolate = 21 is = 6 omega2 = 8.6106e-07 + + ik_interpolate = 22 is = 1 omega2 = 1.4299e-07 + ik_interpolate = 22 is = 2 omega2 = 1.4299e-07 + ik_interpolate = 22 is = 3 omega2 = 2.6662e-07 + ik_interpolate = 22 is = 4 omega2 = 7.5906e-07 + ik_interpolate = 22 is = 5 omega2 = 7.5906e-07 + ik_interpolate = 22 is = 6 omega2 = 1.2569e-06 + + ik_interpolate = 23 is = 1 omega2 = 8.2177e-08 + ik_interpolate = 23 is = 2 omega2 = 2.8872e-07 + ik_interpolate = 23 is = 3 omega2 = 5.6459e-07 + ik_interpolate = 23 is = 4 omega2 = 6.1343e-07 + ik_interpolate = 23 is = 5 omega2 = 7.7296e-07 + ik_interpolate = 23 is = 6 omega2 = 9.1770e-07 + + ik_interpolate = 24 is = 1 omega2 = 1.6432e-07 + ik_interpolate = 24 is = 2 omega2 = 1.8435e-07 ik_interpolate = 24 is = 3 omega2 = 2.8703e-07 - ik_interpolate = 24 is = 4 omega2 = 7.2253e-07 - ik_interpolate = 24 is = 5 omega2 = 7.9789e-07 - ik_interpolate = 24 is = 6 omega2 = 9.3916e-07 + ik_interpolate = 24 is = 4 omega2 = 7.2268e-07 + ik_interpolate = 24 is = 5 omega2 = 7.9804e-07 + ik_interpolate = 24 is = 6 omega2 = 9.3930e-07 - ik_interpolate = 25 is = 1 omega2 = 1.6429e-07 - ik_interpolate = 25 is = 2 omega2 = 1.8432e-07 + ik_interpolate = 25 is = 1 omega2 = 1.6432e-07 + ik_interpolate = 25 is = 2 omega2 = 1.8435e-07 ik_interpolate = 25 is = 3 omega2 = 2.8703e-07 - ik_interpolate = 25 is = 4 omega2 = 7.2253e-07 - ik_interpolate = 25 is = 5 omega2 = 7.9789e-07 - ik_interpolate = 25 is = 6 omega2 = 9.3916e-07 - - ik_interpolate = 26 is = 1 omega2 = 8.2176e-08 - ik_interpolate = 26 is = 2 omega2 = 2.8865e-07 - ik_interpolate = 26 is = 3 omega2 = 5.6454e-07 - ik_interpolate = 26 is = 4 omega2 = 6.1323e-07 - ik_interpolate = 26 is = 5 omega2 = 7.7289e-07 - ik_interpolate = 26 is = 6 omega2 = 9.1763e-07 - - ik_interpolate = 27 is = 1 omega2 = 1.6429e-07 - ik_interpolate = 27 is = 2 omega2 = 1.8432e-07 + ik_interpolate = 25 is = 4 omega2 = 7.2268e-07 + ik_interpolate = 25 is = 5 omega2 = 7.9804e-07 + ik_interpolate = 25 is = 6 omega2 = 9.3930e-07 + + ik_interpolate = 26 is = 1 omega2 = 8.2177e-08 + ik_interpolate = 26 is = 2 omega2 = 2.8872e-07 + ik_interpolate = 26 is = 3 omega2 = 5.6459e-07 + ik_interpolate = 26 is = 4 omega2 = 6.1343e-07 + ik_interpolate = 26 is = 5 omega2 = 7.7296e-07 + ik_interpolate = 26 is = 6 omega2 = 9.1770e-07 + + ik_interpolate = 27 is = 1 omega2 = 1.6432e-07 + ik_interpolate = 27 is = 2 omega2 = 1.8435e-07 ik_interpolate = 27 is = 3 omega2 = 2.8703e-07 - ik_interpolate = 27 is = 4 omega2 = 7.2253e-07 - ik_interpolate = 27 is = 5 omega2 = 7.9789e-07 - ik_interpolate = 27 is = 6 omega2 = 9.3916e-07 - - ik_interpolate = 28 is = 1 omega2 = 9.8451e-08 - ik_interpolate = 28 is = 2 omega2 = 9.8451e-08 - ik_interpolate = 28 is = 3 omega2 = 3.9914e-07 - ik_interpolate = 28 is = 4 omega2 = 6.4553e-07 - ik_interpolate = 28 is = 5 omega2 = 6.4553e-07 - ik_interpolate = 28 is = 6 omega2 = 8.3425e-07 - - ik_interpolate = 29 is = 1 omega2 = 8.2176e-08 - ik_interpolate = 29 is = 2 omega2 = 2.8865e-07 - ik_interpolate = 29 is = 3 omega2 = 5.6454e-07 - ik_interpolate = 29 is = 4 omega2 = 6.1323e-07 - ik_interpolate = 29 is = 5 omega2 = 7.7289e-07 - ik_interpolate = 29 is = 6 omega2 = 9.1763e-07 - - ik_interpolate = 30 is = 1 omega2 = 1.6429e-07 - ik_interpolate = 30 is = 2 omega2 = 1.8432e-07 + ik_interpolate = 27 is = 4 omega2 = 7.2268e-07 + ik_interpolate = 27 is = 5 omega2 = 7.9804e-07 + ik_interpolate = 27 is = 6 omega2 = 9.3930e-07 + + ik_interpolate = 28 is = 1 omega2 = 9.8458e-08 + ik_interpolate = 28 is = 2 omega2 = 9.8458e-08 + ik_interpolate = 28 is = 3 omega2 = 3.9920e-07 + ik_interpolate = 28 is = 4 omega2 = 6.4572e-07 + ik_interpolate = 28 is = 5 omega2 = 6.4572e-07 + ik_interpolate = 28 is = 6 omega2 = 8.3433e-07 + + ik_interpolate = 29 is = 1 omega2 = 8.2177e-08 + ik_interpolate = 29 is = 2 omega2 = 2.8872e-07 + ik_interpolate = 29 is = 3 omega2 = 5.6459e-07 + ik_interpolate = 29 is = 4 omega2 = 6.1343e-07 + ik_interpolate = 29 is = 5 omega2 = 7.7296e-07 + ik_interpolate = 29 is = 6 omega2 = 9.1770e-07 + + ik_interpolate = 30 is = 1 omega2 = 1.6432e-07 + ik_interpolate = 30 is = 2 omega2 = 1.8435e-07 ik_interpolate = 30 is = 3 omega2 = 2.8703e-07 - ik_interpolate = 30 is = 4 omega2 = 7.2253e-07 - ik_interpolate = 30 is = 5 omega2 = 7.9789e-07 - ik_interpolate = 30 is = 6 omega2 = 9.3916e-07 - - ik_interpolate = 31 is = 1 omega2 = 9.8451e-08 - ik_interpolate = 31 is = 2 omega2 = 9.8451e-08 - ik_interpolate = 31 is = 3 omega2 = 3.9914e-07 - ik_interpolate = 31 is = 4 omega2 = 6.4553e-07 - ik_interpolate = 31 is = 5 omega2 = 6.4553e-07 - ik_interpolate = 31 is = 6 omega2 = 8.3425e-07 - - ik_interpolate = 32 is = 1 omega2 = 1.6429e-07 - ik_interpolate = 32 is = 2 omega2 = 1.8432e-07 + ik_interpolate = 30 is = 4 omega2 = 7.2268e-07 + ik_interpolate = 30 is = 5 omega2 = 7.9804e-07 + ik_interpolate = 30 is = 6 omega2 = 9.3930e-07 + + ik_interpolate = 31 is = 1 omega2 = 9.8458e-08 + ik_interpolate = 31 is = 2 omega2 = 9.8458e-08 + ik_interpolate = 31 is = 3 omega2 = 3.9920e-07 + ik_interpolate = 31 is = 4 omega2 = 6.4572e-07 + ik_interpolate = 31 is = 5 omega2 = 6.4572e-07 + ik_interpolate = 31 is = 6 omega2 = 8.3433e-07 + + ik_interpolate = 32 is = 1 omega2 = 1.6432e-07 + ik_interpolate = 32 is = 2 omega2 = 1.8435e-07 ik_interpolate = 32 is = 3 omega2 = 2.8703e-07 - ik_interpolate = 32 is = 4 omega2 = 7.2253e-07 - ik_interpolate = 32 is = 5 omega2 = 7.9789e-07 - ik_interpolate = 32 is = 6 omega2 = 9.3916e-07 - - ik_interpolate = 33 is = 1 omega2 = 3.1177e-07 - ik_interpolate = 33 is = 2 omega2 = 3.1177e-07 - ik_interpolate = 33 is = 3 omega2 = 6.9607e-07 - ik_interpolate = 33 is = 4 omega2 = 8.1130e-07 - ik_interpolate = 33 is = 5 omega2 = 8.1130e-07 - ik_interpolate = 33 is = 6 omega2 = 9.6910e-07 - - ik_interpolate = 34 is = 1 omega2 = 1.6429e-07 - ik_interpolate = 34 is = 2 omega2 = 1.8432e-07 + ik_interpolate = 32 is = 4 omega2 = 7.2268e-07 + ik_interpolate = 32 is = 5 omega2 = 7.9804e-07 + ik_interpolate = 32 is = 6 omega2 = 9.3930e-07 + + ik_interpolate = 33 is = 1 omega2 = 3.1183e-07 + ik_interpolate = 33 is = 2 omega2 = 3.1183e-07 + ik_interpolate = 33 is = 3 omega2 = 6.9611e-07 + ik_interpolate = 33 is = 4 omega2 = 8.1136e-07 + ik_interpolate = 33 is = 5 omega2 = 8.1136e-07 + ik_interpolate = 33 is = 6 omega2 = 9.6917e-07 + + ik_interpolate = 34 is = 1 omega2 = 1.6432e-07 + ik_interpolate = 34 is = 2 omega2 = 1.8435e-07 ik_interpolate = 34 is = 3 omega2 = 2.8703e-07 - ik_interpolate = 34 is = 4 omega2 = 7.2253e-07 - ik_interpolate = 34 is = 5 omega2 = 7.9789e-07 - ik_interpolate = 34 is = 6 omega2 = 9.3916e-07 - - ik_interpolate = 35 is = 1 omega2 = 5.8949e-08 - ik_interpolate = 35 is = 2 omega2 = 5.8949e-08 - ik_interpolate = 35 is = 3 omega2 = 1.0620e-07 - ik_interpolate = 35 is = 4 omega2 = 5.8061e-07 - ik_interpolate = 35 is = 5 omega2 = 5.8061e-07 - ik_interpolate = 35 is = 6 omega2 = 6.7148e-07 - - ik_interpolate = 36 is = 1 omega2 = 1.6429e-07 - ik_interpolate = 36 is = 2 omega2 = 1.8432e-07 + ik_interpolate = 34 is = 4 omega2 = 7.2268e-07 + ik_interpolate = 34 is = 5 omega2 = 7.9804e-07 + ik_interpolate = 34 is = 6 omega2 = 9.3930e-07 + + ik_interpolate = 35 is = 1 omega2 = 5.8959e-08 + ik_interpolate = 35 is = 2 omega2 = 5.8959e-08 + ik_interpolate = 35 is = 3 omega2 = 1.0621e-07 + ik_interpolate = 35 is = 4 omega2 = 5.8081e-07 + ik_interpolate = 35 is = 5 omega2 = 5.8081e-07 + ik_interpolate = 35 is = 6 omega2 = 6.7167e-07 + + ik_interpolate = 36 is = 1 omega2 = 1.6432e-07 + ik_interpolate = 36 is = 2 omega2 = 1.8435e-07 ik_interpolate = 36 is = 3 omega2 = 2.8703e-07 - ik_interpolate = 36 is = 4 omega2 = 7.2253e-07 - ik_interpolate = 36 is = 5 omega2 = 7.9789e-07 - ik_interpolate = 36 is = 6 omega2 = 9.3916e-07 + ik_interpolate = 36 is = 4 omega2 = 7.2268e-07 + ik_interpolate = 36 is = 5 omega2 = 7.9804e-07 + ik_interpolate = 36 is = 6 omega2 = 9.3930e-07 - ik_interpolate = 37 is = 1 omega2 = 1.6429e-07 - ik_interpolate = 37 is = 2 omega2 = 1.8432e-07 + ik_interpolate = 37 is = 1 omega2 = 1.6432e-07 + ik_interpolate = 37 is = 2 omega2 = 1.8435e-07 ik_interpolate = 37 is = 3 omega2 = 2.8703e-07 - ik_interpolate = 37 is = 4 omega2 = 7.2253e-07 - ik_interpolate = 37 is = 5 omega2 = 7.9789e-07 - ik_interpolate = 37 is = 6 omega2 = 9.3916e-07 - - ik_interpolate = 38 is = 1 omega2 = 8.2176e-08 - ik_interpolate = 38 is = 2 omega2 = 2.8865e-07 - ik_interpolate = 38 is = 3 omega2 = 5.6454e-07 - ik_interpolate = 38 is = 4 omega2 = 6.1323e-07 - ik_interpolate = 38 is = 5 omega2 = 7.7289e-07 - ik_interpolate = 38 is = 6 omega2 = 9.1763e-07 - - ik_interpolate = 39 is = 1 omega2 = 1.6429e-07 - ik_interpolate = 39 is = 2 omega2 = 1.8432e-07 + ik_interpolate = 37 is = 4 omega2 = 7.2268e-07 + ik_interpolate = 37 is = 5 omega2 = 7.9804e-07 + ik_interpolate = 37 is = 6 omega2 = 9.3930e-07 + + ik_interpolate = 38 is = 1 omega2 = 8.2177e-08 + ik_interpolate = 38 is = 2 omega2 = 2.8872e-07 + ik_interpolate = 38 is = 3 omega2 = 5.6459e-07 + ik_interpolate = 38 is = 4 omega2 = 6.1343e-07 + ik_interpolate = 38 is = 5 omega2 = 7.7296e-07 + ik_interpolate = 38 is = 6 omega2 = 9.1770e-07 + + ik_interpolate = 39 is = 1 omega2 = 1.6432e-07 + ik_interpolate = 39 is = 2 omega2 = 1.8435e-07 ik_interpolate = 39 is = 3 omega2 = 2.8703e-07 - ik_interpolate = 39 is = 4 omega2 = 7.2253e-07 - ik_interpolate = 39 is = 5 omega2 = 7.9789e-07 - ik_interpolate = 39 is = 6 omega2 = 9.3916e-07 - - ik_interpolate = 40 is = 1 omega2 = 9.8451e-08 - ik_interpolate = 40 is = 2 omega2 = 9.8451e-08 - ik_interpolate = 40 is = 3 omega2 = 3.9914e-07 - ik_interpolate = 40 is = 4 omega2 = 6.4553e-07 - ik_interpolate = 40 is = 5 omega2 = 6.4553e-07 - ik_interpolate = 40 is = 6 omega2 = 8.3425e-07 - - ik_interpolate = 41 is = 1 omega2 = 5.8949e-08 - ik_interpolate = 41 is = 2 omega2 = 5.8949e-08 - ik_interpolate = 41 is = 3 omega2 = 1.0620e-07 - ik_interpolate = 41 is = 4 omega2 = 5.8061e-07 - ik_interpolate = 41 is = 5 omega2 = 5.8061e-07 - ik_interpolate = 41 is = 6 omega2 = 6.7148e-07 - - ik_interpolate = 42 is = 1 omega2 = 1.6429e-07 - ik_interpolate = 42 is = 2 omega2 = 1.8432e-07 + ik_interpolate = 39 is = 4 omega2 = 7.2268e-07 + ik_interpolate = 39 is = 5 omega2 = 7.9804e-07 + ik_interpolate = 39 is = 6 omega2 = 9.3930e-07 + + ik_interpolate = 40 is = 1 omega2 = 9.8458e-08 + ik_interpolate = 40 is = 2 omega2 = 9.8458e-08 + ik_interpolate = 40 is = 3 omega2 = 3.9920e-07 + ik_interpolate = 40 is = 4 omega2 = 6.4572e-07 + ik_interpolate = 40 is = 5 omega2 = 6.4572e-07 + ik_interpolate = 40 is = 6 omega2 = 8.3433e-07 + + ik_interpolate = 41 is = 1 omega2 = 5.8959e-08 + ik_interpolate = 41 is = 2 omega2 = 5.8959e-08 + ik_interpolate = 41 is = 3 omega2 = 1.0621e-07 + ik_interpolate = 41 is = 4 omega2 = 5.8081e-07 + ik_interpolate = 41 is = 5 omega2 = 5.8081e-07 + ik_interpolate = 41 is = 6 omega2 = 6.7167e-07 + + ik_interpolate = 42 is = 1 omega2 = 1.6432e-07 + ik_interpolate = 42 is = 2 omega2 = 1.8435e-07 ik_interpolate = 42 is = 3 omega2 = 2.8703e-07 - ik_interpolate = 42 is = 4 omega2 = 7.2253e-07 - ik_interpolate = 42 is = 5 omega2 = 7.9789e-07 - ik_interpolate = 42 is = 6 omega2 = 9.3916e-07 - - ik_interpolate = 43 is = 1 omega2 = 3.1177e-07 - ik_interpolate = 43 is = 2 omega2 = 3.1177e-07 - ik_interpolate = 43 is = 3 omega2 = 6.9607e-07 - ik_interpolate = 43 is = 4 omega2 = 8.1130e-07 - ik_interpolate = 43 is = 5 omega2 = 8.1130e-07 - ik_interpolate = 43 is = 6 omega2 = 9.6910e-07 - - ik_interpolate = 44 is = 1 omega2 = 1.6429e-07 - ik_interpolate = 44 is = 2 omega2 = 1.8432e-07 + ik_interpolate = 42 is = 4 omega2 = 7.2268e-07 + ik_interpolate = 42 is = 5 omega2 = 7.9804e-07 + ik_interpolate = 42 is = 6 omega2 = 9.3930e-07 + + ik_interpolate = 43 is = 1 omega2 = 3.1183e-07 + ik_interpolate = 43 is = 2 omega2 = 3.1183e-07 + ik_interpolate = 43 is = 3 omega2 = 6.9611e-07 + ik_interpolate = 43 is = 4 omega2 = 8.1136e-07 + ik_interpolate = 43 is = 5 omega2 = 8.1136e-07 + ik_interpolate = 43 is = 6 omega2 = 9.6917e-07 + + ik_interpolate = 44 is = 1 omega2 = 1.6432e-07 + ik_interpolate = 44 is = 2 omega2 = 1.8435e-07 ik_interpolate = 44 is = 3 omega2 = 2.8703e-07 - ik_interpolate = 44 is = 4 omega2 = 7.2253e-07 - ik_interpolate = 44 is = 5 omega2 = 7.9789e-07 - ik_interpolate = 44 is = 6 omega2 = 9.3916e-07 + ik_interpolate = 44 is = 4 omega2 = 7.2268e-07 + ik_interpolate = 44 is = 5 omega2 = 7.9804e-07 + ik_interpolate = 44 is = 6 omega2 = 9.3930e-07 - ik_interpolate = 45 is = 1 omega2 = 1.6429e-07 - ik_interpolate = 45 is = 2 omega2 = 1.8432e-07 + ik_interpolate = 45 is = 1 omega2 = 1.6432e-07 + ik_interpolate = 45 is = 2 omega2 = 1.8435e-07 ik_interpolate = 45 is = 3 omega2 = 2.8703e-07 - ik_interpolate = 45 is = 4 omega2 = 7.2253e-07 - ik_interpolate = 45 is = 5 omega2 = 7.9789e-07 - ik_interpolate = 45 is = 6 omega2 = 9.3916e-07 - - ik_interpolate = 46 is = 1 omega2 = 9.8451e-08 - ik_interpolate = 46 is = 2 omega2 = 9.8451e-08 - ik_interpolate = 46 is = 3 omega2 = 3.9914e-07 - ik_interpolate = 46 is = 4 omega2 = 6.4553e-07 - ik_interpolate = 46 is = 5 omega2 = 6.4553e-07 - ik_interpolate = 46 is = 6 omega2 = 8.3425e-07 - - ik_interpolate = 47 is = 1 omega2 = 1.6429e-07 - ik_interpolate = 47 is = 2 omega2 = 1.8432e-07 + ik_interpolate = 45 is = 4 omega2 = 7.2268e-07 + ik_interpolate = 45 is = 5 omega2 = 7.9804e-07 + ik_interpolate = 45 is = 6 omega2 = 9.3930e-07 + + ik_interpolate = 46 is = 1 omega2 = 9.8458e-08 + ik_interpolate = 46 is = 2 omega2 = 9.8458e-08 + ik_interpolate = 46 is = 3 omega2 = 3.9920e-07 + ik_interpolate = 46 is = 4 omega2 = 6.4572e-07 + ik_interpolate = 46 is = 5 omega2 = 6.4572e-07 + ik_interpolate = 46 is = 6 omega2 = 8.3433e-07 + + ik_interpolate = 47 is = 1 omega2 = 1.6432e-07 + ik_interpolate = 47 is = 2 omega2 = 1.8435e-07 ik_interpolate = 47 is = 3 omega2 = 2.8703e-07 - ik_interpolate = 47 is = 4 omega2 = 7.2253e-07 - ik_interpolate = 47 is = 5 omega2 = 7.9789e-07 - ik_interpolate = 47 is = 6 omega2 = 9.3916e-07 - - ik_interpolate = 48 is = 1 omega2 = 8.2176e-08 - ik_interpolate = 48 is = 2 omega2 = 2.8865e-07 - ik_interpolate = 48 is = 3 omega2 = 5.6454e-07 - ik_interpolate = 48 is = 4 omega2 = 6.1323e-07 - ik_interpolate = 48 is = 5 omega2 = 7.7289e-07 - ik_interpolate = 48 is = 6 omega2 = 9.1763e-07 - - ik_interpolate = 49 is = 1 omega2 = 1.4296e-07 - ik_interpolate = 49 is = 2 omega2 = 1.4296e-07 - ik_interpolate = 49 is = 3 omega2 = 2.6661e-07 - ik_interpolate = 49 is = 4 omega2 = 7.5892e-07 - ik_interpolate = 49 is = 5 omega2 = 7.5892e-07 - ik_interpolate = 49 is = 6 omega2 = 1.2567e-06 - - ik_interpolate = 50 is = 1 omega2 = 8.2176e-08 - ik_interpolate = 50 is = 2 omega2 = 2.8865e-07 - ik_interpolate = 50 is = 3 omega2 = 5.6454e-07 - ik_interpolate = 50 is = 4 omega2 = 6.1323e-07 - ik_interpolate = 50 is = 5 omega2 = 7.7289e-07 - ik_interpolate = 50 is = 6 omega2 = 9.1763e-07 - - ik_interpolate = 51 is = 1 omega2 = 1.6429e-07 - ik_interpolate = 51 is = 2 omega2 = 1.8432e-07 + ik_interpolate = 47 is = 4 omega2 = 7.2268e-07 + ik_interpolate = 47 is = 5 omega2 = 7.9804e-07 + ik_interpolate = 47 is = 6 omega2 = 9.3930e-07 + + ik_interpolate = 48 is = 1 omega2 = 8.2177e-08 + ik_interpolate = 48 is = 2 omega2 = 2.8872e-07 + ik_interpolate = 48 is = 3 omega2 = 5.6459e-07 + ik_interpolate = 48 is = 4 omega2 = 6.1343e-07 + ik_interpolate = 48 is = 5 omega2 = 7.7296e-07 + ik_interpolate = 48 is = 6 omega2 = 9.1770e-07 + + ik_interpolate = 49 is = 1 omega2 = 1.4299e-07 + ik_interpolate = 49 is = 2 omega2 = 1.4299e-07 + ik_interpolate = 49 is = 3 omega2 = 2.6662e-07 + ik_interpolate = 49 is = 4 omega2 = 7.5906e-07 + ik_interpolate = 49 is = 5 omega2 = 7.5906e-07 + ik_interpolate = 49 is = 6 omega2 = 1.2569e-06 + + ik_interpolate = 50 is = 1 omega2 = 8.2177e-08 + ik_interpolate = 50 is = 2 omega2 = 2.8872e-07 + ik_interpolate = 50 is = 3 omega2 = 5.6459e-07 + ik_interpolate = 50 is = 4 omega2 = 6.1343e-07 + ik_interpolate = 50 is = 5 omega2 = 7.7296e-07 + ik_interpolate = 50 is = 6 omega2 = 9.1770e-07 + + ik_interpolate = 51 is = 1 omega2 = 1.6432e-07 + ik_interpolate = 51 is = 2 omega2 = 1.8435e-07 ik_interpolate = 51 is = 3 omega2 = 2.8703e-07 - ik_interpolate = 51 is = 4 omega2 = 7.2253e-07 - ik_interpolate = 51 is = 5 omega2 = 7.9789e-07 - ik_interpolate = 51 is = 6 omega2 = 9.3916e-07 - - ik_interpolate = 52 is = 1 omega2 = 4.3326e-08 - ik_interpolate = 52 is = 2 omega2 = 4.3326e-08 - ik_interpolate = 52 is = 3 omega2 = 4.5870e-07 - ik_interpolate = 52 is = 4 omega2 = 5.2383e-07 - ik_interpolate = 52 is = 5 omega2 = 5.2383e-07 - ik_interpolate = 52 is = 6 omega2 = 8.6099e-07 - - ik_interpolate = 53 is = 1 omega2 = 8.2176e-08 - ik_interpolate = 53 is = 2 omega2 = 2.8865e-07 - ik_interpolate = 53 is = 3 omega2 = 5.6454e-07 - ik_interpolate = 53 is = 4 omega2 = 6.1323e-07 - ik_interpolate = 53 is = 5 omega2 = 7.7289e-07 - ik_interpolate = 53 is = 6 omega2 = 9.1763e-07 - - ik_interpolate = 54 is = 1 omega2 = 1.6429e-07 - ik_interpolate = 54 is = 2 omega2 = 1.8432e-07 + ik_interpolate = 51 is = 4 omega2 = 7.2268e-07 + ik_interpolate = 51 is = 5 omega2 = 7.9804e-07 + ik_interpolate = 51 is = 6 omega2 = 9.3930e-07 + + ik_interpolate = 52 is = 1 omega2 = 4.3328e-08 + ik_interpolate = 52 is = 2 omega2 = 4.3328e-08 + ik_interpolate = 52 is = 3 omega2 = 4.5877e-07 + ik_interpolate = 52 is = 4 omega2 = 5.2404e-07 + ik_interpolate = 52 is = 5 omega2 = 5.2404e-07 + ik_interpolate = 52 is = 6 omega2 = 8.6106e-07 + + ik_interpolate = 53 is = 1 omega2 = 8.2177e-08 + ik_interpolate = 53 is = 2 omega2 = 2.8872e-07 + ik_interpolate = 53 is = 3 omega2 = 5.6459e-07 + ik_interpolate = 53 is = 4 omega2 = 6.1343e-07 + ik_interpolate = 53 is = 5 omega2 = 7.7296e-07 + ik_interpolate = 53 is = 6 omega2 = 9.1770e-07 + + ik_interpolate = 54 is = 1 omega2 = 1.6432e-07 + ik_interpolate = 54 is = 2 omega2 = 1.8435e-07 ik_interpolate = 54 is = 3 omega2 = 2.8703e-07 - ik_interpolate = 54 is = 4 omega2 = 7.2253e-07 - ik_interpolate = 54 is = 5 omega2 = 7.9789e-07 - ik_interpolate = 54 is = 6 omega2 = 9.3916e-07 - - ik_interpolate = 55 is = 1 omega2 = 9.8451e-08 - ik_interpolate = 55 is = 2 omega2 = 9.8451e-08 - ik_interpolate = 55 is = 3 omega2 = 3.9914e-07 - ik_interpolate = 55 is = 4 omega2 = 6.4553e-07 - ik_interpolate = 55 is = 5 omega2 = 6.4553e-07 - ik_interpolate = 55 is = 6 omega2 = 8.3425e-07 - - ik_interpolate = 56 is = 1 omega2 = 1.6429e-07 - ik_interpolate = 56 is = 2 omega2 = 1.8432e-07 + ik_interpolate = 54 is = 4 omega2 = 7.2268e-07 + ik_interpolate = 54 is = 5 omega2 = 7.9804e-07 + ik_interpolate = 54 is = 6 omega2 = 9.3930e-07 + + ik_interpolate = 55 is = 1 omega2 = 9.8458e-08 + ik_interpolate = 55 is = 2 omega2 = 9.8458e-08 + ik_interpolate = 55 is = 3 omega2 = 3.9920e-07 + ik_interpolate = 55 is = 4 omega2 = 6.4572e-07 + ik_interpolate = 55 is = 5 omega2 = 6.4572e-07 + ik_interpolate = 55 is = 6 omega2 = 8.3433e-07 + + ik_interpolate = 56 is = 1 omega2 = 1.6432e-07 + ik_interpolate = 56 is = 2 omega2 = 1.8435e-07 ik_interpolate = 56 is = 3 omega2 = 2.8703e-07 - ik_interpolate = 56 is = 4 omega2 = 7.2253e-07 - ik_interpolate = 56 is = 5 omega2 = 7.9789e-07 - ik_interpolate = 56 is = 6 omega2 = 9.3916e-07 + ik_interpolate = 56 is = 4 omega2 = 7.2268e-07 + ik_interpolate = 56 is = 5 omega2 = 7.9804e-07 + ik_interpolate = 56 is = 6 omega2 = 9.3930e-07 - ik_interpolate = 57 is = 1 omega2 = 1.6429e-07 - ik_interpolate = 57 is = 2 omega2 = 1.8432e-07 + ik_interpolate = 57 is = 1 omega2 = 1.6432e-07 + ik_interpolate = 57 is = 2 omega2 = 1.8435e-07 ik_interpolate = 57 is = 3 omega2 = 2.8703e-07 - ik_interpolate = 57 is = 4 omega2 = 7.2253e-07 - ik_interpolate = 57 is = 5 omega2 = 7.9789e-07 - ik_interpolate = 57 is = 6 omega2 = 9.3916e-07 - - ik_interpolate = 58 is = 1 omega2 = 9.8451e-08 - ik_interpolate = 58 is = 2 omega2 = 9.8451e-08 - ik_interpolate = 58 is = 3 omega2 = 3.9914e-07 - ik_interpolate = 58 is = 4 omega2 = 6.4553e-07 - ik_interpolate = 58 is = 5 omega2 = 6.4553e-07 - ik_interpolate = 58 is = 6 omega2 = 8.3425e-07 - - ik_interpolate = 59 is = 1 omega2 = 1.6429e-07 - ik_interpolate = 59 is = 2 omega2 = 1.8432e-07 + ik_interpolate = 57 is = 4 omega2 = 7.2268e-07 + ik_interpolate = 57 is = 5 omega2 = 7.9804e-07 + ik_interpolate = 57 is = 6 omega2 = 9.3930e-07 + + ik_interpolate = 58 is = 1 omega2 = 9.8458e-08 + ik_interpolate = 58 is = 2 omega2 = 9.8458e-08 + ik_interpolate = 58 is = 3 omega2 = 3.9920e-07 + ik_interpolate = 58 is = 4 omega2 = 6.4572e-07 + ik_interpolate = 58 is = 5 omega2 = 6.4572e-07 + ik_interpolate = 58 is = 6 omega2 = 8.3433e-07 + + ik_interpolate = 59 is = 1 omega2 = 1.6432e-07 + ik_interpolate = 59 is = 2 omega2 = 1.8435e-07 ik_interpolate = 59 is = 3 omega2 = 2.8703e-07 - ik_interpolate = 59 is = 4 omega2 = 7.2253e-07 - ik_interpolate = 59 is = 5 omega2 = 7.9789e-07 - ik_interpolate = 59 is = 6 omega2 = 9.3916e-07 - - ik_interpolate = 60 is = 1 omega2 = 8.2176e-08 - ik_interpolate = 60 is = 2 omega2 = 2.8865e-07 - ik_interpolate = 60 is = 3 omega2 = 5.6454e-07 - ik_interpolate = 60 is = 4 omega2 = 6.1323e-07 - ik_interpolate = 60 is = 5 omega2 = 7.7289e-07 - ik_interpolate = 60 is = 6 omega2 = 9.1763e-07 - - ik_interpolate = 61 is = 1 omega2 = 4.3326e-08 - ik_interpolate = 61 is = 2 omega2 = 4.3326e-08 - ik_interpolate = 61 is = 3 omega2 = 4.5870e-07 - ik_interpolate = 61 is = 4 omega2 = 5.2383e-07 - ik_interpolate = 61 is = 5 omega2 = 5.2383e-07 - ik_interpolate = 61 is = 6 omega2 = 8.6099e-07 - - ik_interpolate = 62 is = 1 omega2 = 1.6429e-07 - ik_interpolate = 62 is = 2 omega2 = 1.8432e-07 + ik_interpolate = 59 is = 4 omega2 = 7.2268e-07 + ik_interpolate = 59 is = 5 omega2 = 7.9804e-07 + ik_interpolate = 59 is = 6 omega2 = 9.3930e-07 + + ik_interpolate = 60 is = 1 omega2 = 8.2177e-08 + ik_interpolate = 60 is = 2 omega2 = 2.8872e-07 + ik_interpolate = 60 is = 3 omega2 = 5.6459e-07 + ik_interpolate = 60 is = 4 omega2 = 6.1343e-07 + ik_interpolate = 60 is = 5 omega2 = 7.7296e-07 + ik_interpolate = 60 is = 6 omega2 = 9.1770e-07 + + ik_interpolate = 61 is = 1 omega2 = 4.3328e-08 + ik_interpolate = 61 is = 2 omega2 = 4.3328e-08 + ik_interpolate = 61 is = 3 omega2 = 4.5877e-07 + ik_interpolate = 61 is = 4 omega2 = 5.2404e-07 + ik_interpolate = 61 is = 5 omega2 = 5.2404e-07 + ik_interpolate = 61 is = 6 omega2 = 8.6106e-07 + + ik_interpolate = 62 is = 1 omega2 = 1.6432e-07 + ik_interpolate = 62 is = 2 omega2 = 1.8435e-07 ik_interpolate = 62 is = 3 omega2 = 2.8703e-07 - ik_interpolate = 62 is = 4 omega2 = 7.2253e-07 - ik_interpolate = 62 is = 5 omega2 = 7.9789e-07 - ik_interpolate = 62 is = 6 omega2 = 9.3916e-07 - - ik_interpolate = 63 is = 1 omega2 = 8.2176e-08 - ik_interpolate = 63 is = 2 omega2 = 2.8865e-07 - ik_interpolate = 63 is = 3 omega2 = 5.6454e-07 - ik_interpolate = 63 is = 4 omega2 = 6.1323e-07 - ik_interpolate = 63 is = 5 omega2 = 7.7289e-07 - ik_interpolate = 63 is = 6 omega2 = 9.1763e-07 - - ik_interpolate = 64 is = 1 omega2 = 1.4296e-07 - ik_interpolate = 64 is = 2 omega2 = 1.4296e-07 - ik_interpolate = 64 is = 3 omega2 = 2.6661e-07 - ik_interpolate = 64 is = 4 omega2 = 7.5892e-07 - ik_interpolate = 64 is = 5 omega2 = 7.5892e-07 - ik_interpolate = 64 is = 6 omega2 = 1.2567e-06 + ik_interpolate = 62 is = 4 omega2 = 7.2268e-07 + ik_interpolate = 62 is = 5 omega2 = 7.9804e-07 + ik_interpolate = 62 is = 6 omega2 = 9.3930e-07 + + ik_interpolate = 63 is = 1 omega2 = 8.2177e-08 + ik_interpolate = 63 is = 2 omega2 = 2.8872e-07 + ik_interpolate = 63 is = 3 omega2 = 5.6459e-07 + ik_interpolate = 63 is = 4 omega2 = 6.1343e-07 + ik_interpolate = 63 is = 5 omega2 = 7.7296e-07 + ik_interpolate = 63 is = 6 omega2 = 9.1770e-07 + + ik_interpolate = 64 is = 1 omega2 = 1.4299e-07 + ik_interpolate = 64 is = 2 omega2 = 1.4299e-07 + ik_interpolate = 64 is = 3 omega2 = 2.6662e-07 + ik_interpolate = 64 is = 4 omega2 = 7.5906e-07 + ik_interpolate = 64 is = 5 omega2 = 7.5906e-07 + ik_interpolate = 64 is = 6 omega2 = 1.2569e-06 Temperature = 5.0000e+02 K SCPH ITER 1 : DIFF = N/A - SCPH ITER 2 : DIFF = 1.1043e-07 - SCPH ITER 3 : DIFF = 9.7757e-08 - SCPH ITER 4 : DIFF = 8.6545e-08 - SCPH ITER 5 : DIFF = 7.6621e-08 - SCPH ITER 6 : DIFF = 6.7838e-08 - SCPH ITER 7 : DIFF = 6.0063e-08 - SCPH ITER 8 : DIFF = 5.3180e-08 - SCPH ITER 9 : DIFF = 4.7087e-08 - SCPH ITER 10 : DIFF = 4.1693e-08 - SCPH ITER 11 : DIFF = 3.6918e-08 - SCPH ITER 12 : DIFF = 3.2690e-08 - SCPH ITER 13 : DIFF = 2.8946e-08 - SCPH ITER 14 : DIFF = 2.5632e-08 - SCPH ITER 15 : DIFF = 2.2697e-08 - SCPH ITER 16 : DIFF = 2.0099e-08 - SCPH ITER 17 : DIFF = 1.7798e-08 - SCPH ITER 18 : DIFF = 1.5760e-08 - SCPH ITER 19 : DIFF = 1.3956e-08 - SCPH ITER 20 : DIFF = 1.2359e-08 - SCPH ITER 21 : DIFF = 1.0944e-08 - SCPH ITER 22 : DIFF = 9.6915e-09 + SCPH ITER 2 : DIFF = 1.1149e-07 + SCPH ITER 3 : DIFF = 9.8696e-08 + SCPH ITER 4 : DIFF = 8.7376e-08 + SCPH ITER 5 : DIFF = 7.7357e-08 + SCPH ITER 6 : DIFF = 6.8489e-08 + SCPH ITER 7 : DIFF = 6.0639e-08 + SCPH ITER 8 : DIFF = 5.3690e-08 + SCPH ITER 9 : DIFF = 4.7539e-08 + SCPH ITER 10 : DIFF = 4.2093e-08 + SCPH ITER 11 : DIFF = 3.7272e-08 + SCPH ITER 12 : DIFF = 3.3003e-08 + SCPH ITER 13 : DIFF = 2.9224e-08 + SCPH ITER 14 : DIFF = 2.5878e-08 + SCPH ITER 15 : DIFF = 2.2915e-08 + SCPH ITER 16 : DIFF = 2.0291e-08 + SCPH ITER 17 : DIFF = 1.7968e-08 + SCPH ITER 18 : DIFF = 1.5911e-08 + SCPH ITER 19 : DIFF = 1.4090e-08 + SCPH ITER 20 : DIFF = 1.2477e-08 + SCPH ITER 21 : DIFF = 1.1049e-08 + SCPH ITER 22 : DIFF = 9.7845e-09 + SCPH ITER 23 : DIFF = 8.6646e-09 + SCPH ITER 24 : DIFF = 7.6729e-09 + SCPH ITER 25 : DIFF = 6.7947e-09 + SCPH ITER 26 : DIFF = 6.0171e-09 + SCPH ITER 27 : DIFF = 5.3285e-09 + SCPH ITER 28 : DIFF = 4.7187e-09 + SCPH ITER 29 : DIFF = 4.1786e-09 + SCPH ITER 30 : DIFF = 3.7004e-09 + SCPH ITER 31 : DIFF = 3.2769e-09 + SCPH ITER 32 : DIFF = 2.9019e-09 + SCPH ITER 33 : DIFF = 2.5698e-09 + SCPH ITER 34 : DIFF = 2.2757e-09 + SCPH ITER 35 : DIFF = 2.0153e-09 + SCPH ITER 36 : DIFF = 1.7847e-09 + SCPH ITER 37 : DIFF = 1.5804e-09 + SCPH ITER 38 : DIFF = 1.3996e-09 + SCPH ITER 39 : DIFF = 1.2394e-09 + SCPH ITER 40 : DIFF = 1.0975e-09 + SCPH ITER 41 : DIFF = 9.7195e-10 + SCPH ITER 42 : DIFF = 8.6071e-10 + SCPH ITER 43 : DIFF = 7.6221e-10 + SCPH ITER 44 : DIFF = 6.7498e-10 + SCPH ITER 45 : DIFF = 5.9774e-10 + SCPH ITER 46 : DIFF = 5.2933e-10 + SCPH ITER 47 : DIFF = 4.6875e-10 + SCPH ITER 48 : DIFF = 4.1511e-10 + SCPH ITER 49 : DIFF = 3.6761e-10 + SCPH ITER 50 : DIFF = 3.2553e-10 + SCPH ITER 51 : DIFF = 2.8827e-10 + SCPH ITER 52 : DIFF = 2.5528e-10 + SCPH ITER 53 : DIFF = 2.2606e-10 + SCPH ITER 54 : DIFF = 2.0020e-10 + SCPH ITER 55 : DIFF = 1.7728e-10 + SCPH ITER 56 : DIFF = 1.5699e-10 + SCPH ITER 57 : DIFF = 1.3903e-10 + SCPH ITER 58 : DIFF = 1.2312e-10 + SCPH ITER 59 : DIFF = 1.0904e-10 + SCPH ITER 60 : DIFF = 9.6547e-11 DIFF < SCPH_TOL : break SCPH loop - Temp = 5.0000e+02 : convergence achieved in 22 iterations. + Temp = 5.0000e+02 : convergence achieved in 60 iterations. New eigenvalues - ik_interpolate = 1 is = 1 omega2 = 0.0000e+00 - ik_interpolate = 1 is = 2 omega2 = 0.0000e+00 - ik_interpolate = 1 is = 3 omega2 = 0.0000e+00 - ik_interpolate = 1 is = 4 omega2 = 2.9369e-07 - ik_interpolate = 1 is = 5 omega2 = 2.9369e-07 - ik_interpolate = 1 is = 6 omega2 = 2.9369e-07 - - ik_interpolate = 2 is = 1 omega2 = 1.4042e-07 - ik_interpolate = 2 is = 2 omega2 = 1.4042e-07 - ik_interpolate = 2 is = 3 omega2 = 2.6578e-07 - ik_interpolate = 2 is = 4 omega2 = 7.4409e-07 - ik_interpolate = 2 is = 5 omega2 = 7.4409e-07 - ik_interpolate = 2 is = 6 omega2 = 1.2417e-06 - - ik_interpolate = 3 is = 1 omega2 = 3.0597e-07 - ik_interpolate = 3 is = 2 omega2 = 3.0597e-07 - ik_interpolate = 3 is = 3 omega2 = 6.9433e-07 - ik_interpolate = 3 is = 4 omega2 = 8.0676e-07 - ik_interpolate = 3 is = 5 omega2 = 8.0676e-07 - ik_interpolate = 3 is = 6 omega2 = 9.6328e-07 - - ik_interpolate = 4 is = 1 omega2 = 1.4042e-07 - ik_interpolate = 4 is = 2 omega2 = 1.4042e-07 - ik_interpolate = 4 is = 3 omega2 = 2.6578e-07 - ik_interpolate = 4 is = 4 omega2 = 7.4409e-07 - ik_interpolate = 4 is = 5 omega2 = 7.4409e-07 - ik_interpolate = 4 is = 6 omega2 = 1.2417e-06 - - ik_interpolate = 5 is = 1 omega2 = 1.4042e-07 - ik_interpolate = 5 is = 2 omega2 = 1.4042e-07 - ik_interpolate = 5 is = 3 omega2 = 2.6578e-07 - ik_interpolate = 5 is = 4 omega2 = 7.4409e-07 - ik_interpolate = 5 is = 5 omega2 = 7.4409e-07 - ik_interpolate = 5 is = 6 omega2 = 1.2417e-06 - - ik_interpolate = 6 is = 1 omega2 = 4.3087e-08 - ik_interpolate = 6 is = 2 omega2 = 4.3087e-08 - ik_interpolate = 6 is = 3 omega2 = 4.5202e-07 - ik_interpolate = 6 is = 4 omega2 = 5.0195e-07 - ik_interpolate = 6 is = 5 omega2 = 5.0195e-07 - ik_interpolate = 6 is = 6 omega2 = 8.5639e-07 - - ik_interpolate = 7 is = 1 omega2 = 1.6182e-07 - ik_interpolate = 7 is = 2 omega2 = 1.8116e-07 - ik_interpolate = 7 is = 3 omega2 = 2.8808e-07 - ik_interpolate = 7 is = 4 omega2 = 7.0827e-07 - ik_interpolate = 7 is = 5 omega2 = 7.8328e-07 - ik_interpolate = 7 is = 6 omega2 = 9.2454e-07 + ik_interpolate = 1 is = 1 omega2 = 5.2940e-22 + ik_interpolate = 1 is = 2 omega2 = 6.4587e-22 + ik_interpolate = 1 is = 3 omega2 = 7.0409e-22 + ik_interpolate = 1 is = 4 omega2 = 2.9393e-07 + ik_interpolate = 1 is = 5 omega2 = 2.9393e-07 + ik_interpolate = 1 is = 6 omega2 = 2.9393e-07 + + ik_interpolate = 2 is = 1 omega2 = 1.4046e-07 + ik_interpolate = 2 is = 2 omega2 = 1.4046e-07 + ik_interpolate = 2 is = 3 omega2 = 2.6579e-07 + ik_interpolate = 2 is = 4 omega2 = 7.4425e-07 + ik_interpolate = 2 is = 5 omega2 = 7.4425e-07 + ik_interpolate = 2 is = 6 omega2 = 1.2418e-06 + + ik_interpolate = 3 is = 1 omega2 = 3.0603e-07 + ik_interpolate = 3 is = 2 omega2 = 3.0603e-07 + ik_interpolate = 3 is = 3 omega2 = 6.9438e-07 + ik_interpolate = 3 is = 4 omega2 = 8.0684e-07 + ik_interpolate = 3 is = 5 omega2 = 8.0684e-07 + ik_interpolate = 3 is = 6 omega2 = 9.6336e-07 + + ik_interpolate = 4 is = 1 omega2 = 1.4046e-07 + ik_interpolate = 4 is = 2 omega2 = 1.4046e-07 + ik_interpolate = 4 is = 3 omega2 = 2.6579e-07 + ik_interpolate = 4 is = 4 omega2 = 7.4425e-07 + ik_interpolate = 4 is = 5 omega2 = 7.4425e-07 + ik_interpolate = 4 is = 6 omega2 = 1.2418e-06 + + ik_interpolate = 5 is = 1 omega2 = 1.4046e-07 + ik_interpolate = 5 is = 2 omega2 = 1.4046e-07 + ik_interpolate = 5 is = 3 omega2 = 2.6579e-07 + ik_interpolate = 5 is = 4 omega2 = 7.4425e-07 + ik_interpolate = 5 is = 5 omega2 = 7.4425e-07 + ik_interpolate = 5 is = 6 omega2 = 1.2418e-06 + + ik_interpolate = 6 is = 1 omega2 = 4.3090e-08 + ik_interpolate = 6 is = 2 omega2 = 4.3090e-08 + ik_interpolate = 6 is = 3 omega2 = 4.5210e-07 + ik_interpolate = 6 is = 4 omega2 = 5.0217e-07 + ik_interpolate = 6 is = 5 omega2 = 5.0217e-07 + ik_interpolate = 6 is = 6 omega2 = 8.5647e-07 + + ik_interpolate = 7 is = 1 omega2 = 1.6185e-07 + ik_interpolate = 7 is = 2 omega2 = 1.8119e-07 + ik_interpolate = 7 is = 3 omega2 = 2.8809e-07 + ik_interpolate = 7 is = 4 omega2 = 7.0842e-07 + ik_interpolate = 7 is = 5 omega2 = 7.8343e-07 + ik_interpolate = 7 is = 6 omega2 = 9.2470e-07 ik_interpolate = 8 is = 1 omega2 = 8.2204e-08 - ik_interpolate = 8 is = 2 omega2 = 2.8215e-07 - ik_interpolate = 8 is = 3 omega2 = 5.6046e-07 - ik_interpolate = 8 is = 4 omega2 = 5.9309e-07 - ik_interpolate = 8 is = 5 omega2 = 7.6745e-07 - ik_interpolate = 8 is = 6 omega2 = 9.1189e-07 - - ik_interpolate = 9 is = 1 omega2 = 3.0597e-07 - ik_interpolate = 9 is = 2 omega2 = 3.0597e-07 - ik_interpolate = 9 is = 3 omega2 = 6.9433e-07 - ik_interpolate = 9 is = 4 omega2 = 8.0676e-07 - ik_interpolate = 9 is = 5 omega2 = 8.0676e-07 - ik_interpolate = 9 is = 6 omega2 = 9.6328e-07 - - ik_interpolate = 10 is = 1 omega2 = 1.6182e-07 - ik_interpolate = 10 is = 2 omega2 = 1.8116e-07 - ik_interpolate = 10 is = 3 omega2 = 2.8808e-07 - ik_interpolate = 10 is = 4 omega2 = 7.0827e-07 - ik_interpolate = 10 is = 5 omega2 = 7.8328e-07 - ik_interpolate = 10 is = 6 omega2 = 9.2454e-07 - - ik_interpolate = 11 is = 1 omega2 = 5.7614e-08 - ik_interpolate = 11 is = 2 omega2 = 5.7614e-08 - ik_interpolate = 11 is = 3 omega2 = 1.0369e-07 - ik_interpolate = 11 is = 4 omega2 = 5.5995e-07 - ik_interpolate = 11 is = 5 omega2 = 5.5995e-07 - ik_interpolate = 11 is = 6 omega2 = 6.5133e-07 - - ik_interpolate = 12 is = 1 omega2 = 1.6182e-07 - ik_interpolate = 12 is = 2 omega2 = 1.8116e-07 - ik_interpolate = 12 is = 3 omega2 = 2.8808e-07 - ik_interpolate = 12 is = 4 omega2 = 7.0827e-07 - ik_interpolate = 12 is = 5 omega2 = 7.8328e-07 - ik_interpolate = 12 is = 6 omega2 = 9.2454e-07 - - ik_interpolate = 13 is = 1 omega2 = 1.4042e-07 - ik_interpolate = 13 is = 2 omega2 = 1.4042e-07 - ik_interpolate = 13 is = 3 omega2 = 2.6578e-07 - ik_interpolate = 13 is = 4 omega2 = 7.4409e-07 - ik_interpolate = 13 is = 5 omega2 = 7.4409e-07 - ik_interpolate = 13 is = 6 omega2 = 1.2417e-06 + ik_interpolate = 8 is = 2 omega2 = 2.8223e-07 + ik_interpolate = 8 is = 3 omega2 = 5.6051e-07 + ik_interpolate = 8 is = 4 omega2 = 5.9330e-07 + ik_interpolate = 8 is = 5 omega2 = 7.6752e-07 + ik_interpolate = 8 is = 6 omega2 = 9.1197e-07 + + ik_interpolate = 9 is = 1 omega2 = 3.0603e-07 + ik_interpolate = 9 is = 2 omega2 = 3.0603e-07 + ik_interpolate = 9 is = 3 omega2 = 6.9438e-07 + ik_interpolate = 9 is = 4 omega2 = 8.0684e-07 + ik_interpolate = 9 is = 5 omega2 = 8.0684e-07 + ik_interpolate = 9 is = 6 omega2 = 9.6336e-07 + + ik_interpolate = 10 is = 1 omega2 = 1.6185e-07 + ik_interpolate = 10 is = 2 omega2 = 1.8119e-07 + ik_interpolate = 10 is = 3 omega2 = 2.8809e-07 + ik_interpolate = 10 is = 4 omega2 = 7.0842e-07 + ik_interpolate = 10 is = 5 omega2 = 7.8343e-07 + ik_interpolate = 10 is = 6 omega2 = 9.2470e-07 + + ik_interpolate = 11 is = 1 omega2 = 5.7625e-08 + ik_interpolate = 11 is = 2 omega2 = 5.7625e-08 + ik_interpolate = 11 is = 3 omega2 = 1.0371e-07 + ik_interpolate = 11 is = 4 omega2 = 5.6016e-07 + ik_interpolate = 11 is = 5 omega2 = 5.6016e-07 + ik_interpolate = 11 is = 6 omega2 = 6.5154e-07 + + ik_interpolate = 12 is = 1 omega2 = 1.6185e-07 + ik_interpolate = 12 is = 2 omega2 = 1.8119e-07 + ik_interpolate = 12 is = 3 omega2 = 2.8809e-07 + ik_interpolate = 12 is = 4 omega2 = 7.0842e-07 + ik_interpolate = 12 is = 5 omega2 = 7.8343e-07 + ik_interpolate = 12 is = 6 omega2 = 9.2470e-07 + + ik_interpolate = 13 is = 1 omega2 = 1.4046e-07 + ik_interpolate = 13 is = 2 omega2 = 1.4046e-07 + ik_interpolate = 13 is = 3 omega2 = 2.6579e-07 + ik_interpolate = 13 is = 4 omega2 = 7.4425e-07 + ik_interpolate = 13 is = 5 omega2 = 7.4425e-07 + ik_interpolate = 13 is = 6 omega2 = 1.2418e-06 ik_interpolate = 14 is = 1 omega2 = 8.2204e-08 - ik_interpolate = 14 is = 2 omega2 = 2.8215e-07 - ik_interpolate = 14 is = 3 omega2 = 5.6046e-07 - ik_interpolate = 14 is = 4 omega2 = 5.9309e-07 - ik_interpolate = 14 is = 5 omega2 = 7.6745e-07 - ik_interpolate = 14 is = 6 omega2 = 9.1189e-07 - - ik_interpolate = 15 is = 1 omega2 = 1.6182e-07 - ik_interpolate = 15 is = 2 omega2 = 1.8116e-07 - ik_interpolate = 15 is = 3 omega2 = 2.8808e-07 - ik_interpolate = 15 is = 4 omega2 = 7.0827e-07 - ik_interpolate = 15 is = 5 omega2 = 7.8328e-07 - ik_interpolate = 15 is = 6 omega2 = 9.2454e-07 - - ik_interpolate = 16 is = 1 omega2 = 4.3087e-08 - ik_interpolate = 16 is = 2 omega2 = 4.3087e-08 - ik_interpolate = 16 is = 3 omega2 = 4.5202e-07 - ik_interpolate = 16 is = 4 omega2 = 5.0195e-07 - ik_interpolate = 16 is = 5 omega2 = 5.0195e-07 - ik_interpolate = 16 is = 6 omega2 = 8.5639e-07 - - ik_interpolate = 17 is = 1 omega2 = 1.4042e-07 - ik_interpolate = 17 is = 2 omega2 = 1.4042e-07 - ik_interpolate = 17 is = 3 omega2 = 2.6578e-07 - ik_interpolate = 17 is = 4 omega2 = 7.4409e-07 - ik_interpolate = 17 is = 5 omega2 = 7.4409e-07 - ik_interpolate = 17 is = 6 omega2 = 1.2417e-06 - - ik_interpolate = 18 is = 1 omega2 = 4.3087e-08 - ik_interpolate = 18 is = 2 omega2 = 4.3087e-08 - ik_interpolate = 18 is = 3 omega2 = 4.5202e-07 - ik_interpolate = 18 is = 4 omega2 = 5.0195e-07 - ik_interpolate = 18 is = 5 omega2 = 5.0195e-07 - ik_interpolate = 18 is = 6 omega2 = 8.5639e-07 - - ik_interpolate = 19 is = 1 omega2 = 1.6182e-07 - ik_interpolate = 19 is = 2 omega2 = 1.8116e-07 - ik_interpolate = 19 is = 3 omega2 = 2.8808e-07 - ik_interpolate = 19 is = 4 omega2 = 7.0827e-07 - ik_interpolate = 19 is = 5 omega2 = 7.8328e-07 - ik_interpolate = 19 is = 6 omega2 = 9.2454e-07 + ik_interpolate = 14 is = 2 omega2 = 2.8223e-07 + ik_interpolate = 14 is = 3 omega2 = 5.6051e-07 + ik_interpolate = 14 is = 4 omega2 = 5.9330e-07 + ik_interpolate = 14 is = 5 omega2 = 7.6752e-07 + ik_interpolate = 14 is = 6 omega2 = 9.1197e-07 + + ik_interpolate = 15 is = 1 omega2 = 1.6185e-07 + ik_interpolate = 15 is = 2 omega2 = 1.8119e-07 + ik_interpolate = 15 is = 3 omega2 = 2.8809e-07 + ik_interpolate = 15 is = 4 omega2 = 7.0842e-07 + ik_interpolate = 15 is = 5 omega2 = 7.8343e-07 + ik_interpolate = 15 is = 6 omega2 = 9.2470e-07 + + ik_interpolate = 16 is = 1 omega2 = 4.3090e-08 + ik_interpolate = 16 is = 2 omega2 = 4.3090e-08 + ik_interpolate = 16 is = 3 omega2 = 4.5210e-07 + ik_interpolate = 16 is = 4 omega2 = 5.0217e-07 + ik_interpolate = 16 is = 5 omega2 = 5.0217e-07 + ik_interpolate = 16 is = 6 omega2 = 8.5647e-07 + + ik_interpolate = 17 is = 1 omega2 = 1.4046e-07 + ik_interpolate = 17 is = 2 omega2 = 1.4046e-07 + ik_interpolate = 17 is = 3 omega2 = 2.6579e-07 + ik_interpolate = 17 is = 4 omega2 = 7.4425e-07 + ik_interpolate = 17 is = 5 omega2 = 7.4425e-07 + ik_interpolate = 17 is = 6 omega2 = 1.2418e-06 + + ik_interpolate = 18 is = 1 omega2 = 4.3090e-08 + ik_interpolate = 18 is = 2 omega2 = 4.3090e-08 + ik_interpolate = 18 is = 3 omega2 = 4.5210e-07 + ik_interpolate = 18 is = 4 omega2 = 5.0217e-07 + ik_interpolate = 18 is = 5 omega2 = 5.0217e-07 + ik_interpolate = 18 is = 6 omega2 = 8.5647e-07 + + ik_interpolate = 19 is = 1 omega2 = 1.6185e-07 + ik_interpolate = 19 is = 2 omega2 = 1.8119e-07 + ik_interpolate = 19 is = 3 omega2 = 2.8809e-07 + ik_interpolate = 19 is = 4 omega2 = 7.0842e-07 + ik_interpolate = 19 is = 5 omega2 = 7.8343e-07 + ik_interpolate = 19 is = 6 omega2 = 9.2470e-07 ik_interpolate = 20 is = 1 omega2 = 8.2204e-08 - ik_interpolate = 20 is = 2 omega2 = 2.8215e-07 - ik_interpolate = 20 is = 3 omega2 = 5.6046e-07 - ik_interpolate = 20 is = 4 omega2 = 5.9309e-07 - ik_interpolate = 20 is = 5 omega2 = 7.6745e-07 - ik_interpolate = 20 is = 6 omega2 = 9.1189e-07 - - ik_interpolate = 21 is = 1 omega2 = 4.3087e-08 - ik_interpolate = 21 is = 2 omega2 = 4.3087e-08 - ik_interpolate = 21 is = 3 omega2 = 4.5202e-07 - ik_interpolate = 21 is = 4 omega2 = 5.0195e-07 - ik_interpolate = 21 is = 5 omega2 = 5.0195e-07 - ik_interpolate = 21 is = 6 omega2 = 8.5639e-07 - - ik_interpolate = 22 is = 1 omega2 = 1.4042e-07 - ik_interpolate = 22 is = 2 omega2 = 1.4042e-07 - ik_interpolate = 22 is = 3 omega2 = 2.6578e-07 - ik_interpolate = 22 is = 4 omega2 = 7.4409e-07 - ik_interpolate = 22 is = 5 omega2 = 7.4409e-07 - ik_interpolate = 22 is = 6 omega2 = 1.2417e-06 + ik_interpolate = 20 is = 2 omega2 = 2.8223e-07 + ik_interpolate = 20 is = 3 omega2 = 5.6051e-07 + ik_interpolate = 20 is = 4 omega2 = 5.9330e-07 + ik_interpolate = 20 is = 5 omega2 = 7.6752e-07 + ik_interpolate = 20 is = 6 omega2 = 9.1197e-07 + + ik_interpolate = 21 is = 1 omega2 = 4.3090e-08 + ik_interpolate = 21 is = 2 omega2 = 4.3090e-08 + ik_interpolate = 21 is = 3 omega2 = 4.5210e-07 + ik_interpolate = 21 is = 4 omega2 = 5.0217e-07 + ik_interpolate = 21 is = 5 omega2 = 5.0217e-07 + ik_interpolate = 21 is = 6 omega2 = 8.5647e-07 + + ik_interpolate = 22 is = 1 omega2 = 1.4046e-07 + ik_interpolate = 22 is = 2 omega2 = 1.4046e-07 + ik_interpolate = 22 is = 3 omega2 = 2.6579e-07 + ik_interpolate = 22 is = 4 omega2 = 7.4425e-07 + ik_interpolate = 22 is = 5 omega2 = 7.4425e-07 + ik_interpolate = 22 is = 6 omega2 = 1.2418e-06 ik_interpolate = 23 is = 1 omega2 = 8.2204e-08 - ik_interpolate = 23 is = 2 omega2 = 2.8215e-07 - ik_interpolate = 23 is = 3 omega2 = 5.6046e-07 - ik_interpolate = 23 is = 4 omega2 = 5.9309e-07 - ik_interpolate = 23 is = 5 omega2 = 7.6745e-07 - ik_interpolate = 23 is = 6 omega2 = 9.1189e-07 - - ik_interpolate = 24 is = 1 omega2 = 1.6182e-07 - ik_interpolate = 24 is = 2 omega2 = 1.8116e-07 - ik_interpolate = 24 is = 3 omega2 = 2.8808e-07 - ik_interpolate = 24 is = 4 omega2 = 7.0827e-07 - ik_interpolate = 24 is = 5 omega2 = 7.8328e-07 - ik_interpolate = 24 is = 6 omega2 = 9.2454e-07 - - ik_interpolate = 25 is = 1 omega2 = 1.6182e-07 - ik_interpolate = 25 is = 2 omega2 = 1.8116e-07 - ik_interpolate = 25 is = 3 omega2 = 2.8808e-07 - ik_interpolate = 25 is = 4 omega2 = 7.0827e-07 - ik_interpolate = 25 is = 5 omega2 = 7.8328e-07 - ik_interpolate = 25 is = 6 omega2 = 9.2454e-07 + ik_interpolate = 23 is = 2 omega2 = 2.8223e-07 + ik_interpolate = 23 is = 3 omega2 = 5.6051e-07 + ik_interpolate = 23 is = 4 omega2 = 5.9330e-07 + ik_interpolate = 23 is = 5 omega2 = 7.6752e-07 + ik_interpolate = 23 is = 6 omega2 = 9.1197e-07 + + ik_interpolate = 24 is = 1 omega2 = 1.6185e-07 + ik_interpolate = 24 is = 2 omega2 = 1.8119e-07 + ik_interpolate = 24 is = 3 omega2 = 2.8809e-07 + ik_interpolate = 24 is = 4 omega2 = 7.0842e-07 + ik_interpolate = 24 is = 5 omega2 = 7.8343e-07 + ik_interpolate = 24 is = 6 omega2 = 9.2470e-07 + + ik_interpolate = 25 is = 1 omega2 = 1.6185e-07 + ik_interpolate = 25 is = 2 omega2 = 1.8119e-07 + ik_interpolate = 25 is = 3 omega2 = 2.8809e-07 + ik_interpolate = 25 is = 4 omega2 = 7.0842e-07 + ik_interpolate = 25 is = 5 omega2 = 7.8343e-07 + ik_interpolate = 25 is = 6 omega2 = 9.2470e-07 ik_interpolate = 26 is = 1 omega2 = 8.2204e-08 - ik_interpolate = 26 is = 2 omega2 = 2.8215e-07 - ik_interpolate = 26 is = 3 omega2 = 5.6046e-07 - ik_interpolate = 26 is = 4 omega2 = 5.9309e-07 - ik_interpolate = 26 is = 5 omega2 = 7.6745e-07 - ik_interpolate = 26 is = 6 omega2 = 9.1189e-07 - - ik_interpolate = 27 is = 1 omega2 = 1.6182e-07 - ik_interpolate = 27 is = 2 omega2 = 1.8116e-07 - ik_interpolate = 27 is = 3 omega2 = 2.8808e-07 - ik_interpolate = 27 is = 4 omega2 = 7.0827e-07 - ik_interpolate = 27 is = 5 omega2 = 7.8328e-07 - ik_interpolate = 27 is = 6 omega2 = 9.2454e-07 - - ik_interpolate = 28 is = 1 omega2 = 9.7387e-08 - ik_interpolate = 28 is = 2 omega2 = 9.7387e-08 - ik_interpolate = 28 is = 3 omega2 = 3.9340e-07 - ik_interpolate = 28 is = 4 omega2 = 6.2554e-07 - ik_interpolate = 28 is = 5 omega2 = 6.2554e-07 - ik_interpolate = 28 is = 6 omega2 = 8.2655e-07 + ik_interpolate = 26 is = 2 omega2 = 2.8223e-07 + ik_interpolate = 26 is = 3 omega2 = 5.6051e-07 + ik_interpolate = 26 is = 4 omega2 = 5.9330e-07 + ik_interpolate = 26 is = 5 omega2 = 7.6752e-07 + ik_interpolate = 26 is = 6 omega2 = 9.1197e-07 + + ik_interpolate = 27 is = 1 omega2 = 1.6185e-07 + ik_interpolate = 27 is = 2 omega2 = 1.8119e-07 + ik_interpolate = 27 is = 3 omega2 = 2.8809e-07 + ik_interpolate = 27 is = 4 omega2 = 7.0842e-07 + ik_interpolate = 27 is = 5 omega2 = 7.8343e-07 + ik_interpolate = 27 is = 6 omega2 = 9.2470e-07 + + ik_interpolate = 28 is = 1 omega2 = 9.7394e-08 + ik_interpolate = 28 is = 2 omega2 = 9.7394e-08 + ik_interpolate = 28 is = 3 omega2 = 3.9347e-07 + ik_interpolate = 28 is = 4 omega2 = 6.2575e-07 + ik_interpolate = 28 is = 5 omega2 = 6.2575e-07 + ik_interpolate = 28 is = 6 omega2 = 8.2664e-07 ik_interpolate = 29 is = 1 omega2 = 8.2204e-08 - ik_interpolate = 29 is = 2 omega2 = 2.8215e-07 - ik_interpolate = 29 is = 3 omega2 = 5.6046e-07 - ik_interpolate = 29 is = 4 omega2 = 5.9309e-07 - ik_interpolate = 29 is = 5 omega2 = 7.6745e-07 - ik_interpolate = 29 is = 6 omega2 = 9.1189e-07 - - ik_interpolate = 30 is = 1 omega2 = 1.6182e-07 - ik_interpolate = 30 is = 2 omega2 = 1.8116e-07 - ik_interpolate = 30 is = 3 omega2 = 2.8808e-07 - ik_interpolate = 30 is = 4 omega2 = 7.0827e-07 - ik_interpolate = 30 is = 5 omega2 = 7.8328e-07 - ik_interpolate = 30 is = 6 omega2 = 9.2454e-07 - - ik_interpolate = 31 is = 1 omega2 = 9.7387e-08 - ik_interpolate = 31 is = 2 omega2 = 9.7387e-08 - ik_interpolate = 31 is = 3 omega2 = 3.9340e-07 - ik_interpolate = 31 is = 4 omega2 = 6.2554e-07 - ik_interpolate = 31 is = 5 omega2 = 6.2554e-07 - ik_interpolate = 31 is = 6 omega2 = 8.2655e-07 - - ik_interpolate = 32 is = 1 omega2 = 1.6182e-07 - ik_interpolate = 32 is = 2 omega2 = 1.8116e-07 - ik_interpolate = 32 is = 3 omega2 = 2.8808e-07 - ik_interpolate = 32 is = 4 omega2 = 7.0827e-07 - ik_interpolate = 32 is = 5 omega2 = 7.8328e-07 - ik_interpolate = 32 is = 6 omega2 = 9.2454e-07 - - ik_interpolate = 33 is = 1 omega2 = 3.0597e-07 - ik_interpolate = 33 is = 2 omega2 = 3.0597e-07 - ik_interpolate = 33 is = 3 omega2 = 6.9433e-07 - ik_interpolate = 33 is = 4 omega2 = 8.0676e-07 - ik_interpolate = 33 is = 5 omega2 = 8.0676e-07 - ik_interpolate = 33 is = 6 omega2 = 9.6328e-07 - - ik_interpolate = 34 is = 1 omega2 = 1.6182e-07 - ik_interpolate = 34 is = 2 omega2 = 1.8116e-07 - ik_interpolate = 34 is = 3 omega2 = 2.8808e-07 - ik_interpolate = 34 is = 4 omega2 = 7.0827e-07 - ik_interpolate = 34 is = 5 omega2 = 7.8328e-07 - ik_interpolate = 34 is = 6 omega2 = 9.2454e-07 - - ik_interpolate = 35 is = 1 omega2 = 5.7614e-08 - ik_interpolate = 35 is = 2 omega2 = 5.7614e-08 - ik_interpolate = 35 is = 3 omega2 = 1.0369e-07 - ik_interpolate = 35 is = 4 omega2 = 5.5995e-07 - ik_interpolate = 35 is = 5 omega2 = 5.5995e-07 - ik_interpolate = 35 is = 6 omega2 = 6.5133e-07 - - ik_interpolate = 36 is = 1 omega2 = 1.6182e-07 - ik_interpolate = 36 is = 2 omega2 = 1.8116e-07 - ik_interpolate = 36 is = 3 omega2 = 2.8808e-07 - ik_interpolate = 36 is = 4 omega2 = 7.0827e-07 - ik_interpolate = 36 is = 5 omega2 = 7.8328e-07 - ik_interpolate = 36 is = 6 omega2 = 9.2454e-07 - - ik_interpolate = 37 is = 1 omega2 = 1.6182e-07 - ik_interpolate = 37 is = 2 omega2 = 1.8116e-07 - ik_interpolate = 37 is = 3 omega2 = 2.8808e-07 - ik_interpolate = 37 is = 4 omega2 = 7.0827e-07 - ik_interpolate = 37 is = 5 omega2 = 7.8328e-07 - ik_interpolate = 37 is = 6 omega2 = 9.2454e-07 + ik_interpolate = 29 is = 2 omega2 = 2.8223e-07 + ik_interpolate = 29 is = 3 omega2 = 5.6051e-07 + ik_interpolate = 29 is = 4 omega2 = 5.9330e-07 + ik_interpolate = 29 is = 5 omega2 = 7.6752e-07 + ik_interpolate = 29 is = 6 omega2 = 9.1197e-07 + + ik_interpolate = 30 is = 1 omega2 = 1.6185e-07 + ik_interpolate = 30 is = 2 omega2 = 1.8119e-07 + ik_interpolate = 30 is = 3 omega2 = 2.8809e-07 + ik_interpolate = 30 is = 4 omega2 = 7.0842e-07 + ik_interpolate = 30 is = 5 omega2 = 7.8343e-07 + ik_interpolate = 30 is = 6 omega2 = 9.2470e-07 + + ik_interpolate = 31 is = 1 omega2 = 9.7394e-08 + ik_interpolate = 31 is = 2 omega2 = 9.7394e-08 + ik_interpolate = 31 is = 3 omega2 = 3.9347e-07 + ik_interpolate = 31 is = 4 omega2 = 6.2575e-07 + ik_interpolate = 31 is = 5 omega2 = 6.2575e-07 + ik_interpolate = 31 is = 6 omega2 = 8.2664e-07 + + ik_interpolate = 32 is = 1 omega2 = 1.6185e-07 + ik_interpolate = 32 is = 2 omega2 = 1.8119e-07 + ik_interpolate = 32 is = 3 omega2 = 2.8809e-07 + ik_interpolate = 32 is = 4 omega2 = 7.0842e-07 + ik_interpolate = 32 is = 5 omega2 = 7.8343e-07 + ik_interpolate = 32 is = 6 omega2 = 9.2470e-07 + + ik_interpolate = 33 is = 1 omega2 = 3.0603e-07 + ik_interpolate = 33 is = 2 omega2 = 3.0603e-07 + ik_interpolate = 33 is = 3 omega2 = 6.9438e-07 + ik_interpolate = 33 is = 4 omega2 = 8.0684e-07 + ik_interpolate = 33 is = 5 omega2 = 8.0684e-07 + ik_interpolate = 33 is = 6 omega2 = 9.6336e-07 + + ik_interpolate = 34 is = 1 omega2 = 1.6185e-07 + ik_interpolate = 34 is = 2 omega2 = 1.8119e-07 + ik_interpolate = 34 is = 3 omega2 = 2.8809e-07 + ik_interpolate = 34 is = 4 omega2 = 7.0842e-07 + ik_interpolate = 34 is = 5 omega2 = 7.8343e-07 + ik_interpolate = 34 is = 6 omega2 = 9.2470e-07 + + ik_interpolate = 35 is = 1 omega2 = 5.7625e-08 + ik_interpolate = 35 is = 2 omega2 = 5.7625e-08 + ik_interpolate = 35 is = 3 omega2 = 1.0371e-07 + ik_interpolate = 35 is = 4 omega2 = 5.6016e-07 + ik_interpolate = 35 is = 5 omega2 = 5.6016e-07 + ik_interpolate = 35 is = 6 omega2 = 6.5154e-07 + + ik_interpolate = 36 is = 1 omega2 = 1.6185e-07 + ik_interpolate = 36 is = 2 omega2 = 1.8119e-07 + ik_interpolate = 36 is = 3 omega2 = 2.8809e-07 + ik_interpolate = 36 is = 4 omega2 = 7.0842e-07 + ik_interpolate = 36 is = 5 omega2 = 7.8343e-07 + ik_interpolate = 36 is = 6 omega2 = 9.2470e-07 + + ik_interpolate = 37 is = 1 omega2 = 1.6185e-07 + ik_interpolate = 37 is = 2 omega2 = 1.8119e-07 + ik_interpolate = 37 is = 3 omega2 = 2.8809e-07 + ik_interpolate = 37 is = 4 omega2 = 7.0842e-07 + ik_interpolate = 37 is = 5 omega2 = 7.8343e-07 + ik_interpolate = 37 is = 6 omega2 = 9.2470e-07 ik_interpolate = 38 is = 1 omega2 = 8.2204e-08 - ik_interpolate = 38 is = 2 omega2 = 2.8215e-07 - ik_interpolate = 38 is = 3 omega2 = 5.6046e-07 - ik_interpolate = 38 is = 4 omega2 = 5.9309e-07 - ik_interpolate = 38 is = 5 omega2 = 7.6745e-07 - ik_interpolate = 38 is = 6 omega2 = 9.1189e-07 - - ik_interpolate = 39 is = 1 omega2 = 1.6182e-07 - ik_interpolate = 39 is = 2 omega2 = 1.8116e-07 - ik_interpolate = 39 is = 3 omega2 = 2.8808e-07 - ik_interpolate = 39 is = 4 omega2 = 7.0827e-07 - ik_interpolate = 39 is = 5 omega2 = 7.8328e-07 - ik_interpolate = 39 is = 6 omega2 = 9.2454e-07 - - ik_interpolate = 40 is = 1 omega2 = 9.7387e-08 - ik_interpolate = 40 is = 2 omega2 = 9.7387e-08 - ik_interpolate = 40 is = 3 omega2 = 3.9340e-07 - ik_interpolate = 40 is = 4 omega2 = 6.2554e-07 - ik_interpolate = 40 is = 5 omega2 = 6.2554e-07 - ik_interpolate = 40 is = 6 omega2 = 8.2655e-07 - - ik_interpolate = 41 is = 1 omega2 = 5.7614e-08 - ik_interpolate = 41 is = 2 omega2 = 5.7614e-08 - ik_interpolate = 41 is = 3 omega2 = 1.0369e-07 - ik_interpolate = 41 is = 4 omega2 = 5.5995e-07 - ik_interpolate = 41 is = 5 omega2 = 5.5995e-07 - ik_interpolate = 41 is = 6 omega2 = 6.5133e-07 - - ik_interpolate = 42 is = 1 omega2 = 1.6182e-07 - ik_interpolate = 42 is = 2 omega2 = 1.8116e-07 - ik_interpolate = 42 is = 3 omega2 = 2.8808e-07 - ik_interpolate = 42 is = 4 omega2 = 7.0827e-07 - ik_interpolate = 42 is = 5 omega2 = 7.8328e-07 - ik_interpolate = 42 is = 6 omega2 = 9.2454e-07 - - ik_interpolate = 43 is = 1 omega2 = 3.0597e-07 - ik_interpolate = 43 is = 2 omega2 = 3.0597e-07 - ik_interpolate = 43 is = 3 omega2 = 6.9433e-07 - ik_interpolate = 43 is = 4 omega2 = 8.0676e-07 - ik_interpolate = 43 is = 5 omega2 = 8.0676e-07 - ik_interpolate = 43 is = 6 omega2 = 9.6328e-07 - - ik_interpolate = 44 is = 1 omega2 = 1.6182e-07 - ik_interpolate = 44 is = 2 omega2 = 1.8116e-07 - ik_interpolate = 44 is = 3 omega2 = 2.8808e-07 - ik_interpolate = 44 is = 4 omega2 = 7.0827e-07 - ik_interpolate = 44 is = 5 omega2 = 7.8328e-07 - ik_interpolate = 44 is = 6 omega2 = 9.2454e-07 - - ik_interpolate = 45 is = 1 omega2 = 1.6182e-07 - ik_interpolate = 45 is = 2 omega2 = 1.8116e-07 - ik_interpolate = 45 is = 3 omega2 = 2.8808e-07 - ik_interpolate = 45 is = 4 omega2 = 7.0827e-07 - ik_interpolate = 45 is = 5 omega2 = 7.8328e-07 - ik_interpolate = 45 is = 6 omega2 = 9.2454e-07 - - ik_interpolate = 46 is = 1 omega2 = 9.7387e-08 - ik_interpolate = 46 is = 2 omega2 = 9.7387e-08 - ik_interpolate = 46 is = 3 omega2 = 3.9340e-07 - ik_interpolate = 46 is = 4 omega2 = 6.2554e-07 - ik_interpolate = 46 is = 5 omega2 = 6.2554e-07 - ik_interpolate = 46 is = 6 omega2 = 8.2655e-07 - - ik_interpolate = 47 is = 1 omega2 = 1.6182e-07 - ik_interpolate = 47 is = 2 omega2 = 1.8116e-07 - ik_interpolate = 47 is = 3 omega2 = 2.8808e-07 - ik_interpolate = 47 is = 4 omega2 = 7.0827e-07 - ik_interpolate = 47 is = 5 omega2 = 7.8328e-07 - ik_interpolate = 47 is = 6 omega2 = 9.2454e-07 + ik_interpolate = 38 is = 2 omega2 = 2.8223e-07 + ik_interpolate = 38 is = 3 omega2 = 5.6051e-07 + ik_interpolate = 38 is = 4 omega2 = 5.9330e-07 + ik_interpolate = 38 is = 5 omega2 = 7.6752e-07 + ik_interpolate = 38 is = 6 omega2 = 9.1197e-07 + + ik_interpolate = 39 is = 1 omega2 = 1.6185e-07 + ik_interpolate = 39 is = 2 omega2 = 1.8119e-07 + ik_interpolate = 39 is = 3 omega2 = 2.8809e-07 + ik_interpolate = 39 is = 4 omega2 = 7.0842e-07 + ik_interpolate = 39 is = 5 omega2 = 7.8343e-07 + ik_interpolate = 39 is = 6 omega2 = 9.2470e-07 + + ik_interpolate = 40 is = 1 omega2 = 9.7394e-08 + ik_interpolate = 40 is = 2 omega2 = 9.7394e-08 + ik_interpolate = 40 is = 3 omega2 = 3.9347e-07 + ik_interpolate = 40 is = 4 omega2 = 6.2575e-07 + ik_interpolate = 40 is = 5 omega2 = 6.2575e-07 + ik_interpolate = 40 is = 6 omega2 = 8.2664e-07 + + ik_interpolate = 41 is = 1 omega2 = 5.7625e-08 + ik_interpolate = 41 is = 2 omega2 = 5.7625e-08 + ik_interpolate = 41 is = 3 omega2 = 1.0371e-07 + ik_interpolate = 41 is = 4 omega2 = 5.6016e-07 + ik_interpolate = 41 is = 5 omega2 = 5.6016e-07 + ik_interpolate = 41 is = 6 omega2 = 6.5154e-07 + + ik_interpolate = 42 is = 1 omega2 = 1.6185e-07 + ik_interpolate = 42 is = 2 omega2 = 1.8119e-07 + ik_interpolate = 42 is = 3 omega2 = 2.8809e-07 + ik_interpolate = 42 is = 4 omega2 = 7.0842e-07 + ik_interpolate = 42 is = 5 omega2 = 7.8343e-07 + ik_interpolate = 42 is = 6 omega2 = 9.2470e-07 + + ik_interpolate = 43 is = 1 omega2 = 3.0603e-07 + ik_interpolate = 43 is = 2 omega2 = 3.0603e-07 + ik_interpolate = 43 is = 3 omega2 = 6.9438e-07 + ik_interpolate = 43 is = 4 omega2 = 8.0684e-07 + ik_interpolate = 43 is = 5 omega2 = 8.0684e-07 + ik_interpolate = 43 is = 6 omega2 = 9.6336e-07 + + ik_interpolate = 44 is = 1 omega2 = 1.6185e-07 + ik_interpolate = 44 is = 2 omega2 = 1.8119e-07 + ik_interpolate = 44 is = 3 omega2 = 2.8809e-07 + ik_interpolate = 44 is = 4 omega2 = 7.0842e-07 + ik_interpolate = 44 is = 5 omega2 = 7.8343e-07 + ik_interpolate = 44 is = 6 omega2 = 9.2470e-07 + + ik_interpolate = 45 is = 1 omega2 = 1.6185e-07 + ik_interpolate = 45 is = 2 omega2 = 1.8119e-07 + ik_interpolate = 45 is = 3 omega2 = 2.8809e-07 + ik_interpolate = 45 is = 4 omega2 = 7.0842e-07 + ik_interpolate = 45 is = 5 omega2 = 7.8343e-07 + ik_interpolate = 45 is = 6 omega2 = 9.2470e-07 + + ik_interpolate = 46 is = 1 omega2 = 9.7394e-08 + ik_interpolate = 46 is = 2 omega2 = 9.7394e-08 + ik_interpolate = 46 is = 3 omega2 = 3.9347e-07 + ik_interpolate = 46 is = 4 omega2 = 6.2575e-07 + ik_interpolate = 46 is = 5 omega2 = 6.2575e-07 + ik_interpolate = 46 is = 6 omega2 = 8.2664e-07 + + ik_interpolate = 47 is = 1 omega2 = 1.6185e-07 + ik_interpolate = 47 is = 2 omega2 = 1.8119e-07 + ik_interpolate = 47 is = 3 omega2 = 2.8809e-07 + ik_interpolate = 47 is = 4 omega2 = 7.0842e-07 + ik_interpolate = 47 is = 5 omega2 = 7.8343e-07 + ik_interpolate = 47 is = 6 omega2 = 9.2470e-07 ik_interpolate = 48 is = 1 omega2 = 8.2204e-08 - ik_interpolate = 48 is = 2 omega2 = 2.8215e-07 - ik_interpolate = 48 is = 3 omega2 = 5.6046e-07 - ik_interpolate = 48 is = 4 omega2 = 5.9309e-07 - ik_interpolate = 48 is = 5 omega2 = 7.6745e-07 - ik_interpolate = 48 is = 6 omega2 = 9.1189e-07 - - ik_interpolate = 49 is = 1 omega2 = 1.4042e-07 - ik_interpolate = 49 is = 2 omega2 = 1.4042e-07 - ik_interpolate = 49 is = 3 omega2 = 2.6578e-07 - ik_interpolate = 49 is = 4 omega2 = 7.4409e-07 - ik_interpolate = 49 is = 5 omega2 = 7.4409e-07 - ik_interpolate = 49 is = 6 omega2 = 1.2417e-06 + ik_interpolate = 48 is = 2 omega2 = 2.8223e-07 + ik_interpolate = 48 is = 3 omega2 = 5.6051e-07 + ik_interpolate = 48 is = 4 omega2 = 5.9330e-07 + ik_interpolate = 48 is = 5 omega2 = 7.6752e-07 + ik_interpolate = 48 is = 6 omega2 = 9.1197e-07 + + ik_interpolate = 49 is = 1 omega2 = 1.4046e-07 + ik_interpolate = 49 is = 2 omega2 = 1.4046e-07 + ik_interpolate = 49 is = 3 omega2 = 2.6579e-07 + ik_interpolate = 49 is = 4 omega2 = 7.4425e-07 + ik_interpolate = 49 is = 5 omega2 = 7.4425e-07 + ik_interpolate = 49 is = 6 omega2 = 1.2418e-06 ik_interpolate = 50 is = 1 omega2 = 8.2204e-08 - ik_interpolate = 50 is = 2 omega2 = 2.8215e-07 - ik_interpolate = 50 is = 3 omega2 = 5.6046e-07 - ik_interpolate = 50 is = 4 omega2 = 5.9309e-07 - ik_interpolate = 50 is = 5 omega2 = 7.6745e-07 - ik_interpolate = 50 is = 6 omega2 = 9.1189e-07 - - ik_interpolate = 51 is = 1 omega2 = 1.6182e-07 - ik_interpolate = 51 is = 2 omega2 = 1.8116e-07 - ik_interpolate = 51 is = 3 omega2 = 2.8808e-07 - ik_interpolate = 51 is = 4 omega2 = 7.0827e-07 - ik_interpolate = 51 is = 5 omega2 = 7.8328e-07 - ik_interpolate = 51 is = 6 omega2 = 9.2454e-07 - - ik_interpolate = 52 is = 1 omega2 = 4.3087e-08 - ik_interpolate = 52 is = 2 omega2 = 4.3087e-08 - ik_interpolate = 52 is = 3 omega2 = 4.5202e-07 - ik_interpolate = 52 is = 4 omega2 = 5.0195e-07 - ik_interpolate = 52 is = 5 omega2 = 5.0195e-07 - ik_interpolate = 52 is = 6 omega2 = 8.5639e-07 + ik_interpolate = 50 is = 2 omega2 = 2.8223e-07 + ik_interpolate = 50 is = 3 omega2 = 5.6051e-07 + ik_interpolate = 50 is = 4 omega2 = 5.9330e-07 + ik_interpolate = 50 is = 5 omega2 = 7.6752e-07 + ik_interpolate = 50 is = 6 omega2 = 9.1197e-07 + + ik_interpolate = 51 is = 1 omega2 = 1.6185e-07 + ik_interpolate = 51 is = 2 omega2 = 1.8119e-07 + ik_interpolate = 51 is = 3 omega2 = 2.8809e-07 + ik_interpolate = 51 is = 4 omega2 = 7.0842e-07 + ik_interpolate = 51 is = 5 omega2 = 7.8343e-07 + ik_interpolate = 51 is = 6 omega2 = 9.2470e-07 + + ik_interpolate = 52 is = 1 omega2 = 4.3090e-08 + ik_interpolate = 52 is = 2 omega2 = 4.3090e-08 + ik_interpolate = 52 is = 3 omega2 = 4.5210e-07 + ik_interpolate = 52 is = 4 omega2 = 5.0217e-07 + ik_interpolate = 52 is = 5 omega2 = 5.0217e-07 + ik_interpolate = 52 is = 6 omega2 = 8.5647e-07 ik_interpolate = 53 is = 1 omega2 = 8.2204e-08 - ik_interpolate = 53 is = 2 omega2 = 2.8215e-07 - ik_interpolate = 53 is = 3 omega2 = 5.6046e-07 - ik_interpolate = 53 is = 4 omega2 = 5.9309e-07 - ik_interpolate = 53 is = 5 omega2 = 7.6745e-07 - ik_interpolate = 53 is = 6 omega2 = 9.1189e-07 - - ik_interpolate = 54 is = 1 omega2 = 1.6182e-07 - ik_interpolate = 54 is = 2 omega2 = 1.8116e-07 - ik_interpolate = 54 is = 3 omega2 = 2.8808e-07 - ik_interpolate = 54 is = 4 omega2 = 7.0827e-07 - ik_interpolate = 54 is = 5 omega2 = 7.8328e-07 - ik_interpolate = 54 is = 6 omega2 = 9.2454e-07 - - ik_interpolate = 55 is = 1 omega2 = 9.7387e-08 - ik_interpolate = 55 is = 2 omega2 = 9.7387e-08 - ik_interpolate = 55 is = 3 omega2 = 3.9340e-07 - ik_interpolate = 55 is = 4 omega2 = 6.2554e-07 - ik_interpolate = 55 is = 5 omega2 = 6.2554e-07 - ik_interpolate = 55 is = 6 omega2 = 8.2655e-07 - - ik_interpolate = 56 is = 1 omega2 = 1.6182e-07 - ik_interpolate = 56 is = 2 omega2 = 1.8116e-07 - ik_interpolate = 56 is = 3 omega2 = 2.8808e-07 - ik_interpolate = 56 is = 4 omega2 = 7.0827e-07 - ik_interpolate = 56 is = 5 omega2 = 7.8328e-07 - ik_interpolate = 56 is = 6 omega2 = 9.2454e-07 - - ik_interpolate = 57 is = 1 omega2 = 1.6182e-07 - ik_interpolate = 57 is = 2 omega2 = 1.8116e-07 - ik_interpolate = 57 is = 3 omega2 = 2.8808e-07 - ik_interpolate = 57 is = 4 omega2 = 7.0827e-07 - ik_interpolate = 57 is = 5 omega2 = 7.8328e-07 - ik_interpolate = 57 is = 6 omega2 = 9.2454e-07 - - ik_interpolate = 58 is = 1 omega2 = 9.7387e-08 - ik_interpolate = 58 is = 2 omega2 = 9.7387e-08 - ik_interpolate = 58 is = 3 omega2 = 3.9340e-07 - ik_interpolate = 58 is = 4 omega2 = 6.2554e-07 - ik_interpolate = 58 is = 5 omega2 = 6.2554e-07 - ik_interpolate = 58 is = 6 omega2 = 8.2655e-07 - - ik_interpolate = 59 is = 1 omega2 = 1.6182e-07 - ik_interpolate = 59 is = 2 omega2 = 1.8116e-07 - ik_interpolate = 59 is = 3 omega2 = 2.8808e-07 - ik_interpolate = 59 is = 4 omega2 = 7.0827e-07 - ik_interpolate = 59 is = 5 omega2 = 7.8328e-07 - ik_interpolate = 59 is = 6 omega2 = 9.2454e-07 + ik_interpolate = 53 is = 2 omega2 = 2.8223e-07 + ik_interpolate = 53 is = 3 omega2 = 5.6051e-07 + ik_interpolate = 53 is = 4 omega2 = 5.9330e-07 + ik_interpolate = 53 is = 5 omega2 = 7.6752e-07 + ik_interpolate = 53 is = 6 omega2 = 9.1197e-07 + + ik_interpolate = 54 is = 1 omega2 = 1.6185e-07 + ik_interpolate = 54 is = 2 omega2 = 1.8119e-07 + ik_interpolate = 54 is = 3 omega2 = 2.8809e-07 + ik_interpolate = 54 is = 4 omega2 = 7.0842e-07 + ik_interpolate = 54 is = 5 omega2 = 7.8343e-07 + ik_interpolate = 54 is = 6 omega2 = 9.2470e-07 + + ik_interpolate = 55 is = 1 omega2 = 9.7394e-08 + ik_interpolate = 55 is = 2 omega2 = 9.7394e-08 + ik_interpolate = 55 is = 3 omega2 = 3.9347e-07 + ik_interpolate = 55 is = 4 omega2 = 6.2575e-07 + ik_interpolate = 55 is = 5 omega2 = 6.2575e-07 + ik_interpolate = 55 is = 6 omega2 = 8.2664e-07 + + ik_interpolate = 56 is = 1 omega2 = 1.6185e-07 + ik_interpolate = 56 is = 2 omega2 = 1.8119e-07 + ik_interpolate = 56 is = 3 omega2 = 2.8809e-07 + ik_interpolate = 56 is = 4 omega2 = 7.0842e-07 + ik_interpolate = 56 is = 5 omega2 = 7.8343e-07 + ik_interpolate = 56 is = 6 omega2 = 9.2470e-07 + + ik_interpolate = 57 is = 1 omega2 = 1.6185e-07 + ik_interpolate = 57 is = 2 omega2 = 1.8119e-07 + ik_interpolate = 57 is = 3 omega2 = 2.8809e-07 + ik_interpolate = 57 is = 4 omega2 = 7.0842e-07 + ik_interpolate = 57 is = 5 omega2 = 7.8343e-07 + ik_interpolate = 57 is = 6 omega2 = 9.2470e-07 + + ik_interpolate = 58 is = 1 omega2 = 9.7394e-08 + ik_interpolate = 58 is = 2 omega2 = 9.7394e-08 + ik_interpolate = 58 is = 3 omega2 = 3.9347e-07 + ik_interpolate = 58 is = 4 omega2 = 6.2575e-07 + ik_interpolate = 58 is = 5 omega2 = 6.2575e-07 + ik_interpolate = 58 is = 6 omega2 = 8.2664e-07 + + ik_interpolate = 59 is = 1 omega2 = 1.6185e-07 + ik_interpolate = 59 is = 2 omega2 = 1.8119e-07 + ik_interpolate = 59 is = 3 omega2 = 2.8809e-07 + ik_interpolate = 59 is = 4 omega2 = 7.0842e-07 + ik_interpolate = 59 is = 5 omega2 = 7.8343e-07 + ik_interpolate = 59 is = 6 omega2 = 9.2470e-07 ik_interpolate = 60 is = 1 omega2 = 8.2204e-08 - ik_interpolate = 60 is = 2 omega2 = 2.8215e-07 - ik_interpolate = 60 is = 3 omega2 = 5.6046e-07 - ik_interpolate = 60 is = 4 omega2 = 5.9309e-07 - ik_interpolate = 60 is = 5 omega2 = 7.6745e-07 - ik_interpolate = 60 is = 6 omega2 = 9.1189e-07 - - ik_interpolate = 61 is = 1 omega2 = 4.3087e-08 - ik_interpolate = 61 is = 2 omega2 = 4.3087e-08 - ik_interpolate = 61 is = 3 omega2 = 4.5202e-07 - ik_interpolate = 61 is = 4 omega2 = 5.0195e-07 - ik_interpolate = 61 is = 5 omega2 = 5.0195e-07 - ik_interpolate = 61 is = 6 omega2 = 8.5639e-07 - - ik_interpolate = 62 is = 1 omega2 = 1.6182e-07 - ik_interpolate = 62 is = 2 omega2 = 1.8116e-07 - ik_interpolate = 62 is = 3 omega2 = 2.8808e-07 - ik_interpolate = 62 is = 4 omega2 = 7.0827e-07 - ik_interpolate = 62 is = 5 omega2 = 7.8328e-07 - ik_interpolate = 62 is = 6 omega2 = 9.2454e-07 + ik_interpolate = 60 is = 2 omega2 = 2.8223e-07 + ik_interpolate = 60 is = 3 omega2 = 5.6051e-07 + ik_interpolate = 60 is = 4 omega2 = 5.9330e-07 + ik_interpolate = 60 is = 5 omega2 = 7.6752e-07 + ik_interpolate = 60 is = 6 omega2 = 9.1197e-07 + + ik_interpolate = 61 is = 1 omega2 = 4.3090e-08 + ik_interpolate = 61 is = 2 omega2 = 4.3090e-08 + ik_interpolate = 61 is = 3 omega2 = 4.5210e-07 + ik_interpolate = 61 is = 4 omega2 = 5.0217e-07 + ik_interpolate = 61 is = 5 omega2 = 5.0217e-07 + ik_interpolate = 61 is = 6 omega2 = 8.5647e-07 + + ik_interpolate = 62 is = 1 omega2 = 1.6185e-07 + ik_interpolate = 62 is = 2 omega2 = 1.8119e-07 + ik_interpolate = 62 is = 3 omega2 = 2.8809e-07 + ik_interpolate = 62 is = 4 omega2 = 7.0842e-07 + ik_interpolate = 62 is = 5 omega2 = 7.8343e-07 + ik_interpolate = 62 is = 6 omega2 = 9.2470e-07 ik_interpolate = 63 is = 1 omega2 = 8.2204e-08 - ik_interpolate = 63 is = 2 omega2 = 2.8215e-07 - ik_interpolate = 63 is = 3 omega2 = 5.6046e-07 - ik_interpolate = 63 is = 4 omega2 = 5.9309e-07 - ik_interpolate = 63 is = 5 omega2 = 7.6745e-07 - ik_interpolate = 63 is = 6 omega2 = 9.1189e-07 - - ik_interpolate = 64 is = 1 omega2 = 1.4042e-07 - ik_interpolate = 64 is = 2 omega2 = 1.4042e-07 - ik_interpolate = 64 is = 3 omega2 = 2.6578e-07 - ik_interpolate = 64 is = 4 omega2 = 7.4409e-07 - ik_interpolate = 64 is = 5 omega2 = 7.4409e-07 - ik_interpolate = 64 is = 6 omega2 = 1.2417e-06 + ik_interpolate = 63 is = 2 omega2 = 2.8223e-07 + ik_interpolate = 63 is = 3 omega2 = 5.6051e-07 + ik_interpolate = 63 is = 4 omega2 = 5.9330e-07 + ik_interpolate = 63 is = 5 omega2 = 7.6752e-07 + ik_interpolate = 63 is = 6 omega2 = 9.1197e-07 + + ik_interpolate = 64 is = 1 omega2 = 1.4046e-07 + ik_interpolate = 64 is = 2 omega2 = 1.4046e-07 + ik_interpolate = 64 is = 3 omega2 = 2.6579e-07 + ik_interpolate = 64 is = 4 omega2 = 7.4425e-07 + ik_interpolate = 64 is = 5 omega2 = 7.4425e-07 + ik_interpolate = 64 is = 6 omega2 = 1.2418e-06 Temperature = 4.0000e+02 K SCPH ITER 1 : DIFF = N/A - SCPH ITER 2 : DIFF = 9.8459e-08 - SCPH ITER 3 : DIFF = 8.7365e-08 - SCPH ITER 4 : DIFF = 7.7523e-08 - SCPH ITER 5 : DIFF = 6.8793e-08 - SCPH ITER 6 : DIFF = 6.1047e-08 - SCPH ITER 7 : DIFF = 5.4175e-08 - SCPH ITER 8 : DIFF = 4.8077e-08 - SCPH ITER 9 : DIFF = 4.2667e-08 - SCPH ITER 10 : DIFF = 3.7866e-08 - SCPH ITER 11 : DIFF = 3.3606e-08 - SCPH ITER 12 : DIFF = 2.9825e-08 - SCPH ITER 13 : DIFF = 2.6470e-08 - SCPH ITER 14 : DIFF = 2.3493e-08 - SCPH ITER 15 : DIFF = 2.0851e-08 - SCPH ITER 16 : DIFF = 1.8506e-08 - SCPH ITER 17 : DIFF = 1.6425e-08 - SCPH ITER 18 : DIFF = 1.4578e-08 - SCPH ITER 19 : DIFF = 1.2939e-08 - SCPH ITER 20 : DIFF = 1.1484e-08 - SCPH ITER 21 : DIFF = 1.0193e-08 - SCPH ITER 22 : DIFF = 9.0466e-09 + SCPH ITER 2 : DIFF = 9.9443e-08 + SCPH ITER 3 : DIFF = 8.8237e-08 + SCPH ITER 4 : DIFF = 7.8297e-08 + SCPH ITER 5 : DIFF = 6.9480e-08 + SCPH ITER 6 : DIFF = 6.1656e-08 + SCPH ITER 7 : DIFF = 5.4715e-08 + SCPH ITER 8 : DIFF = 4.8557e-08 + SCPH ITER 9 : DIFF = 4.3092e-08 + SCPH ITER 10 : DIFF = 3.8244e-08 + SCPH ITER 11 : DIFF = 3.3941e-08 + SCPH ITER 12 : DIFF = 3.0123e-08 + SCPH ITER 13 : DIFF = 2.6734e-08 + SCPH ITER 14 : DIFF = 2.3727e-08 + SCPH ITER 15 : DIFF = 2.1059e-08 + SCPH ITER 16 : DIFF = 1.8690e-08 + SCPH ITER 17 : DIFF = 1.6589e-08 + SCPH ITER 18 : DIFF = 1.4723e-08 + SCPH ITER 19 : DIFF = 1.3068e-08 + SCPH ITER 20 : DIFF = 1.1598e-08 + SCPH ITER 21 : DIFF = 1.0294e-08 + SCPH ITER 22 : DIFF = 9.1368e-09 + SCPH ITER 23 : DIFF = 8.1095e-09 + SCPH ITER 24 : DIFF = 7.1978e-09 + SCPH ITER 25 : DIFF = 6.3886e-09 + SCPH ITER 26 : DIFF = 5.6703e-09 + SCPH ITER 27 : DIFF = 5.0329e-09 + SCPH ITER 28 : DIFF = 4.4671e-09 + SCPH ITER 29 : DIFF = 3.9649e-09 + SCPH ITER 30 : DIFF = 3.5191e-09 + SCPH ITER 31 : DIFF = 3.1235e-09 + SCPH ITER 32 : DIFF = 2.7724e-09 + SCPH ITER 33 : DIFF = 2.4607e-09 + SCPH ITER 34 : DIFF = 2.1841e-09 + SCPH ITER 35 : DIFF = 1.9386e-09 + SCPH ITER 36 : DIFF = 1.7206e-09 + SCPH ITER 37 : DIFF = 1.5272e-09 + SCPH ITER 38 : DIFF = 1.3555e-09 + SCPH ITER 39 : DIFF = 1.2031e-09 + SCPH ITER 40 : DIFF = 1.0679e-09 + SCPH ITER 41 : DIFF = 9.4784e-10 + SCPH ITER 42 : DIFF = 8.4129e-10 + SCPH ITER 43 : DIFF = 7.4671e-10 + SCPH ITER 44 : DIFF = 6.6277e-10 + SCPH ITER 45 : DIFF = 5.8826e-10 + SCPH ITER 46 : DIFF = 5.2213e-10 + SCPH ITER 47 : DIFF = 4.6344e-10 + SCPH ITER 48 : DIFF = 4.1133e-10 + SCPH ITER 49 : DIFF = 3.6510e-10 + SCPH ITER 50 : DIFF = 3.2405e-10 + SCPH ITER 51 : DIFF = 2.8762e-10 + SCPH ITER 52 : DIFF = 2.5529e-10 + SCPH ITER 53 : DIFF = 2.2659e-10 + SCPH ITER 54 : DIFF = 2.0111e-10 + SCPH ITER 55 : DIFF = 1.7851e-10 + SCPH ITER 56 : DIFF = 1.5844e-10 + SCPH ITER 57 : DIFF = 1.4064e-10 + SCPH ITER 58 : DIFF = 1.2483e-10 + SCPH ITER 59 : DIFF = 1.1080e-10 + SCPH ITER 60 : DIFF = 9.8340e-11 DIFF < SCPH_TOL : break SCPH loop - Temp = 4.0000e+02 : convergence achieved in 22 iterations. + Temp = 4.0000e+02 : convergence achieved in 60 iterations. New eigenvalues - ik_interpolate = 1 is = 1 omega2 = 0.0000e+00 - ik_interpolate = 1 is = 2 omega2 = 0.0000e+00 - ik_interpolate = 1 is = 3 omega2 = 0.0000e+00 - ik_interpolate = 1 is = 4 omega2 = 2.6719e-07 - ik_interpolate = 1 is = 5 omega2 = 2.6719e-07 - ik_interpolate = 1 is = 6 omega2 = 2.6719e-07 - - ik_interpolate = 2 is = 1 omega2 = 1.3778e-07 - ik_interpolate = 2 is = 2 omega2 = 1.3778e-07 - ik_interpolate = 2 is = 3 omega2 = 2.6490e-07 - ik_interpolate = 2 is = 4 omega2 = 7.2868e-07 - ik_interpolate = 2 is = 5 omega2 = 7.2868e-07 - ik_interpolate = 2 is = 6 omega2 = 1.2260e-06 - - ik_interpolate = 3 is = 1 omega2 = 2.9992e-07 - ik_interpolate = 3 is = 2 omega2 = 2.9992e-07 - ik_interpolate = 3 is = 3 omega2 = 6.9245e-07 - ik_interpolate = 3 is = 4 omega2 = 8.0197e-07 - ik_interpolate = 3 is = 5 omega2 = 8.0197e-07 - ik_interpolate = 3 is = 6 omega2 = 9.5716e-07 - - ik_interpolate = 4 is = 1 omega2 = 1.3778e-07 - ik_interpolate = 4 is = 2 omega2 = 1.3778e-07 - ik_interpolate = 4 is = 3 omega2 = 2.6490e-07 - ik_interpolate = 4 is = 4 omega2 = 7.2868e-07 - ik_interpolate = 4 is = 5 omega2 = 7.2868e-07 - ik_interpolate = 4 is = 6 omega2 = 1.2260e-06 - - ik_interpolate = 5 is = 1 omega2 = 1.3778e-07 - ik_interpolate = 5 is = 2 omega2 = 1.3778e-07 - ik_interpolate = 5 is = 3 omega2 = 2.6490e-07 - ik_interpolate = 5 is = 4 omega2 = 7.2868e-07 - ik_interpolate = 5 is = 5 omega2 = 7.2868e-07 - ik_interpolate = 5 is = 6 omega2 = 1.2260e-06 - - ik_interpolate = 6 is = 1 omega2 = 4.2839e-08 - ik_interpolate = 6 is = 2 omega2 = 4.2839e-08 - ik_interpolate = 6 is = 3 omega2 = 4.4508e-07 - ik_interpolate = 6 is = 4 omega2 = 4.7926e-07 - ik_interpolate = 6 is = 5 omega2 = 4.7926e-07 - ik_interpolate = 6 is = 6 omega2 = 8.5154e-07 - - ik_interpolate = 7 is = 1 omega2 = 1.5925e-07 - ik_interpolate = 7 is = 2 omega2 = 1.7787e-07 - ik_interpolate = 7 is = 3 omega2 = 2.8914e-07 - ik_interpolate = 7 is = 4 omega2 = 6.9344e-07 - ik_interpolate = 7 is = 5 omega2 = 7.6808e-07 - ik_interpolate = 7 is = 6 omega2 = 9.0934e-07 - - ik_interpolate = 8 is = 1 omega2 = 8.2233e-08 - ik_interpolate = 8 is = 2 omega2 = 2.7540e-07 - ik_interpolate = 8 is = 3 omega2 = 5.5617e-07 - ik_interpolate = 8 is = 4 omega2 = 5.7218e-07 - ik_interpolate = 8 is = 5 omega2 = 7.6172e-07 - ik_interpolate = 8 is = 6 omega2 = 9.0586e-07 - - ik_interpolate = 9 is = 1 omega2 = 2.9992e-07 - ik_interpolate = 9 is = 2 omega2 = 2.9992e-07 - ik_interpolate = 9 is = 3 omega2 = 6.9245e-07 - ik_interpolate = 9 is = 4 omega2 = 8.0197e-07 - ik_interpolate = 9 is = 5 omega2 = 8.0197e-07 - ik_interpolate = 9 is = 6 omega2 = 9.5716e-07 - - ik_interpolate = 10 is = 1 omega2 = 1.5925e-07 - ik_interpolate = 10 is = 2 omega2 = 1.7787e-07 - ik_interpolate = 10 is = 3 omega2 = 2.8914e-07 - ik_interpolate = 10 is = 4 omega2 = 6.9344e-07 - ik_interpolate = 10 is = 5 omega2 = 7.6808e-07 - ik_interpolate = 10 is = 6 omega2 = 9.0934e-07 - - ik_interpolate = 11 is = 1 omega2 = 5.6238e-08 - ik_interpolate = 11 is = 2 omega2 = 5.6238e-08 - ik_interpolate = 11 is = 3 omega2 = 1.0113e-07 - ik_interpolate = 11 is = 4 omega2 = 5.3851e-07 - ik_interpolate = 11 is = 5 omega2 = 5.3851e-07 - ik_interpolate = 11 is = 6 omega2 = 6.3044e-07 - - ik_interpolate = 12 is = 1 omega2 = 1.5925e-07 - ik_interpolate = 12 is = 2 omega2 = 1.7787e-07 - ik_interpolate = 12 is = 3 omega2 = 2.8914e-07 - ik_interpolate = 12 is = 4 omega2 = 6.9344e-07 - ik_interpolate = 12 is = 5 omega2 = 7.6808e-07 - ik_interpolate = 12 is = 6 omega2 = 9.0934e-07 - - ik_interpolate = 13 is = 1 omega2 = 1.3778e-07 - ik_interpolate = 13 is = 2 omega2 = 1.3778e-07 - ik_interpolate = 13 is = 3 omega2 = 2.6490e-07 - ik_interpolate = 13 is = 4 omega2 = 7.2868e-07 - ik_interpolate = 13 is = 5 omega2 = 7.2868e-07 - ik_interpolate = 13 is = 6 omega2 = 1.2260e-06 - - ik_interpolate = 14 is = 1 omega2 = 8.2233e-08 - ik_interpolate = 14 is = 2 omega2 = 2.7540e-07 - ik_interpolate = 14 is = 3 omega2 = 5.5617e-07 - ik_interpolate = 14 is = 4 omega2 = 5.7218e-07 - ik_interpolate = 14 is = 5 omega2 = 7.6172e-07 - ik_interpolate = 14 is = 6 omega2 = 9.0586e-07 - - ik_interpolate = 15 is = 1 omega2 = 1.5925e-07 - ik_interpolate = 15 is = 2 omega2 = 1.7787e-07 - ik_interpolate = 15 is = 3 omega2 = 2.8914e-07 - ik_interpolate = 15 is = 4 omega2 = 6.9344e-07 - ik_interpolate = 15 is = 5 omega2 = 7.6808e-07 - ik_interpolate = 15 is = 6 omega2 = 9.0934e-07 - - ik_interpolate = 16 is = 1 omega2 = 4.2839e-08 - ik_interpolate = 16 is = 2 omega2 = 4.2839e-08 - ik_interpolate = 16 is = 3 omega2 = 4.4508e-07 - ik_interpolate = 16 is = 4 omega2 = 4.7926e-07 - ik_interpolate = 16 is = 5 omega2 = 4.7926e-07 - ik_interpolate = 16 is = 6 omega2 = 8.5154e-07 - - ik_interpolate = 17 is = 1 omega2 = 1.3778e-07 - ik_interpolate = 17 is = 2 omega2 = 1.3778e-07 - ik_interpolate = 17 is = 3 omega2 = 2.6490e-07 - ik_interpolate = 17 is = 4 omega2 = 7.2868e-07 - ik_interpolate = 17 is = 5 omega2 = 7.2868e-07 - ik_interpolate = 17 is = 6 omega2 = 1.2260e-06 - - ik_interpolate = 18 is = 1 omega2 = 4.2839e-08 - ik_interpolate = 18 is = 2 omega2 = 4.2839e-08 - ik_interpolate = 18 is = 3 omega2 = 4.4508e-07 - ik_interpolate = 18 is = 4 omega2 = 4.7926e-07 - ik_interpolate = 18 is = 5 omega2 = 4.7926e-07 - ik_interpolate = 18 is = 6 omega2 = 8.5154e-07 - - ik_interpolate = 19 is = 1 omega2 = 1.5925e-07 - ik_interpolate = 19 is = 2 omega2 = 1.7787e-07 - ik_interpolate = 19 is = 3 omega2 = 2.8914e-07 - ik_interpolate = 19 is = 4 omega2 = 6.9344e-07 - ik_interpolate = 19 is = 5 omega2 = 7.6808e-07 - ik_interpolate = 19 is = 6 omega2 = 9.0934e-07 - - ik_interpolate = 20 is = 1 omega2 = 8.2233e-08 - ik_interpolate = 20 is = 2 omega2 = 2.7540e-07 - ik_interpolate = 20 is = 3 omega2 = 5.5617e-07 - ik_interpolate = 20 is = 4 omega2 = 5.7218e-07 - ik_interpolate = 20 is = 5 omega2 = 7.6172e-07 - ik_interpolate = 20 is = 6 omega2 = 9.0586e-07 - - ik_interpolate = 21 is = 1 omega2 = 4.2839e-08 - ik_interpolate = 21 is = 2 omega2 = 4.2839e-08 - ik_interpolate = 21 is = 3 omega2 = 4.4508e-07 - ik_interpolate = 21 is = 4 omega2 = 4.7926e-07 - ik_interpolate = 21 is = 5 omega2 = 4.7926e-07 - ik_interpolate = 21 is = 6 omega2 = 8.5154e-07 - - ik_interpolate = 22 is = 1 omega2 = 1.3778e-07 - ik_interpolate = 22 is = 2 omega2 = 1.3778e-07 - ik_interpolate = 22 is = 3 omega2 = 2.6490e-07 - ik_interpolate = 22 is = 4 omega2 = 7.2868e-07 - ik_interpolate = 22 is = 5 omega2 = 7.2868e-07 - ik_interpolate = 22 is = 6 omega2 = 1.2260e-06 - - ik_interpolate = 23 is = 1 omega2 = 8.2233e-08 - ik_interpolate = 23 is = 2 omega2 = 2.7540e-07 - ik_interpolate = 23 is = 3 omega2 = 5.5617e-07 - ik_interpolate = 23 is = 4 omega2 = 5.7218e-07 - ik_interpolate = 23 is = 5 omega2 = 7.6172e-07 - ik_interpolate = 23 is = 6 omega2 = 9.0586e-07 - - ik_interpolate = 24 is = 1 omega2 = 1.5925e-07 - ik_interpolate = 24 is = 2 omega2 = 1.7787e-07 - ik_interpolate = 24 is = 3 omega2 = 2.8914e-07 - ik_interpolate = 24 is = 4 omega2 = 6.9344e-07 - ik_interpolate = 24 is = 5 omega2 = 7.6808e-07 - ik_interpolate = 24 is = 6 omega2 = 9.0934e-07 - - ik_interpolate = 25 is = 1 omega2 = 1.5925e-07 - ik_interpolate = 25 is = 2 omega2 = 1.7787e-07 - ik_interpolate = 25 is = 3 omega2 = 2.8914e-07 - ik_interpolate = 25 is = 4 omega2 = 6.9344e-07 - ik_interpolate = 25 is = 5 omega2 = 7.6808e-07 - ik_interpolate = 25 is = 6 omega2 = 9.0934e-07 - - ik_interpolate = 26 is = 1 omega2 = 8.2233e-08 - ik_interpolate = 26 is = 2 omega2 = 2.7540e-07 - ik_interpolate = 26 is = 3 omega2 = 5.5617e-07 - ik_interpolate = 26 is = 4 omega2 = 5.7218e-07 - ik_interpolate = 26 is = 5 omega2 = 7.6172e-07 - ik_interpolate = 26 is = 6 omega2 = 9.0586e-07 - - ik_interpolate = 27 is = 1 omega2 = 1.5925e-07 - ik_interpolate = 27 is = 2 omega2 = 1.7787e-07 - ik_interpolate = 27 is = 3 omega2 = 2.8914e-07 - ik_interpolate = 27 is = 4 omega2 = 6.9344e-07 - ik_interpolate = 27 is = 5 omega2 = 7.6808e-07 - ik_interpolate = 27 is = 6 omega2 = 9.0934e-07 - - ik_interpolate = 28 is = 1 omega2 = 9.6295e-08 - ik_interpolate = 28 is = 2 omega2 = 9.6295e-08 - ik_interpolate = 28 is = 3 omega2 = 3.8743e-07 - ik_interpolate = 28 is = 4 omega2 = 6.0479e-07 - ik_interpolate = 28 is = 5 omega2 = 6.0479e-07 - ik_interpolate = 28 is = 6 omega2 = 8.1852e-07 - - ik_interpolate = 29 is = 1 omega2 = 8.2233e-08 - ik_interpolate = 29 is = 2 omega2 = 2.7540e-07 - ik_interpolate = 29 is = 3 omega2 = 5.5617e-07 - ik_interpolate = 29 is = 4 omega2 = 5.7218e-07 - ik_interpolate = 29 is = 5 omega2 = 7.6172e-07 - ik_interpolate = 29 is = 6 omega2 = 9.0586e-07 - - ik_interpolate = 30 is = 1 omega2 = 1.5925e-07 - ik_interpolate = 30 is = 2 omega2 = 1.7787e-07 - ik_interpolate = 30 is = 3 omega2 = 2.8914e-07 - ik_interpolate = 30 is = 4 omega2 = 6.9344e-07 - ik_interpolate = 30 is = 5 omega2 = 7.6808e-07 - ik_interpolate = 30 is = 6 omega2 = 9.0934e-07 - - ik_interpolate = 31 is = 1 omega2 = 9.6295e-08 - ik_interpolate = 31 is = 2 omega2 = 9.6295e-08 - ik_interpolate = 31 is = 3 omega2 = 3.8743e-07 - ik_interpolate = 31 is = 4 omega2 = 6.0479e-07 - ik_interpolate = 31 is = 5 omega2 = 6.0479e-07 - ik_interpolate = 31 is = 6 omega2 = 8.1852e-07 - - ik_interpolate = 32 is = 1 omega2 = 1.5925e-07 - ik_interpolate = 32 is = 2 omega2 = 1.7787e-07 - ik_interpolate = 32 is = 3 omega2 = 2.8914e-07 - ik_interpolate = 32 is = 4 omega2 = 6.9344e-07 - ik_interpolate = 32 is = 5 omega2 = 7.6808e-07 - ik_interpolate = 32 is = 6 omega2 = 9.0934e-07 - - ik_interpolate = 33 is = 1 omega2 = 2.9992e-07 - ik_interpolate = 33 is = 2 omega2 = 2.9992e-07 - ik_interpolate = 33 is = 3 omega2 = 6.9245e-07 - ik_interpolate = 33 is = 4 omega2 = 8.0197e-07 - ik_interpolate = 33 is = 5 omega2 = 8.0197e-07 - ik_interpolate = 33 is = 6 omega2 = 9.5716e-07 - - ik_interpolate = 34 is = 1 omega2 = 1.5925e-07 - ik_interpolate = 34 is = 2 omega2 = 1.7787e-07 - ik_interpolate = 34 is = 3 omega2 = 2.8914e-07 - ik_interpolate = 34 is = 4 omega2 = 6.9344e-07 - ik_interpolate = 34 is = 5 omega2 = 7.6808e-07 - ik_interpolate = 34 is = 6 omega2 = 9.0934e-07 - - ik_interpolate = 35 is = 1 omega2 = 5.6238e-08 - ik_interpolate = 35 is = 2 omega2 = 5.6238e-08 - ik_interpolate = 35 is = 3 omega2 = 1.0113e-07 - ik_interpolate = 35 is = 4 omega2 = 5.3851e-07 - ik_interpolate = 35 is = 5 omega2 = 5.3851e-07 - ik_interpolate = 35 is = 6 omega2 = 6.3044e-07 - - ik_interpolate = 36 is = 1 omega2 = 1.5925e-07 - ik_interpolate = 36 is = 2 omega2 = 1.7787e-07 - ik_interpolate = 36 is = 3 omega2 = 2.8914e-07 - ik_interpolate = 36 is = 4 omega2 = 6.9344e-07 - ik_interpolate = 36 is = 5 omega2 = 7.6808e-07 - ik_interpolate = 36 is = 6 omega2 = 9.0934e-07 - - ik_interpolate = 37 is = 1 omega2 = 1.5925e-07 - ik_interpolate = 37 is = 2 omega2 = 1.7787e-07 - ik_interpolate = 37 is = 3 omega2 = 2.8914e-07 - ik_interpolate = 37 is = 4 omega2 = 6.9344e-07 - ik_interpolate = 37 is = 5 omega2 = 7.6808e-07 - ik_interpolate = 37 is = 6 omega2 = 9.0934e-07 - - ik_interpolate = 38 is = 1 omega2 = 8.2233e-08 - ik_interpolate = 38 is = 2 omega2 = 2.7540e-07 - ik_interpolate = 38 is = 3 omega2 = 5.5617e-07 - ik_interpolate = 38 is = 4 omega2 = 5.7218e-07 - ik_interpolate = 38 is = 5 omega2 = 7.6172e-07 - ik_interpolate = 38 is = 6 omega2 = 9.0586e-07 - - ik_interpolate = 39 is = 1 omega2 = 1.5925e-07 - ik_interpolate = 39 is = 2 omega2 = 1.7787e-07 - ik_interpolate = 39 is = 3 omega2 = 2.8914e-07 - ik_interpolate = 39 is = 4 omega2 = 6.9344e-07 - ik_interpolate = 39 is = 5 omega2 = 7.6808e-07 - ik_interpolate = 39 is = 6 omega2 = 9.0934e-07 - - ik_interpolate = 40 is = 1 omega2 = 9.6295e-08 - ik_interpolate = 40 is = 2 omega2 = 9.6295e-08 - ik_interpolate = 40 is = 3 omega2 = 3.8743e-07 - ik_interpolate = 40 is = 4 omega2 = 6.0479e-07 - ik_interpolate = 40 is = 5 omega2 = 6.0479e-07 - ik_interpolate = 40 is = 6 omega2 = 8.1852e-07 - - ik_interpolate = 41 is = 1 omega2 = 5.6238e-08 - ik_interpolate = 41 is = 2 omega2 = 5.6238e-08 - ik_interpolate = 41 is = 3 omega2 = 1.0113e-07 - ik_interpolate = 41 is = 4 omega2 = 5.3851e-07 - ik_interpolate = 41 is = 5 omega2 = 5.3851e-07 - ik_interpolate = 41 is = 6 omega2 = 6.3044e-07 - - ik_interpolate = 42 is = 1 omega2 = 1.5925e-07 - ik_interpolate = 42 is = 2 omega2 = 1.7787e-07 - ik_interpolate = 42 is = 3 omega2 = 2.8914e-07 - ik_interpolate = 42 is = 4 omega2 = 6.9344e-07 - ik_interpolate = 42 is = 5 omega2 = 7.6808e-07 - ik_interpolate = 42 is = 6 omega2 = 9.0934e-07 - - ik_interpolate = 43 is = 1 omega2 = 2.9992e-07 - ik_interpolate = 43 is = 2 omega2 = 2.9992e-07 - ik_interpolate = 43 is = 3 omega2 = 6.9245e-07 - ik_interpolate = 43 is = 4 omega2 = 8.0197e-07 - ik_interpolate = 43 is = 5 omega2 = 8.0197e-07 - ik_interpolate = 43 is = 6 omega2 = 9.5716e-07 - - ik_interpolate = 44 is = 1 omega2 = 1.5925e-07 - ik_interpolate = 44 is = 2 omega2 = 1.7787e-07 - ik_interpolate = 44 is = 3 omega2 = 2.8914e-07 - ik_interpolate = 44 is = 4 omega2 = 6.9344e-07 - ik_interpolate = 44 is = 5 omega2 = 7.6808e-07 - ik_interpolate = 44 is = 6 omega2 = 9.0934e-07 - - ik_interpolate = 45 is = 1 omega2 = 1.5925e-07 - ik_interpolate = 45 is = 2 omega2 = 1.7787e-07 - ik_interpolate = 45 is = 3 omega2 = 2.8914e-07 - ik_interpolate = 45 is = 4 omega2 = 6.9344e-07 - ik_interpolate = 45 is = 5 omega2 = 7.6808e-07 - ik_interpolate = 45 is = 6 omega2 = 9.0934e-07 - - ik_interpolate = 46 is = 1 omega2 = 9.6295e-08 - ik_interpolate = 46 is = 2 omega2 = 9.6295e-08 - ik_interpolate = 46 is = 3 omega2 = 3.8743e-07 - ik_interpolate = 46 is = 4 omega2 = 6.0479e-07 - ik_interpolate = 46 is = 5 omega2 = 6.0479e-07 - ik_interpolate = 46 is = 6 omega2 = 8.1852e-07 - - ik_interpolate = 47 is = 1 omega2 = 1.5925e-07 - ik_interpolate = 47 is = 2 omega2 = 1.7787e-07 - ik_interpolate = 47 is = 3 omega2 = 2.8914e-07 - ik_interpolate = 47 is = 4 omega2 = 6.9344e-07 - ik_interpolate = 47 is = 5 omega2 = 7.6808e-07 - ik_interpolate = 47 is = 6 omega2 = 9.0934e-07 - - ik_interpolate = 48 is = 1 omega2 = 8.2233e-08 - ik_interpolate = 48 is = 2 omega2 = 2.7540e-07 - ik_interpolate = 48 is = 3 omega2 = 5.5617e-07 - ik_interpolate = 48 is = 4 omega2 = 5.7218e-07 - ik_interpolate = 48 is = 5 omega2 = 7.6172e-07 - ik_interpolate = 48 is = 6 omega2 = 9.0586e-07 - - ik_interpolate = 49 is = 1 omega2 = 1.3778e-07 - ik_interpolate = 49 is = 2 omega2 = 1.3778e-07 - ik_interpolate = 49 is = 3 omega2 = 2.6490e-07 - ik_interpolate = 49 is = 4 omega2 = 7.2868e-07 - ik_interpolate = 49 is = 5 omega2 = 7.2868e-07 - ik_interpolate = 49 is = 6 omega2 = 1.2260e-06 - - ik_interpolate = 50 is = 1 omega2 = 8.2233e-08 - ik_interpolate = 50 is = 2 omega2 = 2.7540e-07 - ik_interpolate = 50 is = 3 omega2 = 5.5617e-07 - ik_interpolate = 50 is = 4 omega2 = 5.7218e-07 - ik_interpolate = 50 is = 5 omega2 = 7.6172e-07 - ik_interpolate = 50 is = 6 omega2 = 9.0586e-07 - - ik_interpolate = 51 is = 1 omega2 = 1.5925e-07 - ik_interpolate = 51 is = 2 omega2 = 1.7787e-07 - ik_interpolate = 51 is = 3 omega2 = 2.8914e-07 - ik_interpolate = 51 is = 4 omega2 = 6.9344e-07 - ik_interpolate = 51 is = 5 omega2 = 7.6808e-07 - ik_interpolate = 51 is = 6 omega2 = 9.0934e-07 - - ik_interpolate = 52 is = 1 omega2 = 4.2839e-08 - ik_interpolate = 52 is = 2 omega2 = 4.2839e-08 - ik_interpolate = 52 is = 3 omega2 = 4.4508e-07 - ik_interpolate = 52 is = 4 omega2 = 4.7926e-07 - ik_interpolate = 52 is = 5 omega2 = 4.7926e-07 - ik_interpolate = 52 is = 6 omega2 = 8.5154e-07 - - ik_interpolate = 53 is = 1 omega2 = 8.2233e-08 - ik_interpolate = 53 is = 2 omega2 = 2.7540e-07 - ik_interpolate = 53 is = 3 omega2 = 5.5617e-07 - ik_interpolate = 53 is = 4 omega2 = 5.7218e-07 - ik_interpolate = 53 is = 5 omega2 = 7.6172e-07 - ik_interpolate = 53 is = 6 omega2 = 9.0586e-07 - - ik_interpolate = 54 is = 1 omega2 = 1.5925e-07 - ik_interpolate = 54 is = 2 omega2 = 1.7787e-07 - ik_interpolate = 54 is = 3 omega2 = 2.8914e-07 - ik_interpolate = 54 is = 4 omega2 = 6.9344e-07 - ik_interpolate = 54 is = 5 omega2 = 7.6808e-07 - ik_interpolate = 54 is = 6 omega2 = 9.0934e-07 - - ik_interpolate = 55 is = 1 omega2 = 9.6295e-08 - ik_interpolate = 55 is = 2 omega2 = 9.6295e-08 - ik_interpolate = 55 is = 3 omega2 = 3.8743e-07 - ik_interpolate = 55 is = 4 omega2 = 6.0479e-07 - ik_interpolate = 55 is = 5 omega2 = 6.0479e-07 - ik_interpolate = 55 is = 6 omega2 = 8.1852e-07 - - ik_interpolate = 56 is = 1 omega2 = 1.5925e-07 - ik_interpolate = 56 is = 2 omega2 = 1.7787e-07 - ik_interpolate = 56 is = 3 omega2 = 2.8914e-07 - ik_interpolate = 56 is = 4 omega2 = 6.9344e-07 - ik_interpolate = 56 is = 5 omega2 = 7.6808e-07 - ik_interpolate = 56 is = 6 omega2 = 9.0934e-07 - - ik_interpolate = 57 is = 1 omega2 = 1.5925e-07 - ik_interpolate = 57 is = 2 omega2 = 1.7787e-07 - ik_interpolate = 57 is = 3 omega2 = 2.8914e-07 - ik_interpolate = 57 is = 4 omega2 = 6.9344e-07 - ik_interpolate = 57 is = 5 omega2 = 7.6808e-07 - ik_interpolate = 57 is = 6 omega2 = 9.0934e-07 - - ik_interpolate = 58 is = 1 omega2 = 9.6295e-08 - ik_interpolate = 58 is = 2 omega2 = 9.6295e-08 - ik_interpolate = 58 is = 3 omega2 = 3.8743e-07 - ik_interpolate = 58 is = 4 omega2 = 6.0479e-07 - ik_interpolate = 58 is = 5 omega2 = 6.0479e-07 - ik_interpolate = 58 is = 6 omega2 = 8.1852e-07 - - ik_interpolate = 59 is = 1 omega2 = 1.5925e-07 - ik_interpolate = 59 is = 2 omega2 = 1.7787e-07 - ik_interpolate = 59 is = 3 omega2 = 2.8914e-07 - ik_interpolate = 59 is = 4 omega2 = 6.9344e-07 - ik_interpolate = 59 is = 5 omega2 = 7.6808e-07 - ik_interpolate = 59 is = 6 omega2 = 9.0934e-07 - - ik_interpolate = 60 is = 1 omega2 = 8.2233e-08 - ik_interpolate = 60 is = 2 omega2 = 2.7540e-07 - ik_interpolate = 60 is = 3 omega2 = 5.5617e-07 - ik_interpolate = 60 is = 4 omega2 = 5.7218e-07 - ik_interpolate = 60 is = 5 omega2 = 7.6172e-07 - ik_interpolate = 60 is = 6 omega2 = 9.0586e-07 - - ik_interpolate = 61 is = 1 omega2 = 4.2839e-08 - ik_interpolate = 61 is = 2 omega2 = 4.2839e-08 - ik_interpolate = 61 is = 3 omega2 = 4.4508e-07 - ik_interpolate = 61 is = 4 omega2 = 4.7926e-07 - ik_interpolate = 61 is = 5 omega2 = 4.7926e-07 - ik_interpolate = 61 is = 6 omega2 = 8.5154e-07 - - ik_interpolate = 62 is = 1 omega2 = 1.5925e-07 - ik_interpolate = 62 is = 2 omega2 = 1.7787e-07 - ik_interpolate = 62 is = 3 omega2 = 2.8914e-07 - ik_interpolate = 62 is = 4 omega2 = 6.9344e-07 - ik_interpolate = 62 is = 5 omega2 = 7.6808e-07 - ik_interpolate = 62 is = 6 omega2 = 9.0934e-07 - - ik_interpolate = 63 is = 1 omega2 = 8.2233e-08 - ik_interpolate = 63 is = 2 omega2 = 2.7540e-07 - ik_interpolate = 63 is = 3 omega2 = 5.5617e-07 - ik_interpolate = 63 is = 4 omega2 = 5.7218e-07 - ik_interpolate = 63 is = 5 omega2 = 7.6172e-07 - ik_interpolate = 63 is = 6 omega2 = 9.0586e-07 - - ik_interpolate = 64 is = 1 omega2 = 1.3778e-07 - ik_interpolate = 64 is = 2 omega2 = 1.3778e-07 - ik_interpolate = 64 is = 3 omega2 = 2.6490e-07 - ik_interpolate = 64 is = 4 omega2 = 7.2868e-07 - ik_interpolate = 64 is = 5 omega2 = 7.2868e-07 - ik_interpolate = 64 is = 6 omega2 = 1.2260e-06 + ik_interpolate = 1 is = 1 omega2 = 6.6174e-23 + ik_interpolate = 1 is = 2 omega2 = 1.0588e-22 + ik_interpolate = 1 is = 3 omega2 = 1.0588e-22 + ik_interpolate = 1 is = 4 omega2 = 2.6742e-07 + ik_interpolate = 1 is = 5 omega2 = 2.6742e-07 + ik_interpolate = 1 is = 6 omega2 = 2.6742e-07 + + ik_interpolate = 2 is = 1 omega2 = 1.3781e-07 + ik_interpolate = 2 is = 2 omega2 = 1.3781e-07 + ik_interpolate = 2 is = 3 omega2 = 2.6492e-07 + ik_interpolate = 2 is = 4 omega2 = 7.2883e-07 + ik_interpolate = 2 is = 5 omega2 = 7.2883e-07 + ik_interpolate = 2 is = 6 omega2 = 1.2262e-06 + + ik_interpolate = 3 is = 1 omega2 = 2.9998e-07 + ik_interpolate = 3 is = 2 omega2 = 2.9998e-07 + ik_interpolate = 3 is = 3 omega2 = 6.9249e-07 + ik_interpolate = 3 is = 4 omega2 = 8.0204e-07 + ik_interpolate = 3 is = 5 omega2 = 8.0204e-07 + ik_interpolate = 3 is = 6 omega2 = 9.5724e-07 + + ik_interpolate = 4 is = 1 omega2 = 1.3781e-07 + ik_interpolate = 4 is = 2 omega2 = 1.3781e-07 + ik_interpolate = 4 is = 3 omega2 = 2.6492e-07 + ik_interpolate = 4 is = 4 omega2 = 7.2883e-07 + ik_interpolate = 4 is = 5 omega2 = 7.2883e-07 + ik_interpolate = 4 is = 6 omega2 = 1.2262e-06 + + ik_interpolate = 5 is = 1 omega2 = 1.3781e-07 + ik_interpolate = 5 is = 2 omega2 = 1.3781e-07 + ik_interpolate = 5 is = 3 omega2 = 2.6492e-07 + ik_interpolate = 5 is = 4 omega2 = 7.2883e-07 + ik_interpolate = 5 is = 5 omega2 = 7.2883e-07 + ik_interpolate = 5 is = 6 omega2 = 1.2262e-06 + + ik_interpolate = 6 is = 1 omega2 = 4.2842e-08 + ik_interpolate = 6 is = 2 omega2 = 4.2842e-08 + ik_interpolate = 6 is = 3 omega2 = 4.4514e-07 + ik_interpolate = 6 is = 4 omega2 = 4.7947e-07 + ik_interpolate = 6 is = 5 omega2 = 4.7947e-07 + ik_interpolate = 6 is = 6 omega2 = 8.5160e-07 + + ik_interpolate = 7 is = 1 omega2 = 1.5927e-07 + ik_interpolate = 7 is = 2 omega2 = 1.7790e-07 + ik_interpolate = 7 is = 3 omega2 = 2.8915e-07 + ik_interpolate = 7 is = 4 omega2 = 6.9358e-07 + ik_interpolate = 7 is = 5 omega2 = 7.6822e-07 + ik_interpolate = 7 is = 6 omega2 = 9.0949e-07 + + ik_interpolate = 8 is = 1 omega2 = 8.2232e-08 + ik_interpolate = 8 is = 2 omega2 = 2.7546e-07 + ik_interpolate = 8 is = 3 omega2 = 5.5622e-07 + ik_interpolate = 8 is = 4 omega2 = 5.7237e-07 + ik_interpolate = 8 is = 5 omega2 = 7.6179e-07 + ik_interpolate = 8 is = 6 omega2 = 9.0594e-07 + + ik_interpolate = 9 is = 1 omega2 = 2.9998e-07 + ik_interpolate = 9 is = 2 omega2 = 2.9998e-07 + ik_interpolate = 9 is = 3 omega2 = 6.9249e-07 + ik_interpolate = 9 is = 4 omega2 = 8.0204e-07 + ik_interpolate = 9 is = 5 omega2 = 8.0204e-07 + ik_interpolate = 9 is = 6 omega2 = 9.5724e-07 + + ik_interpolate = 10 is = 1 omega2 = 1.5927e-07 + ik_interpolate = 10 is = 2 omega2 = 1.7790e-07 + ik_interpolate = 10 is = 3 omega2 = 2.8915e-07 + ik_interpolate = 10 is = 4 omega2 = 6.9358e-07 + ik_interpolate = 10 is = 5 omega2 = 7.6822e-07 + ik_interpolate = 10 is = 6 omega2 = 9.0949e-07 + + ik_interpolate = 11 is = 1 omega2 = 5.6249e-08 + ik_interpolate = 11 is = 2 omega2 = 5.6249e-08 + ik_interpolate = 11 is = 3 omega2 = 1.0114e-07 + ik_interpolate = 11 is = 4 omega2 = 5.3871e-07 + ik_interpolate = 11 is = 5 omega2 = 5.3871e-07 + ik_interpolate = 11 is = 6 omega2 = 6.3063e-07 + + ik_interpolate = 12 is = 1 omega2 = 1.5927e-07 + ik_interpolate = 12 is = 2 omega2 = 1.7790e-07 + ik_interpolate = 12 is = 3 omega2 = 2.8915e-07 + ik_interpolate = 12 is = 4 omega2 = 6.9358e-07 + ik_interpolate = 12 is = 5 omega2 = 7.6822e-07 + ik_interpolate = 12 is = 6 omega2 = 9.0949e-07 + + ik_interpolate = 13 is = 1 omega2 = 1.3781e-07 + ik_interpolate = 13 is = 2 omega2 = 1.3781e-07 + ik_interpolate = 13 is = 3 omega2 = 2.6492e-07 + ik_interpolate = 13 is = 4 omega2 = 7.2883e-07 + ik_interpolate = 13 is = 5 omega2 = 7.2883e-07 + ik_interpolate = 13 is = 6 omega2 = 1.2262e-06 + + ik_interpolate = 14 is = 1 omega2 = 8.2232e-08 + ik_interpolate = 14 is = 2 omega2 = 2.7546e-07 + ik_interpolate = 14 is = 3 omega2 = 5.5622e-07 + ik_interpolate = 14 is = 4 omega2 = 5.7237e-07 + ik_interpolate = 14 is = 5 omega2 = 7.6179e-07 + ik_interpolate = 14 is = 6 omega2 = 9.0594e-07 + + ik_interpolate = 15 is = 1 omega2 = 1.5927e-07 + ik_interpolate = 15 is = 2 omega2 = 1.7790e-07 + ik_interpolate = 15 is = 3 omega2 = 2.8915e-07 + ik_interpolate = 15 is = 4 omega2 = 6.9358e-07 + ik_interpolate = 15 is = 5 omega2 = 7.6822e-07 + ik_interpolate = 15 is = 6 omega2 = 9.0949e-07 + + ik_interpolate = 16 is = 1 omega2 = 4.2842e-08 + ik_interpolate = 16 is = 2 omega2 = 4.2842e-08 + ik_interpolate = 16 is = 3 omega2 = 4.4514e-07 + ik_interpolate = 16 is = 4 omega2 = 4.7947e-07 + ik_interpolate = 16 is = 5 omega2 = 4.7947e-07 + ik_interpolate = 16 is = 6 omega2 = 8.5160e-07 + + ik_interpolate = 17 is = 1 omega2 = 1.3781e-07 + ik_interpolate = 17 is = 2 omega2 = 1.3781e-07 + ik_interpolate = 17 is = 3 omega2 = 2.6492e-07 + ik_interpolate = 17 is = 4 omega2 = 7.2883e-07 + ik_interpolate = 17 is = 5 omega2 = 7.2883e-07 + ik_interpolate = 17 is = 6 omega2 = 1.2262e-06 + + ik_interpolate = 18 is = 1 omega2 = 4.2842e-08 + ik_interpolate = 18 is = 2 omega2 = 4.2842e-08 + ik_interpolate = 18 is = 3 omega2 = 4.4514e-07 + ik_interpolate = 18 is = 4 omega2 = 4.7947e-07 + ik_interpolate = 18 is = 5 omega2 = 4.7947e-07 + ik_interpolate = 18 is = 6 omega2 = 8.5160e-07 + + ik_interpolate = 19 is = 1 omega2 = 1.5927e-07 + ik_interpolate = 19 is = 2 omega2 = 1.7790e-07 + ik_interpolate = 19 is = 3 omega2 = 2.8915e-07 + ik_interpolate = 19 is = 4 omega2 = 6.9358e-07 + ik_interpolate = 19 is = 5 omega2 = 7.6822e-07 + ik_interpolate = 19 is = 6 omega2 = 9.0949e-07 + + ik_interpolate = 20 is = 1 omega2 = 8.2232e-08 + ik_interpolate = 20 is = 2 omega2 = 2.7546e-07 + ik_interpolate = 20 is = 3 omega2 = 5.5622e-07 + ik_interpolate = 20 is = 4 omega2 = 5.7237e-07 + ik_interpolate = 20 is = 5 omega2 = 7.6179e-07 + ik_interpolate = 20 is = 6 omega2 = 9.0594e-07 + + ik_interpolate = 21 is = 1 omega2 = 4.2842e-08 + ik_interpolate = 21 is = 2 omega2 = 4.2842e-08 + ik_interpolate = 21 is = 3 omega2 = 4.4514e-07 + ik_interpolate = 21 is = 4 omega2 = 4.7947e-07 + ik_interpolate = 21 is = 5 omega2 = 4.7947e-07 + ik_interpolate = 21 is = 6 omega2 = 8.5160e-07 + + ik_interpolate = 22 is = 1 omega2 = 1.3781e-07 + ik_interpolate = 22 is = 2 omega2 = 1.3781e-07 + ik_interpolate = 22 is = 3 omega2 = 2.6492e-07 + ik_interpolate = 22 is = 4 omega2 = 7.2883e-07 + ik_interpolate = 22 is = 5 omega2 = 7.2883e-07 + ik_interpolate = 22 is = 6 omega2 = 1.2262e-06 + + ik_interpolate = 23 is = 1 omega2 = 8.2232e-08 + ik_interpolate = 23 is = 2 omega2 = 2.7546e-07 + ik_interpolate = 23 is = 3 omega2 = 5.5622e-07 + ik_interpolate = 23 is = 4 omega2 = 5.7237e-07 + ik_interpolate = 23 is = 5 omega2 = 7.6179e-07 + ik_interpolate = 23 is = 6 omega2 = 9.0594e-07 + + ik_interpolate = 24 is = 1 omega2 = 1.5927e-07 + ik_interpolate = 24 is = 2 omega2 = 1.7790e-07 + ik_interpolate = 24 is = 3 omega2 = 2.8915e-07 + ik_interpolate = 24 is = 4 omega2 = 6.9358e-07 + ik_interpolate = 24 is = 5 omega2 = 7.6822e-07 + ik_interpolate = 24 is = 6 omega2 = 9.0949e-07 + + ik_interpolate = 25 is = 1 omega2 = 1.5927e-07 + ik_interpolate = 25 is = 2 omega2 = 1.7790e-07 + ik_interpolate = 25 is = 3 omega2 = 2.8915e-07 + ik_interpolate = 25 is = 4 omega2 = 6.9358e-07 + ik_interpolate = 25 is = 5 omega2 = 7.6822e-07 + ik_interpolate = 25 is = 6 omega2 = 9.0949e-07 + + ik_interpolate = 26 is = 1 omega2 = 8.2232e-08 + ik_interpolate = 26 is = 2 omega2 = 2.7546e-07 + ik_interpolate = 26 is = 3 omega2 = 5.5622e-07 + ik_interpolate = 26 is = 4 omega2 = 5.7237e-07 + ik_interpolate = 26 is = 5 omega2 = 7.6179e-07 + ik_interpolate = 26 is = 6 omega2 = 9.0594e-07 + + ik_interpolate = 27 is = 1 omega2 = 1.5927e-07 + ik_interpolate = 27 is = 2 omega2 = 1.7790e-07 + ik_interpolate = 27 is = 3 omega2 = 2.8915e-07 + ik_interpolate = 27 is = 4 omega2 = 6.9358e-07 + ik_interpolate = 27 is = 5 omega2 = 7.6822e-07 + ik_interpolate = 27 is = 6 omega2 = 9.0949e-07 + + ik_interpolate = 28 is = 1 omega2 = 9.6302e-08 + ik_interpolate = 28 is = 2 omega2 = 9.6302e-08 + ik_interpolate = 28 is = 3 omega2 = 3.8749e-07 + ik_interpolate = 28 is = 4 omega2 = 6.0499e-07 + ik_interpolate = 28 is = 5 omega2 = 6.0499e-07 + ik_interpolate = 28 is = 6 omega2 = 8.1860e-07 + + ik_interpolate = 29 is = 1 omega2 = 8.2232e-08 + ik_interpolate = 29 is = 2 omega2 = 2.7546e-07 + ik_interpolate = 29 is = 3 omega2 = 5.5622e-07 + ik_interpolate = 29 is = 4 omega2 = 5.7237e-07 + ik_interpolate = 29 is = 5 omega2 = 7.6179e-07 + ik_interpolate = 29 is = 6 omega2 = 9.0594e-07 + + ik_interpolate = 30 is = 1 omega2 = 1.5927e-07 + ik_interpolate = 30 is = 2 omega2 = 1.7790e-07 + ik_interpolate = 30 is = 3 omega2 = 2.8915e-07 + ik_interpolate = 30 is = 4 omega2 = 6.9358e-07 + ik_interpolate = 30 is = 5 omega2 = 7.6822e-07 + ik_interpolate = 30 is = 6 omega2 = 9.0949e-07 + + ik_interpolate = 31 is = 1 omega2 = 9.6302e-08 + ik_interpolate = 31 is = 2 omega2 = 9.6302e-08 + ik_interpolate = 31 is = 3 omega2 = 3.8749e-07 + ik_interpolate = 31 is = 4 omega2 = 6.0499e-07 + ik_interpolate = 31 is = 5 omega2 = 6.0499e-07 + ik_interpolate = 31 is = 6 omega2 = 8.1860e-07 + + ik_interpolate = 32 is = 1 omega2 = 1.5927e-07 + ik_interpolate = 32 is = 2 omega2 = 1.7790e-07 + ik_interpolate = 32 is = 3 omega2 = 2.8915e-07 + ik_interpolate = 32 is = 4 omega2 = 6.9358e-07 + ik_interpolate = 32 is = 5 omega2 = 7.6822e-07 + ik_interpolate = 32 is = 6 omega2 = 9.0949e-07 + + ik_interpolate = 33 is = 1 omega2 = 2.9998e-07 + ik_interpolate = 33 is = 2 omega2 = 2.9998e-07 + ik_interpolate = 33 is = 3 omega2 = 6.9249e-07 + ik_interpolate = 33 is = 4 omega2 = 8.0204e-07 + ik_interpolate = 33 is = 5 omega2 = 8.0204e-07 + ik_interpolate = 33 is = 6 omega2 = 9.5724e-07 + + ik_interpolate = 34 is = 1 omega2 = 1.5927e-07 + ik_interpolate = 34 is = 2 omega2 = 1.7790e-07 + ik_interpolate = 34 is = 3 omega2 = 2.8915e-07 + ik_interpolate = 34 is = 4 omega2 = 6.9358e-07 + ik_interpolate = 34 is = 5 omega2 = 7.6822e-07 + ik_interpolate = 34 is = 6 omega2 = 9.0949e-07 + + ik_interpolate = 35 is = 1 omega2 = 5.6249e-08 + ik_interpolate = 35 is = 2 omega2 = 5.6249e-08 + ik_interpolate = 35 is = 3 omega2 = 1.0114e-07 + ik_interpolate = 35 is = 4 omega2 = 5.3871e-07 + ik_interpolate = 35 is = 5 omega2 = 5.3871e-07 + ik_interpolate = 35 is = 6 omega2 = 6.3063e-07 + + ik_interpolate = 36 is = 1 omega2 = 1.5927e-07 + ik_interpolate = 36 is = 2 omega2 = 1.7790e-07 + ik_interpolate = 36 is = 3 omega2 = 2.8915e-07 + ik_interpolate = 36 is = 4 omega2 = 6.9358e-07 + ik_interpolate = 36 is = 5 omega2 = 7.6822e-07 + ik_interpolate = 36 is = 6 omega2 = 9.0949e-07 + + ik_interpolate = 37 is = 1 omega2 = 1.5927e-07 + ik_interpolate = 37 is = 2 omega2 = 1.7790e-07 + ik_interpolate = 37 is = 3 omega2 = 2.8915e-07 + ik_interpolate = 37 is = 4 omega2 = 6.9358e-07 + ik_interpolate = 37 is = 5 omega2 = 7.6822e-07 + ik_interpolate = 37 is = 6 omega2 = 9.0949e-07 + + ik_interpolate = 38 is = 1 omega2 = 8.2232e-08 + ik_interpolate = 38 is = 2 omega2 = 2.7546e-07 + ik_interpolate = 38 is = 3 omega2 = 5.5622e-07 + ik_interpolate = 38 is = 4 omega2 = 5.7237e-07 + ik_interpolate = 38 is = 5 omega2 = 7.6179e-07 + ik_interpolate = 38 is = 6 omega2 = 9.0594e-07 + + ik_interpolate = 39 is = 1 omega2 = 1.5927e-07 + ik_interpolate = 39 is = 2 omega2 = 1.7790e-07 + ik_interpolate = 39 is = 3 omega2 = 2.8915e-07 + ik_interpolate = 39 is = 4 omega2 = 6.9358e-07 + ik_interpolate = 39 is = 5 omega2 = 7.6822e-07 + ik_interpolate = 39 is = 6 omega2 = 9.0949e-07 + + ik_interpolate = 40 is = 1 omega2 = 9.6302e-08 + ik_interpolate = 40 is = 2 omega2 = 9.6302e-08 + ik_interpolate = 40 is = 3 omega2 = 3.8749e-07 + ik_interpolate = 40 is = 4 omega2 = 6.0499e-07 + ik_interpolate = 40 is = 5 omega2 = 6.0499e-07 + ik_interpolate = 40 is = 6 omega2 = 8.1860e-07 + + ik_interpolate = 41 is = 1 omega2 = 5.6249e-08 + ik_interpolate = 41 is = 2 omega2 = 5.6249e-08 + ik_interpolate = 41 is = 3 omega2 = 1.0114e-07 + ik_interpolate = 41 is = 4 omega2 = 5.3871e-07 + ik_interpolate = 41 is = 5 omega2 = 5.3871e-07 + ik_interpolate = 41 is = 6 omega2 = 6.3063e-07 + + ik_interpolate = 42 is = 1 omega2 = 1.5927e-07 + ik_interpolate = 42 is = 2 omega2 = 1.7790e-07 + ik_interpolate = 42 is = 3 omega2 = 2.8915e-07 + ik_interpolate = 42 is = 4 omega2 = 6.9358e-07 + ik_interpolate = 42 is = 5 omega2 = 7.6822e-07 + ik_interpolate = 42 is = 6 omega2 = 9.0949e-07 + + ik_interpolate = 43 is = 1 omega2 = 2.9998e-07 + ik_interpolate = 43 is = 2 omega2 = 2.9998e-07 + ik_interpolate = 43 is = 3 omega2 = 6.9249e-07 + ik_interpolate = 43 is = 4 omega2 = 8.0204e-07 + ik_interpolate = 43 is = 5 omega2 = 8.0204e-07 + ik_interpolate = 43 is = 6 omega2 = 9.5724e-07 + + ik_interpolate = 44 is = 1 omega2 = 1.5927e-07 + ik_interpolate = 44 is = 2 omega2 = 1.7790e-07 + ik_interpolate = 44 is = 3 omega2 = 2.8915e-07 + ik_interpolate = 44 is = 4 omega2 = 6.9358e-07 + ik_interpolate = 44 is = 5 omega2 = 7.6822e-07 + ik_interpolate = 44 is = 6 omega2 = 9.0949e-07 + + ik_interpolate = 45 is = 1 omega2 = 1.5927e-07 + ik_interpolate = 45 is = 2 omega2 = 1.7790e-07 + ik_interpolate = 45 is = 3 omega2 = 2.8915e-07 + ik_interpolate = 45 is = 4 omega2 = 6.9358e-07 + ik_interpolate = 45 is = 5 omega2 = 7.6822e-07 + ik_interpolate = 45 is = 6 omega2 = 9.0949e-07 + + ik_interpolate = 46 is = 1 omega2 = 9.6302e-08 + ik_interpolate = 46 is = 2 omega2 = 9.6302e-08 + ik_interpolate = 46 is = 3 omega2 = 3.8749e-07 + ik_interpolate = 46 is = 4 omega2 = 6.0499e-07 + ik_interpolate = 46 is = 5 omega2 = 6.0499e-07 + ik_interpolate = 46 is = 6 omega2 = 8.1860e-07 + + ik_interpolate = 47 is = 1 omega2 = 1.5927e-07 + ik_interpolate = 47 is = 2 omega2 = 1.7790e-07 + ik_interpolate = 47 is = 3 omega2 = 2.8915e-07 + ik_interpolate = 47 is = 4 omega2 = 6.9358e-07 + ik_interpolate = 47 is = 5 omega2 = 7.6822e-07 + ik_interpolate = 47 is = 6 omega2 = 9.0949e-07 + + ik_interpolate = 48 is = 1 omega2 = 8.2232e-08 + ik_interpolate = 48 is = 2 omega2 = 2.7546e-07 + ik_interpolate = 48 is = 3 omega2 = 5.5622e-07 + ik_interpolate = 48 is = 4 omega2 = 5.7237e-07 + ik_interpolate = 48 is = 5 omega2 = 7.6179e-07 + ik_interpolate = 48 is = 6 omega2 = 9.0594e-07 + + ik_interpolate = 49 is = 1 omega2 = 1.3781e-07 + ik_interpolate = 49 is = 2 omega2 = 1.3781e-07 + ik_interpolate = 49 is = 3 omega2 = 2.6492e-07 + ik_interpolate = 49 is = 4 omega2 = 7.2883e-07 + ik_interpolate = 49 is = 5 omega2 = 7.2883e-07 + ik_interpolate = 49 is = 6 omega2 = 1.2262e-06 + + ik_interpolate = 50 is = 1 omega2 = 8.2232e-08 + ik_interpolate = 50 is = 2 omega2 = 2.7546e-07 + ik_interpolate = 50 is = 3 omega2 = 5.5622e-07 + ik_interpolate = 50 is = 4 omega2 = 5.7237e-07 + ik_interpolate = 50 is = 5 omega2 = 7.6179e-07 + ik_interpolate = 50 is = 6 omega2 = 9.0594e-07 + + ik_interpolate = 51 is = 1 omega2 = 1.5927e-07 + ik_interpolate = 51 is = 2 omega2 = 1.7790e-07 + ik_interpolate = 51 is = 3 omega2 = 2.8915e-07 + ik_interpolate = 51 is = 4 omega2 = 6.9358e-07 + ik_interpolate = 51 is = 5 omega2 = 7.6822e-07 + ik_interpolate = 51 is = 6 omega2 = 9.0949e-07 + + ik_interpolate = 52 is = 1 omega2 = 4.2842e-08 + ik_interpolate = 52 is = 2 omega2 = 4.2842e-08 + ik_interpolate = 52 is = 3 omega2 = 4.4514e-07 + ik_interpolate = 52 is = 4 omega2 = 4.7947e-07 + ik_interpolate = 52 is = 5 omega2 = 4.7947e-07 + ik_interpolate = 52 is = 6 omega2 = 8.5160e-07 + + ik_interpolate = 53 is = 1 omega2 = 8.2232e-08 + ik_interpolate = 53 is = 2 omega2 = 2.7546e-07 + ik_interpolate = 53 is = 3 omega2 = 5.5622e-07 + ik_interpolate = 53 is = 4 omega2 = 5.7237e-07 + ik_interpolate = 53 is = 5 omega2 = 7.6179e-07 + ik_interpolate = 53 is = 6 omega2 = 9.0594e-07 + + ik_interpolate = 54 is = 1 omega2 = 1.5927e-07 + ik_interpolate = 54 is = 2 omega2 = 1.7790e-07 + ik_interpolate = 54 is = 3 omega2 = 2.8915e-07 + ik_interpolate = 54 is = 4 omega2 = 6.9358e-07 + ik_interpolate = 54 is = 5 omega2 = 7.6822e-07 + ik_interpolate = 54 is = 6 omega2 = 9.0949e-07 + + ik_interpolate = 55 is = 1 omega2 = 9.6302e-08 + ik_interpolate = 55 is = 2 omega2 = 9.6302e-08 + ik_interpolate = 55 is = 3 omega2 = 3.8749e-07 + ik_interpolate = 55 is = 4 omega2 = 6.0499e-07 + ik_interpolate = 55 is = 5 omega2 = 6.0499e-07 + ik_interpolate = 55 is = 6 omega2 = 8.1860e-07 + + ik_interpolate = 56 is = 1 omega2 = 1.5927e-07 + ik_interpolate = 56 is = 2 omega2 = 1.7790e-07 + ik_interpolate = 56 is = 3 omega2 = 2.8915e-07 + ik_interpolate = 56 is = 4 omega2 = 6.9358e-07 + ik_interpolate = 56 is = 5 omega2 = 7.6822e-07 + ik_interpolate = 56 is = 6 omega2 = 9.0949e-07 + + ik_interpolate = 57 is = 1 omega2 = 1.5927e-07 + ik_interpolate = 57 is = 2 omega2 = 1.7790e-07 + ik_interpolate = 57 is = 3 omega2 = 2.8915e-07 + ik_interpolate = 57 is = 4 omega2 = 6.9358e-07 + ik_interpolate = 57 is = 5 omega2 = 7.6822e-07 + ik_interpolate = 57 is = 6 omega2 = 9.0949e-07 + + ik_interpolate = 58 is = 1 omega2 = 9.6302e-08 + ik_interpolate = 58 is = 2 omega2 = 9.6302e-08 + ik_interpolate = 58 is = 3 omega2 = 3.8749e-07 + ik_interpolate = 58 is = 4 omega2 = 6.0499e-07 + ik_interpolate = 58 is = 5 omega2 = 6.0499e-07 + ik_interpolate = 58 is = 6 omega2 = 8.1860e-07 + + ik_interpolate = 59 is = 1 omega2 = 1.5927e-07 + ik_interpolate = 59 is = 2 omega2 = 1.7790e-07 + ik_interpolate = 59 is = 3 omega2 = 2.8915e-07 + ik_interpolate = 59 is = 4 omega2 = 6.9358e-07 + ik_interpolate = 59 is = 5 omega2 = 7.6822e-07 + ik_interpolate = 59 is = 6 omega2 = 9.0949e-07 + + ik_interpolate = 60 is = 1 omega2 = 8.2232e-08 + ik_interpolate = 60 is = 2 omega2 = 2.7546e-07 + ik_interpolate = 60 is = 3 omega2 = 5.5622e-07 + ik_interpolate = 60 is = 4 omega2 = 5.7237e-07 + ik_interpolate = 60 is = 5 omega2 = 7.6179e-07 + ik_interpolate = 60 is = 6 omega2 = 9.0594e-07 + + ik_interpolate = 61 is = 1 omega2 = 4.2842e-08 + ik_interpolate = 61 is = 2 omega2 = 4.2842e-08 + ik_interpolate = 61 is = 3 omega2 = 4.4514e-07 + ik_interpolate = 61 is = 4 omega2 = 4.7947e-07 + ik_interpolate = 61 is = 5 omega2 = 4.7947e-07 + ik_interpolate = 61 is = 6 omega2 = 8.5160e-07 + + ik_interpolate = 62 is = 1 omega2 = 1.5927e-07 + ik_interpolate = 62 is = 2 omega2 = 1.7790e-07 + ik_interpolate = 62 is = 3 omega2 = 2.8915e-07 + ik_interpolate = 62 is = 4 omega2 = 6.9358e-07 + ik_interpolate = 62 is = 5 omega2 = 7.6822e-07 + ik_interpolate = 62 is = 6 omega2 = 9.0949e-07 + + ik_interpolate = 63 is = 1 omega2 = 8.2232e-08 + ik_interpolate = 63 is = 2 omega2 = 2.7546e-07 + ik_interpolate = 63 is = 3 omega2 = 5.5622e-07 + ik_interpolate = 63 is = 4 omega2 = 5.7237e-07 + ik_interpolate = 63 is = 5 omega2 = 7.6179e-07 + ik_interpolate = 63 is = 6 omega2 = 9.0594e-07 + + ik_interpolate = 64 is = 1 omega2 = 1.3781e-07 + ik_interpolate = 64 is = 2 omega2 = 1.3781e-07 + ik_interpolate = 64 is = 3 omega2 = 2.6492e-07 + ik_interpolate = 64 is = 4 omega2 = 7.2883e-07 + ik_interpolate = 64 is = 5 omega2 = 7.2883e-07 + ik_interpolate = 64 is = 6 omega2 = 1.2262e-06 Temperature = 3.0000e+02 K SCPH ITER 1 : DIFF = N/A - SCPH ITER 2 : DIFF = 8.3382e-08 - SCPH ITER 3 : DIFF = 7.4182e-08 - SCPH ITER 4 : DIFF = 6.5999e-08 - SCPH ITER 5 : DIFF = 5.8720e-08 - SCPH ITER 6 : DIFF = 5.2245e-08 - SCPH ITER 7 : DIFF = 4.6485e-08 - SCPH ITER 8 : DIFF = 4.1360e-08 - SCPH ITER 9 : DIFF = 3.6802e-08 - SCPH ITER 10 : DIFF = 3.2746e-08 - SCPH ITER 11 : DIFF = 2.9137e-08 - SCPH ITER 12 : DIFF = 2.5927e-08 - SCPH ITER 13 : DIFF = 2.3070e-08 - SCPH ITER 14 : DIFF = 2.0529e-08 - SCPH ITER 15 : DIFF = 1.8267e-08 - SCPH ITER 16 : DIFF = 1.6255e-08 - SCPH ITER 17 : DIFF = 1.4465e-08 - SCPH ITER 18 : DIFF = 1.2871e-08 - SCPH ITER 19 : DIFF = 1.1454e-08 - SCPH ITER 20 : DIFF = 1.0192e-08 - SCPH ITER 21 : DIFF = 9.0697e-09 + SCPH ITER 2 : DIFF = 8.4122e-08 + SCPH ITER 3 : DIFF = 7.4840e-08 + SCPH ITER 4 : DIFF = 6.6584e-08 + SCPH ITER 5 : DIFF = 5.9241e-08 + SCPH ITER 6 : DIFF = 5.2708e-08 + SCPH ITER 7 : DIFF = 4.6897e-08 + SCPH ITER 8 : DIFF = 4.1727e-08 + SCPH ITER 9 : DIFF = 3.7128e-08 + SCPH ITER 10 : DIFF = 3.3036e-08 + SCPH ITER 11 : DIFF = 2.9396e-08 + SCPH ITER 12 : DIFF = 2.6157e-08 + SCPH ITER 13 : DIFF = 2.3275e-08 + SCPH ITER 14 : DIFF = 2.0711e-08 + SCPH ITER 15 : DIFF = 1.8429e-08 + SCPH ITER 16 : DIFF = 1.6399e-08 + SCPH ITER 17 : DIFF = 1.4593e-08 + SCPH ITER 18 : DIFF = 1.2985e-08 + SCPH ITER 19 : DIFF = 1.1555e-08 + SCPH ITER 20 : DIFF = 1.0283e-08 + SCPH ITER 21 : DIFF = 9.1500e-09 + SCPH ITER 22 : DIFF = 8.1423e-09 + SCPH ITER 23 : DIFF = 7.2456e-09 + SCPH ITER 24 : DIFF = 6.4477e-09 + SCPH ITER 25 : DIFF = 5.7376e-09 + SCPH ITER 26 : DIFF = 5.1058e-09 + SCPH ITER 27 : DIFF = 4.5435e-09 + SCPH ITER 28 : DIFF = 4.0432e-09 + SCPH ITER 29 : DIFF = 3.5980e-09 + SCPH ITER 30 : DIFF = 3.2018e-09 + SCPH ITER 31 : DIFF = 2.8492e-09 + SCPH ITER 32 : DIFF = 2.5355e-09 + SCPH ITER 33 : DIFF = 2.2563e-09 + SCPH ITER 34 : DIFF = 2.0078e-09 + SCPH ITER 35 : DIFF = 1.7867e-09 + SCPH ITER 36 : DIFF = 1.5900e-09 + SCPH ITER 37 : DIFF = 1.4149e-09 + SCPH ITER 38 : DIFF = 1.2591e-09 + SCPH ITER 39 : DIFF = 1.1205e-09 + SCPH ITER 40 : DIFF = 9.9708e-10 + SCPH ITER 41 : DIFF = 8.8728e-10 + SCPH ITER 42 : DIFF = 7.8958e-10 + SCPH ITER 43 : DIFF = 7.0264e-10 + SCPH ITER 44 : DIFF = 6.2527e-10 + SCPH ITER 45 : DIFF = 5.5642e-10 + SCPH ITER 46 : DIFF = 4.9515e-10 + SCPH ITER 47 : DIFF = 4.4063e-10 + SCPH ITER 48 : DIFF = 3.9210e-10 + SCPH ITER 49 : DIFF = 3.4893e-10 + SCPH ITER 50 : DIFF = 3.1050e-10 + SCPH ITER 51 : DIFF = 2.7631e-10 + SCPH ITER 52 : DIFF = 2.4589e-10 + SCPH ITER 53 : DIFF = 2.1882e-10 + SCPH ITER 54 : DIFF = 1.9472e-10 + SCPH ITER 55 : DIFF = 1.7328e-10 + SCPH ITER 56 : DIFF = 1.5419e-10 + SCPH ITER 57 : DIFF = 1.3721e-10 + SCPH ITER 58 : DIFF = 1.2210e-10 + SCPH ITER 59 : DIFF = 1.0870e-10 + SCPH ITER 60 : DIFF = 9.6717e-11 DIFF < SCPH_TOL : break SCPH loop - Temp = 3.0000e+02 : convergence achieved in 21 iterations. + Temp = 3.0000e+02 : convergence achieved in 60 iterations. New eigenvalues - ik_interpolate = 1 is = 1 omega2 = 5.6987e-24 - ik_interpolate = 1 is = 2 omega2 = 3.5547e-23 - ik_interpolate = 1 is = 3 omega2 = 8.4486e-23 - ik_interpolate = 1 is = 4 omega2 = 2.3963e-07 - ik_interpolate = 1 is = 5 omega2 = 2.3963e-07 - ik_interpolate = 1 is = 6 omega2 = 2.3963e-07 - - ik_interpolate = 2 is = 1 omega2 = 1.3500e-07 - ik_interpolate = 2 is = 2 omega2 = 1.3500e-07 - ik_interpolate = 2 is = 3 omega2 = 2.6397e-07 - ik_interpolate = 2 is = 4 omega2 = 7.1258e-07 - ik_interpolate = 2 is = 5 omega2 = 7.1258e-07 - ik_interpolate = 2 is = 6 omega2 = 1.2097e-06 - - ik_interpolate = 3 is = 1 omega2 = 2.9358e-07 - ik_interpolate = 3 is = 2 omega2 = 2.9358e-07 - ik_interpolate = 3 is = 3 omega2 = 6.9039e-07 - ik_interpolate = 3 is = 4 omega2 = 7.9686e-07 - ik_interpolate = 3 is = 5 omega2 = 7.9686e-07 - ik_interpolate = 3 is = 6 omega2 = 9.5068e-07 - - ik_interpolate = 4 is = 1 omega2 = 1.3500e-07 - ik_interpolate = 4 is = 2 omega2 = 1.3500e-07 - ik_interpolate = 4 is = 3 omega2 = 2.6397e-07 - ik_interpolate = 4 is = 4 omega2 = 7.1258e-07 - ik_interpolate = 4 is = 5 omega2 = 7.1258e-07 - ik_interpolate = 4 is = 6 omega2 = 1.2097e-06 - - ik_interpolate = 5 is = 1 omega2 = 1.3500e-07 - ik_interpolate = 5 is = 2 omega2 = 1.3500e-07 - ik_interpolate = 5 is = 3 omega2 = 2.6397e-07 - ik_interpolate = 5 is = 4 omega2 = 7.1258e-07 - ik_interpolate = 5 is = 5 omega2 = 7.1258e-07 - ik_interpolate = 5 is = 6 omega2 = 1.2097e-06 - - ik_interpolate = 6 is = 1 omega2 = 4.2579e-08 - ik_interpolate = 6 is = 2 omega2 = 4.2579e-08 - ik_interpolate = 6 is = 3 omega2 = 4.3781e-07 - ik_interpolate = 6 is = 4 omega2 = 4.5561e-07 - ik_interpolate = 6 is = 5 omega2 = 4.5561e-07 - ik_interpolate = 6 is = 6 omega2 = 8.4636e-07 - - ik_interpolate = 7 is = 1 omega2 = 1.5655e-07 - ik_interpolate = 7 is = 2 omega2 = 1.7444e-07 + ik_interpolate = 1 is = 1 omega2 = 4.5512e-23 + ik_interpolate = 1 is = 2 omega2 = 5.9557e-23 + ik_interpolate = 1 is = 3 omega2 = 8.6837e-23 + ik_interpolate = 1 is = 4 omega2 = 2.3986e-07 + ik_interpolate = 1 is = 5 omega2 = 2.3986e-07 + ik_interpolate = 1 is = 6 omega2 = 2.3986e-07 + + ik_interpolate = 2 is = 1 omega2 = 1.3503e-07 + ik_interpolate = 2 is = 2 omega2 = 1.3503e-07 + ik_interpolate = 2 is = 3 omega2 = 2.6398e-07 + ik_interpolate = 2 is = 4 omega2 = 7.1273e-07 + ik_interpolate = 2 is = 5 omega2 = 7.1273e-07 + ik_interpolate = 2 is = 6 omega2 = 1.2098e-06 + + ik_interpolate = 3 is = 1 omega2 = 2.9364e-07 + ik_interpolate = 3 is = 2 omega2 = 2.9364e-07 + ik_interpolate = 3 is = 3 omega2 = 6.9044e-07 + ik_interpolate = 3 is = 4 omega2 = 7.9693e-07 + ik_interpolate = 3 is = 5 omega2 = 7.9693e-07 + ik_interpolate = 3 is = 6 omega2 = 9.5076e-07 + + ik_interpolate = 4 is = 1 omega2 = 1.3503e-07 + ik_interpolate = 4 is = 2 omega2 = 1.3503e-07 + ik_interpolate = 4 is = 3 omega2 = 2.6398e-07 + ik_interpolate = 4 is = 4 omega2 = 7.1273e-07 + ik_interpolate = 4 is = 5 omega2 = 7.1273e-07 + ik_interpolate = 4 is = 6 omega2 = 1.2098e-06 + + ik_interpolate = 5 is = 1 omega2 = 1.3503e-07 + ik_interpolate = 5 is = 2 omega2 = 1.3503e-07 + ik_interpolate = 5 is = 3 omega2 = 2.6398e-07 + ik_interpolate = 5 is = 4 omega2 = 7.1273e-07 + ik_interpolate = 5 is = 5 omega2 = 7.1273e-07 + ik_interpolate = 5 is = 6 omega2 = 1.2098e-06 + + ik_interpolate = 6 is = 1 omega2 = 4.2582e-08 + ik_interpolate = 6 is = 2 omega2 = 4.2582e-08 + ik_interpolate = 6 is = 3 omega2 = 4.3788e-07 + ik_interpolate = 6 is = 4 omega2 = 4.5581e-07 + ik_interpolate = 6 is = 5 omega2 = 4.5581e-07 + ik_interpolate = 6 is = 6 omega2 = 8.4643e-07 + + ik_interpolate = 7 is = 1 omega2 = 1.5657e-07 + ik_interpolate = 7 is = 2 omega2 = 1.7447e-07 ik_interpolate = 7 is = 3 omega2 = 2.9020e-07 - ik_interpolate = 7 is = 4 omega2 = 6.7793e-07 - ik_interpolate = 7 is = 5 omega2 = 7.5218e-07 - ik_interpolate = 7 is = 6 omega2 = 8.9344e-07 + ik_interpolate = 7 is = 4 omega2 = 6.7808e-07 + ik_interpolate = 7 is = 5 omega2 = 7.5233e-07 + ik_interpolate = 7 is = 6 omega2 = 8.9359e-07 ik_interpolate = 8 is = 1 omega2 = 8.2260e-08 - ik_interpolate = 8 is = 2 omega2 = 2.6833e-07 - ik_interpolate = 8 is = 3 omega2 = 5.5036e-07 - ik_interpolate = 8 is = 4 omega2 = 5.5164e-07 - ik_interpolate = 8 is = 5 omega2 = 7.5564e-07 - ik_interpolate = 8 is = 6 omega2 = 8.9949e-07 - - ik_interpolate = 9 is = 1 omega2 = 2.9358e-07 - ik_interpolate = 9 is = 2 omega2 = 2.9358e-07 - ik_interpolate = 9 is = 3 omega2 = 6.9039e-07 - ik_interpolate = 9 is = 4 omega2 = 7.9686e-07 - ik_interpolate = 9 is = 5 omega2 = 7.9686e-07 - ik_interpolate = 9 is = 6 omega2 = 9.5068e-07 - - ik_interpolate = 10 is = 1 omega2 = 1.5655e-07 - ik_interpolate = 10 is = 2 omega2 = 1.7444e-07 + ik_interpolate = 8 is = 2 omega2 = 2.6840e-07 + ik_interpolate = 8 is = 3 omega2 = 5.5055e-07 + ik_interpolate = 8 is = 4 omega2 = 5.5169e-07 + ik_interpolate = 8 is = 5 omega2 = 7.5572e-07 + ik_interpolate = 8 is = 6 omega2 = 8.9956e-07 + + ik_interpolate = 9 is = 1 omega2 = 2.9364e-07 + ik_interpolate = 9 is = 2 omega2 = 2.9364e-07 + ik_interpolate = 9 is = 3 omega2 = 6.9044e-07 + ik_interpolate = 9 is = 4 omega2 = 7.9693e-07 + ik_interpolate = 9 is = 5 omega2 = 7.9693e-07 + ik_interpolate = 9 is = 6 omega2 = 9.5076e-07 + + ik_interpolate = 10 is = 1 omega2 = 1.5657e-07 + ik_interpolate = 10 is = 2 omega2 = 1.7447e-07 ik_interpolate = 10 is = 3 omega2 = 2.9020e-07 - ik_interpolate = 10 is = 4 omega2 = 6.7793e-07 - ik_interpolate = 10 is = 5 omega2 = 7.5218e-07 - ik_interpolate = 10 is = 6 omega2 = 8.9344e-07 - - ik_interpolate = 11 is = 1 omega2 = 5.4812e-08 - ik_interpolate = 11 is = 2 omega2 = 5.4812e-08 - ik_interpolate = 11 is = 3 omega2 = 9.8493e-08 - ik_interpolate = 11 is = 4 omega2 = 5.1616e-07 - ik_interpolate = 11 is = 5 omega2 = 5.1616e-07 - ik_interpolate = 11 is = 6 omega2 = 6.0865e-07 - - ik_interpolate = 12 is = 1 omega2 = 1.5655e-07 - ik_interpolate = 12 is = 2 omega2 = 1.7444e-07 + ik_interpolate = 10 is = 4 omega2 = 6.7808e-07 + ik_interpolate = 10 is = 5 omega2 = 7.5233e-07 + ik_interpolate = 10 is = 6 omega2 = 8.9359e-07 + + ik_interpolate = 11 is = 1 omega2 = 5.4823e-08 + ik_interpolate = 11 is = 2 omega2 = 5.4823e-08 + ik_interpolate = 11 is = 3 omega2 = 9.8507e-08 + ik_interpolate = 11 is = 4 omega2 = 5.1636e-07 + ik_interpolate = 11 is = 5 omega2 = 5.1636e-07 + ik_interpolate = 11 is = 6 omega2 = 6.0884e-07 + + ik_interpolate = 12 is = 1 omega2 = 1.5657e-07 + ik_interpolate = 12 is = 2 omega2 = 1.7447e-07 ik_interpolate = 12 is = 3 omega2 = 2.9020e-07 - ik_interpolate = 12 is = 4 omega2 = 6.7793e-07 - ik_interpolate = 12 is = 5 omega2 = 7.5218e-07 - ik_interpolate = 12 is = 6 omega2 = 8.9344e-07 + ik_interpolate = 12 is = 4 omega2 = 6.7808e-07 + ik_interpolate = 12 is = 5 omega2 = 7.5233e-07 + ik_interpolate = 12 is = 6 omega2 = 8.9359e-07 - ik_interpolate = 13 is = 1 omega2 = 1.3500e-07 - ik_interpolate = 13 is = 2 omega2 = 1.3500e-07 - ik_interpolate = 13 is = 3 omega2 = 2.6397e-07 - ik_interpolate = 13 is = 4 omega2 = 7.1258e-07 - ik_interpolate = 13 is = 5 omega2 = 7.1258e-07 - ik_interpolate = 13 is = 6 omega2 = 1.2097e-06 + ik_interpolate = 13 is = 1 omega2 = 1.3503e-07 + ik_interpolate = 13 is = 2 omega2 = 1.3503e-07 + ik_interpolate = 13 is = 3 omega2 = 2.6398e-07 + ik_interpolate = 13 is = 4 omega2 = 7.1273e-07 + ik_interpolate = 13 is = 5 omega2 = 7.1273e-07 + ik_interpolate = 13 is = 6 omega2 = 1.2098e-06 ik_interpolate = 14 is = 1 omega2 = 8.2260e-08 - ik_interpolate = 14 is = 2 omega2 = 2.6833e-07 - ik_interpolate = 14 is = 3 omega2 = 5.5036e-07 - ik_interpolate = 14 is = 4 omega2 = 5.5164e-07 - ik_interpolate = 14 is = 5 omega2 = 7.5564e-07 - ik_interpolate = 14 is = 6 omega2 = 8.9949e-07 - - ik_interpolate = 15 is = 1 omega2 = 1.5655e-07 - ik_interpolate = 15 is = 2 omega2 = 1.7444e-07 + ik_interpolate = 14 is = 2 omega2 = 2.6840e-07 + ik_interpolate = 14 is = 3 omega2 = 5.5055e-07 + ik_interpolate = 14 is = 4 omega2 = 5.5169e-07 + ik_interpolate = 14 is = 5 omega2 = 7.5572e-07 + ik_interpolate = 14 is = 6 omega2 = 8.9956e-07 + + ik_interpolate = 15 is = 1 omega2 = 1.5657e-07 + ik_interpolate = 15 is = 2 omega2 = 1.7447e-07 ik_interpolate = 15 is = 3 omega2 = 2.9020e-07 - ik_interpolate = 15 is = 4 omega2 = 6.7793e-07 - ik_interpolate = 15 is = 5 omega2 = 7.5218e-07 - ik_interpolate = 15 is = 6 omega2 = 8.9344e-07 - - ik_interpolate = 16 is = 1 omega2 = 4.2579e-08 - ik_interpolate = 16 is = 2 omega2 = 4.2579e-08 - ik_interpolate = 16 is = 3 omega2 = 4.3781e-07 - ik_interpolate = 16 is = 4 omega2 = 4.5561e-07 - ik_interpolate = 16 is = 5 omega2 = 4.5561e-07 - ik_interpolate = 16 is = 6 omega2 = 8.4636e-07 - - ik_interpolate = 17 is = 1 omega2 = 1.3500e-07 - ik_interpolate = 17 is = 2 omega2 = 1.3500e-07 - ik_interpolate = 17 is = 3 omega2 = 2.6397e-07 - ik_interpolate = 17 is = 4 omega2 = 7.1258e-07 - ik_interpolate = 17 is = 5 omega2 = 7.1258e-07 - ik_interpolate = 17 is = 6 omega2 = 1.2097e-06 - - ik_interpolate = 18 is = 1 omega2 = 4.2579e-08 - ik_interpolate = 18 is = 2 omega2 = 4.2579e-08 - ik_interpolate = 18 is = 3 omega2 = 4.3781e-07 - ik_interpolate = 18 is = 4 omega2 = 4.5561e-07 - ik_interpolate = 18 is = 5 omega2 = 4.5561e-07 - ik_interpolate = 18 is = 6 omega2 = 8.4636e-07 - - ik_interpolate = 19 is = 1 omega2 = 1.5655e-07 - ik_interpolate = 19 is = 2 omega2 = 1.7444e-07 + ik_interpolate = 15 is = 4 omega2 = 6.7808e-07 + ik_interpolate = 15 is = 5 omega2 = 7.5233e-07 + ik_interpolate = 15 is = 6 omega2 = 8.9359e-07 + + ik_interpolate = 16 is = 1 omega2 = 4.2582e-08 + ik_interpolate = 16 is = 2 omega2 = 4.2582e-08 + ik_interpolate = 16 is = 3 omega2 = 4.3788e-07 + ik_interpolate = 16 is = 4 omega2 = 4.5581e-07 + ik_interpolate = 16 is = 5 omega2 = 4.5581e-07 + ik_interpolate = 16 is = 6 omega2 = 8.4643e-07 + + ik_interpolate = 17 is = 1 omega2 = 1.3503e-07 + ik_interpolate = 17 is = 2 omega2 = 1.3503e-07 + ik_interpolate = 17 is = 3 omega2 = 2.6398e-07 + ik_interpolate = 17 is = 4 omega2 = 7.1273e-07 + ik_interpolate = 17 is = 5 omega2 = 7.1273e-07 + ik_interpolate = 17 is = 6 omega2 = 1.2098e-06 + + ik_interpolate = 18 is = 1 omega2 = 4.2582e-08 + ik_interpolate = 18 is = 2 omega2 = 4.2582e-08 + ik_interpolate = 18 is = 3 omega2 = 4.3788e-07 + ik_interpolate = 18 is = 4 omega2 = 4.5581e-07 + ik_interpolate = 18 is = 5 omega2 = 4.5581e-07 + ik_interpolate = 18 is = 6 omega2 = 8.4643e-07 + + ik_interpolate = 19 is = 1 omega2 = 1.5657e-07 + ik_interpolate = 19 is = 2 omega2 = 1.7447e-07 ik_interpolate = 19 is = 3 omega2 = 2.9020e-07 - ik_interpolate = 19 is = 4 omega2 = 6.7793e-07 - ik_interpolate = 19 is = 5 omega2 = 7.5218e-07 - ik_interpolate = 19 is = 6 omega2 = 8.9344e-07 + ik_interpolate = 19 is = 4 omega2 = 6.7808e-07 + ik_interpolate = 19 is = 5 omega2 = 7.5233e-07 + ik_interpolate = 19 is = 6 omega2 = 8.9359e-07 ik_interpolate = 20 is = 1 omega2 = 8.2260e-08 - ik_interpolate = 20 is = 2 omega2 = 2.6833e-07 - ik_interpolate = 20 is = 3 omega2 = 5.5036e-07 - ik_interpolate = 20 is = 4 omega2 = 5.5164e-07 - ik_interpolate = 20 is = 5 omega2 = 7.5564e-07 - ik_interpolate = 20 is = 6 omega2 = 8.9949e-07 - - ik_interpolate = 21 is = 1 omega2 = 4.2579e-08 - ik_interpolate = 21 is = 2 omega2 = 4.2579e-08 - ik_interpolate = 21 is = 3 omega2 = 4.3781e-07 - ik_interpolate = 21 is = 4 omega2 = 4.5561e-07 - ik_interpolate = 21 is = 5 omega2 = 4.5561e-07 - ik_interpolate = 21 is = 6 omega2 = 8.4636e-07 - - ik_interpolate = 22 is = 1 omega2 = 1.3500e-07 - ik_interpolate = 22 is = 2 omega2 = 1.3500e-07 - ik_interpolate = 22 is = 3 omega2 = 2.6397e-07 - ik_interpolate = 22 is = 4 omega2 = 7.1258e-07 - ik_interpolate = 22 is = 5 omega2 = 7.1258e-07 - ik_interpolate = 22 is = 6 omega2 = 1.2097e-06 + ik_interpolate = 20 is = 2 omega2 = 2.6840e-07 + ik_interpolate = 20 is = 3 omega2 = 5.5055e-07 + ik_interpolate = 20 is = 4 omega2 = 5.5169e-07 + ik_interpolate = 20 is = 5 omega2 = 7.5572e-07 + ik_interpolate = 20 is = 6 omega2 = 8.9956e-07 + + ik_interpolate = 21 is = 1 omega2 = 4.2582e-08 + ik_interpolate = 21 is = 2 omega2 = 4.2582e-08 + ik_interpolate = 21 is = 3 omega2 = 4.3788e-07 + ik_interpolate = 21 is = 4 omega2 = 4.5581e-07 + ik_interpolate = 21 is = 5 omega2 = 4.5581e-07 + ik_interpolate = 21 is = 6 omega2 = 8.4643e-07 + + ik_interpolate = 22 is = 1 omega2 = 1.3503e-07 + ik_interpolate = 22 is = 2 omega2 = 1.3503e-07 + ik_interpolate = 22 is = 3 omega2 = 2.6398e-07 + ik_interpolate = 22 is = 4 omega2 = 7.1273e-07 + ik_interpolate = 22 is = 5 omega2 = 7.1273e-07 + ik_interpolate = 22 is = 6 omega2 = 1.2098e-06 ik_interpolate = 23 is = 1 omega2 = 8.2260e-08 - ik_interpolate = 23 is = 2 omega2 = 2.6833e-07 - ik_interpolate = 23 is = 3 omega2 = 5.5036e-07 - ik_interpolate = 23 is = 4 omega2 = 5.5164e-07 - ik_interpolate = 23 is = 5 omega2 = 7.5564e-07 - ik_interpolate = 23 is = 6 omega2 = 8.9949e-07 - - ik_interpolate = 24 is = 1 omega2 = 1.5655e-07 - ik_interpolate = 24 is = 2 omega2 = 1.7444e-07 + ik_interpolate = 23 is = 2 omega2 = 2.6840e-07 + ik_interpolate = 23 is = 3 omega2 = 5.5055e-07 + ik_interpolate = 23 is = 4 omega2 = 5.5169e-07 + ik_interpolate = 23 is = 5 omega2 = 7.5572e-07 + ik_interpolate = 23 is = 6 omega2 = 8.9956e-07 + + ik_interpolate = 24 is = 1 omega2 = 1.5657e-07 + ik_interpolate = 24 is = 2 omega2 = 1.7447e-07 ik_interpolate = 24 is = 3 omega2 = 2.9020e-07 - ik_interpolate = 24 is = 4 omega2 = 6.7793e-07 - ik_interpolate = 24 is = 5 omega2 = 7.5218e-07 - ik_interpolate = 24 is = 6 omega2 = 8.9344e-07 + ik_interpolate = 24 is = 4 omega2 = 6.7808e-07 + ik_interpolate = 24 is = 5 omega2 = 7.5233e-07 + ik_interpolate = 24 is = 6 omega2 = 8.9359e-07 - ik_interpolate = 25 is = 1 omega2 = 1.5655e-07 - ik_interpolate = 25 is = 2 omega2 = 1.7444e-07 + ik_interpolate = 25 is = 1 omega2 = 1.5657e-07 + ik_interpolate = 25 is = 2 omega2 = 1.7447e-07 ik_interpolate = 25 is = 3 omega2 = 2.9020e-07 - ik_interpolate = 25 is = 4 omega2 = 6.7793e-07 - ik_interpolate = 25 is = 5 omega2 = 7.5218e-07 - ik_interpolate = 25 is = 6 omega2 = 8.9344e-07 + ik_interpolate = 25 is = 4 omega2 = 6.7808e-07 + ik_interpolate = 25 is = 5 omega2 = 7.5233e-07 + ik_interpolate = 25 is = 6 omega2 = 8.9359e-07 ik_interpolate = 26 is = 1 omega2 = 8.2260e-08 - ik_interpolate = 26 is = 2 omega2 = 2.6833e-07 - ik_interpolate = 26 is = 3 omega2 = 5.5036e-07 - ik_interpolate = 26 is = 4 omega2 = 5.5164e-07 - ik_interpolate = 26 is = 5 omega2 = 7.5564e-07 - ik_interpolate = 26 is = 6 omega2 = 8.9949e-07 - - ik_interpolate = 27 is = 1 omega2 = 1.5655e-07 - ik_interpolate = 27 is = 2 omega2 = 1.7444e-07 + ik_interpolate = 26 is = 2 omega2 = 2.6840e-07 + ik_interpolate = 26 is = 3 omega2 = 5.5055e-07 + ik_interpolate = 26 is = 4 omega2 = 5.5169e-07 + ik_interpolate = 26 is = 5 omega2 = 7.5572e-07 + ik_interpolate = 26 is = 6 omega2 = 8.9956e-07 + + ik_interpolate = 27 is = 1 omega2 = 1.5657e-07 + ik_interpolate = 27 is = 2 omega2 = 1.7447e-07 ik_interpolate = 27 is = 3 omega2 = 2.9020e-07 - ik_interpolate = 27 is = 4 omega2 = 6.7793e-07 - ik_interpolate = 27 is = 5 omega2 = 7.5218e-07 - ik_interpolate = 27 is = 6 omega2 = 8.9344e-07 + ik_interpolate = 27 is = 4 omega2 = 6.7808e-07 + ik_interpolate = 27 is = 5 omega2 = 7.5233e-07 + ik_interpolate = 27 is = 6 omega2 = 8.9359e-07 - ik_interpolate = 28 is = 1 omega2 = 9.5170e-08 - ik_interpolate = 28 is = 2 omega2 = 9.5170e-08 - ik_interpolate = 28 is = 3 omega2 = 3.8116e-07 - ik_interpolate = 28 is = 4 omega2 = 5.8315e-07 - ik_interpolate = 28 is = 5 omega2 = 5.8315e-07 - ik_interpolate = 28 is = 6 omega2 = 8.1008e-07 + ik_interpolate = 28 is = 1 omega2 = 9.5176e-08 + ik_interpolate = 28 is = 2 omega2 = 9.5176e-08 + ik_interpolate = 28 is = 3 omega2 = 3.8123e-07 + ik_interpolate = 28 is = 4 omega2 = 5.8335e-07 + ik_interpolate = 28 is = 5 omega2 = 5.8335e-07 + ik_interpolate = 28 is = 6 omega2 = 8.1017e-07 ik_interpolate = 29 is = 1 omega2 = 8.2260e-08 - ik_interpolate = 29 is = 2 omega2 = 2.6833e-07 - ik_interpolate = 29 is = 3 omega2 = 5.5036e-07 - ik_interpolate = 29 is = 4 omega2 = 5.5164e-07 - ik_interpolate = 29 is = 5 omega2 = 7.5564e-07 - ik_interpolate = 29 is = 6 omega2 = 8.9949e-07 - - ik_interpolate = 30 is = 1 omega2 = 1.5655e-07 - ik_interpolate = 30 is = 2 omega2 = 1.7444e-07 + ik_interpolate = 29 is = 2 omega2 = 2.6840e-07 + ik_interpolate = 29 is = 3 omega2 = 5.5055e-07 + ik_interpolate = 29 is = 4 omega2 = 5.5169e-07 + ik_interpolate = 29 is = 5 omega2 = 7.5572e-07 + ik_interpolate = 29 is = 6 omega2 = 8.9956e-07 + + ik_interpolate = 30 is = 1 omega2 = 1.5657e-07 + ik_interpolate = 30 is = 2 omega2 = 1.7447e-07 ik_interpolate = 30 is = 3 omega2 = 2.9020e-07 - ik_interpolate = 30 is = 4 omega2 = 6.7793e-07 - ik_interpolate = 30 is = 5 omega2 = 7.5218e-07 - ik_interpolate = 30 is = 6 omega2 = 8.9344e-07 - - ik_interpolate = 31 is = 1 omega2 = 9.5170e-08 - ik_interpolate = 31 is = 2 omega2 = 9.5170e-08 - ik_interpolate = 31 is = 3 omega2 = 3.8116e-07 - ik_interpolate = 31 is = 4 omega2 = 5.8315e-07 - ik_interpolate = 31 is = 5 omega2 = 5.8315e-07 - ik_interpolate = 31 is = 6 omega2 = 8.1008e-07 - - ik_interpolate = 32 is = 1 omega2 = 1.5655e-07 - ik_interpolate = 32 is = 2 omega2 = 1.7444e-07 + ik_interpolate = 30 is = 4 omega2 = 6.7808e-07 + ik_interpolate = 30 is = 5 omega2 = 7.5233e-07 + ik_interpolate = 30 is = 6 omega2 = 8.9359e-07 + + ik_interpolate = 31 is = 1 omega2 = 9.5176e-08 + ik_interpolate = 31 is = 2 omega2 = 9.5176e-08 + ik_interpolate = 31 is = 3 omega2 = 3.8123e-07 + ik_interpolate = 31 is = 4 omega2 = 5.8335e-07 + ik_interpolate = 31 is = 5 omega2 = 5.8335e-07 + ik_interpolate = 31 is = 6 omega2 = 8.1017e-07 + + ik_interpolate = 32 is = 1 omega2 = 1.5657e-07 + ik_interpolate = 32 is = 2 omega2 = 1.7447e-07 ik_interpolate = 32 is = 3 omega2 = 2.9020e-07 - ik_interpolate = 32 is = 4 omega2 = 6.7793e-07 - ik_interpolate = 32 is = 5 omega2 = 7.5218e-07 - ik_interpolate = 32 is = 6 omega2 = 8.9344e-07 - - ik_interpolate = 33 is = 1 omega2 = 2.9358e-07 - ik_interpolate = 33 is = 2 omega2 = 2.9358e-07 - ik_interpolate = 33 is = 3 omega2 = 6.9039e-07 - ik_interpolate = 33 is = 4 omega2 = 7.9686e-07 - ik_interpolate = 33 is = 5 omega2 = 7.9686e-07 - ik_interpolate = 33 is = 6 omega2 = 9.5068e-07 - - ik_interpolate = 34 is = 1 omega2 = 1.5655e-07 - ik_interpolate = 34 is = 2 omega2 = 1.7444e-07 + ik_interpolate = 32 is = 4 omega2 = 6.7808e-07 + ik_interpolate = 32 is = 5 omega2 = 7.5233e-07 + ik_interpolate = 32 is = 6 omega2 = 8.9359e-07 + + ik_interpolate = 33 is = 1 omega2 = 2.9364e-07 + ik_interpolate = 33 is = 2 omega2 = 2.9364e-07 + ik_interpolate = 33 is = 3 omega2 = 6.9044e-07 + ik_interpolate = 33 is = 4 omega2 = 7.9693e-07 + ik_interpolate = 33 is = 5 omega2 = 7.9693e-07 + ik_interpolate = 33 is = 6 omega2 = 9.5076e-07 + + ik_interpolate = 34 is = 1 omega2 = 1.5657e-07 + ik_interpolate = 34 is = 2 omega2 = 1.7447e-07 ik_interpolate = 34 is = 3 omega2 = 2.9020e-07 - ik_interpolate = 34 is = 4 omega2 = 6.7793e-07 - ik_interpolate = 34 is = 5 omega2 = 7.5218e-07 - ik_interpolate = 34 is = 6 omega2 = 8.9344e-07 - - ik_interpolate = 35 is = 1 omega2 = 5.4812e-08 - ik_interpolate = 35 is = 2 omega2 = 5.4812e-08 - ik_interpolate = 35 is = 3 omega2 = 9.8493e-08 - ik_interpolate = 35 is = 4 omega2 = 5.1616e-07 - ik_interpolate = 35 is = 5 omega2 = 5.1616e-07 - ik_interpolate = 35 is = 6 omega2 = 6.0865e-07 - - ik_interpolate = 36 is = 1 omega2 = 1.5655e-07 - ik_interpolate = 36 is = 2 omega2 = 1.7444e-07 + ik_interpolate = 34 is = 4 omega2 = 6.7808e-07 + ik_interpolate = 34 is = 5 omega2 = 7.5233e-07 + ik_interpolate = 34 is = 6 omega2 = 8.9359e-07 + + ik_interpolate = 35 is = 1 omega2 = 5.4823e-08 + ik_interpolate = 35 is = 2 omega2 = 5.4823e-08 + ik_interpolate = 35 is = 3 omega2 = 9.8507e-08 + ik_interpolate = 35 is = 4 omega2 = 5.1636e-07 + ik_interpolate = 35 is = 5 omega2 = 5.1636e-07 + ik_interpolate = 35 is = 6 omega2 = 6.0884e-07 + + ik_interpolate = 36 is = 1 omega2 = 1.5657e-07 + ik_interpolate = 36 is = 2 omega2 = 1.7447e-07 ik_interpolate = 36 is = 3 omega2 = 2.9020e-07 - ik_interpolate = 36 is = 4 omega2 = 6.7793e-07 - ik_interpolate = 36 is = 5 omega2 = 7.5218e-07 - ik_interpolate = 36 is = 6 omega2 = 8.9344e-07 + ik_interpolate = 36 is = 4 omega2 = 6.7808e-07 + ik_interpolate = 36 is = 5 omega2 = 7.5233e-07 + ik_interpolate = 36 is = 6 omega2 = 8.9359e-07 - ik_interpolate = 37 is = 1 omega2 = 1.5655e-07 - ik_interpolate = 37 is = 2 omega2 = 1.7444e-07 + ik_interpolate = 37 is = 1 omega2 = 1.5657e-07 + ik_interpolate = 37 is = 2 omega2 = 1.7447e-07 ik_interpolate = 37 is = 3 omega2 = 2.9020e-07 - ik_interpolate = 37 is = 4 omega2 = 6.7793e-07 - ik_interpolate = 37 is = 5 omega2 = 7.5218e-07 - ik_interpolate = 37 is = 6 omega2 = 8.9344e-07 + ik_interpolate = 37 is = 4 omega2 = 6.7808e-07 + ik_interpolate = 37 is = 5 omega2 = 7.5233e-07 + ik_interpolate = 37 is = 6 omega2 = 8.9359e-07 ik_interpolate = 38 is = 1 omega2 = 8.2260e-08 - ik_interpolate = 38 is = 2 omega2 = 2.6833e-07 - ik_interpolate = 38 is = 3 omega2 = 5.5036e-07 - ik_interpolate = 38 is = 4 omega2 = 5.5164e-07 - ik_interpolate = 38 is = 5 omega2 = 7.5564e-07 - ik_interpolate = 38 is = 6 omega2 = 8.9949e-07 - - ik_interpolate = 39 is = 1 omega2 = 1.5655e-07 - ik_interpolate = 39 is = 2 omega2 = 1.7444e-07 + ik_interpolate = 38 is = 2 omega2 = 2.6840e-07 + ik_interpolate = 38 is = 3 omega2 = 5.5055e-07 + ik_interpolate = 38 is = 4 omega2 = 5.5169e-07 + ik_interpolate = 38 is = 5 omega2 = 7.5572e-07 + ik_interpolate = 38 is = 6 omega2 = 8.9956e-07 + + ik_interpolate = 39 is = 1 omega2 = 1.5657e-07 + ik_interpolate = 39 is = 2 omega2 = 1.7447e-07 ik_interpolate = 39 is = 3 omega2 = 2.9020e-07 - ik_interpolate = 39 is = 4 omega2 = 6.7793e-07 - ik_interpolate = 39 is = 5 omega2 = 7.5218e-07 - ik_interpolate = 39 is = 6 omega2 = 8.9344e-07 - - ik_interpolate = 40 is = 1 omega2 = 9.5170e-08 - ik_interpolate = 40 is = 2 omega2 = 9.5170e-08 - ik_interpolate = 40 is = 3 omega2 = 3.8116e-07 - ik_interpolate = 40 is = 4 omega2 = 5.8315e-07 - ik_interpolate = 40 is = 5 omega2 = 5.8315e-07 - ik_interpolate = 40 is = 6 omega2 = 8.1008e-07 - - ik_interpolate = 41 is = 1 omega2 = 5.4812e-08 - ik_interpolate = 41 is = 2 omega2 = 5.4812e-08 - ik_interpolate = 41 is = 3 omega2 = 9.8493e-08 - ik_interpolate = 41 is = 4 omega2 = 5.1616e-07 - ik_interpolate = 41 is = 5 omega2 = 5.1616e-07 - ik_interpolate = 41 is = 6 omega2 = 6.0865e-07 - - ik_interpolate = 42 is = 1 omega2 = 1.5655e-07 - ik_interpolate = 42 is = 2 omega2 = 1.7444e-07 + ik_interpolate = 39 is = 4 omega2 = 6.7808e-07 + ik_interpolate = 39 is = 5 omega2 = 7.5233e-07 + ik_interpolate = 39 is = 6 omega2 = 8.9359e-07 + + ik_interpolate = 40 is = 1 omega2 = 9.5176e-08 + ik_interpolate = 40 is = 2 omega2 = 9.5176e-08 + ik_interpolate = 40 is = 3 omega2 = 3.8123e-07 + ik_interpolate = 40 is = 4 omega2 = 5.8335e-07 + ik_interpolate = 40 is = 5 omega2 = 5.8335e-07 + ik_interpolate = 40 is = 6 omega2 = 8.1017e-07 + + ik_interpolate = 41 is = 1 omega2 = 5.4823e-08 + ik_interpolate = 41 is = 2 omega2 = 5.4823e-08 + ik_interpolate = 41 is = 3 omega2 = 9.8507e-08 + ik_interpolate = 41 is = 4 omega2 = 5.1636e-07 + ik_interpolate = 41 is = 5 omega2 = 5.1636e-07 + ik_interpolate = 41 is = 6 omega2 = 6.0884e-07 + + ik_interpolate = 42 is = 1 omega2 = 1.5657e-07 + ik_interpolate = 42 is = 2 omega2 = 1.7447e-07 ik_interpolate = 42 is = 3 omega2 = 2.9020e-07 - ik_interpolate = 42 is = 4 omega2 = 6.7793e-07 - ik_interpolate = 42 is = 5 omega2 = 7.5218e-07 - ik_interpolate = 42 is = 6 omega2 = 8.9344e-07 - - ik_interpolate = 43 is = 1 omega2 = 2.9358e-07 - ik_interpolate = 43 is = 2 omega2 = 2.9358e-07 - ik_interpolate = 43 is = 3 omega2 = 6.9039e-07 - ik_interpolate = 43 is = 4 omega2 = 7.9686e-07 - ik_interpolate = 43 is = 5 omega2 = 7.9686e-07 - ik_interpolate = 43 is = 6 omega2 = 9.5068e-07 - - ik_interpolate = 44 is = 1 omega2 = 1.5655e-07 - ik_interpolate = 44 is = 2 omega2 = 1.7444e-07 + ik_interpolate = 42 is = 4 omega2 = 6.7808e-07 + ik_interpolate = 42 is = 5 omega2 = 7.5233e-07 + ik_interpolate = 42 is = 6 omega2 = 8.9359e-07 + + ik_interpolate = 43 is = 1 omega2 = 2.9364e-07 + ik_interpolate = 43 is = 2 omega2 = 2.9364e-07 + ik_interpolate = 43 is = 3 omega2 = 6.9044e-07 + ik_interpolate = 43 is = 4 omega2 = 7.9693e-07 + ik_interpolate = 43 is = 5 omega2 = 7.9693e-07 + ik_interpolate = 43 is = 6 omega2 = 9.5076e-07 + + ik_interpolate = 44 is = 1 omega2 = 1.5657e-07 + ik_interpolate = 44 is = 2 omega2 = 1.7447e-07 ik_interpolate = 44 is = 3 omega2 = 2.9020e-07 - ik_interpolate = 44 is = 4 omega2 = 6.7793e-07 - ik_interpolate = 44 is = 5 omega2 = 7.5218e-07 - ik_interpolate = 44 is = 6 omega2 = 8.9344e-07 + ik_interpolate = 44 is = 4 omega2 = 6.7808e-07 + ik_interpolate = 44 is = 5 omega2 = 7.5233e-07 + ik_interpolate = 44 is = 6 omega2 = 8.9359e-07 - ik_interpolate = 45 is = 1 omega2 = 1.5655e-07 - ik_interpolate = 45 is = 2 omega2 = 1.7444e-07 + ik_interpolate = 45 is = 1 omega2 = 1.5657e-07 + ik_interpolate = 45 is = 2 omega2 = 1.7447e-07 ik_interpolate = 45 is = 3 omega2 = 2.9020e-07 - ik_interpolate = 45 is = 4 omega2 = 6.7793e-07 - ik_interpolate = 45 is = 5 omega2 = 7.5218e-07 - ik_interpolate = 45 is = 6 omega2 = 8.9344e-07 - - ik_interpolate = 46 is = 1 omega2 = 9.5170e-08 - ik_interpolate = 46 is = 2 omega2 = 9.5170e-08 - ik_interpolate = 46 is = 3 omega2 = 3.8116e-07 - ik_interpolate = 46 is = 4 omega2 = 5.8315e-07 - ik_interpolate = 46 is = 5 omega2 = 5.8315e-07 - ik_interpolate = 46 is = 6 omega2 = 8.1008e-07 - - ik_interpolate = 47 is = 1 omega2 = 1.5655e-07 - ik_interpolate = 47 is = 2 omega2 = 1.7444e-07 + ik_interpolate = 45 is = 4 omega2 = 6.7808e-07 + ik_interpolate = 45 is = 5 omega2 = 7.5233e-07 + ik_interpolate = 45 is = 6 omega2 = 8.9359e-07 + + ik_interpolate = 46 is = 1 omega2 = 9.5176e-08 + ik_interpolate = 46 is = 2 omega2 = 9.5176e-08 + ik_interpolate = 46 is = 3 omega2 = 3.8123e-07 + ik_interpolate = 46 is = 4 omega2 = 5.8335e-07 + ik_interpolate = 46 is = 5 omega2 = 5.8335e-07 + ik_interpolate = 46 is = 6 omega2 = 8.1017e-07 + + ik_interpolate = 47 is = 1 omega2 = 1.5657e-07 + ik_interpolate = 47 is = 2 omega2 = 1.7447e-07 ik_interpolate = 47 is = 3 omega2 = 2.9020e-07 - ik_interpolate = 47 is = 4 omega2 = 6.7793e-07 - ik_interpolate = 47 is = 5 omega2 = 7.5218e-07 - ik_interpolate = 47 is = 6 omega2 = 8.9344e-07 + ik_interpolate = 47 is = 4 omega2 = 6.7808e-07 + ik_interpolate = 47 is = 5 omega2 = 7.5233e-07 + ik_interpolate = 47 is = 6 omega2 = 8.9359e-07 ik_interpolate = 48 is = 1 omega2 = 8.2260e-08 - ik_interpolate = 48 is = 2 omega2 = 2.6833e-07 - ik_interpolate = 48 is = 3 omega2 = 5.5036e-07 - ik_interpolate = 48 is = 4 omega2 = 5.5164e-07 - ik_interpolate = 48 is = 5 omega2 = 7.5564e-07 - ik_interpolate = 48 is = 6 omega2 = 8.9949e-07 - - ik_interpolate = 49 is = 1 omega2 = 1.3500e-07 - ik_interpolate = 49 is = 2 omega2 = 1.3500e-07 - ik_interpolate = 49 is = 3 omega2 = 2.6397e-07 - ik_interpolate = 49 is = 4 omega2 = 7.1258e-07 - ik_interpolate = 49 is = 5 omega2 = 7.1258e-07 - ik_interpolate = 49 is = 6 omega2 = 1.2097e-06 + ik_interpolate = 48 is = 2 omega2 = 2.6840e-07 + ik_interpolate = 48 is = 3 omega2 = 5.5055e-07 + ik_interpolate = 48 is = 4 omega2 = 5.5169e-07 + ik_interpolate = 48 is = 5 omega2 = 7.5572e-07 + ik_interpolate = 48 is = 6 omega2 = 8.9956e-07 + + ik_interpolate = 49 is = 1 omega2 = 1.3503e-07 + ik_interpolate = 49 is = 2 omega2 = 1.3503e-07 + ik_interpolate = 49 is = 3 omega2 = 2.6398e-07 + ik_interpolate = 49 is = 4 omega2 = 7.1273e-07 + ik_interpolate = 49 is = 5 omega2 = 7.1273e-07 + ik_interpolate = 49 is = 6 omega2 = 1.2098e-06 ik_interpolate = 50 is = 1 omega2 = 8.2260e-08 - ik_interpolate = 50 is = 2 omega2 = 2.6833e-07 - ik_interpolate = 50 is = 3 omega2 = 5.5036e-07 - ik_interpolate = 50 is = 4 omega2 = 5.5164e-07 - ik_interpolate = 50 is = 5 omega2 = 7.5564e-07 - ik_interpolate = 50 is = 6 omega2 = 8.9949e-07 - - ik_interpolate = 51 is = 1 omega2 = 1.5655e-07 - ik_interpolate = 51 is = 2 omega2 = 1.7444e-07 + ik_interpolate = 50 is = 2 omega2 = 2.6840e-07 + ik_interpolate = 50 is = 3 omega2 = 5.5055e-07 + ik_interpolate = 50 is = 4 omega2 = 5.5169e-07 + ik_interpolate = 50 is = 5 omega2 = 7.5572e-07 + ik_interpolate = 50 is = 6 omega2 = 8.9956e-07 + + ik_interpolate = 51 is = 1 omega2 = 1.5657e-07 + ik_interpolate = 51 is = 2 omega2 = 1.7447e-07 ik_interpolate = 51 is = 3 omega2 = 2.9020e-07 - ik_interpolate = 51 is = 4 omega2 = 6.7793e-07 - ik_interpolate = 51 is = 5 omega2 = 7.5218e-07 - ik_interpolate = 51 is = 6 omega2 = 8.9344e-07 + ik_interpolate = 51 is = 4 omega2 = 6.7808e-07 + ik_interpolate = 51 is = 5 omega2 = 7.5233e-07 + ik_interpolate = 51 is = 6 omega2 = 8.9359e-07 - ik_interpolate = 52 is = 1 omega2 = 4.2579e-08 - ik_interpolate = 52 is = 2 omega2 = 4.2579e-08 - ik_interpolate = 52 is = 3 omega2 = 4.3781e-07 - ik_interpolate = 52 is = 4 omega2 = 4.5561e-07 - ik_interpolate = 52 is = 5 omega2 = 4.5561e-07 - ik_interpolate = 52 is = 6 omega2 = 8.4636e-07 + ik_interpolate = 52 is = 1 omega2 = 4.2582e-08 + ik_interpolate = 52 is = 2 omega2 = 4.2582e-08 + ik_interpolate = 52 is = 3 omega2 = 4.3788e-07 + ik_interpolate = 52 is = 4 omega2 = 4.5581e-07 + ik_interpolate = 52 is = 5 omega2 = 4.5581e-07 + ik_interpolate = 52 is = 6 omega2 = 8.4643e-07 ik_interpolate = 53 is = 1 omega2 = 8.2260e-08 - ik_interpolate = 53 is = 2 omega2 = 2.6833e-07 - ik_interpolate = 53 is = 3 omega2 = 5.5036e-07 - ik_interpolate = 53 is = 4 omega2 = 5.5164e-07 - ik_interpolate = 53 is = 5 omega2 = 7.5564e-07 - ik_interpolate = 53 is = 6 omega2 = 8.9949e-07 - - ik_interpolate = 54 is = 1 omega2 = 1.5655e-07 - ik_interpolate = 54 is = 2 omega2 = 1.7444e-07 + ik_interpolate = 53 is = 2 omega2 = 2.6840e-07 + ik_interpolate = 53 is = 3 omega2 = 5.5055e-07 + ik_interpolate = 53 is = 4 omega2 = 5.5169e-07 + ik_interpolate = 53 is = 5 omega2 = 7.5572e-07 + ik_interpolate = 53 is = 6 omega2 = 8.9956e-07 + + ik_interpolate = 54 is = 1 omega2 = 1.5657e-07 + ik_interpolate = 54 is = 2 omega2 = 1.7447e-07 ik_interpolate = 54 is = 3 omega2 = 2.9020e-07 - ik_interpolate = 54 is = 4 omega2 = 6.7793e-07 - ik_interpolate = 54 is = 5 omega2 = 7.5218e-07 - ik_interpolate = 54 is = 6 omega2 = 8.9344e-07 - - ik_interpolate = 55 is = 1 omega2 = 9.5170e-08 - ik_interpolate = 55 is = 2 omega2 = 9.5170e-08 - ik_interpolate = 55 is = 3 omega2 = 3.8116e-07 - ik_interpolate = 55 is = 4 omega2 = 5.8315e-07 - ik_interpolate = 55 is = 5 omega2 = 5.8315e-07 - ik_interpolate = 55 is = 6 omega2 = 8.1008e-07 - - ik_interpolate = 56 is = 1 omega2 = 1.5655e-07 - ik_interpolate = 56 is = 2 omega2 = 1.7444e-07 + ik_interpolate = 54 is = 4 omega2 = 6.7808e-07 + ik_interpolate = 54 is = 5 omega2 = 7.5233e-07 + ik_interpolate = 54 is = 6 omega2 = 8.9359e-07 + + ik_interpolate = 55 is = 1 omega2 = 9.5176e-08 + ik_interpolate = 55 is = 2 omega2 = 9.5176e-08 + ik_interpolate = 55 is = 3 omega2 = 3.8123e-07 + ik_interpolate = 55 is = 4 omega2 = 5.8335e-07 + ik_interpolate = 55 is = 5 omega2 = 5.8335e-07 + ik_interpolate = 55 is = 6 omega2 = 8.1017e-07 + + ik_interpolate = 56 is = 1 omega2 = 1.5657e-07 + ik_interpolate = 56 is = 2 omega2 = 1.7447e-07 ik_interpolate = 56 is = 3 omega2 = 2.9020e-07 - ik_interpolate = 56 is = 4 omega2 = 6.7793e-07 - ik_interpolate = 56 is = 5 omega2 = 7.5218e-07 - ik_interpolate = 56 is = 6 omega2 = 8.9344e-07 + ik_interpolate = 56 is = 4 omega2 = 6.7808e-07 + ik_interpolate = 56 is = 5 omega2 = 7.5233e-07 + ik_interpolate = 56 is = 6 omega2 = 8.9359e-07 - ik_interpolate = 57 is = 1 omega2 = 1.5655e-07 - ik_interpolate = 57 is = 2 omega2 = 1.7444e-07 + ik_interpolate = 57 is = 1 omega2 = 1.5657e-07 + ik_interpolate = 57 is = 2 omega2 = 1.7447e-07 ik_interpolate = 57 is = 3 omega2 = 2.9020e-07 - ik_interpolate = 57 is = 4 omega2 = 6.7793e-07 - ik_interpolate = 57 is = 5 omega2 = 7.5218e-07 - ik_interpolate = 57 is = 6 omega2 = 8.9344e-07 - - ik_interpolate = 58 is = 1 omega2 = 9.5170e-08 - ik_interpolate = 58 is = 2 omega2 = 9.5170e-08 - ik_interpolate = 58 is = 3 omega2 = 3.8116e-07 - ik_interpolate = 58 is = 4 omega2 = 5.8315e-07 - ik_interpolate = 58 is = 5 omega2 = 5.8315e-07 - ik_interpolate = 58 is = 6 omega2 = 8.1008e-07 - - ik_interpolate = 59 is = 1 omega2 = 1.5655e-07 - ik_interpolate = 59 is = 2 omega2 = 1.7444e-07 + ik_interpolate = 57 is = 4 omega2 = 6.7808e-07 + ik_interpolate = 57 is = 5 omega2 = 7.5233e-07 + ik_interpolate = 57 is = 6 omega2 = 8.9359e-07 + + ik_interpolate = 58 is = 1 omega2 = 9.5176e-08 + ik_interpolate = 58 is = 2 omega2 = 9.5176e-08 + ik_interpolate = 58 is = 3 omega2 = 3.8123e-07 + ik_interpolate = 58 is = 4 omega2 = 5.8335e-07 + ik_interpolate = 58 is = 5 omega2 = 5.8335e-07 + ik_interpolate = 58 is = 6 omega2 = 8.1017e-07 + + ik_interpolate = 59 is = 1 omega2 = 1.5657e-07 + ik_interpolate = 59 is = 2 omega2 = 1.7447e-07 ik_interpolate = 59 is = 3 omega2 = 2.9020e-07 - ik_interpolate = 59 is = 4 omega2 = 6.7793e-07 - ik_interpolate = 59 is = 5 omega2 = 7.5218e-07 - ik_interpolate = 59 is = 6 omega2 = 8.9344e-07 + ik_interpolate = 59 is = 4 omega2 = 6.7808e-07 + ik_interpolate = 59 is = 5 omega2 = 7.5233e-07 + ik_interpolate = 59 is = 6 omega2 = 8.9359e-07 ik_interpolate = 60 is = 1 omega2 = 8.2260e-08 - ik_interpolate = 60 is = 2 omega2 = 2.6833e-07 - ik_interpolate = 60 is = 3 omega2 = 5.5036e-07 - ik_interpolate = 60 is = 4 omega2 = 5.5164e-07 - ik_interpolate = 60 is = 5 omega2 = 7.5564e-07 - ik_interpolate = 60 is = 6 omega2 = 8.9949e-07 - - ik_interpolate = 61 is = 1 omega2 = 4.2579e-08 - ik_interpolate = 61 is = 2 omega2 = 4.2579e-08 - ik_interpolate = 61 is = 3 omega2 = 4.3781e-07 - ik_interpolate = 61 is = 4 omega2 = 4.5561e-07 - ik_interpolate = 61 is = 5 omega2 = 4.5561e-07 - ik_interpolate = 61 is = 6 omega2 = 8.4636e-07 - - ik_interpolate = 62 is = 1 omega2 = 1.5655e-07 - ik_interpolate = 62 is = 2 omega2 = 1.7444e-07 + ik_interpolate = 60 is = 2 omega2 = 2.6840e-07 + ik_interpolate = 60 is = 3 omega2 = 5.5055e-07 + ik_interpolate = 60 is = 4 omega2 = 5.5169e-07 + ik_interpolate = 60 is = 5 omega2 = 7.5572e-07 + ik_interpolate = 60 is = 6 omega2 = 8.9956e-07 + + ik_interpolate = 61 is = 1 omega2 = 4.2582e-08 + ik_interpolate = 61 is = 2 omega2 = 4.2582e-08 + ik_interpolate = 61 is = 3 omega2 = 4.3788e-07 + ik_interpolate = 61 is = 4 omega2 = 4.5581e-07 + ik_interpolate = 61 is = 5 omega2 = 4.5581e-07 + ik_interpolate = 61 is = 6 omega2 = 8.4643e-07 + + ik_interpolate = 62 is = 1 omega2 = 1.5657e-07 + ik_interpolate = 62 is = 2 omega2 = 1.7447e-07 ik_interpolate = 62 is = 3 omega2 = 2.9020e-07 - ik_interpolate = 62 is = 4 omega2 = 6.7793e-07 - ik_interpolate = 62 is = 5 omega2 = 7.5218e-07 - ik_interpolate = 62 is = 6 omega2 = 8.9344e-07 + ik_interpolate = 62 is = 4 omega2 = 6.7808e-07 + ik_interpolate = 62 is = 5 omega2 = 7.5233e-07 + ik_interpolate = 62 is = 6 omega2 = 8.9359e-07 ik_interpolate = 63 is = 1 omega2 = 8.2260e-08 - ik_interpolate = 63 is = 2 omega2 = 2.6833e-07 - ik_interpolate = 63 is = 3 omega2 = 5.5036e-07 - ik_interpolate = 63 is = 4 omega2 = 5.5164e-07 - ik_interpolate = 63 is = 5 omega2 = 7.5564e-07 - ik_interpolate = 63 is = 6 omega2 = 8.9949e-07 - - ik_interpolate = 64 is = 1 omega2 = 1.3500e-07 - ik_interpolate = 64 is = 2 omega2 = 1.3500e-07 - ik_interpolate = 64 is = 3 omega2 = 2.6397e-07 - ik_interpolate = 64 is = 4 omega2 = 7.1258e-07 - ik_interpolate = 64 is = 5 omega2 = 7.1258e-07 - ik_interpolate = 64 is = 6 omega2 = 1.2097e-06 + ik_interpolate = 63 is = 2 omega2 = 2.6840e-07 + ik_interpolate = 63 is = 3 omega2 = 5.5055e-07 + ik_interpolate = 63 is = 4 omega2 = 5.5169e-07 + ik_interpolate = 63 is = 5 omega2 = 7.5572e-07 + ik_interpolate = 63 is = 6 omega2 = 8.9956e-07 + + ik_interpolate = 64 is = 1 omega2 = 1.3503e-07 + ik_interpolate = 64 is = 2 omega2 = 1.3503e-07 + ik_interpolate = 64 is = 3 omega2 = 2.6398e-07 + ik_interpolate = 64 is = 4 omega2 = 7.1273e-07 + ik_interpolate = 64 is = 5 omega2 = 7.1273e-07 + ik_interpolate = 64 is = 6 omega2 = 1.2098e-06 Temperature = 2.0000e+02 K SCPH ITER 1 : DIFF = N/A - SCPH ITER 2 : DIFF = 6.3505e-08 - SCPH ITER 3 : DIFF = 5.6672e-08 - SCPH ITER 4 : DIFF = 5.0448e-08 - SCPH ITER 5 : DIFF = 4.5135e-08 - SCPH ITER 6 : DIFF = 4.0280e-08 - SCPH ITER 7 : DIFF = 3.5949e-08 - SCPH ITER 8 : DIFF = 3.2083e-08 - SCPH ITER 9 : DIFF = 2.8634e-08 - SCPH ITER 10 : DIFF = 2.5556e-08 - SCPH ITER 11 : DIFF = 2.2809e-08 - SCPH ITER 12 : DIFF = 2.0357e-08 - SCPH ITER 13 : DIFF = 1.8169e-08 - SCPH ITER 14 : DIFF = 1.6216e-08 - SCPH ITER 15 : DIFF = 1.4473e-08 - SCPH ITER 16 : DIFF = 1.2918e-08 - SCPH ITER 17 : DIFF = 1.1530e-08 - SCPH ITER 18 : DIFF = 1.0291e-08 - SCPH ITER 19 : DIFF = 9.1851e-09 + SCPH ITER 2 : DIFF = 6.4042e-08 + SCPH ITER 3 : DIFF = 5.7151e-08 + SCPH ITER 4 : DIFF = 5.0781e-08 + SCPH ITER 5 : DIFF = 4.5517e-08 + SCPH ITER 6 : DIFF = 4.0621e-08 + SCPH ITER 7 : DIFF = 3.6253e-08 + SCPH ITER 8 : DIFF = 3.2355e-08 + SCPH ITER 9 : DIFF = 2.8876e-08 + SCPH ITER 10 : DIFF = 2.5772e-08 + SCPH ITER 11 : DIFF = 2.3001e-08 + SCPH ITER 12 : DIFF = 2.0529e-08 + SCPH ITER 13 : DIFF = 1.8323e-08 + SCPH ITER 14 : DIFF = 1.6353e-08 + SCPH ITER 15 : DIFF = 1.4596e-08 + SCPH ITER 16 : DIFF = 1.3027e-08 + SCPH ITER 17 : DIFF = 1.1627e-08 + SCPH ITER 18 : DIFF = 1.0378e-08 + SCPH ITER 19 : DIFF = 9.2628e-09 + SCPH ITER 20 : DIFF = 8.2675e-09 + SCPH ITER 21 : DIFF = 7.3792e-09 + SCPH ITER 22 : DIFF = 6.5863e-09 + SCPH ITER 23 : DIFF = 5.8787e-09 + SCPH ITER 24 : DIFF = 5.2470e-09 + SCPH ITER 25 : DIFF = 4.6833e-09 + SCPH ITER 26 : DIFF = 4.1801e-09 + SCPH ITER 27 : DIFF = 3.7310e-09 + SCPH ITER 28 : DIFF = 3.3302e-09 + SCPH ITER 29 : DIFF = 2.9724e-09 + SCPH ITER 30 : DIFF = 2.6531e-09 + SCPH ITER 31 : DIFF = 2.3680e-09 + SCPH ITER 32 : DIFF = 2.1136e-09 + SCPH ITER 33 : DIFF = 1.8866e-09 + SCPH ITER 34 : DIFF = 1.6839e-09 + SCPH ITER 35 : DIFF = 1.5030e-09 + SCPH ITER 36 : DIFF = 1.3415e-09 + SCPH ITER 37 : DIFF = 1.1974e-09 + SCPH ITER 38 : DIFF = 1.0688e-09 + SCPH ITER 39 : DIFF = 9.5394e-10 + SCPH ITER 40 : DIFF = 8.5146e-10 + SCPH ITER 41 : DIFF = 7.5998e-10 + SCPH ITER 42 : DIFF = 6.7834e-10 + SCPH ITER 43 : DIFF = 6.0547e-10 + SCPH ITER 44 : DIFF = 5.4042e-10 + SCPH ITER 45 : DIFF = 4.8236e-10 + SCPH ITER 46 : DIFF = 4.3054e-10 + SCPH ITER 47 : DIFF = 3.8429e-10 + SCPH ITER 48 : DIFF = 3.4300e-10 + SCPH ITER 49 : DIFF = 3.0616e-10 + SCPH ITER 50 : DIFF = 2.7327e-10 + SCPH ITER 51 : DIFF = 2.4391e-10 + SCPH ITER 52 : DIFF = 2.1771e-10 + SCPH ITER 53 : DIFF = 1.9432e-10 + SCPH ITER 54 : DIFF = 1.7344e-10 + SCPH ITER 55 : DIFF = 1.5481e-10 + SCPH ITER 56 : DIFF = 1.3818e-10 + SCPH ITER 57 : DIFF = 1.2334e-10 + SCPH ITER 58 : DIFF = 1.1010e-10 + SCPH ITER 59 : DIFF = 9.8268e-11 DIFF < SCPH_TOL : break SCPH loop - Temp = 2.0000e+02 : convergence achieved in 19 iterations. + Temp = 2.0000e+02 : convergence achieved in 59 iterations. New eigenvalues - ik_interpolate = 1 is = 1 omega2 = 0.0000e+00 - ik_interpolate = 1 is = 2 omega2 = 0.0000e+00 - ik_interpolate = 1 is = 3 omega2 = 0.0000e+00 - ik_interpolate = 1 is = 4 omega2 = 2.1093e-07 - ik_interpolate = 1 is = 5 omega2 = 2.1093e-07 - ik_interpolate = 1 is = 6 omega2 = 2.1093e-07 - - ik_interpolate = 2 is = 1 omega2 = 1.3208e-07 - ik_interpolate = 2 is = 2 omega2 = 1.3208e-07 - ik_interpolate = 2 is = 3 omega2 = 2.6297e-07 - ik_interpolate = 2 is = 4 omega2 = 6.9574e-07 - ik_interpolate = 2 is = 5 omega2 = 6.9574e-07 - ik_interpolate = 2 is = 6 omega2 = 1.1925e-06 - - ik_interpolate = 3 is = 1 omega2 = 2.8693e-07 - ik_interpolate = 3 is = 2 omega2 = 2.8693e-07 - ik_interpolate = 3 is = 3 omega2 = 6.8814e-07 - ik_interpolate = 3 is = 4 omega2 = 7.9141e-07 - ik_interpolate = 3 is = 5 omega2 = 7.9141e-07 - ik_interpolate = 3 is = 6 omega2 = 9.4382e-07 - - ik_interpolate = 4 is = 1 omega2 = 1.3208e-07 - ik_interpolate = 4 is = 2 omega2 = 1.3208e-07 - ik_interpolate = 4 is = 3 omega2 = 2.6297e-07 - ik_interpolate = 4 is = 4 omega2 = 6.9574e-07 - ik_interpolate = 4 is = 5 omega2 = 6.9574e-07 - ik_interpolate = 4 is = 6 omega2 = 1.1925e-06 - - ik_interpolate = 5 is = 1 omega2 = 1.3208e-07 - ik_interpolate = 5 is = 2 omega2 = 1.3208e-07 - ik_interpolate = 5 is = 3 omega2 = 2.6297e-07 - ik_interpolate = 5 is = 4 omega2 = 6.9574e-07 - ik_interpolate = 5 is = 5 omega2 = 6.9574e-07 - ik_interpolate = 5 is = 6 omega2 = 1.1925e-06 - - ik_interpolate = 6 is = 1 omega2 = 4.2303e-08 - ik_interpolate = 6 is = 2 omega2 = 4.2303e-08 - ik_interpolate = 6 is = 3 omega2 = 4.3021e-07 - ik_interpolate = 6 is = 4 omega2 = 4.3094e-07 - ik_interpolate = 6 is = 5 omega2 = 4.3094e-07 - ik_interpolate = 6 is = 6 omega2 = 8.4086e-07 - - ik_interpolate = 7 is = 1 omega2 = 1.5371e-07 - ik_interpolate = 7 is = 2 omega2 = 1.7084e-07 + ik_interpolate = 1 is = 1 omega2 = 3.4985e-23 + ik_interpolate = 1 is = 2 omega2 = 7.1692e-23 + ik_interpolate = 1 is = 3 omega2 = 1.1501e-22 + ik_interpolate = 1 is = 4 omega2 = 2.1117e-07 + ik_interpolate = 1 is = 5 omega2 = 2.1117e-07 + ik_interpolate = 1 is = 6 omega2 = 2.1117e-07 + + ik_interpolate = 2 is = 1 omega2 = 1.3211e-07 + ik_interpolate = 2 is = 2 omega2 = 1.3211e-07 + ik_interpolate = 2 is = 3 omega2 = 2.6298e-07 + ik_interpolate = 2 is = 4 omega2 = 6.9590e-07 + ik_interpolate = 2 is = 5 omega2 = 6.9590e-07 + ik_interpolate = 2 is = 6 omega2 = 1.1927e-06 + + ik_interpolate = 3 is = 1 omega2 = 2.8699e-07 + ik_interpolate = 3 is = 2 omega2 = 2.8699e-07 + ik_interpolate = 3 is = 3 omega2 = 6.8819e-07 + ik_interpolate = 3 is = 4 omega2 = 7.9149e-07 + ik_interpolate = 3 is = 5 omega2 = 7.9149e-07 + ik_interpolate = 3 is = 6 omega2 = 9.4391e-07 + + ik_interpolate = 4 is = 1 omega2 = 1.3211e-07 + ik_interpolate = 4 is = 2 omega2 = 1.3211e-07 + ik_interpolate = 4 is = 3 omega2 = 2.6298e-07 + ik_interpolate = 4 is = 4 omega2 = 6.9590e-07 + ik_interpolate = 4 is = 5 omega2 = 6.9590e-07 + ik_interpolate = 4 is = 6 omega2 = 1.1927e-06 + + ik_interpolate = 5 is = 1 omega2 = 1.3211e-07 + ik_interpolate = 5 is = 2 omega2 = 1.3211e-07 + ik_interpolate = 5 is = 3 omega2 = 2.6298e-07 + ik_interpolate = 5 is = 4 omega2 = 6.9590e-07 + ik_interpolate = 5 is = 5 omega2 = 6.9590e-07 + ik_interpolate = 5 is = 6 omega2 = 1.1927e-06 + + ik_interpolate = 6 is = 1 omega2 = 4.2305e-08 + ik_interpolate = 6 is = 2 omega2 = 4.2305e-08 + ik_interpolate = 6 is = 3 omega2 = 4.3028e-07 + ik_interpolate = 6 is = 4 omega2 = 4.3115e-07 + ik_interpolate = 6 is = 5 omega2 = 4.3115e-07 + ik_interpolate = 6 is = 6 omega2 = 8.4093e-07 + + ik_interpolate = 7 is = 1 omega2 = 1.5374e-07 + ik_interpolate = 7 is = 2 omega2 = 1.7087e-07 ik_interpolate = 7 is = 3 omega2 = 2.9125e-07 - ik_interpolate = 7 is = 4 omega2 = 6.6172e-07 - ik_interpolate = 7 is = 5 omega2 = 7.3557e-07 - ik_interpolate = 7 is = 6 omega2 = 8.7681e-07 + ik_interpolate = 7 is = 4 omega2 = 6.6187e-07 + ik_interpolate = 7 is = 5 omega2 = 7.3572e-07 + ik_interpolate = 7 is = 6 omega2 = 8.7697e-07 ik_interpolate = 8 is = 1 omega2 = 8.2281e-08 - ik_interpolate = 8 is = 2 omega2 = 2.6093e-07 - ik_interpolate = 8 is = 3 omega2 = 5.2757e-07 - ik_interpolate = 8 is = 4 omega2 = 5.4685e-07 - ik_interpolate = 8 is = 5 omega2 = 7.4921e-07 - ik_interpolate = 8 is = 6 omega2 = 8.9274e-07 - - ik_interpolate = 9 is = 1 omega2 = 2.8693e-07 - ik_interpolate = 9 is = 2 omega2 = 2.8693e-07 - ik_interpolate = 9 is = 3 omega2 = 6.8814e-07 - ik_interpolate = 9 is = 4 omega2 = 7.9141e-07 - ik_interpolate = 9 is = 5 omega2 = 7.9141e-07 - ik_interpolate = 9 is = 6 omega2 = 9.4382e-07 - - ik_interpolate = 10 is = 1 omega2 = 1.5371e-07 - ik_interpolate = 10 is = 2 omega2 = 1.7084e-07 + ik_interpolate = 8 is = 2 omega2 = 2.6100e-07 + ik_interpolate = 8 is = 3 omega2 = 5.2777e-07 + ik_interpolate = 8 is = 4 omega2 = 5.4690e-07 + ik_interpolate = 8 is = 5 omega2 = 7.4929e-07 + ik_interpolate = 8 is = 6 omega2 = 8.9282e-07 + + ik_interpolate = 9 is = 1 omega2 = 2.8699e-07 + ik_interpolate = 9 is = 2 omega2 = 2.8699e-07 + ik_interpolate = 9 is = 3 omega2 = 6.8819e-07 + ik_interpolate = 9 is = 4 omega2 = 7.9149e-07 + ik_interpolate = 9 is = 5 omega2 = 7.9149e-07 + ik_interpolate = 9 is = 6 omega2 = 9.4391e-07 + + ik_interpolate = 10 is = 1 omega2 = 1.5374e-07 + ik_interpolate = 10 is = 2 omega2 = 1.7087e-07 ik_interpolate = 10 is = 3 omega2 = 2.9125e-07 - ik_interpolate = 10 is = 4 omega2 = 6.6172e-07 - ik_interpolate = 10 is = 5 omega2 = 7.3557e-07 - ik_interpolate = 10 is = 6 omega2 = 8.7681e-07 - - ik_interpolate = 11 is = 1 omega2 = 5.3329e-08 - ik_interpolate = 11 is = 2 omega2 = 5.3329e-08 - ik_interpolate = 11 is = 3 omega2 = 9.5774e-08 - ik_interpolate = 11 is = 4 omega2 = 4.9285e-07 - ik_interpolate = 11 is = 5 omega2 = 4.9285e-07 - ik_interpolate = 11 is = 6 omega2 = 5.8593e-07 - - ik_interpolate = 12 is = 1 omega2 = 1.5371e-07 - ik_interpolate = 12 is = 2 omega2 = 1.7084e-07 + ik_interpolate = 10 is = 4 omega2 = 6.6187e-07 + ik_interpolate = 10 is = 5 omega2 = 7.3572e-07 + ik_interpolate = 10 is = 6 omega2 = 8.7697e-07 + + ik_interpolate = 11 is = 1 omega2 = 5.3339e-08 + ik_interpolate = 11 is = 2 omega2 = 5.3339e-08 + ik_interpolate = 11 is = 3 omega2 = 9.5788e-08 + ik_interpolate = 11 is = 4 omega2 = 4.9305e-07 + ik_interpolate = 11 is = 5 omega2 = 4.9305e-07 + ik_interpolate = 11 is = 6 omega2 = 5.8613e-07 + + ik_interpolate = 12 is = 1 omega2 = 1.5374e-07 + ik_interpolate = 12 is = 2 omega2 = 1.7087e-07 ik_interpolate = 12 is = 3 omega2 = 2.9125e-07 - ik_interpolate = 12 is = 4 omega2 = 6.6172e-07 - ik_interpolate = 12 is = 5 omega2 = 7.3557e-07 - ik_interpolate = 12 is = 6 omega2 = 8.7681e-07 + ik_interpolate = 12 is = 4 omega2 = 6.6187e-07 + ik_interpolate = 12 is = 5 omega2 = 7.3572e-07 + ik_interpolate = 12 is = 6 omega2 = 8.7697e-07 - ik_interpolate = 13 is = 1 omega2 = 1.3208e-07 - ik_interpolate = 13 is = 2 omega2 = 1.3208e-07 - ik_interpolate = 13 is = 3 omega2 = 2.6297e-07 - ik_interpolate = 13 is = 4 omega2 = 6.9574e-07 - ik_interpolate = 13 is = 5 omega2 = 6.9574e-07 - ik_interpolate = 13 is = 6 omega2 = 1.1925e-06 + ik_interpolate = 13 is = 1 omega2 = 1.3211e-07 + ik_interpolate = 13 is = 2 omega2 = 1.3211e-07 + ik_interpolate = 13 is = 3 omega2 = 2.6298e-07 + ik_interpolate = 13 is = 4 omega2 = 6.9590e-07 + ik_interpolate = 13 is = 5 omega2 = 6.9590e-07 + ik_interpolate = 13 is = 6 omega2 = 1.1927e-06 ik_interpolate = 14 is = 1 omega2 = 8.2281e-08 - ik_interpolate = 14 is = 2 omega2 = 2.6093e-07 - ik_interpolate = 14 is = 3 omega2 = 5.2757e-07 - ik_interpolate = 14 is = 4 omega2 = 5.4685e-07 - ik_interpolate = 14 is = 5 omega2 = 7.4921e-07 - ik_interpolate = 14 is = 6 omega2 = 8.9274e-07 - - ik_interpolate = 15 is = 1 omega2 = 1.5371e-07 - ik_interpolate = 15 is = 2 omega2 = 1.7084e-07 + ik_interpolate = 14 is = 2 omega2 = 2.6100e-07 + ik_interpolate = 14 is = 3 omega2 = 5.2777e-07 + ik_interpolate = 14 is = 4 omega2 = 5.4690e-07 + ik_interpolate = 14 is = 5 omega2 = 7.4929e-07 + ik_interpolate = 14 is = 6 omega2 = 8.9282e-07 + + ik_interpolate = 15 is = 1 omega2 = 1.5374e-07 + ik_interpolate = 15 is = 2 omega2 = 1.7087e-07 ik_interpolate = 15 is = 3 omega2 = 2.9125e-07 - ik_interpolate = 15 is = 4 omega2 = 6.6172e-07 - ik_interpolate = 15 is = 5 omega2 = 7.3557e-07 - ik_interpolate = 15 is = 6 omega2 = 8.7681e-07 - - ik_interpolate = 16 is = 1 omega2 = 4.2303e-08 - ik_interpolate = 16 is = 2 omega2 = 4.2303e-08 - ik_interpolate = 16 is = 3 omega2 = 4.3021e-07 - ik_interpolate = 16 is = 4 omega2 = 4.3094e-07 - ik_interpolate = 16 is = 5 omega2 = 4.3094e-07 - ik_interpolate = 16 is = 6 omega2 = 8.4086e-07 - - ik_interpolate = 17 is = 1 omega2 = 1.3208e-07 - ik_interpolate = 17 is = 2 omega2 = 1.3208e-07 - ik_interpolate = 17 is = 3 omega2 = 2.6297e-07 - ik_interpolate = 17 is = 4 omega2 = 6.9574e-07 - ik_interpolate = 17 is = 5 omega2 = 6.9574e-07 - ik_interpolate = 17 is = 6 omega2 = 1.1925e-06 - - ik_interpolate = 18 is = 1 omega2 = 4.2303e-08 - ik_interpolate = 18 is = 2 omega2 = 4.2303e-08 - ik_interpolate = 18 is = 3 omega2 = 4.3021e-07 - ik_interpolate = 18 is = 4 omega2 = 4.3094e-07 - ik_interpolate = 18 is = 5 omega2 = 4.3094e-07 - ik_interpolate = 18 is = 6 omega2 = 8.4086e-07 - - ik_interpolate = 19 is = 1 omega2 = 1.5371e-07 - ik_interpolate = 19 is = 2 omega2 = 1.7084e-07 + ik_interpolate = 15 is = 4 omega2 = 6.6187e-07 + ik_interpolate = 15 is = 5 omega2 = 7.3572e-07 + ik_interpolate = 15 is = 6 omega2 = 8.7697e-07 + + ik_interpolate = 16 is = 1 omega2 = 4.2305e-08 + ik_interpolate = 16 is = 2 omega2 = 4.2305e-08 + ik_interpolate = 16 is = 3 omega2 = 4.3028e-07 + ik_interpolate = 16 is = 4 omega2 = 4.3115e-07 + ik_interpolate = 16 is = 5 omega2 = 4.3115e-07 + ik_interpolate = 16 is = 6 omega2 = 8.4093e-07 + + ik_interpolate = 17 is = 1 omega2 = 1.3211e-07 + ik_interpolate = 17 is = 2 omega2 = 1.3211e-07 + ik_interpolate = 17 is = 3 omega2 = 2.6298e-07 + ik_interpolate = 17 is = 4 omega2 = 6.9590e-07 + ik_interpolate = 17 is = 5 omega2 = 6.9590e-07 + ik_interpolate = 17 is = 6 omega2 = 1.1927e-06 + + ik_interpolate = 18 is = 1 omega2 = 4.2305e-08 + ik_interpolate = 18 is = 2 omega2 = 4.2305e-08 + ik_interpolate = 18 is = 3 omega2 = 4.3028e-07 + ik_interpolate = 18 is = 4 omega2 = 4.3115e-07 + ik_interpolate = 18 is = 5 omega2 = 4.3115e-07 + ik_interpolate = 18 is = 6 omega2 = 8.4093e-07 + + ik_interpolate = 19 is = 1 omega2 = 1.5374e-07 + ik_interpolate = 19 is = 2 omega2 = 1.7087e-07 ik_interpolate = 19 is = 3 omega2 = 2.9125e-07 - ik_interpolate = 19 is = 4 omega2 = 6.6172e-07 - ik_interpolate = 19 is = 5 omega2 = 7.3557e-07 - ik_interpolate = 19 is = 6 omega2 = 8.7681e-07 + ik_interpolate = 19 is = 4 omega2 = 6.6187e-07 + ik_interpolate = 19 is = 5 omega2 = 7.3572e-07 + ik_interpolate = 19 is = 6 omega2 = 8.7697e-07 ik_interpolate = 20 is = 1 omega2 = 8.2281e-08 - ik_interpolate = 20 is = 2 omega2 = 2.6093e-07 - ik_interpolate = 20 is = 3 omega2 = 5.2757e-07 - ik_interpolate = 20 is = 4 omega2 = 5.4685e-07 - ik_interpolate = 20 is = 5 omega2 = 7.4921e-07 - ik_interpolate = 20 is = 6 omega2 = 8.9274e-07 - - ik_interpolate = 21 is = 1 omega2 = 4.2303e-08 - ik_interpolate = 21 is = 2 omega2 = 4.2303e-08 - ik_interpolate = 21 is = 3 omega2 = 4.3021e-07 - ik_interpolate = 21 is = 4 omega2 = 4.3094e-07 - ik_interpolate = 21 is = 5 omega2 = 4.3094e-07 - ik_interpolate = 21 is = 6 omega2 = 8.4086e-07 - - ik_interpolate = 22 is = 1 omega2 = 1.3208e-07 - ik_interpolate = 22 is = 2 omega2 = 1.3208e-07 - ik_interpolate = 22 is = 3 omega2 = 2.6297e-07 - ik_interpolate = 22 is = 4 omega2 = 6.9574e-07 - ik_interpolate = 22 is = 5 omega2 = 6.9574e-07 - ik_interpolate = 22 is = 6 omega2 = 1.1925e-06 + ik_interpolate = 20 is = 2 omega2 = 2.6100e-07 + ik_interpolate = 20 is = 3 omega2 = 5.2777e-07 + ik_interpolate = 20 is = 4 omega2 = 5.4690e-07 + ik_interpolate = 20 is = 5 omega2 = 7.4929e-07 + ik_interpolate = 20 is = 6 omega2 = 8.9282e-07 + + ik_interpolate = 21 is = 1 omega2 = 4.2305e-08 + ik_interpolate = 21 is = 2 omega2 = 4.2305e-08 + ik_interpolate = 21 is = 3 omega2 = 4.3028e-07 + ik_interpolate = 21 is = 4 omega2 = 4.3115e-07 + ik_interpolate = 21 is = 5 omega2 = 4.3115e-07 + ik_interpolate = 21 is = 6 omega2 = 8.4093e-07 + + ik_interpolate = 22 is = 1 omega2 = 1.3211e-07 + ik_interpolate = 22 is = 2 omega2 = 1.3211e-07 + ik_interpolate = 22 is = 3 omega2 = 2.6298e-07 + ik_interpolate = 22 is = 4 omega2 = 6.9590e-07 + ik_interpolate = 22 is = 5 omega2 = 6.9590e-07 + ik_interpolate = 22 is = 6 omega2 = 1.1927e-06 ik_interpolate = 23 is = 1 omega2 = 8.2281e-08 - ik_interpolate = 23 is = 2 omega2 = 2.6093e-07 - ik_interpolate = 23 is = 3 omega2 = 5.2757e-07 - ik_interpolate = 23 is = 4 omega2 = 5.4685e-07 - ik_interpolate = 23 is = 5 omega2 = 7.4921e-07 - ik_interpolate = 23 is = 6 omega2 = 8.9274e-07 - - ik_interpolate = 24 is = 1 omega2 = 1.5371e-07 - ik_interpolate = 24 is = 2 omega2 = 1.7084e-07 + ik_interpolate = 23 is = 2 omega2 = 2.6100e-07 + ik_interpolate = 23 is = 3 omega2 = 5.2777e-07 + ik_interpolate = 23 is = 4 omega2 = 5.4690e-07 + ik_interpolate = 23 is = 5 omega2 = 7.4929e-07 + ik_interpolate = 23 is = 6 omega2 = 8.9282e-07 + + ik_interpolate = 24 is = 1 omega2 = 1.5374e-07 + ik_interpolate = 24 is = 2 omega2 = 1.7087e-07 ik_interpolate = 24 is = 3 omega2 = 2.9125e-07 - ik_interpolate = 24 is = 4 omega2 = 6.6172e-07 - ik_interpolate = 24 is = 5 omega2 = 7.3557e-07 - ik_interpolate = 24 is = 6 omega2 = 8.7681e-07 + ik_interpolate = 24 is = 4 omega2 = 6.6187e-07 + ik_interpolate = 24 is = 5 omega2 = 7.3572e-07 + ik_interpolate = 24 is = 6 omega2 = 8.7697e-07 - ik_interpolate = 25 is = 1 omega2 = 1.5371e-07 - ik_interpolate = 25 is = 2 omega2 = 1.7084e-07 + ik_interpolate = 25 is = 1 omega2 = 1.5374e-07 + ik_interpolate = 25 is = 2 omega2 = 1.7087e-07 ik_interpolate = 25 is = 3 omega2 = 2.9125e-07 - ik_interpolate = 25 is = 4 omega2 = 6.6172e-07 - ik_interpolate = 25 is = 5 omega2 = 7.3557e-07 - ik_interpolate = 25 is = 6 omega2 = 8.7681e-07 + ik_interpolate = 25 is = 4 omega2 = 6.6187e-07 + ik_interpolate = 25 is = 5 omega2 = 7.3572e-07 + ik_interpolate = 25 is = 6 omega2 = 8.7697e-07 ik_interpolate = 26 is = 1 omega2 = 8.2281e-08 - ik_interpolate = 26 is = 2 omega2 = 2.6093e-07 - ik_interpolate = 26 is = 3 omega2 = 5.2757e-07 - ik_interpolate = 26 is = 4 omega2 = 5.4685e-07 - ik_interpolate = 26 is = 5 omega2 = 7.4921e-07 - ik_interpolate = 26 is = 6 omega2 = 8.9274e-07 - - ik_interpolate = 27 is = 1 omega2 = 1.5371e-07 - ik_interpolate = 27 is = 2 omega2 = 1.7084e-07 + ik_interpolate = 26 is = 2 omega2 = 2.6100e-07 + ik_interpolate = 26 is = 3 omega2 = 5.2777e-07 + ik_interpolate = 26 is = 4 omega2 = 5.4690e-07 + ik_interpolate = 26 is = 5 omega2 = 7.4929e-07 + ik_interpolate = 26 is = 6 omega2 = 8.9282e-07 + + ik_interpolate = 27 is = 1 omega2 = 1.5374e-07 + ik_interpolate = 27 is = 2 omega2 = 1.7087e-07 ik_interpolate = 27 is = 3 omega2 = 2.9125e-07 - ik_interpolate = 27 is = 4 omega2 = 6.6172e-07 - ik_interpolate = 27 is = 5 omega2 = 7.3557e-07 - ik_interpolate = 27 is = 6 omega2 = 8.7681e-07 + ik_interpolate = 27 is = 4 omega2 = 6.6187e-07 + ik_interpolate = 27 is = 5 omega2 = 7.3572e-07 + ik_interpolate = 27 is = 6 omega2 = 8.7697e-07 - ik_interpolate = 28 is = 1 omega2 = 9.4002e-08 - ik_interpolate = 28 is = 2 omega2 = 9.4002e-08 - ik_interpolate = 28 is = 3 omega2 = 3.7459e-07 - ik_interpolate = 28 is = 4 omega2 = 5.6057e-07 - ik_interpolate = 28 is = 5 omega2 = 5.6057e-07 - ik_interpolate = 28 is = 6 omega2 = 8.0122e-07 + ik_interpolate = 28 is = 1 omega2 = 9.4009e-08 + ik_interpolate = 28 is = 2 omega2 = 9.4009e-08 + ik_interpolate = 28 is = 3 omega2 = 3.7466e-07 + ik_interpolate = 28 is = 4 omega2 = 5.6077e-07 + ik_interpolate = 28 is = 5 omega2 = 5.6077e-07 + ik_interpolate = 28 is = 6 omega2 = 8.0131e-07 ik_interpolate = 29 is = 1 omega2 = 8.2281e-08 - ik_interpolate = 29 is = 2 omega2 = 2.6093e-07 - ik_interpolate = 29 is = 3 omega2 = 5.2757e-07 - ik_interpolate = 29 is = 4 omega2 = 5.4685e-07 - ik_interpolate = 29 is = 5 omega2 = 7.4921e-07 - ik_interpolate = 29 is = 6 omega2 = 8.9274e-07 - - ik_interpolate = 30 is = 1 omega2 = 1.5371e-07 - ik_interpolate = 30 is = 2 omega2 = 1.7084e-07 + ik_interpolate = 29 is = 2 omega2 = 2.6100e-07 + ik_interpolate = 29 is = 3 omega2 = 5.2777e-07 + ik_interpolate = 29 is = 4 omega2 = 5.4690e-07 + ik_interpolate = 29 is = 5 omega2 = 7.4929e-07 + ik_interpolate = 29 is = 6 omega2 = 8.9282e-07 + + ik_interpolate = 30 is = 1 omega2 = 1.5374e-07 + ik_interpolate = 30 is = 2 omega2 = 1.7087e-07 ik_interpolate = 30 is = 3 omega2 = 2.9125e-07 - ik_interpolate = 30 is = 4 omega2 = 6.6172e-07 - ik_interpolate = 30 is = 5 omega2 = 7.3557e-07 - ik_interpolate = 30 is = 6 omega2 = 8.7681e-07 - - ik_interpolate = 31 is = 1 omega2 = 9.4002e-08 - ik_interpolate = 31 is = 2 omega2 = 9.4002e-08 - ik_interpolate = 31 is = 3 omega2 = 3.7459e-07 - ik_interpolate = 31 is = 4 omega2 = 5.6057e-07 - ik_interpolate = 31 is = 5 omega2 = 5.6057e-07 - ik_interpolate = 31 is = 6 omega2 = 8.0122e-07 - - ik_interpolate = 32 is = 1 omega2 = 1.5371e-07 - ik_interpolate = 32 is = 2 omega2 = 1.7084e-07 + ik_interpolate = 30 is = 4 omega2 = 6.6187e-07 + ik_interpolate = 30 is = 5 omega2 = 7.3572e-07 + ik_interpolate = 30 is = 6 omega2 = 8.7697e-07 + + ik_interpolate = 31 is = 1 omega2 = 9.4009e-08 + ik_interpolate = 31 is = 2 omega2 = 9.4009e-08 + ik_interpolate = 31 is = 3 omega2 = 3.7466e-07 + ik_interpolate = 31 is = 4 omega2 = 5.6077e-07 + ik_interpolate = 31 is = 5 omega2 = 5.6077e-07 + ik_interpolate = 31 is = 6 omega2 = 8.0131e-07 + + ik_interpolate = 32 is = 1 omega2 = 1.5374e-07 + ik_interpolate = 32 is = 2 omega2 = 1.7087e-07 ik_interpolate = 32 is = 3 omega2 = 2.9125e-07 - ik_interpolate = 32 is = 4 omega2 = 6.6172e-07 - ik_interpolate = 32 is = 5 omega2 = 7.3557e-07 - ik_interpolate = 32 is = 6 omega2 = 8.7681e-07 - - ik_interpolate = 33 is = 1 omega2 = 2.8693e-07 - ik_interpolate = 33 is = 2 omega2 = 2.8693e-07 - ik_interpolate = 33 is = 3 omega2 = 6.8814e-07 - ik_interpolate = 33 is = 4 omega2 = 7.9141e-07 - ik_interpolate = 33 is = 5 omega2 = 7.9141e-07 - ik_interpolate = 33 is = 6 omega2 = 9.4382e-07 - - ik_interpolate = 34 is = 1 omega2 = 1.5371e-07 - ik_interpolate = 34 is = 2 omega2 = 1.7084e-07 + ik_interpolate = 32 is = 4 omega2 = 6.6187e-07 + ik_interpolate = 32 is = 5 omega2 = 7.3572e-07 + ik_interpolate = 32 is = 6 omega2 = 8.7697e-07 + + ik_interpolate = 33 is = 1 omega2 = 2.8699e-07 + ik_interpolate = 33 is = 2 omega2 = 2.8699e-07 + ik_interpolate = 33 is = 3 omega2 = 6.8819e-07 + ik_interpolate = 33 is = 4 omega2 = 7.9149e-07 + ik_interpolate = 33 is = 5 omega2 = 7.9149e-07 + ik_interpolate = 33 is = 6 omega2 = 9.4391e-07 + + ik_interpolate = 34 is = 1 omega2 = 1.5374e-07 + ik_interpolate = 34 is = 2 omega2 = 1.7087e-07 ik_interpolate = 34 is = 3 omega2 = 2.9125e-07 - ik_interpolate = 34 is = 4 omega2 = 6.6172e-07 - ik_interpolate = 34 is = 5 omega2 = 7.3557e-07 - ik_interpolate = 34 is = 6 omega2 = 8.7681e-07 - - ik_interpolate = 35 is = 1 omega2 = 5.3329e-08 - ik_interpolate = 35 is = 2 omega2 = 5.3329e-08 - ik_interpolate = 35 is = 3 omega2 = 9.5774e-08 - ik_interpolate = 35 is = 4 omega2 = 4.9285e-07 - ik_interpolate = 35 is = 5 omega2 = 4.9285e-07 - ik_interpolate = 35 is = 6 omega2 = 5.8593e-07 - - ik_interpolate = 36 is = 1 omega2 = 1.5371e-07 - ik_interpolate = 36 is = 2 omega2 = 1.7084e-07 + ik_interpolate = 34 is = 4 omega2 = 6.6187e-07 + ik_interpolate = 34 is = 5 omega2 = 7.3572e-07 + ik_interpolate = 34 is = 6 omega2 = 8.7697e-07 + + ik_interpolate = 35 is = 1 omega2 = 5.3339e-08 + ik_interpolate = 35 is = 2 omega2 = 5.3339e-08 + ik_interpolate = 35 is = 3 omega2 = 9.5788e-08 + ik_interpolate = 35 is = 4 omega2 = 4.9305e-07 + ik_interpolate = 35 is = 5 omega2 = 4.9305e-07 + ik_interpolate = 35 is = 6 omega2 = 5.8613e-07 + + ik_interpolate = 36 is = 1 omega2 = 1.5374e-07 + ik_interpolate = 36 is = 2 omega2 = 1.7087e-07 ik_interpolate = 36 is = 3 omega2 = 2.9125e-07 - ik_interpolate = 36 is = 4 omega2 = 6.6172e-07 - ik_interpolate = 36 is = 5 omega2 = 7.3557e-07 - ik_interpolate = 36 is = 6 omega2 = 8.7681e-07 + ik_interpolate = 36 is = 4 omega2 = 6.6187e-07 + ik_interpolate = 36 is = 5 omega2 = 7.3572e-07 + ik_interpolate = 36 is = 6 omega2 = 8.7697e-07 - ik_interpolate = 37 is = 1 omega2 = 1.5371e-07 - ik_interpolate = 37 is = 2 omega2 = 1.7084e-07 + ik_interpolate = 37 is = 1 omega2 = 1.5374e-07 + ik_interpolate = 37 is = 2 omega2 = 1.7087e-07 ik_interpolate = 37 is = 3 omega2 = 2.9125e-07 - ik_interpolate = 37 is = 4 omega2 = 6.6172e-07 - ik_interpolate = 37 is = 5 omega2 = 7.3557e-07 - ik_interpolate = 37 is = 6 omega2 = 8.7681e-07 + ik_interpolate = 37 is = 4 omega2 = 6.6187e-07 + ik_interpolate = 37 is = 5 omega2 = 7.3572e-07 + ik_interpolate = 37 is = 6 omega2 = 8.7697e-07 ik_interpolate = 38 is = 1 omega2 = 8.2281e-08 - ik_interpolate = 38 is = 2 omega2 = 2.6093e-07 - ik_interpolate = 38 is = 3 omega2 = 5.2757e-07 - ik_interpolate = 38 is = 4 omega2 = 5.4685e-07 - ik_interpolate = 38 is = 5 omega2 = 7.4921e-07 - ik_interpolate = 38 is = 6 omega2 = 8.9274e-07 - - ik_interpolate = 39 is = 1 omega2 = 1.5371e-07 - ik_interpolate = 39 is = 2 omega2 = 1.7084e-07 + ik_interpolate = 38 is = 2 omega2 = 2.6100e-07 + ik_interpolate = 38 is = 3 omega2 = 5.2777e-07 + ik_interpolate = 38 is = 4 omega2 = 5.4690e-07 + ik_interpolate = 38 is = 5 omega2 = 7.4929e-07 + ik_interpolate = 38 is = 6 omega2 = 8.9282e-07 + + ik_interpolate = 39 is = 1 omega2 = 1.5374e-07 + ik_interpolate = 39 is = 2 omega2 = 1.7087e-07 ik_interpolate = 39 is = 3 omega2 = 2.9125e-07 - ik_interpolate = 39 is = 4 omega2 = 6.6172e-07 - ik_interpolate = 39 is = 5 omega2 = 7.3557e-07 - ik_interpolate = 39 is = 6 omega2 = 8.7681e-07 - - ik_interpolate = 40 is = 1 omega2 = 9.4002e-08 - ik_interpolate = 40 is = 2 omega2 = 9.4002e-08 - ik_interpolate = 40 is = 3 omega2 = 3.7459e-07 - ik_interpolate = 40 is = 4 omega2 = 5.6057e-07 - ik_interpolate = 40 is = 5 omega2 = 5.6057e-07 - ik_interpolate = 40 is = 6 omega2 = 8.0122e-07 - - ik_interpolate = 41 is = 1 omega2 = 5.3329e-08 - ik_interpolate = 41 is = 2 omega2 = 5.3329e-08 - ik_interpolate = 41 is = 3 omega2 = 9.5774e-08 - ik_interpolate = 41 is = 4 omega2 = 4.9285e-07 - ik_interpolate = 41 is = 5 omega2 = 4.9285e-07 - ik_interpolate = 41 is = 6 omega2 = 5.8593e-07 - - ik_interpolate = 42 is = 1 omega2 = 1.5371e-07 - ik_interpolate = 42 is = 2 omega2 = 1.7084e-07 + ik_interpolate = 39 is = 4 omega2 = 6.6187e-07 + ik_interpolate = 39 is = 5 omega2 = 7.3572e-07 + ik_interpolate = 39 is = 6 omega2 = 8.7697e-07 + + ik_interpolate = 40 is = 1 omega2 = 9.4009e-08 + ik_interpolate = 40 is = 2 omega2 = 9.4009e-08 + ik_interpolate = 40 is = 3 omega2 = 3.7466e-07 + ik_interpolate = 40 is = 4 omega2 = 5.6077e-07 + ik_interpolate = 40 is = 5 omega2 = 5.6077e-07 + ik_interpolate = 40 is = 6 omega2 = 8.0131e-07 + + ik_interpolate = 41 is = 1 omega2 = 5.3339e-08 + ik_interpolate = 41 is = 2 omega2 = 5.3339e-08 + ik_interpolate = 41 is = 3 omega2 = 9.5788e-08 + ik_interpolate = 41 is = 4 omega2 = 4.9305e-07 + ik_interpolate = 41 is = 5 omega2 = 4.9305e-07 + ik_interpolate = 41 is = 6 omega2 = 5.8613e-07 + + ik_interpolate = 42 is = 1 omega2 = 1.5374e-07 + ik_interpolate = 42 is = 2 omega2 = 1.7087e-07 ik_interpolate = 42 is = 3 omega2 = 2.9125e-07 - ik_interpolate = 42 is = 4 omega2 = 6.6172e-07 - ik_interpolate = 42 is = 5 omega2 = 7.3557e-07 - ik_interpolate = 42 is = 6 omega2 = 8.7681e-07 - - ik_interpolate = 43 is = 1 omega2 = 2.8693e-07 - ik_interpolate = 43 is = 2 omega2 = 2.8693e-07 - ik_interpolate = 43 is = 3 omega2 = 6.8814e-07 - ik_interpolate = 43 is = 4 omega2 = 7.9141e-07 - ik_interpolate = 43 is = 5 omega2 = 7.9141e-07 - ik_interpolate = 43 is = 6 omega2 = 9.4382e-07 - - ik_interpolate = 44 is = 1 omega2 = 1.5371e-07 - ik_interpolate = 44 is = 2 omega2 = 1.7084e-07 + ik_interpolate = 42 is = 4 omega2 = 6.6187e-07 + ik_interpolate = 42 is = 5 omega2 = 7.3572e-07 + ik_interpolate = 42 is = 6 omega2 = 8.7697e-07 + + ik_interpolate = 43 is = 1 omega2 = 2.8699e-07 + ik_interpolate = 43 is = 2 omega2 = 2.8699e-07 + ik_interpolate = 43 is = 3 omega2 = 6.8819e-07 + ik_interpolate = 43 is = 4 omega2 = 7.9149e-07 + ik_interpolate = 43 is = 5 omega2 = 7.9149e-07 + ik_interpolate = 43 is = 6 omega2 = 9.4391e-07 + + ik_interpolate = 44 is = 1 omega2 = 1.5374e-07 + ik_interpolate = 44 is = 2 omega2 = 1.7087e-07 ik_interpolate = 44 is = 3 omega2 = 2.9125e-07 - ik_interpolate = 44 is = 4 omega2 = 6.6172e-07 - ik_interpolate = 44 is = 5 omega2 = 7.3557e-07 - ik_interpolate = 44 is = 6 omega2 = 8.7681e-07 + ik_interpolate = 44 is = 4 omega2 = 6.6187e-07 + ik_interpolate = 44 is = 5 omega2 = 7.3572e-07 + ik_interpolate = 44 is = 6 omega2 = 8.7697e-07 - ik_interpolate = 45 is = 1 omega2 = 1.5371e-07 - ik_interpolate = 45 is = 2 omega2 = 1.7084e-07 + ik_interpolate = 45 is = 1 omega2 = 1.5374e-07 + ik_interpolate = 45 is = 2 omega2 = 1.7087e-07 ik_interpolate = 45 is = 3 omega2 = 2.9125e-07 - ik_interpolate = 45 is = 4 omega2 = 6.6172e-07 - ik_interpolate = 45 is = 5 omega2 = 7.3557e-07 - ik_interpolate = 45 is = 6 omega2 = 8.7681e-07 - - ik_interpolate = 46 is = 1 omega2 = 9.4002e-08 - ik_interpolate = 46 is = 2 omega2 = 9.4002e-08 - ik_interpolate = 46 is = 3 omega2 = 3.7459e-07 - ik_interpolate = 46 is = 4 omega2 = 5.6057e-07 - ik_interpolate = 46 is = 5 omega2 = 5.6057e-07 - ik_interpolate = 46 is = 6 omega2 = 8.0122e-07 - - ik_interpolate = 47 is = 1 omega2 = 1.5371e-07 - ik_interpolate = 47 is = 2 omega2 = 1.7084e-07 + ik_interpolate = 45 is = 4 omega2 = 6.6187e-07 + ik_interpolate = 45 is = 5 omega2 = 7.3572e-07 + ik_interpolate = 45 is = 6 omega2 = 8.7697e-07 + + ik_interpolate = 46 is = 1 omega2 = 9.4009e-08 + ik_interpolate = 46 is = 2 omega2 = 9.4009e-08 + ik_interpolate = 46 is = 3 omega2 = 3.7466e-07 + ik_interpolate = 46 is = 4 omega2 = 5.6077e-07 + ik_interpolate = 46 is = 5 omega2 = 5.6077e-07 + ik_interpolate = 46 is = 6 omega2 = 8.0131e-07 + + ik_interpolate = 47 is = 1 omega2 = 1.5374e-07 + ik_interpolate = 47 is = 2 omega2 = 1.7087e-07 ik_interpolate = 47 is = 3 omega2 = 2.9125e-07 - ik_interpolate = 47 is = 4 omega2 = 6.6172e-07 - ik_interpolate = 47 is = 5 omega2 = 7.3557e-07 - ik_interpolate = 47 is = 6 omega2 = 8.7681e-07 + ik_interpolate = 47 is = 4 omega2 = 6.6187e-07 + ik_interpolate = 47 is = 5 omega2 = 7.3572e-07 + ik_interpolate = 47 is = 6 omega2 = 8.7697e-07 ik_interpolate = 48 is = 1 omega2 = 8.2281e-08 - ik_interpolate = 48 is = 2 omega2 = 2.6093e-07 - ik_interpolate = 48 is = 3 omega2 = 5.2757e-07 - ik_interpolate = 48 is = 4 omega2 = 5.4685e-07 - ik_interpolate = 48 is = 5 omega2 = 7.4921e-07 - ik_interpolate = 48 is = 6 omega2 = 8.9274e-07 - - ik_interpolate = 49 is = 1 omega2 = 1.3208e-07 - ik_interpolate = 49 is = 2 omega2 = 1.3208e-07 - ik_interpolate = 49 is = 3 omega2 = 2.6297e-07 - ik_interpolate = 49 is = 4 omega2 = 6.9574e-07 - ik_interpolate = 49 is = 5 omega2 = 6.9574e-07 - ik_interpolate = 49 is = 6 omega2 = 1.1925e-06 + ik_interpolate = 48 is = 2 omega2 = 2.6100e-07 + ik_interpolate = 48 is = 3 omega2 = 5.2777e-07 + ik_interpolate = 48 is = 4 omega2 = 5.4690e-07 + ik_interpolate = 48 is = 5 omega2 = 7.4929e-07 + ik_interpolate = 48 is = 6 omega2 = 8.9282e-07 + + ik_interpolate = 49 is = 1 omega2 = 1.3211e-07 + ik_interpolate = 49 is = 2 omega2 = 1.3211e-07 + ik_interpolate = 49 is = 3 omega2 = 2.6298e-07 + ik_interpolate = 49 is = 4 omega2 = 6.9590e-07 + ik_interpolate = 49 is = 5 omega2 = 6.9590e-07 + ik_interpolate = 49 is = 6 omega2 = 1.1927e-06 ik_interpolate = 50 is = 1 omega2 = 8.2281e-08 - ik_interpolate = 50 is = 2 omega2 = 2.6093e-07 - ik_interpolate = 50 is = 3 omega2 = 5.2757e-07 - ik_interpolate = 50 is = 4 omega2 = 5.4685e-07 - ik_interpolate = 50 is = 5 omega2 = 7.4921e-07 - ik_interpolate = 50 is = 6 omega2 = 8.9274e-07 - - ik_interpolate = 51 is = 1 omega2 = 1.5371e-07 - ik_interpolate = 51 is = 2 omega2 = 1.7084e-07 + ik_interpolate = 50 is = 2 omega2 = 2.6100e-07 + ik_interpolate = 50 is = 3 omega2 = 5.2777e-07 + ik_interpolate = 50 is = 4 omega2 = 5.4690e-07 + ik_interpolate = 50 is = 5 omega2 = 7.4929e-07 + ik_interpolate = 50 is = 6 omega2 = 8.9282e-07 + + ik_interpolate = 51 is = 1 omega2 = 1.5374e-07 + ik_interpolate = 51 is = 2 omega2 = 1.7087e-07 ik_interpolate = 51 is = 3 omega2 = 2.9125e-07 - ik_interpolate = 51 is = 4 omega2 = 6.6172e-07 - ik_interpolate = 51 is = 5 omega2 = 7.3557e-07 - ik_interpolate = 51 is = 6 omega2 = 8.7681e-07 + ik_interpolate = 51 is = 4 omega2 = 6.6187e-07 + ik_interpolate = 51 is = 5 omega2 = 7.3572e-07 + ik_interpolate = 51 is = 6 omega2 = 8.7697e-07 - ik_interpolate = 52 is = 1 omega2 = 4.2303e-08 - ik_interpolate = 52 is = 2 omega2 = 4.2303e-08 - ik_interpolate = 52 is = 3 omega2 = 4.3021e-07 - ik_interpolate = 52 is = 4 omega2 = 4.3094e-07 - ik_interpolate = 52 is = 5 omega2 = 4.3094e-07 - ik_interpolate = 52 is = 6 omega2 = 8.4086e-07 + ik_interpolate = 52 is = 1 omega2 = 4.2305e-08 + ik_interpolate = 52 is = 2 omega2 = 4.2305e-08 + ik_interpolate = 52 is = 3 omega2 = 4.3028e-07 + ik_interpolate = 52 is = 4 omega2 = 4.3115e-07 + ik_interpolate = 52 is = 5 omega2 = 4.3115e-07 + ik_interpolate = 52 is = 6 omega2 = 8.4093e-07 ik_interpolate = 53 is = 1 omega2 = 8.2281e-08 - ik_interpolate = 53 is = 2 omega2 = 2.6093e-07 - ik_interpolate = 53 is = 3 omega2 = 5.2757e-07 - ik_interpolate = 53 is = 4 omega2 = 5.4685e-07 - ik_interpolate = 53 is = 5 omega2 = 7.4921e-07 - ik_interpolate = 53 is = 6 omega2 = 8.9274e-07 - - ik_interpolate = 54 is = 1 omega2 = 1.5371e-07 - ik_interpolate = 54 is = 2 omega2 = 1.7084e-07 + ik_interpolate = 53 is = 2 omega2 = 2.6100e-07 + ik_interpolate = 53 is = 3 omega2 = 5.2777e-07 + ik_interpolate = 53 is = 4 omega2 = 5.4690e-07 + ik_interpolate = 53 is = 5 omega2 = 7.4929e-07 + ik_interpolate = 53 is = 6 omega2 = 8.9282e-07 + + ik_interpolate = 54 is = 1 omega2 = 1.5374e-07 + ik_interpolate = 54 is = 2 omega2 = 1.7087e-07 ik_interpolate = 54 is = 3 omega2 = 2.9125e-07 - ik_interpolate = 54 is = 4 omega2 = 6.6172e-07 - ik_interpolate = 54 is = 5 omega2 = 7.3557e-07 - ik_interpolate = 54 is = 6 omega2 = 8.7681e-07 - - ik_interpolate = 55 is = 1 omega2 = 9.4002e-08 - ik_interpolate = 55 is = 2 omega2 = 9.4002e-08 - ik_interpolate = 55 is = 3 omega2 = 3.7459e-07 - ik_interpolate = 55 is = 4 omega2 = 5.6057e-07 - ik_interpolate = 55 is = 5 omega2 = 5.6057e-07 - ik_interpolate = 55 is = 6 omega2 = 8.0122e-07 - - ik_interpolate = 56 is = 1 omega2 = 1.5371e-07 - ik_interpolate = 56 is = 2 omega2 = 1.7084e-07 + ik_interpolate = 54 is = 4 omega2 = 6.6187e-07 + ik_interpolate = 54 is = 5 omega2 = 7.3572e-07 + ik_interpolate = 54 is = 6 omega2 = 8.7697e-07 + + ik_interpolate = 55 is = 1 omega2 = 9.4009e-08 + ik_interpolate = 55 is = 2 omega2 = 9.4009e-08 + ik_interpolate = 55 is = 3 omega2 = 3.7466e-07 + ik_interpolate = 55 is = 4 omega2 = 5.6077e-07 + ik_interpolate = 55 is = 5 omega2 = 5.6077e-07 + ik_interpolate = 55 is = 6 omega2 = 8.0131e-07 + + ik_interpolate = 56 is = 1 omega2 = 1.5374e-07 + ik_interpolate = 56 is = 2 omega2 = 1.7087e-07 ik_interpolate = 56 is = 3 omega2 = 2.9125e-07 - ik_interpolate = 56 is = 4 omega2 = 6.6172e-07 - ik_interpolate = 56 is = 5 omega2 = 7.3557e-07 - ik_interpolate = 56 is = 6 omega2 = 8.7681e-07 + ik_interpolate = 56 is = 4 omega2 = 6.6187e-07 + ik_interpolate = 56 is = 5 omega2 = 7.3572e-07 + ik_interpolate = 56 is = 6 omega2 = 8.7697e-07 - ik_interpolate = 57 is = 1 omega2 = 1.5371e-07 - ik_interpolate = 57 is = 2 omega2 = 1.7084e-07 + ik_interpolate = 57 is = 1 omega2 = 1.5374e-07 + ik_interpolate = 57 is = 2 omega2 = 1.7087e-07 ik_interpolate = 57 is = 3 omega2 = 2.9125e-07 - ik_interpolate = 57 is = 4 omega2 = 6.6172e-07 - ik_interpolate = 57 is = 5 omega2 = 7.3557e-07 - ik_interpolate = 57 is = 6 omega2 = 8.7681e-07 - - ik_interpolate = 58 is = 1 omega2 = 9.4002e-08 - ik_interpolate = 58 is = 2 omega2 = 9.4002e-08 - ik_interpolate = 58 is = 3 omega2 = 3.7459e-07 - ik_interpolate = 58 is = 4 omega2 = 5.6057e-07 - ik_interpolate = 58 is = 5 omega2 = 5.6057e-07 - ik_interpolate = 58 is = 6 omega2 = 8.0122e-07 - - ik_interpolate = 59 is = 1 omega2 = 1.5371e-07 - ik_interpolate = 59 is = 2 omega2 = 1.7084e-07 + ik_interpolate = 57 is = 4 omega2 = 6.6187e-07 + ik_interpolate = 57 is = 5 omega2 = 7.3572e-07 + ik_interpolate = 57 is = 6 omega2 = 8.7697e-07 + + ik_interpolate = 58 is = 1 omega2 = 9.4009e-08 + ik_interpolate = 58 is = 2 omega2 = 9.4009e-08 + ik_interpolate = 58 is = 3 omega2 = 3.7466e-07 + ik_interpolate = 58 is = 4 omega2 = 5.6077e-07 + ik_interpolate = 58 is = 5 omega2 = 5.6077e-07 + ik_interpolate = 58 is = 6 omega2 = 8.0131e-07 + + ik_interpolate = 59 is = 1 omega2 = 1.5374e-07 + ik_interpolate = 59 is = 2 omega2 = 1.7087e-07 ik_interpolate = 59 is = 3 omega2 = 2.9125e-07 - ik_interpolate = 59 is = 4 omega2 = 6.6172e-07 - ik_interpolate = 59 is = 5 omega2 = 7.3557e-07 - ik_interpolate = 59 is = 6 omega2 = 8.7681e-07 + ik_interpolate = 59 is = 4 omega2 = 6.6187e-07 + ik_interpolate = 59 is = 5 omega2 = 7.3572e-07 + ik_interpolate = 59 is = 6 omega2 = 8.7697e-07 ik_interpolate = 60 is = 1 omega2 = 8.2281e-08 - ik_interpolate = 60 is = 2 omega2 = 2.6093e-07 - ik_interpolate = 60 is = 3 omega2 = 5.2757e-07 - ik_interpolate = 60 is = 4 omega2 = 5.4685e-07 - ik_interpolate = 60 is = 5 omega2 = 7.4921e-07 - ik_interpolate = 60 is = 6 omega2 = 8.9274e-07 - - ik_interpolate = 61 is = 1 omega2 = 4.2303e-08 - ik_interpolate = 61 is = 2 omega2 = 4.2303e-08 - ik_interpolate = 61 is = 3 omega2 = 4.3021e-07 - ik_interpolate = 61 is = 4 omega2 = 4.3094e-07 - ik_interpolate = 61 is = 5 omega2 = 4.3094e-07 - ik_interpolate = 61 is = 6 omega2 = 8.4086e-07 - - ik_interpolate = 62 is = 1 omega2 = 1.5371e-07 - ik_interpolate = 62 is = 2 omega2 = 1.7084e-07 + ik_interpolate = 60 is = 2 omega2 = 2.6100e-07 + ik_interpolate = 60 is = 3 omega2 = 5.2777e-07 + ik_interpolate = 60 is = 4 omega2 = 5.4690e-07 + ik_interpolate = 60 is = 5 omega2 = 7.4929e-07 + ik_interpolate = 60 is = 6 omega2 = 8.9282e-07 + + ik_interpolate = 61 is = 1 omega2 = 4.2305e-08 + ik_interpolate = 61 is = 2 omega2 = 4.2305e-08 + ik_interpolate = 61 is = 3 omega2 = 4.3028e-07 + ik_interpolate = 61 is = 4 omega2 = 4.3115e-07 + ik_interpolate = 61 is = 5 omega2 = 4.3115e-07 + ik_interpolate = 61 is = 6 omega2 = 8.4093e-07 + + ik_interpolate = 62 is = 1 omega2 = 1.5374e-07 + ik_interpolate = 62 is = 2 omega2 = 1.7087e-07 ik_interpolate = 62 is = 3 omega2 = 2.9125e-07 - ik_interpolate = 62 is = 4 omega2 = 6.6172e-07 - ik_interpolate = 62 is = 5 omega2 = 7.3557e-07 - ik_interpolate = 62 is = 6 omega2 = 8.7681e-07 + ik_interpolate = 62 is = 4 omega2 = 6.6187e-07 + ik_interpolate = 62 is = 5 omega2 = 7.3572e-07 + ik_interpolate = 62 is = 6 omega2 = 8.7697e-07 ik_interpolate = 63 is = 1 omega2 = 8.2281e-08 - ik_interpolate = 63 is = 2 omega2 = 2.6093e-07 - ik_interpolate = 63 is = 3 omega2 = 5.2757e-07 - ik_interpolate = 63 is = 4 omega2 = 5.4685e-07 - ik_interpolate = 63 is = 5 omega2 = 7.4921e-07 - ik_interpolate = 63 is = 6 omega2 = 8.9274e-07 - - ik_interpolate = 64 is = 1 omega2 = 1.3208e-07 - ik_interpolate = 64 is = 2 omega2 = 1.3208e-07 - ik_interpolate = 64 is = 3 omega2 = 2.6297e-07 - ik_interpolate = 64 is = 4 omega2 = 6.9574e-07 - ik_interpolate = 64 is = 5 omega2 = 6.9574e-07 - ik_interpolate = 64 is = 6 omega2 = 1.1925e-06 + ik_interpolate = 63 is = 2 omega2 = 2.6100e-07 + ik_interpolate = 63 is = 3 omega2 = 5.2777e-07 + ik_interpolate = 63 is = 4 omega2 = 5.4690e-07 + ik_interpolate = 63 is = 5 omega2 = 7.4929e-07 + ik_interpolate = 63 is = 6 omega2 = 8.9282e-07 + + ik_interpolate = 64 is = 1 omega2 = 1.3211e-07 + ik_interpolate = 64 is = 2 omega2 = 1.3211e-07 + ik_interpolate = 64 is = 3 omega2 = 2.6298e-07 + ik_interpolate = 64 is = 4 omega2 = 6.9590e-07 + ik_interpolate = 64 is = 5 omega2 = 6.9590e-07 + ik_interpolate = 64 is = 6 omega2 = 1.1927e-06 Temperature = 1.0000e+02 K SCPH ITER 1 : DIFF = N/A - SCPH ITER 2 : DIFF = 3.6239e-08 - SCPH ITER 3 : DIFF = 3.2460e-08 - SCPH ITER 4 : DIFF = 2.9075e-08 - SCPH ITER 5 : DIFF = 2.6044e-08 - SCPH ITER 6 : DIFF = 2.3329e-08 - SCPH ITER 7 : DIFF = 2.0897e-08 - SCPH ITER 8 : DIFF = 1.8719e-08 - SCPH ITER 9 : DIFF = 1.6768e-08 - SCPH ITER 10 : DIFF = 1.5020e-08 - SCPH ITER 11 : DIFF = 1.3455e-08 - SCPH ITER 12 : DIFF = 1.2053e-08 - SCPH ITER 13 : DIFF = 1.0797e-08 - SCPH ITER 14 : DIFF = 9.6716e-09 + SCPH ITER 2 : DIFF = 3.6539e-08 + SCPH ITER 3 : DIFF = 3.2729e-08 + SCPH ITER 4 : DIFF = 2.9316e-08 + SCPH ITER 5 : DIFF = 2.6260e-08 + SCPH ITER 6 : DIFF = 2.3522e-08 + SCPH ITER 7 : DIFF = 2.1070e-08 + SCPH ITER 8 : DIFF = 1.8874e-08 + SCPH ITER 9 : DIFF = 1.6907e-08 + SCPH ITER 10 : DIFF = 1.5145e-08 + SCPH ITER 11 : DIFF = 1.3566e-08 + SCPH ITER 12 : DIFF = 1.2152e-08 + SCPH ITER 13 : DIFF = 1.0886e-08 + SCPH ITER 14 : DIFF = 9.7516e-09 + SCPH ITER 15 : DIFF = 8.7355e-09 + SCPH ITER 16 : DIFF = 7.8252e-09 + SCPH ITER 17 : DIFF = 7.0098e-09 + SCPH ITER 18 : DIFF = 6.2794e-09 + SCPH ITER 19 : DIFF = 5.6252e-09 + SCPH ITER 20 : DIFF = 5.0391e-09 + SCPH ITER 21 : DIFF = 4.5140e-09 + SCPH ITER 22 : DIFF = 4.0437e-09 + SCPH ITER 23 : DIFF = 3.6224e-09 + SCPH ITER 24 : DIFF = 3.2450e-09 + SCPH ITER 25 : DIFF = 2.9069e-09 + SCPH ITER 26 : DIFF = 2.6040e-09 + SCPH ITER 27 : DIFF = 2.3327e-09 + SCPH ITER 28 : DIFF = 2.0897e-09 + SCPH ITER 29 : DIFF = 1.8720e-09 + SCPH ITER 30 : DIFF = 1.6770e-09 + SCPH ITER 31 : DIFF = 1.5023e-09 + SCPH ITER 32 : DIFF = 1.3457e-09 + SCPH ITER 33 : DIFF = 1.2055e-09 + SCPH ITER 34 : DIFF = 1.0799e-09 + SCPH ITER 35 : DIFF = 9.6744e-10 + SCPH ITER 36 : DIFF = 8.6665e-10 + SCPH ITER 37 : DIFF = 7.7636e-10 + SCPH ITER 38 : DIFF = 6.9548e-10 + SCPH ITER 39 : DIFF = 6.2302e-10 + SCPH ITER 40 : DIFF = 5.5812e-10 + SCPH ITER 41 : DIFF = 4.9997e-10 + SCPH ITER 42 : DIFF = 4.4789e-10 + SCPH ITER 43 : DIFF = 4.0122e-10 + SCPH ITER 44 : DIFF = 3.5942e-10 + SCPH ITER 45 : DIFF = 3.2198e-10 + SCPH ITER 46 : DIFF = 2.8844e-10 + SCPH ITER 47 : DIFF = 2.5839e-10 + SCPH ITER 48 : DIFF = 2.3147e-10 + SCPH ITER 49 : DIFF = 2.0735e-10 + SCPH ITER 50 : DIFF = 1.8576e-10 + SCPH ITER 51 : DIFF = 1.6641e-10 + SCPH ITER 52 : DIFF = 1.4907e-10 + SCPH ITER 53 : DIFF = 1.3354e-10 + SCPH ITER 54 : DIFF = 1.1962e-10 + SCPH ITER 55 : DIFF = 1.0716e-10 + SCPH ITER 56 : DIFF = 9.5998e-11 DIFF < SCPH_TOL : break SCPH loop - Temp = 1.0000e+02 : convergence achieved in 14 iterations. + Temp = 1.0000e+02 : convergence achieved in 56 iterations. New eigenvalues - ik_interpolate = 1 is = 1 omega2 = 1.3897e-22 - ik_interpolate = 1 is = 2 omega2 = 1.5220e-22 - ik_interpolate = 1 is = 3 omega2 = 1.5551e-22 - ik_interpolate = 1 is = 4 omega2 = 1.8146e-07 - ik_interpolate = 1 is = 5 omega2 = 1.8146e-07 - ik_interpolate = 1 is = 6 omega2 = 1.8146e-07 - - ik_interpolate = 2 is = 1 omega2 = 1.2906e-07 - ik_interpolate = 2 is = 2 omega2 = 1.2906e-07 - ik_interpolate = 2 is = 3 omega2 = 2.6193e-07 - ik_interpolate = 2 is = 4 omega2 = 6.7842e-07 - ik_interpolate = 2 is = 5 omega2 = 6.7842e-07 - ik_interpolate = 2 is = 6 omega2 = 1.1749e-06 - - ik_interpolate = 3 is = 1 omega2 = 2.8006e-07 - ik_interpolate = 3 is = 2 omega2 = 2.8006e-07 - ik_interpolate = 3 is = 3 omega2 = 6.8576e-07 - ik_interpolate = 3 is = 4 omega2 = 7.8576e-07 - ik_interpolate = 3 is = 5 omega2 = 7.8576e-07 - ik_interpolate = 3 is = 6 omega2 = 9.3673e-07 - - ik_interpolate = 4 is = 1 omega2 = 1.2906e-07 - ik_interpolate = 4 is = 2 omega2 = 1.2906e-07 - ik_interpolate = 4 is = 3 omega2 = 2.6193e-07 - ik_interpolate = 4 is = 4 omega2 = 6.7842e-07 - ik_interpolate = 4 is = 5 omega2 = 6.7842e-07 - ik_interpolate = 4 is = 6 omega2 = 1.1749e-06 - - ik_interpolate = 5 is = 1 omega2 = 1.2906e-07 - ik_interpolate = 5 is = 2 omega2 = 1.2906e-07 - ik_interpolate = 5 is = 3 omega2 = 2.6193e-07 - ik_interpolate = 5 is = 4 omega2 = 6.7842e-07 - ik_interpolate = 5 is = 5 omega2 = 6.7842e-07 - ik_interpolate = 5 is = 6 omega2 = 1.1749e-06 - - ik_interpolate = 6 is = 1 omega2 = 4.2000e-08 - ik_interpolate = 6 is = 2 omega2 = 4.2000e-08 - ik_interpolate = 6 is = 3 omega2 = 4.0561e-07 - ik_interpolate = 6 is = 4 omega2 = 4.0561e-07 - ik_interpolate = 6 is = 5 omega2 = 4.2239e-07 - ik_interpolate = 6 is = 6 omega2 = 8.3513e-07 - - ik_interpolate = 7 is = 1 omega2 = 1.5076e-07 - ik_interpolate = 7 is = 2 omega2 = 1.6710e-07 + ik_interpolate = 1 is = 1 omega2 = 1.5224e-22 + ik_interpolate = 1 is = 2 omega2 = 2.1769e-22 + ik_interpolate = 1 is = 3 omega2 = 2.3888e-22 + ik_interpolate = 1 is = 4 omega2 = 1.8171e-07 + ik_interpolate = 1 is = 5 omega2 = 1.8171e-07 + ik_interpolate = 1 is = 6 omega2 = 1.8171e-07 + + ik_interpolate = 2 is = 1 omega2 = 1.2909e-07 + ik_interpolate = 2 is = 2 omega2 = 1.2909e-07 + ik_interpolate = 2 is = 3 omega2 = 2.6194e-07 + ik_interpolate = 2 is = 4 omega2 = 6.7858e-07 + ik_interpolate = 2 is = 5 omega2 = 6.7858e-07 + ik_interpolate = 2 is = 6 omega2 = 1.1751e-06 + + ik_interpolate = 3 is = 1 omega2 = 2.8013e-07 + ik_interpolate = 3 is = 2 omega2 = 2.8013e-07 + ik_interpolate = 3 is = 3 omega2 = 6.8581e-07 + ik_interpolate = 3 is = 4 omega2 = 7.8584e-07 + ik_interpolate = 3 is = 5 omega2 = 7.8584e-07 + ik_interpolate = 3 is = 6 omega2 = 9.3682e-07 + + ik_interpolate = 4 is = 1 omega2 = 1.2909e-07 + ik_interpolate = 4 is = 2 omega2 = 1.2909e-07 + ik_interpolate = 4 is = 3 omega2 = 2.6194e-07 + ik_interpolate = 4 is = 4 omega2 = 6.7858e-07 + ik_interpolate = 4 is = 5 omega2 = 6.7858e-07 + ik_interpolate = 4 is = 6 omega2 = 1.1751e-06 + + ik_interpolate = 5 is = 1 omega2 = 1.2909e-07 + ik_interpolate = 5 is = 2 omega2 = 1.2909e-07 + ik_interpolate = 5 is = 3 omega2 = 2.6194e-07 + ik_interpolate = 5 is = 4 omega2 = 6.7858e-07 + ik_interpolate = 5 is = 5 omega2 = 6.7858e-07 + ik_interpolate = 5 is = 6 omega2 = 1.1751e-06 + + ik_interpolate = 6 is = 1 omega2 = 4.2003e-08 + ik_interpolate = 6 is = 2 omega2 = 4.2003e-08 + ik_interpolate = 6 is = 3 omega2 = 4.0583e-07 + ik_interpolate = 6 is = 4 omega2 = 4.0583e-07 + ik_interpolate = 6 is = 5 omega2 = 4.2247e-07 + ik_interpolate = 6 is = 6 omega2 = 8.3521e-07 + + ik_interpolate = 7 is = 1 omega2 = 1.5079e-07 + ik_interpolate = 7 is = 2 omega2 = 1.6714e-07 ik_interpolate = 7 is = 3 omega2 = 2.9227e-07 - ik_interpolate = 7 is = 4 omega2 = 6.4505e-07 - ik_interpolate = 7 is = 5 omega2 = 7.1850e-07 - ik_interpolate = 7 is = 6 omega2 = 8.5972e-07 + ik_interpolate = 7 is = 4 omega2 = 6.4521e-07 + ik_interpolate = 7 is = 5 omega2 = 7.1867e-07 + ik_interpolate = 7 is = 6 omega2 = 8.5988e-07 ik_interpolate = 8 is = 1 omega2 = 8.2271e-08 - ik_interpolate = 8 is = 2 omega2 = 2.5330e-07 - ik_interpolate = 8 is = 3 omega2 = 5.0418e-07 - ik_interpolate = 8 is = 4 omega2 = 5.4188e-07 - ik_interpolate = 8 is = 5 omega2 = 7.4255e-07 - ik_interpolate = 8 is = 6 omega2 = 8.8576e-07 - - ik_interpolate = 9 is = 1 omega2 = 2.8006e-07 - ik_interpolate = 9 is = 2 omega2 = 2.8006e-07 - ik_interpolate = 9 is = 3 omega2 = 6.8576e-07 - ik_interpolate = 9 is = 4 omega2 = 7.8576e-07 - ik_interpolate = 9 is = 5 omega2 = 7.8576e-07 - ik_interpolate = 9 is = 6 omega2 = 9.3673e-07 - - ik_interpolate = 10 is = 1 omega2 = 1.5076e-07 - ik_interpolate = 10 is = 2 omega2 = 1.6710e-07 + ik_interpolate = 8 is = 2 omega2 = 2.5338e-07 + ik_interpolate = 8 is = 3 omega2 = 5.0439e-07 + ik_interpolate = 8 is = 4 omega2 = 5.4194e-07 + ik_interpolate = 8 is = 5 omega2 = 7.4263e-07 + ik_interpolate = 8 is = 6 omega2 = 8.8584e-07 + + ik_interpolate = 9 is = 1 omega2 = 2.8013e-07 + ik_interpolate = 9 is = 2 omega2 = 2.8013e-07 + ik_interpolate = 9 is = 3 omega2 = 6.8581e-07 + ik_interpolate = 9 is = 4 omega2 = 7.8584e-07 + ik_interpolate = 9 is = 5 omega2 = 7.8584e-07 + ik_interpolate = 9 is = 6 omega2 = 9.3682e-07 + + ik_interpolate = 10 is = 1 omega2 = 1.5079e-07 + ik_interpolate = 10 is = 2 omega2 = 1.6714e-07 ik_interpolate = 10 is = 3 omega2 = 2.9227e-07 - ik_interpolate = 10 is = 4 omega2 = 6.4505e-07 - ik_interpolate = 10 is = 5 omega2 = 7.1850e-07 - ik_interpolate = 10 is = 6 omega2 = 8.5972e-07 - - ik_interpolate = 11 is = 1 omega2 = 5.1779e-08 - ik_interpolate = 11 is = 2 omega2 = 5.1779e-08 - ik_interpolate = 11 is = 3 omega2 = 9.2958e-08 - ik_interpolate = 11 is = 4 omega2 = 4.6892e-07 - ik_interpolate = 11 is = 5 omega2 = 4.6892e-07 - ik_interpolate = 11 is = 6 omega2 = 5.6264e-07 - - ik_interpolate = 12 is = 1 omega2 = 1.5076e-07 - ik_interpolate = 12 is = 2 omega2 = 1.6710e-07 + ik_interpolate = 10 is = 4 omega2 = 6.4521e-07 + ik_interpolate = 10 is = 5 omega2 = 7.1867e-07 + ik_interpolate = 10 is = 6 omega2 = 8.5988e-07 + + ik_interpolate = 11 is = 1 omega2 = 5.1790e-08 + ik_interpolate = 11 is = 2 omega2 = 5.1790e-08 + ik_interpolate = 11 is = 3 omega2 = 9.2973e-08 + ik_interpolate = 11 is = 4 omega2 = 4.6913e-07 + ik_interpolate = 11 is = 5 omega2 = 4.6913e-07 + ik_interpolate = 11 is = 6 omega2 = 5.6285e-07 + + ik_interpolate = 12 is = 1 omega2 = 1.5079e-07 + ik_interpolate = 12 is = 2 omega2 = 1.6714e-07 ik_interpolate = 12 is = 3 omega2 = 2.9227e-07 - ik_interpolate = 12 is = 4 omega2 = 6.4505e-07 - ik_interpolate = 12 is = 5 omega2 = 7.1850e-07 - ik_interpolate = 12 is = 6 omega2 = 8.5972e-07 + ik_interpolate = 12 is = 4 omega2 = 6.4521e-07 + ik_interpolate = 12 is = 5 omega2 = 7.1867e-07 + ik_interpolate = 12 is = 6 omega2 = 8.5988e-07 - ik_interpolate = 13 is = 1 omega2 = 1.2906e-07 - ik_interpolate = 13 is = 2 omega2 = 1.2906e-07 - ik_interpolate = 13 is = 3 omega2 = 2.6193e-07 - ik_interpolate = 13 is = 4 omega2 = 6.7842e-07 - ik_interpolate = 13 is = 5 omega2 = 6.7842e-07 - ik_interpolate = 13 is = 6 omega2 = 1.1749e-06 + ik_interpolate = 13 is = 1 omega2 = 1.2909e-07 + ik_interpolate = 13 is = 2 omega2 = 1.2909e-07 + ik_interpolate = 13 is = 3 omega2 = 2.6194e-07 + ik_interpolate = 13 is = 4 omega2 = 6.7858e-07 + ik_interpolate = 13 is = 5 omega2 = 6.7858e-07 + ik_interpolate = 13 is = 6 omega2 = 1.1751e-06 ik_interpolate = 14 is = 1 omega2 = 8.2271e-08 - ik_interpolate = 14 is = 2 omega2 = 2.5330e-07 - ik_interpolate = 14 is = 3 omega2 = 5.0418e-07 - ik_interpolate = 14 is = 4 omega2 = 5.4188e-07 - ik_interpolate = 14 is = 5 omega2 = 7.4255e-07 - ik_interpolate = 14 is = 6 omega2 = 8.8576e-07 - - ik_interpolate = 15 is = 1 omega2 = 1.5076e-07 - ik_interpolate = 15 is = 2 omega2 = 1.6710e-07 + ik_interpolate = 14 is = 2 omega2 = 2.5338e-07 + ik_interpolate = 14 is = 3 omega2 = 5.0439e-07 + ik_interpolate = 14 is = 4 omega2 = 5.4194e-07 + ik_interpolate = 14 is = 5 omega2 = 7.4263e-07 + ik_interpolate = 14 is = 6 omega2 = 8.8584e-07 + + ik_interpolate = 15 is = 1 omega2 = 1.5079e-07 + ik_interpolate = 15 is = 2 omega2 = 1.6714e-07 ik_interpolate = 15 is = 3 omega2 = 2.9227e-07 - ik_interpolate = 15 is = 4 omega2 = 6.4505e-07 - ik_interpolate = 15 is = 5 omega2 = 7.1850e-07 - ik_interpolate = 15 is = 6 omega2 = 8.5972e-07 - - ik_interpolate = 16 is = 1 omega2 = 4.2000e-08 - ik_interpolate = 16 is = 2 omega2 = 4.2000e-08 - ik_interpolate = 16 is = 3 omega2 = 4.0561e-07 - ik_interpolate = 16 is = 4 omega2 = 4.0561e-07 - ik_interpolate = 16 is = 5 omega2 = 4.2239e-07 - ik_interpolate = 16 is = 6 omega2 = 8.3513e-07 - - ik_interpolate = 17 is = 1 omega2 = 1.2906e-07 - ik_interpolate = 17 is = 2 omega2 = 1.2906e-07 - ik_interpolate = 17 is = 3 omega2 = 2.6193e-07 - ik_interpolate = 17 is = 4 omega2 = 6.7842e-07 - ik_interpolate = 17 is = 5 omega2 = 6.7842e-07 - ik_interpolate = 17 is = 6 omega2 = 1.1749e-06 - - ik_interpolate = 18 is = 1 omega2 = 4.2000e-08 - ik_interpolate = 18 is = 2 omega2 = 4.2000e-08 - ik_interpolate = 18 is = 3 omega2 = 4.0561e-07 - ik_interpolate = 18 is = 4 omega2 = 4.0561e-07 - ik_interpolate = 18 is = 5 omega2 = 4.2239e-07 - ik_interpolate = 18 is = 6 omega2 = 8.3513e-07 - - ik_interpolate = 19 is = 1 omega2 = 1.5076e-07 - ik_interpolate = 19 is = 2 omega2 = 1.6710e-07 + ik_interpolate = 15 is = 4 omega2 = 6.4521e-07 + ik_interpolate = 15 is = 5 omega2 = 7.1867e-07 + ik_interpolate = 15 is = 6 omega2 = 8.5988e-07 + + ik_interpolate = 16 is = 1 omega2 = 4.2003e-08 + ik_interpolate = 16 is = 2 omega2 = 4.2003e-08 + ik_interpolate = 16 is = 3 omega2 = 4.0583e-07 + ik_interpolate = 16 is = 4 omega2 = 4.0583e-07 + ik_interpolate = 16 is = 5 omega2 = 4.2247e-07 + ik_interpolate = 16 is = 6 omega2 = 8.3521e-07 + + ik_interpolate = 17 is = 1 omega2 = 1.2909e-07 + ik_interpolate = 17 is = 2 omega2 = 1.2909e-07 + ik_interpolate = 17 is = 3 omega2 = 2.6194e-07 + ik_interpolate = 17 is = 4 omega2 = 6.7858e-07 + ik_interpolate = 17 is = 5 omega2 = 6.7858e-07 + ik_interpolate = 17 is = 6 omega2 = 1.1751e-06 + + ik_interpolate = 18 is = 1 omega2 = 4.2003e-08 + ik_interpolate = 18 is = 2 omega2 = 4.2003e-08 + ik_interpolate = 18 is = 3 omega2 = 4.0583e-07 + ik_interpolate = 18 is = 4 omega2 = 4.0583e-07 + ik_interpolate = 18 is = 5 omega2 = 4.2247e-07 + ik_interpolate = 18 is = 6 omega2 = 8.3521e-07 + + ik_interpolate = 19 is = 1 omega2 = 1.5079e-07 + ik_interpolate = 19 is = 2 omega2 = 1.6714e-07 ik_interpolate = 19 is = 3 omega2 = 2.9227e-07 - ik_interpolate = 19 is = 4 omega2 = 6.4505e-07 - ik_interpolate = 19 is = 5 omega2 = 7.1850e-07 - ik_interpolate = 19 is = 6 omega2 = 8.5972e-07 + ik_interpolate = 19 is = 4 omega2 = 6.4521e-07 + ik_interpolate = 19 is = 5 omega2 = 7.1867e-07 + ik_interpolate = 19 is = 6 omega2 = 8.5988e-07 ik_interpolate = 20 is = 1 omega2 = 8.2271e-08 - ik_interpolate = 20 is = 2 omega2 = 2.5330e-07 - ik_interpolate = 20 is = 3 omega2 = 5.0418e-07 - ik_interpolate = 20 is = 4 omega2 = 5.4188e-07 - ik_interpolate = 20 is = 5 omega2 = 7.4255e-07 - ik_interpolate = 20 is = 6 omega2 = 8.8576e-07 - - ik_interpolate = 21 is = 1 omega2 = 4.2000e-08 - ik_interpolate = 21 is = 2 omega2 = 4.2000e-08 - ik_interpolate = 21 is = 3 omega2 = 4.0561e-07 - ik_interpolate = 21 is = 4 omega2 = 4.0561e-07 - ik_interpolate = 21 is = 5 omega2 = 4.2239e-07 - ik_interpolate = 21 is = 6 omega2 = 8.3513e-07 - - ik_interpolate = 22 is = 1 omega2 = 1.2906e-07 - ik_interpolate = 22 is = 2 omega2 = 1.2906e-07 - ik_interpolate = 22 is = 3 omega2 = 2.6193e-07 - ik_interpolate = 22 is = 4 omega2 = 6.7842e-07 - ik_interpolate = 22 is = 5 omega2 = 6.7842e-07 - ik_interpolate = 22 is = 6 omega2 = 1.1749e-06 + ik_interpolate = 20 is = 2 omega2 = 2.5338e-07 + ik_interpolate = 20 is = 3 omega2 = 5.0439e-07 + ik_interpolate = 20 is = 4 omega2 = 5.4194e-07 + ik_interpolate = 20 is = 5 omega2 = 7.4263e-07 + ik_interpolate = 20 is = 6 omega2 = 8.8584e-07 + + ik_interpolate = 21 is = 1 omega2 = 4.2003e-08 + ik_interpolate = 21 is = 2 omega2 = 4.2003e-08 + ik_interpolate = 21 is = 3 omega2 = 4.0583e-07 + ik_interpolate = 21 is = 4 omega2 = 4.0583e-07 + ik_interpolate = 21 is = 5 omega2 = 4.2247e-07 + ik_interpolate = 21 is = 6 omega2 = 8.3521e-07 + + ik_interpolate = 22 is = 1 omega2 = 1.2909e-07 + ik_interpolate = 22 is = 2 omega2 = 1.2909e-07 + ik_interpolate = 22 is = 3 omega2 = 2.6194e-07 + ik_interpolate = 22 is = 4 omega2 = 6.7858e-07 + ik_interpolate = 22 is = 5 omega2 = 6.7858e-07 + ik_interpolate = 22 is = 6 omega2 = 1.1751e-06 ik_interpolate = 23 is = 1 omega2 = 8.2271e-08 - ik_interpolate = 23 is = 2 omega2 = 2.5330e-07 - ik_interpolate = 23 is = 3 omega2 = 5.0418e-07 - ik_interpolate = 23 is = 4 omega2 = 5.4188e-07 - ik_interpolate = 23 is = 5 omega2 = 7.4255e-07 - ik_interpolate = 23 is = 6 omega2 = 8.8576e-07 - - ik_interpolate = 24 is = 1 omega2 = 1.5076e-07 - ik_interpolate = 24 is = 2 omega2 = 1.6710e-07 + ik_interpolate = 23 is = 2 omega2 = 2.5338e-07 + ik_interpolate = 23 is = 3 omega2 = 5.0439e-07 + ik_interpolate = 23 is = 4 omega2 = 5.4194e-07 + ik_interpolate = 23 is = 5 omega2 = 7.4263e-07 + ik_interpolate = 23 is = 6 omega2 = 8.8584e-07 + + ik_interpolate = 24 is = 1 omega2 = 1.5079e-07 + ik_interpolate = 24 is = 2 omega2 = 1.6714e-07 ik_interpolate = 24 is = 3 omega2 = 2.9227e-07 - ik_interpolate = 24 is = 4 omega2 = 6.4505e-07 - ik_interpolate = 24 is = 5 omega2 = 7.1850e-07 - ik_interpolate = 24 is = 6 omega2 = 8.5972e-07 + ik_interpolate = 24 is = 4 omega2 = 6.4521e-07 + ik_interpolate = 24 is = 5 omega2 = 7.1867e-07 + ik_interpolate = 24 is = 6 omega2 = 8.5988e-07 - ik_interpolate = 25 is = 1 omega2 = 1.5076e-07 - ik_interpolate = 25 is = 2 omega2 = 1.6710e-07 + ik_interpolate = 25 is = 1 omega2 = 1.5079e-07 + ik_interpolate = 25 is = 2 omega2 = 1.6714e-07 ik_interpolate = 25 is = 3 omega2 = 2.9227e-07 - ik_interpolate = 25 is = 4 omega2 = 6.4505e-07 - ik_interpolate = 25 is = 5 omega2 = 7.1850e-07 - ik_interpolate = 25 is = 6 omega2 = 8.5972e-07 + ik_interpolate = 25 is = 4 omega2 = 6.4521e-07 + ik_interpolate = 25 is = 5 omega2 = 7.1867e-07 + ik_interpolate = 25 is = 6 omega2 = 8.5988e-07 ik_interpolate = 26 is = 1 omega2 = 8.2271e-08 - ik_interpolate = 26 is = 2 omega2 = 2.5330e-07 - ik_interpolate = 26 is = 3 omega2 = 5.0418e-07 - ik_interpolate = 26 is = 4 omega2 = 5.4188e-07 - ik_interpolate = 26 is = 5 omega2 = 7.4255e-07 - ik_interpolate = 26 is = 6 omega2 = 8.8576e-07 - - ik_interpolate = 27 is = 1 omega2 = 1.5076e-07 - ik_interpolate = 27 is = 2 omega2 = 1.6710e-07 + ik_interpolate = 26 is = 2 omega2 = 2.5338e-07 + ik_interpolate = 26 is = 3 omega2 = 5.0439e-07 + ik_interpolate = 26 is = 4 omega2 = 5.4194e-07 + ik_interpolate = 26 is = 5 omega2 = 7.4263e-07 + ik_interpolate = 26 is = 6 omega2 = 8.8584e-07 + + ik_interpolate = 27 is = 1 omega2 = 1.5079e-07 + ik_interpolate = 27 is = 2 omega2 = 1.6714e-07 ik_interpolate = 27 is = 3 omega2 = 2.9227e-07 - ik_interpolate = 27 is = 4 omega2 = 6.4505e-07 - ik_interpolate = 27 is = 5 omega2 = 7.1850e-07 - ik_interpolate = 27 is = 6 omega2 = 8.5972e-07 + ik_interpolate = 27 is = 4 omega2 = 6.4521e-07 + ik_interpolate = 27 is = 5 omega2 = 7.1867e-07 + ik_interpolate = 27 is = 6 omega2 = 8.5988e-07 - ik_interpolate = 28 is = 1 omega2 = 9.2770e-08 - ik_interpolate = 28 is = 2 omega2 = 9.2770e-08 - ik_interpolate = 28 is = 3 omega2 = 3.6780e-07 - ik_interpolate = 28 is = 4 omega2 = 5.3740e-07 - ik_interpolate = 28 is = 5 omega2 = 5.3740e-07 - ik_interpolate = 28 is = 6 omega2 = 7.9208e-07 + ik_interpolate = 28 is = 1 omega2 = 9.2777e-08 + ik_interpolate = 28 is = 2 omega2 = 9.2777e-08 + ik_interpolate = 28 is = 3 omega2 = 3.6787e-07 + ik_interpolate = 28 is = 4 omega2 = 5.3761e-07 + ik_interpolate = 28 is = 5 omega2 = 5.3761e-07 + ik_interpolate = 28 is = 6 omega2 = 7.9218e-07 ik_interpolate = 29 is = 1 omega2 = 8.2271e-08 - ik_interpolate = 29 is = 2 omega2 = 2.5330e-07 - ik_interpolate = 29 is = 3 omega2 = 5.0418e-07 - ik_interpolate = 29 is = 4 omega2 = 5.4188e-07 - ik_interpolate = 29 is = 5 omega2 = 7.4255e-07 - ik_interpolate = 29 is = 6 omega2 = 8.8576e-07 - - ik_interpolate = 30 is = 1 omega2 = 1.5076e-07 - ik_interpolate = 30 is = 2 omega2 = 1.6710e-07 + ik_interpolate = 29 is = 2 omega2 = 2.5338e-07 + ik_interpolate = 29 is = 3 omega2 = 5.0439e-07 + ik_interpolate = 29 is = 4 omega2 = 5.4194e-07 + ik_interpolate = 29 is = 5 omega2 = 7.4263e-07 + ik_interpolate = 29 is = 6 omega2 = 8.8584e-07 + + ik_interpolate = 30 is = 1 omega2 = 1.5079e-07 + ik_interpolate = 30 is = 2 omega2 = 1.6714e-07 ik_interpolate = 30 is = 3 omega2 = 2.9227e-07 - ik_interpolate = 30 is = 4 omega2 = 6.4505e-07 - ik_interpolate = 30 is = 5 omega2 = 7.1850e-07 - ik_interpolate = 30 is = 6 omega2 = 8.5972e-07 - - ik_interpolate = 31 is = 1 omega2 = 9.2770e-08 - ik_interpolate = 31 is = 2 omega2 = 9.2770e-08 - ik_interpolate = 31 is = 3 omega2 = 3.6780e-07 - ik_interpolate = 31 is = 4 omega2 = 5.3740e-07 - ik_interpolate = 31 is = 5 omega2 = 5.3740e-07 - ik_interpolate = 31 is = 6 omega2 = 7.9208e-07 - - ik_interpolate = 32 is = 1 omega2 = 1.5076e-07 - ik_interpolate = 32 is = 2 omega2 = 1.6710e-07 + ik_interpolate = 30 is = 4 omega2 = 6.4521e-07 + ik_interpolate = 30 is = 5 omega2 = 7.1867e-07 + ik_interpolate = 30 is = 6 omega2 = 8.5988e-07 + + ik_interpolate = 31 is = 1 omega2 = 9.2777e-08 + ik_interpolate = 31 is = 2 omega2 = 9.2777e-08 + ik_interpolate = 31 is = 3 omega2 = 3.6787e-07 + ik_interpolate = 31 is = 4 omega2 = 5.3761e-07 + ik_interpolate = 31 is = 5 omega2 = 5.3761e-07 + ik_interpolate = 31 is = 6 omega2 = 7.9218e-07 + + ik_interpolate = 32 is = 1 omega2 = 1.5079e-07 + ik_interpolate = 32 is = 2 omega2 = 1.6714e-07 ik_interpolate = 32 is = 3 omega2 = 2.9227e-07 - ik_interpolate = 32 is = 4 omega2 = 6.4505e-07 - ik_interpolate = 32 is = 5 omega2 = 7.1850e-07 - ik_interpolate = 32 is = 6 omega2 = 8.5972e-07 - - ik_interpolate = 33 is = 1 omega2 = 2.8006e-07 - ik_interpolate = 33 is = 2 omega2 = 2.8006e-07 - ik_interpolate = 33 is = 3 omega2 = 6.8576e-07 - ik_interpolate = 33 is = 4 omega2 = 7.8576e-07 - ik_interpolate = 33 is = 5 omega2 = 7.8576e-07 - ik_interpolate = 33 is = 6 omega2 = 9.3673e-07 - - ik_interpolate = 34 is = 1 omega2 = 1.5076e-07 - ik_interpolate = 34 is = 2 omega2 = 1.6710e-07 + ik_interpolate = 32 is = 4 omega2 = 6.4521e-07 + ik_interpolate = 32 is = 5 omega2 = 7.1867e-07 + ik_interpolate = 32 is = 6 omega2 = 8.5988e-07 + + ik_interpolate = 33 is = 1 omega2 = 2.8013e-07 + ik_interpolate = 33 is = 2 omega2 = 2.8013e-07 + ik_interpolate = 33 is = 3 omega2 = 6.8581e-07 + ik_interpolate = 33 is = 4 omega2 = 7.8584e-07 + ik_interpolate = 33 is = 5 omega2 = 7.8584e-07 + ik_interpolate = 33 is = 6 omega2 = 9.3682e-07 + + ik_interpolate = 34 is = 1 omega2 = 1.5079e-07 + ik_interpolate = 34 is = 2 omega2 = 1.6714e-07 ik_interpolate = 34 is = 3 omega2 = 2.9227e-07 - ik_interpolate = 34 is = 4 omega2 = 6.4505e-07 - ik_interpolate = 34 is = 5 omega2 = 7.1850e-07 - ik_interpolate = 34 is = 6 omega2 = 8.5972e-07 - - ik_interpolate = 35 is = 1 omega2 = 5.1779e-08 - ik_interpolate = 35 is = 2 omega2 = 5.1779e-08 - ik_interpolate = 35 is = 3 omega2 = 9.2958e-08 - ik_interpolate = 35 is = 4 omega2 = 4.6892e-07 - ik_interpolate = 35 is = 5 omega2 = 4.6892e-07 - ik_interpolate = 35 is = 6 omega2 = 5.6264e-07 - - ik_interpolate = 36 is = 1 omega2 = 1.5076e-07 - ik_interpolate = 36 is = 2 omega2 = 1.6710e-07 + ik_interpolate = 34 is = 4 omega2 = 6.4521e-07 + ik_interpolate = 34 is = 5 omega2 = 7.1867e-07 + ik_interpolate = 34 is = 6 omega2 = 8.5988e-07 + + ik_interpolate = 35 is = 1 omega2 = 5.1790e-08 + ik_interpolate = 35 is = 2 omega2 = 5.1790e-08 + ik_interpolate = 35 is = 3 omega2 = 9.2973e-08 + ik_interpolate = 35 is = 4 omega2 = 4.6913e-07 + ik_interpolate = 35 is = 5 omega2 = 4.6913e-07 + ik_interpolate = 35 is = 6 omega2 = 5.6285e-07 + + ik_interpolate = 36 is = 1 omega2 = 1.5079e-07 + ik_interpolate = 36 is = 2 omega2 = 1.6714e-07 ik_interpolate = 36 is = 3 omega2 = 2.9227e-07 - ik_interpolate = 36 is = 4 omega2 = 6.4505e-07 - ik_interpolate = 36 is = 5 omega2 = 7.1850e-07 - ik_interpolate = 36 is = 6 omega2 = 8.5972e-07 + ik_interpolate = 36 is = 4 omega2 = 6.4521e-07 + ik_interpolate = 36 is = 5 omega2 = 7.1867e-07 + ik_interpolate = 36 is = 6 omega2 = 8.5988e-07 - ik_interpolate = 37 is = 1 omega2 = 1.5076e-07 - ik_interpolate = 37 is = 2 omega2 = 1.6710e-07 + ik_interpolate = 37 is = 1 omega2 = 1.5079e-07 + ik_interpolate = 37 is = 2 omega2 = 1.6714e-07 ik_interpolate = 37 is = 3 omega2 = 2.9227e-07 - ik_interpolate = 37 is = 4 omega2 = 6.4505e-07 - ik_interpolate = 37 is = 5 omega2 = 7.1850e-07 - ik_interpolate = 37 is = 6 omega2 = 8.5972e-07 + ik_interpolate = 37 is = 4 omega2 = 6.4521e-07 + ik_interpolate = 37 is = 5 omega2 = 7.1867e-07 + ik_interpolate = 37 is = 6 omega2 = 8.5988e-07 ik_interpolate = 38 is = 1 omega2 = 8.2271e-08 - ik_interpolate = 38 is = 2 omega2 = 2.5330e-07 - ik_interpolate = 38 is = 3 omega2 = 5.0418e-07 - ik_interpolate = 38 is = 4 omega2 = 5.4188e-07 - ik_interpolate = 38 is = 5 omega2 = 7.4255e-07 - ik_interpolate = 38 is = 6 omega2 = 8.8576e-07 - - ik_interpolate = 39 is = 1 omega2 = 1.5076e-07 - ik_interpolate = 39 is = 2 omega2 = 1.6710e-07 + ik_interpolate = 38 is = 2 omega2 = 2.5338e-07 + ik_interpolate = 38 is = 3 omega2 = 5.0439e-07 + ik_interpolate = 38 is = 4 omega2 = 5.4194e-07 + ik_interpolate = 38 is = 5 omega2 = 7.4263e-07 + ik_interpolate = 38 is = 6 omega2 = 8.8584e-07 + + ik_interpolate = 39 is = 1 omega2 = 1.5079e-07 + ik_interpolate = 39 is = 2 omega2 = 1.6714e-07 ik_interpolate = 39 is = 3 omega2 = 2.9227e-07 - ik_interpolate = 39 is = 4 omega2 = 6.4505e-07 - ik_interpolate = 39 is = 5 omega2 = 7.1850e-07 - ik_interpolate = 39 is = 6 omega2 = 8.5972e-07 - - ik_interpolate = 40 is = 1 omega2 = 9.2770e-08 - ik_interpolate = 40 is = 2 omega2 = 9.2770e-08 - ik_interpolate = 40 is = 3 omega2 = 3.6780e-07 - ik_interpolate = 40 is = 4 omega2 = 5.3740e-07 - ik_interpolate = 40 is = 5 omega2 = 5.3740e-07 - ik_interpolate = 40 is = 6 omega2 = 7.9208e-07 - - ik_interpolate = 41 is = 1 omega2 = 5.1779e-08 - ik_interpolate = 41 is = 2 omega2 = 5.1779e-08 - ik_interpolate = 41 is = 3 omega2 = 9.2958e-08 - ik_interpolate = 41 is = 4 omega2 = 4.6892e-07 - ik_interpolate = 41 is = 5 omega2 = 4.6892e-07 - ik_interpolate = 41 is = 6 omega2 = 5.6264e-07 - - ik_interpolate = 42 is = 1 omega2 = 1.5076e-07 - ik_interpolate = 42 is = 2 omega2 = 1.6710e-07 + ik_interpolate = 39 is = 4 omega2 = 6.4521e-07 + ik_interpolate = 39 is = 5 omega2 = 7.1867e-07 + ik_interpolate = 39 is = 6 omega2 = 8.5988e-07 + + ik_interpolate = 40 is = 1 omega2 = 9.2777e-08 + ik_interpolate = 40 is = 2 omega2 = 9.2777e-08 + ik_interpolate = 40 is = 3 omega2 = 3.6787e-07 + ik_interpolate = 40 is = 4 omega2 = 5.3761e-07 + ik_interpolate = 40 is = 5 omega2 = 5.3761e-07 + ik_interpolate = 40 is = 6 omega2 = 7.9218e-07 + + ik_interpolate = 41 is = 1 omega2 = 5.1790e-08 + ik_interpolate = 41 is = 2 omega2 = 5.1790e-08 + ik_interpolate = 41 is = 3 omega2 = 9.2973e-08 + ik_interpolate = 41 is = 4 omega2 = 4.6913e-07 + ik_interpolate = 41 is = 5 omega2 = 4.6913e-07 + ik_interpolate = 41 is = 6 omega2 = 5.6285e-07 + + ik_interpolate = 42 is = 1 omega2 = 1.5079e-07 + ik_interpolate = 42 is = 2 omega2 = 1.6714e-07 ik_interpolate = 42 is = 3 omega2 = 2.9227e-07 - ik_interpolate = 42 is = 4 omega2 = 6.4505e-07 - ik_interpolate = 42 is = 5 omega2 = 7.1850e-07 - ik_interpolate = 42 is = 6 omega2 = 8.5972e-07 - - ik_interpolate = 43 is = 1 omega2 = 2.8006e-07 - ik_interpolate = 43 is = 2 omega2 = 2.8006e-07 - ik_interpolate = 43 is = 3 omega2 = 6.8576e-07 - ik_interpolate = 43 is = 4 omega2 = 7.8576e-07 - ik_interpolate = 43 is = 5 omega2 = 7.8576e-07 - ik_interpolate = 43 is = 6 omega2 = 9.3673e-07 - - ik_interpolate = 44 is = 1 omega2 = 1.5076e-07 - ik_interpolate = 44 is = 2 omega2 = 1.6710e-07 + ik_interpolate = 42 is = 4 omega2 = 6.4521e-07 + ik_interpolate = 42 is = 5 omega2 = 7.1867e-07 + ik_interpolate = 42 is = 6 omega2 = 8.5988e-07 + + ik_interpolate = 43 is = 1 omega2 = 2.8013e-07 + ik_interpolate = 43 is = 2 omega2 = 2.8013e-07 + ik_interpolate = 43 is = 3 omega2 = 6.8581e-07 + ik_interpolate = 43 is = 4 omega2 = 7.8584e-07 + ik_interpolate = 43 is = 5 omega2 = 7.8584e-07 + ik_interpolate = 43 is = 6 omega2 = 9.3682e-07 + + ik_interpolate = 44 is = 1 omega2 = 1.5079e-07 + ik_interpolate = 44 is = 2 omega2 = 1.6714e-07 ik_interpolate = 44 is = 3 omega2 = 2.9227e-07 - ik_interpolate = 44 is = 4 omega2 = 6.4505e-07 - ik_interpolate = 44 is = 5 omega2 = 7.1850e-07 - ik_interpolate = 44 is = 6 omega2 = 8.5972e-07 + ik_interpolate = 44 is = 4 omega2 = 6.4521e-07 + ik_interpolate = 44 is = 5 omega2 = 7.1867e-07 + ik_interpolate = 44 is = 6 omega2 = 8.5988e-07 - ik_interpolate = 45 is = 1 omega2 = 1.5076e-07 - ik_interpolate = 45 is = 2 omega2 = 1.6710e-07 + ik_interpolate = 45 is = 1 omega2 = 1.5079e-07 + ik_interpolate = 45 is = 2 omega2 = 1.6714e-07 ik_interpolate = 45 is = 3 omega2 = 2.9227e-07 - ik_interpolate = 45 is = 4 omega2 = 6.4505e-07 - ik_interpolate = 45 is = 5 omega2 = 7.1850e-07 - ik_interpolate = 45 is = 6 omega2 = 8.5972e-07 - - ik_interpolate = 46 is = 1 omega2 = 9.2770e-08 - ik_interpolate = 46 is = 2 omega2 = 9.2770e-08 - ik_interpolate = 46 is = 3 omega2 = 3.6780e-07 - ik_interpolate = 46 is = 4 omega2 = 5.3740e-07 - ik_interpolate = 46 is = 5 omega2 = 5.3740e-07 - ik_interpolate = 46 is = 6 omega2 = 7.9208e-07 - - ik_interpolate = 47 is = 1 omega2 = 1.5076e-07 - ik_interpolate = 47 is = 2 omega2 = 1.6710e-07 + ik_interpolate = 45 is = 4 omega2 = 6.4521e-07 + ik_interpolate = 45 is = 5 omega2 = 7.1867e-07 + ik_interpolate = 45 is = 6 omega2 = 8.5988e-07 + + ik_interpolate = 46 is = 1 omega2 = 9.2777e-08 + ik_interpolate = 46 is = 2 omega2 = 9.2777e-08 + ik_interpolate = 46 is = 3 omega2 = 3.6787e-07 + ik_interpolate = 46 is = 4 omega2 = 5.3761e-07 + ik_interpolate = 46 is = 5 omega2 = 5.3761e-07 + ik_interpolate = 46 is = 6 omega2 = 7.9218e-07 + + ik_interpolate = 47 is = 1 omega2 = 1.5079e-07 + ik_interpolate = 47 is = 2 omega2 = 1.6714e-07 ik_interpolate = 47 is = 3 omega2 = 2.9227e-07 - ik_interpolate = 47 is = 4 omega2 = 6.4505e-07 - ik_interpolate = 47 is = 5 omega2 = 7.1850e-07 - ik_interpolate = 47 is = 6 omega2 = 8.5972e-07 + ik_interpolate = 47 is = 4 omega2 = 6.4521e-07 + ik_interpolate = 47 is = 5 omega2 = 7.1867e-07 + ik_interpolate = 47 is = 6 omega2 = 8.5988e-07 ik_interpolate = 48 is = 1 omega2 = 8.2271e-08 - ik_interpolate = 48 is = 2 omega2 = 2.5330e-07 - ik_interpolate = 48 is = 3 omega2 = 5.0418e-07 - ik_interpolate = 48 is = 4 omega2 = 5.4188e-07 - ik_interpolate = 48 is = 5 omega2 = 7.4255e-07 - ik_interpolate = 48 is = 6 omega2 = 8.8576e-07 - - ik_interpolate = 49 is = 1 omega2 = 1.2906e-07 - ik_interpolate = 49 is = 2 omega2 = 1.2906e-07 - ik_interpolate = 49 is = 3 omega2 = 2.6193e-07 - ik_interpolate = 49 is = 4 omega2 = 6.7842e-07 - ik_interpolate = 49 is = 5 omega2 = 6.7842e-07 - ik_interpolate = 49 is = 6 omega2 = 1.1749e-06 + ik_interpolate = 48 is = 2 omega2 = 2.5338e-07 + ik_interpolate = 48 is = 3 omega2 = 5.0439e-07 + ik_interpolate = 48 is = 4 omega2 = 5.4194e-07 + ik_interpolate = 48 is = 5 omega2 = 7.4263e-07 + ik_interpolate = 48 is = 6 omega2 = 8.8584e-07 + + ik_interpolate = 49 is = 1 omega2 = 1.2909e-07 + ik_interpolate = 49 is = 2 omega2 = 1.2909e-07 + ik_interpolate = 49 is = 3 omega2 = 2.6194e-07 + ik_interpolate = 49 is = 4 omega2 = 6.7858e-07 + ik_interpolate = 49 is = 5 omega2 = 6.7858e-07 + ik_interpolate = 49 is = 6 omega2 = 1.1751e-06 ik_interpolate = 50 is = 1 omega2 = 8.2271e-08 - ik_interpolate = 50 is = 2 omega2 = 2.5330e-07 - ik_interpolate = 50 is = 3 omega2 = 5.0418e-07 - ik_interpolate = 50 is = 4 omega2 = 5.4188e-07 - ik_interpolate = 50 is = 5 omega2 = 7.4255e-07 - ik_interpolate = 50 is = 6 omega2 = 8.8576e-07 - - ik_interpolate = 51 is = 1 omega2 = 1.5076e-07 - ik_interpolate = 51 is = 2 omega2 = 1.6710e-07 + ik_interpolate = 50 is = 2 omega2 = 2.5338e-07 + ik_interpolate = 50 is = 3 omega2 = 5.0439e-07 + ik_interpolate = 50 is = 4 omega2 = 5.4194e-07 + ik_interpolate = 50 is = 5 omega2 = 7.4263e-07 + ik_interpolate = 50 is = 6 omega2 = 8.8584e-07 + + ik_interpolate = 51 is = 1 omega2 = 1.5079e-07 + ik_interpolate = 51 is = 2 omega2 = 1.6714e-07 ik_interpolate = 51 is = 3 omega2 = 2.9227e-07 - ik_interpolate = 51 is = 4 omega2 = 6.4505e-07 - ik_interpolate = 51 is = 5 omega2 = 7.1850e-07 - ik_interpolate = 51 is = 6 omega2 = 8.5972e-07 + ik_interpolate = 51 is = 4 omega2 = 6.4521e-07 + ik_interpolate = 51 is = 5 omega2 = 7.1867e-07 + ik_interpolate = 51 is = 6 omega2 = 8.5988e-07 - ik_interpolate = 52 is = 1 omega2 = 4.2000e-08 - ik_interpolate = 52 is = 2 omega2 = 4.2000e-08 - ik_interpolate = 52 is = 3 omega2 = 4.0561e-07 - ik_interpolate = 52 is = 4 omega2 = 4.0561e-07 - ik_interpolate = 52 is = 5 omega2 = 4.2239e-07 - ik_interpolate = 52 is = 6 omega2 = 8.3513e-07 + ik_interpolate = 52 is = 1 omega2 = 4.2003e-08 + ik_interpolate = 52 is = 2 omega2 = 4.2003e-08 + ik_interpolate = 52 is = 3 omega2 = 4.0583e-07 + ik_interpolate = 52 is = 4 omega2 = 4.0583e-07 + ik_interpolate = 52 is = 5 omega2 = 4.2247e-07 + ik_interpolate = 52 is = 6 omega2 = 8.3521e-07 ik_interpolate = 53 is = 1 omega2 = 8.2271e-08 - ik_interpolate = 53 is = 2 omega2 = 2.5330e-07 - ik_interpolate = 53 is = 3 omega2 = 5.0418e-07 - ik_interpolate = 53 is = 4 omega2 = 5.4188e-07 - ik_interpolate = 53 is = 5 omega2 = 7.4255e-07 - ik_interpolate = 53 is = 6 omega2 = 8.8576e-07 - - ik_interpolate = 54 is = 1 omega2 = 1.5076e-07 - ik_interpolate = 54 is = 2 omega2 = 1.6710e-07 + ik_interpolate = 53 is = 2 omega2 = 2.5338e-07 + ik_interpolate = 53 is = 3 omega2 = 5.0439e-07 + ik_interpolate = 53 is = 4 omega2 = 5.4194e-07 + ik_interpolate = 53 is = 5 omega2 = 7.4263e-07 + ik_interpolate = 53 is = 6 omega2 = 8.8584e-07 + + ik_interpolate = 54 is = 1 omega2 = 1.5079e-07 + ik_interpolate = 54 is = 2 omega2 = 1.6714e-07 ik_interpolate = 54 is = 3 omega2 = 2.9227e-07 - ik_interpolate = 54 is = 4 omega2 = 6.4505e-07 - ik_interpolate = 54 is = 5 omega2 = 7.1850e-07 - ik_interpolate = 54 is = 6 omega2 = 8.5972e-07 - - ik_interpolate = 55 is = 1 omega2 = 9.2770e-08 - ik_interpolate = 55 is = 2 omega2 = 9.2770e-08 - ik_interpolate = 55 is = 3 omega2 = 3.6780e-07 - ik_interpolate = 55 is = 4 omega2 = 5.3740e-07 - ik_interpolate = 55 is = 5 omega2 = 5.3740e-07 - ik_interpolate = 55 is = 6 omega2 = 7.9208e-07 - - ik_interpolate = 56 is = 1 omega2 = 1.5076e-07 - ik_interpolate = 56 is = 2 omega2 = 1.6710e-07 + ik_interpolate = 54 is = 4 omega2 = 6.4521e-07 + ik_interpolate = 54 is = 5 omega2 = 7.1867e-07 + ik_interpolate = 54 is = 6 omega2 = 8.5988e-07 + + ik_interpolate = 55 is = 1 omega2 = 9.2777e-08 + ik_interpolate = 55 is = 2 omega2 = 9.2777e-08 + ik_interpolate = 55 is = 3 omega2 = 3.6787e-07 + ik_interpolate = 55 is = 4 omega2 = 5.3761e-07 + ik_interpolate = 55 is = 5 omega2 = 5.3761e-07 + ik_interpolate = 55 is = 6 omega2 = 7.9218e-07 + + ik_interpolate = 56 is = 1 omega2 = 1.5079e-07 + ik_interpolate = 56 is = 2 omega2 = 1.6714e-07 ik_interpolate = 56 is = 3 omega2 = 2.9227e-07 - ik_interpolate = 56 is = 4 omega2 = 6.4505e-07 - ik_interpolate = 56 is = 5 omega2 = 7.1850e-07 - ik_interpolate = 56 is = 6 omega2 = 8.5972e-07 + ik_interpolate = 56 is = 4 omega2 = 6.4521e-07 + ik_interpolate = 56 is = 5 omega2 = 7.1867e-07 + ik_interpolate = 56 is = 6 omega2 = 8.5988e-07 - ik_interpolate = 57 is = 1 omega2 = 1.5076e-07 - ik_interpolate = 57 is = 2 omega2 = 1.6710e-07 + ik_interpolate = 57 is = 1 omega2 = 1.5079e-07 + ik_interpolate = 57 is = 2 omega2 = 1.6714e-07 ik_interpolate = 57 is = 3 omega2 = 2.9227e-07 - ik_interpolate = 57 is = 4 omega2 = 6.4505e-07 - ik_interpolate = 57 is = 5 omega2 = 7.1850e-07 - ik_interpolate = 57 is = 6 omega2 = 8.5972e-07 - - ik_interpolate = 58 is = 1 omega2 = 9.2770e-08 - ik_interpolate = 58 is = 2 omega2 = 9.2770e-08 - ik_interpolate = 58 is = 3 omega2 = 3.6780e-07 - ik_interpolate = 58 is = 4 omega2 = 5.3740e-07 - ik_interpolate = 58 is = 5 omega2 = 5.3740e-07 - ik_interpolate = 58 is = 6 omega2 = 7.9208e-07 - - ik_interpolate = 59 is = 1 omega2 = 1.5076e-07 - ik_interpolate = 59 is = 2 omega2 = 1.6710e-07 + ik_interpolate = 57 is = 4 omega2 = 6.4521e-07 + ik_interpolate = 57 is = 5 omega2 = 7.1867e-07 + ik_interpolate = 57 is = 6 omega2 = 8.5988e-07 + + ik_interpolate = 58 is = 1 omega2 = 9.2777e-08 + ik_interpolate = 58 is = 2 omega2 = 9.2777e-08 + ik_interpolate = 58 is = 3 omega2 = 3.6787e-07 + ik_interpolate = 58 is = 4 omega2 = 5.3761e-07 + ik_interpolate = 58 is = 5 omega2 = 5.3761e-07 + ik_interpolate = 58 is = 6 omega2 = 7.9218e-07 + + ik_interpolate = 59 is = 1 omega2 = 1.5079e-07 + ik_interpolate = 59 is = 2 omega2 = 1.6714e-07 ik_interpolate = 59 is = 3 omega2 = 2.9227e-07 - ik_interpolate = 59 is = 4 omega2 = 6.4505e-07 - ik_interpolate = 59 is = 5 omega2 = 7.1850e-07 - ik_interpolate = 59 is = 6 omega2 = 8.5972e-07 + ik_interpolate = 59 is = 4 omega2 = 6.4521e-07 + ik_interpolate = 59 is = 5 omega2 = 7.1867e-07 + ik_interpolate = 59 is = 6 omega2 = 8.5988e-07 ik_interpolate = 60 is = 1 omega2 = 8.2271e-08 - ik_interpolate = 60 is = 2 omega2 = 2.5330e-07 - ik_interpolate = 60 is = 3 omega2 = 5.0418e-07 - ik_interpolate = 60 is = 4 omega2 = 5.4188e-07 - ik_interpolate = 60 is = 5 omega2 = 7.4255e-07 - ik_interpolate = 60 is = 6 omega2 = 8.8576e-07 - - ik_interpolate = 61 is = 1 omega2 = 4.2000e-08 - ik_interpolate = 61 is = 2 omega2 = 4.2000e-08 - ik_interpolate = 61 is = 3 omega2 = 4.0561e-07 - ik_interpolate = 61 is = 4 omega2 = 4.0561e-07 - ik_interpolate = 61 is = 5 omega2 = 4.2239e-07 - ik_interpolate = 61 is = 6 omega2 = 8.3513e-07 - - ik_interpolate = 62 is = 1 omega2 = 1.5076e-07 - ik_interpolate = 62 is = 2 omega2 = 1.6710e-07 + ik_interpolate = 60 is = 2 omega2 = 2.5338e-07 + ik_interpolate = 60 is = 3 omega2 = 5.0439e-07 + ik_interpolate = 60 is = 4 omega2 = 5.4194e-07 + ik_interpolate = 60 is = 5 omega2 = 7.4263e-07 + ik_interpolate = 60 is = 6 omega2 = 8.8584e-07 + + ik_interpolate = 61 is = 1 omega2 = 4.2003e-08 + ik_interpolate = 61 is = 2 omega2 = 4.2003e-08 + ik_interpolate = 61 is = 3 omega2 = 4.0583e-07 + ik_interpolate = 61 is = 4 omega2 = 4.0583e-07 + ik_interpolate = 61 is = 5 omega2 = 4.2247e-07 + ik_interpolate = 61 is = 6 omega2 = 8.3521e-07 + + ik_interpolate = 62 is = 1 omega2 = 1.5079e-07 + ik_interpolate = 62 is = 2 omega2 = 1.6714e-07 ik_interpolate = 62 is = 3 omega2 = 2.9227e-07 - ik_interpolate = 62 is = 4 omega2 = 6.4505e-07 - ik_interpolate = 62 is = 5 omega2 = 7.1850e-07 - ik_interpolate = 62 is = 6 omega2 = 8.5972e-07 + ik_interpolate = 62 is = 4 omega2 = 6.4521e-07 + ik_interpolate = 62 is = 5 omega2 = 7.1867e-07 + ik_interpolate = 62 is = 6 omega2 = 8.5988e-07 ik_interpolate = 63 is = 1 omega2 = 8.2271e-08 - ik_interpolate = 63 is = 2 omega2 = 2.5330e-07 - ik_interpolate = 63 is = 3 omega2 = 5.0418e-07 - ik_interpolate = 63 is = 4 omega2 = 5.4188e-07 - ik_interpolate = 63 is = 5 omega2 = 7.4255e-07 - ik_interpolate = 63 is = 6 omega2 = 8.8576e-07 - - ik_interpolate = 64 is = 1 omega2 = 1.2906e-07 - ik_interpolate = 64 is = 2 omega2 = 1.2906e-07 - ik_interpolate = 64 is = 3 omega2 = 2.6193e-07 - ik_interpolate = 64 is = 4 omega2 = 6.7842e-07 - ik_interpolate = 64 is = 5 omega2 = 6.7842e-07 - ik_interpolate = 64 is = 6 omega2 = 1.1749e-06 + ik_interpolate = 63 is = 2 omega2 = 2.5338e-07 + ik_interpolate = 63 is = 3 omega2 = 5.0439e-07 + ik_interpolate = 63 is = 4 omega2 = 5.4194e-07 + ik_interpolate = 63 is = 5 omega2 = 7.4263e-07 + ik_interpolate = 63 is = 6 omega2 = 8.8584e-07 + + ik_interpolate = 64 is = 1 omega2 = 1.2909e-07 + ik_interpolate = 64 is = 2 omega2 = 1.2909e-07 + ik_interpolate = 64 is = 3 omega2 = 2.6194e-07 + ik_interpolate = 64 is = 4 omega2 = 6.7858e-07 + ik_interpolate = 64 is = 5 omega2 = 6.7858e-07 + ik_interpolate = 64 is = 6 omega2 = 1.1751e-06 Temperature = 0.0000e+00 K SCPH ITER 1 : DIFF = N/A - SCPH ITER 2 : DIFF = 6.0108e-09 + SCPH ITER 2 : DIFF = 6.0976e-09 + SCPH ITER 3 : DIFF = 5.4811e-09 + SCPH ITER 4 : DIFF = 4.9270e-09 + SCPH ITER 5 : DIFF = 4.4289e-09 + SCPH ITER 6 : DIFF = 3.9812e-09 + SCPH ITER 7 : DIFF = 3.5787e-09 + SCPH ITER 8 : DIFF = 3.2170e-09 + SCPH ITER 9 : DIFF = 2.8918e-09 + SCPH ITER 10 : DIFF = 2.5994e-09 + SCPH ITER 11 : DIFF = 2.3367e-09 + SCPH ITER 12 : DIFF = 2.1005e-09 + SCPH ITER 13 : DIFF = 1.8881e-09 + SCPH ITER 14 : DIFF = 1.6973e-09 + SCPH ITER 15 : DIFF = 1.5257e-09 + SCPH ITER 16 : DIFF = 1.3715e-09 + SCPH ITER 17 : DIFF = 1.2328e-09 + SCPH ITER 18 : DIFF = 1.1082e-09 + SCPH ITER 19 : DIFF = 9.9619e-10 + SCPH ITER 20 : DIFF = 8.9549e-10 + SCPH ITER 21 : DIFF = 8.0497e-10 + SCPH ITER 22 : DIFF = 7.2360e-10 + SCPH ITER 23 : DIFF = 6.5046e-10 + SCPH ITER 24 : DIFF = 5.8471e-10 + SCPH ITER 25 : DIFF = 5.2560e-10 + SCPH ITER 26 : DIFF = 4.7247e-10 + SCPH ITER 27 : DIFF = 4.2471e-10 + SCPH ITER 28 : DIFF = 3.8179e-10 + SCPH ITER 29 : DIFF = 3.4319e-10 + SCPH ITER 30 : DIFF = 3.0850e-10 + SCPH ITER 31 : DIFF = 2.7732e-10 + SCPH ITER 32 : DIFF = 2.4928e-10 + SCPH ITER 33 : DIFF = 2.2409e-10 + SCPH ITER 34 : DIFF = 2.0143e-10 + SCPH ITER 35 : DIFF = 1.8107e-10 + SCPH ITER 36 : DIFF = 1.6277e-10 + SCPH ITER 37 : DIFF = 1.4633e-10 + SCPH ITER 38 : DIFF = 1.3154e-10 + SCPH ITER 39 : DIFF = 1.1823e-10 + SCPH ITER 40 : DIFF = 1.0628e-10 + SCPH ITER 41 : DIFF = 9.5557e-11 DIFF < SCPH_TOL : break SCPH loop - Temp = 0.0000e+00 : convergence achieved in 2 iterations. + Temp = 0.0000e+00 : convergence achieved in 41 iterations. New eigenvalues - ik_interpolate = 1 is = 1 omega2 = 1.8335e-22 - ik_interpolate = 1 is = 2 omega2 = 1.8529e-22 - ik_interpolate = 1 is = 3 omega2 = 2.0046e-22 - ik_interpolate = 1 is = 4 omega2 = 1.6209e-07 - ik_interpolate = 1 is = 5 omega2 = 1.6209e-07 - ik_interpolate = 1 is = 6 omega2 = 1.6209e-07 - - ik_interpolate = 2 is = 1 omega2 = 1.2716e-07 - ik_interpolate = 2 is = 2 omega2 = 1.2716e-07 - ik_interpolate = 2 is = 3 omega2 = 2.6139e-07 - ik_interpolate = 2 is = 4 omega2 = 6.6753e-07 - ik_interpolate = 2 is = 5 omega2 = 6.6753e-07 - ik_interpolate = 2 is = 6 omega2 = 1.1639e-06 - - ik_interpolate = 3 is = 1 omega2 = 2.7576e-07 - ik_interpolate = 3 is = 2 omega2 = 2.7576e-07 - ik_interpolate = 3 is = 3 omega2 = 6.8475e-07 - ik_interpolate = 3 is = 4 omega2 = 7.8288e-07 - ik_interpolate = 3 is = 5 omega2 = 7.8288e-07 - ik_interpolate = 3 is = 6 omega2 = 9.3288e-07 - - ik_interpolate = 4 is = 1 omega2 = 1.2716e-07 - ik_interpolate = 4 is = 2 omega2 = 1.2716e-07 - ik_interpolate = 4 is = 3 omega2 = 2.6139e-07 - ik_interpolate = 4 is = 4 omega2 = 6.6753e-07 - ik_interpolate = 4 is = 5 omega2 = 6.6753e-07 - ik_interpolate = 4 is = 6 omega2 = 1.1639e-06 - - ik_interpolate = 5 is = 1 omega2 = 1.2716e-07 - ik_interpolate = 5 is = 2 omega2 = 1.2716e-07 - ik_interpolate = 5 is = 3 omega2 = 2.6139e-07 - ik_interpolate = 5 is = 4 omega2 = 6.6753e-07 - ik_interpolate = 5 is = 5 omega2 = 6.6753e-07 - ik_interpolate = 5 is = 6 omega2 = 1.1639e-06 - - ik_interpolate = 6 is = 1 omega2 = 4.1672e-08 - ik_interpolate = 6 is = 2 omega2 = 4.1672e-08 - ik_interpolate = 6 is = 3 omega2 = 3.8945e-07 - ik_interpolate = 6 is = 4 omega2 = 3.8945e-07 - ik_interpolate = 6 is = 5 omega2 = 4.1752e-07 - ik_interpolate = 6 is = 6 omega2 = 8.3202e-07 - - ik_interpolate = 7 is = 1 omega2 = 1.4876e-07 - ik_interpolate = 7 is = 2 omega2 = 1.6454e-07 + ik_interpolate = 1 is = 1 omega2 = 0.0000e+00 + ik_interpolate = 1 is = 2 omega2 = 0.0000e+00 + ik_interpolate = 1 is = 3 omega2 = 0.0000e+00 + ik_interpolate = 1 is = 4 omega2 = 1.6224e-07 + ik_interpolate = 1 is = 5 omega2 = 1.6224e-07 + ik_interpolate = 1 is = 6 omega2 = 1.6224e-07 + + ik_interpolate = 2 is = 1 omega2 = 1.2718e-07 + ik_interpolate = 2 is = 2 omega2 = 1.2718e-07 + ik_interpolate = 2 is = 3 omega2 = 2.6140e-07 + ik_interpolate = 2 is = 4 omega2 = 6.6764e-07 + ik_interpolate = 2 is = 5 omega2 = 6.6764e-07 + ik_interpolate = 2 is = 6 omega2 = 1.1640e-06 + + ik_interpolate = 3 is = 1 omega2 = 2.7580e-07 + ik_interpolate = 3 is = 2 omega2 = 2.7580e-07 + ik_interpolate = 3 is = 3 omega2 = 6.8478e-07 + ik_interpolate = 3 is = 4 omega2 = 7.8294e-07 + ik_interpolate = 3 is = 5 omega2 = 7.8294e-07 + ik_interpolate = 3 is = 6 omega2 = 9.3294e-07 + + ik_interpolate = 4 is = 1 omega2 = 1.2718e-07 + ik_interpolate = 4 is = 2 omega2 = 1.2718e-07 + ik_interpolate = 4 is = 3 omega2 = 2.6140e-07 + ik_interpolate = 4 is = 4 omega2 = 6.6764e-07 + ik_interpolate = 4 is = 5 omega2 = 6.6764e-07 + ik_interpolate = 4 is = 6 omega2 = 1.1640e-06 + + ik_interpolate = 5 is = 1 omega2 = 1.2718e-07 + ik_interpolate = 5 is = 2 omega2 = 1.2718e-07 + ik_interpolate = 5 is = 3 omega2 = 2.6140e-07 + ik_interpolate = 5 is = 4 omega2 = 6.6764e-07 + ik_interpolate = 5 is = 5 omega2 = 6.6764e-07 + ik_interpolate = 5 is = 6 omega2 = 1.1640e-06 + + ik_interpolate = 6 is = 1 omega2 = 4.1673e-08 + ik_interpolate = 6 is = 2 omega2 = 4.1673e-08 + ik_interpolate = 6 is = 3 omega2 = 3.8959e-07 + ik_interpolate = 6 is = 4 omega2 = 3.8959e-07 + ik_interpolate = 6 is = 5 omega2 = 4.1757e-07 + ik_interpolate = 6 is = 6 omega2 = 8.3207e-07 + + ik_interpolate = 7 is = 1 omega2 = 1.4878e-07 + ik_interpolate = 7 is = 2 omega2 = 1.6456e-07 ik_interpolate = 7 is = 3 omega2 = 2.9296e-07 - ik_interpolate = 7 is = 4 omega2 = 6.3477e-07 - ik_interpolate = 7 is = 5 omega2 = 7.0810e-07 - ik_interpolate = 7 is = 6 omega2 = 8.4921e-07 - - ik_interpolate = 8 is = 1 omega2 = 8.2020e-08 - ik_interpolate = 8 is = 2 omega2 = 2.4841e-07 - ik_interpolate = 8 is = 3 omega2 = 4.8956e-07 - ik_interpolate = 8 is = 4 omega2 = 5.3904e-07 - ik_interpolate = 8 is = 5 omega2 = 7.3889e-07 - ik_interpolate = 8 is = 6 omega2 = 8.8190e-07 - - ik_interpolate = 9 is = 1 omega2 = 2.7576e-07 - ik_interpolate = 9 is = 2 omega2 = 2.7576e-07 - ik_interpolate = 9 is = 3 omega2 = 6.8475e-07 - ik_interpolate = 9 is = 4 omega2 = 7.8288e-07 - ik_interpolate = 9 is = 5 omega2 = 7.8288e-07 - ik_interpolate = 9 is = 6 omega2 = 9.3288e-07 - - ik_interpolate = 10 is = 1 omega2 = 1.4876e-07 - ik_interpolate = 10 is = 2 omega2 = 1.6454e-07 + ik_interpolate = 7 is = 4 omega2 = 6.3487e-07 + ik_interpolate = 7 is = 5 omega2 = 7.0821e-07 + ik_interpolate = 7 is = 6 omega2 = 8.4931e-07 + + ik_interpolate = 8 is = 1 omega2 = 8.2018e-08 + ik_interpolate = 8 is = 2 omega2 = 2.4846e-07 + ik_interpolate = 8 is = 3 omega2 = 4.8970e-07 + ik_interpolate = 8 is = 4 omega2 = 5.3908e-07 + ik_interpolate = 8 is = 5 omega2 = 7.3894e-07 + ik_interpolate = 8 is = 6 omega2 = 8.8196e-07 + + ik_interpolate = 9 is = 1 omega2 = 2.7580e-07 + ik_interpolate = 9 is = 2 omega2 = 2.7580e-07 + ik_interpolate = 9 is = 3 omega2 = 6.8478e-07 + ik_interpolate = 9 is = 4 omega2 = 7.8294e-07 + ik_interpolate = 9 is = 5 omega2 = 7.8294e-07 + ik_interpolate = 9 is = 6 omega2 = 9.3294e-07 + + ik_interpolate = 10 is = 1 omega2 = 1.4878e-07 + ik_interpolate = 10 is = 2 omega2 = 1.6456e-07 ik_interpolate = 10 is = 3 omega2 = 2.9296e-07 - ik_interpolate = 10 is = 4 omega2 = 6.3477e-07 - ik_interpolate = 10 is = 5 omega2 = 7.0810e-07 - ik_interpolate = 10 is = 6 omega2 = 8.4921e-07 - - ik_interpolate = 11 is = 1 omega2 = 5.0488e-08 - ik_interpolate = 11 is = 2 omega2 = 5.0488e-08 - ik_interpolate = 11 is = 3 omega2 = 9.0564e-08 - ik_interpolate = 11 is = 4 omega2 = 4.5378e-07 - ik_interpolate = 11 is = 5 omega2 = 4.5378e-07 - ik_interpolate = 11 is = 6 omega2 = 5.4806e-07 - - ik_interpolate = 12 is = 1 omega2 = 1.4876e-07 - ik_interpolate = 12 is = 2 omega2 = 1.6454e-07 + ik_interpolate = 10 is = 4 omega2 = 6.3487e-07 + ik_interpolate = 10 is = 5 omega2 = 7.0821e-07 + ik_interpolate = 10 is = 6 omega2 = 8.4931e-07 + + ik_interpolate = 11 is = 1 omega2 = 5.0493e-08 + ik_interpolate = 11 is = 2 omega2 = 5.0493e-08 + ik_interpolate = 11 is = 3 omega2 = 9.0570e-08 + ik_interpolate = 11 is = 4 omega2 = 4.5392e-07 + ik_interpolate = 11 is = 5 omega2 = 4.5392e-07 + ik_interpolate = 11 is = 6 omega2 = 5.4820e-07 + + ik_interpolate = 12 is = 1 omega2 = 1.4878e-07 + ik_interpolate = 12 is = 2 omega2 = 1.6456e-07 ik_interpolate = 12 is = 3 omega2 = 2.9296e-07 - ik_interpolate = 12 is = 4 omega2 = 6.3477e-07 - ik_interpolate = 12 is = 5 omega2 = 7.0810e-07 - ik_interpolate = 12 is = 6 omega2 = 8.4921e-07 - - ik_interpolate = 13 is = 1 omega2 = 1.2716e-07 - ik_interpolate = 13 is = 2 omega2 = 1.2716e-07 - ik_interpolate = 13 is = 3 omega2 = 2.6139e-07 - ik_interpolate = 13 is = 4 omega2 = 6.6753e-07 - ik_interpolate = 13 is = 5 omega2 = 6.6753e-07 - ik_interpolate = 13 is = 6 omega2 = 1.1639e-06 - - ik_interpolate = 14 is = 1 omega2 = 8.2020e-08 - ik_interpolate = 14 is = 2 omega2 = 2.4841e-07 - ik_interpolate = 14 is = 3 omega2 = 4.8956e-07 - ik_interpolate = 14 is = 4 omega2 = 5.3904e-07 - ik_interpolate = 14 is = 5 omega2 = 7.3889e-07 - ik_interpolate = 14 is = 6 omega2 = 8.8190e-07 - - ik_interpolate = 15 is = 1 omega2 = 1.4876e-07 - ik_interpolate = 15 is = 2 omega2 = 1.6454e-07 + ik_interpolate = 12 is = 4 omega2 = 6.3487e-07 + ik_interpolate = 12 is = 5 omega2 = 7.0821e-07 + ik_interpolate = 12 is = 6 omega2 = 8.4931e-07 + + ik_interpolate = 13 is = 1 omega2 = 1.2718e-07 + ik_interpolate = 13 is = 2 omega2 = 1.2718e-07 + ik_interpolate = 13 is = 3 omega2 = 2.6140e-07 + ik_interpolate = 13 is = 4 omega2 = 6.6764e-07 + ik_interpolate = 13 is = 5 omega2 = 6.6764e-07 + ik_interpolate = 13 is = 6 omega2 = 1.1640e-06 + + ik_interpolate = 14 is = 1 omega2 = 8.2018e-08 + ik_interpolate = 14 is = 2 omega2 = 2.4846e-07 + ik_interpolate = 14 is = 3 omega2 = 4.8970e-07 + ik_interpolate = 14 is = 4 omega2 = 5.3908e-07 + ik_interpolate = 14 is = 5 omega2 = 7.3894e-07 + ik_interpolate = 14 is = 6 omega2 = 8.8196e-07 + + ik_interpolate = 15 is = 1 omega2 = 1.4878e-07 + ik_interpolate = 15 is = 2 omega2 = 1.6456e-07 ik_interpolate = 15 is = 3 omega2 = 2.9296e-07 - ik_interpolate = 15 is = 4 omega2 = 6.3477e-07 - ik_interpolate = 15 is = 5 omega2 = 7.0810e-07 - ik_interpolate = 15 is = 6 omega2 = 8.4921e-07 - - ik_interpolate = 16 is = 1 omega2 = 4.1672e-08 - ik_interpolate = 16 is = 2 omega2 = 4.1672e-08 - ik_interpolate = 16 is = 3 omega2 = 3.8945e-07 - ik_interpolate = 16 is = 4 omega2 = 3.8945e-07 - ik_interpolate = 16 is = 5 omega2 = 4.1752e-07 - ik_interpolate = 16 is = 6 omega2 = 8.3202e-07 - - ik_interpolate = 17 is = 1 omega2 = 1.2716e-07 - ik_interpolate = 17 is = 2 omega2 = 1.2716e-07 - ik_interpolate = 17 is = 3 omega2 = 2.6139e-07 - ik_interpolate = 17 is = 4 omega2 = 6.6753e-07 - ik_interpolate = 17 is = 5 omega2 = 6.6753e-07 - ik_interpolate = 17 is = 6 omega2 = 1.1639e-06 - - ik_interpolate = 18 is = 1 omega2 = 4.1672e-08 - ik_interpolate = 18 is = 2 omega2 = 4.1672e-08 - ik_interpolate = 18 is = 3 omega2 = 3.8945e-07 - ik_interpolate = 18 is = 4 omega2 = 3.8945e-07 - ik_interpolate = 18 is = 5 omega2 = 4.1752e-07 - ik_interpolate = 18 is = 6 omega2 = 8.3202e-07 - - ik_interpolate = 19 is = 1 omega2 = 1.4876e-07 - ik_interpolate = 19 is = 2 omega2 = 1.6454e-07 + ik_interpolate = 15 is = 4 omega2 = 6.3487e-07 + ik_interpolate = 15 is = 5 omega2 = 7.0821e-07 + ik_interpolate = 15 is = 6 omega2 = 8.4931e-07 + + ik_interpolate = 16 is = 1 omega2 = 4.1673e-08 + ik_interpolate = 16 is = 2 omega2 = 4.1673e-08 + ik_interpolate = 16 is = 3 omega2 = 3.8959e-07 + ik_interpolate = 16 is = 4 omega2 = 3.8959e-07 + ik_interpolate = 16 is = 5 omega2 = 4.1757e-07 + ik_interpolate = 16 is = 6 omega2 = 8.3207e-07 + + ik_interpolate = 17 is = 1 omega2 = 1.2718e-07 + ik_interpolate = 17 is = 2 omega2 = 1.2718e-07 + ik_interpolate = 17 is = 3 omega2 = 2.6140e-07 + ik_interpolate = 17 is = 4 omega2 = 6.6764e-07 + ik_interpolate = 17 is = 5 omega2 = 6.6764e-07 + ik_interpolate = 17 is = 6 omega2 = 1.1640e-06 + + ik_interpolate = 18 is = 1 omega2 = 4.1673e-08 + ik_interpolate = 18 is = 2 omega2 = 4.1673e-08 + ik_interpolate = 18 is = 3 omega2 = 3.8959e-07 + ik_interpolate = 18 is = 4 omega2 = 3.8959e-07 + ik_interpolate = 18 is = 5 omega2 = 4.1757e-07 + ik_interpolate = 18 is = 6 omega2 = 8.3207e-07 + + ik_interpolate = 19 is = 1 omega2 = 1.4878e-07 + ik_interpolate = 19 is = 2 omega2 = 1.6456e-07 ik_interpolate = 19 is = 3 omega2 = 2.9296e-07 - ik_interpolate = 19 is = 4 omega2 = 6.3477e-07 - ik_interpolate = 19 is = 5 omega2 = 7.0810e-07 - ik_interpolate = 19 is = 6 omega2 = 8.4921e-07 - - ik_interpolate = 20 is = 1 omega2 = 8.2020e-08 - ik_interpolate = 20 is = 2 omega2 = 2.4841e-07 - ik_interpolate = 20 is = 3 omega2 = 4.8956e-07 - ik_interpolate = 20 is = 4 omega2 = 5.3904e-07 - ik_interpolate = 20 is = 5 omega2 = 7.3889e-07 - ik_interpolate = 20 is = 6 omega2 = 8.8190e-07 - - ik_interpolate = 21 is = 1 omega2 = 4.1672e-08 - ik_interpolate = 21 is = 2 omega2 = 4.1672e-08 - ik_interpolate = 21 is = 3 omega2 = 3.8945e-07 - ik_interpolate = 21 is = 4 omega2 = 3.8945e-07 - ik_interpolate = 21 is = 5 omega2 = 4.1752e-07 - ik_interpolate = 21 is = 6 omega2 = 8.3202e-07 - - ik_interpolate = 22 is = 1 omega2 = 1.2716e-07 - ik_interpolate = 22 is = 2 omega2 = 1.2716e-07 - ik_interpolate = 22 is = 3 omega2 = 2.6139e-07 - ik_interpolate = 22 is = 4 omega2 = 6.6753e-07 - ik_interpolate = 22 is = 5 omega2 = 6.6753e-07 - ik_interpolate = 22 is = 6 omega2 = 1.1639e-06 - - ik_interpolate = 23 is = 1 omega2 = 8.2020e-08 - ik_interpolate = 23 is = 2 omega2 = 2.4841e-07 - ik_interpolate = 23 is = 3 omega2 = 4.8956e-07 - ik_interpolate = 23 is = 4 omega2 = 5.3904e-07 - ik_interpolate = 23 is = 5 omega2 = 7.3889e-07 - ik_interpolate = 23 is = 6 omega2 = 8.8190e-07 - - ik_interpolate = 24 is = 1 omega2 = 1.4876e-07 - ik_interpolate = 24 is = 2 omega2 = 1.6454e-07 + ik_interpolate = 19 is = 4 omega2 = 6.3487e-07 + ik_interpolate = 19 is = 5 omega2 = 7.0821e-07 + ik_interpolate = 19 is = 6 omega2 = 8.4931e-07 + + ik_interpolate = 20 is = 1 omega2 = 8.2018e-08 + ik_interpolate = 20 is = 2 omega2 = 2.4846e-07 + ik_interpolate = 20 is = 3 omega2 = 4.8970e-07 + ik_interpolate = 20 is = 4 omega2 = 5.3908e-07 + ik_interpolate = 20 is = 5 omega2 = 7.3894e-07 + ik_interpolate = 20 is = 6 omega2 = 8.8196e-07 + + ik_interpolate = 21 is = 1 omega2 = 4.1673e-08 + ik_interpolate = 21 is = 2 omega2 = 4.1673e-08 + ik_interpolate = 21 is = 3 omega2 = 3.8959e-07 + ik_interpolate = 21 is = 4 omega2 = 3.8959e-07 + ik_interpolate = 21 is = 5 omega2 = 4.1757e-07 + ik_interpolate = 21 is = 6 omega2 = 8.3207e-07 + + ik_interpolate = 22 is = 1 omega2 = 1.2718e-07 + ik_interpolate = 22 is = 2 omega2 = 1.2718e-07 + ik_interpolate = 22 is = 3 omega2 = 2.6140e-07 + ik_interpolate = 22 is = 4 omega2 = 6.6764e-07 + ik_interpolate = 22 is = 5 omega2 = 6.6764e-07 + ik_interpolate = 22 is = 6 omega2 = 1.1640e-06 + + ik_interpolate = 23 is = 1 omega2 = 8.2018e-08 + ik_interpolate = 23 is = 2 omega2 = 2.4846e-07 + ik_interpolate = 23 is = 3 omega2 = 4.8970e-07 + ik_interpolate = 23 is = 4 omega2 = 5.3908e-07 + ik_interpolate = 23 is = 5 omega2 = 7.3894e-07 + ik_interpolate = 23 is = 6 omega2 = 8.8196e-07 + + ik_interpolate = 24 is = 1 omega2 = 1.4878e-07 + ik_interpolate = 24 is = 2 omega2 = 1.6456e-07 ik_interpolate = 24 is = 3 omega2 = 2.9296e-07 - ik_interpolate = 24 is = 4 omega2 = 6.3477e-07 - ik_interpolate = 24 is = 5 omega2 = 7.0810e-07 - ik_interpolate = 24 is = 6 omega2 = 8.4921e-07 + ik_interpolate = 24 is = 4 omega2 = 6.3487e-07 + ik_interpolate = 24 is = 5 omega2 = 7.0821e-07 + ik_interpolate = 24 is = 6 omega2 = 8.4931e-07 - ik_interpolate = 25 is = 1 omega2 = 1.4876e-07 - ik_interpolate = 25 is = 2 omega2 = 1.6454e-07 + ik_interpolate = 25 is = 1 omega2 = 1.4878e-07 + ik_interpolate = 25 is = 2 omega2 = 1.6456e-07 ik_interpolate = 25 is = 3 omega2 = 2.9296e-07 - ik_interpolate = 25 is = 4 omega2 = 6.3477e-07 - ik_interpolate = 25 is = 5 omega2 = 7.0810e-07 - ik_interpolate = 25 is = 6 omega2 = 8.4921e-07 - - ik_interpolate = 26 is = 1 omega2 = 8.2020e-08 - ik_interpolate = 26 is = 2 omega2 = 2.4841e-07 - ik_interpolate = 26 is = 3 omega2 = 4.8956e-07 - ik_interpolate = 26 is = 4 omega2 = 5.3904e-07 - ik_interpolate = 26 is = 5 omega2 = 7.3889e-07 - ik_interpolate = 26 is = 6 omega2 = 8.8190e-07 - - ik_interpolate = 27 is = 1 omega2 = 1.4876e-07 - ik_interpolate = 27 is = 2 omega2 = 1.6454e-07 + ik_interpolate = 25 is = 4 omega2 = 6.3487e-07 + ik_interpolate = 25 is = 5 omega2 = 7.0821e-07 + ik_interpolate = 25 is = 6 omega2 = 8.4931e-07 + + ik_interpolate = 26 is = 1 omega2 = 8.2018e-08 + ik_interpolate = 26 is = 2 omega2 = 2.4846e-07 + ik_interpolate = 26 is = 3 omega2 = 4.8970e-07 + ik_interpolate = 26 is = 4 omega2 = 5.3908e-07 + ik_interpolate = 26 is = 5 omega2 = 7.3894e-07 + ik_interpolate = 26 is = 6 omega2 = 8.8196e-07 + + ik_interpolate = 27 is = 1 omega2 = 1.4878e-07 + ik_interpolate = 27 is = 2 omega2 = 1.6456e-07 ik_interpolate = 27 is = 3 omega2 = 2.9296e-07 - ik_interpolate = 27 is = 4 omega2 = 6.3477e-07 - ik_interpolate = 27 is = 5 omega2 = 7.0810e-07 - ik_interpolate = 27 is = 6 omega2 = 8.4921e-07 - - ik_interpolate = 28 is = 1 omega2 = 9.1582e-08 - ik_interpolate = 28 is = 2 omega2 = 9.1582e-08 - ik_interpolate = 28 is = 3 omega2 = 3.6355e-07 - ik_interpolate = 28 is = 4 omega2 = 5.2290e-07 - ik_interpolate = 28 is = 5 omega2 = 5.2290e-07 - ik_interpolate = 28 is = 6 omega2 = 7.8664e-07 - - ik_interpolate = 29 is = 1 omega2 = 8.2020e-08 - ik_interpolate = 29 is = 2 omega2 = 2.4841e-07 - ik_interpolate = 29 is = 3 omega2 = 4.8956e-07 - ik_interpolate = 29 is = 4 omega2 = 5.3904e-07 - ik_interpolate = 29 is = 5 omega2 = 7.3889e-07 - ik_interpolate = 29 is = 6 omega2 = 8.8190e-07 - - ik_interpolate = 30 is = 1 omega2 = 1.4876e-07 - ik_interpolate = 30 is = 2 omega2 = 1.6454e-07 + ik_interpolate = 27 is = 4 omega2 = 6.3487e-07 + ik_interpolate = 27 is = 5 omega2 = 7.0821e-07 + ik_interpolate = 27 is = 6 omega2 = 8.4931e-07 + + ik_interpolate = 28 is = 1 omega2 = 9.1584e-08 + ik_interpolate = 28 is = 2 omega2 = 9.1584e-08 + ik_interpolate = 28 is = 3 omega2 = 3.6359e-07 + ik_interpolate = 28 is = 4 omega2 = 5.2304e-07 + ik_interpolate = 28 is = 5 omega2 = 5.2304e-07 + ik_interpolate = 28 is = 6 omega2 = 7.8670e-07 + + ik_interpolate = 29 is = 1 omega2 = 8.2018e-08 + ik_interpolate = 29 is = 2 omega2 = 2.4846e-07 + ik_interpolate = 29 is = 3 omega2 = 4.8970e-07 + ik_interpolate = 29 is = 4 omega2 = 5.3908e-07 + ik_interpolate = 29 is = 5 omega2 = 7.3894e-07 + ik_interpolate = 29 is = 6 omega2 = 8.8196e-07 + + ik_interpolate = 30 is = 1 omega2 = 1.4878e-07 + ik_interpolate = 30 is = 2 omega2 = 1.6456e-07 ik_interpolate = 30 is = 3 omega2 = 2.9296e-07 - ik_interpolate = 30 is = 4 omega2 = 6.3477e-07 - ik_interpolate = 30 is = 5 omega2 = 7.0810e-07 - ik_interpolate = 30 is = 6 omega2 = 8.4921e-07 - - ik_interpolate = 31 is = 1 omega2 = 9.1582e-08 - ik_interpolate = 31 is = 2 omega2 = 9.1582e-08 - ik_interpolate = 31 is = 3 omega2 = 3.6355e-07 - ik_interpolate = 31 is = 4 omega2 = 5.2290e-07 - ik_interpolate = 31 is = 5 omega2 = 5.2290e-07 - ik_interpolate = 31 is = 6 omega2 = 7.8664e-07 - - ik_interpolate = 32 is = 1 omega2 = 1.4876e-07 - ik_interpolate = 32 is = 2 omega2 = 1.6454e-07 + ik_interpolate = 30 is = 4 omega2 = 6.3487e-07 + ik_interpolate = 30 is = 5 omega2 = 7.0821e-07 + ik_interpolate = 30 is = 6 omega2 = 8.4931e-07 + + ik_interpolate = 31 is = 1 omega2 = 9.1584e-08 + ik_interpolate = 31 is = 2 omega2 = 9.1584e-08 + ik_interpolate = 31 is = 3 omega2 = 3.6359e-07 + ik_interpolate = 31 is = 4 omega2 = 5.2304e-07 + ik_interpolate = 31 is = 5 omega2 = 5.2304e-07 + ik_interpolate = 31 is = 6 omega2 = 7.8670e-07 + + ik_interpolate = 32 is = 1 omega2 = 1.4878e-07 + ik_interpolate = 32 is = 2 omega2 = 1.6456e-07 ik_interpolate = 32 is = 3 omega2 = 2.9296e-07 - ik_interpolate = 32 is = 4 omega2 = 6.3477e-07 - ik_interpolate = 32 is = 5 omega2 = 7.0810e-07 - ik_interpolate = 32 is = 6 omega2 = 8.4921e-07 - - ik_interpolate = 33 is = 1 omega2 = 2.7576e-07 - ik_interpolate = 33 is = 2 omega2 = 2.7576e-07 - ik_interpolate = 33 is = 3 omega2 = 6.8475e-07 - ik_interpolate = 33 is = 4 omega2 = 7.8288e-07 - ik_interpolate = 33 is = 5 omega2 = 7.8288e-07 - ik_interpolate = 33 is = 6 omega2 = 9.3288e-07 - - ik_interpolate = 34 is = 1 omega2 = 1.4876e-07 - ik_interpolate = 34 is = 2 omega2 = 1.6454e-07 + ik_interpolate = 32 is = 4 omega2 = 6.3487e-07 + ik_interpolate = 32 is = 5 omega2 = 7.0821e-07 + ik_interpolate = 32 is = 6 omega2 = 8.4931e-07 + + ik_interpolate = 33 is = 1 omega2 = 2.7580e-07 + ik_interpolate = 33 is = 2 omega2 = 2.7580e-07 + ik_interpolate = 33 is = 3 omega2 = 6.8478e-07 + ik_interpolate = 33 is = 4 omega2 = 7.8294e-07 + ik_interpolate = 33 is = 5 omega2 = 7.8294e-07 + ik_interpolate = 33 is = 6 omega2 = 9.3294e-07 + + ik_interpolate = 34 is = 1 omega2 = 1.4878e-07 + ik_interpolate = 34 is = 2 omega2 = 1.6456e-07 ik_interpolate = 34 is = 3 omega2 = 2.9296e-07 - ik_interpolate = 34 is = 4 omega2 = 6.3477e-07 - ik_interpolate = 34 is = 5 omega2 = 7.0810e-07 - ik_interpolate = 34 is = 6 omega2 = 8.4921e-07 - - ik_interpolate = 35 is = 1 omega2 = 5.0488e-08 - ik_interpolate = 35 is = 2 omega2 = 5.0488e-08 - ik_interpolate = 35 is = 3 omega2 = 9.0564e-08 - ik_interpolate = 35 is = 4 omega2 = 4.5378e-07 - ik_interpolate = 35 is = 5 omega2 = 4.5378e-07 - ik_interpolate = 35 is = 6 omega2 = 5.4806e-07 - - ik_interpolate = 36 is = 1 omega2 = 1.4876e-07 - ik_interpolate = 36 is = 2 omega2 = 1.6454e-07 + ik_interpolate = 34 is = 4 omega2 = 6.3487e-07 + ik_interpolate = 34 is = 5 omega2 = 7.0821e-07 + ik_interpolate = 34 is = 6 omega2 = 8.4931e-07 + + ik_interpolate = 35 is = 1 omega2 = 5.0493e-08 + ik_interpolate = 35 is = 2 omega2 = 5.0493e-08 + ik_interpolate = 35 is = 3 omega2 = 9.0570e-08 + ik_interpolate = 35 is = 4 omega2 = 4.5392e-07 + ik_interpolate = 35 is = 5 omega2 = 4.5392e-07 + ik_interpolate = 35 is = 6 omega2 = 5.4820e-07 + + ik_interpolate = 36 is = 1 omega2 = 1.4878e-07 + ik_interpolate = 36 is = 2 omega2 = 1.6456e-07 ik_interpolate = 36 is = 3 omega2 = 2.9296e-07 - ik_interpolate = 36 is = 4 omega2 = 6.3477e-07 - ik_interpolate = 36 is = 5 omega2 = 7.0810e-07 - ik_interpolate = 36 is = 6 omega2 = 8.4921e-07 + ik_interpolate = 36 is = 4 omega2 = 6.3487e-07 + ik_interpolate = 36 is = 5 omega2 = 7.0821e-07 + ik_interpolate = 36 is = 6 omega2 = 8.4931e-07 - ik_interpolate = 37 is = 1 omega2 = 1.4876e-07 - ik_interpolate = 37 is = 2 omega2 = 1.6454e-07 + ik_interpolate = 37 is = 1 omega2 = 1.4878e-07 + ik_interpolate = 37 is = 2 omega2 = 1.6456e-07 ik_interpolate = 37 is = 3 omega2 = 2.9296e-07 - ik_interpolate = 37 is = 4 omega2 = 6.3477e-07 - ik_interpolate = 37 is = 5 omega2 = 7.0810e-07 - ik_interpolate = 37 is = 6 omega2 = 8.4921e-07 - - ik_interpolate = 38 is = 1 omega2 = 8.2020e-08 - ik_interpolate = 38 is = 2 omega2 = 2.4841e-07 - ik_interpolate = 38 is = 3 omega2 = 4.8956e-07 - ik_interpolate = 38 is = 4 omega2 = 5.3904e-07 - ik_interpolate = 38 is = 5 omega2 = 7.3889e-07 - ik_interpolate = 38 is = 6 omega2 = 8.8190e-07 - - ik_interpolate = 39 is = 1 omega2 = 1.4876e-07 - ik_interpolate = 39 is = 2 omega2 = 1.6454e-07 + ik_interpolate = 37 is = 4 omega2 = 6.3487e-07 + ik_interpolate = 37 is = 5 omega2 = 7.0821e-07 + ik_interpolate = 37 is = 6 omega2 = 8.4931e-07 + + ik_interpolate = 38 is = 1 omega2 = 8.2018e-08 + ik_interpolate = 38 is = 2 omega2 = 2.4846e-07 + ik_interpolate = 38 is = 3 omega2 = 4.8970e-07 + ik_interpolate = 38 is = 4 omega2 = 5.3908e-07 + ik_interpolate = 38 is = 5 omega2 = 7.3894e-07 + ik_interpolate = 38 is = 6 omega2 = 8.8196e-07 + + ik_interpolate = 39 is = 1 omega2 = 1.4878e-07 + ik_interpolate = 39 is = 2 omega2 = 1.6456e-07 ik_interpolate = 39 is = 3 omega2 = 2.9296e-07 - ik_interpolate = 39 is = 4 omega2 = 6.3477e-07 - ik_interpolate = 39 is = 5 omega2 = 7.0810e-07 - ik_interpolate = 39 is = 6 omega2 = 8.4921e-07 - - ik_interpolate = 40 is = 1 omega2 = 9.1582e-08 - ik_interpolate = 40 is = 2 omega2 = 9.1582e-08 - ik_interpolate = 40 is = 3 omega2 = 3.6355e-07 - ik_interpolate = 40 is = 4 omega2 = 5.2290e-07 - ik_interpolate = 40 is = 5 omega2 = 5.2290e-07 - ik_interpolate = 40 is = 6 omega2 = 7.8664e-07 - - ik_interpolate = 41 is = 1 omega2 = 5.0488e-08 - ik_interpolate = 41 is = 2 omega2 = 5.0488e-08 - ik_interpolate = 41 is = 3 omega2 = 9.0564e-08 - ik_interpolate = 41 is = 4 omega2 = 4.5378e-07 - ik_interpolate = 41 is = 5 omega2 = 4.5378e-07 - ik_interpolate = 41 is = 6 omega2 = 5.4806e-07 - - ik_interpolate = 42 is = 1 omega2 = 1.4876e-07 - ik_interpolate = 42 is = 2 omega2 = 1.6454e-07 + ik_interpolate = 39 is = 4 omega2 = 6.3487e-07 + ik_interpolate = 39 is = 5 omega2 = 7.0821e-07 + ik_interpolate = 39 is = 6 omega2 = 8.4931e-07 + + ik_interpolate = 40 is = 1 omega2 = 9.1584e-08 + ik_interpolate = 40 is = 2 omega2 = 9.1584e-08 + ik_interpolate = 40 is = 3 omega2 = 3.6359e-07 + ik_interpolate = 40 is = 4 omega2 = 5.2304e-07 + ik_interpolate = 40 is = 5 omega2 = 5.2304e-07 + ik_interpolate = 40 is = 6 omega2 = 7.8670e-07 + + ik_interpolate = 41 is = 1 omega2 = 5.0493e-08 + ik_interpolate = 41 is = 2 omega2 = 5.0493e-08 + ik_interpolate = 41 is = 3 omega2 = 9.0570e-08 + ik_interpolate = 41 is = 4 omega2 = 4.5392e-07 + ik_interpolate = 41 is = 5 omega2 = 4.5392e-07 + ik_interpolate = 41 is = 6 omega2 = 5.4820e-07 + + ik_interpolate = 42 is = 1 omega2 = 1.4878e-07 + ik_interpolate = 42 is = 2 omega2 = 1.6456e-07 ik_interpolate = 42 is = 3 omega2 = 2.9296e-07 - ik_interpolate = 42 is = 4 omega2 = 6.3477e-07 - ik_interpolate = 42 is = 5 omega2 = 7.0810e-07 - ik_interpolate = 42 is = 6 omega2 = 8.4921e-07 - - ik_interpolate = 43 is = 1 omega2 = 2.7576e-07 - ik_interpolate = 43 is = 2 omega2 = 2.7576e-07 - ik_interpolate = 43 is = 3 omega2 = 6.8475e-07 - ik_interpolate = 43 is = 4 omega2 = 7.8288e-07 - ik_interpolate = 43 is = 5 omega2 = 7.8288e-07 - ik_interpolate = 43 is = 6 omega2 = 9.3288e-07 - - ik_interpolate = 44 is = 1 omega2 = 1.4876e-07 - ik_interpolate = 44 is = 2 omega2 = 1.6454e-07 + ik_interpolate = 42 is = 4 omega2 = 6.3487e-07 + ik_interpolate = 42 is = 5 omega2 = 7.0821e-07 + ik_interpolate = 42 is = 6 omega2 = 8.4931e-07 + + ik_interpolate = 43 is = 1 omega2 = 2.7580e-07 + ik_interpolate = 43 is = 2 omega2 = 2.7580e-07 + ik_interpolate = 43 is = 3 omega2 = 6.8478e-07 + ik_interpolate = 43 is = 4 omega2 = 7.8294e-07 + ik_interpolate = 43 is = 5 omega2 = 7.8294e-07 + ik_interpolate = 43 is = 6 omega2 = 9.3294e-07 + + ik_interpolate = 44 is = 1 omega2 = 1.4878e-07 + ik_interpolate = 44 is = 2 omega2 = 1.6456e-07 ik_interpolate = 44 is = 3 omega2 = 2.9296e-07 - ik_interpolate = 44 is = 4 omega2 = 6.3477e-07 - ik_interpolate = 44 is = 5 omega2 = 7.0810e-07 - ik_interpolate = 44 is = 6 omega2 = 8.4921e-07 + ik_interpolate = 44 is = 4 omega2 = 6.3487e-07 + ik_interpolate = 44 is = 5 omega2 = 7.0821e-07 + ik_interpolate = 44 is = 6 omega2 = 8.4931e-07 - ik_interpolate = 45 is = 1 omega2 = 1.4876e-07 - ik_interpolate = 45 is = 2 omega2 = 1.6454e-07 + ik_interpolate = 45 is = 1 omega2 = 1.4878e-07 + ik_interpolate = 45 is = 2 omega2 = 1.6456e-07 ik_interpolate = 45 is = 3 omega2 = 2.9296e-07 - ik_interpolate = 45 is = 4 omega2 = 6.3477e-07 - ik_interpolate = 45 is = 5 omega2 = 7.0810e-07 - ik_interpolate = 45 is = 6 omega2 = 8.4921e-07 - - ik_interpolate = 46 is = 1 omega2 = 9.1582e-08 - ik_interpolate = 46 is = 2 omega2 = 9.1582e-08 - ik_interpolate = 46 is = 3 omega2 = 3.6355e-07 - ik_interpolate = 46 is = 4 omega2 = 5.2290e-07 - ik_interpolate = 46 is = 5 omega2 = 5.2290e-07 - ik_interpolate = 46 is = 6 omega2 = 7.8664e-07 - - ik_interpolate = 47 is = 1 omega2 = 1.4876e-07 - ik_interpolate = 47 is = 2 omega2 = 1.6454e-07 + ik_interpolate = 45 is = 4 omega2 = 6.3487e-07 + ik_interpolate = 45 is = 5 omega2 = 7.0821e-07 + ik_interpolate = 45 is = 6 omega2 = 8.4931e-07 + + ik_interpolate = 46 is = 1 omega2 = 9.1584e-08 + ik_interpolate = 46 is = 2 omega2 = 9.1584e-08 + ik_interpolate = 46 is = 3 omega2 = 3.6359e-07 + ik_interpolate = 46 is = 4 omega2 = 5.2304e-07 + ik_interpolate = 46 is = 5 omega2 = 5.2304e-07 + ik_interpolate = 46 is = 6 omega2 = 7.8670e-07 + + ik_interpolate = 47 is = 1 omega2 = 1.4878e-07 + ik_interpolate = 47 is = 2 omega2 = 1.6456e-07 ik_interpolate = 47 is = 3 omega2 = 2.9296e-07 - ik_interpolate = 47 is = 4 omega2 = 6.3477e-07 - ik_interpolate = 47 is = 5 omega2 = 7.0810e-07 - ik_interpolate = 47 is = 6 omega2 = 8.4921e-07 - - ik_interpolate = 48 is = 1 omega2 = 8.2020e-08 - ik_interpolate = 48 is = 2 omega2 = 2.4841e-07 - ik_interpolate = 48 is = 3 omega2 = 4.8956e-07 - ik_interpolate = 48 is = 4 omega2 = 5.3904e-07 - ik_interpolate = 48 is = 5 omega2 = 7.3889e-07 - ik_interpolate = 48 is = 6 omega2 = 8.8190e-07 - - ik_interpolate = 49 is = 1 omega2 = 1.2716e-07 - ik_interpolate = 49 is = 2 omega2 = 1.2716e-07 - ik_interpolate = 49 is = 3 omega2 = 2.6139e-07 - ik_interpolate = 49 is = 4 omega2 = 6.6753e-07 - ik_interpolate = 49 is = 5 omega2 = 6.6753e-07 - ik_interpolate = 49 is = 6 omega2 = 1.1639e-06 - - ik_interpolate = 50 is = 1 omega2 = 8.2020e-08 - ik_interpolate = 50 is = 2 omega2 = 2.4841e-07 - ik_interpolate = 50 is = 3 omega2 = 4.8956e-07 - ik_interpolate = 50 is = 4 omega2 = 5.3904e-07 - ik_interpolate = 50 is = 5 omega2 = 7.3889e-07 - ik_interpolate = 50 is = 6 omega2 = 8.8190e-07 - - ik_interpolate = 51 is = 1 omega2 = 1.4876e-07 - ik_interpolate = 51 is = 2 omega2 = 1.6454e-07 + ik_interpolate = 47 is = 4 omega2 = 6.3487e-07 + ik_interpolate = 47 is = 5 omega2 = 7.0821e-07 + ik_interpolate = 47 is = 6 omega2 = 8.4931e-07 + + ik_interpolate = 48 is = 1 omega2 = 8.2018e-08 + ik_interpolate = 48 is = 2 omega2 = 2.4846e-07 + ik_interpolate = 48 is = 3 omega2 = 4.8970e-07 + ik_interpolate = 48 is = 4 omega2 = 5.3908e-07 + ik_interpolate = 48 is = 5 omega2 = 7.3894e-07 + ik_interpolate = 48 is = 6 omega2 = 8.8196e-07 + + ik_interpolate = 49 is = 1 omega2 = 1.2718e-07 + ik_interpolate = 49 is = 2 omega2 = 1.2718e-07 + ik_interpolate = 49 is = 3 omega2 = 2.6140e-07 + ik_interpolate = 49 is = 4 omega2 = 6.6764e-07 + ik_interpolate = 49 is = 5 omega2 = 6.6764e-07 + ik_interpolate = 49 is = 6 omega2 = 1.1640e-06 + + ik_interpolate = 50 is = 1 omega2 = 8.2018e-08 + ik_interpolate = 50 is = 2 omega2 = 2.4846e-07 + ik_interpolate = 50 is = 3 omega2 = 4.8970e-07 + ik_interpolate = 50 is = 4 omega2 = 5.3908e-07 + ik_interpolate = 50 is = 5 omega2 = 7.3894e-07 + ik_interpolate = 50 is = 6 omega2 = 8.8196e-07 + + ik_interpolate = 51 is = 1 omega2 = 1.4878e-07 + ik_interpolate = 51 is = 2 omega2 = 1.6456e-07 ik_interpolate = 51 is = 3 omega2 = 2.9296e-07 - ik_interpolate = 51 is = 4 omega2 = 6.3477e-07 - ik_interpolate = 51 is = 5 omega2 = 7.0810e-07 - ik_interpolate = 51 is = 6 omega2 = 8.4921e-07 - - ik_interpolate = 52 is = 1 omega2 = 4.1672e-08 - ik_interpolate = 52 is = 2 omega2 = 4.1672e-08 - ik_interpolate = 52 is = 3 omega2 = 3.8945e-07 - ik_interpolate = 52 is = 4 omega2 = 3.8945e-07 - ik_interpolate = 52 is = 5 omega2 = 4.1752e-07 - ik_interpolate = 52 is = 6 omega2 = 8.3202e-07 - - ik_interpolate = 53 is = 1 omega2 = 8.2020e-08 - ik_interpolate = 53 is = 2 omega2 = 2.4841e-07 - ik_interpolate = 53 is = 3 omega2 = 4.8956e-07 - ik_interpolate = 53 is = 4 omega2 = 5.3904e-07 - ik_interpolate = 53 is = 5 omega2 = 7.3889e-07 - ik_interpolate = 53 is = 6 omega2 = 8.8190e-07 - - ik_interpolate = 54 is = 1 omega2 = 1.4876e-07 - ik_interpolate = 54 is = 2 omega2 = 1.6454e-07 + ik_interpolate = 51 is = 4 omega2 = 6.3487e-07 + ik_interpolate = 51 is = 5 omega2 = 7.0821e-07 + ik_interpolate = 51 is = 6 omega2 = 8.4931e-07 + + ik_interpolate = 52 is = 1 omega2 = 4.1673e-08 + ik_interpolate = 52 is = 2 omega2 = 4.1673e-08 + ik_interpolate = 52 is = 3 omega2 = 3.8959e-07 + ik_interpolate = 52 is = 4 omega2 = 3.8959e-07 + ik_interpolate = 52 is = 5 omega2 = 4.1757e-07 + ik_interpolate = 52 is = 6 omega2 = 8.3207e-07 + + ik_interpolate = 53 is = 1 omega2 = 8.2018e-08 + ik_interpolate = 53 is = 2 omega2 = 2.4846e-07 + ik_interpolate = 53 is = 3 omega2 = 4.8970e-07 + ik_interpolate = 53 is = 4 omega2 = 5.3908e-07 + ik_interpolate = 53 is = 5 omega2 = 7.3894e-07 + ik_interpolate = 53 is = 6 omega2 = 8.8196e-07 + + ik_interpolate = 54 is = 1 omega2 = 1.4878e-07 + ik_interpolate = 54 is = 2 omega2 = 1.6456e-07 ik_interpolate = 54 is = 3 omega2 = 2.9296e-07 - ik_interpolate = 54 is = 4 omega2 = 6.3477e-07 - ik_interpolate = 54 is = 5 omega2 = 7.0810e-07 - ik_interpolate = 54 is = 6 omega2 = 8.4921e-07 - - ik_interpolate = 55 is = 1 omega2 = 9.1582e-08 - ik_interpolate = 55 is = 2 omega2 = 9.1582e-08 - ik_interpolate = 55 is = 3 omega2 = 3.6355e-07 - ik_interpolate = 55 is = 4 omega2 = 5.2290e-07 - ik_interpolate = 55 is = 5 omega2 = 5.2290e-07 - ik_interpolate = 55 is = 6 omega2 = 7.8664e-07 - - ik_interpolate = 56 is = 1 omega2 = 1.4876e-07 - ik_interpolate = 56 is = 2 omega2 = 1.6454e-07 + ik_interpolate = 54 is = 4 omega2 = 6.3487e-07 + ik_interpolate = 54 is = 5 omega2 = 7.0821e-07 + ik_interpolate = 54 is = 6 omega2 = 8.4931e-07 + + ik_interpolate = 55 is = 1 omega2 = 9.1584e-08 + ik_interpolate = 55 is = 2 omega2 = 9.1584e-08 + ik_interpolate = 55 is = 3 omega2 = 3.6359e-07 + ik_interpolate = 55 is = 4 omega2 = 5.2304e-07 + ik_interpolate = 55 is = 5 omega2 = 5.2304e-07 + ik_interpolate = 55 is = 6 omega2 = 7.8670e-07 + + ik_interpolate = 56 is = 1 omega2 = 1.4878e-07 + ik_interpolate = 56 is = 2 omega2 = 1.6456e-07 ik_interpolate = 56 is = 3 omega2 = 2.9296e-07 - ik_interpolate = 56 is = 4 omega2 = 6.3477e-07 - ik_interpolate = 56 is = 5 omega2 = 7.0810e-07 - ik_interpolate = 56 is = 6 omega2 = 8.4921e-07 + ik_interpolate = 56 is = 4 omega2 = 6.3487e-07 + ik_interpolate = 56 is = 5 omega2 = 7.0821e-07 + ik_interpolate = 56 is = 6 omega2 = 8.4931e-07 - ik_interpolate = 57 is = 1 omega2 = 1.4876e-07 - ik_interpolate = 57 is = 2 omega2 = 1.6454e-07 + ik_interpolate = 57 is = 1 omega2 = 1.4878e-07 + ik_interpolate = 57 is = 2 omega2 = 1.6456e-07 ik_interpolate = 57 is = 3 omega2 = 2.9296e-07 - ik_interpolate = 57 is = 4 omega2 = 6.3477e-07 - ik_interpolate = 57 is = 5 omega2 = 7.0810e-07 - ik_interpolate = 57 is = 6 omega2 = 8.4921e-07 - - ik_interpolate = 58 is = 1 omega2 = 9.1582e-08 - ik_interpolate = 58 is = 2 omega2 = 9.1582e-08 - ik_interpolate = 58 is = 3 omega2 = 3.6355e-07 - ik_interpolate = 58 is = 4 omega2 = 5.2290e-07 - ik_interpolate = 58 is = 5 omega2 = 5.2290e-07 - ik_interpolate = 58 is = 6 omega2 = 7.8664e-07 - - ik_interpolate = 59 is = 1 omega2 = 1.4876e-07 - ik_interpolate = 59 is = 2 omega2 = 1.6454e-07 + ik_interpolate = 57 is = 4 omega2 = 6.3487e-07 + ik_interpolate = 57 is = 5 omega2 = 7.0821e-07 + ik_interpolate = 57 is = 6 omega2 = 8.4931e-07 + + ik_interpolate = 58 is = 1 omega2 = 9.1584e-08 + ik_interpolate = 58 is = 2 omega2 = 9.1584e-08 + ik_interpolate = 58 is = 3 omega2 = 3.6359e-07 + ik_interpolate = 58 is = 4 omega2 = 5.2304e-07 + ik_interpolate = 58 is = 5 omega2 = 5.2304e-07 + ik_interpolate = 58 is = 6 omega2 = 7.8670e-07 + + ik_interpolate = 59 is = 1 omega2 = 1.4878e-07 + ik_interpolate = 59 is = 2 omega2 = 1.6456e-07 ik_interpolate = 59 is = 3 omega2 = 2.9296e-07 - ik_interpolate = 59 is = 4 omega2 = 6.3477e-07 - ik_interpolate = 59 is = 5 omega2 = 7.0810e-07 - ik_interpolate = 59 is = 6 omega2 = 8.4921e-07 - - ik_interpolate = 60 is = 1 omega2 = 8.2020e-08 - ik_interpolate = 60 is = 2 omega2 = 2.4841e-07 - ik_interpolate = 60 is = 3 omega2 = 4.8956e-07 - ik_interpolate = 60 is = 4 omega2 = 5.3904e-07 - ik_interpolate = 60 is = 5 omega2 = 7.3889e-07 - ik_interpolate = 60 is = 6 omega2 = 8.8190e-07 - - ik_interpolate = 61 is = 1 omega2 = 4.1672e-08 - ik_interpolate = 61 is = 2 omega2 = 4.1672e-08 - ik_interpolate = 61 is = 3 omega2 = 3.8945e-07 - ik_interpolate = 61 is = 4 omega2 = 3.8945e-07 - ik_interpolate = 61 is = 5 omega2 = 4.1752e-07 - ik_interpolate = 61 is = 6 omega2 = 8.3202e-07 - - ik_interpolate = 62 is = 1 omega2 = 1.4876e-07 - ik_interpolate = 62 is = 2 omega2 = 1.6454e-07 + ik_interpolate = 59 is = 4 omega2 = 6.3487e-07 + ik_interpolate = 59 is = 5 omega2 = 7.0821e-07 + ik_interpolate = 59 is = 6 omega2 = 8.4931e-07 + + ik_interpolate = 60 is = 1 omega2 = 8.2018e-08 + ik_interpolate = 60 is = 2 omega2 = 2.4846e-07 + ik_interpolate = 60 is = 3 omega2 = 4.8970e-07 + ik_interpolate = 60 is = 4 omega2 = 5.3908e-07 + ik_interpolate = 60 is = 5 omega2 = 7.3894e-07 + ik_interpolate = 60 is = 6 omega2 = 8.8196e-07 + + ik_interpolate = 61 is = 1 omega2 = 4.1673e-08 + ik_interpolate = 61 is = 2 omega2 = 4.1673e-08 + ik_interpolate = 61 is = 3 omega2 = 3.8959e-07 + ik_interpolate = 61 is = 4 omega2 = 3.8959e-07 + ik_interpolate = 61 is = 5 omega2 = 4.1757e-07 + ik_interpolate = 61 is = 6 omega2 = 8.3207e-07 + + ik_interpolate = 62 is = 1 omega2 = 1.4878e-07 + ik_interpolate = 62 is = 2 omega2 = 1.6456e-07 ik_interpolate = 62 is = 3 omega2 = 2.9296e-07 - ik_interpolate = 62 is = 4 omega2 = 6.3477e-07 - ik_interpolate = 62 is = 5 omega2 = 7.0810e-07 - ik_interpolate = 62 is = 6 omega2 = 8.4921e-07 - - ik_interpolate = 63 is = 1 omega2 = 8.2020e-08 - ik_interpolate = 63 is = 2 omega2 = 2.4841e-07 - ik_interpolate = 63 is = 3 omega2 = 4.8956e-07 - ik_interpolate = 63 is = 4 omega2 = 5.3904e-07 - ik_interpolate = 63 is = 5 omega2 = 7.3889e-07 - ik_interpolate = 63 is = 6 omega2 = 8.8190e-07 - - ik_interpolate = 64 is = 1 omega2 = 1.2716e-07 - ik_interpolate = 64 is = 2 omega2 = 1.2716e-07 - ik_interpolate = 64 is = 3 omega2 = 2.6139e-07 - ik_interpolate = 64 is = 4 omega2 = 6.6753e-07 - ik_interpolate = 64 is = 5 omega2 = 6.6753e-07 - ik_interpolate = 64 is = 6 omega2 = 1.1639e-06 + ik_interpolate = 62 is = 4 omega2 = 6.3487e-07 + ik_interpolate = 62 is = 5 omega2 = 7.0821e-07 + ik_interpolate = 62 is = 6 omega2 = 8.4931e-07 + + ik_interpolate = 63 is = 1 omega2 = 8.2018e-08 + ik_interpolate = 63 is = 2 omega2 = 2.4846e-07 + ik_interpolate = 63 is = 3 omega2 = 4.8970e-07 + ik_interpolate = 63 is = 4 omega2 = 5.3908e-07 + ik_interpolate = 63 is = 5 omega2 = 7.3894e-07 + ik_interpolate = 63 is = 6 omega2 = 8.8196e-07 + + ik_interpolate = 64 is = 1 omega2 = 1.2718e-07 + ik_interpolate = 64 is = 2 omega2 = 1.2718e-07 + ik_interpolate = 64 is = 3 omega2 = 2.6140e-07 + ik_interpolate = 64 is = 4 omega2 = 6.6764e-07 + ik_interpolate = 64 is = 5 omega2 = 6.6764e-07 + ik_interpolate = 64 is = 6 omega2 = 1.1640e-06 + + PbTe_scph4-4.scph_dymat : Anharmonic dynamical matrix (restart file) + PbTe_scph4-4.scph_dfc2 : Anharmonic corrections to the second-order IFCs + + Running postprocess of SCPH (calculation of free energy, MSD, DOS) + The number of temperature points: 11 +. .......... PbTe_scph4-4.scph_bands : SCPH band structure - Job finished at Mon Nov 20 15:08:36 2017 + Job finished at Wed May 1 20:00:36 2019 diff --git a/example/PbTe/scph.in b/example/PbTe/scph.in index 78575889..4299ee6c 100644 --- a/example/PbTe/scph.in +++ b/example/PbTe/scph.in @@ -20,7 +20,7 @@ MIXALPHA = 0.1 MAXITER = 500 - TOL_SCPH = 1.0e-8 + TOL_SCPH = 1.0e-10 / &cell diff --git a/example/Si/reference/DFSET_cubic b/example/Si/reference/DFSET_cubic new file mode 100644 index 00000000..4237f23c --- /dev/null +++ b/example/Si/reference/DFSET_cubic @@ -0,0 +1,1280 @@ + 0.0755899 0.0000000 0.0000000 -2.08548700000E-02 0.00000000000E+00 0.00000000000E+00 + 0.0000000 0.0000000 0.0000000 7.21800000000E-05 0.00000000000E+00 0.00000000000E+00 + 0.0000000 0.0000000 0.0000000 -6.72180000000E-04 -1.52060000000E-04 -1.52060000000E-04 + 0.0000000 0.0000000 0.0000000 -6.65720000000E-04 1.44550000000E-04 -1.44550000000E-04 + 0.0000000 0.0000000 0.0000000 7.21800000000E-05 0.00000000000E+00 0.00000000000E+00 + 0.0000000 0.0000000 0.0000000 -6.20560000000E-04 0.00000000000E+00 0.00000000000E+00 + 0.0000000 0.0000000 0.0000000 -6.65720000000E-04 -1.44550000000E-04 1.44550000000E-04 + 0.0000000 0.0000000 0.0000000 -6.72180000000E-04 1.52060000000E-04 1.52060000000E-04 + 0.0000000 0.0000000 0.0000000 5.18453000000E-03 3.77407000000E-03 3.77407000000E-03 + 0.0000000 0.0000000 0.0000000 -8.23300000000E-05 6.10800000000E-05 5.39800000000E-05 + 0.0000000 0.0000000 0.0000000 3.28030000000E-04 -3.86300000000E-05 -3.86300000000E-05 + 0.0000000 0.0000000 0.0000000 -8.23300000000E-05 -5.39800000000E-05 -6.10800000000E-05 + 0.0000000 0.0000000 0.0000000 -8.23300000000E-05 5.39800000000E-05 6.10800000000E-05 + 0.0000000 0.0000000 0.0000000 3.28030000000E-04 3.86300000000E-05 3.86300000000E-05 + 0.0000000 0.0000000 0.0000000 -8.23300000000E-05 -6.10800000000E-05 -5.39800000000E-05 + 0.0000000 0.0000000 0.0000000 5.18453000000E-03 -3.77407000000E-03 -3.77407000000E-03 + 0.0000000 0.0000000 0.0000000 3.05950000000E-04 1.51970000000E-04 2.99520000000E-04 + 0.0000000 0.0000000 0.0000000 3.05950000000E-04 -1.51970000000E-04 -2.99520000000E-04 + 0.0000000 0.0000000 0.0000000 3.05950000000E-04 2.99520000000E-04 1.51970000000E-04 + 0.0000000 0.0000000 0.0000000 5.60900000000E-05 -9.67800000000E-05 1.27700000000E-05 + 0.0000000 0.0000000 0.0000000 5.60900000000E-05 1.27700000000E-05 -9.67800000000E-05 + 0.0000000 0.0000000 0.0000000 5.60900000000E-05 -1.27700000000E-05 9.67800000000E-05 + 0.0000000 0.0000000 0.0000000 3.05950000000E-04 -2.99520000000E-04 -1.51970000000E-04 + 0.0000000 0.0000000 0.0000000 5.60900000000E-05 9.67800000000E-05 -1.27700000000E-05 + 0.0000000 0.0000000 0.0000000 3.71800000000E-05 -3.99900000000E-05 3.74200000000E-05 + 0.0000000 0.0000000 0.0000000 -1.57900000000E-05 -5.23000000000E-05 5.23000000000E-05 + 0.0000000 0.0000000 0.0000000 3.71800000000E-05 3.74200000000E-05 -3.99900000000E-05 + 0.0000000 0.0000000 0.0000000 -2.70100000000E-05 3.88300000000E-05 -3.88300000000E-05 + 0.0000000 0.0000000 0.0000000 -2.70100000000E-05 -3.88300000000E-05 3.88300000000E-05 + 0.0000000 0.0000000 0.0000000 3.71800000000E-05 -3.74200000000E-05 3.99900000000E-05 + 0.0000000 0.0000000 0.0000000 -1.57900000000E-05 5.23000000000E-05 -5.23000000000E-05 + 0.0000000 0.0000000 0.0000000 3.71800000000E-05 3.99900000000E-05 -3.74200000000E-05 + 0.0000000 0.0000000 0.0000000 2.85700000000E-05 0.00000000000E+00 0.00000000000E+00 + 0.0000000 0.0000000 0.0000000 -3.36000000000E-06 0.00000000000E+00 0.00000000000E+00 + 0.0000000 0.0000000 0.0000000 -5.78000000000E-06 -1.25700000000E-05 -1.25700000000E-05 + 0.0000000 0.0000000 0.0000000 -3.99000000000E-06 1.29800000000E-05 -1.29800000000E-05 + 0.0000000 0.0000000 0.0000000 -3.36000000000E-06 0.00000000000E+00 0.00000000000E+00 + 0.0000000 0.0000000 0.0000000 3.35200000000E-05 0.00000000000E+00 0.00000000000E+00 + 0.0000000 0.0000000 0.0000000 -3.99000000000E-06 -1.29800000000E-05 1.29800000000E-05 + 0.0000000 0.0000000 0.0000000 -5.78000000000E-06 1.25700000000E-05 1.25700000000E-05 + 0.0000000 0.0000000 0.0000000 -1.57800000000E-05 5.29100000000E-05 5.29100000000E-05 + 0.0000000 0.0000000 0.0000000 3.37600000000E-05 3.63400000000E-05 3.46300000000E-05 + 0.0000000 0.0000000 0.0000000 -2.71300000000E-05 -3.95400000000E-05 -3.95400000000E-05 + 0.0000000 0.0000000 0.0000000 3.37600000000E-05 -3.46300000000E-05 -3.63400000000E-05 + 0.0000000 0.0000000 0.0000000 3.37600000000E-05 3.46300000000E-05 3.63400000000E-05 + 0.0000000 0.0000000 0.0000000 -2.71300000000E-05 3.95400000000E-05 3.95400000000E-05 + 0.0000000 0.0000000 0.0000000 3.37600000000E-05 -3.63400000000E-05 -3.46300000000E-05 + 0.0000000 0.0000000 0.0000000 -1.57800000000E-05 -5.29100000000E-05 -5.29100000000E-05 + 0.0000000 0.0000000 0.0000000 2.95390000000E-04 1.45030000000E-04 -2.91360000000E-04 + 0.0000000 0.0000000 0.0000000 2.95390000000E-04 -1.45030000000E-04 2.91360000000E-04 + 0.0000000 0.0000000 0.0000000 2.95390000000E-04 -2.91360000000E-04 1.45030000000E-04 + 0.0000000 0.0000000 0.0000000 5.58100000000E-05 9.78000000000E-05 1.27500000000E-05 + 0.0000000 0.0000000 0.0000000 5.58100000000E-05 1.27500000000E-05 9.78000000000E-05 + 0.0000000 0.0000000 0.0000000 5.58100000000E-05 -1.27500000000E-05 -9.78000000000E-05 + 0.0000000 0.0000000 0.0000000 2.95390000000E-04 2.91360000000E-04 -1.45030000000E-04 + 0.0000000 0.0000000 0.0000000 5.58100000000E-05 -9.78000000000E-05 -1.27500000000E-05 + 0.0000000 0.0000000 0.0000000 -7.90700000000E-05 -6.32800000000E-05 5.13300000000E-05 + 0.0000000 0.0000000 0.0000000 4.98980000000E-03 -3.39021000000E-03 3.39021000000E-03 + 0.0000000 0.0000000 0.0000000 -7.90700000000E-05 5.13300000000E-05 -6.32800000000E-05 + 0.0000000 0.0000000 0.0000000 3.23290000000E-04 3.77900000000E-05 -3.77900000000E-05 + 0.0000000 0.0000000 0.0000000 3.23290000000E-04 -3.77900000000E-05 3.77900000000E-05 + 0.0000000 0.0000000 0.0000000 -7.90700000000E-05 -5.13300000000E-05 6.32800000000E-05 + 0.0000000 0.0000000 0.0000000 4.98980000000E-03 3.39021000000E-03 -3.39021000000E-03 + 0.0000000 0.0000000 0.0000000 -7.90700000000E-05 6.32800000000E-05 -5.13300000000E-05 + 0.0755899 0.0755899 0.0000000 -2.09137200000E-02 -2.09137200000E-02 -2.09594000000E-03 + 0.0000000 0.0000000 0.0000000 7.21900000000E-05 7.21900000000E-05 8.20000000000E-07 + 0.0000000 0.0000000 0.0000000 -5.19760000000E-04 1.59900000000E-04 1.43750000000E-04 + 0.0000000 0.0000000 0.0000000 -8.17790000000E-04 4.44980000000E-04 -4.47950000000E-04 + 0.0000000 0.0000000 0.0000000 7.20800000000E-05 2.84000000000E-05 1.99000000000E-06 + 0.0000000 0.0000000 0.0000000 -6.20110000000E-04 -3.41000000000E-06 -1.80000000000E-07 + 0.0000000 0.0000000 0.0000000 -5.20100000000E-04 1.46280000000E-04 -1.50930000000E-04 + 0.0000000 0.0000000 0.0000000 -8.17020000000E-04 4.52200000000E-04 4.39140000000E-04 + 0.0000000 0.0000000 0.0000000 9.36840000000E-03 9.36840000000E-03 8.13550000000E-03 + 0.0000000 0.0000000 0.0000000 -1.73300000000E-05 -1.73300000000E-05 1.05070000000E-04 + 0.0000000 0.0000000 0.0000000 2.87700000000E-04 -1.41000000000E-06 -2.71000000000E-06 + 0.0000000 0.0000000 0.0000000 -1.36110000000E-04 -6.96400000000E-05 -8.96000000000E-06 + 0.0000000 0.0000000 0.0000000 -2.78300000000E-05 3.80500000000E-05 1.13960000000E-04 + 0.0000000 0.0000000 0.0000000 3.64320000000E-04 7.22400000000E-05 7.17500000000E-05 + 0.0000000 0.0000000 0.0000000 -1.49330000000E-04 -1.36190000000E-04 -5.34000000000E-06 + 0.0000000 0.0000000 0.0000000 1.41448000000E-03 1.61252000000E-03 1.53350000000E-04 + 0.0000000 0.0000000 0.0000000 1.59900000000E-04 -5.19760000000E-04 1.43750000000E-04 + 0.0000000 0.0000000 0.0000000 4.44980000000E-04 -8.17790000000E-04 -4.47950000000E-04 + 0.0000000 0.0000000 0.0000000 6.18070000000E-04 6.18070000000E-04 3.02030000000E-04 + 0.0000000 0.0000000 0.0000000 -4.13700000000E-05 -4.13700000000E-05 2.51200000000E-05 + 0.0000000 0.0000000 0.0000000 4.23600000000E-05 6.73000000000E-06 -1.09290000000E-04 + 0.0000000 0.0000000 0.0000000 7.01700000000E-05 -1.70100000000E-05 8.35200000000E-05 + 0.0000000 0.0000000 0.0000000 2.15000000000E-06 8.29000000000E-06 -7.47000000000E-06 + 0.0000000 0.0000000 0.0000000 1.54790000000E-04 1.51860000000E-04 -4.40000000000E-07 + 0.0000000 0.0000000 0.0000000 -1.41000000000E-06 2.87700000000E-04 -2.71000000000E-06 + 0.0000000 0.0000000 0.0000000 -6.96400000000E-05 -1.36110000000E-04 -8.96000000000E-06 + 0.0000000 0.0000000 0.0000000 7.74700000000E-05 7.74700000000E-05 -7.94800000000E-05 + 0.0000000 0.0000000 0.0000000 1.10700000000E-05 1.10700000000E-05 -7.84300000000E-05 + 0.0000000 0.0000000 0.0000000 -6.59400000000E-05 -6.66100000000E-05 -1.42000000000E-06 + 0.0000000 0.0000000 0.0000000 -5.90000000000E-07 -9.10000000000E-07 3.53000000000E-06 + 0.0000000 0.0000000 0.0000000 3.53500000000E-05 -2.79700000000E-05 -1.15590000000E-04 + 0.0000000 0.0000000 0.0000000 7.49100000000E-05 3.63100000000E-04 -7.68800000000E-05 + 0.0000000 0.0000000 0.0000000 2.84000000000E-05 7.20800000000E-05 1.99000000000E-06 + 0.0000000 0.0000000 0.0000000 -3.41000000000E-06 -6.20110000000E-04 -1.80000000000E-07 + 0.0000000 0.0000000 0.0000000 6.73000000000E-06 4.23600000000E-05 -1.09290000000E-04 + 0.0000000 0.0000000 0.0000000 -1.70100000000E-05 7.01700000000E-05 8.35200000000E-05 + 0.0000000 0.0000000 0.0000000 -3.50000000000E-06 -3.50000000000E-06 1.80000000000E-06 + 0.0000000 0.0000000 0.0000000 3.35000000000E-05 3.35000000000E-05 7.00000000000E-07 + 0.0000000 0.0000000 0.0000000 8.91000000000E-06 4.39800000000E-05 1.10590000000E-04 + 0.0000000 0.0000000 0.0000000 -1.83900000000E-05 6.73600000000E-05 -8.54100000000E-05 + 0.0000000 0.0000000 0.0000000 3.80500000000E-05 -2.78300000000E-05 1.13960000000E-04 + 0.0000000 0.0000000 0.0000000 7.22400000000E-05 3.64320000000E-04 7.17500000000E-05 + 0.0000000 0.0000000 0.0000000 -6.66100000000E-05 -6.59400000000E-05 -1.42000000000E-06 + 0.0000000 0.0000000 0.0000000 -9.10000000000E-07 -5.90000000000E-07 3.53000000000E-06 + 0.0000000 0.0000000 0.0000000 6.57500000000E-05 6.57500000000E-05 7.22300000000E-05 + 0.0000000 0.0000000 0.0000000 1.30300000000E-05 1.30300000000E-05 7.81600000000E-05 + 0.0000000 0.0000000 0.0000000 -4.00000000000E-06 2.86630000000E-04 1.62000000000E-06 + 0.0000000 0.0000000 0.0000000 -6.71600000000E-05 -1.30860000000E-04 1.02700000000E-05 + 0.0000000 0.0000000 0.0000000 1.46280000000E-04 -5.20100000000E-04 -1.50930000000E-04 + 0.0000000 0.0000000 0.0000000 4.52200000000E-04 -8.17020000000E-04 4.39140000000E-04 + 0.0000000 0.0000000 0.0000000 8.29000000000E-06 2.15000000000E-06 -7.47000000000E-06 + 0.0000000 0.0000000 0.0000000 1.51860000000E-04 1.54790000000E-04 -4.40000000000E-07 + 0.0000000 0.0000000 0.0000000 4.39800000000E-05 8.91000000000E-06 1.10590000000E-04 + 0.0000000 0.0000000 0.0000000 6.73600000000E-05 -1.83900000000E-05 -8.54100000000E-05 + 0.0000000 0.0000000 0.0000000 5.74410000000E-04 5.74410000000E-04 -2.89260000000E-04 + 0.0000000 0.0000000 0.0000000 -4.12200000000E-05 -4.12200000000E-05 -2.60000000000E-05 + 0.0000000 0.0000000 0.0000000 -1.36190000000E-04 -1.49330000000E-04 -5.34000000000E-06 + 0.0000000 0.0000000 0.0000000 1.61252000000E-03 1.41448000000E-03 1.53350000000E-04 + 0.0000000 0.0000000 0.0000000 -2.79700000000E-05 3.53500000000E-05 -1.15590000000E-04 + 0.0000000 0.0000000 0.0000000 3.63100000000E-04 7.49100000000E-05 -7.68800000000E-05 + 0.0000000 0.0000000 0.0000000 2.86630000000E-04 -4.00000000000E-06 1.62000000000E-06 + 0.0000000 0.0000000 0.0000000 -1.30860000000E-04 -6.71600000000E-05 1.02700000000E-05 + 0.0000000 0.0000000 0.0000000 8.01132000000E-03 8.01132000000E-03 -6.28866000000E-03 + 0.0000000 0.0000000 0.0000000 -1.96600000000E-05 -1.96600000000E-05 -1.05480000000E-04 + 0.0755899 0.0000000 0.0000000 -2.15321600000E-02 1.52460000000E-04 1.52460000000E-04 + 0.0000000 0.0000000 0.0000000 -5.93440000000E-04 -1.44350000000E-04 1.43990000000E-04 + 0.0755899 0.0000000 0.0000000 -2.15321600000E-02 -1.52460000000E-04 -1.52460000000E-04 + 0.0000000 0.0000000 0.0000000 -5.93440000000E-04 1.44350000000E-04 -1.43990000000E-04 + 0.0000000 0.0000000 0.0000000 -5.93440000000E-04 1.43990000000E-04 -1.44350000000E-04 + 0.0000000 0.0000000 0.0000000 -1.29205000000E-03 -1.51940000000E-04 -1.51940000000E-04 + 0.0000000 0.0000000 0.0000000 -5.93440000000E-04 -1.43990000000E-04 1.44350000000E-04 + 0.0000000 0.0000000 0.0000000 -1.29205000000E-03 1.51940000000E-04 1.51940000000E-04 + 0.0000000 0.0000000 0.0000000 1.03751800000E-02 0.00000000000E+00 0.00000000000E+00 + 0.0000000 0.0000000 0.0000000 -1.64640000000E-04 0.00000000000E+00 0.00000000000E+00 + 0.0000000 0.0000000 0.0000000 5.51431000000E-03 3.73438000000E-03 3.73438000000E-03 + 0.0000000 0.0000000 0.0000000 -1.65420000000E-04 7.11000000000E-06 -7.11000000000E-06 + 0.0000000 0.0000000 0.0000000 -1.64640000000E-04 0.00000000000E+00 0.00000000000E+00 + 0.0000000 0.0000000 0.0000000 6.55900000000E-04 0.00000000000E+00 0.00000000000E+00 + 0.0000000 0.0000000 0.0000000 -1.65420000000E-04 -7.11000000000E-06 7.11000000000E-06 + 0.0000000 0.0000000 0.0000000 5.51431000000E-03 -3.73438000000E-03 -3.73438000000E-03 + 0.0000000 0.0000000 0.0000000 6.13400000000E-04 -1.49040000000E-04 1.49040000000E-04 + 0.0000000 0.0000000 0.0000000 3.61760000000E-04 -5.53400000000E-05 -3.12160000000E-04 + 0.0000000 0.0000000 0.0000000 6.13400000000E-04 1.49040000000E-04 -1.49040000000E-04 + 0.0000000 0.0000000 0.0000000 3.61760000000E-04 5.53400000000E-05 3.12160000000E-04 + 0.0000000 0.0000000 0.0000000 3.61760000000E-04 3.12160000000E-04 5.53400000000E-05 + 0.0000000 0.0000000 0.0000000 1.12370000000E-04 -1.09320000000E-04 1.09320000000E-04 + 0.0000000 0.0000000 0.0000000 3.61760000000E-04 -3.12160000000E-04 -5.53400000000E-05 + 0.0000000 0.0000000 0.0000000 1.12370000000E-04 1.09320000000E-04 -1.09320000000E-04 + 0.0000000 0.0000000 0.0000000 2.15600000000E-05 1.29300000000E-05 -1.53000000000E-05 + 0.0000000 0.0000000 0.0000000 2.15600000000E-05 -1.29300000000E-05 1.53000000000E-05 + 0.0000000 0.0000000 0.0000000 2.15600000000E-05 -1.53000000000E-05 1.29300000000E-05 + 0.0000000 0.0000000 0.0000000 9.78000000000E-06 -1.08000000000E-06 -1.57000000000E-06 + 0.0000000 0.0000000 0.0000000 9.78000000000E-06 -1.57000000000E-06 -1.08000000000E-06 + 0.0000000 0.0000000 0.0000000 9.78000000000E-06 1.57000000000E-06 1.08000000000E-06 + 0.0000000 0.0000000 0.0000000 2.15600000000E-05 1.53000000000E-05 -1.29300000000E-05 + 0.0000000 0.0000000 0.0000000 9.78000000000E-06 1.08000000000E-06 1.57000000000E-06 + 0.0000000 0.0000000 0.0000000 2.26400000000E-05 1.27000000000E-05 1.27000000000E-05 + 0.0000000 0.0000000 0.0000000 -7.60000000000E-06 -1.28400000000E-05 1.30600000000E-05 + 0.0000000 0.0000000 0.0000000 2.26400000000E-05 -1.27000000000E-05 -1.27000000000E-05 + 0.0000000 0.0000000 0.0000000 -7.60000000000E-06 1.28400000000E-05 -1.30600000000E-05 + 0.0000000 0.0000000 0.0000000 -7.60000000000E-06 1.30600000000E-05 -1.28400000000E-05 + 0.0000000 0.0000000 0.0000000 2.78900000000E-05 -1.26500000000E-05 -1.26500000000E-05 + 0.0000000 0.0000000 0.0000000 -7.60000000000E-06 -1.30600000000E-05 1.28400000000E-05 + 0.0000000 0.0000000 0.0000000 2.78900000000E-05 1.26500000000E-05 1.26500000000E-05 + 0.0000000 0.0000000 0.0000000 -3.14800000000E-05 0.00000000000E+00 0.00000000000E+00 + 0.0000000 0.0000000 0.0000000 6.76100000000E-05 0.00000000000E+00 0.00000000000E+00 + 0.0000000 0.0000000 0.0000000 -4.27600000000E-05 1.33900000000E-05 1.33900000000E-05 + 0.0000000 0.0000000 0.0000000 6.74200000000E-05 1.22000000000E-06 -1.22000000000E-06 + 0.0000000 0.0000000 0.0000000 6.76100000000E-05 0.00000000000E+00 0.00000000000E+00 + 0.0000000 0.0000000 0.0000000 -5.40500000000E-05 0.00000000000E+00 0.00000000000E+00 + 0.0000000 0.0000000 0.0000000 6.74200000000E-05 -1.22000000000E-06 1.22000000000E-06 + 0.0000000 0.0000000 0.0000000 -4.27600000000E-05 -1.33900000000E-05 -1.33900000000E-05 + 0.0000000 0.0000000 0.0000000 5.89960000000E-04 4.36520000000E-04 -4.36520000000E-04 + 0.0000000 0.0000000 0.0000000 3.50740000000E-04 -2.41740000000E-04 2.78050000000E-04 + 0.0000000 0.0000000 0.0000000 5.89960000000E-04 -4.36520000000E-04 4.36520000000E-04 + 0.0000000 0.0000000 0.0000000 3.50740000000E-04 2.41740000000E-04 -2.78050000000E-04 + 0.0000000 0.0000000 0.0000000 3.50740000000E-04 -2.78050000000E-04 2.41740000000E-04 + 0.0000000 0.0000000 0.0000000 1.11950000000E-04 8.54500000000E-05 -8.54500000000E-05 + 0.0000000 0.0000000 0.0000000 3.50740000000E-04 2.78050000000E-04 -2.41740000000E-04 + 0.0000000 0.0000000 0.0000000 1.11950000000E-04 -8.54500000000E-05 8.54500000000E-05 + 0.0000000 0.0000000 0.0000000 4.91130000000E-03 3.32859000000E-03 -3.33860000000E-03 + 0.0000000 0.0000000 0.0000000 4.91130000000E-03 -3.32859000000E-03 3.33860000000E-03 + 0.0000000 0.0000000 0.0000000 4.91130000000E-03 -3.33860000000E-03 3.32859000000E-03 + 0.0000000 0.0000000 0.0000000 2.44260000000E-04 -2.58500000000E-05 1.31600000000E-05 + 0.0000000 0.0000000 0.0000000 2.44260000000E-04 1.31600000000E-05 -2.58500000000E-05 + 0.0000000 0.0000000 0.0000000 2.44260000000E-04 -1.31600000000E-05 2.58500000000E-05 + 0.0000000 0.0000000 0.0000000 4.91130000000E-03 3.33860000000E-03 -3.32859000000E-03 + 0.0000000 0.0000000 0.0000000 2.44260000000E-04 2.58500000000E-05 -1.31600000000E-05 + 0.0755899 0.0000000 0.0000000 -2.01840100000E-02 -1.44580000000E-04 -1.44580000000E-04 + 0.0000000 0.0000000 0.0000000 7.44520000000E-04 1.51830000000E-04 -1.51570000000E-04 + -0.0755899 0.0000000 0.0000000 2.01905900000E-02 -1.52090000000E-04 -1.52090000000E-04 + 0.0000000 0.0000000 0.0000000 -7.38000000000E-04 1.44770000000E-04 -1.45000000000E-04 + 0.0000000 0.0000000 0.0000000 7.44520000000E-04 -1.51570000000E-04 1.51830000000E-04 + 0.0000000 0.0000000 0.0000000 4.48900000000E-05 1.44600000000E-04 1.44600000000E-04 + 0.0000000 0.0000000 0.0000000 -7.38000000000E-04 -1.45000000000E-04 1.44770000000E-04 + 0.0000000 0.0000000 0.0000000 -5.22000000000E-05 1.52220000000E-04 1.52220000000E-04 + 0.0000000 0.0000000 0.0000000 1.87600000000E-04 7.16501000000E-03 7.16501000000E-03 + 0.0000000 0.0000000 0.0000000 -3.22000000000E-06 1.24390000000E-04 1.05270000000E-04 + 0.0000000 0.0000000 0.0000000 -4.66409000000E-03 -3.42789000000E-03 -3.42789000000E-03 + 0.0000000 0.0000000 0.0000000 -2.50000000000E-06 -1.17300000000E-04 -1.12370000000E-04 + 0.0000000 0.0000000 0.0000000 -3.22000000000E-06 1.05270000000E-04 1.24390000000E-04 + 0.0000000 0.0000000 0.0000000 4.99000000000E-06 7.64100000000E-05 7.64100000000E-05 + 0.0000000 0.0000000 0.0000000 -2.50000000000E-06 -1.12370000000E-04 -1.17300000000E-04 + 0.0000000 0.0000000 0.0000000 4.85976000000E-03 -3.81288000000E-03 -3.81288000000E-03 + 0.0000000 0.0000000 0.0000000 9.04000000000E-06 4.44800000000E-04 4.42840000000E-04 + 0.0000000 0.0000000 0.0000000 2.50330000000E-04 -2.49760000000E-04 -2.86730000000E-04 + 0.0000000 0.0000000 0.0000000 9.04000000000E-06 4.42840000000E-04 4.44800000000E-04 + 0.0000000 0.0000000 0.0000000 -2.39130000000E-04 -2.41680000000E-04 -2.78730000000E-04 + 0.0000000 0.0000000 0.0000000 -2.39130000000E-04 -2.78730000000E-04 -2.41680000000E-04 + 0.0000000 0.0000000 0.0000000 2.00000000000E-08 8.49300000000E-05 8.41500000000E-05 + 0.0000000 0.0000000 0.0000000 2.50330000000E-04 -2.86730000000E-04 -2.49760000000E-04 + 0.0000000 0.0000000 0.0000000 2.00000000000E-08 8.41500000000E-05 8.49300000000E-05 + 0.0000000 0.0000000 0.0000000 5.26000000000E-05 -9.33300000000E-05 9.04900000000E-05 + 0.0000000 0.0000000 0.0000000 -4.98400000000E-05 -8.80800000000E-05 8.67700000000E-05 + 0.0000000 0.0000000 0.0000000 5.26000000000E-05 9.04900000000E-05 -9.33300000000E-05 + 0.0000000 0.0000000 0.0000000 -6.06500000000E-05 7.51800000000E-05 -7.35300000000E-05 + 0.0000000 0.0000000 0.0000000 -6.06500000000E-05 -7.35300000000E-05 7.51800000000E-05 + 0.0000000 0.0000000 0.0000000 6.44100000000E-05 -7.70800000000E-05 7.95200000000E-05 + 0.0000000 0.0000000 0.0000000 -4.98400000000E-05 8.67700000000E-05 -8.80800000000E-05 + 0.0000000 0.0000000 0.0000000 6.44100000000E-05 7.95200000000E-05 -7.70800000000E-05 + 0.0000000 0.0000000 0.0000000 3.22900000000E-05 -1.28800000000E-05 -1.28800000000E-05 + 0.0000000 0.0000000 0.0000000 2.52000000000E-06 1.24900000000E-05 -1.27300000000E-05 + 0.0000000 0.0000000 0.0000000 -3.44700000000E-05 -1.25600000000E-05 -1.25600000000E-05 + 0.0000000 0.0000000 0.0000000 -3.20000000000E-07 1.30800000000E-05 -1.28600000000E-05 + 0.0000000 0.0000000 0.0000000 2.52000000000E-06 -1.27300000000E-05 1.24900000000E-05 + 0.0000000 0.0000000 0.0000000 3.70300000000E-05 1.29700000000E-05 1.29700000000E-05 + 0.0000000 0.0000000 0.0000000 -3.20000000000E-07 -1.28600000000E-05 1.30800000000E-05 + 0.0000000 0.0000000 0.0000000 -3.95800000000E-05 1.24900000000E-05 1.24900000000E-05 + 0.0000000 0.0000000 0.0000000 -3.60000000000E-07 1.05270000000E-04 1.05270000000E-04 + 0.0000000 0.0000000 0.0000000 -3.41000000000E-06 7.61100000000E-05 7.20900000000E-05 + 0.0000000 0.0000000 0.0000000 -1.17700000000E-05 -9.18200000000E-05 -9.18200000000E-05 + 0.0000000 0.0000000 0.0000000 -3.29000000000E-06 -7.43000000000E-05 -7.40700000000E-05 + 0.0000000 0.0000000 0.0000000 -3.41000000000E-06 7.20900000000E-05 7.61100000000E-05 + 0.0000000 0.0000000 0.0000000 -2.30000000000E-07 7.84100000000E-05 7.84100000000E-05 + 0.0000000 0.0000000 0.0000000 -3.29000000000E-06 -7.40700000000E-05 -7.43000000000E-05 + 0.0000000 0.0000000 0.0000000 1.11700000000E-05 -9.18500000000E-05 -9.18500000000E-05 + 0.0000000 0.0000000 0.0000000 -9.80000000000E-06 -1.54760000000E-04 -1.39400000000E-04 + 0.0000000 0.0000000 0.0000000 2.39900000000E-04 -4.92000000000E-05 3.04530000000E-04 + 0.0000000 0.0000000 0.0000000 -9.80000000000E-06 -1.39400000000E-04 -1.54760000000E-04 + 0.0000000 0.0000000 0.0000000 -2.49660000000E-04 -5.28600000000E-05 3.11750000000E-04 + 0.0000000 0.0000000 0.0000000 -2.49660000000E-04 3.11750000000E-04 -5.28600000000E-05 + 0.0000000 0.0000000 0.0000000 -4.00000000000E-07 -1.09850000000E-04 -1.10170000000E-04 + 0.0000000 0.0000000 0.0000000 2.39900000000E-04 3.04530000000E-04 -4.92000000000E-05 + 0.0000000 0.0000000 0.0000000 -4.00000000000E-07 -1.10170000000E-04 -1.09850000000E-04 + 0.0000000 0.0000000 0.0000000 -5.26412000000E-03 -3.83940000000E-03 3.82512000000E-03 + 0.0000000 0.0000000 0.0000000 5.07164000000E-03 -3.44982000000E-03 3.44441000000E-03 + 0.0000000 0.0000000 0.0000000 -5.26412000000E-03 3.82512000000E-03 -3.83940000000E-03 + 0.0000000 0.0000000 0.0000000 4.05810000000E-04 9.93300000000E-05 -9.13300000000E-05 + 0.0000000 0.0000000 0.0000000 4.05810000000E-04 -9.13300000000E-05 9.93300000000E-05 + 0.0000000 0.0000000 0.0000000 -4.07230000000E-04 -9.02400000000E-05 1.01500000000E-04 + 0.0000000 0.0000000 0.0000000 5.07164000000E-03 3.44441000000E-03 -3.44982000000E-03 + 0.0000000 0.0000000 0.0000000 -4.07230000000E-04 1.01500000000E-04 -9.02400000000E-05 + -0.0755899 0.0000000 0.0000000 2.15131900000E-02 -1.45070000000E-04 -1.45070000000E-04 + 0.0000000 0.0000000 0.0000000 5.99920000000E-04 1.52110000000E-04 -1.52500000000E-04 + -0.0755899 0.0000000 0.0000000 2.15131900000E-02 1.45070000000E-04 1.45070000000E-04 + 0.0000000 0.0000000 0.0000000 5.99920000000E-04 -1.52110000000E-04 1.52500000000E-04 + 0.0000000 0.0000000 0.0000000 5.99920000000E-04 -1.52500000000E-04 1.52110000000E-04 + 0.0000000 0.0000000 0.0000000 1.28642000000E-03 1.44570000000E-04 1.44570000000E-04 + 0.0000000 0.0000000 0.0000000 5.99920000000E-04 1.52500000000E-04 -1.52110000000E-04 + 0.0000000 0.0000000 0.0000000 1.28642000000E-03 -1.44570000000E-04 -1.44570000000E-04 + 0.0000000 0.0000000 0.0000000 -9.97125000000E-03 0.00000000000E+00 0.00000000000E+00 + 0.0000000 0.0000000 0.0000000 1.58110000000E-04 0.00000000000E+00 0.00000000000E+00 + 0.0000000 0.0000000 0.0000000 -5.31094000000E-03 -3.35327000000E-03 -3.35327000000E-03 + 0.0000000 0.0000000 0.0000000 1.57390000000E-04 -1.19000000000E-05 1.19000000000E-05 + 0.0000000 0.0000000 0.0000000 1.58110000000E-04 0.00000000000E+00 0.00000000000E+00 + 0.0000000 0.0000000 0.0000000 -6.46870000000E-04 0.00000000000E+00 0.00000000000E+00 + 0.0000000 0.0000000 0.0000000 1.57390000000E-04 1.19000000000E-05 -1.19000000000E-05 + 0.0000000 0.0000000 0.0000000 -5.31094000000E-03 3.35327000000E-03 3.35327000000E-03 + 0.0000000 0.0000000 0.0000000 -5.89300000000E-04 1.44760000000E-04 -1.44760000000E-04 + 0.0000000 0.0000000 0.0000000 -3.51400000000E-04 4.72500000000E-05 3.03930000000E-04 + 0.0000000 0.0000000 0.0000000 -5.89300000000E-04 -1.44760000000E-04 1.44760000000E-04 + 0.0000000 0.0000000 0.0000000 -3.51400000000E-04 -4.72500000000E-05 -3.03930000000E-04 + 0.0000000 0.0000000 0.0000000 -3.51400000000E-04 -3.03930000000E-04 -4.72500000000E-05 + 0.0000000 0.0000000 0.0000000 -1.11420000000E-04 1.10600000000E-04 -1.10600000000E-04 + 0.0000000 0.0000000 0.0000000 -3.51400000000E-04 3.03930000000E-04 4.72500000000E-05 + 0.0000000 0.0000000 0.0000000 -1.11420000000E-04 -1.10600000000E-04 1.10600000000E-04 + 0.0000000 0.0000000 0.0000000 -1.77500000000E-05 -1.61900000000E-05 1.80500000000E-05 + 0.0000000 0.0000000 0.0000000 -1.77500000000E-05 1.61900000000E-05 -1.80500000000E-05 + 0.0000000 0.0000000 0.0000000 -1.77500000000E-05 1.80500000000E-05 -1.61900000000E-05 + 0.0000000 0.0000000 0.0000000 -6.87000000000E-06 -3.21000000000E-06 4.88000000000E-06 + 0.0000000 0.0000000 0.0000000 -6.87000000000E-06 4.88000000000E-06 -3.21000000000E-06 + 0.0000000 0.0000000 0.0000000 -6.87000000000E-06 -4.88000000000E-06 3.21000000000E-06 + 0.0000000 0.0000000 0.0000000 -1.77500000000E-05 -1.80500000000E-05 1.61900000000E-05 + 0.0000000 0.0000000 0.0000000 -6.87000000000E-06 3.21000000000E-06 -4.88000000000E-06 + 0.0000000 0.0000000 0.0000000 -2.44100000000E-05 -1.29700000000E-05 -1.29700000000E-05 + 0.0000000 0.0000000 0.0000000 8.90000000000E-06 1.26000000000E-05 -1.24100000000E-05 + 0.0000000 0.0000000 0.0000000 -2.44100000000E-05 1.29700000000E-05 1.29700000000E-05 + 0.0000000 0.0000000 0.0000000 8.90000000000E-06 -1.26000000000E-05 1.24100000000E-05 + 0.0000000 0.0000000 0.0000000 8.90000000000E-06 -1.24100000000E-05 1.26000000000E-05 + 0.0000000 0.0000000 0.0000000 -2.91600000000E-05 1.29000000000E-05 1.29000000000E-05 + 0.0000000 0.0000000 0.0000000 8.90000000000E-06 1.24100000000E-05 -1.26000000000E-05 + 0.0000000 0.0000000 0.0000000 -2.91600000000E-05 -1.29000000000E-05 -1.29000000000E-05 + 0.0000000 0.0000000 0.0000000 3.17900000000E-05 0.00000000000E+00 0.00000000000E+00 + 0.0000000 0.0000000 0.0000000 -7.42600000000E-05 0.00000000000E+00 0.00000000000E+00 + 0.0000000 0.0000000 0.0000000 4.30300000000E-05 -1.34500000000E-05 -1.34500000000E-05 + 0.0000000 0.0000000 0.0000000 -7.43300000000E-05 -2.80000000000E-06 2.80000000000E-06 + 0.0000000 0.0000000 0.0000000 -7.42600000000E-05 0.00000000000E+00 0.00000000000E+00 + 0.0000000 0.0000000 0.0000000 5.43900000000E-05 0.00000000000E+00 0.00000000000E+00 + 0.0000000 0.0000000 0.0000000 -7.43300000000E-05 2.80000000000E-06 -2.80000000000E-06 + 0.0000000 0.0000000 0.0000000 4.30300000000E-05 1.34500000000E-05 1.34500000000E-05 + 0.0000000 0.0000000 0.0000000 -6.12650000000E-04 -4.51440000000E-04 4.51440000000E-04 + 0.0000000 0.0000000 0.0000000 -3.62520000000E-04 2.49780000000E-04 -2.87420000000E-04 + 0.0000000 0.0000000 0.0000000 -6.12650000000E-04 4.51440000000E-04 -4.51440000000E-04 + 0.0000000 0.0000000 0.0000000 -3.62520000000E-04 -2.49780000000E-04 2.87420000000E-04 + 0.0000000 0.0000000 0.0000000 -3.62520000000E-04 2.87420000000E-04 -2.49780000000E-04 + 0.0000000 0.0000000 0.0000000 -1.11820000000E-04 -8.36100000000E-05 8.36100000000E-05 + 0.0000000 0.0000000 0.0000000 -3.62520000000E-04 -2.87420000000E-04 2.49780000000E-04 + 0.0000000 0.0000000 0.0000000 -1.11820000000E-04 8.36100000000E-05 -8.36100000000E-05 + 0.0000000 0.0000000 0.0000000 -5.10149000000E-03 -3.71128000000E-03 3.72043000000E-03 + 0.0000000 0.0000000 0.0000000 -5.10149000000E-03 3.71128000000E-03 -3.72043000000E-03 + 0.0000000 0.0000000 0.0000000 -5.10149000000E-03 3.72043000000E-03 -3.71128000000E-03 + 0.0000000 0.0000000 0.0000000 -2.45720000000E-04 2.22000000000E-05 -1.56700000000E-05 + 0.0000000 0.0000000 0.0000000 -2.45720000000E-04 -1.56700000000E-05 2.22000000000E-05 + 0.0000000 0.0000000 0.0000000 -2.45720000000E-04 1.56700000000E-05 -2.22000000000E-05 + 0.0000000 0.0000000 0.0000000 -5.10149000000E-03 -3.72043000000E-03 3.71128000000E-03 + 0.0000000 0.0000000 0.0000000 -2.45720000000E-04 -2.22000000000E-05 1.56700000000E-05 + 0.0755899 0.0000000 0.0000000 -2.10056100000E-02 3.00920000000E-04 2.87460000000E-04 + 0.0000000 0.0000000 0.0000000 2.17850000000E-04 2.95690000000E-04 -2.91250000000E-04 + 0.0000000 0.0755899 0.0000000 -6.72090000000E-04 -2.09988400000E-02 -1.51160000000E-04 + 0.0000000 0.0000000 0.0000000 -6.65870000000E-04 2.16710000000E-04 -1.44560000000E-04 + 0.0000000 0.0000000 0.0000000 -7.97200000000E-05 3.06630000000E-04 -2.99720000000E-04 + 0.0000000 0.0000000 0.0000000 -4.68650000000E-04 3.06030000000E-04 2.98230000000E-04 + 0.0000000 0.0000000 0.0000000 -6.66190000000E-04 -1.16000000000E-04 1.44580000000E-04 + 0.0000000 0.0000000 0.0000000 -6.71920000000E-04 1.48240000000E-04 1.52280000000E-04 + 0.0000000 0.0000000 0.0000000 1.79773000000E-03 8.75547000000E-03 7.17111000000E-03 + 0.0000000 0.0000000 0.0000000 -1.45620000000E-04 -1.77600000000E-05 1.04900000000E-04 + 0.0000000 0.0000000 0.0000000 4.10398000000E-03 5.14392000000E-03 3.73904000000E-03 + 0.0000000 0.0000000 0.0000000 -2.14400000000E-05 -1.36500000000E-04 -7.67000000000E-06 + 0.0000000 0.0000000 0.0000000 -1.34550000000E-04 3.82200000000E-05 1.13680000000E-04 + 0.0000000 0.0000000 0.0000000 2.87970000000E-04 7.54800000000E-05 7.55800000000E-05 + 0.0000000 0.0000000 0.0000000 -2.92300000000E-05 -7.68700000000E-05 -8.50000000000E-07 + 0.0000000 0.0000000 0.0000000 5.22137000000E-03 -3.74297000000E-03 -3.74105000000E-03 + 0.0000000 0.0000000 0.0000000 1.10200000000E-05 4.47230000000E-04 4.38850000000E-04 + 0.0000000 0.0000000 0.0000000 4.02980000000E-04 -9.54800000000E-05 -2.86550000000E-04 + 0.0000000 0.0000000 0.0000000 4.50760000000E-04 -3.67780000000E-04 5.76000000000E-06 + 0.0000000 0.0000000 0.0000000 -9.56700000000E-05 -7.67910000000E-04 -1.38820000000E-04 + 0.0000000 0.0000000 0.0000000 3.55890000000E-04 3.19190000000E-04 5.65200000000E-05 + 0.0000000 0.0000000 0.0000000 -4.03700000000E-05 4.32800000000E-05 1.09450000000E-04 + 0.0000000 0.0000000 0.0000000 3.18910000000E-04 -3.03350000000E-04 -1.64940000000E-04 + 0.0000000 0.0000000 0.0000000 4.34100000000E-05 9.09700000000E-05 -2.54400000000E-05 + 0.0000000 0.0000000 0.0000000 8.80000000000E-05 -1.18140000000E-04 -2.57700000000E-05 + 0.0000000 0.0000000 0.0000000 2.20800000000E-05 2.71510000000E-04 1.47000000000E-05 + 0.0000000 0.0000000 0.0000000 -1.69300000000E-05 -4.46800000000E-05 -1.00000000000E-04 + 0.0000000 0.0000000 0.0000000 -6.52300000000E-05 3.65780000000E-04 -7.71000000000E-05 + 0.0000000 0.0000000 0.0000000 1.06600000000E-05 -1.50000000000E-06 -1.99000000000E-06 + 0.0000000 0.0000000 0.0000000 7.57800000000E-05 -6.44400000000E-05 8.90000000000E-07 + 0.0000000 0.0000000 0.0000000 -5.02700000000E-05 8.55600000000E-05 -8.77600000000E-05 + 0.0000000 0.0000000 0.0000000 -2.44000000000E-06 1.25000000000E-05 -7.70300000000E-05 + 0.0000000 0.0000000 0.0000000 1.56000000000E-05 5.60000000000E-05 -9.77100000000E-05 + 0.0000000 0.0000000 0.0000000 9.29000000000E-06 5.54300000000E-05 9.75300000000E-05 + 0.0000000 0.0000000 0.0000000 -5.67000000000E-06 5.94100000000E-05 -1.24900000000E-05 + 0.0000000 0.0000000 0.0000000 -3.82000000000E-06 -6.07000000000E-04 -1.26500000000E-05 + 0.0000000 0.0000000 0.0000000 -1.63100000000E-05 5.55700000000E-05 9.63700000000E-05 + 0.0000000 0.0000000 0.0000000 4.59100000000E-05 5.63300000000E-05 -9.68700000000E-05 + 0.0000000 0.0000000 0.0000000 -3.74000000000E-06 -1.65400000000E-05 1.35000000000E-05 + 0.0000000 0.0000000 0.0000000 -5.74000000000E-06 4.59300000000E-05 1.25900000000E-05 + 0.0000000 0.0000000 0.0000000 -6.69600000000E-05 -2.60100000000E-05 1.16390000000E-04 + 0.0000000 0.0000000 0.0000000 -4.19000000000E-06 3.59810000000E-04 7.23200000000E-05 + 0.0000000 0.0000000 0.0000000 2.66900000000E-05 -1.22120000000E-04 2.16500000000E-05 + 0.0000000 0.0000000 0.0000000 7.31100000000E-05 2.93330000000E-04 2.50000000000E-06 + 0.0000000 0.0000000 0.0000000 -3.60000000000E-06 7.16100000000E-05 7.54900000000E-05 + 0.0000000 0.0000000 0.0000000 -6.60700000000E-05 1.25100000000E-05 7.82000000000E-05 + 0.0000000 0.0000000 0.0000000 6.88000000000E-05 -1.97000000000E-06 1.74000000000E-06 + 0.0000000 0.0000000 0.0000000 2.39200000000E-05 -8.00300000000E-05 -1.34600000000E-05 + 0.0000000 0.0000000 0.0000000 5.86570000000E-04 4.40070000000E-04 -4.37170000000E-04 + 0.0000000 0.0000000 0.0000000 1.97410000000E-04 -8.86200000000E-05 2.79230000000E-04 + 0.0000000 0.0000000 0.0000000 4.47070000000E-04 -9.63740000000E-04 2.96400000000E-04 + 0.0000000 0.0000000 0.0000000 -8.92500000000E-05 -5.68000000000E-04 1.57220000000E-04 + 0.0000000 0.0000000 0.0000000 -2.42930000000E-04 3.18410000000E-04 -5.26200000000E-05 + 0.0000000 0.0000000 0.0000000 1.52720000000E-04 4.35200000000E-05 -1.10510000000E-04 + 0.0000000 0.0000000 0.0000000 3.08140000000E-04 2.85090000000E-04 -1.31990000000E-04 + 0.0000000 0.0000000 0.0000000 4.27400000000E-05 -1.01740000000E-04 2.40000000000E-07 + 0.0000000 0.0000000 0.0000000 3.31081000000E-03 4.92853000000E-03 -3.33742000000E-03 + 0.0000000 0.0000000 0.0000000 5.05407000000E-03 -3.47067000000E-03 3.33873000000E-03 + 0.0000000 0.0000000 0.0000000 -3.85312000000E-03 5.23479000000E-03 -3.83812000000E-03 + 0.0000000 0.0000000 0.0000000 2.62720000000E-04 -4.49900000000E-05 -9.16000000000E-05 + 0.0000000 0.0000000 0.0000000 3.76080000000E-04 -5.32800000000E-05 -1.44700000000E-05 + 0.0000000 0.0000000 0.0000000 -3.92000000000E-05 -1.41100000000E-05 2.56800000000E-05 + 0.0000000 0.0000000 0.0000000 4.93781000000E-03 3.37404000000E-03 -3.44407000000E-03 + 0.0000000 0.0000000 0.0000000 -1.15440000000E-04 9.73000000000E-05 -8.60200000000E-05 + 0.0755899 0.0000000 0.0000000 -2.06955900000E-02 -3.11140000000E-04 -2.95440000000E-04 + 0.0000000 0.0000000 0.0000000 -8.02200000000E-05 -3.05940000000E-04 2.99350000000E-04 + 0.0000000 -0.0755899 0.0000000 -6.71650000000E-04 2.06956100000E-02 -1.51590000000E-04 + 0.0000000 0.0000000 0.0000000 -6.65450000000E-04 7.24000000000E-05 -1.44520000000E-04 + 0.0000000 0.0000000 0.0000000 2.17350000000E-04 -2.96310000000E-04 2.91540000000E-04 + 0.0000000 0.0000000 0.0000000 -7.65320000000E-04 -2.95710000000E-04 -2.90280000000E-04 + 0.0000000 0.0000000 0.0000000 -6.65220000000E-04 -1.73120000000E-04 1.44580000000E-04 + 0.0000000 0.0000000 0.0000000 -6.72130000000E-04 1.55710000000E-04 1.51810000000E-04 + 0.0000000 0.0000000 0.0000000 8.95378000000E-03 -1.40202000000E-03 -7.57000000000E-06 + 0.0000000 0.0000000 0.0000000 -2.12900000000E-05 1.43380000000E-04 3.20000000000E-07 + 0.0000000 0.0000000 0.0000000 -3.06397000000E-03 -5.02664000000E-03 -3.43255000000E-03 + 0.0000000 0.0000000 0.0000000 -1.45260000000E-04 2.52300000000E-05 -1.11900000000E-04 + 0.0000000 0.0000000 0.0000000 -2.94000000000E-05 6.94900000000E-05 7.97000000000E-06 + 0.0000000 0.0000000 0.0000000 3.64750000000E-04 4.72000000000E-06 4.25000000000E-06 + 0.0000000 0.0000000 0.0000000 -1.34780000000E-04 -4.52000000000E-05 -1.06410000000E-04 + 0.0000000 0.0000000 0.0000000 5.14340000000E-03 -3.80870000000E-03 -3.81015000000E-03 + 0.0000000 0.0000000 0.0000000 6.08790000000E-04 -1.53540000000E-04 1.53400000000E-04 + 0.0000000 0.0000000 0.0000000 2.09890000000E-04 -2.08520000000E-04 -3.12610000000E-04 + 0.0000000 0.0000000 0.0000000 1.53520000000E-04 9.73380000000E-04 3.05840000000E-04 + 0.0000000 0.0000000 0.0000000 2.00080000000E-04 5.67910000000E-04 1.56750000000E-04 + 0.0000000 0.0000000 0.0000000 -2.35600000000E-04 -2.83430000000E-04 -2.43130000000E-04 + 0.0000000 0.0000000 0.0000000 1.53400000000E-04 -6.87300000000E-05 8.39900000000E-05 + 0.0000000 0.0000000 0.0000000 2.93290000000E-04 -2.94000000000E-04 -1.39400000000E-04 + 0.0000000 0.0000000 0.0000000 6.89600000000E-05 1.00640000000E-04 2.90000000000E-07 + 0.0000000 0.0000000 0.0000000 -1.64600000000E-05 4.16100000000E-05 9.83700000000E-05 + 0.0000000 0.0000000 0.0000000 -5.44700000000E-05 -3.80580000000E-04 9.07200000000E-05 + 0.0000000 0.0000000 0.0000000 8.83900000000E-05 1.16180000000E-04 2.23100000000E-05 + 0.0000000 0.0000000 0.0000000 1.00200000000E-05 -2.83170000000E-04 -1.51000000000E-06 + 0.0000000 0.0000000 0.0000000 -6.23300000000E-05 -7.32200000000E-05 7.61500000000E-05 + 0.0000000 0.0000000 0.0000000 -2.43000000000E-06 -1.06100000000E-05 7.97400000000E-05 + 0.0000000 0.0000000 0.0000000 2.14200000000E-05 1.58000000000E-05 -1.31600000000E-05 + 0.0000000 0.0000000 0.0000000 7.59100000000E-05 6.76200000000E-05 1.41000000000E-06 + 0.0000000 0.0000000 0.0000000 4.13800000000E-05 -5.60000000000E-05 9.67000000000E-05 + 0.0000000 0.0000000 0.0000000 -1.61400000000E-05 -5.54100000000E-05 -9.63800000000E-05 + 0.0000000 0.0000000 0.0000000 -5.95000000000E-06 -8.43900000000E-05 -1.26300000000E-05 + 0.0000000 0.0000000 0.0000000 -4.25000000000E-06 6.32700000000E-04 -1.32300000000E-05 + 0.0000000 0.0000000 0.0000000 9.36000000000E-06 -5.56000000000E-05 -9.73600000000E-05 + 0.0000000 0.0000000 0.0000000 2.07600000000E-05 -5.63500000000E-05 9.78100000000E-05 + 0.0000000 0.0000000 0.0000000 -4.39000000000E-06 -9.34000000000E-06 1.23500000000E-05 + 0.0000000 0.0000000 0.0000000 -5.94000000000E-06 -2.08600000000E-05 1.24700000000E-05 + 0.0000000 0.0000000 0.0000000 3.81000000000E-05 1.35400000000E-04 -8.34000000000E-06 + 0.0000000 0.0000000 0.0000000 7.24700000000E-05 -2.91840000000E-04 -3.79000000000E-06 + 0.0000000 0.0000000 0.0000000 -7.84600000000E-05 3.95300000000E-05 -1.03040000000E-04 + 0.0000000 0.0000000 0.0000000 -4.83000000000E-06 -3.58130000000E-04 -7.42100000000E-05 + 0.0000000 0.0000000 0.0000000 6.85000000000E-05 1.03000000000E-06 5.80000000000E-07 + 0.0000000 0.0000000 0.0000000 1.24200000000E-05 6.65200000000E-05 1.60000000000E-07 + 0.0000000 0.0000000 0.0000000 -4.04000000000E-06 -7.38800000000E-05 -7.47300000000E-05 + 0.0000000 0.0000000 0.0000000 -5.46700000000E-05 -2.57600000000E-05 -9.16100000000E-05 + 0.0000000 0.0000000 0.0000000 -3.78000000000E-06 -1.60320000000E-04 -1.38700000000E-04 + 0.0000000 0.0000000 0.0000000 3.92370000000E-04 -2.01310000000E-04 3.03610000000E-04 + 0.0000000 0.0000000 0.0000000 1.51350000000E-04 3.74400000000E-04 1.18000000000E-06 + 0.0000000 0.0000000 0.0000000 2.08500000000E-04 7.69910000000E-04 -1.39320000000E-04 + 0.0000000 0.0000000 0.0000000 3.46590000000E-04 -2.82610000000E-04 2.41500000000E-04 + 0.0000000 0.0000000 0.0000000 -4.19500000000E-05 -6.88800000000E-05 -8.49900000000E-05 + 0.0000000 0.0000000 0.0000000 2.82450000000E-04 2.95900000000E-04 -1.58340000000E-04 + 0.0000000 0.0000000 0.0000000 6.86400000000E-05 -9.20500000000E-05 -2.53900000000E-05 + 0.0000000 0.0000000 0.0000000 -3.85274000000E-03 -5.24959000000E-03 3.82386000000E-03 + 0.0000000 0.0000000 0.0000000 4.92780000000E-03 -3.30643000000E-03 3.44456000000E-03 + 0.0000000 0.0000000 0.0000000 3.31140000000E-03 -4.93780000000E-03 3.32754000000E-03 + 0.0000000 0.0000000 0.0000000 3.86430000000E-04 1.17050000000E-04 1.33800000000E-05 + 0.0000000 0.0000000 0.0000000 2.70160000000E-04 -2.23500000000E-05 9.06200000000E-05 + 0.0000000 0.0000000 0.0000000 -1.15210000000E-04 -8.51800000000E-05 9.82000000000E-05 + 0.0000000 0.0000000 0.0000000 5.04117000000E-03 3.40650000000E-03 -3.33717000000E-03 + 0.0000000 0.0000000 0.0000000 -3.88900000000E-05 2.60600000000E-05 -1.38700000000E-05 + -0.0755899 0.0000000 0.0000000 2.07177200000E-02 2.90120000000E-04 2.95300000000E-04 + 0.0000000 0.0000000 0.0000000 7.20600000000E-05 2.95120000000E-04 -2.91450000000E-04 + 0.0000000 0.0755899 0.0000000 6.65050000000E-04 -2.07166500000E-02 1.45150000000E-04 + 0.0000000 0.0000000 0.0000000 6.72280000000E-04 -7.98200000000E-05 1.52170000000E-04 + 0.0000000 0.0000000 0.0000000 -2.23930000000E-04 3.05280000000E-04 -2.99440000000E-04 + 0.0000000 0.0000000 0.0000000 7.72240000000E-04 3.05880000000E-04 3.00770000000E-04 + 0.0000000 0.0000000 0.0000000 6.72920000000E-04 1.80480000000E-04 -1.52130000000E-04 + 0.0000000 0.0000000 0.0000000 6.65740000000E-04 -1.47780000000E-04 -1.44690000000E-04 + 0.0000000 0.0000000 0.0000000 -8.38456000000E-03 1.60632000000E-03 -7.89000000000E-06 + 0.0000000 0.0000000 0.0000000 1.55600000000E-05 -1.42560000000E-04 5.80000000000E-07 + 0.0000000 0.0000000 0.0000000 3.44875000000E-03 5.22416000000E-03 3.80791000000E-03 + 0.0000000 0.0000000 0.0000000 1.40350000000E-04 -3.06900000000E-05 1.17810000000E-04 + 0.0000000 0.0000000 0.0000000 2.68300000000E-05 -6.69600000000E-05 -1.12700000000E-05 + 0.0000000 0.0000000 0.0000000 -3.63290000000E-04 -5.40000000000E-07 2.10000000000E-07 + 0.0000000 0.0000000 0.0000000 1.31780000000E-04 4.73400000000E-05 1.03800000000E-04 + 0.0000000 0.0000000 0.0000000 -4.95459000000E-03 3.42643000000E-03 3.42661000000E-03 + 0.0000000 0.0000000 0.0000000 -5.83210000000E-04 1.50280000000E-04 -1.41020000000E-04 + 0.0000000 0.0000000 0.0000000 -1.96910000000E-04 2.00140000000E-04 3.04100000000E-04 + 0.0000000 0.0000000 0.0000000 -1.50970000000E-04 -9.55410000000E-04 -2.87960000000E-04 + 0.0000000 0.0000000 0.0000000 -2.08220000000E-04 -5.75220000000E-04 -1.65230000000E-04 + 0.0000000 0.0000000 0.0000000 2.43390000000E-04 2.92920000000E-04 2.48370000000E-04 + 0.0000000 0.0000000 0.0000000 -1.52980000000E-04 6.88700000000E-05 -8.48500000000E-05 + 0.0000000 0.0000000 0.0000000 -2.82690000000E-04 2.87310000000E-04 1.32110000000E-04 + 0.0000000 0.0000000 0.0000000 -6.83900000000E-05 -1.03680000000E-04 1.30000000000E-07 + 0.0000000 0.0000000 0.0000000 1.81500000000E-05 -4.36400000000E-05 -9.82400000000E-05 + 0.0000000 0.0000000 0.0000000 5.34700000000E-05 3.75730000000E-04 -9.07400000000E-05 + 0.0000000 0.0000000 0.0000000 -8.77500000000E-05 -1.17220000000E-04 -2.58800000000E-05 + 0.0000000 0.0000000 0.0000000 -1.18300000000E-05 2.89870000000E-04 6.70000000000E-07 + 0.0000000 0.0000000 0.0000000 6.40800000000E-05 7.63500000000E-05 -7.87900000000E-05 + 0.0000000 0.0000000 0.0000000 4.92000000000E-06 7.46000000000E-06 -7.48800000000E-05 + 0.0000000 0.0000000 0.0000000 -1.96200000000E-05 -1.85000000000E-05 1.56400000000E-05 + 0.0000000 0.0000000 0.0000000 -7.32700000000E-05 -6.30700000000E-05 -4.68000000000E-06 + 0.0000000 0.0000000 0.0000000 -4.13000000000E-05 5.59300000000E-05 -9.78900000000E-05 + 0.0000000 0.0000000 0.0000000 1.64000000000E-05 5.63000000000E-05 9.82100000000E-05 + 0.0000000 0.0000000 0.0000000 4.01000000000E-06 8.53600000000E-05 1.28000000000E-05 + 0.0000000 0.0000000 0.0000000 5.73000000000E-06 -6.33510000000E-04 1.22800000000E-05 + 0.0000000 0.0000000 0.0000000 -9.40000000000E-06 5.63800000000E-05 9.71000000000E-05 + 0.0000000 0.0000000 0.0000000 -2.03900000000E-05 5.57000000000E-05 -9.66100000000E-05 + 0.0000000 0.0000000 0.0000000 5.17000000000E-06 9.19000000000E-06 -1.30200000000E-05 + 0.0000000 0.0000000 0.0000000 3.78000000000E-06 2.06900000000E-05 -1.30800000000E-05 + 0.0000000 0.0000000 0.0000000 -3.56600000000E-05 -1.31230000000E-04 1.08400000000E-05 + 0.0000000 0.0000000 0.0000000 -7.46400000000E-05 2.83290000000E-04 4.60000000000E-07 + 0.0000000 0.0000000 0.0000000 8.12800000000E-05 -4.33500000000E-05 9.99300000000E-05 + 0.0000000 0.0000000 0.0000000 7.00000000000E-07 3.65320000000E-04 7.83100000000E-05 + 0.0000000 0.0000000 0.0000000 -7.47000000000E-05 -2.30000000000E-07 7.50000000000E-07 + 0.0000000 0.0000000 0.0000000 -1.15700000000E-05 -6.61000000000E-05 0.00000000000E+00 + 0.0000000 0.0000000 0.0000000 -2.72000000000E-06 7.33100000000E-05 7.39200000000E-05 + 0.0000000 0.0000000 0.0000000 5.52100000000E-05 2.52900000000E-05 9.18900000000E-05 + 0.0000000 0.0000000 0.0000000 -1.43000000000E-05 1.44100000000E-04 1.55400000000E-04 + 0.0000000 0.0000000 0.0000000 -4.03520000000E-04 2.07390000000E-04 -3.12870000000E-04 + 0.0000000 0.0000000 0.0000000 -1.53440000000E-04 -3.72560000000E-04 7.40000000000E-07 + 0.0000000 0.0000000 0.0000000 -2.00030000000E-04 -7.62330000000E-04 1.31810000000E-04 + 0.0000000 0.0000000 0.0000000 -3.56230000000E-04 2.93230000000E-04 -2.49860000000E-04 + 0.0000000 0.0000000 0.0000000 4.07300000000E-05 6.85100000000E-05 8.37800000000E-05 + 0.0000000 0.0000000 0.0000000 -2.93280000000E-04 -3.04670000000E-04 1.63960000000E-04 + 0.0000000 0.0000000 0.0000000 -6.87300000000E-05 9.26300000000E-05 2.57500000000E-05 + 0.0000000 0.0000000 0.0000000 3.47281000000E-03 5.04908000000E-03 -3.44569000000E-03 + 0.0000000 0.0000000 0.0000000 -5.12223000000E-03 3.69668000000E-03 -3.82521000000E-03 + 0.0000000 0.0000000 0.0000000 -3.69165000000E-03 5.13118000000E-03 -3.71225000000E-03 + 0.0000000 0.0000000 0.0000000 -3.89730000000E-04 -1.20430000000E-04 -1.55500000000E-05 + 0.0000000 0.0000000 0.0000000 -2.76050000000E-04 2.24400000000E-05 -9.07400000000E-05 + 0.0000000 0.0000000 0.0000000 1.22710000000E-04 9.10900000000E-05 -9.84800000000E-05 + 0.0000000 0.0000000 0.0000000 -5.23808000000E-03 -3.78944000000E-03 3.72194000000E-03 + 0.0000000 0.0000000 0.0000000 4.60700000000E-05 -2.76000000000E-05 1.91900000000E-05 + -0.0755899 0.0000000 0.0000000 2.09976700000E-02 -3.00920000000E-04 -3.03720000000E-04 + 0.0000000 0.0000000 0.0000000 -2.23470000000E-04 -3.05780000000E-04 2.99770000000E-04 + 0.0000000 -0.0755899 0.0000000 6.65930000000E-04 2.10053100000E-02 1.42440000000E-04 + 0.0000000 0.0000000 0.0000000 6.72090000000E-04 -2.24250000000E-04 1.52010000000E-04 + 0.0000000 0.0000000 0.0000000 7.28700000000E-05 -2.94760000000E-04 2.91320000000E-04 + 0.0000000 0.0000000 0.0000000 4.75600000000E-04 -2.95270000000E-04 -2.92650000000E-04 + 0.0000000 0.0000000 0.0000000 6.71800000000E-04 1.23440000000E-04 -1.51970000000E-04 + 0.0000000 0.0000000 0.0000000 6.65660000000E-04 -1.41410000000E-04 -1.44160000000E-04 + 0.0000000 0.0000000 0.0000000 -1.20972000000E-03 -8.58122000000E-03 -7.15579000000E-03 + 0.0000000 0.0000000 0.0000000 1.40260000000E-04 1.92300000000E-05 -1.05580000000E-04 + 0.0000000 0.0000000 0.0000000 -3.71165000000E-03 -4.95349000000E-03 -3.34860000000E-03 + 0.0000000 0.0000000 0.0000000 1.55400000000E-05 1.30190000000E-04 1.15600000000E-05 + 0.0000000 0.0000000 0.0000000 1.32120000000E-04 -3.56200000000E-05 -1.15910000000E-04 + 0.0000000 0.0000000 0.0000000 -2.87290000000E-04 -7.16100000000E-05 -7.27800000000E-05 + 0.0000000 0.0000000 0.0000000 2.70200000000E-05 7.89000000000E-05 -8.10000000000E-07 + 0.0000000 0.0000000 0.0000000 -5.02794000000E-03 3.35079000000E-03 3.35156000000E-03 + 0.0000000 0.0000000 0.0000000 8.10000000000E-07 -4.51280000000E-04 -4.49150000000E-04 + 0.0000000 0.0000000 0.0000000 -3.92800000000E-04 8.96100000000E-05 2.78920000000E-04 + 0.0000000 0.0000000 0.0000000 -4.47440000000E-04 3.79150000000E-04 5.36000000000E-06 + 0.0000000 0.0000000 0.0000000 8.91000000000E-05 7.64760000000E-04 1.32240000000E-04 + 0.0000000 0.0000000 0.0000000 -3.47090000000E-04 -3.07660000000E-04 -4.57700000000E-05 + 0.0000000 0.0000000 0.0000000 4.23200000000E-05 -4.30900000000E-05 -1.10430000000E-04 + 0.0000000 0.0000000 0.0000000 -3.07800000000E-04 2.97270000000E-04 1.57600000000E-04 + 0.0000000 0.0000000 0.0000000 -4.29800000000E-05 -9.37400000000E-05 2.54900000000E-05 + 0.0000000 0.0000000 0.0000000 -8.82400000000E-05 1.19610000000E-04 2.64900000000E-05 + 0.0000000 0.0000000 0.0000000 -2.28000000000E-05 -2.74880000000E-04 -1.42000000000E-05 + 0.0000000 0.0000000 0.0000000 1.72700000000E-05 4.46100000000E-05 1.00770000000E-04 + 0.0000000 0.0000000 0.0000000 6.54100000000E-05 -3.64320000000E-04 7.78100000000E-05 + 0.0000000 0.0000000 0.0000000 -7.24000000000E-06 6.14000000000E-06 -4.35000000000E-06 + 0.0000000 0.0000000 0.0000000 -7.35900000000E-05 6.19900000000E-05 3.03000000000E-06 + 0.0000000 0.0000000 0.0000000 5.33800000000E-05 -9.06800000000E-05 9.37500000000E-05 + 0.0000000 0.0000000 0.0000000 5.06000000000E-06 -9.66000000000E-06 7.35800000000E-05 + 0.0000000 0.0000000 0.0000000 -1.61800000000E-05 -5.60000000000E-05 9.67400000000E-05 + 0.0000000 0.0000000 0.0000000 -9.51000000000E-06 -5.65600000000E-05 -9.69900000000E-05 + 0.0000000 0.0000000 0.0000000 3.93000000000E-06 -5.95500000000E-05 1.30300000000E-05 + 0.0000000 0.0000000 0.0000000 5.84000000000E-06 6.08530000000E-04 1.28600000000E-05 + 0.0000000 0.0000000 0.0000000 1.58000000000E-05 -5.61700000000E-05 -9.82400000000E-05 + 0.0000000 0.0000000 0.0000000 -4.64200000000E-05 -5.55000000000E-05 9.76800000000E-05 + 0.0000000 0.0000000 0.0000000 5.92000000000E-06 1.57300000000E-05 -1.20700000000E-05 + 0.0000000 0.0000000 0.0000000 3.98000000000E-06 -4.64400000000E-05 -1.28300000000E-05 + 0.0000000 0.0000000 0.0000000 6.95800000000E-05 3.01000000000E-05 -1.13230000000E-04 + 0.0000000 0.0000000 0.0000000 1.17000000000E-06 -3.67910000000E-04 -7.61400000000E-05 + 0.0000000 0.0000000 0.0000000 -2.42500000000E-05 1.17850000000E-04 -2.42400000000E-05 + 0.0000000 0.0000000 0.0000000 -7.41800000000E-05 -2.85930000000E-04 2.28000000000E-06 + 0.0000000 0.0000000 0.0000000 -2.47000000000E-06 -7.13400000000E-05 -7.68100000000E-05 + 0.0000000 0.0000000 0.0000000 6.65800000000E-05 -1.16400000000E-05 -7.86200000000E-05 + 0.0000000 0.0000000 0.0000000 -7.42600000000E-05 3.28000000000E-06 -2.38000000000E-06 + 0.0000000 0.0000000 0.0000000 -2.31900000000E-05 7.93200000000E-05 1.32600000000E-05 + 0.0000000 0.0000000 0.0000000 -6.05860000000E-04 -4.58430000000E-04 4.50780000000E-04 + 0.0000000 0.0000000 0.0000000 -2.09460000000E-04 9.63800000000E-05 -2.86380000000E-04 + 0.0000000 0.0000000 0.0000000 -4.50900000000E-04 9.65320000000E-04 -2.97140000000E-04 + 0.0000000 0.0000000 0.0000000 9.54300000000E-05 5.75590000000E-04 -1.64840000000E-04 + 0.0000000 0.0000000 0.0000000 2.36140000000E-04 -3.08370000000E-04 4.95700000000E-05 + 0.0000000 0.0000000 0.0000000 -1.53730000000E-04 -4.28800000000E-05 1.09360000000E-04 + 0.0000000 0.0000000 0.0000000 -3.18710000000E-04 -2.96260000000E-04 1.39410000000E-04 + 0.0000000 0.0000000 0.0000000 -4.36900000000E-05 1.02410000000E-04 2.50000000000E-07 + 0.0000000 0.0000000 0.0000000 -3.69197000000E-03 -5.12131000000E-03 3.72178000000E-03 + 0.0000000 0.0000000 0.0000000 -5.24435000000E-03 3.85497000000E-03 -3.72050000000E-03 + 0.0000000 0.0000000 0.0000000 3.47264000000E-03 -5.04435000000E-03 3.45096000000E-03 + 0.0000000 0.0000000 0.0000000 -2.64330000000E-04 4.01700000000E-05 8.99500000000E-05 + 0.0000000 0.0000000 0.0000000 -3.80560000000E-04 5.44600000000E-05 1.43800000000E-05 + 0.0000000 0.0000000 0.0000000 4.59700000000E-05 2.02100000000E-05 -2.65600000000E-05 + 0.0000000 0.0000000 0.0000000 -5.13106000000E-03 -3.75897000000E-03 3.82553000000E-03 + 0.0000000 0.0000000 0.0000000 1.22280000000E-04 -9.80600000000E-05 9.13600000000E-05 + 0.0755899 0.0000000 0.0000000 -1.56715600000E-02 3.77904000000E-03 3.77904000000E-03 + 0.0000000 0.0000000 0.0000000 -7.25000000000E-06 6.37000000000E-05 5.14600000000E-05 + 0.0000000 0.0000000 0.0000000 4.32552000000E-03 -3.53780000000E-03 -3.53780000000E-03 + 0.0000000 0.0000000 0.0000000 -7.45460000000E-04 8.22800000000E-05 -1.96810000000E-04 + 0.0000000 0.0000000 0.0000000 -7.25000000000E-06 5.14600000000E-05 6.37000000000E-05 + 0.0000000 0.0000000 0.0000000 -2.94620000000E-04 3.81700000000E-05 3.81700000000E-05 + 0.0000000 0.0000000 0.0000000 -7.45460000000E-04 -1.96810000000E-04 8.22800000000E-05 + 0.0000000 0.0000000 0.0000000 -3.47030000000E-04 1.13220000000E-04 1.13220000000E-04 + 0.0755899 0.0000000 0.0000000 -1.58668000000E-02 3.38561000000E-03 3.38561000000E-03 + 0.0000000 0.0000000 0.0000000 -9.87000000000E-06 6.07200000000E-05 5.37600000000E-05 + 0.0000000 0.0000000 0.0000000 -3.39740000000E-04 1.07390000000E-04 1.07390000000E-04 + 0.0000000 0.0000000 0.0000000 -7.54010000000E-04 -2.05060000000E-04 8.98600000000E-05 + 0.0000000 0.0000000 0.0000000 -9.87000000000E-06 5.37600000000E-05 6.07200000000E-05 + 0.0000000 0.0000000 0.0000000 -2.94560000000E-04 3.82200000000E-05 3.82200000000E-05 + 0.0000000 0.0000000 0.0000000 -7.54010000000E-04 8.98600000000E-05 -2.05060000000E-04 + 0.0000000 0.0000000 0.0000000 4.51230000000E-03 -3.92374000000E-03 -3.92374000000E-03 + 0.0000000 0.0000000 0.0000000 5.49055000000E-03 -3.62989000000E-03 4.07556000000E-03 + 0.0000000 0.0000000 0.0000000 2.23560000000E-04 -2.15050000000E-04 -2.45410000000E-04 + 0.0000000 0.0000000 0.0000000 5.49055000000E-03 4.07556000000E-03 -3.62989000000E-03 + 0.0000000 0.0000000 0.0000000 -2.60500000000E-05 -3.41700000000E-05 -4.02400000000E-05 + 0.0000000 0.0000000 0.0000000 -2.60500000000E-05 -4.02400000000E-05 -3.41700000000E-05 + 0.0000000 0.0000000 0.0000000 3.83780000000E-04 -5.11000000000E-05 1.35060000000E-04 + 0.0000000 0.0000000 0.0000000 2.23560000000E-04 -2.45410000000E-04 -2.15050000000E-04 + 0.0000000 0.0000000 0.0000000 3.83780000000E-04 1.35060000000E-04 -5.11000000000E-05 + 0.0000000 0.0000000 0.0000000 3.40540000000E-04 -1.90220000000E-04 3.38410000000E-04 + 0.0000000 0.0000000 0.0000000 2.89600000000E-04 9.90000000000E-05 -2.46980000000E-04 + 0.0000000 0.0000000 0.0000000 3.40540000000E-04 3.38410000000E-04 -1.90220000000E-04 + 0.0000000 0.0000000 0.0000000 2.89200000000E-05 -5.80500000000E-05 -5.16800000000E-05 + 0.0000000 0.0000000 0.0000000 2.89200000000E-05 -5.16800000000E-05 -5.80500000000E-05 + 0.0000000 0.0000000 0.0000000 9.34900000000E-05 -2.54000000000E-05 1.37830000000E-04 + 0.0000000 0.0000000 0.0000000 2.89600000000E-04 -2.46980000000E-04 9.90000000000E-05 + 0.0000000 0.0000000 0.0000000 9.34900000000E-05 1.37830000000E-04 -2.54000000000E-05 + 0.0000000 0.0000000 0.0000000 1.29100000000E-05 5.26400000000E-05 5.26400000000E-05 + 0.0000000 0.0000000 0.0000000 3.36600000000E-05 3.78300000000E-05 3.69700000000E-05 + 0.0000000 0.0000000 0.0000000 -2.08800000000E-05 -6.49000000000E-05 -6.49000000000E-05 + 0.0000000 0.0000000 0.0000000 3.24700000000E-05 -2.65800000000E-05 -4.97900000000E-05 + 0.0000000 0.0000000 0.0000000 3.36600000000E-05 3.69700000000E-05 3.78300000000E-05 + 0.0000000 0.0000000 0.0000000 6.12000000000E-06 3.89700000000E-05 3.89700000000E-05 + 0.0000000 0.0000000 0.0000000 3.24700000000E-05 -4.97900000000E-05 -2.65800000000E-05 + 0.0000000 0.0000000 0.0000000 -3.28800000000E-05 -2.66000000000E-05 -2.66000000000E-05 + 0.0000000 0.0000000 0.0000000 1.27600000000E-05 5.26200000000E-05 5.26200000000E-05 + 0.0000000 0.0000000 0.0000000 3.04200000000E-05 3.85100000000E-05 3.51100000000E-05 + 0.0000000 0.0000000 0.0000000 -3.11200000000E-05 -2.64700000000E-05 -2.64700000000E-05 + 0.0000000 0.0000000 0.0000000 2.87800000000E-05 -4.78600000000E-05 -2.42500000000E-05 + 0.0000000 0.0000000 0.0000000 3.04200000000E-05 3.51100000000E-05 3.85100000000E-05 + 0.0000000 0.0000000 0.0000000 6.31000000000E-06 3.94600000000E-05 3.94600000000E-05 + 0.0000000 0.0000000 0.0000000 2.87800000000E-05 -2.42500000000E-05 -4.78600000000E-05 + 0.0000000 0.0000000 0.0000000 -2.01100000000E-05 -6.58200000000E-05 -6.58200000000E-05 + 0.0000000 0.0000000 0.0000000 2.80470000000E-04 9.28500000000E-05 -2.38860000000E-04 + 0.0000000 0.0000000 0.0000000 3.31840000000E-04 -1.83030000000E-04 3.24750000000E-04 + 0.0000000 0.0000000 0.0000000 2.80470000000E-04 -2.38860000000E-04 9.28500000000E-05 + 0.0000000 0.0000000 0.0000000 8.93100000000E-05 1.32830000000E-04 -2.13400000000E-05 + 0.0000000 0.0000000 0.0000000 8.93100000000E-05 -2.13400000000E-05 1.32830000000E-04 + 0.0000000 0.0000000 0.0000000 2.87600000000E-05 -5.22600000000E-05 -5.79100000000E-05 + 0.0000000 0.0000000 0.0000000 3.31840000000E-04 3.24750000000E-04 -1.83030000000E-04 + 0.0000000 0.0000000 0.0000000 2.87600000000E-05 -5.79100000000E-05 -5.22600000000E-05 + 0.0000000 0.0000000 0.0000000 2.16440000000E-04 -2.06270000000E-04 -2.40350000000E-04 + 0.0000000 0.0000000 0.0000000 5.28549000000E-03 -3.23786000000E-03 3.68020000000E-03 + 0.0000000 0.0000000 0.0000000 2.16440000000E-04 -2.40350000000E-04 -2.06270000000E-04 + 0.0000000 0.0000000 0.0000000 3.79710000000E-04 1.35660000000E-04 -5.06500000000E-05 + 0.0000000 0.0000000 0.0000000 3.79710000000E-04 -5.06500000000E-05 1.35660000000E-04 + 0.0000000 0.0000000 0.0000000 -2.34700000000E-05 -3.95100000000E-05 -3.58200000000E-05 + 0.0000000 0.0000000 0.0000000 5.28549000000E-03 3.68020000000E-03 -3.23786000000E-03 + 0.0000000 0.0000000 0.0000000 -2.34700000000E-05 -3.58200000000E-05 -3.95100000000E-05 + 0.0755899 0.0000000 0.0000000 -2.62037500000E-02 -4.17367000000E-03 -4.17367000000E-03 + 0.0000000 0.0000000 0.0000000 1.54860000000E-04 -6.15400000000E-05 -5.42000000000E-05 + 0.0000000 0.0000000 0.0000000 -5.86187000000E-03 3.61802000000E-03 3.61802000000E-03 + 0.0000000 0.0000000 0.0000000 -5.82620000000E-04 2.04540000000E-04 -8.95000000000E-05 + 0.0000000 0.0000000 0.0000000 1.54860000000E-04 -5.42000000000E-05 -6.15400000000E-05 + 0.0000000 0.0000000 0.0000000 -9.50320000000E-04 -3.89700000000E-05 -3.89700000000E-05 + 0.0000000 0.0000000 0.0000000 -5.82620000000E-04 -8.95000000000E-05 2.04540000000E-04 + 0.0000000 0.0000000 0.0000000 -1.00129000000E-03 1.91440000000E-04 1.91440000000E-04 + -0.0755899 0.0000000 0.0000000 2.62037500000E-02 4.17367000000E-03 4.17367000000E-03 + 0.0000000 0.0000000 0.0000000 -1.54860000000E-04 6.15400000000E-05 5.42000000000E-05 + 0.0000000 0.0000000 0.0000000 1.00129000000E-03 -1.91440000000E-04 -1.91440000000E-04 + 0.0000000 0.0000000 0.0000000 5.82620000000E-04 8.95000000000E-05 -2.04540000000E-04 + 0.0000000 0.0000000 0.0000000 -1.54860000000E-04 5.42000000000E-05 6.15400000000E-05 + 0.0000000 0.0000000 0.0000000 9.50320000000E-04 3.89700000000E-05 3.89700000000E-05 + 0.0000000 0.0000000 0.0000000 5.82620000000E-04 -2.04540000000E-04 8.95000000000E-05 + 0.0000000 0.0000000 0.0000000 5.86187000000E-03 -3.61802000000E-03 -3.61802000000E-03 + 0.0000000 0.0000000 0.0000000 -4.68306000000E-03 3.54903000000E-03 -3.09124000000E-03 + 0.0000000 0.0000000 0.0000000 3.84770000000E-04 -8.65600000000E-05 -3.51010000000E-04 + 0.0000000 0.0000000 0.0000000 -4.68306000000E-03 -3.09124000000E-03 3.54903000000E-03 + 0.0000000 0.0000000 0.0000000 1.34650000000E-04 -1.61370000000E-04 6.32600000000E-05 + 0.0000000 0.0000000 0.0000000 1.34650000000E-04 6.32600000000E-05 -1.61370000000E-04 + 0.0000000 0.0000000 0.0000000 -2.66800000000E-04 2.48100000000E-05 5.90800000000E-05 + 0.0000000 0.0000000 0.0000000 3.84770000000E-04 -3.51010000000E-04 -8.65600000000E-05 + 0.0000000 0.0000000 0.0000000 -2.66800000000E-04 5.90800000000E-05 2.48100000000E-05 + 0.0000000 0.0000000 0.0000000 -2.55590000000E-04 1.03080000000E-04 -2.55310000000E-04 + 0.0000000 0.0000000 0.0000000 -3.10560000000E-04 -1.96560000000E-04 3.43210000000E-04 + 0.0000000 0.0000000 0.0000000 -2.55590000000E-04 -2.55310000000E-04 1.03080000000E-04 + 0.0000000 0.0000000 0.0000000 -8.29000000000E-05 1.36930000000E-04 -2.58100000000E-05 + 0.0000000 0.0000000 0.0000000 -8.29000000000E-05 -2.58100000000E-05 1.36930000000E-04 + 0.0000000 0.0000000 0.0000000 -1.91400000000E-05 -4.96000000000E-05 -5.91100000000E-05 + 0.0000000 0.0000000 0.0000000 -3.10560000000E-04 3.43210000000E-04 -1.96560000000E-04 + 0.0000000 0.0000000 0.0000000 -1.91400000000E-05 -5.91100000000E-05 -4.96000000000E-05 + 0.0000000 0.0000000 0.0000000 4.42800000000E-05 -5.32700000000E-05 -5.32700000000E-05 + 0.0000000 0.0000000 0.0000000 -3.71900000000E-05 -3.41600000000E-05 -3.43200000000E-05 + 0.0000000 0.0000000 0.0000000 9.57000000000E-06 4.03700000000E-05 4.03700000000E-05 + 0.0000000 0.0000000 0.0000000 -3.70500000000E-05 4.89900000000E-05 2.11300000000E-05 + 0.0000000 0.0000000 0.0000000 -3.71900000000E-05 -3.43200000000E-05 -3.41600000000E-05 + 0.0000000 0.0000000 0.0000000 6.07600000000E-05 -3.95200000000E-05 -3.95200000000E-05 + 0.0000000 0.0000000 0.0000000 -3.70500000000E-05 2.11300000000E-05 4.89900000000E-05 + 0.0000000 0.0000000 0.0000000 2.12600000000E-05 5.22600000000E-05 5.22600000000E-05 + 0.0000000 0.0000000 0.0000000 -4.42800000000E-05 5.32700000000E-05 5.32700000000E-05 + 0.0000000 0.0000000 0.0000000 3.71900000000E-05 3.41600000000E-05 3.43200000000E-05 + 0.0000000 0.0000000 0.0000000 -2.12600000000E-05 -5.22600000000E-05 -5.22600000000E-05 + 0.0000000 0.0000000 0.0000000 3.70500000000E-05 -2.11300000000E-05 -4.89900000000E-05 + 0.0000000 0.0000000 0.0000000 3.71900000000E-05 3.43200000000E-05 3.41600000000E-05 + 0.0000000 0.0000000 0.0000000 -6.07600000000E-05 3.95200000000E-05 3.95200000000E-05 + 0.0000000 0.0000000 0.0000000 3.70500000000E-05 -4.89900000000E-05 -2.11300000000E-05 + 0.0000000 0.0000000 0.0000000 -9.57000000000E-06 -4.03700000000E-05 -4.03700000000E-05 + 0.0000000 0.0000000 0.0000000 3.10560000000E-04 1.96560000000E-04 -3.43210000000E-04 + 0.0000000 0.0000000 0.0000000 2.55590000000E-04 -1.03080000000E-04 2.55310000000E-04 + 0.0000000 0.0000000 0.0000000 3.10560000000E-04 -3.43210000000E-04 1.96560000000E-04 + 0.0000000 0.0000000 0.0000000 1.91400000000E-05 5.91100000000E-05 4.96000000000E-05 + 0.0000000 0.0000000 0.0000000 1.91400000000E-05 4.96000000000E-05 5.91100000000E-05 + 0.0000000 0.0000000 0.0000000 8.29000000000E-05 2.58100000000E-05 -1.36930000000E-04 + 0.0000000 0.0000000 0.0000000 2.55590000000E-04 2.55310000000E-04 -1.03080000000E-04 + 0.0000000 0.0000000 0.0000000 8.29000000000E-05 -1.36930000000E-04 2.58100000000E-05 + 0.0000000 0.0000000 0.0000000 -3.84770000000E-04 8.65600000000E-05 3.51010000000E-04 + 0.0000000 0.0000000 0.0000000 4.68306000000E-03 -3.54903000000E-03 3.09124000000E-03 + 0.0000000 0.0000000 0.0000000 -3.84770000000E-04 3.51010000000E-04 8.65600000000E-05 + 0.0000000 0.0000000 0.0000000 2.66800000000E-04 -5.90800000000E-05 -2.48100000000E-05 + 0.0000000 0.0000000 0.0000000 2.66800000000E-04 -2.48100000000E-05 -5.90800000000E-05 + 0.0000000 0.0000000 0.0000000 -1.34650000000E-04 -6.32600000000E-05 1.61370000000E-04 + 0.0000000 0.0000000 0.0000000 4.68306000000E-03 3.09124000000E-03 -3.54903000000E-03 + 0.0000000 0.0000000 0.0000000 -1.34650000000E-04 1.61370000000E-04 -6.32600000000E-05 + -0.0755899 0.0000000 0.0000000 2.56240000000E-02 3.01467000000E-03 3.01467000000E-03 + 0.0000000 0.0000000 0.0000000 -1.50860000000E-04 6.28300000000E-05 5.10900000000E-05 + 0.0000000 0.0000000 0.0000000 5.64650000000E-03 -3.25123000000E-03 -3.25123000000E-03 + 0.0000000 0.0000000 0.0000000 5.93540000000E-04 -2.16200000000E-04 1.01670000000E-04 + 0.0000000 0.0000000 0.0000000 -1.50860000000E-04 5.10900000000E-05 6.28300000000E-05 + 0.0000000 0.0000000 0.0000000 9.40870000000E-04 3.74400000000E-05 3.74400000000E-05 + 0.0000000 0.0000000 0.0000000 5.93540000000E-04 1.01670000000E-04 -2.16200000000E-04 + 0.0000000 0.0000000 0.0000000 9.86460000000E-04 -1.80700000000E-04 -1.80700000000E-04 + 0.0755899 0.0000000 0.0000000 -2.56240000000E-02 -3.01467000000E-03 -3.01467000000E-03 + 0.0000000 0.0000000 0.0000000 1.50860000000E-04 -6.28300000000E-05 -5.10900000000E-05 + 0.0000000 0.0000000 0.0000000 -9.86460000000E-04 1.80700000000E-04 1.80700000000E-04 + 0.0000000 0.0000000 0.0000000 -5.93540000000E-04 -1.01670000000E-04 2.16200000000E-04 + 0.0000000 0.0000000 0.0000000 1.50860000000E-04 -5.10900000000E-05 -6.28300000000E-05 + 0.0000000 0.0000000 0.0000000 -9.40870000000E-04 -3.74400000000E-05 -3.74400000000E-05 + 0.0000000 0.0000000 0.0000000 -5.93540000000E-04 2.16200000000E-04 -1.01670000000E-04 + 0.0000000 0.0000000 0.0000000 -5.64650000000E-03 3.25123000000E-03 3.25123000000E-03 + 0.0000000 0.0000000 0.0000000 4.88816000000E-03 -3.91114000000E-03 3.48002000000E-03 + 0.0000000 0.0000000 0.0000000 -3.77570000000E-04 8.57700000000E-05 3.45110000000E-04 + 0.0000000 0.0000000 0.0000000 4.88816000000E-03 3.48002000000E-03 -3.91114000000E-03 + 0.0000000 0.0000000 0.0000000 -1.38420000000E-04 1.57570000000E-04 -6.76100000000E-05 + 0.0000000 0.0000000 0.0000000 -1.38420000000E-04 -6.76100000000E-05 1.57570000000E-04 + 0.0000000 0.0000000 0.0000000 2.72560000000E-04 -2.61100000000E-05 -5.90700000000E-05 + 0.0000000 0.0000000 0.0000000 -3.77570000000E-04 3.45110000000E-04 8.57700000000E-05 + 0.0000000 0.0000000 0.0000000 2.72560000000E-04 -5.90700000000E-05 -2.61100000000E-05 + 0.0000000 0.0000000 0.0000000 2.74600000000E-04 -1.17240000000E-04 2.63490000000E-04 + 0.0000000 0.0000000 0.0000000 3.22300000000E-04 2.05640000000E-04 -3.52730000000E-04 + 0.0000000 0.0000000 0.0000000 2.74600000000E-04 2.63490000000E-04 -1.17240000000E-04 + 0.0000000 0.0000000 0.0000000 8.30600000000E-05 -1.35890000000E-04 2.68800000000E-05 + 0.0000000 0.0000000 0.0000000 8.30600000000E-05 2.68800000000E-05 -1.35890000000E-04 + 0.0000000 0.0000000 0.0000000 2.18500000000E-05 4.81200000000E-05 5.91100000000E-05 + 0.0000000 0.0000000 0.0000000 3.22300000000E-04 -3.52730000000E-04 2.05640000000E-04 + 0.0000000 0.0000000 0.0000000 2.18500000000E-05 5.91100000000E-05 4.81200000000E-05 + 0.0000000 0.0000000 0.0000000 -4.44100000000E-05 5.19900000000E-05 5.19900000000E-05 + 0.0000000 0.0000000 0.0000000 4.05100000000E-05 4.20200000000E-05 3.78400000000E-05 + 0.0000000 0.0000000 0.0000000 -1.22700000000E-05 -3.93400000000E-05 -3.93400000000E-05 + 0.0000000 0.0000000 0.0000000 4.35500000000E-05 -5.30000000000E-05 -2.54100000000E-05 + 0.0000000 0.0000000 0.0000000 4.05100000000E-05 3.78400000000E-05 4.20200000000E-05 + 0.0000000 0.0000000 0.0000000 -6.05600000000E-05 3.87400000000E-05 3.87400000000E-05 + 0.0000000 0.0000000 0.0000000 4.35500000000E-05 -2.54100000000E-05 -5.30000000000E-05 + 0.0000000 0.0000000 0.0000000 -2.31800000000E-05 -5.15600000000E-05 -5.15600000000E-05 + 0.0000000 0.0000000 0.0000000 4.44100000000E-05 -5.19900000000E-05 -5.19900000000E-05 + 0.0000000 0.0000000 0.0000000 -4.05100000000E-05 -4.20200000000E-05 -3.78400000000E-05 + 0.0000000 0.0000000 0.0000000 2.31800000000E-05 5.15600000000E-05 5.15600000000E-05 + 0.0000000 0.0000000 0.0000000 -4.35500000000E-05 2.54100000000E-05 5.30000000000E-05 + 0.0000000 0.0000000 0.0000000 -4.05100000000E-05 -3.78400000000E-05 -4.20200000000E-05 + 0.0000000 0.0000000 0.0000000 6.05600000000E-05 -3.87400000000E-05 -3.87400000000E-05 + 0.0000000 0.0000000 0.0000000 -4.35500000000E-05 5.30000000000E-05 2.54100000000E-05 + 0.0000000 0.0000000 0.0000000 1.22700000000E-05 3.93400000000E-05 3.93400000000E-05 + 0.0000000 0.0000000 0.0000000 -3.22300000000E-04 -2.05640000000E-04 3.52730000000E-04 + 0.0000000 0.0000000 0.0000000 -2.74600000000E-04 1.17240000000E-04 -2.63490000000E-04 + 0.0000000 0.0000000 0.0000000 -3.22300000000E-04 3.52730000000E-04 -2.05640000000E-04 + 0.0000000 0.0000000 0.0000000 -2.18500000000E-05 -5.91100000000E-05 -4.81200000000E-05 + 0.0000000 0.0000000 0.0000000 -2.18500000000E-05 -4.81200000000E-05 -5.91100000000E-05 + 0.0000000 0.0000000 0.0000000 -8.30600000000E-05 -2.68800000000E-05 1.35890000000E-04 + 0.0000000 0.0000000 0.0000000 -2.74600000000E-04 -2.63490000000E-04 1.17240000000E-04 + 0.0000000 0.0000000 0.0000000 -8.30600000000E-05 1.35890000000E-04 -2.68800000000E-05 + 0.0000000 0.0000000 0.0000000 3.77570000000E-04 -8.57700000000E-05 -3.45110000000E-04 + 0.0000000 0.0000000 0.0000000 -4.88816000000E-03 3.91114000000E-03 -3.48002000000E-03 + 0.0000000 0.0000000 0.0000000 3.77570000000E-04 -3.45110000000E-04 -8.57700000000E-05 + 0.0000000 0.0000000 0.0000000 -2.72560000000E-04 5.90700000000E-05 2.61100000000E-05 + 0.0000000 0.0000000 0.0000000 -2.72560000000E-04 2.61100000000E-05 5.90700000000E-05 + 0.0000000 0.0000000 0.0000000 1.38420000000E-04 6.76100000000E-05 -1.57570000000E-04 + 0.0000000 0.0000000 0.0000000 -4.88816000000E-03 -3.48002000000E-03 3.91114000000E-03 + 0.0000000 0.0000000 0.0000000 1.38420000000E-04 -1.57570000000E-04 6.76100000000E-05 + 0.0755899 0.0000000 0.0000000 -1.70884300000E-02 5.38640000000E-03 3.92850000000E-03 + 0.0000000 0.0000000 0.0000000 1.35670000000E-04 -7.86900000000E-05 5.05800000000E-05 + 0.0000000 0.0000000 0.0000000 -4.44605000000E-03 5.02468000000E-03 3.62973000000E-03 + 0.0000000 0.0000000 0.0000000 -7.28530000000E-04 6.38100000000E-05 -9.14800000000E-05 + 0.0000000 0.0000000 0.0000000 1.24330000000E-04 -1.57200000000E-05 5.20100000000E-05 + 0.0000000 0.0000000 0.0000000 -5.80650000000E-04 3.66100000000E-05 3.60400000000E-05 + 0.0000000 0.0000000 0.0000000 -7.18290000000E-04 -1.59910000000E-04 1.97250000000E-04 + 0.0000000 0.0000000 0.0000000 -7.09140000000E-04 1.82990000000E-04 1.85040000000E-04 + 0.0000000 0.0755899 0.0000000 4.80452000000E-03 -1.74717800000E-02 3.23788000000E-03 + 0.0000000 0.0000000 0.0000000 -8.26600000000E-05 1.33240000000E-04 5.47100000000E-05 + 0.0000000 0.0000000 0.0000000 1.74420000000E-04 2.68230000000E-04 2.58260000000E-04 + 0.0000000 0.0000000 0.0000000 6.97200000000E-05 2.51920000000E-04 -3.61690000000E-04 + 0.0000000 0.0000000 0.0000000 -8.21500000000E-05 8.23500000000E-05 6.14100000000E-05 + 0.0000000 0.0000000 0.0000000 3.28150000000E-04 3.42300000000E-05 3.83700000000E-05 + 0.0000000 0.0000000 0.0000000 -2.27740000000E-04 2.33600000000E-04 -3.44690000000E-04 + 0.0000000 0.0000000 0.0000000 5.33342000000E-03 -3.47770000000E-03 -3.49329000000E-03 + 0.0000000 0.0000000 0.0000000 -3.08564000000E-03 5.13605000000E-03 -3.08108000000E-03 + 0.0000000 0.0000000 0.0000000 2.43300000000E-04 -2.30760000000E-04 -3.51540000000E-04 + 0.0000000 0.0000000 0.0000000 4.08007000000E-03 5.48278000000E-03 -3.61449000000E-03 + 0.0000000 0.0000000 0.0000000 1.16030000000E-04 -1.80280000000E-04 -4.16900000000E-05 + 0.0000000 0.0000000 0.0000000 4.44000000000E-06 -2.82000000000E-06 -1.48930000000E-04 + 0.0000000 0.0000000 0.0000000 1.61000000000E-05 2.46700000000E-05 5.96700000000E-05 + 0.0000000 0.0000000 0.0000000 3.58730000000E-04 -3.15950000000E-04 -2.03460000000E-04 + 0.0000000 0.0000000 0.0000000 9.23500000000E-05 1.30440000000E-04 -4.76300000000E-05 + 0.0000000 0.0000000 0.0000000 1.83960000000E-04 -7.04580000000E-04 1.83200000000E-04 + 0.0000000 0.0000000 0.0000000 -1.68290000000E-04 -7.24810000000E-04 2.04540000000E-04 + 0.0000000 0.0000000 0.0000000 3.36630000000E-04 3.45160000000E-04 -1.95600000000E-04 + 0.0000000 0.0000000 0.0000000 -1.23640000000E-04 9.54900000000E-05 -5.16300000000E-05 + 0.0000000 0.0000000 0.0000000 -1.43500000000E-05 -4.27700000000E-05 5.22100000000E-05 + 0.0000000 0.0000000 0.0000000 2.48200000000E-05 -4.30500000000E-05 5.19900000000E-05 + 0.0000000 0.0000000 0.0000000 -3.06600000000E-04 3.47700000000E-04 -1.98880000000E-04 + 0.0000000 0.0000000 0.0000000 1.35040000000E-04 9.60500000000E-05 -5.00600000000E-05 + 0.0000000 0.0000000 0.0000000 7.97600000000E-05 -7.91100000000E-05 6.31300000000E-05 + 0.0000000 0.0000000 0.0000000 3.51700000000E-05 3.22830000000E-04 3.80400000000E-05 + 0.0000000 0.0000000 0.0000000 -5.97800000000E-05 -9.43400000000E-05 4.80100000000E-05 + 0.0000000 0.0000000 0.0000000 -4.33600000000E-05 3.40660000000E-04 2.55000000000E-05 + 0.0000000 0.0000000 0.0000000 3.39000000000E-05 3.72400000000E-05 4.18900000000E-05 + 0.0000000 0.0000000 0.0000000 7.25600000000E-05 -2.71100000000E-05 3.84300000000E-05 + 0.0000000 0.0000000 0.0000000 -3.90300000000E-05 2.04900000000E-05 4.99800000000E-05 + 0.0000000 0.0000000 0.0000000 -4.55000000000E-05 -1.44800000000E-05 5.15800000000E-05 + 0.0000000 0.0000000 0.0000000 -1.58300000000E-05 1.25380000000E-04 5.31900000000E-05 + 0.0000000 0.0000000 0.0000000 3.41400000000E-05 -5.84010000000E-04 3.59300000000E-05 + 0.0000000 0.0000000 0.0000000 -3.97400000000E-05 1.63100000000E-05 -1.36000000000E-04 + 0.0000000 0.0000000 0.0000000 4.58500000000E-05 2.19400000000E-05 6.17700000000E-05 + 0.0000000 0.0000000 0.0000000 3.37100000000E-05 3.14000000000E-05 3.43500000000E-05 + 0.0000000 0.0000000 0.0000000 -2.70000000000E-05 7.28300000000E-05 3.97800000000E-05 + 0.0000000 0.0000000 0.0000000 2.07400000000E-05 1.94100000000E-05 6.28800000000E-05 + 0.0000000 0.0000000 0.0000000 -3.24000000000E-06 2.08000000000E-06 -1.50800000000E-04 + 0.0000000 0.0000000 0.0000000 2.44370000000E-04 6.58300000000E-05 -3.53730000000E-04 + 0.0000000 0.0000000 0.0000000 2.56950000000E-04 1.80340000000E-04 2.56050000000E-04 + 0.0000000 0.0000000 0.0000000 3.48150000000E-04 -3.71680000000E-04 8.32500000000E-05 + 0.0000000 0.0000000 0.0000000 9.35900000000E-05 4.24710000000E-04 -2.49400000000E-05 + 0.0000000 0.0000000 0.0000000 1.78800000000E-05 5.05000000000E-05 5.65700000000E-05 + 0.0000000 0.0000000 0.0000000 1.73200000000E-05 -3.99200000000E-05 -1.36970000000E-04 + 0.0000000 0.0000000 0.0000000 3.28630000000E-04 3.25090000000E-04 -1.77690000000E-04 + 0.0000000 0.0000000 0.0000000 9.48600000000E-05 -1.25260000000E-04 -5.22100000000E-05 + 0.0000000 0.0000000 0.0000000 7.15100000000E-05 -7.33700000000E-04 -9.97100000000E-05 + 0.0000000 0.0000000 0.0000000 4.85235000000E-03 -4.05570000000E-03 3.23798000000E-03 + 0.0000000 0.0000000 0.0000000 -3.80550000000E-04 3.58660000000E-04 8.92100000000E-05 + 0.0000000 0.0000000 0.0000000 4.21440000000E-04 9.47900000000E-05 -2.60100000000E-05 + 0.0000000 0.0000000 0.0000000 3.36390000000E-04 -4.28400000000E-05 2.54900000000E-05 + 0.0000000 0.0000000 0.0000000 -9.23200000000E-05 -5.52800000000E-05 5.07500000000E-05 + 0.0000000 0.0000000 0.0000000 5.28310000000E-03 3.68543000000E-03 -3.25281000000E-03 + 0.0000000 0.0000000 0.0000000 -1.75550000000E-04 1.19910000000E-04 -3.81600000000E-05 + 0.0755899 0.0000000 0.0000000 -2.50336000000E-02 -5.59415000000E-03 -4.36035000000E-03 + 0.0000000 0.0000000 0.0000000 1.10700000000E-05 8.19000000000E-05 -5.32700000000E-05 + 0.0000000 0.0000000 0.0000000 2.71880000000E-03 -5.13332000000E-03 -3.54899000000E-03 + 0.0000000 0.0000000 0.0000000 -6.00370000000E-04 2.21870000000E-04 -1.94800000000E-04 + 0.0000000 0.0000000 0.0000000 1.93900000000E-05 1.59300000000E-05 -5.27800000000E-05 + 0.0000000 0.0000000 0.0000000 -6.56400000000E-04 -3.33000000000E-05 -3.33800000000E-05 + 0.0000000 0.0000000 0.0000000 -6.13630000000E-04 -1.29140000000E-04 9.23500000000E-05 + 0.0000000 0.0000000 0.0000000 -6.30940000000E-04 1.17290000000E-04 1.16140000000E-04 + 0.0000000 -0.0755899 0.0000000 5.59415000000E-03 2.50336000000E-02 4.36035000000E-03 + 0.0000000 0.0000000 0.0000000 -8.19000000000E-05 -1.10700000000E-05 5.32700000000E-05 + 0.0000000 0.0000000 0.0000000 4.74700000000E-04 -3.34500000000E-04 -3.27430000000E-04 + 0.0000000 0.0000000 0.0000000 -2.27340000000E-04 -3.49080000000E-04 2.31160000000E-04 + 0.0000000 0.0000000 0.0000000 -8.23400000000E-05 2.57100000000E-05 6.08400000000E-05 + 0.0000000 0.0000000 0.0000000 3.27680000000E-04 4.28000000000E-05 3.88500000000E-05 + 0.0000000 0.0000000 0.0000000 6.99400000000E-05 -3.66280000000E-04 2.44730000000E-04 + 0.0000000 0.0000000 0.0000000 5.02750000000E-03 -4.08182000000E-03 -4.06322000000E-03 + 0.0000000 0.0000000 0.0000000 4.08182000000E-03 -5.02750000000E-03 4.06322000000E-03 + 0.0000000 0.0000000 0.0000000 3.66280000000E-04 -6.99400000000E-05 -2.44730000000E-04 + 0.0000000 0.0000000 0.0000000 -3.08337000000E-03 -4.68781000000E-03 3.53362000000E-03 + 0.0000000 0.0000000 0.0000000 -6.19000000000E-06 -1.64200000000E-05 6.45600000000E-05 + 0.0000000 0.0000000 0.0000000 1.08310000000E-04 2.84700000000E-05 -4.38000000000E-05 + 0.0000000 0.0000000 0.0000000 9.24100000000E-05 -4.66700000000E-05 1.31100000000E-04 + 0.0000000 0.0000000 0.0000000 2.53710000000E-04 -2.82940000000E-04 -1.01210000000E-04 + 0.0000000 0.0000000 0.0000000 1.62600000000E-05 5.96800000000E-05 2.47600000000E-05 + 0.0000000 0.0000000 0.0000000 -1.17290000000E-04 6.30940000000E-04 -1.16140000000E-04 + 0.0000000 0.0000000 0.0000000 1.29140000000E-04 6.13630000000E-04 -9.23500000000E-05 + 0.0000000 0.0000000 0.0000000 -2.54230000000E-04 -2.59600000000E-04 1.08720000000E-04 + 0.0000000 0.0000000 0.0000000 7.04100000000E-05 -1.74600000000E-05 -2.59400000000E-05 + 0.0000000 0.0000000 0.0000000 -3.95100000000E-05 -3.31300000000E-05 2.57600000000E-05 + 0.0000000 0.0000000 0.0000000 4.96600000000E-05 -3.36100000000E-05 2.76300000000E-05 + 0.0000000 0.0000000 0.0000000 2.82940000000E-04 -2.53710000000E-04 1.01210000000E-04 + 0.0000000 0.0000000 0.0000000 -5.96800000000E-05 -1.62600000000E-05 -2.47600000000E-05 + 0.0000000 0.0000000 0.0000000 -2.57100000000E-05 8.23400000000E-05 -6.08400000000E-05 + 0.0000000 0.0000000 0.0000000 -4.28000000000E-05 -3.27680000000E-04 -3.88500000000E-05 + 0.0000000 0.0000000 0.0000000 4.55500000000E-05 6.59900000000E-05 -7.53900000000E-05 + 0.0000000 0.0000000 0.0000000 3.45400000000E-05 -3.10000000000E-04 -5.05900000000E-05 + 0.0000000 0.0000000 0.0000000 -3.81100000000E-05 -3.38500000000E-05 -3.82200000000E-05 + 0.0000000 0.0000000 0.0000000 -6.38000000000E-06 2.72700000000E-05 -3.91900000000E-05 + 0.0000000 0.0000000 0.0000000 3.36100000000E-05 -4.96600000000E-05 -2.76300000000E-05 + 0.0000000 0.0000000 0.0000000 3.31300000000E-05 3.95100000000E-05 -2.57600000000E-05 + 0.0000000 0.0000000 0.0000000 -1.59300000000E-05 -1.93900000000E-05 5.27800000000E-05 + 0.0000000 0.0000000 0.0000000 3.33000000000E-05 6.56400000000E-04 3.33800000000E-05 + 0.0000000 0.0000000 0.0000000 -1.46000000000E-05 -9.52200000000E-05 5.78700000000E-05 + 0.0000000 0.0000000 0.0000000 2.17200000000E-05 -9.11200000000E-05 -1.35580000000E-04 + 0.0000000 0.0000000 0.0000000 3.38500000000E-05 3.81100000000E-05 3.82200000000E-05 + 0.0000000 0.0000000 0.0000000 -2.72700000000E-05 6.38000000000E-06 3.91900000000E-05 + 0.0000000 0.0000000 0.0000000 4.66700000000E-05 -9.24100000000E-05 -1.31100000000E-04 + 0.0000000 0.0000000 0.0000000 -2.84700000000E-05 -1.08310000000E-04 4.38000000000E-05 + 0.0000000 0.0000000 0.0000000 3.49080000000E-04 2.27340000000E-04 -2.31160000000E-04 + 0.0000000 0.0000000 0.0000000 3.34500000000E-04 -4.74700000000E-04 3.27430000000E-04 + 0.0000000 0.0000000 0.0000000 2.45410000000E-04 -2.14310000000E-04 2.09050000000E-04 + 0.0000000 0.0000000 0.0000000 1.89500000000E-05 -2.24160000000E-04 4.95300000000E-05 + 0.0000000 0.0000000 0.0000000 9.11200000000E-05 -2.17200000000E-05 1.35580000000E-04 + 0.0000000 0.0000000 0.0000000 9.52200000000E-05 1.46000000000E-05 -5.78700000000E-05 + 0.0000000 0.0000000 0.0000000 2.59600000000E-04 2.54230000000E-04 -1.08720000000E-04 + 0.0000000 0.0000000 0.0000000 1.74600000000E-05 -7.04100000000E-05 2.59400000000E-05 + 0.0000000 0.0000000 0.0000000 -2.21870000000E-04 6.00370000000E-04 1.94800000000E-04 + 0.0000000 0.0000000 0.0000000 5.13332000000E-03 -2.71880000000E-03 3.54899000000E-03 + 0.0000000 0.0000000 0.0000000 2.14310000000E-04 -2.45410000000E-04 -2.09050000000E-04 + 0.0000000 0.0000000 0.0000000 2.24160000000E-04 -1.89500000000E-05 -4.95300000000E-05 + 0.0000000 0.0000000 0.0000000 3.10000000000E-04 -3.45400000000E-05 5.05900000000E-05 + 0.0000000 0.0000000 0.0000000 -6.59900000000E-05 -4.55500000000E-05 7.53900000000E-05 + 0.0000000 0.0000000 0.0000000 4.68781000000E-03 3.08337000000E-03 -3.53362000000E-03 + 0.0000000 0.0000000 0.0000000 1.64200000000E-05 6.19000000000E-06 -6.45600000000E-05 + -0.0755899 0.0000000 0.0000000 2.38809600000E-02 4.62131000000E-03 2.89745000000E-03 + 0.0000000 0.0000000 0.0000000 -9.02000000000E-06 -7.93700000000E-05 5.20800000000E-05 + 0.0000000 0.0000000 0.0000000 -3.10928000000E-03 5.33549000000E-03 3.90995000000E-03 + 0.0000000 0.0000000 0.0000000 6.12310000000E-04 -2.35570000000E-04 2.06840000000E-04 + 0.0000000 0.0000000 0.0000000 -1.99500000000E-05 -1.59000000000E-05 5.25400000000E-05 + 0.0000000 0.0000000 0.0000000 6.60210000000E-04 3.76700000000E-05 3.88200000000E-05 + 0.0000000 0.0000000 0.0000000 6.18790000000E-04 1.35620000000E-04 -9.87500000000E-05 + 0.0000000 0.0000000 0.0000000 6.29890000000E-04 -1.08360000000E-04 -1.08360000000E-04 + 0.0000000 0.0755899 0.0000000 -4.62131000000E-03 -2.38809600000E-02 -2.89745000000E-03 + 0.0000000 0.0000000 0.0000000 7.93700000000E-05 9.02000000000E-06 -5.20800000000E-05 + 0.0000000 0.0000000 0.0000000 -4.73260000000E-04 3.42890000000E-04 3.39930000000E-04 + 0.0000000 0.0000000 0.0000000 2.30670000000E-04 3.57440000000E-04 -2.35300000000E-04 + 0.0000000 0.0000000 0.0000000 7.88200000000E-05 -2.28900000000E-05 -6.35100000000E-05 + 0.0000000 0.0000000 0.0000000 -3.23590000000E-04 -4.03400000000E-05 -3.75200000000E-05 + 0.0000000 0.0000000 0.0000000 -6.55600000000E-05 3.59200000000E-04 -2.40470000000E-04 + 0.0000000 0.0000000 0.0000000 -4.84930000000E-03 3.68485000000E-03 3.69138000000E-03 + 0.0000000 0.0000000 0.0000000 -3.68485000000E-03 4.84930000000E-03 -3.69138000000E-03 + 0.0000000 0.0000000 0.0000000 -3.59200000000E-04 6.55600000000E-05 2.40470000000E-04 + 0.0000000 0.0000000 0.0000000 3.47775000000E-03 4.89386000000E-03 -3.92576000000E-03 + 0.0000000 0.0000000 0.0000000 6.33000000000E-06 1.67800000000E-05 -6.62300000000E-05 + 0.0000000 0.0000000 0.0000000 -1.08870000000E-04 -2.88200000000E-05 4.54200000000E-05 + 0.0000000 0.0000000 0.0000000 -9.59500000000E-05 4.95800000000E-05 -1.35660000000E-04 + 0.0000000 0.0000000 0.0000000 -2.42370000000E-04 2.76020000000E-04 9.06500000000E-05 + 0.0000000 0.0000000 0.0000000 -1.94300000000E-05 -6.39600000000E-05 -2.17400000000E-05 + 0.0000000 0.0000000 0.0000000 1.08360000000E-04 -6.29890000000E-04 1.08360000000E-04 + 0.0000000 0.0000000 0.0000000 -1.35620000000E-04 -6.18790000000E-04 9.87500000000E-05 + 0.0000000 0.0000000 0.0000000 2.65900000000E-04 2.69450000000E-04 -1.11740000000E-04 + 0.0000000 0.0000000 0.0000000 -6.96700000000E-05 1.59200000000E-05 2.67900000000E-05 + 0.0000000 0.0000000 0.0000000 4.02200000000E-05 3.53500000000E-05 -2.70000000000E-05 + 0.0000000 0.0000000 0.0000000 -4.66500000000E-05 2.87300000000E-05 -2.32400000000E-05 + 0.0000000 0.0000000 0.0000000 -2.76020000000E-04 2.42370000000E-04 -9.06500000000E-05 + 0.0000000 0.0000000 0.0000000 6.39600000000E-05 1.94300000000E-05 2.17400000000E-05 + 0.0000000 0.0000000 0.0000000 2.28900000000E-05 -7.88200000000E-05 6.35100000000E-05 + 0.0000000 0.0000000 0.0000000 4.03400000000E-05 3.23590000000E-04 3.75200000000E-05 + 0.0000000 0.0000000 0.0000000 -4.98300000000E-05 -6.97300000000E-05 7.45400000000E-05 + 0.0000000 0.0000000 0.0000000 -3.20300000000E-05 3.15920000000E-04 5.12200000000E-05 + 0.0000000 0.0000000 0.0000000 4.10200000000E-05 3.69500000000E-05 3.80100000000E-05 + 0.0000000 0.0000000 0.0000000 5.17000000000E-06 -2.71300000000E-05 3.91900000000E-05 + 0.0000000 0.0000000 0.0000000 -2.87300000000E-05 4.66500000000E-05 2.32400000000E-05 + 0.0000000 0.0000000 0.0000000 -3.53500000000E-05 -4.02200000000E-05 2.70000000000E-05 + 0.0000000 0.0000000 0.0000000 1.59000000000E-05 1.99500000000E-05 -5.25400000000E-05 + 0.0000000 0.0000000 0.0000000 -3.76700000000E-05 -6.60210000000E-04 -3.88200000000E-05 + 0.0000000 0.0000000 0.0000000 1.42700000000E-05 9.49600000000E-05 -5.81400000000E-05 + 0.0000000 0.0000000 0.0000000 -2.35600000000E-05 9.27900000000E-05 1.35500000000E-04 + 0.0000000 0.0000000 0.0000000 -3.69500000000E-05 -4.10200000000E-05 -3.80100000000E-05 + 0.0000000 0.0000000 0.0000000 2.71300000000E-05 -5.17000000000E-06 -3.91900000000E-05 + 0.0000000 0.0000000 0.0000000 -4.95800000000E-05 9.59500000000E-05 1.35660000000E-04 + 0.0000000 0.0000000 0.0000000 2.88200000000E-05 1.08870000000E-04 -4.54200000000E-05 + 0.0000000 0.0000000 0.0000000 -3.57440000000E-04 -2.30670000000E-04 2.35300000000E-04 + 0.0000000 0.0000000 0.0000000 -3.42890000000E-04 4.73260000000E-04 -3.39930000000E-04 + 0.0000000 0.0000000 0.0000000 -2.50630000000E-04 2.15420000000E-04 -2.12510000000E-04 + 0.0000000 0.0000000 0.0000000 -1.67000000000E-05 2.32550000000E-04 -5.22600000000E-05 + 0.0000000 0.0000000 0.0000000 -9.27900000000E-05 2.35600000000E-05 -1.35500000000E-04 + 0.0000000 0.0000000 0.0000000 -9.49600000000E-05 -1.42700000000E-05 5.81400000000E-05 + 0.0000000 0.0000000 0.0000000 -2.69450000000E-04 -2.65900000000E-04 1.11740000000E-04 + 0.0000000 0.0000000 0.0000000 -1.59200000000E-05 6.96700000000E-05 -2.67900000000E-05 + 0.0000000 0.0000000 0.0000000 2.35570000000E-04 -6.12310000000E-04 -2.06840000000E-04 + 0.0000000 0.0000000 0.0000000 -5.33549000000E-03 3.10928000000E-03 -3.90995000000E-03 + 0.0000000 0.0000000 0.0000000 -2.15420000000E-04 2.50630000000E-04 2.12510000000E-04 + 0.0000000 0.0000000 0.0000000 -2.32550000000E-04 1.67000000000E-05 5.22600000000E-05 + 0.0000000 0.0000000 0.0000000 -3.15920000000E-04 3.20300000000E-05 -5.12200000000E-05 + 0.0000000 0.0000000 0.0000000 6.97300000000E-05 4.98300000000E-05 -7.45400000000E-05 + 0.0000000 0.0000000 0.0000000 -4.89386000000E-03 -3.47775000000E-03 3.92576000000E-03 + 0.0000000 0.0000000 0.0000000 -1.67800000000E-05 -6.33000000000E-06 6.62300000000E-05 + -0.0755899 0.0000000 0.0000000 1.74718300000E-02 -4.80434000000E-03 -3.23782000000E-03 + 0.0000000 0.0000000 0.0000000 -1.33140000000E-04 8.26800000000E-05 -5.47200000000E-05 + 0.0000000 0.0000000 0.0000000 4.05585000000E-03 -4.85231000000E-03 -3.23800000000E-03 + 0.0000000 0.0000000 0.0000000 7.33810000000E-04 -7.14500000000E-05 9.98300000000E-05 + 0.0000000 0.0000000 0.0000000 -1.25260000000E-04 1.56600000000E-05 -5.32600000000E-05 + 0.0000000 0.0000000 0.0000000 5.84000000000E-04 -3.42800000000E-05 -3.60300000000E-05 + 0.0000000 0.0000000 0.0000000 7.24860000000E-04 1.68290000000E-04 -2.04530000000E-04 + 0.0000000 0.0000000 0.0000000 7.04610000000E-04 -1.83940000000E-04 -1.83210000000E-04 + 0.0000000 -0.0755899 0.0000000 -5.38652000000E-03 1.70885100000E-02 -3.92848000000E-03 + 0.0000000 0.0000000 0.0000000 7.86400000000E-05 -1.35650000000E-04 -5.05700000000E-05 + 0.0000000 0.0000000 0.0000000 -1.80390000000E-04 -2.56990000000E-04 -2.56130000000E-04 + 0.0000000 0.0000000 0.0000000 -6.59100000000E-05 -2.44380000000E-04 3.53750000000E-04 + 0.0000000 0.0000000 0.0000000 7.91400000000E-05 -7.98400000000E-05 -6.30800000000E-05 + 0.0000000 0.0000000 0.0000000 -3.22910000000E-04 -3.51800000000E-05 -3.79400000000E-05 + 0.0000000 0.0000000 0.0000000 2.30780000000E-04 -2.43240000000E-04 3.51510000000E-04 + 0.0000000 0.0000000 0.0000000 -5.13613000000E-03 3.08565000000E-03 3.08100000000E-03 + 0.0000000 0.0000000 0.0000000 3.47756000000E-03 -5.33340000000E-03 3.49322000000E-03 + 0.0000000 0.0000000 0.0000000 -2.33670000000E-04 2.27710000000E-04 3.44560000000E-04 + 0.0000000 0.0000000 0.0000000 -3.68565000000E-03 -5.28305000000E-03 3.25289000000E-03 + 0.0000000 0.0000000 0.0000000 -1.20080000000E-04 1.75620000000E-04 3.81100000000E-05 + 0.0000000 0.0000000 0.0000000 -2.16000000000E-06 3.14000000000E-06 1.50880000000E-04 + 0.0000000 0.0000000 0.0000000 -1.95400000000E-05 -2.08400000000E-05 -6.26900000000E-05 + 0.0000000 0.0000000 0.0000000 -3.47700000000E-04 3.06560000000E-04 1.98880000000E-04 + 0.0000000 0.0000000 0.0000000 -9.60000000000E-05 -1.34930000000E-04 5.00300000000E-05 + 0.0000000 0.0000000 0.0000000 -1.83120000000E-04 7.09150000000E-04 -1.85060000000E-04 + 0.0000000 0.0000000 0.0000000 1.59800000000E-04 7.18350000000E-04 -1.97210000000E-04 + 0.0000000 0.0000000 0.0000000 -3.25270000000E-04 -3.28670000000E-04 1.77770000000E-04 + 0.0000000 0.0000000 0.0000000 1.25180000000E-04 -9.49000000000E-05 5.22600000000E-05 + 0.0000000 0.0000000 0.0000000 1.44200000000E-05 4.54300000000E-05 -5.16200000000E-05 + 0.0000000 0.0000000 0.0000000 -2.07100000000E-05 3.89300000000E-05 -4.99600000000E-05 + 0.0000000 0.0000000 0.0000000 3.15870000000E-04 -3.58660000000E-04 2.03490000000E-04 + 0.0000000 0.0000000 0.0000000 -1.30520000000E-04 -9.22600000000E-05 4.75300000000E-05 + 0.0000000 0.0000000 0.0000000 -8.23900000000E-05 8.22200000000E-05 -6.12400000000E-05 + 0.0000000 0.0000000 0.0000000 -3.43500000000E-05 -3.28250000000E-04 -3.82400000000E-05 + 0.0000000 0.0000000 0.0000000 5.52600000000E-05 9.23800000000E-05 -5.08100000000E-05 + 0.0000000 0.0000000 0.0000000 4.27900000000E-05 -3.36340000000E-04 -2.55100000000E-05 + 0.0000000 0.0000000 0.0000000 -3.15200000000E-05 -3.37400000000E-05 -3.43600000000E-05 + 0.0000000 0.0000000 0.0000000 -7.28200000000E-05 2.69900000000E-05 -3.99300000000E-05 + 0.0000000 0.0000000 0.0000000 4.29200000000E-05 -2.48700000000E-05 -5.19900000000E-05 + 0.0000000 0.0000000 0.0000000 4.25600000000E-05 1.43900000000E-05 -5.23200000000E-05 + 0.0000000 0.0000000 0.0000000 1.56700000000E-05 -1.24330000000E-04 -5.20700000000E-05 + 0.0000000 0.0000000 0.0000000 -3.67100000000E-05 5.80680000000E-04 -3.60600000000E-05 + 0.0000000 0.0000000 0.0000000 3.99500000000E-05 -1.72200000000E-05 1.36910000000E-04 + 0.0000000 0.0000000 0.0000000 -5.05400000000E-05 -1.79500000000E-05 -5.66300000000E-05 + 0.0000000 0.0000000 0.0000000 -3.71800000000E-05 -3.39300000000E-05 -4.18200000000E-05 + 0.0000000 0.0000000 0.0000000 2.71700000000E-05 -7.26000000000E-05 -3.86200000000E-05 + 0.0000000 0.0000000 0.0000000 -2.47100000000E-05 -1.61400000000E-05 -5.95700000000E-05 + 0.0000000 0.0000000 0.0000000 2.83000000000E-06 -4.36000000000E-06 1.49080000000E-04 + 0.0000000 0.0000000 0.0000000 -2.51830000000E-04 -6.96400000000E-05 3.61600000000E-04 + 0.0000000 0.0000000 0.0000000 -2.68070000000E-04 -1.74390000000E-04 -2.58250000000E-04 + 0.0000000 0.0000000 0.0000000 -3.58560000000E-04 3.80490000000E-04 -8.91900000000E-05 + 0.0000000 0.0000000 0.0000000 -9.46800000000E-05 -4.21320000000E-04 2.59500000000E-05 + 0.0000000 0.0000000 0.0000000 -2.18700000000E-05 -4.59100000000E-05 -6.16800000000E-05 + 0.0000000 0.0000000 0.0000000 -1.61700000000E-05 3.96800000000E-05 1.35930000000E-04 + 0.0000000 0.0000000 0.0000000 -3.45040000000E-04 -3.36620000000E-04 1.95720000000E-04 + 0.0000000 0.0000000 0.0000000 -9.53800000000E-05 1.23580000000E-04 5.16300000000E-05 + 0.0000000 0.0000000 0.0000000 -6.35900000000E-05 7.28660000000E-04 9.14200000000E-05 + 0.0000000 0.0000000 0.0000000 -5.02443000000E-03 4.44615000000E-03 -3.62963000000E-03 + 0.0000000 0.0000000 0.0000000 3.71860000000E-04 -3.48210000000E-04 -8.31900000000E-05 + 0.0000000 0.0000000 0.0000000 -4.24550000000E-04 -9.35800000000E-05 2.48900000000E-05 + 0.0000000 0.0000000 0.0000000 -3.40620000000E-04 4.32400000000E-05 -2.54900000000E-05 + 0.0000000 0.0000000 0.0000000 9.45500000000E-05 5.97600000000E-05 -4.80500000000E-05 + 0.0000000 0.0000000 0.0000000 -5.48265000000E-03 -4.08006000000E-03 3.61446000000E-03 + 0.0000000 0.0000000 0.0000000 1.80470000000E-04 -1.16110000000E-04 4.16600000000E-05 + 0.0755899 0.0000000 0.0000000 -2.05547100000E-02 -1.48650000000E-04 3.08170000000E-04 + 0.0000000 0.0000000 0.0000000 -2.27260000000E-04 -1.52110000000E-04 3.06030000000E-04 + 0.0000000 0.0000000 0.0000000 -8.14870000000E-04 -1.32500000000E-05 -8.19290000000E-04 + 0.0000000 0.0000000 0.0000000 -6.77950000000E-04 1.57900000000E-04 -1.47860000000E-04 + 0.0000000 0.0000000 0.0000000 -2.55800000000E-05 -1.28500000000E-05 5.55200000000E-05 + 0.0000000 0.0000000 0.0000000 -5.24000000000E-04 -1.30100000000E-05 5.58600000000E-05 + 0.0000000 0.0000000 0.0000000 -5.13730000000E-04 6.70000000000E-06 -5.27530000000E-04 + 0.0000000 0.0000000 0.0000000 -6.59510000000E-04 1.65000000000E-04 1.46360000000E-04 + 0.0000000 0.0000000 0.0000000 8.57556000000E-03 3.93940000000E-04 8.76139000000E-03 + 0.0000000 0.0000000 0.0000000 -3.01600000000E-05 8.59000000000E-06 3.83400000000E-05 + 0.0000000 0.0000000 0.0000000 2.67650000000E-04 -9.23100000000E-05 -1.21140000000E-04 + 0.0000000 0.0000000 0.0000000 -1.17640000000E-04 -8.84300000000E-05 -2.77400000000E-05 + 0.0000000 0.0000000 0.0000000 -1.89900000000E-05 2.71000000000E-06 -1.78500000000E-05 + 0.0000000 0.0000000 0.0000000 3.68690000000E-04 1.28000000000E-06 7.56600000000E-05 + 0.0000000 0.0000000 0.0000000 -3.85442000000E-03 -3.83424000000E-03 5.13094000000E-03 + 0.0000000 0.0000000 0.0000000 5.13138000000E-03 -3.82761000000E-03 -3.79060000000E-03 + 0.0000000 0.0000000 0.0755899 2.94010000000E-04 1.47560000000E-04 -2.05629800000E-02 + 0.0000000 0.0000000 0.0000000 3.06340000000E-04 -1.51770000000E-04 -2.70850000000E-04 + 0.0000000 0.0000000 0.0000000 4.47300000000E-04 7.90000000000E-06 4.50530000000E-04 + 0.0000000 0.0000000 0.0000000 2.07390000000E-04 2.02460000000E-04 3.18780000000E-04 + 0.0000000 0.0000000 0.0000000 5.62200000000E-05 1.26900000000E-05 -2.44000000000E-05 + 0.0000000 0.0000000 0.0000000 5.51100000000E-05 -1.30200000000E-05 9.32000000000E-05 + 0.0000000 0.0000000 0.0000000 1.60670000000E-04 -8.74000000000E-06 1.43800000000E-04 + 0.0000000 0.0000000 0.0000000 -9.62100000000E-05 -2.03080000000E-04 2.93100000000E-04 + 0.0000000 0.0000000 0.0000000 3.81112000000E-03 3.73649000000E-03 5.22043000000E-03 + 0.0000000 0.0000000 0.0000000 3.69000000000E-05 9.50000000000E-07 3.66100000000E-05 + 0.0000000 0.0000000 0.0000000 -2.59400000000E-05 8.89500000000E-05 -1.19930000000E-04 + 0.0000000 0.0000000 0.0000000 -6.65600000000E-05 7.62700000000E-05 -1.61000000000E-06 + 0.0000000 0.0000000 0.0000000 3.37500000000E-05 1.51800000000E-05 -4.33800000000E-05 + 0.0000000 0.0000000 0.0000000 7.36800000000E-05 -2.69000000000E-06 7.34000000000E-05 + 0.0000000 0.0000000 0.0000000 -3.40546000000E-03 3.44197000000E-03 4.93779000000E-03 + 0.0000000 0.0000000 0.0000000 -1.55500000000E-05 9.23000000000E-05 -5.31000000000E-05 + 0.0000000 0.0000000 0.0000000 -2.63240000000E-04 1.45110000000E-04 2.95020000000E-04 + 0.0000000 0.0000000 0.0000000 2.96130000000E-04 1.50770000000E-04 3.05800000000E-04 + 0.0000000 0.0000000 0.0000000 -1.58350000000E-04 -1.64100000000E-04 -6.85120000000E-04 + 0.0000000 0.0000000 0.0000000 -1.65900000000E-05 1.10000000000E-07 -1.88400000000E-05 + 0.0000000 0.0000000 0.0000000 9.44900000000E-05 1.25400000000E-05 5.66000000000E-05 + 0.0000000 0.0000000 0.0000000 -6.33300000000E-05 1.26000000000E-05 5.60000000000E-05 + 0.0000000 0.0000000 0.0000000 1.40230000000E-04 -1.57010000000E-04 -6.52970000000E-04 + 0.0000000 0.0000000 0.0000000 7.11000000000E-06 -3.10000000000E-07 8.54000000000E-06 + 0.0000000 0.0000000 0.0000000 3.54900000000E-05 -1.05600000000E-05 -2.59300000000E-05 + 0.0000000 0.0000000 0.0000000 7.11400000000E-05 -2.34000000000E-06 7.17400000000E-05 + 0.0000000 0.0000000 0.0000000 -6.55200000000E-05 -7.81800000000E-05 2.89090000000E-04 + 0.0000000 0.0000000 0.0000000 -5.94000000000E-06 -7.42400000000E-05 -6.41300000000E-05 + 0.0000000 0.0000000 0.0000000 7.15700000000E-05 -2.93000000000E-06 3.58930000000E-04 + 0.0000000 0.0000000 0.0000000 1.16200000000E-05 7.60000000000E-07 1.26100000000E-05 + 0.0000000 0.0000000 0.0000000 -2.02400000000E-05 -9.72300000000E-05 -1.16850000000E-04 + 0.0000000 0.0000000 0.0000000 -5.05300000000E-05 -8.93800000000E-05 -1.88400000000E-05 + 0.0000000 0.0000000 0.0000000 2.95420000000E-04 1.44920000000E-04 -2.19160000000E-04 + 0.0000000 0.0000000 0.0000000 2.95720000000E-04 -1.46290000000E-04 2.88050000000E-04 + 0.0000000 0.0000000 0.0000000 3.08270000000E-04 -1.94070000000E-04 2.01500000000E-04 + 0.0000000 0.0000000 0.0000000 6.85300000000E-05 1.05000000000E-06 6.87400000000E-05 + 0.0000000 0.0000000 0.0000000 5.61200000000E-05 1.23200000000E-05 -5.22150000000E-04 + 0.0000000 0.0000000 0.0000000 5.59800000000E-05 -1.27600000000E-05 -6.43200000000E-05 + 0.0000000 0.0000000 0.0000000 2.82880000000E-04 1.93360000000E-04 -8.90700000000E-05 + 0.0000000 0.0000000 0.0000000 4.30400000000E-05 -1.16000000000E-06 4.35700000000E-05 + 0.0000000 0.0000000 0.0000000 -2.53100000000E-05 -2.49000000000E-06 -3.07700000000E-05 + 0.0000000 0.0000000 0.0000000 5.02577000000E-03 -3.35109000000E-03 3.42369000000E-03 + 0.0000000 0.0000000 0.0000000 -1.16440000000E-04 8.91300000000E-05 2.59320000000E-04 + 0.0000000 0.0000000 0.0000000 2.84040000000E-04 7.67300000000E-05 -6.51200000000E-05 + 0.0000000 0.0000000 0.0000000 3.62520000000E-04 1.57000000000E-06 3.65570000000E-04 + 0.0000000 0.0000000 0.0000000 -3.95300000000E-05 -1.15900000000E-05 3.62100000000E-05 + 0.0000000 0.0000000 0.0000000 4.93810000000E-03 3.45439000000E-03 -3.47120000000E-03 + 0.0000000 0.0000000 0.0000000 -1.16420000000E-04 1.03310000000E-04 -1.41700000000E-05 + 0.0755899 0.0000000 0.0000000 -2.11622900000E-02 1.56040000000E-04 -3.18020000000E-04 + 0.0000000 0.0000000 0.0000000 3.63630000000E-04 1.45330000000E-04 -2.95330000000E-04 + 0.0000000 0.0000000 0.0000000 -5.21790000000E-04 -2.98280000000E-04 5.21790000000E-04 + 0.0000000 0.0000000 0.0000000 -6.53700000000E-04 1.31470000000E-04 -1.39310000000E-04 + 0.0000000 0.0000000 0.0000000 1.69020000000E-04 1.26300000000E-05 -5.58500000000E-05 + 0.0000000 0.0000000 0.0000000 -7.17690000000E-04 1.29500000000E-05 -5.56200000000E-05 + 0.0000000 0.0000000 0.0000000 -8.10120000000E-04 -2.88280000000E-04 8.10120000000E-04 + 0.0000000 0.0000000 0.0000000 -6.85170000000E-04 1.38730000000E-04 1.55900000000E-04 + 0.0000000 0.0000000 0.0000000 1.40880000000E-03 7.53860000000E-03 -1.40880000000E-03 + 0.0000000 0.0000000 0.0000000 -1.35070000000E-04 1.14330000000E-04 6.97300000000E-05 + 0.0000000 0.0000000 0.0000000 3.90710000000E-04 1.23900000000E-05 4.06800000000E-05 + 0.0000000 0.0000000 0.0000000 -4.33100000000E-05 -1.68800000000E-05 -9.79000000000E-05 + 0.0000000 0.0000000 0.0000000 -1.43380000000E-04 1.07680000000E-04 1.43380000000E-04 + 0.0000000 0.0000000 0.0000000 2.91180000000E-04 7.31400000000E-05 4.96000000000E-06 + 0.0000000 0.0000000 0.0000000 3.30601000000E-03 3.32822000000E-03 -5.04402000000E-03 + 0.0000000 0.0000000 0.0000000 5.23705000000E-03 -3.72111000000E-03 -3.75787000000E-03 + 0.0000000 0.0000000 -0.0755899 3.18020000000E-04 1.56040000000E-04 2.11622900000E-02 + 0.0000000 0.0000000 0.0000000 3.05500000000E-04 -1.52030000000E-04 -3.28360000000E-04 + 0.0000000 0.0000000 0.0000000 1.57340000000E-04 5.99180000000E-04 -1.57340000000E-04 + 0.0000000 0.0000000 0.0000000 -8.82500000000E-05 -3.87720000000E-04 -2.82640000000E-04 + 0.0000000 0.0000000 0.0000000 5.58500000000E-05 1.26300000000E-05 -1.69020000000E-04 + 0.0000000 0.0000000 0.0000000 5.70100000000E-05 -1.26100000000E-05 1.00290000000E-04 + 0.0000000 0.0000000 0.0000000 4.58370000000E-04 -5.98540000000E-04 -4.58370000000E-04 + 0.0000000 0.0000000 0.0000000 2.01390000000E-04 3.88390000000E-04 -3.07920000000E-04 + 0.0000000 0.0000000 0.0000000 -3.35292000000E-03 -3.43261000000E-03 -4.95079000000E-03 + 0.0000000 0.0000000 0.0000000 -6.77900000000E-05 -1.04820000000E-04 6.77900000000E-05 + 0.0000000 0.0000000 0.0000000 9.79000000000E-05 -1.68800000000E-05 4.33100000000E-05 + 0.0000000 0.0000000 0.0000000 8.67000000000E-06 4.07000000000E-06 -7.27100000000E-05 + 0.0000000 0.0000000 0.0000000 -9.02300000000E-05 -9.03500000000E-05 1.17880000000E-04 + 0.0000000 0.0000000 0.0000000 -3.13000000000E-06 -7.50700000000E-05 3.13000000000E-06 + 0.0000000 0.0000000 0.0000000 3.75787000000E-03 -3.72111000000E-03 -5.23705000000E-03 + 0.0000000 0.0000000 0.0000000 9.03600000000E-05 -1.28500000000E-05 -2.17000000000E-05 + 0.0000000 0.0000000 0.0000000 3.28360000000E-04 -1.52030000000E-04 -3.05500000000E-04 + 0.0000000 0.0000000 0.0000000 -2.94800000000E-04 -1.43500000000E-04 -2.95150000000E-04 + 0.0000000 0.0000000 0.0000000 1.39310000000E-04 1.31470000000E-04 6.53700000000E-04 + 0.0000000 0.0000000 0.0000000 8.93000000000E-06 2.61200000000E-05 -8.93000000000E-06 + 0.0000000 0.0000000 0.0000000 -1.00290000000E-04 -1.26100000000E-05 -5.70100000000E-05 + 0.0000000 0.0000000 0.0000000 1.31140000000E-04 -1.27800000000E-05 -5.56600000000E-05 + 0.0000000 0.0000000 0.0000000 -1.55900000000E-04 1.38730000000E-04 6.85170000000E-04 + 0.0000000 0.0000000 0.0000000 -1.83400000000E-05 2.50200000000E-05 1.83400000000E-05 + 0.0000000 0.0000000 0.0000000 -6.97300000000E-05 1.14330000000E-04 1.35070000000E-04 + 0.0000000 0.0000000 0.0000000 -1.00000000000E-06 7.14600000000E-05 1.00000000000E-06 + 0.0000000 0.0000000 0.0000000 1.02700000000E-05 -2.06000000000E-06 -3.63420000000E-04 + 0.0000000 0.0000000 0.0000000 7.27100000000E-05 4.07000000000E-06 -8.67000000000E-06 + 0.0000000 0.0000000 0.0000000 -4.96000000000E-06 7.31400000000E-05 -2.91180000000E-04 + 0.0000000 0.0000000 0.0000000 -6.67100000000E-05 7.90300000000E-05 6.67100000000E-05 + 0.0000000 0.0000000 0.0000000 8.50100000000E-05 2.69400000000E-05 4.42700000000E-05 + 0.0000000 0.0000000 0.0000000 2.17000000000E-05 -1.28500000000E-05 -9.03600000000E-05 + 0.0000000 0.0000000 0.0000000 2.95330000000E-04 1.45330000000E-04 -3.63630000000E-04 + 0.0000000 0.0000000 0.0000000 2.95150000000E-04 -1.43500000000E-04 2.94800000000E-04 + 0.0000000 0.0000000 0.0000000 2.82640000000E-04 -3.87720000000E-04 8.82500000000E-05 + 0.0000000 0.0000000 0.0000000 4.30400000000E-05 1.95460000000E-04 -4.30400000000E-05 + 0.0000000 0.0000000 0.0000000 5.56200000000E-05 1.29500000000E-05 7.17690000000E-04 + 0.0000000 0.0000000 0.0000000 5.56600000000E-05 -1.27800000000E-05 -1.31140000000E-04 + 0.0000000 0.0000000 0.0000000 3.07920000000E-04 3.88390000000E-04 -2.01390000000E-04 + 0.0000000 0.0000000 0.0000000 6.86800000000E-05 -1.95430000000E-04 -6.86800000000E-05 + 0.0000000 0.0000000 0.0000000 -1.30130000000E-04 -1.26090000000E-04 1.30130000000E-04 + 0.0000000 0.0000000 0.0000000 4.95079000000E-03 -3.43261000000E-03 3.35292000000E-03 + 0.0000000 0.0000000 0.0000000 -4.06800000000E-05 1.23900000000E-05 -3.90710000000E-04 + 0.0000000 0.0000000 0.0000000 3.63420000000E-04 -2.06000000000E-06 -1.02700000000E-05 + 0.0000000 0.0000000 0.0000000 2.85140000000E-04 -7.62800000000E-05 -2.85140000000E-04 + 0.0000000 0.0000000 0.0000000 -1.17880000000E-04 -9.03500000000E-05 9.02300000000E-05 + 0.0000000 0.0000000 0.0000000 5.04402000000E-03 3.32822000000E-03 -3.30601000000E-03 + 0.0000000 0.0000000 0.0000000 -4.42700000000E-05 2.69400000000E-05 -8.50100000000E-05 + -0.0755899 0.0000000 0.0000000 2.11379500000E-02 -1.40880000000E-04 2.82640000000E-04 + 0.0000000 0.0000000 0.0000000 -3.71730000000E-04 -1.51810000000E-04 3.05990000000E-04 + 0.0000000 0.0000000 0.0000000 5.19670000000E-04 2.94840000000E-04 -5.19670000000E-04 + 0.0000000 0.0000000 0.0000000 6.58800000000E-04 -1.39750000000E-04 1.47610000000E-04 + 0.0000000 0.0000000 0.0000000 -1.69800000000E-04 -1.26600000000E-05 5.60900000000E-05 + 0.0000000 0.0000000 0.0000000 7.17450000000E-04 -1.23700000000E-05 5.62500000000E-05 + 0.0000000 0.0000000 0.0000000 8.24330000000E-04 3.04880000000E-04 -8.24330000000E-04 + 0.0000000 0.0000000 0.0000000 6.78270000000E-04 -1.32330000000E-04 -1.50360000000E-04 + 0.0000000 0.0000000 0.0000000 -1.60110000000E-03 -6.79085000000E-03 1.60110000000E-03 + 0.0000000 0.0000000 0.0000000 1.31540000000E-04 -1.15450000000E-04 -6.69000000000E-05 + 0.0000000 0.0000000 0.0000000 -3.85100000000E-04 -1.63500000000E-05 -4.44500000000E-05 + 0.0000000 0.0000000 0.0000000 4.18900000000E-05 1.62700000000E-05 9.74800000000E-05 + 0.0000000 0.0000000 0.0000000 1.42460000000E-04 -1.02660000000E-04 -1.42460000000E-04 + 0.0000000 0.0000000 0.0000000 -2.83950000000E-04 -7.52600000000E-05 -5.00000000000E-07 + 0.0000000 0.0000000 0.0000000 -3.69686000000E-03 -3.71165000000E-03 5.23522000000E-03 + 0.0000000 0.0000000 0.0000000 -5.04238000000E-03 3.33798000000E-03 3.37520000000E-03 + 0.0000000 0.0000000 0.0755899 -2.82640000000E-04 -1.40880000000E-04 -2.11379500000E-02 + 0.0000000 0.0000000 0.0000000 -2.95830000000E-04 1.44910000000E-04 3.19800000000E-04 + 0.0000000 0.0000000 0.0000000 -1.46890000000E-04 -5.82350000000E-04 1.46890000000E-04 + 0.0000000 0.0000000 0.0000000 9.68100000000E-05 3.97690000000E-04 2.93270000000E-04 + 0.0000000 0.0000000 0.0000000 -5.60900000000E-05 -1.26600000000E-05 1.69800000000E-04 + 0.0000000 0.0000000 0.0000000 -5.49200000000E-05 1.29400000000E-05 -1.00900000000E-04 + 0.0000000 0.0000000 0.0000000 -4.40190000000E-04 5.83480000000E-04 4.40190000000E-04 + 0.0000000 0.0000000 0.0000000 -2.07600000000E-04 -3.97040000000E-04 3.18860000000E-04 + 0.0000000 0.0000000 0.0000000 3.74007000000E-03 3.80779000000E-03 5.15083000000E-03 + 0.0000000 0.0000000 0.0000000 6.87500000000E-05 1.05540000000E-04 -6.87500000000E-05 + 0.0000000 0.0000000 0.0000000 -9.74800000000E-05 1.62700000000E-05 -4.18900000000E-05 + 0.0000000 0.0000000 0.0000000 -1.33300000000E-05 -2.20000000000E-06 7.67400000000E-05 + 0.0000000 0.0000000 0.0000000 8.83400000000E-05 9.34500000000E-05 -1.22040000000E-04 + 0.0000000 0.0000000 0.0000000 2.25000000000E-06 6.93400000000E-05 -2.25000000000E-06 + 0.0000000 0.0000000 0.0000000 -3.37520000000E-03 3.33798000000E-03 5.04238000000E-03 + 0.0000000 0.0000000 0.0000000 -8.58500000000E-05 1.60600000000E-05 1.90200000000E-05 + 0.0000000 0.0000000 0.0000000 -3.19800000000E-04 1.44910000000E-04 2.95830000000E-04 + 0.0000000 0.0000000 0.0000000 3.02940000000E-04 1.53230000000E-04 3.06210000000E-04 + 0.0000000 0.0000000 0.0000000 -1.47610000000E-04 -1.39750000000E-04 -6.58800000000E-04 + 0.0000000 0.0000000 0.0000000 -6.94000000000E-06 -2.48400000000E-05 6.94000000000E-06 + 0.0000000 0.0000000 0.0000000 1.00900000000E-04 1.29400000000E-05 5.49200000000E-05 + 0.0000000 0.0000000 0.0000000 -1.30130000000E-04 1.27600000000E-05 5.62100000000E-05 + 0.0000000 0.0000000 0.0000000 1.50360000000E-04 -1.32330000000E-04 -6.78270000000E-04 + 0.0000000 0.0000000 0.0000000 1.68100000000E-05 -2.59300000000E-05 -1.68100000000E-05 + 0.0000000 0.0000000 0.0000000 6.69000000000E-05 -1.15450000000E-04 -1.31540000000E-04 + 0.0000000 0.0000000 0.0000000 2.40000000000E-07 -8.11000000000E-05 -2.40000000000E-07 + 0.0000000 0.0000000 0.0000000 -1.18000000000E-05 1.50000000000E-07 3.66520000000E-04 + 0.0000000 0.0000000 0.0000000 -7.67400000000E-05 -2.20000000000E-06 1.33300000000E-05 + 0.0000000 0.0000000 0.0000000 5.00000000000E-07 -7.52600000000E-05 2.83950000000E-04 + 0.0000000 0.0000000 0.0000000 6.60600000000E-05 -7.78700000000E-05 -6.60600000000E-05 + 0.0000000 0.0000000 0.0000000 -9.10900000000E-05 -2.12000000000E-05 -4.50200000000E-05 + 0.0000000 0.0000000 0.0000000 -1.90200000000E-05 1.60600000000E-05 8.58500000000E-05 + 0.0000000 0.0000000 0.0000000 -3.05990000000E-04 -1.51810000000E-04 3.71730000000E-04 + 0.0000000 0.0000000 0.0000000 -3.06210000000E-04 1.53230000000E-04 -3.02940000000E-04 + 0.0000000 0.0000000 0.0000000 -2.93270000000E-04 3.97690000000E-04 -9.68100000000E-05 + 0.0000000 0.0000000 0.0000000 -4.33900000000E-05 -1.93450000000E-04 4.33900000000E-05 + 0.0000000 0.0000000 0.0000000 -5.62500000000E-05 -1.23700000000E-05 -7.17450000000E-04 + 0.0000000 0.0000000 0.0000000 -5.62100000000E-05 1.27600000000E-05 1.30130000000E-04 + 0.0000000 0.0000000 0.0000000 -3.18860000000E-04 -3.97040000000E-04 2.07600000000E-04 + 0.0000000 0.0000000 0.0000000 -6.85900000000E-05 1.93460000000E-04 6.85900000000E-05 + 0.0000000 0.0000000 0.0000000 1.36520000000E-04 1.22490000000E-04 -1.36520000000E-04 + 0.0000000 0.0000000 0.0000000 -5.15083000000E-03 3.80779000000E-03 -3.74007000000E-03 + 0.0000000 0.0000000 0.0000000 4.44500000000E-05 -1.63500000000E-05 3.85100000000E-04 + 0.0000000 0.0000000 0.0000000 -3.66520000000E-04 1.50000000000E-07 1.18000000000E-05 + 0.0000000 0.0000000 0.0000000 -2.89910000000E-04 7.64400000000E-05 2.89910000000E-04 + 0.0000000 0.0000000 0.0000000 1.22040000000E-04 9.34500000000E-05 -8.83400000000E-05 + 0.0000000 0.0000000 0.0000000 -5.23522000000E-03 -3.71165000000E-03 3.69686000000E-03 + 0.0000000 0.0000000 0.0000000 4.50200000000E-05 -2.12000000000E-05 9.10900000000E-05 + -0.0755899 0.0000000 0.0000000 2.05628600000E-02 1.47720000000E-04 -2.94080000000E-04 + 0.0000000 0.0000000 0.0000000 2.19200000000E-04 1.44830000000E-04 -2.95320000000E-04 + 0.0000000 0.0000000 0.0000000 8.19180000000E-04 -1.30900000000E-05 8.14770000000E-04 + 0.0000000 0.0000000 0.0000000 6.85160000000E-04 -1.63740000000E-04 1.58370000000E-04 + 0.0000000 0.0000000 0.0000000 2.44200000000E-05 1.26500000000E-05 -5.64900000000E-05 + 0.0000000 0.0000000 0.0000000 5.22210000000E-04 1.23700000000E-05 -5.58100000000E-05 + 0.0000000 0.0000000 0.0000000 5.27650000000E-04 6.51000000000E-06 5.13820000000E-04 + 0.0000000 0.0000000 0.0000000 6.52940000000E-04 -1.57410000000E-04 -1.40300000000E-04 + 0.0000000 0.0000000 0.0000000 -8.76146000000E-03 3.94130000000E-04 -8.57570000000E-03 + 0.0000000 0.0000000 0.0000000 2.60400000000E-05 -1.03700000000E-05 -3.54000000000E-05 + 0.0000000 0.0000000 0.0000000 -2.59200000000E-04 8.93900000000E-05 1.16650000000E-04 + 0.0000000 0.0000000 0.0000000 1.19970000000E-04 8.91800000000E-05 2.57600000000E-05 + 0.0000000 0.0000000 0.0000000 1.79500000000E-05 2.49000000000E-06 1.88600000000E-05 + 0.0000000 0.0000000 0.0000000 -3.58960000000E-04 -3.20000000000E-06 -7.14400000000E-05 + 0.0000000 0.0000000 0.0000000 3.47124000000E-03 3.45429000000E-03 -4.93795000000E-03 + 0.0000000 0.0000000 0.0000000 -4.93774000000E-03 3.44169000000E-03 3.40531000000E-03 + 0.0000000 0.0000000 -0.0755899 -3.08120000000E-04 -1.48660000000E-04 2.05548000000E-02 + 0.0000000 0.0000000 0.0000000 -2.94790000000E-04 1.45130000000E-04 2.63110000000E-04 + 0.0000000 0.0000000 0.0000000 -4.50500000000E-04 8.12000000000E-06 -4.47570000000E-04 + 0.0000000 0.0000000 0.0000000 -2.01350000000E-04 -1.93710000000E-04 -3.08060000000E-04 + 0.0000000 0.0000000 0.0000000 -5.55200000000E-05 -1.28500000000E-05 2.57000000000E-05 + 0.0000000 0.0000000 0.0000000 -5.66000000000E-05 1.25400000000E-05 -9.45300000000E-05 + 0.0000000 0.0000000 0.0000000 -1.43750000000E-04 -9.08000000000E-06 -1.60910000000E-04 + 0.0000000 0.0000000 0.0000000 8.91400000000E-05 1.93130000000E-04 -2.82630000000E-04 + 0.0000000 0.0000000 0.0000000 -3.42352000000E-03 -3.35096000000E-03 -5.02560000000E-03 + 0.0000000 0.0000000 0.0000000 -3.65500000000E-05 1.18000000000E-06 -3.70900000000E-05 + 0.0000000 0.0000000 0.0000000 2.78100000000E-05 -8.83000000000E-05 1.17500000000E-04 + 0.0000000 0.0000000 0.0000000 6.41500000000E-05 -7.40700000000E-05 5.99000000000E-06 + 0.0000000 0.0000000 0.0000000 -3.62600000000E-05 -1.18600000000E-05 3.97700000000E-05 + 0.0000000 0.0000000 0.0000000 -7.34300000000E-05 -2.90000000000E-06 -7.38700000000E-05 + 0.0000000 0.0000000 0.0000000 3.79063000000E-03 -3.82771000000E-03 -5.13141000000E-03 + 0.0000000 0.0000000 0.0000000 1.89800000000E-05 -8.94700000000E-05 5.06100000000E-05 + 0.0000000 0.0000000 0.0000000 2.70870000000E-04 -1.51580000000E-04 -3.06460000000E-04 + 0.0000000 0.0000000 0.0000000 -2.88060000000E-04 -1.46270000000E-04 -2.95470000000E-04 + 0.0000000 0.0000000 0.0000000 1.48020000000E-04 1.58010000000E-04 6.78040000000E-04 + 0.0000000 0.0000000 0.0000000 1.87400000000E-05 2.80000000000E-07 1.65200000000E-05 + 0.0000000 0.0000000 0.0000000 -9.32100000000E-05 -1.30100000000E-05 -5.53300000000E-05 + 0.0000000 0.0000000 0.0000000 6.41900000000E-05 -1.28500000000E-05 -5.57600000000E-05 + 0.0000000 0.0000000 0.0000000 -1.46430000000E-04 1.64820000000E-04 6.59530000000E-04 + 0.0000000 0.0000000 0.0000000 -8.66000000000E-06 -4.90000000000E-07 -7.26000000000E-06 + 0.0000000 0.0000000 0.0000000 -3.82300000000E-05 8.86000000000E-06 3.01100000000E-05 + 0.0000000 0.0000000 0.0000000 -7.19800000000E-05 -2.23000000000E-06 -7.11400000000E-05 + 0.0000000 0.0000000 0.0000000 6.50100000000E-05 7.66900000000E-05 -2.83910000000E-04 + 0.0000000 0.0000000 0.0000000 1.51000000000E-06 7.63500000000E-05 6.65100000000E-05 + 0.0000000 0.0000000 0.0000000 -7.57200000000E-05 1.05000000000E-06 -3.68910000000E-04 + 0.0000000 0.0000000 0.0000000 -1.26400000000E-05 6.50000000000E-07 -1.15400000000E-05 + 0.0000000 0.0000000 0.0000000 1.40300000000E-05 1.03330000000E-04 1.16690000000E-04 + 0.0000000 0.0000000 0.0000000 5.31100000000E-05 9.21900000000E-05 1.53500000000E-05 + 0.0000000 0.0000000 0.0000000 -3.06120000000E-04 -1.51860000000E-04 2.27220000000E-04 + 0.0000000 0.0000000 0.0000000 -3.05900000000E-04 1.50780000000E-04 -2.96120000000E-04 + 0.0000000 0.0000000 0.0000000 -3.18810000000E-04 2.02540000000E-04 -2.07370000000E-04 + 0.0000000 0.0000000 0.0000000 -6.89500000000E-05 1.27000000000E-06 -6.84900000000E-05 + 0.0000000 0.0000000 0.0000000 -5.59600000000E-05 -1.31900000000E-05 5.23920000000E-04 + 0.0000000 0.0000000 0.0000000 -5.59100000000E-05 1.26500000000E-05 6.32500000000E-05 + 0.0000000 0.0000000 0.0000000 -2.93090000000E-04 -2.03330000000E-04 9.59900000000E-05 + 0.0000000 0.0000000 0.0000000 -4.35600000000E-05 -1.41000000000E-06 -4.27100000000E-05 + 0.0000000 0.0000000 0.0000000 3.06400000000E-05 -2.33000000000E-06 2.52700000000E-05 + 0.0000000 0.0000000 0.0000000 -5.22053000000E-03 3.73670000000E-03 -3.81103000000E-03 + 0.0000000 0.0000000 0.0000000 1.21030000000E-04 -9.23600000000E-05 -2.67830000000E-04 + 0.0000000 0.0000000 0.0000000 -2.89020000000E-04 -7.78500000000E-05 6.56300000000E-05 + 0.0000000 0.0000000 0.0000000 -3.65470000000E-04 1.40000000000E-06 -3.62150000000E-04 + 0.0000000 0.0000000 0.0000000 4.34500000000E-05 1.50000000000E-05 -3.39600000000E-05 + 0.0000000 0.0000000 0.0000000 -5.13100000000E-03 -3.83424000000E-03 3.85425000000E-03 + 0.0000000 0.0000000 0.0000000 1.16840000000E-04 -9.75200000000E-05 2.02900000000E-05 diff --git a/example/Si/reference/DFSET_harmonic b/example/Si/reference/DFSET_harmonic new file mode 100644 index 00000000..11ec16c9 --- /dev/null +++ b/example/Si/reference/DFSET_harmonic @@ -0,0 +1,64 @@ + 0.0188980 0.0000000 0.0000000 -5.21841000000E-03 0.00000000000E+00 0.00000000000E+00 + 0.0000000 0.0000000 0.0000000 1.80000000000E-05 0.00000000000E+00 0.00000000000E+00 + 0.0000000 0.0000000 0.0000000 -1.67570000000E-04 -3.73900000000E-05 -3.73900000000E-05 + 0.0000000 0.0000000 0.0000000 -1.67160000000E-04 3.68500000000E-05 -3.68500000000E-05 + 0.0000000 0.0000000 0.0000000 1.80000000000E-05 0.00000000000E+00 0.00000000000E+00 + 0.0000000 0.0000000 0.0000000 -1.55320000000E-04 0.00000000000E+00 0.00000000000E+00 + 0.0000000 0.0000000 0.0000000 -1.67160000000E-04 -3.68500000000E-05 3.68500000000E-05 + 0.0000000 0.0000000 0.0000000 -1.67570000000E-04 3.73900000000E-05 3.73900000000E-05 + 0.0000000 0.0000000 0.0000000 1.27898000000E-03 9.07020000000E-04 9.07020000000E-04 + 0.0000000 0.0000000 0.0000000 -2.02900000000E-05 1.54600000000E-05 1.33800000000E-05 + 0.0000000 0.0000000 0.0000000 8.13900000000E-05 -9.67000000000E-06 -9.67000000000E-06 + 0.0000000 0.0000000 0.0000000 -2.02900000000E-05 -1.33800000000E-05 -1.54600000000E-05 + 0.0000000 0.0000000 0.0000000 -2.02900000000E-05 1.33800000000E-05 1.54600000000E-05 + 0.0000000 0.0000000 0.0000000 8.13900000000E-05 9.67000000000E-06 9.67000000000E-06 + 0.0000000 0.0000000 0.0000000 -2.02900000000E-05 -1.54600000000E-05 -1.33800000000E-05 + 0.0000000 0.0000000 0.0000000 1.27898000000E-03 -9.07020000000E-04 -9.07020000000E-04 + 0.0000000 0.0000000 0.0000000 7.55300000000E-05 3.72600000000E-05 7.40900000000E-05 + 0.0000000 0.0000000 0.0000000 7.55300000000E-05 -3.72600000000E-05 -7.40900000000E-05 + 0.0000000 0.0000000 0.0000000 7.55300000000E-05 7.40900000000E-05 3.72600000000E-05 + 0.0000000 0.0000000 0.0000000 1.40100000000E-05 -2.44500000000E-05 3.33000000000E-06 + 0.0000000 0.0000000 0.0000000 1.40100000000E-05 3.33000000000E-06 -2.44500000000E-05 + 0.0000000 0.0000000 0.0000000 1.40100000000E-05 -3.33000000000E-06 2.44500000000E-05 + 0.0000000 0.0000000 0.0000000 7.55300000000E-05 -7.40900000000E-05 -3.72600000000E-05 + 0.0000000 0.0000000 0.0000000 1.40100000000E-05 2.44500000000E-05 -3.33000000000E-06 + 0.0000000 0.0000000 0.0000000 9.07000000000E-06 -9.80000000000E-06 9.05000000000E-06 + 0.0000000 0.0000000 0.0000000 -3.95000000000E-06 -1.31100000000E-05 1.31100000000E-05 + 0.0000000 0.0000000 0.0000000 9.07000000000E-06 9.05000000000E-06 -9.80000000000E-06 + 0.0000000 0.0000000 0.0000000 -6.61000000000E-06 9.62000000000E-06 -9.62000000000E-06 + 0.0000000 0.0000000 0.0000000 -6.61000000000E-06 -9.62000000000E-06 9.62000000000E-06 + 0.0000000 0.0000000 0.0000000 9.07000000000E-06 -9.05000000000E-06 9.80000000000E-06 + 0.0000000 0.0000000 0.0000000 -3.95000000000E-06 1.31100000000E-05 -1.31100000000E-05 + 0.0000000 0.0000000 0.0000000 9.07000000000E-06 9.80000000000E-06 -9.05000000000E-06 + 0.0000000 0.0000000 0.0000000 7.10000000000E-06 0.00000000000E+00 0.00000000000E+00 + 0.0000000 0.0000000 0.0000000 -8.30000000000E-07 0.00000000000E+00 0.00000000000E+00 + 0.0000000 0.0000000 0.0000000 -1.23000000000E-06 -3.26000000000E-06 -3.26000000000E-06 + 0.0000000 0.0000000 0.0000000 -1.21000000000E-06 3.20000000000E-06 -3.20000000000E-06 + 0.0000000 0.0000000 0.0000000 -8.30000000000E-07 0.00000000000E+00 0.00000000000E+00 + 0.0000000 0.0000000 0.0000000 8.48000000000E-06 0.00000000000E+00 0.00000000000E+00 + 0.0000000 0.0000000 0.0000000 -1.21000000000E-06 -3.20000000000E-06 3.20000000000E-06 + 0.0000000 0.0000000 0.0000000 -1.23000000000E-06 3.26000000000E-06 3.26000000000E-06 + 0.0000000 0.0000000 0.0000000 -4.04000000000E-06 1.31600000000E-05 1.31600000000E-05 + 0.0000000 0.0000000 0.0000000 8.76000000000E-06 9.47000000000E-06 8.91000000000E-06 + 0.0000000 0.0000000 0.0000000 -6.76000000000E-06 -9.84000000000E-06 -9.84000000000E-06 + 0.0000000 0.0000000 0.0000000 8.76000000000E-06 -8.91000000000E-06 -9.47000000000E-06 + 0.0000000 0.0000000 0.0000000 8.76000000000E-06 8.91000000000E-06 9.47000000000E-06 + 0.0000000 0.0000000 0.0000000 -6.76000000000E-06 9.84000000000E-06 9.84000000000E-06 + 0.0000000 0.0000000 0.0000000 8.76000000000E-06 -9.47000000000E-06 -8.91000000000E-06 + 0.0000000 0.0000000 0.0000000 -4.04000000000E-06 -1.31600000000E-05 -1.31600000000E-05 + 0.0000000 0.0000000 0.0000000 7.48900000000E-05 3.69100000000E-05 -7.36200000000E-05 + 0.0000000 0.0000000 0.0000000 7.48900000000E-05 -3.69100000000E-05 7.36200000000E-05 + 0.0000000 0.0000000 0.0000000 7.48900000000E-05 -7.36200000000E-05 3.69100000000E-05 + 0.0000000 0.0000000 0.0000000 1.40100000000E-05 2.43100000000E-05 3.26000000000E-06 + 0.0000000 0.0000000 0.0000000 1.40100000000E-05 3.26000000000E-06 2.43100000000E-05 + 0.0000000 0.0000000 0.0000000 1.40100000000E-05 -3.26000000000E-06 -2.43100000000E-05 + 0.0000000 0.0000000 0.0000000 7.48900000000E-05 7.36200000000E-05 -3.69100000000E-05 + 0.0000000 0.0000000 0.0000000 1.40100000000E-05 -2.43100000000E-05 -3.26000000000E-06 + 0.0000000 0.0000000 0.0000000 -2.00400000000E-05 -1.55700000000E-05 1.30700000000E-05 + 0.0000000 0.0000000 0.0000000 1.26691000000E-03 -8.83030000000E-04 8.83030000000E-04 + 0.0000000 0.0000000 0.0000000 -2.00400000000E-05 1.30700000000E-05 -1.55700000000E-05 + 0.0000000 0.0000000 0.0000000 8.12500000000E-05 9.43000000000E-06 -9.43000000000E-06 + 0.0000000 0.0000000 0.0000000 8.12500000000E-05 -9.43000000000E-06 9.43000000000E-06 + 0.0000000 0.0000000 0.0000000 -2.00400000000E-05 -1.30700000000E-05 1.55700000000E-05 + 0.0000000 0.0000000 0.0000000 1.26691000000E-03 8.83030000000E-04 -8.83030000000E-04 + 0.0000000 0.0000000 0.0000000 -2.00400000000E-05 1.55700000000E-05 -1.30700000000E-05 diff --git a/example/Si/reference/disp.dat b/example/Si/reference/disp.dat deleted file mode 100644 index 53f9438c..00000000 --- a/example/Si/reference/disp.dat +++ /dev/null @@ -1,64 +0,0 @@ - 0.0377940 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 diff --git a/example/Si/reference/disp3.dat b/example/Si/reference/disp3.dat deleted file mode 100644 index 03821b33..00000000 --- a/example/Si/reference/disp3.dat +++ /dev/null @@ -1,1280 +0,0 @@ - 0.0755899 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0755899 0.0755899 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0755899 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0755899 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0755899 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - -0.0755899 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - -0.0755899 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - -0.0755899 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0755899 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0755899 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0755899 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 -0.0755899 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - -0.0755899 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0755899 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - -0.0755899 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 -0.0755899 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0755899 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0755899 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0755899 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - -0.0755899 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - -0.0755899 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0755899 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0755899 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0755899 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0755899 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 -0.0755899 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - -0.0755899 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0755899 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - -0.0755899 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 -0.0755899 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0755899 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0755899 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0755899 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 -0.0755899 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - -0.0755899 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0755899 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - -0.0755899 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 -0.0755899 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 - 0.0000000 0.0000000 0.0000000 diff --git a/example/Si/reference/force.dat b/example/Si/reference/force.dat deleted file mode 100644 index 8954bcee..00000000 --- a/example/Si/reference/force.dat +++ /dev/null @@ -1,64 +0,0 @@ - -1.04377400000E-02 0.00000000000E+00 0.00000000000E+00 - 4.60900000000E-05 0.00000000000E+00 0.00000000000E+00 - -3.26740000000E-04 -7.42700000000E-05 -7.42700000000E-05 - -3.22830000000E-04 7.43200000000E-05 -7.43200000000E-05 - 4.60900000000E-05 0.00000000000E+00 0.00000000000E+00 - -3.01110000000E-04 0.00000000000E+00 0.00000000000E+00 - -3.22830000000E-04 -7.43200000000E-05 7.43200000000E-05 - -3.26740000000E-04 7.42700000000E-05 7.42700000000E-05 - 2.56750000000E-03 1.84556000000E-03 1.84556000000E-03 - -4.32000000000E-05 3.82800000000E-05 1.54500000000E-05 - 1.54530000000E-04 -1.61600000000E-05 -1.61600000000E-05 - -4.32000000000E-05 -1.54500000000E-05 -3.82800000000E-05 - -4.32000000000E-05 1.54500000000E-05 3.82800000000E-05 - 1.54530000000E-04 1.61600000000E-05 1.61600000000E-05 - -4.32000000000E-05 -3.82800000000E-05 -1.54500000000E-05 - 2.56750000000E-03 -1.84556000000E-03 -1.84556000000E-03 - 1.62890000000E-04 7.41200000000E-05 1.49960000000E-04 - 1.62890000000E-04 -7.41200000000E-05 -1.49960000000E-04 - 1.62890000000E-04 1.49960000000E-04 7.41200000000E-05 - 2.55300000000E-05 -6.09200000000E-05 1.42000000000E-06 - 2.55300000000E-05 1.42000000000E-06 -6.09200000000E-05 - 2.55300000000E-05 -1.42000000000E-06 6.09200000000E-05 - 1.62890000000E-04 -1.49960000000E-04 -7.41200000000E-05 - 2.55300000000E-05 6.09200000000E-05 -1.42000000000E-06 - 1.13400000000E-05 -1.90300000000E-05 2.12900000000E-05 - -5.78000000000E-06 -1.87300000000E-05 1.87300000000E-05 - 1.13400000000E-05 2.12900000000E-05 -1.90300000000E-05 - -2.69000000000E-05 1.53300000000E-05 -1.53300000000E-05 - -2.69000000000E-05 -1.53300000000E-05 1.53300000000E-05 - 1.13400000000E-05 -2.12900000000E-05 1.90300000000E-05 - -5.78000000000E-06 1.87300000000E-05 -1.87300000000E-05 - 1.13400000000E-05 1.90300000000E-05 -2.12900000000E-05 - 2.36200000000E-05 0.00000000000E+00 0.00000000000E+00 - 8.92000000000E-06 0.00000000000E+00 0.00000000000E+00 - 2.41000000000E-06 -1.87700000000E-05 -1.87700000000E-05 - 1.28000000000E-05 -6.06000000000E-06 6.06000000000E-06 - 8.92000000000E-06 0.00000000000E+00 0.00000000000E+00 - 2.62700000000E-05 0.00000000000E+00 0.00000000000E+00 - 1.28000000000E-05 6.06000000000E-06 -6.06000000000E-06 - 2.41000000000E-06 1.87700000000E-05 1.87700000000E-05 - -2.84400000000E-05 3.37200000000E-05 3.37200000000E-05 - 4.30000000000E-06 1.91900000000E-05 1.45100000000E-05 - -1.87000000000E-05 -2.37600000000E-05 -2.37600000000E-05 - 4.30000000000E-06 -1.45100000000E-05 -1.91900000000E-05 - 4.30000000000E-06 1.45100000000E-05 1.91900000000E-05 - -1.87000000000E-05 2.37600000000E-05 2.37600000000E-05 - 4.30000000000E-06 -1.91900000000E-05 -1.45100000000E-05 - -2.84400000000E-05 -3.37200000000E-05 -3.37200000000E-05 - 1.58290000000E-04 7.44400000000E-05 -1.46140000000E-04 - 1.58290000000E-04 -7.44400000000E-05 1.46140000000E-04 - 1.58290000000E-04 -1.46140000000E-04 7.44400000000E-05 - 5.03800000000E-05 3.63100000000E-05 1.13800000000E-05 - 5.03800000000E-05 1.13800000000E-05 3.63100000000E-05 - 5.03800000000E-05 -1.13800000000E-05 -3.63100000000E-05 - 1.58290000000E-04 1.46140000000E-04 -7.44400000000E-05 - 5.03800000000E-05 -3.63100000000E-05 -1.13800000000E-05 - -5.72000000000E-05 -2.37900000000E-05 3.72600000000E-05 - 2.50482000000E-03 -1.73586000000E-03 1.73586000000E-03 - -5.72000000000E-05 3.72600000000E-05 -2.37900000000E-05 - 1.52140000000E-04 2.19900000000E-05 -2.19900000000E-05 - 1.52140000000E-04 -2.19900000000E-05 2.19900000000E-05 - -5.72000000000E-05 -3.72600000000E-05 2.37900000000E-05 - 2.50482000000E-03 1.73586000000E-03 -1.73586000000E-03 - -5.72000000000E-05 2.37900000000E-05 -3.72600000000E-05 diff --git a/example/Si/reference/force3.dat b/example/Si/reference/force3.dat deleted file mode 100644 index b140fd49..00000000 --- a/example/Si/reference/force3.dat +++ /dev/null @@ -1,1280 +0,0 @@ - -2.08515900000E-02 0.00000000000E+00 0.00000000000E+00 - 9.21500000000E-05 0.00000000000E+00 0.00000000000E+00 - -6.54210000000E-04 -1.51160000000E-04 -1.51160000000E-04 - -6.44480000000E-04 1.45510000000E-04 -1.45510000000E-04 - 9.21500000000E-05 0.00000000000E+00 0.00000000000E+00 - -6.01950000000E-04 0.00000000000E+00 0.00000000000E+00 - -6.44480000000E-04 -1.45510000000E-04 1.45510000000E-04 - -6.54210000000E-04 1.51160000000E-04 1.51160000000E-04 - 5.17344000000E-03 3.78188000000E-03 3.78188000000E-03 - -9.47400000000E-05 6.83300000000E-05 4.26300000000E-05 - 3.09860000000E-04 -3.55600000000E-05 -3.55600000000E-05 - -9.47400000000E-05 -4.26300000000E-05 -6.83300000000E-05 - -9.47400000000E-05 4.26300000000E-05 6.83300000000E-05 - 3.09860000000E-04 3.55600000000E-05 3.55600000000E-05 - -9.47400000000E-05 -6.83300000000E-05 -4.26300000000E-05 - 5.17344000000E-03 -3.78188000000E-03 -3.78188000000E-03 - 3.27060000000E-04 1.50850000000E-04 3.01070000000E-04 - 3.27060000000E-04 -1.50850000000E-04 -3.01070000000E-04 - 3.27060000000E-04 3.01070000000E-04 1.50850000000E-04 - 6.33200000000E-05 -1.09170000000E-04 7.72000000000E-06 - 6.33200000000E-05 7.72000000000E-06 -1.09170000000E-04 - 6.33200000000E-05 -7.72000000000E-06 1.09170000000E-04 - 3.27060000000E-04 -3.01070000000E-04 -1.50850000000E-04 - 6.33200000000E-05 1.09170000000E-04 -7.72000000000E-06 - 2.01300000000E-05 -3.93400000000E-05 4.02800000000E-05 - -2.30000000000E-05 -4.48800000000E-05 4.48800000000E-05 - 2.01300000000E-05 4.02800000000E-05 -3.93400000000E-05 - -4.98900000000E-05 3.46900000000E-05 -3.46900000000E-05 - -4.98900000000E-05 -3.46900000000E-05 3.46900000000E-05 - 2.01300000000E-05 -4.02800000000E-05 3.93400000000E-05 - -2.30000000000E-05 4.48800000000E-05 -4.48800000000E-05 - 2.01300000000E-05 3.93400000000E-05 -4.02800000000E-05 - 4.67600000000E-05 0.00000000000E+00 0.00000000000E+00 - 1.74500000000E-05 0.00000000000E+00 0.00000000000E+00 - 9.22000000000E-06 -2.49400000000E-05 -2.49400000000E-05 - 2.06800000000E-05 4.30000000000E-07 -4.30000000000E-07 - 1.74500000000E-05 0.00000000000E+00 0.00000000000E+00 - 5.21600000000E-05 0.00000000000E+00 0.00000000000E+00 - 2.06800000000E-05 -4.30000000000E-07 4.30000000000E-07 - 9.22000000000E-06 2.49400000000E-05 2.49400000000E-05 - -4.58800000000E-05 6.02700000000E-05 6.02700000000E-05 - 1.07700000000E-05 3.69300000000E-05 3.14300000000E-05 - -4.17900000000E-05 -4.36300000000E-05 -4.36300000000E-05 - 1.07700000000E-05 -3.14300000000E-05 -3.69300000000E-05 - 1.07700000000E-05 3.14300000000E-05 3.69300000000E-05 - -4.17900000000E-05 4.36300000000E-05 4.36300000000E-05 - 1.07700000000E-05 -3.69300000000E-05 -3.14300000000E-05 - -4.58800000000E-05 -6.02700000000E-05 -6.02700000000E-05 - 3.14700000000E-04 1.46240000000E-04 -2.91040000000E-04 - 3.14700000000E-04 -1.46240000000E-04 2.91040000000E-04 - 3.14700000000E-04 -2.91040000000E-04 1.46240000000E-04 - 8.80500000000E-05 8.52900000000E-05 1.76500000000E-05 - 8.80500000000E-05 1.76500000000E-05 8.52900000000E-05 - 8.80500000000E-05 -1.76500000000E-05 -8.52900000000E-05 - 3.14700000000E-04 2.91040000000E-04 -1.46240000000E-04 - 8.80500000000E-05 -8.52900000000E-05 -1.76500000000E-05 - -1.06040000000E-04 -5.57700000000E-05 6.26200000000E-05 - 4.96394000000E-03 -3.38408000000E-03 3.38408000000E-03 - -1.06040000000E-04 6.26200000000E-05 -5.57700000000E-05 - 3.03290000000E-04 4.07600000000E-05 -4.07600000000E-05 - 3.03290000000E-04 -4.07600000000E-05 4.07600000000E-05 - -1.06040000000E-04 -6.26200000000E-05 5.57700000000E-05 - 4.96394000000E-03 3.38408000000E-03 -3.38408000000E-03 - -1.06040000000E-04 5.57700000000E-05 -6.26200000000E-05 - -2.08983800000E-02 -2.08983800000E-02 -2.10049000000E-03 - 9.19000000000E-05 9.19000000000E-05 -6.70000000000E-07 - -5.02160000000E-04 1.80520000000E-04 1.43470000000E-04 - -7.96550000000E-04 4.66040000000E-04 -4.51280000000E-04 - 9.18300000000E-05 4.63500000000E-05 4.80000000000E-07 - -6.01650000000E-04 1.71700000000E-05 -2.02000000000E-06 - -4.98800000000E-04 1.65570000000E-04 -1.52430000000E-04 - -7.99560000000E-04 4.71180000000E-04 4.37140000000E-04 - 9.35864000000E-03 9.35864000000E-03 8.14699000000E-03 - -3.01700000000E-05 -3.01700000000E-05 9.53600000000E-05 - 2.69640000000E-04 -1.84000000000E-05 2.02000000000E-06 - -1.48720000000E-04 -7.69900000000E-05 -1.46100000000E-05 - -4.04600000000E-05 7.67000000000E-06 1.22630000000E-04 - 3.46060000000E-04 4.91900000000E-05 7.03000000000E-05 - -1.61740000000E-04 -1.63140000000E-04 7.71000000000E-06 - 1.40199000000E-03 1.58610000000E-03 1.48980000000E-04 - 1.80520000000E-04 -5.02160000000E-04 1.43470000000E-04 - 4.66040000000E-04 -7.96550000000E-04 -4.51280000000E-04 - 6.39350000000E-04 6.39350000000E-04 2.98680000000E-04 - -3.43000000000E-05 -3.43000000000E-05 1.83100000000E-05 - 4.95300000000E-05 2.13900000000E-05 -1.23160000000E-04 - 7.70900000000E-05 7.46000000000E-06 9.43400000000E-05 - 2.25000000000E-05 2.66000000000E-05 -8.13000000000E-06 - 1.61770000000E-04 1.83690000000E-04 2.78000000000E-06 - -1.84000000000E-05 2.69640000000E-04 2.02000000000E-06 - -7.69900000000E-05 -1.48720000000E-04 -1.46100000000E-05 - 6.01200000000E-05 6.01200000000E-05 -7.67800000000E-05 - -1.19200000000E-05 -1.19200000000E-05 -7.27200000000E-05 - -8.89100000000E-05 -8.14800000000E-05 -3.81000000000E-06 - -1.75900000000E-05 -2.39100000000E-05 4.68000000000E-06 - 2.80700000000E-05 -5.50500000000E-05 -1.06600000000E-04 - 5.75200000000E-05 3.42870000000E-04 -7.78600000000E-05 - 4.63500000000E-05 9.18300000000E-05 4.80000000000E-07 - 1.71700000000E-05 -6.01650000000E-04 -2.02000000000E-06 - 2.13900000000E-05 4.95300000000E-05 -1.23160000000E-04 - 7.46000000000E-06 7.70900000000E-05 9.43400000000E-05 - 1.70200000000E-05 1.70200000000E-05 -4.20000000000E-07 - 5.18700000000E-05 5.18700000000E-05 -1.01000000000E-06 - 3.32200000000E-05 7.60300000000E-05 9.63700000000E-05 - -3.49000000000E-06 9.92300000000E-05 -7.46700000000E-05 - 7.67000000000E-06 -4.04600000000E-05 1.22630000000E-04 - 4.91900000000E-05 3.46060000000E-04 7.03000000000E-05 - -8.14800000000E-05 -8.89100000000E-05 -3.81000000000E-06 - -2.39100000000E-05 -1.75900000000E-05 4.68000000000E-06 - 4.24100000000E-05 4.24100000000E-05 7.47700000000E-05 - -1.85000000000E-06 -1.85000000000E-06 8.38600000000E-05 - -2.72100000000E-05 2.66370000000E-04 6.59000000000E-06 - -9.73300000000E-05 -1.57790000000E-04 4.43000000000E-06 - 1.65570000000E-04 -4.98800000000E-04 -1.52430000000E-04 - 4.71180000000E-04 -7.99560000000E-04 4.37140000000E-04 - 2.66000000000E-05 2.25000000000E-05 -8.13000000000E-06 - 1.83690000000E-04 1.61770000000E-04 2.78000000000E-06 - 7.60300000000E-05 3.32200000000E-05 9.63700000000E-05 - 9.92300000000E-05 -3.49000000000E-06 -7.46700000000E-05 - 5.94200000000E-04 5.94200000000E-04 -2.92770000000E-04 - -9.17000000000E-06 -9.17000000000E-06 -3.24500000000E-05 - -1.63140000000E-04 -1.61740000000E-04 7.71000000000E-06 - 1.58610000000E-03 1.40199000000E-03 1.48980000000E-04 - -5.50500000000E-05 2.80700000000E-05 -1.06600000000E-04 - 3.42870000000E-04 5.75200000000E-05 -7.78600000000E-05 - 2.66370000000E-04 -2.72100000000E-05 6.59000000000E-06 - -1.57790000000E-04 -9.73300000000E-05 4.43000000000E-06 - 7.98527000000E-03 7.98527000000E-03 -6.28032000000E-03 - -4.67200000000E-05 -4.67200000000E-05 -1.15090000000E-04 - -2.15120700000E-02 1.52700000000E-04 1.52700000000E-04 - -5.54010000000E-04 -1.44190000000E-04 1.44230000000E-04 - -2.14963200000E-02 -1.62770000000E-04 -1.62770000000E-04 - -5.53060000000E-04 1.45510000000E-04 -1.44840000000E-04 - -5.54010000000E-04 1.44230000000E-04 -1.44190000000E-04 - -1.25643000000E-03 -1.51810000000E-04 -1.51810000000E-04 - -5.53060000000E-04 -1.44840000000E-04 1.45510000000E-04 - -1.25738000000E-03 1.51160000000E-04 1.51160000000E-04 - 1.03475000000E-02 7.10000000000E-06 7.10000000000E-06 - -1.96320000000E-04 7.70000000000E-06 -1.10900000000E-05 - 5.47969000000E-03 3.73870000000E-03 3.73870000000E-03 - -1.97060000000E-04 1.84500000000E-05 -1.43300000000E-05 - -1.96320000000E-04 -1.10900000000E-05 7.70000000000E-06 - 6.20740000000E-04 -2.83000000000E-06 -2.83000000000E-06 - -1.97060000000E-04 -1.43300000000E-05 1.84500000000E-05 - 5.48611000000E-03 -3.74224000000E-03 -3.74224000000E-03 - 6.53150000000E-04 -1.51100000000E-04 1.51450000000E-04 - 4.01100000000E-04 -5.39700000000E-05 -3.13740000000E-04 - 6.53150000000E-04 1.51450000000E-04 -1.51100000000E-04 - 3.87640000000E-04 4.27800000000E-05 3.08180000000E-04 - 3.87640000000E-04 3.08180000000E-04 4.27800000000E-05 - 1.37820000000E-04 -1.03900000000E-04 1.21720000000E-04 - 4.01100000000E-04 -3.13740000000E-04 -5.39700000000E-05 - 1.37820000000E-04 1.21720000000E-04 -1.03900000000E-04 - -1.28500000000E-05 1.38800000000E-05 -1.20400000000E-05 - -4.65000000000E-06 -5.54000000000E-06 7.96000000000E-06 - -1.28500000000E-05 -1.20400000000E-05 1.38800000000E-05 - -3.21700000000E-05 -4.65000000000E-06 2.63000000000E-06 - -3.21700000000E-05 2.63000000000E-06 -4.65000000000E-06 - -2.49100000000E-05 -1.11000000000E-06 2.80000000000E-07 - -4.65000000000E-06 7.96000000000E-06 -5.54000000000E-06 - -2.49100000000E-05 2.80000000000E-07 -1.11000000000E-06 - 5.97000000000E-05 1.25500000000E-05 1.25500000000E-05 - 3.12400000000E-05 -1.27100000000E-05 1.32700000000E-05 - 5.47400000000E-05 -2.46700000000E-05 -2.46700000000E-05 - 3.61900000000E-05 6.10000000000E-07 -4.50000000000E-07 - 3.12400000000E-05 1.32700000000E-05 -1.27100000000E-05 - 6.52700000000E-05 -1.21800000000E-05 -1.21800000000E-05 - 3.61900000000E-05 -4.50000000000E-07 6.10000000000E-07 - 6.02600000000E-05 2.50100000000E-05 2.50100000000E-05 - -7.94300000000E-05 7.67000000000E-06 7.67000000000E-06 - 2.57500000000E-05 7.00000000000E-07 -2.92000000000E-06 - -7.53800000000E-05 9.36000000000E-06 9.36000000000E-06 - 2.55900000000E-05 5.02000000000E-06 -2.10000000000E-06 - 2.57500000000E-05 -2.92000000000E-06 7.00000000000E-07 - -8.67300000000E-05 4.36000000000E-06 4.36000000000E-06 - 2.55900000000E-05 -2.10000000000E-06 5.02000000000E-06 - -9.08700000000E-05 -2.06900000000E-05 -2.06900000000E-05 - 6.28150000000E-04 4.38630000000E-04 -4.36330000000E-04 - 3.88310000000E-04 -2.43020000000E-04 2.77940000000E-04 - 6.28150000000E-04 -4.36330000000E-04 4.38630000000E-04 - 4.01750000000E-04 2.29930000000E-04 -2.73580000000E-04 - 4.01750000000E-04 -2.73580000000E-04 2.29930000000E-04 - 1.62360000000E-04 8.08000000000E-05 -7.29700000000E-05 - 3.88310000000E-04 2.77940000000E-04 -2.43020000000E-04 - 1.62360000000E-04 -7.29700000000E-05 8.08000000000E-05 - 4.86575000000E-03 3.33685000000E-03 -3.32752000000E-03 - 4.86657000000E-03 -3.32221000000E-03 3.33252000000E-03 - 4.86575000000E-03 -3.32752000000E-03 3.33685000000E-03 - 2.05450000000E-04 -2.27200000000E-05 1.04300000000E-05 - 2.05450000000E-04 1.04300000000E-05 -2.27200000000E-05 - 1.98480000000E-04 -2.44000000000E-05 1.85700000000E-05 - 4.86657000000E-03 3.33252000000E-03 -3.32221000000E-03 - 1.98480000000E-04 1.85700000000E-05 -2.44000000000E-05 - -2.01994000000E-02 -1.44460000000E-04 -1.44460000000E-04 - 7.45830000000E-04 1.52020000000E-04 -1.51470000000E-04 - 2.01920500000E-02 -1.59950000000E-04 -1.59950000000E-04 - -7.36480000000E-04 1.45930000000E-04 -1.45850000000E-04 - 7.45830000000E-04 -1.51470000000E-04 1.52020000000E-04 - 4.49000000000E-05 1.44800000000E-04 1.44800000000E-04 - -7.36480000000E-04 -1.45850000000E-04 1.45930000000E-04 - -5.12100000000E-05 1.51440000000E-04 1.51440000000E-04 - 1.94330000000E-04 7.17372000000E-03 7.17372000000E-03 - 3.77000000000E-06 1.31750000000E-04 9.40600000000E-05 - -4.66523000000E-03 -3.42576000000E-03 -3.42576000000E-03 - 4.48000000000E-06 -1.05670000000E-04 -1.19540000000E-04 - 3.77000000000E-06 9.40600000000E-05 1.31750000000E-04 - 4.96000000000E-06 7.34400000000E-05 7.34400000000E-05 - 4.48000000000E-06 -1.19540000000E-04 -1.05670000000E-04 - 4.86687000000E-03 -3.82054000000E-03 -3.82054000000E-03 - 1.08600000000E-05 4.44740000000E-04 4.44540000000E-04 - 2.52680000000E-04 -2.48660000000E-04 -2.88240000000E-04 - 1.08600000000E-05 4.44540000000E-04 4.44740000000E-04 - -2.51180000000E-04 -2.53990000000E-04 -2.84320000000E-04 - -2.51180000000E-04 -2.84320000000E-04 -2.53990000000E-04 - -1.14900000000E-05 9.00900000000E-05 9.68500000000E-05 - 2.52680000000E-04 -2.88240000000E-04 -2.48660000000E-04 - -1.14900000000E-05 9.68500000000E-05 9.00900000000E-05 - 5.37900000000E-05 -9.26500000000E-05 9.34800000000E-05 - -3.76700000000E-05 -8.03300000000E-05 7.92200000000E-05 - 5.37900000000E-05 9.34800000000E-05 -9.26500000000E-05 - -6.41200000000E-05 7.10800000000E-05 -6.90500000000E-05 - -6.41200000000E-05 -6.90500000000E-05 7.10800000000E-05 - 6.56600000000E-05 -7.97800000000E-05 7.91200000000E-05 - -3.76700000000E-05 7.92200000000E-05 -8.03300000000E-05 - 6.56600000000E-05 7.91200000000E-05 -7.97800000000E-05 - 3.16300000000E-05 -1.26200000000E-05 -1.26200000000E-05 - 4.47000000000E-06 1.25500000000E-05 -1.24900000000E-05 - -3.68300000000E-05 -2.48100000000E-05 -2.48100000000E-05 - 4.68000000000E-06 6.30000000000E-07 -1.20000000000E-07 - 4.47000000000E-06 -1.24900000000E-05 1.25500000000E-05 - 3.68400000000E-05 1.30200000000E-05 1.30200000000E-05 - 4.68000000000E-06 -1.20000000000E-07 6.30000000000E-07 - -4.23900000000E-05 2.50300000000E-05 2.50300000000E-05 - -1.22600000000E-05 1.12820000000E-04 1.12820000000E-04 - -6.95000000000E-06 7.66700000000E-05 6.88600000000E-05 - -8.28000000000E-06 -9.57800000000E-05 -9.57800000000E-05 - -6.83000000000E-06 -7.09300000000E-05 -7.42000000000E-05 - -6.95000000000E-06 6.88600000000E-05 7.66700000000E-05 - 3.45000000000E-06 8.27200000000E-05 8.27200000000E-05 - -6.83000000000E-06 -7.42000000000E-05 -7.09300000000E-05 - -5.50000000000E-07 -9.91600000000E-05 -9.91600000000E-05 - -9.66000000000E-06 -1.54160000000E-04 -1.38880000000E-04 - 2.40450000000E-04 -5.01000000000E-05 3.04320000000E-04 - -9.66000000000E-06 -1.38880000000E-04 -1.54160000000E-04 - -2.36600000000E-04 -6.53400000000E-05 3.17320000000E-04 - -2.36600000000E-04 3.17320000000E-04 -6.53400000000E-05 - 1.30800000000E-05 -1.14510000000E-04 -9.73900000000E-05 - 2.40450000000E-04 3.04320000000E-04 -5.01000000000E-05 - 1.30800000000E-05 -9.73900000000E-05 -1.14510000000E-04 - -5.27332000000E-03 -3.83264000000E-03 3.83731000000E-03 - 5.06544000000E-03 -3.44337000000E-03 3.43832000000E-03 - -5.27332000000E-03 3.83731000000E-03 -3.83264000000E-03 - 4.05460000000E-04 1.02330000000E-04 -9.40800000000E-05 - 4.05460000000E-04 -9.40800000000E-05 1.02330000000E-04 - -4.15790000000E-04 -1.01330000000E-04 9.40000000000E-05 - 5.06544000000E-03 3.43832000000E-03 -3.44337000000E-03 - -4.15790000000E-04 9.40000000000E-05 -1.01330000000E-04 - 2.14887700000E-02 -1.44950000000E-04 -1.44950000000E-04 - 5.61890000000E-04 1.52390000000E-04 -1.52530000000E-04 - 2.14729700000E-02 1.37280000000E-04 1.37280000000E-04 - 5.62810000000E-04 -1.51180000000E-04 1.51860000000E-04 - 5.61890000000E-04 -1.52530000000E-04 1.52390000000E-04 - 1.24674000000E-03 1.44630000000E-04 1.44630000000E-04 - 5.62810000000E-04 1.51860000000E-04 -1.51180000000E-04 - 1.24577000000E-03 -1.45300000000E-04 -1.45300000000E-04 - -9.92483000000E-03 7.02000000000E-06 7.02000000000E-06 - 2.04550000000E-04 7.60000000000E-06 -1.11300000000E-05 - -5.27032000000E-03 -3.35074000000E-03 -3.35074000000E-03 - 2.03830000000E-04 -5.60000000000E-07 4.64000000000E-06 - 2.04550000000E-04 -1.11300000000E-05 7.60000000000E-06 - -6.05970000000E-04 -2.86000000000E-06 -2.86000000000E-06 - 2.03830000000E-04 4.64000000000E-06 -5.60000000000E-07 - -5.26416000000E-03 3.34743000000E-03 3.34743000000E-03 - -6.28890000000E-04 1.44040000000E-04 -1.43790000000E-04 - -3.90410000000E-04 4.88000000000E-05 3.03660000000E-04 - -6.28890000000E-04 -1.43790000000E-04 1.44040000000E-04 - -4.03900000000E-04 -6.00900000000E-05 -3.09320000000E-04 - -4.03900000000E-04 -3.09320000000E-04 -6.00900000000E-05 - -1.63350000000E-04 1.15630000000E-04 -9.78100000000E-05 - -3.90410000000E-04 3.03660000000E-04 4.88000000000E-05 - -1.63350000000E-04 -9.78100000000E-05 1.15630000000E-04 - 2.44400000000E-05 -1.50800000000E-05 2.12200000000E-05 - 3.27100000000E-05 2.32400000000E-05 -2.53500000000E-05 - 2.44400000000E-05 2.12200000000E-05 -1.50800000000E-05 - 2.81500000000E-05 -6.87000000000E-06 9.24000000000E-06 - 2.81500000000E-05 9.24000000000E-06 -6.87000000000E-06 - 3.53700000000E-05 -7.78000000000E-06 2.47000000000E-06 - 3.27100000000E-05 -2.53500000000E-05 2.32400000000E-05 - 3.53700000000E-05 2.47000000000E-06 -7.78000000000E-06 - -6.22100000000E-05 -1.28300000000E-05 -1.28300000000E-05 - -3.20900000000E-05 1.25300000000E-05 -1.20400000000E-05 - -6.71500000000E-05 6.10000000000E-07 6.10000000000E-07 - -2.70700000000E-05 -2.47900000000E-05 2.48600000000E-05 - -3.20900000000E-05 -1.20400000000E-05 1.25300000000E-05 - -6.73500000000E-05 1.30200000000E-05 1.30200000000E-05 - -2.70700000000E-05 2.48600000000E-05 -2.47900000000E-05 - -7.23700000000E-05 -2.50000000000E-07 -2.50000000000E-07 - 5.76000000000E-05 7.58000000000E-06 7.58000000000E-06 - -3.65800000000E-05 6.10000000000E-07 -2.89000000000E-06 - 8.46200000000E-05 -1.75000000000E-05 -1.75000000000E-05 - -3.67100000000E-05 5.30000000000E-07 2.28000000000E-06 - -3.65800000000E-05 -2.89000000000E-06 6.10000000000E-07 - 9.62400000000E-05 4.36000000000E-06 4.36000000000E-06 - -3.67100000000E-05 2.28000000000E-06 5.30000000000E-07 - 6.91500000000E-05 6.13000000000E-06 6.13000000000E-06 - -6.53840000000E-04 -4.50630000000E-04 4.52720000000E-04 - -4.03220000000E-04 2.48450000000E-04 -2.88910000000E-04 - -6.53840000000E-04 4.52720000000E-04 -4.50630000000E-04 - -3.89810000000E-04 -2.61600000000E-04 2.93230000000E-04 - -3.89810000000E-04 2.93230000000E-04 -2.61600000000E-04 - -1.38750000000E-04 -8.83200000000E-05 9.61400000000E-05 - -4.03220000000E-04 -2.88910000000E-04 2.48450000000E-04 - -1.38750000000E-04 9.61400000000E-05 -8.83200000000E-05 - -5.07073000000E-03 -3.70490000000E-03 3.73266000000E-03 - -5.07025000000E-03 3.71949000000E-03 -3.72820000000E-03 - -5.07073000000E-03 3.73266000000E-03 -3.70490000000E-03 - -2.07450000000E-04 2.50200000000E-05 -1.84800000000E-05 - -2.07450000000E-04 -1.84800000000E-05 2.50200000000E-05 - -2.14440000000E-04 4.52000000000E-06 -2.92100000000E-05 - -5.07025000000E-03 -3.72820000000E-03 3.71949000000E-03 - -2.14440000000E-04 -2.92100000000E-05 4.52000000000E-06 - -2.10027100000E-02 3.20840000000E-04 2.86250000000E-04 - 2.37970000000E-04 3.15470000000E-04 -2.92930000000E-04 - -6.53980000000E-04 -2.09885100000E-02 -1.45780000000E-04 - -6.44770000000E-04 2.37460000000E-04 -1.46760000000E-04 - -5.96200000000E-05 3.26300000000E-04 -3.01200000000E-04 - -4.50230000000E-04 3.25770000000E-04 2.97480000000E-04 - -6.45070000000E-04 -9.89800000000E-05 1.44300000000E-04 - -6.54030000000E-04 1.67430000000E-04 1.50260000000E-04 - 1.78641000000E-03 8.74462000000E-03 7.18144000000E-03 - -1.57690000000E-04 -2.98400000000E-05 9.44700000000E-05 - 4.08680000000E-03 5.12963000000E-03 3.74429000000E-03 - -3.40400000000E-05 -1.44860000000E-04 -1.41700000000E-05 - -1.46770000000E-04 8.46000000000E-06 1.21820000000E-04 - 2.70070000000E-04 5.26900000000E-05 7.33900000000E-05 - -4.16300000000E-05 -1.02830000000E-04 1.13400000000E-05 - 5.21024000000E-03 -3.77063000000E-03 -3.74772000000E-03 - 3.14000000000E-05 4.65980000000E-04 4.39450000000E-04 - 4.23930000000E-04 -7.50400000000E-05 -2.89350000000E-04 - 4.71990000000E-04 -3.46370000000E-04 3.24000000000E-06 - -8.88800000000E-05 -7.61840000000E-04 -1.45220000000E-04 - 3.63550000000E-04 3.33810000000E-04 4.27500000000E-05 - -3.32000000000E-05 6.75800000000E-05 1.20740000000E-04 - 3.39810000000E-04 -2.85750000000E-04 -1.65070000000E-04 - 5.06500000000E-05 1.22840000000E-04 -2.14200000000E-05 - 7.12000000000E-05 -1.36820000000E-04 -2.20500000000E-05 - 1.48200000000E-05 2.59770000000E-04 8.39000000000E-06 - -3.39400000000E-05 -6.14600000000E-05 -9.81900000000E-05 - -8.78900000000E-05 3.43310000000E-04 -7.18600000000E-05 - -1.22000000000E-05 -1.72400000000E-05 -4.93000000000E-06 - 5.90400000000E-05 -8.58700000000E-05 1.22000000000E-06 - -5.72000000000E-05 5.83400000000E-05 -7.93400000000E-05 - -1.93300000000E-05 -6.86000000000E-06 -7.89100000000E-05 - 3.38400000000E-05 7.52500000000E-05 -9.87000000000E-05 - 2.98400000000E-05 7.47600000000E-05 9.65700000000E-05 - 9.17000000000E-06 6.65900000000E-05 -2.58100000000E-05 - 1.93400000000E-05 -6.00410000000E-04 -2.44000000000E-06 - 4.36000000000E-06 7.48700000000E-05 9.49700000000E-05 - 6.43100000000E-05 7.56000000000E-05 -9.78400000000E-05 - 2.07700000000E-05 1.63200000000E-05 -4.80000000000E-07 - 9.12000000000E-06 7.64700000000E-05 2.38000000000E-05 - -9.68100000000E-05 -3.78900000000E-05 1.24530000000E-04 - -2.71200000000E-05 3.41040000000E-04 7.01000000000E-05 - 1.19400000000E-05 -1.45860000000E-04 1.81400000000E-05 - 5.03000000000E-05 2.78060000000E-04 3.04000000000E-06 - -2.62200000000E-05 4.85800000000E-05 7.70500000000E-05 - -8.05200000000E-05 -1.89000000000E-06 8.33100000000E-05 - 4.57700000000E-05 -2.22500000000E-05 6.04000000000E-06 - -6.16000000000E-06 -1.05990000000E-04 -1.99500000000E-05 - 6.06440000000E-04 4.61070000000E-04 -4.38330000000E-04 - 2.16710000000E-04 -7.05700000000E-05 2.77950000000E-04 - 4.66130000000E-04 -9.44890000000E-04 2.96280000000E-04 - -5.68500000000E-05 -5.60620000000E-04 1.60780000000E-04 - -2.11410000000E-04 3.43010000000E-04 -6.61700000000E-05 - 1.84690000000E-04 5.79900000000E-05 -9.90000000000E-05 - 3.27240000000E-04 3.04330000000E-04 -1.34610000000E-04 - 7.49300000000E-05 -6.99900000000E-05 -5.86000000000E-06 - 3.28470000000E-03 4.91696000000E-03 -3.32538000000E-03 - 5.02878000000E-03 -3.48386000000E-03 3.33391000000E-03 - -3.88092000000E-03 5.22815000000E-03 -3.83033000000E-03 - 2.43120000000E-04 -6.18400000000E-05 -9.34100000000E-05 - 3.56320000000E-04 -7.46800000000E-05 -1.05000000000E-05 - -6.61100000000E-05 -4.51400000000E-05 1.91200000000E-05 - 4.91194000000E-03 3.34929000000E-03 -3.43650000000E-03 - -1.42360000000E-04 7.01500000000E-05 -9.62000000000E-05 - -2.06924700000E-02 -3.30920000000E-04 -2.94140000000E-04 - -6.00500000000E-05 -3.25570000000E-04 3.01040000000E-04 - -6.52340000000E-04 2.06843600000E-02 -1.58130000000E-04 - -6.44270000000E-04 5.35800000000E-05 -1.44190000000E-04 - 2.37510000000E-04 -3.16100000000E-04 2.93130000000E-04 - -7.47030000000E-04 -3.15570000000E-04 -2.89500000000E-04 - -6.44040000000E-04 -1.92050000000E-04 1.46830000000E-04 - -6.54190000000E-04 1.34770000000E-04 1.52130000000E-04 - 8.94340000000E-03 -1.37655000000E-03 -2.48000000000E-06 - -3.40100000000E-05 1.70350000000E-04 -1.18600000000E-05 - -3.08320000000E-03 -5.00478000000E-03 -3.43230000000E-03 - -1.57410000000E-04 5.59400000000E-05 -1.19950000000E-04 - -4.19600000000E-05 7.68500000000E-05 1.45500000000E-05 - 3.46740000000E-04 2.12800000000E-05 3.70000000000E-07 - -1.47150000000E-04 -3.40600000000E-05 -9.59800000000E-05 - 5.13278000000E-03 -3.79659000000E-03 -3.81909000000E-03 - 6.30340000000E-04 -1.74400000000E-04 1.56430000000E-04 - 2.30980000000E-04 -2.26720000000E-04 -3.12940000000E-04 - 1.74230000000E-04 9.56500000000E-04 3.06240000000E-04 - 2.08410000000E-04 5.36640000000E-04 1.54450000000E-04 - -2.29080000000E-04 -3.08280000000E-04 -2.54540000000E-04 - 1.60530000000E-04 -8.29100000000E-05 9.76500000000E-05 - 3.14450000000E-04 -3.15030000000E-04 -1.37070000000E-04 - 7.60300000000E-05 9.38900000000E-05 6.53000000000E-06 - -3.35400000000E-05 6.19700000000E-05 1.00260000000E-04 - -6.15400000000E-05 -3.54790000000E-04 8.22400000000E-05 - 7.15100000000E-05 1.38350000000E-04 2.20400000000E-05 - -1.30600000000E-05 -2.68200000000E-04 1.56000000000E-06 - -8.51600000000E-05 -4.93400000000E-05 7.11000000000E-05 - -1.95200000000E-05 5.18000000000E-06 7.80000000000E-05 - 1.40800000000E-05 2.82600000000E-05 -6.89000000000E-06 - 5.89700000000E-05 8.55500000000E-05 -2.28000000000E-06 - 5.93700000000E-05 -7.52400000000E-05 9.76500000000E-05 - 4.54000000000E-06 -7.47100000000E-05 -9.52900000000E-05 - 8.91000000000E-06 -1.16260000000E-04 -2.39800000000E-05 - 2.03000000000E-05 6.01960000000E-04 8.00000000000E-07 - 2.99300000000E-05 -7.48800000000E-05 -9.59800000000E-05 - 3.94500000000E-05 -7.56200000000E-05 9.89300000000E-05 - 2.01500000000E-05 -1.70700000000E-05 1.26000000000E-06 - 8.93000000000E-06 -2.66900000000E-05 2.60700000000E-05 - 7.82000000000E-06 1.62350000000E-04 -1.57000000000E-06 - 4.95800000000E-05 -2.72760000000E-04 -7.93000000000E-06 - -9.29400000000E-05 5.46800000000E-05 -1.07890000000E-04 - -2.78600000000E-05 -3.35590000000E-04 -7.58600000000E-05 - 4.52400000000E-05 1.75300000000E-05 -3.00000000000E-08 - -2.41000000000E-06 8.92700000000E-05 3.48000000000E-06 - -2.68600000000E-05 -5.46400000000E-05 -7.23400000000E-05 - -8.47500000000E-05 -1.46300000000E-05 -9.99000000000E-05 - 1.48400000000E-05 -1.78740000000E-04 -1.37260000000E-04 - 4.11440000000E-04 -2.21770000000E-04 3.04410000000E-04 - 1.70850000000E-04 3.54810000000E-04 3.90000000000E-06 - 2.40510000000E-04 7.38870000000E-04 -1.33180000000E-04 - 3.79420000000E-04 -2.97610000000E-04 2.30510000000E-04 - -9.72000000000E-06 -9.30500000000E-05 -7.14700000000E-05 - 3.01730000000E-04 2.76360000000E-04 -1.58170000000E-04 - 1.00680000000E-04 -9.90700000000E-05 -2.88700000000E-05 - -3.88072000000E-03 -5.22411000000E-03 3.83465000000E-03 - 4.90185000000E-03 -3.28063000000E-03 3.43704000000E-03 - 3.28527000000E-03 -4.90738000000E-03 3.33461000000E-03 - 3.66530000000E-04 1.39480000000E-04 9.42000000000E-06 - 2.50400000000E-04 -6.58000000000E-06 9.24600000000E-05 - -1.42270000000E-04 -7.68400000000E-05 8.97300000000E-05 - 5.01576000000E-03 3.41867000000E-03 -3.33225000000E-03 - -6.59300000000E-05 3.82800000000E-05 -2.61600000000E-05 - 2.07143300000E-02 3.10450000000E-04 2.97630000000E-04 - 5.25000000000E-05 3.15390000000E-04 -2.91250000000E-04 - 6.44000000000E-04 -2.07053500000E-02 1.54550000000E-04 - 6.54510000000E-04 -5.91600000000E-05 1.52330000000E-04 - -2.43620000000E-04 3.25450000000E-04 -2.99330000000E-04 - 7.53510000000E-04 3.26030000000E-04 3.02540000000E-04 - 6.55070000000E-04 1.97560000000E-04 -1.50200000000E-04 - 6.44580000000E-04 -1.27680000000E-04 -1.44640000000E-04 - -8.35981000000E-03 1.59280000000E-03 -2.87000000000E-06 - 4.23000000000E-05 -1.54690000000E-04 -1.18200000000E-05 - 3.46948000000E-03 5.20858000000E-03 3.80997000000E-03 - 1.67110000000E-04 -3.94800000000E-05 1.09170000000E-04 - 5.35200000000E-05 -9.69100000000E-05 -4.78000000000E-06 - -3.43220000000E-04 -2.40100000000E-05 -4.18000000000E-06 - 1.58510000000E-04 2.08500000000E-05 1.13810000000E-04 - -4.92846000000E-03 3.40009000000E-03 3.41874000000E-03 - -6.03070000000E-04 1.69330000000E-04 -1.39380000000E-04 - -2.16090000000E-04 2.21130000000E-04 3.04610000000E-04 - -1.70390000000E-04 -9.34700000000E-04 -2.87950000000E-04 - -2.40170000000E-04 -5.68780000000E-04 -1.69050000000E-04 - 2.12260000000E-04 3.08920000000E-04 2.37310000000E-04 - -1.84930000000E-04 9.34900000000E-05 -7.14800000000E-05 - -3.01910000000E-04 3.06690000000E-04 1.34500000000E-04 - -1.00370000000E-04 -7.11300000000E-05 6.14000000000E-06 - 4.09300000000E-05 -6.27700000000E-05 -9.60200000000E-05 - 8.35000000000E-05 3.63280000000E-04 -9.93400000000E-05 - -6.46600000000E-05 -1.34120000000E-04 -2.62600000000E-05 - 2.68000000000E-06 2.66760000000E-04 3.60000000000E-06 - 7.83700000000E-05 6.01200000000E-05 -8.40100000000E-05 - 2.77200000000E-05 -1.47200000000E-05 -7.67800000000E-05 - 1.05900000000E-05 -4.60500000000E-05 2.16400000000E-05 - -5.02700000000E-05 -8.27000000000E-05 -8.96000000000E-06 - -5.92600000000E-05 7.56700000000E-05 -9.70500000000E-05 - -4.40000000000E-06 7.60700000000E-05 9.89700000000E-05 - -2.05000000000E-05 9.27800000000E-05 1.03000000000E-06 - -9.83000000000E-06 -6.26600000000E-04 2.55600000000E-05 - -2.99600000000E-05 7.61000000000E-05 9.81000000000E-05 - -3.88900000000E-05 7.54400000000E-05 -9.56100000000E-05 - -9.63000000000E-06 4.23800000000E-05 -2.41300000000E-05 - -2.07100000000E-05 5.18900000000E-05 4.80000000000E-07 - -2.87100000000E-05 -1.43590000000E-04 1.71800000000E-05 - -5.75500000000E-05 2.64240000000E-04 -3.74000000000E-06 - 1.04150000000E-04 -6.76100000000E-05 9.45500000000E-05 - 1.74900000000E-05 3.49400000000E-04 7.62000000000E-05 - -5.76900000000E-05 -2.34500000000E-05 -1.30000000000E-07 - 1.10600000000E-05 -8.09500000000E-05 3.06000000000E-06 - 1.40400000000E-05 5.23400000000E-05 7.56200000000E-05 - 6.22800000000E-05 -1.27000000000E-06 8.32300000000E-05 - -3.46100000000E-05 1.65530000000E-04 1.57760000000E-04 - -4.24530000000E-04 2.26070000000E-04 -3.13370000000E-04 - -1.74090000000E-04 -3.52120000000E-04 3.17000000000E-06 - -2.07400000000E-04 -7.54420000000E-04 1.38020000000E-04 - -3.63870000000E-04 3.18460000000E-04 -2.61020000000E-04 - 3.35900000000E-05 8.31800000000E-05 9.71100000000E-05 - -3.14410000000E-04 -2.86260000000E-04 1.63850000000E-04 - -7.57500000000E-05 1.24650000000E-04 2.16100000000E-05 - 3.48568000000E-03 5.03715000000E-03 -3.43645000000E-03 - -5.11172000000E-03 3.68471000000E-03 -3.83460000000E-03 - -3.68012000000E-03 5.12447000000E-03 -3.70740000000E-03 - -3.71450000000E-04 -1.37330000000E-04 -1.98100000000E-05 - -2.57990000000E-04 7.50000000000E-07 -8.89800000000E-05 - 1.34760000000E-04 5.92800000000E-05 -1.06640000000E-04 - -5.22677000000E-03 -3.81646000000E-03 3.72835000000E-03 - 5.82800000000E-05 -5.51800000000E-05 6.86000000000E-06 - 2.09941200000E-02 -3.21140000000E-04 -3.05970000000E-04 - -2.43320000000E-04 -3.25950000000E-04 2.99540000000E-04 - 6.45940000000E-04 2.09932300000E-02 1.31980000000E-04 - 6.54160000000E-04 -2.43150000000E-04 1.50140000000E-04 - 5.32200000000E-05 -3.15060000000E-04 2.91280000000E-04 - 4.56740000000E-04 -3.15550000000E-04 -2.94430000000E-04 - 6.53850000000E-04 1.04610000000E-04 -1.52110000000E-04 - 6.44410000000E-04 -1.63400000000E-04 -1.46070000000E-04 - -1.18260000000E-03 -8.55658000000E-03 -7.14870000000E-03 - 1.67060000000E-04 4.67800000000E-05 -1.15560000000E-04 - -3.69280000000E-03 -4.93039000000E-03 -3.34538000000E-03 - 4.22900000000E-05 1.61160000000E-04 5.13000000000E-06 - 1.58930000000E-04 -2.78900000000E-05 -1.07180000000E-04 - -2.67360000000E-04 -5.42000000000E-05 -7.42300000000E-05 - 5.37900000000E-05 9.00600000000E-05 1.16400000000E-05 - -5.00234000000E-03 3.36501000000E-03 3.34716000000E-03 - -1.78100000000E-05 -4.72640000000E-04 -4.49700000000E-04 - -4.11950000000E-04 7.11000000000E-05 2.77760000000E-04 - -4.66560000000E-04 3.60500000000E-04 3.03000000000E-06 - 5.69800000000E-05 7.32450000000E-04 1.26980000000E-04 - -3.79960000000E-04 -3.32850000000E-04 -5.95600000000E-05 - 1.00700000000E-05 -5.80400000000E-05 -9.86400000000E-05 - -3.26960000000E-04 2.76950000000E-04 1.57590000000E-04 - -7.52400000000E-05 -1.00910000000E-04 2.93200000000E-05 - -6.51200000000E-05 1.40280000000E-04 3.05800000000E-05 - 7.17000000000E-06 -2.48570000000E-04 -2.02600000000E-05 - 4.00600000000E-05 6.75500000000E-05 1.02520000000E-04 - 8.00300000000E-05 -3.48590000000E-04 8.31900000000E-05 - 7.63000000000E-06 3.05000000000E-05 -7.06000000000E-06 - -5.04700000000E-05 7.78800000000E-05 3.72000000000E-06 - 8.32500000000E-05 -7.77200000000E-05 1.02250000000E-04 - 2.79900000000E-05 8.74000000000E-06 7.16300000000E-05 - -3.43300000000E-05 -7.57600000000E-05 9.58600000000E-05 - -3.01300000000E-05 -7.63200000000E-05 -9.76100000000E-05 - -2.06500000000E-05 -9.21000000000E-05 -2.80000000000E-07 - -9.12000000000E-06 5.77480000000E-04 2.40100000000E-05 - -5.11000000000E-06 -7.59100000000E-05 -9.93200000000E-05 - -6.49000000000E-05 -7.52600000000E-05 9.67900000000E-05 - -9.01000000000E-06 7.29000000000E-06 -2.56600000000E-05 - -2.06200000000E-05 -5.25000000000E-05 -1.24000000000E-06 - 7.67700000000E-05 5.76800000000E-05 -1.04470000000E-04 - 1.79800000000E-05 -3.48390000000E-04 -7.76500000000E-05 - -1.60000000000E-06 1.33460000000E-04 -2.72400000000E-05 - -5.70600000000E-05 -2.63400000000E-04 3.13000000000E-06 - 1.44200000000E-05 -5.39100000000E-05 -7.48000000000E-05 - 8.94700000000E-05 1.16100000000E-05 -7.32000000000E-05 - -5.71500000000E-05 2.30700000000E-05 1.94000000000E-06 - -1.61500000000E-05 9.09300000000E-05 7.00000000000E-06 - -6.27530000000E-04 -4.77550000000E-04 4.51110000000E-04 - -2.30550000000E-04 7.54500000000E-05 -2.88850000000E-04 - -4.72240000000E-04 9.46530000000E-04 -2.97270000000E-04 - 8.85300000000E-05 5.44300000000E-04 -1.60960000000E-04 - 2.29560000000E-04 -3.23570000000E-04 3.64700000000E-05 - -1.60960000000E-04 -6.76400000000E-05 1.20760000000E-04 - -3.39710000000E-04 -3.17420000000E-04 1.37280000000E-04 - -5.10500000000E-05 9.48500000000E-05 -5.62000000000E-06 - -3.68049000000E-03 -5.09597000000E-03 3.73553000000E-03 - -5.23281000000E-03 3.88297000000E-03 -3.72673000000E-03 - 3.48562000000E-03 -5.01378000000E-03 3.46042000000E-03 - -2.46370000000E-04 6.28300000000E-05 8.82000000000E-05 - -3.62400000000E-04 7.03900000000E-05 1.86400000000E-05 - 5.82800000000E-05 2.92400000000E-05 -3.28900000000E-05 - -5.12033000000E-03 -3.74791000000E-03 3.83497000000E-03 - 1.34430000000E-04 -8.48600000000E-05 8.10700000000E-05 - -1.56862300000E-02 3.78027000000E-03 3.78027000000E-03 - -6.41000000000E-06 6.38800000000E-05 5.17300000000E-05 - 4.32597000000E-03 -3.53718000000E-03 -3.53718000000E-03 - -7.44080000000E-04 8.37300000000E-05 -1.97490000000E-04 - -6.41000000000E-06 5.17300000000E-05 6.38800000000E-05 - -2.94520000000E-04 3.84400000000E-05 3.84400000000E-05 - -7.44080000000E-04 -1.97490000000E-04 8.37300000000E-05 - -3.46840000000E-04 1.12670000000E-04 1.12670000000E-04 - -1.58813800000E-02 3.39116000000E-03 3.39116000000E-03 - -2.41000000000E-06 6.78100000000E-05 4.21800000000E-05 - -3.39010000000E-04 1.10230000000E-04 1.10230000000E-04 - -7.46880000000E-04 -1.94030000000E-04 8.23000000000E-05 - -2.41000000000E-06 4.21800000000E-05 6.78100000000E-05 - -2.94770000000E-04 3.48700000000E-05 3.48700000000E-05 - -7.46880000000E-04 8.23000000000E-05 -1.94030000000E-04 - 4.52013000000E-03 -3.93190000000E-03 -3.93190000000E-03 - 5.49376000000E-03 -3.63128000000E-03 4.07834000000E-03 - 2.25530000000E-04 -2.13730000000E-04 -2.46680000000E-04 - 5.49376000000E-03 4.07834000000E-03 -3.63128000000E-03 - -3.79300000000E-05 -4.64200000000E-05 -4.49600000000E-05 - -3.79300000000E-05 -4.49600000000E-05 -4.64200000000E-05 - 3.72480000000E-04 -4.56800000000E-05 1.47760000000E-04 - 2.25530000000E-04 -2.46680000000E-04 -2.13730000000E-04 - 3.72480000000E-04 1.47760000000E-04 -4.56800000000E-05 - 3.43350000000E-04 -1.90000000000E-04 3.41570000000E-04 - 3.02070000000E-04 1.06350000000E-04 -2.55320000000E-04 - 3.43350000000E-04 3.41570000000E-04 -1.90000000000E-04 - 2.53300000000E-05 -6.24300000000E-05 -4.76700000000E-05 - 2.53300000000E-05 -4.76700000000E-05 -6.24300000000E-05 - 9.58800000000E-05 -2.86100000000E-05 1.36980000000E-04 - 3.02070000000E-04 -2.55320000000E-04 1.06350000000E-04 - 9.58800000000E-05 1.36980000000E-04 -2.86100000000E-05 - 1.29700000000E-05 5.29000000000E-05 5.29000000000E-05 - 3.49400000000E-05 3.81100000000E-05 3.71100000000E-05 - -2.41400000000E-05 -7.69200000000E-05 -7.69200000000E-05 - 3.77600000000E-05 -3.88500000000E-05 -3.67200000000E-05 - 3.49400000000E-05 3.71100000000E-05 3.81100000000E-05 - 6.48000000000E-06 3.92500000000E-05 3.92500000000E-05 - 3.77600000000E-05 -3.67200000000E-05 -3.88500000000E-05 - -3.63300000000E-05 -1.39000000000E-05 -1.39000000000E-05 - 5.80000000000E-07 5.98200000000E-05 5.98200000000E-05 - 2.77900000000E-05 3.87100000000E-05 3.16400000000E-05 - -2.62700000000E-05 -3.10000000000E-05 -3.10000000000E-05 - 2.51800000000E-05 -4.48300000000E-05 -2.50300000000E-05 - 2.77900000000E-05 3.16400000000E-05 3.87100000000E-05 - 9.98000000000E-06 4.33800000000E-05 4.33800000000E-05 - 2.51800000000E-05 -2.50300000000E-05 -4.48300000000E-05 - -3.06800000000E-05 -7.34300000000E-05 -7.34300000000E-05 - 2.81580000000E-04 9.41700000000E-05 -2.38270000000E-04 - 3.31660000000E-04 -1.83650000000E-04 3.24600000000E-04 - 2.81580000000E-04 -2.38270000000E-04 9.41700000000E-05 - 1.02040000000E-04 1.20540000000E-04 -1.60000000000E-05 - 1.02040000000E-04 -1.60000000000E-05 1.20540000000E-04 - 4.27400000000E-05 -5.68300000000E-05 -4.50600000000E-05 - 3.31660000000E-04 3.24600000000E-04 -1.83650000000E-04 - 4.27400000000E-05 -4.50600000000E-05 -5.68300000000E-05 - 2.09220000000E-04 -1.98950000000E-04 -2.30010000000E-04 - 5.28006000000E-03 -3.23188000000E-03 3.67444000000E-03 - 2.09220000000E-04 -2.30010000000E-04 -1.98950000000E-04 - 3.79590000000E-04 1.38300000000E-04 -5.37700000000E-05 - 3.79590000000E-04 -5.37700000000E-05 1.38300000000E-04 - -3.12300000000E-05 -5.11400000000E-05 -4.36100000000E-05 - 5.28006000000E-03 3.67444000000E-03 -3.23188000000E-03 - -3.12300000000E-05 -4.36100000000E-05 -5.11400000000E-05 - -2.61839400000E-02 -4.17526000000E-03 -4.17526000000E-03 - 1.94100000000E-04 -6.15300000000E-05 -5.43000000000E-05 - -5.82735000000E-03 3.61954000000E-03 3.61954000000E-03 - -5.41430000000E-04 2.04940000000E-04 -9.09400000000E-05 - 1.94100000000E-04 -5.43000000000E-05 -6.15300000000E-05 - -9.13990000000E-04 -3.91900000000E-05 -3.91900000000E-05 - -5.41430000000E-04 -9.09400000000E-05 2.04940000000E-04 - -9.66570000000E-04 1.90200000000E-04 1.90200000000E-04 - 2.61828200000E-02 4.18487000000E-03 4.18487000000E-03 - -1.86390000000E-04 6.89200000000E-05 4.28800000000E-05 - 9.66350000000E-04 -1.88240000000E-04 -1.88240000000E-04 - 5.49970000000E-04 1.01180000000E-04 -2.11480000000E-04 - -1.86390000000E-04 4.28800000000E-05 6.89200000000E-05 - 9.14670000000E-04 3.60800000000E-05 3.60800000000E-05 - 5.49970000000E-04 -2.11480000000E-04 1.01180000000E-04 - 5.83368000000E-03 -3.62565000000E-03 -3.62565000000E-03 - -4.64298000000E-03 3.54814000000E-03 -3.09051000000E-03 - 4.24360000000E-04 -8.55000000000E-05 -3.53040000000E-04 - -4.64298000000E-03 -3.09051000000E-03 3.54814000000E-03 - 1.60310000000E-04 -1.73900000000E-04 5.77500000000E-05 - 1.60310000000E-04 5.77500000000E-05 -1.73900000000E-04 - -2.40610000000E-04 2.96300000000E-05 7.11500000000E-05 - 4.24360000000E-04 -3.53040000000E-04 -8.55000000000E-05 - -2.40610000000E-04 7.11500000000E-05 2.96300000000E-05 - -2.92150000000E-04 1.04700000000E-04 -2.52880000000E-04 - -3.36920000000E-04 -1.89500000000E-04 3.36750000000E-04 - -2.92150000000E-04 -2.52880000000E-04 1.04700000000E-04 - -1.24570000000E-04 1.33100000000E-04 -2.19900000000E-05 - -1.24570000000E-04 -2.19900000000E-05 1.33100000000E-04 - -5.51200000000E-05 -5.21100000000E-05 -5.97100000000E-05 - -3.36920000000E-04 3.36750000000E-04 -1.89500000000E-04 - -5.51200000000E-05 -5.97100000000E-05 -5.21100000000E-05 - 8.05300000000E-05 -5.33100000000E-05 -5.33100000000E-05 - 2.66000000000E-06 -3.45900000000E-05 -3.44300000000E-05 - 4.26800000000E-05 2.76900000000E-05 2.76900000000E-05 - 6.58000000000E-06 3.63600000000E-05 3.31900000000E-05 - 2.66000000000E-06 -3.44300000000E-05 -3.45900000000E-05 - 9.73700000000E-05 -3.98300000000E-05 -3.98300000000E-05 - 6.58000000000E-06 3.31900000000E-05 3.63600000000E-05 - 5.45000000000E-05 6.41800000000E-05 6.41800000000E-05 - -9.15400000000E-05 6.07300000000E-05 6.07300000000E-05 - -5.43000000000E-06 3.50700000000E-05 3.12800000000E-05 - -5.51600000000E-05 -5.59000000000E-05 -5.59000000000E-05 - -4.27000000000E-06 -1.77900000000E-05 -4.94100000000E-05 - -5.43000000000E-06 3.12800000000E-05 3.50700000000E-05 - -9.29400000000E-05 4.37700000000E-05 4.37700000000E-05 - -4.27000000000E-06 -4.94100000000E-05 -1.77900000000E-05 - -5.86500000000E-05 -4.76500000000E-05 -4.76500000000E-05 - 3.47490000000E-04 1.97800000000E-04 -3.43320000000E-04 - 2.94460000000E-04 -1.05170000000E-04 2.54890000000E-04 - 3.47490000000E-04 -3.43320000000E-04 1.97800000000E-04 - 7.08300000000E-05 4.67200000000E-05 5.39900000000E-05 - 7.08300000000E-05 5.39900000000E-05 4.67200000000E-05 - 1.33200000000E-04 2.09200000000E-05 -1.24850000000E-04 - 2.94460000000E-04 2.54890000000E-04 -1.05170000000E-04 - 1.33200000000E-04 -1.24850000000E-04 2.09200000000E-05 - -4.30630000000E-04 9.38200000000E-05 3.63220000000E-04 - 4.63748000000E-03 -3.54243000000E-03 3.08467000000E-03 - -4.30630000000E-04 3.63220000000E-04 9.38200000000E-05 - 2.27850000000E-04 -5.57100000000E-05 -2.77000000000E-05 - 2.27850000000E-04 -2.77000000000E-05 -5.57100000000E-05 - -1.80020000000E-04 -7.42100000000E-05 1.53870000000E-04 - 4.63748000000E-03 3.08467000000E-03 -3.54243000000E-03 - -1.80020000000E-04 1.53870000000E-04 -7.42100000000E-05 - 2.56008300000E-02 3.01487000000E-03 3.01487000000E-03 - -1.89880000000E-04 6.26200000000E-05 5.08800000000E-05 - 5.60491000000E-03 -3.25133000000E-03 -3.25133000000E-03 - 5.57170000000E-04 -2.15750000000E-04 1.00460000000E-04 - -1.89880000000E-04 5.08800000000E-05 6.26200000000E-05 - 9.02320000000E-04 3.70400000000E-05 3.70400000000E-05 - 5.57170000000E-04 1.00460000000E-04 -2.15750000000E-04 - 9.44630000000E-04 -1.81870000000E-04 -1.81870000000E-04 - -2.55999200000E-02 -3.00925000000E-03 -3.00925000000E-03 - 1.97580000000E-04 -5.51300000000E-05 -6.20900000000E-05 - -9.44860000000E-04 1.83940000000E-04 1.83940000000E-04 - -5.48520000000E-04 -9.01100000000E-05 2.09280000000E-04 - 1.97580000000E-04 -6.20900000000E-05 -5.51300000000E-05 - -9.01690000000E-04 -4.00200000000E-05 -4.00200000000E-05 - -5.48520000000E-04 2.09280000000E-04 -9.01100000000E-05 - -5.59893000000E-03 3.24552000000E-03 3.24552000000E-03 - 4.85132000000E-03 -3.91361000000E-03 3.48089000000E-03 - -4.16730000000E-04 8.72800000000E-05 3.44290000000E-04 - 4.85132000000E-03 3.48089000000E-03 -3.91361000000E-03 - -1.90480000000E-04 1.44400000000E-04 -7.26000000000E-05 - -1.90480000000E-04 -7.26000000000E-05 1.44400000000E-04 - 2.22310000000E-04 -2.15700000000E-05 -4.68500000000E-05 - -4.16730000000E-04 3.44290000000E-04 8.72800000000E-05 - 2.22310000000E-04 -4.68500000000E-05 -2.15700000000E-05 - 3.17780000000E-04 -1.15740000000E-04 2.67730000000E-04 - 3.72680000000E-04 2.12780000000E-04 -3.60330000000E-04 - 3.17780000000E-04 2.67730000000E-04 -1.15740000000E-04 - 1.17570000000E-04 -1.39540000000E-04 3.13000000000E-05 - 1.17570000000E-04 3.13000000000E-05 -1.39540000000E-04 - 6.45400000000E-05 4.51500000000E-05 5.86900000000E-05 - 3.72680000000E-04 -3.60330000000E-04 2.12780000000E-04 - 6.45400000000E-05 5.86900000000E-05 4.51500000000E-05 - -8.08200000000E-05 5.18400000000E-05 5.18400000000E-05 - -2.40000000000E-07 4.14500000000E-05 3.74100000000E-05 - -5.49900000000E-05 -5.23300000000E-05 -5.23300000000E-05 - 8.42000000000E-06 -6.53400000000E-05 -1.33200000000E-05 - -2.40000000000E-07 3.74100000000E-05 4.14500000000E-05 - -9.76600000000E-05 3.85100000000E-05 3.85100000000E-05 - 8.42000000000E-06 -1.33200000000E-05 -6.53400000000E-05 - -6.61800000000E-05 -3.94100000000E-05 -3.94100000000E-05 - 6.96400000000E-05 -4.42800000000E-05 -4.42800000000E-05 - -2.62000000000E-06 -4.09100000000E-05 -4.04300000000E-05 - 6.55000000000E-05 4.77600000000E-05 4.77600000000E-05 - -6.30000000000E-06 2.88600000000E-05 5.24100000000E-05 - -2.62000000000E-06 -4.04300000000E-05 -4.09100000000E-05 - 1.02050000000E-04 -3.43600000000E-05 -3.43600000000E-05 - -6.30000000000E-06 5.24100000000E-05 2.88600000000E-05 - 3.89100000000E-05 3.24000000000E-05 3.24000000000E-05 - -3.62200000000E-04 -2.04340000000E-04 3.53850000000E-04 - -3.15450000000E-04 1.15330000000E-04 -2.65630000000E-04 - -3.62200000000E-04 3.53850000000E-04 -2.04340000000E-04 - -4.88300000000E-05 -7.15900000000E-05 -4.31800000000E-05 - -4.88300000000E-05 -4.31800000000E-05 -7.15900000000E-05 - -1.09010000000E-04 -3.21000000000E-05 1.47870000000E-04 - -3.15450000000E-04 -2.65630000000E-04 1.15330000000E-04 - -1.09010000000E-04 1.47870000000E-04 -3.21000000000E-05 - 4.10470000000E-04 -7.88100000000E-05 -3.33970000000E-04 - -4.85713000000E-03 3.91977000000E-03 -3.48684000000E-03 - 4.10470000000E-04 -3.33970000000E-04 -7.88100000000E-05 - -2.35090000000E-04 6.24400000000E-05 2.35400000000E-05 - -2.35090000000E-04 2.35400000000E-05 6.24400000000E-05 - 1.70780000000E-04 5.63800000000E-05 -1.64340000000E-04 - -4.85713000000E-03 -3.48684000000E-03 3.91977000000E-03 - 1.70780000000E-04 -1.64340000000E-04 5.63800000000E-05 - -1.70840900000E-02 5.36807000000E-03 3.93192000000E-03 - 1.55390000000E-04 -9.79900000000E-05 5.18200000000E-05 - -4.42886000000E-03 5.00809000000E-03 3.63333000000E-03 - -7.07060000000E-04 4.47800000000E-05 -9.10400000000E-05 - 1.44240000000E-04 -3.40900000000E-05 5.31800000000E-05 - -5.62270000000E-04 1.66300000000E-05 3.74700000000E-05 - -6.97000000000E-04 -1.79830000000E-04 1.99570000000E-04 - -6.91320000000E-04 1.62500000000E-04 1.85400000000E-04 - 4.79150000000E-03 -1.74667300000E-02 3.24152000000E-03 - -9.49500000000E-05 1.60630000000E-04 4.21500000000E-05 - 1.56470000000E-04 2.91410000000E-04 2.60620000000E-04 - 5.72700000000E-05 2.83560000000E-04 -3.70660000000E-04 - -9.44600000000E-05 8.93500000000E-05 6.75300000000E-05 - 3.10160000000E-04 5.18700000000E-05 3.40400000000E-05 - -2.40240000000E-04 2.46770000000E-04 -3.35200000000E-04 - 5.32303000000E-03 -3.46502000000E-03 -3.50206000000E-03 - -3.06534000000E-03 5.11549000000E-03 -3.07856000000E-03 - 2.64230000000E-04 -2.49110000000E-04 -3.51850000000E-04 - 4.10204000000E-03 5.46618000000E-03 -3.61455000000E-03 - 1.23030000000E-04 -2.12420000000E-04 -4.53300000000E-05 - 1.15100000000E-05 -2.62300000000E-05 -1.60140000000E-04 - 2.33900000000E-05 9.81000000000E-06 7.34100000000E-05 - 3.79640000000E-04 -3.36180000000E-04 -2.00760000000E-04 - 9.95900000000E-05 1.23060000000E-04 -4.10700000000E-05 - 1.66780000000E-04 -6.83510000000E-04 1.84660000000E-04 - -1.75250000000E-04 -6.98410000000E-04 1.95800000000E-04 - 3.20410000000E-04 3.68230000000E-04 -1.96290000000E-04 - -1.46230000000E-04 1.11090000000E-04 -4.87200000000E-05 - -3.72500000000E-05 -1.89800000000E-05 4.67500000000E-05 - 7.94000000000E-06 -2.59000000000E-05 4.97900000000E-05 - -3.14370000000E-04 3.60610000000E-04 -1.93140000000E-04 - 1.18060000000E-04 1.15220000000E-04 -5.40900000000E-05 - 9.77400000000E-05 -9.84100000000E-05 6.42400000000E-05 - 5.59400000000E-05 3.03400000000E-04 3.93000000000E-05 - -4.46800000000E-05 -1.26410000000E-04 3.66700000000E-05 - -1.88900000000E-05 3.09540000000E-04 3.94500000000E-05 - 5.43900000000E-05 1.73500000000E-05 4.34100000000E-05 - 9.10900000000E-05 -4.56600000000E-05 3.98000000000E-05 - -1.42600000000E-05 1.32900000000E-05 3.89400000000E-05 - -3.04900000000E-05 -2.07900000000E-05 6.51800000000E-05 - -4.57900000000E-05 1.52780000000E-04 5.94600000000E-05 - 1.12900000000E-05 -5.64690000000E-04 3.11700000000E-05 - -5.41200000000E-05 3.20200000000E-05 -1.41180000000E-04 - 2.30200000000E-05 4.49800000000E-05 5.97900000000E-05 - 1.07900000000E-05 4.90600000000E-05 3.33100000000E-05 - -4.15700000000E-05 9.56900000000E-05 4.26200000000E-05 - -2.04000000000E-06 3.86900000000E-05 6.48900000000E-05 - -3.33800000000E-05 1.45700000000E-05 -1.59330000000E-04 - 2.63500000000E-04 4.76800000000E-05 -3.52200000000E-04 - 2.76340000000E-04 1.59850000000E-04 2.57170000000E-04 - 3.67420000000E-04 -3.91210000000E-04 8.60400000000E-05 - 1.25570000000E-04 3.93660000000E-04 -1.85800000000E-05 - 5.01300000000E-05 3.53100000000E-05 4.55500000000E-05 - 4.93800000000E-05 -6.34900000000E-05 -1.23290000000E-04 - 3.47700000000E-04 3.04850000000E-04 -1.77430000000E-04 - 1.26990000000E-04 -1.31540000000E-04 -5.56700000000E-05 - 4.49500000000E-05 -7.07300000000E-04 -8.98600000000E-05 - 4.82607000000E-03 -4.02915000000E-03 3.23001000000E-03 - -4.07890000000E-04 3.90050000000E-04 9.52400000000E-05 - 4.01490000000E-04 1.17690000000E-04 -3.04400000000E-05 - 3.16460000000E-04 -2.56200000000E-05 2.71800000000E-05 - -1.19120000000E-04 -4.69700000000E-05 4.21100000000E-05 - 5.25833000000E-03 3.69967000000E-03 -3.24818000000E-03 - -2.02350000000E-04 1.32110000000E-04 -5.08500000000E-05 - -2.50320100000E-02 -5.57648000000E-03 -4.36412000000E-03 - 3.12600000000E-05 1.01930000000E-04 -5.42900000000E-05 - 2.73719000000E-03 -5.11350000000E-03 -3.55047000000E-03 - -5.79430000000E-04 2.42640000000E-04 -1.97360000000E-04 - 3.93700000000E-05 3.45000000000E-05 -5.37800000000E-05 - -6.37850000000E-04 -1.34300000000E-05 -3.47700000000E-05 - -5.92710000000E-04 -1.11390000000E-04 9.20200000000E-05 - -6.13400000000E-04 1.36490000000E-04 1.13750000000E-04 - 5.58611000000E-03 2.50307000000E-02 4.37370000000E-03 - -9.43500000000E-05 -2.36300000000E-05 4.29600000000E-05 - 4.56880000000E-04 -3.51670000000E-04 -3.23610000000E-04 - -2.40090000000E-04 -3.58030000000E-04 2.25630000000E-04 - -9.48500000000E-05 -4.21000000000E-06 6.93100000000E-05 - 3.09380000000E-04 1.91400000000E-05 3.69800000000E-05 - 5.71100000000E-05 -3.93440000000E-04 2.58310000000E-04 - 5.01595000000E-03 -4.10973000000E-03 -4.07056000000E-03 - 4.10385000000E-03 -5.00975000000E-03 4.06443000000E-03 - 3.87100000000E-04 -4.86200000000E-05 -2.48070000000E-04 - -3.06309000000E-03 -4.66633000000E-03 3.53112000000E-03 - 7.70000000000E-07 -9.18000000000E-06 5.81100000000E-05 - 1.15260000000E-04 4.18800000000E-05 -5.74100000000E-05 - 9.96100000000E-05 -2.18200000000E-05 1.41900000000E-04 - 2.74720000000E-04 -2.66250000000E-04 -1.01790000000E-04 - 2.35500000000E-05 9.22100000000E-05 2.85000000000E-05 - -1.34300000000E-04 6.13010000000E-04 -1.11730000000E-04 - 1.21850000000E-04 6.01160000000E-04 -9.86200000000E-05 - -2.72130000000E-04 -2.76930000000E-04 1.11240000000E-04 - 4.72800000000E-05 -4.11500000000E-05 -2.08400000000E-05 - -6.22000000000E-05 -4.90200000000E-05 2.32400000000E-05 - 3.27200000000E-05 -5.61500000000E-05 2.82700000000E-05 - 2.76760000000E-04 -2.81060000000E-04 1.10010000000E-04 - -7.65400000000E-05 -3.63700000000E-05 -2.65300000000E-05 - -7.01000000000E-06 1.02430000000E-04 -6.19000000000E-05 - -2.21700000000E-05 -3.08790000000E-04 -3.99600000000E-05 - 6.03400000000E-05 7.33000000000E-05 -8.88200000000E-05 - 5.92900000000E-05 -3.02990000000E-04 -3.94700000000E-05 - -1.69700000000E-05 -1.40100000000E-05 -4.01100000000E-05 - 1.22000000000E-05 4.59900000000E-05 -4.04500000000E-05 - 5.81900000000E-05 -1.70500000000E-05 -4.14500000000E-05 - 4.82100000000E-05 7.06200000000E-05 -1.50000000000E-05 - -4.57800000000E-05 -3.18000000000E-05 6.10500000000E-05 - 1.03300000000E-05 6.38450000000E-04 3.17100000000E-05 - -2.95000000000E-05 -1.19010000000E-04 5.49300000000E-05 - -1.12000000000E-06 -1.07570000000E-04 -1.34870000000E-04 - 1.10600000000E-05 1.41000000000E-05 4.03800000000E-05 - -4.18200000000E-05 -7.99000000000E-06 4.46500000000E-05 - 2.37600000000E-05 -1.12480000000E-04 -1.26450000000E-04 - -5.81800000000E-05 -1.35130000000E-04 3.74200000000E-05 - 3.68370000000E-04 2.48660000000E-04 -2.32350000000E-04 - 3.53730000000E-04 -4.57260000000E-04 3.25640000000E-04 - 2.64610000000E-04 -1.94440000000E-04 2.08780000000E-04 - 5.13700000000E-05 -2.17200000000E-04 5.28700000000E-05 - 1.23150000000E-04 3.14000000000E-06 1.21740000000E-04 - 1.27350000000E-04 2.86900000000E-05 -4.66400000000E-05 - 2.79000000000E-04 2.74270000000E-04 -1.11770000000E-04 - 4.95500000000E-05 -3.88600000000E-05 2.00300000000E-05 - -2.48990000000E-04 5.87990000000E-04 2.07610000000E-04 - 5.10795000000E-03 -2.73141000000E-03 3.54469000000E-03 - 1.87990000000E-04 -2.54300000000E-04 -2.00470000000E-04 - 2.04330000000E-04 -3.58100000000E-05 -5.09000000000E-05 - 2.90110000000E-04 -5.72200000000E-05 5.49100000000E-05 - -9.32100000000E-05 -7.65500000000E-05 6.87300000000E-05 - 4.66076000000E-03 3.05740000000E-03 -3.52562000000E-03 - -1.06700000000E-05 -2.06900000000E-05 -7.44200000000E-05 - 2.38786700000E-02 4.60161000000E-03 2.89548000000E-03 - -2.86900000000E-05 -9.87100000000E-05 5.09000000000E-05 - -3.13107000000E-03 5.31808000000E-03 3.91013000000E-03 - 5.94880000000E-04 -2.54180000000E-04 2.04430000000E-04 - -3.95400000000E-05 -3.39900000000E-05 5.14300000000E-05 - 6.41710000000E-04 1.77800000000E-05 3.71300000000E-05 - 6.01220000000E-04 1.16480000000E-04 -9.94700000000E-05 - 6.08870000000E-04 -1.29250000000E-04 -1.10900000000E-04 - -4.59605000000E-03 -2.38777100000E-02 -2.89002000000E-03 - 1.06300000000E-04 3.63900000000E-05 -6.20500000000E-05 - -4.53080000000E-04 3.66180000000E-04 3.44940000000E-04 - 2.57610000000E-04 3.88780000000E-04 -2.42450000000E-04 - 1.05870000000E-04 -1.59100000000E-05 -5.48300000000E-05 - -3.03630000000E-04 -2.24200000000E-05 -3.91100000000E-05 - -3.89800000000E-05 3.71840000000E-04 -2.28770000000E-04 - -4.82343000000E-03 3.69898000000E-03 3.68759000000E-03 - -3.70477000000E-03 4.82921000000E-03 -3.69344000000E-03 - -3.78320000000E-04 4.75000000000E-05 2.39090000000E-04 - 3.45939000000E-03 4.87648000000E-03 -3.92970000000E-03 - -2.62200000000E-05 -1.53400000000E-05 -7.21700000000E-05 - -1.40970000000E-04 -5.18000000000E-05 3.17000000000E-05 - -1.27810000000E-04 3.44900000000E-05 -1.24090000000E-04 - -2.61690000000E-04 2.57200000000E-04 9.06000000000E-05 - -5.14300000000E-05 -7.12300000000E-05 -1.80100000000E-05 - 1.31360000000E-04 -6.09110000000E-04 1.13050000000E-04 - -1.06170000000E-04 -5.92570000000E-04 9.29800000000E-05 - 2.89230000000E-04 2.92970000000E-04 -1.09530000000E-04 - -5.52700000000E-05 3.16600000000E-05 3.24500000000E-05 - 5.46300000000E-05 5.92200000000E-05 -2.99600000000E-05 - -2.36100000000E-05 4.55300000000E-05 -2.25800000000E-05 - -2.46910000000E-04 2.55260000000E-04 -8.22300000000E-05 - 8.67700000000E-05 3.85400000000E-05 2.00500000000E-05 - 4.65000000000E-06 -9.82500000000E-05 6.23600000000E-05 - 1.93500000000E-05 3.04240000000E-04 3.62700000000E-05 - -7.44900000000E-05 -1.01980000000E-04 6.04500000000E-05 - -4.69100000000E-05 2.85270000000E-04 6.21600000000E-05 - 2.00900000000E-05 1.71500000000E-05 3.61800000000E-05 - -1.33200000000E-05 -4.55800000000E-05 3.80400000000E-05 - -4.35900000000E-05 3.90800000000E-05 9.55000000000E-06 - -6.00900000000E-05 -4.63600000000E-05 3.83200000000E-05 - 2.27800000000E-05 4.72500000000E-05 -4.40100000000E-05 - -2.07400000000E-05 -6.40940000000E-04 -4.01000000000E-05 - 3.69800000000E-05 1.10660000000E-04 -6.09300000000E-05 - -6.99000000000E-06 1.15450000000E-04 1.36010000000E-04 - -2.00500000000E-05 -2.31300000000E-05 -3.57000000000E-05 - 4.98700000000E-05 1.75000000000E-05 -3.37700000000E-05 - -3.24400000000E-05 1.14870000000E-04 1.39730000000E-04 - 3.55600000000E-05 1.21010000000E-04 -5.15700000000E-05 - -3.78250000000E-04 -2.49020000000E-04 2.35880000000E-04 - -3.63840000000E-04 4.52810000000E-04 -3.42890000000E-04 - -2.71900000000E-04 1.97480000000E-04 -2.12550000000E-04 - -2.36000000000E-05 2.01720000000E-04 -4.84500000000E-05 - -9.97700000000E-05 9.05000000000E-06 -1.49020000000E-04 - -1.02140000000E-04 -3.76800000000E-05 6.92900000000E-05 - -2.90660000000E-04 -2.87220000000E-04 1.09130000000E-04 - -2.31000000000E-05 6.35500000000E-05 -3.31300000000E-05 - 2.47930000000E-04 -5.86160000000E-04 -1.94030000000E-04 - -5.32381000000E-03 3.13747000000E-03 -3.91612000000E-03 - -2.03740000000E-04 2.82380000000E-04 2.20980000000E-04 - -2.14460000000E-04 3.93200000000E-05 5.04900000000E-05 - -2.97990000000E-04 4.89300000000E-05 -4.65800000000E-05 - 8.22700000000E-05 5.82900000000E-05 -8.04400000000E-05 - -4.88221000000E-03 -3.46538000000E-03 3.93580000000E-03 - -4.27000000000E-06 6.25000000000E-06 5.59900000000E-05 - 1.74678000000E-02 -4.78583000000E-03 -3.23596000000E-03 - -1.53010000000E-04 1.02550000000E-04 -5.34500000000E-05 - 4.03502000000E-03 -4.83156000000E-03 -3.23583000000E-03 - 7.15900000000E-04 -5.12500000000E-05 1.00270000000E-04 - -1.45150000000E-04 3.45000000000E-05 -5.20800000000E-05 - 5.65240000000E-04 -1.43000000000E-05 -3.43300000000E-05 - 7.06940000000E-04 1.85690000000E-04 -2.02310000000E-04 - 6.83180000000E-04 -1.64550000000E-04 -1.82610000000E-04 - -5.35849000000E-03 1.70832100000E-02 -3.92222000000E-03 - 1.05470000000E-04 -1.47780000000E-04 -6.31100000000E-05 - -1.60300000000E-04 -2.74170000000E-04 -2.55210000000E-04 - -3.92800000000E-05 -2.53040000000E-04 3.45700000000E-04 - 1.05950000000E-04 -1.08960000000E-04 -5.67500000000E-05 - -3.02910000000E-04 -5.88200000000E-05 -4.22600000000E-05 - 2.57590000000E-04 -2.70580000000E-04 3.62130000000E-04 - -5.10981000000E-03 3.05963000000E-03 3.07262000000E-03 - 3.45897000000E-03 -5.31681000000E-03 3.49595000000E-03 - -2.53280000000E-04 2.48740000000E-04 3.45380000000E-04 - -3.70556000000E-03 -5.26379000000E-03 3.25389000000E-03 - -1.52180000000E-04 1.82580000000E-04 3.45000000000E-05 - -3.45300000000E-05 1.71600000000E-05 1.39420000000E-04 - -5.17400000000E-05 4.06000000000E-06 -4.92200000000E-05 - -3.67050000000E-04 3.24800000000E-04 2.01520000000E-04 - -1.28100000000E-04 -1.02280000000E-04 5.60200000000E-05 - -1.60480000000E-04 6.90980000000E-04 -1.83390000000E-04 - 1.90110000000E-04 7.05560000000E-04 -2.06060000000E-04 - -3.02870000000E-04 -3.45530000000E-04 1.77030000000E-04 - 1.39820000000E-04 -1.18560000000E-04 5.48800000000E-05 - 2.91100000000E-05 2.97600000000E-05 -5.69300000000E-05 - 2.10000000000E-06 1.62800000000E-05 -5.19300000000E-05 - 3.46480000000E-04 -3.85950000000E-04 2.09160000000E-04 - -1.07550000000E-04 -1.12370000000E-04 4.29200000000E-05 - -1.00590000000E-04 1.02120000000E-04 -5.99100000000E-05 - -5.49600000000E-05 -3.09650000000E-04 -3.69700000000E-05 - 3.07300000000E-05 9.93500000000E-05 -6.21800000000E-05 - 2.76100000000E-05 -3.29270000000E-04 -1.17000000000E-05 - -5.21400000000E-05 -1.37100000000E-05 -3.28100000000E-05 - -9.14400000000E-05 4.59100000000E-05 -3.86000000000E-05 - 2.78000000000E-05 7.66000000000E-06 -6.28100000000E-05 - 1.80100000000E-05 4.57500000000E-05 -3.85700000000E-05 - 2.28100000000E-05 -1.36620000000E-04 -4.58000000000E-05 - -1.96900000000E-05 5.62900000000E-04 -4.05300000000E-05 - 6.27700000000E-05 -4.08200000000E-05 1.31500000000E-04 - -3.33000000000E-05 -3.45500000000E-05 -5.86100000000E-05 - -2.02500000000E-05 -5.73200000000E-05 -4.28500000000E-05 - 4.99500000000E-05 -8.68000000000E-05 -3.58200000000E-05 - -7.84000000000E-06 -3.62900000000E-05 -5.78300000000E-05 - 1.00100000000E-05 -3.12600000000E-05 1.40310000000E-04 - -2.73110000000E-04 -4.86500000000E-05 3.64020000000E-04 - -2.89150000000E-04 -1.56790000000E-04 -2.58560000000E-04 - -3.79580000000E-04 4.01450000000E-04 -8.68200000000E-05 - -1.02010000000E-04 -4.14230000000E-04 3.23300000000E-05 - -2.93500000000E-05 -2.09700000000E-05 -7.27300000000E-05 - -2.35300000000E-05 5.34000000000E-05 1.49410000000E-04 - -3.65980000000E-04 -3.18190000000E-04 1.95940000000E-04 - -1.02630000000E-04 1.54600000000E-04 4.78700000000E-05 - -5.10500000000E-05 7.15710000000E-04 1.01270000000E-04 - -5.01381000000E-03 4.43518000000E-03 -3.63916000000E-03 - 3.84900000000E-04 -3.57020000000E-04 -7.75800000000E-05 - -4.06460000000E-04 -1.09900000000E-04 2.04800000000E-05 - -3.22450000000E-04 2.08800000000E-05 -2.39400000000E-05 - 1.06700000000E-04 2.85400000000E-05 -5.66900000000E-05 - -5.47204000000E-03 -4.10787000000E-03 3.62058000000E-03 - 1.92680000000E-04 -1.42950000000E-04 2.90100000000E-05 - -2.05509900000E-02 -1.50690000000E-04 3.28160000000E-04 - -2.08070000000E-04 -1.52760000000E-04 3.25890000000E-04 - -7.96810000000E-04 -1.35000000000E-05 -7.98590000000E-04 - -6.56810000000E-04 1.57790000000E-04 -1.29160000000E-04 - -5.71000000000E-06 -1.35400000000E-05 7.49900000000E-05 - -5.05670000000E-04 -1.40800000000E-05 7.53200000000E-05 - -4.92810000000E-04 4.68000000000E-06 -5.07680000000E-04 - -6.41820000000E-04 1.62960000000E-04 1.64960000000E-04 - 8.56557000000E-03 4.02730000000E-04 8.74973000000E-03 - -4.24500000000E-05 1.65700000000E-05 8.36000000000E-06 - 2.49680000000E-04 -8.81700000000E-05 -1.37860000000E-04 - -1.30190000000E-04 -7.60100000000E-05 -5.50100000000E-05 - -3.13000000000E-05 -7.79000000000E-06 -3.02200000000E-05 - 3.50320000000E-04 -6.80000000000E-07 5.26700000000E-05 - -3.86791000000E-03 -3.84120000000E-03 5.12394000000E-03 - 5.12015000000E-03 -3.83406000000E-03 -3.81729000000E-03 - 3.21620000000E-04 1.44800000000E-04 -2.05515200000E-02 - 3.27250000000E-04 -1.51630000000E-04 -2.54490000000E-04 - 4.68490000000E-04 8.08000000000E-06 4.69460000000E-04 - 2.14930000000E-04 1.90280000000E-04 3.34270000000E-04 - 6.32500000000E-05 6.82000000000E-06 -1.71300000000E-05 - 6.21800000000E-05 -8.70000000000E-06 1.26050000000E-04 - 1.81280000000E-04 -1.04100000000E-05 1.65000000000E-04 - -8.89100000000E-05 -1.91990000000E-04 3.17960000000E-04 - 3.79463000000E-03 3.73937000000E-03 5.20567000000E-03 - 2.95100000000E-05 9.11000000000E-06 1.04100000000E-05 - -4.28900000000E-05 9.27100000000E-05 -1.38730000000E-04 - -8.93000000000E-05 7.28200000000E-05 -1.75100000000E-05 - 1.04400000000E-05 2.00900000000E-05 -6.73100000000E-05 - 5.66500000000E-05 -4.90000000000E-06 5.27900000000E-05 - -3.41329000000E-03 3.43640000000E-03 4.92642000000E-03 - -3.26000000000E-05 9.26400000000E-05 -7.44300000000E-05 - -2.45870000000E-04 1.44430000000E-04 3.15010000000E-04 - 3.17280000000E-04 1.49310000000E-04 3.25670000000E-04 - -1.43870000000E-04 -1.77520000000E-04 -6.78810000000E-04 - 8.03000000000E-06 -1.31900000000E-05 1.34300000000E-05 - 1.15090000000E-04 1.16900000000E-05 7.61300000000E-05 - -4.48300000000E-05 1.16700000000E-05 7.54400000000E-05 - 1.64950000000E-04 -1.45510000000E-04 -6.45490000000E-04 - 2.18200000000E-05 1.12100000000E-05 4.03200000000E-05 - 5.49000000000E-06 -2.42000000000E-06 -3.81300000000E-05 - 4.80500000000E-05 -5.30000000000E-07 4.83800000000E-05 - -8.00700000000E-05 -8.12100000000E-05 2.66320000000E-04 - -2.89100000000E-05 -7.00900000000E-05 -8.36000000000E-05 - 4.83500000000E-05 -5.12000000000E-06 3.40070000000E-04 - -2.90000000000E-06 5.67000000000E-06 -2.12000000000E-06 - -4.33500000000E-05 -9.67400000000E-05 -1.33600000000E-04 - -8.05200000000E-05 -9.58300000000E-05 -4.62200000000E-05 - 3.14560000000E-04 1.45320000000E-04 -1.99110000000E-04 - 3.14860000000E-04 -1.48770000000E-04 3.08280000000E-04 - 3.27290000000E-04 -1.94490000000E-04 2.22180000000E-04 - 1.00520000000E-04 -1.20500000000E-05 9.30900000000E-05 - 8.72700000000E-05 1.47000000000E-05 -5.15330000000E-04 - 8.80400000000E-05 -1.85100000000E-05 -3.33900000000E-05 - 3.02220000000E-04 1.92300000000E-04 -7.08200000000E-05 - 7.51100000000E-05 1.05500000000E-05 5.82100000000E-05 - -5.25100000000E-05 5.44000000000E-06 -3.91800000000E-05 - 4.99941000000E-03 -3.34351000000E-03 3.39769000000E-03 - -1.43450000000E-04 1.01370000000E-04 2.47420000000E-04 - 2.64010000000E-04 8.07400000000E-05 -8.68800000000E-05 - 3.42670000000E-04 -3.60000000000E-07 3.49720000000E-04 - -6.66700000000E-05 -2.21100000000E-05 1.00400000000E-05 - 4.91266000000E-03 3.44934000000E-03 -3.48448000000E-03 - -1.43150000000E-04 9.64800000000E-05 -4.53400000000E-05 - -2.11591000000E-02 1.57300000000E-04 -3.37750000000E-04 - 3.84300000000E-04 1.45940000000E-04 -3.15370000000E-04 - -5.03830000000E-04 -2.96330000000E-04 5.04190000000E-04 - -6.32480000000E-04 1.33630000000E-04 -1.60140000000E-04 - 1.89000000000E-04 1.37100000000E-05 -7.53300000000E-05 - -6.98890000000E-04 1.42900000000E-05 -7.50700000000E-05 - -7.88420000000E-04 -2.88050000000E-04 7.90810000000E-04 - -6.66930000000E-04 1.38810000000E-04 1.35840000000E-04 - 1.39683000000E-03 7.54537000000E-03 -1.38275000000E-03 - -1.47090000000E-04 1.20460000000E-04 7.73800000000E-05 - 3.73000000000E-04 1.48900000000E-05 6.31400000000E-05 - -5.55500000000E-05 -6.20000000000E-06 -8.50000000000E-05 - -1.55310000000E-04 9.56300000000E-05 1.70590000000E-04 - 2.73350000000E-04 6.91600000000E-05 2.17000000000E-05 - 3.29471000000E-03 3.32019000000E-03 -5.01319000000E-03 - 5.22685000000E-03 -3.73037000000E-03 -3.74699000000E-03 - 3.29450000000E-04 1.57630000000E-04 2.11510200000E-02 - 3.26660000000E-04 -1.50410000000E-04 -3.47700000000E-04 - 1.78580000000E-04 6.01950000000E-04 -1.78300000000E-04 - -8.12100000000E-05 -3.99970000000E-04 -3.07740000000E-04 - 6.31000000000E-05 8.73000000000E-06 -2.01060000000E-04 - 6.42100000000E-05 -6.44000000000E-06 9.23000000000E-05 - 4.79330000000E-04 -5.99880000000E-04 -4.77220000000E-04 - 2.08830000000E-04 4.02110000000E-04 -3.22800000000E-04 - -3.37107000000E-03 -3.43455000000E-03 -4.92892000000E-03 - -7.49100000000E-05 -9.86300000000E-05 7.89200000000E-05 - 8.07600000000E-05 -1.45400000000E-05 6.39000000000E-05 - -1.39900000000E-05 -4.80000000000E-07 -4.87000000000E-05 - -1.12750000000E-04 -8.69000000000E-05 1.33110000000E-04 - -1.99600000000E-05 -7.83500000000E-05 2.25400000000E-05 - 3.75140000000E-03 -3.73090000000E-03 -5.21195000000E-03 - 7.32900000000E-05 -1.45900000000E-05 -5.78000000000E-06 - 3.46870000000E-04 -1.51210000000E-04 -3.25330000000E-04 - -2.74760000000E-04 -1.42840000000E-04 -3.15130000000E-04 - 1.55080000000E-04 1.20450000000E-04 6.21870000000E-04 - 3.34400000000E-05 1.43700000000E-05 -1.57700000000E-05 - -7.96400000000E-05 -1.15300000000E-05 -7.64300000000E-05 - 1.49710000000E-04 -1.14800000000E-05 -7.52000000000E-05 - -1.31700000000E-04 1.52330000000E-04 6.53990000000E-04 - -3.47000000000E-06 3.81400000000E-05 1.09500000000E-05 - -9.96900000000E-05 1.20550000000E-04 1.62330000000E-04 - -2.37600000000E-05 7.08100000000E-05 1.78200000000E-05 - -4.35000000000E-06 -6.94000000000E-06 -3.48020000000E-04 - 5.01200000000E-05 6.57000000000E-06 9.60000000000E-06 - -2.75000000000E-05 6.91700000000E-05 -2.71950000000E-04 - -8.11600000000E-05 8.23400000000E-05 8.96200000000E-05 - 6.24200000000E-05 2.52600000000E-05 6.70300000000E-05 - -8.41000000000E-06 -2.15900000000E-05 -7.75300000000E-05 - 3.14620000000E-04 1.47010000000E-04 -3.82970000000E-04 - 3.14490000000E-04 -1.43690000000E-04 2.73920000000E-04 - 3.01990000000E-04 -3.86560000000E-04 6.99800000000E-05 - 7.54300000000E-05 1.83740000000E-04 -5.76600000000E-05 - 8.78900000000E-05 1.93100000000E-05 6.86770000000E-04 - 8.80100000000E-05 -1.65300000000E-05 -1.37110000000E-04 - 3.27170000000E-04 3.88550000000E-04 -2.21950000000E-04 - 1.00920000000E-04 -1.82260000000E-04 -9.31700000000E-05 - -1.56560000000E-04 -1.19490000000E-04 1.60760000000E-04 - 4.92583000000E-03 -3.42773000000E-03 3.36682000000E-03 - -6.72100000000E-05 2.30600000000E-05 -3.64730000000E-04 - 3.43740000000E-04 3.20000000000E-07 5.67000000000E-06 - 2.65430000000E-04 -8.00400000000E-05 -2.62500000000E-04 - -1.44300000000E-04 -1.02370000000E-04 1.01310000000E-04 - 5.01820000000E-03 3.32081000000E-03 -3.28001000000E-03 - -7.10000000000E-05 1.82700000000E-05 -7.66700000000E-05 - 2.11353600000E-02 -1.39280000000E-04 3.02800000000E-04 - -3.92240000000E-04 -1.50810000000E-04 3.25930000000E-04 - 4.98230000000E-04 2.97040000000E-04 -4.98290000000E-04 - 6.40960000000E-04 -1.37850000000E-04 1.65900000000E-04 - -1.89680000000E-04 -1.16900000000E-05 7.55900000000E-05 - 6.98810000000E-04 -1.11600000000E-05 7.57700000000E-05 - 8.06720000000E-04 3.05180000000E-04 -8.04840000000E-04 - 6.56850000000E-04 -1.32380000000E-04 -1.31320000000E-04 - -1.57495000000E-03 -6.78685000000E-03 1.58845000000E-03 - 1.58240000000E-04 -1.08690000000E-04 -9.66100000000E-05 - -3.65040000000E-04 -1.42000000000E-05 -6.14500000000E-05 - 6.87300000000E-05 2.69100000000E-05 7.00200000000E-05 - 1.69100000000E-04 -1.14800000000E-04 -1.54260000000E-04 - -2.64330000000E-04 -7.91000000000E-05 -2.37800000000E-05 - -3.67104000000E-03 -3.72117000000E-03 5.22886000000E-03 - -5.01633000000E-03 3.33072000000E-03 3.35017000000E-03 - -2.95670000000E-04 -1.40100000000E-04 -2.11278300000E-02 - -3.15210000000E-04 1.47130000000E-04 3.37440000000E-04 - -1.66020000000E-04 -5.81800000000E-04 1.65740000000E-04 - 6.42600000000E-05 3.86650000000E-04 3.08360000000E-04 - -8.83600000000E-05 -1.67300000000E-05 1.77160000000E-04 - -8.72300000000E-05 1.84700000000E-05 -6.78100000000E-05 - -4.59760000000E-04 5.84560000000E-04 4.61450000000E-04 - -2.39820000000E-04 -3.84420000000E-04 3.43720000000E-04 - 3.76373000000E-03 3.80794000000E-03 5.13580000000E-03 - 9.84800000000E-05 1.12040000000E-04 -9.49700000000E-05 - -7.48600000000E-05 1.86700000000E-05 -6.08600000000E-05 - 1.19000000000E-06 -7.22000000000E-06 6.06700000000E-05 - 1.02640000000E-04 9.64800000000E-05 -1.46140000000E-04 - 2.50200000000E-05 6.50500000000E-05 -2.28300000000E-05 - -3.34595000000E-03 3.33002000000E-03 5.03027000000E-03 - -6.31700000000E-05 1.46100000000E-05 -2.77000000000E-06 - -3.38720000000E-04 1.46200000000E-04 3.15930000000E-04 - 2.82770000000E-04 1.54350000000E-04 3.26190000000E-04 - -1.72180000000E-04 -1.51280000000E-04 -6.52590000000E-04 - -2.18500000000E-05 -3.60200000000E-05 3.90400000000E-05 - 7.99700000000E-05 1.35300000000E-05 7.44700000000E-05 - -1.48700000000E-04 1.35600000000E-05 7.57200000000E-05 - 1.35100000000E-04 -1.18950000000E-04 -6.70490000000E-04 - -7.96000000000E-06 -1.23700000000E-05 1.51200000000E-05 - 7.38500000000E-05 -1.08670000000E-04 -1.43560000000E-04 - 1.68700000000E-05 -8.13000000000E-05 -2.32200000000E-05 - 1.09500000000E-05 -4.82000000000E-06 3.43770000000E-04 - -5.97500000000E-05 -9.00000000000E-08 -6.20000000000E-06 - 1.75100000000E-05 -7.90000000000E-05 2.65090000000E-04 - 8.87600000000E-05 -7.46500000000E-05 -8.06000000000E-05 - -7.39300000000E-05 -2.24800000000E-05 -6.19000000000E-05 - -1.17200000000E-05 7.54000000000E-06 5.84900000000E-05 - -3.27010000000E-04 -1.49850000000E-04 3.93100000000E-04 - -3.27170000000E-04 1.53430000000E-04 -2.84030000000E-04 - -3.14460000000E-04 3.99990000000E-04 -7.61300000000E-05 - -5.05900000000E-05 -2.04950000000E-04 6.79400000000E-05 - -6.43900000000E-05 -7.52000000000E-06 -7.10390000000E-04 - -6.33500000000E-05 8.64000000000E-06 1.60860000000E-04 - -3.39820000000E-04 -3.97880000000E-04 2.26070000000E-04 - -7.56100000000E-05 2.06460000000E-04 8.30300000000E-05 - 1.48940000000E-04 1.28940000000E-04 -1.45170000000E-04 - -5.13971000000E-03 3.81437000000E-03 -3.76804000000E-03 - 5.69100000000E-05 -6.06000000000E-06 3.72870000000E-04 - -3.48520000000E-04 2.37000000000E-06 -1.00400000000E-05 - -2.72030000000E-04 7.22000000000E-05 2.74550000000E-04 - 1.34340000000E-04 8.12100000000E-05 -1.14690000000E-04 - -5.22463000000E-03 -3.72066000000E-03 3.68507000000E-03 - 5.74500000000E-05 -2.94900000000E-05 5.94000000000E-05 - 2.05592400000E-02 1.45700000000E-04 -3.14200000000E-04 - 2.00140000000E-04 1.44280000000E-04 -3.15470000000E-04 - 7.98540000000E-04 -1.35000000000E-05 7.96840000000E-04 - 6.67360000000E-04 -1.64030000000E-04 1.37910000000E-04 - 4.67000000000E-06 1.17100000000E-05 -7.57600000000E-05 - 5.03790000000E-04 1.10800000000E-05 -7.55800000000E-05 - 5.09720000000E-04 4.56000000000E-06 4.94830000000E-04 - 6.32010000000E-04 -1.59110000000E-04 -1.61060000000E-04 - -8.73632000000E-03 4.02700000000E-04 -8.55170000000E-03 - 5.31000000000E-05 -2.41000000000E-06 -2.80000000000E-05 - -2.39460000000E-04 9.32000000000E-05 1.39170000000E-04 - 1.46740000000E-04 1.00910000000E-04 3.83500000000E-05 - 4.52200000000E-05 -7.91000000000E-06 4.63400000000E-05 - -3.39270000000E-04 -5.25000000000E-06 -5.44400000000E-05 - 3.49882000000E-03 3.44865000000E-03 -4.90792000000E-03 - -4.91230000000E-03 3.43703000000E-03 3.41776000000E-03 - -3.36760000000E-04 -1.50420000000E-04 2.05426400000E-02 - -3.14020000000E-04 1.45410000000E-04 2.44810000000E-04 - -4.69540000000E-04 8.08000000000E-06 -4.68650000000E-04 - -2.33700000000E-04 -2.07870000000E-04 -3.33110000000E-04 - -8.75300000000E-05 -1.85100000000E-05 -6.64000000000E-06 - -8.86700000000E-05 1.65100000000E-05 -1.02630000000E-04 - -1.63090000000E-04 -1.06000000000E-05 -1.79360000000E-04 - 5.73100000000E-05 2.05710000000E-04 -2.98170000000E-04 - -3.40219000000E-03 -3.35027000000E-03 -5.00259000000E-03 - -6.67000000000E-06 9.19000000000E-06 -2.58500000000E-05 - 5.05700000000E-05 -8.42200000000E-05 1.38190000000E-04 - 7.89000000000E-05 -7.73400000000E-05 3.00800000000E-05 - -2.17700000000E-05 -6.81000000000E-06 5.51100000000E-05 - -5.02600000000E-05 -5.02000000000E-06 -5.41500000000E-05 - 3.82150000000E-03 -3.83477000000E-03 -5.10563000000E-03 - 4.18500000000E-05 -8.88100000000E-05 6.61800000000E-05 - 2.53560000000E-04 -1.52510000000E-04 -3.26310000000E-04 - -3.09250000000E-04 -1.47860000000E-04 -3.15670000000E-04 - 1.24770000000E-04 1.45250000000E-04 6.46320000000E-04 - 3.96000000000E-06 -1.32200000000E-05 9.36000000000E-06 - -1.13530000000E-04 -1.36500000000E-05 -7.47100000000E-05 - 4.58600000000E-05 -1.36400000000E-05 -7.54700000000E-05 - -1.61000000000E-04 1.76290000000E-04 6.28440000000E-04 - -3.28100000000E-05 1.11500000000E-05 -1.43900000000E-05 - -3.07800000000E-05 1.66700000000E-05 5.74800000000E-05 - -5.45500000000E-05 -5.50000000000E-07 -5.41700000000E-05 - 8.80300000000E-05 7.33900000000E-05 -2.68610000000E-04 - 1.86800000000E-05 8.00400000000E-05 8.46000000000E-05 - -5.87000000000E-05 -8.20000000000E-07 -3.49390000000E-04 - 1.06000000000E-05 5.58000000000E-06 1.12800000000E-05 - 3.10200000000E-05 1.03490000000E-04 1.38940000000E-04 - 6.01800000000E-05 8.55400000000E-05 2.80500000000E-05 - -3.26820000000E-04 -1.51690000000E-04 2.09110000000E-04 - -3.26560000000E-04 1.48330000000E-04 -3.18300000000E-04 - -3.39430000000E-04 2.03360000000E-04 -2.25740000000E-04 - -7.56300000000E-05 -1.20100000000E-05 -8.30100000000E-05 - -6.27600000000E-05 -9.23000000000E-06 4.93230000000E-04 - -6.28300000000E-05 6.68000000000E-06 5.72100000000E-05 - -3.13860000000E-04 -2.05620000000E-04 7.54100000000E-05 - -5.05900000000E-05 1.03800000000E-05 -6.74200000000E-05 - 4.29800000000E-05 5.46000000000E-06 5.63400000000E-05 - -5.20937000000E-03 3.74585000000E-03 -3.79860000000E-03 - 1.33450000000E-04 -8.00400000000E-05 -2.41680000000E-04 - -2.70920000000E-04 -7.39100000000E-05 8.12200000000E-05 - -3.47050000000E-04 -5.10000000000E-07 -3.39860000000E-04 - 5.56900000000E-05 4.56000000000E-06 -2.22400000000E-05 - -5.11957000000E-03 -3.84068000000E-03 3.88225000000E-03 - 1.29260000000E-04 -1.03920000000E-04 2.90600000000E-05 diff --git a/example/Si/reference/si222.bands b/example/Si/reference/si222.bands index 768c8444..4c4fb96d 100644 --- a/example/Si/reference/si222.bands +++ b/example/Si/reference/si222.bands @@ -1,156 +1,156 @@ # G X G L # 0.000000 0.615817 1.486715 2.020028 # k-axis, Eigenvalues [cm^-1] -0.000000 1.097373e-10 1.097373e-10 1.097373e-10 5.053714e+02 5.053714e+02 5.053714e+02 -0.012316 6.132848e+00 6.132848e+00 1.033887e+01 5.052979e+02 5.052979e+02 5.053619e+02 -0.024633 1.225469e+01 1.225469e+01 2.066997e+01 5.050779e+02 5.050779e+02 5.053331e+02 -0.036949 1.835448e+01 1.835448e+01 3.098558e+01 5.047130e+02 5.047130e+02 5.052842e+02 -0.049265 2.442116e+01 2.442116e+01 4.127802e+01 5.042056e+02 5.042056e+02 5.052137e+02 -0.061582 3.044357e+01 3.044357e+01 5.153973e+01 5.035592e+02 5.035592e+02 5.051196e+02 -0.073898 3.641049e+01 3.641049e+01 6.176326e+01 5.027783e+02 5.027783e+02 5.049995e+02 -0.086214 4.231059e+01 4.231059e+01 7.194135e+01 5.018684e+02 5.018684e+02 5.048503e+02 -0.098531 4.813245e+01 4.813245e+01 8.206689e+01 5.008357e+02 5.008357e+02 5.046686e+02 -0.110847 5.386451e+01 5.386451e+01 9.213300e+01 4.996875e+02 4.996875e+02 5.044505e+02 -0.123163 5.949514e+01 5.949514e+01 1.021331e+02 4.984320e+02 4.984320e+02 5.041916e+02 -0.135480 6.501260e+01 6.501260e+01 1.120607e+02 4.970782e+02 4.970782e+02 5.038873e+02 -0.147796 7.040511e+01 7.040511e+01 1.219098e+02 4.956357e+02 4.956357e+02 5.035327e+02 -0.160113 7.566083e+01 7.566083e+01 1.316746e+02 4.941151e+02 4.941151e+02 5.031225e+02 -0.172429 8.076795e+01 8.076795e+01 1.413497e+02 4.925273e+02 4.925273e+02 5.026515e+02 -0.184745 8.571474e+01 8.571474e+01 1.509299e+02 4.908842e+02 4.908842e+02 5.021139e+02 -0.197062 9.048963e+01 9.048963e+01 1.604105e+02 4.891977e+02 4.891977e+02 5.015043e+02 -0.209378 9.508130e+01 9.508130e+01 1.697870e+02 4.874805e+02 4.874805e+02 5.008168e+02 -0.221694 9.947877e+01 9.947877e+01 1.790553e+02 4.857452e+02 4.857452e+02 5.000458e+02 -0.234011 1.036716e+02 1.036716e+02 1.882119e+02 4.840047e+02 4.840047e+02 4.991857e+02 -0.246327 1.076498e+02 1.076498e+02 1.972533e+02 4.822718e+02 4.822718e+02 4.982309e+02 -0.258643 1.114044e+02 1.114044e+02 2.061765e+02 4.805590e+02 4.805590e+02 4.971760e+02 -0.270960 1.149273e+02 1.149273e+02 2.149789e+02 4.788787e+02 4.788787e+02 4.960157e+02 -0.283276 1.182115e+02 1.182115e+02 2.236583e+02 4.772426e+02 4.772426e+02 4.947452e+02 -0.295592 1.212511e+02 1.212511e+02 2.322126e+02 4.756616e+02 4.756616e+02 4.933596e+02 -0.307909 1.240422e+02 1.240422e+02 2.406402e+02 4.741457e+02 4.741457e+02 4.918544e+02 -0.320225 1.265820e+02 1.265820e+02 2.489398e+02 4.727041e+02 4.727041e+02 4.902255e+02 -0.332541 1.288700e+02 1.288700e+02 2.571102e+02 4.713446e+02 4.713446e+02 4.884689e+02 -0.344858 1.309072e+02 1.309072e+02 2.651506e+02 4.700736e+02 4.700736e+02 4.865813e+02 -0.357174 1.326971e+02 1.326971e+02 2.730604e+02 4.688962e+02 4.688962e+02 4.845594e+02 -0.369490 1.342451e+02 1.342451e+02 2.808392e+02 4.678158e+02 4.678158e+02 4.824004e+02 -0.381807 1.355589e+02 1.355589e+02 2.884867e+02 4.668345e+02 4.668345e+02 4.801019e+02 -0.394123 1.366482e+02 1.366482e+02 2.960030e+02 4.659526e+02 4.659526e+02 4.776617e+02 -0.406440 1.375250e+02 1.375250e+02 3.033879e+02 4.651690e+02 4.651690e+02 4.750782e+02 -0.418756 1.382032e+02 1.382032e+02 3.106417e+02 4.644811e+02 4.644811e+02 4.723500e+02 -0.431072 1.386986e+02 1.386986e+02 3.177645e+02 4.638852e+02 4.638852e+02 4.694760e+02 -0.443389 1.390283e+02 1.390283e+02 3.247565e+02 4.633761e+02 4.633761e+02 4.664555e+02 -0.455705 1.392113e+02 1.392113e+02 3.316181e+02 4.629479e+02 4.629479e+02 4.632881e+02 -0.468021 1.392673e+02 1.392673e+02 3.383494e+02 4.599737e+02 4.625938e+02 4.625938e+02 -0.480338 1.392167e+02 1.392167e+02 3.449506e+02 4.565123e+02 4.623064e+02 4.623064e+02 -0.492654 1.390806e+02 1.390806e+02 3.514219e+02 4.529044e+02 4.620781e+02 4.620781e+02 -0.504970 1.388797e+02 1.388797e+02 3.577633e+02 4.491504e+02 4.619011e+02 4.619011e+02 -0.517287 1.386347e+02 1.386347e+02 3.639749e+02 4.452511e+02 4.617674e+02 4.617674e+02 -0.529603 1.383652e+02 1.383652e+02 3.700564e+02 4.412074e+02 4.616696e+02 4.616696e+02 -0.541919 1.380898e+02 1.380898e+02 3.760077e+02 4.370204e+02 4.616007e+02 4.616007e+02 -0.554236 1.378256e+02 1.378256e+02 3.818284e+02 4.326911e+02 4.615542e+02 4.615542e+02 -0.566552 1.375875e+02 1.375875e+02 3.875180e+02 4.282206e+02 4.615244e+02 4.615244e+02 -0.578868 1.373885e+02 1.373885e+02 3.930759e+02 4.236102e+02 4.615063e+02 4.615063e+02 -0.591185 1.372387e+02 1.372387e+02 3.985014e+02 4.188612e+02 4.614963e+02 4.614963e+02 -0.603501 1.371458e+02 1.371458e+02 4.037937e+02 4.139746e+02 4.614914e+02 4.614914e+02 -0.615817 1.371143e+02 1.371143e+02 4.089518e+02 4.089518e+02 4.614900e+02 4.614900e+02 -0.615817 1.371143e+02 1.371143e+02 4.089518e+02 4.089518e+02 4.614900e+02 4.614900e+02 -0.633235 1.372050e+02 1.378842e+02 4.084853e+02 4.085700e+02 4.614594e+02 4.617158e+02 -0.650653 1.374731e+02 1.401531e+02 4.071156e+02 4.074359e+02 4.613691e+02 4.623675e+02 -0.668071 1.379068e+02 1.438044e+02 4.049224e+02 4.055841e+02 4.612241e+02 4.633772e+02 -0.685489 1.384873e+02 1.486614e+02 4.020127e+02 4.030718e+02 4.610323e+02 4.646565e+02 -0.702907 1.391895e+02 1.545071e+02 3.984995e+02 3.999801e+02 4.608048e+02 4.661175e+02 -0.720325 1.399835e+02 1.611025e+02 3.944873e+02 3.964136e+02 4.605552e+02 4.676854e+02 -0.737743 1.408357e+02 1.681993e+02 3.900665e+02 3.925014e+02 4.602996e+02 4.693031e+02 -0.755161 1.417108e+02 1.755472e+02 3.853122e+02 3.883977e+02 4.600559e+02 4.709302e+02 -0.772579 1.425725e+02 1.828974e+02 3.802859e+02 3.842810e+02 4.598438e+02 4.725398e+02 -0.789997 1.433850e+02 1.900026e+02 3.750372e+02 3.803532e+02 4.596838e+02 4.741153e+02 -0.807415 1.441145e+02 1.966188e+02 3.696056e+02 3.768346e+02 4.595968e+02 4.756466e+02 -0.824833 1.447294e+02 2.025109e+02 3.640219e+02 3.739544e+02 4.596038e+02 4.771277e+02 -0.842251 1.452012e+02 2.074646e+02 3.583097e+02 3.719333e+02 4.597245e+02 4.785540e+02 -0.859669 1.455052e+02 2.113068e+02 3.524863e+02 3.709594e+02 4.599775e+02 4.799211e+02 -0.877087 1.456204e+02 2.139283e+02 3.465638e+02 3.711601e+02 4.603790e+02 4.812233e+02 -0.894505 1.455293e+02 2.153018e+02 3.405500e+02 3.725799e+02 4.609427e+02 4.824532e+02 -0.911923 1.452185e+02 2.154846e+02 3.344492e+02 3.751744e+02 4.616789e+02 4.836014e+02 -0.929340 1.446779e+02 2.146019e+02 3.282625e+02 3.788235e+02 4.625942e+02 4.846571e+02 -0.946758 1.439002e+02 2.128175e+02 3.219889e+02 3.833591e+02 4.636911e+02 4.856087e+02 -0.964176 1.428809e+02 2.103022e+02 3.156248e+02 3.885942e+02 4.649680e+02 4.864448e+02 -0.981594 1.416176e+02 2.072105e+02 3.091650e+02 3.943464e+02 4.664189e+02 4.871555e+02 -0.999012 1.401093e+02 2.036667e+02 3.026021e+02 4.004525e+02 4.680334e+02 4.877335e+02 -1.016430 1.383563e+02 1.997605e+02 2.959262e+02 4.067736e+02 4.697974e+02 4.881760e+02 -1.033848 1.363591e+02 1.955489e+02 2.891252e+02 4.131958e+02 4.716931e+02 4.884851e+02 -1.051266 1.341185e+02 1.910610e+02 2.821836e+02 4.196281e+02 4.736994e+02 4.886693e+02 -1.068684 1.316351e+02 1.863043e+02 2.750830e+02 4.259988e+02 4.757929e+02 4.887435e+02 -1.086102 1.289088e+02 1.812718e+02 2.678012e+02 4.322522e+02 4.779483e+02 4.887295e+02 -1.103520 1.259389e+02 1.759480e+02 2.603125e+02 4.383450e+02 4.801391e+02 4.886554e+02 -1.120938 1.227237e+02 1.703141e+02 2.525875e+02 4.442439e+02 4.823387e+02 4.885546e+02 -1.138356 1.192610e+02 1.643530e+02 2.445939e+02 4.499233e+02 4.845208e+02 4.884645e+02 -1.155774 1.155478e+02 1.580518e+02 2.362971e+02 4.553632e+02 4.866602e+02 4.884244e+02 -1.173192 1.115809e+02 1.514049e+02 2.276615e+02 4.605483e+02 4.884731e+02 4.887336e+02 -1.190610 1.073569e+02 1.444150e+02 2.186514e+02 4.654666e+02 4.886468e+02 4.907200e+02 -1.208028 1.028728e+02 1.370933e+02 2.092332e+02 4.701088e+02 4.889759e+02 4.926013e+02 -1.225446 9.812621e+01 1.294598e+02 1.993768e+02 4.744679e+02 4.894833e+02 4.943625e+02 -1.242864 9.311605e+01 1.215418e+02 1.890573e+02 4.785389e+02 4.901821e+02 4.959922e+02 -1.260281 8.784273e+01 1.133731e+02 1.782560e+02 4.823181e+02 4.910744e+02 4.974823e+02 -1.277699 8.230862e+01 1.049918e+02 1.669623e+02 4.858037e+02 4.921506e+02 4.988284e+02 -1.295117 7.651840e+01 9.643876e+01 1.551735e+02 4.889949e+02 4.933899e+02 5.000293e+02 -1.312535 7.047934e+01 8.775524e+01 1.428958e+02 4.918925e+02 4.947606e+02 5.010867e+02 -1.329953 6.420148e+01 7.898120e+01 1.301441e+02 4.944981e+02 4.962222e+02 5.020053e+02 -1.347371 5.769779e+01 7.015334e+01 1.169413e+02 4.968145e+02 4.977274e+02 5.027917e+02 -1.364789 5.098417e+01 6.130346e+01 1.033184e+02 4.988449e+02 4.992243e+02 5.034541e+02 -1.382207 4.407939e+01 5.245720e+01 8.931277e+01 5.005933e+02 5.006595e+02 5.040017e+02 -1.399625 3.700499e+01 4.363317e+01 7.496824e+01 5.019801e+02 5.020638e+02 5.044443e+02 -1.417043 2.978500e+01 3.484256e+01 6.033360e+01 5.031367e+02 5.032602e+02 5.047911e+02 -1.434461 2.244571e+01 2.608928e+01 4.546191e+01 5.040856e+02 5.041865e+02 5.050509e+02 -1.451879 1.501523e+01 1.737056e+01 3.040957e+01 5.047906e+02 5.048456e+02 5.052309e+02 -1.469297 7.523145e+00 8.678185e+00 1.523544e+01 5.052248e+02 5.052401e+02 5.053365e+02 -1.486715 1.097373e-10 1.097373e-10 1.097373e-10 5.053714e+02 5.053714e+02 5.053714e+02 -1.486715 1.097373e-10 1.097373e-10 1.097373e-10 5.053714e+02 5.053714e+02 5.053714e+02 -1.497381 4.853725e+00 4.853725e+00 9.458943e+00 5.053081e+02 5.053443e+02 5.053443e+02 -1.508047 9.695778e+00 9.695778e+00 1.891344e+01 5.051187e+02 5.052633e+02 5.052633e+02 -1.518714 1.451451e+01 1.451451e+01 2.835907e+01 5.048039e+02 5.051289e+02 5.051289e+02 -1.529380 1.929835e+01 1.929835e+01 3.779144e+01 5.043651e+02 5.049418e+02 5.049418e+02 -1.540046 2.403578e+01 2.403578e+01 4.720620e+01 5.038044e+02 5.047032e+02 5.047032e+02 -1.550712 2.871545e+01 2.871545e+01 5.659909e+01 5.031242e+02 5.044146e+02 5.044146e+02 -1.561379 3.332614e+01 3.332614e+01 6.596591e+01 5.023274e+02 5.040778e+02 5.040778e+02 -1.572045 3.785683e+01 3.785683e+01 7.530252e+01 5.014176e+02 5.036950e+02 5.036950e+02 -1.582711 4.229677e+01 4.229677e+01 8.460493e+01 5.003984e+02 5.032688e+02 5.032688e+02 -1.593378 4.663545e+01 4.663545e+01 9.386917e+01 4.992742e+02 5.028020e+02 5.028020e+02 -1.604044 5.086275e+01 5.086275e+01 1.030914e+02 4.980495e+02 5.022980e+02 5.022980e+02 -1.614710 5.496892e+01 5.496892e+01 1.122679e+02 4.967290e+02 5.017602e+02 5.017602e+02 -1.625376 5.894468e+01 5.894468e+01 1.213949e+02 4.953177e+02 5.011927e+02 5.011927e+02 -1.636043 6.278127e+01 6.278127e+01 1.304689e+02 4.938208e+02 5.005995e+02 5.005995e+02 -1.646709 6.647051e+01 6.647051e+01 1.394861e+02 4.922434e+02 4.999854e+02 4.999854e+02 -1.657375 7.000490e+01 7.000490e+01 1.484431e+02 4.905907e+02 4.993549e+02 4.993549e+02 -1.668041 7.337768e+01 7.337768e+01 1.573363e+02 4.888679e+02 4.987131e+02 4.987131e+02 -1.678708 7.658290e+01 7.658290e+01 1.661620e+02 4.870797e+02 4.980649e+02 4.980649e+02 -1.689374 7.961548e+01 7.961548e+01 1.749165e+02 4.852310e+02 4.974156e+02 4.974156e+02 -1.700040 8.247133e+01 8.247133e+01 1.835963e+02 4.833262e+02 4.967701e+02 4.967701e+02 -1.710706 8.514736e+01 8.514736e+01 1.921973e+02 4.813692e+02 4.961336e+02 4.961336e+02 -1.721373 8.764158e+01 8.764158e+01 2.007156e+02 4.793638e+02 4.955108e+02 4.955108e+02 -1.732039 8.995312e+01 8.995312e+01 2.091471e+02 4.773130e+02 4.949065e+02 4.949065e+02 -1.742705 9.208230e+01 9.208230e+01 2.174873e+02 4.752194e+02 4.943250e+02 4.943250e+02 -1.753372 9.403063e+01 9.403063e+01 2.257318e+02 4.730851e+02 4.937700e+02 4.937700e+02 -1.764038 9.580083e+01 9.580083e+01 2.338758e+02 4.709115e+02 4.932452e+02 4.932452e+02 -1.774704 9.739680e+01 9.739680e+01 2.419142e+02 4.686994e+02 4.927534e+02 4.927534e+02 -1.785370 9.882364e+01 9.882364e+01 2.498417e+02 4.664491e+02 4.922970e+02 4.922970e+02 -1.796037 1.000875e+02 1.000875e+02 2.576527e+02 4.641600e+02 4.918777e+02 4.918777e+02 -1.806703 1.011957e+02 1.011957e+02 2.653415e+02 4.618313e+02 4.914967e+02 4.914967e+02 -1.817369 1.021564e+02 1.021564e+02 2.729017e+02 4.594615e+02 4.911545e+02 4.911545e+02 -1.828035 1.029786e+02 1.029786e+02 2.803269e+02 4.570488e+02 4.908509e+02 4.908509e+02 -1.838702 1.036721e+02 1.036721e+02 2.876101e+02 4.545911e+02 4.905853e+02 4.905853e+02 -1.849368 1.042473e+02 1.042473e+02 2.947440e+02 4.520859e+02 4.903565e+02 4.903565e+02 -1.860034 1.047149e+02 1.047149e+02 3.017206e+02 4.495310e+02 4.901625e+02 4.901625e+02 -1.870701 1.050861e+02 1.050861e+02 3.085314e+02 4.469245e+02 4.900014e+02 4.900014e+02 -1.881367 1.053719e+02 1.053719e+02 3.151668e+02 4.442650e+02 4.898704e+02 4.898704e+02 -1.892033 1.055836e+02 1.055836e+02 3.216162e+02 4.415524e+02 4.897667e+02 4.897667e+02 -1.902699 1.057321e+02 1.057321e+02 3.278672e+02 4.387880e+02 4.896873e+02 4.896873e+02 -1.913366 1.058280e+02 1.058280e+02 3.339050e+02 4.359759e+02 4.896288e+02 4.896288e+02 -1.924032 1.058813e+02 1.058813e+02 3.397114e+02 4.331240e+02 4.895882e+02 4.895882e+02 -1.934698 1.059017e+02 1.059017e+02 3.452628e+02 4.302460e+02 4.895621e+02 4.895621e+02 -1.945364 1.058979e+02 1.058979e+02 3.505279e+02 4.273636e+02 4.895475e+02 4.895475e+02 -1.956031 1.058779e+02 1.058779e+02 3.554637e+02 4.245116e+02 4.895413e+02 4.895413e+02 -1.966697 1.058486e+02 1.058486e+02 3.600092e+02 4.217429e+02 4.895410e+02 4.895410e+02 -1.977363 1.058162e+02 1.058162e+02 3.640773e+02 4.191383e+02 4.895442e+02 4.895442e+02 -1.988030 1.057857e+02 1.057857e+02 3.675444e+02 4.168153e+02 4.895488e+02 4.895488e+02 -1.998696 1.057611e+02 1.057611e+02 3.702449e+02 4.149354e+02 4.895533e+02 4.895533e+02 -2.009362 1.057451e+02 1.057451e+02 3.719835e+02 4.136904e+02 4.895565e+02 4.895565e+02 -2.020028 1.057396e+02 1.057396e+02 3.725870e+02 4.132517e+02 4.895576e+02 4.895576e+02 +0.000000 1.097373e-10 1.097373e-10 1.097373e-10 5.129224e+02 5.129224e+02 5.129224e+02 +0.012316 6.009520e+00 6.009520e+00 1.022526e+01 5.128286e+02 5.128286e+02 5.128923e+02 +0.024633 1.200989e+01 1.200989e+01 2.044420e+01 5.125479e+02 5.125479e+02 5.128019e+02 +0.036949 1.799191e+01 1.799191e+01 3.065053e+01 5.120824e+02 5.120824e+02 5.126510e+02 +0.049265 2.394626e+01 2.394626e+01 4.083799e+01 5.114353e+02 5.114353e+02 5.124391e+02 +0.061582 2.986346e+01 2.986346e+01 5.100034e+01 5.106114e+02 5.106114e+02 5.121656e+02 +0.073898 3.573381e+01 3.573381e+01 6.113142e+01 5.096167e+02 5.096167e+02 5.118299e+02 +0.086214 4.154736e+01 4.154736e+01 7.122514e+01 5.084585e+02 5.084585e+02 5.114311e+02 +0.098531 4.729385e+01 4.729385e+01 8.127549e+01 5.071453e+02 5.071453e+02 5.109680e+02 +0.110847 5.296273e+01 5.296273e+01 9.127655e+01 5.056869e+02 5.056869e+02 5.104396e+02 +0.123163 5.854307e+01 5.854307e+01 1.012225e+02 5.040942e+02 5.040942e+02 5.098445e+02 +0.135480 6.402365e+01 6.402365e+01 1.111078e+02 5.023792e+02 5.023792e+02 5.091812e+02 +0.147796 6.939288e+01 6.939288e+01 1.209267e+02 5.005549e+02 5.005549e+02 5.084483e+02 +0.160113 7.463888e+01 7.463888e+01 1.306739e+02 4.986354e+02 4.986354e+02 5.076439e+02 +0.172429 7.974950e+01 7.974950e+01 1.403442e+02 4.966354e+02 4.966354e+02 5.067664e+02 +0.184745 8.471240e+01 8.471240e+01 1.499325e+02 4.945707e+02 4.945707e+02 5.058139e+02 +0.197062 8.951514e+01 8.951514e+01 1.594339e+02 4.924574e+02 4.924574e+02 5.047844e+02 +0.209378 9.414524e+01 9.414524e+01 1.688437e+02 4.903121e+02 4.903121e+02 5.036759e+02 +0.221694 9.859039e+01 9.859039e+01 1.781573e+02 4.881517e+02 4.881517e+02 5.024863e+02 +0.234011 1.028385e+02 1.028385e+02 1.873704e+02 4.859935e+02 4.859935e+02 5.012134e+02 +0.246327 1.068781e+02 1.068781e+02 1.964789e+02 4.838542e+02 4.838542e+02 4.998551e+02 +0.258643 1.106981e+02 1.106981e+02 2.054788e+02 4.817506e+02 4.817506e+02 4.984091e+02 +0.270960 1.142885e+02 1.142885e+02 2.143664e+02 4.796988e+02 4.796988e+02 4.968732e+02 +0.283276 1.176405e+02 1.176405e+02 2.231381e+02 4.777140e+02 4.777140e+02 4.952451e+02 +0.295592 1.207464e+02 1.207464e+02 2.317908e+02 4.758104e+02 4.758104e+02 4.935225e+02 +0.307909 1.236003e+02 1.236003e+02 2.403212e+02 4.740009e+02 4.740009e+02 4.917032e+02 +0.320225 1.261981e+02 1.261981e+02 2.487265e+02 4.722970e+02 4.722970e+02 4.897849e+02 +0.332541 1.285377e+02 1.285377e+02 2.570040e+02 4.707083e+02 4.707083e+02 4.877653e+02 +0.344858 1.306193e+02 1.306193e+02 2.651512e+02 4.692424e+02 4.692424e+02 4.856422e+02 +0.357174 1.324455e+02 1.324455e+02 2.731659e+02 4.679050e+02 4.679050e+02 4.834134e+02 +0.369490 1.340212e+02 1.340212e+02 2.810459e+02 4.666995e+02 4.666995e+02 4.810767e+02 +0.381807 1.353540e+02 1.353540e+02 2.887895e+02 4.656271e+02 4.656271e+02 4.786299e+02 +0.394123 1.364540e+02 1.364540e+02 2.963948e+02 4.646870e+02 4.646870e+02 4.760711e+02 +0.406440 1.373336e+02 1.373336e+02 3.038606e+02 4.638760e+02 4.638760e+02 4.733980e+02 +0.418756 1.380074e+02 1.380074e+02 3.111853e+02 4.631891e+02 4.631891e+02 4.706088e+02 +0.431072 1.384922e+02 1.384922e+02 3.183680e+02 4.626196e+02 4.626196e+02 4.677014e+02 +0.443389 1.388065e+02 1.388065e+02 3.254076e+02 4.621592e+02 4.621592e+02 4.646739e+02 +0.455705 1.389700e+02 1.389700e+02 3.323033e+02 4.615245e+02 4.617982e+02 4.617982e+02 +0.468021 1.390038e+02 1.390038e+02 3.390546e+02 4.582514e+02 4.615262e+02 4.615262e+02 +0.480338 1.389296e+02 1.389296e+02 3.456609e+02 4.548529e+02 4.613319e+02 4.613319e+02 +0.492654 1.387692e+02 1.387692e+02 3.521219e+02 4.513272e+02 4.612039e+02 4.612039e+02 +0.504970 1.385446e+02 1.385446e+02 3.584374e+02 4.476729e+02 4.611304e+02 4.611304e+02 +0.517287 1.382769e+02 1.382769e+02 3.646073e+02 4.438882e+02 4.611001e+02 4.611001e+02 +0.529603 1.379866e+02 1.379866e+02 3.706316e+02 4.399717e+02 4.611021e+02 4.611021e+02 +0.541919 1.376927e+02 1.376927e+02 3.765106e+02 4.359221e+02 4.611262e+02 4.611262e+02 +0.554236 1.374124e+02 1.374124e+02 3.822445e+02 4.317379e+02 4.611633e+02 4.611633e+02 +0.566552 1.371611e+02 1.371611e+02 3.878338e+02 4.274178e+02 4.612052e+02 4.612052e+02 +0.578868 1.369517e+02 1.369517e+02 3.932788e+02 4.229606e+02 4.612451e+02 4.612451e+02 +0.591185 1.367945e+02 1.367945e+02 3.985803e+02 4.183651e+02 4.612776e+02 4.612776e+02 +0.603501 1.366972e+02 1.366972e+02 4.037388e+02 4.136304e+02 4.612986e+02 4.612986e+02 +0.615817 1.366642e+02 1.366642e+02 4.087552e+02 4.087552e+02 4.613059e+02 4.613059e+02 +0.615817 1.366642e+02 1.366642e+02 4.087552e+02 4.087552e+02 4.613059e+02 4.613059e+02 +0.633235 1.367416e+02 1.374511e+02 4.082929e+02 4.083692e+02 4.612796e+02 4.615274e+02 +0.650653 1.369707e+02 1.397688e+02 4.069347e+02 4.072226e+02 4.612022e+02 4.621669e+02 +0.668071 1.373425e+02 1.434956e+02 4.047577e+02 4.053507e+02 4.610780e+02 4.631595e+02 +0.685489 1.378426e+02 1.484473e+02 4.018660e+02 4.028123e+02 4.609143e+02 4.644199e+02 +0.702907 1.384514e+02 1.543987e+02 3.983696e+02 3.996899e+02 4.607209e+02 4.658633e+02 +0.720325 1.391455e+02 1.611021e+02 3.943711e+02 3.960908e+02 4.605101e+02 4.674175e+02 +0.737743 1.398982e+02 1.683017e+02 3.899595e+02 3.921468e+02 4.602964e+02 4.690267e+02 +0.755161 1.406804e+02 1.757407e+02 3.852091e+02 3.880149e+02 4.600959e+02 4.706513e+02 +0.772579 1.414620e+02 1.831643e+02 3.801813e+02 3.838775e+02 4.599262e+02 4.722648e+02 +0.789997 1.422124e+02 1.903205e+02 3.749258e+02 3.799397e+02 4.598058e+02 4.738498e+02 +0.807415 1.429013e+02 1.969615e+02 3.694826e+02 3.764251e+02 4.597535e+02 4.753954e+02 +0.824833 1.434999e+02 2.028502e+02 3.638834e+02 3.735648e+02 4.597882e+02 4.768938e+02 +0.842251 1.439805e+02 2.077727e+02 3.581527e+02 3.715798e+02 4.599280e+02 4.783389e+02 +0.859669 1.443179e+02 2.115589e+02 3.523091e+02 3.706557e+02 4.601901e+02 4.797240e+02 +0.877087 1.444890e+02 2.141061e+02 3.463658e+02 3.709142e+02 4.605896e+02 4.810414e+02 +0.894505 1.444734e+02 2.153960e+02 3.403318e+02 3.723922e+02 4.611399e+02 4.822819e+02 +0.911923 1.442530e+02 2.154951e+02 3.342120e+02 3.750372e+02 4.618515e+02 4.834346e+02 +0.929340 1.438126e+02 2.145361e+02 3.280086e+02 3.787230e+02 4.627321e+02 4.844878e+02 +0.946758 1.431391e+02 2.126876e+02 3.217208e+02 3.832780e+02 4.637860e+02 4.854297e+02 +0.964176 1.422218e+02 2.101223e+02 3.153454e+02 3.885155e+02 4.650143e+02 4.862496e+02 +0.981594 1.410523e+02 2.069937e+02 3.088770e+02 3.942563e+02 4.664146e+02 4.869393e+02 +0.999012 1.396238e+02 2.034239e+02 3.023077e+02 4.003420e+02 4.679807e+02 4.874945e+02 +1.016430 1.379312e+02 1.994993e+02 2.956272e+02 4.066400e+02 4.697034e+02 4.879158e+02 +1.033848 1.359709e+02 1.952733e+02 2.888225e+02 4.130438e+02 4.715704e+02 4.882101e+02 +1.051266 1.337404e+02 1.907716e+02 2.818773e+02 4.194697e+02 4.735662e+02 4.883913e+02 +1.068684 1.312383e+02 1.859985e+02 2.747721e+02 4.258536e+02 4.756735e+02 4.884807e+02 +1.086102 1.284640e+02 1.809445e+02 2.674837e+02 4.321470e+02 4.778724e+02 4.885064e+02 +1.103520 1.254176e+02 1.755921e+02 2.599856e+02 4.383133e+02 4.801421e+02 4.885034e+02 +1.120938 1.220997e+02 1.699212e+02 2.522475e+02 4.443252e+02 4.824605e+02 4.885114e+02 +1.138356 1.185119e+02 1.639141e+02 2.442365e+02 4.501619e+02 4.848053e+02 4.885738e+02 +1.155774 1.146559e+02 1.575584e+02 2.359175e+02 4.558070e+02 4.871541e+02 4.887345e+02 +1.173192 1.105343e+02 1.508494e+02 2.272549e+02 4.612472e+02 4.890358e+02 4.894851e+02 +1.190610 1.061505e+02 1.437914e+02 2.182137e+02 4.664709e+02 4.895152e+02 4.917776e+02 +1.208028 1.015083e+02 1.363983e+02 2.087610e+02 4.714677e+02 4.902028e+02 4.940121e+02 +1.225446 9.661270e+01 1.286928e+02 1.988683e+02 4.762272e+02 4.911187e+02 4.961706e+02 +1.242864 9.146968e+01 1.207060e+02 1.885126e+02 4.807397e+02 4.922708e+02 4.982372e+02 +1.260281 8.608629e+01 1.124751e+02 1.776777e+02 4.849950e+02 4.936540e+02 5.001978e+02 +1.277699 8.047087e+01 1.040421e+02 1.663555e+02 4.889832e+02 4.952499e+02 5.020404e+02 +1.295117 7.463316e+01 9.545163e+01 1.545462e+02 4.926946e+02 4.970267e+02 5.037551e+02 +1.312535 6.858433e+01 8.674840e+01 1.422584e+02 4.961194e+02 4.989415e+02 5.053338e+02 +1.329953 6.233708e+01 7.797539e+01 1.295092e+02 4.992484e+02 5.009416e+02 5.067704e+02 +1.347371 5.590564e+01 6.917162e+01 1.163233e+02 5.020730e+02 5.029674e+02 5.080604e+02 +1.364789 4.930580e+01 6.037042e+01 1.027323e+02 5.045850e+02 5.049554e+02 5.092008e+02 +1.382207 4.255481e+01 5.159793e+01 8.877433e+01 5.067773e+02 5.068406e+02 5.101896e+02 +1.399625 3.567133e+01 4.287219e+01 7.449247e+01 5.085603e+02 5.086434e+02 5.110260e+02 +1.417043 2.867531e+01 3.420265e+01 5.993438e+01 5.100562e+02 5.101777e+02 5.117096e+02 +1.434461 2.158781e+01 2.559032e+01 4.515121e+01 5.112769e+02 5.113759e+02 5.122407e+02 +1.451879 1.443085e+01 1.702855e+01 3.019690e+01 5.121803e+02 5.122342e+02 5.126196e+02 +1.469297 7.227171e+00 8.504302e+00 1.512741e+01 5.127353e+02 5.127502e+02 5.128467e+02 +1.486715 1.097373e-10 1.097373e-10 1.097373e-10 5.129224e+02 5.129224e+02 5.129224e+02 +1.486715 1.097373e-10 1.097373e-10 1.097373e-10 5.129224e+02 5.129224e+02 5.129224e+02 +1.497381 4.699954e+00 4.699954e+00 9.402611e+00 5.128439e+02 5.128801e+02 5.128801e+02 +1.508047 9.389843e+00 9.389843e+00 1.880132e+01 5.126087e+02 5.127533e+02 5.127533e+02 +1.518714 1.405961e+01 1.405961e+01 2.819225e+01 5.122181e+02 5.125431e+02 5.125431e+02 +1.529380 1.869920e+01 1.869920e+01 3.757152e+01 5.116744e+02 5.122510e+02 5.122510e+02 +1.540046 2.329858e+01 2.329858e+01 4.693528e+01 5.109804e+02 5.118792e+02 5.118792e+02 +1.550712 2.784774e+01 2.784774e+01 5.627971e+01 5.101401e+02 5.114304e+02 5.114304e+02 +1.561379 3.233673e+01 3.233673e+01 6.560102e+01 5.091578e+02 5.109080e+02 5.109080e+02 +1.572045 3.675564e+01 3.675564e+01 7.489547e+01 5.080390e+02 5.103160e+02 5.103160e+02 +1.582711 4.109467e+01 4.109467e+01 8.415935e+01 5.067893e+02 5.096590e+02 5.096590e+02 +1.593378 4.534412e+01 4.534412e+01 9.338896e+01 5.054153e+02 5.089419e+02 5.089419e+02 +1.604044 4.949448e+01 4.949448e+01 1.025807e+02 5.039237e+02 5.081703e+02 5.081703e+02 +1.614710 5.353641e+01 5.353641e+01 1.117308e+02 5.023219e+02 5.073504e+02 5.073504e+02 +1.625376 5.746086e+01 5.746086e+01 1.208359e+02 5.006175e+02 5.064885e+02 5.064885e+02 +1.636043 6.125911e+01 6.125911e+01 1.298921e+02 4.988181e+02 5.055916e+02 5.055916e+02 +1.646709 6.492282e+01 6.492282e+01 1.388959e+02 4.969316e+02 5.046667e+02 5.046667e+02 +1.657375 6.844414e+01 6.844414e+01 1.478437e+02 4.949659e+02 5.037213e+02 5.037213e+02 +1.668041 7.181576e+01 7.181576e+01 1.567317e+02 4.929285e+02 5.027630e+02 5.027630e+02 +1.678708 7.503105e+01 7.503105e+01 1.655561e+02 4.908270e+02 5.017993e+02 5.017993e+02 +1.689374 7.808408e+01 7.808408e+01 1.743130e+02 4.886685e+02 5.008378e+02 5.008378e+02 +1.700040 8.096976e+01 8.096976e+01 1.829985e+02 4.864596e+02 4.998860e+02 4.998860e+02 +1.710706 8.368392e+01 8.368392e+01 1.916085e+02 4.842065e+02 4.989511e+02 4.989511e+02 +1.721373 8.622339e+01 8.622339e+01 2.001385e+02 4.819147e+02 4.980400e+02 4.980400e+02 +1.732039 8.858608e+01 8.858608e+01 2.085842e+02 4.795890e+02 4.971591e+02 4.971591e+02 +1.742705 9.077104e+01 9.077104e+01 2.169410e+02 4.772335e+02 4.963142e+02 4.963142e+02 +1.753372 9.277851e+01 9.277851e+01 2.252039e+02 4.748514e+02 4.955108e+02 4.955108e+02 +1.764038 9.460997e+01 9.460997e+01 2.333679e+02 4.724451e+02 4.947532e+02 4.947532e+02 +1.774704 9.626815e+01 9.626815e+01 2.414275e+02 4.700162e+02 4.940454e+02 4.940454e+02 +1.785370 9.775701e+01 9.775701e+01 2.493773e+02 4.675653e+02 4.933901e+02 4.933901e+02 +1.796037 9.908173e+01 9.908173e+01 2.572114e+02 4.650924e+02 4.927895e+02 4.927895e+02 +1.806703 1.002486e+02 1.002486e+02 2.649235e+02 4.625965e+02 4.922448e+02 4.922448e+02 +1.817369 1.012652e+02 1.012652e+02 2.725073e+02 4.600759e+02 4.917563e+02 4.917563e+02 +1.828035 1.021397e+02 1.021397e+02 2.799559e+02 4.575285e+02 4.913234e+02 4.913234e+02 +1.838702 1.028815e+02 1.028815e+02 2.872622e+02 4.549515e+02 4.909449e+02 4.909449e+02 +1.849368 1.035006e+02 1.035006e+02 2.944186e+02 4.523419e+02 4.906187e+02 4.906187e+02 +1.860034 1.040075e+02 1.040075e+02 3.014170e+02 4.496965e+02 4.903420e+02 4.903420e+02 +1.870701 1.044132e+02 1.044132e+02 3.082485e+02 4.470126e+02 4.901116e+02 4.901116e+02 +1.881367 1.047290e+02 1.047290e+02 3.149036e+02 4.442876e+02 4.899238e+02 4.899238e+02 +1.892033 1.049661e+02 1.049661e+02 3.213715e+02 4.415204e+02 4.897743e+02 4.897743e+02 +1.902699 1.051358e+02 1.051358e+02 3.276396e+02 4.387112e+02 4.896588e+02 4.896588e+02 +1.913366 1.052489e+02 1.052489e+02 3.336930e+02 4.358630e+02 4.895728e+02 4.895728e+02 +1.924032 1.053159e+02 1.053159e+02 3.395135e+02 4.329825e+02 4.895118e+02 4.895118e+02 +1.934698 1.053469e+02 1.053469e+02 3.450776e+02 4.300822e+02 4.894712e+02 4.894712e+02 +1.945364 1.053510e+02 1.053510e+02 3.503539e+02 4.271830e+02 4.894468e+02 4.894468e+02 +1.956031 1.053366e+02 1.053366e+02 3.552995e+02 4.243182e+02 4.894346e+02 4.894346e+02 +1.966697 1.053113e+02 1.053113e+02 3.598536e+02 4.215401e+02 4.894310e+02 4.894310e+02 +1.977363 1.052815e+02 1.052815e+02 3.639291e+02 4.189283e+02 4.894326e+02 4.894326e+02 +1.988030 1.052527e+02 1.052527e+02 3.674026e+02 4.166000e+02 4.894368e+02 4.894368e+02 +1.998696 1.052290e+02 1.052290e+02 3.701082e+02 4.147160e+02 4.894414e+02 4.894414e+02 +2.009362 1.052135e+02 1.052135e+02 3.718503e+02 4.134682e+02 4.894447e+02 4.894447e+02 +2.020028 1.052082e+02 1.052082e+02 3.724551e+02 4.130285e+02 4.894460e+02 4.894460e+02 diff --git a/example/Si/reference/si222.dos.Z b/example/Si/reference/si222.dos.Z deleted file mode 100644 index 40455860..00000000 Binary files a/example/Si/reference/si222.dos.Z and /dev/null differ diff --git a/example/Si/reference/si222.fcs b/example/Si/reference/si222.fcs index d282a8ae..285b3931 100644 --- a/example/Si/reference/si222.fcs +++ b/example/Si/reference/si222.fcs @@ -13,39 +13,39 @@ ---------------------------------------------------------------------- *FC2 - 1 1 2.7617453e-01 1 1x 1x 0.000 - 2 2 -1.2195057e-03 2 1x 2x 10.203 - 3 3 -6.2496693e-04 2 1x 33x 10.203 - 4 4 8.5935598e-03 1 1x 3x 7.215 - 5 5 1.9655898e-03 1 1x 3y 7.215 - 6 6 -4.2490872e-03 1 1x 17x 7.215 - 7 7 -3.9172885e-03 1 1x 17z 7.215 - 8 8 7.9671376e-03 4 1x 6x 14.429 - 9 9 -2.3601630e-04 4 1x 34x 14.429 - 10 10 -6.7104831e-02 1 1x 9x 4.418 - 11 11 -4.7380801e-02 1 1x 9y 4.418 - 12 12 1.3282532e-03 1 1x 10x 8.460 - 13 13 -8.2116209e-04 1 1x 10y 8.460 - 14 14 -6.9561306e-04 1 1x 10z 8.460 - 15 15 4.5271736e-04 1 1x 26x 8.460 - 16 16 -4.0571255e-03 1 1x 11x 11.118 - 17 17 5.0517278e-04 1 1x 11y 11.118 - 18 18 -2.0691115e-04 1 1x 25x 11.118 - 19 19 -4.7362015e-04 1 1x 25z 11.118 - 20 20 -1.0042599e-03 2 1x 20x 12.496 - 21 21 1.2863153e-03 2 1x 20y 12.496 - 22 22 -1.6874372e-04 2 1x 20z 12.496 - 23 23 -2.0122242e-04 2 1x 35x 12.496 - 24 24 6.0327036e-04 1 1x 28x 13.254 - 25 25 -5.1714558e-04 1 1x 28y 13.254 - 26 26 -6.9508388e-04 8 1x 38x 17.672 + 1 1 2.7613553e-01 1 1x 1x 0.000 + 2 2 -9.5252308e-04 2 1x 2x 10.203 + 3 3 -3.7574247e-04 2 1x 33x 10.203 + 4 4 8.8561868e-03 1 1x 3x 7.215 + 5 5 1.9633030e-03 1 1x 3y 7.215 + 6 6 -3.9798276e-03 1 1x 17x 7.215 + 7 7 -3.9080855e-03 1 1x 17z 7.215 + 8 8 8.2188178e-03 4 1x 6x 14.429 + 9 9 4.3878651e-05 4 1x 34x 14.429 + 10 10 -6.7358757e-02 1 1x 9x 4.418 + 11 11 -4.7360832e-02 1 1x 9y 4.418 + 12 12 1.0670028e-03 1 1x 10x 8.460 + 13 13 -8.2098635e-04 1 1x 10y 8.460 + 14 14 -6.9742830e-04 1 1x 10z 8.460 + 15 15 2.1135669e-04 1 1x 26x 8.460 + 16 16 -4.3031422e-03 1 1x 11x 11.118 + 17 17 5.0759340e-04 1 1x 11y 11.118 + 18 18 -4.7178438e-04 1 1x 25x 11.118 + 19 19 -4.7518256e-04 1 1x 25z 11.118 + 20 20 -7.4138963e-04 2 1x 20x 12.496 + 21 21 1.2900836e-03 2 1x 20y 12.496 + 22 22 -1.7263732e-04 2 1x 20z 12.496 + 23 23 6.4515756e-05 2 1x 35x 12.496 + 24 24 3.5369980e-04 1 1x 28x 13.254 + 25 25 -5.1486930e-04 1 1x 28y 13.254 + 26 26 -4.4876607e-04 8 1x 38x 17.672 ------------------------ All FCs below ------------------------ **FC2 - # FC2_1 6 2.7617453e-01 + # FC2_1 6 2.7613553e-01 1 1.00000 1x 1x 2 1.00000 1y 1y 3 1.00000 1z 1z @@ -53,7 +53,7 @@ 5 1.00000 9y 9y 6 1.00000 9z 9z - # FC2_2 12 -1.2195057e-03 + # FC2_2 12 -9.5252308e-04 1 1.00000 1x 2x 2 1.00000 1x 5x 3 1.00000 1y 2y @@ -67,7 +67,7 @@ 11 1.00000 9z 13z 12 1.00000 9z 41z - # FC2_3 6 -6.2496693e-04 + # FC2_3 6 -3.7574247e-04 1 1.00000 1x 33x 2 1.00000 1y 5y 3 1.00000 1z 2z @@ -75,7 +75,7 @@ 5 1.00000 9y 13y 6 1.00000 9z 10z - # FC2_4 24 8.5935598e-03 + # FC2_4 24 8.8561868e-03 1 1.00000 1x 3x 2 1.00000 1x 4x 3 1.00000 1x 7x @@ -101,7 +101,7 @@ 23 1.00000 9z 59z 24 1.00000 9z 63z - # FC2_5 96 1.9655898e-03 + # FC2_5 96 1.9633030e-03 1 1.00000 1x 3y 2 1.00000 1x 3z 3 -1.00000 1x 4y @@ -199,7 +199,7 @@ 95 1.00000 9z 63x 96 1.00000 9z 63y - # FC2_6 48 -4.2490872e-03 + # FC2_6 48 -3.9798276e-03 1 1.00000 1x 17x 2 1.00000 1x 18x 3 1.00000 1x 19x @@ -249,7 +249,7 @@ 47 1.00000 9z 57z 48 1.00000 9z 58z - # FC2_7 48 -3.9172885e-03 + # FC2_7 48 -3.9080855e-03 1 1.00000 1x 17z 2 -1.00000 1x 18z 3 1.00000 1x 19y @@ -299,7 +299,7 @@ 47 -1.00000 9z 57x 48 1.00000 9z 58x - # FC2_8 6 7.9671376e-03 + # FC2_8 6 8.2188178e-03 1 1.00000 1x 6x 2 1.00000 1y 34y 3 1.00000 1z 37z @@ -307,7 +307,7 @@ 5 1.00000 9y 42y 6 1.00000 9z 45z - # FC2_9 12 -2.3601630e-04 + # FC2_9 12 4.3878651e-05 1 1.00000 1x 34x 2 1.00000 1x 37x 3 1.00000 1y 6y @@ -321,7 +321,7 @@ 11 1.00000 9z 14z 12 1.00000 9z 42z - # FC2_10 24 -6.7104831e-02 + # FC2_10 24 -6.7358757e-02 1 1.00000 1x 9x 2 1.00000 1x 16x 3 1.00000 1x 58x @@ -347,7 +347,7 @@ 23 1.00000 9z 17z 24 1.00000 9z 19z - # FC2_11 48 -4.7380801e-02 + # FC2_11 48 -4.7360832e-02 1 1.00000 1x 9y 2 1.00000 1x 9z 3 -1.00000 1x 16y @@ -397,7 +397,7 @@ 47 -1.00000 9z 19x 48 -1.00000 9z 19y - # FC2_12 48 1.3282532e-03 + # FC2_12 48 1.0670028e-03 1 1.00000 1x 10x 2 1.00000 1x 12x 3 1.00000 1x 13x @@ -447,7 +447,7 @@ 47 1.00000 9z 49z 48 1.00000 9z 51z - # FC2_13 48 -8.2116209e-04 + # FC2_13 48 -8.2098635e-04 1 1.00000 1x 10y 2 -1.00000 1x 12z 3 1.00000 1x 13z @@ -497,7 +497,7 @@ 47 -1.00000 9z 49y 48 -1.00000 9z 51y - # FC2_14 96 -6.9561306e-04 + # FC2_14 96 -6.9742830e-04 1 1.00000 1x 10z 2 -1.00000 1x 12y 3 1.00000 1x 13y @@ -595,7 +595,7 @@ 95 1.00000 9z 49x 96 -1.00000 9z 51x - # FC2_15 24 4.5271736e-04 + # FC2_15 24 2.1135669e-04 1 1.00000 1x 26x 2 1.00000 1x 31x 3 1.00000 1x 41x @@ -621,7 +621,7 @@ 23 1.00000 9z 18z 24 1.00000 9z 20z - # FC2_16 24 -4.0571255e-03 + # FC2_16 24 -4.3031422e-03 1 1.00000 1x 11x 2 1.00000 1x 14x 3 1.00000 1x 60x @@ -647,7 +647,7 @@ 23 1.00000 9z 53z 24 1.00000 9z 55z - # FC2_17 96 5.0517278e-04 + # FC2_17 96 5.0759340e-04 1 1.00000 1x 11y 2 1.00000 1x 11z 3 -1.00000 1x 14y @@ -745,7 +745,7 @@ 95 1.00000 9z 55x 96 1.00000 9z 55y - # FC2_18 48 -2.0691115e-04 + # FC2_18 48 -4.7178438e-04 1 1.00000 1x 25x 2 1.00000 1x 27x 3 1.00000 1x 30x @@ -795,7 +795,7 @@ 47 1.00000 9z 50z 48 1.00000 9z 52z - # FC2_19 48 -4.7362015e-04 + # FC2_19 48 -4.7518256e-04 1 1.00000 1x 25z 2 1.00000 1x 27y 3 -1.00000 1x 30y @@ -845,7 +845,7 @@ 47 1.00000 9z 50x 48 -1.00000 9z 52x - # FC2_20 48 -1.0042599e-03 + # FC2_20 48 -7.4138963e-04 1 1.00000 1x 20x 2 1.00000 1x 21x 3 1.00000 1x 22x @@ -895,7 +895,7 @@ 47 1.00000 9z 61z 48 1.00000 9z 62z - # FC2_21 48 1.2863153e-03 + # FC2_21 48 1.2900836e-03 1 1.00000 1x 20y 2 1.00000 1x 21z 3 -1.00000 1x 22z @@ -945,7 +945,7 @@ 47 -1.00000 9z 61x 48 1.00000 9z 62x - # FC2_22 96 -1.6874372e-04 + # FC2_22 96 -1.7263732e-04 1 1.00000 1x 20z 2 1.00000 1x 21y 3 -1.00000 1x 22y @@ -1043,7 +1043,7 @@ 95 -1.00000 9z 64x 96 -1.00000 9z 64y - # FC2_23 24 -2.0122242e-04 + # FC2_23 24 6.4515756e-05 1 1.00000 1x 35x 2 1.00000 1x 36x 3 1.00000 1x 39x @@ -1069,7 +1069,7 @@ 23 1.00000 9z 60z 24 1.00000 9z 64z - # FC2_24 24 6.0327036e-04 + # FC2_24 24 3.5369980e-04 1 1.00000 1x 28x 2 1.00000 1x 29x 3 1.00000 1x 43x @@ -1095,7 +1095,7 @@ 23 1.00000 9z 54z 24 1.00000 9z 56z - # FC2_25 48 -5.1714558e-04 + # FC2_25 48 -5.1486930e-04 1 1.00000 1x 28y 2 -1.00000 1x 28z 3 -1.00000 1x 29y @@ -1145,7 +1145,7 @@ 47 -1.00000 9z 56x 48 -1.00000 9z 56y - # FC2_26 6 -6.9508388e-04 + # FC2_26 6 -4.4876607e-04 1 1.00000 1x 38x 2 1.00000 1y 38y 3 1.00000 1z 38z diff --git a/example/Si/reference/si222.kl b/example/Si/reference/si222.kl index 069ad09b..914a8ef8 100644 --- a/example/Si/reference/si222.kl +++ b/example/Si/reference/si222.kl @@ -1,102 +1,102 @@ # Temperature [K], Thermal Conductivity (xx, xy, xz, yx, yy, yz, zx, zy, zz) [W/mK] 0.00 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 - 10.00 173966.0581 0.0395 0.0395 0.0395 173966.0581 0.0395 0.0395 0.0395 173966.0581 - 20.00 40909.5292 0.0054 0.0054 0.0054 40909.5292 0.0053 0.0054 0.0053 40909.5292 - 30.00 16146.4703 0.0013 0.0013 0.0013 16146.4703 0.0013 0.0013 0.0013 16146.4703 - 40.00 9083.6744 0.0005 0.0005 0.0005 9083.6744 0.0005 0.0005 0.0005 9083.6744 - 50.00 5574.8940 0.0003 0.0003 0.0003 5574.8940 0.0003 0.0003 0.0003 5574.8940 - 60.00 3486.0097 0.0002 0.0002 0.0002 3486.0097 0.0002 0.0002 0.0002 3486.0097 - 70.00 2273.1778 0.0001 0.0001 0.0001 2273.1778 0.0001 0.0001 0.0001 2273.1778 - 80.00 1567.0976 0.0001 0.0001 0.0001 1567.0976 0.0001 0.0001 0.0001 1567.0976 - 90.00 1139.7368 0.0001 0.0001 0.0001 1139.7368 0.0001 0.0001 0.0001 1139.7368 - 100.00 868.1273 0.0000 0.0000 0.0000 868.1273 0.0000 0.0000 0.0000 868.1273 - 110.00 687.2012 0.0000 0.0000 0.0000 687.2012 0.0000 0.0000 0.0000 687.2012 - 120.00 561.5218 0.0000 0.0000 0.0000 561.5218 0.0000 0.0000 0.0000 561.5218 - 130.00 470.9709 0.0000 0.0000 0.0000 470.9709 0.0000 0.0000 0.0000 470.9709 - 140.00 403.6279 0.0000 0.0000 0.0000 403.6279 0.0000 0.0000 0.0000 403.6279 - 150.00 352.1464 0.0000 0.0000 0.0000 352.1464 0.0000 0.0000 0.0000 352.1464 - 160.00 311.8342 0.0000 0.0000 0.0000 311.8342 0.0000 0.0000 0.0000 311.8342 - 170.00 279.5992 0.0000 0.0000 0.0000 279.5992 0.0000 0.0000 0.0000 279.5992 - 180.00 253.3438 0.0000 0.0000 0.0000 253.3438 0.0000 0.0000 0.0000 253.3438 - 190.00 231.6094 0.0000 0.0000 0.0000 231.6094 0.0000 0.0000 0.0000 231.6094 - 200.00 213.3580 0.0000 0.0000 0.0000 213.3580 0.0000 0.0000 0.0000 213.3580 - 210.00 197.8362 0.0000 0.0000 0.0000 197.8362 0.0000 0.0000 0.0000 197.8362 - 220.00 184.4860 0.0000 0.0000 0.0000 184.4860 0.0000 0.0000 0.0000 184.4860 - 230.00 172.8879 0.0000 0.0000 0.0000 172.8879 0.0000 0.0000 0.0000 172.8879 - 240.00 162.7210 0.0000 0.0000 0.0000 162.7210 0.0000 0.0000 0.0000 162.7210 - 250.00 153.7369 0.0000 0.0000 0.0000 153.7369 0.0000 0.0000 0.0000 153.7369 - 260.00 145.7402 0.0000 0.0000 0.0000 145.7402 0.0000 0.0000 0.0000 145.7402 - 270.00 138.5757 0.0000 0.0000 0.0000 138.5757 0.0000 0.0000 0.0000 138.5757 - 280.00 132.1189 0.0000 0.0000 0.0000 132.1189 0.0000 0.0000 0.0000 132.1189 - 290.00 126.2688 0.0000 0.0000 0.0000 126.2688 0.0000 0.0000 0.0000 126.2688 - 300.00 120.9422 0.0000 0.0000 0.0000 120.9422 0.0000 0.0000 0.0000 120.9422 - 310.00 116.0708 0.0000 0.0000 0.0000 116.0708 0.0000 0.0000 0.0000 116.0708 - 320.00 111.5975 0.0000 0.0000 0.0000 111.5975 0.0000 0.0000 0.0000 111.5975 - 330.00 107.4744 0.0000 0.0000 0.0000 107.4744 0.0000 0.0000 0.0000 107.4744 - 340.00 103.6611 0.0000 0.0000 0.0000 103.6611 0.0000 0.0000 0.0000 103.6611 - 350.00 100.1230 0.0000 0.0000 0.0000 100.1230 0.0000 0.0000 0.0000 100.1230 - 360.00 96.8305 0.0000 0.0000 0.0000 96.8305 0.0000 0.0000 0.0000 96.8305 - 370.00 93.7585 0.0000 0.0000 0.0000 93.7585 0.0000 0.0000 0.0000 93.7585 - 380.00 90.8849 0.0000 0.0000 0.0000 90.8849 0.0000 0.0000 0.0000 90.8849 - 390.00 88.1906 0.0000 0.0000 0.0000 88.1906 0.0000 0.0000 0.0000 88.1906 - 400.00 85.6588 0.0000 0.0000 0.0000 85.6588 0.0000 0.0000 0.0000 85.6588 - 410.00 83.2749 0.0000 0.0000 0.0000 83.2749 0.0000 0.0000 0.0000 83.2749 - 420.00 81.0258 0.0000 0.0000 0.0000 81.0258 0.0000 0.0000 0.0000 81.0258 - 430.00 78.9003 0.0000 0.0000 0.0000 78.9003 0.0000 0.0000 0.0000 78.9003 - 440.00 76.8881 0.0000 0.0000 0.0000 76.8881 0.0000 0.0000 0.0000 76.8881 - 450.00 74.9801 0.0000 0.0000 0.0000 74.9801 0.0000 0.0000 0.0000 74.9801 - 460.00 73.1683 0.0000 0.0000 0.0000 73.1683 0.0000 0.0000 0.0000 73.1683 - 470.00 71.4453 0.0000 0.0000 0.0000 71.4453 0.0000 0.0000 0.0000 71.4453 - 480.00 69.8047 0.0000 0.0000 0.0000 69.8047 0.0000 0.0000 0.0000 69.8047 - 490.00 68.2404 0.0000 0.0000 0.0000 68.2404 0.0000 0.0000 0.0000 68.2404 - 500.00 66.7471 0.0000 0.0000 0.0000 66.7471 0.0000 0.0000 0.0000 66.7471 - 510.00 65.3201 0.0000 0.0000 0.0000 65.3201 0.0000 0.0000 0.0000 65.3201 - 520.00 63.9548 0.0000 0.0000 0.0000 63.9548 0.0000 0.0000 0.0000 63.9548 - 530.00 62.6473 0.0000 0.0000 0.0000 62.6473 0.0000 0.0000 0.0000 62.6473 - 540.00 61.3938 0.0000 0.0000 0.0000 61.3938 0.0000 0.0000 0.0000 61.3938 - 550.00 60.1910 0.0000 0.0000 0.0000 60.1910 0.0000 0.0000 0.0000 60.1910 - 560.00 59.0359 0.0000 0.0000 0.0000 59.0359 0.0000 0.0000 0.0000 59.0359 - 570.00 57.9256 0.0000 0.0000 0.0000 57.9256 0.0000 0.0000 0.0000 57.9256 - 580.00 56.8574 0.0000 0.0000 0.0000 56.8574 0.0000 0.0000 0.0000 56.8574 - 590.00 55.8290 0.0000 0.0000 0.0000 55.8290 0.0000 0.0000 0.0000 55.8290 - 600.00 54.8381 0.0000 0.0000 0.0000 54.8381 0.0000 0.0000 0.0000 54.8381 - 610.00 53.8827 0.0000 0.0000 0.0000 53.8827 0.0000 0.0000 0.0000 53.8827 - 620.00 52.9608 0.0000 0.0000 0.0000 52.9608 0.0000 0.0000 0.0000 52.9608 - 630.00 52.0707 0.0000 0.0000 0.0000 52.0707 0.0000 0.0000 0.0000 52.0707 - 640.00 51.2108 0.0000 0.0000 0.0000 51.2108 0.0000 0.0000 0.0000 51.2108 - 650.00 50.3795 0.0000 0.0000 0.0000 50.3795 0.0000 0.0000 0.0000 50.3795 - 660.00 49.5753 0.0000 0.0000 0.0000 49.5753 0.0000 0.0000 0.0000 49.5753 - 670.00 48.7970 0.0000 0.0000 0.0000 48.7970 0.0000 0.0000 0.0000 48.7970 - 680.00 48.0433 0.0000 0.0000 0.0000 48.0433 0.0000 0.0000 0.0000 48.0433 - 690.00 47.3130 0.0000 0.0000 0.0000 47.3130 0.0000 0.0000 0.0000 47.3130 - 700.00 46.6050 0.0000 0.0000 0.0000 46.6050 0.0000 0.0000 0.0000 46.6050 - 710.00 45.9183 0.0000 0.0000 0.0000 45.9183 0.0000 0.0000 0.0000 45.9183 - 720.00 45.2520 0.0000 0.0000 0.0000 45.2520 0.0000 0.0000 0.0000 45.2520 - 730.00 44.6051 0.0000 0.0000 0.0000 44.6051 0.0000 0.0000 0.0000 44.6051 - 740.00 43.9767 0.0000 0.0000 0.0000 43.9767 0.0000 0.0000 0.0000 43.9767 - 750.00 43.3662 0.0000 0.0000 0.0000 43.3662 0.0000 0.0000 0.0000 43.3662 - 760.00 42.7727 0.0000 0.0000 0.0000 42.7727 0.0000 0.0000 0.0000 42.7727 - 770.00 42.1954 0.0000 0.0000 0.0000 42.1954 0.0000 0.0000 0.0000 42.1954 - 780.00 41.6339 0.0000 0.0000 0.0000 41.6339 0.0000 0.0000 0.0000 41.6339 - 790.00 41.0873 0.0000 0.0000 0.0000 41.0873 0.0000 0.0000 0.0000 41.0873 - 800.00 40.5551 0.0000 0.0000 0.0000 40.5551 0.0000 0.0000 0.0000 40.5551 - 810.00 40.0367 0.0000 0.0000 0.0000 40.0367 0.0000 0.0000 0.0000 40.0367 - 820.00 39.5316 0.0000 0.0000 0.0000 39.5316 0.0000 0.0000 0.0000 39.5316 - 830.00 39.0393 0.0000 0.0000 0.0000 39.0393 0.0000 0.0000 0.0000 39.0393 - 840.00 38.5593 0.0000 0.0000 0.0000 38.5593 0.0000 0.0000 0.0000 38.5593 - 850.00 38.0912 0.0000 0.0000 0.0000 38.0912 0.0000 0.0000 0.0000 38.0912 - 860.00 37.6344 0.0000 0.0000 0.0000 37.6344 0.0000 0.0000 0.0000 37.6344 - 870.00 37.1886 0.0000 0.0000 0.0000 37.1886 0.0000 0.0000 0.0000 37.1886 - 880.00 36.7534 0.0000 0.0000 0.0000 36.7534 0.0000 0.0000 0.0000 36.7534 - 890.00 36.3284 0.0000 0.0000 0.0000 36.3284 0.0000 0.0000 0.0000 36.3284 - 900.00 35.9132 0.0000 0.0000 0.0000 35.9132 0.0000 0.0000 0.0000 35.9132 - 910.00 35.5075 0.0000 0.0000 0.0000 35.5075 0.0000 0.0000 0.0000 35.5075 - 920.00 35.1111 0.0000 0.0000 0.0000 35.1111 0.0000 0.0000 0.0000 35.1111 - 930.00 34.7234 0.0000 0.0000 0.0000 34.7234 0.0000 0.0000 0.0000 34.7234 - 940.00 34.3444 0.0000 0.0000 0.0000 34.3444 0.0000 0.0000 0.0000 34.3444 - 950.00 33.9736 0.0000 0.0000 0.0000 33.9736 0.0000 0.0000 0.0000 33.9736 - 960.00 33.6108 0.0000 0.0000 0.0000 33.6108 0.0000 0.0000 0.0000 33.6108 - 970.00 33.2558 0.0000 0.0000 0.0000 33.2558 0.0000 0.0000 0.0000 33.2558 - 980.00 32.9083 0.0000 0.0000 0.0000 32.9083 0.0000 0.0000 0.0000 32.9083 - 990.00 32.5681 0.0000 0.0000 0.0000 32.5681 0.0000 0.0000 0.0000 32.5681 - 1000.00 32.2349 0.0000 0.0000 0.0000 32.2349 0.0000 0.0000 0.0000 32.2349 + 10.00 225209.5714 0.0653 0.0653 0.0653 225209.5714 0.0653 0.0653 0.0653 225209.5714 + 20.00 41749.4771 0.0075 0.0075 0.0075 41749.4771 0.0075 0.0075 0.0075 41749.4771 + 30.00 15132.4627 0.0018 0.0018 0.0018 15132.4627 0.0018 0.0018 0.0018 15132.4627 + 40.00 7964.9345 0.0007 0.0007 0.0007 7964.9345 0.0007 0.0007 0.0007 7964.9345 + 50.00 4980.8468 0.0003 0.0003 0.0003 4980.8468 0.0003 0.0003 0.0003 4980.8468 + 60.00 3211.6529 0.0002 0.0002 0.0002 3211.6529 0.0002 0.0002 0.0002 3211.6529 + 70.00 2127.0914 0.0001 0.0001 0.0001 2127.0914 0.0001 0.0001 0.0001 2127.0914 + 80.00 1476.8736 0.0001 0.0001 0.0001 1476.8736 0.0001 0.0001 0.0001 1476.8736 + 90.00 1077.5895 0.0001 0.0001 0.0001 1077.5895 0.0001 0.0001 0.0001 1077.5895 + 100.00 821.6156 0.0001 0.0001 0.0001 821.6156 0.0001 0.0001 0.0001 821.6156 + 110.00 650.1820 0.0000 0.0000 0.0000 650.1820 0.0000 0.0000 0.0000 650.1820 + 120.00 530.7335 0.0000 0.0000 0.0000 530.7335 0.0000 0.0000 0.0000 530.7335 + 130.00 444.5535 0.0000 0.0000 0.0000 444.5535 0.0000 0.0000 0.0000 444.5535 + 140.00 380.4462 0.0000 0.0000 0.0000 380.4462 0.0000 0.0000 0.0000 380.4462 + 150.00 331.4622 0.0000 0.0000 0.0000 331.4622 0.0000 0.0000 0.0000 331.4622 + 160.00 293.1417 0.0000 0.0000 0.0000 293.1417 0.0000 0.0000 0.0000 293.1417 + 170.00 262.5351 0.0000 0.0000 0.0000 262.5351 0.0000 0.0000 0.0000 262.5351 + 180.00 237.6381 0.0000 0.0000 0.0000 237.6381 0.0000 0.0000 0.0000 237.6381 + 190.00 217.0552 0.0000 0.0000 0.0000 217.0552 0.0000 0.0000 0.0000 217.0552 + 200.00 199.7934 0.0000 0.0000 0.0000 199.7934 0.0000 0.0000 0.0000 199.7934 + 210.00 185.1312 0.0000 0.0000 0.0000 185.1312 0.0000 0.0000 0.0000 185.1312 + 220.00 172.5351 0.0000 0.0000 0.0000 172.5351 0.0000 0.0000 0.0000 172.5351 + 230.00 161.6040 0.0000 0.0000 0.0000 161.6040 0.0000 0.0000 0.0000 161.6040 + 240.00 152.0315 0.0000 0.0000 0.0000 152.0315 0.0000 0.0000 0.0000 152.0315 + 250.00 143.5803 0.0000 0.0000 0.0000 143.5803 0.0000 0.0000 0.0000 143.5803 + 260.00 136.0644 0.0000 0.0000 0.0000 136.0644 0.0000 0.0000 0.0000 136.0644 + 270.00 129.3359 0.0000 0.0000 0.0000 129.3359 0.0000 0.0000 0.0000 129.3359 + 280.00 123.2763 0.0000 0.0000 0.0000 123.2763 0.0000 0.0000 0.0000 123.2763 + 290.00 117.7894 0.0000 0.0000 0.0000 117.7894 0.0000 0.0000 0.0000 117.7894 + 300.00 112.7965 0.0000 0.0000 0.0000 112.7965 0.0000 0.0000 0.0000 112.7965 + 310.00 108.2327 0.0000 0.0000 0.0000 108.2327 0.0000 0.0000 0.0000 108.2327 + 320.00 104.0439 0.0000 0.0000 0.0000 104.0439 0.0000 0.0000 0.0000 104.0439 + 330.00 100.1848 0.0000 0.0000 0.0000 100.1848 0.0000 0.0000 0.0000 100.1848 + 340.00 96.6169 0.0000 0.0000 0.0000 96.6169 0.0000 0.0000 0.0000 96.6169 + 350.00 93.3078 0.0000 0.0000 0.0000 93.3078 0.0000 0.0000 0.0000 93.3078 + 360.00 90.2295 0.0000 0.0000 0.0000 90.2295 0.0000 0.0000 0.0000 90.2295 + 370.00 87.3582 0.0000 0.0000 0.0000 87.3582 0.0000 0.0000 0.0000 87.3582 + 380.00 84.6731 0.0000 0.0000 0.0000 84.6731 0.0000 0.0000 0.0000 84.6731 + 390.00 82.1561 0.0000 0.0000 0.0000 82.1561 0.0000 0.0000 0.0000 82.1561 + 400.00 79.7915 0.0000 0.0000 0.0000 79.7915 0.0000 0.0000 0.0000 79.7915 + 410.00 77.5655 0.0000 0.0000 0.0000 77.5655 0.0000 0.0000 0.0000 77.5655 + 420.00 75.4659 0.0000 0.0000 0.0000 75.4659 0.0000 0.0000 0.0000 75.4659 + 430.00 73.4820 0.0000 0.0000 0.0000 73.4820 0.0000 0.0000 0.0000 73.4820 + 440.00 71.6041 0.0000 0.0000 0.0000 71.6041 0.0000 0.0000 0.0000 71.6041 + 450.00 69.8238 0.0000 0.0000 0.0000 69.8238 0.0000 0.0000 0.0000 69.8238 + 460.00 68.1335 0.0000 0.0000 0.0000 68.1335 0.0000 0.0000 0.0000 68.1335 + 470.00 66.5263 0.0000 0.0000 0.0000 66.5263 0.0000 0.0000 0.0000 66.5263 + 480.00 64.9960 0.0000 0.0000 0.0000 64.9960 0.0000 0.0000 0.0000 64.9960 + 490.00 63.5372 0.0000 0.0000 0.0000 63.5372 0.0000 0.0000 0.0000 63.5372 + 500.00 62.1448 0.0000 0.0000 0.0000 62.1448 0.0000 0.0000 0.0000 62.1448 + 510.00 60.8142 0.0000 0.0000 0.0000 60.8142 0.0000 0.0000 0.0000 60.8142 + 520.00 59.5413 0.0000 0.0000 0.0000 59.5413 0.0000 0.0000 0.0000 59.5413 + 530.00 58.3224 0.0000 0.0000 0.0000 58.3224 0.0000 0.0000 0.0000 58.3224 + 540.00 57.1540 0.0000 0.0000 0.0000 57.1540 0.0000 0.0000 0.0000 57.1540 + 550.00 56.0330 0.0000 0.0000 0.0000 56.0330 0.0000 0.0000 0.0000 56.0330 + 560.00 54.9564 0.0000 0.0000 0.0000 54.9564 0.0000 0.0000 0.0000 54.9564 + 570.00 53.9217 0.0000 0.0000 0.0000 53.9217 0.0000 0.0000 0.0000 53.9217 + 580.00 52.9263 0.0000 0.0000 0.0000 52.9263 0.0000 0.0000 0.0000 52.9263 + 590.00 51.9680 0.0000 0.0000 0.0000 51.9680 0.0000 0.0000 0.0000 51.9680 + 600.00 51.0447 0.0000 0.0000 0.0000 51.0447 0.0000 0.0000 0.0000 51.0447 + 610.00 50.1545 0.0000 0.0000 0.0000 50.1545 0.0000 0.0000 0.0000 50.1545 + 620.00 49.2957 0.0000 0.0000 0.0000 49.2957 0.0000 0.0000 0.0000 49.2957 + 630.00 48.4665 0.0000 0.0000 0.0000 48.4665 0.0000 0.0000 0.0000 48.4665 + 640.00 47.6654 0.0000 0.0000 0.0000 47.6654 0.0000 0.0000 0.0000 47.6654 + 650.00 46.8910 0.0000 0.0000 0.0000 46.8910 0.0000 0.0000 0.0000 46.8910 + 660.00 46.1420 0.0000 0.0000 0.0000 46.1420 0.0000 0.0000 0.0000 46.1420 + 670.00 45.4170 0.0000 0.0000 0.0000 45.4170 0.0000 0.0000 0.0000 45.4170 + 680.00 44.7150 0.0000 0.0000 0.0000 44.7150 0.0000 0.0000 0.0000 44.7150 + 690.00 44.0348 0.0000 0.0000 0.0000 44.0348 0.0000 0.0000 0.0000 44.0348 + 700.00 43.3754 0.0000 0.0000 0.0000 43.3754 0.0000 0.0000 0.0000 43.3754 + 710.00 42.7359 0.0000 0.0000 0.0000 42.7359 0.0000 0.0000 0.0000 42.7359 + 720.00 42.1153 0.0000 0.0000 0.0000 42.1153 0.0000 0.0000 0.0000 42.1153 + 730.00 41.5129 0.0000 0.0000 0.0000 41.5129 0.0000 0.0000 0.0000 41.5129 + 740.00 40.9277 0.0000 0.0000 0.0000 40.9277 0.0000 0.0000 0.0000 40.9277 + 750.00 40.3592 0.0000 0.0000 0.0000 40.3592 0.0000 0.0000 0.0000 40.3592 + 760.00 39.8065 0.0000 0.0000 0.0000 39.8065 0.0000 0.0000 0.0000 39.8065 + 770.00 39.2690 0.0000 0.0000 0.0000 39.2690 0.0000 0.0000 0.0000 39.2690 + 780.00 38.7461 0.0000 0.0000 0.0000 38.7461 0.0000 0.0000 0.0000 38.7461 + 790.00 38.2371 0.0000 0.0000 0.0000 38.2371 0.0000 0.0000 0.0000 38.2371 + 800.00 37.7416 0.0000 0.0000 0.0000 37.7416 0.0000 0.0000 0.0000 37.7416 + 810.00 37.2590 0.0000 0.0000 0.0000 37.2590 0.0000 0.0000 0.0000 37.2590 + 820.00 36.7887 0.0000 0.0000 0.0000 36.7887 0.0000 0.0000 0.0000 36.7887 + 830.00 36.3304 0.0000 0.0000 0.0000 36.3304 0.0000 0.0000 0.0000 36.3304 + 840.00 35.8835 0.0000 0.0000 0.0000 35.8835 0.0000 0.0000 0.0000 35.8835 + 850.00 35.4476 0.0000 0.0000 0.0000 35.4476 0.0000 0.0000 0.0000 35.4476 + 860.00 35.0223 0.0000 0.0000 0.0000 35.0223 0.0000 0.0000 0.0000 35.0223 + 870.00 34.6073 0.0000 0.0000 0.0000 34.6073 0.0000 0.0000 0.0000 34.6073 + 880.00 34.2021 0.0000 0.0000 0.0000 34.2021 0.0000 0.0000 0.0000 34.2021 + 890.00 33.8065 0.0000 0.0000 0.0000 33.8065 0.0000 0.0000 0.0000 33.8065 + 900.00 33.4200 0.0000 0.0000 0.0000 33.4200 0.0000 0.0000 0.0000 33.4200 + 910.00 33.0423 0.0000 0.0000 0.0000 33.0423 0.0000 0.0000 0.0000 33.0423 + 920.00 32.6732 0.0000 0.0000 0.0000 32.6732 0.0000 0.0000 0.0000 32.6732 + 930.00 32.3124 0.0000 0.0000 0.0000 32.3124 0.0000 0.0000 0.0000 32.3124 + 940.00 31.9595 0.0000 0.0000 0.0000 31.9595 0.0000 0.0000 0.0000 31.9595 + 950.00 31.6144 0.0000 0.0000 0.0000 31.6144 0.0000 0.0000 0.0000 31.6144 + 960.00 31.2767 0.0000 0.0000 0.0000 31.2767 0.0000 0.0000 0.0000 31.2767 + 970.00 30.9462 0.0000 0.0000 0.0000 30.9462 0.0000 0.0000 0.0000 30.9462 + 980.00 30.6228 0.0000 0.0000 0.0000 30.6228 0.0000 0.0000 0.0000 30.6228 + 990.00 30.3061 0.0000 0.0000 0.0000 30.3061 0.0000 0.0000 0.0000 30.3061 + 1000.00 29.9959 0.0000 0.0000 0.0000 29.9959 0.0000 0.0000 0.0000 29.9959 diff --git a/example/Si/reference/si222.pw.in b/example/Si/reference/si222.pw.in index aad8e250..f4ae6209 100644 --- a/example/Si/reference/si222.pw.in +++ b/example/Si/reference/si222.pw.in @@ -1,10 +1,11 @@ - &CONTROL +&CONTROL calculation = 'scf', restart_mode = 'from_scratch' , outdir = './', pseudo_dir = '/home/tadano/etc/pseudo/', prefix = 'si' , tprnfor = .true. , + tstress = .true. / &SYSTEM @@ -12,10 +13,11 @@ celldm(1) = 20.406, nat = 64, ntyp = 1, - ecutwfc = 33 , + ecutwfc = 40 , + ecutrho = 320 , occupations = 'smearing', - smearing = 'methfessel-paxton', - degauss = 0.01, + smearing = 'gauss', + degauss = 0.001, / &ELECTRONS @@ -26,6 +28,10 @@ ATOMIC_SPECIES Si 28.0855 Si.pz-n-kjpaw_psl.0.1.UPF + +K_POINTS automatic + 4 4 4 1 1 1 + ATOMIC_POSITIONS crystal Si 0.000000000000000 0.000000000000000 0.000000000000000 Si 0.000000000000000 0.000000000000000 0.500000000000000 @@ -91,6 +97,3 @@ Si 0.875000000000000 0.625000000000000 0.375000000000000 Si 0.875000000000000 0.625000000000000 0.875000000000000 Si 0.875000000000000 0.875000000000000 0.125000000000000 Si 0.875000000000000 0.875000000000000 0.625000000000000 - -K_POINTS automatic -4 4 4 1 1 1 diff --git a/example/Si/reference/si222.result.Z b/example/Si/reference/si222.result.Z deleted file mode 100644 index 713841b4..00000000 Binary files a/example/Si/reference/si222.result.Z and /dev/null differ diff --git a/example/Si/reference/si222.result.bz2 b/example/Si/reference/si222.result.bz2 new file mode 100644 index 00000000..604b6bbb Binary files /dev/null and b/example/Si/reference/si222.result.bz2 differ diff --git a/example/Si/reference/si222.thermo.Z b/example/Si/reference/si222.thermo.Z deleted file mode 100644 index ba310593..00000000 Binary files a/example/Si/reference/si222.thermo.Z and /dev/null differ diff --git a/example/Si/reference/si222.xml b/example/Si/reference/si222.xml index 2181dac3..627a4faf 100644 --- a/example/Si/reference/si222.xml +++ b/example/Si/reference/si222.xml @@ -1,11 +1,10 @@ - 0.9.7 - - disp.dat - force.dat + 1.1.0 + + reference/DFSET_harmonic 1 - + 64 1 @@ -157,1420 +156,1420 @@ 26 - 2.761745250568870e-01 - -1.219505741652115e-03 - -6.249669259670847e-04 - 8.593559824310726e-03 - 1.965589776154950e-03 - -4.249087156691530e-03 - -3.917288458485471e-03 - 7.967137640895378e-03 - -2.360162988834184e-04 - -6.710483145472819e-02 - -4.738080118537333e-02 - 1.328253161877538e-03 - -8.211620892205068e-04 - -6.956130602741171e-04 - 4.527173625443187e-04 - -4.057125469651266e-03 - 5.051727787479492e-04 - -2.069111499179754e-04 - -4.736201513467744e-04 - -1.004259935439486e-03 - 1.286315288140974e-03 - -1.687437159337460e-04 - -2.012224162565479e-04 - 6.032703603746621e-04 - -5.171455786632795e-04 - -6.950838757474652e-04 + 2.761355285612234e-01 + -9.525230844534114e-04 + -3.757424727484244e-04 + 8.856186831939984e-03 + 1.963302995025920e-03 + -3.979827561117467e-03 + -3.908085511694354e-03 + 8.218817798179682e-03 + 4.387865118001487e-05 + -6.735875654831192e-02 + -4.736083183405650e-02 + 1.067002791300528e-03 + -8.209863477617058e-04 + -6.974282992909316e-04 + 2.113566911841700e-04 + -4.303142197586943e-03 + 5.075933961265731e-04 + -4.717843819452396e-04 + -4.751825590009508e-04 + -7.413896311778204e-04 + 1.290083606730870e-03 + -1.726373161181113e-04 + 6.451575563543206e-05 + 3.536997962746572e-04 + -5.148692983384492e-04 + -4.487660731294601e-04 - 2.761745250568871e-01 - -6.097528708260575e-04 - -6.097528708260575e-04 - 8.593559824310730e-03 - 1.965589776154950e-03 - 1.965589776154950e-03 - 8.593559824310730e-03 - -1.965589776154950e-03 - 1.965589776154950e-03 - -6.097528708260575e-04 - -6.097528708260575e-04 - 1.991784410223845e-03 - 1.991784410223845e-03 - 1.991784410223845e-03 - 1.991784410223845e-03 - 8.593559824310730e-03 - 1.965589776154950e-03 - -1.965589776154950e-03 - 8.593559824310730e-03 - -1.965589776154950e-03 - -1.965589776154950e-03 - -6.710483145472822e-02 - -4.738080118537336e-02 - -4.738080118537336e-02 - 1.328253161877539e-03 - -8.211620892205071e-04 - -6.956130602741174e-04 - -4.057125469651267e-03 - 5.051727787479494e-04 - 5.051727787479494e-04 - 1.328253161877539e-03 - 6.956130602741174e-04 - 8.211620892205071e-04 - 1.328253161877539e-03 - -6.956130602741174e-04 - -8.211620892205071e-04 - -4.057125469651267e-03 - -5.051727787479494e-04 - -5.051727787479494e-04 - 1.328253161877539e-03 - 8.211620892205071e-04 - 6.956130602741174e-04 - -6.710483145472822e-02 - 4.738080118537336e-02 - 4.738080118537336e-02 - -4.249087156691532e-03 - -1.965589776154950e-03 - -3.917288458485473e-03 - -4.249087156691532e-03 - 1.965589776154950e-03 - 3.917288458485473e-03 - -4.249087156691532e-03 - -3.917288458485473e-03 - -1.965589776154950e-03 - -5.021299677197431e-04 - -5.021299677197431e-04 - 6.431576440704875e-04 - 6.431576440704875e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - 6.431576440704875e-04 - 6.431576440704875e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - -6.431576440704875e-04 - -6.431576440704875e-04 - -4.249087156691532e-03 - 3.917288458485473e-03 - 1.965589776154950e-03 - -5.021299677197431e-04 - -5.021299677197431e-04 - -6.431576440704875e-04 - -6.431576440704875e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - -2.069111499179755e-04 - 5.051727787479494e-04 - -4.736201513467746e-04 - 4.527173625443189e-04 - 6.956130602741174e-04 - -6.956130602741174e-04 - -2.069111499179755e-04 - -4.736201513467746e-04 - 5.051727787479494e-04 - 6.032703603746623e-04 - -5.171455786632797e-04 - 5.171455786632797e-04 - 6.032703603746623e-04 - 5.171455786632797e-04 - -5.171455786632797e-04 - -2.069111499179755e-04 - 4.736201513467746e-04 - -5.051727787479494e-04 - 4.527173625443189e-04 - -6.956130602741174e-04 - 6.956130602741174e-04 - -2.069111499179755e-04 - -5.051727787479494e-04 - 4.736201513467746e-04 - -3.124834629835425e-04 - -3.124834629835425e-04 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - 4.527173625443189e-04 - -6.956130602741174e-04 - -6.956130602741174e-04 - -2.069111499179755e-04 - -5.051727787479494e-04 - -4.736201513467746e-04 - 6.032703603746623e-04 - 5.171455786632797e-04 - 5.171455786632797e-04 - -2.069111499179755e-04 - 4.736201513467746e-04 - 5.051727787479494e-04 - -2.069111499179755e-04 - -4.736201513467746e-04 - -5.051727787479494e-04 - 6.032703603746623e-04 - -5.171455786632797e-04 - -5.171455786632797e-04 - -2.069111499179755e-04 - 5.051727787479494e-04 - 4.736201513467746e-04 - 4.527173625443189e-04 - 6.956130602741174e-04 - 6.956130602741174e-04 - -4.249087156691532e-03 - -1.965589776154950e-03 - 3.917288458485473e-03 - -4.249087156691532e-03 - 1.965589776154950e-03 - -3.917288458485473e-03 - -4.249087156691532e-03 - 3.917288458485473e-03 - -1.965589776154950e-03 - -5.021299677197431e-04 - -5.021299677197431e-04 - -6.431576440704875e-04 - -6.431576440704875e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - -6.431576440704875e-04 - -6.431576440704875e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - 6.431576440704875e-04 - 6.431576440704875e-04 - -4.249087156691532e-03 - -3.917288458485473e-03 - 1.965589776154950e-03 - -5.021299677197431e-04 - -5.021299677197431e-04 - 6.431576440704875e-04 - 6.431576440704875e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - 1.328253161877539e-03 - 8.211620892205071e-04 - -6.956130602741174e-04 - -6.710483145472822e-02 - 4.738080118537336e-02 - -4.738080118537336e-02 - 1.328253161877539e-03 - -6.956130602741174e-04 - 8.211620892205071e-04 - -4.057125469651267e-03 - -5.051727787479494e-04 - 5.051727787479494e-04 - -4.057125469651267e-03 - 5.051727787479494e-04 - -5.051727787479494e-04 - 1.328253161877539e-03 - 6.956130602741174e-04 - -8.211620892205071e-04 - -6.710483145472822e-02 - -4.738080118537336e-02 - 4.738080118537336e-02 - 1.328253161877539e-03 - -8.211620892205071e-04 - 6.956130602741174e-04 - 2.761745250568871e-01 - -6.097528708260575e-04 - -6.097528708260575e-04 - -1.965589776154950e-03 - -4.249087156691532e-03 - -3.917288458485473e-03 - 1.965589776154950e-03 - -4.249087156691532e-03 - 3.917288458485473e-03 - -3.124834629835425e-04 - -3.124834629835425e-04 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -1.965589776154950e-03 - -4.249087156691532e-03 - 3.917288458485473e-03 - 1.965589776154950e-03 - -4.249087156691532e-03 - -3.917288458485473e-03 - -4.738080118537336e-02 - -6.710483145472822e-02 - -4.738080118537336e-02 - -8.211620892205071e-04 - 1.328253161877539e-03 - -6.956130602741174e-04 - 5.051727787479494e-04 - -2.069111499179755e-04 - -4.736201513467746e-04 - 6.956130602741174e-04 - 4.527173625443189e-04 - -6.956130602741174e-04 - -6.956130602741174e-04 - 4.527173625443189e-04 - -6.956130602741174e-04 - -5.051727787479494e-04 - -2.069111499179755e-04 - -4.736201513467746e-04 - 8.211620892205071e-04 - 1.328253161877539e-03 - -6.956130602741174e-04 - 4.738080118537336e-02 - -6.710483145472822e-02 - -4.738080118537336e-02 - 1.965589776154950e-03 - 8.593559824310730e-03 - 1.965589776154950e-03 - -1.965589776154950e-03 - 8.593559824310730e-03 - 1.965589776154950e-03 - -3.917288458485473e-03 - -4.249087156691532e-03 - -1.965589776154950e-03 - 6.431576440704875e-04 - 6.431576440704875e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - 3.917288458485473e-03 - -4.249087156691532e-03 - -1.965589776154950e-03 - -6.431576440704875e-04 - -6.431576440704875e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - 5.051727787479494e-04 - -4.057125469651267e-03 - 5.051727787479494e-04 - 6.956130602741174e-04 - 1.328253161877539e-03 - 8.211620892205071e-04 - -4.736201513467746e-04 - -2.069111499179755e-04 - 5.051727787479494e-04 - -5.171455786632797e-04 - 6.032703603746623e-04 - 5.171455786632797e-04 - 5.171455786632797e-04 - 6.032703603746623e-04 - 5.171455786632797e-04 - 4.736201513467746e-04 - -2.069111499179755e-04 - 5.051727787479494e-04 - -6.956130602741174e-04 - 1.328253161877539e-03 - 8.211620892205071e-04 - -5.051727787479494e-04 - -4.057125469651267e-03 - 5.051727787479494e-04 - -6.097528708260575e-04 - -6.097528708260575e-04 - 1.991784410223845e-03 - 1.991784410223845e-03 - 1.991784410223845e-03 - 1.991784410223845e-03 - -8.437185796687304e-05 - -8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - 6.431576440704875e-04 - 6.431576440704875e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - -6.431576440704875e-04 - -6.431576440704875e-04 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - -6.431576440704875e-04 - -6.431576440704875e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - 6.431576440704875e-04 - 6.431576440704875e-04 - -6.956130602741174e-04 - 1.328253161877539e-03 - -8.211620892205071e-04 - -5.051727787479494e-04 - -4.057125469651267e-03 - -5.051727787479494e-04 - 5.171455786632797e-04 - 6.032703603746623e-04 - -5.171455786632797e-04 - 4.736201513467746e-04 - -2.069111499179755e-04 - -5.051727787479494e-04 - -4.736201513467746e-04 - -2.069111499179755e-04 - -5.051727787479494e-04 - -5.171455786632797e-04 - 6.032703603746623e-04 - -5.171455786632797e-04 - 5.051727787479494e-04 - -4.057125469651267e-03 - -5.051727787479494e-04 - 6.956130602741174e-04 - 1.328253161877539e-03 - -8.211620892205071e-04 - 1.965589776154950e-03 - 8.593559824310730e-03 - -1.965589776154950e-03 - -1.965589776154950e-03 - 8.593559824310730e-03 - -1.965589776154950e-03 - 3.917288458485473e-03 - -4.249087156691532e-03 - 1.965589776154950e-03 - -6.431576440704875e-04 - -6.431576440704875e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - -3.917288458485473e-03 - -4.249087156691532e-03 - 1.965589776154950e-03 - 6.431576440704875e-04 - 6.431576440704875e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - 8.211620892205071e-04 - 1.328253161877539e-03 - 6.956130602741174e-04 - 4.738080118537336e-02 - -6.710483145472822e-02 - 4.738080118537336e-02 - -6.956130602741174e-04 - 4.527173625443189e-04 - 6.956130602741174e-04 - -5.051727787479494e-04 - -2.069111499179755e-04 - 4.736201513467746e-04 - 5.051727787479494e-04 - -2.069111499179755e-04 - 4.736201513467746e-04 - 6.956130602741174e-04 - 4.527173625443189e-04 - 6.956130602741174e-04 - -4.738080118537336e-02 - -6.710483145472822e-02 - 4.738080118537336e-02 - -8.211620892205071e-04 - 1.328253161877539e-03 - 6.956130602741174e-04 - 2.761745250568871e-01 - -3.124834629835425e-04 - -3.124834629835425e-04 - -1.965589776154950e-03 - -3.917288458485473e-03 - -4.249087156691532e-03 - -1.965589776154950e-03 - 3.917288458485473e-03 - -4.249087156691532e-03 - -6.097528708260575e-04 - -6.097528708260575e-04 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - 1.965589776154950e-03 - 3.917288458485473e-03 - -4.249087156691532e-03 - 1.965589776154950e-03 - -3.917288458485473e-03 - -4.249087156691532e-03 - -4.738080118537336e-02 - -4.738080118537336e-02 - -6.710483145472822e-02 - -6.956130602741174e-04 - -6.956130602741174e-04 - 4.527173625443189e-04 - 5.051727787479494e-04 - -4.736201513467746e-04 - -2.069111499179755e-04 - 8.211620892205071e-04 - -6.956130602741174e-04 - 1.328253161877539e-03 - -8.211620892205071e-04 - -6.956130602741174e-04 - 1.328253161877539e-03 - -5.051727787479494e-04 - -4.736201513467746e-04 - -2.069111499179755e-04 - 6.956130602741174e-04 - -6.956130602741174e-04 - 4.527173625443189e-04 - 4.738080118537336e-02 - -4.738080118537336e-02 - -6.710483145472822e-02 - -3.917288458485473e-03 - -1.965589776154950e-03 - -4.249087156691532e-03 - 3.917288458485473e-03 - -1.965589776154950e-03 - -4.249087156691532e-03 - 1.965589776154950e-03 - 1.965589776154950e-03 - 8.593559824310730e-03 - 8.437185796687304e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - 6.431576440704875e-04 - 6.431576440704875e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - -6.431576440704875e-04 - -6.431576440704875e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - -1.965589776154950e-03 - 1.965589776154950e-03 - 8.593559824310730e-03 - -8.437185796687304e-05 - -8.437185796687304e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - -4.736201513467746e-04 - 5.051727787479494e-04 - -2.069111499179755e-04 - -6.956130602741174e-04 - 8.211620892205071e-04 - 1.328253161877539e-03 - 5.051727787479494e-04 - 5.051727787479494e-04 - -4.057125469651267e-03 - 5.171455786632797e-04 - 5.171455786632797e-04 - 6.032703603746623e-04 - -5.171455786632797e-04 - 5.171455786632797e-04 - 6.032703603746623e-04 - -5.051727787479494e-04 - 5.051727787479494e-04 - -4.057125469651267e-03 - 6.956130602741174e-04 - 8.211620892205071e-04 - 1.328253161877539e-03 - 4.736201513467746e-04 - 5.051727787479494e-04 - -2.069111499179755e-04 - -6.097528708260575e-04 - -6.097528708260575e-04 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - 6.431576440704875e-04 - 6.431576440704875e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - -6.431576440704875e-04 - -6.431576440704875e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - 1.991784410223845e-03 - 1.991784410223845e-03 - 1.991784410223845e-03 - 1.991784410223845e-03 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - -6.431576440704875e-04 - -6.431576440704875e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - 6.431576440704875e-04 - 6.431576440704875e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - -6.956130602741174e-04 - -8.211620892205071e-04 - 1.328253161877539e-03 - -4.736201513467746e-04 - -5.051727787479494e-04 - -2.069111499179755e-04 - 5.171455786632797e-04 - -5.171455786632797e-04 - 6.032703603746623e-04 - 5.051727787479494e-04 - -5.051727787479494e-04 - -4.057125469651267e-03 - -5.051727787479494e-04 - -5.051727787479494e-04 - -4.057125469651267e-03 - -5.171455786632797e-04 - -5.171455786632797e-04 - 6.032703603746623e-04 - 4.736201513467746e-04 - -5.051727787479494e-04 - -2.069111499179755e-04 - 6.956130602741174e-04 - -8.211620892205071e-04 - 1.328253161877539e-03 - 3.917288458485473e-03 - 1.965589776154950e-03 - -4.249087156691532e-03 - -3.917288458485473e-03 - 1.965589776154950e-03 - -4.249087156691532e-03 - 1.965589776154950e-03 - -1.965589776154950e-03 - 8.593559824310730e-03 - 8.437185796687304e-05 - 8.437185796687304e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - -6.431576440704875e-04 - -6.431576440704875e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - 6.431576440704875e-04 - 6.431576440704875e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - -1.965589776154950e-03 - -1.965589776154950e-03 - 8.593559824310730e-03 - -8.437185796687304e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - -6.956130602741174e-04 - 6.956130602741174e-04 - 4.527173625443189e-04 - -4.738080118537336e-02 - 4.738080118537336e-02 - -6.710483145472822e-02 - 8.211620892205071e-04 - 6.956130602741174e-04 - 1.328253161877539e-03 - 5.051727787479494e-04 - 4.736201513467746e-04 - -2.069111499179755e-04 - -5.051727787479494e-04 - 4.736201513467746e-04 - -2.069111499179755e-04 - -8.211620892205071e-04 - 6.956130602741174e-04 - 1.328253161877539e-03 - 4.738080118537336e-02 - 4.738080118537336e-02 - -6.710483145472822e-02 - 6.956130602741174e-04 - 6.956130602741174e-04 - 4.527173625443189e-04 - -6.710483145472822e-02 - -4.738080118537336e-02 - -4.738080118537336e-02 - 1.328253161877539e-03 - -8.211620892205071e-04 - -6.956130602741174e-04 - -6.710483145472822e-02 - 4.738080118537336e-02 - 4.738080118537336e-02 - 1.328253161877539e-03 - 8.211620892205071e-04 - 6.956130602741174e-04 - 1.328253161877539e-03 - -6.956130602741174e-04 - -8.211620892205071e-04 - -4.057125469651267e-03 - -5.051727787479494e-04 - -5.051727787479494e-04 - 1.328253161877539e-03 - 6.956130602741174e-04 - 8.211620892205071e-04 - -4.057125469651267e-03 - 5.051727787479494e-04 - 5.051727787479494e-04 - 2.761745250568871e-01 - -6.097528708260575e-04 - -6.097528708260575e-04 - 8.593559824310730e-03 - -1.965589776154950e-03 - -1.965589776154950e-03 - 8.593559824310730e-03 - 1.965589776154950e-03 - -1.965589776154950e-03 - -6.097528708260575e-04 - -6.097528708260575e-04 - 1.991784410223845e-03 - 1.991784410223845e-03 - 1.991784410223845e-03 - 1.991784410223845e-03 - 8.593559824310730e-03 - -1.965589776154950e-03 - 1.965589776154950e-03 - 8.593559824310730e-03 - 1.965589776154950e-03 - 1.965589776154950e-03 - -6.710483145472822e-02 - 4.738080118537336e-02 - -4.738080118537336e-02 - 1.328253161877539e-03 - 8.211620892205071e-04 - -6.956130602741174e-04 - -6.710483145472822e-02 - -4.738080118537336e-02 - 4.738080118537336e-02 - 1.328253161877539e-03 - -8.211620892205071e-04 - 6.956130602741174e-04 - 1.328253161877539e-03 - 6.956130602741174e-04 - -8.211620892205071e-04 - -4.057125469651267e-03 - 5.051727787479494e-04 - -5.051727787479494e-04 - 1.328253161877539e-03 - -6.956130602741174e-04 - 8.211620892205071e-04 - -4.057125469651267e-03 - -5.051727787479494e-04 - 5.051727787479494e-04 - -4.249087156691532e-03 - 1.965589776154950e-03 - -3.917288458485473e-03 - -4.249087156691532e-03 - -1.965589776154950e-03 - 3.917288458485473e-03 - -4.249087156691532e-03 - -3.917288458485473e-03 - 1.965589776154950e-03 - -5.021299677197431e-04 - -5.021299677197431e-04 - 6.431576440704875e-04 - 6.431576440704875e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - 6.431576440704875e-04 - 6.431576440704875e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - -6.431576440704875e-04 - -6.431576440704875e-04 - -4.249087156691532e-03 - 3.917288458485473e-03 - -1.965589776154950e-03 - -5.021299677197431e-04 - -5.021299677197431e-04 - -6.431576440704875e-04 - -6.431576440704875e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - 4.527173625443189e-04 - -6.956130602741174e-04 - -6.956130602741174e-04 - -2.069111499179755e-04 - -5.051727787479494e-04 - -4.736201513467746e-04 - 4.527173625443189e-04 - 6.956130602741174e-04 - 6.956130602741174e-04 - -2.069111499179755e-04 - 5.051727787479494e-04 - 4.736201513467746e-04 - -2.069111499179755e-04 - -4.736201513467746e-04 - -5.051727787479494e-04 - 6.032703603746623e-04 - -5.171455786632797e-04 - -5.171455786632797e-04 - -2.069111499179755e-04 - 4.736201513467746e-04 - 5.051727787479494e-04 - 6.032703603746623e-04 - 5.171455786632797e-04 - 5.171455786632797e-04 - -3.124834629835425e-04 - -3.124834629835425e-04 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - 4.527173625443189e-04 - 6.956130602741174e-04 - -6.956130602741174e-04 - -2.069111499179755e-04 - 5.051727787479494e-04 - -4.736201513467746e-04 - 4.527173625443189e-04 - -6.956130602741174e-04 - 6.956130602741174e-04 - -2.069111499179755e-04 - -5.051727787479494e-04 - 4.736201513467746e-04 - -2.069111499179755e-04 - 4.736201513467746e-04 - -5.051727787479494e-04 - 6.032703603746623e-04 - 5.171455786632797e-04 - -5.171455786632797e-04 - -2.069111499179755e-04 - -4.736201513467746e-04 - 5.051727787479494e-04 - 6.032703603746623e-04 - -5.171455786632797e-04 - 5.171455786632797e-04 - -4.249087156691532e-03 - 1.965589776154950e-03 - 3.917288458485473e-03 - -4.249087156691532e-03 - -1.965589776154950e-03 - -3.917288458485473e-03 - -4.249087156691532e-03 - 3.917288458485473e-03 - 1.965589776154950e-03 - -5.021299677197431e-04 - -5.021299677197431e-04 - -6.431576440704875e-04 - -6.431576440704875e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - -6.431576440704875e-04 - -6.431576440704875e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - 6.431576440704875e-04 - 6.431576440704875e-04 - -4.249087156691532e-03 - -3.917288458485473e-03 - -1.965589776154950e-03 - -5.021299677197431e-04 - -5.021299677197431e-04 - 6.431576440704875e-04 - 6.431576440704875e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - -4.738080118537336e-02 - -6.710483145472822e-02 - -4.738080118537336e-02 - -8.211620892205071e-04 - 1.328253161877539e-03 - -6.956130602741174e-04 - 4.738080118537336e-02 - -6.710483145472822e-02 - -4.738080118537336e-02 - 8.211620892205071e-04 - 1.328253161877539e-03 - -6.956130602741174e-04 - -6.956130602741174e-04 - 4.527173625443189e-04 - -6.956130602741174e-04 - -5.051727787479494e-04 - -2.069111499179755e-04 - -4.736201513467746e-04 - 6.956130602741174e-04 - 4.527173625443189e-04 - -6.956130602741174e-04 - 5.051727787479494e-04 - -2.069111499179755e-04 - -4.736201513467746e-04 - 2.761745250568871e-01 - -6.097528708260575e-04 - -6.097528708260575e-04 - 1.965589776154950e-03 - -4.249087156691532e-03 - -3.917288458485473e-03 - -1.965589776154950e-03 - -4.249087156691532e-03 - 3.917288458485473e-03 - -3.124834629835425e-04 - -3.124834629835425e-04 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - 1.965589776154950e-03 - -4.249087156691532e-03 - 3.917288458485473e-03 - -1.965589776154950e-03 - -4.249087156691532e-03 - -3.917288458485473e-03 - 4.738080118537336e-02 - -6.710483145472822e-02 - 4.738080118537336e-02 - 8.211620892205071e-04 - 1.328253161877539e-03 - 6.956130602741174e-04 - -4.738080118537336e-02 - -6.710483145472822e-02 - 4.738080118537336e-02 - -8.211620892205071e-04 - 1.328253161877539e-03 - 6.956130602741174e-04 - 6.956130602741174e-04 - 4.527173625443189e-04 - 6.956130602741174e-04 - 5.051727787479494e-04 - -2.069111499179755e-04 - 4.736201513467746e-04 - -6.956130602741174e-04 - 4.527173625443189e-04 - 6.956130602741174e-04 - -5.051727787479494e-04 - -2.069111499179755e-04 - 4.736201513467746e-04 - -1.965589776154950e-03 - 8.593559824310730e-03 - -1.965589776154950e-03 - 1.965589776154950e-03 - 8.593559824310730e-03 - -1.965589776154950e-03 - -3.917288458485473e-03 - -4.249087156691532e-03 - 1.965589776154950e-03 - 6.431576440704875e-04 - 6.431576440704875e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - 3.917288458485473e-03 - -4.249087156691532e-03 - 1.965589776154950e-03 - -6.431576440704875e-04 - -6.431576440704875e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - -6.956130602741174e-04 - 1.328253161877539e-03 - -8.211620892205071e-04 - -5.051727787479494e-04 - -4.057125469651267e-03 - -5.051727787479494e-04 - 6.956130602741174e-04 - 1.328253161877539e-03 - -8.211620892205071e-04 - 5.051727787479494e-04 - -4.057125469651267e-03 - -5.051727787479494e-04 - -4.736201513467746e-04 - -2.069111499179755e-04 - -5.051727787479494e-04 - -5.171455786632797e-04 - 6.032703603746623e-04 - -5.171455786632797e-04 - 4.736201513467746e-04 - -2.069111499179755e-04 - -5.051727787479494e-04 - 5.171455786632797e-04 - 6.032703603746623e-04 - -5.171455786632797e-04 - -6.097528708260575e-04 - -6.097528708260575e-04 - 1.991784410223845e-03 - 1.991784410223845e-03 - 1.991784410223845e-03 - 1.991784410223845e-03 - 8.437185796687304e-05 - 8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - 6.431576440704875e-04 - 6.431576440704875e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - -6.431576440704875e-04 - -6.431576440704875e-04 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - -6.431576440704875e-04 - -6.431576440704875e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - 6.431576440704875e-04 - 6.431576440704875e-04 - 6.956130602741174e-04 - 1.328253161877539e-03 - 8.211620892205071e-04 - 5.051727787479494e-04 - -4.057125469651267e-03 - 5.051727787479494e-04 - -6.956130602741174e-04 - 1.328253161877539e-03 - 8.211620892205071e-04 - -5.051727787479494e-04 - -4.057125469651267e-03 - 5.051727787479494e-04 - 4.736201513467746e-04 - -2.069111499179755e-04 - 5.051727787479494e-04 - 5.171455786632797e-04 - 6.032703603746623e-04 - 5.171455786632797e-04 - -4.736201513467746e-04 - -2.069111499179755e-04 - 5.051727787479494e-04 - -5.171455786632797e-04 - 6.032703603746623e-04 - 5.171455786632797e-04 - -1.965589776154950e-03 - 8.593559824310730e-03 - 1.965589776154950e-03 - 1.965589776154950e-03 - 8.593559824310730e-03 - 1.965589776154950e-03 - 3.917288458485473e-03 - -4.249087156691532e-03 - -1.965589776154950e-03 - -6.431576440704875e-04 - -6.431576440704875e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - -3.917288458485473e-03 - -4.249087156691532e-03 - -1.965589776154950e-03 - 6.431576440704875e-04 - 6.431576440704875e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - -4.738080118537336e-02 - -4.738080118537336e-02 - -6.710483145472822e-02 - -6.956130602741174e-04 - -6.956130602741174e-04 - 4.527173625443189e-04 - 4.738080118537336e-02 - -4.738080118537336e-02 - -6.710483145472822e-02 - 6.956130602741174e-04 - -6.956130602741174e-04 - 4.527173625443189e-04 - -8.211620892205071e-04 - -6.956130602741174e-04 - 1.328253161877539e-03 - -5.051727787479494e-04 - -4.736201513467746e-04 - -2.069111499179755e-04 - 8.211620892205071e-04 - -6.956130602741174e-04 - 1.328253161877539e-03 - 5.051727787479494e-04 - -4.736201513467746e-04 - -2.069111499179755e-04 - 2.761745250568871e-01 - -3.124834629835425e-04 - -3.124834629835425e-04 - 1.965589776154950e-03 - -3.917288458485473e-03 - -4.249087156691532e-03 - 1.965589776154950e-03 - 3.917288458485473e-03 - -4.249087156691532e-03 - -6.097528708260575e-04 - -6.097528708260575e-04 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -1.965589776154950e-03 - 3.917288458485473e-03 - -4.249087156691532e-03 - -1.965589776154950e-03 - -3.917288458485473e-03 - -4.249087156691532e-03 - -4.738080118537336e-02 - 4.738080118537336e-02 - -6.710483145472822e-02 - -6.956130602741174e-04 - 6.956130602741174e-04 - 4.527173625443189e-04 - 4.738080118537336e-02 - 4.738080118537336e-02 - -6.710483145472822e-02 - 6.956130602741174e-04 - 6.956130602741174e-04 - 4.527173625443189e-04 - -8.211620892205071e-04 - 6.956130602741174e-04 - 1.328253161877539e-03 - -5.051727787479494e-04 - 4.736201513467746e-04 - -2.069111499179755e-04 - 8.211620892205071e-04 - 6.956130602741174e-04 - 1.328253161877539e-03 - 5.051727787479494e-04 - 4.736201513467746e-04 - -2.069111499179755e-04 - -3.917288458485473e-03 - 1.965589776154950e-03 - -4.249087156691532e-03 - 3.917288458485473e-03 - 1.965589776154950e-03 - -4.249087156691532e-03 - -1.965589776154950e-03 - -1.965589776154950e-03 - 8.593559824310730e-03 - -8.437185796687304e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - 6.431576440704875e-04 - 6.431576440704875e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - -6.431576440704875e-04 - -6.431576440704875e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - 1.965589776154950e-03 - -1.965589776154950e-03 - 8.593559824310730e-03 - 8.437185796687304e-05 - 8.437185796687304e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - -6.956130602741174e-04 - -8.211620892205071e-04 - 1.328253161877539e-03 - -4.736201513467746e-04 - -5.051727787479494e-04 - -2.069111499179755e-04 - 6.956130602741174e-04 - -8.211620892205071e-04 - 1.328253161877539e-03 - 4.736201513467746e-04 - -5.051727787479494e-04 - -2.069111499179755e-04 - -5.051727787479494e-04 - -5.051727787479494e-04 - -4.057125469651267e-03 - -5.171455786632797e-04 - -5.171455786632797e-04 - 6.032703603746623e-04 - 5.051727787479494e-04 - -5.051727787479494e-04 - -4.057125469651267e-03 - 5.171455786632797e-04 - -5.171455786632797e-04 - 6.032703603746623e-04 - -6.097528708260575e-04 - -6.097528708260575e-04 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - 6.431576440704875e-04 - 6.431576440704875e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - -6.431576440704875e-04 - -6.431576440704875e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - 1.991784410223845e-03 - 1.991784410223845e-03 - 1.991784410223845e-03 - 1.991784410223845e-03 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - -6.431576440704875e-04 - -6.431576440704875e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - 6.431576440704875e-04 - 6.431576440704875e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - -6.956130602741174e-04 - 8.211620892205071e-04 - 1.328253161877539e-03 - -4.736201513467746e-04 - 5.051727787479494e-04 - -2.069111499179755e-04 - 6.956130602741174e-04 - 8.211620892205071e-04 - 1.328253161877539e-03 - 4.736201513467746e-04 - 5.051727787479494e-04 - -2.069111499179755e-04 - -5.051727787479494e-04 - 5.051727787479494e-04 - -4.057125469651267e-03 - -5.171455786632797e-04 - 5.171455786632797e-04 - 6.032703603746623e-04 - 5.051727787479494e-04 - 5.051727787479494e-04 - -4.057125469651267e-03 - 5.171455786632797e-04 - 5.171455786632797e-04 - 6.032703603746623e-04 - 3.917288458485473e-03 - -1.965589776154950e-03 - -4.249087156691532e-03 - -3.917288458485473e-03 - -1.965589776154950e-03 - -4.249087156691532e-03 - -1.965589776154950e-03 - 1.965589776154950e-03 - 8.593559824310730e-03 - -8.437185796687304e-05 - -8.437185796687304e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - -6.431576440704875e-04 - -6.431576440704875e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - 6.431576440704875e-04 - 6.431576440704875e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - 1.965589776154950e-03 - 1.965589776154950e-03 - 8.593559824310730e-03 - 8.437185796687304e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 + 2.761355285612235e-01 + -4.762615422267059e-04 + -4.762615422267059e-04 + 8.856186831939988e-03 + 1.963302995025921e-03 + 1.963302995025921e-03 + 8.856186831939988e-03 + -1.963302995025921e-03 + 1.963302995025921e-03 + -4.762615422267059e-04 + -4.762615422267059e-04 + 2.054704449544921e-03 + 2.054704449544921e-03 + 2.054704449544921e-03 + 2.054704449544921e-03 + 8.856186831939988e-03 + 1.963302995025921e-03 + -1.963302995025921e-03 + 8.856186831939988e-03 + -1.963302995025921e-03 + -1.963302995025921e-03 + -6.735875654831194e-02 + -4.736083183405652e-02 + -4.736083183405652e-02 + 1.067002791300528e-03 + -8.209863477617062e-04 + -6.974282992909319e-04 + -4.303142197586944e-03 + 5.075933961265734e-04 + 5.075933961265734e-04 + 1.067002791300528e-03 + 6.974282992909319e-04 + 8.209863477617062e-04 + 1.067002791300528e-03 + -6.974282992909319e-04 + -8.209863477617062e-04 + -4.303142197586944e-03 + -5.075933961265734e-04 + -5.075933961265734e-04 + 1.067002791300528e-03 + 8.209863477617062e-04 + 6.974282992909319e-04 + -6.735875654831194e-02 + 4.736083183405652e-02 + 4.736083183405652e-02 + -3.979827561117468e-03 + -1.963302995025921e-03 + -3.908085511694356e-03 + -3.979827561117468e-03 + 1.963302995025921e-03 + 3.908085511694356e-03 + -3.979827561117468e-03 + -3.908085511694356e-03 + -1.963302995025921e-03 + -3.706948155889103e-04 + -3.706948155889103e-04 + 6.450418033654354e-04 + 6.450418033654354e-04 + -8.631865805905567e-05 + -8.631865805905567e-05 + -3.706948155889103e-04 + -3.706948155889103e-04 + -8.631865805905567e-05 + -8.631865805905567e-05 + 6.450418033654354e-04 + 6.450418033654354e-04 + -3.706948155889103e-04 + -3.706948155889103e-04 + 8.631865805905567e-05 + 8.631865805905567e-05 + -6.450418033654354e-04 + -6.450418033654354e-04 + -3.979827561117468e-03 + 3.908085511694356e-03 + 1.963302995025921e-03 + -3.706948155889103e-04 + -3.706948155889103e-04 + -6.450418033654354e-04 + -6.450418033654354e-04 + 8.631865805905567e-05 + 8.631865805905567e-05 + -4.717843819452398e-04 + 5.075933961265734e-04 + -4.751825590009510e-04 + 2.113566911841701e-04 + 6.974282992909319e-04 + -6.974282992909319e-04 + -4.717843819452398e-04 + -4.751825590009510e-04 + 5.075933961265734e-04 + 3.536997962746573e-04 + -5.148692983384494e-04 + 5.148692983384494e-04 + 3.536997962746573e-04 + 5.148692983384494e-04 + -5.148692983384494e-04 + -4.717843819452398e-04 + 4.751825590009510e-04 + -5.075933961265734e-04 + 2.113566911841701e-04 + -6.974282992909319e-04 + 6.974282992909319e-04 + -4.717843819452398e-04 + -5.075933961265734e-04 + 4.751825590009510e-04 + -1.878712363742123e-04 + -1.878712363742123e-04 + 1.096966279500372e-05 + 1.096966279500372e-05 + 1.096966279500372e-05 + 1.096966279500372e-05 + 3.225787781771604e-05 + 3.225787781771604e-05 + 8.631865805905567e-05 + 8.631865805905567e-05 + 8.631865805905567e-05 + 8.631865805905567e-05 + 3.225787781771604e-05 + 3.225787781771604e-05 + -8.631865805905567e-05 + -8.631865805905567e-05 + 8.631865805905567e-05 + 8.631865805905567e-05 + 1.096966279500372e-05 + 1.096966279500372e-05 + 1.096966279500372e-05 + 1.096966279500372e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + 3.225787781771604e-05 + 3.225787781771604e-05 + 8.631865805905567e-05 + 8.631865805905567e-05 + -8.631865805905567e-05 + -8.631865805905567e-05 + 3.225787781771604e-05 + 3.225787781771604e-05 + -8.631865805905567e-05 + -8.631865805905567e-05 + -8.631865805905567e-05 + -8.631865805905567e-05 + 2.113566911841701e-04 + -6.974282992909319e-04 + -6.974282992909319e-04 + -4.717843819452398e-04 + -5.075933961265734e-04 + -4.751825590009510e-04 + 3.536997962746573e-04 + 5.148692983384494e-04 + 5.148692983384494e-04 + -4.717843819452398e-04 + 4.751825590009510e-04 + 5.075933961265734e-04 + -4.717843819452398e-04 + -4.751825590009510e-04 + -5.075933961265734e-04 + 3.536997962746573e-04 + -5.148692983384494e-04 + -5.148692983384494e-04 + -4.717843819452398e-04 + 5.075933961265734e-04 + 4.751825590009510e-04 + 2.113566911841701e-04 + 6.974282992909319e-04 + 6.974282992909319e-04 + -3.979827561117468e-03 + -1.963302995025921e-03 + 3.908085511694356e-03 + -3.979827561117468e-03 + 1.963302995025921e-03 + -3.908085511694356e-03 + -3.979827561117468e-03 + 3.908085511694356e-03 + -1.963302995025921e-03 + -3.706948155889103e-04 + -3.706948155889103e-04 + -6.450418033654354e-04 + -6.450418033654354e-04 + -8.631865805905567e-05 + -8.631865805905567e-05 + -3.706948155889103e-04 + -3.706948155889103e-04 + -8.631865805905567e-05 + -8.631865805905567e-05 + -6.450418033654354e-04 + -6.450418033654354e-04 + -3.706948155889103e-04 + -3.706948155889103e-04 + 8.631865805905567e-05 + 8.631865805905567e-05 + 6.450418033654354e-04 + 6.450418033654354e-04 + -3.979827561117468e-03 + -3.908085511694356e-03 + 1.963302995025921e-03 + -3.706948155889103e-04 + -3.706948155889103e-04 + 6.450418033654354e-04 + 6.450418033654354e-04 + 8.631865805905567e-05 + 8.631865805905567e-05 + 1.067002791300528e-03 + 8.209863477617062e-04 + -6.974282992909319e-04 + -6.735875654831194e-02 + 4.736083183405652e-02 + -4.736083183405652e-02 + 1.067002791300528e-03 + -6.974282992909319e-04 + 8.209863477617062e-04 + -4.303142197586944e-03 + -5.075933961265734e-04 + 5.075933961265734e-04 + -4.303142197586944e-03 + 5.075933961265734e-04 + -5.075933961265734e-04 + 1.067002791300528e-03 + 6.974282992909319e-04 + -8.209863477617062e-04 + -6.735875654831194e-02 + -4.736083183405652e-02 + 4.736083183405652e-02 + 1.067002791300528e-03 + -8.209863477617062e-04 + 6.974282992909319e-04 + 2.761355285612235e-01 + -4.762615422267059e-04 + -4.762615422267059e-04 + -1.963302995025921e-03 + -3.979827561117468e-03 + -3.908085511694356e-03 + 1.963302995025921e-03 + -3.979827561117468e-03 + 3.908085511694356e-03 + -1.878712363742123e-04 + -1.878712363742123e-04 + 1.096966279500372e-05 + 1.096966279500372e-05 + 1.096966279500372e-05 + 1.096966279500372e-05 + -1.963302995025921e-03 + -3.979827561117468e-03 + 3.908085511694356e-03 + 1.963302995025921e-03 + -3.979827561117468e-03 + -3.908085511694356e-03 + -4.736083183405652e-02 + -6.735875654831194e-02 + -4.736083183405652e-02 + -8.209863477617062e-04 + 1.067002791300528e-03 + -6.974282992909319e-04 + 5.075933961265734e-04 + -4.717843819452398e-04 + -4.751825590009510e-04 + 6.974282992909319e-04 + 2.113566911841701e-04 + -6.974282992909319e-04 + -6.974282992909319e-04 + 2.113566911841701e-04 + -6.974282992909319e-04 + -5.075933961265734e-04 + -4.717843819452398e-04 + -4.751825590009510e-04 + 8.209863477617062e-04 + 1.067002791300528e-03 + -6.974282992909319e-04 + 4.736083183405652e-02 + -6.735875654831194e-02 + -4.736083183405652e-02 + 1.963302995025921e-03 + 8.856186831939988e-03 + 1.963302995025921e-03 + -1.963302995025921e-03 + 8.856186831939988e-03 + 1.963302995025921e-03 + -3.908085511694356e-03 + -3.979827561117468e-03 + -1.963302995025921e-03 + 6.450418033654354e-04 + 6.450418033654354e-04 + -3.706948155889103e-04 + -3.706948155889103e-04 + -8.631865805905567e-05 + -8.631865805905567e-05 + 8.631865805905567e-05 + 8.631865805905567e-05 + 3.225787781771604e-05 + 3.225787781771604e-05 + 8.631865805905567e-05 + 8.631865805905567e-05 + -8.631865805905567e-05 + -8.631865805905567e-05 + 3.225787781771604e-05 + 3.225787781771604e-05 + 8.631865805905567e-05 + 8.631865805905567e-05 + 3.908085511694356e-03 + -3.979827561117468e-03 + -1.963302995025921e-03 + -6.450418033654354e-04 + -6.450418033654354e-04 + -3.706948155889103e-04 + -3.706948155889103e-04 + -8.631865805905567e-05 + -8.631865805905567e-05 + 5.075933961265734e-04 + -4.303142197586944e-03 + 5.075933961265734e-04 + 6.974282992909319e-04 + 1.067002791300528e-03 + 8.209863477617062e-04 + -4.751825590009510e-04 + -4.717843819452398e-04 + 5.075933961265734e-04 + -5.148692983384494e-04 + 3.536997962746573e-04 + 5.148692983384494e-04 + 5.148692983384494e-04 + 3.536997962746573e-04 + 5.148692983384494e-04 + 4.751825590009510e-04 + -4.717843819452398e-04 + 5.075933961265734e-04 + -6.974282992909319e-04 + 1.067002791300528e-03 + 8.209863477617062e-04 + -5.075933961265734e-04 + -4.303142197586944e-03 + 5.075933961265734e-04 + -4.762615422267059e-04 + -4.762615422267059e-04 + 2.054704449544921e-03 + 2.054704449544921e-03 + 2.054704449544921e-03 + 2.054704449544921e-03 + -8.631865805905567e-05 + -8.631865805905567e-05 + -3.706948155889103e-04 + -3.706948155889103e-04 + 6.450418033654354e-04 + 6.450418033654354e-04 + 8.631865805905567e-05 + 8.631865805905567e-05 + -3.706948155889103e-04 + -3.706948155889103e-04 + -6.450418033654354e-04 + -6.450418033654354e-04 + 1.096966279500372e-05 + 1.096966279500372e-05 + 1.096966279500372e-05 + 1.096966279500372e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + -8.631865805905567e-05 + -8.631865805905567e-05 + -3.706948155889103e-04 + -3.706948155889103e-04 + -6.450418033654354e-04 + -6.450418033654354e-04 + 8.631865805905567e-05 + 8.631865805905567e-05 + -3.706948155889103e-04 + -3.706948155889103e-04 + 6.450418033654354e-04 + 6.450418033654354e-04 + -6.974282992909319e-04 + 1.067002791300528e-03 + -8.209863477617062e-04 + -5.075933961265734e-04 + -4.303142197586944e-03 + -5.075933961265734e-04 + 5.148692983384494e-04 + 3.536997962746573e-04 + -5.148692983384494e-04 + 4.751825590009510e-04 + -4.717843819452398e-04 + -5.075933961265734e-04 + -4.751825590009510e-04 + -4.717843819452398e-04 + -5.075933961265734e-04 + -5.148692983384494e-04 + 3.536997962746573e-04 + -5.148692983384494e-04 + 5.075933961265734e-04 + -4.303142197586944e-03 + -5.075933961265734e-04 + 6.974282992909319e-04 + 1.067002791300528e-03 + -8.209863477617062e-04 + 1.963302995025921e-03 + 8.856186831939988e-03 + -1.963302995025921e-03 + -1.963302995025921e-03 + 8.856186831939988e-03 + -1.963302995025921e-03 + 3.908085511694356e-03 + -3.979827561117468e-03 + 1.963302995025921e-03 + -6.450418033654354e-04 + -6.450418033654354e-04 + -3.706948155889103e-04 + -3.706948155889103e-04 + 8.631865805905567e-05 + 8.631865805905567e-05 + 8.631865805905567e-05 + 8.631865805905567e-05 + 3.225787781771604e-05 + 3.225787781771604e-05 + -8.631865805905567e-05 + -8.631865805905567e-05 + -8.631865805905567e-05 + -8.631865805905567e-05 + 3.225787781771604e-05 + 3.225787781771604e-05 + -8.631865805905567e-05 + -8.631865805905567e-05 + -3.908085511694356e-03 + -3.979827561117468e-03 + 1.963302995025921e-03 + 6.450418033654354e-04 + 6.450418033654354e-04 + -3.706948155889103e-04 + -3.706948155889103e-04 + 8.631865805905567e-05 + 8.631865805905567e-05 + 8.209863477617062e-04 + 1.067002791300528e-03 + 6.974282992909319e-04 + 4.736083183405652e-02 + -6.735875654831194e-02 + 4.736083183405652e-02 + -6.974282992909319e-04 + 2.113566911841701e-04 + 6.974282992909319e-04 + -5.075933961265734e-04 + -4.717843819452398e-04 + 4.751825590009510e-04 + 5.075933961265734e-04 + -4.717843819452398e-04 + 4.751825590009510e-04 + 6.974282992909319e-04 + 2.113566911841701e-04 + 6.974282992909319e-04 + -4.736083183405652e-02 + -6.735875654831194e-02 + 4.736083183405652e-02 + -8.209863477617062e-04 + 1.067002791300528e-03 + 6.974282992909319e-04 + 2.761355285612235e-01 + -1.878712363742123e-04 + -1.878712363742123e-04 + -1.963302995025921e-03 + -3.908085511694356e-03 + -3.979827561117468e-03 + -1.963302995025921e-03 + 3.908085511694356e-03 + -3.979827561117468e-03 + -4.762615422267059e-04 + -4.762615422267059e-04 + 1.096966279500372e-05 + 1.096966279500372e-05 + 1.096966279500372e-05 + 1.096966279500372e-05 + 1.963302995025921e-03 + 3.908085511694356e-03 + -3.979827561117468e-03 + 1.963302995025921e-03 + -3.908085511694356e-03 + -3.979827561117468e-03 + -4.736083183405652e-02 + -4.736083183405652e-02 + -6.735875654831194e-02 + -6.974282992909319e-04 + -6.974282992909319e-04 + 2.113566911841701e-04 + 5.075933961265734e-04 + -4.751825590009510e-04 + -4.717843819452398e-04 + 8.209863477617062e-04 + -6.974282992909319e-04 + 1.067002791300528e-03 + -8.209863477617062e-04 + -6.974282992909319e-04 + 1.067002791300528e-03 + -5.075933961265734e-04 + -4.751825590009510e-04 + -4.717843819452398e-04 + 6.974282992909319e-04 + -6.974282992909319e-04 + 2.113566911841701e-04 + 4.736083183405652e-02 + -4.736083183405652e-02 + -6.735875654831194e-02 + -3.908085511694356e-03 + -1.963302995025921e-03 + -3.979827561117468e-03 + 3.908085511694356e-03 + -1.963302995025921e-03 + -3.979827561117468e-03 + 1.963302995025921e-03 + 1.963302995025921e-03 + 8.856186831939988e-03 + 8.631865805905567e-05 + 8.631865805905567e-05 + 8.631865805905567e-05 + 8.631865805905567e-05 + 3.225787781771604e-05 + 3.225787781771604e-05 + 6.450418033654354e-04 + 6.450418033654354e-04 + -8.631865805905567e-05 + -8.631865805905567e-05 + -3.706948155889103e-04 + -3.706948155889103e-04 + -6.450418033654354e-04 + -6.450418033654354e-04 + -8.631865805905567e-05 + -8.631865805905567e-05 + -3.706948155889103e-04 + -3.706948155889103e-04 + -1.963302995025921e-03 + 1.963302995025921e-03 + 8.856186831939988e-03 + -8.631865805905567e-05 + -8.631865805905567e-05 + 8.631865805905567e-05 + 8.631865805905567e-05 + 3.225787781771604e-05 + 3.225787781771604e-05 + -4.751825590009510e-04 + 5.075933961265734e-04 + -4.717843819452398e-04 + -6.974282992909319e-04 + 8.209863477617062e-04 + 1.067002791300528e-03 + 5.075933961265734e-04 + 5.075933961265734e-04 + -4.303142197586944e-03 + 5.148692983384494e-04 + 5.148692983384494e-04 + 3.536997962746573e-04 + -5.148692983384494e-04 + 5.148692983384494e-04 + 3.536997962746573e-04 + -5.075933961265734e-04 + 5.075933961265734e-04 + -4.303142197586944e-03 + 6.974282992909319e-04 + 8.209863477617062e-04 + 1.067002791300528e-03 + 4.751825590009510e-04 + 5.075933961265734e-04 + -4.717843819452398e-04 + -4.762615422267059e-04 + -4.762615422267059e-04 + 1.096966279500372e-05 + 1.096966279500372e-05 + 1.096966279500372e-05 + 1.096966279500372e-05 + -8.631865805905567e-05 + -8.631865805905567e-05 + 6.450418033654354e-04 + 6.450418033654354e-04 + -3.706948155889103e-04 + -3.706948155889103e-04 + -8.631865805905567e-05 + -8.631865805905567e-05 + -6.450418033654354e-04 + -6.450418033654354e-04 + -3.706948155889103e-04 + -3.706948155889103e-04 + 2.054704449544921e-03 + 2.054704449544921e-03 + 2.054704449544921e-03 + 2.054704449544921e-03 + -5.609575914118254e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + 8.631865805905567e-05 + 8.631865805905567e-05 + -6.450418033654354e-04 + -6.450418033654354e-04 + -3.706948155889103e-04 + -3.706948155889103e-04 + 8.631865805905567e-05 + 8.631865805905567e-05 + 6.450418033654354e-04 + 6.450418033654354e-04 + -3.706948155889103e-04 + -3.706948155889103e-04 + -6.974282992909319e-04 + -8.209863477617062e-04 + 1.067002791300528e-03 + -4.751825590009510e-04 + -5.075933961265734e-04 + -4.717843819452398e-04 + 5.148692983384494e-04 + -5.148692983384494e-04 + 3.536997962746573e-04 + 5.075933961265734e-04 + -5.075933961265734e-04 + -4.303142197586944e-03 + -5.075933961265734e-04 + -5.075933961265734e-04 + -4.303142197586944e-03 + -5.148692983384494e-04 + -5.148692983384494e-04 + 3.536997962746573e-04 + 4.751825590009510e-04 + -5.075933961265734e-04 + -4.717843819452398e-04 + 6.974282992909319e-04 + -8.209863477617062e-04 + 1.067002791300528e-03 + 3.908085511694356e-03 + 1.963302995025921e-03 + -3.979827561117468e-03 + -3.908085511694356e-03 + 1.963302995025921e-03 + -3.979827561117468e-03 + 1.963302995025921e-03 + -1.963302995025921e-03 + 8.856186831939988e-03 + 8.631865805905567e-05 + 8.631865805905567e-05 + -8.631865805905567e-05 + -8.631865805905567e-05 + 3.225787781771604e-05 + 3.225787781771604e-05 + -6.450418033654354e-04 + -6.450418033654354e-04 + 8.631865805905567e-05 + 8.631865805905567e-05 + -3.706948155889103e-04 + -3.706948155889103e-04 + 6.450418033654354e-04 + 6.450418033654354e-04 + 8.631865805905567e-05 + 8.631865805905567e-05 + -3.706948155889103e-04 + -3.706948155889103e-04 + -1.963302995025921e-03 + -1.963302995025921e-03 + 8.856186831939988e-03 + -8.631865805905567e-05 + -8.631865805905567e-05 + -8.631865805905567e-05 + -8.631865805905567e-05 + 3.225787781771604e-05 + 3.225787781771604e-05 + -6.974282992909319e-04 + 6.974282992909319e-04 + 2.113566911841701e-04 + -4.736083183405652e-02 + 4.736083183405652e-02 + -6.735875654831194e-02 + 8.209863477617062e-04 + 6.974282992909319e-04 + 1.067002791300528e-03 + 5.075933961265734e-04 + 4.751825590009510e-04 + -4.717843819452398e-04 + -5.075933961265734e-04 + 4.751825590009510e-04 + -4.717843819452398e-04 + -8.209863477617062e-04 + 6.974282992909319e-04 + 1.067002791300528e-03 + 4.736083183405652e-02 + 4.736083183405652e-02 + -6.735875654831194e-02 + 6.974282992909319e-04 + 6.974282992909319e-04 + 2.113566911841701e-04 + -6.735875654831194e-02 + -4.736083183405652e-02 + -4.736083183405652e-02 + 1.067002791300528e-03 + -8.209863477617062e-04 + -6.974282992909319e-04 + -6.735875654831194e-02 + 4.736083183405652e-02 + 4.736083183405652e-02 + 1.067002791300528e-03 + 8.209863477617062e-04 + 6.974282992909319e-04 + 1.067002791300528e-03 + -6.974282992909319e-04 + -8.209863477617062e-04 + -4.303142197586944e-03 + -5.075933961265734e-04 + -5.075933961265734e-04 + 1.067002791300528e-03 + 6.974282992909319e-04 + 8.209863477617062e-04 + -4.303142197586944e-03 + 5.075933961265734e-04 + 5.075933961265734e-04 + 2.761355285612235e-01 + -4.762615422267059e-04 + -4.762615422267059e-04 + 8.856186831939988e-03 + -1.963302995025921e-03 + -1.963302995025921e-03 + 8.856186831939988e-03 + 1.963302995025921e-03 + -1.963302995025921e-03 + -4.762615422267059e-04 + -4.762615422267059e-04 + 2.054704449544921e-03 + 2.054704449544921e-03 + 2.054704449544921e-03 + 2.054704449544921e-03 + 8.856186831939988e-03 + -1.963302995025921e-03 + 1.963302995025921e-03 + 8.856186831939988e-03 + 1.963302995025921e-03 + 1.963302995025921e-03 + -6.735875654831194e-02 + 4.736083183405652e-02 + -4.736083183405652e-02 + 1.067002791300528e-03 + 8.209863477617062e-04 + -6.974282992909319e-04 + -6.735875654831194e-02 + -4.736083183405652e-02 + 4.736083183405652e-02 + 1.067002791300528e-03 + -8.209863477617062e-04 + 6.974282992909319e-04 + 1.067002791300528e-03 + 6.974282992909319e-04 + -8.209863477617062e-04 + -4.303142197586944e-03 + 5.075933961265734e-04 + -5.075933961265734e-04 + 1.067002791300528e-03 + -6.974282992909319e-04 + 8.209863477617062e-04 + -4.303142197586944e-03 + -5.075933961265734e-04 + 5.075933961265734e-04 + -3.979827561117468e-03 + 1.963302995025921e-03 + -3.908085511694356e-03 + -3.979827561117468e-03 + -1.963302995025921e-03 + 3.908085511694356e-03 + -3.979827561117468e-03 + -3.908085511694356e-03 + 1.963302995025921e-03 + -3.706948155889103e-04 + -3.706948155889103e-04 + 6.450418033654354e-04 + 6.450418033654354e-04 + 8.631865805905567e-05 + 8.631865805905567e-05 + -3.706948155889103e-04 + -3.706948155889103e-04 + 8.631865805905567e-05 + 8.631865805905567e-05 + 6.450418033654354e-04 + 6.450418033654354e-04 + -3.706948155889103e-04 + -3.706948155889103e-04 + -8.631865805905567e-05 + -8.631865805905567e-05 + -6.450418033654354e-04 + -6.450418033654354e-04 + -3.979827561117468e-03 + 3.908085511694356e-03 + -1.963302995025921e-03 + -3.706948155889103e-04 + -3.706948155889103e-04 + -6.450418033654354e-04 + -6.450418033654354e-04 + -8.631865805905567e-05 + -8.631865805905567e-05 + 2.113566911841701e-04 + -6.974282992909319e-04 + -6.974282992909319e-04 + -4.717843819452398e-04 + -5.075933961265734e-04 + -4.751825590009510e-04 + 2.113566911841701e-04 + 6.974282992909319e-04 + 6.974282992909319e-04 + -4.717843819452398e-04 + 5.075933961265734e-04 + 4.751825590009510e-04 + -4.717843819452398e-04 + -4.751825590009510e-04 + -5.075933961265734e-04 + 3.536997962746573e-04 + -5.148692983384494e-04 + -5.148692983384494e-04 + -4.717843819452398e-04 + 4.751825590009510e-04 + 5.075933961265734e-04 + 3.536997962746573e-04 + 5.148692983384494e-04 + 5.148692983384494e-04 + -1.878712363742123e-04 + -1.878712363742123e-04 + 1.096966279500372e-05 + 1.096966279500372e-05 + 1.096966279500372e-05 + 1.096966279500372e-05 + 3.225787781771604e-05 + 3.225787781771604e-05 + -8.631865805905567e-05 + -8.631865805905567e-05 + -8.631865805905567e-05 + -8.631865805905567e-05 + 3.225787781771604e-05 + 3.225787781771604e-05 + 8.631865805905567e-05 + 8.631865805905567e-05 + -8.631865805905567e-05 + -8.631865805905567e-05 + 1.096966279500372e-05 + 1.096966279500372e-05 + 1.096966279500372e-05 + 1.096966279500372e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + 3.225787781771604e-05 + 3.225787781771604e-05 + -8.631865805905567e-05 + -8.631865805905567e-05 + 8.631865805905567e-05 + 8.631865805905567e-05 + 3.225787781771604e-05 + 3.225787781771604e-05 + 8.631865805905567e-05 + 8.631865805905567e-05 + 8.631865805905567e-05 + 8.631865805905567e-05 + 2.113566911841701e-04 + 6.974282992909319e-04 + -6.974282992909319e-04 + -4.717843819452398e-04 + 5.075933961265734e-04 + -4.751825590009510e-04 + 2.113566911841701e-04 + -6.974282992909319e-04 + 6.974282992909319e-04 + -4.717843819452398e-04 + -5.075933961265734e-04 + 4.751825590009510e-04 + -4.717843819452398e-04 + 4.751825590009510e-04 + -5.075933961265734e-04 + 3.536997962746573e-04 + 5.148692983384494e-04 + -5.148692983384494e-04 + -4.717843819452398e-04 + -4.751825590009510e-04 + 5.075933961265734e-04 + 3.536997962746573e-04 + -5.148692983384494e-04 + 5.148692983384494e-04 + -3.979827561117468e-03 + 1.963302995025921e-03 + 3.908085511694356e-03 + -3.979827561117468e-03 + -1.963302995025921e-03 + -3.908085511694356e-03 + -3.979827561117468e-03 + 3.908085511694356e-03 + 1.963302995025921e-03 + -3.706948155889103e-04 + -3.706948155889103e-04 + -6.450418033654354e-04 + -6.450418033654354e-04 + 8.631865805905567e-05 + 8.631865805905567e-05 + -3.706948155889103e-04 + -3.706948155889103e-04 + 8.631865805905567e-05 + 8.631865805905567e-05 + -6.450418033654354e-04 + -6.450418033654354e-04 + -3.706948155889103e-04 + -3.706948155889103e-04 + -8.631865805905567e-05 + -8.631865805905567e-05 + 6.450418033654354e-04 + 6.450418033654354e-04 + -3.979827561117468e-03 + -3.908085511694356e-03 + -1.963302995025921e-03 + -3.706948155889103e-04 + -3.706948155889103e-04 + 6.450418033654354e-04 + 6.450418033654354e-04 + -8.631865805905567e-05 + -8.631865805905567e-05 + -4.736083183405652e-02 + -6.735875654831194e-02 + -4.736083183405652e-02 + -8.209863477617062e-04 + 1.067002791300528e-03 + -6.974282992909319e-04 + 4.736083183405652e-02 + -6.735875654831194e-02 + -4.736083183405652e-02 + 8.209863477617062e-04 + 1.067002791300528e-03 + -6.974282992909319e-04 + -6.974282992909319e-04 + 2.113566911841701e-04 + -6.974282992909319e-04 + -5.075933961265734e-04 + -4.717843819452398e-04 + -4.751825590009510e-04 + 6.974282992909319e-04 + 2.113566911841701e-04 + -6.974282992909319e-04 + 5.075933961265734e-04 + -4.717843819452398e-04 + -4.751825590009510e-04 + 2.761355285612235e-01 + -4.762615422267059e-04 + -4.762615422267059e-04 + 1.963302995025921e-03 + -3.979827561117468e-03 + -3.908085511694356e-03 + -1.963302995025921e-03 + -3.979827561117468e-03 + 3.908085511694356e-03 + -1.878712363742123e-04 + -1.878712363742123e-04 + 1.096966279500372e-05 + 1.096966279500372e-05 + 1.096966279500372e-05 + 1.096966279500372e-05 + 1.963302995025921e-03 + -3.979827561117468e-03 + 3.908085511694356e-03 + -1.963302995025921e-03 + -3.979827561117468e-03 + -3.908085511694356e-03 + 4.736083183405652e-02 + -6.735875654831194e-02 + 4.736083183405652e-02 + 8.209863477617062e-04 + 1.067002791300528e-03 + 6.974282992909319e-04 + -4.736083183405652e-02 + -6.735875654831194e-02 + 4.736083183405652e-02 + -8.209863477617062e-04 + 1.067002791300528e-03 + 6.974282992909319e-04 + 6.974282992909319e-04 + 2.113566911841701e-04 + 6.974282992909319e-04 + 5.075933961265734e-04 + -4.717843819452398e-04 + 4.751825590009510e-04 + -6.974282992909319e-04 + 2.113566911841701e-04 + 6.974282992909319e-04 + -5.075933961265734e-04 + -4.717843819452398e-04 + 4.751825590009510e-04 + -1.963302995025921e-03 + 8.856186831939988e-03 + -1.963302995025921e-03 + 1.963302995025921e-03 + 8.856186831939988e-03 + -1.963302995025921e-03 + -3.908085511694356e-03 + -3.979827561117468e-03 + 1.963302995025921e-03 + 6.450418033654354e-04 + 6.450418033654354e-04 + -3.706948155889103e-04 + -3.706948155889103e-04 + 8.631865805905567e-05 + 8.631865805905567e-05 + -8.631865805905567e-05 + -8.631865805905567e-05 + 3.225787781771604e-05 + 3.225787781771604e-05 + -8.631865805905567e-05 + -8.631865805905567e-05 + 8.631865805905567e-05 + 8.631865805905567e-05 + 3.225787781771604e-05 + 3.225787781771604e-05 + -8.631865805905567e-05 + -8.631865805905567e-05 + 3.908085511694356e-03 + -3.979827561117468e-03 + 1.963302995025921e-03 + -6.450418033654354e-04 + -6.450418033654354e-04 + -3.706948155889103e-04 + -3.706948155889103e-04 + 8.631865805905567e-05 + 8.631865805905567e-05 + -6.974282992909319e-04 + 1.067002791300528e-03 + -8.209863477617062e-04 + -5.075933961265734e-04 + -4.303142197586944e-03 + -5.075933961265734e-04 + 6.974282992909319e-04 + 1.067002791300528e-03 + -8.209863477617062e-04 + 5.075933961265734e-04 + -4.303142197586944e-03 + -5.075933961265734e-04 + -4.751825590009510e-04 + -4.717843819452398e-04 + -5.075933961265734e-04 + -5.148692983384494e-04 + 3.536997962746573e-04 + -5.148692983384494e-04 + 4.751825590009510e-04 + -4.717843819452398e-04 + -5.075933961265734e-04 + 5.148692983384494e-04 + 3.536997962746573e-04 + -5.148692983384494e-04 + -4.762615422267059e-04 + -4.762615422267059e-04 + 2.054704449544921e-03 + 2.054704449544921e-03 + 2.054704449544921e-03 + 2.054704449544921e-03 + 8.631865805905567e-05 + 8.631865805905567e-05 + -3.706948155889103e-04 + -3.706948155889103e-04 + 6.450418033654354e-04 + 6.450418033654354e-04 + -8.631865805905567e-05 + -8.631865805905567e-05 + -3.706948155889103e-04 + -3.706948155889103e-04 + -6.450418033654354e-04 + -6.450418033654354e-04 + 1.096966279500372e-05 + 1.096966279500372e-05 + 1.096966279500372e-05 + 1.096966279500372e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + 8.631865805905567e-05 + 8.631865805905567e-05 + -3.706948155889103e-04 + -3.706948155889103e-04 + -6.450418033654354e-04 + -6.450418033654354e-04 + -8.631865805905567e-05 + -8.631865805905567e-05 + -3.706948155889103e-04 + -3.706948155889103e-04 + 6.450418033654354e-04 + 6.450418033654354e-04 + 6.974282992909319e-04 + 1.067002791300528e-03 + 8.209863477617062e-04 + 5.075933961265734e-04 + -4.303142197586944e-03 + 5.075933961265734e-04 + -6.974282992909319e-04 + 1.067002791300528e-03 + 8.209863477617062e-04 + -5.075933961265734e-04 + -4.303142197586944e-03 + 5.075933961265734e-04 + 4.751825590009510e-04 + -4.717843819452398e-04 + 5.075933961265734e-04 + 5.148692983384494e-04 + 3.536997962746573e-04 + 5.148692983384494e-04 + -4.751825590009510e-04 + -4.717843819452398e-04 + 5.075933961265734e-04 + -5.148692983384494e-04 + 3.536997962746573e-04 + 5.148692983384494e-04 + -1.963302995025921e-03 + 8.856186831939988e-03 + 1.963302995025921e-03 + 1.963302995025921e-03 + 8.856186831939988e-03 + 1.963302995025921e-03 + 3.908085511694356e-03 + -3.979827561117468e-03 + -1.963302995025921e-03 + -6.450418033654354e-04 + -6.450418033654354e-04 + -3.706948155889103e-04 + -3.706948155889103e-04 + -8.631865805905567e-05 + -8.631865805905567e-05 + -8.631865805905567e-05 + -8.631865805905567e-05 + 3.225787781771604e-05 + 3.225787781771604e-05 + 8.631865805905567e-05 + 8.631865805905567e-05 + 8.631865805905567e-05 + 8.631865805905567e-05 + 3.225787781771604e-05 + 3.225787781771604e-05 + 8.631865805905567e-05 + 8.631865805905567e-05 + -3.908085511694356e-03 + -3.979827561117468e-03 + -1.963302995025921e-03 + 6.450418033654354e-04 + 6.450418033654354e-04 + -3.706948155889103e-04 + -3.706948155889103e-04 + -8.631865805905567e-05 + -8.631865805905567e-05 + -4.736083183405652e-02 + -4.736083183405652e-02 + -6.735875654831194e-02 + -6.974282992909319e-04 + -6.974282992909319e-04 + 2.113566911841701e-04 + 4.736083183405652e-02 + -4.736083183405652e-02 + -6.735875654831194e-02 + 6.974282992909319e-04 + -6.974282992909319e-04 + 2.113566911841701e-04 + -8.209863477617062e-04 + -6.974282992909319e-04 + 1.067002791300528e-03 + -5.075933961265734e-04 + -4.751825590009510e-04 + -4.717843819452398e-04 + 8.209863477617062e-04 + -6.974282992909319e-04 + 1.067002791300528e-03 + 5.075933961265734e-04 + -4.751825590009510e-04 + -4.717843819452398e-04 + 2.761355285612235e-01 + -1.878712363742123e-04 + -1.878712363742123e-04 + 1.963302995025921e-03 + -3.908085511694356e-03 + -3.979827561117468e-03 + 1.963302995025921e-03 + 3.908085511694356e-03 + -3.979827561117468e-03 + -4.762615422267059e-04 + -4.762615422267059e-04 + 1.096966279500372e-05 + 1.096966279500372e-05 + 1.096966279500372e-05 + 1.096966279500372e-05 + -1.963302995025921e-03 + 3.908085511694356e-03 + -3.979827561117468e-03 + -1.963302995025921e-03 + -3.908085511694356e-03 + -3.979827561117468e-03 + -4.736083183405652e-02 + 4.736083183405652e-02 + -6.735875654831194e-02 + -6.974282992909319e-04 + 6.974282992909319e-04 + 2.113566911841701e-04 + 4.736083183405652e-02 + 4.736083183405652e-02 + -6.735875654831194e-02 + 6.974282992909319e-04 + 6.974282992909319e-04 + 2.113566911841701e-04 + -8.209863477617062e-04 + 6.974282992909319e-04 + 1.067002791300528e-03 + -5.075933961265734e-04 + 4.751825590009510e-04 + -4.717843819452398e-04 + 8.209863477617062e-04 + 6.974282992909319e-04 + 1.067002791300528e-03 + 5.075933961265734e-04 + 4.751825590009510e-04 + -4.717843819452398e-04 + -3.908085511694356e-03 + 1.963302995025921e-03 + -3.979827561117468e-03 + 3.908085511694356e-03 + 1.963302995025921e-03 + -3.979827561117468e-03 + -1.963302995025921e-03 + -1.963302995025921e-03 + 8.856186831939988e-03 + -8.631865805905567e-05 + -8.631865805905567e-05 + -8.631865805905567e-05 + -8.631865805905567e-05 + 3.225787781771604e-05 + 3.225787781771604e-05 + 6.450418033654354e-04 + 6.450418033654354e-04 + 8.631865805905567e-05 + 8.631865805905567e-05 + -3.706948155889103e-04 + -3.706948155889103e-04 + -6.450418033654354e-04 + -6.450418033654354e-04 + 8.631865805905567e-05 + 8.631865805905567e-05 + -3.706948155889103e-04 + -3.706948155889103e-04 + 1.963302995025921e-03 + -1.963302995025921e-03 + 8.856186831939988e-03 + 8.631865805905567e-05 + 8.631865805905567e-05 + -8.631865805905567e-05 + -8.631865805905567e-05 + 3.225787781771604e-05 + 3.225787781771604e-05 + -6.974282992909319e-04 + -8.209863477617062e-04 + 1.067002791300528e-03 + -4.751825590009510e-04 + -5.075933961265734e-04 + -4.717843819452398e-04 + 6.974282992909319e-04 + -8.209863477617062e-04 + 1.067002791300528e-03 + 4.751825590009510e-04 + -5.075933961265734e-04 + -4.717843819452398e-04 + -5.075933961265734e-04 + -5.075933961265734e-04 + -4.303142197586944e-03 + -5.148692983384494e-04 + -5.148692983384494e-04 + 3.536997962746573e-04 + 5.075933961265734e-04 + -5.075933961265734e-04 + -4.303142197586944e-03 + 5.148692983384494e-04 + -5.148692983384494e-04 + 3.536997962746573e-04 + -4.762615422267059e-04 + -4.762615422267059e-04 + 1.096966279500372e-05 + 1.096966279500372e-05 + 1.096966279500372e-05 + 1.096966279500372e-05 + 8.631865805905567e-05 + 8.631865805905567e-05 + 6.450418033654354e-04 + 6.450418033654354e-04 + -3.706948155889103e-04 + -3.706948155889103e-04 + 8.631865805905567e-05 + 8.631865805905567e-05 + -6.450418033654354e-04 + -6.450418033654354e-04 + -3.706948155889103e-04 + -3.706948155889103e-04 + 2.054704449544921e-03 + 2.054704449544921e-03 + 2.054704449544921e-03 + 2.054704449544921e-03 + -5.609575914118254e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + -5.609575914118254e-05 + -8.631865805905567e-05 + -8.631865805905567e-05 + -6.450418033654354e-04 + -6.450418033654354e-04 + -3.706948155889103e-04 + -3.706948155889103e-04 + -8.631865805905567e-05 + -8.631865805905567e-05 + 6.450418033654354e-04 + 6.450418033654354e-04 + -3.706948155889103e-04 + -3.706948155889103e-04 + -6.974282992909319e-04 + 8.209863477617062e-04 + 1.067002791300528e-03 + -4.751825590009510e-04 + 5.075933961265734e-04 + -4.717843819452398e-04 + 6.974282992909319e-04 + 8.209863477617062e-04 + 1.067002791300528e-03 + 4.751825590009510e-04 + 5.075933961265734e-04 + -4.717843819452398e-04 + -5.075933961265734e-04 + 5.075933961265734e-04 + -4.303142197586944e-03 + -5.148692983384494e-04 + 5.148692983384494e-04 + 3.536997962746573e-04 + 5.075933961265734e-04 + 5.075933961265734e-04 + -4.303142197586944e-03 + 5.148692983384494e-04 + 5.148692983384494e-04 + 3.536997962746573e-04 + 3.908085511694356e-03 + -1.963302995025921e-03 + -3.979827561117468e-03 + -3.908085511694356e-03 + -1.963302995025921e-03 + -3.979827561117468e-03 + -1.963302995025921e-03 + 1.963302995025921e-03 + 8.856186831939988e-03 + -8.631865805905567e-05 + -8.631865805905567e-05 + 8.631865805905567e-05 + 8.631865805905567e-05 + 3.225787781771604e-05 + 3.225787781771604e-05 + -6.450418033654354e-04 + -6.450418033654354e-04 + -8.631865805905567e-05 + -8.631865805905567e-05 + -3.706948155889103e-04 + -3.706948155889103e-04 + 6.450418033654354e-04 + 6.450418033654354e-04 + -8.631865805905567e-05 + -8.631865805905567e-05 + -3.706948155889103e-04 + -3.706948155889103e-04 + 1.963302995025921e-03 + 1.963302995025921e-03 + 8.856186831939988e-03 + 8.631865805905567e-05 + 8.631865805905567e-05 + 8.631865805905567e-05 + 8.631865805905567e-05 + 3.225787781771604e-05 + 3.225787781771604e-05 diff --git a/example/Si/reference/si222_20.dos.bz2 b/example/Si/reference/si222_20.dos.bz2 new file mode 100644 index 00000000..0000998b Binary files /dev/null and b/example/Si/reference/si222_20.dos.bz2 differ diff --git a/example/Si/reference/si222_20.msd.bz2 b/example/Si/reference/si222_20.msd.bz2 new file mode 100644 index 00000000..9a65cf51 Binary files /dev/null and b/example/Si/reference/si222_20.msd.bz2 differ diff --git a/example/Si/reference/si222_20.thermo.bz2 b/example/Si/reference/si222_20.thermo.bz2 new file mode 100644 index 00000000..2f07935b Binary files /dev/null and b/example/Si/reference/si222_20.thermo.bz2 differ diff --git a/example/Si/reference/si222_cubic.fcs b/example/Si/reference/si222_cubic.fcs index 7258ff48..47795fc1 100644 --- a/example/Si/reference/si222_cubic.fcs +++ b/example/Si/reference/si222_cubic.fcs @@ -13,77 +13,77 @@ ---------------------------------------------------------------------- *FC2 - 1 1 2.7617453e-01 1 1x 1x 0.000 - 2 2 -1.2195057e-03 2 1x 2x 10.203 - 3 3 -6.2496693e-04 2 1x 33x 10.203 - 4 4 8.5935598e-03 1 1x 3x 7.215 - 5 5 1.9655898e-03 1 1x 3y 7.215 - 6 6 -4.2490872e-03 1 1x 17x 7.215 - 7 7 -3.9172885e-03 1 1x 17z 7.215 - 8 8 7.9671376e-03 4 1x 6x 14.429 - 9 9 -2.3601630e-04 4 1x 34x 14.429 - 10 10 -6.7104831e-02 1 1x 9x 4.418 - 11 11 -4.7380801e-02 1 1x 9y 4.418 - 12 12 1.3282532e-03 1 1x 10x 8.460 - 13 13 -8.2116209e-04 1 1x 10y 8.460 - 14 14 -6.9561306e-04 1 1x 10z 8.460 - 15 15 4.5271736e-04 1 1x 26x 8.460 - 16 16 -4.0571255e-03 1 1x 11x 11.118 - 17 17 5.0517278e-04 1 1x 11y 11.118 - 18 18 -2.0691115e-04 1 1x 25x 11.118 - 19 19 -4.7362015e-04 1 1x 25z 11.118 - 20 20 -1.0042599e-03 2 1x 20x 12.496 - 21 21 1.2863153e-03 2 1x 20y 12.496 - 22 22 -1.6874372e-04 2 1x 20z 12.496 - 23 23 -2.0122242e-04 2 1x 35x 12.496 - 24 24 6.0327036e-04 1 1x 28x 13.254 - 25 25 -5.1714558e-04 1 1x 28y 13.254 - 26 26 -6.9508388e-04 8 1x 38x 17.672 + 1 1 2.7613553e-01 1 1x 1x 0.000 + 2 2 -9.5252308e-04 2 1x 2x 10.203 + 3 3 -3.7574247e-04 2 1x 33x 10.203 + 4 4 8.8561868e-03 1 1x 3x 7.215 + 5 5 1.9633030e-03 1 1x 3y 7.215 + 6 6 -3.9798276e-03 1 1x 17x 7.215 + 7 7 -3.9080855e-03 1 1x 17z 7.215 + 8 8 8.2188178e-03 4 1x 6x 14.429 + 9 9 4.3878651e-05 4 1x 34x 14.429 + 10 10 -6.7358757e-02 1 1x 9x 4.418 + 11 11 -4.7360832e-02 1 1x 9y 4.418 + 12 12 1.0670028e-03 1 1x 10x 8.460 + 13 13 -8.2098635e-04 1 1x 10y 8.460 + 14 14 -6.9742830e-04 1 1x 10z 8.460 + 15 15 2.1135669e-04 1 1x 26x 8.460 + 16 16 -4.3031422e-03 1 1x 11x 11.118 + 17 17 5.0759340e-04 1 1x 11y 11.118 + 18 18 -4.7178438e-04 1 1x 25x 11.118 + 19 19 -4.7518256e-04 1 1x 25z 11.118 + 20 20 -7.4138963e-04 2 1x 20x 12.496 + 21 21 1.2900836e-03 2 1x 20y 12.496 + 22 22 -1.7263732e-04 2 1x 20z 12.496 + 23 23 6.4515756e-05 2 1x 35x 12.496 + 24 24 3.5369980e-04 1 1x 28x 13.254 + 25 25 -5.1486930e-04 1 1x 28y 13.254 + 26 26 -4.4876607e-04 8 1x 38x 17.672 *FC3 - 27 1 3.6823185e-01 1 1x 1y 1z 0.000 - 28 2 1.3295168e-03 1 1x 1x 3x 7.215 - 29 3 1.1375124e-03 1 1x 1x 3y 7.215 - 30 4 -4.6041055e-05 1 1x 1y 3x 7.215 - 31 5 -9.0241378e-04 1 1x 1y 3y 7.215 - 32 6 9.8457934e-04 1 1x 1y 3z 7.215 - 33 7 -1.1404363e-03 1 1x 1x 17y 7.215 - 34 8 -2.1428875e-03 1 1x 1x 17x 7.215 - 35 9 -1.6730316e-03 1 1x 1x 17z 7.215 - 36 10 4.7320592e-04 1 1x 1y 19z 7.215 - 37 11 -2.0677324e-03 1 1x 1y 19x 7.215 - 38 12 -3.5318954e-02 1 1x 1x 9x 4.418 - 39 13 -6.8431152e-02 1 1x 1x 9y 4.418 - 40 14 -6.8482535e-02 1 1x 1y 9x 4.418 - 41 15 -9.4500326e-02 1 1x 1y 9z 4.418 - 42 16 -1.6670315e-03 1 1x 3x 9x 7.215 - 43 17 -5.8097706e-04 1 1x 3y 9x 7.215 - 44 18 8.5612941e-04 1 1x 3y 9y 7.215 - 45 19 -1.7710571e-03 1 1x 3y 9z 7.215 - 46 20 1.4024526e-03 1 1x 9y 16y 7.215 - 47 21 -2.1714639e-03 1 1x 9y 16z 7.215 - 48 22 -1.6729253e-05 1 1x 9x 17z 7.215 - 49 23 -3.9214770e-04 1 1x 3x 17x 7.215 - 50 24 4.6343399e-04 1 1x 3x 17y 7.215 - 51 25 9.9174039e-05 1 1x 3y 17x 7.215 - 52 26 6.1736091e-04 1 1x 3y 17y 7.215 - 53 27 7.1888961e-04 1 1x 3y 17z 7.215 - 54 28 -4.4650161e-05 1 1x 3y 19z 7.215 - 55 29 -2.2395581e-04 1 1x 17z 19y 7.215 - 56 30 -1.0385332e-04 1 1x 3x 49x 7.215 - 57 31 -8.8301821e-05 1 1x 3x 49y 7.215 - 58 32 -1.0201345e-04 1 1x 3y 49x 7.215 - 59 33 1.7623961e-05 1 1x 3y 49y 7.215 - 60 34 -1.4305368e-04 1 1x 3y 49z 7.215 - 61 35 -2.1791389e-04 1 1x 3y 51z 7.215 - 62 36 -1.4957492e-04 1 1x 17z 23y 7.215 + 27 1 3.6763918e-01 1 1x 1y 1z 0.000 + 28 2 1.1598029e-03 1 1x 1x 3x 7.215 + 29 3 1.3292646e-03 1 1x 1x 3y 7.215 + 30 4 1.0589069e-04 1 1x 1y 3x 7.215 + 31 5 -8.5527214e-04 1 1x 1y 3y 7.215 + 32 6 8.5521374e-04 1 1x 1y 3z 7.215 + 33 7 -1.1804403e-03 1 1x 1x 17y 7.215 + 34 8 -1.8545666e-03 1 1x 1x 17x 7.215 + 35 9 -1.4404917e-03 1 1x 1x 17z 7.215 + 36 10 3.3107652e-04 1 1x 1y 19z 7.215 + 37 11 -2.0507162e-03 1 1x 1y 19x 7.215 + 38 12 -3.3998117e-02 1 1x 1x 9x 4.418 + 39 13 -6.7112494e-02 1 1x 1x 9y 4.418 + 40 14 -6.8184001e-02 1 1x 1y 9x 4.418 + 41 15 -9.3951300e-02 1 1x 1y 9z 4.418 + 42 16 -1.3282984e-03 1 1x 3x 9x 7.215 + 43 17 -6.8105466e-04 1 1x 3y 9x 7.215 + 44 18 1.1292752e-03 1 1x 3y 9y 7.215 + 45 19 -1.4118530e-03 1 1x 3y 9z 7.215 + 46 20 8.8406224e-04 1 1x 9y 16y 7.215 + 47 21 -1.8544056e-03 1 1x 9y 16z 7.215 + 48 22 -1.4523919e-04 1 1x 9x 17z 7.215 + 49 23 -4.4491092e-04 1 1x 3x 17x 7.215 + 50 24 4.1816864e-04 1 1x 3x 17y 7.215 + 51 25 1.8508775e-04 1 1x 3y 17x 7.215 + 52 26 4.9563670e-04 1 1x 3y 17y 7.215 + 53 27 6.8756373e-04 1 1x 3y 17z 7.215 + 54 28 -5.7397626e-05 1 1x 3y 19z 7.215 + 55 29 -2.3054418e-04 1 1x 17z 19y 7.215 + 56 30 -5.0742782e-05 1 1x 3x 49x 7.215 + 57 31 3.7511104e-06 1 1x 3x 49y 7.215 + 58 32 -2.2815327e-04 1 1x 3y 49x 7.215 + 59 33 -3.6170142e-06 1 1x 3y 49y 7.215 + 60 34 -1.6781654e-04 1 1x 3y 49z 7.215 + 61 35 -2.3678684e-04 1 1x 3y 51z 7.215 + 62 36 -1.4522492e-04 1 1x 17z 23y 7.215 ------------------------ All FCs below ------------------------ **FC2 - # FC2_1 6 2.7617453e-01 + # FC2_1 6 2.7613553e-01 1 1.00000 1x 1x 2 1.00000 1y 1y 3 1.00000 1z 1z @@ -91,7 +91,7 @@ 5 1.00000 9y 9y 6 1.00000 9z 9z - # FC2_2 12 -1.2195057e-03 + # FC2_2 12 -9.5252308e-04 1 1.00000 1x 2x 2 1.00000 1x 5x 3 1.00000 1y 2y @@ -105,7 +105,7 @@ 11 1.00000 9z 13z 12 1.00000 9z 41z - # FC2_3 6 -6.2496693e-04 + # FC2_3 6 -3.7574247e-04 1 1.00000 1x 33x 2 1.00000 1y 5y 3 1.00000 1z 2z @@ -113,7 +113,7 @@ 5 1.00000 9y 13y 6 1.00000 9z 10z - # FC2_4 24 8.5935598e-03 + # FC2_4 24 8.8561868e-03 1 1.00000 1x 3x 2 1.00000 1x 4x 3 1.00000 1x 7x @@ -139,7 +139,7 @@ 23 1.00000 9z 59z 24 1.00000 9z 63z - # FC2_5 96 1.9655898e-03 + # FC2_5 96 1.9633030e-03 1 1.00000 1x 3y 2 1.00000 1x 3z 3 -1.00000 1x 4y @@ -237,7 +237,7 @@ 95 1.00000 9z 63x 96 1.00000 9z 63y - # FC2_6 48 -4.2490872e-03 + # FC2_6 48 -3.9798276e-03 1 1.00000 1x 17x 2 1.00000 1x 18x 3 1.00000 1x 19x @@ -287,7 +287,7 @@ 47 1.00000 9z 57z 48 1.00000 9z 58z - # FC2_7 48 -3.9172885e-03 + # FC2_7 48 -3.9080855e-03 1 1.00000 1x 17z 2 -1.00000 1x 18z 3 1.00000 1x 19y @@ -337,7 +337,7 @@ 47 -1.00000 9z 57x 48 1.00000 9z 58x - # FC2_8 6 7.9671376e-03 + # FC2_8 6 8.2188178e-03 1 1.00000 1x 6x 2 1.00000 1y 34y 3 1.00000 1z 37z @@ -345,7 +345,7 @@ 5 1.00000 9y 42y 6 1.00000 9z 45z - # FC2_9 12 -2.3601630e-04 + # FC2_9 12 4.3878651e-05 1 1.00000 1x 34x 2 1.00000 1x 37x 3 1.00000 1y 6y @@ -359,7 +359,7 @@ 11 1.00000 9z 14z 12 1.00000 9z 42z - # FC2_10 24 -6.7104831e-02 + # FC2_10 24 -6.7358757e-02 1 1.00000 1x 9x 2 1.00000 1x 16x 3 1.00000 1x 58x @@ -385,7 +385,7 @@ 23 1.00000 9z 17z 24 1.00000 9z 19z - # FC2_11 48 -4.7380801e-02 + # FC2_11 48 -4.7360832e-02 1 1.00000 1x 9y 2 1.00000 1x 9z 3 -1.00000 1x 16y @@ -435,7 +435,7 @@ 47 -1.00000 9z 19x 48 -1.00000 9z 19y - # FC2_12 48 1.3282532e-03 + # FC2_12 48 1.0670028e-03 1 1.00000 1x 10x 2 1.00000 1x 12x 3 1.00000 1x 13x @@ -485,7 +485,7 @@ 47 1.00000 9z 49z 48 1.00000 9z 51z - # FC2_13 48 -8.2116209e-04 + # FC2_13 48 -8.2098635e-04 1 1.00000 1x 10y 2 -1.00000 1x 12z 3 1.00000 1x 13z @@ -535,7 +535,7 @@ 47 -1.00000 9z 49y 48 -1.00000 9z 51y - # FC2_14 96 -6.9561306e-04 + # FC2_14 96 -6.9742830e-04 1 1.00000 1x 10z 2 -1.00000 1x 12y 3 1.00000 1x 13y @@ -633,7 +633,7 @@ 95 1.00000 9z 49x 96 -1.00000 9z 51x - # FC2_15 24 4.5271736e-04 + # FC2_15 24 2.1135669e-04 1 1.00000 1x 26x 2 1.00000 1x 31x 3 1.00000 1x 41x @@ -659,7 +659,7 @@ 23 1.00000 9z 18z 24 1.00000 9z 20z - # FC2_16 24 -4.0571255e-03 + # FC2_16 24 -4.3031422e-03 1 1.00000 1x 11x 2 1.00000 1x 14x 3 1.00000 1x 60x @@ -685,7 +685,7 @@ 23 1.00000 9z 53z 24 1.00000 9z 55z - # FC2_17 96 5.0517278e-04 + # FC2_17 96 5.0759340e-04 1 1.00000 1x 11y 2 1.00000 1x 11z 3 -1.00000 1x 14y @@ -783,7 +783,7 @@ 95 1.00000 9z 55x 96 1.00000 9z 55y - # FC2_18 48 -2.0691115e-04 + # FC2_18 48 -4.7178438e-04 1 1.00000 1x 25x 2 1.00000 1x 27x 3 1.00000 1x 30x @@ -833,7 +833,7 @@ 47 1.00000 9z 50z 48 1.00000 9z 52z - # FC2_19 48 -4.7362015e-04 + # FC2_19 48 -4.7518256e-04 1 1.00000 1x 25z 2 1.00000 1x 27y 3 -1.00000 1x 30y @@ -883,7 +883,7 @@ 47 1.00000 9z 50x 48 -1.00000 9z 52x - # FC2_20 48 -1.0042599e-03 + # FC2_20 48 -7.4138963e-04 1 1.00000 1x 20x 2 1.00000 1x 21x 3 1.00000 1x 22x @@ -933,7 +933,7 @@ 47 1.00000 9z 61z 48 1.00000 9z 62z - # FC2_21 48 1.2863153e-03 + # FC2_21 48 1.2900836e-03 1 1.00000 1x 20y 2 1.00000 1x 21z 3 -1.00000 1x 22z @@ -983,7 +983,7 @@ 47 -1.00000 9z 61x 48 1.00000 9z 62x - # FC2_22 96 -1.6874372e-04 + # FC2_22 96 -1.7263732e-04 1 1.00000 1x 20z 2 1.00000 1x 21y 3 -1.00000 1x 22y @@ -1081,7 +1081,7 @@ 95 -1.00000 9z 64x 96 -1.00000 9z 64y - # FC2_23 24 -2.0122242e-04 + # FC2_23 24 6.4515756e-05 1 1.00000 1x 35x 2 1.00000 1x 36x 3 1.00000 1x 39x @@ -1107,7 +1107,7 @@ 23 1.00000 9z 60z 24 1.00000 9z 64z - # FC2_24 24 6.0327036e-04 + # FC2_24 24 3.5369980e-04 1 1.00000 1x 28x 2 1.00000 1x 29x 3 1.00000 1x 43x @@ -1133,7 +1133,7 @@ 23 1.00000 9z 54z 24 1.00000 9z 56z - # FC2_25 48 -5.1714558e-04 + # FC2_25 48 -5.1486930e-04 1 1.00000 1x 28y 2 -1.00000 1x 28z 3 -1.00000 1x 29y @@ -1183,7 +1183,7 @@ 47 -1.00000 9z 56x 48 -1.00000 9z 56y - # FC2_26 6 -6.9508388e-04 + # FC2_26 6 -4.4876607e-04 1 1.00000 1x 38x 2 1.00000 1y 38y 3 1.00000 1z 38z @@ -1193,7 +1193,7 @@ **FC3 - # FC3_1 6 3.6823185e-01 + # FC3_1 6 3.6763918e-01 1 1.00000 1x 1y 1z 2 1.00000 1y 1x 1z 3 1.00000 1z 1x 1y @@ -1201,7 +1201,7 @@ 5 -1.00000 9y 9x 9z 6 -1.00000 9z 9x 9y - # FC3_2 48 1.3295168e-03 + # FC3_2 48 1.1598029e-03 1 1.00000 1x 1x 3x 2 -1.00000 1x 1x 4x 3 -1.00000 1x 1x 7x @@ -1251,7 +1251,7 @@ 47 1.00000 9z 59z 59z 48 -1.00000 9z 63z 63z - # FC3_3 96 1.1375124e-03 + # FC3_3 96 1.3292646e-03 1 1.00000 1x 1x 3y 2 1.00000 1x 1x 3z 3 1.00000 1x 1x 4y @@ -1349,7 +1349,7 @@ 95 -1.00000 9z 57y 57y 96 1.00000 9z 58y 58y - # FC3_4 144 -4.6041055e-05 + # FC3_4 144 1.0589069e-04 1 1.00000 1x 1y 3x 2 1.00000 1x 1y 4x 3 -1.00000 1x 1y 7x @@ -1495,7 +1495,7 @@ 143 1.00000 9z 63x 63z 144 1.00000 9z 63y 63z - # FC3_5 144 -9.0241378e-04 + # FC3_5 144 -8.5527214e-04 1 1.00000 1x 1y 3y 2 -1.00000 1x 1y 4y 3 -1.00000 1x 1y 7y @@ -1641,7 +1641,7 @@ 143 1.00000 9z 57y 57z 144 -1.00000 9z 58y 58z - # FC3_6 144 9.8457934e-04 + # FC3_6 144 8.5521374e-04 1 1.00000 1x 1y 3z 2 1.00000 1x 1y 4z 3 1.00000 1x 1y 7z @@ -1787,7 +1787,7 @@ 143 -1.00000 9z 57x 57y 144 -1.00000 9z 58x 58y - # FC3_7 96 -1.1404363e-03 + # FC3_7 96 -1.1804403e-03 1 1.00000 1x 1x 17y 2 -1.00000 1x 1x 18y 3 1.00000 1x 1x 19z @@ -1885,7 +1885,7 @@ 95 -1.00000 9z 63x 63x 96 -1.00000 9z 63y 63y - # FC3_8 96 -2.1428875e-03 + # FC3_8 96 -1.8545666e-03 1 1.00000 1x 1x 17x 2 1.00000 1x 1x 18x 3 1.00000 1x 1x 19x @@ -1983,7 +1983,7 @@ 95 -1.00000 9z 57z 57z 96 1.00000 9z 58z 58z - # FC3_9 96 -1.6730316e-03 + # FC3_9 96 -1.4404917e-03 1 1.00000 1x 1x 17z 2 -1.00000 1x 1x 18z 3 1.00000 1x 1x 19y @@ -2081,7 +2081,7 @@ 95 -1.00000 9z 57x 57x 96 1.00000 9z 58x 58x - # FC3_10 72 4.7320592e-04 + # FC3_10 72 3.3107652e-04 1 1.00000 1x 1y 19z 2 1.00000 1x 1y 23z 3 1.00000 1x 1y 51z @@ -2155,7 +2155,7 @@ 71 -1.00000 9z 59x 59y 72 -1.00000 9z 63x 63y - # FC3_11 144 -2.0677324e-03 + # FC3_11 144 -2.0507162e-03 1 1.00000 1x 1y 19x 2 1.00000 1x 1y 19y 3 -1.00000 1x 1y 23x @@ -2301,7 +2301,7 @@ 143 1.00000 9z 57x 57z 144 1.00000 9z 58x 58z - # FC3_12 48 -3.5318954e-02 + # FC3_12 48 -3.3998117e-02 1 1.00000 1x 1x 9x 2 1.00000 1x 1x 16x 3 -1.00000 1x 1x 58x @@ -2351,7 +2351,7 @@ 47 -1.00000 9z 17z 17z 48 1.00000 9z 19z 19z - # FC3_13 96 -6.8431152e-02 + # FC3_13 96 -6.7112494e-02 1 1.00000 1x 1x 9y 2 1.00000 1x 1x 9z 3 -1.00000 1x 1x 16y @@ -2449,7 +2449,7 @@ 95 1.00000 9z 19x 19x 96 1.00000 9z 19y 19y - # FC3_14 144 -6.8482535e-02 + # FC3_14 144 -6.8184001e-02 1 1.00000 1x 1y 9x 2 1.00000 1x 1y 9y 3 -1.00000 1x 1y 16x @@ -2595,7 +2595,7 @@ 143 -1.00000 9z 19x 19z 144 -1.00000 9z 19y 19z - # FC3_15 72 -9.4500326e-02 + # FC3_15 72 -9.3951300e-02 1 1.00000 1x 1y 9z 2 1.00000 1x 1y 16z 3 1.00000 1x 1y 58z @@ -2669,7 +2669,7 @@ 71 1.00000 9z 17x 17y 72 1.00000 9z 19x 19y - # FC3_16 36 -1.6670315e-03 + # FC3_16 36 -1.3282984e-03 1 1.00000 1x 3x 9x 2 -1.00000 1x 4x 58x 3 -1.00000 1x 7x 63x @@ -2707,7 +2707,7 @@ 35 1.00000 9z 17z 31z 36 -1.00000 9z 19z 27z - # FC3_17 144 -5.8097706e-04 + # FC3_17 144 -6.8105466e-04 1 1.00000 1x 3y 9x 2 1.00000 1x 3z 9x 3 1.00000 1x 4y 58x @@ -2853,7 +2853,7 @@ 143 1.00000 9z 19z 27x 144 1.00000 9z 19z 27y - # FC3_18 144 8.5612941e-04 + # FC3_18 144 1.1292752e-03 1 1.00000 1x 3y 9y 2 1.00000 1x 3z 9z 3 -1.00000 1x 4y 58y @@ -2999,7 +2999,7 @@ 143 -1.00000 9z 19y 27y 144 1.00000 9z 19z 26y - # FC3_19 144 -1.7710571e-03 + # FC3_19 144 -1.4118530e-03 1 1.00000 1x 3y 9z 2 1.00000 1x 3z 9y 3 1.00000 1x 4y 58z @@ -3145,7 +3145,7 @@ 143 -1.00000 9z 19x 27y 144 -1.00000 9z 19y 27x - # FC3_20 72 1.4024526e-03 + # FC3_20 72 8.8406224e-04 1 -1.00000 1x 9y 16y 2 1.00000 1x 9y 17x 3 -1.00000 1x 9z 16z @@ -3219,7 +3219,7 @@ 71 -1.00000 9z 17y 25z 72 1.00000 9z 19y 26z - # FC3_21 72 -2.1714639e-03 + # FC3_21 72 -1.8544056e-03 1 -1.00000 1x 9y 16z 2 1.00000 1x 9y 17z 3 -1.00000 1x 9z 16y @@ -3293,7 +3293,7 @@ 71 -1.00000 9z 17y 25x 72 -1.00000 9z 19y 26x - # FC3_22 144 -1.6729253e-05 + # FC3_22 144 -1.4523919e-04 1 1.00000 1x 9x 17z 2 1.00000 1x 9x 19y 3 -1.00000 1x 9x 58z @@ -3439,7 +3439,7 @@ 143 1.00000 9z 19x 26x 144 1.00000 9z 19z 26x - # FC3_23 72 -3.9214770e-04 + # FC3_23 72 -4.4491092e-04 1 1.00000 1x 3x 17x 2 1.00000 1x 3x 19x 3 -1.00000 1x 4x 50x @@ -3513,7 +3513,7 @@ 71 1.00000 9z 57z 59z 72 -1.00000 9z 58z 63z - # FC3_24 144 4.6343399e-04 + # FC3_24 144 4.1816864e-04 1 1.00000 1x 3x 17y 2 -1.00000 1x 3x 17z 3 -1.00000 1x 3x 19y @@ -3659,7 +3659,7 @@ 143 1.00000 9z 58x 63z 144 -1.00000 9z 58y 63z - # FC3_25 144 9.9174039e-05 + # FC3_25 144 1.8508775e-04 1 1.00000 1x 3y 17x 2 1.00000 1x 3z 19x 3 1.00000 1x 4y 50x @@ -3805,7 +3805,7 @@ 143 1.00000 9z 57z 59y 144 -1.00000 9z 58z 63y - # FC3_26 144 6.1736091e-04 + # FC3_26 144 4.9563670e-04 1 1.00000 1x 3y 17y 2 -1.00000 1x 3y 19x 3 -1.00000 1x 3z 17x @@ -3951,7 +3951,7 @@ 143 -1.00000 9z 58y 63y 144 1.00000 9z 58z 63x - # FC3_27 72 7.1888961e-04 + # FC3_27 72 6.8756373e-04 1 1.00000 1x 3y 17z 2 1.00000 1x 3z 19y 3 1.00000 1x 4y 50z @@ -4025,7 +4025,7 @@ 71 -1.00000 9z 57x 59y 72 -1.00000 9z 58x 63y - # FC3_28 48 -4.4650161e-05 + # FC3_28 48 -5.7397626e-05 1 1.00000 1x 3y 19z 2 1.00000 1x 3z 17y 3 1.00000 1x 4y 51z @@ -4075,7 +4075,7 @@ 47 -1.00000 9z 57y 59x 48 -1.00000 9z 58y 63x - # FC3_29 24 -2.2395581e-04 + # FC3_29 24 -2.3054418e-04 1 1.00000 1x 17z 19y 2 1.00000 1x 18z 23y 3 1.00000 1x 49z 55y @@ -4101,7 +4101,7 @@ 23 -1.00000 9z 15y 25x 24 -1.00000 9z 16y 58x - # FC3_30 72 -1.0385332e-04 + # FC3_30 72 -5.0742782e-05 1 1.00000 1x 3x 49x 2 1.00000 1x 3x 51x 3 -1.00000 1x 4x 18x @@ -4175,7 +4175,7 @@ 71 -1.00000 9z 57z 63z 72 1.00000 9z 58z 59z - # FC3_31 144 -8.8301821e-05 + # FC3_31 144 3.7511104e-06 1 1.00000 1x 3x 49y 2 -1.00000 1x 3x 49z 3 -1.00000 1x 3x 51y @@ -4321,7 +4321,7 @@ 143 1.00000 9z 58x 59z 144 1.00000 9z 58y 59z - # FC3_32 144 -1.0201345e-04 + # FC3_32 144 -2.2815327e-04 1 1.00000 1x 3y 49x 2 1.00000 1x 3z 51x 3 1.00000 1x 4y 18x @@ -4467,7 +4467,7 @@ 143 -1.00000 9z 57z 63y 144 1.00000 9z 58z 59y - # FC3_33 144 1.7623961e-05 + # FC3_33 144 -3.6170142e-06 1 1.00000 1x 3y 49y 2 1.00000 1x 3y 51x 3 1.00000 1x 3z 49x @@ -4613,7 +4613,7 @@ 143 1.00000 9z 58y 59y 144 -1.00000 9z 58z 59x - # FC3_34 72 -1.4305368e-04 + # FC3_34 72 -1.6781654e-04 1 1.00000 1x 3y 49z 2 1.00000 1x 3z 51y 3 1.00000 1x 4y 18z @@ -4687,7 +4687,7 @@ 71 -1.00000 9z 57x 63y 72 -1.00000 9z 58x 59y - # FC3_35 48 -2.1791389e-04 + # FC3_35 48 -2.3678684e-04 1 1.00000 1x 3y 51z 2 1.00000 1x 3z 49y 3 1.00000 1x 4y 19z @@ -4737,7 +4737,7 @@ 47 -1.00000 9z 57y 63x 48 -1.00000 9z 58y 59x - # FC3_36 24 -1.4957492e-04 + # FC3_36 24 -1.4522492e-04 1 1.00000 1x 17z 23y 2 1.00000 1x 18z 19y 3 1.00000 1x 49z 51y diff --git a/example/Si/reference/si222_cubic.xml b/example/Si/reference/si222_cubic.xml deleted file mode 100644 index 81417fcd..00000000 --- a/example/Si/reference/si222_cubic.xml +++ /dev/null @@ -1,5115 +0,0 @@ - - - 0.9.7 - - disp3.dat - force3.dat - 1 - - - 64 - 1 - - Si - - - 2.040600000000000e+01 0.000000000000000e+00 0.000000000000000e+00 - 0.000000000000000e+00 2.040600000000000e+01 0.000000000000000e+00 - 0.000000000000000e+00 0.000000000000000e+00 2.040600000000000e+01 - - 1 1 1 - - 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 - 0.000000000000000e+00 0.000000000000000e+00 5.000000000000000e-01 - 0.000000000000000e+00 2.500000000000000e-01 2.500000000000000e-01 - 0.000000000000000e+00 2.500000000000000e-01 7.500000000000000e-01 - 0.000000000000000e+00 5.000000000000000e-01 0.000000000000000e+00 - 0.000000000000000e+00 5.000000000000000e-01 5.000000000000000e-01 - 0.000000000000000e+00 7.500000000000000e-01 2.500000000000000e-01 - 0.000000000000000e+00 7.500000000000000e-01 7.500000000000000e-01 - 1.250000000000000e-01 1.250000000000000e-01 1.250000000000000e-01 - 1.250000000000000e-01 1.250000000000000e-01 6.250000000000000e-01 - 1.250000000000000e-01 3.750000000000000e-01 3.750000000000000e-01 - 1.250000000000000e-01 3.750000000000000e-01 8.750000000000000e-01 - 1.250000000000000e-01 6.250000000000000e-01 1.250000000000000e-01 - 1.250000000000000e-01 6.250000000000000e-01 6.250000000000000e-01 - 1.250000000000000e-01 8.750000000000000e-01 3.750000000000000e-01 - 1.250000000000000e-01 8.750000000000000e-01 8.750000000000000e-01 - 2.500000000000000e-01 0.000000000000000e+00 2.500000000000000e-01 - 2.500000000000000e-01 0.000000000000000e+00 7.500000000000000e-01 - 2.500000000000000e-01 2.500000000000000e-01 0.000000000000000e+00 - 2.500000000000000e-01 2.500000000000000e-01 5.000000000000000e-01 - 2.500000000000000e-01 5.000000000000000e-01 2.500000000000000e-01 - 2.500000000000000e-01 5.000000000000000e-01 7.500000000000000e-01 - 2.500000000000000e-01 7.500000000000000e-01 0.000000000000000e+00 - 2.500000000000000e-01 7.500000000000000e-01 5.000000000000000e-01 - 3.750000000000000e-01 1.250000000000000e-01 3.750000000000000e-01 - 3.750000000000000e-01 1.250000000000000e-01 8.750000000000000e-01 - 3.750000000000000e-01 3.750000000000000e-01 1.250000000000000e-01 - 3.750000000000000e-01 3.750000000000000e-01 6.250000000000000e-01 - 3.750000000000000e-01 6.250000000000000e-01 3.750000000000000e-01 - 3.750000000000000e-01 6.250000000000000e-01 8.750000000000000e-01 - 3.750000000000000e-01 8.750000000000000e-01 1.250000000000000e-01 - 3.750000000000000e-01 8.750000000000000e-01 6.250000000000000e-01 - 5.000000000000000e-01 0.000000000000000e+00 0.000000000000000e+00 - 5.000000000000000e-01 0.000000000000000e+00 5.000000000000000e-01 - 5.000000000000000e-01 2.500000000000000e-01 2.500000000000000e-01 - 5.000000000000000e-01 2.500000000000000e-01 7.500000000000000e-01 - 5.000000000000000e-01 5.000000000000000e-01 0.000000000000000e+00 - 5.000000000000000e-01 5.000000000000000e-01 5.000000000000000e-01 - 5.000000000000000e-01 7.500000000000000e-01 2.500000000000000e-01 - 5.000000000000000e-01 7.500000000000000e-01 7.500000000000000e-01 - 6.250000000000000e-01 1.250000000000000e-01 1.250000000000000e-01 - 6.250000000000000e-01 1.250000000000000e-01 6.250000000000000e-01 - 6.250000000000000e-01 3.750000000000000e-01 3.750000000000000e-01 - 6.250000000000000e-01 3.750000000000000e-01 8.750000000000000e-01 - 6.250000000000000e-01 6.250000000000000e-01 1.250000000000000e-01 - 6.250000000000000e-01 6.250000000000000e-01 6.250000000000000e-01 - 6.250000000000000e-01 8.750000000000000e-01 3.750000000000000e-01 - 6.250000000000000e-01 8.750000000000000e-01 8.750000000000000e-01 - 7.500000000000000e-01 0.000000000000000e+00 2.500000000000000e-01 - 7.500000000000000e-01 0.000000000000000e+00 7.500000000000000e-01 - 7.500000000000000e-01 2.500000000000000e-01 0.000000000000000e+00 - 7.500000000000000e-01 2.500000000000000e-01 5.000000000000000e-01 - 7.500000000000000e-01 5.000000000000000e-01 2.500000000000000e-01 - 7.500000000000000e-01 5.000000000000000e-01 7.500000000000000e-01 - 7.500000000000000e-01 7.500000000000000e-01 0.000000000000000e+00 - 7.500000000000000e-01 7.500000000000000e-01 5.000000000000000e-01 - 8.750000000000000e-01 1.250000000000000e-01 3.750000000000000e-01 - 8.750000000000000e-01 1.250000000000000e-01 8.750000000000000e-01 - 8.750000000000000e-01 3.750000000000000e-01 1.250000000000000e-01 - 8.750000000000000e-01 3.750000000000000e-01 6.250000000000000e-01 - 8.750000000000000e-01 6.250000000000000e-01 3.750000000000000e-01 - 8.750000000000000e-01 6.250000000000000e-01 8.750000000000000e-01 - 8.750000000000000e-01 8.750000000000000e-01 1.250000000000000e-01 - 8.750000000000000e-01 8.750000000000000e-01 6.250000000000000e-01 - - - - 32 - - 1 - 9 - 2 - 10 - 3 - 11 - 4 - 12 - 5 - 13 - 6 - 14 - 7 - 15 - 8 - 16 - 17 - 25 - 18 - 26 - 19 - 27 - 20 - 28 - 21 - 29 - 22 - 30 - 23 - 31 - 24 - 32 - 33 - 41 - 34 - 42 - 35 - 43 - 36 - 44 - 37 - 45 - 38 - 46 - 39 - 47 - 40 - 48 - 49 - 57 - 50 - 58 - 51 - 59 - 52 - 60 - 53 - 61 - 54 - 62 - 55 - 63 - 56 - 64 - - - - - 26 - 2.761745250568870e-01 - -1.219505741652115e-03 - -6.249669259670847e-04 - 8.593559824310726e-03 - 1.965589776154950e-03 - -4.249087156691530e-03 - -3.917288458485471e-03 - 7.967137640895378e-03 - -2.360162988834184e-04 - -6.710483145472819e-02 - -4.738080118537333e-02 - 1.328253161877541e-03 - -8.211620892205063e-04 - -6.956130602741167e-04 - 4.527173625443188e-04 - -4.057125469651266e-03 - 5.051727787479492e-04 - -2.069111499179753e-04 - -4.736201513467744e-04 - -1.004259935439486e-03 - 1.286315288140974e-03 - -1.687437159337460e-04 - -2.012224162565479e-04 - 6.032703603746621e-04 - -5.171455786632795e-04 - -6.950838757474652e-04 - - - 36 - 3.682318452992084e-01 - 1.329516780045766e-03 - 1.137512366579103e-03 - -4.604105549283173e-05 - -9.024137829434153e-04 - 9.845793442069331e-04 - -1.140436299842416e-03 - -2.142887467535421e-03 - -1.673031588847897e-03 - 4.732059152899313e-04 - -2.067732421909399e-03 - -3.531895380512888e-02 - -6.843115219609121e-02 - -6.848253533455041e-02 - -9.450032592850591e-02 - -1.667031524313928e-03 - -5.809770596261958e-04 - 8.561294058172232e-04 - -1.771057142348802e-03 - 1.402452579700486e-03 - -2.171463896239441e-03 - -1.672925271626788e-05 - -3.921476992823873e-04 - 4.634339865815932e-04 - 9.917403921744489e-05 - 6.173609086399106e-04 - 7.188896116000130e-04 - -4.465016140720077e-05 - -2.239558091312980e-04 - -1.038533186064150e-04 - -8.830182089464896e-05 - -1.020134538757354e-04 - 1.762396085246187e-05 - -1.430536785708916e-04 - -2.179138887699983e-04 - -1.495749160722172e-04 - - - 2.761745250568871e-01 - -6.097528708260577e-04 - -6.097528708260577e-04 - 8.593559824310730e-03 - 1.965589776154951e-03 - 1.965589776154951e-03 - 8.593559824310730e-03 - -1.965589776154951e-03 - 1.965589776154951e-03 - -6.097528708260577e-04 - -6.097528708260577e-04 - 1.991784410223845e-03 - 1.991784410223845e-03 - 1.991784410223845e-03 - 1.991784410223845e-03 - 8.593559824310730e-03 - 1.965589776154951e-03 - -1.965589776154951e-03 - 8.593559824310730e-03 - -1.965589776154951e-03 - -1.965589776154951e-03 - -6.710483145472822e-02 - -4.738080118537335e-02 - -4.738080118537335e-02 - 1.328253161877541e-03 - -8.211620892205066e-04 - -6.956130602741171e-04 - -4.057125469651267e-03 - 5.051727787479494e-04 - 5.051727787479494e-04 - 1.328253161877541e-03 - 6.956130602741171e-04 - 8.211620892205066e-04 - 1.328253161877541e-03 - -6.956130602741171e-04 - -8.211620892205066e-04 - -4.057125469651267e-03 - -5.051727787479494e-04 - -5.051727787479494e-04 - 1.328253161877541e-03 - 8.211620892205066e-04 - 6.956130602741171e-04 - -6.710483145472822e-02 - 4.738080118537335e-02 - 4.738080118537335e-02 - -4.249087156691532e-03 - -1.965589776154951e-03 - -3.917288458485472e-03 - -4.249087156691532e-03 - 1.965589776154951e-03 - 3.917288458485472e-03 - -4.249087156691532e-03 - -3.917288458485472e-03 - -1.965589776154951e-03 - -5.021299677197431e-04 - -5.021299677197431e-04 - 6.431576440704874e-04 - 6.431576440704874e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - 6.431576440704874e-04 - 6.431576440704874e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - -6.431576440704874e-04 - -6.431576440704874e-04 - -4.249087156691532e-03 - 3.917288458485472e-03 - 1.965589776154951e-03 - -5.021299677197431e-04 - -5.021299677197431e-04 - -6.431576440704874e-04 - -6.431576440704874e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - -2.069111499179754e-04 - 5.051727787479494e-04 - -4.736201513467746e-04 - 4.527173625443191e-04 - 6.956130602741171e-04 - -6.956130602741171e-04 - -2.069111499179754e-04 - -4.736201513467746e-04 - 5.051727787479494e-04 - 6.032703603746623e-04 - -5.171455786632797e-04 - 5.171455786632797e-04 - 6.032703603746623e-04 - 5.171455786632797e-04 - -5.171455786632797e-04 - -2.069111499179754e-04 - 4.736201513467746e-04 - -5.051727787479494e-04 - 4.527173625443191e-04 - -6.956130602741171e-04 - 6.956130602741171e-04 - -2.069111499179754e-04 - -5.051727787479494e-04 - 4.736201513467746e-04 - -3.124834629835425e-04 - -3.124834629835425e-04 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - 4.527173625443191e-04 - -6.956130602741171e-04 - -6.956130602741171e-04 - -2.069111499179754e-04 - -5.051727787479494e-04 - -4.736201513467746e-04 - 6.032703603746623e-04 - 5.171455786632797e-04 - 5.171455786632797e-04 - -2.069111499179754e-04 - 4.736201513467746e-04 - 5.051727787479494e-04 - -2.069111499179754e-04 - -4.736201513467746e-04 - -5.051727787479494e-04 - 6.032703603746623e-04 - -5.171455786632797e-04 - -5.171455786632797e-04 - -2.069111499179754e-04 - 5.051727787479494e-04 - 4.736201513467746e-04 - 4.527173625443191e-04 - 6.956130602741171e-04 - 6.956130602741171e-04 - -4.249087156691532e-03 - -1.965589776154951e-03 - 3.917288458485472e-03 - -4.249087156691532e-03 - 1.965589776154951e-03 - -3.917288458485472e-03 - -4.249087156691532e-03 - 3.917288458485472e-03 - -1.965589776154951e-03 - -5.021299677197431e-04 - -5.021299677197431e-04 - -6.431576440704874e-04 - -6.431576440704874e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - -6.431576440704874e-04 - -6.431576440704874e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - 6.431576440704874e-04 - 6.431576440704874e-04 - -4.249087156691532e-03 - -3.917288458485472e-03 - 1.965589776154951e-03 - -5.021299677197431e-04 - -5.021299677197431e-04 - 6.431576440704874e-04 - 6.431576440704874e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - 1.328253161877541e-03 - 8.211620892205066e-04 - -6.956130602741171e-04 - -6.710483145472822e-02 - 4.738080118537335e-02 - -4.738080118537335e-02 - 1.328253161877541e-03 - -6.956130602741171e-04 - 8.211620892205066e-04 - -4.057125469651267e-03 - -5.051727787479494e-04 - 5.051727787479494e-04 - -4.057125469651267e-03 - 5.051727787479494e-04 - -5.051727787479494e-04 - 1.328253161877541e-03 - 6.956130602741171e-04 - -8.211620892205066e-04 - -6.710483145472822e-02 - -4.738080118537335e-02 - 4.738080118537335e-02 - 1.328253161877541e-03 - -8.211620892205066e-04 - 6.956130602741171e-04 - 2.761745250568871e-01 - -6.097528708260577e-04 - -6.097528708260577e-04 - -1.965589776154951e-03 - -4.249087156691532e-03 - -3.917288458485472e-03 - 1.965589776154951e-03 - -4.249087156691532e-03 - 3.917288458485472e-03 - -3.124834629835425e-04 - -3.124834629835425e-04 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -1.965589776154951e-03 - -4.249087156691532e-03 - 3.917288458485472e-03 - 1.965589776154951e-03 - -4.249087156691532e-03 - -3.917288458485472e-03 - -4.738080118537335e-02 - -6.710483145472822e-02 - -4.738080118537335e-02 - -8.211620892205066e-04 - 1.328253161877541e-03 - -6.956130602741171e-04 - 5.051727787479494e-04 - -2.069111499179754e-04 - -4.736201513467746e-04 - 6.956130602741171e-04 - 4.527173625443191e-04 - -6.956130602741171e-04 - -6.956130602741171e-04 - 4.527173625443191e-04 - -6.956130602741171e-04 - -5.051727787479494e-04 - -2.069111499179754e-04 - -4.736201513467746e-04 - 8.211620892205066e-04 - 1.328253161877541e-03 - -6.956130602741171e-04 - 4.738080118537335e-02 - -6.710483145472822e-02 - -4.738080118537335e-02 - 1.965589776154951e-03 - 8.593559824310730e-03 - 1.965589776154951e-03 - -1.965589776154951e-03 - 8.593559824310730e-03 - 1.965589776154951e-03 - -3.917288458485472e-03 - -4.249087156691532e-03 - -1.965589776154951e-03 - 6.431576440704874e-04 - 6.431576440704874e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - 3.917288458485472e-03 - -4.249087156691532e-03 - -1.965589776154951e-03 - -6.431576440704874e-04 - -6.431576440704874e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - 5.051727787479494e-04 - -4.057125469651267e-03 - 5.051727787479494e-04 - 6.956130602741171e-04 - 1.328253161877541e-03 - 8.211620892205066e-04 - -4.736201513467746e-04 - -2.069111499179754e-04 - 5.051727787479494e-04 - -5.171455786632797e-04 - 6.032703603746623e-04 - 5.171455786632797e-04 - 5.171455786632797e-04 - 6.032703603746623e-04 - 5.171455786632797e-04 - 4.736201513467746e-04 - -2.069111499179754e-04 - 5.051727787479494e-04 - -6.956130602741171e-04 - 1.328253161877541e-03 - 8.211620892205066e-04 - -5.051727787479494e-04 - -4.057125469651267e-03 - 5.051727787479494e-04 - -6.097528708260577e-04 - -6.097528708260577e-04 - 1.991784410223845e-03 - 1.991784410223845e-03 - 1.991784410223845e-03 - 1.991784410223845e-03 - -8.437185796687304e-05 - -8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - 6.431576440704874e-04 - 6.431576440704874e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - -6.431576440704874e-04 - -6.431576440704874e-04 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - -6.431576440704874e-04 - -6.431576440704874e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - 6.431576440704874e-04 - 6.431576440704874e-04 - -6.956130602741171e-04 - 1.328253161877541e-03 - -8.211620892205066e-04 - -5.051727787479494e-04 - -4.057125469651267e-03 - -5.051727787479494e-04 - 5.171455786632797e-04 - 6.032703603746623e-04 - -5.171455786632797e-04 - 4.736201513467746e-04 - -2.069111499179754e-04 - -5.051727787479494e-04 - -4.736201513467746e-04 - -2.069111499179754e-04 - -5.051727787479494e-04 - -5.171455786632797e-04 - 6.032703603746623e-04 - -5.171455786632797e-04 - 5.051727787479494e-04 - -4.057125469651267e-03 - -5.051727787479494e-04 - 6.956130602741171e-04 - 1.328253161877541e-03 - -8.211620892205066e-04 - 1.965589776154951e-03 - 8.593559824310730e-03 - -1.965589776154951e-03 - -1.965589776154951e-03 - 8.593559824310730e-03 - -1.965589776154951e-03 - 3.917288458485472e-03 - -4.249087156691532e-03 - 1.965589776154951e-03 - -6.431576440704874e-04 - -6.431576440704874e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - -3.917288458485472e-03 - -4.249087156691532e-03 - 1.965589776154951e-03 - 6.431576440704874e-04 - 6.431576440704874e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - 8.211620892205066e-04 - 1.328253161877541e-03 - 6.956130602741171e-04 - 4.738080118537335e-02 - -6.710483145472822e-02 - 4.738080118537335e-02 - -6.956130602741171e-04 - 4.527173625443191e-04 - 6.956130602741171e-04 - -5.051727787479494e-04 - -2.069111499179754e-04 - 4.736201513467746e-04 - 5.051727787479494e-04 - -2.069111499179754e-04 - 4.736201513467746e-04 - 6.956130602741171e-04 - 4.527173625443191e-04 - 6.956130602741171e-04 - -4.738080118537335e-02 - -6.710483145472822e-02 - 4.738080118537335e-02 - -8.211620892205066e-04 - 1.328253161877541e-03 - 6.956130602741171e-04 - 2.761745250568871e-01 - -3.124834629835425e-04 - -3.124834629835425e-04 - -1.965589776154951e-03 - -3.917288458485472e-03 - -4.249087156691532e-03 - -1.965589776154951e-03 - 3.917288458485472e-03 - -4.249087156691532e-03 - -6.097528708260577e-04 - -6.097528708260577e-04 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - 1.965589776154951e-03 - 3.917288458485472e-03 - -4.249087156691532e-03 - 1.965589776154951e-03 - -3.917288458485472e-03 - -4.249087156691532e-03 - -4.738080118537335e-02 - -4.738080118537335e-02 - -6.710483145472822e-02 - -6.956130602741171e-04 - -6.956130602741171e-04 - 4.527173625443191e-04 - 5.051727787479494e-04 - -4.736201513467746e-04 - -2.069111499179754e-04 - 8.211620892205066e-04 - -6.956130602741171e-04 - 1.328253161877541e-03 - -8.211620892205066e-04 - -6.956130602741171e-04 - 1.328253161877541e-03 - -5.051727787479494e-04 - -4.736201513467746e-04 - -2.069111499179754e-04 - 6.956130602741171e-04 - -6.956130602741171e-04 - 4.527173625443191e-04 - 4.738080118537335e-02 - -4.738080118537335e-02 - -6.710483145472822e-02 - -3.917288458485472e-03 - -1.965589776154951e-03 - -4.249087156691532e-03 - 3.917288458485472e-03 - -1.965589776154951e-03 - -4.249087156691532e-03 - 1.965589776154951e-03 - 1.965589776154951e-03 - 8.593559824310730e-03 - 8.437185796687304e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - 6.431576440704874e-04 - 6.431576440704874e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - -6.431576440704874e-04 - -6.431576440704874e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - -1.965589776154951e-03 - 1.965589776154951e-03 - 8.593559824310730e-03 - -8.437185796687304e-05 - -8.437185796687304e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - -4.736201513467746e-04 - 5.051727787479494e-04 - -2.069111499179754e-04 - -6.956130602741171e-04 - 8.211620892205066e-04 - 1.328253161877541e-03 - 5.051727787479494e-04 - 5.051727787479494e-04 - -4.057125469651267e-03 - 5.171455786632797e-04 - 5.171455786632797e-04 - 6.032703603746623e-04 - -5.171455786632797e-04 - 5.171455786632797e-04 - 6.032703603746623e-04 - -5.051727787479494e-04 - 5.051727787479494e-04 - -4.057125469651267e-03 - 6.956130602741171e-04 - 8.211620892205066e-04 - 1.328253161877541e-03 - 4.736201513467746e-04 - 5.051727787479494e-04 - -2.069111499179754e-04 - -6.097528708260577e-04 - -6.097528708260577e-04 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - 6.431576440704874e-04 - 6.431576440704874e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - -6.431576440704874e-04 - -6.431576440704874e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - 1.991784410223845e-03 - 1.991784410223845e-03 - 1.991784410223845e-03 - 1.991784410223845e-03 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - -6.431576440704874e-04 - -6.431576440704874e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - 6.431576440704874e-04 - 6.431576440704874e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - -6.956130602741171e-04 - -8.211620892205066e-04 - 1.328253161877541e-03 - -4.736201513467746e-04 - -5.051727787479494e-04 - -2.069111499179754e-04 - 5.171455786632797e-04 - -5.171455786632797e-04 - 6.032703603746623e-04 - 5.051727787479494e-04 - -5.051727787479494e-04 - -4.057125469651267e-03 - -5.051727787479494e-04 - -5.051727787479494e-04 - -4.057125469651267e-03 - -5.171455786632797e-04 - -5.171455786632797e-04 - 6.032703603746623e-04 - 4.736201513467746e-04 - -5.051727787479494e-04 - -2.069111499179754e-04 - 6.956130602741171e-04 - -8.211620892205066e-04 - 1.328253161877541e-03 - 3.917288458485472e-03 - 1.965589776154951e-03 - -4.249087156691532e-03 - -3.917288458485472e-03 - 1.965589776154951e-03 - -4.249087156691532e-03 - 1.965589776154951e-03 - -1.965589776154951e-03 - 8.593559824310730e-03 - 8.437185796687304e-05 - 8.437185796687304e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - -6.431576440704874e-04 - -6.431576440704874e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - 6.431576440704874e-04 - 6.431576440704874e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - -1.965589776154951e-03 - -1.965589776154951e-03 - 8.593559824310730e-03 - -8.437185796687304e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - -6.956130602741171e-04 - 6.956130602741171e-04 - 4.527173625443191e-04 - -4.738080118537335e-02 - 4.738080118537335e-02 - -6.710483145472822e-02 - 8.211620892205066e-04 - 6.956130602741171e-04 - 1.328253161877541e-03 - 5.051727787479494e-04 - 4.736201513467746e-04 - -2.069111499179754e-04 - -5.051727787479494e-04 - 4.736201513467746e-04 - -2.069111499179754e-04 - -8.211620892205066e-04 - 6.956130602741171e-04 - 1.328253161877541e-03 - 4.738080118537335e-02 - 4.738080118537335e-02 - -6.710483145472822e-02 - 6.956130602741171e-04 - 6.956130602741171e-04 - 4.527173625443191e-04 - -6.710483145472822e-02 - -4.738080118537335e-02 - -4.738080118537335e-02 - 1.328253161877541e-03 - -8.211620892205066e-04 - -6.956130602741171e-04 - -6.710483145472822e-02 - 4.738080118537335e-02 - 4.738080118537335e-02 - 1.328253161877541e-03 - 8.211620892205066e-04 - 6.956130602741171e-04 - 1.328253161877541e-03 - -6.956130602741171e-04 - -8.211620892205066e-04 - -4.057125469651267e-03 - -5.051727787479494e-04 - -5.051727787479494e-04 - 1.328253161877541e-03 - 6.956130602741171e-04 - 8.211620892205066e-04 - -4.057125469651267e-03 - 5.051727787479494e-04 - 5.051727787479494e-04 - 2.761745250568871e-01 - -6.097528708260577e-04 - -6.097528708260577e-04 - 8.593559824310730e-03 - -1.965589776154951e-03 - -1.965589776154951e-03 - 8.593559824310730e-03 - 1.965589776154951e-03 - -1.965589776154951e-03 - -6.097528708260577e-04 - -6.097528708260577e-04 - 1.991784410223845e-03 - 1.991784410223845e-03 - 1.991784410223845e-03 - 1.991784410223845e-03 - 8.593559824310730e-03 - -1.965589776154951e-03 - 1.965589776154951e-03 - 8.593559824310730e-03 - 1.965589776154951e-03 - 1.965589776154951e-03 - -6.710483145472822e-02 - 4.738080118537335e-02 - -4.738080118537335e-02 - 1.328253161877541e-03 - 8.211620892205066e-04 - -6.956130602741171e-04 - -6.710483145472822e-02 - -4.738080118537335e-02 - 4.738080118537335e-02 - 1.328253161877541e-03 - -8.211620892205066e-04 - 6.956130602741171e-04 - 1.328253161877541e-03 - 6.956130602741171e-04 - -8.211620892205066e-04 - -4.057125469651267e-03 - 5.051727787479494e-04 - -5.051727787479494e-04 - 1.328253161877541e-03 - -6.956130602741171e-04 - 8.211620892205066e-04 - -4.057125469651267e-03 - -5.051727787479494e-04 - 5.051727787479494e-04 - -4.249087156691532e-03 - 1.965589776154951e-03 - -3.917288458485472e-03 - -4.249087156691532e-03 - -1.965589776154951e-03 - 3.917288458485472e-03 - -4.249087156691532e-03 - -3.917288458485472e-03 - 1.965589776154951e-03 - -5.021299677197431e-04 - -5.021299677197431e-04 - 6.431576440704874e-04 - 6.431576440704874e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - 6.431576440704874e-04 - 6.431576440704874e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - -6.431576440704874e-04 - -6.431576440704874e-04 - -4.249087156691532e-03 - 3.917288458485472e-03 - -1.965589776154951e-03 - -5.021299677197431e-04 - -5.021299677197431e-04 - -6.431576440704874e-04 - -6.431576440704874e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - 4.527173625443191e-04 - -6.956130602741171e-04 - -6.956130602741171e-04 - -2.069111499179754e-04 - -5.051727787479494e-04 - -4.736201513467746e-04 - 4.527173625443191e-04 - 6.956130602741171e-04 - 6.956130602741171e-04 - -2.069111499179754e-04 - 5.051727787479494e-04 - 4.736201513467746e-04 - -2.069111499179754e-04 - -4.736201513467746e-04 - -5.051727787479494e-04 - 6.032703603746623e-04 - -5.171455786632797e-04 - -5.171455786632797e-04 - -2.069111499179754e-04 - 4.736201513467746e-04 - 5.051727787479494e-04 - 6.032703603746623e-04 - 5.171455786632797e-04 - 5.171455786632797e-04 - -3.124834629835425e-04 - -3.124834629835425e-04 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - 4.527173625443191e-04 - 6.956130602741171e-04 - -6.956130602741171e-04 - -2.069111499179754e-04 - 5.051727787479494e-04 - -4.736201513467746e-04 - 4.527173625443191e-04 - -6.956130602741171e-04 - 6.956130602741171e-04 - -2.069111499179754e-04 - -5.051727787479494e-04 - 4.736201513467746e-04 - -2.069111499179754e-04 - 4.736201513467746e-04 - -5.051727787479494e-04 - 6.032703603746623e-04 - 5.171455786632797e-04 - -5.171455786632797e-04 - -2.069111499179754e-04 - -4.736201513467746e-04 - 5.051727787479494e-04 - 6.032703603746623e-04 - -5.171455786632797e-04 - 5.171455786632797e-04 - -4.249087156691532e-03 - 1.965589776154951e-03 - 3.917288458485472e-03 - -4.249087156691532e-03 - -1.965589776154951e-03 - -3.917288458485472e-03 - -4.249087156691532e-03 - 3.917288458485472e-03 - 1.965589776154951e-03 - -5.021299677197431e-04 - -5.021299677197431e-04 - -6.431576440704874e-04 - -6.431576440704874e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - -6.431576440704874e-04 - -6.431576440704874e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - 6.431576440704874e-04 - 6.431576440704874e-04 - -4.249087156691532e-03 - -3.917288458485472e-03 - -1.965589776154951e-03 - -5.021299677197431e-04 - -5.021299677197431e-04 - 6.431576440704874e-04 - 6.431576440704874e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - -4.738080118537335e-02 - -6.710483145472822e-02 - -4.738080118537335e-02 - -8.211620892205066e-04 - 1.328253161877541e-03 - -6.956130602741171e-04 - 4.738080118537335e-02 - -6.710483145472822e-02 - -4.738080118537335e-02 - 8.211620892205066e-04 - 1.328253161877541e-03 - -6.956130602741171e-04 - -6.956130602741171e-04 - 4.527173625443191e-04 - -6.956130602741171e-04 - -5.051727787479494e-04 - -2.069111499179754e-04 - -4.736201513467746e-04 - 6.956130602741171e-04 - 4.527173625443191e-04 - -6.956130602741171e-04 - 5.051727787479494e-04 - -2.069111499179754e-04 - -4.736201513467746e-04 - 2.761745250568871e-01 - -6.097528708260577e-04 - -6.097528708260577e-04 - 1.965589776154951e-03 - -4.249087156691532e-03 - -3.917288458485472e-03 - -1.965589776154951e-03 - -4.249087156691532e-03 - 3.917288458485472e-03 - -3.124834629835425e-04 - -3.124834629835425e-04 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - 1.965589776154951e-03 - -4.249087156691532e-03 - 3.917288458485472e-03 - -1.965589776154951e-03 - -4.249087156691532e-03 - -3.917288458485472e-03 - 4.738080118537335e-02 - -6.710483145472822e-02 - 4.738080118537335e-02 - 8.211620892205066e-04 - 1.328253161877541e-03 - 6.956130602741171e-04 - -4.738080118537335e-02 - -6.710483145472822e-02 - 4.738080118537335e-02 - -8.211620892205066e-04 - 1.328253161877541e-03 - 6.956130602741171e-04 - 6.956130602741171e-04 - 4.527173625443191e-04 - 6.956130602741171e-04 - 5.051727787479494e-04 - -2.069111499179754e-04 - 4.736201513467746e-04 - -6.956130602741171e-04 - 4.527173625443191e-04 - 6.956130602741171e-04 - -5.051727787479494e-04 - -2.069111499179754e-04 - 4.736201513467746e-04 - -1.965589776154951e-03 - 8.593559824310730e-03 - -1.965589776154951e-03 - 1.965589776154951e-03 - 8.593559824310730e-03 - -1.965589776154951e-03 - -3.917288458485472e-03 - -4.249087156691532e-03 - 1.965589776154951e-03 - 6.431576440704874e-04 - 6.431576440704874e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - 3.917288458485472e-03 - -4.249087156691532e-03 - 1.965589776154951e-03 - -6.431576440704874e-04 - -6.431576440704874e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - -6.956130602741171e-04 - 1.328253161877541e-03 - -8.211620892205066e-04 - -5.051727787479494e-04 - -4.057125469651267e-03 - -5.051727787479494e-04 - 6.956130602741171e-04 - 1.328253161877541e-03 - -8.211620892205066e-04 - 5.051727787479494e-04 - -4.057125469651267e-03 - -5.051727787479494e-04 - -4.736201513467746e-04 - -2.069111499179754e-04 - -5.051727787479494e-04 - -5.171455786632797e-04 - 6.032703603746623e-04 - -5.171455786632797e-04 - 4.736201513467746e-04 - -2.069111499179754e-04 - -5.051727787479494e-04 - 5.171455786632797e-04 - 6.032703603746623e-04 - -5.171455786632797e-04 - -6.097528708260577e-04 - -6.097528708260577e-04 - 1.991784410223845e-03 - 1.991784410223845e-03 - 1.991784410223845e-03 - 1.991784410223845e-03 - 8.437185796687304e-05 - 8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - 6.431576440704874e-04 - 6.431576440704874e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - -6.431576440704874e-04 - -6.431576440704874e-04 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - -6.431576440704874e-04 - -6.431576440704874e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - 6.431576440704874e-04 - 6.431576440704874e-04 - 6.956130602741171e-04 - 1.328253161877541e-03 - 8.211620892205066e-04 - 5.051727787479494e-04 - -4.057125469651267e-03 - 5.051727787479494e-04 - -6.956130602741171e-04 - 1.328253161877541e-03 - 8.211620892205066e-04 - -5.051727787479494e-04 - -4.057125469651267e-03 - 5.051727787479494e-04 - 4.736201513467746e-04 - -2.069111499179754e-04 - 5.051727787479494e-04 - 5.171455786632797e-04 - 6.032703603746623e-04 - 5.171455786632797e-04 - -4.736201513467746e-04 - -2.069111499179754e-04 - 5.051727787479494e-04 - -5.171455786632797e-04 - 6.032703603746623e-04 - 5.171455786632797e-04 - -1.965589776154951e-03 - 8.593559824310730e-03 - 1.965589776154951e-03 - 1.965589776154951e-03 - 8.593559824310730e-03 - 1.965589776154951e-03 - 3.917288458485472e-03 - -4.249087156691532e-03 - -1.965589776154951e-03 - -6.431576440704874e-04 - -6.431576440704874e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - -3.917288458485472e-03 - -4.249087156691532e-03 - -1.965589776154951e-03 - 6.431576440704874e-04 - 6.431576440704874e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - -4.738080118537335e-02 - -4.738080118537335e-02 - -6.710483145472822e-02 - -6.956130602741171e-04 - -6.956130602741171e-04 - 4.527173625443191e-04 - 4.738080118537335e-02 - -4.738080118537335e-02 - -6.710483145472822e-02 - 6.956130602741171e-04 - -6.956130602741171e-04 - 4.527173625443191e-04 - -8.211620892205066e-04 - -6.956130602741171e-04 - 1.328253161877541e-03 - -5.051727787479494e-04 - -4.736201513467746e-04 - -2.069111499179754e-04 - 8.211620892205066e-04 - -6.956130602741171e-04 - 1.328253161877541e-03 - 5.051727787479494e-04 - -4.736201513467746e-04 - -2.069111499179754e-04 - 2.761745250568871e-01 - -3.124834629835425e-04 - -3.124834629835425e-04 - 1.965589776154951e-03 - -3.917288458485472e-03 - -4.249087156691532e-03 - 1.965589776154951e-03 - 3.917288458485472e-03 - -4.249087156691532e-03 - -6.097528708260577e-04 - -6.097528708260577e-04 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -1.965589776154951e-03 - 3.917288458485472e-03 - -4.249087156691532e-03 - -1.965589776154951e-03 - -3.917288458485472e-03 - -4.249087156691532e-03 - -4.738080118537335e-02 - 4.738080118537335e-02 - -6.710483145472822e-02 - -6.956130602741171e-04 - 6.956130602741171e-04 - 4.527173625443191e-04 - 4.738080118537335e-02 - 4.738080118537335e-02 - -6.710483145472822e-02 - 6.956130602741171e-04 - 6.956130602741171e-04 - 4.527173625443191e-04 - -8.211620892205066e-04 - 6.956130602741171e-04 - 1.328253161877541e-03 - -5.051727787479494e-04 - 4.736201513467746e-04 - -2.069111499179754e-04 - 8.211620892205066e-04 - 6.956130602741171e-04 - 1.328253161877541e-03 - 5.051727787479494e-04 - 4.736201513467746e-04 - -2.069111499179754e-04 - -3.917288458485472e-03 - 1.965589776154951e-03 - -4.249087156691532e-03 - 3.917288458485472e-03 - 1.965589776154951e-03 - -4.249087156691532e-03 - -1.965589776154951e-03 - -1.965589776154951e-03 - 8.593559824310730e-03 - -8.437185796687304e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - 6.431576440704874e-04 - 6.431576440704874e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - -6.431576440704874e-04 - -6.431576440704874e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - 1.965589776154951e-03 - -1.965589776154951e-03 - 8.593559824310730e-03 - 8.437185796687304e-05 - 8.437185796687304e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - -6.956130602741171e-04 - -8.211620892205066e-04 - 1.328253161877541e-03 - -4.736201513467746e-04 - -5.051727787479494e-04 - -2.069111499179754e-04 - 6.956130602741171e-04 - -8.211620892205066e-04 - 1.328253161877541e-03 - 4.736201513467746e-04 - -5.051727787479494e-04 - -2.069111499179754e-04 - -5.051727787479494e-04 - -5.051727787479494e-04 - -4.057125469651267e-03 - -5.171455786632797e-04 - -5.171455786632797e-04 - 6.032703603746623e-04 - 5.051727787479494e-04 - -5.051727787479494e-04 - -4.057125469651267e-03 - 5.171455786632797e-04 - -5.171455786632797e-04 - 6.032703603746623e-04 - -6.097528708260577e-04 - -6.097528708260577e-04 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - -5.900407472085463e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - 6.431576440704874e-04 - 6.431576440704874e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - 8.437185796687304e-05 - 8.437185796687304e-05 - -6.431576440704874e-04 - -6.431576440704874e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - 1.991784410223845e-03 - 1.991784410223845e-03 - 1.991784410223845e-03 - 1.991784410223845e-03 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.688548446843319e-05 - -8.437185796687304e-05 - -8.437185796687304e-05 - -6.431576440704874e-04 - -6.431576440704874e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - 6.431576440704874e-04 - 6.431576440704874e-04 - -5.021299677197431e-04 - -5.021299677197431e-04 - -6.956130602741171e-04 - 8.211620892205066e-04 - 1.328253161877541e-03 - -4.736201513467746e-04 - 5.051727787479494e-04 - -2.069111499179754e-04 - 6.956130602741171e-04 - 8.211620892205066e-04 - 1.328253161877541e-03 - 4.736201513467746e-04 - 5.051727787479494e-04 - -2.069111499179754e-04 - -5.051727787479494e-04 - 5.051727787479494e-04 - -4.057125469651267e-03 - -5.171455786632797e-04 - 5.171455786632797e-04 - 6.032703603746623e-04 - 5.051727787479494e-04 - 5.051727787479494e-04 - -4.057125469651267e-03 - 5.171455786632797e-04 - 5.171455786632797e-04 - 6.032703603746623e-04 - 3.917288458485472e-03 - -1.965589776154951e-03 - -4.249087156691532e-03 - -3.917288458485472e-03 - -1.965589776154951e-03 - -4.249087156691532e-03 - -1.965589776154951e-03 - 1.965589776154951e-03 - 8.593559824310730e-03 - -8.437185796687304e-05 - -8.437185796687304e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - -6.431576440704874e-04 - -6.431576440704874e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - 6.431576440704874e-04 - 6.431576440704874e-04 - -8.437185796687304e-05 - -8.437185796687304e-05 - -5.021299677197431e-04 - -5.021299677197431e-04 - 1.965589776154951e-03 - 1.965589776154951e-03 - 8.593559824310730e-03 - 8.437185796687304e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - 8.437185796687304e-05 - -1.006112081282740e-04 - -1.006112081282740e-04 - - - 1.329516780045767e-03 - 1.137512366579104e-03 - 1.137512366579104e-03 - -1.329516780045767e-03 - 1.137512366579104e-03 - -1.137512366579104e-03 - -1.329516780045767e-03 - -1.137512366579104e-03 - 1.137512366579104e-03 - 1.329516780045767e-03 - -1.137512366579104e-03 - -1.137512366579104e-03 - -3.531895380512890e-02 - -6.843115219609125e-02 - -6.843115219609125e-02 - -3.531895380512890e-02 - 6.843115219609125e-02 - 6.843115219609125e-02 - -2.142887467535423e-03 - -1.140436299842416e-03 - -1.673031588847898e-03 - -2.142887467535423e-03 - 1.140436299842416e-03 - 1.673031588847898e-03 - -2.142887467535423e-03 - -1.673031588847898e-03 - -1.140436299842416e-03 - -2.142887467535423e-03 - 1.673031588847898e-03 - 1.140436299842416e-03 - 2.142887467535423e-03 - 1.140436299842416e-03 - -1.673031588847898e-03 - 2.142887467535423e-03 - -1.140436299842416e-03 - 1.673031588847898e-03 - 2.142887467535423e-03 - -1.673031588847898e-03 - 1.140436299842416e-03 - 2.142887467535423e-03 - 1.673031588847898e-03 - -1.140436299842416e-03 - 3.531895380512890e-02 - -6.843115219609125e-02 - 6.843115219609125e-02 - 3.531895380512890e-02 - 6.843115219609125e-02 - -6.843115219609125e-02 - 3.682318452992087e-01 - -4.604105549283176e-05 - -9.024137829434160e-04 - 9.845793442069338e-04 - -4.604105549283176e-05 - 9.024137829434160e-04 - 9.845793442069338e-04 - 4.604105549283176e-05 - 9.024137829434160e-04 - 9.845793442069338e-04 - 4.604105549283176e-05 - -9.024137829434160e-04 - 9.845793442069338e-04 - -6.848253533455045e-02 - -6.848253533455045e-02 - -9.450032592850598e-02 - 6.848253533455045e-02 - -6.848253533455045e-02 - -9.450032592850598e-02 - -9.024137829434160e-04 - -4.604105549283176e-05 - 9.845793442069338e-04 - 9.024137829434160e-04 - -4.604105549283176e-05 - 9.845793442069338e-04 - -2.067732421909400e-03 - -2.067732421909400e-03 - 4.732059152899317e-04 - 2.067732421909400e-03 - -2.067732421909400e-03 - 4.732059152899317e-04 - 9.024137829434160e-04 - 4.604105549283176e-05 - 9.845793442069338e-04 - -9.024137829434160e-04 - 4.604105549283176e-05 - 9.845793442069338e-04 - -2.067732421909400e-03 - 2.067732421909400e-03 - 4.732059152899317e-04 - 2.067732421909400e-03 - 2.067732421909400e-03 - 4.732059152899317e-04 - -6.848253533455045e-02 - 6.848253533455045e-02 - -9.450032592850598e-02 - 6.848253533455045e-02 - 6.848253533455045e-02 - -9.450032592850598e-02 - -4.604105549283176e-05 - 9.845793442069338e-04 - -9.024137829434160e-04 - 4.604105549283176e-05 - 9.845793442069338e-04 - 9.024137829434160e-04 - -4.604105549283176e-05 - 9.845793442069338e-04 - 9.024137829434160e-04 - 4.604105549283176e-05 - 9.845793442069338e-04 - -9.024137829434160e-04 - -6.848253533455045e-02 - -9.450032592850598e-02 - -6.848253533455045e-02 - 6.848253533455045e-02 - -9.450032592850598e-02 - -6.848253533455045e-02 - -2.067732421909400e-03 - 4.732059152899317e-04 - -2.067732421909400e-03 - 2.067732421909400e-03 - 4.732059152899317e-04 - -2.067732421909400e-03 - -9.024137829434160e-04 - 9.845793442069338e-04 - -4.604105549283176e-05 - 9.024137829434160e-04 - 9.845793442069338e-04 - -4.604105549283176e-05 - -2.067732421909400e-03 - 4.732059152899317e-04 - 2.067732421909400e-03 - 2.067732421909400e-03 - 4.732059152899317e-04 - 2.067732421909400e-03 - 9.024137829434160e-04 - 9.845793442069338e-04 - 4.604105549283176e-05 - -9.024137829434160e-04 - 9.845793442069338e-04 - 4.604105549283176e-05 - 6.848253533455045e-02 - -9.450032592850598e-02 - 6.848253533455045e-02 - -6.848253533455045e-02 - -9.450032592850598e-02 - 6.848253533455045e-02 - 1.329516780045767e-03 - 4.604105549283176e-05 - 4.604105549283176e-05 - -1.667031524313929e-03 - -3.921476992823876e-04 - 4.634339865815935e-04 - -4.634339865815935e-04 - -3.921476992823876e-04 - -4.634339865815935e-04 - 4.634339865815935e-04 - -1.038533186064150e-04 - -8.830182089464902e-05 - 8.830182089464902e-05 - -1.038533186064150e-04 - 8.830182089464902e-05 - -8.830182089464902e-05 - -1.140436299842416e-03 - 4.732059152899317e-04 - -5.809770596261962e-04 - 8.561294058172238e-04 - -1.771057142348803e-03 - 9.917403921744496e-05 - 6.173609086399110e-04 - 7.188896116000135e-04 - -6.173609086399110e-04 - 4.634339865815935e-04 - -4.465016140720080e-05 - -1.020134538757355e-04 - 1.762396085246188e-05 - -1.430536785708917e-04 - 1.762396085246188e-05 - 8.830182089464902e-05 - -2.179138887699985e-04 - -1.140436299842416e-03 - -5.809770596261962e-04 - -1.771057142348803e-03 - 8.561294058172238e-04 - -6.173609086399110e-04 - -4.465016140720080e-05 - 4.634339865815935e-04 - 9.917403921744496e-05 - 7.188896116000135e-04 - 6.173609086399110e-04 - 1.762396085246188e-05 - -2.179138887699985e-04 - 8.830182089464902e-05 - -1.020134538757355e-04 - -1.430536785708917e-04 - 1.762396085246188e-05 - -1.329516780045767e-03 - 4.604105549283176e-05 - -4.604105549283176e-05 - 1.038533186064150e-04 - -8.830182089464902e-05 - -8.830182089464902e-05 - 1.038533186064150e-04 - 8.830182089464902e-05 - 8.830182089464902e-05 - 3.921476992823876e-04 - 4.634339865815935e-04 - 4.634339865815935e-04 - 3.921476992823876e-04 - -4.634339865815935e-04 - -4.634339865815935e-04 - 1.667031524313929e-03 - 1.140436299842416e-03 - 4.732059152899317e-04 - -1.020134538757355e-04 - -1.762396085246188e-05 - -1.430536785708917e-04 - 1.762396085246188e-05 - -8.830182089464902e-05 - -2.179138887699985e-04 - 9.917403921744496e-05 - -6.173609086399110e-04 - 7.188896116000135e-04 - -6.173609086399110e-04 - -4.634339865815935e-04 - -4.465016140720080e-05 - -5.809770596261962e-04 - -8.561294058172238e-04 - -1.771057142348803e-03 - 1.140436299842416e-03 - -1.762396085246188e-05 - -2.179138887699985e-04 - -8.830182089464902e-05 - 1.020134538757355e-04 - -1.430536785708917e-04 - -1.762396085246188e-05 - 6.173609086399110e-04 - -4.465016140720080e-05 - -4.634339865815935e-04 - -9.917403921744496e-05 - 7.188896116000135e-04 - -6.173609086399110e-04 - 5.809770596261962e-04 - -1.771057142348803e-03 - -8.561294058172238e-04 - -1.329516780045767e-03 - -4.604105549283176e-05 - 4.604105549283176e-05 - 1.038533186064150e-04 - 8.830182089464902e-05 - 8.830182089464902e-05 - 1.038533186064150e-04 - -8.830182089464902e-05 - -8.830182089464902e-05 - 3.921476992823876e-04 - -4.634339865815935e-04 - -4.634339865815935e-04 - 3.921476992823876e-04 - 4.634339865815935e-04 - 4.634339865815935e-04 - 1.667031524313929e-03 - 1.140436299842416e-03 - 4.732059152899317e-04 - 1.020134538757355e-04 - -1.762396085246188e-05 - -1.430536785708917e-04 - -1.762396085246188e-05 - -8.830182089464902e-05 - -2.179138887699985e-04 - -9.917403921744496e-05 - -6.173609086399110e-04 - 7.188896116000135e-04 - 6.173609086399110e-04 - -4.634339865815935e-04 - -4.465016140720080e-05 - 5.809770596261962e-04 - -8.561294058172238e-04 - -1.771057142348803e-03 - 1.140436299842416e-03 - 1.762396085246188e-05 - -2.179138887699985e-04 - -8.830182089464902e-05 - -1.020134538757355e-04 - -1.430536785708917e-04 - -1.762396085246188e-05 - -6.173609086399110e-04 - -4.465016140720080e-05 - -4.634339865815935e-04 - 9.917403921744496e-05 - 7.188896116000135e-04 - -6.173609086399110e-04 - -5.809770596261962e-04 - -1.771057142348803e-03 - -8.561294058172238e-04 - 1.329516780045767e-03 - -4.604105549283176e-05 - -4.604105549283176e-05 - -1.667031524313929e-03 - -3.921476992823876e-04 - -4.634339865815935e-04 - 4.634339865815935e-04 - -3.921476992823876e-04 - 4.634339865815935e-04 - -4.634339865815935e-04 - -1.038533186064150e-04 - 8.830182089464902e-05 - -8.830182089464902e-05 - -1.038533186064150e-04 - -8.830182089464902e-05 - 8.830182089464902e-05 - -1.140436299842416e-03 - 4.732059152899317e-04 - 5.809770596261962e-04 - 8.561294058172238e-04 - -1.771057142348803e-03 - -9.917403921744496e-05 - 6.173609086399110e-04 - 7.188896116000135e-04 - 6.173609086399110e-04 - 4.634339865815935e-04 - -4.465016140720080e-05 - 1.020134538757355e-04 - 1.762396085246188e-05 - -1.430536785708917e-04 - -1.762396085246188e-05 - 8.830182089464902e-05 - -2.179138887699985e-04 - -1.140436299842416e-03 - 5.809770596261962e-04 - -1.771057142348803e-03 - 8.561294058172238e-04 - 6.173609086399110e-04 - -4.465016140720080e-05 - 4.634339865815935e-04 - -9.917403921744496e-05 - 7.188896116000135e-04 - 6.173609086399110e-04 - -1.762396085246188e-05 - -2.179138887699985e-04 - 8.830182089464902e-05 - 1.020134538757355e-04 - -1.430536785708917e-04 - 1.762396085246188e-05 - 3.531895380512890e-02 - 6.848253533455045e-02 - 6.848253533455045e-02 - 1.667031524313929e-03 - 5.809770596261962e-04 - 5.809770596261962e-04 - 8.561294058172238e-04 - -1.672925271626789e-05 - -1.672925271626789e-05 - 8.561294058172238e-04 - -8.561294058172238e-04 - 1.672925271626789e-05 - 1.672925271626789e-05 - -8.561294058172238e-04 - 6.843115219609125e-02 - 9.450032592850598e-02 - -5.809770596261962e-04 - -1.402452579700487e-03 - 2.171463896239443e-03 - 1.402452579700487e-03 - 5.809770596261962e-04 - -2.171463896239443e-03 - 1.672925271626789e-05 - -1.771057142348803e-03 - -8.561294058172238e-04 - 1.771057142348803e-03 - -1.672925271626789e-05 - 1.771057142348803e-03 - 6.843115219609125e-02 - -5.809770596261962e-04 - 2.171463896239443e-03 - -1.402452579700487e-03 - -1.771057142348803e-03 - 1.672925271626789e-05 - 1.402452579700487e-03 - -2.171463896239443e-03 - 5.809770596261962e-04 - -1.672925271626789e-05 - 1.771057142348803e-03 - -8.561294058172238e-04 - 1.771057142348803e-03 - 3.531895380512890e-02 - -6.848253533455045e-02 - -6.848253533455045e-02 - -8.561294058172238e-04 - 1.672925271626789e-05 - 1.672925271626789e-05 - -8.561294058172238e-04 - -1.672925271626789e-05 - 8.561294058172238e-04 - 8.561294058172238e-04 - -1.672925271626789e-05 - 6.843115219609125e-02 - 9.450032592850598e-02 - -1.402452579700487e-03 - 5.809770596261962e-04 - -2.171463896239443e-03 - 1.672925271626789e-05 - -1.771057142348803e-03 - 1.672925271626789e-05 - 1.771057142348803e-03 - 8.561294058172238e-04 - 1.771057142348803e-03 - 6.843115219609125e-02 - -1.771057142348803e-03 - 1.672925271626789e-05 - -1.402452579700487e-03 - -2.171463896239443e-03 - 5.809770596261962e-04 - 8.561294058172238e-04 - 1.771057142348803e-03 - 1.672925271626789e-05 - 1.771057142348803e-03 - 2.142887467535423e-03 - -9.024137829434160e-04 - 2.067732421909400e-03 - 3.921476992823876e-04 - 9.917403921744496e-05 - 6.173609086399110e-04 - -1.038533186064150e-04 - 1.020134538757355e-04 - -1.762396085246188e-05 - -1.137512366579104e-03 - 9.845793442069338e-04 - 6.173609086399110e-04 - -9.917403921744496e-05 - 7.188896116000135e-04 - 1.762396085246188e-05 - 1.020134538757355e-04 - -1.430536785708917e-04 - 1.673031588847898e-03 - 9.917403921744496e-05 - -2.239558091312982e-04 - -9.917403921744496e-05 - -1.020134538757355e-04 - -1.495749160722173e-04 - 1.020134538757355e-04 - 2.142887467535423e-03 - 9.024137829434160e-04 - -2.067732421909400e-03 - -1.038533186064150e-04 - -1.020134538757355e-04 - 1.762396085246188e-05 - 3.921476992823876e-04 - -9.917403921744496e-05 - -6.173609086399110e-04 - -1.137512366579104e-03 - 9.845793442069338e-04 - -1.762396085246188e-05 - 1.020134538757355e-04 - -1.430536785708917e-04 - -6.173609086399110e-04 - -9.917403921744496e-05 - 7.188896116000135e-04 - 1.673031588847898e-03 - 1.020134538757355e-04 - -1.495749160722173e-04 - 1.020134538757355e-04 - -9.917403921744496e-05 - -2.239558091312982e-04 - -9.917403921744496e-05 - 2.142887467535423e-03 - 2.067732421909400e-03 - -9.024137829434160e-04 - 1.673031588847898e-03 - 9.845793442069338e-04 - -1.137512366579104e-03 - 2.142887467535423e-03 - -2.067732421909400e-03 - 9.024137829434160e-04 - 1.673031588847898e-03 - 9.845793442069338e-04 - -1.137512366579104e-03 - -2.142887467535423e-03 - 9.024137829434160e-04 - 2.067732421909400e-03 - 1.038533186064150e-04 - -1.020134538757355e-04 - -1.762396085246188e-05 - -3.921476992823876e-04 - -9.917403921744496e-05 - 6.173609086399110e-04 - -1.402452579700487e-03 - 1.137512366579104e-03 - 9.845793442069338e-04 - -1.762396085246188e-05 - -1.020134538757355e-04 - -1.430536785708917e-04 - -6.173609086399110e-04 - 9.917403921744496e-05 - 7.188896116000135e-04 - -8.561294058172238e-04 - -5.809770596261962e-04 - -1.771057142348803e-03 - -1.673031588847898e-03 - -1.020134538757355e-04 - -1.495749160722173e-04 - -1.020134538757355e-04 - 9.917403921744496e-05 - -2.239558091312982e-04 - 9.917403921744496e-05 - -1.672925271626789e-05 - -2.171463896239443e-03 - -1.672925271626789e-05 - -2.142887467535423e-03 - -9.024137829434160e-04 - -2.067732421909400e-03 - -3.921476992823876e-04 - 9.917403921744496e-05 - -6.173609086399110e-04 - 1.038533186064150e-04 - 1.020134538757355e-04 - 1.762396085246188e-05 - 1.402452579700487e-03 - 1.137512366579104e-03 - 9.845793442069338e-04 - 6.173609086399110e-04 - 9.917403921744496e-05 - 7.188896116000135e-04 - 1.762396085246188e-05 - -1.020134538757355e-04 - -1.430536785708917e-04 - 8.561294058172238e-04 - -5.809770596261962e-04 - -1.771057142348803e-03 - -1.673031588847898e-03 - -9.917403921744496e-05 - -2.239558091312982e-04 - 9.917403921744496e-05 - 1.020134538757355e-04 - -1.495749160722173e-04 - -1.020134538757355e-04 - 1.672925271626789e-05 - -2.171463896239443e-03 - -1.672925271626789e-05 - -2.142887467535423e-03 - 2.067732421909400e-03 - 9.024137829434160e-04 - -1.402452579700487e-03 - -1.673031588847898e-03 - 9.845793442069338e-04 - -1.672925271626789e-05 - -1.672925271626789e-05 - -2.171463896239443e-03 - 1.137512366579104e-03 - -8.561294058172238e-04 - -1.771057142348803e-03 - -5.809770596261962e-04 - -2.142887467535423e-03 - -2.067732421909400e-03 - -9.024137829434160e-04 - 1.402452579700487e-03 - -1.673031588847898e-03 - 9.845793442069338e-04 - 1.672925271626789e-05 - -1.672925271626789e-05 - -2.171463896239443e-03 - 1.137512366579104e-03 - 8.561294058172238e-04 - -1.771057142348803e-03 - -5.809770596261962e-04 - -3.531895380512890e-02 - 6.848253533455045e-02 - -6.848253533455045e-02 - -1.667031524313929e-03 - 5.809770596261962e-04 - -5.809770596261962e-04 - -6.843115219609125e-02 - 9.450032592850598e-02 - -5.809770596261962e-04 - 1.402452579700487e-03 - 2.171463896239443e-03 - -6.843115219609125e-02 - 5.809770596261962e-04 - 2.171463896239443e-03 - 1.402452579700487e-03 - -3.531895380512890e-02 - -6.848253533455045e-02 - 6.848253533455045e-02 - -6.843115219609125e-02 - 9.450032592850598e-02 - -6.843115219609125e-02 - 3.682318452992087e-01 - -4.604105549283176e-05 - -9.024137829434160e-04 - 9.845793442069338e-04 - -4.604105549283176e-05 - 9.024137829434160e-04 - 9.845793442069338e-04 - 4.604105549283176e-05 - 9.024137829434160e-04 - 9.845793442069338e-04 - 4.604105549283176e-05 - -9.024137829434160e-04 - 9.845793442069338e-04 - -6.848253533455045e-02 - -6.848253533455045e-02 - -9.450032592850598e-02 - 6.848253533455045e-02 - -6.848253533455045e-02 - -9.450032592850598e-02 - -9.024137829434160e-04 - -4.604105549283176e-05 - 9.845793442069338e-04 - 9.024137829434160e-04 - -4.604105549283176e-05 - 9.845793442069338e-04 - -2.067732421909400e-03 - -2.067732421909400e-03 - 4.732059152899317e-04 - 2.067732421909400e-03 - -2.067732421909400e-03 - 4.732059152899317e-04 - 9.024137829434160e-04 - 4.604105549283176e-05 - 9.845793442069338e-04 - -9.024137829434160e-04 - 4.604105549283176e-05 - 9.845793442069338e-04 - -2.067732421909400e-03 - 2.067732421909400e-03 - 4.732059152899317e-04 - 2.067732421909400e-03 - 2.067732421909400e-03 - 4.732059152899317e-04 - -6.848253533455045e-02 - 6.848253533455045e-02 - -9.450032592850598e-02 - 6.848253533455045e-02 - 6.848253533455045e-02 - -9.450032592850598e-02 - -1.140436299842416e-03 - -2.142887467535423e-03 - -1.673031588847898e-03 - 1.140436299842416e-03 - -2.142887467535423e-03 - 1.673031588847898e-03 - 1.140436299842416e-03 - 2.142887467535423e-03 - -1.673031588847898e-03 - -1.140436299842416e-03 - 2.142887467535423e-03 - 1.673031588847898e-03 - -6.843115219609125e-02 - -3.531895380512890e-02 - -6.843115219609125e-02 - -6.843115219609125e-02 - 3.531895380512890e-02 - 6.843115219609125e-02 - 1.137512366579104e-03 - 1.329516780045767e-03 - 1.137512366579104e-03 - 1.137512366579104e-03 - -1.329516780045767e-03 - -1.137512366579104e-03 - -1.673031588847898e-03 - -2.142887467535423e-03 - -1.140436299842416e-03 - -1.673031588847898e-03 - 2.142887467535423e-03 - 1.140436299842416e-03 - -1.137512366579104e-03 - -1.329516780045767e-03 - 1.137512366579104e-03 - -1.137512366579104e-03 - 1.329516780045767e-03 - -1.137512366579104e-03 - 1.673031588847898e-03 - -2.142887467535423e-03 - 1.140436299842416e-03 - 1.673031588847898e-03 - 2.142887467535423e-03 - -1.140436299842416e-03 - 6.843115219609125e-02 - -3.531895380512890e-02 - 6.843115219609125e-02 - 6.843115219609125e-02 - 3.531895380512890e-02 - -6.843115219609125e-02 - 4.732059152899317e-04 - -2.067732421909400e-03 - -2.067732421909400e-03 - 4.732059152899317e-04 - 2.067732421909400e-03 - -2.067732421909400e-03 - 4.732059152899317e-04 - -2.067732421909400e-03 - 2.067732421909400e-03 - 4.732059152899317e-04 - 2.067732421909400e-03 - 2.067732421909400e-03 - -9.450032592850598e-02 - -6.848253533455045e-02 - -6.848253533455045e-02 - -9.450032592850598e-02 - 6.848253533455045e-02 - 6.848253533455045e-02 - 9.845793442069338e-04 - -4.604105549283176e-05 - -9.024137829434160e-04 - 9.845793442069338e-04 - 4.604105549283176e-05 - 9.024137829434160e-04 - 9.845793442069338e-04 - -9.024137829434160e-04 - -4.604105549283176e-05 - 9.845793442069338e-04 - 9.024137829434160e-04 - 4.604105549283176e-05 - 9.845793442069338e-04 - -4.604105549283176e-05 - 9.024137829434160e-04 - 9.845793442069338e-04 - 4.604105549283176e-05 - -9.024137829434160e-04 - 9.845793442069338e-04 - 9.024137829434160e-04 - -4.604105549283176e-05 - 9.845793442069338e-04 - -9.024137829434160e-04 - 4.604105549283176e-05 - -9.450032592850598e-02 - 6.848253533455045e-02 - -6.848253533455045e-02 - -9.450032592850598e-02 - -6.848253533455045e-02 - 6.848253533455045e-02 - -1.137512366579104e-03 - -9.024137829434160e-04 - 9.845793442069338e-04 - 5.809770596261962e-04 - 8.561294058172238e-04 - -1.771057142348803e-03 - 6.173609086399110e-04 - 4.634339865815935e-04 - -4.465016140720080e-05 - -9.917403921744496e-05 - 6.173609086399110e-04 - 7.188896116000135e-04 - -1.762396085246188e-05 - 8.830182089464902e-05 - -2.179138887699985e-04 - 1.020134538757355e-04 - 1.762396085246188e-05 - -1.430536785708917e-04 - 2.142887467535423e-03 - 2.067732421909400e-03 - 1.402452579700487e-03 - 9.917403921744496e-05 - -3.921476992823876e-04 - -6.173609086399110e-04 - 9.917403921744496e-05 - 3.921476992823876e-04 - 6.173609086399110e-04 - 1.020134538757355e-04 - 1.038533186064150e-04 - 1.762396085246188e-05 - 1.020134538757355e-04 - -1.038533186064150e-04 - -1.762396085246188e-05 - 1.673031588847898e-03 - -2.171463896239443e-03 - -1.672925271626789e-05 - 1.672925271626789e-05 - 7.188896116000135e-04 - -4.634339865815935e-04 - 4.634339865815935e-04 - -2.239558091312982e-04 - 9.917403921744496e-05 - -9.917403921744496e-05 - -1.430536785708917e-04 - 8.830182089464902e-05 - -8.830182089464902e-05 - -1.495749160722173e-04 - -1.020134538757355e-04 - 1.020134538757355e-04 - -1.137512366579104e-03 - 9.024137829434160e-04 - 9.845793442069338e-04 - -1.762396085246188e-05 - -8.830182089464902e-05 - -2.179138887699985e-04 - 1.020134538757355e-04 - -1.762396085246188e-05 - -1.430536785708917e-04 - 6.173609086399110e-04 - -4.634339865815935e-04 - -4.465016140720080e-05 - -9.917403921744496e-05 - -6.173609086399110e-04 - 7.188896116000135e-04 - 5.809770596261962e-04 - -8.561294058172238e-04 - -1.771057142348803e-03 - 2.142887467535423e-03 - -2.067732421909400e-03 - -1.020134538757355e-04 - 1.038533186064150e-04 - -1.762396085246188e-05 - -1.020134538757355e-04 - -1.038533186064150e-04 - 1.762396085246188e-05 - -9.917403921744496e-05 - -3.921476992823876e-04 - 6.173609086399110e-04 - -9.917403921744496e-05 - 3.921476992823876e-04 - -6.173609086399110e-04 - -1.402452579700487e-03 - 1.673031588847898e-03 - -1.430536785708917e-04 - -8.830182089464902e-05 - -8.830182089464902e-05 - -1.495749160722173e-04 - 1.020134538757355e-04 - 1.020134538757355e-04 - 7.188896116000135e-04 - 4.634339865815935e-04 - 4.634339865815935e-04 - -2.239558091312982e-04 - -9.917403921744496e-05 - -9.917403921744496e-05 - -2.171463896239443e-03 - 1.672925271626789e-05 - 1.672925271626789e-05 - 1.137512366579104e-03 - 9.024137829434160e-04 - 9.845793442069338e-04 - 1.762396085246188e-05 - -8.830182089464902e-05 - -2.179138887699985e-04 - -1.020134538757355e-04 - -1.762396085246188e-05 - -1.430536785708917e-04 - -6.173609086399110e-04 - -4.634339865815935e-04 - -4.465016140720080e-05 - 9.917403921744496e-05 - -6.173609086399110e-04 - 7.188896116000135e-04 - -5.809770596261962e-04 - -8.561294058172238e-04 - -1.771057142348803e-03 - -2.142887467535423e-03 - 2.067732421909400e-03 - -1.020134538757355e-04 - -1.038533186064150e-04 - 1.762396085246188e-05 - -1.020134538757355e-04 - 1.038533186064150e-04 - -1.762396085246188e-05 - -9.917403921744496e-05 - 3.921476992823876e-04 - -6.173609086399110e-04 - -9.917403921744496e-05 - -3.921476992823876e-04 - 6.173609086399110e-04 - -1.402452579700487e-03 - -1.673031588847898e-03 - -1.430536785708917e-04 - 8.830182089464902e-05 - 8.830182089464902e-05 - -1.495749160722173e-04 - -1.020134538757355e-04 - -1.020134538757355e-04 - 7.188896116000135e-04 - -4.634339865815935e-04 - -4.634339865815935e-04 - -2.239558091312982e-04 - 9.917403921744496e-05 - 9.917403921744496e-05 - -2.171463896239443e-03 - -1.672925271626789e-05 - -1.672925271626789e-05 - 1.137512366579104e-03 - -9.024137829434160e-04 - 9.845793442069338e-04 - -5.809770596261962e-04 - 8.561294058172238e-04 - -1.771057142348803e-03 - -6.173609086399110e-04 - 4.634339865815935e-04 - -4.465016140720080e-05 - 9.917403921744496e-05 - 6.173609086399110e-04 - 7.188896116000135e-04 - 1.762396085246188e-05 - 8.830182089464902e-05 - -2.179138887699985e-04 - -1.020134538757355e-04 - 1.762396085246188e-05 - -1.430536785708917e-04 - -2.142887467535423e-03 - -2.067732421909400e-03 - 1.402452579700487e-03 - 9.917403921744496e-05 - 3.921476992823876e-04 - 6.173609086399110e-04 - 9.917403921744496e-05 - -3.921476992823876e-04 - -6.173609086399110e-04 - 1.020134538757355e-04 - -1.038533186064150e-04 - -1.762396085246188e-05 - 1.020134538757355e-04 - 1.038533186064150e-04 - 1.762396085246188e-05 - -1.673031588847898e-03 - -2.171463896239443e-03 - 1.672925271626789e-05 - -1.672925271626789e-05 - 7.188896116000135e-04 - 4.634339865815935e-04 - -4.634339865815935e-04 - -2.239558091312982e-04 - -9.917403921744496e-05 - 9.917403921744496e-05 - -1.430536785708917e-04 - -8.830182089464902e-05 - 8.830182089464902e-05 - -1.495749160722173e-04 - 1.020134538757355e-04 - -1.020134538757355e-04 - 6.843115219609125e-02 - 6.848253533455045e-02 - 9.450032592850598e-02 - -8.561294058172238e-04 - 1.771057142348803e-03 - 8.561294058172238e-04 - -1.771057142348803e-03 - 1.672925271626789e-05 - -1.771057142348803e-03 - -1.402452579700487e-03 - -5.809770596261962e-04 - 2.171463896239443e-03 - -1.672925271626789e-05 - 1.771057142348803e-03 - 3.531895380512890e-02 - 6.848253533455045e-02 - -8.561294058172238e-04 - 1.672925271626789e-05 - -5.809770596261962e-04 - -1.667031524313929e-03 - -5.809770596261962e-04 - -1.672925271626789e-05 - 8.561294058172238e-04 - 5.809770596261962e-04 - 1.667031524313929e-03 - 5.809770596261962e-04 - 1.672925271626789e-05 - -8.561294058172238e-04 - 6.843115219609125e-02 - 1.771057142348803e-03 - -1.672925271626789e-05 - -1.771057142348803e-03 - 8.561294058172238e-04 - -2.171463896239443e-03 - 1.402452579700487e-03 - 5.809770596261962e-04 - 2.171463896239443e-03 - -5.809770596261962e-04 - -1.402452579700487e-03 - 1.771057142348803e-03 - -8.561294058172238e-04 - -6.843115219609125e-02 - 6.848253533455045e-02 - 9.450032592850598e-02 - -8.561294058172238e-04 - -1.771057142348803e-03 - -1.672925271626789e-05 - -1.771057142348803e-03 - -1.672925271626789e-05 - 1.771057142348803e-03 - 1.402452579700487e-03 - -5.809770596261962e-04 - 2.171463896239443e-03 - -3.531895380512890e-02 - -6.848253533455045e-02 - -5.809770596261962e-04 - 1.667031524313929e-03 - 5.809770596261962e-04 - -1.672925271626789e-05 - -8.561294058172238e-04 - 1.672925271626789e-05 - 8.561294058172238e-04 - 5.809770596261962e-04 - -1.667031524313929e-03 - -5.809770596261962e-04 - -6.843115219609125e-02 - -1.771057142348803e-03 - -8.561294058172238e-04 - -2.171463896239443e-03 - -1.402452579700487e-03 - -5.809770596261962e-04 - 1.771057142348803e-03 - 8.561294058172238e-04 - 2.171463896239443e-03 - 5.809770596261962e-04 - 1.402452579700487e-03 - -1.140436299842416e-03 - 4.604105549283176e-05 - 4.732059152899317e-04 - 4.634339865815935e-04 - -6.173609086399110e-04 - -4.465016140720080e-05 - 8.830182089464902e-05 - 1.762396085246188e-05 - -2.179138887699985e-04 - 1.329516780045767e-03 - 4.604105549283176e-05 - -4.634339865815935e-04 - -3.921476992823876e-04 - 4.634339865815935e-04 - 8.830182089464902e-05 - -1.038533186064150e-04 - -8.830182089464902e-05 - -1.140436299842416e-03 - 7.188896116000135e-04 - 9.917403921744496e-05 - 6.173609086399110e-04 - -1.430536785708917e-04 - -1.020134538757355e-04 - 1.762396085246188e-05 - 1.140436299842416e-03 - 4.604105549283176e-05 - 4.732059152899317e-04 - -8.830182089464902e-05 - 1.762396085246188e-05 - -2.179138887699985e-04 - -4.634339865815935e-04 - -6.173609086399110e-04 - -4.465016140720080e-05 - -1.329516780045767e-03 - -4.604105549283176e-05 - 8.830182089464902e-05 - 1.038533186064150e-04 - 8.830182089464902e-05 - -4.634339865815935e-04 - 3.921476992823876e-04 - -4.634339865815935e-04 - 1.140436299842416e-03 - -1.430536785708917e-04 - 1.020134538757355e-04 - -1.762396085246188e-05 - 7.188896116000135e-04 - -9.917403921744496e-05 - -6.173609086399110e-04 - 1.673031588847898e-03 - 2.067732421909400e-03 - 9.845793442069338e-04 - 2.142887467535423e-03 - -9.024137829434160e-04 - -1.137512366579104e-03 - -1.673031588847898e-03 - 2.067732421909400e-03 - 9.845793442069338e-04 - -2.142887467535423e-03 - 9.024137829434160e-04 - 1.137512366579104e-03 - 1.140436299842416e-03 - -4.604105549283176e-05 - 4.732059152899317e-04 - -8.830182089464902e-05 - -1.762396085246188e-05 - -2.179138887699985e-04 - -4.634339865815935e-04 - 6.173609086399110e-04 - -4.465016140720080e-05 - -8.561294058172238e-04 - 5.809770596261962e-04 - -1.771057142348803e-03 - -1.329516780045767e-03 - 4.604105549283176e-05 - -8.830182089464902e-05 - 1.038533186064150e-04 - -8.830182089464902e-05 - 4.634339865815935e-04 - 3.921476992823876e-04 - 4.634339865815935e-04 - 1.667031524313929e-03 - 1.140436299842416e-03 - -1.430536785708917e-04 - -1.020134538757355e-04 - -1.762396085246188e-05 - 7.188896116000135e-04 - 9.917403921744496e-05 - -6.173609086399110e-04 - -1.771057142348803e-03 - -5.809770596261962e-04 - -8.561294058172238e-04 - -1.140436299842416e-03 - -4.604105549283176e-05 - 4.732059152899317e-04 - 4.634339865815935e-04 - 6.173609086399110e-04 - -4.465016140720080e-05 - 8.830182089464902e-05 - -1.762396085246188e-05 - -2.179138887699985e-04 - 8.561294058172238e-04 - 5.809770596261962e-04 - -1.771057142348803e-03 - 1.329516780045767e-03 - -4.604105549283176e-05 - 4.634339865815935e-04 - -3.921476992823876e-04 - -4.634339865815935e-04 - -8.830182089464902e-05 - -1.038533186064150e-04 - 8.830182089464902e-05 - -1.667031524313929e-03 - -1.140436299842416e-03 - 7.188896116000135e-04 - -9.917403921744496e-05 - 6.173609086399110e-04 - -1.430536785708917e-04 - 1.020134538757355e-04 - 1.762396085246188e-05 - -1.771057142348803e-03 - 5.809770596261962e-04 - 8.561294058172238e-04 - 1.673031588847898e-03 - -2.067732421909400e-03 - 9.845793442069338e-04 - 1.672925271626789e-05 - 1.672925271626789e-05 - -2.171463896239443e-03 - 2.142887467535423e-03 - 9.024137829434160e-04 - -1.402452579700487e-03 - -1.137512366579104e-03 - -1.771057142348803e-03 - -8.561294058172238e-04 - 5.809770596261962e-04 - -1.673031588847898e-03 - -2.067732421909400e-03 - 9.845793442069338e-04 - -1.672925271626789e-05 - 1.672925271626789e-05 - -2.171463896239443e-03 - -2.142887467535423e-03 - -9.024137829434160e-04 - 1.402452579700487e-03 - 1.137512366579104e-03 - -1.771057142348803e-03 - 8.561294058172238e-04 - -5.809770596261962e-04 - 6.843115219609125e-02 - -6.848253533455045e-02 - 9.450032592850598e-02 - 8.561294058172238e-04 - 1.771057142348803e-03 - 3.531895380512890e-02 - -6.848253533455045e-02 - 8.561294058172238e-04 - -1.672925271626789e-05 - 6.843115219609125e-02 - 1.771057142348803e-03 - 1.672925271626789e-05 - -6.843115219609125e-02 - -6.848253533455045e-02 - 9.450032592850598e-02 - -3.531895380512890e-02 - 6.848253533455045e-02 - -6.843115219609125e-02 - 3.682318452992087e-01 - -4.604105549283176e-05 - 9.845793442069338e-04 - -9.024137829434160e-04 - 4.604105549283176e-05 - 9.845793442069338e-04 - 9.024137829434160e-04 - -4.604105549283176e-05 - 9.845793442069338e-04 - 9.024137829434160e-04 - 4.604105549283176e-05 - 9.845793442069338e-04 - -9.024137829434160e-04 - -6.848253533455045e-02 - -9.450032592850598e-02 - -6.848253533455045e-02 - 6.848253533455045e-02 - -9.450032592850598e-02 - -6.848253533455045e-02 - -2.067732421909400e-03 - 4.732059152899317e-04 - -2.067732421909400e-03 - 2.067732421909400e-03 - 4.732059152899317e-04 - -2.067732421909400e-03 - -9.024137829434160e-04 - 9.845793442069338e-04 - -4.604105549283176e-05 - 9.024137829434160e-04 - 9.845793442069338e-04 - -4.604105549283176e-05 - -2.067732421909400e-03 - 4.732059152899317e-04 - 2.067732421909400e-03 - 2.067732421909400e-03 - 4.732059152899317e-04 - 2.067732421909400e-03 - 9.024137829434160e-04 - 9.845793442069338e-04 - 4.604105549283176e-05 - -9.024137829434160e-04 - 9.845793442069338e-04 - 4.604105549283176e-05 - 6.848253533455045e-02 - -9.450032592850598e-02 - 6.848253533455045e-02 - -6.848253533455045e-02 - -9.450032592850598e-02 - 6.848253533455045e-02 - 4.732059152899317e-04 - -2.067732421909400e-03 - -2.067732421909400e-03 - 4.732059152899317e-04 - 2.067732421909400e-03 - -2.067732421909400e-03 - 4.732059152899317e-04 - -2.067732421909400e-03 - 2.067732421909400e-03 - 4.732059152899317e-04 - 2.067732421909400e-03 - 2.067732421909400e-03 - -9.450032592850598e-02 - -6.848253533455045e-02 - -6.848253533455045e-02 - -9.450032592850598e-02 - 6.848253533455045e-02 - 6.848253533455045e-02 - 9.845793442069338e-04 - -4.604105549283176e-05 - -9.024137829434160e-04 - 9.845793442069338e-04 - 4.604105549283176e-05 - 9.024137829434160e-04 - 9.845793442069338e-04 - -9.024137829434160e-04 - -4.604105549283176e-05 - 9.845793442069338e-04 - 9.024137829434160e-04 - 4.604105549283176e-05 - 9.845793442069338e-04 - -4.604105549283176e-05 - 9.024137829434160e-04 - 9.845793442069338e-04 - 4.604105549283176e-05 - -9.024137829434160e-04 - 9.845793442069338e-04 - 9.024137829434160e-04 - -4.604105549283176e-05 - 9.845793442069338e-04 - -9.024137829434160e-04 - 4.604105549283176e-05 - -9.450032592850598e-02 - 6.848253533455045e-02 - -6.848253533455045e-02 - -9.450032592850598e-02 - -6.848253533455045e-02 - 6.848253533455045e-02 - -1.140436299842416e-03 - -1.673031588847898e-03 - -2.142887467535423e-03 - 1.140436299842416e-03 - -1.673031588847898e-03 - 2.142887467535423e-03 - 1.140436299842416e-03 - 1.673031588847898e-03 - -2.142887467535423e-03 - -1.140436299842416e-03 - 1.673031588847898e-03 - 2.142887467535423e-03 - -6.843115219609125e-02 - -6.843115219609125e-02 - -3.531895380512890e-02 - -6.843115219609125e-02 - 6.843115219609125e-02 - 3.531895380512890e-02 - -1.673031588847898e-03 - -1.140436299842416e-03 - -2.142887467535423e-03 - -1.673031588847898e-03 - 1.140436299842416e-03 - 2.142887467535423e-03 - 1.137512366579104e-03 - 1.137512366579104e-03 - 1.329516780045767e-03 - 1.137512366579104e-03 - -1.137512366579104e-03 - -1.329516780045767e-03 - 1.673031588847898e-03 - 1.140436299842416e-03 - -2.142887467535423e-03 - 1.673031588847898e-03 - -1.140436299842416e-03 - 2.142887467535423e-03 - -1.137512366579104e-03 - 1.137512366579104e-03 - -1.329516780045767e-03 - -1.137512366579104e-03 - -1.137512366579104e-03 - 1.329516780045767e-03 - 6.843115219609125e-02 - -6.843115219609125e-02 - 3.531895380512890e-02 - 6.843115219609125e-02 - 6.843115219609125e-02 - -3.531895380512890e-02 - -1.137512366579104e-03 - 9.845793442069338e-04 - -9.024137829434160e-04 - 5.809770596261962e-04 - -1.771057142348803e-03 - 8.561294058172238e-04 - -9.917403921744496e-05 - 7.188896116000135e-04 - 6.173609086399110e-04 - 6.173609086399110e-04 - -4.465016140720080e-05 - 4.634339865815935e-04 - 1.020134538757355e-04 - -1.430536785708917e-04 - 1.762396085246188e-05 - -1.762396085246188e-05 - -2.179138887699985e-04 - 8.830182089464902e-05 - 1.673031588847898e-03 - 2.067732421909400e-03 - -2.171463896239443e-03 - 1.672925271626789e-05 - -1.672925271626789e-05 - -2.239558091312982e-04 - -9.917403921744496e-05 - 9.917403921744496e-05 - 7.188896116000135e-04 - 4.634339865815935e-04 - -4.634339865815935e-04 - -1.495749160722173e-04 - 1.020134538757355e-04 - -1.020134538757355e-04 - -1.430536785708917e-04 - -8.830182089464902e-05 - 8.830182089464902e-05 - 2.142887467535423e-03 - 1.402452579700487e-03 - 9.917403921744496e-05 - 6.173609086399110e-04 - 3.921476992823876e-04 - 9.917403921744496e-05 - -6.173609086399110e-04 - -3.921476992823876e-04 - 1.020134538757355e-04 - -1.762396085246188e-05 - -1.038533186064150e-04 - 1.020134538757355e-04 - 1.762396085246188e-05 - 1.038533186064150e-04 - 1.137512366579104e-03 - 9.845793442069338e-04 - 9.024137829434160e-04 - -1.020134538757355e-04 - -1.430536785708917e-04 - -1.762396085246188e-05 - 1.762396085246188e-05 - -2.179138887699985e-04 - -8.830182089464902e-05 - 9.917403921744496e-05 - 7.188896116000135e-04 - -6.173609086399110e-04 - -6.173609086399110e-04 - -4.465016140720080e-05 - -4.634339865815935e-04 - -5.809770596261962e-04 - -1.771057142348803e-03 - -8.561294058172238e-04 - -1.673031588847898e-03 - 2.067732421909400e-03 - -1.495749160722173e-04 - -1.020134538757355e-04 - -1.020134538757355e-04 - -1.430536785708917e-04 - 8.830182089464902e-05 - 8.830182089464902e-05 - -2.239558091312982e-04 - 9.917403921744496e-05 - 9.917403921744496e-05 - 7.188896116000135e-04 - -4.634339865815935e-04 - -4.634339865815935e-04 - -2.171463896239443e-03 - -1.672925271626789e-05 - -1.672925271626789e-05 - -2.142887467535423e-03 - -1.020134538757355e-04 - -1.762396085246188e-05 - 1.038533186064150e-04 - -1.020134538757355e-04 - 1.762396085246188e-05 - -1.038533186064150e-04 - -9.917403921744496e-05 - 6.173609086399110e-04 - -3.921476992823876e-04 - -9.917403921744496e-05 - -6.173609086399110e-04 - 3.921476992823876e-04 - -1.402452579700487e-03 - -1.137512366579104e-03 - 9.845793442069338e-04 - 9.024137829434160e-04 - 1.020134538757355e-04 - -1.430536785708917e-04 - -1.762396085246188e-05 - -1.762396085246188e-05 - -2.179138887699985e-04 - -8.830182089464902e-05 - -9.917403921744496e-05 - 7.188896116000135e-04 - -6.173609086399110e-04 - 6.173609086399110e-04 - -4.465016140720080e-05 - -4.634339865815935e-04 - 5.809770596261962e-04 - -1.771057142348803e-03 - -8.561294058172238e-04 - 1.673031588847898e-03 - -2.067732421909400e-03 - -1.495749160722173e-04 - 1.020134538757355e-04 - 1.020134538757355e-04 - -1.430536785708917e-04 - -8.830182089464902e-05 - -8.830182089464902e-05 - -2.239558091312982e-04 - -9.917403921744496e-05 - -9.917403921744496e-05 - 7.188896116000135e-04 - 4.634339865815935e-04 - 4.634339865815935e-04 - -2.171463896239443e-03 - 1.672925271626789e-05 - 1.672925271626789e-05 - 2.142887467535423e-03 - -1.020134538757355e-04 - 1.762396085246188e-05 - -1.038533186064150e-04 - -1.020134538757355e-04 - -1.762396085246188e-05 - 1.038533186064150e-04 - -9.917403921744496e-05 - -6.173609086399110e-04 - 3.921476992823876e-04 - -9.917403921744496e-05 - 6.173609086399110e-04 - -3.921476992823876e-04 - -1.402452579700487e-03 - 1.137512366579104e-03 - 9.845793442069338e-04 - -9.024137829434160e-04 - -5.809770596261962e-04 - -1.771057142348803e-03 - 8.561294058172238e-04 - 9.917403921744496e-05 - 7.188896116000135e-04 - 6.173609086399110e-04 - -6.173609086399110e-04 - -4.465016140720080e-05 - 4.634339865815935e-04 - -1.020134538757355e-04 - -1.430536785708917e-04 - 1.762396085246188e-05 - 1.762396085246188e-05 - -2.179138887699985e-04 - 8.830182089464902e-05 - -1.673031588847898e-03 - -2.067732421909400e-03 - -2.171463896239443e-03 - -1.672925271626789e-05 - 1.672925271626789e-05 - -2.239558091312982e-04 - 9.917403921744496e-05 - -9.917403921744496e-05 - 7.188896116000135e-04 - -4.634339865815935e-04 - 4.634339865815935e-04 - -1.495749160722173e-04 - -1.020134538757355e-04 - 1.020134538757355e-04 - -1.430536785708917e-04 - 8.830182089464902e-05 - -8.830182089464902e-05 - -2.142887467535423e-03 - 1.402452579700487e-03 - 9.917403921744496e-05 - -6.173609086399110e-04 - -3.921476992823876e-04 - 9.917403921744496e-05 - 6.173609086399110e-04 - 3.921476992823876e-04 - 1.020134538757355e-04 - 1.762396085246188e-05 - 1.038533186064150e-04 - 1.020134538757355e-04 - -1.762396085246188e-05 - -1.038533186064150e-04 - 6.843115219609125e-02 - 9.450032592850598e-02 - 6.848253533455045e-02 - 1.771057142348803e-03 - -8.561294058172238e-04 - 1.672925271626789e-05 - -1.771057142348803e-03 - 8.561294058172238e-04 - -1.771057142348803e-03 - 1.771057142348803e-03 - -1.672925271626789e-05 - -1.402452579700487e-03 - 2.171463896239443e-03 - -5.809770596261962e-04 - 6.843115219609125e-02 - 6.848253533455045e-02 - 1.771057142348803e-03 - -1.672925271626789e-05 - -2.171463896239443e-03 - 5.809770596261962e-04 - 1.402452579700487e-03 - -1.771057142348803e-03 - 8.561294058172238e-04 - 1.771057142348803e-03 - -8.561294058172238e-04 - 2.171463896239443e-03 - -1.402452579700487e-03 - -5.809770596261962e-04 - 3.531895380512890e-02 - -8.561294058172238e-04 - 1.672925271626789e-05 - -1.672925271626789e-05 - 8.561294058172238e-04 - -5.809770596261962e-04 - -5.809770596261962e-04 - -1.667031524313929e-03 - 1.672925271626789e-05 - -8.561294058172238e-04 - 5.809770596261962e-04 - 5.809770596261962e-04 - 1.667031524313929e-03 - -6.843115219609125e-02 - 9.450032592850598e-02 - 6.848253533455045e-02 - -1.672925271626789e-05 - -1.771057142348803e-03 - -8.561294058172238e-04 - -1.771057142348803e-03 - 1.402452579700487e-03 - 2.171463896239443e-03 - -5.809770596261962e-04 - 1.771057142348803e-03 - -1.672925271626789e-05 - -6.843115219609125e-02 - -6.848253533455045e-02 - -2.171463896239443e-03 - -5.809770596261962e-04 - -1.402452579700487e-03 - -1.771057142348803e-03 - -8.561294058172238e-04 - 2.171463896239443e-03 - 1.402452579700487e-03 - 5.809770596261962e-04 - 1.771057142348803e-03 - 8.561294058172238e-04 - -3.531895380512890e-02 - -1.672925271626789e-05 - -8.561294058172238e-04 - -5.809770596261962e-04 - 5.809770596261962e-04 - 1.667031524313929e-03 - 5.809770596261962e-04 - -5.809770596261962e-04 - -1.667031524313929e-03 - 1.672925271626789e-05 - 8.561294058172238e-04 - 1.673031588847898e-03 - 9.845793442069338e-04 - 2.067732421909400e-03 - 4.634339865815935e-04 - 7.188896116000135e-04 - -4.634339865815935e-04 - -8.830182089464902e-05 - -1.430536785708917e-04 - 8.830182089464902e-05 - -1.137512366579104e-03 - -9.024137829434160e-04 - -4.465016140720080e-05 - 6.173609086399110e-04 - 4.634339865815935e-04 - -2.179138887699985e-04 - -1.762396085246188e-05 - 8.830182089464902e-05 - 2.142887467535423e-03 - -6.173609086399110e-04 - 9.917403921744496e-05 - -3.921476992823876e-04 - 1.762396085246188e-05 - 1.020134538757355e-04 - 1.038533186064150e-04 - -1.673031588847898e-03 - 9.845793442069338e-04 - 2.067732421909400e-03 - 8.830182089464902e-05 - -1.430536785708917e-04 - 8.830182089464902e-05 - -4.634339865815935e-04 - 7.188896116000135e-04 - -4.634339865815935e-04 - 1.137512366579104e-03 - 9.024137829434160e-04 - -2.179138887699985e-04 - 1.762396085246188e-05 - -8.830182089464902e-05 - -4.465016140720080e-05 - -6.173609086399110e-04 - -4.634339865815935e-04 - -2.142887467535423e-03 - 1.762396085246188e-05 - -1.020134538757355e-04 - -1.038533186064150e-04 - -6.173609086399110e-04 - -9.917403921744496e-05 - 3.921476992823876e-04 - -1.140436299842416e-03 - 4.732059152899317e-04 - 4.604105549283176e-05 - -1.140436299842416e-03 - 4.604105549283176e-05 - 1.329516780045767e-03 - 1.140436299842416e-03 - 4.732059152899317e-04 - 4.604105549283176e-05 - 1.140436299842416e-03 - -4.604105549283176e-05 - -1.329516780045767e-03 - 1.673031588847898e-03 - 9.845793442069338e-04 - -2.067732421909400e-03 - -8.830182089464902e-05 - -1.430536785708917e-04 - -8.830182089464902e-05 - 4.634339865815935e-04 - 7.188896116000135e-04 - 4.634339865815935e-04 - 1.672925271626789e-05 - -2.171463896239443e-03 - 1.672925271626789e-05 - -1.137512366579104e-03 - 9.024137829434160e-04 - -2.179138887699985e-04 - -1.762396085246188e-05 - -8.830182089464902e-05 - -4.465016140720080e-05 - 6.173609086399110e-04 - -4.634339865815935e-04 - -1.771057142348803e-03 - 5.809770596261962e-04 - -8.561294058172238e-04 - 2.142887467535423e-03 - -1.762396085246188e-05 - -1.020134538757355e-04 - 1.038533186064150e-04 - 6.173609086399110e-04 - -9.917403921744496e-05 - -3.921476992823876e-04 - -1.402452579700487e-03 - -1.673031588847898e-03 - 9.845793442069338e-04 - -2.067732421909400e-03 - -4.634339865815935e-04 - 7.188896116000135e-04 - 4.634339865815935e-04 - 8.830182089464902e-05 - -1.430536785708917e-04 - -8.830182089464902e-05 - -1.672925271626789e-05 - -2.171463896239443e-03 - 1.672925271626789e-05 - 1.137512366579104e-03 - -9.024137829434160e-04 - -4.465016140720080e-05 - -6.173609086399110e-04 - 4.634339865815935e-04 - -2.179138887699985e-04 - 1.762396085246188e-05 - 8.830182089464902e-05 - -1.771057142348803e-03 - -5.809770596261962e-04 - 8.561294058172238e-04 - -2.142887467535423e-03 - 6.173609086399110e-04 - 9.917403921744496e-05 - 3.921476992823876e-04 - -1.762396085246188e-05 - 1.020134538757355e-04 - -1.038533186064150e-04 - 1.402452579700487e-03 - 1.140436299842416e-03 - 4.732059152899317e-04 - -4.604105549283176e-05 - -8.561294058172238e-04 - -1.771057142348803e-03 - 5.809770596261962e-04 - 1.140436299842416e-03 - 4.604105549283176e-05 - -1.771057142348803e-03 - -8.561294058172238e-04 - -5.809770596261962e-04 - -1.329516780045767e-03 - 1.667031524313929e-03 - -1.140436299842416e-03 - 4.732059152899317e-04 - -4.604105549283176e-05 - 8.561294058172238e-04 - -1.771057142348803e-03 - 5.809770596261962e-04 - -1.140436299842416e-03 - -4.604105549283176e-05 - -1.771057142348803e-03 - 8.561294058172238e-04 - 5.809770596261962e-04 - 1.329516780045767e-03 - -1.667031524313929e-03 - -6.843115219609125e-02 - 9.450032592850598e-02 - -6.848253533455045e-02 - 1.771057142348803e-03 - 8.561294058172238e-04 - -6.843115219609125e-02 - 6.848253533455045e-02 - 1.771057142348803e-03 - -1.672925271626789e-05 - -3.531895380512890e-02 - 8.561294058172238e-04 - 1.672925271626789e-05 - 6.843115219609125e-02 - 9.450032592850598e-02 - -6.848253533455045e-02 - 6.843115219609125e-02 - -6.848253533455045e-02 - 3.531895380512890e-02 - -3.531895380512890e-02 - -6.848253533455045e-02 - -6.848253533455045e-02 - -1.667031524313929e-03 - -5.809770596261962e-04 - -5.809770596261962e-04 - 3.531895380512890e-02 - 6.848253533455045e-02 - 6.848253533455045e-02 - 1.667031524313929e-03 - 5.809770596261962e-04 - 5.809770596261962e-04 - 8.561294058172238e-04 - -1.672925271626789e-05 - -1.672925271626789e-05 - 8.561294058172238e-04 - -8.561294058172238e-04 - 1.672925271626789e-05 - 1.672925271626789e-05 - -8.561294058172238e-04 - -6.843115219609125e-02 - -9.450032592850598e-02 - 5.809770596261962e-04 - 1.402452579700487e-03 - -2.171463896239443e-03 - 6.843115219609125e-02 - 6.848253533455045e-02 - 9.450032592850598e-02 - -8.561294058172238e-04 - 1.771057142348803e-03 - 8.561294058172238e-04 - -1.771057142348803e-03 - 1.672925271626789e-05 - -1.771057142348803e-03 - -1.402452579700487e-03 - -5.809770596261962e-04 - 2.171463896239443e-03 - -1.672925271626789e-05 - 1.771057142348803e-03 - -6.843115219609125e-02 - 5.809770596261962e-04 - -2.171463896239443e-03 - 1.402452579700487e-03 - 6.843115219609125e-02 - 9.450032592850598e-02 - 6.848253533455045e-02 - 1.771057142348803e-03 - -8.561294058172238e-04 - 1.672925271626789e-05 - -1.771057142348803e-03 - 8.561294058172238e-04 - -1.771057142348803e-03 - 1.771057142348803e-03 - -1.672925271626789e-05 - -1.402452579700487e-03 - 2.171463896239443e-03 - -5.809770596261962e-04 - -3.531895380512890e-02 - 6.848253533455045e-02 - 6.848253533455045e-02 - 3.531895380512890e-02 - -6.848253533455045e-02 - -6.848253533455045e-02 - 1.667031524313929e-03 - -5.809770596261962e-04 - -5.809770596261962e-04 - 1.672925271626789e-05 - -8.561294058172238e-04 - -8.561294058172238e-04 - 1.672925271626789e-05 - 8.561294058172238e-04 - -1.672925271626789e-05 - -1.672925271626789e-05 - 8.561294058172238e-04 - -6.843115219609125e-02 - -9.450032592850598e-02 - -6.843115219609125e-02 - 6.848253533455045e-02 - 9.450032592850598e-02 - -8.561294058172238e-04 - 1.771057142348803e-03 - -1.672925271626789e-05 - -1.771057142348803e-03 - -8.561294058172238e-04 - -1.771057142348803e-03 - 1.402452579700487e-03 - -5.809770596261962e-04 - 2.171463896239443e-03 - -1.672925271626789e-05 - 1.771057142348803e-03 - -6.843115219609125e-02 - -6.843115219609125e-02 - 9.450032592850598e-02 - 6.848253533455045e-02 - 1.771057142348803e-03 - -8.561294058172238e-04 - -8.561294058172238e-04 - -1.771057142348803e-03 - -1.672925271626789e-05 - -1.771057142348803e-03 - 1.771057142348803e-03 - -1.672925271626789e-05 - 1.402452579700487e-03 - 2.171463896239443e-03 - -5.809770596261962e-04 - -1.329516780045767e-03 - 1.137512366579104e-03 - 1.137512366579104e-03 - 1.329516780045767e-03 - 1.137512366579104e-03 - -1.137512366579104e-03 - 1.329516780045767e-03 - -1.137512366579104e-03 - 1.137512366579104e-03 - -1.329516780045767e-03 - -1.137512366579104e-03 - -1.137512366579104e-03 - -3.531895380512890e-02 - 6.843115219609125e-02 - -6.843115219609125e-02 - -3.531895380512890e-02 - -6.843115219609125e-02 - 6.843115219609125e-02 - -2.142887467535423e-03 - 1.140436299842416e-03 - -1.673031588847898e-03 - -2.142887467535423e-03 - -1.140436299842416e-03 - 1.673031588847898e-03 - -2.142887467535423e-03 - -1.673031588847898e-03 - 1.140436299842416e-03 - -2.142887467535423e-03 - 1.673031588847898e-03 - -1.140436299842416e-03 - 2.142887467535423e-03 - -1.140436299842416e-03 - -1.673031588847898e-03 - 2.142887467535423e-03 - 1.140436299842416e-03 - 1.673031588847898e-03 - 2.142887467535423e-03 - -1.673031588847898e-03 - -1.140436299842416e-03 - 2.142887467535423e-03 - 1.673031588847898e-03 - 1.140436299842416e-03 - -3.682318452992087e-01 - -4.604105549283176e-05 - 9.024137829434160e-04 - -9.845793442069338e-04 - -4.604105549283176e-05 - -9.024137829434160e-04 - -9.845793442069338e-04 - 4.604105549283176e-05 - -9.024137829434160e-04 - -9.845793442069338e-04 - 4.604105549283176e-05 - 9.024137829434160e-04 - -9.845793442069338e-04 - 6.848253533455045e-02 - -6.848253533455045e-02 - 9.450032592850598e-02 - -6.848253533455045e-02 - -6.848253533455045e-02 - 9.450032592850598e-02 - 9.024137829434160e-04 - -4.604105549283176e-05 - -9.845793442069338e-04 - -9.024137829434160e-04 - -4.604105549283176e-05 - -9.845793442069338e-04 - -2.067732421909400e-03 - -2.067732421909400e-03 - -4.732059152899317e-04 - 2.067732421909400e-03 - -2.067732421909400e-03 - -4.732059152899317e-04 - -9.024137829434160e-04 - 4.604105549283176e-05 - -9.845793442069338e-04 - 9.024137829434160e-04 - 4.604105549283176e-05 - -9.845793442069338e-04 - -2.067732421909400e-03 - 2.067732421909400e-03 - -4.732059152899317e-04 - 2.067732421909400e-03 - 2.067732421909400e-03 - -4.732059152899317e-04 - -4.604105549283176e-05 - -9.845793442069338e-04 - 9.024137829434160e-04 - 4.604105549283176e-05 - -9.845793442069338e-04 - -9.024137829434160e-04 - -4.604105549283176e-05 - -9.845793442069338e-04 - -9.024137829434160e-04 - 4.604105549283176e-05 - -9.845793442069338e-04 - 9.024137829434160e-04 - -6.848253533455045e-02 - 9.450032592850598e-02 - -6.848253533455045e-02 - 6.848253533455045e-02 - 9.450032592850598e-02 - -6.848253533455045e-02 - -2.067732421909400e-03 - -4.732059152899317e-04 - -2.067732421909400e-03 - 2.067732421909400e-03 - -4.732059152899317e-04 - -2.067732421909400e-03 - 9.024137829434160e-04 - -9.845793442069338e-04 - -4.604105549283176e-05 - -9.024137829434160e-04 - -9.845793442069338e-04 - -4.604105549283176e-05 - -2.067732421909400e-03 - -4.732059152899317e-04 - 2.067732421909400e-03 - 2.067732421909400e-03 - -4.732059152899317e-04 - 2.067732421909400e-03 - -9.024137829434160e-04 - -9.845793442069338e-04 - 4.604105549283176e-05 - 9.024137829434160e-04 - -9.845793442069338e-04 - 4.604105549283176e-05 - -1.329516780045767e-03 - 4.604105549283176e-05 - 4.604105549283176e-05 - 1.038533186064150e-04 - -8.830182089464902e-05 - 8.830182089464902e-05 - 1.038533186064150e-04 - 8.830182089464902e-05 - -8.830182089464902e-05 - 3.921476992823876e-04 - 4.634339865815935e-04 - -4.634339865815935e-04 - 3.921476992823876e-04 - -4.634339865815935e-04 - 4.634339865815935e-04 - 1.140436299842416e-03 - -4.732059152899317e-04 - -1.020134538757355e-04 - -1.762396085246188e-05 - 1.430536785708917e-04 - 1.762396085246188e-05 - -8.830182089464902e-05 - 2.179138887699985e-04 - 9.917403921744496e-05 - -6.173609086399110e-04 - -7.188896116000135e-04 - -6.173609086399110e-04 - -4.634339865815935e-04 - 4.465016140720080e-05 - 1.140436299842416e-03 - 1.762396085246188e-05 - 2.179138887699985e-04 - -8.830182089464902e-05 - -1.020134538757355e-04 - 1.430536785708917e-04 - -1.762396085246188e-05 - -6.173609086399110e-04 - 4.465016140720080e-05 - -4.634339865815935e-04 - 9.917403921744496e-05 - -7.188896116000135e-04 - -6.173609086399110e-04 - 1.329516780045767e-03 - 4.604105549283176e-05 - -4.604105549283176e-05 - -1.667031524313929e-03 - -3.921476992823876e-04 - 4.634339865815935e-04 - 4.634339865815935e-04 - -3.921476992823876e-04 - -4.634339865815935e-04 - -4.634339865815935e-04 - -1.038533186064150e-04 - -8.830182089464902e-05 - -8.830182089464902e-05 - -1.038533186064150e-04 - 8.830182089464902e-05 - 8.830182089464902e-05 - -1.140436299842416e-03 - -4.732059152899317e-04 - -5.809770596261962e-04 - 8.561294058172238e-04 - 1.771057142348803e-03 - 9.917403921744496e-05 - 6.173609086399110e-04 - -7.188896116000135e-04 - -6.173609086399110e-04 - 4.634339865815935e-04 - 4.465016140720080e-05 - -1.020134538757355e-04 - 1.762396085246188e-05 - 1.430536785708917e-04 - 1.762396085246188e-05 - 8.830182089464902e-05 - 2.179138887699985e-04 - -1.140436299842416e-03 - 5.809770596261962e-04 - 1.771057142348803e-03 - 8.561294058172238e-04 - 6.173609086399110e-04 - 4.465016140720080e-05 - 4.634339865815935e-04 - -9.917403921744496e-05 - -7.188896116000135e-04 - 6.173609086399110e-04 - -1.762396085246188e-05 - 2.179138887699985e-04 - 8.830182089464902e-05 - 1.020134538757355e-04 - 1.430536785708917e-04 - 1.762396085246188e-05 - 1.329516780045767e-03 - -4.604105549283176e-05 - 4.604105549283176e-05 - -1.667031524313929e-03 - -3.921476992823876e-04 - -4.634339865815935e-04 - -4.634339865815935e-04 - -3.921476992823876e-04 - 4.634339865815935e-04 - 4.634339865815935e-04 - -1.038533186064150e-04 - 8.830182089464902e-05 - 8.830182089464902e-05 - -1.038533186064150e-04 - -8.830182089464902e-05 - -8.830182089464902e-05 - -1.140436299842416e-03 - -4.732059152899317e-04 - 5.809770596261962e-04 - 8.561294058172238e-04 - 1.771057142348803e-03 - -9.917403921744496e-05 - 6.173609086399110e-04 - -7.188896116000135e-04 - 6.173609086399110e-04 - 4.634339865815935e-04 - 4.465016140720080e-05 - 1.020134538757355e-04 - 1.762396085246188e-05 - 1.430536785708917e-04 - -1.762396085246188e-05 - 8.830182089464902e-05 - 2.179138887699985e-04 - -1.140436299842416e-03 - -5.809770596261962e-04 - 1.771057142348803e-03 - 8.561294058172238e-04 - -6.173609086399110e-04 - 4.465016140720080e-05 - 4.634339865815935e-04 - 9.917403921744496e-05 - -7.188896116000135e-04 - 6.173609086399110e-04 - 1.762396085246188e-05 - 2.179138887699985e-04 - 8.830182089464902e-05 - -1.020134538757355e-04 - 1.430536785708917e-04 - 1.762396085246188e-05 - -1.329516780045767e-03 - -4.604105549283176e-05 - -4.604105549283176e-05 - 1.038533186064150e-04 - 8.830182089464902e-05 - -8.830182089464902e-05 - 1.038533186064150e-04 - -8.830182089464902e-05 - 8.830182089464902e-05 - 3.921476992823876e-04 - -4.634339865815935e-04 - 4.634339865815935e-04 - 3.921476992823876e-04 - 4.634339865815935e-04 - -4.634339865815935e-04 - 1.140436299842416e-03 - -4.732059152899317e-04 - 1.020134538757355e-04 - -1.762396085246188e-05 - 1.430536785708917e-04 - -1.762396085246188e-05 - -8.830182089464902e-05 - 2.179138887699985e-04 - -9.917403921744496e-05 - -6.173609086399110e-04 - -7.188896116000135e-04 - 6.173609086399110e-04 - -4.634339865815935e-04 - 4.465016140720080e-05 - 1.140436299842416e-03 - -1.762396085246188e-05 - 2.179138887699985e-04 - -8.830182089464902e-05 - 1.020134538757355e-04 - 1.430536785708917e-04 - -1.762396085246188e-05 - 6.173609086399110e-04 - 4.465016140720080e-05 - -4.634339865815935e-04 - -9.917403921744496e-05 - -7.188896116000135e-04 - -6.173609086399110e-04 - 3.531895380512890e-02 - -6.848253533455045e-02 - 6.848253533455045e-02 - 1.667031524313929e-03 - -5.809770596261962e-04 - 5.809770596261962e-04 - -8.561294058172238e-04 - -1.672925271626789e-05 - 1.672925271626789e-05 - 8.561294058172238e-04 - 6.843115219609125e-02 - -9.450032592850598e-02 - 5.809770596261962e-04 - -1.402452579700487e-03 - -2.171463896239443e-03 - -1.402452579700487e-03 - 5.809770596261962e-04 - 2.171463896239443e-03 - 1.672925271626789e-05 - 1.771057142348803e-03 - 6.843115219609125e-02 - -5.809770596261962e-04 - -2.171463896239443e-03 - -1.402452579700487e-03 - 1.771057142348803e-03 - 1.672925271626789e-05 - 1.402452579700487e-03 - 2.171463896239443e-03 - 5.809770596261962e-04 - 3.531895380512890e-02 - 6.848253533455045e-02 - -6.848253533455045e-02 - 8.561294058172238e-04 - 1.672925271626789e-05 - -1.672925271626789e-05 - -8.561294058172238e-04 - 6.843115219609125e-02 - -9.450032592850598e-02 - 1.402452579700487e-03 - 5.809770596261962e-04 - 2.171463896239443e-03 - 1.672925271626789e-05 - 1.771057142348803e-03 - 6.843115219609125e-02 - 1.771057142348803e-03 - 1.672925271626789e-05 - -1.402452579700487e-03 - 2.171463896239443e-03 - 5.809770596261962e-04 - 2.142887467535423e-03 - 9.024137829434160e-04 - 2.067732421909400e-03 - -1.038533186064150e-04 - -1.020134538757355e-04 - -1.762396085246188e-05 - 3.921476992823876e-04 - -9.917403921744496e-05 - 6.173609086399110e-04 - -1.137512366579104e-03 - -9.845793442069338e-04 - -1.762396085246188e-05 - 1.020134538757355e-04 - 1.430536785708917e-04 - -6.173609086399110e-04 - -9.917403921744496e-05 - -7.188896116000135e-04 - 1.673031588847898e-03 - -1.020134538757355e-04 - 1.495749160722173e-04 - 1.020134538757355e-04 - 9.917403921744496e-05 - 2.239558091312982e-04 - -9.917403921744496e-05 - 2.142887467535423e-03 - -9.024137829434160e-04 - -2.067732421909400e-03 - 3.921476992823876e-04 - 9.917403921744496e-05 - -6.173609086399110e-04 - -1.038533186064150e-04 - 1.020134538757355e-04 - 1.762396085246188e-05 - -1.137512366579104e-03 - -9.845793442069338e-04 - 6.173609086399110e-04 - -9.917403921744496e-05 - -7.188896116000135e-04 - 1.762396085246188e-05 - 1.020134538757355e-04 - 1.430536785708917e-04 - 1.673031588847898e-03 - -9.917403921744496e-05 - 2.239558091312982e-04 - -9.917403921744496e-05 - 1.020134538757355e-04 - 1.495749160722173e-04 - 1.020134538757355e-04 - 2.142887467535423e-03 - 2.067732421909400e-03 - 9.024137829434160e-04 - 1.673031588847898e-03 - -9.845793442069338e-04 - -1.137512366579104e-03 - 2.142887467535423e-03 - -2.067732421909400e-03 - -9.024137829434160e-04 - 1.673031588847898e-03 - -9.845793442069338e-04 - -1.137512366579104e-03 - -2.142887467535423e-03 - -9.024137829434160e-04 - 2.067732421909400e-03 - -3.921476992823876e-04 - 9.917403921744496e-05 - 6.173609086399110e-04 - 1.038533186064150e-04 - 1.020134538757355e-04 - -1.762396085246188e-05 - 1.137512366579104e-03 - -9.845793442069338e-04 - 6.173609086399110e-04 - 9.917403921744496e-05 - -7.188896116000135e-04 - 1.762396085246188e-05 - -1.020134538757355e-04 - 1.430536785708917e-04 - -1.673031588847898e-03 - 9.917403921744496e-05 - 2.239558091312982e-04 - 9.917403921744496e-05 - -1.020134538757355e-04 - 1.495749160722173e-04 - -1.020134538757355e-04 - -2.142887467535423e-03 - 9.024137829434160e-04 - -2.067732421909400e-03 - 1.038533186064150e-04 - -1.020134538757355e-04 - 1.762396085246188e-05 - -3.921476992823876e-04 - -9.917403921744496e-05 - -6.173609086399110e-04 - 1.137512366579104e-03 - -9.845793442069338e-04 - -1.762396085246188e-05 - -1.020134538757355e-04 - 1.430536785708917e-04 - -6.173609086399110e-04 - 9.917403921744496e-05 - -7.188896116000135e-04 - -1.673031588847898e-03 - 1.020134538757355e-04 - 1.495749160722173e-04 - -1.020134538757355e-04 - -9.917403921744496e-05 - 2.239558091312982e-04 - 9.917403921744496e-05 - -2.142887467535423e-03 - 2.067732421909400e-03 - -9.024137829434160e-04 - -1.673031588847898e-03 - -9.845793442069338e-04 - 1.137512366579104e-03 - -2.142887467535423e-03 - -2.067732421909400e-03 - 9.024137829434160e-04 - -1.673031588847898e-03 - -9.845793442069338e-04 - 1.137512366579104e-03 - -6.843115219609125e-02 - -6.848253533455045e-02 - -9.450032592850598e-02 - 8.561294058172238e-04 - -1.771057142348803e-03 - 6.848253533455045e-02 - 6.843115219609125e-02 - 9.450032592850598e-02 - -5.809770596261962e-04 - -1.402452579700487e-03 - 2.171463896239443e-03 - 1.402452579700487e-03 - 5.809770596261962e-04 - -2.171463896239443e-03 - 1.672925271626789e-05 - -1.771057142348803e-03 - -8.561294058172238e-04 - 1.771057142348803e-03 - -1.672925271626789e-05 - 1.771057142348803e-03 - -3.531895380512890e-02 - -6.848253533455045e-02 - 8.561294058172238e-04 - -1.672925271626789e-05 - 6.848253533455045e-02 - 3.531895380512890e-02 - 6.848253533455045e-02 - -8.561294058172238e-04 - 1.672925271626789e-05 - -5.809770596261962e-04 - -1.667031524313929e-03 - -5.809770596261962e-04 - -1.672925271626789e-05 - 8.561294058172238e-04 - 5.809770596261962e-04 - 1.667031524313929e-03 - 5.809770596261962e-04 - 1.672925271626789e-05 - -8.561294058172238e-04 - -6.843115219609125e-02 - -1.771057142348803e-03 - 1.672925271626789e-05 - 9.450032592850598e-02 - 6.843115219609125e-02 - 6.848253533455045e-02 - 1.771057142348803e-03 - -1.672925271626789e-05 - -2.171463896239443e-03 - 5.809770596261962e-04 - 1.402452579700487e-03 - -1.771057142348803e-03 - 8.561294058172238e-04 - 1.771057142348803e-03 - -8.561294058172238e-04 - 2.171463896239443e-03 - -1.402452579700487e-03 - -5.809770596261962e-04 - 6.843115219609125e-02 - -6.848253533455045e-02 - -9.450032592850598e-02 - -6.848253533455045e-02 - 6.843115219609125e-02 - 9.450032592850598e-02 - 5.809770596261962e-04 - -1.402452579700487e-03 - 2.171463896239443e-03 - 1.672925271626789e-05 - -1.771057142348803e-03 - -1.402452579700487e-03 - 5.809770596261962e-04 - -2.171463896239443e-03 - 8.561294058172238e-04 - 1.771057142348803e-03 - 1.672925271626789e-05 - 1.771057142348803e-03 - 3.531895380512890e-02 - 6.848253533455045e-02 - 6.848253533455045e-02 - -3.531895380512890e-02 - -6.848253533455045e-02 - -8.561294058172238e-04 - -1.672925271626789e-05 - -1.672925271626789e-05 - -8.561294058172238e-04 - -5.809770596261962e-04 - 1.667031524313929e-03 - 5.809770596261962e-04 - 5.809770596261962e-04 - -1.667031524313929e-03 - -5.809770596261962e-04 - 1.672925271626789e-05 - 8.561294058172238e-04 - 6.843115219609125e-02 - 9.450032592850598e-02 - -6.843115219609125e-02 - -6.848253533455045e-02 - 1.771057142348803e-03 - 1.672925271626789e-05 - -1.771057142348803e-03 - -8.561294058172238e-04 - -2.171463896239443e-03 - -5.809770596261962e-04 - -1.402452579700487e-03 - 1.771057142348803e-03 - 8.561294058172238e-04 - 2.171463896239443e-03 - 1.402452579700487e-03 - 5.809770596261962e-04 - -3.682318452992087e-01 - -4.604105549283176e-05 - 9.024137829434160e-04 - -9.845793442069338e-04 - -4.604105549283176e-05 - -9.024137829434160e-04 - -9.845793442069338e-04 - 4.604105549283176e-05 - -9.024137829434160e-04 - -9.845793442069338e-04 - 4.604105549283176e-05 - 9.024137829434160e-04 - -9.845793442069338e-04 - 6.848253533455045e-02 - -6.848253533455045e-02 - 9.450032592850598e-02 - -6.848253533455045e-02 - -6.848253533455045e-02 - 9.450032592850598e-02 - 9.024137829434160e-04 - -4.604105549283176e-05 - -9.845793442069338e-04 - -9.024137829434160e-04 - -4.604105549283176e-05 - -9.845793442069338e-04 - -2.067732421909400e-03 - -2.067732421909400e-03 - -4.732059152899317e-04 - 2.067732421909400e-03 - -2.067732421909400e-03 - -4.732059152899317e-04 - -9.024137829434160e-04 - 4.604105549283176e-05 - -9.845793442069338e-04 - 9.024137829434160e-04 - 4.604105549283176e-05 - -9.845793442069338e-04 - -2.067732421909400e-03 - 2.067732421909400e-03 - -4.732059152899317e-04 - 2.067732421909400e-03 - 2.067732421909400e-03 - -4.732059152899317e-04 - 1.140436299842416e-03 - -2.142887467535423e-03 - -1.673031588847898e-03 - -1.140436299842416e-03 - -2.142887467535423e-03 - 1.673031588847898e-03 - -1.140436299842416e-03 - 2.142887467535423e-03 - -1.673031588847898e-03 - 1.140436299842416e-03 - 2.142887467535423e-03 - 1.673031588847898e-03 - -6.843115219609125e-02 - 3.531895380512890e-02 - -6.843115219609125e-02 - -6.843115219609125e-02 - -3.531895380512890e-02 - 6.843115219609125e-02 - 1.137512366579104e-03 - -1.329516780045767e-03 - 1.137512366579104e-03 - 1.137512366579104e-03 - 1.329516780045767e-03 - -1.137512366579104e-03 - -1.673031588847898e-03 - -2.142887467535423e-03 - 1.140436299842416e-03 - -1.673031588847898e-03 - 2.142887467535423e-03 - -1.140436299842416e-03 - -1.137512366579104e-03 - 1.329516780045767e-03 - 1.137512366579104e-03 - -1.137512366579104e-03 - -1.329516780045767e-03 - -1.137512366579104e-03 - 1.673031588847898e-03 - -2.142887467535423e-03 - -1.140436299842416e-03 - 1.673031588847898e-03 - 2.142887467535423e-03 - 1.140436299842416e-03 - -4.732059152899317e-04 - -2.067732421909400e-03 - -2.067732421909400e-03 - -4.732059152899317e-04 - 2.067732421909400e-03 - -2.067732421909400e-03 - -4.732059152899317e-04 - -2.067732421909400e-03 - 2.067732421909400e-03 - -4.732059152899317e-04 - 2.067732421909400e-03 - 2.067732421909400e-03 - 9.450032592850598e-02 - -6.848253533455045e-02 - 6.848253533455045e-02 - 9.450032592850598e-02 - 6.848253533455045e-02 - -6.848253533455045e-02 - -9.845793442069338e-04 - -4.604105549283176e-05 - 9.024137829434160e-04 - -9.845793442069338e-04 - 4.604105549283176e-05 - -9.024137829434160e-04 - -9.845793442069338e-04 - 9.024137829434160e-04 - -4.604105549283176e-05 - -9.845793442069338e-04 - -9.024137829434160e-04 - 4.604105549283176e-05 - -9.845793442069338e-04 - -4.604105549283176e-05 - -9.024137829434160e-04 - -9.845793442069338e-04 - 4.604105549283176e-05 - 9.024137829434160e-04 - -9.845793442069338e-04 - -9.024137829434160e-04 - -4.604105549283176e-05 - -9.845793442069338e-04 - 9.024137829434160e-04 - 4.604105549283176e-05 - -1.137512366579104e-03 - 9.024137829434160e-04 - -9.845793442069338e-04 - -1.762396085246188e-05 - -8.830182089464902e-05 - 2.179138887699985e-04 - 1.020134538757355e-04 - -1.762396085246188e-05 - 1.430536785708917e-04 - 6.173609086399110e-04 - -4.634339865815935e-04 - 4.465016140720080e-05 - -9.917403921744496e-05 - -6.173609086399110e-04 - -7.188896116000135e-04 - 2.142887467535423e-03 - 2.067732421909400e-03 - -1.020134538757355e-04 - 1.038533186064150e-04 - 1.762396085246188e-05 - -1.020134538757355e-04 - -1.038533186064150e-04 - -1.762396085246188e-05 - -9.917403921744496e-05 - -3.921476992823876e-04 - -6.173609086399110e-04 - -9.917403921744496e-05 - 3.921476992823876e-04 - 6.173609086399110e-04 - 1.673031588847898e-03 - 1.430536785708917e-04 - 8.830182089464902e-05 - -8.830182089464902e-05 - 1.495749160722173e-04 - -1.020134538757355e-04 - 1.020134538757355e-04 - -7.188896116000135e-04 - -4.634339865815935e-04 - 4.634339865815935e-04 - 2.239558091312982e-04 - 9.917403921744496e-05 - -9.917403921744496e-05 - -1.137512366579104e-03 - -9.024137829434160e-04 - -9.845793442069338e-04 - 5.809770596261962e-04 - 8.561294058172238e-04 - 1.771057142348803e-03 - 6.173609086399110e-04 - 4.634339865815935e-04 - 4.465016140720080e-05 - -9.917403921744496e-05 - 6.173609086399110e-04 - -7.188896116000135e-04 - -1.762396085246188e-05 - 8.830182089464902e-05 - 2.179138887699985e-04 - 1.020134538757355e-04 - 1.762396085246188e-05 - 1.430536785708917e-04 - 2.142887467535423e-03 - -2.067732421909400e-03 - 1.402452579700487e-03 - 9.917403921744496e-05 - -3.921476992823876e-04 - 6.173609086399110e-04 - 9.917403921744496e-05 - 3.921476992823876e-04 - -6.173609086399110e-04 - 1.020134538757355e-04 - 1.038533186064150e-04 - -1.762396085246188e-05 - 1.020134538757355e-04 - -1.038533186064150e-04 - 1.762396085246188e-05 - 1.673031588847898e-03 - 2.171463896239443e-03 - 1.672925271626789e-05 - 1.672925271626789e-05 - -7.188896116000135e-04 - 4.634339865815935e-04 - 4.634339865815935e-04 - 2.239558091312982e-04 - -9.917403921744496e-05 - -9.917403921744496e-05 - 1.430536785708917e-04 - -8.830182089464902e-05 - -8.830182089464902e-05 - 1.495749160722173e-04 - 1.020134538757355e-04 - 1.020134538757355e-04 - 1.137512366579104e-03 - -9.024137829434160e-04 - -9.845793442069338e-04 - -5.809770596261962e-04 - 8.561294058172238e-04 - 1.771057142348803e-03 - -6.173609086399110e-04 - 4.634339865815935e-04 - 4.465016140720080e-05 - 9.917403921744496e-05 - 6.173609086399110e-04 - -7.188896116000135e-04 - 1.762396085246188e-05 - 8.830182089464902e-05 - 2.179138887699985e-04 - -1.020134538757355e-04 - 1.762396085246188e-05 - 1.430536785708917e-04 - -2.142887467535423e-03 - 2.067732421909400e-03 - 1.402452579700487e-03 - 9.917403921744496e-05 - 3.921476992823876e-04 - -6.173609086399110e-04 - 9.917403921744496e-05 - -3.921476992823876e-04 - 6.173609086399110e-04 - 1.020134538757355e-04 - -1.038533186064150e-04 - 1.762396085246188e-05 - 1.020134538757355e-04 - 1.038533186064150e-04 - -1.762396085246188e-05 - -1.673031588847898e-03 - 2.171463896239443e-03 - -1.672925271626789e-05 - -1.672925271626789e-05 - -7.188896116000135e-04 - -4.634339865815935e-04 - -4.634339865815935e-04 - 2.239558091312982e-04 - 9.917403921744496e-05 - 9.917403921744496e-05 - 1.430536785708917e-04 - 8.830182089464902e-05 - 8.830182089464902e-05 - 1.495749160722173e-04 - -1.020134538757355e-04 - -1.020134538757355e-04 - 1.137512366579104e-03 - 9.024137829434160e-04 - -9.845793442069338e-04 - 1.762396085246188e-05 - -8.830182089464902e-05 - 2.179138887699985e-04 - -1.020134538757355e-04 - -1.762396085246188e-05 - 1.430536785708917e-04 - -6.173609086399110e-04 - -4.634339865815935e-04 - 4.465016140720080e-05 - 9.917403921744496e-05 - -6.173609086399110e-04 - -7.188896116000135e-04 - -2.142887467535423e-03 - -2.067732421909400e-03 - -1.020134538757355e-04 - -1.038533186064150e-04 - -1.762396085246188e-05 - -1.020134538757355e-04 - 1.038533186064150e-04 - 1.762396085246188e-05 - -9.917403921744496e-05 - 3.921476992823876e-04 - 6.173609086399110e-04 - -9.917403921744496e-05 - -3.921476992823876e-04 - -6.173609086399110e-04 - -1.673031588847898e-03 - 1.430536785708917e-04 - -8.830182089464902e-05 - 8.830182089464902e-05 - 1.495749160722173e-04 - 1.020134538757355e-04 - -1.020134538757355e-04 - -7.188896116000135e-04 - 4.634339865815935e-04 - -4.634339865815935e-04 - 2.239558091312982e-04 - -9.917403921744496e-05 - 9.917403921744496e-05 - -6.843115219609125e-02 - 6.848253533455045e-02 - -9.450032592850598e-02 - -8.561294058172238e-04 - -1.771057142348803e-03 - -8.561294058172238e-04 - 1.771057142348803e-03 - -1.672925271626789e-05 - 1.771057142348803e-03 - -3.531895380512890e-02 - 6.848253533455045e-02 - -8.561294058172238e-04 - 1.672925271626789e-05 - -5.809770596261962e-04 - 1.667031524313929e-03 - -5.809770596261962e-04 - -1.672925271626789e-05 - 8.561294058172238e-04 - -6.843115219609125e-02 - -1.771057142348803e-03 - -1.672925271626789e-05 - 1.771057142348803e-03 - -8.561294058172238e-04 - 2.171463896239443e-03 - 1.402452579700487e-03 - -5.809770596261962e-04 - 6.843115219609125e-02 - 6.848253533455045e-02 - -9.450032592850598e-02 - 8.561294058172238e-04 - 1.771057142348803e-03 - 1.672925271626789e-05 - 1.771057142348803e-03 - 3.531895380512890e-02 - -6.848253533455045e-02 - -5.809770596261962e-04 - -1.667031524313929e-03 - 5.809770596261962e-04 - -1.672925271626789e-05 - -8.561294058172238e-04 - 6.843115219609125e-02 - 1.771057142348803e-03 - 8.561294058172238e-04 - 2.171463896239443e-03 - -1.402452579700487e-03 - 5.809770596261962e-04 - 1.140436299842416e-03 - 4.604105549283176e-05 - -4.732059152899317e-04 - -8.830182089464902e-05 - 1.762396085246188e-05 - 2.179138887699985e-04 - -4.634339865815935e-04 - -6.173609086399110e-04 - 4.465016140720080e-05 - -1.329516780045767e-03 - 4.604105549283176e-05 - 8.830182089464902e-05 - 1.038533186064150e-04 - -8.830182089464902e-05 - -4.634339865815935e-04 - 3.921476992823876e-04 - 4.634339865815935e-04 - 1.140436299842416e-03 - 1.430536785708917e-04 - -1.020134538757355e-04 - -1.762396085246188e-05 - -7.188896116000135e-04 - 9.917403921744496e-05 - -6.173609086399110e-04 - -1.140436299842416e-03 - 4.604105549283176e-05 - -4.732059152899317e-04 - 4.634339865815935e-04 - -6.173609086399110e-04 - 4.465016140720080e-05 - 8.830182089464902e-05 - 1.762396085246188e-05 - 2.179138887699985e-04 - 1.329516780045767e-03 - -4.604105549283176e-05 - -4.634339865815935e-04 - -3.921476992823876e-04 - -4.634339865815935e-04 - 8.830182089464902e-05 - -1.038533186064150e-04 - 8.830182089464902e-05 - -1.140436299842416e-03 - -7.188896116000135e-04 - -9.917403921744496e-05 - 6.173609086399110e-04 - 1.430536785708917e-04 - 1.020134538757355e-04 - 1.762396085246188e-05 - 1.673031588847898e-03 - 2.067732421909400e-03 - -9.845793442069338e-04 - 2.142887467535423e-03 - 9.024137829434160e-04 - -1.137512366579104e-03 - -1.673031588847898e-03 - 2.067732421909400e-03 - -9.845793442069338e-04 - -2.142887467535423e-03 - -9.024137829434160e-04 - 1.137512366579104e-03 - -1.140436299842416e-03 - -4.604105549283176e-05 - -4.732059152899317e-04 - 4.634339865815935e-04 - 6.173609086399110e-04 - 4.465016140720080e-05 - 8.830182089464902e-05 - -1.762396085246188e-05 - 2.179138887699985e-04 - 1.329516780045767e-03 - 4.604105549283176e-05 - 4.634339865815935e-04 - -3.921476992823876e-04 - 4.634339865815935e-04 - -8.830182089464902e-05 - -1.038533186064150e-04 - -8.830182089464902e-05 - -1.140436299842416e-03 - -7.188896116000135e-04 - 9.917403921744496e-05 - 6.173609086399110e-04 - 1.430536785708917e-04 - -1.020134538757355e-04 - 1.762396085246188e-05 - 1.140436299842416e-03 - -4.604105549283176e-05 - -4.732059152899317e-04 - -8.830182089464902e-05 - -1.762396085246188e-05 - 2.179138887699985e-04 - -4.634339865815935e-04 - 6.173609086399110e-04 - 4.465016140720080e-05 - -1.329516780045767e-03 - -4.604105549283176e-05 - -8.830182089464902e-05 - 1.038533186064150e-04 - 8.830182089464902e-05 - 4.634339865815935e-04 - 3.921476992823876e-04 - -4.634339865815935e-04 - 1.140436299842416e-03 - 1.430536785708917e-04 - 1.020134538757355e-04 - -1.762396085246188e-05 - -7.188896116000135e-04 - -9.917403921744496e-05 - -6.173609086399110e-04 - 1.673031588847898e-03 - -2.067732421909400e-03 - -9.845793442069338e-04 - 2.142887467535423e-03 - -9.024137829434160e-04 - -1.137512366579104e-03 - -1.673031588847898e-03 - -2.067732421909400e-03 - -9.845793442069338e-04 - -2.142887467535423e-03 - 9.024137829434160e-04 - 1.137512366579104e-03 - -6.843115219609125e-02 - -9.450032592850598e-02 - -6.848253533455045e-02 - -1.771057142348803e-03 - 8.561294058172238e-04 - 6.848253533455045e-02 - 9.450032592850598e-02 - 6.843115219609125e-02 - -5.809770596261962e-04 - 2.171463896239443e-03 - -1.402452579700487e-03 - -1.771057142348803e-03 - 1.672925271626789e-05 - 1.402452579700487e-03 - -2.171463896239443e-03 - 5.809770596261962e-04 - -1.672925271626789e-05 - 1.771057142348803e-03 - -8.561294058172238e-04 - 1.771057142348803e-03 - -6.843115219609125e-02 - -6.848253533455045e-02 - -1.771057142348803e-03 - 1.672925271626789e-05 - 9.450032592850598e-02 - 6.848253533455045e-02 - 6.843115219609125e-02 - 1.771057142348803e-03 - -1.672925271626789e-05 - -1.771057142348803e-03 - 8.561294058172238e-04 - -2.171463896239443e-03 - 1.402452579700487e-03 - 5.809770596261962e-04 - 2.171463896239443e-03 - -5.809770596261962e-04 - -1.402452579700487e-03 - 1.771057142348803e-03 - -8.561294058172238e-04 - -3.531895380512890e-02 - 8.561294058172238e-04 - -1.672925271626789e-05 - 6.848253533455045e-02 - 6.848253533455045e-02 - 3.531895380512890e-02 - -8.561294058172238e-04 - 1.672925271626789e-05 - -1.672925271626789e-05 - 8.561294058172238e-04 - -5.809770596261962e-04 - -5.809770596261962e-04 - -1.667031524313929e-03 - 1.672925271626789e-05 - -8.561294058172238e-04 - 5.809770596261962e-04 - 5.809770596261962e-04 - 1.667031524313929e-03 - 6.843115219609125e-02 - -9.450032592850598e-02 - -6.848253533455045e-02 - -6.848253533455045e-02 - 9.450032592850598e-02 - 6.843115219609125e-02 - 5.809770596261962e-04 - 2.171463896239443e-03 - -1.402452579700487e-03 - -1.402452579700487e-03 - -2.171463896239443e-03 - 5.809770596261962e-04 - -1.771057142348803e-03 - 1.672925271626789e-05 - 1.672925271626789e-05 - 1.771057142348803e-03 - 8.561294058172238e-04 - 1.771057142348803e-03 - 6.843115219609125e-02 - 6.848253533455045e-02 - 9.450032592850598e-02 - -6.848253533455045e-02 - -6.843115219609125e-02 - 1.771057142348803e-03 - 1.672925271626789e-05 - -2.171463896239443e-03 - -1.402452579700487e-03 - -5.809770596261962e-04 - -1.771057142348803e-03 - -8.561294058172238e-04 - 2.171463896239443e-03 - 5.809770596261962e-04 - 1.402452579700487e-03 - 1.771057142348803e-03 - 8.561294058172238e-04 - 3.531895380512890e-02 - 6.848253533455045e-02 - -6.848253533455045e-02 - -3.531895380512890e-02 - -8.561294058172238e-04 - -1.672925271626789e-05 - -5.809770596261962e-04 - 5.809770596261962e-04 - 1.667031524313929e-03 - -1.672925271626789e-05 - -8.561294058172238e-04 - 1.672925271626789e-05 - 8.561294058172238e-04 - 5.809770596261962e-04 - -5.809770596261962e-04 - -1.667031524313929e-03 - -3.682318452992087e-01 - -4.604105549283176e-05 - -9.845793442069338e-04 - 9.024137829434160e-04 - 4.604105549283176e-05 - -9.845793442069338e-04 - -9.024137829434160e-04 - -4.604105549283176e-05 - -9.845793442069338e-04 - -9.024137829434160e-04 - 4.604105549283176e-05 - -9.845793442069338e-04 - 9.024137829434160e-04 - -6.848253533455045e-02 - 9.450032592850598e-02 - -6.848253533455045e-02 - 6.848253533455045e-02 - 9.450032592850598e-02 - -6.848253533455045e-02 - -2.067732421909400e-03 - -4.732059152899317e-04 - -2.067732421909400e-03 - 2.067732421909400e-03 - -4.732059152899317e-04 - -2.067732421909400e-03 - 9.024137829434160e-04 - -9.845793442069338e-04 - -4.604105549283176e-05 - -9.024137829434160e-04 - -9.845793442069338e-04 - -4.604105549283176e-05 - -2.067732421909400e-03 - -4.732059152899317e-04 - 2.067732421909400e-03 - 2.067732421909400e-03 - -4.732059152899317e-04 - 2.067732421909400e-03 - -9.024137829434160e-04 - -9.845793442069338e-04 - 4.604105549283176e-05 - 9.024137829434160e-04 - -9.845793442069338e-04 - 4.604105549283176e-05 - -4.732059152899317e-04 - -2.067732421909400e-03 - -2.067732421909400e-03 - -4.732059152899317e-04 - 2.067732421909400e-03 - -2.067732421909400e-03 - -4.732059152899317e-04 - -2.067732421909400e-03 - 2.067732421909400e-03 - -4.732059152899317e-04 - 2.067732421909400e-03 - 2.067732421909400e-03 - 9.450032592850598e-02 - -6.848253533455045e-02 - 6.848253533455045e-02 - 9.450032592850598e-02 - 6.848253533455045e-02 - -6.848253533455045e-02 - -9.845793442069338e-04 - -4.604105549283176e-05 - 9.024137829434160e-04 - -9.845793442069338e-04 - 4.604105549283176e-05 - -9.024137829434160e-04 - -9.845793442069338e-04 - 9.024137829434160e-04 - -4.604105549283176e-05 - -9.845793442069338e-04 - -9.024137829434160e-04 - 4.604105549283176e-05 - -9.845793442069338e-04 - -4.604105549283176e-05 - -9.024137829434160e-04 - -9.845793442069338e-04 - 4.604105549283176e-05 - 9.024137829434160e-04 - -9.845793442069338e-04 - -9.024137829434160e-04 - -4.604105549283176e-05 - -9.845793442069338e-04 - 9.024137829434160e-04 - 4.604105549283176e-05 - 1.140436299842416e-03 - -1.673031588847898e-03 - -2.142887467535423e-03 - -1.140436299842416e-03 - -1.673031588847898e-03 - 2.142887467535423e-03 - -1.140436299842416e-03 - 1.673031588847898e-03 - -2.142887467535423e-03 - 1.140436299842416e-03 - 1.673031588847898e-03 - 2.142887467535423e-03 - -6.843115219609125e-02 - 6.843115219609125e-02 - -3.531895380512890e-02 - -6.843115219609125e-02 - -6.843115219609125e-02 - 3.531895380512890e-02 - -1.673031588847898e-03 - 1.140436299842416e-03 - -2.142887467535423e-03 - -1.673031588847898e-03 - -1.140436299842416e-03 - 2.142887467535423e-03 - 1.137512366579104e-03 - 1.137512366579104e-03 - -1.329516780045767e-03 - 1.137512366579104e-03 - -1.137512366579104e-03 - 1.329516780045767e-03 - 1.673031588847898e-03 - -1.140436299842416e-03 - -2.142887467535423e-03 - 1.673031588847898e-03 - 1.140436299842416e-03 - 2.142887467535423e-03 - -1.137512366579104e-03 - 1.137512366579104e-03 - 1.329516780045767e-03 - -1.137512366579104e-03 - -1.137512366579104e-03 - -1.329516780045767e-03 - -1.137512366579104e-03 - -9.845793442069338e-04 - 9.024137829434160e-04 - 1.020134538757355e-04 - 1.430536785708917e-04 - -1.762396085246188e-05 - -1.762396085246188e-05 - 2.179138887699985e-04 - -8.830182089464902e-05 - -9.917403921744496e-05 - -7.188896116000135e-04 - -6.173609086399110e-04 - 6.173609086399110e-04 - 4.465016140720080e-05 - -4.634339865815935e-04 - 1.673031588847898e-03 - 2.067732421909400e-03 - 1.495749160722173e-04 - 1.020134538757355e-04 - -1.020134538757355e-04 - 1.430536785708917e-04 - -8.830182089464902e-05 - 8.830182089464902e-05 - 2.239558091312982e-04 - -9.917403921744496e-05 - 9.917403921744496e-05 - -7.188896116000135e-04 - 4.634339865815935e-04 - -4.634339865815935e-04 - 2.142887467535423e-03 - -1.020134538757355e-04 - -1.762396085246188e-05 - -1.038533186064150e-04 - -1.020134538757355e-04 - 1.762396085246188e-05 - 1.038533186064150e-04 - -9.917403921744496e-05 - 6.173609086399110e-04 - 3.921476992823876e-04 - -9.917403921744496e-05 - -6.173609086399110e-04 - -3.921476992823876e-04 - 1.137512366579104e-03 - -9.845793442069338e-04 - -9.024137829434160e-04 - -5.809770596261962e-04 - 1.771057142348803e-03 - 8.561294058172238e-04 - 9.917403921744496e-05 - -7.188896116000135e-04 - 6.173609086399110e-04 - -6.173609086399110e-04 - 4.465016140720080e-05 - 4.634339865815935e-04 - -1.020134538757355e-04 - 1.430536785708917e-04 - 1.762396085246188e-05 - 1.762396085246188e-05 - 2.179138887699985e-04 - 8.830182089464902e-05 - -1.673031588847898e-03 - 2.067732421909400e-03 - 2.171463896239443e-03 - -1.672925271626789e-05 - -1.672925271626789e-05 - 2.239558091312982e-04 - 9.917403921744496e-05 - 9.917403921744496e-05 - -7.188896116000135e-04 - -4.634339865815935e-04 - -4.634339865815935e-04 - 1.495749160722173e-04 - -1.020134538757355e-04 - -1.020134538757355e-04 - 1.430536785708917e-04 - 8.830182089464902e-05 - 8.830182089464902e-05 - -2.142887467535423e-03 - 1.402452579700487e-03 - 9.917403921744496e-05 - 6.173609086399110e-04 - -3.921476992823876e-04 - 9.917403921744496e-05 - -6.173609086399110e-04 - 3.921476992823876e-04 - 1.020134538757355e-04 - -1.762396085246188e-05 - 1.038533186064150e-04 - 1.020134538757355e-04 - 1.762396085246188e-05 - -1.038533186064150e-04 - -1.137512366579104e-03 - -9.845793442069338e-04 - -9.024137829434160e-04 - 5.809770596261962e-04 - 1.771057142348803e-03 - 8.561294058172238e-04 - -9.917403921744496e-05 - -7.188896116000135e-04 - 6.173609086399110e-04 - 6.173609086399110e-04 - 4.465016140720080e-05 - 4.634339865815935e-04 - 1.020134538757355e-04 - 1.430536785708917e-04 - 1.762396085246188e-05 - -1.762396085246188e-05 - 2.179138887699985e-04 - 8.830182089464902e-05 - 1.673031588847898e-03 - -2.067732421909400e-03 - 2.171463896239443e-03 - 1.672925271626789e-05 - 1.672925271626789e-05 - 2.239558091312982e-04 - -9.917403921744496e-05 - -9.917403921744496e-05 - -7.188896116000135e-04 - 4.634339865815935e-04 - 4.634339865815935e-04 - 1.495749160722173e-04 - 1.020134538757355e-04 - 1.020134538757355e-04 - 1.430536785708917e-04 - -8.830182089464902e-05 - -8.830182089464902e-05 - 2.142887467535423e-03 - 1.402452579700487e-03 - 9.917403921744496e-05 - -6.173609086399110e-04 - 3.921476992823876e-04 - 9.917403921744496e-05 - 6.173609086399110e-04 - -3.921476992823876e-04 - 1.020134538757355e-04 - 1.762396085246188e-05 - -1.038533186064150e-04 - 1.020134538757355e-04 - -1.762396085246188e-05 - 1.038533186064150e-04 - 1.137512366579104e-03 - -9.845793442069338e-04 - 9.024137829434160e-04 - -1.020134538757355e-04 - 1.430536785708917e-04 - -1.762396085246188e-05 - 1.762396085246188e-05 - 2.179138887699985e-04 - -8.830182089464902e-05 - 9.917403921744496e-05 - -7.188896116000135e-04 - -6.173609086399110e-04 - -6.173609086399110e-04 - 4.465016140720080e-05 - -4.634339865815935e-04 - -1.673031588847898e-03 - -2.067732421909400e-03 - 1.495749160722173e-04 - -1.020134538757355e-04 - 1.020134538757355e-04 - 1.430536785708917e-04 - 8.830182089464902e-05 - -8.830182089464902e-05 - 2.239558091312982e-04 - 9.917403921744496e-05 - -9.917403921744496e-05 - -7.188896116000135e-04 - -4.634339865815935e-04 - 4.634339865815935e-04 - -2.142887467535423e-03 - -1.020134538757355e-04 - 1.762396085246188e-05 - 1.038533186064150e-04 - -1.020134538757355e-04 - -1.762396085246188e-05 - -1.038533186064150e-04 - -9.917403921744496e-05 - -6.173609086399110e-04 - -3.921476992823876e-04 - -9.917403921744496e-05 - 6.173609086399110e-04 - 3.921476992823876e-04 - 6.843115219609125e-02 - -9.450032592850598e-02 - 6.848253533455045e-02 - -1.771057142348803e-03 - -8.561294058172238e-04 - 1.672925271626789e-05 - 1.771057142348803e-03 - 8.561294058172238e-04 - 1.771057142348803e-03 - 6.843115219609125e-02 - -6.848253533455045e-02 - -1.771057142348803e-03 - 1.672925271626789e-05 - 2.171463896239443e-03 - 5.809770596261962e-04 - -1.402452579700487e-03 - 1.771057142348803e-03 - 8.561294058172238e-04 - 3.531895380512890e-02 - -8.561294058172238e-04 - -1.672925271626789e-05 - -1.672925271626789e-05 - -8.561294058172238e-04 - -5.809770596261962e-04 - 5.809770596261962e-04 - -1.667031524313929e-03 - -6.843115219609125e-02 - -9.450032592850598e-02 - 6.848253533455045e-02 - -1.672925271626789e-05 - 1.771057142348803e-03 - -8.561294058172238e-04 - 1.771057142348803e-03 - -6.843115219609125e-02 - 6.848253533455045e-02 - 2.171463896239443e-03 - -5.809770596261962e-04 - 1.402452579700487e-03 - 1.771057142348803e-03 - -8.561294058172238e-04 - -3.531895380512890e-02 - -1.672925271626789e-05 - 8.561294058172238e-04 - -5.809770596261962e-04 - -5.809770596261962e-04 - 1.667031524313929e-03 - 1.673031588847898e-03 - -9.845793442069338e-04 - 2.067732421909400e-03 - -8.830182089464902e-05 - 1.430536785708917e-04 - 8.830182089464902e-05 - 4.634339865815935e-04 - -7.188896116000135e-04 - -4.634339865815935e-04 - -1.137512366579104e-03 - 9.024137829434160e-04 - 2.179138887699985e-04 - -1.762396085246188e-05 - -8.830182089464902e-05 - 4.465016140720080e-05 - 6.173609086399110e-04 - -4.634339865815935e-04 - 2.142887467535423e-03 - 1.762396085246188e-05 - -1.020134538757355e-04 - 1.038533186064150e-04 - -6.173609086399110e-04 - -9.917403921744496e-05 - -3.921476992823876e-04 - -1.673031588847898e-03 - -9.845793442069338e-04 - 2.067732421909400e-03 - -4.634339865815935e-04 - -7.188896116000135e-04 - -4.634339865815935e-04 - 8.830182089464902e-05 - 1.430536785708917e-04 - 8.830182089464902e-05 - 1.137512366579104e-03 - -9.024137829434160e-04 - 4.465016140720080e-05 - -6.173609086399110e-04 - 4.634339865815935e-04 - 2.179138887699985e-04 - 1.762396085246188e-05 - 8.830182089464902e-05 - -2.142887467535423e-03 - -6.173609086399110e-04 - 9.917403921744496e-05 - 3.921476992823876e-04 - 1.762396085246188e-05 - 1.020134538757355e-04 - -1.038533186064150e-04 - 1.140436299842416e-03 - -4.732059152899317e-04 - 4.604105549283176e-05 - 1.140436299842416e-03 - 4.604105549283176e-05 - -1.329516780045767e-03 - -1.140436299842416e-03 - -4.732059152899317e-04 - 4.604105549283176e-05 - -1.140436299842416e-03 - -4.604105549283176e-05 - 1.329516780045767e-03 - 1.673031588847898e-03 - -9.845793442069338e-04 - -2.067732421909400e-03 - 4.634339865815935e-04 - -7.188896116000135e-04 - 4.634339865815935e-04 - -8.830182089464902e-05 - 1.430536785708917e-04 - -8.830182089464902e-05 - -1.137512366579104e-03 - -9.024137829434160e-04 - 4.465016140720080e-05 - 6.173609086399110e-04 - 4.634339865815935e-04 - 2.179138887699985e-04 - -1.762396085246188e-05 - 8.830182089464902e-05 - 2.142887467535423e-03 - 6.173609086399110e-04 - 9.917403921744496e-05 - -3.921476992823876e-04 - -1.762396085246188e-05 - 1.020134538757355e-04 - 1.038533186064150e-04 - -1.673031588847898e-03 - -9.845793442069338e-04 - -2.067732421909400e-03 - 8.830182089464902e-05 - 1.430536785708917e-04 - -8.830182089464902e-05 - -4.634339865815935e-04 - -7.188896116000135e-04 - 4.634339865815935e-04 - 1.137512366579104e-03 - 9.024137829434160e-04 - 2.179138887699985e-04 - 1.762396085246188e-05 - -8.830182089464902e-05 - 4.465016140720080e-05 - -6.173609086399110e-04 - -4.634339865815935e-04 - -2.142887467535423e-03 - -1.762396085246188e-05 - -1.020134538757355e-04 - -1.038533186064150e-04 - 6.173609086399110e-04 - -9.917403921744496e-05 - 3.921476992823876e-04 - -1.140436299842416e-03 - -4.732059152899317e-04 - -4.604105549283176e-05 - -1.140436299842416e-03 - 4.604105549283176e-05 - 1.329516780045767e-03 - 1.140436299842416e-03 - -4.732059152899317e-04 - -4.604105549283176e-05 - 1.140436299842416e-03 - -4.604105549283176e-05 - -1.329516780045767e-03 - - - diff --git a/example/Si/reference/si222_cubic.xml.bz2 b/example/Si/reference/si222_cubic.xml.bz2 new file mode 100644 index 00000000..43961540 Binary files /dev/null and b/example/Si/reference/si222_cubic.xml.bz2 differ diff --git a/example/Si_LAMMPS/in.sw b/example/Si_LAMMPS/in.sw index 63d1e028..b416d748 100644 --- a/example/Si_LAMMPS/in.sw +++ b/example/Si_LAMMPS/in.sw @@ -7,9 +7,7 @@ read_data tmp.lammps pair_style sw pair_coeff * * Si.sw Si -dump 1 all custom 1 FORCE fx fy fz -dump 2 all custom 1 COORD xu yu zu +dump 1 all custom 1 XFSET id xu yu zu fx fy fz dump_modify 1 format float "%20.15f" -dump_modify 2 format float "%20.15f" run 0 diff --git a/example/Si_LAMMPS/run_all.sh b/example/Si_LAMMPS/run_all.sh index f36c28c5..2f983906 100644 --- a/example/Si_LAMMPS/run_all.sh +++ b/example/Si_LAMMPS/run_all.sh @@ -1,8 +1,10 @@ #!/bin/bash -# Binaries - -LAMMPS=${HOME}/src/lammps/src/lmp_serial +# Please modify the following paths appropriately +#export LD_LIBRARY_PATH=/Users/tadano/src/spglib/lib/:$LD_LIBRARY_PATH +# Binaries +#LAMMPS=${HOME}/src/lammps/src/lmp_serial +LAMMPS=/usr/local/bin/lmp ALAMODE_ROOT=${HOME}/Work/alamode/ # Generate displacement patterns @@ -117,8 +119,7 @@ for ((i=1; i<=1; i++)) do cp harm${i}.lammps tmp.lammps $LAMMPS < in.sw >> run.log - mv COORD COORD.harm${i} - mv FORCE FORCE.harm${i} + mv XFSET XFSET.harm${i} done for ((i=1; i<=20; i++)) @@ -126,15 +127,12 @@ do suffix=`echo ${i} | awk '{printf("%02d", $1)}'` cp cubic${suffix}.lammps tmp.lammps $LAMMPS < in.sw >> run.log - mv COORD COORD.cubic${suffix} - mv FORCE FORCE.cubic${suffix} + mv XFSET XFSET.cubic${suffix} done # Collect data -python ${ALAMODE_ROOT}/tools/extract.py --LAMMPS ../Si222.lammps --get disp COORD.harm* > disp_harm.dat -python ${ALAMODE_ROOT}/tools/extract.py --LAMMPS ../Si222.lammps --get force FORCE.harm* > force_harm.dat -python ${ALAMODE_ROOT}/tools/extract.py --LAMMPS ../Si222.lammps --get disp COORD.cubic* > disp_cubic.dat -python ${ALAMODE_ROOT}/tools/extract.py --LAMMPS ../Si222.lammps --get force FORCE.cubic* > force_cubic.dat +python ${ALAMODE_ROOT}/tools/extract.py --LAMMPS ../Si222.lammps XFSET.harm* > DFSET_harmonic +python ${ALAMODE_ROOT}/tools/extract.py --LAMMPS ../Si222.lammps XFSET.cubic* > DFSET_cubic cd ../ @@ -142,15 +140,13 @@ cd ../ cat << EOF > si_alm1.in &general PREFIX = si222_harm - MODE = fitting + MODE = optimize NAT = 64; NKD = 1 KD = Si / -&fitting - NDATA = 1 - DFILE = displace/disp_harm.dat - FFILE = displace/force_harm.dat +&optimize + DFSET = displace/DFSET_harmonic / &interaction @@ -243,15 +239,13 @@ ${ALAMODE_ROOT}/alm/alm si_alm1.in >> alm.log cat << EOF > si_alm2.in &general PREFIX = si222_cubic - MODE = fitting + MODE = optimize NAT = 64; NKD = 1 KD = Si / -&fitting - NDATA = 20 - DFILE = displace/disp_cubic.dat - FFILE = displace/force_cubic.dat +&optimize + DFSET = displace/DFSET_cubic FC2XML = si222_harm.xml / @@ -395,4 +389,4 @@ cat << EOF > RTA.in EOF -mpirun -np 4 ${ALAMODE_ROOT}/anphon/anphon RTA.in > RTA.log +mpirun -np 1 ${ALAMODE_ROOT}/anphon/anphon RTA.in > RTA.log diff --git a/example/Si_OpenMX/.log1 b/example/Si_OpenMX/.log1 new file mode 100644 index 00000000..f83f2e3a --- /dev/null +++ b/example/Si_OpenMX/.log1 @@ -0,0 +1,341 @@ + +-----------------------------------------------------------------+ + + Program ALM + + + Ver. 0.9.8 + + +-----------------------------------------------------------------+ + + Number of OpenMP threads = 24 + + Job started at Sun Jan 28 15:05:03 2018 + + + Input variables: + ------------------------------------------------------------------- + General: + PREFIX = si222 + MODE = fitting + NAT = 64; NKD = 1 + NSYM = 0; PRINTSYM = 0; TOLERANCE = 1e-06 + KD = Si + PERIODIC = 1 1 1 + MAGMOM = + HESSIAN = 0 + + Interaction: + NORDER = 1 + NBODY = 2 + + Fitting: + DFILE = disp.dat + FFILE = force.dat + NDATA = 1; NSTART = 1; NEND = 1; NSKIP = 0 + NBOOT = 0 + MULTDAT = 1 + ICONST = 1 + ROTAXIS = + FC2XML = + FC3XML = + + ------------------------------------------------------------------- + + SYSTEM + ====== + + Lattice Vector + 2.040600e+01 0.000000e+00 0.000000e+00 : a1 + 0.000000e+00 2.040600e+01 0.000000e+00 : a2 + 0.000000e+00 0.000000e+00 2.040600e+01 : a3 + + Cell volume = 8.497157e+03 (a.u)^3 + + Reciprocal Lattice Vector + 3.079087e-01 0.000000e+00 0.000000e+00 : b1 + 0.000000e+00 3.079087e-01 0.000000e+00 : b2 + 0.000000e+00 0.000000e+00 3.079087e-01 : b3 + + Atomic species: + 1 Si + + Atomic positions in fractional basis and atomic species + 1 0.000000e+00 0.000000e+00 0.000000e+00 1 + 2 0.000000e+00 0.000000e+00 5.000000e-01 1 + 3 0.000000e+00 2.500000e-01 2.500000e-01 1 + 4 0.000000e+00 2.500000e-01 7.500000e-01 1 + 5 0.000000e+00 5.000000e-01 0.000000e+00 1 + 6 0.000000e+00 5.000000e-01 5.000000e-01 1 + 7 0.000000e+00 7.500000e-01 2.500000e-01 1 + 8 0.000000e+00 7.500000e-01 7.500000e-01 1 + 9 1.250000e-01 1.250000e-01 1.250000e-01 1 + 10 1.250000e-01 1.250000e-01 6.250000e-01 1 + 11 1.250000e-01 3.750000e-01 3.750000e-01 1 + 12 1.250000e-01 3.750000e-01 8.750000e-01 1 + 13 1.250000e-01 6.250000e-01 1.250000e-01 1 + 14 1.250000e-01 6.250000e-01 6.250000e-01 1 + 15 1.250000e-01 8.750000e-01 3.750000e-01 1 + 16 1.250000e-01 8.750000e-01 8.750000e-01 1 + 17 2.500000e-01 0.000000e+00 2.500000e-01 1 + 18 2.500000e-01 0.000000e+00 7.500000e-01 1 + 19 2.500000e-01 2.500000e-01 0.000000e+00 1 + 20 2.500000e-01 2.500000e-01 5.000000e-01 1 + 21 2.500000e-01 5.000000e-01 2.500000e-01 1 + 22 2.500000e-01 5.000000e-01 7.500000e-01 1 + 23 2.500000e-01 7.500000e-01 0.000000e+00 1 + 24 2.500000e-01 7.500000e-01 5.000000e-01 1 + 25 3.750000e-01 1.250000e-01 3.750000e-01 1 + 26 3.750000e-01 1.250000e-01 8.750000e-01 1 + 27 3.750000e-01 3.750000e-01 1.250000e-01 1 + 28 3.750000e-01 3.750000e-01 6.250000e-01 1 + 29 3.750000e-01 6.250000e-01 3.750000e-01 1 + 30 3.750000e-01 6.250000e-01 8.750000e-01 1 + 31 3.750000e-01 8.750000e-01 1.250000e-01 1 + 32 3.750000e-01 8.750000e-01 6.250000e-01 1 + 33 5.000000e-01 0.000000e+00 0.000000e+00 1 + 34 5.000000e-01 0.000000e+00 5.000000e-01 1 + 35 5.000000e-01 2.500000e-01 2.500000e-01 1 + 36 5.000000e-01 2.500000e-01 7.500000e-01 1 + 37 5.000000e-01 5.000000e-01 0.000000e+00 1 + 38 5.000000e-01 5.000000e-01 5.000000e-01 1 + 39 5.000000e-01 7.500000e-01 2.500000e-01 1 + 40 5.000000e-01 7.500000e-01 7.500000e-01 1 + 41 6.250000e-01 1.250000e-01 1.250000e-01 1 + 42 6.250000e-01 1.250000e-01 6.250000e-01 1 + 43 6.250000e-01 3.750000e-01 3.750000e-01 1 + 44 6.250000e-01 3.750000e-01 8.750000e-01 1 + 45 6.250000e-01 6.250000e-01 1.250000e-01 1 + 46 6.250000e-01 6.250000e-01 6.250000e-01 1 + 47 6.250000e-01 8.750000e-01 3.750000e-01 1 + 48 6.250000e-01 8.750000e-01 8.750000e-01 1 + 49 7.500000e-01 0.000000e+00 2.500000e-01 1 + 50 7.500000e-01 0.000000e+00 7.500000e-01 1 + 51 7.500000e-01 2.500000e-01 0.000000e+00 1 + 52 7.500000e-01 2.500000e-01 5.000000e-01 1 + 53 7.500000e-01 5.000000e-01 2.500000e-01 1 + 54 7.500000e-01 5.000000e-01 7.500000e-01 1 + 55 7.500000e-01 7.500000e-01 0.000000e+00 1 + 56 7.500000e-01 7.500000e-01 5.000000e-01 1 + 57 8.750000e-01 1.250000e-01 3.750000e-01 1 + 58 8.750000e-01 1.250000e-01 8.750000e-01 1 + 59 8.750000e-01 3.750000e-01 1.250000e-01 1 + 60 8.750000e-01 3.750000e-01 6.250000e-01 1 + 61 8.750000e-01 6.250000e-01 3.750000e-01 1 + 62 8.750000e-01 6.250000e-01 8.750000e-01 1 + 63 8.750000e-01 8.750000e-01 1.250000e-01 1 + 64 8.750000e-01 8.750000e-01 6.250000e-01 1 + + + Time Elapsed: 0.002763 sec. + + ------------------------------------------------------------------- + + SYMMETRY + ======== + + NSYM = 0 : Trying to find symmetry operations. + Please be patient. + This can take a while for a large supercell. + + Number of symmetry operations = 1536 + All symmetry operations will be used to + reduce the number of force constants. + + Given system is not primitive cell. + There are 32 translation operations. + Primitive cell contains 2 atoms + + **Cell-Atom Correspondens Below** + CELL | ATOM + 1 | 1 9 + 2 | 2 10 + 3 | 3 11 + 4 | 4 12 + 5 | 5 13 + 6 | 6 14 + 7 | 7 15 + 8 | 8 16 + 9 | 17 25 + 10 | 18 26 + 11 | 19 27 + 12 | 20 28 + 13 | 21 29 + 14 | 22 30 + 15 | 23 31 + 16 | 24 32 + 17 | 33 41 + 18 | 34 42 + 19 | 35 43 + 20 | 36 44 + 21 | 37 45 + 22 | 38 46 + 23 | 39 47 + 24 | 40 48 + 25 | 49 57 + 26 | 50 58 + 27 | 51 59 + 28 | 52 60 + 29 | 53 61 + 30 | 54 62 + 31 | 55 63 + 32 | 56 64 + + Time Elapsed: 0.241446 sec. + + ------------------------------------------------------------------- + + INTERACTION + =========== + + +++ Cutoff Radii Matrix in Bohr Unit (NKD x NKD matrix) +++ + HARMONIC + None + + + List of neighboring atoms below. + Format [N th-nearest shell, distance in Bohr (Number of atoms on the shell)] + + 1 ( Si): 1 4.41803 ( 4) - 9( Si) 16( Si) 58( Si) 63( Si) + 2 7.21461 ( 12) - 3( Si) 4( Si) 7( Si) 8( Si) + 17( Si) 18( Si) 19( Si) 23( Si) + 49( Si) 50( Si) 51( Si) 55( Si) + 3 8.45988 ( 12) - 10( Si) 12( Si) 13( Si) 15( Si) + 26( Si) 31( Si) 41( Si) 48( Si) + 57( Si) 59( Si) 62( Si) 64( Si) + 4 10.203 ( 3) - 2( Si) 5( Si) 33( Si) + 5 11.1185 ( 12) - 11( Si) 14( Si) 25( Si) 27( Si) + 30( Si) 32( Si) 42( Si) 44( Si) + 45( Si) 47( Si) 60( Si) 61( Si) + 6 12.4961 ( 12) - 20( Si) 21( Si) 22( Si) 24( Si) + 35( Si) 36( Si) 39( Si) 40( Si) + 52( Si) 53( Si) 54( Si) 56( Si) + 7 13.2541 ( 4) - 28( Si) 29( Si) 43( Si) 46( Si) + 8 14.4292 ( 3) - 6( Si) 34( Si) 37( Si) + 9 17.6721 ( 1) - 38( Si) + + 9 ( Si): 1 4.41803 ( 4) - 1( Si) 3( Si) 17( Si) 19( Si) + 2 7.21461 ( 12) - 11( Si) 12( Si) 15( Si) 16( Si) + 25( Si) 26( Si) 27( Si) 31( Si) + 57( Si) 58( Si) 59( Si) 63( Si) + 3 8.45988 ( 12) - 2( Si) 4( Si) 5( Si) 7( Si) + 18( Si) 20( Si) 21( Si) 23( Si) + 33( Si) 35( Si) 49( Si) 51( Si) + 4 10.203 ( 3) - 10( Si) 13( Si) 41( Si) + 5 11.1185 ( 12) - 6( Si) 8( Si) 22( Si) 24( Si) + 34( Si) 36( Si) 37( Si) 39( Si) + 50( Si) 52( Si) 53( Si) 55( Si) + 6 12.4961 ( 12) - 28( Si) 29( Si) 30( Si) 32( Si) + 43( Si) 44( Si) 47( Si) 48( Si) + 60( Si) 61( Si) 62( Si) 64( Si) + 7 13.2541 ( 4) - 38( Si) 40( Si) 54( Si) 56( Si) + 8 14.4292 ( 3) - 14( Si) 42( Si) 45( Si) + 9 17.6721 ( 1) - 46( Si) + + + List of interacting atom pairs considered for each order: + + ***HARMONIC*** + Atom 1( Si) interacts with atoms ... + 1( Si) 2( Si) 3( Si) 4( Si) 5( Si) 6( Si) + 7( Si) 8( Si) 9( Si) 10( Si) 11( Si) 12( Si) + 13( Si) 14( Si) 15( Si) 16( Si) 17( Si) 18( Si) + 19( Si) 20( Si) 21( Si) 22( Si) 23( Si) 24( Si) + 25( Si) 26( Si) 27( Si) 28( Si) 29( Si) 30( Si) + 31( Si) 32( Si) 33( Si) 34( Si) 35( Si) 36( Si) + 37( Si) 38( Si) 39( Si) 40( Si) 41( Si) 42( Si) + 43( Si) 44( Si) 45( Si) 46( Si) 47( Si) 48( Si) + 49( Si) 50( Si) 51( Si) 52( Si) 53( Si) 54( Si) + 55( Si) 56( Si) 57( Si) 58( Si) 59( Si) 60( Si) + 61( Si) 62( Si) 63( Si) 64( Si) + + Number of total interaction pairs = 64 + + Atom 9( Si) interacts with atoms ... + 1( Si) 2( Si) 3( Si) 4( Si) 5( Si) 6( Si) + 7( Si) 8( Si) 9( Si) 10( Si) 11( Si) 12( Si) + 13( Si) 14( Si) 15( Si) 16( Si) 17( Si) 18( Si) + 19( Si) 20( Si) 21( Si) 22( Si) 23( Si) 24( Si) + 25( Si) 26( Si) 27( Si) 28( Si) 29( Si) 30( Si) + 31( Si) 32( Si) 33( Si) 34( Si) 35( Si) 36( Si) + 37( Si) 38( Si) 39( Si) 40( Si) 41( Si) 42( Si) + 43( Si) 44( Si) 45( Si) 46( Si) 47( Si) 48( Si) + 49( Si) 50( Si) 51( Si) 52( Si) 53( Si) 54( Si) + 55( Si) 56( Si) 57( Si) 58( Si) 59( Si) 60( Si) + 61( Si) 62( Si) 63( Si) 64( Si) + + Number of total interaction pairs = 64 + + + Time Elapsed: 0.262379 sec. + + ------------------------------------------------------------------- + + FORCE CONSTANT + ============== + + Finding symmetrically-independent force constants ... + HARMONIC ... done. + Finished! + + Number of HARMONIC FCs : 26 + + Time Elapsed: 0.266459 sec. + + ------------------------------------------------------------------- + + CONSTRAINT + ========== + + ICONST = 1: Constraints for translational invariance + will be considered. + + Generating constraints for translational invariance ... + HARMONIC ... done. + Finished ! + + Number of constraints [T-inv, R-inv (self), R-inv (cross)]: + HARMONIC 1 0 0 + + Constraints of T-inv and R-inv (self) are merged. + If there are redundant constraints, they are removed in this process. + + Number of inequivalent constraints (self, cross) : + HARMONIC 1 0 + + Total number of constraints = 1 + + Time Elapsed: 0.268462 sec. + + ------------------------------------------------------------------- + + FITTING + ======= + + Reference files + Displacement: disp.dat + Force : force.dat + + NSTART = 1; NEND = 1 + 1 entries will be used for fitting. + + MULTDAT = 1: Generate symmetrically equivalent displacement-force + data sets by using pure translational operations only. + + Total Number of Parameters : 26 + + Calculation of matrix elements for direct fitting started ... done! + + Entering fitting routine: QRD with constraints + QR-Decomposition has started ... finished. + + Residual sum of squares for the solution: 0.000120649 + Fitting error (%) : 0.958618 + + Time Elapsed: 0.421723 sec. + + ------------------------------------------------------------------- + + The following files are created: + + Force constants in a human-readable format : si222.fcs + Input data for the phonon code ANPHON : si222.xml + + + Job finished at Sun Jan 28 15:05:03 2018 + diff --git a/example/Si_OpenMX/reference/DFSET_cubic b/example/Si_OpenMX/reference/DFSET_cubic new file mode 100644 index 00000000..fd33d407 --- /dev/null +++ b/example/Si_OpenMX/reference/DFSET_cubic @@ -0,0 +1,1280 @@ + 0.0755890 0.0000000 0.0000000 -2.13607813E-02 2.00000000E-11 2.20000000E-11 + 0.0000000 0.0000000 0.0000000 7.36635520E-05 2.60000000E-11 6.00000000E-12 + 0.0000000 0.0000000 0.0000000 -7.02636308E-04 -1.66019370E-04 -1.66509426E-04 + 0.0000000 0.0000000 0.0000000 -6.95712144E-04 1.58154726E-04 -1.58644818E-04 + 0.0000000 0.0000000 0.0000000 7.31068460E-05 5.20000000E-11 2.80000000E-11 + 0.0000000 0.0000000 0.0000000 -6.35802652E-04 -2.80000000E-11 -2.00000000E-12 + 0.0000000 0.0000000 0.0000000 -6.95712134E-04 -1.58154750E-04 1.58644796E-04 + 0.0000000 0.0000000 0.0000000 -7.02636264E-04 1.66019336E-04 1.66509416E-04 + 0.0000000 0.0000000 0.0000000 5.32742255E-03 3.81918051E-03 3.81960644E-03 + 0.0000000 0.0000000 0.0000000 -8.26704300E-05 6.37980460E-05 5.66068920E-05 + 0.0000000 0.0000000 0.0000000 3.40670782E-04 -3.74351040E-05 -3.75476740E-05 + 0.0000000 0.0000000 0.0000000 -8.27891540E-05 -5.67195020E-05 -6.33714240E-05 + 0.0000000 0.0000000 0.0000000 -8.27891620E-05 5.67194960E-05 6.33714300E-05 + 0.0000000 0.0000000 0.0000000 3.40670804E-04 3.74351360E-05 3.75477100E-05 + 0.0000000 0.0000000 0.0000000 -8.26704260E-05 -6.37981260E-05 -5.66068660E-05 + 0.0000000 0.0000000 0.0000000 5.32742257E-03 -3.81918052E-03 -3.81960654E-03 + 0.0000000 0.0000000 0.0000000 3.08544482E-04 1.66103764E-04 3.01489106E-04 + 0.0000000 0.0000000 0.0000000 3.08544386E-04 -1.66103706E-04 -3.01489106E-04 + 0.0000000 0.0000000 0.0000000 3.08594362E-04 3.01711948E-04 1.66889638E-04 + 0.0000000 0.0000000 0.0000000 5.54829820E-05 -1.00357282E-04 1.34426040E-05 + 0.0000000 0.0000000 0.0000000 5.55328900E-05 1.34678560E-05 -1.00134420E-04 + 0.0000000 0.0000000 0.0000000 5.55328900E-05 -1.34678260E-05 1.00134422E-04 + 0.0000000 0.0000000 0.0000000 3.08594332E-04 -3.01711942E-04 -1.66889570E-04 + 0.0000000 0.0000000 0.0000000 5.54829180E-05 1.00357288E-04 -1.34425460E-05 + 0.0000000 0.0000000 0.0000000 3.94974120E-05 -3.92322160E-05 3.33892080E-05 + 0.0000000 0.0000000 0.0000000 -1.62609760E-05 -5.46179480E-05 5.49069840E-05 + 0.0000000 0.0000000 0.0000000 3.93825540E-05 3.33945200E-05 -3.89431780E-05 + 0.0000000 0.0000000 0.0000000 -2.60768620E-05 4.02778100E-05 -4.02831420E-05 + 0.0000000 0.0000000 0.0000000 -2.60768920E-05 -4.02778080E-05 4.02831440E-05 + 0.0000000 0.0000000 0.0000000 3.93825460E-05 -3.33945880E-05 3.89432340E-05 + 0.0000000 0.0000000 0.0000000 -1.62609700E-05 5.46179180E-05 -5.49069220E-05 + 0.0000000 0.0000000 0.0000000 3.94974580E-05 3.92321160E-05 -3.33892080E-05 + 0.0000000 0.0000000 0.0000000 3.37930880E-05 5.00000000E-11 1.00000000E-11 + 0.0000000 0.0000000 0.0000000 -9.97325600E-06 1.00000000E-11 -2.00000000E-11 + 0.0000000 0.0000000 0.0000000 -5.53273000E-06 -1.31442500E-05 -1.31421500E-05 + 0.0000000 0.0000000 0.0000000 -3.77152800E-06 1.36014100E-05 -1.35993780E-05 + 0.0000000 0.0000000 0.0000000 -9.11717800E-06 1.60000000E-11 -9.20000000E-11 + 0.0000000 0.0000000 0.0000000 3.24788340E-05 4.80000000E-11 2.00000000E-12 + 0.0000000 0.0000000 0.0000000 -3.77153600E-06 -1.36013540E-05 1.35993000E-05 + 0.0000000 0.0000000 0.0000000 -5.53270400E-06 1.31442680E-05 1.31420880E-05 + 0.0000000 0.0000000 0.0000000 -1.73903460E-05 5.56244640E-05 5.58987100E-05 + 0.0000000 0.0000000 0.0000000 3.61120040E-05 3.53731380E-05 3.07523600E-05 + 0.0000000 0.0000000 0.0000000 -2.61146240E-05 -4.10306900E-05 -4.10230720E-05 + 0.0000000 0.0000000 0.0000000 3.59876380E-05 -3.07446960E-05 -3.50989820E-05 + 0.0000000 0.0000000 0.0000000 3.59876800E-05 3.07447300E-05 3.50990740E-05 + 0.0000000 0.0000000 0.0000000 -2.61146280E-05 4.10306460E-05 4.10230800E-05 + 0.0000000 0.0000000 0.0000000 3.61119000E-05 -3.53732080E-05 -3.07523180E-05 + 0.0000000 0.0000000 0.0000000 -1.73903800E-05 -5.56245160E-05 -5.58986380E-05 + 0.0000000 0.0000000 0.0000000 2.98234016E-04 1.57842706E-04 -2.93477450E-04 + 0.0000000 0.0000000 0.0000000 2.98233988E-04 -1.57842566E-04 2.93477418E-04 + 0.0000000 0.0000000 0.0000000 2.98278574E-04 -2.93668592E-04 1.58620876E-04 + 0.0000000 0.0000000 0.0000000 5.53105040E-05 1.01451278E-04 1.33844100E-05 + 0.0000000 0.0000000 0.0000000 5.53550520E-05 1.34049160E-05 1.01260120E-04 + 0.0000000 0.0000000 0.0000000 5.53550280E-05 -1.34049080E-05 -1.01260150E-04 + 0.0000000 0.0000000 0.0000000 2.98278608E-04 2.93668602E-04 -1.58620922E-04 + 0.0000000 0.0000000 0.0000000 5.53105920E-05 -1.01451244E-04 -1.33844720E-05 + 0.0000000 0.0000000 0.0000000 -7.96349920E-05 -6.61120840E-05 5.38956880E-05 + 0.0000000 0.0000000 0.0000000 5.12760198E-03 -3.43644800E-03 3.43690595E-03 + 0.0000000 0.0000000 0.0000000 -7.97274920E-05 5.40076360E-05 -6.56537580E-05 + 0.0000000 0.0000000 0.0000000 3.35616462E-04 3.65646040E-05 -3.66765220E-05 + 0.0000000 0.0000000 0.0000000 3.35616448E-04 -3.65645040E-05 3.66765340E-05 + 0.0000000 0.0000000 0.0000000 -7.97274480E-05 -5.40076760E-05 6.56537820E-05 + 0.0000000 0.0000000 0.0000000 5.12760194E-03 3.43644792E-03 -3.43690598E-03 + 0.0000000 0.0000000 0.0000000 -7.96350000E-05 6.61119840E-05 -5.38957360E-05 + 0.0755890 0.0755890 0.0000000 -2.14139492E-02 -2.14139493E-02 -2.07146390E-03 + 0.0000000 0.0000000 0.0000000 7.35688300E-05 7.35687920E-05 1.16824800E-06 + 0.0000000 0.0000000 0.0000000 -5.36191262E-04 1.47386272E-04 1.29507510E-04 + 0.0000000 0.0000000 0.0000000 -8.62084708E-04 4.61973182E-04 -4.65366758E-04 + 0.0000000 0.0000000 0.0000000 7.30158160E-05 3.38330600E-05 1.72459600E-06 + 0.0000000 0.0000000 0.0000000 -6.35460156E-04 -9.90487200E-06 -8.37680000E-08 + 0.0000000 0.0000000 0.0000000 -5.37133558E-04 1.36498836E-04 -1.40514872E-04 + 0.0000000 0.0000000 0.0000000 -8.60323344E-04 4.68201398E-04 4.54377292E-04 + 0.0000000 0.0000000 0.0000000 9.55900905E-03 9.55900889E-03 8.22169652E-03 + 0.0000000 0.0000000 0.0000000 -1.50099060E-05 -1.50098500E-05 1.10327350E-04 + 0.0000000 0.0000000 0.0000000 3.01009428E-04 2.05328800E-06 -5.78215800E-06 + 0.0000000 0.0000000 0.0000000 -1.38605482E-04 -7.28213200E-05 -8.60929400E-06 + 0.0000000 0.0000000 0.0000000 -2.59321100E-05 3.92203580E-05 1.19095544E-04 + 0.0000000 0.0000000 0.0000000 3.75885594E-04 7.35008080E-05 6.67216080E-05 + 0.0000000 0.0000000 0.0000000 -1.52575778E-04 -1.39513984E-04 -5.52452000E-06 + 0.0000000 0.0000000 0.0000000 1.50773245E-03 1.70691666E-03 1.49920734E-04 + 0.0000000 0.0000000 0.0000000 1.47386182E-04 -5.36191084E-04 1.29507486E-04 + 0.0000000 0.0000000 0.0000000 4.61973278E-04 -8.62084582E-04 -4.65366784E-04 + 0.0000000 0.0000000 0.0000000 6.22063500E-04 6.22063560E-04 3.33419366E-04 + 0.0000000 0.0000000 0.0000000 -4.54792660E-05 -4.54794020E-05 2.66728300E-05 + 0.0000000 0.0000000 0.0000000 4.12667920E-05 7.71558800E-06 -1.13320748E-04 + 0.0000000 0.0000000 0.0000000 7.02493480E-05 -1.74811720E-05 8.63254160E-05 + 0.0000000 0.0000000 0.0000000 2.76910000E-06 8.59154600E-06 -7.29178600E-06 + 0.0000000 0.0000000 0.0000000 1.57687672E-04 1.55059530E-04 -3.10758000E-07 + 0.0000000 0.0000000 0.0000000 2.05323800E-06 3.01009268E-04 -5.78218600E-06 + 0.0000000 0.0000000 0.0000000 -7.28213440E-05 -1.38605564E-04 -8.60931400E-06 + 0.0000000 0.0000000 0.0000000 7.57073580E-05 7.57073420E-05 -7.77712280E-05 + 0.0000000 0.0000000 0.0000000 1.34613360E-05 1.34613560E-05 -8.12126000E-05 + 0.0000000 0.0000000 0.0000000 -6.63709760E-05 -6.70336520E-05 -1.40257200E-06 + 0.0000000 0.0000000 0.0000000 5.66288200E-06 5.39001400E-06 3.53938200E-06 + 0.0000000 0.0000000 0.0000000 3.74820540E-05 -2.60813080E-05 -1.20643074E-04 + 0.0000000 0.0000000 0.0000000 7.61337600E-05 3.74584508E-04 -7.17581820E-05 + 0.0000000 0.0000000 0.0000000 3.38329460E-05 7.30158860E-05 1.72455400E-06 + 0.0000000 0.0000000 0.0000000 -9.90487600E-06 -6.35459908E-04 -8.37940000E-08 + 0.0000000 0.0000000 0.0000000 7.71552400E-06 4.12668340E-05 -1.13320662E-04 + 0.0000000 0.0000000 0.0000000 -1.74812360E-05 7.02493280E-05 8.63253180E-05 + 0.0000000 0.0000000 0.0000000 -9.14839800E-06 -9.14848200E-06 1.86875800E-06 + 0.0000000 0.0000000 0.0000000 3.24875300E-05 3.24876420E-05 7.87062000E-07 + 0.0000000 0.0000000 0.0000000 9.85637000E-06 4.27674980E-05 1.14590426E-04 + 0.0000000 0.0000000 0.0000000 -1.87186440E-05 6.74906120E-05 -8.82069820E-05 + 0.0000000 0.0000000 0.0000000 3.92203920E-05 -2.59321600E-05 1.19095488E-04 + 0.0000000 0.0000000 0.0000000 7.35007680E-05 3.75885496E-04 6.67216040E-05 + 0.0000000 0.0000000 0.0000000 -6.70336260E-05 -6.63709940E-05 -1.40266600E-06 + 0.0000000 0.0000000 0.0000000 5.39001400E-06 5.66285000E-06 3.53949600E-06 + 0.0000000 0.0000000 0.0000000 6.39057080E-05 6.39057280E-05 6.95359480E-05 + 0.0000000 0.0000000 0.0000000 1.55407440E-05 1.55407400E-05 8.13606660E-05 + 0.0000000 0.0000000 0.0000000 -3.39000000E-07 2.99950244E-04 4.28266400E-06 + 0.0000000 0.0000000 0.0000000 -7.13923580E-05 -1.34319632E-04 9.60970200E-06 + 0.0000000 0.0000000 0.0000000 1.36498784E-04 -5.37133494E-04 -1.40514874E-04 + 0.0000000 0.0000000 0.0000000 4.68201344E-04 -8.60323262E-04 4.54377286E-04 + 0.0000000 0.0000000 0.0000000 8.59133600E-06 2.76932000E-06 -7.29161000E-06 + 0.0000000 0.0000000 0.0000000 1.55059580E-04 1.57687570E-04 -3.10744000E-07 + 0.0000000 0.0000000 0.0000000 4.27674280E-05 9.85643600E-06 1.14590502E-04 + 0.0000000 0.0000000 0.0000000 6.74906420E-05 -1.87185880E-05 -8.82069740E-05 + 0.0000000 0.0000000 0.0000000 5.80277140E-04 5.80277222E-04 -3.15095524E-04 + 0.0000000 0.0000000 0.0000000 -4.53848720E-05 -4.53849680E-05 -2.70511900E-05 + 0.0000000 0.0000000 0.0000000 -1.39514008E-04 -1.52575730E-04 -5.52453800E-06 + 0.0000000 0.0000000 0.0000000 1.70691686E-03 1.50773231E-03 1.49920454E-04 + 0.0000000 0.0000000 0.0000000 -2.60812520E-05 3.74819440E-05 -1.20643030E-04 + 0.0000000 0.0000000 0.0000000 3.74584624E-04 7.61337820E-05 -7.17581620E-05 + 0.0000000 0.0000000 0.0000000 2.99950378E-04 -3.38994000E-07 4.28266200E-06 + 0.0000000 0.0000000 0.0000000 -1.34319670E-04 -7.13924480E-05 9.60967600E-06 + 0.0000000 0.0000000 0.0000000 8.19308797E-03 8.19308778E-03 -6.38719355E-03 + 0.0000000 0.0000000 0.0000000 -1.73969860E-05 -1.73970000E-05 -1.10594392E-04 + 0.0755890 0.0000000 0.0000000 -2.20692626E-02 1.66886800E-04 1.66886774E-04 + 0.0000000 0.0000000 0.0000000 -6.21956900E-04 -1.58477644E-04 1.58134630E-04 + 0.0755890 0.0000000 0.0000000 -2.20692626E-02 -1.66886864E-04 -1.66886782E-04 + 0.0000000 0.0000000 0.0000000 -6.21956890E-04 1.58477618E-04 -1.58134594E-04 + 0.0000000 0.0000000 0.0000000 -6.22560954E-04 1.57650430E-04 -1.58477676E-04 + 0.0000000 0.0000000 0.0000000 -1.33792288E-03 -1.65921046E-04 -1.66405340E-04 + 0.0000000 0.0000000 0.0000000 -6.22560930E-04 -1.57650366E-04 1.58477640E-04 + 0.0000000 0.0000000 0.0000000 -1.33792286E-03 1.65921148E-04 1.66405316E-04 + 0.0000000 0.0000000 0.0000000 1.06605013E-02 -4.00000000E-12 4.60000000E-11 + 0.0000000 0.0000000 0.0000000 -1.65362544E-04 -1.60000000E-11 -1.40000000E-11 + 0.0000000 0.0000000 0.0000000 5.66992905E-03 3.78068269E-03 3.78099541E-03 + 0.0000000 0.0000000 0.0000000 -1.66254672E-04 7.10176800E-06 -6.78838600E-06 + 0.0000000 0.0000000 0.0000000 -1.65619360E-04 3.00000000E-11 0.00000000E+00 + 0.0000000 0.0000000 0.0000000 6.81112150E-04 -6.60000000E-11 -3.00000000E-11 + 0.0000000 0.0000000 0.0000000 -1.66254726E-04 -7.10177400E-06 6.78838200E-06 + 0.0000000 0.0000000 0.0000000 5.66992906E-03 -3.78068278E-03 -3.78099536E-03 + 0.0000000 0.0000000 0.0000000 6.18734114E-04 -1.37305808E-04 1.36306228E-04 + 0.0000000 0.0000000 0.0000000 3.63750218E-04 -6.58946940E-05 -3.15019650E-04 + 0.0000000 0.0000000 0.0000000 6.18734140E-04 1.37305844E-04 -1.36306294E-04 + 0.0000000 0.0000000 0.0000000 3.63750184E-04 6.58947900E-05 3.15019606E-04 + 0.0000000 0.0000000 0.0000000 3.63845282E-04 3.15265888E-04 6.68943380E-05 + 0.0000000 0.0000000 0.0000000 1.11218208E-04 -1.13656110E-04 1.13409860E-04 + 0.0000000 0.0000000 0.0000000 3.63845228E-04 -3.15265826E-04 -6.68943240E-05 + 0.0000000 0.0000000 0.0000000 1.11218244E-04 1.13656098E-04 -1.13409816E-04 + 0.0000000 0.0000000 0.0000000 2.35524880E-05 1.58319400E-05 -2.16381520E-05 + 0.0000000 0.0000000 0.0000000 2.35524420E-05 -1.58318980E-05 2.16381580E-05 + 0.0000000 0.0000000 0.0000000 2.34369220E-05 -2.13442060E-05 1.64090220E-05 + 0.0000000 0.0000000 0.0000000 1.31791860E-05 1.06433800E-06 -6.95046200E-06 + 0.0000000 0.0000000 0.0000000 1.30637060E-05 -6.94101600E-06 1.35831000E-06 + 0.0000000 0.0000000 0.0000000 1.30636880E-05 6.94096600E-06 -1.35833000E-06 + 0.0000000 0.0000000 0.0000000 2.34369320E-05 2.13441820E-05 -1.64089580E-05 + 0.0000000 0.0000000 0.0000000 1.31791260E-05 -1.06433600E-06 6.95037200E-06 + 0.0000000 0.0000000 0.0000000 2.84413440E-05 1.31209840E-05 1.31166060E-05 + 0.0000000 0.0000000 0.0000000 -1.39797500E-05 -1.35629260E-05 1.37154340E-05 + 0.0000000 0.0000000 0.0000000 2.84413700E-05 -1.31209440E-05 -1.31165620E-05 + 0.0000000 0.0000000 0.0000000 -1.39798060E-05 1.35628840E-05 -1.37155360E-05 + 0.0000000 0.0000000 0.0000000 -1.31230380E-05 1.37169200E-05 -1.35585260E-05 + 0.0000000 0.0000000 0.0000000 2.72074040E-05 -1.31571800E-05 -1.31556980E-05 + 0.0000000 0.0000000 0.0000000 -1.31230000E-05 -1.37169520E-05 1.35585500E-05 + 0.0000000 0.0000000 0.0000000 2.72074560E-05 1.31571900E-05 1.31557740E-05 + 0.0000000 0.0000000 0.0000000 -3.44146740E-05 1.20000000E-11 -1.60000000E-11 + 0.0000000 0.0000000 0.0000000 7.22712380E-05 -2.80000000E-11 8.60000000E-11 + 0.0000000 0.0000000 0.0000000 -4.32814460E-05 1.46211640E-05 1.49032880E-05 + 0.0000000 0.0000000 0.0000000 7.20046640E-05 4.28186200E-06 -3.99989600E-06 + 0.0000000 0.0000000 0.0000000 7.20303260E-05 3.00000000E-11 -2.00000000E-12 + 0.0000000 0.0000000 0.0000000 -5.21018580E-05 -2.60000000E-11 4.00000000E-12 + 0.0000000 0.0000000 0.0000000 7.20046380E-05 -4.28191200E-06 3.99989000E-06 + 0.0000000 0.0000000 0.0000000 -4.32813960E-05 -1.46212240E-05 -1.49032420E-05 + 0.0000000 0.0000000 0.0000000 5.95908126E-04 4.51613714E-04 -4.52193472E-04 + 0.0000000 0.0000000 0.0000000 3.53066402E-04 -2.58177264E-04 2.79538368E-04 + 0.0000000 0.0000000 0.0000000 5.95908110E-04 -4.51613626E-04 4.52193494E-04 + 0.0000000 0.0000000 0.0000000 3.53066374E-04 2.58177294E-04 -2.79538544E-04 + 0.0000000 0.0000000 0.0000000 3.53156342E-04 -2.79708308E-04 2.58757140E-04 + 0.0000000 0.0000000 0.0000000 1.10883878E-04 8.84031700E-05 -8.82332940E-05 + 0.0000000 0.0000000 0.0000000 3.53156342E-04 2.79708262E-04 -2.58757082E-04 + 0.0000000 0.0000000 0.0000000 1.10883874E-04 -8.84031780E-05 8.82332780E-05 + 0.0000000 0.0000000 0.0000000 5.04848040E-03 3.37218542E-03 -3.38270936E-03 + 0.0000000 0.0000000 0.0000000 5.04848037E-03 -3.37218540E-03 3.38270935E-03 + 0.0000000 0.0000000 0.0000000 5.04839665E-03 -3.38214309E-03 3.37312101E-03 + 0.0000000 0.0000000 0.0000000 2.55985530E-04 -2.99417940E-05 1.68975760E-05 + 0.0000000 0.0000000 0.0000000 2.55901782E-04 1.71215820E-05 -2.93751620E-05 + 0.0000000 0.0000000 0.0000000 2.55901782E-04 -1.71216700E-05 2.93751880E-05 + 0.0000000 0.0000000 0.0000000 5.04839667E-03 3.38214308E-03 -3.37312101E-03 + 0.0000000 0.0000000 0.0000000 2.55985506E-04 2.99418680E-05 -1.68975640E-05 + 0.0755890 0.0000000 0.0000000 -2.06594735E-02 -1.58470438E-04 -1.58470470E-04 + 0.0000000 0.0000000 0.0000000 7.76464210E-04 1.66355560E-04 -1.65992340E-04 + -0.0755890 0.0000000 0.0000000 2.06664804E-02 -1.66761188E-04 -1.66761160E-04 + 0.0000000 0.0000000 0.0000000 -7.69438994E-04 1.58799200E-04 -1.59124644E-04 + 0.0000000 0.0000000 0.0000000 7.75855254E-04 -1.65508422E-04 1.66355514E-04 + 0.0000000 0.0000000 0.0000000 5.95779460E-05 1.58251398E-04 1.58735302E-04 + 0.0000000 0.0000000 0.0000000 -7.68934920E-04 -1.58628402E-04 1.58799204E-04 + 0.0000000 0.0000000 0.0000000 -6.72312960E-05 1.66132786E-04 1.66629016E-04 + 0.0000000 0.0000000 0.0000000 1.92823444E-04 7.25631472E-03 7.25719635E-03 + 0.0000000 0.0000000 0.0000000 -2.99276400E-06 1.29920170E-04 1.10509206E-04 + 0.0000000 0.0000000 0.0000000 -4.78956364E-03 -3.47287087E-03 -3.47344040E-03 + 0.0000000 0.0000000 0.0000000 -2.37103400E-06 -1.22873964E-04 -1.17245898E-04 + 0.0000000 0.0000000 0.0000000 -2.99936200E-06 1.10733932E-04 1.29037602E-04 + 0.0000000 0.0000000 0.0000000 5.14486200E-06 7.40517300E-05 7.42763900E-05 + 0.0000000 0.0000000 0.0000000 -2.15946600E-06 -1.17784716E-04 -1.22304080E-04 + 0.0000000 0.0000000 0.0000000 4.99017861E-03 -3.85683689E-03 -3.85737503E-03 + 0.0000000 0.0000000 0.0000000 8.65339000E-06 4.61287808E-04 4.58308614E-04 + 0.0000000 0.0000000 0.0000000 2.53505598E-04 -2.67441854E-04 -2.88003606E-04 + 0.0000000 0.0000000 0.0000000 8.74721400E-06 4.57761450E-04 4.61891656E-04 + 0.0000000 0.0000000 0.0000000 -2.42524516E-04 -2.58273482E-04 -2.80142156E-04 + 0.0000000 0.0000000 0.0000000 -2.42514848E-04 -2.80306302E-04 -2.58820674E-04 + 0.0000000 0.0000000 0.0000000 1.72560000E-08 8.78372560E-05 8.69190780E-05 + 0.0000000 0.0000000 0.0000000 2.53515940E-04 -2.88207570E-04 -2.68045758E-04 + 0.0000000 0.0000000 0.0000000 -7.72300000E-08 8.71230660E-05 8.76731900E-05 + 0.0000000 0.0000000 0.0000000 5.65528000E-05 -9.52715720E-05 8.93840820E-05 + 0.0000000 0.0000000 0.0000000 -5.26573020E-05 -8.95146000E-05 8.54803660E-05 + 0.0000000 0.0000000 0.0000000 5.64383660E-05 8.91153800E-05 -9.52553380E-05 + 0.0000000 0.0000000 0.0000000 -6.19388320E-05 7.55775780E-05 -7.09639060E-05 + 0.0000000 0.0000000 0.0000000 -6.18142460E-05 -7.09496160E-05 7.53089240E-05 + 0.0000000 0.0000000 0.0000000 6.57390000E-05 -7.44672960E-05 7.99854420E-05 + 0.0000000 0.0000000 0.0000000 -5.25326000E-05 8.51833200E-05 -8.95307900E-05 + 0.0000000 0.0000000 0.0000000 6.58532860E-05 8.02825220E-05 -7.44529060E-05 + 0.0000000 0.0000000 0.0000000 3.73863900E-05 -1.35803000E-05 -1.35757380E-05 + 0.0000000 0.0000000 0.0000000 -4.24493000E-06 1.30999860E-05 -1.32911300E-05 + 0.0000000 0.0000000 0.0000000 -3.94932220E-05 -1.31719440E-05 -1.31721920E-05 + 0.0000000 0.0000000 0.0000000 6.47713800E-06 1.37025120E-05 -1.35116740E-05 + 0.0000000 0.0000000 0.0000000 -3.38945600E-06 -1.32926440E-05 1.30953980E-05 + 0.0000000 0.0000000 0.0000000 3.59716400E-05 1.36355620E-05 1.36340540E-05 + 0.0000000 0.0000000 0.0000000 5.62064000E-06 -1.35144640E-05 1.37027720E-05 + 0.0000000 0.0000000 0.0000000 -3.82745180E-05 1.31439320E-05 1.31410840E-05 + 0.0000000 0.0000000 0.0000000 -1.49067400E-06 1.10247250E-04 1.10810074E-04 + 0.0000000 0.0000000 0.0000000 -3.43180200E-06 7.44199560E-05 6.40888220E-05 + 0.0000000 0.0000000 0.0000000 -1.01135320E-05 -9.56691020E-05 -9.59507520E-05 + 0.0000000 0.0000000 0.0000000 -3.44296000E-06 -6.96189400E-05 -6.87816060E-05 + 0.0000000 0.0000000 0.0000000 -3.44888400E-06 6.40865280E-05 7.38572020E-05 + 0.0000000 0.0000000 0.0000000 -1.56536000E-07 8.13165360E-05 8.13143360E-05 + 0.0000000 0.0000000 0.0000000 -3.20412200E-06 -6.90606520E-05 -6.93372680E-05 + 0.0000000 0.0000000 0.0000000 8.46005800E-06 -9.58928720E-05 -9.61718800E-05 + 0.0000000 0.0000000 0.0000000 -9.77406200E-06 -1.44101078E-04 -1.26570778E-04 + 0.0000000 0.0000000 0.0000000 2.43237348E-04 -5.84274300E-05 3.07425870E-04 + 0.0000000 0.0000000 0.0000000 -9.67947200E-06 -1.27539646E-04 -1.43092916E-04 + 0.0000000 0.0000000 0.0000000 -2.52798762E-04 -6.32864580E-05 3.14262798E-04 + 0.0000000 0.0000000 0.0000000 -2.52805408E-04 3.14505374E-04 -6.42553240E-05 + 0.0000000 0.0000000 0.0000000 -3.65772000E-07 -1.14149846E-04 -1.14361672E-04 + 0.0000000 0.0000000 0.0000000 2.43231052E-04 3.07642972E-04 -5.94357840E-05 + 0.0000000 0.0000000 0.0000000 -4.60608000E-07 -1.14578756E-04 -1.13907300E-04 + 0.0000000 0.0000000 0.0000000 -5.40776861E-03 -3.88750825E-03 3.87326116E-03 + 0.0000000 0.0000000 0.0000000 5.20973746E-03 -3.49858661E-03 3.49380418E-03 + 0.0000000 0.0000000 0.0000000 -5.40787001E-03 3.87295038E-03 -3.88749439E-03 + 0.0000000 0.0000000 0.0000000 4.18361234E-04 1.00810076E-04 -9.29604140E-05 + 0.0000000 0.0000000 0.0000000 4.18471322E-04 -9.29610300E-05 1.00498616E-04 + 0.0000000 0.0000000 0.0000000 -4.20507076E-04 -9.17535600E-05 1.02797902E-04 + 0.0000000 0.0000000 0.0000000 5.20984895E-03 3.49345579E-03 -3.49859935E-03 + 0.0000000 0.0000000 0.0000000 -4.20406998E-04 1.03146666E-04 -9.17542520E-05 + -0.0755890 0.0000000 0.0000000 2.20482841E-02 -1.59300702E-04 -1.59300762E-04 + 0.0000000 0.0000000 0.0000000 6.28982306E-04 1.66650172E-04 -1.66995232E-04 + -0.0755890 0.0000000 0.0000000 2.20482841E-02 1.59300702E-04 1.59300738E-04 + 0.0000000 0.0000000 0.0000000 6.28982324E-04 -1.66650180E-04 1.66995204E-04 + 0.0000000 0.0000000 0.0000000 6.29492174E-04 -1.66498586E-04 1.66650206E-04 + 0.0000000 0.0000000 0.0000000 1.33174678E-03 1.58073018E-04 1.58569582E-04 + 0.0000000 0.0000000 0.0000000 6.29492256E-04 1.66498616E-04 -1.66650130E-04 + 0.0000000 0.0000000 0.0000000 1.33174676E-03 -1.58072990E-04 -1.58569600E-04 + 0.0000000 0.0000000 0.0000000 -1.02470044E-02 -2.00000000E-12 3.60000000E-11 + 0.0000000 0.0000000 0.0000000 1.59207180E-04 -4.20000000E-11 1.20000000E-11 + 0.0000000 0.0000000 0.0000000 -5.46082658E-03 -3.40091227E-03 -3.40125886E-03 + 0.0000000 0.0000000 0.0000000 1.58589386E-04 -1.20650120E-05 1.17181120E-05 + 0.0000000 0.0000000 0.0000000 1.59371700E-04 -5.00000000E-11 2.40000000E-11 + 0.0000000 0.0000000 0.0000000 -6.71198154E-04 -1.00000000E-11 3.20000000E-11 + 0.0000000 0.0000000 0.0000000 1.58589318E-04 1.20649220E-05 -1.17181360E-05 + 0.0000000 0.0000000 0.0000000 -5.46082661E-03 3.40091227E-03 3.40125886E-03 + 0.0000000 0.0000000 0.0000000 -5.94883484E-04 1.34212796E-04 -1.33235078E-04 + 0.0000000 0.0000000 0.0000000 -3.53767038E-04 5.63532100E-05 3.06742204E-04 + 0.0000000 0.0000000 0.0000000 -5.94883506E-04 -1.34212788E-04 1.33235010E-04 + 0.0000000 0.0000000 0.0000000 -3.53767084E-04 -5.63531440E-05 -3.06742172E-04 + 0.0000000 0.0000000 0.0000000 -3.53860676E-04 -3.06955450E-04 -5.73309160E-05 + 0.0000000 0.0000000 0.0000000 -1.10459660E-04 1.15004944E-04 -1.14791838E-04 + 0.0000000 0.0000000 0.0000000 -3.53860626E-04 3.06955574E-04 5.73308980E-05 + 0.0000000 0.0000000 0.0000000 -1.10459664E-04 -1.15005032E-04 1.14791758E-04 + 0.0000000 0.0000000 0.0000000 -1.84197980E-05 -1.98095900E-05 2.49908040E-05 + 0.0000000 0.0000000 0.0000000 -1.84197980E-05 1.98096340E-05 -2.49907960E-05 + 0.0000000 0.0000000 0.0000000 -1.82958560E-05 2.47238280E-05 -2.03598320E-05 + 0.0000000 0.0000000 0.0000000 -1.02485920E-05 -5.58343000E-06 1.02156840E-05 + 0.0000000 0.0000000 0.0000000 -1.01246260E-05 1.02294480E-05 -5.85021800E-06 + 0.0000000 0.0000000 0.0000000 -1.01245740E-05 -1.02295140E-05 5.85024400E-06 + 0.0000000 0.0000000 0.0000000 -1.82958520E-05 -2.47239300E-05 2.03598460E-05 + 0.0000000 0.0000000 0.0000000 -1.02485440E-05 5.58340400E-06 -1.02156020E-05 + 0.0000000 0.0000000 0.0000000 -2.98579280E-05 -1.36279420E-05 -1.36282920E-05 + 0.0000000 0.0000000 0.0000000 1.52711180E-05 1.32536800E-05 -1.30238380E-05 + 0.0000000 0.0000000 0.0000000 -2.98579600E-05 1.36280120E-05 1.36283240E-05 + 0.0000000 0.0000000 0.0000000 1.52711040E-05 -1.32536320E-05 1.30238300E-05 + 0.0000000 0.0000000 0.0000000 1.44154720E-05 -1.30266120E-05 1.32540460E-05 + 0.0000000 0.0000000 0.0000000 -2.84265940E-05 1.35798300E-05 1.35770000E-05 + 0.0000000 0.0000000 0.0000000 1.44154780E-05 1.30265780E-05 -1.32540620E-05 + 0.0000000 0.0000000 0.0000000 -2.84266460E-05 -1.35797840E-05 -1.35770260E-05 + 0.0000000 0.0000000 0.0000000 3.28749960E-05 -2.00000000E-11 -3.40000000E-11 + 0.0000000 0.0000000 0.0000000 -7.89464180E-05 3.60000000E-11 4.80000000E-11 + 0.0000000 0.0000000 0.0000000 4.25996300E-05 -1.43389400E-05 -1.46218780E-05 + 0.0000000 0.0000000 0.0000000 -7.89140680E-05 -6.13845200E-06 5.85540000E-06 + 0.0000000 0.0000000 0.0000000 -7.87088580E-05 4.60000000E-11 -1.40000000E-11 + 0.0000000 0.0000000 0.0000000 5.22636400E-05 1.00000000E-11 -6.00000000E-12 + 0.0000000 0.0000000 0.0000000 -7.89140100E-05 6.13844400E-06 -5.85549000E-06 + 0.0000000 0.0000000 0.0000000 4.25996220E-05 1.43388900E-05 1.46219220E-05 + 0.0000000 0.0000000 0.0000000 -6.17719080E-04 -4.67655546E-04 4.68226576E-04 + 0.0000000 0.0000000 0.0000000 -3.64472378E-04 2.67646338E-04 -2.88604574E-04 + 0.0000000 0.0000000 0.0000000 -6.17719102E-04 4.67655598E-04 -4.68226526E-04 + 0.0000000 0.0000000 0.0000000 -3.64472454E-04 -2.67646314E-04 2.88604528E-04 + 0.0000000 0.0000000 0.0000000 -3.64570988E-04 2.88802958E-04 -2.68217230E-04 + 0.0000000 0.0000000 0.0000000 -1.10757906E-04 -8.65198260E-05 8.63215760E-05 + 0.0000000 0.0000000 0.0000000 -3.64570992E-04 -2.88802854E-04 2.68217222E-04 + 0.0000000 0.0000000 0.0000000 -1.10757916E-04 8.65198260E-05 -8.63215340E-05 + 0.0000000 0.0000000 0.0000000 -5.24400882E-03 -3.75334611E-03 3.76322927E-03 + 0.0000000 0.0000000 0.0000000 -5.24400877E-03 3.75334607E-03 -3.76322925E-03 + 0.0000000 0.0000000 0.0000000 -5.24388241E-03 3.76268779E-03 -3.75418135E-03 + 0.0000000 0.0000000 0.0000000 -2.57974804E-04 2.59100620E-05 -1.93725500E-05 + 0.0000000 0.0000000 0.0000000 -2.57848508E-04 -1.95979200E-05 2.53679940E-05 + 0.0000000 0.0000000 0.0000000 -2.57848496E-04 1.95978900E-05 -2.53680420E-05 + 0.0000000 0.0000000 0.0000000 -5.24388251E-03 -3.76268785E-03 3.75418128E-03 + 0.0000000 0.0000000 0.0000000 -2.57974838E-04 -2.59100760E-05 1.93725900E-05 + 0.0755890 0.0000000 0.0000000 -2.15253748E-02 3.02728136E-04 2.88135628E-04 + 0.0000000 0.0000000 0.0000000 2.32950842E-04 2.98432058E-04 -2.93323602E-04 + 0.0000000 0.0755890 0.0000000 -7.02459472E-04 -2.15178091E-02 -1.64190968E-04 + 0.0000000 0.0000000 0.0000000 -6.95819392E-04 2.32302770E-04 -1.58677538E-04 + 0.0000000 0.0000000 0.0000000 -9.29800680E-05 3.09287576E-04 -3.01597486E-04 + 0.0000000 0.0000000 0.0000000 -4.69924916E-04 3.08626930E-04 3.00171280E-04 + 0.0000000 0.0000000 0.0000000 -6.96232594E-04 -1.24336356E-04 1.58561334E-04 + 0.0000000 0.0000000 0.0000000 -7.02426718E-04 1.55685952E-04 1.66705654E-04 + 0.0000000 0.0000000 0.0000000 1.89487240E-03 8.93802035E-03 7.26344134E-03 + 0.0000000 0.0000000 0.0000000 -1.48663068E-04 -1.56764160E-05 1.10223462E-04 + 0.0000000 0.0000000 0.0000000 4.16171636E-03 5.28805037E-03 3.78545555E-03 + 0.0000000 0.0000000 0.0000000 -1.92394940E-05 -1.39590750E-04 -7.18046600E-06 + 0.0000000 0.0000000 0.0000000 -1.37329520E-04 4.04509320E-05 1.18521510E-04 + 0.0000000 0.0000000 0.0000000 3.01363280E-04 7.68246740E-05 7.05057160E-05 + 0.0000000 0.0000000 0.0000000 -2.67983500E-05 -8.13496320E-05 -5.00818000E-07 + 0.0000000 0.0000000 0.0000000 5.36351752E-03 -3.78581463E-03 -3.79052852E-03 + 0.0000000 0.0000000 0.0000000 1.13095080E-05 4.64265690E-04 4.54308578E-04 + 0.0000000 0.0000000 0.0000000 4.09355260E-04 -1.10229270E-04 -2.87754408E-04 + 0.0000000 0.0000000 0.0000000 4.67028268E-04 -3.95630234E-04 6.72770400E-06 + 0.0000000 0.0000000 0.0000000 -1.10158260E-04 -8.02004616E-04 -1.52617354E-04 + 0.0000000 0.0000000 0.0000000 3.57447104E-04 3.22522974E-04 6.80730900E-05 + 0.0000000 0.0000000 0.0000000 -4.44622980E-05 4.20232480E-05 1.13624392E-04 + 0.0000000 0.0000000 0.0000000 3.22316040E-04 -3.05292812E-04 -1.80568894E-04 + 0.0000000 0.0000000 0.0000000 4.22663560E-05 9.48477060E-05 -2.67083120E-05 + 0.0000000 0.0000000 0.0000000 9.30528860E-05 -1.18083340E-04 -3.22012720E-05 + 0.0000000 0.0000000 0.0000000 2.03127920E-05 2.81342986E-04 1.84454300E-05 + 0.0000000 0.0000000 0.0000000 -1.74410600E-05 -4.91273500E-05 -1.01343552E-04 + 0.0000000 0.0000000 0.0000000 -6.30099000E-05 3.79762218E-04 -7.74864400E-05 + 0.0000000 0.0000000 0.0000000 7.70333600E-06 -5.81476000E-07 4.20858000E-07 + 0.0000000 0.0000000 0.0000000 7.95647360E-05 -5.92880580E-05 -1.46037000E-06 + 0.0000000 0.0000000 0.0000000 -4.67636300E-05 9.00586500E-05 -8.92499740E-05 + 0.0000000 0.0000000 0.0000000 -1.53528600E-06 1.27396000E-05 -7.43677680E-05 + 0.0000000 0.0000000 0.0000000 2.02383820E-05 5.53992760E-05 -1.01253080E-04 + 0.0000000 0.0000000 0.0000000 3.39248800E-06 5.48624560E-05 1.00982090E-04 + 0.0000000 0.0000000 0.0000000 -5.51072000E-06 5.96999140E-05 -1.31088520E-05 + 0.0000000 0.0000000 0.0000000 -3.62831800E-06 -6.21673598E-04 -1.33175520E-05 + 0.0000000 0.0000000 0.0000000 -2.27605280E-05 5.51554900E-05 9.97672640E-05 + 0.0000000 0.0000000 0.0000000 4.57631720E-05 5.58665140E-05 -1.00232346E-04 + 0.0000000 0.0000000 0.0000000 -3.47445400E-06 -2.29200700E-05 1.41379500E-05 + 0.0000000 0.0000000 0.0000000 -5.48780000E-06 4.55908720E-05 1.32466880E-05 + 0.0000000 0.0000000 0.0000000 -7.13125080E-05 -2.41296160E-05 1.21720430E-04 + 0.0000000 0.0000000 0.0000000 -6.44998000E-07 3.71096490E-04 6.73603260E-05 + 0.0000000 0.0000000 0.0000000 3.04996100E-05 -1.24002168E-04 2.25009240E-05 + 0.0000000 0.0000000 0.0000000 7.41003920E-05 3.09927410E-04 2.64771600E-06 + 0.0000000 0.0000000 0.0000000 2.59801600E-06 6.99602840E-05 7.32198300E-05 + 0.0000000 0.0000000 0.0000000 -6.64330740E-05 1.50102380E-05 8.11791460E-05 + 0.0000000 0.0000000 0.0000000 6.71169740E-05 1.16062000E-06 4.36487000E-06 + 0.0000000 0.0000000 0.0000000 2.36374900E-05 -8.17178660E-05 -1.49821700E-05 + 0.0000000 0.0000000 0.0000000 5.91611976E-04 4.55626060E-04 -4.52906366E-04 + 0.0000000 0.0000000 0.0000000 1.96492856E-04 -1.02119546E-04 2.80699436E-04 + 0.0000000 0.0000000 0.0000000 4.63811304E-04 -9.96478690E-04 3.24359064E-04 + 0.0000000 0.0000000 0.0000000 -1.03435728E-04 -5.94219626E-04 1.72042838E-04 + 0.0000000 0.0000000 0.0000000 -2.45606728E-04 3.21796558E-04 -6.40201160E-05 + 0.0000000 0.0000000 0.0000000 1.55761946E-04 4.22771180E-05 -1.14694708E-04 + 0.0000000 0.0000000 0.0000000 3.11508650E-04 2.87644748E-04 -1.44999562E-04 + 0.0000000 0.0000000 0.0000000 4.14506340E-05 -1.05183646E-04 2.79898000E-07 + 0.0000000 0.0000000 0.0000000 3.35632200E-03 5.06345782E-03 -3.38157357E-03 + 0.0000000 0.0000000 0.0000000 5.19461383E-03 -3.51752051E-03 3.38289483E-03 + 0.0000000 0.0000000 0.0000000 -3.89880712E-03 5.38055697E-03 -3.88629944E-03 + 0.0000000 0.0000000 0.0000000 2.72139886E-04 -4.64838280E-05 -9.31421540E-05 + 0.0000000 0.0000000 0.0000000 3.90623848E-04 -5.25814300E-05 -1.82232600E-05 + 0.0000000 0.0000000 0.0000000 -4.06295400E-05 -1.44729860E-05 3.21026400E-05 + 0.0000000 0.0000000 0.0000000 5.07302735E-03 3.41883729E-03 -3.49371270E-03 + 0.0000000 0.0000000 0.0000000 -1.15170640E-04 1.02403724E-04 -8.46085960E-05 + 0.0755890 0.0000000 0.0000000 -2.11860548E-02 -3.12729704E-04 -2.95720460E-04 + 0.0000000 0.0000000 0.0000000 -9.38832020E-05 -3.08731932E-04 3.01316120E-04 + 0.0000000 -0.0755890 0.0000000 -7.02414734E-04 2.11854613E-02 -1.67715494E-04 + 0.0000000 0.0000000 0.0000000 -6.95525564E-04 8.49956120E-05 -1.58576568E-04 + 0.0000000 0.0000000 0.0000000 2.30943924E-04 -2.98940128E-04 2.93551860E-04 + 0.0000000 0.0000000 0.0000000 -7.93716788E-04 -2.98278746E-04 -2.92269900E-04 + 0.0000000 0.0000000 0.0000000 -6.95220146E-04 -1.91947688E-04 1.58727030E-04 + 0.0000000 0.0000000 0.0000000 -7.02659074E-04 1.76239274E-04 1.66223860E-04 + 0.0000000 0.0000000 0.0000000 9.14134460E-03 -1.49980754E-03 -7.79951400E-06 + 0.0000000 0.0000000 0.0000000 -1.90173220E-05 1.46285948E-04 3.02106000E-07 + 0.0000000 0.0000000 0.0000000 -3.09770779E-03 -5.16320910E-03 -3.47799460E-03 + 0.0000000 0.0000000 0.0000000 -1.48576944E-04 2.30787620E-05 -1.16853684E-04 + 0.0000000 0.0000000 0.0000000 -2.72518120E-05 7.41413780E-05 7.22774800E-06 + 0.0000000 0.0000000 0.0000000 3.76197542E-04 1.39607800E-06 7.15666800E-06 + 0.0000000 0.0000000 0.0000000 -1.37493910E-04 -4.73707640E-05 -1.11731950E-04 + 0.0000000 0.0000000 0.0000000 5.28696096E-03 -3.85615999E-03 -3.85157930E-03 + 0.0000000 0.0000000 0.0000000 6.13605322E-04 -1.42251836E-04 1.40454340E-04 + 0.0000000 0.0000000 0.0000000 2.08823574E-04 -2.22203300E-04 -3.15230442E-04 + 0.0000000 0.0000000 0.0000000 1.42264032E-04 1.00587905E-03 3.35014322E-04 + 0.0000000 0.0000000 0.0000000 2.13220410E-04 5.94119464E-04 1.71671810E-04 + 0.0000000 0.0000000 0.0000000 -2.38304532E-04 -2.85240734E-04 -2.60270720E-04 + 0.0000000 0.0000000 0.0000000 1.56562880E-04 -6.87786880E-05 8.67133780E-05 + 0.0000000 0.0000000 0.0000000 2.95316264E-04 -2.96333670E-04 -1.53731254E-04 + 0.0000000 0.0000000 0.0000000 6.91286800E-05 1.04111876E-04 2.75304000E-07 + 0.0000000 0.0000000 0.0000000 -1.67666320E-05 4.26219700E-05 9.66558200E-05 + 0.0000000 0.0000000 0.0000000 -5.37376160E-05 -3.95538414E-04 9.22690160E-05 + 0.0000000 0.0000000 0.0000000 9.35051840E-05 1.12855308E-04 2.56345080E-05 + 0.0000000 0.0000000 0.0000000 9.97013200E-06 -2.94003688E-04 -3.96790800E-06 + 0.0000000 0.0000000 0.0000000 -5.72229280E-05 -7.65803760E-05 7.64249300E-05 + 0.0000000 0.0000000 0.0000000 -1.53446200E-06 -7.44625600E-06 8.01218260E-05 + 0.0000000 0.0000000 0.0000000 1.68845280E-05 1.57882520E-05 -1.67480900E-05 + 0.0000000 0.0000000 0.0000000 7.97899080E-05 6.57116320E-05 6.85009200E-06 + 0.0000000 0.0000000 0.0000000 4.74281880E-05 -5.55749820E-05 1.00105320E-04 + 0.0000000 0.0000000 0.0000000 -2.33843640E-05 -5.50337440E-05 -9.98286420E-05 + 0.0000000 0.0000000 0.0000000 -5.56082000E-06 -8.59771840E-05 -1.31765300E-05 + 0.0000000 0.0000000 0.0000000 -3.91554800E-06 6.48728888E-04 -1.38931560E-05 + 0.0000000 0.0000000 0.0000000 4.45864200E-06 -5.49552560E-05 -1.00846348E-04 + 0.0000000 0.0000000 0.0000000 1.92724140E-05 -5.56735020E-05 1.01336958E-04 + 0.0000000 0.0000000 0.0000000 -4.06489400E-06 -4.29767000E-06 1.30640500E-05 + 0.0000000 0.0000000 0.0000000 -5.59160000E-06 -1.92973540E-05 1.30428320E-05 + 0.0000000 0.0000000 0.0000000 3.92315960E-05 1.38424156E-04 -7.63043800E-06 + 0.0000000 0.0000000 0.0000000 7.37359400E-05 -3.05406966E-04 -6.73070800E-06 + 0.0000000 0.0000000 0.0000000 -8.00107540E-05 3.88303700E-05 -1.06825956E-04 + 0.0000000 0.0000000 0.0000000 -1.31829000E-06 -3.66306176E-04 -7.19657820E-05 + 0.0000000 0.0000000 0.0000000 6.67562540E-05 -5.09848200E-06 6.34328000E-07 + 0.0000000 0.0000000 0.0000000 1.49560380E-05 6.70962140E-05 1.35452000E-07 + 0.0000000 0.0000000 0.0000000 2.43920600E-06 -7.52964400E-05 -6.96859120E-05 + 0.0000000 0.0000000 0.0000000 -5.76643920E-05 -2.95866700E-05 -9.60815100E-05 + 0.0000000 0.0000000 0.0000000 -3.10466800E-06 -1.50250822E-04 -1.25779808E-04 + 0.0000000 0.0000000 0.0000000 3.98837150E-04 -2.13665114E-04 3.06343804E-04 + 0.0000000 0.0000000 0.0000000 1.40609756E-04 4.02138886E-04 6.75514000E-07 + 0.0000000 0.0000000 0.0000000 2.21906948E-04 8.03972088E-04 -1.53085094E-04 + 0.0000000 0.0000000 0.0000000 3.48334994E-04 -2.84625436E-04 2.58476072E-04 + 0.0000000 0.0000000 0.0000000 -4.61204000E-05 -6.88884460E-05 -8.78654220E-05 + 0.0000000 0.0000000 0.0000000 2.84591676E-04 2.97929270E-04 -1.72610836E-04 + 0.0000000 0.0000000 0.0000000 6.87051280E-05 -9.59249440E-05 -2.65748380E-05 + 0.0000000 0.0000000 0.0000000 -3.89849992E-03 -5.39554652E-03 3.87209595E-03 + 0.0000000 0.0000000 0.0000000 5.06293856E-03 -3.35244154E-03 3.49372952E-03 + 0.0000000 0.0000000 0.0000000 3.35671307E-03 -5.07272965E-03 3.37209681E-03 + 0.0000000 0.0000000 0.0000000 4.01397028E-04 1.16505796E-04 1.70929520E-05 + 0.0000000 0.0000000 0.0000000 2.79593974E-04 -1.93855640E-05 9.25479260E-05 + 0.0000000 0.0000000 0.0000000 -1.14993784E-04 -9.01398060E-05 9.65455500E-05 + 0.0000000 0.0000000 0.0000000 5.18112909E-03 3.45296031E-03 -3.38118113E-03 + 0.0000000 0.0000000 0.0000000 -4.02469920E-05 2.64165240E-05 -2.05242500E-05 + -0.0755890 0.0000000 0.0000000 2.12101814E-02 2.94123412E-04 2.98909976E-04 + 0.0000000 0.0000000 0.0000000 8.43147780E-05 2.98046042E-04 -2.93624542E-04 + 0.0000000 0.0755890 0.0000000 6.94971380E-04 -2.12099357E-02 1.57835620E-04 + 0.0000000 0.0000000 0.0000000 7.02855764E-04 -9.28571220E-05 1.66569972E-04 + 0.0000000 0.0000000 0.0000000 -2.39201096E-04 3.07824126E-04 -3.01372242E-04 + 0.0000000 0.0000000 0.0000000 8.01974736E-04 3.08410834E-04 3.02796132E-04 + 0.0000000 0.0000000 0.0000000 7.03148806E-04 1.99811036E-04 -1.66454308E-04 + 0.0000000 0.0000000 0.0000000 6.95695932E-04 -1.67847564E-04 -1.58925532E-04 + 0.0000000 0.0000000 0.0000000 -8.56909607E-03 1.69834306E-03 -7.81397600E-06 + 0.0000000 0.0000000 0.0000000 1.34176600E-05 -1.45914290E-04 2.80400000E-07 + 0.0000000 0.0000000 0.0000000 3.48167864E-03 5.36567620E-03 3.85259700E-03 + 0.0000000 0.0000000 0.0000000 1.43751060E-04 -2.84635380E-05 1.22661864E-04 + 0.0000000 0.0000000 0.0000000 2.50413020E-05 -7.02543020E-05 -1.09969140E-05 + 0.0000000 0.0000000 0.0000000 -3.74791192E-04 3.02059400E-06 -2.88652600E-06 + 0.0000000 0.0000000 0.0000000 1.34992320E-04 4.88847020E-05 1.09589084E-04 + 0.0000000 0.0000000 0.0000000 -5.09355481E-03 3.47512568E-03 3.46914100E-03 + 0.0000000 0.0000000 0.0000000 -5.88254976E-04 1.40521310E-04 -1.29070012E-04 + 0.0000000 0.0000000 0.0000000 -1.96167584E-04 2.12577788E-04 3.06542284E-04 + 0.0000000 0.0000000 0.0000000 -1.40126882E-04 -9.87624200E-04 -3.15858792E-04 + 0.0000000 0.0000000 0.0000000 -2.21702916E-04 -6.02233538E-04 -1.80306400E-04 + 0.0000000 0.0000000 0.0000000 2.46176594E-04 2.94757628E-04 2.66779528E-04 + 0.0000000 0.0000000 0.0000000 -1.56057180E-04 6.88788740E-05 -8.78451980E-05 + 0.0000000 0.0000000 0.0000000 -2.84800470E-04 2.89706394E-04 1.45049696E-04 + 0.0000000 0.0000000 0.0000000 -6.83831820E-05 -1.07007252E-04 3.68494000E-07 + 0.0000000 0.0000000 0.0000000 1.83555520E-05 -4.52515660E-05 -9.64546560E-05 + 0.0000000 0.0000000 0.0000000 5.39349540E-05 3.90902720E-04 -9.27901920E-05 + 0.0000000 0.0000000 0.0000000 -9.26336020E-05 -1.13790186E-04 -2.92598240E-05 + 0.0000000 0.0000000 0.0000000 -1.18310220E-05 3.00848016E-04 3.11670800E-06 + 0.0000000 0.0000000 0.0000000 5.91182240E-05 8.00918500E-05 -7.90325120E-05 + 0.0000000 0.0000000 0.0000000 4.38744200E-06 4.48659400E-06 -7.52233180E-05 + 0.0000000 0.0000000 0.0000000 -1.36374960E-05 -1.90734500E-05 2.00089440E-05 + 0.0000000 0.0000000 0.0000000 -7.71467060E-05 -6.10844000E-05 -1.03087160E-05 + 0.0000000 0.0000000 0.0000000 -4.70331300E-05 5.53216760E-05 -1.01264216E-04 + 0.0000000 0.0000000 0.0000000 2.34201140E-05 5.58259500E-05 1.01567416E-04 + 0.0000000 0.0000000 0.0000000 3.74652000E-06 8.69674680E-05 1.35615400E-05 + 0.0000000 0.0000000 0.0000000 5.39827200E-06 -6.49492068E-04 1.28600920E-05 + 0.0000000 0.0000000 0.0000000 -4.16814400E-06 5.59025040E-05 1.00476864E-04 + 0.0000000 0.0000000 0.0000000 -1.88211040E-05 5.52063840E-05 -1.00033856E-04 + 0.0000000 0.0000000 0.0000000 5.23425800E-06 4.21660000E-06 -1.36375800E-05 + 0.0000000 0.0000000 0.0000000 3.71924800E-06 1.89018860E-05 -1.37154660E-05 + 0.0000000 0.0000000 0.0000000 -3.78265460E-05 -1.34335034E-04 1.05810200E-05 + 0.0000000 0.0000000 0.0000000 -7.58559340E-05 2.96296110E-04 3.36487000E-06 + 0.0000000 0.0000000 0.0000000 8.28858080E-05 -4.23419420E-05 1.03505594E-04 + 0.0000000 0.0000000 0.0000000 -2.62210000E-06 3.74060662E-04 7.62944660E-05 + 0.0000000 0.0000000 0.0000000 -7.27653260E-05 6.15980800E-06 7.37778000E-07 + 0.0000000 0.0000000 0.0000000 -1.41523400E-05 -6.64065860E-05 1.22912000E-07 + 0.0000000 0.0000000 0.0000000 -9.04616400E-06 7.46871040E-05 6.84619240E-05 + 0.0000000 0.0000000 0.0000000 5.72867980E-05 2.84726860E-05 9.60375180E-05 + 0.0000000 0.0000000 0.0000000 -1.46005680E-05 1.32669566E-04 1.43726116E-04 + 0.0000000 0.0000000 0.0000000 -4.09699176E-04 2.20958866E-04 -3.15454188E-04 + 0.0000000 0.0000000 0.0000000 -1.42069332E-04 -4.00777020E-04 3.19000000E-07 + 0.0000000 0.0000000 0.0000000 -2.13028404E-04 -7.96123990E-04 1.45204160E-04 + 0.0000000 0.0000000 0.0000000 -3.57969432E-04 2.95335120E-04 -2.68501012E-04 + 0.0000000 0.0000000 0.0000000 4.47680200E-05 6.87635740E-05 8.67122640E-05 + 0.0000000 0.0000000 0.0000000 -2.95570066E-04 -3.06722610E-04 1.79585124E-04 + 0.0000000 0.0000000 0.0000000 -6.88339100E-05 9.65606480E-05 2.69871600E-05 + 0.0000000 0.0000000 0.0000000 3.51963620E-03 5.18946673E-03 -3.49498994E-03 + 0.0000000 0.0000000 0.0000000 -5.26232526E-03 3.74115003E-03 -3.87342146E-03 + 0.0000000 0.0000000 0.0000000 -3.73647937E-03 5.27147010E-03 -3.75533876E-03 + 0.0000000 0.0000000 0.0000000 -4.04804796E-04 -1.19737600E-04 -1.91987040E-05 + 0.0000000 0.0000000 0.0000000 -2.86432760E-04 2.09303880E-05 -9.24578880E-05 + 0.0000000 0.0000000 0.0000000 1.22147766E-04 9.61810620E-05 -9.66216940E-05 + 0.0000000 0.0000000 0.0000000 -5.38416819E-03 -3.83641150E-03 3.76466931E-03 + 0.0000000 0.0000000 0.0000000 4.74457980E-05 -2.78972420E-05 2.58195420E-05 + -0.0755890 0.0000000 0.0000000 2.15177549E-02 -3.04461850E-04 -3.06982106E-04 + 0.0000000 0.0000000 0.0000000 -2.39920762E-04 -3.08367748E-04 3.01653682E-04 + 0.0000000 -0.0755890 0.0000000 6.95883158E-04 2.15262723E-02 1.57943954E-04 + 0.0000000 0.0000000 0.0000000 7.02534828E-04 -2.40169460E-04 1.66409982E-04 + 0.0000000 0.0000000 0.0000000 8.47140460E-05 -2.97549010E-04 2.93392680E-04 + 0.0000000 0.0000000 0.0000000 4.78184474E-04 -2.98136160E-04 -2.94672216E-04 + 0.0000000 0.0000000 0.0000000 7.02148564E-04 1.32201550E-04 -1.66561160E-04 + 0.0000000 0.0000000 0.0000000 6.95538472E-04 -1.48340444E-04 -1.58268704E-04 + 0.0000000 0.0000000 0.0000000 -1.30202906E-03 -8.77072421E-03 -7.24779497E-03 + 0.0000000 0.0000000 0.0000000 1.43564356E-04 1.67474260E-05 -1.10806324E-04 + 0.0000000 0.0000000 0.0000000 -3.77011898E-03 -5.09261716E-03 -3.39641282E-03 + 0.0000000 0.0000000 0.0000000 1.33162600E-05 1.33481908E-04 1.13584520E-05 + 0.0000000 0.0000000 0.0000000 1.35429742E-04 -3.66561580E-05 -1.21298884E-04 + 0.0000000 0.0000000 0.0000000 -3.00376074E-04 -7.27263780E-05 -6.77573900E-05 + 0.0000000 0.0000000 0.0000000 2.52437360E-05 8.22052800E-05 -7.94912000E-07 + 0.0000000 0.0000000 0.0000000 -5.16499889E-03 3.39461298E-03 3.40228975E-03 + 0.0000000 0.0000000 0.0000000 4.96180000E-08 -4.66647554E-04 -4.66208522E-04 + 0.0000000 0.0000000 0.0000000 -3.99200358E-04 1.02991480E-04 2.80302456E-04 + 0.0000000 0.0000000 0.0000000 -4.64267526E-04 4.07302320E-04 6.37104000E-06 + 0.0000000 0.0000000 0.0000000 1.03259182E-04 7.98459874E-04 1.45642462E-04 + 0.0000000 0.0000000 0.0000000 -3.48874840E-04 -3.11281398E-04 -5.57880460E-05 + 0.0000000 0.0000000 0.0000000 4.65003900E-05 -4.19040260E-05 -1.14628442E-04 + 0.0000000 0.0000000 0.0000000 -3.11283670E-04 2.99356796E-04 1.71803356E-04 + 0.0000000 0.0000000 0.0000000 -4.17512020E-05 -9.76612440E-05 2.68620920E-05 + 0.0000000 0.0000000 0.0000000 -9.32940140E-05 1.19119520E-04 3.27086700E-05 + 0.0000000 0.0000000 0.0000000 -1.99911420E-05 -2.84801702E-04 -1.81658940E-05 + 0.0000000 0.0000000 0.0000000 1.79327480E-05 4.92376260E-05 1.01849972E-04 + 0.0000000 0.0000000 0.0000000 6.32067300E-05 -3.78006272E-04 7.80765460E-05 + 0.0000000 0.0000000 0.0000000 -4.22144600E-06 5.36721800E-06 -6.98374200E-06 + 0.0000000 0.0000000 0.0000000 -7.71338180E-05 5.70245080E-05 5.72684000E-06 + 0.0000000 0.0000000 0.0000000 5.10783820E-05 -9.55775960E-05 9.56643320E-05 + 0.0000000 0.0000000 0.0000000 4.15683800E-06 -9.72682200E-06 7.10731560E-05 + 0.0000000 0.0000000 0.0000000 -2.05096760E-05 -5.55016920E-05 1.00160376E-04 + 0.0000000 0.0000000 0.0000000 -3.55542400E-06 -5.60106160E-05 -1.00469902E-04 + 0.0000000 0.0000000 0.0000000 3.80310200E-06 -5.97765640E-05 1.36388800E-05 + 0.0000000 0.0000000 0.0000000 5.66948800E-06 6.23350542E-04 1.34372040E-05 + 0.0000000 0.0000000 0.0000000 2.23430200E-05 -5.57485480E-05 -1.01649728E-04 + 0.0000000 0.0000000 0.0000000 -4.60896860E-05 -5.50427560E-05 1.01181000E-04 + 0.0000000 0.0000000 0.0000000 5.82929000E-06 2.20883300E-05 -1.26492740E-05 + 0.0000000 0.0000000 0.0000000 3.83887200E-06 -4.61076820E-05 -1.34885060E-05 + 0.0000000 0.0000000 0.0000000 7.30699520E-05 2.81756960E-05 -1.18122796E-04 + 0.0000000 0.0000000 0.0000000 -2.26446200E-06 -3.79810982E-04 -7.10111080E-05 + 0.0000000 0.0000000 0.0000000 -2.80276360E-05 1.19883910E-04 -2.52247520E-05 + 0.0000000 0.0000000 0.0000000 -7.52042040E-05 -3.02271974E-04 2.45409000E-06 + 0.0000000 0.0000000 0.0000000 -8.67903600E-06 -6.95317360E-05 -7.45942840E-05 + 0.0000000 0.0000000 0.0000000 6.70586860E-05 -1.41184900E-05 -8.14376300E-05 + 0.0000000 0.0000000 0.0000000 -7.25781040E-05 3.78058000E-07 -5.55343800E-06 + 0.0000000 0.0000000 0.0000000 -2.40133080E-05 8.07435720E-05 1.45234020E-05 + 0.0000000 0.0000000 0.0000000 -6.10618346E-04 -4.75204964E-04 4.67515078E-04 + 0.0000000 0.0000000 0.0000000 -2.08438794E-04 1.10997052E-04 -2.87497340E-04 + 0.0000000 0.0000000 0.0000000 -4.67260878E-04 9.97347142E-04 -3.26168590E-04 + 0.0000000 0.0000000 0.0000000 1.09938992E-04 6.02408180E-04 -1.80008698E-04 + 0.0000000 0.0000000 0.0000000 2.38799148E-04 -3.12001432E-04 5.97674700E-05 + 0.0000000 0.0000000 0.0000000 -1.56953752E-04 -4.16813920E-05 1.13479564E-04 + 0.0000000 0.0000000 0.0000000 -3.22074904E-04 -2.98460498E-04 1.53648980E-04 + 0.0000000 0.0000000 0.0000000 -4.25821380E-05 1.05883998E-04 3.38392000E-07 + 0.0000000 0.0000000 0.0000000 -3.73685588E-03 -5.26164751E-03 3.76445014E-03 + 0.0000000 0.0000000 0.0000000 -5.39023292E-03 3.90034907E-03 -3.76317301E-03 + 0.0000000 0.0000000 0.0000000 3.51924622E-03 -5.18508584E-03 3.49958425E-03 + 0.0000000 0.0000000 0.0000000 -2.74210142E-04 4.19028980E-05 9.15670360E-05 + 0.0000000 0.0000000 0.0000000 -3.95903640E-04 5.50372520E-05 1.83742460E-05 + 0.0000000 0.0000000 0.0000000 4.73158780E-05 2.06261500E-05 -3.27371040E-05 + 0.0000000 0.0000000 0.0000000 -5.27164030E-03 -3.80310385E-03 3.87363637E-03 + 0.0000000 0.0000000 0.0000000 1.21759642E-04 -1.03066736E-04 9.00087320E-05 + 0.0755890 0.0000000 0.0000000 -1.60341106E-02 3.82741541E-03 3.82741473E-03 + 0.0000000 0.0000000 0.0000000 -6.98675600E-06 6.61308120E-05 5.40451360E-05 + 0.0000000 0.0000000 0.0000000 4.43278695E-03 -3.59765053E-03 -3.59859139E-03 + 0.0000000 0.0000000 0.0000000 -7.76009232E-04 9.30201960E-05 -2.13660968E-04 + 0.0000000 0.0000000 0.0000000 -7.05851200E-06 5.41551140E-05 6.61307980E-05 + 0.0000000 0.0000000 0.0000000 -2.97825976E-04 3.69315060E-05 3.70413960E-05 + 0.0000000 0.0000000 0.0000000 -7.76135792E-04 -2.13270814E-04 9.39614620E-05 + 0.0000000 0.0000000 0.0000000 -3.65017404E-04 1.28338272E-04 1.28728368E-04 + 0.0755890 0.0000000 0.0000000 -1.62340455E-02 3.42864947E-03 3.42864925E-03 + 0.0000000 0.0000000 0.0000000 -9.19853600E-06 6.28925220E-05 5.64489800E-05 + 0.0000000 0.0000000 0.0000000 -3.57291214E-04 1.22193556E-04 1.22559394E-04 + 0.0000000 0.0000000 0.0000000 -7.84861518E-04 -2.21659348E-04 1.02183524E-04 + 0.0000000 0.0000000 0.0000000 -9.27927400E-06 5.65640780E-05 6.28925100E-05 + 0.0000000 0.0000000 0.0000000 -2.97440290E-04 3.71507780E-05 3.72659000E-05 + 0.0000000 0.0000000 0.0000000 -7.84779150E-04 1.01260484E-04 -2.22025070E-04 + 0.0000000 0.0000000 0.0000000 4.62564977E-03 -3.98284262E-03 -3.98376477E-03 + 0.0000000 0.0000000 0.0000000 5.63622210E-03 -3.66105015E-03 4.12266442E-03 + 0.0000000 0.0000000 0.0000000 2.25941362E-04 -2.31881942E-04 -2.44725024E-04 + 0.0000000 0.0000000 0.0000000 5.63626705E-03 4.12244138E-03 -3.66071679E-03 + 0.0000000 0.0000000 0.0000000 -2.68854960E-05 -3.51619500E-05 -4.22766460E-05 + 0.0000000 0.0000000 0.0000000 -2.69610220E-05 -4.23637660E-05 -3.53856920E-05 + 0.0000000 0.0000000 0.0000000 3.95857932E-04 -5.06902300E-05 1.37483290E-04 + 0.0000000 0.0000000 0.0000000 2.25874658E-04 -2.44840804E-04 -2.32214758E-04 + 0.0000000 0.0000000 0.0000000 3.95804060E-04 1.37599178E-04 -5.07773580E-05 + 0.0000000 0.0000000 0.0000000 3.45581114E-04 -2.03581324E-04 3.36290464E-04 + 0.0000000 0.0000000 0.0000000 2.91738038E-04 1.10702756E-04 -2.46236626E-04 + 0.0000000 0.0000000 0.0000000 3.45505690E-04 3.36513102E-04 -2.04067148E-04 + 0.0000000 0.0000000 0.0000000 2.95035400E-05 -6.03975080E-05 -5.38124680E-05 + 0.0000000 0.0000000 0.0000000 2.95489640E-05 -5.38308780E-05 -6.01748320E-05 + 0.0000000 0.0000000 0.0000000 9.53576380E-05 -2.05378400E-05 1.40319100E-04 + 0.0000000 0.0000000 0.0000000 2.91791924E-04 -2.46743864E-04 1.11188586E-04 + 0.0000000 0.0000000 0.0000000 9.54246480E-05 1.40826286E-04 -2.05562920E-05 + 0.0000000 0.0000000 0.0000000 1.75317000E-05 5.49807040E-05 5.52679440E-05 + 0.0000000 0.0000000 0.0000000 2.94594560E-05 3.71289380E-05 3.29246300E-05 + 0.0000000 0.0000000 0.0000000 -2.12302060E-05 -6.78260980E-05 -6.81154980E-05 + 0.0000000 0.0000000 0.0000000 3.50584060E-05 -2.51749920E-05 -4.64060140E-05 + 0.0000000 0.0000000 0.0000000 3.02041700E-05 3.29312980E-05 3.68416800E-05 + 0.0000000 0.0000000 0.0000000 6.31118600E-06 4.03692880E-05 4.03759220E-05 + 0.0000000 0.0000000 0.0000000 3.49478880E-05 -4.64151040E-05 -2.48857160E-05 + 0.0000000 0.0000000 0.0000000 -3.15562560E-05 -2.73362440E-05 -2.73453840E-05 + 0.0000000 0.0000000 0.0000000 1.64042960E-05 5.52418160E-05 5.55175920E-05 + 0.0000000 0.0000000 0.0000000 2.61515120E-05 3.74938840E-05 3.11547380E-05 + 0.0000000 0.0000000 0.0000000 -2.99253180E-05 -2.72065280E-05 -2.71992600E-05 + 0.0000000 0.0000000 0.0000000 3.11210840E-05 -4.44389760E-05 -2.24244760E-05 + 0.0000000 0.0000000 0.0000000 2.68802600E-05 3.11459860E-05 3.72181380E-05 + 0.0000000 0.0000000 0.0000000 6.43204800E-06 4.09396240E-05 4.09308200E-05 + 0.0000000 0.0000000 0.0000000 3.12489520E-05 -2.26942460E-05 -4.44460580E-05 + 0.0000000 0.0000000 0.0000000 -2.16981680E-05 -6.91620160E-05 -6.94317120E-05 + 0.0000000 0.0000000 0.0000000 2.81497984E-04 1.03060178E-04 -2.37927086E-04 + 0.0000000 0.0000000 0.0000000 3.36789182E-04 -1.94964684E-04 3.22863508E-04 + 0.0000000 0.0000000 0.0000000 2.81538392E-04 -2.38397456E-04 1.03573220E-04 + 0.0000000 0.0000000 0.0000000 9.10023600E-05 1.35541864E-04 -1.67612420E-05 + 0.0000000 0.0000000 0.0000000 9.09247320E-05 -1.67315580E-05 1.35071500E-04 + 0.0000000 0.0000000 0.0000000 2.91664780E-05 -5.43468120E-05 -5.99227840E-05 + 0.0000000 0.0000000 0.0000000 3.36720312E-04 3.23052640E-04 -1.95477806E-04 + 0.0000000 0.0000000 0.0000000 2.91173380E-05 -6.01119020E-05 -5.43172300E-05 + 0.0000000 0.0000000 0.0000000 2.18563878E-04 -2.21891162E-04 -2.39694288E-04 + 0.0000000 0.0000000 0.0000000 5.42609669E-03 -3.27098803E-03 3.72928817E-03 + 0.0000000 0.0000000 0.0000000 2.18512634E-04 -2.39767590E-04 -2.22235810E-04 + 0.0000000 0.0000000 0.0000000 3.91330566E-04 1.38208216E-04 -5.02572200E-05 + 0.0000000 0.0000000 0.0000000 3.91370784E-04 -5.01656060E-05 1.38134968E-04 + 0.0000000 0.0000000 0.0000000 -2.46687120E-05 -4.14856280E-05 -3.69335680E-05 + 0.0000000 0.0000000 0.0000000 5.42614830E-03 3.72904203E-03 -3.27064306E-03 + 0.0000000 0.0000000 0.0000000 -2.46287840E-05 -3.66870540E-05 -4.13939820E-05 + 0.0755890 0.0000000 0.0000000 -2.68613580E-02 -4.22286932E-03 -4.22286962E-03 + 0.0000000 0.0000000 0.0000000 1.57313024E-04 -6.38543180E-05 -5.67409400E-05 + 0.0000000 0.0000000 0.0000000 -6.03476466E-03 3.64880142E-03 3.64872989E-03 + 0.0000000 0.0000000 0.0000000 -6.12311770E-04 2.20881312E-04 -1.00877444E-04 + 0.0000000 0.0000000 0.0000000 1.56283032E-04 -5.68515580E-05 -6.38542920E-05 + 0.0000000 0.0000000 0.0000000 -9.78224236E-04 -3.77590680E-05 -3.78696520E-05 + 0.0000000 0.0000000 0.0000000 -6.12156142E-04 -1.00286148E-04 2.20952086E-04 + 0.0000000 0.0000000 0.0000000 -1.04476966E-03 2.04319476E-04 2.04910682E-04 + -0.0755890 0.0000000 0.0000000 2.68613580E-02 4.22286932E-03 4.22286967E-03 + 0.0000000 0.0000000 0.0000000 -1.57312964E-04 6.38542420E-05 5.67409700E-05 + 0.0000000 0.0000000 0.0000000 1.04476971E-03 -2.04319462E-04 -2.04910782E-04 + 0.0000000 0.0000000 0.0000000 6.12156180E-04 1.00286156E-04 -2.20952090E-04 + 0.0000000 0.0000000 0.0000000 -1.56283034E-04 5.68515720E-05 6.38542860E-05 + 0.0000000 0.0000000 0.0000000 9.78224206E-04 3.77590720E-05 3.78696940E-05 + 0.0000000 0.0000000 0.0000000 6.12311806E-04 -2.20881270E-04 1.00877464E-04 + 0.0000000 0.0000000 0.0000000 6.03476466E-03 -3.64880142E-03 -3.64872986E-03 + 0.0000000 0.0000000 0.0000000 -4.81807712E-03 3.60981749E-03 -3.13567003E-03 + 0.0000000 0.0000000 0.0000000 3.87986490E-04 -9.78739400E-05 -3.55433754E-04 + 0.0000000 0.0000000 0.0000000 -4.81801790E-03 -3.13496752E-03 3.61108865E-03 + 0.0000000 0.0000000 0.0000000 1.34741422E-04 -1.67769652E-04 6.64022140E-05 + 0.0000000 0.0000000 0.0000000 1.34892406E-04 6.65391760E-05 -1.67066860E-04 + 0.0000000 0.0000000 0.0000000 -2.79663420E-04 2.29372540E-05 6.36058340E-05 + 0.0000000 0.0000000 0.0000000 3.88123320E-04 -3.55762184E-04 -9.91455500E-05 + 0.0000000 0.0000000 0.0000000 -2.79708356E-04 6.39343120E-05 2.30741300E-05 + 0.0000000 0.0000000 0.0000000 -2.56227104E-04 1.16745858E-04 -2.61500982E-04 + 0.0000000 0.0000000 0.0000000 -3.13849498E-04 -2.11664618E-04 3.48013654E-04 + 0.0000000 0.0000000 0.0000000 -2.56374296E-04 -2.61681044E-04 1.17803562E-04 + 0.0000000 0.0000000 0.0000000 -8.14684760E-05 1.42000840E-04 -2.68078980E-05 + 0.0000000 0.0000000 0.0000000 -8.15075100E-05 -2.67835740E-05 1.41820852E-04 + 0.0000000 0.0000000 0.0000000 -1.64233020E-05 -4.62003060E-05 -6.36093660E-05 + 0.0000000 0.0000000 0.0000000 -3.13898646E-04 3.47911258E-04 -2.12722348E-04 + 0.0000000 0.0000000 0.0000000 -1.62661540E-05 -6.35068760E-05 -4.61760920E-05 + 0.0000000 0.0000000 0.0000000 5.12141020E-05 -5.59899060E-05 -5.62619520E-05 + 0.0000000 0.0000000 0.0000000 -4.60573340E-05 -3.31977500E-05 -3.03446040E-05 + 0.0000000 0.0000000 0.0000000 1.13523800E-05 4.25579960E-05 4.28364100E-05 + 0.0000000 0.0000000 0.0000000 -3.91980180E-05 4.85512660E-05 1.65908180E-05 + 0.0000000 0.0000000 0.0000000 -4.50812680E-05 -3.03378020E-05 -3.29256300E-05 + 0.0000000 0.0000000 0.0000000 5.86697880E-05 -4.11051980E-05 -4.10983520E-05 + 0.0000000 0.0000000 0.0000000 -3.90774200E-05 1.65827420E-05 4.82729020E-05 + 0.0000000 0.0000000 0.0000000 2.05393940E-05 5.43665940E-05 5.43585060E-05 + 0.0000000 0.0000000 0.0000000 -5.12141220E-05 5.59899120E-05 5.62620240E-05 + 0.0000000 0.0000000 0.0000000 4.60572860E-05 3.31976920E-05 3.03445720E-05 + 0.0000000 0.0000000 0.0000000 -2.05393580E-05 -5.43665820E-05 -5.43585260E-05 + 0.0000000 0.0000000 0.0000000 3.90773880E-05 -1.65827400E-05 -4.82728360E-05 + 0.0000000 0.0000000 0.0000000 4.50812320E-05 3.03377760E-05 3.29256260E-05 + 0.0000000 0.0000000 0.0000000 -5.86697980E-05 4.11051860E-05 4.10984280E-05 + 0.0000000 0.0000000 0.0000000 3.91979560E-05 -4.85513160E-05 -1.65907840E-05 + 0.0000000 0.0000000 0.0000000 -1.13523900E-05 -4.25580520E-05 -4.28364420E-05 + 0.0000000 0.0000000 0.0000000 3.13849440E-04 2.11664606E-04 -3.48013702E-04 + 0.0000000 0.0000000 0.0000000 2.56227146E-04 -1.16745878E-04 2.61500948E-04 + 0.0000000 0.0000000 0.0000000 3.13898672E-04 -3.47911176E-04 2.12722258E-04 + 0.0000000 0.0000000 0.0000000 1.62661740E-05 6.35068340E-05 4.61760720E-05 + 0.0000000 0.0000000 0.0000000 1.64233460E-05 4.62003240E-05 6.36094180E-05 + 0.0000000 0.0000000 0.0000000 8.15074620E-05 2.67836220E-05 -1.41820878E-04 + 0.0000000 0.0000000 0.0000000 2.56374272E-04 2.61681090E-04 -1.17803580E-04 + 0.0000000 0.0000000 0.0000000 8.14685560E-05 -1.42000792E-04 2.68078720E-05 + 0.0000000 0.0000000 0.0000000 -3.87986500E-04 9.78739860E-05 3.55433748E-04 + 0.0000000 0.0000000 0.0000000 4.81807710E-03 -3.60981757E-03 3.13567007E-03 + 0.0000000 0.0000000 0.0000000 -3.88123296E-04 3.55762176E-04 9.91454780E-05 + 0.0000000 0.0000000 0.0000000 2.79708458E-04 -6.39343260E-05 -2.30740820E-05 + 0.0000000 0.0000000 0.0000000 2.79663380E-04 -2.29371700E-05 -6.36058000E-05 + 0.0000000 0.0000000 0.0000000 -1.34892474E-04 -6.65391180E-05 1.67066856E-04 + 0.0000000 0.0000000 0.0000000 4.81801788E-03 3.13496748E-03 -3.61108868E-03 + 0.0000000 0.0000000 0.0000000 -1.34741456E-04 1.67769628E-04 -6.64022400E-05 + -0.0755890 0.0000000 0.0000000 2.62645306E-02 3.05940441E-03 3.05940569E-03 + 0.0000000 0.0000000 0.0000000 -1.53424468E-04 6.51813800E-05 5.37234700E-05 + 0.0000000 0.0000000 0.0000000 5.81430277E-03 -3.28424674E-03 -3.28422061E-03 + 0.0000000 0.0000000 0.0000000 6.23460524E-04 -2.32984278E-04 1.13660984E-04 + 0.0000000 0.0000000 0.0000000 -1.52380438E-04 5.38377720E-05 6.51813980E-05 + 0.0000000 0.0000000 0.0000000 9.68504598E-04 3.62401920E-05 3.63545760E-05 + 0.0000000 0.0000000 0.0000000 6.23401334E-04 1.13046750E-04 -2.33010090E-04 + 0.0000000 0.0000000 0.0000000 1.02854899E-03 -1.93001224E-04 -1.93615566E-04 + 0.0755890 0.0000000 0.0000000 -2.62645307E-02 -3.05940438E-03 -3.05940567E-03 + 0.0000000 0.0000000 0.0000000 1.53424376E-04 -6.51814240E-05 -5.37234280E-05 + 0.0000000 0.0000000 0.0000000 -1.02854891E-03 1.93001234E-04 1.93615622E-04 + 0.0000000 0.0000000 0.0000000 -6.23401352E-04 -1.13046726E-04 2.33010128E-04 + 0.0000000 0.0000000 0.0000000 1.52380432E-04 -5.38377700E-05 -6.51813980E-05 + 0.0000000 0.0000000 0.0000000 -9.68504708E-04 -3.62401300E-05 -3.63545120E-05 + 0.0000000 0.0000000 0.0000000 -6.23460536E-04 2.32984262E-04 -1.13661052E-04 + 0.0000000 0.0000000 0.0000000 -5.81430285E-03 3.28424670E-03 3.28422057E-03 + 0.0000000 0.0000000 0.0000000 5.02822583E-03 -3.96873067E-03 3.52370327E-03 + 0.0000000 0.0000000 0.0000000 -3.80807242E-04 9.59816800E-05 3.49866524E-04 + 0.0000000 0.0000000 0.0000000 5.02818390E-03 3.52310480E-03 -3.96991108E-03 + 0.0000000 0.0000000 0.0000000 -1.38209950E-04 1.63805254E-04 -7.08282300E-05 + 0.0000000 0.0000000 0.0000000 -1.38367028E-04 -7.09613940E-05 1.63206274E-04 + 0.0000000 0.0000000 0.0000000 2.85636040E-04 -2.42814100E-05 -6.34660320E-05 + 0.0000000 0.0000000 0.0000000 -3.80970634E-04 3.50175596E-04 9.71628120E-05 + 0.0000000 0.0000000 0.0000000 2.85684030E-04 -6.37748500E-05 -2.44146580E-05 + 0.0000000 0.0000000 0.0000000 2.74813224E-04 -1.32367786E-04 2.69371958E-04 + 0.0000000 0.0000000 0.0000000 3.26493458E-04 2.22568070E-04 -3.57720662E-04 + 0.0000000 0.0000000 0.0000000 2.74996232E-04 2.69607700E-04 -1.33438464E-04 + 0.0000000 0.0000000 0.0000000 8.15039820E-05 -1.41035814E-04 2.76698720E-05 + 0.0000000 0.0000000 0.0000000 8.15573380E-05 2.76508880E-05 -1.40800038E-04 + 0.0000000 0.0000000 0.0000000 1.91350000E-05 4.48337300E-05 6.37984740E-05 + 0.0000000 0.0000000 0.0000000 3.26539880E-04 -3.57674356E-04 2.23638768E-04 + 0.0000000 0.0000000 0.0000000 1.89588280E-05 6.37521760E-05 4.48147360E-05 + 0.0000000 0.0000000 0.0000000 -5.00862400E-05 5.42403800E-05 5.45306820E-05 + 0.0000000 0.0000000 0.0000000 4.95190280E-05 4.12824600E-05 3.38514320E-05 + 0.0000000 0.0000000 0.0000000 -1.30870600E-05 -4.09696600E-05 -4.12581340E-05 + 0.0000000 0.0000000 0.0000000 4.56843160E-05 -5.28779840E-05 -2.08191720E-05 + 0.0000000 0.0000000 0.0000000 4.85458260E-05 3.38551440E-05 4.09923460E-05 + 0.0000000 0.0000000 0.0000000 -5.84759460E-05 4.01705740E-05 4.01742420E-05 + 0.0000000 0.0000000 0.0000000 4.55650660E-05 -2.08207960E-05 -5.25895040E-05 + 0.0000000 0.0000000 0.0000000 -2.23552560E-05 -5.36452820E-05 -5.36470340E-05 + 0.0000000 0.0000000 0.0000000 5.00862940E-05 -5.42405060E-05 -5.45306440E-05 + 0.0000000 0.0000000 0.0000000 -4.95189720E-05 -4.12825380E-05 -3.38514640E-05 + 0.0000000 0.0000000 0.0000000 2.23552700E-05 5.36453620E-05 5.36469840E-05 + 0.0000000 0.0000000 0.0000000 -4.55650220E-05 2.08208600E-05 5.25895460E-05 + 0.0000000 0.0000000 0.0000000 -4.85457400E-05 -3.38551740E-05 -4.09923460E-05 + 0.0000000 0.0000000 0.0000000 5.84759780E-05 -4.01705220E-05 -4.01741740E-05 + 0.0000000 0.0000000 0.0000000 -4.56842500E-05 5.28779920E-05 2.08192140E-05 + 0.0000000 0.0000000 0.0000000 1.30871180E-05 4.09696900E-05 4.12581300E-05 + 0.0000000 0.0000000 0.0000000 -3.26493408E-04 -2.22568082E-04 3.57720660E-04 + 0.0000000 0.0000000 0.0000000 -2.74813184E-04 1.32367714E-04 -2.69372004E-04 + 0.0000000 0.0000000 0.0000000 -3.26539870E-04 3.57674340E-04 -2.23638752E-04 + 0.0000000 0.0000000 0.0000000 -1.89587320E-05 -6.37522140E-05 -4.48147120E-05 + 0.0000000 0.0000000 0.0000000 -1.91349600E-05 -4.48336780E-05 -6.37984640E-05 + 0.0000000 0.0000000 0.0000000 -8.15573300E-05 -2.76508780E-05 1.40800040E-04 + 0.0000000 0.0000000 0.0000000 -2.74996254E-04 -2.69607714E-04 1.33438388E-04 + 0.0000000 0.0000000 0.0000000 -8.15039760E-05 1.41035826E-04 -2.76699280E-05 + 0.0000000 0.0000000 0.0000000 3.80807202E-04 -9.59817180E-05 -3.49866590E-04 + 0.0000000 0.0000000 0.0000000 -5.02822582E-03 3.96873061E-03 -3.52370319E-03 + 0.0000000 0.0000000 0.0000000 3.80970588E-04 -3.50175508E-04 -9.71628660E-05 + 0.0000000 0.0000000 0.0000000 -2.85684110E-04 6.37748660E-05 2.44146560E-05 + 0.0000000 0.0000000 0.0000000 -2.85636050E-04 2.42813920E-05 6.34660000E-05 + 0.0000000 0.0000000 0.0000000 1.38366968E-04 7.09614560E-05 -1.63206256E-04 + 0.0000000 0.0000000 0.0000000 -5.02818392E-03 -3.52310480E-03 3.96991100E-03 + 0.0000000 0.0000000 0.0000000 1.38209912E-04 -1.63805258E-04 7.08282700E-05 + 0.0755890 0.0000000 0.0000000 -1.75479535E-02 5.52658650E-03 3.97025818E-03 + 0.0000000 0.0000000 0.0000000 1.39376466E-04 -7.97117520E-05 5.31439560E-05 + 0.0000000 0.0000000 0.0000000 -4.52171841E-03 5.15315790E-03 3.66090224E-03 + 0.0000000 0.0000000 0.0000000 -7.61508198E-04 7.69470780E-05 -1.02868018E-04 + 0.0000000 0.0000000 0.0000000 1.27574572E-04 -1.63600400E-05 5.47221040E-05 + 0.0000000 0.0000000 0.0000000 -5.96950398E-04 3.89853080E-05 3.20069700E-05 + 0.0000000 0.0000000 0.0000000 -7.51120208E-04 -1.75355362E-04 2.14384524E-04 + 0.0000000 0.0000000 0.0000000 -7.38810646E-04 1.99400638E-04 1.95590424E-04 + 0.0000000 0.0755890 0.0000000 4.94476439E-03 -1.79308150E-02 3.28774594E-03 + 0.0000000 0.0000000 0.0000000 -8.37240860E-05 1.36980974E-04 5.74131200E-05 + 0.0000000 0.0000000 0.0000000 1.72829114E-04 2.71760580E-04 2.61254856E-04 + 0.0000000 0.0000000 0.0000000 8.32502920E-05 2.51590690E-04 -3.65819916E-04 + 0.0000000 0.0000000 0.0000000 -8.27378860E-05 9.05416260E-05 6.35229720E-05 + 0.0000000 0.0000000 0.0000000 3.40757328E-04 2.65891960E-05 3.72907800E-05 + 0.0000000 0.0000000 0.0000000 -2.41082518E-04 2.33766302E-04 -3.49369854E-04 + 0.0000000 0.0000000 0.0000000 5.48952735E-03 -3.52219824E-03 -3.53955399E-03 + 0.0000000 0.0000000 0.0000000 -3.12699510E-03 5.28764070E-03 -3.12287725E-03 + 0.0000000 0.0000000 0.0000000 2.43039616E-04 -2.45405520E-04 -3.56041692E-04 + 0.0000000 0.0000000 0.0000000 4.12777359E-03 5.62816226E-03 -3.64492216E-03 + 0.0000000 0.0000000 0.0000000 1.18213506E-04 -1.84358556E-04 -4.36564000E-05 + 0.0000000 0.0000000 0.0000000 1.58738200E-06 -2.56730200E-06 -1.55051474E-04 + 0.0000000 0.0000000 0.0000000 1.63596940E-05 2.62688820E-05 6.70910140E-05 + 0.0000000 0.0000000 0.0000000 3.64092578E-04 -3.19821056E-04 -2.21487742E-04 + 0.0000000 0.0000000 0.0000000 9.08183500E-05 1.36383220E-04 -4.43700460E-05 + 0.0000000 0.0000000 0.0000000 1.99998466E-04 -7.33644272E-04 1.93275716E-04 + 0.0000000 0.0000000 0.0000000 -1.82493136E-04 -7.57586110E-04 2.21534860E-04 + 0.0000000 0.0000000 0.0000000 3.41162602E-04 3.43642620E-04 -2.09493826E-04 + 0.0000000 0.0000000 0.0000000 -1.26170080E-04 9.62166880E-05 -5.37687220E-05 + 0.0000000 0.0000000 0.0000000 -1.26084660E-05 -4.39506560E-05 5.43151280E-05 + 0.0000000 0.0000000 0.0000000 2.65493040E-05 -3.87598760E-05 5.16052000E-05 + 0.0000000 0.0000000 0.0000000 -3.09178776E-04 3.52843268E-04 -2.15116676E-04 + 0.0000000 0.0000000 0.0000000 1.41077262E-04 9.47483480E-05 -4.65481260E-05 + 0.0000000 0.0000000 0.0000000 8.78127180E-05 -7.97263740E-05 6.55165840E-05 + 0.0000000 0.0000000 0.0000000 2.73723720E-05 3.35193882E-04 3.68523100E-05 + 0.0000000 0.0000000 0.0000000 -6.22281360E-05 -9.55351140E-05 4.96762860E-05 + 0.0000000 0.0000000 0.0000000 -4.18222020E-05 3.53905882E-04 2.38545080E-05 + 0.0000000 0.0000000 0.0000000 2.41598860E-05 3.94315260E-05 4.07530140E-05 + 0.0000000 0.0000000 0.0000000 7.30094680E-05 -2.61542860E-05 3.99577920E-05 + 0.0000000 0.0000000 0.0000000 -3.46875720E-05 2.21279300E-05 4.93433480E-05 + 0.0000000 0.0000000 0.0000000 -4.66531320E-05 -1.28505020E-05 5.37365400E-05 + 0.0000000 0.0000000 0.0000000 -1.72475480E-05 1.28871764E-04 5.60911000E-05 + 0.0000000 0.0000000 0.0000000 3.65716140E-05 -6.00164024E-04 3.20477680E-05 + 0.0000000 0.0000000 0.0000000 -3.93871140E-05 1.42720160E-05 -1.40803242E-04 + 0.0000000 0.0000000 0.0000000 4.88206780E-05 2.53328960E-05 6.64576760E-05 + 0.0000000 0.0000000 0.0000000 3.59436140E-05 2.18070740E-05 3.31874240E-05 + 0.0000000 0.0000000 0.0000000 -2.60090920E-05 7.32882160E-05 4.13626580E-05 + 0.0000000 0.0000000 0.0000000 2.24952420E-05 2.00082000E-05 7.01548000E-05 + 0.0000000 0.0000000 0.0000000 -4.19548000E-06 -9.65538000E-07 -1.57188784E-04 + 0.0000000 0.0000000 0.0000000 2.44501738E-04 7.81460760E-05 -3.58239558E-04 + 0.0000000 0.0000000 0.0000000 2.61118538E-04 1.79818998E-04 2.59363038E-04 + 0.0000000 0.0000000 0.0000000 3.53945386E-04 -3.74739814E-04 9.42996340E-05 + 0.0000000 0.0000000 0.0000000 9.19375120E-05 4.40770486E-04 -2.32581460E-05 + 0.0000000 0.0000000 0.0000000 2.14462120E-05 5.34315060E-05 6.09594180E-05 + 0.0000000 0.0000000 0.0000000 1.52826460E-05 -3.96838520E-05 -1.41852556E-04 + 0.0000000 0.0000000 0.0000000 3.27545398E-04 3.29670264E-04 -1.90168668E-04 + 0.0000000 0.0000000 0.0000000 9.58807120E-05 -1.27833436E-04 -5.43613360E-05 + 0.0000000 0.0000000 0.0000000 8.48427620E-05 -7.66854912E-04 -1.11659236E-04 + 0.0000000 0.0000000 0.0000000 4.97680710E-03 -4.13200526E-03 3.27043479E-03 + 0.0000000 0.0000000 0.0000000 -3.83220004E-04 3.63738540E-04 1.02024358E-04 + 0.0000000 0.0000000 0.0000000 4.37362270E-04 9.28731720E-05 -2.41311380E-05 + 0.0000000 0.0000000 0.0000000 3.49251122E-04 -4.14274400E-05 2.36987940E-05 + 0.0000000 0.0000000 0.0000000 -9.36989560E-05 -5.77751940E-05 5.24730680E-05 + 0.0000000 0.0000000 0.0000000 5.42291081E-03 3.73473648E-03 -3.28607399E-03 + 0.0000000 0.0000000 0.0000000 -1.79820374E-04 1.22340650E-04 -4.00149860E-05 + 0.0755890 0.0000000 0.0000000 -2.55841208E-02 -5.74023925E-03 -4.40080285E-03 + 0.0000000 0.0000000 0.0000000 1.02681220E-05 8.27265120E-05 -5.58073400E-05 + 0.0000000 0.0000000 0.0000000 2.73465849E-03 -5.28468190E-03 -3.61035416E-03 + 0.0000000 0.0000000 0.0000000 -6.27331526E-04 2.36081292E-04 -2.11530822E-04 + 0.0000000 0.0000000 0.0000000 1.76406460E-05 1.75549020E-05 -5.57165440E-05 + 0.0000000 0.0000000 0.0000000 -6.70659684E-04 -3.56551560E-05 -2.94277120E-05 + 0.0000000 0.0000000 0.0000000 -6.41365582E-04 -1.42041896E-04 1.03818112E-04 + 0.0000000 0.0000000 0.0000000 -6.62037786E-04 1.29051648E-04 1.34551494E-04 + 0.0000000 -0.0755890 0.0000000 5.74023941E-03 2.55841209E-02 4.40080277E-03 + 0.0000000 0.0000000 0.0000000 -8.27265420E-05 -1.02680840E-05 5.58073200E-05 + 0.0000000 0.0000000 0.0000000 5.00196892E-04 -3.36125084E-04 -3.28451142E-04 + 0.0000000 0.0000000 0.0000000 -2.40479486E-04 -3.54637340E-04 2.31077326E-04 + 0.0000000 0.0000000 0.0000000 -8.27727940E-05 2.29145940E-05 6.32103420E-05 + 0.0000000 0.0000000 0.0000000 3.40278084E-04 4.82163960E-05 3.77513520E-05 + 0.0000000 0.0000000 0.0000000 8.38278580E-05 -3.71574626E-04 2.44119666E-04 + 0.0000000 0.0000000 0.0000000 5.15567895E-03 -4.12712433E-03 -4.10781577E-03 + 0.0000000 0.0000000 0.0000000 4.12712429E-03 -5.15567880E-03 4.10781595E-03 + 0.0000000 0.0000000 0.0000000 3.71574572E-04 -8.38278520E-05 -2.44119692E-04 + 0.0000000 0.0000000 0.0000000 -3.12695354E-03 -4.82355279E-03 3.59508832E-03 + 0.0000000 0.0000000 0.0000000 -9.60213600E-06 -1.94465280E-05 6.78065720E-05 + 0.0000000 0.0000000 0.0000000 1.10475552E-04 3.06771400E-05 -4.42234840E-05 + 0.0000000 0.0000000 0.0000000 9.09415640E-05 -4.97485140E-05 1.30540632E-04 + 0.0000000 0.0000000 0.0000000 2.54012358E-04 -2.84646864E-04 -1.13546066E-04 + 0.0000000 0.0000000 0.0000000 1.63987520E-05 6.09816620E-05 2.01361980E-05 + 0.0000000 0.0000000 0.0000000 -1.29051668E-04 6.62037658E-04 -1.34551454E-04 + 0.0000000 0.0000000 0.0000000 1.42042034E-04 6.41365350E-04 -1.03818158E-04 + 0.0000000 0.0000000 0.0000000 -2.54370944E-04 -2.66385482E-04 1.23203544E-04 + 0.0000000 0.0000000 0.0000000 7.50463980E-05 -1.54561260E-05 -2.68355840E-05 + 0.0000000 0.0000000 0.0000000 -3.90744320E-05 -3.48221800E-05 2.66961600E-05 + 0.0000000 0.0000000 0.0000000 5.26709980E-05 -2.98134340E-05 2.59542440E-05 + 0.0000000 0.0000000 0.0000000 2.84646980E-04 -2.54012506E-04 1.13546006E-04 + 0.0000000 0.0000000 0.0000000 -6.09817360E-05 -1.63986980E-05 -2.01362100E-05 + 0.0000000 0.0000000 0.0000000 -2.29146900E-05 8.27729220E-05 -6.32104300E-05 + 0.0000000 0.0000000 0.0000000 -4.82163900E-05 -3.40277962E-04 -3.77514560E-05 + 0.0000000 0.0000000 0.0000000 4.84520120E-05 6.61811700E-05 -7.82735340E-05 + 0.0000000 0.0000000 0.0000000 3.34801540E-05 -3.21572064E-04 -5.01277220E-05 + 0.0000000 0.0000000 0.0000000 -3.97072140E-05 -3.60465040E-05 -3.69264900E-05 + 0.0000000 0.0000000 0.0000000 -8.79226800E-06 2.62173420E-05 -4.06688160E-05 + 0.0000000 0.0000000 0.0000000 2.98133740E-05 -5.26709920E-05 -2.59542240E-05 + 0.0000000 0.0000000 0.0000000 3.48221600E-05 3.90744640E-05 -2.66961040E-05 + 0.0000000 0.0000000 0.0000000 -1.75547180E-05 -1.76407040E-05 5.57164940E-05 + 0.0000000 0.0000000 0.0000000 3.56551400E-05 6.70659542E-04 2.94276820E-05 + 0.0000000 0.0000000 0.0000000 -1.29290540E-05 -9.61453000E-05 5.98486320E-05 + 0.0000000 0.0000000 0.0000000 2.32381760E-05 -8.65949740E-05 -1.37869394E-04 + 0.0000000 0.0000000 0.0000000 3.60465100E-05 3.97072900E-05 3.69264280E-05 + 0.0000000 0.0000000 0.0000000 -2.62172340E-05 8.79210600E-06 4.06688780E-05 + 0.0000000 0.0000000 0.0000000 4.97484940E-05 -9.09416480E-05 -1.30540606E-04 + 0.0000000 0.0000000 0.0000000 -3.06771000E-05 -1.10475570E-04 4.42234520E-05 + 0.0000000 0.0000000 0.0000000 3.54637292E-04 2.40479656E-04 -2.31077268E-04 + 0.0000000 0.0000000 0.0000000 3.36125092E-04 -5.00196804E-04 3.28451186E-04 + 0.0000000 0.0000000 0.0000000 2.45374162E-04 -2.15761178E-04 2.25263130E-04 + 0.0000000 0.0000000 0.0000000 1.95698460E-05 -2.32627862E-04 4.90956300E-05 + 0.0000000 0.0000000 0.0000000 8.65949040E-05 -2.32381620E-05 1.37869432E-04 + 0.0000000 0.0000000 0.0000000 9.61451880E-05 1.29289900E-05 -5.98487060E-05 + 0.0000000 0.0000000 0.0000000 2.66385372E-04 2.54370914E-04 -1.23203572E-04 + 0.0000000 0.0000000 0.0000000 1.54561740E-05 -7.50463580E-05 2.68356280E-05 + 0.0000000 0.0000000 0.0000000 -2.36081400E-04 6.27331418E-04 2.11530826E-04 + 0.0000000 0.0000000 0.0000000 5.28468212E-03 -2.73465858E-03 3.61035408E-03 + 0.0000000 0.0000000 0.0000000 2.15761176E-04 -2.45374296E-04 -2.25262986E-04 + 0.0000000 0.0000000 0.0000000 2.32628002E-04 -1.95697540E-05 -4.90956160E-05 + 0.0000000 0.0000000 0.0000000 3.21572174E-04 -3.34802620E-05 5.01276020E-05 + 0.0000000 0.0000000 0.0000000 -6.61810620E-05 -4.84520680E-05 7.82734960E-05 + 0.0000000 0.0000000 0.0000000 4.82355295E-03 3.12695337E-03 -3.59508808E-03 + 0.0000000 0.0000000 0.0000000 1.94464680E-05 9.60216200E-06 -6.78065800E-05 + -0.0755890 0.0000000 0.0000000 2.44345354E-02 4.75735322E-03 2.94919987E-03 + 0.0000000 0.0000000 0.0000000 -8.09793200E-06 -8.06418920E-05 5.46576000E-05 + 0.0000000 0.0000000 0.0000000 -3.12424603E-03 5.49225182E-03 3.96953189E-03 + 0.0000000 0.0000000 0.0000000 6.40470504E-04 -2.49988306E-04 2.23887130E-04 + 0.0000000 0.0000000 0.0000000 -1.83561460E-05 -1.61835560E-05 5.51055860E-05 + 0.0000000 0.0000000 0.0000000 6.75160278E-04 4.00113820E-05 3.47427980E-05 + 0.0000000 0.0000000 0.0000000 6.46733338E-04 1.48376520E-04 -1.10412380E-04 + 0.0000000 0.0000000 0.0000000 6.61094488E-04 -1.19489012E-04 -1.26411672E-04 + 0.0000000 0.0755890 0.0000000 -4.75735332E-03 -2.44345355E-02 -2.94919973E-03 + 0.0000000 0.0000000 0.0000000 8.06419460E-05 8.09785600E-06 -5.46575520E-05 + 0.0000000 0.0000000 0.0000000 -4.99603548E-04 3.44355410E-04 3.40837196E-04 + 0.0000000 0.0000000 0.0000000 2.45777388E-04 3.62749170E-04 -2.34949118E-04 + 0.0000000 0.0000000 0.0000000 7.96646960E-05 -2.02191180E-05 -6.57834700E-05 + 0.0000000 0.0000000 0.0000000 -3.35740870E-04 -4.56925600E-05 -3.64480980E-05 + 0.0000000 0.0000000 0.0000000 -7.77051520E-05 3.64863660E-04 -2.40194922E-04 + 0.0000000 0.0000000 0.0000000 -4.97448767E-03 3.73620329E-03 3.74304885E-03 + 0.0000000 0.0000000 0.0000000 -3.73620334E-03 4.97448751E-03 -3.74304896E-03 + 0.0000000 0.0000000 0.0000000 -3.64863702E-04 7.77052300E-05 2.40194874E-04 + 0.0000000 0.0000000 0.0000000 3.52001877E-03 5.03410700E-03 -3.98516873E-03 + 0.0000000 0.0000000 0.0000000 9.45170200E-06 2.01012660E-05 -6.94709440E-05 + 0.0000000 0.0000000 0.0000000 -1.10662852E-04 -2.99200400E-05 4.63164320E-05 + 0.0000000 0.0000000 0.0000000 -9.46480540E-05 5.26199240E-05 -1.35004558E-04 + 0.0000000 0.0000000 0.0000000 -2.42616478E-04 2.76951846E-04 1.01390008E-04 + 0.0000000 0.0000000 0.0000000 -1.98415080E-05 -6.52461020E-05 -1.71601620E-05 + 0.0000000 0.0000000 0.0000000 1.19489096E-04 -6.61094304E-04 1.26411618E-04 + 0.0000000 0.0000000 0.0000000 -1.48376616E-04 -6.46733180E-04 1.10412346E-04 + 0.0000000 0.0000000 0.0000000 2.65747080E-04 2.76213118E-04 -1.28099758E-04 + 0.0000000 0.0000000 0.0000000 -7.44528480E-05 1.39598580E-05 2.76082100E-05 + 0.0000000 0.0000000 0.0000000 3.98229540E-05 3.71481460E-05 -2.78399720E-05 + 0.0000000 0.0000000 0.0000000 -4.93932440E-05 2.50623900E-05 -2.14326900E-05 + 0.0000000 0.0000000 0.0000000 -2.76951858E-04 2.42616598E-04 -1.01389912E-04 + 0.0000000 0.0000000 0.0000000 6.52460860E-05 1.98414460E-05 1.71601860E-05 + 0.0000000 0.0000000 0.0000000 2.02191920E-05 -7.96647480E-05 6.57835720E-05 + 0.0000000 0.0000000 0.0000000 4.56925900E-05 3.35740790E-04 3.64481320E-05 + 0.0000000 0.0000000 0.0000000 -5.29448840E-05 -6.95538120E-05 7.74247920E-05 + 0.0000000 0.0000000 0.0000000 -3.13017140E-05 3.27940294E-04 5.08046060E-05 + 0.0000000 0.0000000 0.0000000 4.26571100E-05 3.93487620E-05 3.70438100E-05 + 0.0000000 0.0000000 0.0000000 7.56430000E-06 -2.59972300E-05 4.05955420E-05 + 0.0000000 0.0000000 0.0000000 -2.50623480E-05 4.93933060E-05 2.14326900E-05 + 0.0000000 0.0000000 0.0000000 -3.71481320E-05 -3.98229440E-05 2.78400120E-05 + 0.0000000 0.0000000 0.0000000 1.61834920E-05 1.83562260E-05 -5.51056020E-05 + 0.0000000 0.0000000 0.0000000 -4.00113400E-05 -6.75160108E-04 -3.47427660E-05 + 0.0000000 0.0000000 0.0000000 1.24306080E-05 9.60074260E-05 -6.01328620E-05 + 0.0000000 0.0000000 0.0000000 -2.52949460E-05 8.83635540E-05 1.37803490E-04 + 0.0000000 0.0000000 0.0000000 -3.93487880E-05 -4.26572680E-05 -3.70438260E-05 + 0.0000000 0.0000000 0.0000000 2.59973380E-05 -7.56427600E-06 -4.05955240E-05 + 0.0000000 0.0000000 0.0000000 -5.26199460E-05 9.46480660E-05 1.35004512E-04 + 0.0000000 0.0000000 0.0000000 2.99200020E-05 1.10662860E-04 -4.63164060E-05 + 0.0000000 0.0000000 0.0000000 -3.62749094E-04 -2.45777512E-04 2.34949082E-04 + 0.0000000 0.0000000 0.0000000 -3.44355390E-04 4.99603482E-04 -3.40837280E-04 + 0.0000000 0.0000000 0.0000000 -2.50790238E-04 2.17242544E-04 -2.29508432E-04 + 0.0000000 0.0000000 0.0000000 -1.72364340E-05 2.41522012E-04 -5.18288000E-05 + 0.0000000 0.0000000 0.0000000 -8.83635860E-05 2.52949720E-05 -1.37803502E-04 + 0.0000000 0.0000000 0.0000000 -9.60074740E-05 -1.24304360E-05 6.01328640E-05 + 0.0000000 0.0000000 0.0000000 -2.76213078E-04 -2.65747090E-04 1.28099744E-04 + 0.0000000 0.0000000 0.0000000 -1.39599060E-05 7.44527620E-05 -2.76082260E-05 + 0.0000000 0.0000000 0.0000000 2.49988424E-04 -6.40470448E-04 -2.23887114E-04 + 0.0000000 0.0000000 0.0000000 -5.49225199E-03 3.12424616E-03 -3.96953176E-03 + 0.0000000 0.0000000 0.0000000 -2.17242612E-04 2.50790362E-04 2.29508352E-04 + 0.0000000 0.0000000 0.0000000 -2.41522102E-04 1.72363420E-05 5.18286760E-05 + 0.0000000 0.0000000 0.0000000 -3.27940436E-04 3.13017320E-05 -5.08045520E-05 + 0.0000000 0.0000000 0.0000000 6.95536520E-05 5.29449360E-05 -7.74248100E-05 + 0.0000000 0.0000000 0.0000000 -5.03410710E-03 -3.52001854E-03 3.98516865E-03 + 0.0000000 0.0000000 0.0000000 -2.01011620E-05 -9.45181200E-06 6.94709840E-05 + -0.0755890 0.0000000 0.0000000 1.79308149E-02 -4.94476423E-03 -3.28774603E-03 + 0.0000000 0.0000000 0.0000000 -1.36981124E-04 8.37240760E-05 -5.74131240E-05 + 0.0000000 0.0000000 0.0000000 4.13200526E-03 -4.97680693E-03 -3.27043488E-03 + 0.0000000 0.0000000 0.0000000 7.66854986E-04 -8.48428540E-05 1.11659284E-04 + 0.0000000 0.0000000 0.0000000 -1.28871742E-04 1.72476080E-05 -5.60910860E-05 + 0.0000000 0.0000000 0.0000000 6.00164164E-04 -3.65716160E-05 -3.20476740E-05 + 0.0000000 0.0000000 0.0000000 7.57586140E-04 1.82493178E-04 -2.21534912E-04 + 0.0000000 0.0000000 0.0000000 7.33644408E-04 -1.99998466E-04 -1.93275716E-04 + 0.0000000 -0.0755890 0.0000000 -5.52658661E-03 1.75479535E-02 -3.97025810E-03 + 0.0000000 0.0000000 0.0000000 7.97118120E-05 -1.39376442E-04 -5.31439660E-05 + 0.0000000 0.0000000 0.0000000 -1.79819146E-04 -2.61118590E-04 -2.59363090E-04 + 0.0000000 0.0000000 0.0000000 -7.81460140E-05 -2.44501756E-04 3.58239474E-04 + 0.0000000 0.0000000 0.0000000 7.97263360E-05 -8.78128000E-05 -6.55166320E-05 + 0.0000000 0.0000000 0.0000000 -3.35193970E-04 -2.73723940E-05 -3.68523020E-05 + 0.0000000 0.0000000 0.0000000 2.45405666E-04 -2.43039606E-04 3.56041688E-04 + 0.0000000 0.0000000 0.0000000 -5.28764078E-03 3.12699514E-03 3.12287712E-03 + 0.0000000 0.0000000 0.0000000 3.52219818E-03 -5.48952725E-03 3.53955409E-03 + 0.0000000 0.0000000 0.0000000 -2.33766264E-04 2.41082538E-04 3.49369920E-04 + 0.0000000 0.0000000 0.0000000 -3.73473641E-03 -5.42291064E-03 3.28607406E-03 + 0.0000000 0.0000000 0.0000000 -1.22340760E-04 1.79820320E-04 4.00149280E-05 + 0.0000000 0.0000000 0.0000000 9.65568000E-07 4.19550000E-06 1.57188822E-04 + 0.0000000 0.0000000 0.0000000 -2.00082500E-05 -2.24952240E-05 -7.01547940E-05 + 0.0000000 0.0000000 0.0000000 -3.52843116E-04 3.09178824E-04 2.15116742E-04 + 0.0000000 0.0000000 0.0000000 -9.47484180E-05 -1.41077260E-04 4.65481880E-05 + 0.0000000 0.0000000 0.0000000 -1.99400598E-04 7.38810584E-04 -1.95590366E-04 + 0.0000000 0.0000000 0.0000000 1.75355282E-04 7.51120016E-04 -2.14384506E-04 + 0.0000000 0.0000000 0.0000000 -3.29670272E-04 -3.27545566E-04 1.90168654E-04 + 0.0000000 0.0000000 0.0000000 1.27833516E-04 -9.58806740E-05 5.43613660E-05 + 0.0000000 0.0000000 0.0000000 1.28505200E-05 4.66530260E-05 -5.37365600E-05 + 0.0000000 0.0000000 0.0000000 -2.21278580E-05 3.46875460E-05 -4.93433120E-05 + 0.0000000 0.0000000 0.0000000 3.19820934E-04 -3.64092738E-04 2.21487678E-04 + 0.0000000 0.0000000 0.0000000 -1.36383170E-04 -9.08182460E-05 4.43700280E-05 + 0.0000000 0.0000000 0.0000000 -9.05414900E-05 8.27379400E-05 -6.35230640E-05 + 0.0000000 0.0000000 0.0000000 -2.65892220E-05 -3.40757298E-04 -3.72908380E-05 + 0.0000000 0.0000000 0.0000000 5.77753140E-05 9.36990180E-05 -5.24731600E-05 + 0.0000000 0.0000000 0.0000000 4.14275560E-05 -3.49250956E-04 -2.36989020E-05 + 0.0000000 0.0000000 0.0000000 -2.18071620E-05 -3.59435940E-05 -3.31874780E-05 + 0.0000000 0.0000000 0.0000000 -7.32882200E-05 2.60091180E-05 -4.13626520E-05 + 0.0000000 0.0000000 0.0000000 3.87599360E-05 -2.65493100E-05 -5.16052060E-05 + 0.0000000 0.0000000 0.0000000 4.39506900E-05 1.26084400E-05 -5.43150940E-05 + 0.0000000 0.0000000 0.0000000 1.63600680E-05 -1.27574602E-04 -5.47220600E-05 + 0.0000000 0.0000000 0.0000000 -3.89852780E-05 5.96950188E-04 -3.20069120E-05 + 0.0000000 0.0000000 0.0000000 3.96838420E-05 -1.52827500E-05 1.41852526E-04 + 0.0000000 0.0000000 0.0000000 -5.34314400E-05 -2.14461800E-05 -6.09593820E-05 + 0.0000000 0.0000000 0.0000000 -3.94315020E-05 -2.41597960E-05 -4.07530140E-05 + 0.0000000 0.0000000 0.0000000 2.61543560E-05 -7.30095000E-05 -3.99578040E-05 + 0.0000000 0.0000000 0.0000000 -2.62689380E-05 -1.63596320E-05 -6.70910220E-05 + 0.0000000 0.0000000 0.0000000 2.56730000E-06 -1.58742400E-06 1.55051448E-04 + 0.0000000 0.0000000 0.0000000 -2.51590738E-04 -8.32502000E-05 3.65819896E-04 + 0.0000000 0.0000000 0.0000000 -2.71760664E-04 -1.72828958E-04 -2.61254832E-04 + 0.0000000 0.0000000 0.0000000 -3.63738424E-04 3.83220016E-04 -1.02024390E-04 + 0.0000000 0.0000000 0.0000000 -9.28732960E-05 -4.37362102E-04 2.41311420E-05 + 0.0000000 0.0000000 0.0000000 -2.53328980E-05 -4.88207380E-05 -6.64577480E-05 + 0.0000000 0.0000000 0.0000000 -1.42719660E-05 3.93871480E-05 1.40803262E-04 + 0.0000000 0.0000000 0.0000000 -3.43642448E-04 -3.41162494E-04 2.09494012E-04 + 0.0000000 0.0000000 0.0000000 -9.62167840E-05 1.26170078E-04 5.37687840E-05 + 0.0000000 0.0000000 0.0000000 -7.69469860E-05 7.61508074E-04 1.02868022E-04 + 0.0000000 0.0000000 0.0000000 -5.15315803E-03 4.52171835E-03 -3.66090216E-03 + 0.0000000 0.0000000 0.0000000 3.74739720E-04 -3.53945560E-04 -9.42995420E-05 + 0.0000000 0.0000000 0.0000000 -4.40770630E-04 -9.19374780E-05 2.32580760E-05 + 0.0000000 0.0000000 0.0000000 -3.53905962E-04 4.18221480E-05 -2.38544320E-05 + 0.0000000 0.0000000 0.0000000 9.55350400E-05 6.22280540E-05 -4.96761920E-05 + 0.0000000 0.0000000 0.0000000 -5.62816239E-03 -4.12777381E-03 3.64492205E-03 + 0.0000000 0.0000000 0.0000000 1.84358656E-04 -1.18213424E-04 4.36562960E-05 + 0.0755890 0.0000000 0.0000000 -2.10586278E-02 -1.63868330E-04 3.10788772E-04 + 0.0000000 0.0000000 0.0000000 -2.27814752E-04 -1.66971190E-04 3.08501622E-04 + 0.0000000 0.0000000 0.0000000 -8.59533572E-04 -1.31179540E-05 -8.63675908E-04 + 0.0000000 0.0000000 0.0000000 -7.08639694E-04 1.72229768E-04 -1.61866348E-04 + 0.0000000 0.0000000 0.0000000 -2.81871640E-05 -1.34385180E-05 5.51074160E-05 + 0.0000000 0.0000000 0.0000000 -5.36012472E-04 -1.37653680E-05 5.53477120E-05 + 0.0000000 0.0000000 0.0000000 -5.29321286E-04 7.59819400E-06 -5.44002000E-04 + 0.0000000 0.0000000 0.0000000 -6.89491950E-04 1.79414314E-04 1.61142246E-04 + 0.0000000 0.0000000 0.0000000 8.76608362E-03 3.94056510E-04 8.94569440E-03 + 0.0000000 0.0000000 0.0000000 -2.90763420E-05 9.93730200E-06 4.05025840E-05 + 0.0000000 0.0000000 0.0000000 2.77811182E-04 -9.38524620E-05 -1.21015518E-04 + 0.0000000 0.0000000 0.0000000 -1.16714076E-04 -8.71641080E-05 -2.78169180E-05 + 0.0000000 0.0000000 0.0000000 -1.69933120E-05 2.90483600E-06 -1.67847780E-05 + 0.0000000 0.0000000 0.0000000 3.80067038E-04 4.07084800E-06 7.67503900E-05 + 0.0000000 0.0000000 0.0000000 -3.90171805E-03 -3.88361716E-03 5.27173156E-03 + 0.0000000 0.0000000 0.0000000 5.27270234E-03 -3.87459101E-03 -3.83758137E-03 + 0.0000000 0.0000000 0.0755890 2.96906492E-04 1.60320312E-04 -2.10667445E-02 + 0.0000000 0.0000000 0.0000000 3.08911196E-04 -1.65936728E-04 -2.68131614E-04 + 0.0000000 0.0000000 0.0000000 4.63545558E-04 8.05386000E-06 4.68488846E-04 + 0.0000000 0.0000000 0.0000000 2.21703760E-04 2.00690676E-04 3.22007158E-04 + 0.0000000 0.0000000 0.0000000 5.57521360E-05 1.34094840E-05 -2.63819420E-05 + 0.0000000 0.0000000 0.0000000 5.45938900E-05 -1.36938220E-05 9.06775520E-05 + 0.0000000 0.0000000 0.0000000 1.49678604E-04 -8.82004000E-06 1.31690008E-04 + 0.0000000 0.0000000 0.0000000 -1.11596392E-04 -2.01258436E-04 2.94933658E-04 + 0.0000000 0.0000000 0.0000000 3.86006776E-03 3.78403553E-03 5.35981511E-03 + 0.0000000 0.0000000 0.0000000 3.82801680E-05 4.62758000E-07 3.78627100E-05 + 0.0000000 0.0000000 0.0000000 -2.61053900E-05 8.75423340E-05 -1.20082082E-04 + 0.0000000 0.0000000 0.0000000 -6.43772160E-05 7.37187220E-05 -8.63118000E-07 + 0.0000000 0.0000000 0.0000000 3.72908880E-05 1.63655320E-05 -4.29149100E-05 + 0.0000000 0.0000000 0.0000000 7.45901700E-05 -2.66167600E-06 7.45487360E-05 + 0.0000000 0.0000000 0.0000000 -3.45367315E-03 3.49207966E-03 5.07345845E-03 + 0.0000000 0.0000000 0.0000000 -1.45105380E-05 9.28972820E-05 -4.94481140E-05 + 0.0000000 0.0000000 0.0000000 -2.59740640E-04 1.58744470E-04 2.97823024E-04 + 0.0000000 0.0000000 0.0000000 2.91389082E-04 1.65680528E-04 3.08330716E-04 + 0.0000000 0.0000000 0.0000000 -1.72581676E-04 -1.79125608E-04 -7.16345154E-04 + 0.0000000 0.0000000 0.0000000 -1.68318380E-05 2.46896000E-07 -1.91477440E-05 + 0.0000000 0.0000000 0.0000000 9.22952120E-05 1.31539840E-05 5.62679900E-05 + 0.0000000 0.0000000 0.0000000 -6.76430460E-05 1.34123480E-05 5.53937920E-05 + 0.0000000 0.0000000 0.0000000 1.54774776E-04 -1.72023904E-04 -6.82192858E-04 + 0.0000000 0.0000000 0.0000000 7.99943000E-06 -3.32384000E-07 9.37325000E-06 + 0.0000000 0.0000000 0.0000000 3.65108000E-05 -1.03357200E-05 -2.41600720E-05 + 0.0000000 0.0000000 0.0000000 6.95639860E-05 -2.18852000E-06 7.00387060E-05 + 0.0000000 0.0000000 0.0000000 -6.34528440E-05 -7.85117720E-05 3.00479976E-04 + 0.0000000 0.0000000 0.0000000 -5.14009200E-06 -7.16960940E-05 -6.16803440E-05 + 0.0000000 0.0000000 0.0000000 7.27996860E-05 -5.93201200E-06 3.70596042E-04 + 0.0000000 0.0000000 0.0000000 1.40631100E-05 7.95728000E-07 1.50938740E-05 + 0.0000000 0.0000000 0.0000000 -2.04928680E-05 -9.88547300E-05 -1.13926952E-04 + 0.0000000 0.0000000 0.0000000 -4.81898560E-05 -9.06270740E-05 -1.96941360E-05 + 0.0000000 0.0000000 0.0000000 2.98278290E-04 1.57733874E-04 -2.19801814E-04 + 0.0000000 0.0000000 0.0000000 2.98426812E-04 -1.59131522E-04 2.84223482E-04 + 0.0000000 0.0000000 0.0000000 3.11668974E-04 -1.92749134E-04 2.14713108E-04 + 0.0000000 0.0000000 0.0000000 6.88039600E-05 1.38426800E-06 6.88647700E-05 + 0.0000000 0.0000000 0.0000000 5.55426220E-05 1.30660020E-05 -5.34730044E-04 + 0.0000000 0.0000000 0.0000000 5.55018960E-05 -1.34349380E-05 -6.85645560E-05 + 0.0000000 0.0000000 0.0000000 2.85062542E-04 1.92167438E-04 -1.03090410E-04 + 0.0000000 0.0000000 0.0000000 4.17267560E-05 -1.42532800E-06 4.22747920E-05 + 0.0000000 0.0000000 0.0000000 -2.33033520E-05 -2.88914400E-06 -2.90846240E-05 + 0.0000000 0.0000000 0.0000000 5.15954110E-03 -3.39870862E-03 3.47264612E-03 + 0.0000000 0.0000000 0.0000000 -1.16148022E-04 9.08469500E-05 2.69693326E-04 + 0.0000000 0.0000000 0.0000000 2.94946972E-04 7.69178280E-05 -6.29259980E-05 + 0.0000000 0.0000000 0.0000000 3.73596952E-04 1.67221400E-06 3.77415042E-04 + 0.0000000 0.0000000 0.0000000 -3.87928240E-05 -1.29652560E-05 3.97920600E-05 + 0.0000000 0.0000000 0.0000000 5.07331743E-03 3.50313858E-03 -3.51882222E-03 + 0.0000000 0.0000000 0.0000000 -1.13089374E-04 1.04922468E-04 -1.45856040E-05 + 0.0755890 0.0000000 0.0000000 -2.16695030E-02 1.72393436E-04 -3.19794066E-04 + 0.0000000 0.0000000 0.0000000 3.67146974E-04 1.58735884E-04 -2.98183686E-04 + 0.0000000 0.0000000 0.0000000 -5.37755802E-04 -3.26759312E-04 5.37863950E-04 + 0.0000000 0.0000000 0.0000000 -6.83197468E-04 1.44503334E-04 -1.53601254E-04 + 0.0000000 0.0000000 0.0000000 1.73274646E-04 1.35052660E-05 -5.52955720E-05 + 0.0000000 0.0000000 0.0000000 -7.36643618E-04 1.37224100E-05 -5.51780480E-05 + 0.0000000 0.0000000 0.0000000 -8.54265834E-04 -3.15992350E-04 8.54130944E-04 + 0.0000000 0.0000000 0.0000000 -7.16262074E-04 1.52166372E-04 1.70100936E-04 + 0.0000000 0.0000000 0.0000000 1.50539186E-03 7.62715307E-03 -1.50718667E-03 + 0.0000000 0.0000000 0.0000000 -1.37207836E-04 1.18631210E-04 7.38237860E-05 + 0.0000000 0.0000000 0.0000000 4.05773218E-04 1.62964580E-05 4.29019860E-05 + 0.0000000 0.0000000 0.0000000 -4.50009040E-05 -2.36304980E-05 -1.02316740E-04 + 0.0000000 0.0000000 0.0000000 -1.46275998E-04 1.13225516E-04 1.46577922E-04 + 0.0000000 0.0000000 0.0000000 3.05098360E-04 6.81766520E-05 1.73956400E-06 + 0.0000000 0.0000000 0.0000000 3.35368570E-03 3.37329435E-03 -5.18508832E-03 + 0.0000000 0.0000000 0.0000000 5.38124071E-03 -3.76478345E-03 -3.80281218E-03 + 0.0000000 0.0000000 -0.0755890 3.19756360E-04 1.71607162E-04 2.16695033E-02 + 0.0000000 0.0000000 0.0000000 3.08147610E-04 -1.66266984E-04 -3.34847798E-04 + 0.0000000 0.0000000 0.0000000 1.45105334E-04 6.03106740E-04 -1.45087602E-04 + 0.0000000 0.0000000 0.0000000 -1.02361798E-04 -3.93384948E-04 -2.84801712E-04 + 0.0000000 0.0000000 0.0000000 5.52966860E-05 1.35269940E-05 -1.73870816E-04 + 0.0000000 0.0000000 0.0000000 5.65010780E-05 -1.32361700E-05 1.09604854E-04 + 0.0000000 0.0000000 0.0000000 4.75909972E-04 -6.02636254E-04 -4.75829578E-04 + 0.0000000 0.0000000 0.0000000 2.14281046E-04 3.93953706E-04 -3.11513998E-04 + 0.0000000 0.0000000 0.0000000 -3.39835341E-03 -3.47987587E-03 -5.09318855E-03 + 0.0000000 0.0000000 0.0000000 -6.98201640E-05 -1.08738332E-04 7.08170580E-05 + 0.0000000 0.0000000 0.0000000 1.02549530E-04 -2.35096380E-05 4.52976000E-05 + 0.0000000 0.0000000 0.0000000 8.33666400E-06 9.46535600E-06 -7.63297900E-05 + 0.0000000 0.0000000 0.0000000 -9.17243860E-05 -9.42169380E-05 1.20427356E-04 + 0.0000000 0.0000000 0.0000000 2.89646000E-07 -6.67660300E-05 -4.29080000E-08 + 0.0000000 0.0000000 0.0000000 3.80383559E-03 -3.76553329E-03 -5.38305075E-03 + 0.0000000 0.0000000 0.0000000 9.44715860E-05 -1.53866720E-05 -1.62211520E-05 + 0.0000000 0.0000000 0.0000000 3.35358754E-04 -1.67076282E-04 -3.08110308E-04 + 0.0000000 0.0000000 0.0000000 -3.03303822E-04 -1.57255668E-04 -2.98044270E-04 + 0.0000000 0.0000000 0.0000000 1.53691602E-04 1.45008222E-04 6.83089160E-04 + 0.0000000 0.0000000 0.0000000 9.73665800E-06 2.73928100E-05 -9.82723200E-06 + 0.0000000 0.0000000 0.0000000 -1.09387452E-04 -1.32134940E-05 -5.65020700E-05 + 0.0000000 0.0000000 0.0000000 1.33731798E-04 -1.33538940E-05 -5.52062420E-05 + 0.0000000 0.0000000 0.0000000 -1.70174526E-04 1.52645856E-04 7.16396624E-04 + 0.0000000 0.0000000 0.0000000 -1.86214940E-05 2.61742720E-05 1.86949420E-05 + 0.0000000 0.0000000 0.0000000 -7.40010060E-05 1.19302956E-04 1.39002560E-04 + 0.0000000 0.0000000 0.0000000 5.30140200E-06 6.90564120E-05 -5.12423200E-06 + 0.0000000 0.0000000 0.0000000 1.03402760E-05 -4.42735600E-06 -3.77494214E-04 + 0.0000000 0.0000000 0.0000000 7.63769300E-05 9.46617400E-06 -8.56956200E-06 + 0.0000000 0.0000000 0.0000000 -1.70379200E-06 6.82926200E-05 -3.05400190E-04 + 0.0000000 0.0000000 0.0000000 -6.70280120E-05 8.19954140E-05 6.69922020E-05 + 0.0000000 0.0000000 0.0000000 9.00004740E-05 3.03950040E-05 4.93813680E-05 + 0.0000000 0.0000000 0.0000000 1.60359980E-05 -1.67891800E-05 -9.54941580E-05 + 0.0000000 0.0000000 0.0000000 2.98182494E-04 1.57956924E-04 -3.67147092E-04 + 0.0000000 0.0000000 0.0000000 2.98045320E-04 -1.56499826E-04 3.02792954E-04 + 0.0000000 0.0000000 0.0000000 2.84844146E-04 -3.93476400E-04 1.02344154E-04 + 0.0000000 0.0000000 0.0000000 4.18730440E-05 2.02634060E-04 -4.19155000E-05 + 0.0000000 0.0000000 0.0000000 5.51797300E-05 1.37463340E-05 7.37239676E-04 + 0.0000000 0.0000000 0.0000000 5.52047800E-05 -1.33769360E-05 -1.33949410E-04 + 0.0000000 0.0000000 0.0000000 3.11558774E-04 3.94047322E-04 -2.14361576E-04 + 0.0000000 0.0000000 0.0000000 6.88335620E-05 -2.02590992E-04 -6.88782180E-05 + 0.0000000 0.0000000 0.0000000 -1.33244444E-04 -1.31611286E-04 1.33825928E-04 + 0.0000000 0.0000000 0.0000000 5.09260670E-03 -3.47775293E-03 3.39735623E-03 + 0.0000000 0.0000000 0.0000000 -4.23942820E-05 1.62716560E-05 -4.06069786E-04 + 0.0000000 0.0000000 0.0000000 3.76986640E-04 -4.52275400E-06 -1.03873360E-05 + 0.0000000 0.0000000 0.0000000 2.98465620E-04 -7.38839900E-05 -2.98968224E-04 + 0.0000000 0.0000000 0.0000000 -1.19924718E-04 -9.43165320E-05 9.14776480E-05 + 0.0000000 0.0000000 0.0000000 5.18450066E-03 3.37191235E-03 -3.35187460E-03 + 0.0000000 0.0000000 0.0000000 -4.87940140E-05 3.11236820E-05 -8.98153140E-05 + -0.0755890 0.0000000 0.0000000 2.16462502E-02 -1.53068086E-04 2.86176108E-04 + 0.0000000 0.0000000 0.0000000 -3.75156698E-04 -1.66813124E-04 3.08580022E-04 + 0.0000000 0.0000000 0.0000000 5.35341118E-04 3.22687778E-04 -5.35380018E-04 + 0.0000000 0.0000000 0.0000000 6.88579862E-04 -1.53079700E-04 1.62233344E-04 + 0.0000000 0.0000000 0.0000000 -1.74233098E-04 -1.33296880E-05 5.55854600E-05 + 0.0000000 0.0000000 0.0000000 7.36191400E-04 -1.31219280E-05 5.57288120E-05 + 0.0000000 0.0000000 0.0000000 8.69272778E-04 3.33376266E-04 -8.69261090E-04 + 0.0000000 0.0000000 0.0000000 7.08696228E-04 -1.45371264E-04 -1.64355912E-04 + 0.0000000 0.0000000 0.0000000 -1.69093154E-03 -6.88764326E-03 1.69268948E-03 + 0.0000000 0.0000000 0.0000000 1.33501158E-04 -1.19727410E-04 -6.99547160E-05 + 0.0000000 0.0000000 0.0000000 -3.99865224E-04 -2.02026880E-05 -4.63515580E-05 + 0.0000000 0.0000000 0.0000000 4.38506740E-05 2.29851420E-05 1.01927490E-04 + 0.0000000 0.0000000 0.0000000 1.45603012E-04 -1.07975310E-04 -1.45909272E-04 + 0.0000000 0.0000000 0.0000000 -2.97445546E-04 -6.99684060E-05 2.75050400E-06 + 0.0000000 0.0000000 0.0000000 -3.74287631E-03 -3.75556636E-03 5.38150574E-03 + 0.0000000 0.0000000 0.0000000 -5.18219477E-03 3.38242766E-03 3.42042029E-03 + 0.0000000 0.0000000 0.0755890 -2.86206888E-04 -1.52295424E-04 -2.16462505E-02 + 0.0000000 0.0000000 0.0000000 -2.98582128E-04 1.57694748E-04 3.26370274E-04 + 0.0000000 0.0000000 0.0000000 -1.36106590E-04 -5.86362880E-04 1.36031754E-04 + 0.0000000 0.0000000 0.0000000 1.12285330E-04 4.03053666E-04 2.95153610E-04 + 0.0000000 0.0000000 0.0000000 -5.55846040E-05 -1.33536040E-05 1.74833472E-04 + 0.0000000 0.0000000 0.0000000 -5.44744820E-05 1.36308540E-05 -1.10375034E-04 + 0.0000000 0.0000000 0.0000000 -4.56604078E-04 5.87409298E-04 4.56590844E-04 + 0.0000000 0.0000000 0.0000000 -2.22089914E-04 -4.02475212E-04 3.22099766E-04 + 0.0000000 0.0000000 0.0000000 3.78452431E-03 3.85347437E-03 5.29845498E-03 + 0.0000000 0.0000000 0.0000000 7.22243980E-05 1.09926098E-04 -7.32417720E-05 + 0.0000000 0.0000000 0.0000000 -1.02175878E-04 2.28838820E-05 -4.41618500E-05 + 0.0000000 0.0000000 0.0000000 -1.31161940E-05 -7.68712600E-06 8.02253220E-05 + 0.0000000 0.0000000 0.0000000 8.98358140E-05 9.75855860E-05 -1.24346116E-04 + 0.0000000 0.0000000 0.0000000 -1.33451400E-06 6.15422600E-05 1.09999800E-06 + 0.0000000 0.0000000 0.0000000 -3.42141252E-03 3.38312618E-03 5.18394072E-03 + 0.0000000 0.0000000 0.0000000 -8.95723860E-05 1.84258540E-05 1.46524100E-05 + 0.0000000 0.0000000 0.0000000 -3.26877020E-04 1.58443776E-04 2.98613000E-04 + 0.0000000 0.0000000 0.0000000 3.11310888E-04 1.68090452E-04 3.08759032E-04 + 0.0000000 0.0000000 0.0000000 -1.62290454E-04 -1.53551262E-04 -6.88540738E-04 + 0.0000000 0.0000000 0.0000000 -7.55669200E-06 -2.59293540E-05 7.61380800E-06 + 0.0000000 0.0000000 0.0000000 1.10154278E-04 1.36080140E-05 5.44734220E-05 + 0.0000000 0.0000000 0.0000000 -1.32537112E-04 1.34753540E-05 5.56668500E-05 + 0.0000000 0.0000000 0.0000000 1.64429428E-04 -1.45867642E-04 -7.08707554E-04 + 0.0000000 0.0000000 0.0000000 1.72894920E-05 -2.71637060E-05 -1.73629780E-05 + 0.0000000 0.0000000 0.0000000 7.01390700E-05 -1.20343344E-04 -1.35258396E-04 + 0.0000000 0.0000000 0.0000000 -6.14893000E-06 -7.91489180E-05 5.96452000E-06 + 0.0000000 0.0000000 0.0000000 -1.17320940E-05 2.61618400E-06 3.81043534E-04 + 0.0000000 0.0000000 0.0000000 -8.02685420E-05 -7.65428600E-06 1.33646440E-05 + 0.0000000 0.0000000 0.0000000 -2.80504200E-06 -7.01059860E-05 2.97751810E-04 + 0.0000000 0.0000000 0.0000000 6.64302080E-05 -8.05761200E-05 -6.63756100E-05 + 0.0000000 0.0000000 0.0000000 -9.60884420E-05 -2.43575720E-05 -4.99483300E-05 + 0.0000000 0.0000000 0.0000000 -1.44761920E-05 1.97581300E-05 9.05643440E-05 + 0.0000000 0.0000000 0.0000000 -3.08580686E-04 -1.66028744E-04 3.75156738E-04 + 0.0000000 0.0000000 0.0000000 -3.08758022E-04 1.67282446E-04 -3.10804232E-04 + 0.0000000 0.0000000 0.0000000 -2.95205262E-04 4.03219598E-04 -1.12210690E-04 + 0.0000000 0.0000000 0.0000000 -4.20866980E-05 -2.00468554E-04 4.21384200E-05 + 0.0000000 0.0000000 0.0000000 -5.57273640E-05 -1.31438700E-05 -7.36791798E-04 + 0.0000000 0.0000000 0.0000000 -5.56684220E-05 1.34983580E-05 1.32757878E-04 + 0.0000000 0.0000000 0.0000000 -3.22149786E-04 -4.02637590E-04 2.22103210E-04 + 0.0000000 0.0000000 0.0000000 -6.87957740E-05 2.00507956E-04 6.88459560E-05 + 0.0000000 0.0000000 0.0000000 1.39537490E-04 1.27640688E-04 -1.40134620E-04 + 0.0000000 0.0000000 0.0000000 -5.29785842E-03 3.85141391E-03 -3.78350609E-03 + 0.0000000 0.0000000 0.0000000 4.58603600E-05 -2.01955780E-05 4.00176408E-04 + 0.0000000 0.0000000 0.0000000 -3.80552322E-04 2.74342800E-06 1.17753420E-05 + 0.0000000 0.0000000 0.0000000 -3.03461194E-04 7.43130140E-05 3.03957414E-04 + 0.0000000 0.0000000 0.0000000 1.23849936E-04 9.76762100E-05 -8.96012960E-05 + 0.0000000 0.0000000 0.0000000 -5.38091419E-03 -3.75421251E-03 3.74112984E-03 + 0.0000000 0.0000000 0.0000000 4.93561280E-05 -2.50773300E-05 9.59121200E-05 + -0.0755890 0.0000000 0.0000000 2.10667442E-02 1.61101500E-04 -2.96872956E-04 + 0.0000000 0.0000000 0.0000000 2.19801836E-04 1.58511254E-04 -2.98277516E-04 + 0.0000000 0.0000000 0.0000000 8.63804620E-04 -1.42441380E-05 8.59514234E-04 + 0.0000000 0.0000000 0.0000000 7.16216808E-04 -1.78490442E-04 1.72514796E-04 + 0.0000000 0.0000000 0.0000000 2.68947540E-05 1.33815700E-05 -5.57531480E-05 + 0.0000000 0.0000000 0.0000000 5.34217374E-04 1.30481420E-05 -5.55441480E-05 + 0.0000000 0.0000000 0.0000000 5.43880766E-04 6.47068000E-06 5.29346866E-04 + 0.0000000 0.0000000 0.0000000 6.82314444E-04 -1.71372874E-04 -1.54704536E-04 + 0.0000000 0.0000000 0.0000000 -8.94632851E-03 3.97323110E-04 -8.76550511E-03 + 0.0000000 0.0000000 0.0000000 2.47936540E-05 -1.15504780E-05 -3.66963080E-05 + 0.0000000 0.0000000 0.0000000 -2.69022066E-04 9.06081000E-05 1.16620260E-04 + 0.0000000 0.0000000 0.0000000 1.19410778E-04 8.76431440E-05 2.59980640E-05 + 0.0000000 0.0000000 0.0000000 1.61304780E-05 2.67347600E-06 1.76511240E-05 + 0.0000000 0.0000000 0.0000000 -3.69941812E-04 -5.79450400E-06 -7.27216180E-05 + 0.0000000 0.0000000 0.0000000 3.51938018E-03 3.50504491E-03 -5.07389528E-03 + 0.0000000 0.0000000 0.0000000 -5.07401578E-03 3.48955724E-03 3.45231606E-03 + 0.0000000 0.0000000 -0.0755890 -3.10754582E-04 -1.63088490E-04 2.10586281E-02 + 0.0000000 0.0000000 0.0000000 -2.97857042E-04 1.57985822E-04 2.60586532E-04 + 0.0000000 0.0000000 0.0000000 -4.68546450E-04 7.30131800E-06 -4.63509352E-04 + 0.0000000 0.0000000 0.0000000 -2.14655498E-04 -1.92150316E-04 -3.11623230E-04 + 0.0000000 0.0000000 0.0000000 -5.51084760E-05 -1.34564140E-05 2.76701440E-05 + 0.0000000 0.0000000 0.0000000 -5.62670460E-05 1.31727400E-05 -9.21581400E-05 + 0.0000000 0.0000000 0.0000000 -1.31720744E-04 -8.06741200E-06 -1.49615532E-04 + 0.0000000 0.0000000 0.0000000 1.03120920E-04 1.91571624E-04 -2.85017374E-04 + 0.0000000 0.0000000 0.0000000 -3.47400301E-03 -3.39987933E-03 -5.16010862E-03 + 0.0000000 0.0000000 0.0000000 -3.65060700E-05 2.28222200E-06 -3.96753860E-05 + 0.0000000 0.0000000 0.0000000 2.79320560E-05 -8.70241040E-05 1.17354960E-04 + 0.0000000 0.0000000 0.0000000 6.15652000E-05 -7.17466760E-05 5.22366200E-06 + 0.0000000 0.0000000 0.0000000 -3.99151660E-05 -1.28205640E-05 3.92533960E-05 + 0.0000000 0.0000000 0.0000000 -7.44256000E-05 -2.67086400E-06 -7.46892600E-05 + 0.0000000 0.0000000 0.0000000 3.83897652E-03 -3.87715607E-03 -5.27204541E-03 + 0.0000000 0.0000000 0.0000000 1.82997320E-05 -9.01374960E-05 4.79964780E-05 + 0.0000000 0.0000000 0.0000000 2.67281462E-04 -1.66739038E-04 -3.08945174E-04 + 0.0000000 0.0000000 0.0000000 -2.83373420E-04 -1.59887744E-04 -2.98427720E-04 + 0.0000000 0.0000000 0.0000000 1.61946650E-04 1.72871814E-04 7.08658778E-04 + 0.0000000 0.0000000 0.0000000 1.90675560E-05 9.58380000E-08 1.68985180E-05 + 0.0000000 0.0000000 0.0000000 -9.08113760E-05 -1.36668480E-05 -5.45926960E-05 + 0.0000000 0.0000000 0.0000000 6.86984900E-05 -1.34159580E-05 -5.55001660E-05 + 0.0000000 0.0000000 0.0000000 -1.61219118E-04 1.80041950E-04 6.89466158E-04 + 0.0000000 0.0000000 0.0000000 -9.29644800E-06 -4.83548000E-07 -8.06977600E-06 + 0.0000000 0.0000000 0.0000000 -4.03129720E-05 8.80083200E-06 2.84988120E-05 + 0.0000000 0.0000000 0.0000000 -7.02283660E-05 -3.10330800E-06 -6.93784060E-05 + 0.0000000 0.0000000 0.0000000 6.30109400E-05 7.70555660E-05 -2.95419118E-04 + 0.0000000 0.0000000 0.0000000 7.78322000E-07 7.37189260E-05 6.44845460E-05 + 0.0000000 0.0000000 0.0000000 -7.68407600E-05 4.20637800E-06 -3.80724844E-04 + 0.0000000 0.0000000 0.0000000 -1.50034220E-05 7.54276000E-07 -1.41411780E-05 + 0.0000000 0.0000000 0.0000000 1.44035720E-05 1.05123170E-04 1.13666892E-04 + 0.0000000 0.0000000 0.0000000 4.96301340E-05 9.33125260E-05 1.58674380E-05 + 0.0000000 0.0000000 0.0000000 -3.08500316E-04 -1.66184296E-04 2.27814712E-04 + 0.0000000 0.0000000 0.0000000 -3.08331692E-04 1.64872440E-04 -2.92235100E-04 + 0.0000000 0.0000000 0.0000000 -3.22055726E-04 2.01341880E-04 -2.21740200E-04 + 0.0000000 0.0000000 0.0000000 -6.88160480E-05 8.86864000E-07 -6.88496820E-05 + 0.0000000 0.0000000 0.0000000 -5.53493420E-05 -1.37931240E-05 5.36529378E-04 + 0.0000000 0.0000000 0.0000000 -5.53923400E-05 1.34392920E-05 6.75058080E-05 + 0.0000000 0.0000000 0.0000000 -2.94982508E-04 -2.01912642E-04 1.11533416E-04 + 0.0000000 0.0000000 0.0000000 -4.22259880E-05 -9.28056000E-07 -4.17719080E-05 + 0.0000000 0.0000000 0.0000000 2.84874580E-05 -2.35596800E-06 2.38706340E-05 + 0.0000000 0.0000000 0.0000000 -5.35921866E-03 3.78285308E-03 -3.85867169E-03 + 0.0000000 0.0000000 0.0000000 1.20566598E-04 -9.41088300E-05 -2.78452108E-04 + 0.0000000 0.0000000 0.0000000 -3.00031172E-04 -7.83448120E-05 6.33692700E-05 + 0.0000000 0.0000000 0.0000000 -3.76954164E-04 1.40862800E-06 -3.74057448E-04 + 0.0000000 0.0000000 0.0000000 4.24539820E-05 1.64934220E-05 -3.71918760E-05 + 0.0000000 0.0000000 0.0000000 -5.27114568E-03 -3.88172324E-03 3.90106106E-03 + 0.0000000 0.0000000 0.0000000 1.13340524E-04 -9.86732060E-05 2.06862540E-05 diff --git a/example/Si_OpenMX/reference/DFSET_harmonic b/example/Si_OpenMX/reference/DFSET_harmonic new file mode 100644 index 00000000..0ce51e73 --- /dev/null +++ b/example/Si_OpenMX/reference/DFSET_harmonic @@ -0,0 +1,64 @@ + 0.0188973 0.0000000 0.0000000 -5.34817387E-03 5.20000000E-11 -4.80000000E-11 + 0.0000000 0.0000000 0.0000000 1.84065480E-05 -2.40000000E-11 1.80000000E-11 + 0.0000000 0.0000000 0.0000000 -1.75101518E-04 -4.08334680E-05 -4.09562800E-05 + 0.0000000 0.0000000 0.0000000 -1.74664058E-04 4.03706460E-05 -4.04933840E-05 + 0.0000000 0.0000000 0.0000000 1.82671740E-05 -8.00000000E-12 -2.40000000E-11 + 0.0000000 0.0000000 0.0000000 -1.59029814E-04 -2.20000000E-11 2.80000000E-11 + 0.0000000 0.0000000 0.0000000 -1.74664062E-04 -4.03706460E-05 4.04933800E-05 + 0.0000000 0.0000000 0.0000000 -1.75101516E-04 4.08335460E-05 4.09562460E-05 + 0.0000000 0.0000000 0.0000000 1.31307554E-03 9.18264448E-04 9.18374826E-04 + 0.0000000 0.0000000 0.0000000 -2.03857520E-05 1.61651400E-05 1.39031160E-05 + 0.0000000 0.0000000 0.0000000 8.47430960E-05 -9.28084000E-06 -9.30876200E-06 + 0.0000000 0.0000000 0.0000000 -2.04143900E-05 -1.39311480E-05 -1.60549460E-05 + 0.0000000 0.0000000 0.0000000 -2.04143980E-05 1.39310560E-05 1.60548820E-05 + 0.0000000 0.0000000 0.0000000 8.47431900E-05 9.28066400E-06 9.30883200E-06 + 0.0000000 0.0000000 0.0000000 -2.03857760E-05 -1.61650260E-05 -1.39030300E-05 + 0.0000000 0.0000000 0.0000000 1.31307554E-03 -9.18264438E-04 -9.18374822E-04 + 0.0000000 0.0000000 0.0000000 7.62255300E-05 4.07822860E-05 7.46500760E-05 + 0.0000000 0.0000000 0.0000000 7.62254800E-05 -4.07821460E-05 -7.46500940E-05 + 0.0000000 0.0000000 0.0000000 7.62375160E-05 7.47028560E-05 4.09780320E-05 + 0.0000000 0.0000000 0.0000000 1.38605880E-05 -2.51928060E-05 3.35875800E-06 + 0.0000000 0.0000000 0.0000000 1.38726060E-05 3.36456400E-06 -2.51402000E-05 + 0.0000000 0.0000000 0.0000000 1.38726000E-05 -3.36464200E-06 2.51401180E-05 + 0.0000000 0.0000000 0.0000000 7.62374860E-05 -7.47028060E-05 -4.09780180E-05 + 0.0000000 0.0000000 0.0000000 1.38605840E-05 2.51928300E-05 -3.35874600E-06 + 0.0000000 0.0000000 0.0000000 9.55424400E-06 -9.45756000E-06 8.09848000E-06 + 0.0000000 0.0000000 0.0000000 -4.17490200E-06 -1.37464500E-05 1.38177360E-05 + 0.0000000 0.0000000 0.0000000 9.52450600E-06 8.09860600E-06 -9.38639400E-06 + 0.0000000 0.0000000 0.0000000 -6.51889200E-06 1.01430600E-05 -1.01431700E-05 + 0.0000000 0.0000000 0.0000000 -6.51889800E-06 -1.01431160E-05 1.01432340E-05 + 0.0000000 0.0000000 0.0000000 9.52451000E-06 -8.09877400E-06 9.38644000E-06 + 0.0000000 0.0000000 0.0000000 -4.17483800E-06 1.37465320E-05 -1.38177340E-05 + 0.0000000 0.0000000 0.0000000 9.55423600E-06 9.45763800E-06 -8.09851200E-06 + 0.0000000 0.0000000 0.0000000 8.47068200E-06 3.40000000E-11 -1.40000000E-11 + 0.0000000 0.0000000 0.0000000 -2.49830000E-06 3.00000000E-11 -2.00000000E-11 + 0.0000000 0.0000000 0.0000000 -1.21982000E-06 -3.32573800E-06 -3.32512200E-06 + 0.0000000 0.0000000 0.0000000 -1.11122000E-06 3.35741200E-06 -3.35668000E-06 + 0.0000000 0.0000000 0.0000000 -2.28231600E-06 -6.00000000E-12 -5.40000000E-11 + 0.0000000 0.0000000 0.0000000 8.11479600E-06 -5.60000000E-11 2.00000000E-11 + 0.0000000 0.0000000 0.0000000 -1.11121000E-06 -3.35734400E-06 3.35668200E-06 + 0.0000000 0.0000000 0.0000000 -1.21969400E-06 3.32575800E-06 3.32513200E-06 + 0.0000000 0.0000000 0.0000000 -4.27271000E-06 1.38221920E-05 1.38920980E-05 + 0.0000000 0.0000000 0.0000000 9.34254400E-06 9.21827600E-06 7.93351800E-06 + 0.0000000 0.0000000 0.0000000 -6.52310400E-06 -1.01901760E-05 -1.01895240E-05 + 0.0000000 0.0000000 0.0000000 9.31219600E-06 -7.93285400E-06 -9.14823000E-06 + 0.0000000 0.0000000 0.0000000 9.31229400E-06 7.93277000E-06 9.14833200E-06 + 0.0000000 0.0000000 0.0000000 -6.52307800E-06 1.01900840E-05 1.01894840E-05 + 0.0000000 0.0000000 0.0000000 9.34246800E-06 -9.21827400E-06 -7.93349400E-06 + 0.0000000 0.0000000 0.0000000 -4.27270600E-06 -1.38221180E-05 -1.38920980E-05 + 0.0000000 0.0000000 0.0000000 7.55625920E-05 4.02661440E-05 -7.41206660E-05 + 0.0000000 0.0000000 0.0000000 7.55626200E-05 -4.02660140E-05 7.41206960E-05 + 0.0000000 0.0000000 0.0000000 7.55743560E-05 -7.41714940E-05 4.04611440E-05 + 0.0000000 0.0000000 0.0000000 1.38470140E-05 2.52628860E-05 3.35321600E-06 + 0.0000000 0.0000000 0.0000000 1.38586940E-05 3.35894400E-06 2.52119560E-05 + 0.0000000 0.0000000 0.0000000 1.38588920E-05 -3.35902800E-06 -2.52120260E-05 + 0.0000000 0.0000000 0.0000000 7.55743680E-05 7.41714900E-05 -4.04611660E-05 + 0.0000000 0.0000000 0.0000000 1.38470460E-05 -2.52628780E-05 -3.35325200E-06 + 0.0000000 0.0000000 0.0000000 -2.01889780E-05 -1.63198900E-05 1.37227540E-05 + 0.0000000 0.0000000 0.0000000 1.30064906E-03 -8.93924900E-04 8.94037902E-04 + 0.0000000 0.0000000 0.0000000 -2.02160220E-05 1.37509400E-05 -1.62071460E-05 + 0.0000000 0.0000000 0.0000000 8.44286840E-05 9.22566600E-06 -9.25391200E-06 + 0.0000000 0.0000000 0.0000000 8.44287100E-05 -9.22564800E-06 9.25398600E-06 + 0.0000000 0.0000000 0.0000000 -2.02160720E-05 -1.37511140E-05 1.62071820E-05 + 0.0000000 0.0000000 0.0000000 1.30064907E-03 8.93924920E-04 -8.94037944E-04 + 0.0000000 0.0000000 0.0000000 -2.01890480E-05 1.63199800E-05 -1.37227960E-05 diff --git a/example/Si_OpenMX/reference/RTA.in b/example/Si_OpenMX/reference/RTA.in new file mode 100644 index 00000000..816c21ae --- /dev/null +++ b/example/Si_OpenMX/reference/RTA.in @@ -0,0 +1,19 @@ +&general + PREFIX = si222_RTA10 + MODE = RTA + FCSXML = si222_cubic.xml + + NKD = 1; KD = Si +/ + +&cell +10.21661532467520234378 + 0.0 0.5 0.5 + 0.5 0.0 0.5 + 0.5 0.5 0.0 +/ + +&kpoint + 2 + 10 10 10 +/ diff --git a/example/Si_OpenMX/reference/si222.bands b/example/Si_OpenMX/reference/si222.bands new file mode 100644 index 00000000..d4a26883 --- /dev/null +++ b/example/Si_OpenMX/reference/si222.bands @@ -0,0 +1,156 @@ +# G X G L +# 0.000000 0.614997 1.484734 2.017336 +# k-axis, Eigenvalues [cm^-1] +0.000000 1.097373e-10 1.097373e-10 1.097373e-10 5.204475e+02 5.204475e+02 5.204475e+02 +0.012300 6.136591e+00 6.136591e+00 1.035590e+01 5.203494e+02 5.203494e+02 5.204156e+02 +0.024600 1.226418e+01 1.226418e+01 2.070542e+01 5.200557e+02 5.200557e+02 5.203197e+02 +0.036900 1.837373e+01 1.837373e+01 3.104215e+01 5.195686e+02 5.195686e+02 5.201597e+02 +0.049200 2.445604e+01 2.445604e+01 4.135977e+01 5.188914e+02 5.188914e+02 5.199352e+02 +0.061500 3.050177e+01 3.050177e+01 5.165195e+01 5.180291e+02 5.180291e+02 5.196456e+02 +0.073800 3.650136e+01 3.650136e+01 6.191246e+01 5.169877e+02 5.169877e+02 5.192903e+02 +0.086100 4.244494e+01 4.244494e+01 7.213512e+01 5.157749e+02 5.157749e+02 5.188685e+02 +0.098399 4.832238e+01 4.832238e+01 8.231383e+01 5.143994e+02 5.143994e+02 5.183793e+02 +0.110699 5.412316e+01 5.412316e+01 9.244261e+01 5.128712e+02 5.128712e+02 5.178216e+02 +0.122999 5.983645e+01 5.983645e+01 1.025156e+02 5.112016e+02 5.112016e+02 5.171942e+02 +0.135299 6.545101e+01 6.545101e+01 1.125270e+02 5.094031e+02 5.094031e+02 5.164958e+02 +0.147599 7.095527e+01 7.095527e+01 1.224712e+02 5.074889e+02 5.074889e+02 5.157249e+02 +0.159899 7.633731e+01 7.633731e+01 1.323427e+02 5.054736e+02 5.054736e+02 5.148801e+02 +0.172199 8.158492e+01 8.158492e+01 1.421363e+02 5.033726e+02 5.033726e+02 5.139598e+02 +0.184499 8.668567e+01 8.668567e+01 1.518467e+02 5.012019e+02 5.012019e+02 5.129622e+02 +0.196799 9.162696e+01 9.162696e+01 1.614690e+02 4.989783e+02 4.989783e+02 5.118856e+02 +0.209099 9.639615e+01 9.639615e+01 1.709984e+02 4.967191e+02 4.967191e+02 5.107281e+02 +0.221399 1.009807e+02 1.009807e+02 1.804303e+02 4.944418e+02 4.944418e+02 5.094878e+02 +0.233699 1.053683e+02 1.053683e+02 1.897603e+02 4.921642e+02 4.921642e+02 5.081627e+02 +0.245999 1.095470e+02 1.095470e+02 1.989841e+02 4.899040e+02 4.899040e+02 5.067508e+02 +0.258299 1.135057e+02 1.135057e+02 2.080979e+02 4.876784e+02 4.876784e+02 5.052500e+02 +0.270599 1.172339e+02 1.172339e+02 2.170977e+02 4.855044e+02 4.855044e+02 5.036582e+02 +0.282899 1.207222e+02 1.207222e+02 2.259800e+02 4.833980e+02 4.833980e+02 5.019734e+02 +0.295198 1.239627e+02 1.239627e+02 2.347414e+02 4.813742e+02 4.813742e+02 5.001933e+02 +0.307498 1.269490e+02 1.269490e+02 2.433788e+02 4.794466e+02 4.794466e+02 4.983159e+02 +0.319798 1.296766e+02 1.296766e+02 2.518893e+02 4.776273e+02 4.776273e+02 4.963391e+02 +0.332098 1.321429e+02 1.321429e+02 2.602700e+02 4.759266e+02 4.759266e+02 4.942605e+02 +0.344398 1.343476e+02 1.343476e+02 2.685186e+02 4.743530e+02 4.743530e+02 4.920783e+02 +0.356698 1.362929e+02 1.362929e+02 2.766327e+02 4.729126e+02 4.729126e+02 4.897901e+02 +0.368998 1.379836e+02 1.379836e+02 2.846102e+02 4.716093e+02 4.716093e+02 4.873940e+02 +0.381298 1.394267e+02 1.394267e+02 2.924492e+02 4.704448e+02 4.704448e+02 4.848878e+02 +0.393598 1.406321e+02 1.406321e+02 3.001481e+02 4.694186e+02 4.694186e+02 4.822695e+02 +0.405898 1.416119e+02 1.416119e+02 3.077053e+02 4.685277e+02 4.685277e+02 4.795371e+02 +0.418198 1.423807e+02 1.423807e+02 3.151195e+02 4.677673e+02 4.677673e+02 4.766886e+02 +0.430498 1.429551e+02 1.429551e+02 3.223897e+02 4.671307e+02 4.671307e+02 4.737221e+02 +0.442798 1.433533e+02 1.433533e+02 3.295148e+02 4.666095e+02 4.666095e+02 4.706356e+02 +0.455098 1.435953e+02 1.435953e+02 3.364941e+02 4.661940e+02 4.661940e+02 4.674274e+02 +0.467398 1.437019e+02 1.437019e+02 3.433271e+02 4.640955e+02 4.658735e+02 4.658735e+02 +0.479697 1.436949e+02 1.436949e+02 3.500131e+02 4.606382e+02 4.656363e+02 4.656363e+02 +0.491997 1.435961e+02 1.435961e+02 3.565521e+02 4.570538e+02 4.654708e+02 4.654708e+02 +0.504297 1.434274e+02 1.434274e+02 3.629437e+02 4.533407e+02 4.653648e+02 4.653648e+02 +0.516597 1.432100e+02 1.432100e+02 3.691881e+02 4.494971e+02 4.653068e+02 4.653068e+02 +0.528897 1.429642e+02 1.429642e+02 3.752853e+02 4.455216e+02 4.652853e+02 4.652853e+02 +0.541197 1.427090e+02 1.427090e+02 3.812355e+02 4.414126e+02 4.652899e+02 4.652899e+02 +0.553497 1.424617e+02 1.424617e+02 3.870392e+02 4.371688e+02 4.653111e+02 4.653111e+02 +0.565797 1.422375e+02 1.422375e+02 3.926968e+02 4.327886e+02 4.653404e+02 4.653404e+02 +0.578097 1.420493e+02 1.420493e+02 3.982089e+02 4.282708e+02 4.653708e+02 4.653708e+02 +0.590397 1.419073e+02 1.419073e+02 4.035762e+02 4.236142e+02 4.653966e+02 4.653966e+02 +0.602697 1.418191e+02 1.418191e+02 4.087995e+02 4.188174e+02 4.654138e+02 4.654138e+02 +0.614997 1.417892e+02 1.417892e+02 4.138796e+02 4.138796e+02 4.654197e+02 4.654197e+02 +0.614997 1.417892e+02 1.417892e+02 4.138796e+02 4.138796e+02 4.654197e+02 4.654197e+02 +0.632391 1.418578e+02 1.425669e+02 4.133926e+02 4.134831e+02 4.653961e+02 4.656633e+02 +0.649786 1.420609e+02 1.448595e+02 4.119646e+02 4.123055e+02 4.653268e+02 4.663650e+02 +0.667181 1.423908e+02 1.485513e+02 4.096833e+02 4.103820e+02 4.652162e+02 4.674494e+02 +0.684576 1.428350e+02 1.534662e+02 4.066649e+02 4.077717e+02 4.650714e+02 4.688193e+02 +0.701970 1.433764e+02 1.593877e+02 4.030302e+02 4.045577e+02 4.649025e+02 4.703799e+02 +0.719365 1.439944e+02 1.660756e+02 3.988891e+02 4.008477e+02 4.647217e+02 4.720519e+02 +0.736760 1.446655e+02 1.732795e+02 3.943353e+02 3.967746e+02 4.645433e+02 4.737753e+02 +0.754155 1.453639e+02 1.807458e+02 3.894465e+02 3.924972e+02 4.643837e+02 4.755080e+02 +0.771549 1.460624e+02 1.882205e+02 3.842858e+02 3.882000e+02 4.642601e+02 4.772220e+02 +0.788944 1.467332e+02 1.954496e+02 3.789043e+02 3.840923e+02 4.641910e+02 4.788996e+02 +0.806339 1.473485e+02 2.021805e+02 3.733427e+02 3.804037e+02 4.641951e+02 4.805294e+02 +0.823734 1.478812e+02 2.081678e+02 3.676333e+02 3.773740e+02 4.642908e+02 4.821037e+02 +0.841128 1.483051e+02 2.131862e+02 3.618012e+02 3.752357e+02 4.644962e+02 4.836160e+02 +0.858523 1.485958e+02 2.170523e+02 3.558651e+02 3.741871e+02 4.648277e+02 4.850602e+02 +0.875918 1.487304e+02 2.196508e+02 3.498383e+02 3.743622e+02 4.653005e+02 4.864285e+02 +0.893313 1.486882e+02 2.209543e+02 3.437295e+02 3.758057e+02 4.659271e+02 4.877121e+02 +0.910707 1.484504e+02 2.210260e+02 3.375434e+02 3.784673e+02 4.667177e+02 4.889006e+02 +0.928102 1.480003e+02 2.200015e+02 3.312815e+02 3.822168e+02 4.676796e+02 4.899830e+02 +0.945497 1.473235e+02 2.180555e+02 3.249422e+02 3.868749e+02 4.688167e+02 4.909481e+02 +0.962891 1.464074e+02 2.153683e+02 3.185211e+02 3.922457e+02 4.701296e+02 4.917864e+02 +0.980286 1.452411e+02 2.121006e+02 3.120117e+02 3.981415e+02 4.716156e+02 4.924908e+02 +0.997681 1.438158e+02 2.083797e+02 3.054047e+02 4.043968e+02 4.732684e+02 4.930581e+02 +1.015076 1.421241e+02 2.042960e+02 2.986883e+02 4.108738e+02 4.750786e+02 4.934905e+02 +1.032470 1.401599e+02 1.999057e+02 2.918477e+02 4.174617e+02 4.770336e+02 4.937966e+02 +1.049865 1.379186e+02 1.952359e+02 2.848652e+02 4.240742e+02 4.791182e+02 4.939919e+02 +1.067260 1.353967e+02 1.902922e+02 2.777196e+02 4.306449e+02 4.813149e+02 4.940994e+02 +1.084655 1.325916e+02 1.850656e+02 2.703862e+02 4.371237e+02 4.836042e+02 4.941489e+02 +1.102049 1.295019e+02 1.795389e+02 2.628367e+02 4.434731e+02 4.859653e+02 4.941771e+02 +1.119444 1.261270e+02 1.736926e+02 2.550399e+02 4.496646e+02 4.883763e+02 4.942251e+02 +1.136839 1.224673e+02 1.675089e+02 2.469615e+02 4.556767e+02 4.908149e+02 4.943375e+02 +1.154234 1.185241e+02 1.609757e+02 2.385659e+02 4.614926e+02 4.932591e+02 4.945590e+02 +1.171628 1.142995e+02 1.540883e+02 2.298167e+02 4.670984e+02 4.949326e+02 4.956869e+02 +1.189023 1.097968e+02 1.468515e+02 2.206787e+02 4.724824e+02 4.954956e+02 4.980775e+02 +1.206418 1.050202e+02 1.392789e+02 2.111195e+02 4.776334e+02 4.962776e+02 5.004112e+02 +1.223812 9.997513e+01 1.313937e+02 2.011107e+02 4.825412e+02 4.972976e+02 5.026698e+02 +1.241207 9.466835e+01 1.232267e+02 1.906302e+02 4.871953e+02 4.985623e+02 5.048368e+02 +1.258602 8.910780e+01 1.148155e+02 1.796629e+02 4.915856e+02 5.000646e+02 5.068976e+02 +1.275997 8.330288e+01 1.062022e+02 1.682017e+02 4.957016e+02 5.017838e+02 5.088393e+02 +1.293391 7.726444e+01 9.743122e+01 1.562479e+02 4.995331e+02 5.036860e+02 5.106511e+02 +1.310786 7.100486e+01 8.854758e+01 1.438114e+02 5.030702e+02 5.057256e+02 5.123239e+02 +1.328181 6.453801e+01 7.959424e+01 1.309102e+02 5.063030e+02 5.078476e+02 5.138506e+02 +1.345576 5.787931e+01 7.061025e+01 1.175702e+02 5.092223e+02 5.099897e+02 5.152254e+02 +1.362970 5.104567e+01 6.162894e+01 1.038238e+02 5.118196e+02 5.120862e+02 5.164441e+02 +1.380365 4.405541e+01 5.267645e+01 8.970967e+01 5.140701e+02 5.140871e+02 5.175037e+02 +1.397760 3.692818e+01 4.377082e+01 7.527142e+01 5.158766e+02 5.160178e+02 5.184021e+02 +1.415155 2.968483e+01 3.492146e+01 6.055701e+01 5.174458e+02 5.176058e+02 5.191381e+02 +1.432549 2.234726e+01 2.612939e+01 4.561779e+01 5.187249e+02 5.188461e+02 5.197109e+02 +1.449944 1.493823e+01 1.738791e+01 3.050774e+01 5.196709e+02 5.197348e+02 5.201201e+02 +1.467339 7.481175e+00 8.683974e+00 1.528276e+01 5.202517e+02 5.202692e+02 5.203657e+02 +1.484734 1.097373e-10 1.097373e-10 1.097373e-10 5.204475e+02 5.204475e+02 5.204475e+02 +1.484734 1.097373e-10 1.097373e-10 1.097373e-10 5.204475e+02 5.204475e+02 5.204475e+02 +1.495386 4.838376e+00 4.838376e+00 9.492106e+00 5.203664e+02 5.204025e+02 5.204025e+02 +1.506038 9.666696e+00 9.666696e+00 1.898041e+01 5.201233e+02 5.202679e+02 5.202679e+02 +1.516690 1.447491e+01 1.447491e+01 2.846111e+01 5.197198e+02 5.200447e+02 5.200447e+02 +1.527342 1.925296e+01 1.925296e+01 3.793043e+01 5.191580e+02 5.197344e+02 5.197344e+02 +1.537994 2.399082e+01 2.399082e+01 4.738462e+01 5.184411e+02 5.193394e+02 5.193394e+02 +1.548646 2.867847e+01 2.867847e+01 5.681994e+01 5.175730e+02 5.188626e+02 5.188626e+02 +1.559298 3.330590e+01 3.330590e+01 6.623271e+01 5.165583e+02 5.183076e+02 5.183076e+02 +1.569950 3.786320e+01 3.786320e+01 7.561926e+01 5.154027e+02 5.176785e+02 5.176785e+02 +1.580602 4.234048e+01 4.234048e+01 8.497597e+01 5.141120e+02 5.169802e+02 5.169802e+02 +1.591254 4.672799e+01 4.672799e+01 9.429925e+01 5.126930e+02 5.162178e+02 5.162178e+02 +1.601906 5.101611e+01 5.101611e+01 1.035855e+02 5.111528e+02 5.153974e+02 5.153974e+02 +1.612558 5.519541e+01 5.519541e+01 1.128313e+02 5.094990e+02 5.145253e+02 5.145253e+02 +1.623210 5.925670e+01 5.925670e+01 1.220330e+02 5.077394e+02 5.136084e+02 5.136084e+02 +1.633862 6.319111e+01 6.319111e+01 1.311871e+02 5.058819e+02 5.126537e+02 5.126537e+02 +1.644514 6.699013e+01 6.699013e+01 1.402900e+02 5.039348e+02 5.116688e+02 5.116688e+02 +1.655166 7.064573e+01 7.064573e+01 1.493383e+02 5.019061e+02 5.106616e+02 5.106616e+02 +1.665818 7.415041e+01 7.415041e+01 1.583281e+02 4.998037e+02 5.096400e+02 5.096400e+02 +1.676471 7.749729e+01 7.749729e+01 1.672559e+02 4.976354e+02 5.086119e+02 5.086119e+02 +1.687123 8.068023e+01 8.068023e+01 1.761178e+02 4.954083e+02 5.075854e+02 5.075854e+02 +1.697775 8.369390e+01 8.369390e+01 1.849098e+02 4.931295e+02 5.065683e+02 5.065683e+02 +1.708427 8.653387e+01 8.653387e+01 1.936280e+02 4.908051e+02 5.055683e+02 5.055683e+02 +1.719079 8.919672e+01 8.919672e+01 2.022681e+02 4.884409e+02 5.045926e+02 5.045926e+02 +1.729731 9.168012e+01 9.168012e+01 2.108257e+02 4.860417e+02 5.036480e+02 5.036480e+02 +1.740383 9.398285e+01 9.398285e+01 2.192963e+02 4.836116e+02 5.027407e+02 5.027407e+02 +1.751035 9.610493e+01 9.610493e+01 2.276749e+02 4.811539e+02 5.018764e+02 5.018764e+02 +1.761687 9.804759e+01 9.804759e+01 2.359566e+02 4.786710e+02 5.010599e+02 5.010599e+02 +1.772339 9.981336e+01 9.981336e+01 2.441360e+02 4.761642e+02 5.002953e+02 5.002953e+02 +1.782991 1.014060e+02 1.014060e+02 2.522078e+02 4.736342e+02 4.995856e+02 4.995856e+02 +1.793643 1.028305e+02 1.028305e+02 2.601660e+02 4.710805e+02 4.989332e+02 4.989332e+02 +1.804295 1.040930e+02 1.040930e+02 2.680046e+02 4.685022e+02 4.983394e+02 4.983394e+02 +1.814947 1.052008e+02 1.052008e+02 2.757173e+02 4.658971e+02 4.978047e+02 4.978047e+02 +1.825599 1.061621e+02 1.061621e+02 2.832975e+02 4.632628e+02 4.973286e+02 4.973286e+02 +1.836251 1.069863e+02 1.069863e+02 2.907381e+02 4.605960e+02 4.969098e+02 4.969098e+02 +1.846903 1.076831e+02 1.076831e+02 2.980319e+02 4.578932e+02 4.965464e+02 4.965464e+02 +1.857555 1.082631e+02 1.082631e+02 3.051710e+02 4.551507e+02 4.962356e+02 4.962356e+02 +1.868208 1.087372e+02 1.087372e+02 3.121471e+02 4.523649e+02 4.959739e+02 4.959739e+02 +1.878860 1.091166e+02 1.091166e+02 3.189511e+02 4.495325e+02 4.957577e+02 4.957577e+02 +1.889512 1.094126e+02 1.094126e+02 3.255729e+02 4.466512e+02 4.955827e+02 4.955827e+02 +1.900164 1.096364e+02 1.096364e+02 3.320010e+02 4.437201e+02 4.954443e+02 4.954443e+02 +1.910816 1.097989e+02 1.097989e+02 3.382218e+02 4.407405e+02 4.953380e+02 4.953380e+02 +1.921468 1.099106e+02 1.099106e+02 3.442185e+02 4.377173e+02 4.952591e+02 4.952591e+02 +1.932120 1.099814e+02 1.099814e+02 3.499696e+02 4.346607e+02 4.952030e+02 4.952030e+02 +1.942772 1.100207e+02 1.100207e+02 3.554462e+02 4.315890e+02 4.951653e+02 4.951653e+02 +1.953424 1.100368e+02 1.100368e+02 3.606079e+02 4.285327e+02 4.951417e+02 4.951417e+02 +1.964076 1.100373e+02 1.100373e+02 3.653960e+02 4.255418e+02 4.951287e+02 4.951287e+02 +1.974728 1.100285e+02 1.100285e+02 3.697226e+02 4.226966e+02 4.951228e+02 4.951228e+02 +1.985380 1.100160e+02 1.100160e+02 3.734565e+02 4.201217e+02 4.951212e+02 4.951212e+02 +1.996032 1.100040e+02 1.100040e+02 3.764086e+02 4.180010e+02 4.951218e+02 4.951218e+02 +2.006684 1.099956e+02 1.099956e+02 3.783382e+02 4.165719e+02 4.951227e+02 4.951227e+02 +2.017336 1.099926e+02 1.099926e+02 3.790147e+02 4.160624e+02 4.951232e+02 4.951232e+02 diff --git a/example/Si_OpenMX/reference/si222_RTA10.kl b/example/Si_OpenMX/reference/si222_RTA10.kl new file mode 100644 index 00000000..89884eb5 --- /dev/null +++ b/example/Si_OpenMX/reference/si222_RTA10.kl @@ -0,0 +1,102 @@ +# Temperature [K], Thermal Conductivity (xx, xy, xz, yx, yy, yz, zx, zy, zz) [W/mK] + 0.00 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 + 10.00 241096.4895 0.0605 0.0605 0.0605 241096.4896 0.0605 0.0605 0.0605 241096.4895 + 20.00 46121.1849 0.0072 0.0072 0.0072 46121.1849 0.0072 0.0072 0.0072 46121.1849 + 30.00 17421.2874 0.0018 0.0018 0.0018 17421.2874 0.0018 0.0018 0.0018 17421.2874 + 40.00 9354.4524 0.0007 0.0007 0.0007 9354.4524 0.0007 0.0007 0.0007 9354.4524 + 50.00 5859.9124 0.0003 0.0003 0.0003 5859.9124 0.0003 0.0003 0.0003 5859.9124 + 60.00 3735.5981 0.0002 0.0002 0.0002 3735.5981 0.0002 0.0002 0.0002 3735.5981 + 70.00 2445.7879 0.0001 0.0001 0.0001 2445.7879 0.0001 0.0001 0.0001 2445.7879 + 80.00 1685.6175 0.0001 0.0001 0.0001 1685.6175 0.0001 0.0001 0.0001 1685.6175 + 90.00 1224.6575 0.0001 0.0001 0.0001 1224.6575 0.0001 0.0001 0.0001 1224.6575 + 100.00 931.5615 0.0001 0.0001 0.0001 931.5615 0.0001 0.0001 0.0001 931.5615 + 110.00 736.3066 0.0000 0.0000 0.0000 736.3066 0.0000 0.0000 0.0000 736.3066 + 120.00 600.7306 0.0000 0.0000 0.0000 600.7306 0.0000 0.0000 0.0000 600.7306 + 130.00 503.1370 0.0000 0.0000 0.0000 503.1370 0.0000 0.0000 0.0000 503.1370 + 140.00 430.6481 0.0000 0.0000 0.0000 430.6481 0.0000 0.0000 0.0000 430.6481 + 150.00 375.3147 0.0000 0.0000 0.0000 375.3147 0.0000 0.0000 0.0000 375.3147 + 160.00 332.0547 0.0000 0.0000 0.0000 332.0547 0.0000 0.0000 0.0000 332.0547 + 170.00 297.5166 0.0000 0.0000 0.0000 297.5166 0.0000 0.0000 0.0000 297.5166 + 180.00 269.4274 0.0000 0.0000 0.0000 269.4274 0.0000 0.0000 0.0000 269.4274 + 190.00 246.2074 0.0000 0.0000 0.0000 246.2074 0.0000 0.0000 0.0000 246.2074 + 200.00 226.7333 0.0000 0.0000 0.0000 226.7333 0.0000 0.0000 0.0000 226.7333 + 210.00 210.1900 0.0000 0.0000 0.0000 210.1900 0.0000 0.0000 0.0000 210.1900 + 220.00 195.9754 0.0000 0.0000 0.0000 195.9754 0.0000 0.0000 0.0000 195.9754 + 230.00 183.6367 0.0000 0.0000 0.0000 183.6367 0.0000 0.0000 0.0000 183.6367 + 240.00 172.8285 0.0000 0.0000 0.0000 172.8285 0.0000 0.0000 0.0000 172.8285 + 250.00 163.2834 0.0000 0.0000 0.0000 163.2834 0.0000 0.0000 0.0000 163.2834 + 260.00 154.7917 0.0000 0.0000 0.0000 154.7917 0.0000 0.0000 0.0000 154.7917 + 270.00 147.1870 0.0000 0.0000 0.0000 147.1870 0.0000 0.0000 0.0000 147.1870 + 280.00 140.3358 0.0000 0.0000 0.0000 140.3358 0.0000 0.0000 0.0000 140.3358 + 290.00 134.1298 0.0000 0.0000 0.0000 134.1298 0.0000 0.0000 0.0000 134.1298 + 300.00 128.4805 0.0000 0.0000 0.0000 128.4805 0.0000 0.0000 0.0000 128.4805 + 310.00 123.3147 0.0000 0.0000 0.0000 123.3147 0.0000 0.0000 0.0000 123.3147 + 320.00 118.5717 0.0000 0.0000 0.0000 118.5717 0.0000 0.0000 0.0000 118.5717 + 330.00 114.2002 0.0000 0.0000 0.0000 114.2002 0.0000 0.0000 0.0000 114.2002 + 340.00 110.1573 0.0000 0.0000 0.0000 110.1573 0.0000 0.0000 0.0000 110.1573 + 350.00 106.4063 0.0000 0.0000 0.0000 106.4063 0.0000 0.0000 0.0000 106.4063 + 360.00 102.9158 0.0000 0.0000 0.0000 102.9158 0.0000 0.0000 0.0000 102.9158 + 370.00 99.6589 0.0000 0.0000 0.0000 99.6589 0.0000 0.0000 0.0000 99.6589 + 380.00 96.6122 0.0000 0.0000 0.0000 96.6122 0.0000 0.0000 0.0000 96.6122 + 390.00 93.7553 0.0000 0.0000 0.0000 93.7553 0.0000 0.0000 0.0000 93.7553 + 400.00 91.0707 0.0000 0.0000 0.0000 91.0707 0.0000 0.0000 0.0000 91.0707 + 410.00 88.5427 0.0000 0.0000 0.0000 88.5427 0.0000 0.0000 0.0000 88.5427 + 420.00 86.1576 0.0000 0.0000 0.0000 86.1576 0.0000 0.0000 0.0000 86.1576 + 430.00 83.9032 0.0000 0.0000 0.0000 83.9032 0.0000 0.0000 0.0000 83.9032 + 440.00 81.7689 0.0000 0.0000 0.0000 81.7689 0.0000 0.0000 0.0000 81.7689 + 450.00 79.7449 0.0000 0.0000 0.0000 79.7449 0.0000 0.0000 0.0000 79.7449 + 460.00 77.8228 0.0000 0.0000 0.0000 77.8228 0.0000 0.0000 0.0000 77.8228 + 470.00 75.9947 0.0000 0.0000 0.0000 75.9947 0.0000 0.0000 0.0000 75.9947 + 480.00 74.2538 0.0000 0.0000 0.0000 74.2538 0.0000 0.0000 0.0000 74.2538 + 490.00 72.5938 0.0000 0.0000 0.0000 72.5938 0.0000 0.0000 0.0000 72.5938 + 500.00 71.0091 0.0000 0.0000 0.0000 71.0091 0.0000 0.0000 0.0000 71.0091 + 510.00 69.4944 0.0000 0.0000 0.0000 69.4944 0.0000 0.0000 0.0000 69.4944 + 520.00 68.0452 0.0000 0.0000 0.0000 68.0452 0.0000 0.0000 0.0000 68.0452 + 530.00 66.6572 0.0000 0.0000 0.0000 66.6572 0.0000 0.0000 0.0000 66.6572 + 540.00 65.3264 0.0000 0.0000 0.0000 65.3264 0.0000 0.0000 0.0000 65.3264 + 550.00 64.0494 0.0000 0.0000 0.0000 64.0494 0.0000 0.0000 0.0000 64.0494 + 560.00 62.8228 0.0000 0.0000 0.0000 62.8228 0.0000 0.0000 0.0000 62.8228 + 570.00 61.6437 0.0000 0.0000 0.0000 61.6437 0.0000 0.0000 0.0000 61.6437 + 580.00 60.5093 0.0000 0.0000 0.0000 60.5093 0.0000 0.0000 0.0000 60.5093 + 590.00 59.4170 0.0000 0.0000 0.0000 59.4170 0.0000 0.0000 0.0000 59.4170 + 600.00 58.3645 0.0000 0.0000 0.0000 58.3645 0.0000 0.0000 0.0000 58.3645 + 610.00 57.3496 0.0000 0.0000 0.0000 57.3496 0.0000 0.0000 0.0000 57.3496 + 620.00 56.3703 0.0000 0.0000 0.0000 56.3703 0.0000 0.0000 0.0000 56.3703 + 630.00 55.4247 0.0000 0.0000 0.0000 55.4247 0.0000 0.0000 0.0000 55.4247 + 640.00 54.5110 0.0000 0.0000 0.0000 54.5110 0.0000 0.0000 0.0000 54.5110 + 650.00 53.6277 0.0000 0.0000 0.0000 53.6277 0.0000 0.0000 0.0000 53.6277 + 660.00 52.7732 0.0000 0.0000 0.0000 52.7732 0.0000 0.0000 0.0000 52.7732 + 670.00 51.9461 0.0000 0.0000 0.0000 51.9461 0.0000 0.0000 0.0000 51.9461 + 680.00 51.1450 0.0000 0.0000 0.0000 51.1450 0.0000 0.0000 0.0000 51.1450 + 690.00 50.3688 0.0000 0.0000 0.0000 50.3688 0.0000 0.0000 0.0000 50.3688 + 700.00 49.6163 0.0000 0.0000 0.0000 49.6163 0.0000 0.0000 0.0000 49.6163 + 710.00 48.8864 0.0000 0.0000 0.0000 48.8864 0.0000 0.0000 0.0000 48.8864 + 720.00 48.1781 0.0000 0.0000 0.0000 48.1781 0.0000 0.0000 0.0000 48.1781 + 730.00 47.4904 0.0000 0.0000 0.0000 47.4904 0.0000 0.0000 0.0000 47.4904 + 740.00 46.8224 0.0000 0.0000 0.0000 46.8224 0.0000 0.0000 0.0000 46.8224 + 750.00 46.1733 0.0000 0.0000 0.0000 46.1733 0.0000 0.0000 0.0000 46.1733 + 760.00 45.5422 0.0000 0.0000 0.0000 45.5422 0.0000 0.0000 0.0000 45.5422 + 770.00 44.9285 0.0000 0.0000 0.0000 44.9285 0.0000 0.0000 0.0000 44.9285 + 780.00 44.3313 0.0000 0.0000 0.0000 44.3313 0.0000 0.0000 0.0000 44.3313 + 790.00 43.7501 0.0000 0.0000 0.0000 43.7501 0.0000 0.0000 0.0000 43.7501 + 800.00 43.1841 0.0000 0.0000 0.0000 43.1841 0.0000 0.0000 0.0000 43.1841 + 810.00 42.6329 0.0000 0.0000 0.0000 42.6329 0.0000 0.0000 0.0000 42.6329 + 820.00 42.0957 0.0000 0.0000 0.0000 42.0957 0.0000 0.0000 0.0000 42.0957 + 830.00 41.5722 0.0000 0.0000 0.0000 41.5722 0.0000 0.0000 0.0000 41.5722 + 840.00 41.0616 0.0000 0.0000 0.0000 41.0616 0.0000 0.0000 0.0000 41.0616 + 850.00 40.5637 0.0000 0.0000 0.0000 40.5637 0.0000 0.0000 0.0000 40.5637 + 860.00 40.0778 0.0000 0.0000 0.0000 40.0778 0.0000 0.0000 0.0000 40.0778 + 870.00 39.6036 0.0000 0.0000 0.0000 39.6036 0.0000 0.0000 0.0000 39.6036 + 880.00 39.1406 0.0000 0.0000 0.0000 39.1406 0.0000 0.0000 0.0000 39.1406 + 890.00 38.6885 0.0000 0.0000 0.0000 38.6885 0.0000 0.0000 0.0000 38.6885 + 900.00 38.2469 0.0000 0.0000 0.0000 38.2469 0.0000 0.0000 0.0000 38.2469 + 910.00 37.8153 0.0000 0.0000 0.0000 37.8153 0.0000 0.0000 0.0000 37.8153 + 920.00 37.3935 0.0000 0.0000 0.0000 37.3935 0.0000 0.0000 0.0000 37.3935 + 930.00 36.9811 0.0000 0.0000 0.0000 36.9811 0.0000 0.0000 0.0000 36.9811 + 940.00 36.5778 0.0000 0.0000 0.0000 36.5778 0.0000 0.0000 0.0000 36.5778 + 950.00 36.1833 0.0000 0.0000 0.0000 36.1833 0.0000 0.0000 0.0000 36.1833 + 960.00 35.7973 0.0000 0.0000 0.0000 35.7973 0.0000 0.0000 0.0000 35.7973 + 970.00 35.4196 0.0000 0.0000 0.0000 35.4196 0.0000 0.0000 0.0000 35.4196 + 980.00 35.0498 0.0000 0.0000 0.0000 35.0498 0.0000 0.0000 0.0000 35.0498 + 990.00 34.6878 0.0000 0.0000 0.0000 34.6878 0.0000 0.0000 0.0000 34.6878 + 1000.00 34.3332 0.0000 0.0000 0.0000 34.3332 0.0000 0.0000 0.0000 34.3332 diff --git a/example/Si_OpenMX/reference/si222_RTA10.result.bz2 b/example/Si_OpenMX/reference/si222_RTA10.result.bz2 new file mode 100644 index 00000000..f6fd77bd Binary files /dev/null and b/example/Si_OpenMX/reference/si222_RTA10.result.bz2 differ diff --git a/example/Si_OpenMX/reference/si222_cubic.fcs b/example/Si_OpenMX/reference/si222_cubic.fcs new file mode 100644 index 00000000..c9f59bde --- /dev/null +++ b/example/Si_OpenMX/reference/si222_cubic.fcs @@ -0,0 +1,4765 @@ + *********************** Force Constants (FCs) *********************** + * Force constants are printed in Rydberg atomic units. * + * FC2: Ry/a0^2 FC3: Ry/a0^3 FC4: Ry/a0^4 etc. * + * FC?: Ry/a0^? a0 = Bohr radius * + * * + * The value shown in the last column is the distance * + * between the most distant atomic pairs. * + ********************************************************************* + + ---------------------------------------------------------------------- + Index FCs P Pairs Distance [Bohr] + (Global, Local) (Multiplicity) + ---------------------------------------------------------------------- + + *FC2 + 1 1 2.8300518e-01 1 1x 1x 0.000 + 2 2 -9.7775956e-04 2 1x 2x 10.217 + 3 3 -4.5566492e-04 2 1x 33x 10.217 + 4 4 9.2469630e-03 1 1x 3x 7.224 + 5 5 2.1507125e-03 1 1x 3y 7.224 + 6 6 -4.0238631e-03 1 1x 17x 7.224 + 7 7 -3.9376669e-03 1 1x 17z 7.224 + 8 8 8.4080614e-03 4 1x 6x 14.448 + 9 9 1.1907274e-04 4 1x 34x 14.448 + 10 10 -6.9163450e-02 1 1x 9x 4.424 + 11 11 -4.7951322e-02 1 1x 9y 4.424 + 12 12 1.0668799e-03 1 1x 10x 8.471 + 13 13 -8.5656544e-04 1 1x 10y 8.471 + 14 14 -7.3149640e-04 1 1x 10z 8.471 + 15 15 2.1609618e-04 1 1x 26x 8.471 + 16 16 -4.4835016e-03 1 1x 11x 11.133 + 17 17 4.9133823e-04 1 1x 11y 11.133 + 18 18 -5.0660832e-04 1 1x 25x 11.133 + 19 19 -4.2418102e-04 1 1x 25z 11.133 + 20 20 -7.4084169e-04 2 1x 20x 12.513 + 21 21 1.3336277e-03 2 1x 20y 12.513 + 22 22 -1.7727737e-04 2 1x 20z 12.513 + 23 23 5.4258083e-05 2 1x 35x 12.513 + 24 24 3.3765873e-04 1 1x 28x 13.272 + 25 25 -5.3798590e-04 1 1x 28y 13.272 + 26 26 -4.3683228e-04 8 1x 38x 17.696 + + *FC3 + 27 1 3.6333961e-01 1 1x 1y 1z 0.000 + 28 2 1.2451713e-03 1 1x 1x 3x 7.224 + 29 3 1.3933697e-03 1 1x 1x 3y 7.224 + 30 4 1.2477251e-04 1 1x 1y 3x 7.224 + 31 5 -6.7455461e-04 1 1x 1y 3y 7.224 + 32 6 1.1067276e-03 1 1x 1y 3z 7.224 + 33 7 -1.4202527e-03 1 1x 1x 17y 7.224 + 34 8 -1.8168103e-03 1 1x 1x 17x 7.224 + 35 9 -1.4133510e-03 1 1x 1x 17z 7.224 + 36 10 6.6782969e-05 1 1x 1y 19z 7.224 + 37 11 -1.9612927e-03 1 1x 1y 19x 7.224 + 38 12 -3.4916028e-02 1 1x 1x 9x 4.424 + 39 13 -6.6929291e-02 1 1x 1x 9y 4.424 + 40 14 -6.8604148e-02 1 1x 1y 9x 4.424 + 41 15 -9.3115141e-02 1 1x 1y 9z 4.424 + 42 16 -1.2881207e-03 1 1x 3x 9x 7.224 + 43 17 -7.7467054e-04 1 1x 3y 9x 7.224 + 44 18 1.2073663e-03 1 1x 3y 9y 7.224 + 45 19 -1.4357797e-03 1 1x 3y 9z 7.224 + 46 20 4.2051648e-04 1 1x 9y 16y 7.224 + 47 21 -2.3607815e-03 1 1x 9y 16z 7.224 + 48 22 -1.1333637e-04 1 1x 9x 17z 7.224 + 49 23 -4.8937455e-04 1 1x 3x 17x 7.224 + 50 24 4.2476702e-04 1 1x 3x 17y 7.224 + 51 25 2.2777762e-04 1 1x 3y 17x 7.224 + 52 26 4.7447834e-04 1 1x 3y 17y 7.224 + 53 27 7.1387157e-04 1 1x 3y 17z 7.224 + 54 28 -7.4881888e-05 1 1x 3y 19z 7.224 + 55 29 -2.0946097e-04 1 1x 17z 19y 7.224 + 56 30 -1.1173643e-04 1 1x 3x 49x 7.224 + 57 31 1.0971679e-06 1 1x 3x 49y 7.224 + 58 32 -2.3651875e-04 1 1x 3y 49x 7.224 + 59 33 -1.0707157e-05 1 1x 3y 49y 7.224 + 60 34 -1.5951637e-04 1 1x 3y 49z 7.224 + 61 35 -2.1720419e-04 1 1x 3y 51z 7.224 + 62 36 -1.9756788e-04 1 1x 17z 23y 7.224 + + + + ------------------------ All FCs below ------------------------ + + **FC2 + # FC2_1 6 2.8300518e-01 + 1 1.00000 1x 1x + 2 1.00000 1y 1y + 3 1.00000 1z 1z + 4 1.00000 9x 9x + 5 1.00000 9y 9y + 6 1.00000 9z 9z + + # FC2_2 12 -9.7775956e-04 + 1 1.00000 1x 2x + 2 1.00000 1x 5x + 3 1.00000 1y 2y + 4 1.00000 1y 33y + 5 1.00000 1z 5z + 6 1.00000 1z 33z + 7 1.00000 9x 10x + 8 1.00000 9x 13x + 9 1.00000 9y 10y + 10 1.00000 9y 41y + 11 1.00000 9z 13z + 12 1.00000 9z 41z + + # FC2_3 6 -4.5566492e-04 + 1 1.00000 1x 33x + 2 1.00000 1y 5y + 3 1.00000 1z 2z + 4 1.00000 9x 41x + 5 1.00000 9y 13y + 6 1.00000 9z 10z + + # FC2_4 24 9.2469630e-03 + 1 1.00000 1x 3x + 2 1.00000 1x 4x + 3 1.00000 1x 7x + 4 1.00000 1x 8x + 5 1.00000 1y 17y + 6 1.00000 1y 18y + 7 1.00000 1y 49y + 8 1.00000 1y 50y + 9 1.00000 1z 19z + 10 1.00000 1z 23z + 11 1.00000 1z 51z + 12 1.00000 1z 55z + 13 1.00000 9x 11x + 14 1.00000 9x 12x + 15 1.00000 9x 15x + 16 1.00000 9x 16x + 17 1.00000 9y 25y + 18 1.00000 9y 26y + 19 1.00000 9y 57y + 20 1.00000 9y 58y + 21 1.00000 9z 27z + 22 1.00000 9z 31z + 23 1.00000 9z 59z + 24 1.00000 9z 63z + + # FC2_5 96 2.1507125e-03 + 1 1.00000 1x 3y + 2 1.00000 1x 3z + 3 -1.00000 1x 4y + 4 1.00000 1x 4z + 5 1.00000 1x 7y + 6 -1.00000 1x 7z + 7 -1.00000 1x 8y + 8 -1.00000 1x 8z + 9 -1.00000 1x 17y + 10 1.00000 1x 18y + 11 -1.00000 1x 19z + 12 1.00000 1x 23z + 13 -1.00000 1x 49y + 14 1.00000 1x 50y + 15 -1.00000 1x 51z + 16 1.00000 1x 55z + 17 -1.00000 1y 3x + 18 1.00000 1y 4x + 19 -1.00000 1y 7x + 20 1.00000 1y 8x + 21 1.00000 1y 17x + 22 1.00000 1y 17z + 23 -1.00000 1y 18x + 24 1.00000 1y 18z + 25 -1.00000 1y 19z + 26 -1.00000 1y 23z + 27 1.00000 1y 49x + 28 -1.00000 1y 49z + 29 -1.00000 1y 50x + 30 -1.00000 1y 50z + 31 1.00000 1y 51z + 32 1.00000 1y 55z + 33 -1.00000 1z 3x + 34 -1.00000 1z 4x + 35 1.00000 1z 7x + 36 1.00000 1z 8x + 37 -1.00000 1z 17y + 38 -1.00000 1z 18y + 39 1.00000 1z 19x + 40 1.00000 1z 19y + 41 -1.00000 1z 23x + 42 1.00000 1z 23y + 43 1.00000 1z 49y + 44 1.00000 1z 50y + 45 1.00000 1z 51x + 46 -1.00000 1z 51y + 47 -1.00000 1z 55x + 48 -1.00000 1z 55y + 49 -1.00000 9x 11y + 50 -1.00000 9x 11z + 51 1.00000 9x 12y + 52 -1.00000 9x 12z + 53 -1.00000 9x 15y + 54 1.00000 9x 15z + 55 1.00000 9x 16y + 56 1.00000 9x 16z + 57 1.00000 9x 25y + 58 -1.00000 9x 26y + 59 1.00000 9x 27z + 60 -1.00000 9x 31z + 61 1.00000 9x 57y + 62 -1.00000 9x 58y + 63 1.00000 9x 59z + 64 -1.00000 9x 63z + 65 1.00000 9y 11x + 66 -1.00000 9y 12x + 67 1.00000 9y 15x + 68 -1.00000 9y 16x + 69 -1.00000 9y 25x + 70 -1.00000 9y 25z + 71 1.00000 9y 26x + 72 -1.00000 9y 26z + 73 1.00000 9y 27z + 74 1.00000 9y 31z + 75 -1.00000 9y 57x + 76 1.00000 9y 57z + 77 1.00000 9y 58x + 78 1.00000 9y 58z + 79 -1.00000 9y 59z + 80 -1.00000 9y 63z + 81 1.00000 9z 11x + 82 1.00000 9z 12x + 83 -1.00000 9z 15x + 84 -1.00000 9z 16x + 85 1.00000 9z 25y + 86 1.00000 9z 26y + 87 -1.00000 9z 27x + 88 -1.00000 9z 27y + 89 1.00000 9z 31x + 90 -1.00000 9z 31y + 91 -1.00000 9z 57y + 92 -1.00000 9z 58y + 93 -1.00000 9z 59x + 94 1.00000 9z 59y + 95 1.00000 9z 63x + 96 1.00000 9z 63y + + # FC2_6 48 -4.0238631e-03 + 1 1.00000 1x 17x + 2 1.00000 1x 18x + 3 1.00000 1x 19x + 4 1.00000 1x 23x + 5 1.00000 1x 49x + 6 1.00000 1x 50x + 7 1.00000 1x 51x + 8 1.00000 1x 55x + 9 1.00000 1y 3y + 10 1.00000 1y 4y + 11 1.00000 1y 7y + 12 1.00000 1y 8y + 13 1.00000 1y 19y + 14 1.00000 1y 23y + 15 1.00000 1y 51y + 16 1.00000 1y 55y + 17 1.00000 1z 3z + 18 1.00000 1z 4z + 19 1.00000 1z 7z + 20 1.00000 1z 8z + 21 1.00000 1z 17z + 22 1.00000 1z 18z + 23 1.00000 1z 49z + 24 1.00000 1z 50z + 25 1.00000 9x 25x + 26 1.00000 9x 26x + 27 1.00000 9x 27x + 28 1.00000 9x 31x + 29 1.00000 9x 57x + 30 1.00000 9x 58x + 31 1.00000 9x 59x + 32 1.00000 9x 63x + 33 1.00000 9y 11y + 34 1.00000 9y 12y + 35 1.00000 9y 15y + 36 1.00000 9y 16y + 37 1.00000 9y 27y + 38 1.00000 9y 31y + 39 1.00000 9y 59y + 40 1.00000 9y 63y + 41 1.00000 9z 11z + 42 1.00000 9z 12z + 43 1.00000 9z 15z + 44 1.00000 9z 16z + 45 1.00000 9z 25z + 46 1.00000 9z 26z + 47 1.00000 9z 57z + 48 1.00000 9z 58z + + # FC2_7 48 -3.9376669e-03 + 1 1.00000 1x 17z + 2 -1.00000 1x 18z + 3 1.00000 1x 19y + 4 -1.00000 1x 23y + 5 -1.00000 1x 49z + 6 1.00000 1x 50z + 7 -1.00000 1x 51y + 8 1.00000 1x 55y + 9 1.00000 1y 3z + 10 -1.00000 1y 4z + 11 -1.00000 1y 7z + 12 1.00000 1y 8z + 13 1.00000 1y 19x + 14 -1.00000 1y 23x + 15 -1.00000 1y 51x + 16 1.00000 1y 55x + 17 1.00000 1z 3y + 18 -1.00000 1z 4y + 19 -1.00000 1z 7y + 20 1.00000 1z 8y + 21 1.00000 1z 17x + 22 -1.00000 1z 18x + 23 -1.00000 1z 49x + 24 1.00000 1z 50x + 25 1.00000 9x 25z + 26 -1.00000 9x 26z + 27 1.00000 9x 27y + 28 -1.00000 9x 31y + 29 -1.00000 9x 57z + 30 1.00000 9x 58z + 31 -1.00000 9x 59y + 32 1.00000 9x 63y + 33 1.00000 9y 11z + 34 -1.00000 9y 12z + 35 -1.00000 9y 15z + 36 1.00000 9y 16z + 37 1.00000 9y 27x + 38 -1.00000 9y 31x + 39 -1.00000 9y 59x + 40 1.00000 9y 63x + 41 1.00000 9z 11y + 42 -1.00000 9z 12y + 43 -1.00000 9z 15y + 44 1.00000 9z 16y + 45 1.00000 9z 25x + 46 -1.00000 9z 26x + 47 -1.00000 9z 57x + 48 1.00000 9z 58x + + # FC2_8 6 8.4080614e-03 + 1 1.00000 1x 6x + 2 1.00000 1y 34y + 3 1.00000 1z 37z + 4 1.00000 9x 14x + 5 1.00000 9y 42y + 6 1.00000 9z 45z + + # FC2_9 12 1.1907274e-04 + 1 1.00000 1x 34x + 2 1.00000 1x 37x + 3 1.00000 1y 6y + 4 1.00000 1y 37y + 5 1.00000 1z 6z + 6 1.00000 1z 34z + 7 1.00000 9x 42x + 8 1.00000 9x 45x + 9 1.00000 9y 14y + 10 1.00000 9y 45y + 11 1.00000 9z 14z + 12 1.00000 9z 42z + + # FC2_10 24 -6.9163450e-02 + 1 1.00000 1x 9x + 2 1.00000 1x 16x + 3 1.00000 1x 58x + 4 1.00000 1x 63x + 5 1.00000 1y 9y + 6 1.00000 1y 16y + 7 1.00000 1y 58y + 8 1.00000 1y 63y + 9 1.00000 1z 9z + 10 1.00000 1z 16z + 11 1.00000 1z 58z + 12 1.00000 1z 63z + 13 1.00000 9x 1x + 14 1.00000 9x 3x + 15 1.00000 9x 17x + 16 1.00000 9x 19x + 17 1.00000 9y 1y + 18 1.00000 9y 3y + 19 1.00000 9y 17y + 20 1.00000 9y 19y + 21 1.00000 9z 1z + 22 1.00000 9z 3z + 23 1.00000 9z 17z + 24 1.00000 9z 19z + + # FC2_11 48 -4.7951322e-02 + 1 1.00000 1x 9y + 2 1.00000 1x 9z + 3 -1.00000 1x 16y + 4 -1.00000 1x 16z + 5 -1.00000 1x 58y + 6 1.00000 1x 58z + 7 1.00000 1x 63y + 8 -1.00000 1x 63z + 9 1.00000 1y 9x + 10 1.00000 1y 9z + 11 -1.00000 1y 16x + 12 1.00000 1y 16z + 13 -1.00000 1y 58x + 14 -1.00000 1y 58z + 15 1.00000 1y 63x + 16 -1.00000 1y 63z + 17 1.00000 1z 9x + 18 1.00000 1z 9y + 19 -1.00000 1z 16x + 20 1.00000 1z 16y + 21 1.00000 1z 58x + 22 -1.00000 1z 58y + 23 -1.00000 1z 63x + 24 -1.00000 1z 63y + 25 1.00000 9x 1y + 26 1.00000 9x 1z + 27 -1.00000 9x 3y + 28 -1.00000 9x 3z + 29 -1.00000 9x 17y + 30 1.00000 9x 17z + 31 1.00000 9x 19y + 32 -1.00000 9x 19z + 33 1.00000 9y 1x + 34 1.00000 9y 1z + 35 -1.00000 9y 3x + 36 1.00000 9y 3z + 37 -1.00000 9y 17x + 38 -1.00000 9y 17z + 39 1.00000 9y 19x + 40 -1.00000 9y 19z + 41 1.00000 9z 1x + 42 1.00000 9z 1y + 43 -1.00000 9z 3x + 44 1.00000 9z 3y + 45 1.00000 9z 17x + 46 -1.00000 9z 17y + 47 -1.00000 9z 19x + 48 -1.00000 9z 19y + + # FC2_12 48 1.0668799e-03 + 1 1.00000 1x 10x + 2 1.00000 1x 12x + 3 1.00000 1x 13x + 4 1.00000 1x 15x + 5 1.00000 1x 57x + 6 1.00000 1x 59x + 7 1.00000 1x 62x + 8 1.00000 1x 64x + 9 1.00000 1y 10y + 10 1.00000 1y 15y + 11 1.00000 1y 26y + 12 1.00000 1y 31y + 13 1.00000 1y 41y + 14 1.00000 1y 48y + 15 1.00000 1y 57y + 16 1.00000 1y 64y + 17 1.00000 1z 12z + 18 1.00000 1z 13z + 19 1.00000 1z 26z + 20 1.00000 1z 31z + 21 1.00000 1z 41z + 22 1.00000 1z 48z + 23 1.00000 1z 59z + 24 1.00000 1z 62z + 25 1.00000 9x 2x + 26 1.00000 9x 4x + 27 1.00000 9x 5x + 28 1.00000 9x 7x + 29 1.00000 9x 18x + 30 1.00000 9x 20x + 31 1.00000 9x 21x + 32 1.00000 9x 23x + 33 1.00000 9y 2y + 34 1.00000 9y 4y + 35 1.00000 9y 18y + 36 1.00000 9y 20y + 37 1.00000 9y 33y + 38 1.00000 9y 35y + 39 1.00000 9y 49y + 40 1.00000 9y 51y + 41 1.00000 9z 5z + 42 1.00000 9z 7z + 43 1.00000 9z 21z + 44 1.00000 9z 23z + 45 1.00000 9z 33z + 46 1.00000 9z 35z + 47 1.00000 9z 49z + 48 1.00000 9z 51z + + # FC2_13 48 -8.5656544e-04 + 1 1.00000 1x 10y + 2 -1.00000 1x 12z + 3 1.00000 1x 13z + 4 -1.00000 1x 15y + 5 -1.00000 1x 57y + 6 -1.00000 1x 59z + 7 1.00000 1x 62z + 8 1.00000 1x 64y + 9 1.00000 1y 10x + 10 -1.00000 1y 15x + 11 -1.00000 1y 26z + 12 -1.00000 1y 31z + 13 1.00000 1y 41z + 14 1.00000 1y 48z + 15 -1.00000 1y 57x + 16 1.00000 1y 64x + 17 -1.00000 1z 12x + 18 1.00000 1z 13x + 19 -1.00000 1z 26y + 20 -1.00000 1z 31y + 21 1.00000 1z 41y + 22 1.00000 1z 48y + 23 -1.00000 1z 59x + 24 1.00000 1z 62x + 25 1.00000 9x 2y + 26 -1.00000 9x 4y + 27 1.00000 9x 5z + 28 -1.00000 9x 7z + 29 -1.00000 9x 18y + 30 1.00000 9x 20y + 31 1.00000 9x 21z + 32 -1.00000 9x 23z + 33 1.00000 9y 2x + 34 -1.00000 9y 4x + 35 -1.00000 9y 18x + 36 1.00000 9y 20x + 37 1.00000 9y 33z + 38 1.00000 9y 35z + 39 -1.00000 9y 49z + 40 -1.00000 9y 51z + 41 1.00000 9z 5x + 42 -1.00000 9z 7x + 43 1.00000 9z 21x + 44 -1.00000 9z 23x + 45 1.00000 9z 33y + 46 1.00000 9z 35y + 47 -1.00000 9z 49y + 48 -1.00000 9z 51y + + # FC2_14 96 -7.3149640e-04 + 1 1.00000 1x 10z + 2 -1.00000 1x 12y + 3 1.00000 1x 13y + 4 -1.00000 1x 15z + 5 -1.00000 1x 26y + 6 1.00000 1x 26z + 7 1.00000 1x 31y + 8 -1.00000 1x 31z + 9 1.00000 1x 41y + 10 1.00000 1x 41z + 11 -1.00000 1x 48y + 12 -1.00000 1x 48z + 13 1.00000 1x 57z + 14 1.00000 1x 59y + 15 -1.00000 1x 62y + 16 -1.00000 1x 64z + 17 1.00000 1y 10z + 18 -1.00000 1y 12x + 19 1.00000 1y 12z + 20 1.00000 1y 13x + 21 1.00000 1y 13z + 22 1.00000 1y 15z + 23 -1.00000 1y 26x + 24 1.00000 1y 31x + 25 1.00000 1y 41x + 26 -1.00000 1y 48x + 27 -1.00000 1y 57z + 28 1.00000 1y 59x + 29 -1.00000 1y 59z + 30 -1.00000 1y 62x + 31 -1.00000 1y 62z + 32 -1.00000 1y 64z + 33 1.00000 1z 10x + 34 1.00000 1z 10y + 35 1.00000 1z 12y + 36 1.00000 1z 13y + 37 -1.00000 1z 15x + 38 1.00000 1z 15y + 39 1.00000 1z 26x + 40 -1.00000 1z 31x + 41 1.00000 1z 41x + 42 -1.00000 1z 48x + 43 1.00000 1z 57x + 44 -1.00000 1z 57y + 45 -1.00000 1z 59y + 46 -1.00000 1z 62y + 47 -1.00000 1z 64x + 48 -1.00000 1z 64y + 49 1.00000 9x 2z + 50 -1.00000 9x 4z + 51 1.00000 9x 5y + 52 -1.00000 9x 7y + 53 1.00000 9x 18z + 54 -1.00000 9x 20z + 55 -1.00000 9x 21y + 56 1.00000 9x 23y + 57 1.00000 9x 33y + 58 1.00000 9x 33z + 59 -1.00000 9x 35y + 60 -1.00000 9x 35z + 61 -1.00000 9x 49y + 62 1.00000 9x 49z + 63 1.00000 9x 51y + 64 -1.00000 9x 51z + 65 1.00000 9y 2z + 66 1.00000 9y 4z + 67 1.00000 9y 5x + 68 1.00000 9y 5z + 69 -1.00000 9y 7x + 70 1.00000 9y 7z + 71 -1.00000 9y 18z + 72 -1.00000 9y 20z + 73 -1.00000 9y 21x + 74 -1.00000 9y 21z + 75 1.00000 9y 23x + 76 -1.00000 9y 23z + 77 1.00000 9y 33x + 78 -1.00000 9y 35x + 79 -1.00000 9y 49x + 80 1.00000 9y 51x + 81 1.00000 9z 2x + 82 1.00000 9z 2y + 83 -1.00000 9z 4x + 84 1.00000 9z 4y + 85 1.00000 9z 5y + 86 1.00000 9z 7y + 87 1.00000 9z 18x + 88 -1.00000 9z 18y + 89 -1.00000 9z 20x + 90 -1.00000 9z 20y + 91 -1.00000 9z 21y + 92 -1.00000 9z 23y + 93 1.00000 9z 33x + 94 -1.00000 9z 35x + 95 1.00000 9z 49x + 96 -1.00000 9z 51x + + # FC2_15 24 2.1609618e-04 + 1 1.00000 1x 26x + 2 1.00000 1x 31x + 3 1.00000 1x 41x + 4 1.00000 1x 48x + 5 1.00000 1y 12y + 6 1.00000 1y 13y + 7 1.00000 1y 59y + 8 1.00000 1y 62y + 9 1.00000 1z 10z + 10 1.00000 1z 15z + 11 1.00000 1z 57z + 12 1.00000 1z 64z + 13 1.00000 9x 33x + 14 1.00000 9x 35x + 15 1.00000 9x 49x + 16 1.00000 9x 51x + 17 1.00000 9y 5y + 18 1.00000 9y 7y + 19 1.00000 9y 21y + 20 1.00000 9y 23y + 21 1.00000 9z 2z + 22 1.00000 9z 4z + 23 1.00000 9z 18z + 24 1.00000 9z 20z + + # FC2_16 24 -4.4835016e-03 + 1 1.00000 1x 11x + 2 1.00000 1x 14x + 3 1.00000 1x 60x + 4 1.00000 1x 61x + 5 1.00000 1y 25y + 6 1.00000 1y 32y + 7 1.00000 1y 42y + 8 1.00000 1y 47y + 9 1.00000 1z 27z + 10 1.00000 1z 30z + 11 1.00000 1z 44z + 12 1.00000 1z 45z + 13 1.00000 9x 6x + 14 1.00000 9x 8x + 15 1.00000 9x 22x + 16 1.00000 9x 24x + 17 1.00000 9y 34y + 18 1.00000 9y 36y + 19 1.00000 9y 50y + 20 1.00000 9y 52y + 21 1.00000 9z 37z + 22 1.00000 9z 39z + 23 1.00000 9z 53z + 24 1.00000 9z 55z + + # FC2_17 96 4.9133823e-04 + 1 1.00000 1x 11y + 2 1.00000 1x 11z + 3 -1.00000 1x 14y + 4 -1.00000 1x 14z + 5 1.00000 1x 25y + 6 1.00000 1x 27z + 7 -1.00000 1x 30z + 8 -1.00000 1x 32y + 9 -1.00000 1x 42y + 10 1.00000 1x 44z + 11 -1.00000 1x 45z + 12 1.00000 1x 47y + 13 -1.00000 1x 60y + 14 1.00000 1x 60z + 15 1.00000 1x 61y + 16 -1.00000 1x 61z + 17 1.00000 1y 11x + 18 -1.00000 1y 14x + 19 1.00000 1y 25x + 20 1.00000 1y 25z + 21 1.00000 1y 27z + 22 1.00000 1y 30z + 23 -1.00000 1y 32x + 24 1.00000 1y 32z + 25 -1.00000 1y 42x + 26 -1.00000 1y 42z + 27 -1.00000 1y 44z + 28 -1.00000 1y 45z + 29 1.00000 1y 47x + 30 -1.00000 1y 47z + 31 -1.00000 1y 60x + 32 1.00000 1y 61x + 33 1.00000 1z 11x + 34 -1.00000 1z 14x + 35 1.00000 1z 25y + 36 1.00000 1z 27x + 37 1.00000 1z 27y + 38 -1.00000 1z 30x + 39 1.00000 1z 30y + 40 1.00000 1z 32y + 41 -1.00000 1z 42y + 42 1.00000 1z 44x + 43 -1.00000 1z 44y + 44 -1.00000 1z 45x + 45 -1.00000 1z 45y + 46 -1.00000 1z 47y + 47 1.00000 1z 60x + 48 -1.00000 1z 61x + 49 -1.00000 9x 6y + 50 -1.00000 9x 6z + 51 1.00000 9x 8y + 52 1.00000 9x 8z + 53 1.00000 9x 22y + 54 -1.00000 9x 22z + 55 -1.00000 9x 24y + 56 1.00000 9x 24z + 57 -1.00000 9x 34y + 58 1.00000 9x 36y + 59 -1.00000 9x 37z + 60 1.00000 9x 39z + 61 1.00000 9x 50y + 62 -1.00000 9x 52y + 63 -1.00000 9x 53z + 64 1.00000 9x 55z + 65 -1.00000 9y 6x + 66 1.00000 9y 8x + 67 1.00000 9y 22x + 68 -1.00000 9y 24x + 69 -1.00000 9y 34x + 70 -1.00000 9y 34z + 71 1.00000 9y 36x + 72 -1.00000 9y 36z + 73 -1.00000 9y 37z + 74 -1.00000 9y 39z + 75 1.00000 9y 50x + 76 1.00000 9y 50z + 77 -1.00000 9y 52x + 78 1.00000 9y 52z + 79 1.00000 9y 53z + 80 1.00000 9y 55z + 81 -1.00000 9z 6x + 82 1.00000 9z 8x + 83 -1.00000 9z 22x + 84 1.00000 9z 24x + 85 -1.00000 9z 34y + 86 -1.00000 9z 36y + 87 -1.00000 9z 37x + 88 -1.00000 9z 37y + 89 1.00000 9z 39x + 90 -1.00000 9z 39y + 91 1.00000 9z 50y + 92 1.00000 9z 52y + 93 -1.00000 9z 53x + 94 1.00000 9z 53y + 95 1.00000 9z 55x + 96 1.00000 9z 55y + + # FC2_18 48 -5.0660832e-04 + 1 1.00000 1x 25x + 2 1.00000 1x 27x + 3 1.00000 1x 30x + 4 1.00000 1x 32x + 5 1.00000 1x 42x + 6 1.00000 1x 44x + 7 1.00000 1x 45x + 8 1.00000 1x 47x + 9 1.00000 1y 11y + 10 1.00000 1y 14y + 11 1.00000 1y 27y + 12 1.00000 1y 30y + 13 1.00000 1y 44y + 14 1.00000 1y 45y + 15 1.00000 1y 60y + 16 1.00000 1y 61y + 17 1.00000 1z 11z + 18 1.00000 1z 14z + 19 1.00000 1z 25z + 20 1.00000 1z 32z + 21 1.00000 1z 42z + 22 1.00000 1z 47z + 23 1.00000 1z 60z + 24 1.00000 1z 61z + 25 1.00000 9x 34x + 26 1.00000 9x 36x + 27 1.00000 9x 37x + 28 1.00000 9x 39x + 29 1.00000 9x 50x + 30 1.00000 9x 52x + 31 1.00000 9x 53x + 32 1.00000 9x 55x + 33 1.00000 9y 6y + 34 1.00000 9y 8y + 35 1.00000 9y 22y + 36 1.00000 9y 24y + 37 1.00000 9y 37y + 38 1.00000 9y 39y + 39 1.00000 9y 53y + 40 1.00000 9y 55y + 41 1.00000 9z 6z + 42 1.00000 9z 8z + 43 1.00000 9z 22z + 44 1.00000 9z 24z + 45 1.00000 9z 34z + 46 1.00000 9z 36z + 47 1.00000 9z 50z + 48 1.00000 9z 52z + + # FC2_19 48 -4.2418102e-04 + 1 1.00000 1x 25z + 2 1.00000 1x 27y + 3 -1.00000 1x 30y + 4 -1.00000 1x 32z + 5 1.00000 1x 42z + 6 -1.00000 1x 44y + 7 1.00000 1x 45y + 8 -1.00000 1x 47z + 9 1.00000 1y 11z + 10 1.00000 1y 14z + 11 1.00000 1y 27x + 12 -1.00000 1y 30x + 13 -1.00000 1y 44x + 14 1.00000 1y 45x + 15 -1.00000 1y 60z + 16 -1.00000 1y 61z + 17 1.00000 1z 11y + 18 1.00000 1z 14y + 19 1.00000 1z 25x + 20 -1.00000 1z 32x + 21 1.00000 1z 42x + 22 -1.00000 1z 47x + 23 -1.00000 1z 60y + 24 -1.00000 1z 61y + 25 1.00000 9x 34z + 26 -1.00000 9x 36z + 27 1.00000 9x 37y + 28 -1.00000 9x 39y + 29 1.00000 9x 50z + 30 -1.00000 9x 52z + 31 -1.00000 9x 53y + 32 1.00000 9x 55y + 33 1.00000 9y 6z + 34 1.00000 9y 8z + 35 -1.00000 9y 22z + 36 -1.00000 9y 24z + 37 1.00000 9y 37x + 38 -1.00000 9y 39x + 39 -1.00000 9y 53x + 40 1.00000 9y 55x + 41 1.00000 9z 6y + 42 1.00000 9z 8y + 43 -1.00000 9z 22y + 44 -1.00000 9z 24y + 45 1.00000 9z 34x + 46 -1.00000 9z 36x + 47 1.00000 9z 50x + 48 -1.00000 9z 52x + + # FC2_20 48 -7.4084169e-04 + 1 1.00000 1x 20x + 2 1.00000 1x 21x + 3 1.00000 1x 22x + 4 1.00000 1x 24x + 5 1.00000 1x 52x + 6 1.00000 1x 53x + 7 1.00000 1x 54x + 8 1.00000 1x 56x + 9 1.00000 1y 20y + 10 1.00000 1y 24y + 11 1.00000 1y 35y + 12 1.00000 1y 36y + 13 1.00000 1y 39y + 14 1.00000 1y 40y + 15 1.00000 1y 52y + 16 1.00000 1y 56y + 17 1.00000 1z 21z + 18 1.00000 1z 22z + 19 1.00000 1z 35z + 20 1.00000 1z 36z + 21 1.00000 1z 39z + 22 1.00000 1z 40z + 23 1.00000 1z 53z + 24 1.00000 1z 54z + 25 1.00000 9x 28x + 26 1.00000 9x 29x + 27 1.00000 9x 30x + 28 1.00000 9x 32x + 29 1.00000 9x 60x + 30 1.00000 9x 61x + 31 1.00000 9x 62x + 32 1.00000 9x 64x + 33 1.00000 9y 28y + 34 1.00000 9y 32y + 35 1.00000 9y 43y + 36 1.00000 9y 44y + 37 1.00000 9y 47y + 38 1.00000 9y 48y + 39 1.00000 9y 60y + 40 1.00000 9y 64y + 41 1.00000 9z 29z + 42 1.00000 9z 30z + 43 1.00000 9z 43z + 44 1.00000 9z 44z + 45 1.00000 9z 47z + 46 1.00000 9z 48z + 47 1.00000 9z 61z + 48 1.00000 9z 62z + + # FC2_21 48 1.3336277e-03 + 1 1.00000 1x 20y + 2 1.00000 1x 21z + 3 -1.00000 1x 22z + 4 -1.00000 1x 24y + 5 -1.00000 1x 52y + 6 -1.00000 1x 53z + 7 1.00000 1x 54z + 8 1.00000 1x 56y + 9 1.00000 1y 20x + 10 -1.00000 1y 24x + 11 1.00000 1y 35z + 12 -1.00000 1y 36z + 13 -1.00000 1y 39z + 14 1.00000 1y 40z + 15 -1.00000 1y 52x + 16 1.00000 1y 56x + 17 1.00000 1z 21x + 18 -1.00000 1z 22x + 19 1.00000 1z 35y + 20 -1.00000 1z 36y + 21 -1.00000 1z 39y + 22 1.00000 1z 40y + 23 -1.00000 1z 53x + 24 1.00000 1z 54x + 25 1.00000 9x 28y + 26 1.00000 9x 29z + 27 -1.00000 9x 30z + 28 -1.00000 9x 32y + 29 -1.00000 9x 60y + 30 -1.00000 9x 61z + 31 1.00000 9x 62z + 32 1.00000 9x 64y + 33 1.00000 9y 28x + 34 -1.00000 9y 32x + 35 1.00000 9y 43z + 36 -1.00000 9y 44z + 37 -1.00000 9y 47z + 38 1.00000 9y 48z + 39 -1.00000 9y 60x + 40 1.00000 9y 64x + 41 1.00000 9z 29x + 42 -1.00000 9z 30x + 43 1.00000 9z 43y + 44 -1.00000 9z 44y + 45 -1.00000 9z 47y + 46 1.00000 9z 48y + 47 -1.00000 9z 61x + 48 1.00000 9z 62x + + # FC2_22 96 -1.7727737e-04 + 1 1.00000 1x 20z + 2 1.00000 1x 21y + 3 -1.00000 1x 22y + 4 -1.00000 1x 24z + 5 -1.00000 1x 35y + 6 -1.00000 1x 35z + 7 1.00000 1x 36y + 8 -1.00000 1x 36z + 9 -1.00000 1x 39y + 10 1.00000 1x 39z + 11 1.00000 1x 40y + 12 1.00000 1x 40z + 13 1.00000 1x 52z + 14 1.00000 1x 53y + 15 -1.00000 1x 54y + 16 -1.00000 1x 56z + 17 1.00000 1y 20z + 18 -1.00000 1y 21x + 19 -1.00000 1y 21z + 20 1.00000 1y 22x + 21 -1.00000 1y 22z + 22 1.00000 1y 24z + 23 1.00000 1y 35x + 24 -1.00000 1y 36x + 25 1.00000 1y 39x + 26 -1.00000 1y 40x + 27 -1.00000 1y 52z + 28 -1.00000 1y 53x + 29 1.00000 1y 53z + 30 1.00000 1y 54x + 31 1.00000 1y 54z + 32 -1.00000 1y 56z + 33 -1.00000 1z 20x + 34 -1.00000 1z 20y + 35 1.00000 1z 21y + 36 1.00000 1z 22y + 37 1.00000 1z 24x + 38 -1.00000 1z 24y + 39 1.00000 1z 35x + 40 1.00000 1z 36x + 41 -1.00000 1z 39x + 42 -1.00000 1z 40x + 43 -1.00000 1z 52x + 44 1.00000 1z 52y + 45 -1.00000 1z 53y + 46 -1.00000 1z 54y + 47 1.00000 1z 56x + 48 1.00000 1z 56y + 49 -1.00000 9x 28z + 50 -1.00000 9x 29y + 51 1.00000 9x 30y + 52 1.00000 9x 32z + 53 1.00000 9x 43y + 54 1.00000 9x 43z + 55 -1.00000 9x 44y + 56 1.00000 9x 44z + 57 1.00000 9x 47y + 58 -1.00000 9x 47z + 59 -1.00000 9x 48y + 60 -1.00000 9x 48z + 61 -1.00000 9x 60z + 62 -1.00000 9x 61y + 63 1.00000 9x 62y + 64 1.00000 9x 64z + 65 -1.00000 9y 28z + 66 1.00000 9y 29x + 67 1.00000 9y 29z + 68 -1.00000 9y 30x + 69 1.00000 9y 30z + 70 -1.00000 9y 32z + 71 -1.00000 9y 43x + 72 1.00000 9y 44x + 73 -1.00000 9y 47x + 74 1.00000 9y 48x + 75 1.00000 9y 60z + 76 1.00000 9y 61x + 77 -1.00000 9y 61z + 78 -1.00000 9y 62x + 79 -1.00000 9y 62z + 80 1.00000 9y 64z + 81 1.00000 9z 28x + 82 1.00000 9z 28y + 83 -1.00000 9z 29y + 84 -1.00000 9z 30y + 85 -1.00000 9z 32x + 86 1.00000 9z 32y + 87 -1.00000 9z 43x + 88 -1.00000 9z 44x + 89 1.00000 9z 47x + 90 1.00000 9z 48x + 91 1.00000 9z 60x + 92 -1.00000 9z 60y + 93 1.00000 9z 61y + 94 1.00000 9z 62y + 95 -1.00000 9z 64x + 96 -1.00000 9z 64y + + # FC2_23 24 5.4258083e-05 + 1 1.00000 1x 35x + 2 1.00000 1x 36x + 3 1.00000 1x 39x + 4 1.00000 1x 40x + 5 1.00000 1y 21y + 6 1.00000 1y 22y + 7 1.00000 1y 53y + 8 1.00000 1y 54y + 9 1.00000 1z 20z + 10 1.00000 1z 24z + 11 1.00000 1z 52z + 12 1.00000 1z 56z + 13 1.00000 9x 43x + 14 1.00000 9x 44x + 15 1.00000 9x 47x + 16 1.00000 9x 48x + 17 1.00000 9y 29y + 18 1.00000 9y 30y + 19 1.00000 9y 61y + 20 1.00000 9y 62y + 21 1.00000 9z 28z + 22 1.00000 9z 32z + 23 1.00000 9z 60z + 24 1.00000 9z 64z + + # FC2_24 24 3.3765873e-04 + 1 1.00000 1x 28x + 2 1.00000 1x 29x + 3 1.00000 1x 43x + 4 1.00000 1x 46x + 5 1.00000 1y 28y + 6 1.00000 1y 29y + 7 1.00000 1y 43y + 8 1.00000 1y 46y + 9 1.00000 1z 28z + 10 1.00000 1z 29z + 11 1.00000 1z 43z + 12 1.00000 1z 46z + 13 1.00000 9x 38x + 14 1.00000 9x 40x + 15 1.00000 9x 54x + 16 1.00000 9x 56x + 17 1.00000 9y 38y + 18 1.00000 9y 40y + 19 1.00000 9y 54y + 20 1.00000 9y 56y + 21 1.00000 9z 38z + 22 1.00000 9z 40z + 23 1.00000 9z 54z + 24 1.00000 9z 56z + + # FC2_25 48 -5.3798590e-04 + 1 1.00000 1x 28y + 2 -1.00000 1x 28z + 3 -1.00000 1x 29y + 4 1.00000 1x 29z + 5 -1.00000 1x 43y + 6 -1.00000 1x 43z + 7 1.00000 1x 46y + 8 1.00000 1x 46z + 9 1.00000 1y 28x + 10 -1.00000 1y 28z + 11 -1.00000 1y 29x + 12 -1.00000 1y 29z + 13 -1.00000 1y 43x + 14 1.00000 1y 43z + 15 1.00000 1y 46x + 16 1.00000 1y 46z + 17 -1.00000 1z 28x + 18 -1.00000 1z 28y + 19 1.00000 1z 29x + 20 -1.00000 1z 29y + 21 -1.00000 1z 43x + 22 1.00000 1z 43y + 23 1.00000 1z 46x + 24 1.00000 1z 46y + 25 1.00000 9x 38y + 26 1.00000 9x 38z + 27 -1.00000 9x 40y + 28 -1.00000 9x 40z + 29 -1.00000 9x 54y + 30 1.00000 9x 54z + 31 1.00000 9x 56y + 32 -1.00000 9x 56z + 33 1.00000 9y 38x + 34 1.00000 9y 38z + 35 -1.00000 9y 40x + 36 1.00000 9y 40z + 37 -1.00000 9y 54x + 38 -1.00000 9y 54z + 39 1.00000 9y 56x + 40 -1.00000 9y 56z + 41 1.00000 9z 38x + 42 1.00000 9z 38y + 43 -1.00000 9z 40x + 44 1.00000 9z 40y + 45 1.00000 9z 54x + 46 -1.00000 9z 54y + 47 -1.00000 9z 56x + 48 -1.00000 9z 56y + + # FC2_26 6 -4.3683228e-04 + 1 1.00000 1x 38x + 2 1.00000 1y 38y + 3 1.00000 1z 38z + 4 1.00000 9x 46x + 5 1.00000 9y 46y + 6 1.00000 9z 46z + + + **FC3 + # FC3_1 6 3.6333961e-01 + 1 1.00000 1x 1y 1z + 2 1.00000 1y 1x 1z + 3 1.00000 1z 1x 1y + 4 -1.00000 9x 9y 9z + 5 -1.00000 9y 9x 9z + 6 -1.00000 9z 9x 9y + + # FC3_2 48 1.2451713e-03 + 1 1.00000 1x 1x 3x + 2 -1.00000 1x 1x 4x + 3 -1.00000 1x 1x 7x + 4 1.00000 1x 1x 8x + 5 1.00000 1x 3x 3x + 6 -1.00000 1x 4x 4x + 7 -1.00000 1x 7x 7x + 8 1.00000 1x 8x 8x + 9 1.00000 1y 1y 17y + 10 -1.00000 1y 1y 18y + 11 -1.00000 1y 1y 49y + 12 1.00000 1y 1y 50y + 13 1.00000 1y 17y 17y + 14 -1.00000 1y 18y 18y + 15 -1.00000 1y 49y 49y + 16 1.00000 1y 50y 50y + 17 1.00000 1z 1z 19z + 18 -1.00000 1z 1z 23z + 19 -1.00000 1z 1z 51z + 20 1.00000 1z 1z 55z + 21 1.00000 1z 19z 19z + 22 -1.00000 1z 23z 23z + 23 -1.00000 1z 51z 51z + 24 1.00000 1z 55z 55z + 25 -1.00000 9x 9x 11x + 26 1.00000 9x 9x 12x + 27 1.00000 9x 9x 15x + 28 -1.00000 9x 9x 16x + 29 -1.00000 9x 11x 11x + 30 1.00000 9x 12x 12x + 31 1.00000 9x 15x 15x + 32 -1.00000 9x 16x 16x + 33 -1.00000 9y 9y 25y + 34 1.00000 9y 9y 26y + 35 1.00000 9y 9y 57y + 36 -1.00000 9y 9y 58y + 37 -1.00000 9y 25y 25y + 38 1.00000 9y 26y 26y + 39 1.00000 9y 57y 57y + 40 -1.00000 9y 58y 58y + 41 -1.00000 9z 9z 27z + 42 1.00000 9z 9z 31z + 43 1.00000 9z 9z 59z + 44 -1.00000 9z 9z 63z + 45 -1.00000 9z 27z 27z + 46 1.00000 9z 31z 31z + 47 1.00000 9z 59z 59z + 48 -1.00000 9z 63z 63z + + # FC3_3 96 1.3933697e-03 + 1 1.00000 1x 1x 3y + 2 1.00000 1x 1x 3z + 3 1.00000 1x 1x 4y + 4 -1.00000 1x 1x 4z + 5 -1.00000 1x 1x 7y + 6 1.00000 1x 1x 7z + 7 -1.00000 1x 1x 8y + 8 -1.00000 1x 1x 8z + 9 -1.00000 1x 17y 17y + 10 -1.00000 1x 18y 18y + 11 -1.00000 1x 19z 19z + 12 -1.00000 1x 23z 23z + 13 1.00000 1x 49y 49y + 14 1.00000 1x 50y 50y + 15 1.00000 1x 51z 51z + 16 1.00000 1x 55z 55z + 17 1.00000 1y 1y 17x + 18 1.00000 1y 1y 17z + 19 1.00000 1y 1y 18x + 20 -1.00000 1y 1y 18z + 21 -1.00000 1y 1y 49x + 22 1.00000 1y 1y 49z + 23 -1.00000 1y 1y 50x + 24 -1.00000 1y 1y 50z + 25 -1.00000 1y 3x 3x + 26 -1.00000 1y 4x 4x + 27 1.00000 1y 7x 7x + 28 1.00000 1y 8x 8x + 29 -1.00000 1y 19z 19z + 30 1.00000 1y 23z 23z + 31 -1.00000 1y 51z 51z + 32 1.00000 1y 55z 55z + 33 1.00000 1z 1z 19x + 34 1.00000 1z 1z 19y + 35 1.00000 1z 1z 23x + 36 -1.00000 1z 1z 23y + 37 -1.00000 1z 1z 51x + 38 1.00000 1z 1z 51y + 39 -1.00000 1z 1z 55x + 40 -1.00000 1z 1z 55y + 41 -1.00000 1z 3x 3x + 42 1.00000 1z 4x 4x + 43 -1.00000 1z 7x 7x + 44 1.00000 1z 8x 8x + 45 -1.00000 1z 17y 17y + 46 1.00000 1z 18y 18y + 47 -1.00000 1z 49y 49y + 48 1.00000 1z 50y 50y + 49 1.00000 9x 9x 11y + 50 1.00000 9x 9x 11z + 51 1.00000 9x 9x 12y + 52 -1.00000 9x 9x 12z + 53 -1.00000 9x 9x 15y + 54 1.00000 9x 9x 15z + 55 -1.00000 9x 9x 16y + 56 -1.00000 9x 9x 16z + 57 -1.00000 9x 25y 25y + 58 -1.00000 9x 26y 26y + 59 -1.00000 9x 27z 27z + 60 -1.00000 9x 31z 31z + 61 1.00000 9x 57y 57y + 62 1.00000 9x 58y 58y + 63 1.00000 9x 59z 59z + 64 1.00000 9x 63z 63z + 65 1.00000 9y 9y 25x + 66 1.00000 9y 9y 25z + 67 1.00000 9y 9y 26x + 68 -1.00000 9y 9y 26z + 69 -1.00000 9y 9y 57x + 70 1.00000 9y 9y 57z + 71 -1.00000 9y 9y 58x + 72 -1.00000 9y 9y 58z + 73 -1.00000 9y 11x 11x + 74 -1.00000 9y 12x 12x + 75 1.00000 9y 15x 15x + 76 1.00000 9y 16x 16x + 77 -1.00000 9y 27z 27z + 78 1.00000 9y 31z 31z + 79 -1.00000 9y 59z 59z + 80 1.00000 9y 63z 63z + 81 1.00000 9z 9z 27x + 82 1.00000 9z 9z 27y + 83 1.00000 9z 9z 31x + 84 -1.00000 9z 9z 31y + 85 -1.00000 9z 9z 59x + 86 1.00000 9z 9z 59y + 87 -1.00000 9z 9z 63x + 88 -1.00000 9z 9z 63y + 89 -1.00000 9z 11x 11x + 90 1.00000 9z 12x 12x + 91 -1.00000 9z 15x 15x + 92 1.00000 9z 16x 16x + 93 -1.00000 9z 25y 25y + 94 1.00000 9z 26y 26y + 95 -1.00000 9z 57y 57y + 96 1.00000 9z 58y 58y + + # FC3_4 144 1.2477251e-04 + 1 1.00000 1x 1y 3x + 2 1.00000 1x 1y 4x + 3 -1.00000 1x 1y 7x + 4 -1.00000 1x 1y 8x + 5 1.00000 1x 1y 17y + 6 1.00000 1x 1y 18y + 7 -1.00000 1x 1y 49y + 8 -1.00000 1x 1y 50y + 9 1.00000 1x 1z 3x + 10 -1.00000 1x 1z 4x + 11 1.00000 1x 1z 7x + 12 -1.00000 1x 1z 8x + 13 1.00000 1x 1z 19z + 14 1.00000 1x 1z 23z + 15 -1.00000 1x 1z 51z + 16 -1.00000 1x 1z 55z + 17 -1.00000 1x 3x 3y + 18 -1.00000 1x 3x 3z + 19 -1.00000 1x 4x 4y + 20 1.00000 1x 4x 4z + 21 1.00000 1x 7x 7y + 22 -1.00000 1x 7x 7z + 23 1.00000 1x 8x 8y + 24 1.00000 1x 8x 8z + 25 1.00000 1y 1x 3x + 26 1.00000 1y 1x 4x + 27 -1.00000 1y 1x 7x + 28 -1.00000 1y 1x 8x + 29 1.00000 1y 1x 17y + 30 1.00000 1y 1x 18y + 31 -1.00000 1y 1x 49y + 32 -1.00000 1y 1x 50y + 33 1.00000 1y 1z 17y + 34 -1.00000 1y 1z 18y + 35 1.00000 1y 1z 19z + 36 -1.00000 1y 1z 23z + 37 1.00000 1y 1z 49y + 38 -1.00000 1y 1z 50y + 39 1.00000 1y 1z 51z + 40 -1.00000 1y 1z 55z + 41 -1.00000 1y 17x 17y + 42 -1.00000 1y 17y 17z + 43 -1.00000 1y 18x 18y + 44 1.00000 1y 18y 18z + 45 1.00000 1y 49x 49y + 46 -1.00000 1y 49y 49z + 47 1.00000 1y 50x 50y + 48 1.00000 1y 50y 50z + 49 1.00000 1z 1x 3x + 50 -1.00000 1z 1x 4x + 51 1.00000 1z 1x 7x + 52 -1.00000 1z 1x 8x + 53 1.00000 1z 1x 19z + 54 1.00000 1z 1x 23z + 55 -1.00000 1z 1x 51z + 56 -1.00000 1z 1x 55z + 57 1.00000 1z 1y 17y + 58 -1.00000 1z 1y 18y + 59 1.00000 1z 1y 19z + 60 -1.00000 1z 1y 23z + 61 1.00000 1z 1y 49y + 62 -1.00000 1z 1y 50y + 63 1.00000 1z 1y 51z + 64 -1.00000 1z 1y 55z + 65 -1.00000 1z 19x 19z + 66 -1.00000 1z 19y 19z + 67 -1.00000 1z 23x 23z + 68 1.00000 1z 23y 23z + 69 1.00000 1z 51x 51z + 70 -1.00000 1z 51y 51z + 71 1.00000 1z 55x 55z + 72 1.00000 1z 55y 55z + 73 1.00000 9x 9y 11x + 74 1.00000 9x 9y 12x + 75 -1.00000 9x 9y 15x + 76 -1.00000 9x 9y 16x + 77 1.00000 9x 9y 25y + 78 1.00000 9x 9y 26y + 79 -1.00000 9x 9y 57y + 80 -1.00000 9x 9y 58y + 81 1.00000 9x 9z 11x + 82 -1.00000 9x 9z 12x + 83 1.00000 9x 9z 15x + 84 -1.00000 9x 9z 16x + 85 1.00000 9x 9z 27z + 86 1.00000 9x 9z 31z + 87 -1.00000 9x 9z 59z + 88 -1.00000 9x 9z 63z + 89 -1.00000 9x 11x 11y + 90 -1.00000 9x 11x 11z + 91 -1.00000 9x 12x 12y + 92 1.00000 9x 12x 12z + 93 1.00000 9x 15x 15y + 94 -1.00000 9x 15x 15z + 95 1.00000 9x 16x 16y + 96 1.00000 9x 16x 16z + 97 1.00000 9y 9x 11x + 98 1.00000 9y 9x 12x + 99 -1.00000 9y 9x 15x + 100 -1.00000 9y 9x 16x + 101 1.00000 9y 9x 25y + 102 1.00000 9y 9x 26y + 103 -1.00000 9y 9x 57y + 104 -1.00000 9y 9x 58y + 105 1.00000 9y 9z 25y + 106 -1.00000 9y 9z 26y + 107 1.00000 9y 9z 27z + 108 -1.00000 9y 9z 31z + 109 1.00000 9y 9z 57y + 110 -1.00000 9y 9z 58y + 111 1.00000 9y 9z 59z + 112 -1.00000 9y 9z 63z + 113 -1.00000 9y 25x 25y + 114 -1.00000 9y 25y 25z + 115 -1.00000 9y 26x 26y + 116 1.00000 9y 26y 26z + 117 1.00000 9y 57x 57y + 118 -1.00000 9y 57y 57z + 119 1.00000 9y 58x 58y + 120 1.00000 9y 58y 58z + 121 1.00000 9z 9x 11x + 122 -1.00000 9z 9x 12x + 123 1.00000 9z 9x 15x + 124 -1.00000 9z 9x 16x + 125 1.00000 9z 9x 27z + 126 1.00000 9z 9x 31z + 127 -1.00000 9z 9x 59z + 128 -1.00000 9z 9x 63z + 129 1.00000 9z 9y 25y + 130 -1.00000 9z 9y 26y + 131 1.00000 9z 9y 27z + 132 -1.00000 9z 9y 31z + 133 1.00000 9z 9y 57y + 134 -1.00000 9z 9y 58y + 135 1.00000 9z 9y 59z + 136 -1.00000 9z 9y 63z + 137 -1.00000 9z 27x 27z + 138 -1.00000 9z 27y 27z + 139 -1.00000 9z 31x 31z + 140 1.00000 9z 31y 31z + 141 1.00000 9z 59x 59z + 142 -1.00000 9z 59y 59z + 143 1.00000 9z 63x 63z + 144 1.00000 9z 63y 63z + + # FC3_5 144 -6.7455461e-04 + 1 1.00000 1x 1y 3y + 2 -1.00000 1x 1y 4y + 3 -1.00000 1x 1y 7y + 4 1.00000 1x 1y 8y + 5 1.00000 1x 1y 17x + 6 -1.00000 1x 1y 18x + 7 -1.00000 1x 1y 49x + 8 1.00000 1x 1y 50x + 9 1.00000 1x 1z 3z + 10 -1.00000 1x 1z 4z + 11 -1.00000 1x 1z 7z + 12 1.00000 1x 1z 8z + 13 1.00000 1x 1z 19x + 14 -1.00000 1x 1z 23x + 15 -1.00000 1x 1z 51x + 16 1.00000 1x 1z 55x + 17 1.00000 1x 17x 17y + 18 -1.00000 1x 18x 18y + 19 1.00000 1x 19x 19z + 20 -1.00000 1x 23x 23z + 21 -1.00000 1x 49x 49y + 22 1.00000 1x 50x 50y + 23 -1.00000 1x 51x 51z + 24 1.00000 1x 55x 55z + 25 1.00000 1y 1x 3y + 26 -1.00000 1y 1x 4y + 27 -1.00000 1y 1x 7y + 28 1.00000 1y 1x 8y + 29 1.00000 1y 1x 17x + 30 -1.00000 1y 1x 18x + 31 -1.00000 1y 1x 49x + 32 1.00000 1y 1x 50x + 33 1.00000 1y 1z 17z + 34 -1.00000 1y 1z 18z + 35 1.00000 1y 1z 19y + 36 -1.00000 1y 1z 23y + 37 -1.00000 1y 1z 49z + 38 1.00000 1y 1z 50z + 39 -1.00000 1y 1z 51y + 40 1.00000 1y 1z 55y + 41 1.00000 1y 3x 3y + 42 -1.00000 1y 4x 4y + 43 -1.00000 1y 7x 7y + 44 1.00000 1y 8x 8y + 45 1.00000 1y 19y 19z + 46 -1.00000 1y 23y 23z + 47 -1.00000 1y 51y 51z + 48 1.00000 1y 55y 55z + 49 1.00000 1z 1x 3z + 50 -1.00000 1z 1x 4z + 51 -1.00000 1z 1x 7z + 52 1.00000 1z 1x 8z + 53 1.00000 1z 1x 19x + 54 -1.00000 1z 1x 23x + 55 -1.00000 1z 1x 51x + 56 1.00000 1z 1x 55x + 57 1.00000 1z 1y 17z + 58 -1.00000 1z 1y 18z + 59 1.00000 1z 1y 19y + 60 -1.00000 1z 1y 23y + 61 -1.00000 1z 1y 49z + 62 1.00000 1z 1y 50z + 63 -1.00000 1z 1y 51y + 64 1.00000 1z 1y 55y + 65 1.00000 1z 3x 3z + 66 -1.00000 1z 4x 4z + 67 -1.00000 1z 7x 7z + 68 1.00000 1z 8x 8z + 69 1.00000 1z 17y 17z + 70 -1.00000 1z 18y 18z + 71 -1.00000 1z 49y 49z + 72 1.00000 1z 50y 50z + 73 -1.00000 9x 9y 11y + 74 1.00000 9x 9y 12y + 75 1.00000 9x 9y 15y + 76 -1.00000 9x 9y 16y + 77 -1.00000 9x 9y 25x + 78 1.00000 9x 9y 26x + 79 1.00000 9x 9y 57x + 80 -1.00000 9x 9y 58x + 81 -1.00000 9x 9z 11z + 82 1.00000 9x 9z 12z + 83 1.00000 9x 9z 15z + 84 -1.00000 9x 9z 16z + 85 -1.00000 9x 9z 27x + 86 1.00000 9x 9z 31x + 87 1.00000 9x 9z 59x + 88 -1.00000 9x 9z 63x + 89 -1.00000 9x 25x 25y + 90 1.00000 9x 26x 26y + 91 -1.00000 9x 27x 27z + 92 1.00000 9x 31x 31z + 93 1.00000 9x 57x 57y + 94 -1.00000 9x 58x 58y + 95 1.00000 9x 59x 59z + 96 -1.00000 9x 63x 63z + 97 -1.00000 9y 9x 11y + 98 1.00000 9y 9x 12y + 99 1.00000 9y 9x 15y + 100 -1.00000 9y 9x 16y + 101 -1.00000 9y 9x 25x + 102 1.00000 9y 9x 26x + 103 1.00000 9y 9x 57x + 104 -1.00000 9y 9x 58x + 105 -1.00000 9y 9z 25z + 106 1.00000 9y 9z 26z + 107 -1.00000 9y 9z 27y + 108 1.00000 9y 9z 31y + 109 1.00000 9y 9z 57z + 110 -1.00000 9y 9z 58z + 111 1.00000 9y 9z 59y + 112 -1.00000 9y 9z 63y + 113 -1.00000 9y 11x 11y + 114 1.00000 9y 12x 12y + 115 1.00000 9y 15x 15y + 116 -1.00000 9y 16x 16y + 117 -1.00000 9y 27y 27z + 118 1.00000 9y 31y 31z + 119 1.00000 9y 59y 59z + 120 -1.00000 9y 63y 63z + 121 -1.00000 9z 9x 11z + 122 1.00000 9z 9x 12z + 123 1.00000 9z 9x 15z + 124 -1.00000 9z 9x 16z + 125 -1.00000 9z 9x 27x + 126 1.00000 9z 9x 31x + 127 1.00000 9z 9x 59x + 128 -1.00000 9z 9x 63x + 129 -1.00000 9z 9y 25z + 130 1.00000 9z 9y 26z + 131 -1.00000 9z 9y 27y + 132 1.00000 9z 9y 31y + 133 1.00000 9z 9y 57z + 134 -1.00000 9z 9y 58z + 135 1.00000 9z 9y 59y + 136 -1.00000 9z 9y 63y + 137 -1.00000 9z 11x 11z + 138 1.00000 9z 12x 12z + 139 1.00000 9z 15x 15z + 140 -1.00000 9z 16x 16z + 141 -1.00000 9z 25y 25z + 142 1.00000 9z 26y 26z + 143 1.00000 9z 57y 57z + 144 -1.00000 9z 58y 58z + + # FC3_6 144 1.1067276e-03 + 1 1.00000 1x 1y 3z + 2 1.00000 1x 1y 4z + 3 1.00000 1x 1y 7z + 4 1.00000 1x 1y 8z + 5 1.00000 1x 1y 17z + 6 1.00000 1x 1y 18z + 7 1.00000 1x 1y 49z + 8 1.00000 1x 1y 50z + 9 1.00000 1x 1z 3y + 10 1.00000 1x 1z 4y + 11 1.00000 1x 1z 7y + 12 1.00000 1x 1z 8y + 13 1.00000 1x 1z 19y + 14 1.00000 1x 1z 23y + 15 1.00000 1x 1z 51y + 16 1.00000 1x 1z 55y + 17 1.00000 1x 17y 17z + 18 1.00000 1x 18y 18z + 19 1.00000 1x 19y 19z + 20 1.00000 1x 23y 23z + 21 1.00000 1x 49y 49z + 22 1.00000 1x 50y 50z + 23 1.00000 1x 51y 51z + 24 1.00000 1x 55y 55z + 25 1.00000 1y 1x 3z + 26 1.00000 1y 1x 4z + 27 1.00000 1y 1x 7z + 28 1.00000 1y 1x 8z + 29 1.00000 1y 1x 17z + 30 1.00000 1y 1x 18z + 31 1.00000 1y 1x 49z + 32 1.00000 1y 1x 50z + 33 1.00000 1y 1z 17x + 34 1.00000 1y 1z 18x + 35 1.00000 1y 1z 19x + 36 1.00000 1y 1z 23x + 37 1.00000 1y 1z 49x + 38 1.00000 1y 1z 50x + 39 1.00000 1y 1z 51x + 40 1.00000 1y 1z 55x + 41 1.00000 1y 3x 3z + 42 1.00000 1y 4x 4z + 43 1.00000 1y 7x 7z + 44 1.00000 1y 8x 8z + 45 1.00000 1y 19x 19z + 46 1.00000 1y 23x 23z + 47 1.00000 1y 51x 51z + 48 1.00000 1y 55x 55z + 49 1.00000 1z 1x 3y + 50 1.00000 1z 1x 4y + 51 1.00000 1z 1x 7y + 52 1.00000 1z 1x 8y + 53 1.00000 1z 1x 19y + 54 1.00000 1z 1x 23y + 55 1.00000 1z 1x 51y + 56 1.00000 1z 1x 55y + 57 1.00000 1z 1y 17x + 58 1.00000 1z 1y 18x + 59 1.00000 1z 1y 19x + 60 1.00000 1z 1y 23x + 61 1.00000 1z 1y 49x + 62 1.00000 1z 1y 50x + 63 1.00000 1z 1y 51x + 64 1.00000 1z 1y 55x + 65 1.00000 1z 3x 3y + 66 1.00000 1z 4x 4y + 67 1.00000 1z 7x 7y + 68 1.00000 1z 8x 8y + 69 1.00000 1z 17x 17y + 70 1.00000 1z 18x 18y + 71 1.00000 1z 49x 49y + 72 1.00000 1z 50x 50y + 73 -1.00000 9x 9y 11z + 74 -1.00000 9x 9y 12z + 75 -1.00000 9x 9y 15z + 76 -1.00000 9x 9y 16z + 77 -1.00000 9x 9y 25z + 78 -1.00000 9x 9y 26z + 79 -1.00000 9x 9y 57z + 80 -1.00000 9x 9y 58z + 81 -1.00000 9x 9z 11y + 82 -1.00000 9x 9z 12y + 83 -1.00000 9x 9z 15y + 84 -1.00000 9x 9z 16y + 85 -1.00000 9x 9z 27y + 86 -1.00000 9x 9z 31y + 87 -1.00000 9x 9z 59y + 88 -1.00000 9x 9z 63y + 89 -1.00000 9x 25y 25z + 90 -1.00000 9x 26y 26z + 91 -1.00000 9x 27y 27z + 92 -1.00000 9x 31y 31z + 93 -1.00000 9x 57y 57z + 94 -1.00000 9x 58y 58z + 95 -1.00000 9x 59y 59z + 96 -1.00000 9x 63y 63z + 97 -1.00000 9y 9x 11z + 98 -1.00000 9y 9x 12z + 99 -1.00000 9y 9x 15z + 100 -1.00000 9y 9x 16z + 101 -1.00000 9y 9x 25z + 102 -1.00000 9y 9x 26z + 103 -1.00000 9y 9x 57z + 104 -1.00000 9y 9x 58z + 105 -1.00000 9y 9z 25x + 106 -1.00000 9y 9z 26x + 107 -1.00000 9y 9z 27x + 108 -1.00000 9y 9z 31x + 109 -1.00000 9y 9z 57x + 110 -1.00000 9y 9z 58x + 111 -1.00000 9y 9z 59x + 112 -1.00000 9y 9z 63x + 113 -1.00000 9y 11x 11z + 114 -1.00000 9y 12x 12z + 115 -1.00000 9y 15x 15z + 116 -1.00000 9y 16x 16z + 117 -1.00000 9y 27x 27z + 118 -1.00000 9y 31x 31z + 119 -1.00000 9y 59x 59z + 120 -1.00000 9y 63x 63z + 121 -1.00000 9z 9x 11y + 122 -1.00000 9z 9x 12y + 123 -1.00000 9z 9x 15y + 124 -1.00000 9z 9x 16y + 125 -1.00000 9z 9x 27y + 126 -1.00000 9z 9x 31y + 127 -1.00000 9z 9x 59y + 128 -1.00000 9z 9x 63y + 129 -1.00000 9z 9y 25x + 130 -1.00000 9z 9y 26x + 131 -1.00000 9z 9y 27x + 132 -1.00000 9z 9y 31x + 133 -1.00000 9z 9y 57x + 134 -1.00000 9z 9y 58x + 135 -1.00000 9z 9y 59x + 136 -1.00000 9z 9y 63x + 137 -1.00000 9z 11x 11y + 138 -1.00000 9z 12x 12y + 139 -1.00000 9z 15x 15y + 140 -1.00000 9z 16x 16y + 141 -1.00000 9z 25x 25y + 142 -1.00000 9z 26x 26y + 143 -1.00000 9z 57x 57y + 144 -1.00000 9z 58x 58y + + # FC3_7 96 -1.4202527e-03 + 1 1.00000 1x 1x 17y + 2 -1.00000 1x 1x 18y + 3 1.00000 1x 1x 19z + 4 -1.00000 1x 1x 23z + 5 -1.00000 1x 1x 49y + 6 1.00000 1x 1x 50y + 7 -1.00000 1x 1x 51z + 8 1.00000 1x 1x 55z + 9 1.00000 1x 3y 3y + 10 1.00000 1x 3z 3z + 11 -1.00000 1x 4y 4y + 12 -1.00000 1x 4z 4z + 13 -1.00000 1x 7y 7y + 14 -1.00000 1x 7z 7z + 15 1.00000 1x 8y 8y + 16 1.00000 1x 8z 8z + 17 1.00000 1y 1y 3x + 18 -1.00000 1y 1y 4x + 19 -1.00000 1y 1y 7x + 20 1.00000 1y 1y 8x + 21 1.00000 1y 1y 19z + 22 -1.00000 1y 1y 23z + 23 -1.00000 1y 1y 51z + 24 1.00000 1y 1y 55z + 25 1.00000 1y 17x 17x + 26 1.00000 1y 17z 17z + 27 -1.00000 1y 18x 18x + 28 -1.00000 1y 18z 18z + 29 -1.00000 1y 49x 49x + 30 -1.00000 1y 49z 49z + 31 1.00000 1y 50x 50x + 32 1.00000 1y 50z 50z + 33 1.00000 1z 1z 3x + 34 -1.00000 1z 1z 4x + 35 -1.00000 1z 1z 7x + 36 1.00000 1z 1z 8x + 37 1.00000 1z 1z 17y + 38 -1.00000 1z 1z 18y + 39 -1.00000 1z 1z 49y + 40 1.00000 1z 1z 50y + 41 1.00000 1z 19x 19x + 42 1.00000 1z 19y 19y + 43 -1.00000 1z 23x 23x + 44 -1.00000 1z 23y 23y + 45 -1.00000 1z 51x 51x + 46 -1.00000 1z 51y 51y + 47 1.00000 1z 55x 55x + 48 1.00000 1z 55y 55y + 49 -1.00000 9x 9x 25y + 50 1.00000 9x 9x 26y + 51 -1.00000 9x 9x 27z + 52 1.00000 9x 9x 31z + 53 1.00000 9x 9x 57y + 54 -1.00000 9x 9x 58y + 55 1.00000 9x 9x 59z + 56 -1.00000 9x 9x 63z + 57 -1.00000 9x 11y 11y + 58 -1.00000 9x 11z 11z + 59 1.00000 9x 12y 12y + 60 1.00000 9x 12z 12z + 61 1.00000 9x 15y 15y + 62 1.00000 9x 15z 15z + 63 -1.00000 9x 16y 16y + 64 -1.00000 9x 16z 16z + 65 -1.00000 9y 9y 11x + 66 1.00000 9y 9y 12x + 67 1.00000 9y 9y 15x + 68 -1.00000 9y 9y 16x + 69 -1.00000 9y 9y 27z + 70 1.00000 9y 9y 31z + 71 1.00000 9y 9y 59z + 72 -1.00000 9y 9y 63z + 73 -1.00000 9y 25x 25x + 74 -1.00000 9y 25z 25z + 75 1.00000 9y 26x 26x + 76 1.00000 9y 26z 26z + 77 1.00000 9y 57x 57x + 78 1.00000 9y 57z 57z + 79 -1.00000 9y 58x 58x + 80 -1.00000 9y 58z 58z + 81 -1.00000 9z 9z 11x + 82 1.00000 9z 9z 12x + 83 1.00000 9z 9z 15x + 84 -1.00000 9z 9z 16x + 85 -1.00000 9z 9z 25y + 86 1.00000 9z 9z 26y + 87 1.00000 9z 9z 57y + 88 -1.00000 9z 9z 58y + 89 -1.00000 9z 27x 27x + 90 -1.00000 9z 27y 27y + 91 1.00000 9z 31x 31x + 92 1.00000 9z 31y 31y + 93 1.00000 9z 59x 59x + 94 1.00000 9z 59y 59y + 95 -1.00000 9z 63x 63x + 96 -1.00000 9z 63y 63y + + # FC3_8 96 -1.8168103e-03 + 1 1.00000 1x 1x 17x + 2 1.00000 1x 1x 18x + 3 1.00000 1x 1x 19x + 4 1.00000 1x 1x 23x + 5 -1.00000 1x 1x 49x + 6 -1.00000 1x 1x 50x + 7 -1.00000 1x 1x 51x + 8 -1.00000 1x 1x 55x + 9 -1.00000 1x 17x 17x + 10 -1.00000 1x 18x 18x + 11 -1.00000 1x 19x 19x + 12 -1.00000 1x 23x 23x + 13 1.00000 1x 49x 49x + 14 1.00000 1x 50x 50x + 15 1.00000 1x 51x 51x + 16 1.00000 1x 55x 55x + 17 1.00000 1y 1y 3y + 18 1.00000 1y 1y 4y + 19 -1.00000 1y 1y 7y + 20 -1.00000 1y 1y 8y + 21 1.00000 1y 1y 19y + 22 -1.00000 1y 1y 23y + 23 1.00000 1y 1y 51y + 24 -1.00000 1y 1y 55y + 25 -1.00000 1y 3y 3y + 26 -1.00000 1y 4y 4y + 27 1.00000 1y 7y 7y + 28 1.00000 1y 8y 8y + 29 -1.00000 1y 19y 19y + 30 1.00000 1y 23y 23y + 31 -1.00000 1y 51y 51y + 32 1.00000 1y 55y 55y + 33 1.00000 1z 1z 3z + 34 -1.00000 1z 1z 4z + 35 1.00000 1z 1z 7z + 36 -1.00000 1z 1z 8z + 37 1.00000 1z 1z 17z + 38 -1.00000 1z 1z 18z + 39 1.00000 1z 1z 49z + 40 -1.00000 1z 1z 50z + 41 -1.00000 1z 3z 3z + 42 1.00000 1z 4z 4z + 43 -1.00000 1z 7z 7z + 44 1.00000 1z 8z 8z + 45 -1.00000 1z 17z 17z + 46 1.00000 1z 18z 18z + 47 -1.00000 1z 49z 49z + 48 1.00000 1z 50z 50z + 49 1.00000 9x 9x 25x + 50 1.00000 9x 9x 26x + 51 1.00000 9x 9x 27x + 52 1.00000 9x 9x 31x + 53 -1.00000 9x 9x 57x + 54 -1.00000 9x 9x 58x + 55 -1.00000 9x 9x 59x + 56 -1.00000 9x 9x 63x + 57 -1.00000 9x 25x 25x + 58 -1.00000 9x 26x 26x + 59 -1.00000 9x 27x 27x + 60 -1.00000 9x 31x 31x + 61 1.00000 9x 57x 57x + 62 1.00000 9x 58x 58x + 63 1.00000 9x 59x 59x + 64 1.00000 9x 63x 63x + 65 1.00000 9y 9y 11y + 66 1.00000 9y 9y 12y + 67 -1.00000 9y 9y 15y + 68 -1.00000 9y 9y 16y + 69 1.00000 9y 9y 27y + 70 -1.00000 9y 9y 31y + 71 1.00000 9y 9y 59y + 72 -1.00000 9y 9y 63y + 73 -1.00000 9y 11y 11y + 74 -1.00000 9y 12y 12y + 75 1.00000 9y 15y 15y + 76 1.00000 9y 16y 16y + 77 -1.00000 9y 27y 27y + 78 1.00000 9y 31y 31y + 79 -1.00000 9y 59y 59y + 80 1.00000 9y 63y 63y + 81 1.00000 9z 9z 11z + 82 -1.00000 9z 9z 12z + 83 1.00000 9z 9z 15z + 84 -1.00000 9z 9z 16z + 85 1.00000 9z 9z 25z + 86 -1.00000 9z 9z 26z + 87 1.00000 9z 9z 57z + 88 -1.00000 9z 9z 58z + 89 -1.00000 9z 11z 11z + 90 1.00000 9z 12z 12z + 91 -1.00000 9z 15z 15z + 92 1.00000 9z 16z 16z + 93 -1.00000 9z 25z 25z + 94 1.00000 9z 26z 26z + 95 -1.00000 9z 57z 57z + 96 1.00000 9z 58z 58z + + # FC3_9 96 -1.4133510e-03 + 1 1.00000 1x 1x 17z + 2 -1.00000 1x 1x 18z + 3 1.00000 1x 1x 19y + 4 -1.00000 1x 1x 23y + 5 1.00000 1x 1x 49z + 6 -1.00000 1x 1x 50z + 7 1.00000 1x 1x 51y + 8 -1.00000 1x 1x 55y + 9 -1.00000 1x 17z 17z + 10 -1.00000 1x 18z 18z + 11 -1.00000 1x 19y 19y + 12 -1.00000 1x 23y 23y + 13 1.00000 1x 49z 49z + 14 1.00000 1x 50z 50z + 15 1.00000 1x 51y 51y + 16 1.00000 1x 55y 55y + 17 1.00000 1y 1y 3z + 18 -1.00000 1y 1y 4z + 19 1.00000 1y 1y 7z + 20 -1.00000 1y 1y 8z + 21 1.00000 1y 1y 19x + 22 1.00000 1y 1y 23x + 23 -1.00000 1y 1y 51x + 24 -1.00000 1y 1y 55x + 25 -1.00000 1y 3z 3z + 26 -1.00000 1y 4z 4z + 27 1.00000 1y 7z 7z + 28 1.00000 1y 8z 8z + 29 -1.00000 1y 19x 19x + 30 1.00000 1y 23x 23x + 31 -1.00000 1y 51x 51x + 32 1.00000 1y 55x 55x + 33 1.00000 1z 1z 3y + 34 1.00000 1z 1z 4y + 35 -1.00000 1z 1z 7y + 36 -1.00000 1z 1z 8y + 37 1.00000 1z 1z 17x + 38 1.00000 1z 1z 18x + 39 -1.00000 1z 1z 49x + 40 -1.00000 1z 1z 50x + 41 -1.00000 1z 3y 3y + 42 1.00000 1z 4y 4y + 43 -1.00000 1z 7y 7y + 44 1.00000 1z 8y 8y + 45 -1.00000 1z 17x 17x + 46 1.00000 1z 18x 18x + 47 -1.00000 1z 49x 49x + 48 1.00000 1z 50x 50x + 49 1.00000 9x 9x 25z + 50 -1.00000 9x 9x 26z + 51 1.00000 9x 9x 27y + 52 -1.00000 9x 9x 31y + 53 1.00000 9x 9x 57z + 54 -1.00000 9x 9x 58z + 55 1.00000 9x 9x 59y + 56 -1.00000 9x 9x 63y + 57 -1.00000 9x 25z 25z + 58 -1.00000 9x 26z 26z + 59 -1.00000 9x 27y 27y + 60 -1.00000 9x 31y 31y + 61 1.00000 9x 57z 57z + 62 1.00000 9x 58z 58z + 63 1.00000 9x 59y 59y + 64 1.00000 9x 63y 63y + 65 1.00000 9y 9y 11z + 66 -1.00000 9y 9y 12z + 67 1.00000 9y 9y 15z + 68 -1.00000 9y 9y 16z + 69 1.00000 9y 9y 27x + 70 1.00000 9y 9y 31x + 71 -1.00000 9y 9y 59x + 72 -1.00000 9y 9y 63x + 73 -1.00000 9y 11z 11z + 74 -1.00000 9y 12z 12z + 75 1.00000 9y 15z 15z + 76 1.00000 9y 16z 16z + 77 -1.00000 9y 27x 27x + 78 1.00000 9y 31x 31x + 79 -1.00000 9y 59x 59x + 80 1.00000 9y 63x 63x + 81 1.00000 9z 9z 11y + 82 1.00000 9z 9z 12y + 83 -1.00000 9z 9z 15y + 84 -1.00000 9z 9z 16y + 85 1.00000 9z 9z 25x + 86 1.00000 9z 9z 26x + 87 -1.00000 9z 9z 57x + 88 -1.00000 9z 9z 58x + 89 -1.00000 9z 11y 11y + 90 1.00000 9z 12y 12y + 91 -1.00000 9z 15y 15y + 92 1.00000 9z 16y 16y + 93 -1.00000 9z 25x 25x + 94 1.00000 9z 26x 26x + 95 -1.00000 9z 57x 57x + 96 1.00000 9z 58x 58x + + # FC3_10 72 6.6782969e-05 + 1 1.00000 1x 1y 19z + 2 1.00000 1x 1y 23z + 3 1.00000 1x 1y 51z + 4 1.00000 1x 1y 55z + 5 1.00000 1x 1z 17y + 6 1.00000 1x 1z 18y + 7 1.00000 1x 1z 49y + 8 1.00000 1x 1z 50y + 9 1.00000 1x 3y 3z + 10 1.00000 1x 4y 4z + 11 1.00000 1x 7y 7z + 12 1.00000 1x 8y 8z + 13 1.00000 1y 1x 19z + 14 1.00000 1y 1x 23z + 15 1.00000 1y 1x 51z + 16 1.00000 1y 1x 55z + 17 1.00000 1y 1z 3x + 18 1.00000 1y 1z 4x + 19 1.00000 1y 1z 7x + 20 1.00000 1y 1z 8x + 21 1.00000 1y 17x 17z + 22 1.00000 1y 18x 18z + 23 1.00000 1y 49x 49z + 24 1.00000 1y 50x 50z + 25 1.00000 1z 1x 17y + 26 1.00000 1z 1x 18y + 27 1.00000 1z 1x 49y + 28 1.00000 1z 1x 50y + 29 1.00000 1z 1y 3x + 30 1.00000 1z 1y 4x + 31 1.00000 1z 1y 7x + 32 1.00000 1z 1y 8x + 33 1.00000 1z 19x 19y + 34 1.00000 1z 23x 23y + 35 1.00000 1z 51x 51y + 36 1.00000 1z 55x 55y + 37 -1.00000 9x 9y 27z + 38 -1.00000 9x 9y 31z + 39 -1.00000 9x 9y 59z + 40 -1.00000 9x 9y 63z + 41 -1.00000 9x 9z 25y + 42 -1.00000 9x 9z 26y + 43 -1.00000 9x 9z 57y + 44 -1.00000 9x 9z 58y + 45 -1.00000 9x 11y 11z + 46 -1.00000 9x 12y 12z + 47 -1.00000 9x 15y 15z + 48 -1.00000 9x 16y 16z + 49 -1.00000 9y 9x 27z + 50 -1.00000 9y 9x 31z + 51 -1.00000 9y 9x 59z + 52 -1.00000 9y 9x 63z + 53 -1.00000 9y 9z 11x + 54 -1.00000 9y 9z 12x + 55 -1.00000 9y 9z 15x + 56 -1.00000 9y 9z 16x + 57 -1.00000 9y 25x 25z + 58 -1.00000 9y 26x 26z + 59 -1.00000 9y 57x 57z + 60 -1.00000 9y 58x 58z + 61 -1.00000 9z 9x 25y + 62 -1.00000 9z 9x 26y + 63 -1.00000 9z 9x 57y + 64 -1.00000 9z 9x 58y + 65 -1.00000 9z 9y 11x + 66 -1.00000 9z 9y 12x + 67 -1.00000 9z 9y 15x + 68 -1.00000 9z 9y 16x + 69 -1.00000 9z 27x 27y + 70 -1.00000 9z 31x 31y + 71 -1.00000 9z 59x 59y + 72 -1.00000 9z 63x 63y + + # FC3_11 144 -1.9612927e-03 + 1 1.00000 1x 1y 19x + 2 1.00000 1x 1y 19y + 3 -1.00000 1x 1y 23x + 4 1.00000 1x 1y 23y + 5 1.00000 1x 1y 51x + 6 -1.00000 1x 1y 51y + 7 -1.00000 1x 1y 55x + 8 -1.00000 1x 1y 55y + 9 1.00000 1x 1z 17x + 10 1.00000 1x 1z 17z + 11 -1.00000 1x 1z 18x + 12 1.00000 1x 1z 18z + 13 1.00000 1x 1z 49x + 14 -1.00000 1x 1z 49z + 15 -1.00000 1x 1z 50x + 16 -1.00000 1x 1z 50z + 17 -1.00000 1x 17x 17z + 18 1.00000 1x 18x 18z + 19 -1.00000 1x 19x 19y + 20 1.00000 1x 23x 23y + 21 -1.00000 1x 49x 49z + 22 1.00000 1x 50x 50z + 23 -1.00000 1x 51x 51y + 24 1.00000 1x 55x 55y + 25 1.00000 1y 1x 19x + 26 1.00000 1y 1x 19y + 27 -1.00000 1y 1x 23x + 28 1.00000 1y 1x 23y + 29 1.00000 1y 1x 51x + 30 -1.00000 1y 1x 51y + 31 -1.00000 1y 1x 55x + 32 -1.00000 1y 1x 55y + 33 1.00000 1y 1z 3y + 34 1.00000 1y 1z 3z + 35 -1.00000 1y 1z 4y + 36 1.00000 1y 1z 4z + 37 1.00000 1y 1z 7y + 38 -1.00000 1y 1z 7z + 39 -1.00000 1y 1z 8y + 40 -1.00000 1y 1z 8z + 41 -1.00000 1y 3y 3z + 42 1.00000 1y 4y 4z + 43 -1.00000 1y 7y 7z + 44 1.00000 1y 8y 8z + 45 -1.00000 1y 19x 19y + 46 -1.00000 1y 23x 23y + 47 1.00000 1y 51x 51y + 48 1.00000 1y 55x 55y + 49 1.00000 1z 1x 17x + 50 1.00000 1z 1x 17z + 51 -1.00000 1z 1x 18x + 52 1.00000 1z 1x 18z + 53 1.00000 1z 1x 49x + 54 -1.00000 1z 1x 49z + 55 -1.00000 1z 1x 50x + 56 -1.00000 1z 1x 50z + 57 1.00000 1z 1y 3y + 58 1.00000 1z 1y 3z + 59 -1.00000 1z 1y 4y + 60 1.00000 1z 1y 4z + 61 1.00000 1z 1y 7y + 62 -1.00000 1z 1y 7z + 63 -1.00000 1z 1y 8y + 64 -1.00000 1z 1y 8z + 65 -1.00000 1z 3y 3z + 66 -1.00000 1z 4y 4z + 67 1.00000 1z 7y 7z + 68 1.00000 1z 8y 8z + 69 -1.00000 1z 17x 17z + 70 -1.00000 1z 18x 18z + 71 1.00000 1z 49x 49z + 72 1.00000 1z 50x 50z + 73 1.00000 9x 9y 27x + 74 1.00000 9x 9y 27y + 75 -1.00000 9x 9y 31x + 76 1.00000 9x 9y 31y + 77 1.00000 9x 9y 59x + 78 -1.00000 9x 9y 59y + 79 -1.00000 9x 9y 63x + 80 -1.00000 9x 9y 63y + 81 1.00000 9x 9z 25x + 82 1.00000 9x 9z 25z + 83 -1.00000 9x 9z 26x + 84 1.00000 9x 9z 26z + 85 1.00000 9x 9z 57x + 86 -1.00000 9x 9z 57z + 87 -1.00000 9x 9z 58x + 88 -1.00000 9x 9z 58z + 89 -1.00000 9x 25x 25z + 90 1.00000 9x 26x 26z + 91 -1.00000 9x 27x 27y + 92 1.00000 9x 31x 31y + 93 -1.00000 9x 57x 57z + 94 1.00000 9x 58x 58z + 95 -1.00000 9x 59x 59y + 96 1.00000 9x 63x 63y + 97 1.00000 9y 9x 27x + 98 1.00000 9y 9x 27y + 99 -1.00000 9y 9x 31x + 100 1.00000 9y 9x 31y + 101 1.00000 9y 9x 59x + 102 -1.00000 9y 9x 59y + 103 -1.00000 9y 9x 63x + 104 -1.00000 9y 9x 63y + 105 1.00000 9y 9z 11y + 106 1.00000 9y 9z 11z + 107 -1.00000 9y 9z 12y + 108 1.00000 9y 9z 12z + 109 1.00000 9y 9z 15y + 110 -1.00000 9y 9z 15z + 111 -1.00000 9y 9z 16y + 112 -1.00000 9y 9z 16z + 113 -1.00000 9y 11y 11z + 114 1.00000 9y 12y 12z + 115 -1.00000 9y 15y 15z + 116 1.00000 9y 16y 16z + 117 -1.00000 9y 27x 27y + 118 -1.00000 9y 31x 31y + 119 1.00000 9y 59x 59y + 120 1.00000 9y 63x 63y + 121 1.00000 9z 9x 25x + 122 1.00000 9z 9x 25z + 123 -1.00000 9z 9x 26x + 124 1.00000 9z 9x 26z + 125 1.00000 9z 9x 57x + 126 -1.00000 9z 9x 57z + 127 -1.00000 9z 9x 58x + 128 -1.00000 9z 9x 58z + 129 1.00000 9z 9y 11y + 130 1.00000 9z 9y 11z + 131 -1.00000 9z 9y 12y + 132 1.00000 9z 9y 12z + 133 1.00000 9z 9y 15y + 134 -1.00000 9z 9y 15z + 135 -1.00000 9z 9y 16y + 136 -1.00000 9z 9y 16z + 137 -1.00000 9z 11y 11z + 138 -1.00000 9z 12y 12z + 139 1.00000 9z 15y 15z + 140 1.00000 9z 16y 16z + 141 -1.00000 9z 25x 25z + 142 -1.00000 9z 26x 26z + 143 1.00000 9z 57x 57z + 144 1.00000 9z 58x 58z + + # FC3_12 48 -3.4916028e-02 + 1 1.00000 1x 1x 9x + 2 1.00000 1x 1x 16x + 3 -1.00000 1x 1x 58x + 4 -1.00000 1x 1x 63x + 5 -1.00000 1x 9x 9x + 6 -1.00000 1x 16x 16x + 7 1.00000 1x 58x 58x + 8 1.00000 1x 63x 63x + 9 1.00000 1y 1y 9y + 10 -1.00000 1y 1y 16y + 11 1.00000 1y 1y 58y + 12 -1.00000 1y 1y 63y + 13 -1.00000 1y 9y 9y + 14 1.00000 1y 16y 16y + 15 -1.00000 1y 58y 58y + 16 1.00000 1y 63y 63y + 17 1.00000 1z 1z 9z + 18 -1.00000 1z 1z 16z + 19 -1.00000 1z 1z 58z + 20 1.00000 1z 1z 63z + 21 -1.00000 1z 9z 9z + 22 1.00000 1z 16z 16z + 23 1.00000 1z 58z 58z + 24 -1.00000 1z 63z 63z + 25 1.00000 9x 1x 1x + 26 -1.00000 9x 1x 9x + 27 1.00000 9x 3x 3x + 28 -1.00000 9x 3x 9x + 29 1.00000 9x 9x 17x + 30 1.00000 9x 9x 19x + 31 -1.00000 9x 17x 17x + 32 -1.00000 9x 19x 19x + 33 1.00000 9y 1y 1y + 34 -1.00000 9y 1y 9y + 35 -1.00000 9y 3y 3y + 36 1.00000 9y 3y 9y + 37 -1.00000 9y 9y 17y + 38 1.00000 9y 9y 19y + 39 1.00000 9y 17y 17y + 40 -1.00000 9y 19y 19y + 41 1.00000 9z 1z 1z + 42 -1.00000 9z 1z 9z + 43 -1.00000 9z 3z 3z + 44 1.00000 9z 3z 9z + 45 1.00000 9z 9z 17z + 46 -1.00000 9z 9z 19z + 47 -1.00000 9z 17z 17z + 48 1.00000 9z 19z 19z + + # FC3_13 96 -6.6929291e-02 + 1 1.00000 1x 1x 9y + 2 1.00000 1x 1x 9z + 3 -1.00000 1x 1x 16y + 4 -1.00000 1x 1x 16z + 5 1.00000 1x 1x 58y + 6 -1.00000 1x 1x 58z + 7 -1.00000 1x 1x 63y + 8 1.00000 1x 1x 63z + 9 -1.00000 1x 9y 9y + 10 -1.00000 1x 9z 9z + 11 -1.00000 1x 16y 16y + 12 -1.00000 1x 16z 16z + 13 1.00000 1x 58y 58y + 14 1.00000 1x 58z 58z + 15 1.00000 1x 63y 63y + 16 1.00000 1x 63z 63z + 17 1.00000 1y 1y 9x + 18 1.00000 1y 1y 9z + 19 1.00000 1y 1y 16x + 20 -1.00000 1y 1y 16z + 21 -1.00000 1y 1y 58x + 22 -1.00000 1y 1y 58z + 23 -1.00000 1y 1y 63x + 24 1.00000 1y 1y 63z + 25 -1.00000 1y 9x 9x + 26 -1.00000 1y 9z 9z + 27 1.00000 1y 16x 16x + 28 1.00000 1y 16z 16z + 29 -1.00000 1y 58x 58x + 30 -1.00000 1y 58z 58z + 31 1.00000 1y 63x 63x + 32 1.00000 1y 63z 63z + 33 1.00000 1z 1z 9x + 34 1.00000 1z 1z 9y + 35 1.00000 1z 1z 16x + 36 -1.00000 1z 1z 16y + 37 -1.00000 1z 1z 58x + 38 1.00000 1z 1z 58y + 39 -1.00000 1z 1z 63x + 40 -1.00000 1z 1z 63y + 41 -1.00000 1z 9x 9x + 42 -1.00000 1z 9y 9y + 43 1.00000 1z 16x 16x + 44 1.00000 1z 16y 16y + 45 1.00000 1z 58x 58x + 46 1.00000 1z 58y 58y + 47 -1.00000 1z 63x 63x + 48 -1.00000 1z 63y 63y + 49 1.00000 9x 1y 1y + 50 -1.00000 9x 1y 9x + 51 1.00000 9x 1z 1z + 52 -1.00000 9x 1z 9x + 53 1.00000 9x 3y 3y + 54 1.00000 9x 3y 9x + 55 1.00000 9x 3z 3z + 56 1.00000 9x 3z 9x + 57 -1.00000 9x 9x 17y + 58 1.00000 9x 9x 17z + 59 1.00000 9x 9x 19y + 60 -1.00000 9x 9x 19z + 61 -1.00000 9x 17y 17y + 62 -1.00000 9x 17z 17z + 63 -1.00000 9x 19y 19y + 64 -1.00000 9x 19z 19z + 65 1.00000 9y 1x 1x + 66 -1.00000 9y 1x 9y + 67 1.00000 9y 1z 1z + 68 -1.00000 9y 1z 9y + 69 -1.00000 9y 3x 3x + 70 -1.00000 9y 3x 9y + 71 -1.00000 9y 3z 3z + 72 1.00000 9y 3z 9y + 73 1.00000 9y 9y 17x + 74 1.00000 9y 9y 17z + 75 1.00000 9y 9y 19x + 76 -1.00000 9y 9y 19z + 77 1.00000 9y 17x 17x + 78 1.00000 9y 17z 17z + 79 -1.00000 9y 19x 19x + 80 -1.00000 9y 19z 19z + 81 1.00000 9z 1x 1x + 82 -1.00000 9z 1x 9z + 83 1.00000 9z 1y 1y + 84 -1.00000 9z 1y 9z + 85 -1.00000 9z 3x 3x + 86 -1.00000 9z 3x 9z + 87 -1.00000 9z 3y 3y + 88 1.00000 9z 3y 9z + 89 1.00000 9z 9z 17x + 90 -1.00000 9z 9z 17y + 91 1.00000 9z 9z 19x + 92 1.00000 9z 9z 19y + 93 -1.00000 9z 17x 17x + 94 -1.00000 9z 17y 17y + 95 1.00000 9z 19x 19x + 96 1.00000 9z 19y 19y + + # FC3_14 144 -6.8604148e-02 + 1 1.00000 1x 1y 9x + 2 1.00000 1x 1y 9y + 3 -1.00000 1x 1y 16x + 4 1.00000 1x 1y 16y + 5 1.00000 1x 1y 58x + 6 -1.00000 1x 1y 58y + 7 -1.00000 1x 1y 63x + 8 -1.00000 1x 1y 63y + 9 1.00000 1x 1z 9x + 10 1.00000 1x 1z 9z + 11 -1.00000 1x 1z 16x + 12 1.00000 1x 1z 16z + 13 -1.00000 1x 1z 58x + 14 -1.00000 1x 1z 58z + 15 1.00000 1x 1z 63x + 16 -1.00000 1x 1z 63z + 17 -1.00000 1x 9x 9y + 18 -1.00000 1x 9x 9z + 19 1.00000 1x 16x 16y + 20 1.00000 1x 16x 16z + 21 -1.00000 1x 58x 58y + 22 1.00000 1x 58x 58z + 23 1.00000 1x 63x 63y + 24 -1.00000 1x 63x 63z + 25 1.00000 1y 1x 9x + 26 1.00000 1y 1x 9y + 27 -1.00000 1y 1x 16x + 28 1.00000 1y 1x 16y + 29 1.00000 1y 1x 58x + 30 -1.00000 1y 1x 58y + 31 -1.00000 1y 1x 63x + 32 -1.00000 1y 1x 63y + 33 1.00000 1y 1z 9y + 34 1.00000 1y 1z 9z + 35 -1.00000 1y 1z 16y + 36 -1.00000 1y 1z 16z + 37 -1.00000 1y 1z 58y + 38 1.00000 1y 1z 58z + 39 1.00000 1y 1z 63y + 40 -1.00000 1y 1z 63z + 41 -1.00000 1y 9x 9y + 42 -1.00000 1y 9y 9z + 43 -1.00000 1y 16x 16y + 44 1.00000 1y 16y 16z + 45 1.00000 1y 58x 58y + 46 1.00000 1y 58y 58z + 47 1.00000 1y 63x 63y + 48 -1.00000 1y 63y 63z + 49 1.00000 1z 1x 9x + 50 1.00000 1z 1x 9z + 51 -1.00000 1z 1x 16x + 52 1.00000 1z 1x 16z + 53 -1.00000 1z 1x 58x + 54 -1.00000 1z 1x 58z + 55 1.00000 1z 1x 63x + 56 -1.00000 1z 1x 63z + 57 1.00000 1z 1y 9y + 58 1.00000 1z 1y 9z + 59 -1.00000 1z 1y 16y + 60 -1.00000 1z 1y 16z + 61 -1.00000 1z 1y 58y + 62 1.00000 1z 1y 58z + 63 1.00000 1z 1y 63y + 64 -1.00000 1z 1y 63z + 65 -1.00000 1z 9x 9z + 66 -1.00000 1z 9y 9z + 67 -1.00000 1z 16x 16z + 68 1.00000 1z 16y 16z + 69 1.00000 1z 58x 58z + 70 -1.00000 1z 58y 58z + 71 1.00000 1z 63x 63z + 72 1.00000 1z 63y 63z + 73 1.00000 9x 1x 1y + 74 1.00000 9x 1x 1z + 75 -1.00000 9x 1x 9y + 76 -1.00000 9x 1x 9z + 77 -1.00000 9x 1y 9y + 78 -1.00000 9x 1z 9z + 79 -1.00000 9x 3x 3y + 80 -1.00000 9x 3x 3z + 81 1.00000 9x 3x 9y + 82 1.00000 9x 3x 9z + 83 -1.00000 9x 3y 9y + 84 -1.00000 9x 3z 9z + 85 -1.00000 9x 9y 17x + 86 1.00000 9x 9y 17y + 87 1.00000 9x 9y 19x + 88 1.00000 9x 9y 19y + 89 1.00000 9x 9z 17x + 90 1.00000 9x 9z 17z + 91 -1.00000 9x 9z 19x + 92 1.00000 9x 9z 19z + 93 1.00000 9x 17x 17y + 94 -1.00000 9x 17x 17z + 95 -1.00000 9x 19x 19y + 96 1.00000 9x 19x 19z + 97 1.00000 9y 1x 1y + 98 -1.00000 9y 1x 9x + 99 1.00000 9y 1y 1z + 100 -1.00000 9y 1y 9x + 101 -1.00000 9y 1y 9z + 102 -1.00000 9y 1z 9z + 103 1.00000 9y 3x 3y + 104 1.00000 9y 3x 9x + 105 -1.00000 9y 3y 3z + 106 -1.00000 9y 3y 9x + 107 1.00000 9y 3y 9z + 108 1.00000 9y 3z 9z + 109 -1.00000 9y 9x 17x + 110 1.00000 9y 9x 17y + 111 1.00000 9y 9x 19x + 112 1.00000 9y 9x 19y + 113 1.00000 9y 9z 17y + 114 -1.00000 9y 9z 17z + 115 -1.00000 9y 9z 19y + 116 1.00000 9y 9z 19z + 117 -1.00000 9y 17x 17y + 118 -1.00000 9y 17y 17z + 119 -1.00000 9y 19x 19y + 120 1.00000 9y 19y 19z + 121 1.00000 9z 1x 1z + 122 -1.00000 9z 1x 9x + 123 1.00000 9z 1y 1z + 124 -1.00000 9z 1y 9y + 125 -1.00000 9z 1z 9x + 126 -1.00000 9z 1z 9y + 127 1.00000 9z 3x 3z + 128 1.00000 9z 3x 9x + 129 -1.00000 9z 3y 3z + 130 1.00000 9z 3y 9y + 131 -1.00000 9z 3z 9x + 132 1.00000 9z 3z 9y + 133 1.00000 9z 9x 17x + 134 1.00000 9z 9x 17z + 135 -1.00000 9z 9x 19x + 136 1.00000 9z 9x 19z + 137 1.00000 9z 9y 17y + 138 -1.00000 9z 9y 17z + 139 -1.00000 9z 9y 19y + 140 1.00000 9z 9y 19z + 141 -1.00000 9z 17x 17z + 142 1.00000 9z 17y 17z + 143 -1.00000 9z 19x 19z + 144 -1.00000 9z 19y 19z + + # FC3_15 72 -9.3115141e-02 + 1 1.00000 1x 1y 9z + 2 1.00000 1x 1y 16z + 3 1.00000 1x 1y 58z + 4 1.00000 1x 1y 63z + 5 1.00000 1x 1z 9y + 6 1.00000 1x 1z 16y + 7 1.00000 1x 1z 58y + 8 1.00000 1x 1z 63y + 9 -1.00000 1x 9y 9z + 10 -1.00000 1x 16y 16z + 11 -1.00000 1x 58y 58z + 12 -1.00000 1x 63y 63z + 13 1.00000 1y 1x 9z + 14 1.00000 1y 1x 16z + 15 1.00000 1y 1x 58z + 16 1.00000 1y 1x 63z + 17 1.00000 1y 1z 9x + 18 1.00000 1y 1z 16x + 19 1.00000 1y 1z 58x + 20 1.00000 1y 1z 63x + 21 -1.00000 1y 9x 9z + 22 -1.00000 1y 16x 16z + 23 -1.00000 1y 58x 58z + 24 -1.00000 1y 63x 63z + 25 1.00000 1z 1x 9y + 26 1.00000 1z 1x 16y + 27 1.00000 1z 1x 58y + 28 1.00000 1z 1x 63y + 29 1.00000 1z 1y 9x + 30 1.00000 1z 1y 16x + 31 1.00000 1z 1y 58x + 32 1.00000 1z 1y 63x + 33 -1.00000 1z 9x 9y + 34 -1.00000 1z 16x 16y + 35 -1.00000 1z 58x 58y + 36 -1.00000 1z 63x 63y + 37 1.00000 9x 1y 1z + 38 -1.00000 9x 1y 9z + 39 -1.00000 9x 1z 9y + 40 1.00000 9x 3y 3z + 41 -1.00000 9x 3y 9z + 42 -1.00000 9x 3z 9y + 43 -1.00000 9x 9y 17z + 44 -1.00000 9x 9y 19z + 45 -1.00000 9x 9z 17y + 46 -1.00000 9x 9z 19y + 47 1.00000 9x 17y 17z + 48 1.00000 9x 19y 19z + 49 1.00000 9y 1x 1z + 50 -1.00000 9y 1x 9z + 51 -1.00000 9y 1z 9x + 52 1.00000 9y 3x 3z + 53 -1.00000 9y 3x 9z + 54 -1.00000 9y 3z 9x + 55 -1.00000 9y 9x 17z + 56 -1.00000 9y 9x 19z + 57 -1.00000 9y 9z 17x + 58 -1.00000 9y 9z 19x + 59 1.00000 9y 17x 17z + 60 1.00000 9y 19x 19z + 61 1.00000 9z 1x 1y + 62 -1.00000 9z 1x 9y + 63 -1.00000 9z 1y 9x + 64 1.00000 9z 3x 3y + 65 -1.00000 9z 3x 9y + 66 -1.00000 9z 3y 9x + 67 -1.00000 9z 9x 17y + 68 -1.00000 9z 9x 19y + 69 -1.00000 9z 9y 17x + 70 -1.00000 9z 9y 19x + 71 1.00000 9z 17x 17y + 72 1.00000 9z 19x 19y + + # FC3_16 36 -1.2881207e-03 + 1 1.00000 1x 3x 9x + 2 -1.00000 1x 4x 58x + 3 -1.00000 1x 7x 63x + 4 1.00000 1x 8x 16x + 5 -1.00000 1x 9x 16x + 6 1.00000 1x 58x 63x + 7 1.00000 1y 9y 17y + 8 -1.00000 1y 9y 58y + 9 -1.00000 1y 16y 18y + 10 1.00000 1y 16y 63y + 11 -1.00000 1y 49y 63y + 12 1.00000 1y 50y 58y + 13 1.00000 1z 9z 19z + 14 -1.00000 1z 9z 63z + 15 -1.00000 1z 16z 23z + 16 1.00000 1z 16z 58z + 17 -1.00000 1z 51z 58z + 18 1.00000 1z 55z 63z + 19 1.00000 9x 1x 3x + 20 -1.00000 9x 1x 16x + 21 -1.00000 9x 3x 11x + 22 1.00000 9x 12x 19x + 23 1.00000 9x 15x 17x + 24 -1.00000 9x 17x 19x + 25 1.00000 9y 1y 17y + 26 -1.00000 9y 1y 58y + 27 -1.00000 9y 3y 19y + 28 1.00000 9y 3y 57y + 29 -1.00000 9y 17y 25y + 30 1.00000 9y 19y 26y + 31 1.00000 9z 1z 19z + 32 -1.00000 9z 1z 63z + 33 -1.00000 9z 3z 17z + 34 1.00000 9z 3z 59z + 35 1.00000 9z 17z 31z + 36 -1.00000 9z 19z 27z + + # FC3_17 144 -7.7467054e-04 + 1 1.00000 1x 3y 9x + 2 1.00000 1x 3z 9x + 3 1.00000 1x 4y 58x + 4 -1.00000 1x 4z 58x + 5 -1.00000 1x 7y 63x + 6 1.00000 1x 7z 63x + 7 -1.00000 1x 8y 16x + 8 -1.00000 1x 8z 16x + 9 -1.00000 1x 9x 16y + 10 -1.00000 1x 9x 16z + 11 1.00000 1x 9y 16x + 12 -1.00000 1x 9y 17y + 13 1.00000 1x 9z 16x + 14 -1.00000 1x 9z 19z + 15 -1.00000 1x 16y 18y + 16 -1.00000 1x 16z 23z + 17 1.00000 1x 49y 63y + 18 1.00000 1x 50y 58y + 19 1.00000 1x 51z 58z + 20 1.00000 1x 55z 63z + 21 -1.00000 1x 58x 63y + 22 1.00000 1x 58x 63z + 23 1.00000 1x 58y 63x + 24 -1.00000 1x 58z 63x + 25 -1.00000 1y 3x 9x + 26 -1.00000 1y 4x 58x + 27 1.00000 1y 7x 63x + 28 1.00000 1y 8x 16x + 29 1.00000 1y 9x 58y + 30 1.00000 1y 9y 17x + 31 1.00000 1y 9y 17z + 32 -1.00000 1y 9y 58x + 33 -1.00000 1y 9y 58z + 34 -1.00000 1y 9z 19z + 35 1.00000 1y 9z 58y + 36 1.00000 1y 16x 63y + 37 1.00000 1y 16y 18x + 38 -1.00000 1y 16y 18z + 39 -1.00000 1y 16y 63x + 40 1.00000 1y 16y 63z + 41 1.00000 1y 16z 23z + 42 -1.00000 1y 16z 63y + 43 -1.00000 1y 49x 63y + 44 1.00000 1y 49z 63y + 45 -1.00000 1y 50x 58y + 46 -1.00000 1y 50z 58y + 47 -1.00000 1y 51z 58z + 48 1.00000 1y 55z 63z + 49 -1.00000 1z 3x 9x + 50 1.00000 1z 4x 58x + 51 -1.00000 1z 7x 63x + 52 1.00000 1z 8x 16x + 53 1.00000 1z 9x 63z + 54 -1.00000 1z 9y 17y + 55 1.00000 1z 9y 63z + 56 1.00000 1z 9z 19x + 57 1.00000 1z 9z 19y + 58 -1.00000 1z 9z 63x + 59 -1.00000 1z 9z 63y + 60 1.00000 1z 16x 58z + 61 1.00000 1z 16y 18y + 62 -1.00000 1z 16y 58z + 63 1.00000 1z 16z 23x + 64 -1.00000 1z 16z 23y + 65 -1.00000 1z 16z 58x + 66 1.00000 1z 16z 58y + 67 -1.00000 1z 49y 63y + 68 1.00000 1z 50y 58y + 69 -1.00000 1z 51x 58z + 70 1.00000 1z 51y 58z + 71 -1.00000 1z 55x 63z + 72 -1.00000 1z 55y 63z + 73 1.00000 9x 1x 3y + 74 1.00000 9x 1x 3z + 75 -1.00000 9x 1x 16y + 76 -1.00000 9x 1x 16z + 77 -1.00000 9x 1y 3x + 78 1.00000 9x 1y 58y + 79 -1.00000 9x 1z 3x + 80 1.00000 9x 1z 63z + 81 1.00000 9x 3x 11y + 82 1.00000 9x 3x 11z + 83 1.00000 9x 3y 57y + 84 1.00000 9x 3z 59z + 85 1.00000 9x 12y 19x + 86 -1.00000 9x 12z 19x + 87 -1.00000 9x 15y 17x + 88 1.00000 9x 15z 17x + 89 1.00000 9x 17x 19y + 90 -1.00000 9x 17x 19z + 91 -1.00000 9x 17y 19x + 92 -1.00000 9x 17y 25y + 93 1.00000 9x 17z 19x + 94 -1.00000 9x 17z 31z + 95 -1.00000 9x 19y 26y + 96 -1.00000 9x 19z 27z + 97 1.00000 9y 1x 16x + 98 -1.00000 9y 1x 17y + 99 1.00000 9y 1y 17x + 100 1.00000 9y 1y 17z + 101 -1.00000 9y 1y 58x + 102 -1.00000 9y 1y 58z + 103 -1.00000 9y 1z 17y + 104 1.00000 9y 1z 63z + 105 -1.00000 9y 3x 11x + 106 -1.00000 9y 3x 19y + 107 1.00000 9y 3y 19x + 108 -1.00000 9y 3y 19z + 109 -1.00000 9y 3y 57x + 110 1.00000 9y 3y 57z + 111 1.00000 9y 3z 19y + 112 -1.00000 9y 3z 59z + 113 -1.00000 9y 12x 19x + 114 1.00000 9y 15x 17x + 115 1.00000 9y 17y 25x + 116 1.00000 9y 17y 25z + 117 1.00000 9y 17z 31z + 118 1.00000 9y 19y 26x + 119 -1.00000 9y 19y 26z + 120 -1.00000 9y 19z 27z + 121 1.00000 9z 1x 16x + 122 -1.00000 9z 1x 19z + 123 -1.00000 9z 1y 19z + 124 1.00000 9z 1y 58y + 125 1.00000 9z 1z 19x + 126 1.00000 9z 1z 19y + 127 -1.00000 9z 1z 63x + 128 -1.00000 9z 1z 63y + 129 -1.00000 9z 3x 11x + 130 -1.00000 9z 3x 17z + 131 1.00000 9z 3y 17z + 132 -1.00000 9z 3y 57y + 133 1.00000 9z 3z 17x + 134 -1.00000 9z 3z 17y + 135 -1.00000 9z 3z 59x + 136 1.00000 9z 3z 59y + 137 1.00000 9z 12x 19x + 138 -1.00000 9z 15x 17x + 139 -1.00000 9z 17y 25y + 140 1.00000 9z 17z 31x + 141 -1.00000 9z 17z 31y + 142 1.00000 9z 19y 26y + 143 1.00000 9z 19z 27x + 144 1.00000 9z 19z 27y + + # FC3_18 144 1.2073663e-03 + 1 1.00000 1x 3y 9y + 2 1.00000 1x 3z 9z + 3 -1.00000 1x 4y 58y + 4 -1.00000 1x 4z 58z + 5 -1.00000 1x 7y 63y + 6 -1.00000 1x 7z 63z + 7 1.00000 1x 8y 16y + 8 1.00000 1x 8z 16z + 9 1.00000 1x 9x 17y + 10 1.00000 1x 9x 19z + 11 -1.00000 1x 9x 58y + 12 -1.00000 1x 9x 63z + 13 -1.00000 1x 9y 58x + 14 -1.00000 1x 9z 63x + 15 -1.00000 1x 16x 18y + 16 -1.00000 1x 16x 23z + 17 1.00000 1x 16x 58z + 18 1.00000 1x 16x 63y + 19 1.00000 1x 16y 63x + 20 1.00000 1x 16z 58x + 21 -1.00000 1x 49y 63x + 22 1.00000 1x 50y 58x + 23 -1.00000 1x 51z 58x + 24 1.00000 1x 55z 63x + 25 1.00000 1y 3x 9y + 26 -1.00000 1y 4x 58y + 27 -1.00000 1y 7x 63y + 28 1.00000 1y 8x 16y + 29 -1.00000 1y 9x 16y + 30 1.00000 1y 9x 17x + 31 -1.00000 1y 9y 16x + 32 1.00000 1y 9y 19z + 33 -1.00000 1y 9y 63z + 34 1.00000 1y 9z 17z + 35 -1.00000 1y 9z 63y + 36 -1.00000 1y 16x 18x + 37 -1.00000 1y 16y 23z + 38 1.00000 1y 16y 58z + 39 -1.00000 1y 16z 18z + 40 1.00000 1y 16z 58y + 41 -1.00000 1y 49x 63x + 42 -1.00000 1y 49z 63z + 43 1.00000 1y 50x 58x + 44 1.00000 1y 50z 58z + 45 -1.00000 1y 51z 58y + 46 1.00000 1y 55z 63y + 47 1.00000 1y 58x 63y + 48 1.00000 1y 58y 63x + 49 1.00000 1z 3x 9z + 50 -1.00000 1z 4x 58z + 51 -1.00000 1z 7x 63z + 52 1.00000 1z 8x 16z + 53 -1.00000 1z 9x 16z + 54 1.00000 1z 9x 19x + 55 1.00000 1z 9y 19y + 56 -1.00000 1z 9y 58z + 57 -1.00000 1z 9z 16x + 58 1.00000 1z 9z 17y + 59 -1.00000 1z 9z 58y + 60 -1.00000 1z 16x 23x + 61 -1.00000 1z 16y 23y + 62 1.00000 1z 16y 63z + 63 -1.00000 1z 16z 18y + 64 1.00000 1z 16z 63y + 65 -1.00000 1z 49y 63z + 66 1.00000 1z 50y 58z + 67 -1.00000 1z 51x 58x + 68 -1.00000 1z 51y 58y + 69 1.00000 1z 55x 63x + 70 1.00000 1z 55y 63y + 71 1.00000 1z 58x 63z + 72 1.00000 1z 58z 63x + 73 1.00000 9x 1x 17y + 74 1.00000 9x 1x 19z + 75 -1.00000 9x 1x 58y + 76 -1.00000 9x 1x 63z + 77 -1.00000 9x 1y 16y + 78 1.00000 9x 1y 17x + 79 -1.00000 9x 1z 16z + 80 1.00000 9x 1z 19x + 81 -1.00000 9x 3x 17z + 82 -1.00000 9x 3x 19y + 83 1.00000 9x 3x 57y + 84 1.00000 9x 3x 59z + 85 -1.00000 9x 3y 11y + 86 -1.00000 9x 3y 19x + 87 -1.00000 9x 3z 11z + 88 -1.00000 9x 3z 17x + 89 1.00000 9x 12y 19y + 90 1.00000 9x 12z 19z + 91 1.00000 9x 15y 17y + 92 1.00000 9x 15z 17z + 93 -1.00000 9x 17x 25y + 94 1.00000 9x 17x 31z + 95 1.00000 9x 19x 26y + 96 -1.00000 9x 19x 27z + 97 1.00000 9y 1x 3y + 98 -1.00000 9y 1x 58x + 99 1.00000 9y 1y 3x + 100 -1.00000 9y 1y 16x + 101 1.00000 9y 1y 19z + 102 -1.00000 9y 1y 63z + 103 1.00000 9y 1z 19y + 104 -1.00000 9y 1z 58z + 105 1.00000 9y 3x 57x + 106 -1.00000 9y 3y 11x + 107 -1.00000 9y 3y 17z + 108 1.00000 9y 3y 59z + 109 -1.00000 9y 3z 17y + 110 1.00000 9y 3z 57z + 111 1.00000 9y 12x 19y + 112 1.00000 9y 15x 17y + 113 -1.00000 9y 17x 19y + 114 -1.00000 9y 17x 25x + 115 -1.00000 9y 17y 19x + 116 1.00000 9y 17y 31z + 117 -1.00000 9y 17z 25z + 118 1.00000 9y 19x 26x + 119 -1.00000 9y 19y 27z + 120 1.00000 9y 19z 26z + 121 1.00000 9z 1x 3z + 122 -1.00000 9z 1x 63x + 123 1.00000 9z 1y 17z + 124 -1.00000 9z 1y 63y + 125 1.00000 9z 1z 3x + 126 -1.00000 9z 1z 16x + 127 1.00000 9z 1z 17y + 128 -1.00000 9z 1z 58y + 129 1.00000 9z 3x 59x + 130 -1.00000 9z 3y 19z + 131 1.00000 9z 3y 59y + 132 -1.00000 9z 3z 11x + 133 -1.00000 9z 3z 19y + 134 1.00000 9z 3z 57y + 135 1.00000 9z 12x 19z + 136 1.00000 9z 15x 17z + 137 -1.00000 9z 17x 19z + 138 1.00000 9z 17x 31x + 139 1.00000 9z 17y 31y + 140 -1.00000 9z 17z 19x + 141 -1.00000 9z 17z 25y + 142 -1.00000 9z 19x 27x + 143 -1.00000 9z 19y 27y + 144 1.00000 9z 19z 26y + + # FC3_19 144 -1.4357797e-03 + 1 1.00000 1x 3y 9z + 2 1.00000 1x 3z 9y + 3 1.00000 1x 4y 58z + 4 1.00000 1x 4z 58y + 5 1.00000 1x 7y 63z + 6 1.00000 1x 7z 63y + 7 1.00000 1x 8y 16z + 8 1.00000 1x 8z 16y + 9 1.00000 1x 9y 19z + 10 -1.00000 1x 9y 58z + 11 -1.00000 1x 9y 63z + 12 1.00000 1x 9z 17y + 13 -1.00000 1x 9z 58y + 14 -1.00000 1x 9z 63y + 15 1.00000 1x 16y 23z + 16 -1.00000 1x 16y 58z + 17 -1.00000 1x 16y 63z + 18 1.00000 1x 16z 18y + 19 -1.00000 1x 16z 58y + 20 -1.00000 1x 16z 63y + 21 1.00000 1x 49y 63z + 22 1.00000 1x 50y 58z + 23 1.00000 1x 51z 58y + 24 1.00000 1x 55z 63y + 25 1.00000 1y 3x 9z + 26 1.00000 1y 4x 58z + 27 1.00000 1y 7x 63z + 28 1.00000 1y 8x 16z + 29 -1.00000 1y 9x 16z + 30 1.00000 1y 9x 17z + 31 1.00000 1y 9x 19z + 32 -1.00000 1y 9x 63z + 33 -1.00000 1y 9z 16x + 34 1.00000 1y 9z 17x + 35 -1.00000 1y 9z 63x + 36 1.00000 1y 16x 18z + 37 1.00000 1y 16x 23z + 38 -1.00000 1y 16x 58z + 39 1.00000 1y 16z 18x + 40 -1.00000 1y 16z 58x + 41 1.00000 1y 49x 63z + 42 1.00000 1y 49z 63x + 43 1.00000 1y 50x 58z + 44 1.00000 1y 50z 58x + 45 1.00000 1y 51z 58x + 46 1.00000 1y 55z 63x + 47 -1.00000 1y 58x 63z + 48 -1.00000 1y 58z 63x + 49 1.00000 1z 3x 9y + 50 1.00000 1z 4x 58y + 51 1.00000 1z 7x 63y + 52 1.00000 1z 8x 16y + 53 -1.00000 1z 9x 16y + 54 1.00000 1z 9x 17y + 55 1.00000 1z 9x 19y + 56 -1.00000 1z 9x 58y + 57 -1.00000 1z 9y 16x + 58 1.00000 1z 9y 19x + 59 -1.00000 1z 9y 58x + 60 1.00000 1z 16x 18y + 61 1.00000 1z 16x 23y + 62 -1.00000 1z 16x 63y + 63 1.00000 1z 16y 23x + 64 -1.00000 1z 16y 63x + 65 1.00000 1z 49y 63x + 66 1.00000 1z 50y 58x + 67 1.00000 1z 51x 58y + 68 1.00000 1z 51y 58x + 69 1.00000 1z 55x 63y + 70 1.00000 1z 55y 63x + 71 -1.00000 1z 58x 63y + 72 -1.00000 1z 58y 63x + 73 -1.00000 9x 1y 16z + 74 1.00000 9x 1y 17z + 75 1.00000 9x 1y 19z + 76 -1.00000 9x 1y 63z + 77 -1.00000 9x 1z 16y + 78 1.00000 9x 1z 17y + 79 1.00000 9x 1z 19y + 80 -1.00000 9x 1z 58y + 81 -1.00000 9x 3y 11z + 82 1.00000 9x 3y 17z + 83 1.00000 9x 3y 19z + 84 -1.00000 9x 3y 59z + 85 -1.00000 9x 3z 11y + 86 1.00000 9x 3z 17y + 87 1.00000 9x 3z 19y + 88 -1.00000 9x 3z 57y + 89 -1.00000 9x 12y 19z + 90 -1.00000 9x 12z 19y + 91 -1.00000 9x 15y 17z + 92 -1.00000 9x 15z 17y + 93 -1.00000 9x 17y 31z + 94 -1.00000 9x 17z 25y + 95 -1.00000 9x 19y 27z + 96 -1.00000 9x 19z 26y + 97 1.00000 9y 1x 3z + 98 1.00000 9y 1x 19z + 99 -1.00000 9y 1x 58z + 100 -1.00000 9y 1x 63z + 101 1.00000 9y 1z 3x + 102 -1.00000 9y 1z 16x + 103 1.00000 9y 1z 19x + 104 -1.00000 9y 1z 58x + 105 1.00000 9y 3x 17z + 106 -1.00000 9y 3x 57z + 107 -1.00000 9y 3x 59z + 108 -1.00000 9y 3z 11x + 109 1.00000 9y 3z 17x + 110 -1.00000 9y 3z 57x + 111 -1.00000 9y 12x 19z + 112 -1.00000 9y 15x 17z + 113 1.00000 9y 17x 19z + 114 -1.00000 9y 17x 25z + 115 -1.00000 9y 17x 31z + 116 1.00000 9y 17z 19x + 117 -1.00000 9y 17z 25x + 118 -1.00000 9y 19x 26z + 119 -1.00000 9y 19x 27z + 120 -1.00000 9y 19z 26x + 121 1.00000 9z 1x 3y + 122 1.00000 9z 1x 17y + 123 -1.00000 9z 1x 58y + 124 -1.00000 9z 1x 63y + 125 1.00000 9z 1y 3x + 126 -1.00000 9z 1y 16x + 127 1.00000 9z 1y 17x + 128 -1.00000 9z 1y 63x + 129 1.00000 9z 3x 19y + 130 -1.00000 9z 3x 57y + 131 -1.00000 9z 3x 59y + 132 -1.00000 9z 3y 11x + 133 1.00000 9z 3y 19x + 134 -1.00000 9z 3y 59x + 135 -1.00000 9z 12x 19y + 136 -1.00000 9z 15x 17y + 137 1.00000 9z 17x 19y + 138 -1.00000 9z 17x 25y + 139 -1.00000 9z 17x 31y + 140 1.00000 9z 17y 19x + 141 -1.00000 9z 17y 31x + 142 -1.00000 9z 19x 26y + 143 -1.00000 9z 19x 27y + 144 -1.00000 9z 19y 27x + + # FC3_20 72 4.2051648e-04 + 1 -1.00000 1x 9y 16y + 2 1.00000 1x 9y 17x + 3 -1.00000 1x 9z 16z + 4 1.00000 1x 9z 19x + 5 -1.00000 1x 16y 18x + 6 -1.00000 1x 16z 23x + 7 -1.00000 1x 49x 63y + 8 1.00000 1x 50x 58y + 9 -1.00000 1x 51x 58z + 10 1.00000 1x 55x 63z + 11 1.00000 1x 58y 63y + 12 1.00000 1x 58z 63z + 13 1.00000 1y 3y 9x + 14 -1.00000 1y 4y 58x + 15 -1.00000 1y 7y 63x + 16 1.00000 1y 8y 16x + 17 -1.00000 1y 9x 58x + 18 1.00000 1y 9z 19y + 19 -1.00000 1y 9z 58z + 20 1.00000 1y 16x 63x + 21 -1.00000 1y 16z 23y + 22 1.00000 1y 16z 63z + 23 -1.00000 1y 51y 58z + 24 1.00000 1y 55y 63z + 25 1.00000 1z 3z 9x + 26 -1.00000 1z 4z 58x + 27 -1.00000 1z 7z 63x + 28 1.00000 1z 8z 16x + 29 -1.00000 1z 9x 63x + 30 1.00000 1z 9y 17z + 31 -1.00000 1z 9y 63y + 32 1.00000 1z 16x 58x + 33 -1.00000 1z 16y 18z + 34 1.00000 1z 16y 58y + 35 -1.00000 1z 49z 63y + 36 1.00000 1z 50z 58y + 37 1.00000 9x 1y 3y + 38 -1.00000 9x 1y 58x + 39 1.00000 9x 1z 3z + 40 -1.00000 9x 1z 63x + 41 1.00000 9x 3y 57x + 42 1.00000 9x 3z 59x + 43 -1.00000 9x 17y 19y + 44 -1.00000 9x 17y 25x + 45 -1.00000 9x 17z 19z + 46 1.00000 9x 17z 31x + 47 1.00000 9x 19y 26x + 48 -1.00000 9x 19z 27x + 49 -1.00000 9y 1x 16y + 50 1.00000 9y 1x 17x + 51 1.00000 9y 1z 17z + 52 -1.00000 9y 1z 63y + 53 -1.00000 9y 3x 11y + 54 -1.00000 9y 3x 19x + 55 -1.00000 9y 3z 19z + 56 1.00000 9y 3z 59y + 57 1.00000 9y 12y 19x + 58 1.00000 9y 15y 17x + 59 1.00000 9y 17z 31y + 60 -1.00000 9y 19z 27y + 61 -1.00000 9z 1x 16z + 62 1.00000 9z 1x 19x + 63 1.00000 9z 1y 19y + 64 -1.00000 9z 1y 58z + 65 -1.00000 9z 3x 11z + 66 -1.00000 9z 3x 17x + 67 -1.00000 9z 3y 17y + 68 1.00000 9z 3y 57z + 69 1.00000 9z 12z 19x + 70 1.00000 9z 15z 17x + 71 -1.00000 9z 17y 25z + 72 1.00000 9z 19y 26z + + # FC3_21 72 -2.3607815e-03 + 1 -1.00000 1x 9y 16z + 2 1.00000 1x 9y 17z + 3 -1.00000 1x 9z 16y + 4 1.00000 1x 9z 19y + 5 1.00000 1x 16y 18z + 6 1.00000 1x 16z 23y + 7 1.00000 1x 49z 63y + 8 1.00000 1x 50z 58y + 9 1.00000 1x 51y 58z + 10 1.00000 1x 55y 63z + 11 -1.00000 1x 58y 63z + 12 -1.00000 1x 58z 63y + 13 1.00000 1y 3z 9x + 14 1.00000 1y 4z 58x + 15 1.00000 1y 7z 63x + 16 1.00000 1y 8z 16x + 17 -1.00000 1y 9x 58z + 18 1.00000 1y 9z 19x + 19 -1.00000 1y 9z 58x + 20 -1.00000 1y 16x 63z + 21 1.00000 1y 16z 23x + 22 -1.00000 1y 16z 63x + 23 1.00000 1y 51x 58z + 24 1.00000 1y 55x 63z + 25 1.00000 1z 3y 9x + 26 1.00000 1z 4y 58x + 27 1.00000 1z 7y 63x + 28 1.00000 1z 8y 16x + 29 -1.00000 1z 9x 63y + 30 1.00000 1z 9y 17x + 31 -1.00000 1z 9y 63x + 32 -1.00000 1z 16x 58y + 33 1.00000 1z 16y 18x + 34 -1.00000 1z 16y 58x + 35 1.00000 1z 49x 63y + 36 1.00000 1z 50x 58y + 37 1.00000 9x 1y 3z + 38 -1.00000 9x 1y 58z + 39 1.00000 9x 1z 3y + 40 -1.00000 9x 1z 63y + 41 -1.00000 9x 3y 57z + 42 -1.00000 9x 3z 59y + 43 1.00000 9x 17y 19z + 44 -1.00000 9x 17y 25z + 45 1.00000 9x 17z 19y + 46 -1.00000 9x 17z 31y + 47 -1.00000 9x 19y 26z + 48 -1.00000 9x 19z 27y + 49 -1.00000 9y 1x 16z + 50 1.00000 9y 1x 17z + 51 1.00000 9y 1z 17x + 52 -1.00000 9y 1z 63x + 53 -1.00000 9y 3x 11z + 54 1.00000 9y 3x 19z + 55 1.00000 9y 3z 19x + 56 -1.00000 9y 3z 59x + 57 -1.00000 9y 12z 19x + 58 -1.00000 9y 15z 17x + 59 -1.00000 9y 17z 31x + 60 -1.00000 9y 19z 27x + 61 -1.00000 9z 1x 16y + 62 1.00000 9z 1x 19y + 63 1.00000 9z 1y 19x + 64 -1.00000 9z 1y 58x + 65 -1.00000 9z 3x 11y + 66 1.00000 9z 3x 17y + 67 1.00000 9z 3y 17x + 68 -1.00000 9z 3y 57x + 69 -1.00000 9z 12y 19x + 70 -1.00000 9z 15y 17x + 71 -1.00000 9z 17y 25x + 72 -1.00000 9z 19y 26x + + # FC3_22 144 -1.1333637e-04 + 1 1.00000 1x 9x 17z + 2 1.00000 1x 9x 19y + 3 -1.00000 1x 9x 58z + 4 -1.00000 1x 9x 63y + 5 -1.00000 1x 9y 19y + 6 1.00000 1x 9y 63x + 7 -1.00000 1x 9z 17z + 8 1.00000 1x 9z 58x + 9 -1.00000 1x 16x 18z + 10 -1.00000 1x 16x 23y + 11 1.00000 1x 16x 58y + 12 1.00000 1x 16x 63z + 13 -1.00000 1x 16y 23y + 14 -1.00000 1x 16y 58x + 15 -1.00000 1x 16z 18z + 16 -1.00000 1x 16z 63x + 17 1.00000 1x 49z 63x + 18 1.00000 1x 49z 63z + 19 -1.00000 1x 50z 58x + 20 1.00000 1x 50z 58z + 21 1.00000 1x 51y 58x + 22 1.00000 1x 51y 58y + 23 -1.00000 1x 55y 63x + 24 1.00000 1x 55y 63y + 25 1.00000 1y 3z 9y + 26 -1.00000 1y 3z 9z + 27 -1.00000 1y 4z 58y + 28 -1.00000 1y 4z 58z + 29 1.00000 1y 7z 63y + 30 1.00000 1y 7z 63z + 31 -1.00000 1y 8z 16y + 32 1.00000 1y 8z 16z + 33 -1.00000 1y 9x 19x + 34 1.00000 1y 9x 63y + 35 -1.00000 1y 9y 16z + 36 1.00000 1y 9y 19x + 37 -1.00000 1y 9y 63x + 38 1.00000 1y 9z 16y + 39 1.00000 1y 16x 23x + 40 1.00000 1y 16x 58y + 41 1.00000 1y 16y 23x + 42 -1.00000 1y 16y 58x + 43 -1.00000 1y 51x 58x + 44 -1.00000 1y 51x 58y + 45 1.00000 1y 55x 63x + 46 -1.00000 1y 55x 63y + 47 1.00000 1y 58y 63z + 48 -1.00000 1y 58z 63y + 49 -1.00000 1z 3y 9y + 50 1.00000 1z 3y 9z + 51 1.00000 1z 4y 58y + 52 1.00000 1z 4y 58z + 53 -1.00000 1z 7y 63y + 54 -1.00000 1z 7y 63z + 55 1.00000 1z 8y 16y + 56 -1.00000 1z 8y 16z + 57 -1.00000 1z 9x 17x + 58 1.00000 1z 9x 58z + 59 1.00000 1z 9y 16z + 60 -1.00000 1z 9z 16y + 61 1.00000 1z 9z 17x + 62 -1.00000 1z 9z 58x + 63 1.00000 1z 16x 18x + 64 1.00000 1z 16x 63z + 65 1.00000 1z 16z 18x + 66 -1.00000 1z 16z 63x + 67 -1.00000 1z 49x 63x + 68 -1.00000 1z 49x 63z + 69 1.00000 1z 50x 58x + 70 -1.00000 1z 50x 58z + 71 1.00000 1z 58y 63z + 72 -1.00000 1z 58z 63y + 73 1.00000 9x 1x 17z + 74 1.00000 9x 1x 19y + 75 -1.00000 9x 1x 58z + 76 -1.00000 9x 1x 63y + 77 -1.00000 9x 1y 19x + 78 1.00000 9x 1y 63y + 79 -1.00000 9x 1z 17x + 80 1.00000 9x 1z 58z + 81 -1.00000 9x 3x 17y + 82 -1.00000 9x 3x 19z + 83 1.00000 9x 3x 57z + 84 1.00000 9x 3x 59y + 85 1.00000 9x 3y 17x + 86 1.00000 9x 3y 59y + 87 1.00000 9x 3z 19x + 88 1.00000 9x 3z 57z + 89 1.00000 9x 17x 25z + 90 -1.00000 9x 17x 31y + 91 -1.00000 9x 17y 31y + 92 -1.00000 9x 17z 25z + 93 -1.00000 9x 19x 26z + 94 1.00000 9x 19x 27y + 95 -1.00000 9x 19y 27y + 96 -1.00000 9x 19z 26z + 97 -1.00000 9y 1x 19y + 98 1.00000 9y 1x 63x + 99 1.00000 9y 1y 3z + 100 -1.00000 9y 1y 16z + 101 1.00000 9y 1y 19x + 102 -1.00000 9y 1y 63x + 103 -1.00000 9y 1z 3y + 104 1.00000 9y 1z 16z + 105 -1.00000 9y 3x 17y + 106 -1.00000 9y 3x 59x + 107 1.00000 9y 3y 11z + 108 1.00000 9y 3y 17x + 109 -1.00000 9y 3y 59x + 110 -1.00000 9y 3z 11z + 111 -1.00000 9y 12z 19y + 112 -1.00000 9y 12z 19z + 113 1.00000 9y 15z 17y + 114 1.00000 9y 15z 17z + 115 1.00000 9y 17x 31x + 116 -1.00000 9y 17y 19z + 117 1.00000 9y 17y 31x + 118 1.00000 9y 17z 19y + 119 -1.00000 9y 19x 27x + 120 1.00000 9y 19y 27x + 121 -1.00000 9z 1x 17z + 122 1.00000 9z 1x 58x + 123 -1.00000 9z 1y 3z + 124 1.00000 9z 1y 16y + 125 1.00000 9z 1z 3y + 126 -1.00000 9z 1z 16y + 127 1.00000 9z 1z 17x + 128 -1.00000 9z 1z 58x + 129 -1.00000 9z 3x 19z + 130 -1.00000 9z 3x 57x + 131 -1.00000 9z 3y 11y + 132 1.00000 9z 3z 11y + 133 1.00000 9z 3z 19x + 134 -1.00000 9z 3z 57x + 135 1.00000 9z 12y 19y + 136 1.00000 9z 12y 19z + 137 -1.00000 9z 15y 17y + 138 -1.00000 9z 15y 17z + 139 -1.00000 9z 17x 25x + 140 -1.00000 9z 17y 19z + 141 1.00000 9z 17z 19y + 142 1.00000 9z 17z 25x + 143 1.00000 9z 19x 26x + 144 1.00000 9z 19z 26x + + # FC3_23 72 -4.8937455e-04 + 1 1.00000 1x 3x 17x + 2 1.00000 1x 3x 19x + 3 -1.00000 1x 4x 50x + 4 -1.00000 1x 4x 51x + 5 -1.00000 1x 7x 49x + 6 -1.00000 1x 7x 55x + 7 1.00000 1x 8x 18x + 8 1.00000 1x 8x 23x + 9 -1.00000 1x 17x 19x + 10 -1.00000 1x 18x 23x + 11 1.00000 1x 49x 55x + 12 1.00000 1x 50x 51x + 13 1.00000 1y 3y 17y + 14 -1.00000 1y 3y 19y + 15 1.00000 1y 4y 50y + 16 -1.00000 1y 4y 51y + 17 -1.00000 1y 7y 49y + 18 1.00000 1y 7y 55y + 19 -1.00000 1y 8y 18y + 20 1.00000 1y 8y 23y + 21 1.00000 1y 17y 19y + 22 -1.00000 1y 18y 23y + 23 -1.00000 1y 49y 55y + 24 1.00000 1y 50y 51y + 25 -1.00000 1z 3z 17z + 26 1.00000 1z 3z 19z + 27 1.00000 1z 4z 50z + 28 -1.00000 1z 4z 51z + 29 -1.00000 1z 7z 49z + 30 1.00000 1z 7z 55z + 31 1.00000 1z 8z 18z + 32 -1.00000 1z 8z 23z + 33 1.00000 1z 17z 19z + 34 -1.00000 1z 18z 23z + 35 1.00000 1z 49z 55z + 36 -1.00000 1z 50z 51z + 37 -1.00000 9x 11x 57x + 38 -1.00000 9x 11x 59x + 39 1.00000 9x 12x 26x + 40 1.00000 9x 12x 27x + 41 1.00000 9x 15x 25x + 42 1.00000 9x 15x 31x + 43 -1.00000 9x 16x 58x + 44 -1.00000 9x 16x 63x + 45 -1.00000 9x 25x 31x + 46 -1.00000 9x 26x 27x + 47 1.00000 9x 57x 59x + 48 1.00000 9x 58x 63x + 49 1.00000 9y 11y 57y + 50 -1.00000 9y 11y 59y + 51 1.00000 9y 12y 26y + 52 -1.00000 9y 12y 27y + 53 -1.00000 9y 15y 25y + 54 1.00000 9y 15y 31y + 55 -1.00000 9y 16y 58y + 56 1.00000 9y 16y 63y + 57 -1.00000 9y 25y 31y + 58 1.00000 9y 26y 27y + 59 1.00000 9y 57y 59y + 60 -1.00000 9y 58y 63y + 61 -1.00000 9z 11z 57z + 62 1.00000 9z 11z 59z + 63 1.00000 9z 12z 26z + 64 -1.00000 9z 12z 27z + 65 -1.00000 9z 15z 25z + 66 1.00000 9z 15z 31z + 67 1.00000 9z 16z 58z + 68 -1.00000 9z 16z 63z + 69 1.00000 9z 25z 31z + 70 -1.00000 9z 26z 27z + 71 1.00000 9z 57z 59z + 72 -1.00000 9z 58z 63z + + # FC3_24 144 4.2476702e-04 + 1 1.00000 1x 3x 17y + 2 -1.00000 1x 3x 17z + 3 -1.00000 1x 3x 19y + 4 1.00000 1x 3x 19z + 5 1.00000 1x 3y 19y + 6 1.00000 1x 3z 17z + 7 1.00000 1x 4x 50y + 8 1.00000 1x 4x 50z + 9 -1.00000 1x 4x 51y + 10 -1.00000 1x 4x 51z + 11 -1.00000 1x 4y 51y + 12 -1.00000 1x 4z 50z + 13 -1.00000 1x 7x 49y + 14 -1.00000 1x 7x 49z + 15 1.00000 1x 7x 55y + 16 1.00000 1x 7x 55z + 17 -1.00000 1x 7y 55y + 18 -1.00000 1x 7z 49z + 19 -1.00000 1x 8x 18y + 20 1.00000 1x 8x 18z + 21 1.00000 1x 8x 23y + 22 -1.00000 1x 8x 23z + 23 1.00000 1x 8y 23y + 24 1.00000 1x 8z 18z + 25 1.00000 1y 3x 17y + 26 -1.00000 1y 3z 17y + 27 1.00000 1y 3z 17z + 28 -1.00000 1y 4x 50y + 29 1.00000 1y 4z 50y + 30 1.00000 1y 4z 50z + 31 -1.00000 1y 7x 49y + 32 -1.00000 1y 7z 49y + 33 -1.00000 1y 7z 49z + 34 1.00000 1y 8x 18y + 35 1.00000 1y 8z 18y + 36 -1.00000 1y 8z 18z + 37 1.00000 1y 17x 19x + 38 -1.00000 1y 17y 19x + 39 1.00000 1y 17y 19z + 40 -1.00000 1y 18x 23x + 41 -1.00000 1y 18y 23x + 42 -1.00000 1y 18y 23z + 43 -1.00000 1y 49x 55x + 44 1.00000 1y 49y 55x + 45 1.00000 1y 49y 55z + 46 1.00000 1y 50x 51x + 47 1.00000 1y 50y 51x + 48 -1.00000 1y 50y 51z + 49 1.00000 1z 3x 19z + 50 1.00000 1z 3y 19y + 51 -1.00000 1z 3y 19z + 52 -1.00000 1z 4x 51z + 53 -1.00000 1z 4y 51y + 54 -1.00000 1z 4y 51z + 55 -1.00000 1z 7x 55z + 56 1.00000 1z 7y 55y + 57 1.00000 1z 7y 55z + 58 1.00000 1z 8x 23z + 59 -1.00000 1z 8y 23y + 60 1.00000 1z 8y 23z + 61 1.00000 1z 17x 19x + 62 -1.00000 1z 17x 19z + 63 1.00000 1z 17y 19z + 64 -1.00000 1z 18x 23x + 65 -1.00000 1z 18x 23z + 66 -1.00000 1z 18y 23z + 67 1.00000 1z 49x 55x + 68 1.00000 1z 49x 55z + 69 -1.00000 1z 49y 55z + 70 -1.00000 1z 50x 51x + 71 1.00000 1z 50x 51z + 72 1.00000 1z 50y 51z + 73 1.00000 9x 11x 57y + 74 -1.00000 9x 11x 57z + 75 -1.00000 9x 11x 59y + 76 1.00000 9x 11x 59z + 77 -1.00000 9x 11y 59y + 78 -1.00000 9x 11z 57z + 79 1.00000 9x 12x 26y + 80 1.00000 9x 12x 26z + 81 -1.00000 9x 12x 27y + 82 -1.00000 9x 12x 27z + 83 1.00000 9x 12y 27y + 84 1.00000 9x 12z 26z + 85 -1.00000 9x 15x 25y + 86 -1.00000 9x 15x 25z + 87 1.00000 9x 15x 31y + 88 1.00000 9x 15x 31z + 89 1.00000 9x 15y 31y + 90 1.00000 9x 15z 25z + 91 -1.00000 9x 16x 58y + 92 1.00000 9x 16x 58z + 93 1.00000 9x 16x 63y + 94 -1.00000 9x 16x 63z + 95 -1.00000 9x 16y 63y + 96 -1.00000 9x 16z 58z + 97 -1.00000 9y 11x 57y + 98 -1.00000 9y 11z 57y + 99 1.00000 9y 11z 57z + 100 1.00000 9y 12x 26y + 101 1.00000 9y 12z 26y + 102 1.00000 9y 12z 26z + 103 1.00000 9y 15x 25y + 104 -1.00000 9y 15z 25y + 105 -1.00000 9y 15z 25z + 106 -1.00000 9y 16x 58y + 107 1.00000 9y 16z 58y + 108 -1.00000 9y 16z 58z + 109 -1.00000 9y 25x 31x + 110 -1.00000 9y 25y 31x + 111 1.00000 9y 25y 31z + 112 1.00000 9y 26x 27x + 113 -1.00000 9y 26y 27x + 114 -1.00000 9y 26y 27z + 115 1.00000 9y 57x 59x + 116 1.00000 9y 57y 59x + 117 1.00000 9y 57y 59z + 118 -1.00000 9y 58x 63x + 119 1.00000 9y 58y 63x + 120 -1.00000 9y 58y 63z + 121 -1.00000 9z 11x 59z + 122 1.00000 9z 11y 59y + 123 -1.00000 9z 11y 59z + 124 1.00000 9z 12x 27z + 125 -1.00000 9z 12y 27y + 126 -1.00000 9z 12y 27z + 127 1.00000 9z 15x 31z + 128 1.00000 9z 15y 31y + 129 1.00000 9z 15y 31z + 130 -1.00000 9z 16x 63z + 131 -1.00000 9z 16y 63y + 132 1.00000 9z 16y 63z + 133 1.00000 9z 25x 31x + 134 -1.00000 9z 25x 31z + 135 -1.00000 9z 25y 31z + 136 -1.00000 9z 26x 27x + 137 -1.00000 9z 26x 27z + 138 1.00000 9z 26y 27z + 139 1.00000 9z 57x 59x + 140 1.00000 9z 57x 59z + 141 1.00000 9z 57y 59z + 142 -1.00000 9z 58x 63x + 143 1.00000 9z 58x 63z + 144 -1.00000 9z 58y 63z + + # FC3_25 144 2.2777762e-04 + 1 1.00000 1x 3y 17x + 2 1.00000 1x 3z 19x + 3 1.00000 1x 4y 50x + 4 -1.00000 1x 4z 51x + 5 -1.00000 1x 7y 49x + 6 1.00000 1x 7z 55x + 7 -1.00000 1x 8y 18x + 8 -1.00000 1x 8z 23x + 9 1.00000 1x 17x 19y + 10 -1.00000 1x 17y 19y + 11 1.00000 1x 17z 19x + 12 -1.00000 1x 17z 19z + 13 -1.00000 1x 18x 23y + 14 -1.00000 1x 18y 23y + 15 -1.00000 1x 18z 23x + 16 -1.00000 1x 18z 23z + 17 -1.00000 1x 49x 55y + 18 1.00000 1x 49y 55y + 19 1.00000 1x 49z 55x + 20 1.00000 1x 49z 55z + 21 1.00000 1x 50x 51y + 22 1.00000 1x 50y 51y + 23 -1.00000 1x 50z 51x + 24 1.00000 1x 50z 51z + 25 -1.00000 1y 3x 19x + 26 1.00000 1y 3y 17x + 27 1.00000 1y 3y 19x + 28 1.00000 1y 3z 19y + 29 -1.00000 1y 3z 19z + 30 -1.00000 1y 4x 51x + 31 -1.00000 1y 4y 50x + 32 -1.00000 1y 4y 51x + 33 -1.00000 1y 4z 51y + 34 -1.00000 1y 4z 51z + 35 1.00000 1y 7x 55x + 36 -1.00000 1y 7y 49x + 37 -1.00000 1y 7y 55x + 38 1.00000 1y 7z 55y + 39 1.00000 1y 7z 55z + 40 1.00000 1y 8x 23x + 41 1.00000 1y 8y 18x + 42 1.00000 1y 8y 23x + 43 -1.00000 1y 8z 23y + 44 1.00000 1y 8z 23z + 45 1.00000 1y 17z 19y + 46 -1.00000 1y 18z 23y + 47 1.00000 1y 49z 55y + 48 -1.00000 1y 50z 51y + 49 -1.00000 1z 3x 17x + 50 -1.00000 1z 3y 17y + 51 1.00000 1z 3y 17z + 52 1.00000 1z 3z 17x + 53 1.00000 1z 3z 19x + 54 1.00000 1z 4x 50x + 55 1.00000 1z 4y 50y + 56 1.00000 1z 4y 50z + 57 -1.00000 1z 4z 50x + 58 -1.00000 1z 4z 51x + 59 -1.00000 1z 7x 49x + 60 -1.00000 1z 7y 49y + 61 -1.00000 1z 7y 49z + 62 -1.00000 1z 7z 49x + 63 -1.00000 1z 7z 55x + 64 1.00000 1z 8x 18x + 65 1.00000 1z 8y 18y + 66 -1.00000 1z 8y 18z + 67 1.00000 1z 8z 18x + 68 1.00000 1z 8z 23x + 69 1.00000 1z 17z 19y + 70 -1.00000 1z 18z 23y + 71 -1.00000 1z 49z 55y + 72 1.00000 1z 50z 51y + 73 1.00000 9x 11y 57x + 74 1.00000 9x 11z 59x + 75 1.00000 9x 12y 26x + 76 -1.00000 9x 12z 27x + 77 -1.00000 9x 15y 25x + 78 1.00000 9x 15z 31x + 79 -1.00000 9x 16y 58x + 80 -1.00000 9x 16z 63x + 81 -1.00000 9x 25x 31y + 82 -1.00000 9x 25y 31y + 83 1.00000 9x 25z 31x + 84 -1.00000 9x 25z 31z + 85 1.00000 9x 26x 27y + 86 -1.00000 9x 26y 27y + 87 -1.00000 9x 26z 27x + 88 -1.00000 9x 26z 27z + 89 1.00000 9x 57x 59y + 90 1.00000 9x 57y 59y + 91 1.00000 9x 57z 59x + 92 1.00000 9x 57z 59z + 93 -1.00000 9x 58x 63y + 94 1.00000 9x 58y 63y + 95 -1.00000 9x 58z 63x + 96 1.00000 9x 58z 63z + 97 -1.00000 9y 11x 59x + 98 -1.00000 9y 11y 57x + 99 -1.00000 9y 11y 59x + 100 1.00000 9y 11z 59y + 101 -1.00000 9y 11z 59z + 102 -1.00000 9y 12x 27x + 103 1.00000 9y 12y 26x + 104 1.00000 9y 12y 27x + 105 -1.00000 9y 12z 27y + 106 -1.00000 9y 12z 27z + 107 1.00000 9y 15x 31x + 108 1.00000 9y 15y 25x + 109 1.00000 9y 15y 31x + 110 1.00000 9y 15z 31y + 111 1.00000 9y 15z 31z + 112 1.00000 9y 16x 63x + 113 -1.00000 9y 16y 58x + 114 -1.00000 9y 16y 63x + 115 -1.00000 9y 16z 63y + 116 1.00000 9y 16z 63z + 117 1.00000 9y 25z 31y + 118 -1.00000 9y 26z 27y + 119 1.00000 9y 57z 59y + 120 -1.00000 9y 58z 63y + 121 -1.00000 9z 11x 57x + 122 -1.00000 9z 11y 57y + 123 1.00000 9z 11y 57z + 124 -1.00000 9z 11z 57x + 125 -1.00000 9z 11z 59x + 126 1.00000 9z 12x 26x + 127 1.00000 9z 12y 26y + 128 1.00000 9z 12y 26z + 129 1.00000 9z 12z 26x + 130 1.00000 9z 12z 27x + 131 -1.00000 9z 15x 25x + 132 -1.00000 9z 15y 25y + 133 -1.00000 9z 15y 25z + 134 1.00000 9z 15z 25x + 135 1.00000 9z 15z 31x + 136 1.00000 9z 16x 58x + 137 1.00000 9z 16y 58y + 138 -1.00000 9z 16y 58z + 139 -1.00000 9z 16z 58x + 140 -1.00000 9z 16z 63x + 141 -1.00000 9z 25z 31y + 142 1.00000 9z 26z 27y + 143 1.00000 9z 57z 59y + 144 -1.00000 9z 58z 63y + + # FC3_26 144 4.7447834e-04 + 1 1.00000 1x 3y 17y + 2 -1.00000 1x 3y 19x + 3 -1.00000 1x 3z 17x + 4 1.00000 1x 3z 19z + 5 -1.00000 1x 4y 50y + 6 -1.00000 1x 4y 51x + 7 1.00000 1x 4z 50x + 8 -1.00000 1x 4z 51z + 9 -1.00000 1x 7y 49y + 10 1.00000 1x 7y 55x + 11 -1.00000 1x 7z 49x + 12 -1.00000 1x 7z 55z + 13 1.00000 1x 8y 18y + 14 1.00000 1x 8y 23x + 15 1.00000 1x 8z 18x + 16 1.00000 1x 8z 23z + 17 1.00000 1x 17x 19z + 18 1.00000 1x 17y 19x + 19 -1.00000 1x 18x 23z + 20 -1.00000 1x 18y 23x + 21 1.00000 1x 49x 55z + 22 -1.00000 1x 49y 55x + 23 -1.00000 1x 50x 51z + 24 1.00000 1x 50y 51x + 25 1.00000 1y 3x 17x + 26 1.00000 1y 3x 19y + 27 -1.00000 1y 3y 17z + 28 1.00000 1y 3y 19z + 29 1.00000 1y 4x 50x + 30 -1.00000 1y 4x 51y + 31 1.00000 1y 4y 50z + 32 -1.00000 1y 4y 51z + 33 -1.00000 1y 7x 49x + 34 -1.00000 1y 7x 55y + 35 -1.00000 1y 7y 49z + 36 1.00000 1y 7y 55z + 37 -1.00000 1y 8x 18x + 38 1.00000 1y 8x 23y + 39 1.00000 1y 8y 18z + 40 -1.00000 1y 8y 23z + 41 -1.00000 1y 17x 19y + 42 1.00000 1y 17z 19z + 43 -1.00000 1y 18x 23y + 44 -1.00000 1y 18z 23z + 45 1.00000 1y 49x 55y + 46 -1.00000 1y 49z 55z + 47 1.00000 1y 50x 51y + 48 1.00000 1y 50z 51z + 49 1.00000 1z 3x 17z + 50 1.00000 1z 3x 19x + 51 1.00000 1z 3z 17y + 52 -1.00000 1z 3z 19y + 53 -1.00000 1z 4x 50z + 54 -1.00000 1z 4x 51x + 55 1.00000 1z 4z 50y + 56 -1.00000 1z 4z 51y + 57 -1.00000 1z 7x 49z + 58 1.00000 1z 7x 55x + 59 -1.00000 1z 7z 49y + 60 1.00000 1z 7z 55y + 61 1.00000 1z 8x 18z + 62 -1.00000 1z 8x 23x + 63 -1.00000 1z 8z 18y + 64 1.00000 1z 8z 23y + 65 1.00000 1z 17y 19y + 66 -1.00000 1z 17z 19x + 67 -1.00000 1z 18y 23y + 68 -1.00000 1z 18z 23x + 69 1.00000 1z 49y 55y + 70 1.00000 1z 49z 55x + 71 -1.00000 1z 50y 51y + 72 1.00000 1z 50z 51x + 73 -1.00000 9x 11y 57y + 74 -1.00000 9x 11y 59x + 75 -1.00000 9x 11z 57x + 76 -1.00000 9x 11z 59z + 77 1.00000 9x 12y 26y + 78 -1.00000 9x 12y 27x + 79 1.00000 9x 12z 26x + 80 1.00000 9x 12z 27z + 81 1.00000 9x 15y 25y + 82 1.00000 9x 15y 31x + 83 -1.00000 9x 15z 25x + 84 1.00000 9x 15z 31z + 85 -1.00000 9x 16y 58y + 86 1.00000 9x 16y 63x + 87 1.00000 9x 16z 58x + 88 -1.00000 9x 16z 63z + 89 1.00000 9x 25x 31z + 90 -1.00000 9x 25y 31x + 91 -1.00000 9x 26x 27z + 92 1.00000 9x 26y 27x + 93 1.00000 9x 57x 59z + 94 1.00000 9x 57y 59x + 95 -1.00000 9x 58x 63z + 96 -1.00000 9x 58y 63x + 97 1.00000 9y 11x 57x + 98 -1.00000 9y 11x 59y + 99 -1.00000 9y 11y 57z + 100 1.00000 9y 11y 59z + 101 1.00000 9y 12x 26x + 102 1.00000 9y 12x 27y + 103 1.00000 9y 12y 26z + 104 -1.00000 9y 12y 27z + 105 -1.00000 9y 15x 25x + 106 1.00000 9y 15x 31y + 107 -1.00000 9y 15y 25z + 108 1.00000 9y 15y 31z + 109 -1.00000 9y 16x 58x + 110 -1.00000 9y 16x 63y + 111 1.00000 9y 16y 58z + 112 -1.00000 9y 16y 63z + 113 -1.00000 9y 25x 31y + 114 -1.00000 9y 25z 31z + 115 -1.00000 9y 26x 27y + 116 1.00000 9y 26z 27z + 117 1.00000 9y 57x 59y + 118 1.00000 9y 57z 59z + 119 1.00000 9y 58x 63y + 120 -1.00000 9y 58z 63z + 121 -1.00000 9z 11x 57z + 122 1.00000 9z 11x 59x + 123 1.00000 9z 11z 57y + 124 -1.00000 9z 11z 59y + 125 1.00000 9z 12x 26z + 126 -1.00000 9z 12x 27x + 127 1.00000 9z 12z 26y + 128 -1.00000 9z 12z 27y + 129 1.00000 9z 15x 25z + 130 1.00000 9z 15x 31x + 131 -1.00000 9z 15z 25y + 132 1.00000 9z 15z 31y + 133 -1.00000 9z 16x 58z + 134 -1.00000 9z 16x 63x + 135 -1.00000 9z 16z 58y + 136 1.00000 9z 16z 63y + 137 1.00000 9z 25y 31y + 138 -1.00000 9z 25z 31x + 139 -1.00000 9z 26y 27y + 140 -1.00000 9z 26z 27x + 141 1.00000 9z 57y 59y + 142 1.00000 9z 57z 59x + 143 -1.00000 9z 58y 63y + 144 1.00000 9z 58z 63x + + # FC3_27 72 7.1387157e-04 + 1 1.00000 1x 3y 17z + 2 1.00000 1x 3z 19y + 3 1.00000 1x 4y 50z + 4 1.00000 1x 4z 51y + 5 1.00000 1x 7y 49z + 6 1.00000 1x 7z 55y + 7 1.00000 1x 8y 18z + 8 1.00000 1x 8z 23y + 9 1.00000 1x 17y 19z + 10 1.00000 1x 18y 23z + 11 1.00000 1x 49y 55z + 12 1.00000 1x 50y 51z + 13 1.00000 1y 3x 19z + 14 1.00000 1y 3z 17x + 15 1.00000 1y 4x 51z + 16 1.00000 1y 4z 50x + 17 1.00000 1y 7x 55z + 18 1.00000 1y 7z 49x + 19 1.00000 1y 8x 23z + 20 1.00000 1y 8z 18x + 21 1.00000 1y 17z 19x + 22 1.00000 1y 18z 23x + 23 1.00000 1y 49z 55x + 24 1.00000 1y 50z 51x + 25 1.00000 1z 3x 17y + 26 1.00000 1z 3y 19x + 27 1.00000 1z 4x 50y + 28 1.00000 1z 4y 51x + 29 1.00000 1z 7x 49y + 30 1.00000 1z 7y 55x + 31 1.00000 1z 8x 18y + 32 1.00000 1z 8y 23x + 33 1.00000 1z 17x 19y + 34 1.00000 1z 18x 23y + 35 1.00000 1z 49x 55y + 36 1.00000 1z 50x 51y + 37 -1.00000 9x 11y 57z + 38 -1.00000 9x 11z 59y + 39 -1.00000 9x 12y 26z + 40 -1.00000 9x 12z 27y + 41 -1.00000 9x 15y 25z + 42 -1.00000 9x 15z 31y + 43 -1.00000 9x 16y 58z + 44 -1.00000 9x 16z 63y + 45 -1.00000 9x 25y 31z + 46 -1.00000 9x 26y 27z + 47 -1.00000 9x 57y 59z + 48 -1.00000 9x 58y 63z + 49 -1.00000 9y 11x 59z + 50 -1.00000 9y 11z 57x + 51 -1.00000 9y 12x 27z + 52 -1.00000 9y 12z 26x + 53 -1.00000 9y 15x 31z + 54 -1.00000 9y 15z 25x + 55 -1.00000 9y 16x 63z + 56 -1.00000 9y 16z 58x + 57 -1.00000 9y 25z 31x + 58 -1.00000 9y 26z 27x + 59 -1.00000 9y 57z 59x + 60 -1.00000 9y 58z 63x + 61 -1.00000 9z 11x 57y + 62 -1.00000 9z 11y 59x + 63 -1.00000 9z 12x 26y + 64 -1.00000 9z 12y 27x + 65 -1.00000 9z 15x 25y + 66 -1.00000 9z 15y 31x + 67 -1.00000 9z 16x 58y + 68 -1.00000 9z 16y 63x + 69 -1.00000 9z 25x 31y + 70 -1.00000 9z 26x 27y + 71 -1.00000 9z 57x 59y + 72 -1.00000 9z 58x 63y + + # FC3_28 48 -7.4881888e-05 + 1 1.00000 1x 3y 19z + 2 1.00000 1x 3z 17y + 3 1.00000 1x 4y 51z + 4 1.00000 1x 4z 50y + 5 1.00000 1x 7y 55z + 6 1.00000 1x 7z 49y + 7 1.00000 1x 8y 23z + 8 1.00000 1x 8z 18y + 9 1.00000 1y 3x 17z + 10 1.00000 1y 4x 50z + 11 1.00000 1y 7x 49z + 12 1.00000 1y 8x 18z + 13 1.00000 1y 17x 19z + 14 1.00000 1y 18x 23z + 15 1.00000 1y 49x 55z + 16 1.00000 1y 50x 51z + 17 1.00000 1z 3x 19y + 18 1.00000 1z 4x 51y + 19 1.00000 1z 7x 55y + 20 1.00000 1z 8x 23y + 21 1.00000 1z 17y 19x + 22 1.00000 1z 18y 23x + 23 1.00000 1z 49y 55x + 24 1.00000 1z 50y 51x + 25 -1.00000 9x 11y 59z + 26 -1.00000 9x 11z 57y + 27 -1.00000 9x 12y 27z + 28 -1.00000 9x 12z 26y + 29 -1.00000 9x 15y 31z + 30 -1.00000 9x 15z 25y + 31 -1.00000 9x 16y 63z + 32 -1.00000 9x 16z 58y + 33 -1.00000 9y 11x 57z + 34 -1.00000 9y 12x 26z + 35 -1.00000 9y 15x 25z + 36 -1.00000 9y 16x 58z + 37 -1.00000 9y 25x 31z + 38 -1.00000 9y 26x 27z + 39 -1.00000 9y 57x 59z + 40 -1.00000 9y 58x 63z + 41 -1.00000 9z 11x 59y + 42 -1.00000 9z 12x 27y + 43 -1.00000 9z 15x 31y + 44 -1.00000 9z 16x 63y + 45 -1.00000 9z 25y 31x + 46 -1.00000 9z 26y 27x + 47 -1.00000 9z 57y 59x + 48 -1.00000 9z 58y 63x + + # FC3_29 24 -2.0946097e-04 + 1 1.00000 1x 17z 19y + 2 1.00000 1x 18z 23y + 3 1.00000 1x 49z 55y + 4 1.00000 1x 50z 51y + 5 1.00000 1y 3z 19x + 6 1.00000 1y 4z 51x + 7 1.00000 1y 7z 55x + 8 1.00000 1y 8z 23x + 9 1.00000 1z 3y 17x + 10 1.00000 1z 4y 50x + 11 1.00000 1z 7y 49x + 12 1.00000 1z 8y 18x + 13 -1.00000 9x 25z 31y + 14 -1.00000 9x 26z 27y + 15 -1.00000 9x 57z 59y + 16 -1.00000 9x 58z 63y + 17 -1.00000 9y 11z 59x + 18 -1.00000 9y 12z 27x + 19 -1.00000 9y 15z 31x + 20 -1.00000 9y 16z 63x + 21 -1.00000 9z 11y 57x + 22 -1.00000 9z 12y 26x + 23 -1.00000 9z 15y 25x + 24 -1.00000 9z 16y 58x + + # FC3_30 72 -1.1173643e-04 + 1 1.00000 1x 3x 49x + 2 1.00000 1x 3x 51x + 3 -1.00000 1x 4x 18x + 4 -1.00000 1x 4x 19x + 5 -1.00000 1x 7x 17x + 6 -1.00000 1x 7x 23x + 7 1.00000 1x 8x 50x + 8 1.00000 1x 8x 55x + 9 1.00000 1x 17x 23x + 10 1.00000 1x 18x 19x + 11 -1.00000 1x 49x 51x + 12 -1.00000 1x 50x 55x + 13 -1.00000 1y 3y 49y + 14 1.00000 1y 3y 51y + 15 -1.00000 1y 4y 18y + 16 1.00000 1y 4y 19y + 17 1.00000 1y 7y 17y + 18 -1.00000 1y 7y 23y + 19 1.00000 1y 8y 50y + 20 -1.00000 1y 8y 55y + 21 1.00000 1y 17y 23y + 22 -1.00000 1y 18y 19y + 23 -1.00000 1y 49y 51y + 24 1.00000 1y 50y 55y + 25 1.00000 1z 3z 49z + 26 -1.00000 1z 3z 51z + 27 -1.00000 1z 4z 18z + 28 1.00000 1z 4z 19z + 29 1.00000 1z 7z 17z + 30 -1.00000 1z 7z 23z + 31 -1.00000 1z 8z 50z + 32 1.00000 1z 8z 55z + 33 -1.00000 1z 17z 23z + 34 1.00000 1z 18z 19z + 35 -1.00000 1z 49z 51z + 36 1.00000 1z 50z 55z + 37 -1.00000 9x 11x 25x + 38 -1.00000 9x 11x 27x + 39 1.00000 9x 12x 58x + 40 1.00000 9x 12x 59x + 41 1.00000 9x 15x 57x + 42 1.00000 9x 15x 63x + 43 -1.00000 9x 16x 26x + 44 -1.00000 9x 16x 31x + 45 1.00000 9x 25x 27x + 46 1.00000 9x 26x 31x + 47 -1.00000 9x 57x 63x + 48 -1.00000 9x 58x 59x + 49 -1.00000 9y 11y 25y + 50 1.00000 9y 11y 27y + 51 -1.00000 9y 12y 58y + 52 1.00000 9y 12y 59y + 53 1.00000 9y 15y 57y + 54 -1.00000 9y 15y 63y + 55 1.00000 9y 16y 26y + 56 -1.00000 9y 16y 31y + 57 -1.00000 9y 25y 27y + 58 1.00000 9y 26y 31y + 59 1.00000 9y 57y 63y + 60 -1.00000 9y 58y 59y + 61 1.00000 9z 11z 25z + 62 -1.00000 9z 11z 27z + 63 -1.00000 9z 12z 58z + 64 1.00000 9z 12z 59z + 65 1.00000 9z 15z 57z + 66 -1.00000 9z 15z 63z + 67 -1.00000 9z 16z 26z + 68 1.00000 9z 16z 31z + 69 -1.00000 9z 25z 27z + 70 1.00000 9z 26z 31z + 71 -1.00000 9z 57z 63z + 72 1.00000 9z 58z 59z + + # FC3_31 144 1.0971679e-06 + 1 1.00000 1x 3x 49y + 2 -1.00000 1x 3x 49z + 3 -1.00000 1x 3x 51y + 4 1.00000 1x 3x 51z + 5 -1.00000 1x 3y 51y + 6 -1.00000 1x 3z 49z + 7 1.00000 1x 4x 18y + 8 1.00000 1x 4x 18z + 9 -1.00000 1x 4x 19y + 10 -1.00000 1x 4x 19z + 11 1.00000 1x 4y 19y + 12 1.00000 1x 4z 18z + 13 -1.00000 1x 7x 17y + 14 -1.00000 1x 7x 17z + 15 1.00000 1x 7x 23y + 16 1.00000 1x 7x 23z + 17 1.00000 1x 7y 23y + 18 1.00000 1x 7z 17z + 19 -1.00000 1x 8x 50y + 20 1.00000 1x 8x 50z + 21 1.00000 1x 8x 55y + 22 -1.00000 1x 8x 55z + 23 -1.00000 1x 8y 55y + 24 -1.00000 1x 8z 50z + 25 -1.00000 1y 3x 49y + 26 -1.00000 1y 3z 49y + 27 1.00000 1y 3z 49z + 28 1.00000 1y 4x 18y + 29 1.00000 1y 4z 18y + 30 1.00000 1y 4z 18z + 31 1.00000 1y 7x 17y + 32 -1.00000 1y 7z 17y + 33 -1.00000 1y 7z 17z + 34 -1.00000 1y 8x 50y + 35 1.00000 1y 8z 50y + 36 -1.00000 1y 8z 50z + 37 -1.00000 1y 17x 23x + 38 -1.00000 1y 17y 23x + 39 1.00000 1y 17y 23z + 40 1.00000 1y 18x 19x + 41 -1.00000 1y 18y 19x + 42 -1.00000 1y 18y 19z + 43 1.00000 1y 49x 51x + 44 1.00000 1y 49y 51x + 45 1.00000 1y 49y 51z + 46 -1.00000 1y 50x 55x + 47 1.00000 1y 50y 55x + 48 -1.00000 1y 50y 55z + 49 -1.00000 1z 3x 51z + 50 1.00000 1z 3y 51y + 51 -1.00000 1z 3y 51z + 52 1.00000 1z 4x 19z + 53 -1.00000 1z 4y 19y + 54 -1.00000 1z 4y 19z + 55 1.00000 1z 7x 23z + 56 1.00000 1z 7y 23y + 57 1.00000 1z 7y 23z + 58 -1.00000 1z 8x 55z + 59 -1.00000 1z 8y 55y + 60 1.00000 1z 8y 55z + 61 1.00000 1z 17x 23x + 62 -1.00000 1z 17x 23z + 63 -1.00000 1z 17y 23z + 64 -1.00000 1z 18x 19x + 65 -1.00000 1z 18x 19z + 66 1.00000 1z 18y 19z + 67 1.00000 1z 49x 51x + 68 1.00000 1z 49x 51z + 69 1.00000 1z 49y 51z + 70 -1.00000 1z 50x 55x + 71 1.00000 1z 50x 55z + 72 -1.00000 1z 50y 55z + 73 1.00000 9x 11x 25y + 74 -1.00000 9x 11x 25z + 75 -1.00000 9x 11x 27y + 76 1.00000 9x 11x 27z + 77 1.00000 9x 11y 27y + 78 1.00000 9x 11z 25z + 79 1.00000 9x 12x 58y + 80 1.00000 9x 12x 58z + 81 -1.00000 9x 12x 59y + 82 -1.00000 9x 12x 59z + 83 -1.00000 9x 12y 59y + 84 -1.00000 9x 12z 58z + 85 -1.00000 9x 15x 57y + 86 -1.00000 9x 15x 57z + 87 1.00000 9x 15x 63y + 88 1.00000 9x 15x 63z + 89 -1.00000 9x 15y 63y + 90 -1.00000 9x 15z 57z + 91 -1.00000 9x 16x 26y + 92 1.00000 9x 16x 26z + 93 1.00000 9x 16x 31y + 94 -1.00000 9x 16x 31z + 95 1.00000 9x 16y 31y + 96 1.00000 9x 16z 26z + 97 1.00000 9y 11x 25y + 98 -1.00000 9y 11z 25y + 99 1.00000 9y 11z 25z + 100 -1.00000 9y 12x 58y + 101 1.00000 9y 12z 58y + 102 1.00000 9y 12z 58z + 103 -1.00000 9y 15x 57y + 104 -1.00000 9y 15z 57y + 105 -1.00000 9y 15z 57z + 106 1.00000 9y 16x 26y + 107 1.00000 9y 16z 26y + 108 -1.00000 9y 16z 26z + 109 1.00000 9y 25x 27x + 110 -1.00000 9y 25y 27x + 111 1.00000 9y 25y 27z + 112 -1.00000 9y 26x 31x + 113 -1.00000 9y 26y 31x + 114 -1.00000 9y 26y 31z + 115 -1.00000 9y 57x 63x + 116 1.00000 9y 57y 63x + 117 1.00000 9y 57y 63z + 118 1.00000 9y 58x 59x + 119 1.00000 9y 58y 59x + 120 -1.00000 9y 58y 59z + 121 1.00000 9z 11x 27z + 122 1.00000 9z 11y 27y + 123 -1.00000 9z 11y 27z + 124 -1.00000 9z 12x 59z + 125 -1.00000 9z 12y 59y + 126 -1.00000 9z 12y 59z + 127 -1.00000 9z 15x 63z + 128 1.00000 9z 15y 63y + 129 1.00000 9z 15y 63z + 130 1.00000 9z 16x 31z + 131 -1.00000 9z 16y 31y + 132 1.00000 9z 16y 31z + 133 1.00000 9z 25x 27x + 134 -1.00000 9z 25x 27z + 135 1.00000 9z 25y 27z + 136 -1.00000 9z 26x 31x + 137 -1.00000 9z 26x 31z + 138 -1.00000 9z 26y 31z + 139 1.00000 9z 57x 63x + 140 1.00000 9z 57x 63z + 141 -1.00000 9z 57y 63z + 142 -1.00000 9z 58x 59x + 143 1.00000 9z 58x 59z + 144 1.00000 9z 58y 59z + + # FC3_32 144 -2.3651875e-04 + 1 1.00000 1x 3y 49x + 2 1.00000 1x 3z 51x + 3 1.00000 1x 4y 18x + 4 -1.00000 1x 4z 19x + 5 -1.00000 1x 7y 17x + 6 1.00000 1x 7z 23x + 7 -1.00000 1x 8y 50x + 8 -1.00000 1x 8z 55x + 9 -1.00000 1x 17x 23y + 10 -1.00000 1x 17y 23y + 11 1.00000 1x 17z 23x + 12 -1.00000 1x 17z 23z + 13 1.00000 1x 18x 19y + 14 -1.00000 1x 18y 19y + 15 -1.00000 1x 18z 19x + 16 -1.00000 1x 18z 19z + 17 1.00000 1x 49x 51y + 18 1.00000 1x 49y 51y + 19 1.00000 1x 49z 51x + 20 1.00000 1x 49z 51z + 21 -1.00000 1x 50x 55y + 22 1.00000 1x 50y 55y + 23 -1.00000 1x 50z 55x + 24 1.00000 1x 50z 55z + 25 -1.00000 1y 3x 51x + 26 -1.00000 1y 3y 49x + 27 -1.00000 1y 3y 51x + 28 1.00000 1y 3z 51y + 29 -1.00000 1y 3z 51z + 30 -1.00000 1y 4x 19x + 31 1.00000 1y 4y 18x + 32 1.00000 1y 4y 19x + 33 -1.00000 1y 4z 19y + 34 -1.00000 1y 4z 19z + 35 1.00000 1y 7x 23x + 36 1.00000 1y 7y 17x + 37 1.00000 1y 7y 23x + 38 1.00000 1y 7z 23y + 39 1.00000 1y 7z 23z + 40 1.00000 1y 8x 55x + 41 -1.00000 1y 8y 50x + 42 -1.00000 1y 8y 55x + 43 -1.00000 1y 8z 55y + 44 1.00000 1y 8z 55z + 45 1.00000 1y 17z 23y + 46 -1.00000 1y 18z 19y + 47 1.00000 1y 49z 51y + 48 -1.00000 1y 50z 55y + 49 -1.00000 1z 3x 49x + 50 -1.00000 1z 3y 49y + 51 1.00000 1z 3y 49z + 52 -1.00000 1z 3z 49x + 53 -1.00000 1z 3z 51x + 54 1.00000 1z 4x 18x + 55 1.00000 1z 4y 18y + 56 1.00000 1z 4y 18z + 57 1.00000 1z 4z 18x + 58 1.00000 1z 4z 19x + 59 -1.00000 1z 7x 17x + 60 -1.00000 1z 7y 17y + 61 -1.00000 1z 7y 17z + 62 1.00000 1z 7z 17x + 63 1.00000 1z 7z 23x + 64 1.00000 1z 8x 50x + 65 1.00000 1z 8y 50y + 66 -1.00000 1z 8y 50z + 67 -1.00000 1z 8z 50x + 68 -1.00000 1z 8z 55x + 69 -1.00000 1z 17z 23y + 70 1.00000 1z 18z 19y + 71 1.00000 1z 49z 51y + 72 -1.00000 1z 50z 55y + 73 1.00000 9x 11y 25x + 74 1.00000 9x 11z 27x + 75 1.00000 9x 12y 58x + 76 -1.00000 9x 12z 59x + 77 -1.00000 9x 15y 57x + 78 1.00000 9x 15z 63x + 79 -1.00000 9x 16y 26x + 80 -1.00000 9x 16z 31x + 81 1.00000 9x 25x 27y + 82 -1.00000 9x 25y 27y + 83 1.00000 9x 25z 27x + 84 -1.00000 9x 25z 27z + 85 -1.00000 9x 26x 31y + 86 -1.00000 9x 26y 31y + 87 -1.00000 9x 26z 31x + 88 -1.00000 9x 26z 31z + 89 -1.00000 9x 57x 63y + 90 1.00000 9x 57y 63y + 91 1.00000 9x 57z 63x + 92 1.00000 9x 57z 63z + 93 1.00000 9x 58x 59y + 94 1.00000 9x 58y 59y + 95 -1.00000 9x 58z 59x + 96 1.00000 9x 58z 59z + 97 -1.00000 9y 11x 27x + 98 1.00000 9y 11y 25x + 99 1.00000 9y 11y 27x + 100 1.00000 9y 11z 27y + 101 -1.00000 9y 11z 27z + 102 -1.00000 9y 12x 59x + 103 -1.00000 9y 12y 58x + 104 -1.00000 9y 12y 59x + 105 -1.00000 9y 12z 59y + 106 -1.00000 9y 12z 59z + 107 1.00000 9y 15x 63x + 108 -1.00000 9y 15y 57x + 109 -1.00000 9y 15y 63x + 110 1.00000 9y 15z 63y + 111 1.00000 9y 15z 63z + 112 1.00000 9y 16x 31x + 113 1.00000 9y 16y 26x + 114 1.00000 9y 16y 31x + 115 -1.00000 9y 16z 31y + 116 1.00000 9y 16z 31z + 117 1.00000 9y 25z 27y + 118 -1.00000 9y 26z 31y + 119 1.00000 9y 57z 63y + 120 -1.00000 9y 58z 59y + 121 -1.00000 9z 11x 25x + 122 -1.00000 9z 11y 25y + 123 1.00000 9z 11y 25z + 124 1.00000 9z 11z 25x + 125 1.00000 9z 11z 27x + 126 1.00000 9z 12x 58x + 127 1.00000 9z 12y 58y + 128 1.00000 9z 12y 58z + 129 -1.00000 9z 12z 58x + 130 -1.00000 9z 12z 59x + 131 -1.00000 9z 15x 57x + 132 -1.00000 9z 15y 57y + 133 -1.00000 9z 15y 57z + 134 -1.00000 9z 15z 57x + 135 -1.00000 9z 15z 63x + 136 1.00000 9z 16x 26x + 137 1.00000 9z 16y 26y + 138 -1.00000 9z 16y 26z + 139 1.00000 9z 16z 26x + 140 1.00000 9z 16z 31x + 141 1.00000 9z 25z 27y + 142 -1.00000 9z 26z 31y + 143 -1.00000 9z 57z 63y + 144 1.00000 9z 58z 59y + + # FC3_33 144 -1.0707157e-05 + 1 1.00000 1x 3y 49y + 2 1.00000 1x 3y 51x + 3 1.00000 1x 3z 49x + 4 1.00000 1x 3z 51z + 5 -1.00000 1x 4y 18y + 6 1.00000 1x 4y 19x + 7 -1.00000 1x 4z 18x + 8 -1.00000 1x 4z 19z + 9 -1.00000 1x 7y 17y + 10 -1.00000 1x 7y 23x + 11 1.00000 1x 7z 17x + 12 -1.00000 1x 7z 23z + 13 1.00000 1x 8y 50y + 14 -1.00000 1x 8y 55x + 15 -1.00000 1x 8z 50x + 16 1.00000 1x 8z 55z + 17 -1.00000 1x 17x 23z + 18 1.00000 1x 17y 23x + 19 1.00000 1x 18x 19z + 20 -1.00000 1x 18y 19x + 21 -1.00000 1x 49x 51z + 22 -1.00000 1x 49y 51x + 23 1.00000 1x 50x 55z + 24 1.00000 1x 50y 55x + 25 -1.00000 1y 3x 49x + 26 1.00000 1y 3x 51y + 27 1.00000 1y 3y 49z + 28 -1.00000 1y 3y 51z + 29 -1.00000 1y 4x 18x + 30 -1.00000 1y 4x 19y + 31 -1.00000 1y 4y 18z + 32 1.00000 1y 4y 19z + 33 1.00000 1y 7x 17x + 34 -1.00000 1y 7x 23y + 35 1.00000 1y 7y 17z + 36 -1.00000 1y 7y 23z + 37 1.00000 1y 8x 50x + 38 1.00000 1y 8x 55y + 39 -1.00000 1y 8y 50z + 40 1.00000 1y 8y 55z + 41 1.00000 1y 17x 23y + 42 1.00000 1y 17z 23z + 43 1.00000 1y 18x 19y + 44 -1.00000 1y 18z 19z + 45 -1.00000 1y 49x 51y + 46 -1.00000 1y 49z 51z + 47 -1.00000 1y 50x 55y + 48 1.00000 1y 50z 55z + 49 1.00000 1z 3x 49z + 50 -1.00000 1z 3x 51x + 51 -1.00000 1z 3z 49y + 52 1.00000 1z 3z 51y + 53 -1.00000 1z 4x 18z + 54 1.00000 1z 4x 19x + 55 -1.00000 1z 4z 18y + 56 1.00000 1z 4z 19y + 57 -1.00000 1z 7x 17z + 58 -1.00000 1z 7x 23x + 59 1.00000 1z 7z 17y + 60 -1.00000 1z 7z 23y + 61 1.00000 1z 8x 50z + 62 1.00000 1z 8x 55x + 63 1.00000 1z 8z 50y + 64 -1.00000 1z 8z 55y + 65 -1.00000 1z 17y 23y + 66 1.00000 1z 17z 23x + 67 1.00000 1z 18y 19y + 68 1.00000 1z 18z 19x + 69 -1.00000 1z 49y 51y + 70 -1.00000 1z 49z 51x + 71 1.00000 1z 50y 55y + 72 -1.00000 1z 50z 55x + 73 -1.00000 9x 11y 25y + 74 1.00000 9x 11y 27x + 75 1.00000 9x 11z 25x + 76 -1.00000 9x 11z 27z + 77 1.00000 9x 12y 58y + 78 1.00000 9x 12y 59x + 79 -1.00000 9x 12z 58x + 80 1.00000 9x 12z 59z + 81 1.00000 9x 15y 57y + 82 -1.00000 9x 15y 63x + 83 1.00000 9x 15z 57x + 84 1.00000 9x 15z 63z + 85 -1.00000 9x 16y 26y + 86 -1.00000 9x 16y 31x + 87 -1.00000 9x 16z 26x + 88 -1.00000 9x 16z 31z + 89 -1.00000 9x 25x 27z + 90 -1.00000 9x 25y 27x + 91 1.00000 9x 26x 31z + 92 1.00000 9x 26y 31x + 93 -1.00000 9x 57x 63z + 94 1.00000 9x 57y 63x + 95 1.00000 9x 58x 59z + 96 -1.00000 9x 58y 59x + 97 -1.00000 9y 11x 25x + 98 -1.00000 9y 11x 27y + 99 1.00000 9y 11y 25z + 100 -1.00000 9y 11y 27z + 101 -1.00000 9y 12x 58x + 102 1.00000 9y 12x 59y + 103 -1.00000 9y 12y 58z + 104 1.00000 9y 12y 59z + 105 1.00000 9y 15x 57x + 106 1.00000 9y 15x 63y + 107 1.00000 9y 15y 57z + 108 -1.00000 9y 15y 63z + 109 1.00000 9y 16x 26x + 110 -1.00000 9y 16x 31y + 111 -1.00000 9y 16y 26z + 112 1.00000 9y 16y 31z + 113 1.00000 9y 25x 27y + 114 -1.00000 9y 25z 27z + 115 1.00000 9y 26x 31y + 116 1.00000 9y 26z 31z + 117 -1.00000 9y 57x 63y + 118 1.00000 9y 57z 63z + 119 -1.00000 9y 58x 59y + 120 -1.00000 9y 58z 59z + 121 -1.00000 9z 11x 25z + 122 -1.00000 9z 11x 27x + 123 -1.00000 9z 11z 25y + 124 1.00000 9z 11z 27y + 125 1.00000 9z 12x 58z + 126 1.00000 9z 12x 59x + 127 -1.00000 9z 12z 58y + 128 1.00000 9z 12z 59y + 129 1.00000 9z 15x 57z + 130 -1.00000 9z 15x 63x + 131 1.00000 9z 15z 57y + 132 -1.00000 9z 15z 63y + 133 -1.00000 9z 16x 26z + 134 1.00000 9z 16x 31x + 135 1.00000 9z 16z 26y + 136 -1.00000 9z 16z 31y + 137 -1.00000 9z 25y 27y + 138 1.00000 9z 25z 27x + 139 1.00000 9z 26y 31y + 140 1.00000 9z 26z 31x + 141 -1.00000 9z 57y 63y + 142 -1.00000 9z 57z 63x + 143 1.00000 9z 58y 59y + 144 -1.00000 9z 58z 59x + + # FC3_34 72 -1.5951637e-04 + 1 1.00000 1x 3y 49z + 2 1.00000 1x 3z 51y + 3 1.00000 1x 4y 18z + 4 1.00000 1x 4z 19y + 5 1.00000 1x 7y 17z + 6 1.00000 1x 7z 23y + 7 1.00000 1x 8y 50z + 8 1.00000 1x 8z 55y + 9 1.00000 1x 17y 23z + 10 1.00000 1x 18y 19z + 11 1.00000 1x 49y 51z + 12 1.00000 1x 50y 55z + 13 1.00000 1y 3x 51z + 14 1.00000 1y 3z 49x + 15 1.00000 1y 4x 19z + 16 1.00000 1y 4z 18x + 17 1.00000 1y 7x 23z + 18 1.00000 1y 7z 17x + 19 1.00000 1y 8x 55z + 20 1.00000 1y 8z 50x + 21 1.00000 1y 17z 23x + 22 1.00000 1y 18z 19x + 23 1.00000 1y 49z 51x + 24 1.00000 1y 50z 55x + 25 1.00000 1z 3x 49y + 26 1.00000 1z 3y 51x + 27 1.00000 1z 4x 18y + 28 1.00000 1z 4y 19x + 29 1.00000 1z 7x 17y + 30 1.00000 1z 7y 23x + 31 1.00000 1z 8x 50y + 32 1.00000 1z 8y 55x + 33 1.00000 1z 17x 23y + 34 1.00000 1z 18x 19y + 35 1.00000 1z 49x 51y + 36 1.00000 1z 50x 55y + 37 -1.00000 9x 11y 25z + 38 -1.00000 9x 11z 27y + 39 -1.00000 9x 12y 58z + 40 -1.00000 9x 12z 59y + 41 -1.00000 9x 15y 57z + 42 -1.00000 9x 15z 63y + 43 -1.00000 9x 16y 26z + 44 -1.00000 9x 16z 31y + 45 -1.00000 9x 25y 27z + 46 -1.00000 9x 26y 31z + 47 -1.00000 9x 57y 63z + 48 -1.00000 9x 58y 59z + 49 -1.00000 9y 11x 27z + 50 -1.00000 9y 11z 25x + 51 -1.00000 9y 12x 59z + 52 -1.00000 9y 12z 58x + 53 -1.00000 9y 15x 63z + 54 -1.00000 9y 15z 57x + 55 -1.00000 9y 16x 31z + 56 -1.00000 9y 16z 26x + 57 -1.00000 9y 25z 27x + 58 -1.00000 9y 26z 31x + 59 -1.00000 9y 57z 63x + 60 -1.00000 9y 58z 59x + 61 -1.00000 9z 11x 25y + 62 -1.00000 9z 11y 27x + 63 -1.00000 9z 12x 58y + 64 -1.00000 9z 12y 59x + 65 -1.00000 9z 15x 57y + 66 -1.00000 9z 15y 63x + 67 -1.00000 9z 16x 26y + 68 -1.00000 9z 16y 31x + 69 -1.00000 9z 25x 27y + 70 -1.00000 9z 26x 31y + 71 -1.00000 9z 57x 63y + 72 -1.00000 9z 58x 59y + + # FC3_35 48 -2.1720419e-04 + 1 1.00000 1x 3y 51z + 2 1.00000 1x 3z 49y + 3 1.00000 1x 4y 19z + 4 1.00000 1x 4z 18y + 5 1.00000 1x 7y 23z + 6 1.00000 1x 7z 17y + 7 1.00000 1x 8y 55z + 8 1.00000 1x 8z 50y + 9 1.00000 1y 3x 49z + 10 1.00000 1y 4x 18z + 11 1.00000 1y 7x 17z + 12 1.00000 1y 8x 50z + 13 1.00000 1y 17x 23z + 14 1.00000 1y 18x 19z + 15 1.00000 1y 49x 51z + 16 1.00000 1y 50x 55z + 17 1.00000 1z 3x 51y + 18 1.00000 1z 4x 19y + 19 1.00000 1z 7x 23y + 20 1.00000 1z 8x 55y + 21 1.00000 1z 17y 23x + 22 1.00000 1z 18y 19x + 23 1.00000 1z 49y 51x + 24 1.00000 1z 50y 55x + 25 -1.00000 9x 11y 27z + 26 -1.00000 9x 11z 25y + 27 -1.00000 9x 12y 59z + 28 -1.00000 9x 12z 58y + 29 -1.00000 9x 15y 63z + 30 -1.00000 9x 15z 57y + 31 -1.00000 9x 16y 31z + 32 -1.00000 9x 16z 26y + 33 -1.00000 9y 11x 25z + 34 -1.00000 9y 12x 58z + 35 -1.00000 9y 15x 57z + 36 -1.00000 9y 16x 26z + 37 -1.00000 9y 25x 27z + 38 -1.00000 9y 26x 31z + 39 -1.00000 9y 57x 63z + 40 -1.00000 9y 58x 59z + 41 -1.00000 9z 11x 27y + 42 -1.00000 9z 12x 59y + 43 -1.00000 9z 15x 63y + 44 -1.00000 9z 16x 31y + 45 -1.00000 9z 25y 27x + 46 -1.00000 9z 26y 31x + 47 -1.00000 9z 57y 63x + 48 -1.00000 9z 58y 59x + + # FC3_36 24 -1.9756788e-04 + 1 1.00000 1x 17z 23y + 2 1.00000 1x 18z 19y + 3 1.00000 1x 49z 51y + 4 1.00000 1x 50z 55y + 5 1.00000 1y 3z 51x + 6 1.00000 1y 4z 19x + 7 1.00000 1y 7z 23x + 8 1.00000 1y 8z 55x + 9 1.00000 1z 3y 49x + 10 1.00000 1z 4y 18x + 11 1.00000 1z 7y 17x + 12 1.00000 1z 8y 50x + 13 -1.00000 9x 25z 27y + 14 -1.00000 9x 26z 31y + 15 -1.00000 9x 57z 63y + 16 -1.00000 9x 58z 59y + 17 -1.00000 9y 11z 27x + 18 -1.00000 9y 12z 59x + 19 -1.00000 9y 15z 63x + 20 -1.00000 9y 16z 31x + 21 -1.00000 9z 11y 25x + 22 -1.00000 9z 12y 58x + 23 -1.00000 9z 15y 57x + 24 -1.00000 9z 16y 26x + diff --git a/example/Si_OpenMX/reference/si222_cubic.xml.bz2 b/example/Si_OpenMX/reference/si222_cubic.xml.bz2 new file mode 100644 index 00000000..26ee76b6 Binary files /dev/null and b/example/Si_OpenMX/reference/si222_cubic.xml.bz2 differ diff --git a/example/Si_OpenMX/reference/si222_harm.fcs b/example/Si_OpenMX/reference/si222_harm.fcs new file mode 100644 index 00000000..42f93144 --- /dev/null +++ b/example/Si_OpenMX/reference/si222_harm.fcs @@ -0,0 +1,1155 @@ + *********************** Force Constants (FCs) *********************** + * Force constants are printed in Rydberg atomic units. * + * FC2: Ry/a0^2 FC3: Ry/a0^3 FC4: Ry/a0^4 etc. * + * FC?: Ry/a0^? a0 = Bohr radius * + * * + * The value shown in the last column is the distance * + * between the most distant atomic pairs. * + ********************************************************************* + + ---------------------------------------------------------------------- + Index FCs P Pairs Distance [Bohr] + (Global, Local) (Multiplicity) + ---------------------------------------------------------------------- + + *FC2 + 1 1 2.8300518e-01 1 1x 1x 0.000 + 2 2 -9.7775956e-04 2 1x 2x 10.217 + 3 3 -4.5566492e-04 2 1x 33x 10.217 + 4 4 9.2469630e-03 1 1x 3x 7.224 + 5 5 2.1507125e-03 1 1x 3y 7.224 + 6 6 -4.0238631e-03 1 1x 17x 7.224 + 7 7 -3.9376669e-03 1 1x 17z 7.224 + 8 8 8.4080614e-03 4 1x 6x 14.448 + 9 9 1.1907274e-04 4 1x 34x 14.448 + 10 10 -6.9163450e-02 1 1x 9x 4.424 + 11 11 -4.7951322e-02 1 1x 9y 4.424 + 12 12 1.0668799e-03 1 1x 10x 8.471 + 13 13 -8.5656544e-04 1 1x 10y 8.471 + 14 14 -7.3149640e-04 1 1x 10z 8.471 + 15 15 2.1609618e-04 1 1x 26x 8.471 + 16 16 -4.4835016e-03 1 1x 11x 11.133 + 17 17 4.9133823e-04 1 1x 11y 11.133 + 18 18 -5.0660832e-04 1 1x 25x 11.133 + 19 19 -4.2418102e-04 1 1x 25z 11.133 + 20 20 -7.4084169e-04 2 1x 20x 12.513 + 21 21 1.3336277e-03 2 1x 20y 12.513 + 22 22 -1.7727737e-04 2 1x 20z 12.513 + 23 23 5.4258083e-05 2 1x 35x 12.513 + 24 24 3.3765873e-04 1 1x 28x 13.272 + 25 25 -5.3798590e-04 1 1x 28y 13.272 + 26 26 -4.3683228e-04 8 1x 38x 17.696 + + + + ------------------------ All FCs below ------------------------ + + **FC2 + # FC2_1 6 2.8300518e-01 + 1 1.00000 1x 1x + 2 1.00000 1y 1y + 3 1.00000 1z 1z + 4 1.00000 9x 9x + 5 1.00000 9y 9y + 6 1.00000 9z 9z + + # FC2_2 12 -9.7775956e-04 + 1 1.00000 1x 2x + 2 1.00000 1x 5x + 3 1.00000 1y 2y + 4 1.00000 1y 33y + 5 1.00000 1z 5z + 6 1.00000 1z 33z + 7 1.00000 9x 10x + 8 1.00000 9x 13x + 9 1.00000 9y 10y + 10 1.00000 9y 41y + 11 1.00000 9z 13z + 12 1.00000 9z 41z + + # FC2_3 6 -4.5566492e-04 + 1 1.00000 1x 33x + 2 1.00000 1y 5y + 3 1.00000 1z 2z + 4 1.00000 9x 41x + 5 1.00000 9y 13y + 6 1.00000 9z 10z + + # FC2_4 24 9.2469630e-03 + 1 1.00000 1x 3x + 2 1.00000 1x 4x + 3 1.00000 1x 7x + 4 1.00000 1x 8x + 5 1.00000 1y 17y + 6 1.00000 1y 18y + 7 1.00000 1y 49y + 8 1.00000 1y 50y + 9 1.00000 1z 19z + 10 1.00000 1z 23z + 11 1.00000 1z 51z + 12 1.00000 1z 55z + 13 1.00000 9x 11x + 14 1.00000 9x 12x + 15 1.00000 9x 15x + 16 1.00000 9x 16x + 17 1.00000 9y 25y + 18 1.00000 9y 26y + 19 1.00000 9y 57y + 20 1.00000 9y 58y + 21 1.00000 9z 27z + 22 1.00000 9z 31z + 23 1.00000 9z 59z + 24 1.00000 9z 63z + + # FC2_5 96 2.1507125e-03 + 1 1.00000 1x 3y + 2 1.00000 1x 3z + 3 -1.00000 1x 4y + 4 1.00000 1x 4z + 5 1.00000 1x 7y + 6 -1.00000 1x 7z + 7 -1.00000 1x 8y + 8 -1.00000 1x 8z + 9 -1.00000 1x 17y + 10 1.00000 1x 18y + 11 -1.00000 1x 19z + 12 1.00000 1x 23z + 13 -1.00000 1x 49y + 14 1.00000 1x 50y + 15 -1.00000 1x 51z + 16 1.00000 1x 55z + 17 -1.00000 1y 3x + 18 1.00000 1y 4x + 19 -1.00000 1y 7x + 20 1.00000 1y 8x + 21 1.00000 1y 17x + 22 1.00000 1y 17z + 23 -1.00000 1y 18x + 24 1.00000 1y 18z + 25 -1.00000 1y 19z + 26 -1.00000 1y 23z + 27 1.00000 1y 49x + 28 -1.00000 1y 49z + 29 -1.00000 1y 50x + 30 -1.00000 1y 50z + 31 1.00000 1y 51z + 32 1.00000 1y 55z + 33 -1.00000 1z 3x + 34 -1.00000 1z 4x + 35 1.00000 1z 7x + 36 1.00000 1z 8x + 37 -1.00000 1z 17y + 38 -1.00000 1z 18y + 39 1.00000 1z 19x + 40 1.00000 1z 19y + 41 -1.00000 1z 23x + 42 1.00000 1z 23y + 43 1.00000 1z 49y + 44 1.00000 1z 50y + 45 1.00000 1z 51x + 46 -1.00000 1z 51y + 47 -1.00000 1z 55x + 48 -1.00000 1z 55y + 49 -1.00000 9x 11y + 50 -1.00000 9x 11z + 51 1.00000 9x 12y + 52 -1.00000 9x 12z + 53 -1.00000 9x 15y + 54 1.00000 9x 15z + 55 1.00000 9x 16y + 56 1.00000 9x 16z + 57 1.00000 9x 25y + 58 -1.00000 9x 26y + 59 1.00000 9x 27z + 60 -1.00000 9x 31z + 61 1.00000 9x 57y + 62 -1.00000 9x 58y + 63 1.00000 9x 59z + 64 -1.00000 9x 63z + 65 1.00000 9y 11x + 66 -1.00000 9y 12x + 67 1.00000 9y 15x + 68 -1.00000 9y 16x + 69 -1.00000 9y 25x + 70 -1.00000 9y 25z + 71 1.00000 9y 26x + 72 -1.00000 9y 26z + 73 1.00000 9y 27z + 74 1.00000 9y 31z + 75 -1.00000 9y 57x + 76 1.00000 9y 57z + 77 1.00000 9y 58x + 78 1.00000 9y 58z + 79 -1.00000 9y 59z + 80 -1.00000 9y 63z + 81 1.00000 9z 11x + 82 1.00000 9z 12x + 83 -1.00000 9z 15x + 84 -1.00000 9z 16x + 85 1.00000 9z 25y + 86 1.00000 9z 26y + 87 -1.00000 9z 27x + 88 -1.00000 9z 27y + 89 1.00000 9z 31x + 90 -1.00000 9z 31y + 91 -1.00000 9z 57y + 92 -1.00000 9z 58y + 93 -1.00000 9z 59x + 94 1.00000 9z 59y + 95 1.00000 9z 63x + 96 1.00000 9z 63y + + # FC2_6 48 -4.0238631e-03 + 1 1.00000 1x 17x + 2 1.00000 1x 18x + 3 1.00000 1x 19x + 4 1.00000 1x 23x + 5 1.00000 1x 49x + 6 1.00000 1x 50x + 7 1.00000 1x 51x + 8 1.00000 1x 55x + 9 1.00000 1y 3y + 10 1.00000 1y 4y + 11 1.00000 1y 7y + 12 1.00000 1y 8y + 13 1.00000 1y 19y + 14 1.00000 1y 23y + 15 1.00000 1y 51y + 16 1.00000 1y 55y + 17 1.00000 1z 3z + 18 1.00000 1z 4z + 19 1.00000 1z 7z + 20 1.00000 1z 8z + 21 1.00000 1z 17z + 22 1.00000 1z 18z + 23 1.00000 1z 49z + 24 1.00000 1z 50z + 25 1.00000 9x 25x + 26 1.00000 9x 26x + 27 1.00000 9x 27x + 28 1.00000 9x 31x + 29 1.00000 9x 57x + 30 1.00000 9x 58x + 31 1.00000 9x 59x + 32 1.00000 9x 63x + 33 1.00000 9y 11y + 34 1.00000 9y 12y + 35 1.00000 9y 15y + 36 1.00000 9y 16y + 37 1.00000 9y 27y + 38 1.00000 9y 31y + 39 1.00000 9y 59y + 40 1.00000 9y 63y + 41 1.00000 9z 11z + 42 1.00000 9z 12z + 43 1.00000 9z 15z + 44 1.00000 9z 16z + 45 1.00000 9z 25z + 46 1.00000 9z 26z + 47 1.00000 9z 57z + 48 1.00000 9z 58z + + # FC2_7 48 -3.9376669e-03 + 1 1.00000 1x 17z + 2 -1.00000 1x 18z + 3 1.00000 1x 19y + 4 -1.00000 1x 23y + 5 -1.00000 1x 49z + 6 1.00000 1x 50z + 7 -1.00000 1x 51y + 8 1.00000 1x 55y + 9 1.00000 1y 3z + 10 -1.00000 1y 4z + 11 -1.00000 1y 7z + 12 1.00000 1y 8z + 13 1.00000 1y 19x + 14 -1.00000 1y 23x + 15 -1.00000 1y 51x + 16 1.00000 1y 55x + 17 1.00000 1z 3y + 18 -1.00000 1z 4y + 19 -1.00000 1z 7y + 20 1.00000 1z 8y + 21 1.00000 1z 17x + 22 -1.00000 1z 18x + 23 -1.00000 1z 49x + 24 1.00000 1z 50x + 25 1.00000 9x 25z + 26 -1.00000 9x 26z + 27 1.00000 9x 27y + 28 -1.00000 9x 31y + 29 -1.00000 9x 57z + 30 1.00000 9x 58z + 31 -1.00000 9x 59y + 32 1.00000 9x 63y + 33 1.00000 9y 11z + 34 -1.00000 9y 12z + 35 -1.00000 9y 15z + 36 1.00000 9y 16z + 37 1.00000 9y 27x + 38 -1.00000 9y 31x + 39 -1.00000 9y 59x + 40 1.00000 9y 63x + 41 1.00000 9z 11y + 42 -1.00000 9z 12y + 43 -1.00000 9z 15y + 44 1.00000 9z 16y + 45 1.00000 9z 25x + 46 -1.00000 9z 26x + 47 -1.00000 9z 57x + 48 1.00000 9z 58x + + # FC2_8 6 8.4080614e-03 + 1 1.00000 1x 6x + 2 1.00000 1y 34y + 3 1.00000 1z 37z + 4 1.00000 9x 14x + 5 1.00000 9y 42y + 6 1.00000 9z 45z + + # FC2_9 12 1.1907274e-04 + 1 1.00000 1x 34x + 2 1.00000 1x 37x + 3 1.00000 1y 6y + 4 1.00000 1y 37y + 5 1.00000 1z 6z + 6 1.00000 1z 34z + 7 1.00000 9x 42x + 8 1.00000 9x 45x + 9 1.00000 9y 14y + 10 1.00000 9y 45y + 11 1.00000 9z 14z + 12 1.00000 9z 42z + + # FC2_10 24 -6.9163450e-02 + 1 1.00000 1x 9x + 2 1.00000 1x 16x + 3 1.00000 1x 58x + 4 1.00000 1x 63x + 5 1.00000 1y 9y + 6 1.00000 1y 16y + 7 1.00000 1y 58y + 8 1.00000 1y 63y + 9 1.00000 1z 9z + 10 1.00000 1z 16z + 11 1.00000 1z 58z + 12 1.00000 1z 63z + 13 1.00000 9x 1x + 14 1.00000 9x 3x + 15 1.00000 9x 17x + 16 1.00000 9x 19x + 17 1.00000 9y 1y + 18 1.00000 9y 3y + 19 1.00000 9y 17y + 20 1.00000 9y 19y + 21 1.00000 9z 1z + 22 1.00000 9z 3z + 23 1.00000 9z 17z + 24 1.00000 9z 19z + + # FC2_11 48 -4.7951322e-02 + 1 1.00000 1x 9y + 2 1.00000 1x 9z + 3 -1.00000 1x 16y + 4 -1.00000 1x 16z + 5 -1.00000 1x 58y + 6 1.00000 1x 58z + 7 1.00000 1x 63y + 8 -1.00000 1x 63z + 9 1.00000 1y 9x + 10 1.00000 1y 9z + 11 -1.00000 1y 16x + 12 1.00000 1y 16z + 13 -1.00000 1y 58x + 14 -1.00000 1y 58z + 15 1.00000 1y 63x + 16 -1.00000 1y 63z + 17 1.00000 1z 9x + 18 1.00000 1z 9y + 19 -1.00000 1z 16x + 20 1.00000 1z 16y + 21 1.00000 1z 58x + 22 -1.00000 1z 58y + 23 -1.00000 1z 63x + 24 -1.00000 1z 63y + 25 1.00000 9x 1y + 26 1.00000 9x 1z + 27 -1.00000 9x 3y + 28 -1.00000 9x 3z + 29 -1.00000 9x 17y + 30 1.00000 9x 17z + 31 1.00000 9x 19y + 32 -1.00000 9x 19z + 33 1.00000 9y 1x + 34 1.00000 9y 1z + 35 -1.00000 9y 3x + 36 1.00000 9y 3z + 37 -1.00000 9y 17x + 38 -1.00000 9y 17z + 39 1.00000 9y 19x + 40 -1.00000 9y 19z + 41 1.00000 9z 1x + 42 1.00000 9z 1y + 43 -1.00000 9z 3x + 44 1.00000 9z 3y + 45 1.00000 9z 17x + 46 -1.00000 9z 17y + 47 -1.00000 9z 19x + 48 -1.00000 9z 19y + + # FC2_12 48 1.0668799e-03 + 1 1.00000 1x 10x + 2 1.00000 1x 12x + 3 1.00000 1x 13x + 4 1.00000 1x 15x + 5 1.00000 1x 57x + 6 1.00000 1x 59x + 7 1.00000 1x 62x + 8 1.00000 1x 64x + 9 1.00000 1y 10y + 10 1.00000 1y 15y + 11 1.00000 1y 26y + 12 1.00000 1y 31y + 13 1.00000 1y 41y + 14 1.00000 1y 48y + 15 1.00000 1y 57y + 16 1.00000 1y 64y + 17 1.00000 1z 12z + 18 1.00000 1z 13z + 19 1.00000 1z 26z + 20 1.00000 1z 31z + 21 1.00000 1z 41z + 22 1.00000 1z 48z + 23 1.00000 1z 59z + 24 1.00000 1z 62z + 25 1.00000 9x 2x + 26 1.00000 9x 4x + 27 1.00000 9x 5x + 28 1.00000 9x 7x + 29 1.00000 9x 18x + 30 1.00000 9x 20x + 31 1.00000 9x 21x + 32 1.00000 9x 23x + 33 1.00000 9y 2y + 34 1.00000 9y 4y + 35 1.00000 9y 18y + 36 1.00000 9y 20y + 37 1.00000 9y 33y + 38 1.00000 9y 35y + 39 1.00000 9y 49y + 40 1.00000 9y 51y + 41 1.00000 9z 5z + 42 1.00000 9z 7z + 43 1.00000 9z 21z + 44 1.00000 9z 23z + 45 1.00000 9z 33z + 46 1.00000 9z 35z + 47 1.00000 9z 49z + 48 1.00000 9z 51z + + # FC2_13 48 -8.5656544e-04 + 1 1.00000 1x 10y + 2 -1.00000 1x 12z + 3 1.00000 1x 13z + 4 -1.00000 1x 15y + 5 -1.00000 1x 57y + 6 -1.00000 1x 59z + 7 1.00000 1x 62z + 8 1.00000 1x 64y + 9 1.00000 1y 10x + 10 -1.00000 1y 15x + 11 -1.00000 1y 26z + 12 -1.00000 1y 31z + 13 1.00000 1y 41z + 14 1.00000 1y 48z + 15 -1.00000 1y 57x + 16 1.00000 1y 64x + 17 -1.00000 1z 12x + 18 1.00000 1z 13x + 19 -1.00000 1z 26y + 20 -1.00000 1z 31y + 21 1.00000 1z 41y + 22 1.00000 1z 48y + 23 -1.00000 1z 59x + 24 1.00000 1z 62x + 25 1.00000 9x 2y + 26 -1.00000 9x 4y + 27 1.00000 9x 5z + 28 -1.00000 9x 7z + 29 -1.00000 9x 18y + 30 1.00000 9x 20y + 31 1.00000 9x 21z + 32 -1.00000 9x 23z + 33 1.00000 9y 2x + 34 -1.00000 9y 4x + 35 -1.00000 9y 18x + 36 1.00000 9y 20x + 37 1.00000 9y 33z + 38 1.00000 9y 35z + 39 -1.00000 9y 49z + 40 -1.00000 9y 51z + 41 1.00000 9z 5x + 42 -1.00000 9z 7x + 43 1.00000 9z 21x + 44 -1.00000 9z 23x + 45 1.00000 9z 33y + 46 1.00000 9z 35y + 47 -1.00000 9z 49y + 48 -1.00000 9z 51y + + # FC2_14 96 -7.3149640e-04 + 1 1.00000 1x 10z + 2 -1.00000 1x 12y + 3 1.00000 1x 13y + 4 -1.00000 1x 15z + 5 -1.00000 1x 26y + 6 1.00000 1x 26z + 7 1.00000 1x 31y + 8 -1.00000 1x 31z + 9 1.00000 1x 41y + 10 1.00000 1x 41z + 11 -1.00000 1x 48y + 12 -1.00000 1x 48z + 13 1.00000 1x 57z + 14 1.00000 1x 59y + 15 -1.00000 1x 62y + 16 -1.00000 1x 64z + 17 1.00000 1y 10z + 18 -1.00000 1y 12x + 19 1.00000 1y 12z + 20 1.00000 1y 13x + 21 1.00000 1y 13z + 22 1.00000 1y 15z + 23 -1.00000 1y 26x + 24 1.00000 1y 31x + 25 1.00000 1y 41x + 26 -1.00000 1y 48x + 27 -1.00000 1y 57z + 28 1.00000 1y 59x + 29 -1.00000 1y 59z + 30 -1.00000 1y 62x + 31 -1.00000 1y 62z + 32 -1.00000 1y 64z + 33 1.00000 1z 10x + 34 1.00000 1z 10y + 35 1.00000 1z 12y + 36 1.00000 1z 13y + 37 -1.00000 1z 15x + 38 1.00000 1z 15y + 39 1.00000 1z 26x + 40 -1.00000 1z 31x + 41 1.00000 1z 41x + 42 -1.00000 1z 48x + 43 1.00000 1z 57x + 44 -1.00000 1z 57y + 45 -1.00000 1z 59y + 46 -1.00000 1z 62y + 47 -1.00000 1z 64x + 48 -1.00000 1z 64y + 49 1.00000 9x 2z + 50 -1.00000 9x 4z + 51 1.00000 9x 5y + 52 -1.00000 9x 7y + 53 1.00000 9x 18z + 54 -1.00000 9x 20z + 55 -1.00000 9x 21y + 56 1.00000 9x 23y + 57 1.00000 9x 33y + 58 1.00000 9x 33z + 59 -1.00000 9x 35y + 60 -1.00000 9x 35z + 61 -1.00000 9x 49y + 62 1.00000 9x 49z + 63 1.00000 9x 51y + 64 -1.00000 9x 51z + 65 1.00000 9y 2z + 66 1.00000 9y 4z + 67 1.00000 9y 5x + 68 1.00000 9y 5z + 69 -1.00000 9y 7x + 70 1.00000 9y 7z + 71 -1.00000 9y 18z + 72 -1.00000 9y 20z + 73 -1.00000 9y 21x + 74 -1.00000 9y 21z + 75 1.00000 9y 23x + 76 -1.00000 9y 23z + 77 1.00000 9y 33x + 78 -1.00000 9y 35x + 79 -1.00000 9y 49x + 80 1.00000 9y 51x + 81 1.00000 9z 2x + 82 1.00000 9z 2y + 83 -1.00000 9z 4x + 84 1.00000 9z 4y + 85 1.00000 9z 5y + 86 1.00000 9z 7y + 87 1.00000 9z 18x + 88 -1.00000 9z 18y + 89 -1.00000 9z 20x + 90 -1.00000 9z 20y + 91 -1.00000 9z 21y + 92 -1.00000 9z 23y + 93 1.00000 9z 33x + 94 -1.00000 9z 35x + 95 1.00000 9z 49x + 96 -1.00000 9z 51x + + # FC2_15 24 2.1609618e-04 + 1 1.00000 1x 26x + 2 1.00000 1x 31x + 3 1.00000 1x 41x + 4 1.00000 1x 48x + 5 1.00000 1y 12y + 6 1.00000 1y 13y + 7 1.00000 1y 59y + 8 1.00000 1y 62y + 9 1.00000 1z 10z + 10 1.00000 1z 15z + 11 1.00000 1z 57z + 12 1.00000 1z 64z + 13 1.00000 9x 33x + 14 1.00000 9x 35x + 15 1.00000 9x 49x + 16 1.00000 9x 51x + 17 1.00000 9y 5y + 18 1.00000 9y 7y + 19 1.00000 9y 21y + 20 1.00000 9y 23y + 21 1.00000 9z 2z + 22 1.00000 9z 4z + 23 1.00000 9z 18z + 24 1.00000 9z 20z + + # FC2_16 24 -4.4835016e-03 + 1 1.00000 1x 11x + 2 1.00000 1x 14x + 3 1.00000 1x 60x + 4 1.00000 1x 61x + 5 1.00000 1y 25y + 6 1.00000 1y 32y + 7 1.00000 1y 42y + 8 1.00000 1y 47y + 9 1.00000 1z 27z + 10 1.00000 1z 30z + 11 1.00000 1z 44z + 12 1.00000 1z 45z + 13 1.00000 9x 6x + 14 1.00000 9x 8x + 15 1.00000 9x 22x + 16 1.00000 9x 24x + 17 1.00000 9y 34y + 18 1.00000 9y 36y + 19 1.00000 9y 50y + 20 1.00000 9y 52y + 21 1.00000 9z 37z + 22 1.00000 9z 39z + 23 1.00000 9z 53z + 24 1.00000 9z 55z + + # FC2_17 96 4.9133823e-04 + 1 1.00000 1x 11y + 2 1.00000 1x 11z + 3 -1.00000 1x 14y + 4 -1.00000 1x 14z + 5 1.00000 1x 25y + 6 1.00000 1x 27z + 7 -1.00000 1x 30z + 8 -1.00000 1x 32y + 9 -1.00000 1x 42y + 10 1.00000 1x 44z + 11 -1.00000 1x 45z + 12 1.00000 1x 47y + 13 -1.00000 1x 60y + 14 1.00000 1x 60z + 15 1.00000 1x 61y + 16 -1.00000 1x 61z + 17 1.00000 1y 11x + 18 -1.00000 1y 14x + 19 1.00000 1y 25x + 20 1.00000 1y 25z + 21 1.00000 1y 27z + 22 1.00000 1y 30z + 23 -1.00000 1y 32x + 24 1.00000 1y 32z + 25 -1.00000 1y 42x + 26 -1.00000 1y 42z + 27 -1.00000 1y 44z + 28 -1.00000 1y 45z + 29 1.00000 1y 47x + 30 -1.00000 1y 47z + 31 -1.00000 1y 60x + 32 1.00000 1y 61x + 33 1.00000 1z 11x + 34 -1.00000 1z 14x + 35 1.00000 1z 25y + 36 1.00000 1z 27x + 37 1.00000 1z 27y + 38 -1.00000 1z 30x + 39 1.00000 1z 30y + 40 1.00000 1z 32y + 41 -1.00000 1z 42y + 42 1.00000 1z 44x + 43 -1.00000 1z 44y + 44 -1.00000 1z 45x + 45 -1.00000 1z 45y + 46 -1.00000 1z 47y + 47 1.00000 1z 60x + 48 -1.00000 1z 61x + 49 -1.00000 9x 6y + 50 -1.00000 9x 6z + 51 1.00000 9x 8y + 52 1.00000 9x 8z + 53 1.00000 9x 22y + 54 -1.00000 9x 22z + 55 -1.00000 9x 24y + 56 1.00000 9x 24z + 57 -1.00000 9x 34y + 58 1.00000 9x 36y + 59 -1.00000 9x 37z + 60 1.00000 9x 39z + 61 1.00000 9x 50y + 62 -1.00000 9x 52y + 63 -1.00000 9x 53z + 64 1.00000 9x 55z + 65 -1.00000 9y 6x + 66 1.00000 9y 8x + 67 1.00000 9y 22x + 68 -1.00000 9y 24x + 69 -1.00000 9y 34x + 70 -1.00000 9y 34z + 71 1.00000 9y 36x + 72 -1.00000 9y 36z + 73 -1.00000 9y 37z + 74 -1.00000 9y 39z + 75 1.00000 9y 50x + 76 1.00000 9y 50z + 77 -1.00000 9y 52x + 78 1.00000 9y 52z + 79 1.00000 9y 53z + 80 1.00000 9y 55z + 81 -1.00000 9z 6x + 82 1.00000 9z 8x + 83 -1.00000 9z 22x + 84 1.00000 9z 24x + 85 -1.00000 9z 34y + 86 -1.00000 9z 36y + 87 -1.00000 9z 37x + 88 -1.00000 9z 37y + 89 1.00000 9z 39x + 90 -1.00000 9z 39y + 91 1.00000 9z 50y + 92 1.00000 9z 52y + 93 -1.00000 9z 53x + 94 1.00000 9z 53y + 95 1.00000 9z 55x + 96 1.00000 9z 55y + + # FC2_18 48 -5.0660832e-04 + 1 1.00000 1x 25x + 2 1.00000 1x 27x + 3 1.00000 1x 30x + 4 1.00000 1x 32x + 5 1.00000 1x 42x + 6 1.00000 1x 44x + 7 1.00000 1x 45x + 8 1.00000 1x 47x + 9 1.00000 1y 11y + 10 1.00000 1y 14y + 11 1.00000 1y 27y + 12 1.00000 1y 30y + 13 1.00000 1y 44y + 14 1.00000 1y 45y + 15 1.00000 1y 60y + 16 1.00000 1y 61y + 17 1.00000 1z 11z + 18 1.00000 1z 14z + 19 1.00000 1z 25z + 20 1.00000 1z 32z + 21 1.00000 1z 42z + 22 1.00000 1z 47z + 23 1.00000 1z 60z + 24 1.00000 1z 61z + 25 1.00000 9x 34x + 26 1.00000 9x 36x + 27 1.00000 9x 37x + 28 1.00000 9x 39x + 29 1.00000 9x 50x + 30 1.00000 9x 52x + 31 1.00000 9x 53x + 32 1.00000 9x 55x + 33 1.00000 9y 6y + 34 1.00000 9y 8y + 35 1.00000 9y 22y + 36 1.00000 9y 24y + 37 1.00000 9y 37y + 38 1.00000 9y 39y + 39 1.00000 9y 53y + 40 1.00000 9y 55y + 41 1.00000 9z 6z + 42 1.00000 9z 8z + 43 1.00000 9z 22z + 44 1.00000 9z 24z + 45 1.00000 9z 34z + 46 1.00000 9z 36z + 47 1.00000 9z 50z + 48 1.00000 9z 52z + + # FC2_19 48 -4.2418102e-04 + 1 1.00000 1x 25z + 2 1.00000 1x 27y + 3 -1.00000 1x 30y + 4 -1.00000 1x 32z + 5 1.00000 1x 42z + 6 -1.00000 1x 44y + 7 1.00000 1x 45y + 8 -1.00000 1x 47z + 9 1.00000 1y 11z + 10 1.00000 1y 14z + 11 1.00000 1y 27x + 12 -1.00000 1y 30x + 13 -1.00000 1y 44x + 14 1.00000 1y 45x + 15 -1.00000 1y 60z + 16 -1.00000 1y 61z + 17 1.00000 1z 11y + 18 1.00000 1z 14y + 19 1.00000 1z 25x + 20 -1.00000 1z 32x + 21 1.00000 1z 42x + 22 -1.00000 1z 47x + 23 -1.00000 1z 60y + 24 -1.00000 1z 61y + 25 1.00000 9x 34z + 26 -1.00000 9x 36z + 27 1.00000 9x 37y + 28 -1.00000 9x 39y + 29 1.00000 9x 50z + 30 -1.00000 9x 52z + 31 -1.00000 9x 53y + 32 1.00000 9x 55y + 33 1.00000 9y 6z + 34 1.00000 9y 8z + 35 -1.00000 9y 22z + 36 -1.00000 9y 24z + 37 1.00000 9y 37x + 38 -1.00000 9y 39x + 39 -1.00000 9y 53x + 40 1.00000 9y 55x + 41 1.00000 9z 6y + 42 1.00000 9z 8y + 43 -1.00000 9z 22y + 44 -1.00000 9z 24y + 45 1.00000 9z 34x + 46 -1.00000 9z 36x + 47 1.00000 9z 50x + 48 -1.00000 9z 52x + + # FC2_20 48 -7.4084169e-04 + 1 1.00000 1x 20x + 2 1.00000 1x 21x + 3 1.00000 1x 22x + 4 1.00000 1x 24x + 5 1.00000 1x 52x + 6 1.00000 1x 53x + 7 1.00000 1x 54x + 8 1.00000 1x 56x + 9 1.00000 1y 20y + 10 1.00000 1y 24y + 11 1.00000 1y 35y + 12 1.00000 1y 36y + 13 1.00000 1y 39y + 14 1.00000 1y 40y + 15 1.00000 1y 52y + 16 1.00000 1y 56y + 17 1.00000 1z 21z + 18 1.00000 1z 22z + 19 1.00000 1z 35z + 20 1.00000 1z 36z + 21 1.00000 1z 39z + 22 1.00000 1z 40z + 23 1.00000 1z 53z + 24 1.00000 1z 54z + 25 1.00000 9x 28x + 26 1.00000 9x 29x + 27 1.00000 9x 30x + 28 1.00000 9x 32x + 29 1.00000 9x 60x + 30 1.00000 9x 61x + 31 1.00000 9x 62x + 32 1.00000 9x 64x + 33 1.00000 9y 28y + 34 1.00000 9y 32y + 35 1.00000 9y 43y + 36 1.00000 9y 44y + 37 1.00000 9y 47y + 38 1.00000 9y 48y + 39 1.00000 9y 60y + 40 1.00000 9y 64y + 41 1.00000 9z 29z + 42 1.00000 9z 30z + 43 1.00000 9z 43z + 44 1.00000 9z 44z + 45 1.00000 9z 47z + 46 1.00000 9z 48z + 47 1.00000 9z 61z + 48 1.00000 9z 62z + + # FC2_21 48 1.3336277e-03 + 1 1.00000 1x 20y + 2 1.00000 1x 21z + 3 -1.00000 1x 22z + 4 -1.00000 1x 24y + 5 -1.00000 1x 52y + 6 -1.00000 1x 53z + 7 1.00000 1x 54z + 8 1.00000 1x 56y + 9 1.00000 1y 20x + 10 -1.00000 1y 24x + 11 1.00000 1y 35z + 12 -1.00000 1y 36z + 13 -1.00000 1y 39z + 14 1.00000 1y 40z + 15 -1.00000 1y 52x + 16 1.00000 1y 56x + 17 1.00000 1z 21x + 18 -1.00000 1z 22x + 19 1.00000 1z 35y + 20 -1.00000 1z 36y + 21 -1.00000 1z 39y + 22 1.00000 1z 40y + 23 -1.00000 1z 53x + 24 1.00000 1z 54x + 25 1.00000 9x 28y + 26 1.00000 9x 29z + 27 -1.00000 9x 30z + 28 -1.00000 9x 32y + 29 -1.00000 9x 60y + 30 -1.00000 9x 61z + 31 1.00000 9x 62z + 32 1.00000 9x 64y + 33 1.00000 9y 28x + 34 -1.00000 9y 32x + 35 1.00000 9y 43z + 36 -1.00000 9y 44z + 37 -1.00000 9y 47z + 38 1.00000 9y 48z + 39 -1.00000 9y 60x + 40 1.00000 9y 64x + 41 1.00000 9z 29x + 42 -1.00000 9z 30x + 43 1.00000 9z 43y + 44 -1.00000 9z 44y + 45 -1.00000 9z 47y + 46 1.00000 9z 48y + 47 -1.00000 9z 61x + 48 1.00000 9z 62x + + # FC2_22 96 -1.7727737e-04 + 1 1.00000 1x 20z + 2 1.00000 1x 21y + 3 -1.00000 1x 22y + 4 -1.00000 1x 24z + 5 -1.00000 1x 35y + 6 -1.00000 1x 35z + 7 1.00000 1x 36y + 8 -1.00000 1x 36z + 9 -1.00000 1x 39y + 10 1.00000 1x 39z + 11 1.00000 1x 40y + 12 1.00000 1x 40z + 13 1.00000 1x 52z + 14 1.00000 1x 53y + 15 -1.00000 1x 54y + 16 -1.00000 1x 56z + 17 1.00000 1y 20z + 18 -1.00000 1y 21x + 19 -1.00000 1y 21z + 20 1.00000 1y 22x + 21 -1.00000 1y 22z + 22 1.00000 1y 24z + 23 1.00000 1y 35x + 24 -1.00000 1y 36x + 25 1.00000 1y 39x + 26 -1.00000 1y 40x + 27 -1.00000 1y 52z + 28 -1.00000 1y 53x + 29 1.00000 1y 53z + 30 1.00000 1y 54x + 31 1.00000 1y 54z + 32 -1.00000 1y 56z + 33 -1.00000 1z 20x + 34 -1.00000 1z 20y + 35 1.00000 1z 21y + 36 1.00000 1z 22y + 37 1.00000 1z 24x + 38 -1.00000 1z 24y + 39 1.00000 1z 35x + 40 1.00000 1z 36x + 41 -1.00000 1z 39x + 42 -1.00000 1z 40x + 43 -1.00000 1z 52x + 44 1.00000 1z 52y + 45 -1.00000 1z 53y + 46 -1.00000 1z 54y + 47 1.00000 1z 56x + 48 1.00000 1z 56y + 49 -1.00000 9x 28z + 50 -1.00000 9x 29y + 51 1.00000 9x 30y + 52 1.00000 9x 32z + 53 1.00000 9x 43y + 54 1.00000 9x 43z + 55 -1.00000 9x 44y + 56 1.00000 9x 44z + 57 1.00000 9x 47y + 58 -1.00000 9x 47z + 59 -1.00000 9x 48y + 60 -1.00000 9x 48z + 61 -1.00000 9x 60z + 62 -1.00000 9x 61y + 63 1.00000 9x 62y + 64 1.00000 9x 64z + 65 -1.00000 9y 28z + 66 1.00000 9y 29x + 67 1.00000 9y 29z + 68 -1.00000 9y 30x + 69 1.00000 9y 30z + 70 -1.00000 9y 32z + 71 -1.00000 9y 43x + 72 1.00000 9y 44x + 73 -1.00000 9y 47x + 74 1.00000 9y 48x + 75 1.00000 9y 60z + 76 1.00000 9y 61x + 77 -1.00000 9y 61z + 78 -1.00000 9y 62x + 79 -1.00000 9y 62z + 80 1.00000 9y 64z + 81 1.00000 9z 28x + 82 1.00000 9z 28y + 83 -1.00000 9z 29y + 84 -1.00000 9z 30y + 85 -1.00000 9z 32x + 86 1.00000 9z 32y + 87 -1.00000 9z 43x + 88 -1.00000 9z 44x + 89 1.00000 9z 47x + 90 1.00000 9z 48x + 91 1.00000 9z 60x + 92 -1.00000 9z 60y + 93 1.00000 9z 61y + 94 1.00000 9z 62y + 95 -1.00000 9z 64x + 96 -1.00000 9z 64y + + # FC2_23 24 5.4258083e-05 + 1 1.00000 1x 35x + 2 1.00000 1x 36x + 3 1.00000 1x 39x + 4 1.00000 1x 40x + 5 1.00000 1y 21y + 6 1.00000 1y 22y + 7 1.00000 1y 53y + 8 1.00000 1y 54y + 9 1.00000 1z 20z + 10 1.00000 1z 24z + 11 1.00000 1z 52z + 12 1.00000 1z 56z + 13 1.00000 9x 43x + 14 1.00000 9x 44x + 15 1.00000 9x 47x + 16 1.00000 9x 48x + 17 1.00000 9y 29y + 18 1.00000 9y 30y + 19 1.00000 9y 61y + 20 1.00000 9y 62y + 21 1.00000 9z 28z + 22 1.00000 9z 32z + 23 1.00000 9z 60z + 24 1.00000 9z 64z + + # FC2_24 24 3.3765873e-04 + 1 1.00000 1x 28x + 2 1.00000 1x 29x + 3 1.00000 1x 43x + 4 1.00000 1x 46x + 5 1.00000 1y 28y + 6 1.00000 1y 29y + 7 1.00000 1y 43y + 8 1.00000 1y 46y + 9 1.00000 1z 28z + 10 1.00000 1z 29z + 11 1.00000 1z 43z + 12 1.00000 1z 46z + 13 1.00000 9x 38x + 14 1.00000 9x 40x + 15 1.00000 9x 54x + 16 1.00000 9x 56x + 17 1.00000 9y 38y + 18 1.00000 9y 40y + 19 1.00000 9y 54y + 20 1.00000 9y 56y + 21 1.00000 9z 38z + 22 1.00000 9z 40z + 23 1.00000 9z 54z + 24 1.00000 9z 56z + + # FC2_25 48 -5.3798590e-04 + 1 1.00000 1x 28y + 2 -1.00000 1x 28z + 3 -1.00000 1x 29y + 4 1.00000 1x 29z + 5 -1.00000 1x 43y + 6 -1.00000 1x 43z + 7 1.00000 1x 46y + 8 1.00000 1x 46z + 9 1.00000 1y 28x + 10 -1.00000 1y 28z + 11 -1.00000 1y 29x + 12 -1.00000 1y 29z + 13 -1.00000 1y 43x + 14 1.00000 1y 43z + 15 1.00000 1y 46x + 16 1.00000 1y 46z + 17 -1.00000 1z 28x + 18 -1.00000 1z 28y + 19 1.00000 1z 29x + 20 -1.00000 1z 29y + 21 -1.00000 1z 43x + 22 1.00000 1z 43y + 23 1.00000 1z 46x + 24 1.00000 1z 46y + 25 1.00000 9x 38y + 26 1.00000 9x 38z + 27 -1.00000 9x 40y + 28 -1.00000 9x 40z + 29 -1.00000 9x 54y + 30 1.00000 9x 54z + 31 1.00000 9x 56y + 32 -1.00000 9x 56z + 33 1.00000 9y 38x + 34 1.00000 9y 38z + 35 -1.00000 9y 40x + 36 1.00000 9y 40z + 37 -1.00000 9y 54x + 38 -1.00000 9y 54z + 39 1.00000 9y 56x + 40 -1.00000 9y 56z + 41 1.00000 9z 38x + 42 1.00000 9z 38y + 43 -1.00000 9z 40x + 44 1.00000 9z 40y + 45 1.00000 9z 54x + 46 -1.00000 9z 54y + 47 -1.00000 9z 56x + 48 -1.00000 9z 56y + + # FC2_26 6 -4.3683228e-04 + 1 1.00000 1x 38x + 2 1.00000 1y 38y + 3 1.00000 1z 38z + 4 1.00000 9x 46x + 5 1.00000 9y 46y + 6 1.00000 9z 46z + diff --git a/example/Si_OpenMX/reference/si222_harm.xml.bz2 b/example/Si_OpenMX/reference/si222_harm.xml.bz2 new file mode 100644 index 00000000..884b19a8 Binary files /dev/null and b/example/Si_OpenMX/reference/si222_harm.xml.bz2 differ diff --git a/example/Si_OpenMX/si222.dat b/example/Si_OpenMX/si222.dat new file mode 100644 index 00000000..d60a1845 --- /dev/null +++ b/example/Si_OpenMX/si222.dat @@ -0,0 +1,131 @@ +# +# File Name +# + +System.CurrrentDirectory ./ # default=./ +System.Name si222 +DATA.PATH /home/tadano/src/openmx3.8/DFT_DATA13 +level.of.stdout 1 # default=1 (1-3) +level.of.fileout 0 # default=1 (0-2) + +# +# Definition of Atomic Species +# + +Species.Number 1 + + +# +# Atoms +# + +Atoms.Number 64 +Atoms.SpeciesAndCoordinates.Unit frac + +Atoms.Unitvectors.Unit Ang + + +# +# SCF or Electronic System +# +scf.XcType LDA # LDA|LSDA-CA|LSDA-PW|GGA-PBE +scf.SpinPolarization off # On|Off|NC +scf.ElectronicTemperature 300.0 # default=300 (K) +scf.energycutoff 300 # default=150 (Ry) +scf.maxIter 100 # default=40 +scf.EigenvalueSolver Band # DC|GDC|Cluster|Band +scf.lapack.dste dstevx # dstegr|dstedc|dstevx, default=dstegr +scf.Kgrid 4 4 4 # means n1 x n2 x n3 +scf.Mixing.Type rmm-diisk # Simple|Rmm-Diis|Gr-Pulay|Kerker|Rmm-Diisk +scf.Init.Mixing.Weight 0.30 # default=0.30 +scf.Min.Mixing.Weight 0.001 # default=0.001 +scf.Max.Mixing.Weight 0.700 # default=0.40 +scf.Mixing.History 10 # default=5 +scf.Mixing.StartPulay 5 # default=6 +scf.Mixing.EveryPulay 1 # default=6 +scf.criterion 1.0e-10 # default=1.0e-6 (Hartree) + + +# +# MD or Geometry Optimization +# + +MD.Type NoMD # +MD.TimeStep 1.0 +MD.Opt.DIIS.History 3 # default=3 +MD.Opt.StartDIIS 5 # default=5 +MD.Opt.EveryDIIS 200 # default=200 +MD.maxIter 1 # default=1 +#MD.Opt.criterion 1.0e-4 # default=0.0003 (Hartree/Bohr + diff --git a/example/Si_OpenMX/si_alm.in b/example/Si_OpenMX/si_alm.in new file mode 100644 index 00000000..8ad817f3 --- /dev/null +++ b/example/Si_OpenMX/si_alm.in @@ -0,0 +1,89 @@ +&general + PREFIX = si222 + MODE = suggest + NAT = 64; NKD = 1 + KD = Si +/ + +&interaction + NORDER = 1 +/ + +&cutoff + Si-Si None 7.6 +/ + +&cell +20.43323064935040468756 +1.0 0.0 0.0 +0.0 1.0 0.0 +0.0 0.0 1.0 +/ + +&position +1 0.000000000000000 0.000000000000000 0.000000000000000 +1 0.000000000000000 0.000000000000000 0.500000000000000 +1 0.000000000000000 0.250000000000000 0.250000000000000 +1 0.000000000000000 0.250000000000000 0.750000000000000 +1 0.000000000000000 0.500000000000000 0.000000000000000 +1 0.000000000000000 0.500000000000000 0.500000000000000 +1 0.000000000000000 0.750000000000000 0.250000000000000 +1 0.000000000000000 0.750000000000000 0.750000000000000 +1 0.125000000000000 0.125000000000000 0.125000000000000 +1 0.125000000000000 0.125000000000000 0.625000000000000 +1 0.125000000000000 0.375000000000000 0.375000000000000 +1 0.125000000000000 0.375000000000000 0.875000000000000 +1 0.125000000000000 0.625000000000000 0.125000000000000 +1 0.125000000000000 0.625000000000000 0.625000000000000 +1 0.125000000000000 0.875000000000000 0.375000000000000 +1 0.125000000000000 0.875000000000000 0.875000000000000 +1 0.250000000000000 0.000000000000000 0.250000000000000 +1 0.250000000000000 0.000000000000000 0.750000000000000 +1 0.250000000000000 0.250000000000000 0.000000000000000 +1 0.250000000000000 0.250000000000000 0.500000000000000 +1 0.250000000000000 0.500000000000000 0.250000000000000 +1 0.250000000000000 0.500000000000000 0.750000000000000 +1 0.250000000000000 0.750000000000000 0.000000000000000 +1 0.250000000000000 0.750000000000000 0.500000000000000 +1 0.375000000000000 0.125000000000000 0.375000000000000 +1 0.375000000000000 0.125000000000000 0.875000000000000 +1 0.375000000000000 0.375000000000000 0.125000000000000 +1 0.375000000000000 0.375000000000000 0.625000000000000 +1 0.375000000000000 0.625000000000000 0.375000000000000 +1 0.375000000000000 0.625000000000000 0.875000000000000 +1 0.375000000000000 0.875000000000000 0.125000000000000 +1 0.375000000000000 0.875000000000000 0.625000000000000 +1 0.500000000000000 0.000000000000000 0.000000000000000 +1 0.500000000000000 0.000000000000000 0.500000000000000 +1 0.500000000000000 0.250000000000000 0.250000000000000 +1 0.500000000000000 0.250000000000000 0.750000000000000 +1 0.500000000000000 0.500000000000000 0.000000000000000 +1 0.500000000000000 0.500000000000000 0.500000000000000 +1 0.500000000000000 0.750000000000000 0.250000000000000 +1 0.500000000000000 0.750000000000000 0.750000000000000 +1 0.625000000000000 0.125000000000000 0.125000000000000 +1 0.625000000000000 0.125000000000000 0.625000000000000 +1 0.625000000000000 0.375000000000000 0.375000000000000 +1 0.625000000000000 0.375000000000000 0.875000000000000 +1 0.625000000000000 0.625000000000000 0.125000000000000 +1 0.625000000000000 0.625000000000000 0.625000000000000 +1 0.625000000000000 0.875000000000000 0.375000000000000 +1 0.625000000000000 0.875000000000000 0.875000000000000 +1 0.750000000000000 0.000000000000000 0.250000000000000 +1 0.750000000000000 0.000000000000000 0.750000000000000 +1 0.750000000000000 0.250000000000000 0.000000000000000 +1 0.750000000000000 0.250000000000000 0.500000000000000 +1 0.750000000000000 0.500000000000000 0.250000000000000 +1 0.750000000000000 0.500000000000000 0.750000000000000 +1 0.750000000000000 0.750000000000000 0.000000000000000 +1 0.750000000000000 0.750000000000000 0.500000000000000 +1 0.875000000000000 0.125000000000000 0.375000000000000 +1 0.875000000000000 0.125000000000000 0.875000000000000 +1 0.875000000000000 0.375000000000000 0.125000000000000 +1 0.875000000000000 0.375000000000000 0.625000000000000 +1 0.875000000000000 0.625000000000000 0.375000000000000 +1 0.875000000000000 0.625000000000000 0.875000000000000 +1 0.875000000000000 0.875000000000000 0.125000000000000 +1 0.875000000000000 0.875000000000000 0.625000000000000 +/ + diff --git a/example/Si_OpenMX/si_phband.in b/example/Si_OpenMX/si_phband.in new file mode 100644 index 00000000..33ba655d --- /dev/null +++ b/example/Si_OpenMX/si_phband.in @@ -0,0 +1,22 @@ +&general + PREFIX = si222 + MODE = phonons + FCSXML = si222.xml + + NKD = 1; KD = Si +/ + +&cell + 10.21661532467520234378 + 0.0 0.5 0.5 + 0.5 0.0 0.5 + 0.5 0.5 0.0 +/ + +&kpoint + 1 # KPMODE = 1: line mode + G 0.0 0.0 0.0 X 0.5 0.5 0.0 51 + X 0.5 0.5 1.0 G 0.0 0.0 0.0 51 + G 0.0 0.0 0.0 L 0.5 0.5 0.5 51 +/ + diff --git a/external/combination.hpp b/external/combination.hpp index 4ad28b34..c3ee23fc 100644 --- a/external/combination.hpp +++ b/external/combination.hpp @@ -388,7 +388,7 @@ prev_combination_counts(BidirectionalIterator first, BidirectionalIterator current = --last; while (current != first && *(--current) == 0) { } - if (current == last || current == first && *current == 0) { + if (current == last || (current == first && *current == 0)) { if (first != last) std::iter_swap(first, last); return false; diff --git a/include/mathfunctions.h b/include/mathfunctions.h index 26c0ad6e..882d19ea 100644 --- a/include/mathfunctions.h +++ b/include/mathfunctions.h @@ -12,6 +12,7 @@ #include #include +#include template inline void matmul3(T ret[3][3], const T amat[3][3], const T bmat[3][3]) { @@ -42,7 +43,7 @@ inline void transpose3(double ret[3][3], const double mat[3][3]) } } -inline void rotvec(double vec_out[3], double vec_in[3], double mat[3][3], char mode = 'N') +inline void rotvec(double vec_out[3], double vec_in[3], const double mat[3][3], char mode = 'N') { // Perform matrix x vector multiplication. // @@ -100,7 +101,7 @@ inline void rotvec(double vec_out[3], double vec_in[3], double **mat, char mode } } -inline void invmat3(double invmat[3][3], double mat[3][3]) +inline void invmat3(double invmat[3][3], const double mat[3][3]) { unsigned int i, j; double det; @@ -172,4 +173,40 @@ inline void invmat3_i(int invmat[3][3], int mat[3][3]) inline int nint(double x) { return int(x + 0.5 - (x < 0.0)); -} \ No newline at end of file +} + +template +void insort(int n, T *arr) +{ + int i, j; + T tmp; + + for (i = 1; i < n; ++i) { + tmp = arr[i]; + for (j = i - 1; j >= 0 && arr[j] > tmp; --j) { + arr[j + 1] = arr[j]; + } + arr[j + 1] = tmp; + } +} + +inline void sort_tail(const int n, int *arr) +{ + int i, m; + + m = n - 1; + int *ind_tmp; + + ind_tmp = new int[m]; + + for (i = 0; i < m; ++i) { + ind_tmp[i] = arr[i + 1]; + } + + insort(m, ind_tmp); + + for (i = 0; i < m; ++i) { + arr[i + 1] = ind_tmp[i]; + } + delete [] ind_tmp; +} diff --git a/include/version.h b/include/version.h index 866d08e6..f7b4af8e 100644 --- a/include/version.h +++ b/include/version.h @@ -12,4 +12,4 @@ #include -static const std::string ALAMODE_VERSION = "1.0.2"; +static const std::string ALAMODE_VERSION = "1.1.0"; diff --git a/include/xml_parser.h b/include/xml_parser.h index 77a4bffb..7dee4f06 100644 --- a/include/xml_parser.h +++ b/include/xml_parser.h @@ -15,7 +15,7 @@ #include #include -inline std::string get_value_from_xml(boost::property_tree::ptree pt_in, std::string str) +inline std::string get_value_from_xml(const boost::property_tree::ptree &pt_in, std::string str) { if (boost::optional str_entry = pt_in.get_optional(str)) { return str_entry.get(); diff --git a/tools/Makefile b/tools/Makefile index 28dec58b..705f7b7c 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -8,10 +8,13 @@ #Intel compiler #CXX = icpc -# OSX +# OSX (gcc) CXX = g++-8 -CXXFLAGS = -O2 +# OSX (clang) +#CXX = g++ + +CXXFLAGS = -O2 -std=c++11 # Add the directory containing boost header files here INCLUDE = -I../include -I$(HOME)/include diff --git a/tools/README.md b/tools/README.md index 9d2c4752..8ff6456a 100644 --- a/tools/README.md +++ b/tools/README.md @@ -6,6 +6,7 @@ Each Python scripts does the followings: * extract.py : script to extract atomic displacements, forces, and total energies from output files. * plotband.py : script for visualizing phonon bands * plotdos.py : script for visualizing phonon DOS +* scph_to_qefc.py : script to create a new Quantum-ESPRESSO force constant file (*.fc) with anharmonic correction. To use the scripts, Python environment (+ Numpy) is necessary. Matplotlib is also required for plotband.py and plotdos.py. diff --git a/tools/analyze_phonons.cpp b/tools/analyze_phonons.cpp index e9352dc9..b960eb89 100644 --- a/tools/analyze_phonons.cpp +++ b/tools/analyze_phonons.cpp @@ -18,7 +18,8 @@ using namespace std; -int main(int argc, char *argv[]) +int main(int argc, + char *argv[]) { string str; @@ -438,7 +439,8 @@ void calc_tau(int itemp) } } -void calc_tau_temp(int target_k, int target_s) +void calc_tau_temp(int target_k, + int target_s) { double vel_norm; @@ -523,7 +525,9 @@ void calc_kappa() } -void calc_kappa_cumulative(double max_length, double delta_length, int itemp) +void calc_kappa_cumulative(double max_length, + double delta_length, + int itemp) { int nlength = static_cast(max_length / delta_length); double length; @@ -594,7 +598,10 @@ void calc_kappa_cumulative(double max_length, double delta_length, int itemp) } } -void calc_kappa_cumulative2(double max_length, double delta_length, int itemp, int flag[3]) +void calc_kappa_cumulative2(double max_length, + double delta_length, + int itemp, + int flag[3]) { int nlength = static_cast(max_length / delta_length); double length; @@ -742,7 +749,10 @@ void calc_kappa_boundary(const double len_boundary) deallocate(kappa); } -void calc_kappa_boundary2(double max_length, double delta_length, int itemp, int flag[3]) +void calc_kappa_boundary2(double max_length, + double delta_length, + int itemp, + int flag[3]) { int nlength = static_cast(max_length / delta_length); double length; @@ -843,7 +853,8 @@ int locate_tag(string key) return ret; } -double Cv(double omega, double temp) +double Cv(double omega, + double temp) { double x; @@ -854,8 +865,11 @@ double Cv(double omega, double temp) } void update_tau_isotope(const std::string file, - double **omega, double ***tau, - const int nt, const int nk, const int ns) + double **omega, + double ***tau, + const int nt, + const int nk, + const int ns) { int i; int ik, is, jk, js; @@ -920,8 +934,11 @@ void update_tau_isotope(const std::string file, } -void average_gamma_at_degenerate_point(double **e, double ***tau, - const int nt, const int nk, const int ns) +void average_gamma_at_degenerate_point(double **e, + double ***tau, + const int nt, + const int nk, + const int ns) { int ideg, is; double omega_prev, omega_now; @@ -979,8 +996,10 @@ void average_gamma_at_degenerate_point(double **e, double ***tau, } -void average_gamma_isotope_at_degenerate_point(double **e, double **tau, - const int nk, const int ns) +void average_gamma_isotope_at_degenerate_point(double **e, + double **tau, + const int nk, + const int ns) { int ideg, is; double omega_prev, omega_now; diff --git a/tools/analyze_phonons.h b/tools/analyze_phonons.h index 2e313f48..0aeb272e 100644 --- a/tools/analyze_phonons.h +++ b/tools/analyze_phonons.h @@ -43,22 +43,40 @@ int isotope; bool classical; void calc_tau(int); -void calc_tau_temp(int, int); +void calc_tau_temp(int, + int); void calc_kappa(); -void calc_kappa_cumulative(double, double, int); -void calc_kappa_cumulative2(double, double, int, int [3]); +void calc_kappa_cumulative(double, + double, + int); +void calc_kappa_cumulative2(double, + double, + int, + int [3]); void calc_kappa_boundary(const double); -void calc_kappa_boundary2(double, double, int, int [3]); -double Cv(double, double); - -void average_gamma_at_degenerate_point(double **, double ***, - const int, const int, const int); -void average_gamma_isotope_at_degenerate_point(double **, double **, - const int, const int); +void calc_kappa_boundary2(double, + double, + int, + int [3]); +double Cv(double, + double); + +void average_gamma_at_degenerate_point(double **, + double ***, + const int, + const int, + const int); +void average_gamma_isotope_at_degenerate_point(double **, + double **, + const int, + const int); void update_tau_isotope(const std::string, - double **, double ***, - const int, const int, const int); + double **, + double ***, + const int, + const int, + const int); static const double Ryd_to_kayser = Hz_to_kayser / time_ry; static const double kayser_to_Ryd = 1.0 / Ryd_to_kayser; diff --git a/tools/displace.py b/tools/displace.py index 1315bbc2..2190c10d 100755 --- a/tools/displace.py +++ b/tools/displace.py @@ -16,8 +16,14 @@ Input file generator for displaced configurations. """ +from __future__ import print_function import optparse import numpy as np +import interface.VASP as vasp +import interface.QE as qe +import interface.xTAPP as xtapp +import interface.OpenMX as openmx +import interface.LAMMPS as lammps usage = "usage: %prog [options] file.pattern_HARMONIC file.pattern_ANHARM3 ... \n \ file.pattern_* can be generated by 'alm' with MODE = suggest." @@ -44,927 +50,11 @@ metavar='orig.lammps', help="LAMMPS structure file with equilibrium atomic positions (default: None)") -# Functions for VASP - - -def read_POSCAR(file_in): - - file_pos = open(file_in, 'r') - - file_pos.readline() - a = float(file_pos.readline().rstrip()) - lavec = np.zeros((3, 3)) - - for i in range(3): - arr = file_pos.readline().rstrip().split() - if len(arr) != 3: - print("Could not read POSCAR properly") - exit(1) - - for j in range(3): - lavec[i, j] = a * float(arr[j]) - - lavec = lavec.transpose() - invlavec = np.linalg.inv(lavec) - - elements = file_pos.readline().rstrip().split() - - if elements[0].isdigit(): - nat_elem = [int(tmp) for tmp in elements] - elements = [] - - else: - nat_elem = [int(tmp) for tmp in file_pos.readline().rstrip().split()] - - nat = np.sum(nat_elem) - basis = file_pos.readline().rstrip() - x = np.zeros((nat, 3)) - - for i in range(nat): - arr = file_pos.readline().rstrip().split() - for j in range(3): - x[i][j] = float(arr[j]) - - if basis == "Direct" or basis == "direct" or basis == "D" or basis == "d": - xf = x - else: - xf = np.dot(x, invlavec) - - file_pos.close() - - return lavec, invlavec, elements, nat_elem, xf - - -def write_POSCAR(prefix, counter, header, nzerofills, - lavec, elems, nat, disp, coord): - - filename = prefix + str(counter).zfill(nzerofills) + ".POSCAR" - f = open(filename, 'w') - f.write("%s\n" % header) - f.write("%s\n" % "1.0") - - for i in range(3): - f.write("%20.15f %20.15f %20.15f\n" % (lavec[0][i], - lavec[1][i], - lavec[2][i])) - - for i in range(len(elems)): - f.write("%s " % elems[i]) - if len(elems) > 0: - f.write("\n") - - for i in range(len(nat)): - f.write("%d " % nat[i]) - f.write("\n") - - f.write("Direct\n") - - for i in range(len(disp)): - for j in range(3): - f.write("%20.15f" % (coord[i][j] + disp[i][j])) - f.write("\n") - f.close() - - -# Functions for QE - -def get_namelist(file_in, namelist_tag): - - list_out = [] - flag_add = False - - with open(file_in) as openfileobject: - for line in openfileobject: - line_upper = line.upper() - if namelist_tag in line_upper: - flag_add = True - list_out.append(line) - elif line.strip() == "/": - flag_add = False - elif flag_add: - list_out.append(line) - - if len(list_out) == 0: - print("%s field not found" % namelist_tag) - exit(1) - - list_out.append("/\n") - return list_out - - -def gen_lattice_vector(ibrav, celldm, list_CELL_PARAMETERS): - """. - - Computer lattice vector in units of Angstrom for given ibrav and celldm. - Doc/INPUT_PW.txt was used as a reference. - """ - import math - - Bohr_to_angstrom = 0.5291772108 - - lavec = np.zeros((3, 3)) - - if ibrav == 0: - - if list_CELL_PARAMETERS is None: - print("CELL_PARAMETERS must be given when ibrav = 0.") - exit(1) - - else: - for i in range(3): - lavec[i][:] = [float(entry) for entry in - list_CELL_PARAMETERS[i + 1].rstrip().split()] - - lavec = np.array(lavec) - - mode = list_CELL_PARAMETERS[0].rstrip().split() - - if len(mode) == 1: - print("Error : Please specify either alat, bohr, or angstrom for CELL_PARAMETERS") - exit(1) - else: - mode_str = mode[1].lower() - - if "alat" in mode_str: - - if not celldm[0]: - print("celldm(1) must be given when 'alat' is used for CELL_PARAMETERS") - exit(1) - - for i in range(3): - for j in range(3): - lavec[i][j] *= celldm[0] - - elif "angstrom" in mode_str: - - for i in range(3): - for j in range(3): - lavec[i][j] /= Bohr_to_angstrom - - elif "bohr" not in mode_str: - - print("Error : Invalid option for CELL_PARAMETERS: %s" % mode[1]) - exit(1) - - elif ibrav == 1: - - if not celldm[0]: - print("celldm(1) must be given when ibrav = 1.") - exit(1) - - else: - a = celldm[0] - lavec = np.array([[a, 0.0, 0.0], - [0.0, a, 0.0], - [0.0, 0.0, a]]) - - elif ibrav == 2: - - if not celldm[0]: - print("celldm(1) must be given when ibrav = 2.") - exit(1) - - else: - a = celldm[0] / 2.0 - lavec = np.array([[-a, 0.0, a], - [0.0, a, a], - [-a, a, 0.0]]) - - elif ibrav == 3: - - if not celldm[0]: - print("celldm(1) must be given when ibrav = 3.") - exit(1) - - else: - a = celldm[0] / 2.0 - lavec = np.array([[a, a, a], - [-a, a, a], - [-a, -a, a]]) - - elif ibrav == 4: - - if not celldm[0] or not celldm[2]: - print("celldm(1) and celldm(3) must be given when ibrav = 4.") - exit(1) - - else: - a = celldm[0] - c = celldm[0] * celldm[2] - lavec = np.array([[a, 0.0, 0.0], - [-0.5 * a, math.sqrt(3.) / 2.0 * a, 0.0], - [0.0, 0.0, c]]) - - elif ibrav == 5 or ibrav == -5: - - if not celldm[0] or not celldm[3]: - print("celldm(1) and celldm(4) must be given when ibrav = 5, -5.") - exit(1) - - else: - a = celldm[0] - cosalpha = celldm[3] - tx = a * math.sqrt((1.0 - cosalpha) / 2.) - ty = a * math.sqrt((1.0 - cosalpha) / 6.) - tz = a * math.sqrt((1.0 + 2.0 * cosalpha) / 3.) - - if ibrav == 5: - lavec = np.array([[tx, -ty, tz], - [0.0, 2.0 * ty, tz], - [-tx, -ty, tz]]) - - else: - a_prime = a / math.sqrt(3.0) - u = tz - 2.0 * math.sqrt(2.0) * ty - v = tz + math.sqrt(2.0) * ty - - u *= a_prime - v *= a_prime - - lavec = np.array([[u, v, v], - [v, u, v], - [v, v, u]]) - - elif ibrav == 6: - - if not celldm[0] or not celldm[2]: - print("celldm(1) and celldm(3) must be given when ibrav = 6.") - exit(1) - - else: - a = celldm[0] - c = celldm[0] * celldm[2] - lavec = np.array([[a, 0.0, 0.0], - [0.0, a, 0.0], - [0.0, 0.0, c]]) - - elif ibrav == 7: - - if not celldm[0] or not celldm[2]: - print("celldm(1) and celldm(3) must be given when ibrav = 7.") - exit(1) - - else: - a = celldm[0] - c = celldm[0] * celldm[2] - lavec = np.array([[a / 2.0, -a / 2.0, c / 2.0], - [a / 2.0, a / 2.0, c / 2.0], - [-a / 2.0, -a / 2.0, c / 2.0]]) - - elif ibrav == 8: - - if not celldm[0] or not celldm[1] or not celldm[2]: - print("celldm(1), celldm(2), and celldm(3) must be given\ - when ibrav = 8.") - exit(1) - - else: - a = celldm[0] - b = celldm[0] * celldm[1] - c = celldm[0] * celldm[2] - - lavec = np.array([[a, 0.0, 0.0], - [0.0, b, 0.0], - [0.0, 0.0, c]]) - - elif ibrav == 9 or ibrav == -9: - - if not celldm[0] or not celldm[1] or not celldm[2]: - print("celldm(1), celldm(2), and celldm(3) must be given\ - when ibrav = 9 or -9.") - exit(1) - - else: - a = celldm[0] - b = celldm[0] * celldm[1] - c = celldm[0] * celldm[2] - - if ibrav == 9: - lavec = np.array([[a / 2., b / 2., 0.0], - [-a / 2., b / 2., 0.0], - [0.0, 0.0, c]]) - else: - lavec = np.array([[a / 2., -b / 2., 0.0], - [a / 2., b / 2., 0.0], - [0.0, 0.0, c]]) - - elif ibrav == 10: - - if not celldm[0] or not celldm[1] or not celldm[2]: - print("celldm(1), celldm(2), and celldm(3) must be given\ - when ibrav = 10.") - exit(1) - - else: - a = celldm[0] / 2.0 - b = celldm[0] * celldm[1] / 2.0 - c = celldm[0] * celldm[2] / 2.0 - lavec = np.array([[a, 0.0, c], - [a, b, 0.0], - [0.0, b, c]]) - - elif ibrav == 11: - - if not celldm[0] or not celldm[1] or not celldm[2]: - print("celldm(1), celldm(2), and celldm(3) must be given\ - when ibrav = 11.") - exit(1) - - else: - a = celldm[0] / 2.0 - b = celldm[0] * celldm[1] / 2.0 - c = celldm[0] * celldm[2] / 2.0 - lavec = np.array([[a, b, c], - [-a, b, c], - [-a, -b, c]]) - - elif ibrav == 12: - - if not celldm[0] or not celldm[1] or not celldm[2] or \ - not celldm[3]: - print("celldm(1), celldm(2), celldm(3), and celldm(4)\ - must be given when ibrav = 12.") - exit(1) - - else: - a = celldm[0] - b = celldm[0] * celldm[1] - c = celldm[0] * celldm[2] - gamma = math.acos(celldm[3]) - lavec = np.array([[a, 0.0, 0.0], - [b * math.cos(gamma), b * math.sin(gamma), 0.0], - [0.0, 0.0, c]]) - - elif ibrav == -12: - - if not celldm[0] or not celldm[1] or not celldm[2] or \ - not celldm[4]: - print("celldm(1), celldm(2), celldm(3), and celldm(5)\ - must be given when ibrav = -12.") - exit(1) - - else: - a = celldm[0] - b = celldm[0] * celldm[1] - c = celldm[0] * celldm[2] - beta = math.acos(celldm[4]) - lavec = np.array([[a, 0.0, 0.0], - [0.0, b, 0.0], - [c * math.cos(beta), 0.0, c * math.sin(beta)]]) - - elif ibrav == 13: - - if not celldm[0] or not celldm[1] or not celldm[2] or\ - not celldm[3]: - print("celldm(1), celldm(2), celldm(3), and celldm(4)\ - must be given when ibrav = 13.") - exit(1) - - else: - a = celldm[0] - b = celldm[0] * celldm[1] - c = celldm[0] * celldm[2] - gamma = math.acos(celldm[3]) - lavec = np.array([[a / 2.0, 0.0, -c / 2.0], - [b * math.cos(gamma), b * math.sin(gamma), 0.0], - [a / 2.0, 0.0, c / 2.0]]) - - elif ibrav == 14: - - if not celldm[0] or not celldm[1] or not celldm[2] or \ - not celldm[3] or not celldm[4] or not celldm[5]: - print("All celldm must be given when ibrav = 14.") - exit(1) - - else: - a = celldm[0] - b = celldm[0] * celldm[1] - c = celldm[0] * celldm[2] - alpha = math.acos(celldm[3]) - beta = math.acos(celldm[4]) - gamma = math.acos(celldm[5]) - - lavec = np.array([[a, 0.0, 0.0], - [b * math.cos(gamma), b * math.sin(gamma), 0.0], - [c * math.cos(beta), - c * (math.cos(alpha) - math.cos(beta) * - math.cos(gamma)) / math.sin(gamma), - c * math.sqrt(1.0 + 2.0 * math.cos(alpha) * math.cos(beta) * math.cos(gamma) - - math.cos(alpha) ** 2 - math.cos(beta) ** 2 - math.cos(gamma) ** 2) / math.sin(gamma)]]) - - else: - - print("Invalid ibrav = %s" % ibrav) - exit(1) - - # Transpose for later use - lavec = lavec.transpose() - - # Convert to Angstrom unit - for i in range(3): - for j in range(3): - lavec[i][j] *= Bohr_to_angstrom - - return lavec - - -def get_system_info(list_in): - - list_mod = [] - - for obj in list_in: - obj_split = obj.rstrip().split(',') - for subobj in obj_split: - if subobj: - index = subobj.find('=') - if index > 0: - subobj = subobj[:index] + " = " + subobj[index + 1:] - list_mod.append(subobj) - - str_input = "" - - for entry in list_mod: - str_input += entry + " " - - entrylist = str_input.split() - - celldm = [[] for i in range(6)] - - for i in range(len(entrylist)): - - if "ibrav" in entrylist[i]: - ibrav = int(entrylist[i + 2]) - - if "nat" in entrylist[i]: - nat = int(entrylist[i + 2]) - - if "ntyp" in entrylist[i]: - ntyp = int(entrylist[i + 2]) - - if "celldm(1)" in entrylist[i]: - # Do not assign the value if the comment character '!' - # appears in front of the celldm(1) keyword - has_comment = False - for elem in list_in: - if "celldm(1)" in elem: - has_comment = ('!' == elem.strip().split()[0][0]) - - if not has_comment: - celldm[0] = float(entrylist[i + 2]) - - if "celldm(2)" in entrylist[i]: - celldm[1] = float(entrylist[i + 2]) - - if "celldm(3)" in entrylist[i]: - celldm[2] = float(entrylist[i + 2]) - - if "celldm(4)" in entrylist[i]: - celldm[3] = float(entrylist[i + 2]) - - if "celldm(5)" in entrylist[i]: - celldm[4] = float(entrylist[i + 2]) - - if "celldm(6)" in entrylist[i]: - celldm[5] = float(entrylist[i + 2]) - - return ibrav, celldm, nat, ntyp - - -def get_options(option_tag, taglists, file_in): - - list_out = [] - flag_add = False - - with open(file_in) as openfileobject: - for line in openfileobject: - - if option_tag in line: - flag_add = True - list_out.append(line) - elif len(line.split()) > 0 and line.split()[0] in taglists: - flag_add = False - elif flag_add: - list_out.append(line) - - return list_out - - -def get_fractional_coordinate(aa, N, list_in, a_Bohr): - - Bohr_to_angstrom = 0.5291772108 - - list_tmp = list_in[0].rstrip().split() - - if len(list_tmp) == 1: - print("Error : Please specify either alat, bohr, angstrom, or crystal for ATOMIC_POSITIONS") - exit(1) - else: - mode_str = list_tmp[1].lower() - - if "crystal_sg" in mode_str: - print("Error : Sorry. 'crystal_sg' is not supported in this script. Please use another option.") - exit(1) - - xtmp = np.zeros((N, 3)) - kd = [] - - for i in range(N): - list_tmp = list_in[i + 1].rstrip().split() - kd.append(list_tmp[0]) - xtmp[i][:] = [float(j) for j in list_tmp[1:4]] - - aa_inv = np.linalg.inv(aa) - - if "alat" in mode_str: - a_angstrom = a_Bohr * Bohr_to_angstrom - - for i in range(3): - for j in range(3): - aa_inv[i][j] *= a_angstrom - - for i in range(N): - xtmp[i][:] = np.dot(xtmp[i][:], aa_inv.transpose()) - - elif "bohr" in mode_str: - - for i in range(3): - for j in range(3): - aa_inv[i][j] *= Bohr_to_angstrom - - for i in range(N): - xtmp[i][:] = np.dot(xtmp[i][:], aa_inv.transpose()) - - elif "angstrom" in mode_str: - - for i in range(N): - xtmp[i][:] = np.dot(xtmp[i][:], aa_inv.transpose()) - - elif "crystal" not in mode_str: - print("Error : Invalid option for ATOMIC_POSITIONS: %s" % mode_str) - exit(1) - - return kd, xtmp - - -def read_original_QE(file_in): - - # Parse fortran namelists - list_CONTROL = get_namelist(file_in, "&CONTROL") - list_SYSTEM = get_namelist(file_in, "&SYSTEM") - list_ELECTRONS = get_namelist(file_in, "&ELECTRONS") - - # Parse general options - tags = ["ATOMIC_SPECIES", "ATOMIC_POSITIONS", "K_POINTS", - "CELL_PARAMETERS", "OCCUPATIONS", "CONSTRAINTS", "ATOMIC_FORCES"] - - list_ATOMIC_SPECIES = get_options("ATOMIC_SPECIES", tags, file_in) - list_ATOMIC_POSITIONS = get_options("ATOMIC_POSITIONS", tags, file_in) - list_K_POINTS = get_options("K_POINTS", tags, file_in) - list_CELL_PARAMETERS = get_options("CELL_PARAMETERS", tags, file_in) - list_OCCUPATIONS = get_options("OCCUPATIONS", tags, file_in) - - # Get ibrav, celldm, nat, and ntyp - # and then calculate the lattice vector - ibrav, celldm, nat, ntyp = get_system_info(list_SYSTEM) - lavec = gen_lattice_vector(ibrav, celldm, list_CELL_PARAMETERS) - lavec_inv = np.linalg.inv(lavec) - - # Get fractional coordinate - kd_symbol, x_frac = get_fractional_coordinate(lavec, - nat, - list_ATOMIC_POSITIONS, - celldm[0]) - list_namelist_merged = [] - list_namelist_merged.extend(list_CONTROL) - list_namelist_merged.extend(list_SYSTEM) - list_namelist_merged.extend(list_ELECTRONS) - - return list_namelist_merged, list_ATOMIC_SPECIES, list_K_POINTS, \ - list_CELL_PARAMETERS, list_OCCUPATIONS, \ - nat, lavec, kd_symbol, x_frac, lavec_inv - - -def generate_QE_input(prefix, suffix, counter, nzerofills, list_namelist, - list_ATOMS, list_KP, list_CELL, list_OCCU, - nat, kd_symbol, x, u): - - filename = prefix + str(counter).zfill(nzerofills) + "." + suffix - f = open(filename, 'w') - - for entry in list_namelist: - f.write(entry) - - for entry in list_ATOMS: - f.write(entry) - - f.write("ATOMIC_POSITIONS crystal\n") - for i in range(nat): - f.write("%s %20.15f %20.15f %20.15f\n" % (kd_symbol[i], - x[i][0] + u[i, 0], - x[i][1] + u[i, 1], - x[i][2] + u[i, 2])) - - for entry in list_KP: - f.write(entry) - for entry in list_CELL: - f.write(entry) - for entry in list_OCCU: - f.write(entry) - - f.write("\n") - f.close() - - -# Functions for xTAPP - -def read_tappinput(file_in): - - list_tappinput = [] - flag_add = False - - with open(file_in) as openfileobject: - for line in openfileobject: - if "main" in line and "data" in line: - flag_add = True - list_tappinput.append(line) - elif "#" in line: - flag_add = False - elif flag_add: - list_tappinput.append(line) - - if len(list_tappinput) == 0: - print("main data entry not found") - exit(1) - - list_tappinput_new = [] - - for obj in list_tappinput: - obj_split = obj.rstrip().split(',') - for subobj in obj_split: - if subobj: - list_tappinput_new.append(subobj) - - str_input = "" - - for entry in list_tappinput_new: - str_input += entry + " " - - entrylist = str_input.split() - lavec_list = [] - - a = 0.0 - nkd = 0 - nat = 0 - - # get lattice_factor - for i in range(len(entrylist)): - if "lattice_factor" in entrylist[i]: - a = float(entrylist[i + 2]) - - if "lattice_list" in entrylist[i]: - for j in range(9): - lavec_list.append(entrylist[i + j + 2]) - - if "number_element" in entrylist[i]: - nkd = int(entrylist[i + 2]) - - if "number_atom" in entrylist[i]: - nat = int(entrylist[i + 2]) - - if a == 0.0: - print("Couldn't read lattice_factor") - exit(1) - if nkd == 0: - print("Couldn't read number_element") - exit(1) - if nat == 0: - print("Couldn't read number_atom") - exit(1) - if len(lavec_list) != 9: - print("Couldn't read lattice_list") - exit(1) - - lavec = np.zeros((3, 3)) - - Bohr_to_angstrom = 0.5291772108 - a *= Bohr_to_angstrom - - for i in range(3): - for j in range(3): - lavec[j][i] = a * float(lavec_list[3 * i + j]) - - return lavec, nat, nkd, list_tappinput - - -def read_kpdata(file_in): - - list_kpoint = [] - flag_add = False - - with open(file_in) as openfileobject: - for line in openfileobject: - if "k-points" in line.rstrip(): - flag_add = True - list_kpoint.append(line) - elif "#" in line.strip(): - flag_add = False - elif flag_add: - list_kpoint.append(line) - - if len(list_kpoint) == 0: - print("k-points data entry not found") - exit(1) - - return list_kpoint - - -def read_structure_optimize(file_in): - - list_opt = [] - flag_add = False - - with open(file_in) as openfileobject: - for line in openfileobject: - if "struct_opt" in line.rstrip(): - flag_add = True - list_opt.append(line) - elif "#" in line.strip(): - flag_add = False - elif flag_add: - list_opt.append(line) - - if len(list_opt) == 0: - print("struct_opt entry not found") - exit(1) - - list_opt2 = [] - flag_add = False - - with open(file_in) as openfileobject: - for line in openfileobject: - if "str_opt_constr" in line.rstrip(): - flag_add = True - list_opt2.append(line) - elif "#" in line.strip(): - flag_add = False - elif flag_add: - list_opt2.append(line) - - if len(list_opt2) == 0: - print("str_opt_constr entry not found") - exit(1) - - return list_opt, list_opt2 - - -def read_atomdata(file_in, nat_in, nkd_in): - - list_atom = [] - flag_add = False - - with open(file_in) as openfileobject: - for line in openfileobject: - if "atom" in line and "data" in line: - flag_add = True - list_atom.append(line) - elif "#" in line.strip(): - flag_add = False - elif flag_add: - list_atom.append(line) - - if len(list_atom) == 0: - print("atom data entry not found") - exit(1) - - x_out = np.zeros((nat_in, 3), dtype=float) - kd_out = np.zeros(nat_in, dtype=int) - - for i in range(nat_in): - list_tmp = list_atom[i + nkd_in + 1].rstrip().split() - kd_out[i] = int(list_tmp[0]) - for j in range(3): - x_out[i][j] = float(list_tmp[j + 1]) - - return x_out, kd_out, list_atom - - -def read_CG(file_in): - - lavec, nat, nkd, str_tappinput = read_tappinput(file_in) - str_kpoint = read_kpdata(file_in) - str_struct_opt, str_opt_constr = read_structure_optimize(file_in) - x, kd, str_atom = read_atomdata(file_in, nat, nkd) - - str_header = "" - - for entry in str_tappinput: - str_header += entry - for entry in str_kpoint: - str_header += entry - for entry in str_struct_opt: - str_header += entry - for entry in str_opt_constr: - str_header += entry - for i in range(nkd + 1): - str_header += str_atom[i] - - lavec = np.matrix(lavec) - lavec_inv = np.array(lavec.I) - - return str_header, nat, nkd, lavec, lavec_inv, x, kd - - -def gen_CG(prefix, suffix, counter, nzerofills, str_header, - nat, kd, x, u, nsym, symop, denom_tran, has_inv): - - filename = prefix + str(counter).zfill(nzerofills) + "." + suffix - f = open(filename, 'w') - f.write("%s" % str_header) - - for i in range(nat): - f.write("%i %20.15f %20.15f %20.15f\n" % (kd[i], - x[i][0] + u[i, 0], - x[i][1] + u[i, 1], - x[i][2] + u[i, 2])) - - f.write("# symmetry data\n") - f.write("&symmetry\n") - f.write(" number_sym_op = %i\n" % nsym) - f.write(" has_inversion = %i\n" % has_inv) - f.write(" denom_trans = %i\n" % denom_tran) - f.write("/\n") - - mat_tmp = np.zeros((3, 3), dtype=int) - - for elems in symop: - for i in range(3): - for j in range(3): - mat_tmp[i][j] = elems[3 * i + j] - - mat_inv = np.matrix(mat_tmp).I - - for i in range(3): - for j in range(3): - f.write("%4i" % mat_inv[i, j]) - - f.write(" ") - for i in range(3): - f.write("%4i" % elems[9 + i]) - - f.write("\n") - - f.write("\n") - f.close() - - -# Functions for LAMMPS - -def read_lammps_structure(file_in): - - f = open(file_in, 'r') - header_comment = f.readline() - - common_settings = [] +parser.add_option('--OpenMX', + metavar='orig.dat', + help="dat file with equilibrium atomic \ + positions (default: None)") - for line in f: - if "Atoms" in line: - break - common_settings.append(line.rstrip()) - - atoms = [] - for line in f: - if line.strip(): - atoms.append(line.rstrip().split()) - - atoms = np.array(atoms) - nat = len(atoms) - kd = np.array(atoms[:,1], dtype=np.int) - x = np.array(atoms[:,2:5], dtype=np.float64) - - return common_settings, nat, x, kd - - -def write_lammps_structure(prefix, counter, header, - common_settings, nat, kd, x_cart, disp): - - filename = prefix + str(counter).zfill(nzerofills) + ".lammps" - f = open(filename, 'w') - f.write("%s\n" % header) - - for line in common_settings: - f.write("%s\n" % line) - - f.write("%s\n\n" % "Atoms") - for i in range(nat): - f.write("%5d %3d" % (i + 1, kd[i])) - for j in range(3): - f.write("%20.15f" % (x_cart[i][j] + disp[i][j])) - f.write("\n") - f.write("\n") - f.close() - - -# Other functions def parse_displacement_patterns(files_in): @@ -1002,7 +92,7 @@ def parse_displacement_patterns(files_in): pattern_set.append(disp) pattern_tmp.append(pattern_set) - print("File %s containts %i displacement patterns" \ + print("File %s containts %i displacement patterns" % (file, len(pattern_tmp))) for entry in pattern_tmp: @@ -1095,17 +185,19 @@ def get_number_of_zerofill(npattern): please type\n$ python displace.py -h") exit(1) - conditions = [options.VASP is None, + conditions = [options.VASP is None, options.QE is None, options.xTAPP is None, - options.LAMMPS is None] - + options.LAMMPS is None, + options.OpenMX is None] + if conditions.count(True) == len(conditions): - print("Error : Either --VASP, --QE, --xTAPP, --LAMMPS option must be given.") + print( + "Error : Either --VASP, --QE, --xTAPP, --LAMMPS, --OpenMX option must be given.") exit(1) elif len(conditions) - conditions.count(True) > 1: - print("Error : --VASP, --QE, --xTAPP, and --LAMMPS cannot be given simultaneously.") + print("Error : --VASP, --QE, --xTAPP, --LAMMPS, and --OpenMX cannot be given simultaneously.") exit(1) elif options.VASP: @@ -1128,6 +220,11 @@ def get_number_of_zerofill(npattern): print("--LAMMPS option is given: Generate input files for LAMMPS.") print("") + elif options.OpenMX: + code = "OpenMX" + print("--OpenMX option is given: Generate dat files for OpenMX") + print("") + # Assign the magnitude of displacements if options.mag is None: options.mag = "0.02" @@ -1160,30 +257,39 @@ def get_number_of_zerofill(npattern): elif code == "xTAPP": str_outfiles = "%s{counter}.cg" % prefix file_original = options.xTAPP - + elif code == "LAMMPS": str_outfiles = "%s{counter}.lammps" % prefix file_original = options.LAMMPS + elif code == "OpenMX": + str_outfiles = "%s{counter}.dat" % prefix + file_original = options.OpenMX + # Read the original file if code == "VASP": - aa, aa_inv, elems, nats, x_frac = read_POSCAR(file_original) + aa, aa_inv, elems, nats, x_frac = vasp.read_POSCAR(file_original) nat = np.sum(nats) elif code == "QE": list_namelist, list_ATOMIC_SPECIES, \ list_K_POINTS, list_CELL_PARAMETERS, list_OCCUPATIONS, \ - nat, lavec, kd_symbol, x_frac, aa_inv = read_original_QE( + nat, lavec, kd_symbol, x_frac, aa_inv = qe.read_original_QE( file_original) elif code == "xTAPP": - str_header, nat, nkd, aa, aa_inv, x_frac, kd = read_CG(file_original) + str_header, nat, nkd, aa, aa_inv, x_frac, kd \ + = xtapp.read_CG(file_original) suffix = "cg" elif code == "LAMMPS": - common_settings, nat, x_cart, kd = read_lammps_structure(file_original) + common_settings, nat, x_cart, kd \ + = lammps.read_lammps_structure(file_original) aa_inv = None + elif code == "OpenMX": + aa, aa_inv, nat, x_frac = openmx.read_OpenMX_input(file_original) + print("Original file : %s" % file_original) print("Output file format : %s" % str_outfiles) print("Magnitude of displacements : %s Angstrom" % disp_length) @@ -1200,15 +306,15 @@ def get_number_of_zerofill(npattern): nat, aa_inv) if code == "VASP": - write_POSCAR(prefix, counter, header, nzerofills, - aa, elems, nats, disp, x_frac) + vasp.write_POSCAR(prefix, counter, header, nzerofills, + aa, elems, nats, disp, x_frac) elif code == "QE": - generate_QE_input(prefix, suffix, counter, nzerofills, list_namelist, - list_ATOMIC_SPECIES, list_K_POINTS, - list_CELL_PARAMETERS, list_OCCUPATIONS, - nat, kd_symbol, x_frac, disp) - + qe.generate_QE_input(prefix, suffix, counter, nzerofills, list_namelist, + list_ATOMIC_SPECIES, list_K_POINTS, + list_CELL_PARAMETERS, list_OCCUPATIONS, + nat, kd_symbol, x_frac, disp) + elif code == "xTAPP": nsym = 1 symop = [] @@ -1216,12 +322,16 @@ def get_number_of_zerofill(npattern): denom_tran = 1 has_inv = 0 - gen_CG(prefix, suffix, counter, nzerofills, str_header, nat, kd, - x_frac, disp, nsym, symop, denom_tran, has_inv) + xtapp.gen_CG(prefix, suffix, counter, nzerofills, str_header, nat, kd, + x_frac, disp, nsym, symop, denom_tran, has_inv) elif code == "LAMMPS": - write_lammps_structure(prefix, counter, header, - common_settings, nat, kd, x_cart, disp) + lammps.write_lammps_structure(prefix, counter, header, nzerofills, + common_settings, nat, kd, x_cart, disp) + + elif code == "OpenMX": + openmx.write_OpenMX_input( + prefix, counter, nzerofills, disp, aa, file_original) print("") print("All input files are created.") diff --git a/tools/extract.py b/tools/extract.py index 1ea29bb3..45d63c83 100755 --- a/tools/extract.py +++ b/tools/extract.py @@ -12,6 +12,7 @@ # Please see the file 'LICENCE.txt' in the root directory # or http://opensource.org/licenses/mit-license.php for information. # + """ This python script extracts atomic displacements, atomics forces, and energies. @@ -20,25 +21,13 @@ from __future__ import print_function import numpy as np import optparse -from displace import * - -try: - try: - # cElementTree on Python 2.5+ - import xml.etree.cElementTree as etree - except ImportError: - # ElementTree on Python 2.5+ - import xml.etree.ElementTree as etree -except ImportError: - try: - # cElementTree - import cElementTree as etree - except ImportError: - # ElementTree - import elementtree.ElementTree as etree - +import interface.VASP as vasp +import interface.QE as qe +import interface.xTAPP as xtapp +import interface.OpenMX as openmx +import interface.LAMMPS as lammps -usage = "usage: %prog [options] vasprun*.xml (or *.pw.out or *.str)" +usage = "usage: %prog [options] vasprun*.xml (or *.pw.out or *.str or *.md or *.out)" parser = optparse.OptionParser(usage=usage) parser.add_option('--VASP', @@ -60,10 +49,15 @@ metavar='orig.lammps', help="LAMMPS structure file with equilibrium atomic positions (default: None)") +parser.add_option('--OpenMX', + metavar='orig.dat', + help="OpenMX dat file with equilibrium atomic \ + positions (default: None)") + parser.add_option('--get', + default="disp-force", help="specify which quantity to extract. \ - Available options are 'disp', 'force' and 'energy'.") - + Available options are 'disp-force', 'disp', 'force' and 'energy'.") parser.add_option('--unit', action="store", @@ -77,837 +71,17 @@ help="Specify an output file (either *.xml, *.pw.out, or *.str) of an\ equilibrium structure to subtract residual forces, displacements, or energies.") -# Functions for VASP (https://www.vasp.at) - - -def get_coordinate_VASP(xml_file, nat): - - x = [] - - try: - xml = etree.parse(xml_file) - root = xml.getroot() - - for elems in root.findall('calculation/structure/varray'): - str_coord = [elems2.text for elems2 in elems.findall('v')] - n = len(str_coord) - - for i in range(n): - x.extend([t for t in str_coord[i].split()]) - - return np.array(x, dtype=np.float) - - except: - print("Error in reading atomic positions from the XML file: %s" % xml_file) - - -def print_displacements_VASP(xml_files, - lavec, nat, x0, - require_conversion, - conversion_factor, - file_offset): - - x0 = np.round(x0, 8) - lavec_transpose = lavec.transpose() - vec_refold = np.vectorize(refold) - - if file_offset is None: - disp_offset = np.zeros((nat, 3)) - else: - x0_offset = get_coordinate_VASP(file_offset, nat) - try: - x0_offset = np.reshape(x0_offset, (nat, 3)) - except: - print("File %s contains too many position entries" % file_offset) - disp_offset = x0_offset - x0 - - for search_target in xml_files: - - x = get_coordinate_VASP(search_target, nat) - ndata = len(x) // (3 * nat) - x = np.reshape(x, (ndata, nat, 3)) - - for idata in range(ndata): - disp = x[idata, :, :] - x0 - disp_offset - disp = np.dot(vec_refold(disp), lavec_transpose) - - if require_conversion: - disp *= conversion_factor - - for i in range(nat): - print("%15.7F %15.7F %15.7F" % (disp[i, 0], - disp[i, 1], - disp[i, 2])) - - -def get_atomicforces_VASP(xml_file): - - f = [] - - try: - xml = etree.parse(xml_file) - root = xml.getroot() - - for elems in root.findall('calculation/varray'): - if elems.get('name') == "forces": - str_force = [elems2.text for elems2 in elems.findall('v')] - - for i in range(len(str_force)): - f.extend([t for t in str_force[i].split()]) - - return np.array(f, dtype=np.float) - - except: - print("Error in reading atomic forces from the XML file: %s" % xml_file) - - -def print_atomicforces_VASP(xml_files, - nat, - require_conversion, - conversion_factor, - file_offset): - - if file_offset is None: - force_offset = np.zeros((nat, 3)) - else: - data0 = get_atomicforces_VASP(file_offset) - try: - force_offset = np.reshape(data0, (nat, 3)) - except: - print("File %s contains too many force entries" % file_offset) - - for search_target in xml_files: - - data = get_atomicforces_VASP(search_target) - ndata = len(data) // (3 * nat) - data = np.reshape(data, (ndata, nat, 3)) - - for idata in range(ndata): - f = data[idata, :, :] - force_offset - - if require_conversion: - f *= conversion_factor - - for i in range(nat): - print("%15.8E %15.8E %15.8E" % (f[i][0], - f[i][1], - f[i][2])) - - -def get_energies_VASP(xml_file): - - etot_array = [] - ekin_array = [] - - try: - xml = etree.parse(xml_file) - root = xml.getroot() - - for elems in root.findall('calculation/energy'): - etot = 'N/A' - ekin = 'N/A' - - for elems2 in elems.findall('i'): - if elems2.get('name') == "e_fr_energy": - etot = elems2.text - if elems2.get('name') == "kinetic": - ekin = elems2.text - - etot_array.append(etot) - ekin_array.append(ekin) - - return etot_array, ekin_array - except: - print("Error in reading energies from the XML file: %s" % xml_file) - - -def print_energies_VASP(xml_files, - require_conversion, - conversion_factor, - file_offset): - - print("# Etot, Ekin") - - etot_offset = 0.0 - ekin_offset = 0.0 - - if file_offset: - etot, ekin = get_energies_VASP(file_offset) - if len(etot) > 1 or len(ekin) > 1: - print("File %s contains too many energy entries" % file_offset) - exit(1) - if etot[0] != 'N/A': - etot_offset = float(etot[0]) - if ekin[0] != 'N/A': - ekin_offset = float(ekin[0]) - - for search_target in xml_files: - - etot, ekin = get_energies_VASP(search_target) - - for i in range(len(etot)): - if etot[i] != 'N/A': - val_etot = float(etot[i]) - etot_offset - if require_conversion: - print("%15.8E" % (val_etot * conversion_factor), end=' ') - else: - print("%15.8E" % val_etot, end=' ') - else: - print("%s" % etot[i], end=' ') - - if ekin[i] != 'N/A': - val_ekin = float(ekin[i]) - ekin_offset - if require_conversion: - print("%15.8E" % (val_ekin * conversion_factor)) - else: - print("%15.8E" % val_ekin) - else: - print("%s" % ekin[i]) - -# end functions for VASP - -# Functions for Quantum-ESPRESSO (http://www.quantum-espresso.org) - - -def read_original_QE_mod(file_in): - - # Parse general options - tags = ["ATOMIC_SPECIES", "ATOMIC_POSITIONS", "K_POINTS", - "CELL_PARAMETERS", "OCCUPATIONS", "CONSTRAINTS", "ATOMIC_FORCES"] - - list_SYSTEM = get_namelist(file_in, "&SYSTEM") - list_CELL_PARAMETERS = get_options("CELL_PARAMETERS", tags, file_in) - list_ATOMIC_POSITIONS = get_options("ATOMIC_POSITIONS", tags, file_in) - - ibrav, celldm, nat, ntyp = get_system_info(list_SYSTEM) - lavec = gen_lattice_vector(ibrav, celldm, list_CELL_PARAMETERS) - kd_symbol, x0 = get_fractional_coordinate(lavec, - nat, - list_ATOMIC_POSITIONS, - celldm[0]) - - return celldm[0], lavec, nat, x0 - - -def get_coordinates_QE(pwout_file, nat): - - search_flag = "site n. atom positions (alat units)" - search_flag2 = "ATOMIC_POSITIONS (crystal)" - - x = np.zeros((nat, 3)) - - num_data_disp = 0 - basis = "" - found_tag = False - - f = open(pwout_file, 'r') - line = f.readline() - - while line: - - if search_flag in line: - found_tag = True - - for i in range(nat): - line = f.readline() - x[i][:] = [float(t) for t in line.rstrip().split()[6:9]] - - break - - line = f.readline() - - if not found_tag: - print("%s tag not found in %s" % (search_flag, pwout_file)) - exit(1) - - x_additional = [] - - # Search other entries containing atomic position - while line: - - if search_flag2 in line: - - if not basis: - basis = line.rstrip().split()[1] - - num_data_disp += 1 - - for i in range(nat): - line = f.readline() - x_additional.extend([t for t in line.rstrip().split()[1:4]]) - - line = f.readline() - - f.close() - - return x, np.array(x_additional, dtype=np.float), num_data_disp, basis - - -def print_displacements_QE(pwout_files, - alat, lavec, nat, x0, - require_conversion, - conversion_factor, - file_offset): - - import math - Bohr_to_angstrom = 0.5291772108 - vec_refold = np.vectorize(refold) - - x0 = np.round(x0, 8) - - lavec /= Bohr_to_angstrom - lavec_transpose = lavec.transpose() - lavec_transpose_inv = np.linalg.inv(lavec_transpose) - - if not alat: - # if celldm[0] is empty, calculate it from lattice vector - alat = math.sqrt(np.dot(lavec_transpose[0][:], lavec_transpose[0][:])) - - if file_offset is None: - disp_offset = np.zeros((nat, 3)) - else: - x_offset, x_tmp, ndata_offset, basis_tmp = get_coordinates_QE( - file_offset, nat) - if ndata_offset > 1: - print("File %s contains too many position entries" % file_offset) - exit(1) - else: - x_offset = alat * np.dot(x_offset, lavec_transpose_inv) - disp_offset = x_offset - x0 - - for search_target in pwout_files: - - x, x_additional, num_data_disp, basis = get_coordinates_QE( - search_target, nat) - x = alat * np.dot(x, lavec_transpose_inv) - - disp = x - x0 - disp_offset - disp = np.dot(vec_refold(disp), lavec_transpose) - - if require_conversion: - disp *= conversion_factor - - for i in range(nat): - print("%15.7F %15.7F %15.7F" % (disp[i][0], - disp[i][1], - disp[i][2])) - - if num_data_disp > 1: - - if "alat" in basis: - conversion_mat = alat * lavec_transpose_inv - elif "bohr" in basis: - conversion_mat = lavec_transpose_inv - elif "angstrom" in basis: - conversion_mat = lavec_transpose_inv / Bohr_to_angstrom - elif "crystal" in basis: - conversion_mat = np.identity(3) - else: - print("This cannot happen.") - exit(1) - - x_additional = np.reshape(x_additional, (num_data_disp, nat, 3)) - - for step in range(num_data_disp - 1): - x = x_additional[step, :, :] - x = np.dot(x, conversion_mat) - disp = x - x0 - disp_offset - disp = np.dot(vec_refold(disp), lavec_transpose) - - if require_conversion: - disp *= conversion_factor - - for i in range(nat): - print("%15.7F %15.7F %15.7F" % (disp[i][0], - disp[i][1], - disp[i][2])) - - -def get_atomicforces_QE(pwout_file): - - search_tag = "Forces acting on atoms (Ry/au):" - search_tag_QE6 = "Forces acting on atoms (cartesian axes, Ry/au):" - - found_tag = False - - f = open(pwout_file, 'r') - line = f.readline() - - force = [] - - while line: - - if search_tag in line or search_tag_QE6 in line: - found_tag = True - - f.readline() - - for i in range(nat): - line = f.readline() - force.extend([t for t in line.rstrip().split()[6:9]]) - - line = f.readline() - - f.close() - - if not found_tag: - print("following search tags not found in %s" % pwout_file) - print(search_tag) - print(search_tag_QE6) - exit(1) - - return np.array(force, dtype=np.float) - - -def print_atomicforces_QE(str_files, - nat, - require_conversion, - conversion_factor, - file_offset): - - if file_offset is None: - force_offset = np.zeros((nat, 3)) - else: - data0 = get_atomicforces_QE(file_offset) - try: - force_offset = np.reshape(data0, (nat, 3)) - except: - print("File %s contains too many force entries" % file_offset) - - for search_target in str_files: - - force = get_atomicforces_QE(search_target) - ndata = len(force) // (3 * nat) - force = np.reshape(force, (ndata, nat, 3)) - - for idata in range(ndata): - f = force[idata, :, :] - force_offset - - if require_conversion: - f *= conversion_factor - - for i in range(nat): - print("%19.11E %19.11E %19.11E" % (f[i][0], - f[i][1], - f[i][2])) - - -def get_energies_QE(pwout_file): - - search_tag = "! total energy" - - found_tag = False - - etot = [] - - with open(pwout_file) as openfileobject: - for line in openfileobject: - if search_tag in line: - etot.extend([line.rstrip().split()[4]]) - found_tag = True - - if not found_tag: - print("%s tag not found in %s" % (search_tag, search_target)) - exit(1) - - return np.array(etot, dtype=np.float) - - -def print_energies_QE(str_files, - require_conversion, - conversion_factor, - file_offset): - - if file_offset is None: - etot_offset = 0.0 - else: - data = get_energies_QE(file_offset) - if len(data) > 1: - print("File %s contains too many energy entries" % file_offset) - exit(1) - etot_offset = data[0] - - print("# Etot") - for search_target in str_files: - - etot = get_energies_QE(search_target) - - for idata in range(len(etot)): - val = etot[idata] - etot_offset - - if require_conversion: - val *= conversion_factor - - print("%19.11E" % val) - -# end functions for QE - -# Functions for xTAPP (http://xtapp.cp.is.s.u-tokyo.ac.jp) - - -def read_CG_mod(file_in): - - lavec, nat, nkd, list_dummy = read_tappinput(file_in) - x0, kd, list_dummy = read_atomdata(file_in, nat, nkd) - - return lavec, nat, x0 - - -def get_coordinates_xTAPP(str_file, nat): - - found_tag = False - f = open(str_file, 'r') - line = f.readline() - - x = [] - - while line: - - if "atom_position" in line: - found_tag = True - - for i in range(nat): - line = f.readline() - x.extend([t for t in line.rstrip().split()[1:]]) - - break - - line = f.readline() - - if not found_tag: - print("atom_position tag not found in %s" % str_file) - exit(1) - - f.close() - - return np.array(x, dtype=np.float) - - -def print_displacements_xTAPP(str_files, - lavec, nat, x0, - require_conversion, - conversion_factor, - file_offset): - - Bohr_to_angstrom = 0.5291772108 - vec_refold = np.vectorize(refold) - - lavec /= Bohr_to_angstrom - lavec_transpose = lavec.transpose() - - x0 = np.round(x0, 8) - - if file_offset is None: - disp_offset = np.zeros((nat, 3)) - else: - x0_offset = get_coordinates_xTAPP(file_offset, nat) - try: - x0_offset = np.reshape(x0_offset, (nat, 3)) - except: - print("File %s contains too many position entries" % file_offset) - disp_offset = x0_offset - x0 - - for search_target in str_files: - - x = get_coordinates_xTAPP(search_target, nat) - ndata = len(x) // (3 * nat) - x = np.reshape(x, (ndata, nat, 3)) - - for idata in range(ndata): - disp = x[idata, :, :] - x0 - disp_offset - disp = np.dot(vec_refold(disp), lavec_transpose) - - if require_conversion: - disp *= conversion_factor - - for i in range(nat): - print("%15.7F %15.7F %15.7F" % (disp[i][0], - disp[i][1], - disp[i][2])) - - -def get_atomicforces_xTAPP(str_file): - - found_tag = False - - f = open(str_file, 'r') - line = f.readline() - - force = [] - - while line: - - if "force" in line: - found_tag = True - - for i in range(nat): - line = f.readline() - force.extend([t for t in line.rstrip().split()]) - - break - - line = f.readline() - - if not found_tag: - print("force tag not found in %s" % str_file) - exit(1) - - f.close() - - return np.array(force, dtype=np.float) - - -def print_atomicforces_xTAPP(str_files, - nat, - require_conversion, - conversion_factor, - file_offset): - - if file_offset is None: - force_offset = np.zeros((nat, 3)) - else: - data = get_atomicforces_xTAPP(file_offset) - try: - force_offset = np.reshape(data, (nat, 3)) - except: - print("File %s contains too many position entries" % file_offset) - - for search_target in str_files: - - force = get_atomicforces_xTAPP(search_target) - ndata = len(force) // (3 * nat) - force = np.reshape(force, (ndata, nat, 3)) - - for idata in range(ndata): - f = force[idata, :, :] - force_offset - - if require_conversion: - f *= conversion_factor - - for i in range(nat): - print("%19.11E %19.11E %19.11E" % (f[i][0], - f[i][1], - f[i][2])) - - -def get_energies_xTAPP(str_file): - - search_tag = "total_energy" - - found_tag = False - - etot = [] - - with open(str_file) as openfileobject: - for line in openfileobject: - if search_tag in line: - energy_str = line.rstrip().split()[2] - etot.extend([energy_str[:-1]]) - found_tag = True - - if not found_tag: - print("%s tag not found in %s" % (search_tag, str_file)) - exit(1) - - return np.array(etot, dtype=np.float) - - -def print_energies_xTAPP(str_files, - require_conversion, - conversion_factor, - file_offset): - - if file_offset is None: - etot_offset = 0.0 - else: - data = get_energies_xTAPP(file_offset) - if len(data) > 1: - print("File %s contains too many energy entries" % file_offset) - exit(1) - etot_offset = data[0] - - print("# Etot") - for search_target in str_files: - - etot = get_energies_xTAPP(search_target) - - for idata in range(len(etot)): - val = etot[idata] - etot_offset - - if require_conversion: - val *= conversion_factor - - print("%19.11E" % val) - - -# end functions for xTAPP - - -# Functions for LAMMPS - - -def get_coordinate_LAMMPS(lammps_dump_file): - - add_flag = False - - coord = [] - - with open(lammps_dump_file) as f: - for line in f: - if "ITEM:" in line and "ITEM: ATOMS xu yu zu" not in line: - add_flag = False - continue - elif "ITEM: ATOMS xu yu zu" in line: - add_flag = True - continue - - if add_flag: - if line.strip(): - coord.extend([float(t) for t in line.strip().split()]) - - return np.array(coord) - - -def get_atomicforces_LAMMPS(lammps_dump_file): - - add_flag = False - - force = [] - - with open(lammps_dump_file) as f: - for line in f: - if "ITEM:" in line and "ITEM: ATOMS fx fy fz " not in line: - add_flag = False - continue - elif "ITEM: ATOMS fx fy fz " in line: - add_flag = True - continue - - if add_flag: - if line.strip(): - force.extend([float(t) for t in line.strip().split()]) - - return np.array(force) - - -def print_displacements_LAMMPS(lammps_files, - nat, x_cart0, - require_conversion, - conversion_factor, - file_offset): - - if file_offset is None: - disp_offset = np.zeros((nat, 3)) - else: - dummy, nat_tmp, x0_offset, kd_offset = read_lammps_structure(file_offset) - if nat_tmp != nat: - print("File %s contains too many/few position entries" % file_offset) - - disp_offset = x0_offset - x_cart0 - - # Automatic detection of the input format - - is_dumped_file = False - f = open(lammps_files[0], 'r') - for line in f: - if "ITEM: TIMESTEP" in line: - is_dumped_file = True - break - f.close() - - if is_dumped_file: - - ## This version supports reading the data from MD trajectory - - for search_target in lammps_files: - - x = get_coordinate_LAMMPS(search_target) - ndata = len(x) // (3 * nat) - x = np.reshape(x, (ndata, nat, 3)) - - for idata in range(ndata): - disp = x[idata, :, :] - x_cart0 - disp_offset - - if require_conversion: - disp *= conversion_factor - - for i in range(nat): - print("%20.14f %20.14f %20.14f" % (disp[i, 0], - disp[i, 1], - disp[i, 2])) - - else: - - for search_target in lammps_files: - - dummy, nat_tmp, x_cart, kd_tmp = read_lammps_structure(search_target) - if nat_tmp != nat: - print("File %s contains too many/few position entries" % search_target) - - disp = x_cart - x_cart0 - disp_offset - - if require_conversion: - disp *= conversion_factor - - for i in range(nat): - print("%20.14f %20.14f %20.14f" % (disp[i, 0], - disp[i, 1], - disp[i, 2])) - - -def print_atomicforces_LAMMPS(lammps_files, nat, - require_conversion, - conversion_factor, - file_offset): - - if file_offset is None: - force_offset = np.zeros((nat, 3)) - else: - data = get_atomicforces_LAMMPS(file_offset) - try: - force_offset = np.reshape(data, (nat, 3)) - except: - print("File %s contains too many position entries" % file_offset) - - - # Automatic detection of the input format - - is_dumped_file = False - f = open(lammps_files[0], 'r') - for line in f: - if "ITEM: TIMESTEP" in line: - is_dumped_file = True - break - f.close() - - for search_target in lammps_files: - - force = get_atomicforces_LAMMPS(search_target) - ndata = len(force) // (3 * nat) - force = np.reshape(force, (ndata, nat, 3)) - - for idata in range(ndata): - f = force[idata, :, :] - force_offset - - if require_conversion: - f *= conversion_factor - - for i in range(nat): - print("%19.11E %19.11E %19.11E" % (f[i][0], - f[i][1], - f[i][2])) - - -# Other functions - -def refold(x): - if x >= 0.5: - return x - 1.0 - elif x < -0.5: - return x + 1.0 - else: - return x +parser.add_option('--emin', + default=None, + type="float", + help="Lower bound of the energy filter (eV) used for selecting output structures.\ + Available only in the VASP parser.") +parser.add_option('--emax', + default=None, + type="float", + help="Upper bound of the energy filter (eV) used for selecting output structures.\ + Available only in the VASP parser.") # Main @@ -924,184 +98,97 @@ def refold(x): $ python displace.py -h") exit(1) - Bohr_radius = 0.52917721067 - Rydberg_to_eV = 13.60569253 + # Check the calculator option conditions = [options.VASP is None, options.QE is None, options.xTAPP is None, - options.LAMMPS is None] + options.LAMMPS is None, + options.OpenMX is None] if conditions.count(True) == len(conditions): - print("Error : Either --VASP, --QE, --xTAPP, --LAMMPS option must be given.") + print( + "Error : Either --VASP, --QE, --xTAPP, --LAMMPS, --OpenMX option must be given.") exit(1) elif len(conditions) - conditions.count(True) > 1: - print("Error : --VASP, --QE, --xTAPP, and --LAMMPS cannot be given simultaneously.") + print("Error : --VASP, --QE, --xTAPP, --LAMMPS, and --OpenMX cannot be given simultaneously.") exit(1) elif options.VASP: code = "VASP" file_original = options.VASP - if options.unitname == "eV": - convert_unit = False - disp_conv_factor = 1.0 - energy_conv_factor = 1.0 - - elif options.unitname == "Rydberg": - convert_unit = True - disp_conv_factor = 1.0 / Bohr_radius - energy_conv_factor = 1.0 / Rydberg_to_eV - - elif options.unitname == "Hartree": - convert_unit = True - disp_conv_factor = 1.0 / Bohr_radius - energy_conv_factor = 0.5 / Rydberg_to_eV - - else: - print("Invalid options for --unit") - exit(1) - elif options.QE: code = "QE" file_original = options.QE - if options.unitname == "eV": - convert_unit = True - disp_conv_factor = Bohr_radius - energy_conv_factor = Rydberg_to_eV - - elif options.unitname == "Rydberg": - convert_unit = False - disp_conv_factor = 1.0 - energy_conv_factor = 1.0 - - elif options.unitname == "Hartree": - convert_unit = True - disp_conv_factor = 1.0 - energy_conv_factor = 0.5 - - else: - print("Error : Invalid option for --unit") - exit(1) - elif options.xTAPP: code = "xTAPP" file_original = options.xTAPP - if options.unitname == "eV": - convert_unit = True - disp_conv_factor = Bohr_radius - energy_conv_factor = 2.0 * Rydberg_to_eV - - elif options.unitname == "Rydberg": - convert_unit = True - disp_conv_factor = 1.0 - energy_conv_factor = 2.0 - - elif options.unitname == "Hartree": - convert_unit = False - disp_conv_factor = 1.0 - energy_conv_factor = 1.0 - - else: - print("Error : Invalid option for --unit") - exit(1) - elif options.LAMMPS: code = "LAMMPS" file_original = options.LAMMPS - if options.get == "energy": - print("--get energy is not supported for LAMMPS") - exit(1) + elif options.OpenMX: + code = "OpenMX" + file_original = options.OpenMX - if options.unitname == "eV": - convert_unit = False - disp_conv_factor = 1.0 - energy_conv_factor = 1.0 - - else: - convert_unit = True - disp_conv_factor = 1.0 / Bohr_radius - energy_conv_factor = 1.0 / Rydberg_to_eV - - force_conv_factor = energy_conv_factor / disp_conv_factor + # Check output option + str_get = options.get.lower() + if str_get not in ["disp-force", "disp", "force", "energy"]: + print("Error: Please specify which quantity to extract by the --get option.") + exit(1) print_disp = False print_force = False print_energy = False - if options.get == "disp": + if str_get == "disp-force": print_disp = True - elif options.get == "force": print_force = True - elif options.get == "energy": + elif str_get == "disp": + print_disp = True + elif str_get == "force": + print_force = True + elif str_get == "energy": print_energy = True - else: - print("Please specify which quantity to extract by the --get option.") - exit(1) - # Get nat, aa, x_frac0 + # Check unit option + str_unit = options.unitname.lower() + if str_unit in ["ev", "electron_volt"]: + str_unit = "ev" + elif str_unit in ["ry", "ryd", "rydberg"]: + str_unit = "rydberg" + elif str_unit in ["ha", "hartree"]: + str_unit = "hartree" + else: + print("Error: Invalid unit name : %s" % options.unitname) + # Print data if code == "VASP": - aa, aa_inv, elems, nats, x_frac0 = read_POSCAR(file_original) + vasp.parse(file_original, file_results, + options.offset, str_unit, + print_disp, print_force, print_energy, + options.emin, options.emax) elif code == "QE": - alat, aa, nat, x_frac0 = read_original_QE_mod(file_original) + qe.parse(file_original, file_results, + options.offset, str_unit, + print_disp, print_force, print_energy) elif code == "xTAPP": - aa, nat, x_frac0 = read_CG_mod(file_original) - - elif code == "LAMMPS": - common_settings, nat, x_cart0, kd = read_lammps_structure(file_original) - - # Print data - - if print_disp: - if code == "VASP": - print_displacements_VASP(file_results, aa, np.sum(nats), x_frac0, - convert_unit, disp_conv_factor, options.offset) + xtapp.parse(file_original, file_results, + options.offset, str_unit, + print_disp, print_force, print_energy) - elif code == "QE": - print_displacements_QE(file_results, alat, aa, nat, x_frac0, - convert_unit, disp_conv_factor, options.offset) + elif code == "OpenMX": + openmx.parse(file_original, file_results, + options.offset, str_unit, + print_disp, print_force, print_energy) - elif code == "xTAPP": - print_displacements_xTAPP(file_results, aa, nat, x_frac0, - convert_unit, disp_conv_factor, options.offset) - - elif code == "LAMMPS": - print_displacements_LAMMPS(file_results, nat, x_cart0, - convert_unit, disp_conv_factor, options.offset) - - elif print_force: - if code == "VASP": - print_atomicforces_VASP(file_results, np.sum(nats), - convert_unit, force_conv_factor, options.offset) - - elif code == "QE": - print_atomicforces_QE(file_results, nat, - convert_unit, force_conv_factor, options.offset) - - elif code == "xTAPP": - print_atomicforces_xTAPP(file_results, nat, - convert_unit, force_conv_factor, options.offset) - - elif code == "LAMMPS": - print_atomicforces_LAMMPS(file_results, nat, - convert_unit, force_conv_factor, options.offset) - - elif print_energy: - if code == "VASP": - print_energies_VASP(file_results, convert_unit, - energy_conv_factor, options.offset) - - elif code == "QE": - print_energies_QE(file_results, convert_unit, - energy_conv_factor, options.offset) - - elif code == "xTAPP": - print_energies_xTAPP(file_results, convert_unit, - energy_conv_factor, options.offset) + elif code == "LAMMPS": + lammps.parse(file_original, file_results, + options.offset, str_unit, + print_disp, print_force, print_energy) diff --git a/tools/interface/LAMMPS.py b/tools/interface/LAMMPS.py new file mode 100644 index 00000000..2c199766 --- /dev/null +++ b/tools/interface/LAMMPS.py @@ -0,0 +1,365 @@ +# +# LAMMPS.py +# +# Interface to LAMMPS (http://lammps.sandia.gov) +# +# Copyright (c) 2017 Terumasa Tadano +# +# This file is distributed under the terms of the MIT license. +# Please see the file 'LICENCE.txt' in the root directory +# or http://opensource.org/licenses/mit-license.php for information. +# + +import numpy as np + + +def read_lammps_structure(file_in): + + f = open(file_in, 'r') + header_comment = f.readline() + + common_settings = [] + + for line in f: + if "Atoms" in line: + break + common_settings.append(line.rstrip()) + + atoms = [] + for line in f: + if line.strip(): + atoms.append(line.rstrip().split()) + + atoms = np.array(atoms) + nat = len(atoms) + kd = np.array(atoms[:, 1], dtype=np.int) + x = np.array(atoms[:, 2:5], dtype=np.float64) + + return common_settings, nat, x, kd + + +def write_lammps_structure(prefix, counter, header, nzerofills, + common_settings, nat, kd, x_cart, disp): + + filename = prefix + str(counter).zfill(nzerofills) + ".lammps" + f = open(filename, 'w') + f.write("%s\n" % header) + + for line in common_settings: + f.write("%s\n" % line) + + f.write("%s\n\n" % "Atoms") + for i in range(nat): + f.write("%5d %3d" % (i + 1, kd[i])) + for j in range(3): + f.write("%20.15f" % (x_cart[i][j] + disp[i][j])) + f.write("\n") + f.write("\n") + f.close() + + +def get_coordinate_LAMMPS(lammps_dump_file): + + add_flag = False + + coord = [] + + with open(lammps_dump_file) as f: + for line in f: + if "ITEM:" in line and "ITEM: ATOMS id xu yu zu" not in line: + add_flag = False + continue + elif "ITEM: ATOMS id xu yu zu" in line: + add_flag = True + continue + + if add_flag: + if line.strip(): + entries = line.strip().split() + coord_atom = [int(entries[0]), + [float(t) for t in entries[1:]]] + coord.append(coord_atom) + + # This sort is necessary since the order atoms of LAMMPS dump files + # may change from the input structure file. + coord_sorted = sorted(coord) + coord = [] + for coord_atom in coord_sorted: + coord.extend(coord_atom[1]) + + return np.array(coord) + + +def get_atomicforces_LAMMPS(lammps_dump_file): + + add_flag = False + + force = [] + + with open(lammps_dump_file) as f: + for line in f: + if "ITEM:" in line and "ITEM: ATOMS id fx fy fz " not in line: + add_flag = False + continue + elif "ITEM: ATOMS id fx fy fz " in line: + add_flag = True + continue + + if add_flag: + if line.strip(): + entries = line.strip().split() + force_atom = [int(entries[0]), + [float(t) for t in entries[1:]]] + force.append(force_atom) + + force_sorted = sorted(force) + force = [] + for force_atom in force_sorted: + force.extend(force_atom[1]) + + return np.array(force) + + +def get_coordinate_and_force_LAMMPS(lammps_dump_file): + + add_flag = False + + ret = [] + + with open(lammps_dump_file) as f: + for line in f: + if "ITEM:" in line and "ITEM: ATOMS id xu yu zu fx fy fz" not in line: + add_flag = False + continue + elif "ITEM: ATOMS id xu yu zu fx fy fz" in line: + add_flag = True + continue + + if add_flag: + if line.strip(): + entries = line.strip().split() + data_atom = [int(entries[0]), + [float(t) for t in entries[1:4]], + [float(t) for t in entries[4:]]] + + ret.append(data_atom) + + # This sort is necessary since the order atoms of LAMMPS dump files + # may change from the input structure file. + ret_sorted = sorted(ret) + ret_x = [] + ret_f = [] + for ret_atom in ret_sorted: + ret_x.extend(ret_atom[1]) + ret_f.extend(ret_atom[2]) + + return np.array(ret_x), np.array(ret_f) + + +def print_displacements_LAMMPS(lammps_files, nat, x_cart0, + conversion_factor, file_offset): + + if file_offset is None: + disp_offset = np.zeros((nat, 3)) + else: + _, nat_tmp, x0_offset, _ = read_lammps_structure(file_offset) + if nat_tmp != nat: + print("File %s contains too many/few position entries" + % file_offset) + + disp_offset = x0_offset - x_cart0 + + # Automatic detection of the input format + + is_dumped_file = False + f = open(lammps_files[0], 'r') + for line in f: + if "ITEM: TIMESTEP" in line: + is_dumped_file = True + break + f.close() + + if is_dumped_file: + + # This version supports reading the data from MD trajectory + + for search_target in lammps_files: + + x = get_coordinate_LAMMPS(search_target) + ndata = len(x) // (3 * nat) + x = np.reshape(x, (ndata, nat, 3)) + + for idata in range(ndata): + disp = x[idata, :, :] - x_cart0 - disp_offset + disp *= conversion_factor + + for i in range(nat): + print("%20.14f %20.14f %20.14f" % (disp[i, 0], + disp[i, 1], + disp[i, 2])) + + else: + + for search_target in lammps_files: + + _, nat_tmp, x_cart, _ = read_lammps_structure(search_target) + if nat_tmp != nat: + print("File %s contains too many/few position entries" % + search_target) + + disp = x_cart - x_cart0 - disp_offset + disp *= conversion_factor + + for i in range(nat): + print("%20.14f %20.14f %20.14f" % (disp[i, 0], + disp[i, 1], + disp[i, 2])) + + +def print_atomicforces_LAMMPS(lammps_files, nat, + conversion_factor, file_offset): + + if file_offset is None: + force_offset = np.zeros((nat, 3)) + else: + data = get_atomicforces_LAMMPS(file_offset) + try: + force_offset = np.reshape(data, (nat, 3)) + except: + print("File %s contains too many position entries" % file_offset) + + # Automatic detection of the input format + + is_dumped_file = False + f = open(lammps_files[0], 'r') + for line in f: + if "ITEM: TIMESTEP" in line: + is_dumped_file = True + break + f.close() + + for search_target in lammps_files: + + force = get_atomicforces_LAMMPS(search_target) + ndata = len(force) // (3 * nat) + force = np.reshape(force, (ndata, nat, 3)) + + for idata in range(ndata): + f = force[idata, :, :] - force_offset + f *= conversion_factor + + for i in range(nat): + print("%19.11E %19.11E %19.11E" % (f[i][0], f[i][1], f[i][2])) + + +def print_displacements_and_forces_LAMMPS(lammps_files, nat, + x_cart0, + conversion_factor_disp, + conversion_factor_force, + file_offset): + + if file_offset is None: + disp_offset = np.zeros((nat, 3)) + force_offset = np.zeros((nat, 3)) + else: + x0_offset, force_offset = get_coordinate_and_force_LAMMPS(file_offset) + try: + x0_offset = np.reshape(x0_offset, (nat, 3)) + force_offset = np.reshape(force_offset, (nat, 3)) + except: + print("File %s contains too many/few entries" % file_offset) + + disp_offset = x0_offset - x_cart0 + + # Automatic detection of the input format + + is_dumped_file = False + f = open(lammps_files[0], 'r') + for line in f: + if "ITEM: TIMESTEP" in line: + is_dumped_file = True + break + f.close() + + if is_dumped_file: + + # This version supports reading the data from MD trajectory + + for search_target in lammps_files: + + x, force = get_coordinate_and_force_LAMMPS(search_target) + ndata = len(x) // (3 * nat) + x = np.reshape(x, (ndata, nat, 3)) + force = np.reshape(force, (ndata, nat, 3)) + + for idata in range(ndata): + disp = x[idata, :, :] - x_cart0 - disp_offset + disp *= conversion_factor_disp + f = force[idata, :, :] - force_offset + f *= conversion_factor_force + + for i in range(nat): + print("%20.14f %20.14f %20.14f %20.8E %15.8E %15.8E" % (disp[i, 0], + disp[i, 1], + disp[i, 2], + f[i, 0], + f[i, 1], + f[i, 2])) + + +def get_unit_conversion_factor(str_unit): + + Bohr_radius = 0.52917721067 + Rydberg_to_eV = 13.60569253 + + disp_conv_factor = 1.0 + energy_conv_factor = 1.0 + force_conv_factor = 1.0 + + if str_unit == "ev": + disp_conv_factor = 1.0 + energy_conv_factor = 1.0 + + elif str_unit == "rydberg": + disp_conv_factor = 1.0 / Bohr_radius + energy_conv_factor = 1.0 / Rydberg_to_eV + + elif str_unit == "hartree": + disp_conv_factor = 1.0 / Bohr_radius + energy_conv_factor = 0.5 / Rydberg_to_eV + + else: + print("This cannot happen") + exit(1) + + force_conv_factor = energy_conv_factor / disp_conv_factor + + return disp_conv_factor, force_conv_factor, energy_conv_factor + + +def parse(lammps_init, dump_files, dump_file_offset, str_unit, + print_disp, print_force, print_energy): + + _, nat, x_cart0, _ = read_lammps_structure(lammps_init) + scale_disp, scale_force, _ = get_unit_conversion_factor(str_unit) + + if print_disp is True and print_force is True: + print_displacements_and_forces_LAMMPS(dump_files, nat, + x_cart0, + scale_disp, + scale_force, + dump_file_offset) + + elif print_disp is True: + print_displacements_LAMMPS(dump_files, nat, x_cart0, + scale_disp, + dump_file_offset) + + elif print_force is True: + print_atomicforces_LAMMPS(dump_files, nat, + scale_force, + dump_file_offset) + + elif print_energy is True: + print("Error: --get energy is not supported for LAMMPS") + exit(1) diff --git a/tools/interface/OpenMX.py b/tools/interface/OpenMX.py new file mode 100644 index 00000000..f65209db --- /dev/null +++ b/tools/interface/OpenMX.py @@ -0,0 +1,487 @@ +# +# OpenMX.py +# +# Interface to OpenMX (http://openmx-square.org) +# +# Copyright (c) 2018 Yuto Tanaka +# +# This file is distributed under the terms of the MIT license. +# Please see the file 'LICENCE.txt' in the root directory +# or http://opensource.org/licenses/mit-license.php for information. +# + +import numpy as np + +"""OpenMX""" +# Function for OpenMX + + +def read_OpenMX_input(file_original): + + search_target = [ + "atoms.number", "atoms.speciesandcoordinates.unit", + " 0 and ss[0].lower() == search_target[0]: + nat = int(ss[1]) + + # atomic coordinates + if coord_flag == 1: + for j in range(3): + x_frac0[coord_row][j] = float(ss[j+2]) + + coord_row += 1 + if coord_row == nat: + coord_flag = 0 + + # latice vector + if lavec_flag == 1: + for i in range(3): + lavec[lavec_row][i] = float(ss[i]) + lavec_row += 1 + if lavec_row == 3: + lavec_flag = 0 + + # unit of atomic coordinates + if len(ss) > 0 and ss[0].lower() == search_target[1]: + coord_unit = ss[1].lower() + + if len(ss) > 0 and ss[0].lower() == search_target[2]: + coord_flag = 1 + # initialize x_frac0 array + x_frac0 = np.zeros([nat, 3]) + + if len(ss) > 0 and ss[0].lower() == search_target[3]: + lavec_flag = 1 + + if np.linalg.norm(lavec) > 0 and lavec_flag == 0: + break + + # errors + if nat == 0: + print("Could not read dat file properly.") + exit(1) + + lavec_inv = (np.linalg.inv(lavec)).T + # convert to frac + if coord_unit == "ang": + for i in range(nat): + x_frac0[i] = np.dot(lavec_inv, x_frac0[i]) + + f.close() + + return lavec, lavec_inv, nat, x_frac0 + + +def write_OpenMX_input(prefix, counter, nzerofills, disp, lavec, file_in): + + search_target = [ + "atoms.number", " 0 and ss[0].lower() == search_target[0]: + nat = int(ss[1]) + x_frac = np.zeros((nat, 3)) + #coord = OrderedDict() + coord = {} + for i in range(nat): + coord[i+1] = [] + + # coordinates_unit + if len(ss) > 0 and ss[0].lower() == search_target[2]: + coord_unit = ss[1].lower() + + # coordinates + if coord_flag == 1: + coord_column = len(ss) + for i in range(1, coord_column): + if i > 1: + coord[int(ss[0])].append(float(ss[i])) + else: + coord[int(ss[0])].append(ss[i]) + + # convert to frac + if coord_unit == "ang": + coord[coord_row+1] = np.dot(conv, coord[coord_row+1]) + + # add displacement + for j in range(1, 4): + coord[coord_row+1][j] += disp[coord_row][j-1] + coord[coord_row+1][j] = format(coord[coord_row+1][j], '20.16f') + + fout.write(str(coord_row+1) + " ") + fout.write(" ".join(map(str, coord[coord_row+1]))) + fout.write("\n") + coord_row += 1 + if coord_row == nat: + coord_flag = 0 + + elif len(ss) > 0 and ss[0].lower() == search_target[3]: + ss[1] = prefix + str(counter).zfill(nzerofills) + fout.write(" ".join(map(str, ss))) + fout.write("\n") + + else: + fout.write(line) + + if len(ss) > 0 and ss[0].lower() == search_target[1]: + coord_flag = 1 + + fin.close() + fout.close() + + +"""OpenMX""" +# Function for OpenMX + + +def read_outfile(out_file, nat, column): + + x = np.zeros([nat, 3], dtype=np.float64) + + f = open(out_file, 'r') + + flag = 0 + atom_count = 0 + nat_out = 0 + for line in f: + ss = line.strip().split() + if len(ss) > 0: + + if ss[0] == " 0: + for i in range(3): + x[atom_count][i] = float(ss[i+column]) + + atom_count += 1 + + if atom_count == nat: + break + + f.close() + + return x + + +# displacements +def get_coordinates_OpenMX(out_file, nat, lavec, conv): + x = read_outfile(out_file, nat, 2) + for i in range(nat): + # convert unit ang to frac + x[i] = np.dot(conv, x[i]) + + return x + + +def print_displacements_OpenMX(out_files, + lavec, lavec_inv, nat, x0, + conversion_factor, + file_offset): + + vec_refold = np.vectorize(refold) + lavec_transpose = lavec.transpose() + conv = lavec_inv + conv_inv = np.linalg.inv(conv) + + x0 = np.round(x0, 8) + + if file_offset is None: + disp_offset = np.zeros([nat, 3]) + else: + x0_offset = get_coordinates_OpenMX(file_offset, nat, lavec, conv) + try: + x0_offset = np.reshape(x0_offset, (nat, 3)) + except: + print("File %s contains too many position entries" % file_offset) + disp_offset = x0_offset - x0 + + for search_target in out_files: + + x = get_coordinates_OpenMX(search_target, nat, lavec, conv) + #ndata = len(x) / (3 * nat) + ndata = 1 + #x = np.reshape(x, (1, nat, 3)) + + for idata in range(ndata): + #disp = x[idata, :, :] - x0 - disp_offset + disp = x - x0 - disp_offset + disp[disp > 0.96] -= 1.0 + #disp = np.dot(vec_refold(disp), conv_inv) + for i in range(nat): + disp[i] = np.dot(conv_inv, disp[i]) + + disp[np.absolute(disp) < 1e-5] = 0.0 + disp *= conversion_factor + + for i in range(nat): + print("%15.7F %15.7F %15.7F" % (disp[i][0], + disp[i][1], + disp[i][2])) + + +# atomic forces +def get_atomicforces_OpenMX(out_file, nat): + force = read_outfile(out_file, nat, 5) + + return force + + +def print_atomicforces_OpenMX(out_files, + nat, + conversion_factor, + file_offset): + + if file_offset is None: + force_offset = np.zeros((nat, 3)) + else: + data0 = get_atomicforces_OpenMX(file_offset, nat) + try: + force_offset = np.reshape(data0, (nat, 3)) + except: + print("File %s contains too many force entries" % file_offset) + + for search_target in out_files: + data = get_atomicforces_OpenMX(search_target, nat) + #ndata = len(data) / (3 * nat) + ndata = 1 + #data = np.reshape(data, (ndata, nat, 3)) + + for idata in range(ndata): + #f = data[idata, :, :] - force_offset + f = data - force_offset + + f *= conversion_factor + + for i in range(nat): + print("%15.8E %15.8E %15.8E" % (f[i][0], + f[i][1], + f[i][2])) + + +def print_displacements_and_forces_OpenMX(out_files, + lavec, lavec_inv, nat, x0, + conversion_factor_disp, + conversion_factor_force, + file_offset): + + vec_refold = np.vectorize(refold) + lavec_transpose = lavec.transpose() + conv = lavec_inv + conv_inv = np.linalg.inv(conv) + + x0 = np.round(x0, 8) + + if file_offset is None: + disp_offset = np.zeros((nat, 3)) + force_offset = np.zeros((nat, 3)) + else: + x0_offset = get_coordinates_OpenMX(file_offset, nat, lavec, conv) + force_offset = get_atomicforces_OpenMX(file_offset, nat) + + try: + x0_offset = np.reshape(x0_offset, (nat, 3)) + except: + print("File %s contains too many position entries" % file_offset) + disp_offset = x0_offset - x0 + + try: + force_offset = np.reshape(force_offset, (nat, 3)) + except: + print("File %s contains too many force entries" % file_offset) + + for search_target in out_files: + + x = get_coordinates_OpenMX(search_target, nat, lavec, conv) + force = get_atomicforces_OpenMX(search_target, nat) + ndata = 1 + + for idata in range(ndata): + #disp = x[idata, :, :] - x0 - disp_offset + disp = x - x0 - disp_offset + disp[disp > 0.96] -= 1.0 + #disp = np.dot(vec_refold(disp), conv_inv) + for i in range(nat): + disp[i] = np.dot(conv_inv, disp[i]) + + disp[np.absolute(disp) < 1e-5] = 0.0 + disp *= conversion_factor_disp + + f = force - force_offset + f *= conversion_factor_force + + for i in range(nat): + print("%15.7F %15.7F %15.7F %20.8E %15.8E %15.8E" % (disp[i][0], + disp[i][1], + disp[i][2], + f[i][0], + f[i][1], + f[i][2])) + + +# total enegy +def get_energies_OpenMX(out_file): + + target = "Utot." + etot = [] + + f = open(out_file, 'r') + for line in f: + ss = line.strip().split() + if len(ss) > 0 and ss[0] == target: + etot.extend([float(ss[1])]) + break + else: + continue + + if len(etot) == 0: + print("Total energy not found.") + exit(1) + + return np.array(etot, dtype=np.float) + + +def print_energies_OpenMX(out_files, + conversion_factor, + file_offset): + + if file_offset is None: + etot_offset = 0.0 + else: + data = get_energies_OpenMX(file_offset) + if len(data) > 1: + print("File %s contains too many energy entries" % file_offset) + exit(1) + etot_offset = data[0] + + print("# Etot") + for search_target in out_files: + + etot = get_energies_OpenMX(search_target) + + for idata in range(len(etot)): + val = etot[idata] - etot_offset + + val *= conversion_factor + + print("%19.11E" % val) + + +def refold(x): + if x >= 0.5: + return x - 1.0 + elif x < -0.5: + return x + 1.0 + else: + return x + + +def get_unit_conversion_factor(str_unit): + + Bohr_radius = 0.52917721067 + Rydberg_to_eV = 13.60569253 + + disp_conv_factor = 1.0 + energy_conv_factor = 1.0 + force_conv_factor = 1.0 + + if str_unit == "ev": + disp_conv_factor = 1.0 + energy_conv_factor = 2.0 * Rydberg_to_eV + force_conv_factor = energy_conv_factor + + elif str_unit == "rydberg": + disp_conv_factor = 1.0 / Bohr_radius + energy_conv_factor = 2.0 + force_conv_factor = 2.0 + + elif str_unit == "hartree": + disp_conv_factor = 1.0 / Bohr_radius + energy_conv_factor = 1.0 + force_conv_factor = 1.0 + + else: + print("This cannot happen") + exit(1) + + return disp_conv_factor, force_conv_factor, energy_conv_factor + + +def parse(dat_init, out_files, out_file_offset, str_unit, + print_disp, print_force, print_energy): + + aa, aa_inv, nat, x_frac0 = read_OpenMX_input(dat_init) + + scale_disp, scale_force, scale_energy = get_unit_conversion_factor( + str_unit) + + if print_disp is True and print_force is True: + print_displacements_and_forces_OpenMX(out_files, + aa, aa_inv, nat, + x_frac0, + scale_disp, + scale_force, + out_file_offset) + elif print_disp is True: + print_displacements_OpenMX(out_files, + aa, aa_inv, nat, + x_frac0, + scale_disp, + out_file_offset) + + elif print_force is True: + print_atomicforces_OpenMX(out_files, + nat, + scale_force, + out_file_offset) + + elif print_energy is True: + print_energies_OpenMX(out_files, + scale_energy, + out_file_offset) diff --git a/tools/interface/QE.py b/tools/interface/QE.py new file mode 100644 index 00000000..f13f2605 --- /dev/null +++ b/tools/interface/QE.py @@ -0,0 +1,1008 @@ +# +# QE.py +# +# Interface to Quantum ESPRESSO (http://www.quantum-espresso.org) +# +# Copyright (c) 2014 Terumasa Tadano +# +# This file is distributed under the terms of the MIT license. +# Please see the file 'LICENCE.txt' in the root directory +# or http://opensource.org/licenses/mit-license.php for information. +# + +import numpy as np + + +def get_namelist(file_in, namelist_tag): + + list_out = [] + flag_add = False + + with open(file_in) as openfileobject: + for line in openfileobject: + line_upper = line.upper() + if namelist_tag in line_upper: + flag_add = True + list_out.append(line) + elif line.strip() == "/": + flag_add = False + elif flag_add: + list_out.append(line) + + if len(list_out) == 0: + print("%s field not found" % namelist_tag) + exit(1) + + list_out.append("/\n") + return list_out + + +def gen_lattice_vector(ibrav, celldm, list_CELL_PARAMETERS): + """. + + Computer lattice vector in units of Angstrom for given ibrav and celldm. + Doc/INPUT_PW.txt was used as a reference. + """ + import math + + Bohr_to_angstrom = 0.5291772108 + + lavec = np.zeros((3, 3)) + + if ibrav == 0: + + if list_CELL_PARAMETERS is None: + print("CELL_PARAMETERS must be given when ibrav = 0.") + exit(1) + + else: + for i in range(3): + lavec[i][:] = [float(entry) for entry in + list_CELL_PARAMETERS[i + 1].rstrip().split()] + + lavec = np.array(lavec) + + mode = list_CELL_PARAMETERS[0].rstrip().split() + + if len(mode) == 1: + print( + "Error : Please specify either alat, bohr, or angstrom for CELL_PARAMETERS") + exit(1) + else: + mode_str = mode[1].lower() + + if "alat" in mode_str: + + if not celldm[0]: + print( + "celldm(1) must be given when 'alat' is used for CELL_PARAMETERS") + exit(1) + + for i in range(3): + for j in range(3): + lavec[i][j] *= celldm[0] + + elif "angstrom" in mode_str: + + for i in range(3): + for j in range(3): + lavec[i][j] /= Bohr_to_angstrom + + elif "bohr" not in mode_str: + + print("Error : Invalid option for CELL_PARAMETERS: %s" % + mode[1]) + exit(1) + + elif ibrav == 1: + + if not celldm[0]: + print("celldm(1) must be given when ibrav = 1.") + exit(1) + + else: + a = celldm[0] + lavec = np.array([[a, 0.0, 0.0], + [0.0, a, 0.0], + [0.0, 0.0, a]]) + + elif ibrav == 2: + + if not celldm[0]: + print("celldm(1) must be given when ibrav = 2.") + exit(1) + + else: + a = celldm[0] / 2.0 + lavec = np.array([[-a, 0.0, a], + [0.0, a, a], + [-a, a, 0.0]]) + + elif ibrav == 3: + + if not celldm[0]: + print("celldm(1) must be given when ibrav = 3.") + exit(1) + + else: + a = celldm[0] / 2.0 + lavec = np.array([[a, a, a], + [-a, a, a], + [-a, -a, a]]) + + elif ibrav == 4: + + if not celldm[0] or not celldm[2]: + print("celldm(1) and celldm(3) must be given when ibrav = 4.") + exit(1) + + else: + a = celldm[0] + c = celldm[0] * celldm[2] + lavec = np.array([[a, 0.0, 0.0], + [-0.5 * a, math.sqrt(3.) / 2.0 * a, 0.0], + [0.0, 0.0, c]]) + + elif ibrav == 5 or ibrav == -5: + + if not celldm[0] or not celldm[3]: + print("celldm(1) and celldm(4) must be given when ibrav = 5, -5.") + exit(1) + + else: + a = celldm[0] + cosalpha = celldm[3] + tx = a * math.sqrt((1.0 - cosalpha) / 2.) + ty = a * math.sqrt((1.0 - cosalpha) / 6.) + tz = a * math.sqrt((1.0 + 2.0 * cosalpha) / 3.) + + if ibrav == 5: + lavec = np.array([[tx, -ty, tz], + [0.0, 2.0 * ty, tz], + [-tx, -ty, tz]]) + + else: + a_prime = a / math.sqrt(3.0) + u = tz - 2.0 * math.sqrt(2.0) * ty + v = tz + math.sqrt(2.0) * ty + + u *= a_prime + v *= a_prime + + lavec = np.array([[u, v, v], + [v, u, v], + [v, v, u]]) + + elif ibrav == 6: + + if not celldm[0] or not celldm[2]: + print("celldm(1) and celldm(3) must be given when ibrav = 6.") + exit(1) + + else: + a = celldm[0] + c = celldm[0] * celldm[2] + lavec = np.array([[a, 0.0, 0.0], + [0.0, a, 0.0], + [0.0, 0.0, c]]) + + elif ibrav == 7: + + if not celldm[0] or not celldm[2]: + print("celldm(1) and celldm(3) must be given when ibrav = 7.") + exit(1) + + else: + a = celldm[0] + c = celldm[0] * celldm[2] + lavec = np.array([[a / 2.0, -a / 2.0, c / 2.0], + [a / 2.0, a / 2.0, c / 2.0], + [-a / 2.0, -a / 2.0, c / 2.0]]) + + elif ibrav == 8: + + if not celldm[0] or not celldm[1] or not celldm[2]: + print("celldm(1), celldm(2), and celldm(3) must be given\ + when ibrav = 8.") + exit(1) + + else: + a = celldm[0] + b = celldm[0] * celldm[1] + c = celldm[0] * celldm[2] + + lavec = np.array([[a, 0.0, 0.0], + [0.0, b, 0.0], + [0.0, 0.0, c]]) + + elif ibrav == 9 or ibrav == -9: + + if not celldm[0] or not celldm[1] or not celldm[2]: + print("celldm(1), celldm(2), and celldm(3) must be given\ + when ibrav = 9 or -9.") + exit(1) + + else: + a = celldm[0] + b = celldm[0] * celldm[1] + c = celldm[0] * celldm[2] + + if ibrav == 9: + lavec = np.array([[a / 2., b / 2., 0.0], + [-a / 2., b / 2., 0.0], + [0.0, 0.0, c]]) + else: + lavec = np.array([[a / 2., -b / 2., 0.0], + [a / 2., b / 2., 0.0], + [0.0, 0.0, c]]) + + elif ibrav == 10: + + if not celldm[0] or not celldm[1] or not celldm[2]: + print("celldm(1), celldm(2), and celldm(3) must be given\ + when ibrav = 10.") + exit(1) + + else: + a = celldm[0] / 2.0 + b = celldm[0] * celldm[1] / 2.0 + c = celldm[0] * celldm[2] / 2.0 + lavec = np.array([[a, 0.0, c], + [a, b, 0.0], + [0.0, b, c]]) + + elif ibrav == 11: + + if not celldm[0] or not celldm[1] or not celldm[2]: + print("celldm(1), celldm(2), and celldm(3) must be given\ + when ibrav = 11.") + exit(1) + + else: + a = celldm[0] / 2.0 + b = celldm[0] * celldm[1] / 2.0 + c = celldm[0] * celldm[2] / 2.0 + lavec = np.array([[a, b, c], + [-a, b, c], + [-a, -b, c]]) + + elif ibrav == 12: + + if not celldm[0] or not celldm[1] or not celldm[2] or \ + not celldm[3]: + print("celldm(1), celldm(2), celldm(3), and celldm(4)\ + must be given when ibrav = 12.") + exit(1) + + else: + a = celldm[0] + b = celldm[0] * celldm[1] + c = celldm[0] * celldm[2] + gamma = math.acos(celldm[3]) + lavec = np.array([[a, 0.0, 0.0], + [b * math.cos(gamma), b * math.sin(gamma), 0.0], + [0.0, 0.0, c]]) + + elif ibrav == -12: + + if not celldm[0] or not celldm[1] or not celldm[2] or \ + not celldm[4]: + print("celldm(1), celldm(2), celldm(3), and celldm(5)\ + must be given when ibrav = -12.") + exit(1) + + else: + a = celldm[0] + b = celldm[0] * celldm[1] + c = celldm[0] * celldm[2] + beta = math.acos(celldm[4]) + lavec = np.array([[a, 0.0, 0.0], + [0.0, b, 0.0], + [c * math.cos(beta), 0.0, c * math.sin(beta)]]) + + elif ibrav == 13: + + if not celldm[0] or not celldm[1] or not celldm[2] or\ + not celldm[3]: + print("celldm(1), celldm(2), celldm(3), and celldm(4)\ + must be given when ibrav = 13.") + exit(1) + + else: + a = celldm[0] + b = celldm[0] * celldm[1] + c = celldm[0] * celldm[2] + gamma = math.acos(celldm[3]) + lavec = np.array([[a / 2.0, 0.0, -c / 2.0], + [b * math.cos(gamma), b * math.sin(gamma), 0.0], + [a / 2.0, 0.0, c / 2.0]]) + + elif ibrav == 14: + + if not celldm[0] or not celldm[1] or not celldm[2] or \ + not celldm[3] or not celldm[4] or not celldm[5]: + print("All celldm must be given when ibrav = 14.") + exit(1) + + else: + a = celldm[0] + b = celldm[0] * celldm[1] + c = celldm[0] * celldm[2] + alpha = math.acos(celldm[3]) + beta = math.acos(celldm[4]) + gamma = math.acos(celldm[5]) + + lavec = np.array([[a, 0.0, 0.0], + [b * math.cos(gamma), b * math.sin(gamma), 0.0], + [c * math.cos(beta), + c * (math.cos(alpha) - math.cos(beta) * + math.cos(gamma)) / math.sin(gamma), + c * math.sqrt(1.0 + 2.0 * math.cos(alpha) * math.cos(beta) * math.cos(gamma) + - math.cos(alpha) ** 2 - math.cos(beta) ** 2 - math.cos(gamma) ** 2) / math.sin(gamma)]]) + + else: + + print("Invalid ibrav = %s" % ibrav) + exit(1) + + # Transpose for later use + lavec = lavec.transpose() + + # Convert to Angstrom unit + for i in range(3): + for j in range(3): + lavec[i][j] *= Bohr_to_angstrom + + return lavec + + +def get_system_info(list_in): + + list_mod = [] + + for obj in list_in: + obj_split = obj.rstrip().split(',') + for subobj in obj_split: + if subobj: + index = subobj.find('=') + if index > 0: + subobj = subobj[:index] + " = " + subobj[index + 1:] + list_mod.append(subobj) + + str_input = "" + + for entry in list_mod: + str_input += entry + " " + + entrylist = str_input.split() + + celldm = [[] for i in range(6)] + + for i in range(len(entrylist)): + + if "ibrav" in entrylist[i]: + ibrav = int(entrylist[i + 2]) + + if "nat" in entrylist[i]: + nat = int(entrylist[i + 2]) + + if "ntyp" in entrylist[i]: + ntyp = int(entrylist[i + 2]) + + if "celldm(1)" in entrylist[i]: + # Do not assign the value if the comment character '!' + # appears in front of the celldm(1) keyword + has_comment = False + for elem in list_in: + if "celldm(1)" in elem: + has_comment = ('!' == elem.strip().split()[0][0]) + + if not has_comment: + celldm[0] = float(entrylist[i + 2]) + + if "celldm(2)" in entrylist[i]: + celldm[1] = float(entrylist[i + 2]) + + if "celldm(3)" in entrylist[i]: + celldm[2] = float(entrylist[i + 2]) + + if "celldm(4)" in entrylist[i]: + celldm[3] = float(entrylist[i + 2]) + + if "celldm(5)" in entrylist[i]: + celldm[4] = float(entrylist[i + 2]) + + if "celldm(6)" in entrylist[i]: + celldm[5] = float(entrylist[i + 2]) + + return ibrav, celldm, nat, ntyp + + +def get_options(option_tag, taglists, file_in): + + list_out = [] + flag_add = False + + with open(file_in) as openfileobject: + for line in openfileobject: + + if option_tag in line: + flag_add = True + list_out.append(line) + elif len(line.split()) > 0 and line.split()[0] in taglists: + flag_add = False + elif flag_add: + if line.strip(): + list_out.append(line) + + return list_out + + +def get_fractional_coordinate(aa, N, list_in, a_Bohr): + + Bohr_to_angstrom = 0.5291772108 + + list_tmp = list_in[0].rstrip().split() + + if len(list_tmp) == 1: + print("Error : Please specify either alat, bohr, angstrom, or crystal for ATOMIC_POSITIONS") + exit(1) + else: + mode_str = list_tmp[1].lower() + + if "crystal_sg" in mode_str: + print("Error : Sorry. 'crystal_sg' is not supported in this script. Please use another option.") + exit(1) + + xtmp = np.zeros((N, 3)) + kd = [] + + for i in range(N): + list_tmp = list_in[i + 1].rstrip().split() + kd.append(list_tmp[0]) + xtmp[i][:] = [float(j) for j in list_tmp[1:4]] + + aa_inv = np.linalg.inv(aa) + + if "alat" in mode_str: + a_angstrom = a_Bohr * Bohr_to_angstrom + + for i in range(3): + for j in range(3): + aa_inv[i][j] *= a_angstrom + + for i in range(N): + xtmp[i][:] = np.dot(xtmp[i][:], aa_inv.transpose()) + + elif "bohr" in mode_str: + + for i in range(3): + for j in range(3): + aa_inv[i][j] *= Bohr_to_angstrom + + for i in range(N): + xtmp[i][:] = np.dot(xtmp[i][:], aa_inv.transpose()) + + elif "angstrom" in mode_str: + + for i in range(N): + xtmp[i][:] = np.dot(xtmp[i][:], aa_inv.transpose()) + + elif "crystal" not in mode_str: + print("Error : Invalid option for ATOMIC_POSITIONS: %s" % mode_str) + exit(1) + + return kd, xtmp + + +def read_original_QE(file_in): + + # Parse fortran namelists + list_CONTROL = get_namelist(file_in, "&CONTROL") + list_SYSTEM = get_namelist(file_in, "&SYSTEM") + list_ELECTRONS = get_namelist(file_in, "&ELECTRONS") + + # Parse general options + tags = ["ATOMIC_SPECIES", "ATOMIC_POSITIONS", "K_POINTS", + "CELL_PARAMETERS", "OCCUPATIONS", "CONSTRAINTS", "ATOMIC_FORCES"] + + list_ATOMIC_SPECIES = get_options("ATOMIC_SPECIES", tags, file_in) + list_ATOMIC_POSITIONS = get_options("ATOMIC_POSITIONS", tags, file_in) + list_K_POINTS = get_options("K_POINTS", tags, file_in) + list_CELL_PARAMETERS = get_options("CELL_PARAMETERS", tags, file_in) + list_OCCUPATIONS = get_options("OCCUPATIONS", tags, file_in) + + # Get ibrav, celldm, nat, and ntyp + # and then calculate the lattice vector + ibrav, celldm, nat, ntyp = get_system_info(list_SYSTEM) + lavec = gen_lattice_vector(ibrav, celldm, list_CELL_PARAMETERS) + lavec_inv = np.linalg.inv(lavec) + + # Get fractional coordinate + kd_symbol, x_frac = get_fractional_coordinate(lavec, + nat, + list_ATOMIC_POSITIONS, + celldm[0]) + list_namelist_merged = [] + list_namelist_merged.extend(list_CONTROL) + list_namelist_merged.extend(list_SYSTEM) + list_namelist_merged.extend(list_ELECTRONS) + + return list_namelist_merged, list_ATOMIC_SPECIES, list_K_POINTS, \ + list_CELL_PARAMETERS, list_OCCUPATIONS, \ + nat, lavec, kd_symbol, x_frac, lavec_inv + + +def generate_QE_input(prefix, suffix, counter, nzerofills, list_namelist, + list_ATOMS, list_KP, list_CELL, list_OCCU, + nat, kd_symbol, x, u): + + filename = prefix + str(counter).zfill(nzerofills) + "." + suffix + f = open(filename, 'w') + + for entry in list_namelist: + f.write(entry) + + for entry in list_ATOMS: + f.write(entry) + + f.write("ATOMIC_POSITIONS crystal\n") + for i in range(nat): + f.write("%s %20.15f %20.15f %20.15f\n" % (kd_symbol[i], + x[i][0] + u[i, 0], + x[i][1] + u[i, 1], + x[i][2] + u[i, 2])) + + for entry in list_KP: + f.write(entry) + for entry in list_CELL: + f.write(entry) + for entry in list_OCCU: + f.write(entry) + + f.write("\n") + f.close() + + +# Functions for Quantum-ESPRESSO (http://www.quantum-espresso.org) + + +def read_original_QE_mod(file_in): + + # Parse general options + tags = ["ATOMIC_SPECIES", "ATOMIC_POSITIONS", "K_POINTS", + "CELL_PARAMETERS", "OCCUPATIONS", "CONSTRAINTS", "ATOMIC_FORCES"] + + list_SYSTEM = get_namelist(file_in, "&SYSTEM") + list_CELL_PARAMETERS = get_options("CELL_PARAMETERS", tags, file_in) + list_ATOMIC_POSITIONS = get_options("ATOMIC_POSITIONS", tags, file_in) + + ibrav, celldm, nat, ntyp = get_system_info(list_SYSTEM) + lavec = gen_lattice_vector(ibrav, celldm, list_CELL_PARAMETERS) + kd_symbol, x0 = get_fractional_coordinate(lavec, + nat, + list_ATOMIC_POSITIONS, + celldm[0]) + + return celldm[0], lavec, nat, x0 + + +def get_coordinates_QE(pwout_file, nat, alat, lavec_transpose_inv): + + search_flag = "site n. atom positions (alat units)" + + x = np.zeros((nat, 3)) + + num_data_disp_extra = 0 + basis = "" + found_tag = False + + f = open(pwout_file, 'r') + line = f.readline() + + while line: + + if search_flag in line: + found_tag = True + + for i in range(nat): + line = f.readline() + x[i][:] = [float(t) for t in line.rstrip().split()[6:9]] + + break + + line = f.readline() + + if not found_tag: + print("%s tag not found in %s" % (search_flag, pwout_file)) + exit(1) + + x = alat * np.dot(x, lavec_transpose_inv) + + # Search additional entries containing atomic position + # (for parsing MD trajectory) + search_flag2 = "ATOMIC_POSITIONS (crystal)" + + x_additional = [] + + while line: + + if search_flag2 in line: + + if not basis: + basis = line.rstrip().split()[1] + + num_data_disp_extra += 1 + + for i in range(nat): + line = f.readline() + x_additional.extend([t for t in line.rstrip().split()[1:4]]) + + line = f.readline() + + f.close() + + Bohr_to_angstrom = 0.5291772108 + x_additional = np.array(x_additional, dtype=np.float) + # The basis of the coordinate in x_additional can be different + # from that of x. Therefore, perform basis conversion here. + if num_data_disp_extra > 0: + + if "alat" in basis: + conversion_mat = alat * lavec_transpose_inv + elif "bohr" in basis: + conversion_mat = lavec_transpose_inv + elif "angstrom" in basis: + conversion_mat = lavec_transpose_inv / Bohr_to_angstrom + elif "crystal" in basis: + conversion_mat = np.identity(3) + else: + print("This cannot happen.") + exit(1) + + x_additional = np.reshape(x_additional, (num_data_disp_extra, nat, 3)) + for i in range(num_data_disp_extra): + x_additional[i, :, :] = np.dot( + x_additional[i, :, :], conversion_mat) + + return x, x_additional, num_data_disp_extra + + +def print_displacements_QE(pwout_files, + alat, lavec, nat, x0, + conversion_factor, + file_offset): + + import math + vec_refold = np.vectorize(refold) + + x0 = np.round(x0, 8) + + Bohr_to_angstrom = 0.5291772108 + lavec /= Bohr_to_angstrom + lavec_transpose = lavec.transpose() + lavec_transpose_inv = np.linalg.inv(lavec_transpose) + + if not alat: + # if celldm[0] is empty, calculate it from lattice vector + alat = math.sqrt(np.dot(lavec_transpose[0][:], lavec_transpose[0][:])) + + # Parse offset component + if file_offset is None: + disp_offset = np.zeros((nat, 3)) + else: + x_offset, _, ndata_offset \ + = get_coordinates_QE(file_offset, nat, alat, lavec_transpose_inv) + + if ndata_offset > 1: + print("File %s contains too many position entries" % file_offset) + exit(1) + else: + disp_offset = x_offset - x0 + + for search_target in pwout_files: + + x, x_additional, num_data_disp \ + = get_coordinates_QE(search_target, nat, alat, lavec_transpose_inv) + disp = x - x0 - disp_offset + disp = np.dot(vec_refold(disp), lavec_transpose) + disp *= conversion_factor + + for i in range(nat): + print("%15.7F %15.7F %15.7F" % (disp[i][0], + disp[i][1], + disp[i][2])) + + if num_data_disp > 1: + # The last coordinate is not printed out because there is no + # atomic force information of that structure. + for step in range(num_data_disp - 1): + x = x_additional[step, :, :] + disp = x - x0 - disp_offset + disp = np.dot(vec_refold(disp), lavec_transpose) + disp *= conversion_factor + + for i in range(nat): + print("%15.7F %15.7F %15.7F" % (disp[i][0], + disp[i][1], + disp[i][2])) + + +def get_atomicforces_QE(pwout_file, nat): + + search_tag = "Forces acting on atoms (Ry/au):" + search_tag_QE6 = "Forces acting on atoms (cartesian axes, Ry/au):" + + found_tag = False + + f = open(pwout_file, 'r') + line = f.readline() + + force = [] + + while line: + + if search_tag in line or search_tag_QE6 in line: + found_tag = True + + f.readline() + + for i in range(nat): + line = f.readline() + force.extend([t for t in line.rstrip().split()[6:9]]) + + line = f.readline() + + f.close() + + if not found_tag: + print("following search tags not found in %s" % pwout_file) + print(search_tag) + print(search_tag_QE6) + exit(1) + + return np.array(force, dtype=np.float) + + +def print_atomicforces_QE(str_files, + nat, + conversion_factor, + file_offset): + + if file_offset is None: + force_offset = np.zeros((nat, 3)) + else: + data0 = get_atomicforces_QE(file_offset, nat) + try: + force_offset = np.reshape(data0, (nat, 3)) + except: + print("File %s contains too many force entries" % file_offset) + + for search_target in str_files: + + force = get_atomicforces_QE(search_target, nat) + ndata = len(force) // (3 * nat) + force = np.reshape(force, (ndata, nat, 3)) + + for idata in range(ndata): + f = force[idata, :, :] - force_offset + f *= conversion_factor + + for i in range(nat): + print("%19.8E %15.8E %15.8E" % (f[i][0], + f[i][1], + f[i][2])) + + +def print_displacements_and_forces_QE(pwout_files, + alat, lavec, nat, x0, + conversion_factor_disp, + conversion_factor_force, + file_offset): + + import math + vec_refold = np.vectorize(refold) + + x0 = np.round(x0, 8) + + Bohr_to_angstrom = 0.5291772108 + lavec /= Bohr_to_angstrom + lavec_transpose = lavec.transpose() + lavec_transpose_inv = np.linalg.inv(lavec_transpose) + + if not alat: + # if celldm[0] is empty, calculate it from lattice vector + alat = math.sqrt(np.dot(lavec_transpose[0][:], lavec_transpose[0][:])) + + # Parse offset component + if file_offset is None: + disp_offset = np.zeros((nat, 3)) + force_offset = np.zeros((nat, 3)) + else: + x_offset, _, ndata_offset \ + = get_coordinates_QE(file_offset, nat, alat, lavec_transpose_inv) + + if ndata_offset > 1: + print("File %s contains too many position entries" % file_offset) + exit(1) + else: + disp_offset = x_offset - x0 + + force_offset = get_atomicforces_QE(file_offset, nat) + try: + force_offset = np.reshape(force_offset, (nat, 3)) + except: + print("File %s contains too many force entries" % file_offset) + + for search_target in pwout_files: + + x, x_additional, num_data_disp_extra \ + = get_coordinates_QE(search_target, nat, alat, lavec_transpose_inv) + + force = get_atomicforces_QE(search_target, nat) + num_data_force = len(force) // (3 * nat) + force = np.reshape(force, (num_data_force, nat, 3)) + + if num_data_disp_extra <= 1: + num_data_disp = 1 + else: + num_data_disp = num_data_disp_extra + + if num_data_disp != num_data_force: + print( + "Error: The number of entries of displacement and force is inconsistent.") + print("Ndata disp : %d, Ndata force : %d" % + (num_data_disp, num_data_force)) + exit(1) + + disp = x - x0 - disp_offset + disp = np.dot(vec_refold(disp), lavec_transpose) + disp *= conversion_factor_disp + f = force[0, :, :] - force_offset + f *= conversion_factor_force + + for i in range(nat): + print("%15.7F %15.7F %15.7F %20.8E %15.8E %15.8E" % (disp[i][0], + disp[i][1], + disp[i][2], + f[i][0], + f[i][1], + f[i][2])) + + if num_data_disp > 1: + # The last coordinate is not printed out because there is no + # atomic force information of that structure. + for step in range(num_data_disp - 1): + x = x_additional[step, :, :] + disp = x - x0 - disp_offset + disp = np.dot(vec_refold(disp), lavec_transpose) + disp *= conversion_factor_disp + f = force[step + 1, :, :] - force_offset + f *= conversion_factor_force + + for i in range(nat): + print("%15.7F %15.7F %15.7F %20.8E %15.8E %15.8E" % (disp[i][0], + disp[i][1], + disp[i][2], + f[i][0], + f[i][1], + f[i][2])) + + +def get_energies_QE(pwout_file): + + search_tag = "! total energy" + + found_tag = False + + etot = [] + + with open(pwout_file) as openfileobject: + for line in openfileobject: + if search_tag in line: + etot.extend([line.rstrip().split()[4]]) + found_tag = True + + if not found_tag: + print("%s tag not found in %s" % (search_tag, pwout_file)) + exit(1) + + return np.array(etot, dtype=np.float) + + +def print_energies_QE(str_files, + conversion_factor, + file_offset): + + if file_offset is None: + etot_offset = 0.0 + else: + data = get_energies_QE(file_offset) + if len(data) > 1: + print("File %s contains too many energy entries" % file_offset) + exit(1) + etot_offset = data[0] + + print("# Etot") + for search_target in str_files: + + etot = get_energies_QE(search_target) + + for idata in range(len(etot)): + val = etot[idata] - etot_offset + val *= conversion_factor + + print("%19.11E" % val) + + +def refold(x): + if x >= 0.5: + return x - 1.0 + elif x < -0.5: + return x + 1.0 + else: + return x + + +def get_unit_conversion_factor(str_unit): + + Bohr_radius = 0.52917721067 + Rydberg_to_eV = 13.60569253 + + disp_conv_factor = 1.0 + energy_conv_factor = 1.0 + force_conv_factor = 1.0 + + if str_unit == "ev": + disp_conv_factor = Bohr_radius + energy_conv_factor = Rydberg_to_eV + + elif str_unit == "rydberg": + disp_conv_factor = 1.0 + energy_conv_factor = 1.0 + + elif str_unit == "hartree": + disp_conv_factor = 1.0 + energy_conv_factor = 0.5 + + else: + print("This cannot happen.") + exit(1) + + force_conv_factor = energy_conv_factor / disp_conv_factor + + return disp_conv_factor, force_conv_factor, energy_conv_factor + + +def parse(pwin_init, pwout_files, pwout_file_offset, str_unit, + print_disp, print_force, print_energy): + + alat, aa, nat, x_frac0 = read_original_QE_mod(pwin_init) + + scale_disp, scale_force, scale_energy = get_unit_conversion_factor( + str_unit) + + if print_disp is True and print_force is True: + print_displacements_and_forces_QE(pwout_files, + alat, aa, nat, + x_frac0, + scale_disp, + scale_force, + pwout_file_offset) + + elif print_disp is True: + print_displacements_QE(pwout_files, + alat, aa, nat, x_frac0, + scale_disp, + pwout_file_offset) + + elif print_force is True: + print_atomicforces_QE(pwout_files, + nat, + scale_force, + pwout_file_offset) + + elif print_energy is True: + print_energies_QE(pwout_files, + scale_energy, + pwout_file_offset) diff --git a/tools/interface/VASP.py b/tools/interface/VASP.py new file mode 100644 index 00000000..39dc14af --- /dev/null +++ b/tools/interface/VASP.py @@ -0,0 +1,472 @@ +# +# VASP.py +# +# Interface to VASP (https://www.vasp.at) +# +# Copyright (c) 2014 Terumasa Tadano +# +# This file is distributed under the terms of the MIT license. +# Please see the file 'LICENCE.txt' in the root directory +# or http://opensource.org/licenses/mit-license.php for information. +# +from __future__ import print_function +import numpy as np + +try: + try: + # cElementTree on Python 2.5+ + import xml.etree.cElementTree as etree + except ImportError: + # ElementTree on Python 2.5+ + import xml.etree.ElementTree as etree +except ImportError: + try: + # cElementTree + import cElementTree as etree + except ImportError: + # ElementTree + import elementtree.ElementTree as etree + + +def read_POSCAR(file_in): + + file_pos = open(file_in, 'r') + + file_pos.readline() + a = float(file_pos.readline().rstrip()) + lavec = np.zeros((3, 3)) + + for i in range(3): + arr = file_pos.readline().rstrip().split() + if len(arr) != 3: + print("Could not read POSCAR properly") + exit(1) + + for j in range(3): + lavec[i, j] = a * float(arr[j]) + + lavec = lavec.transpose() + invlavec = np.linalg.inv(lavec) + + elements = file_pos.readline().rstrip().split() + + if elements[0].isdigit(): + nat_elem = [int(tmp) for tmp in elements] + elements = [] + + else: + nat_elem = [int(tmp) for tmp in file_pos.readline().rstrip().split()] + + nat = np.sum(nat_elem) + basis = file_pos.readline().rstrip() + x = np.zeros((nat, 3)) + + for i in range(nat): + arr = file_pos.readline().rstrip().split() + for j in range(3): + x[i][j] = float(arr[j]) + + if basis == "Direct" or basis == "direct" or basis == "D" or basis == "d": + xf = x + else: + xf = np.dot(x, invlavec) + + file_pos.close() + + return lavec, invlavec, elements, nat_elem, xf + + +def write_POSCAR(prefix, counter, header, nzerofills, + lavec, elems, nat, disp, coord): + + filename = prefix + str(counter).zfill(nzerofills) + ".POSCAR" + f = open(filename, 'w') + f.write("%s\n" % header) + f.write("%s\n" % "1.0") + + for i in range(3): + f.write("%20.15f %20.15f %20.15f\n" % (lavec[0][i], + lavec[1][i], + lavec[2][i])) + + for i in range(len(elems)): + f.write("%s " % elems[i]) + if len(elems) > 0: + f.write("\n") + + for i in range(len(nat)): + f.write("%d " % nat[i]) + f.write("\n") + + f.write("Direct\n") + + for i in range(len(disp)): + for j in range(3): + f.write("%20.15f" % (coord[i][j] + disp[i][j])) + f.write("\n") + f.close() + + +def get_coordinate_VASP(xml_file, nat): + + x = [] + + try: + xml = etree.parse(xml_file) + root = xml.getroot() + + for elems in root.findall('calculation/structure/varray'): + str_coord = [elems2.text for elems2 in elems.findall('v')] + n = len(str_coord) + + for i in range(n): + x.extend([t for t in str_coord[i].split()]) + + return np.array(x, dtype=np.float) + + except: + print("Error in reading atomic positions from the XML file: %s" % xml_file) + + +def print_displacements_VASP(xml_files, + lavec, nat, x0, + conversion_factor, + file_offset): + + x0 = np.round(x0, 8) + lavec_transpose = lavec.transpose() + vec_refold = np.vectorize(refold) + + if file_offset is None: + disp_offset = np.zeros((nat, 3)) + else: + x0_offset = get_coordinate_VASP(file_offset, nat) + try: + x0_offset = np.reshape(x0_offset, (nat, 3)) + except: + print("File %s contains too many position entries" % file_offset) + disp_offset = x0_offset - x0 + + for search_target in xml_files: + + x = get_coordinate_VASP(search_target, nat) + ndata = len(x) // (3 * nat) + x = np.reshape(x, (ndata, nat, 3)) + + for idata in range(ndata): + disp = x[idata, :, :] - x0 - disp_offset + disp = np.dot(vec_refold(disp), lavec_transpose) + disp *= conversion_factor + + for i in range(nat): + print("%15.7F %15.7F %15.7F" % (disp[i, 0], + disp[i, 1], + disp[i, 2])) + + +def get_atomicforces_VASP(xml_file): + + f = [] + + try: + xml = etree.parse(xml_file) + root = xml.getroot() + + for elems in root.findall('calculation/varray'): + if elems.get('name') == "forces": + str_force = [elems2.text for elems2 in elems.findall('v')] + + for i in range(len(str_force)): + f.extend([t for t in str_force[i].split()]) + + return np.array(f, dtype=np.float) + + except: + print("Error in reading atomic forces from the XML file: %s" % xml_file) + + +def print_atomicforces_VASP(xml_files, + nat, + conversion_factor, + file_offset): + + if file_offset is None: + force_offset = np.zeros((nat, 3)) + else: + data0 = get_atomicforces_VASP(file_offset) + try: + force_offset = np.reshape(data0, (nat, 3)) + except: + print("File %s contains too many force entries" % file_offset) + + for search_target in xml_files: + + data = get_atomicforces_VASP(search_target) + ndata = len(data) // (3 * nat) + data = np.reshape(data, (ndata, nat, 3)) + + for idata in range(ndata): + f = data[idata, :, :] - force_offset + f *= conversion_factor + + for i in range(nat): + print("%15.8E %15.8E %15.8E" % (f[i][0], + f[i][1], + f[i][2])) + + +def get_coordinate_and_force_VASP(xml_file, nat): + + x = [] + f = [] + + try: + xml = etree.parse(xml_file) + root = xml.getroot() + + for elems in root.findall('calculation/structure/varray'): + str_coord = [elems2.text for elems2 in elems.findall('v')] + n = len(str_coord) + + for i in range(n): + x.extend([t for t in str_coord[i].split()]) + + for elems in root.findall('calculation/varray'): + if elems.get('name') == "forces": + str_force = [elems2.text for elems2 in elems.findall('v')] + + for i in range(len(str_force)): + f.extend([t for t in str_force[i].split()]) + + return np. array(x, dtype=np.float), np.array(f, dtype=np.float) + + except: + print( + "Error in reading atomic positions and forces from the XML file: %s" % xml_file) + + +def print_displacements_and_forces_VASP(xml_files, + lavec, nat, x0, + conversion_factor_disp, + conversion_factor_force, + conversion_factor_energy, + file_offset, + filter_emin, + filter_emax): + x0 = np.round(x0, 8) + lavec_transpose = lavec.transpose() + vec_refold = np.vectorize(refold) + + if file_offset is None: + disp_offset = np.zeros((nat, 3)) + force_offset = np.zeros((nat, 3)) + epot_offset = 0 + + else: + x0_offset, force_offset \ + = get_coordinate_and_force_VASP(file_offset, nat) + epot_offset, _ = get_energies_VASP(file_offset) + epot_offset = np.array(epot_offset, dtype='float') + try: + x0_offset = np.reshape(x0_offset, (nat, 3)) + except: + print("File %s contains too many position entries" % file_offset) + + try: + force_offset = np.reshape(force_offset, (nat, 3)) + except: + print("File %s contains too many force entries" % file_offset) + + disp_offset = x0_offset - x0 + + if len(epot_offset) > 1: + print("File %s contains too many energy entries" % file_offset) + + for search_target in xml_files: + + x, force = get_coordinate_and_force_VASP(search_target, nat) + epot, ekin = get_energies_VASP(search_target) + + ndata = len(x) // (3 * nat) + ndata2 = len(force) // (3 * nat) + + if ndata != ndata2: + print("The numbers of displacement and force entries are different.") + exit(1) + + ndata_energy = len(epot) + if ndata_energy != ndata: + print("The numbers of displacement and energy entries are different.") + exit(1) + + epot = np.array(epot, dtype='float') + epot -= epot_offset + + x = np.reshape(x, (ndata, nat, 3)) + force = np.reshape(force, (ndata, nat, 3)) + + for idata in range(ndata): + disp = x[idata, :, :] - x0 - disp_offset + disp = np.dot(vec_refold(disp), lavec_transpose) + f = force[idata, :, :] - force_offset + + disp *= conversion_factor_disp + f *= conversion_factor_force + + if filter_emin is not None: + if filter_emin > epot[idata]: + continue + + if filter_emax is not None: + if filter_emax < epot[idata]: + continue + + print("# Filename: %s, Snapshot: %d, E_pot (eV): %s" % + (search_target, idata + 1, epot[idata])) + for i in range(nat): + print("%15.7F %15.7F %15.7F %20.8E %15.8E %15.8E" % (disp[i, 0], + disp[i, 1], + disp[i, 2], + f[i][0], + f[i][1], + f[i][2])) + + +def get_energies_VASP(xml_file): + + etot_array = [] + ekin_array = [] + + try: + xml = etree.parse(xml_file) + root = xml.getroot() + + for elems in root.findall('calculation/energy'): + etot = 'N/A' + ekin = 'N/A' + + for elems2 in elems.findall('i'): + if elems2.get('name') == "e_fr_energy": + etot = elems2.text + if elems2.get('name') == "kinetic": + ekin = elems2.text + + etot_array.append(etot) + ekin_array.append(ekin) + + return etot_array, ekin_array + except: + print("Error in reading energies from the XML file: %s" % xml_file) + + +def print_energies_VASP(xml_files, + conversion_factor, + file_offset): + + print("# Etot, Ekin") + + etot_offset = 0.0 + ekin_offset = 0.0 + + if file_offset: + etot, ekin = get_energies_VASP(file_offset) + if len(etot) > 1 or len(ekin) > 1: + print("File %s contains too many energy entries" % file_offset) + exit(1) + if etot[0] != 'N/A': + etot_offset = float(etot[0]) + if ekin[0] != 'N/A': + ekin_offset = float(ekin[0]) + + for search_target in xml_files: + + etot, ekin = get_energies_VASP(search_target) + + for i in range(len(etot)): + if etot[i] != 'N/A': + val_etot = float(etot[i]) - etot_offset + print("%15.8E" % (val_etot * conversion_factor), end=' ') + else: + print("%s" % etot[i], end=' ') + + if ekin[i] != 'N/A': + val_ekin = float(ekin[i]) - ekin_offset + print("%15.8E" % (val_ekin * conversion_factor)) + else: + print("%s" % ekin[i]) + + +def get_unit_conversion_factor(str_unit): + + Bohr_radius = 0.52917721067 + Rydberg_to_eV = 13.60569253 + + disp_conv_factor = 1.0 + energy_conv_factor = 1.0 + force_conv_factor = 1.0 + + if str_unit == "ev": + disp_conv_factor = 1.0 + energy_conv_factor = 1.0 + + elif str_unit == "rydberg": + disp_conv_factor = 1.0 / Bohr_radius + energy_conv_factor = 1.0 / Rydberg_to_eV + + elif str_unit == "hartree": + disp_conv_factor = 1.0 / Bohr_radius + energy_conv_factor = 0.5 / Rydberg_to_eV + + else: + print("This cannot happen.") + exit(1) + + force_conv_factor = energy_conv_factor / disp_conv_factor + + return disp_conv_factor, force_conv_factor, energy_conv_factor + + +def parse(SPOSCAR_init, xml_files, xml_file_offset, str_unit, + print_disp, print_force, print_energy, + filter_emin, filter_emax): + + aa, _, elems, nats, x_frac0 = read_POSCAR(SPOSCAR_init) + + scale_disp, scale_force, scale_energy = get_unit_conversion_factor( + str_unit) + + if print_disp is True and print_force is True: + print_displacements_and_forces_VASP(xml_files, + aa, np.sum(nats), + x_frac0, + scale_disp, + scale_force, + scale_energy, + xml_file_offset, + filter_emin, + filter_emax) + elif print_disp is True: + print_displacements_VASP(xml_files, + aa, np.sum(nats), + x_frac0, + scale_disp, + xml_file_offset) + elif print_force is True: + print_atomicforces_VASP(xml_files, + np.sum(nats), + scale_force, + xml_file_offset) + + elif print_energy is True: + print_energies_VASP(xml_files, + scale_energy, + xml_file_offset) + + +def refold(x): + if x >= 0.5: + return x - 1.0 + elif x < -0.5: + return x + 1.0 + else: + return x diff --git a/tools/interface/__init__.py b/tools/interface/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tools/interface/xTAPP.py b/tools/interface/xTAPP.py new file mode 100644 index 00000000..20058391 --- /dev/null +++ b/tools/interface/xTAPP.py @@ -0,0 +1,579 @@ +# +# xTAPP.py +# +# Interface to xTAPP (http://xtapp.cp.is.s.u-tokyo.ac.jp) +# +# Copyright (c) 2014 Terumasa Tadano +# +# This file is distributed under the terms of the MIT license. +# Please see the file 'LICENCE.txt' in the root directory +# or http://opensource.org/licenses/mit-license.php for information. +# + +import numpy as np + + +def read_tappinput(file_in): + + list_tappinput = [] + flag_add = False + + with open(file_in) as openfileobject: + for line in openfileobject: + if "main" in line and "data" in line: + flag_add = True + list_tappinput.append(line) + elif "#" in line: + flag_add = False + elif flag_add: + list_tappinput.append(line) + + if len(list_tappinput) == 0: + print("main data entry not found") + exit(1) + + list_tappinput_new = [] + + for obj in list_tappinput: + obj_split = obj.rstrip().split(',') + for subobj in obj_split: + if subobj: + list_tappinput_new.append(subobj) + + str_input = "" + + for entry in list_tappinput_new: + str_input += entry + " " + + entrylist = str_input.split() + lavec_list = [] + + a = 0.0 + nkd = 0 + nat = 0 + + # get lattice_factor + for i in range(len(entrylist)): + if "lattice_factor" in entrylist[i]: + a = float(entrylist[i + 2]) + + if "lattice_list" in entrylist[i]: + for j in range(9): + lavec_list.append(entrylist[i + j + 2]) + + if "number_element" in entrylist[i]: + nkd = int(entrylist[i + 2]) + + if "number_atom" in entrylist[i]: + nat = int(entrylist[i + 2]) + + if a == 0.0: + print("Couldn't read lattice_factor") + exit(1) + if nkd == 0: + print("Couldn't read number_element") + exit(1) + if nat == 0: + print("Couldn't read number_atom") + exit(1) + if len(lavec_list) != 9: + print("Couldn't read lattice_list") + exit(1) + + lavec = np.zeros((3, 3)) + + Bohr_to_angstrom = 0.5291772108 + a *= Bohr_to_angstrom + + for i in range(3): + for j in range(3): + lavec[j][i] = a * float(lavec_list[3 * i + j]) + + return lavec, nat, nkd, list_tappinput + + +def read_kpdata(file_in): + + list_kpoint = [] + flag_add = False + + with open(file_in) as openfileobject: + for line in openfileobject: + if "k-points" in line.rstrip(): + flag_add = True + list_kpoint.append(line) + elif "#" in line.strip(): + flag_add = False + elif flag_add: + list_kpoint.append(line) + + if len(list_kpoint) == 0: + print("k-points data entry not found") + exit(1) + + return list_kpoint + + +def read_structure_optimize(file_in): + + list_opt = [] + flag_add = False + + with open(file_in) as openfileobject: + for line in openfileobject: + if "struct_opt" in line.rstrip(): + flag_add = True + list_opt.append(line) + elif "#" in line.strip(): + flag_add = False + elif flag_add: + list_opt.append(line) + + if len(list_opt) == 0: + print("struct_opt entry not found") + exit(1) + + list_opt2 = [] + flag_add = False + + with open(file_in) as openfileobject: + for line in openfileobject: + if "str_opt_constr" in line.rstrip(): + flag_add = True + list_opt2.append(line) + elif "#" in line.strip(): + flag_add = False + elif flag_add: + list_opt2.append(line) + + if len(list_opt2) == 0: + print("str_opt_constr entry not found") + exit(1) + + return list_opt, list_opt2 + + +def read_atomdata(file_in, nat_in, nkd_in): + + list_atom = [] + flag_add = False + + with open(file_in) as openfileobject: + for line in openfileobject: + if "atom" in line and "data" in line: + flag_add = True + list_atom.append(line) + elif "#" in line.strip(): + flag_add = False + elif flag_add: + list_atom.append(line) + + if len(list_atom) == 0: + print("atom data entry not found") + exit(1) + + x_out = np.zeros((nat_in, 3), dtype=float) + kd_out = np.zeros(nat_in, dtype=int) + + for i in range(nat_in): + list_tmp = list_atom[i + nkd_in + 1].rstrip().split() + kd_out[i] = int(list_tmp[0]) + for j in range(3): + x_out[i][j] = float(list_tmp[j + 1]) + + return x_out, kd_out, list_atom + + +def read_CG(file_in): + + lavec, nat, nkd, str_tappinput = read_tappinput(file_in) + str_kpoint = read_kpdata(file_in) + str_struct_opt, str_opt_constr = read_structure_optimize(file_in) + x, kd, str_atom = read_atomdata(file_in, nat, nkd) + + str_header = "" + + for entry in str_tappinput: + str_header += entry + for entry in str_kpoint: + str_header += entry + for entry in str_struct_opt: + str_header += entry + for entry in str_opt_constr: + str_header += entry + for i in range(nkd + 1): + str_header += str_atom[i] + + lavec = np.matrix(lavec) + lavec_inv = np.array(lavec.I) + + return str_header, nat, nkd, lavec, lavec_inv, x, kd + + +def gen_CG(prefix, suffix, counter, nzerofills, str_header, + nat, kd, x, u, nsym, symop, denom_tran, has_inv): + + filename = prefix + str(counter).zfill(nzerofills) + "." + suffix + f = open(filename, 'w') + f.write("%s" % str_header) + + for i in range(nat): + f.write("%i %20.15f %20.15f %20.15f\n" % (kd[i], + x[i][0] + u[i, 0], + x[i][1] + u[i, 1], + x[i][2] + u[i, 2])) + + f.write("# symmetry data\n") + f.write("&symmetry\n") + f.write(" number_sym_op = %i\n" % nsym) + f.write(" has_inversion = %i\n" % has_inv) + f.write(" denom_trans = %i\n" % denom_tran) + f.write("/\n") + + mat_tmp = np.zeros((3, 3), dtype=int) + + for elems in symop: + for i in range(3): + for j in range(3): + mat_tmp[i][j] = elems[3 * i + j] + + mat_inv = np.matrix(mat_tmp).I + + for i in range(3): + for j in range(3): + f.write("%4i" % mat_inv[i, j]) + + f.write(" ") + for i in range(3): + f.write("%4i" % elems[9 + i]) + + f.write("\n") + + f.write("\n") + f.close() + + +def read_CG_mod(file_in): + + lavec, nat, nkd, list_dummy = read_tappinput(file_in) + x0, kd, list_dummy = read_atomdata(file_in, nat, nkd) + + return lavec, nat, x0 + + +def get_coordinates_xTAPP(str_file, nat): + + found_tag = False + f = open(str_file, 'r') + line = f.readline() + + x = [] + + while line: + + if "atom_position" in line: + found_tag = True + + for i in range(nat): + line = f.readline() + x.extend([t for t in line.rstrip().split()[1:]]) + + break + + line = f.readline() + + if not found_tag: + print("atom_position tag not found in %s" % str_file) + exit(1) + + f.close() + + return np.array(x, dtype=np.float) + + +def print_displacements_xTAPP(str_files, + lavec, nat, x0, + conversion_factor, + file_offset): + + Bohr_to_angstrom = 0.5291772108 + vec_refold = np.vectorize(refold) + + lavec /= Bohr_to_angstrom + lavec_transpose = lavec.transpose() + + x0 = np.round(x0, 8) + + if file_offset is None: + disp_offset = np.zeros((nat, 3)) + else: + x0_offset = get_coordinates_xTAPP(file_offset, nat) + try: + x0_offset = np.reshape(x0_offset, (nat, 3)) + except: + print("File %s contains too many position entries" % file_offset) + disp_offset = x0_offset - x0 + + for search_target in str_files: + + x = get_coordinates_xTAPP(search_target, nat) + ndata = len(x) // (3 * nat) + x = np.reshape(x, (ndata, nat, 3)) + + for idata in range(ndata): + disp = x[idata, :, :] - x0 - disp_offset + disp = np.dot(vec_refold(disp), lavec_transpose) + disp *= conversion_factor + + for i in range(nat): + print("%15.7F %15.7F %15.7F" % (disp[i][0], + disp[i][1], + disp[i][2])) + + +def get_atomicforces_xTAPP(str_file, nat): + + found_tag = False + + f = open(str_file, 'r') + line = f.readline() + + force = [] + + while line: + + if "force" in line: + found_tag = True + + for i in range(nat): + line = f.readline() + force.extend([t for t in line.rstrip().split()]) + + break + + line = f.readline() + + if not found_tag: + print("force tag not found in %s" % str_file) + exit(1) + + f.close() + + return np.array(force, dtype=np.float) + + +def print_atomicforces_xTAPP(str_files, + nat, + conversion_factor, + file_offset): + + if file_offset is None: + force_offset = np.zeros((nat, 3)) + else: + data = get_atomicforces_xTAPP(file_offset, nat) + try: + force_offset = np.reshape(data, (nat, 3)) + except: + print("File %s contains too many position entries" % file_offset) + + for search_target in str_files: + + force = get_atomicforces_xTAPP(search_target, nat) + ndata = len(force) // (3 * nat) + force = np.reshape(force, (ndata, nat, 3)) + + for idata in range(ndata): + f = force[idata, :, :] - force_offset + f *= conversion_factor + + for i in range(nat): + print("%19.11E %19.11E %19.11E" % (f[i][0], + f[i][1], + f[i][2])) + + +def get_energies_xTAPP(str_file): + + search_tag = "total_energy" + + found_tag = False + + etot = [] + + with open(str_file) as openfileobject: + for line in openfileobject: + if search_tag in line: + energy_str = line.rstrip().split()[2] + etot.extend([energy_str[:-1]]) + found_tag = True + + if not found_tag: + print("%s tag not found in %s" % (search_tag, str_file)) + exit(1) + + return np.array(etot, dtype=np.float) + + +def print_displacements_and_forces_xTAPP(str_files, + lavec, nat, x0, + conversion_factor_disp, + conversion_factor_force, + file_offset): + + Bohr_to_angstrom = 0.5291772108 + vec_refold = np.vectorize(refold) + + lavec /= Bohr_to_angstrom + lavec_transpose = lavec.transpose() + + x0 = np.round(x0, 8) + + if file_offset is None: + disp_offset = np.zeros((nat, 3)) + force_offset = np.zeros((nat, 3)) + + else: + x0_offset = get_coordinates_xTAPP(file_offset, nat) + force_offset = get_atomicforces_xTAPP(file_offset, nat) + try: + x0_offset = np.reshape(x0_offset, (nat, 3)) + except: + print("File %s contains too many position entries" % file_offset) + disp_offset = x0_offset - x0 + + try: + force_offset = np.reshape(force_offset, (nat, 3)) + except: + print("File %s contains too many position entries" % file_offset) + + for search_target in str_files: + + x = get_coordinates_xTAPP(search_target, nat) + force = get_atomicforces_xTAPP(search_target, nat) + + ndata_disp = len(x) // (3 * nat) + ndata_force = len(force) // (3 * nat) + + if ndata_disp != ndata_force: + print( + "Error: The number of entries of displacement and force is inconsistent.") + print("Ndata disp : %d, Ndata force : %d" % + (ndata_disp, ndata_force)) + exit(1) + + ndata = ndata_disp + x = np.reshape(x, (ndata, nat, 3)) + force = np.reshape(force, (ndata, nat, 3)) + + for idata in range(ndata): + disp = x[idata, :, :] - x0 - disp_offset + disp = np.dot(vec_refold(disp), lavec_transpose) + disp *= conversion_factor + f = force[idata, :, :] - force_offset + f *= conversion_factor + + for i in range(nat): + print("%15.7F %15.7F %15.7F %20.8E %15.8E %15.8E" % (disp[i][0], + disp[i][1], + disp[i][2], + f[i][0], + f[i][1], + f[i][2])) + + +def print_energies_xTAPP(str_files, + conversion_factor, + file_offset): + + if file_offset is None: + etot_offset = 0.0 + else: + data = get_energies_xTAPP(file_offset) + if len(data) > 1: + print("File %s contains too many energy entries" % file_offset) + exit(1) + etot_offset = data[0] + + print("# Etot") + for search_target in str_files: + + etot = get_energies_xTAPP(search_target) + + for idata in range(len(etot)): + val = etot[idata] - etot_offset + val *= conversion_factor + + print("%19.11E" % val) + + +def refold(x): + if x >= 0.5: + return x - 1.0 + elif x < -0.5: + return x + 1.0 + else: + return x + + +def get_unit_conversion_factor(str_unit): + + Bohr_radius = 0.52917721067 + Rydberg_to_eV = 13.60569253 + + disp_conv_factor = 1.0 + energy_conv_factor = 1.0 + force_conv_factor = 1.0 + + if str_unit == "ev": + disp_conv_factor = Bohr_radius + energy_conv_factor = 2.0 * Rydberg_to_eV + + elif str_unit == "rydberg": + disp_conv_factor = 1.0 + energy_conv_factor = 2.0 + + elif str_unit == "hartree": + disp_conv_factor = 1.0 + energy_conv_factor = 1.0 + + else: + print("This cannot happen") + exit(1) + + force_conv_factor = energy_conv_factor / disp_conv_factor + + return disp_conv_factor, force_conv_factor, energy_conv_factor + + +def parse(cg_init, structure_files, structure_file_offset, str_unit, + print_disp, print_force, print_energy): + + aa, nat, x_frac0 = read_CG_mod(cg_init) + + scale_disp, scale_force, scale_energy \ + = get_unit_conversion_factor(str_unit) + + if print_disp is True and print_force is True: + print_displacements_and_forces_xTAPP(structure_files, + aa, nat, + x_frac0, + scale_disp, + scale_force, + structure_file_offset) + + elif print_disp is True: + print_displacements_xTAPP(structure_files, + aa, nat, x_frac0, + scale_disp, + structure_file_offset) + + elif print_force is True: + print_atomicforces_xTAPP(structure_files, + nat, + scale_force, + structure_file_offset) + + elif print_energy is True: + print_energies_xTAPP(structure_files, + scale_energy, + structure_file_offset) diff --git a/tools/plotband.py b/tools/plotband.py index 1573da56..1612440b 100755 --- a/tools/plotband.py +++ b/tools/plotband.py @@ -36,12 +36,12 @@ help="normalize the x axis to unity.") -# font styles +# font styles mpl.rc('font', **{'family': 'Times New Roman', 'sans-serif': ['Helvetica']}) -mpl.rc('xtick', labelsize = 16) -mpl.rc('ytick', labelsize = 16) -mpl.rc('axes' , labelsize = 16) -mpl.rc('lines', linewidth = 1.5) +mpl.rc('xtick', labelsize=16) +mpl.rc('ytick', labelsize=16) +mpl.rc('axes', labelsize=16) +mpl.rc('lines', linewidth=1.5) mpl.rc('legend', fontsize='small') #mpl.rc('text', usetex=True) # line colors and styles @@ -178,14 +178,14 @@ def get_xy_minmax(array): xmin, xmax, ymin, ymax = get_xy_minmax(data_merged) fig, ax = plt.subplots() - + for i in range(len(data_merged)): ax.plot(data_merged[i][0:, 0], data_merged[i][0:, 1], - linestyle=lsty[i], color=color[i], label=files[i]) + linestyle=lsty[i], color=color[i], label=files[i]) for j in range(2, len(data_merged[i][0][0:])): ax.plot(data_merged[i][0:, 0], data_merged[i][0:, j], - linestyle=lsty[i], color=color[i]) + linestyle=lsty[i], color=color[i]) if options.unitname.lower() == "mev": ax.set_ylabel("Frequency (meV)", labelpad=20) diff --git a/tools/plotdos.py b/tools/plotdos.py index e7cdee4d..231af85e 100755 --- a/tools/plotdos.py +++ b/tools/plotdos.py @@ -172,7 +172,8 @@ def sum_atom_projected_dos(pdos_tmp, natoms_tmp): symbols, natoms = get_natoms_and_symbols(files[i]) if len(dos_merged[i][0, 1:]) != np.sum(natoms): - print("Error: Projected DOS is not contained in the %d-th file" % (i + 1)) + print( + "Error: Projected DOS is not contained in the %d-th file" % (i + 1)) exit(1) else: pdos = sum_atom_projected_dos(dos_merged[i][:, 1:], natoms) @@ -214,6 +215,6 @@ def sum_atom_projected_dos(pdos_tmp, natoms_tmp): if options.print_key: plt.legend(loc='upper right', prop={'size': 12}) - + plt.tight_layout() plt.show() diff --git a/tools/scph_to_qefc.py b/tools/scph_to_qefc.py new file mode 100644 index 00000000..af9afbbb --- /dev/null +++ b/tools/scph_to_qefc.py @@ -0,0 +1,196 @@ +#!/usr/bin/env python +# +# scph_to_qefc.py +# +# Simple script to add anharmonic correction to a QE force constant. +# +# Usage: +# $ scph_to_qefc.py original_QE.fc PREFIX.scph_fc2_correction target_temperature > new_QE.fc +# +# Copyright (c) 2019 Terumasa Tadano +# +# This file is distributed under the terms of the MIT license. +# Please see the file 'LICENCE.txt' in the root directory +# or http://opensource.org/licenses/mit-license.php for information. +# + +""" +Generator of new QE fc file containing anharmonic correction +""" + +import sys +import numpy as np + + +def parse_QEfc(file_QEfc): + + header = [] + nx = None + ny = None + nz = None + fc2 = None + nkd = None + nat = None + + with open(file_QEfc, 'r') as f: + line = f.readline() + header.append(line) + nkd, nat = [int(entry) for entry in line.strip().split()[:2]] + for i in range(nat + nkd + 4): + header.append(f.readline()) + + nx, ny, nz = [int(i) for i in f.readline().split()] + fc2 = np.zeros((3 * nat, 3 * nat, nx, ny, nz)) + + for icrd in range(3): + for jcrd in range(3): + for iat in range(nat): + for jat in range(nat): + f.readline() + + for m3 in range(nz): + for m2 in range(ny): + for m1 in range(nx): + fc2[3 * iat + icrd][3 * jat + + jcrd][m1][m2][m3] = float(f.readline().split()[3]) + + return header, nat, nkd, nx, ny, nz, fc2 + + +def get_structure_info_dfc2(file_dfc2): + + lavec = [] + nat = None + nkd = None + + with open(file_dfc2, 'r') as f: + lavec.append([float(t) for t in f.readline().strip().split()]) + lavec.append([float(t) for t in f.readline().strip().split()]) + lavec.append([float(t) for t in f.readline().strip().split()]) + line = f.readline().strip().split() + nat = int(line[0]) + nkd = int(line[1]) + + return np.array(lavec), nat, nkd + + +def get_dfc2(file_dfc2, temp_in): + + detect_temp_tag = False + dfc2 = [] + + with open(file_dfc2, 'r') as f: + + line = f.readline() + temp = None + + while line: + if "Temp" in line: + temp = float(line.strip().split()[-1]) + if temp == temp_in: + detect_temp_tag = True + break + + line = f.readline() + + line = f.readline() + while line: + if "#" in line: + break + + data = line.strip().split() + if len(data) > 0: + dfc2.append(data) + + line = f.readline() + + if not detect_temp_tag: + print("Delta FC2 data for the specified temperature (%.2f K) does not exist in %s" % ( + temp_in, file_dfc2)) + exit(1) + + return np.array(dfc2) + + +def create_newfc2(nx, ny, nz, fc2_orig, dfc2_array): + + fc2_new = np.copy(fc2_orig) + + for entry in dfc2_array: + + m1 = int(entry[0]) + m2 = int(entry[1]) + m3 = int(entry[2]) + iat = int(entry[3]) + icrd = int(entry[4]) + jat = int(entry[5]) + jcrd = int(entry[6]) + dfc2 = float(entry[7]) + + m1 = -m1 + m2 = -m2 + m3 = -m3 + + if m1 < 0: + m1 += nx + if m2 < 0: + m2 += ny + if m3 < 0: + m3 += nz + + if m1 >= nx: + m1 -= nx + if m2 >= ny: + m2 -= ny + if m3 >= nz: + m3 -= nz + + fc2_new[3 * iat + icrd][3 * jat + jcrd][m1][m2][m3] += dfc2 + + return fc2_new + + +def print_fc2(header_in, nx, ny, nz, nat, fc2_in): + + for line in header_in: + print(line.rstrip()) + print("%4d %3d %3d" % (nx, ny, nz)) + + for icrd in range(3): + for jcrd in range(3): + for iat in range(nat): + for jat in range(nat): + print(" %3d %3d %3d %3d" % + (icrd + 1, jcrd + 1, iat + 1, jat + 1)) + + for m3 in range(nz): + for m2 in range(ny): + for m1 in range(nx): + print(" %3d %3d %3d %19.11e" % ( + m1 + 1, m2 + 1, m3 + 1, fc2_in[3 * iat + icrd][3 * jat + jcrd][m1][m2][m3])) + + +if __name__ == '__main__': + + if len(sys.argv) != 4: + print("\nUsage:\n > python convert_to_qefc2.py original_QEfc2 scph_fc2_correction temperature\n") + exit(1) + + file_QEfc2 = sys.argv[1] + file_dfc2 = sys.argv[2] + temp_in = float(sys.argv[3]) + + header, nat, nkd, nx, ny, nz, fc2 = parse_QEfc(file_QEfc2) + _, nat2, nkd2 = get_structure_info_dfc2(file_dfc2) + + if nat != nat2: + print("ERROR: The number of atoms in the primitive cell is inconsistent.") + exit(1) + + if nkd != nkd2: + print("ERROR: The number of atomic elements is inconsistent.") + exit(1) + + dfc2 = get_dfc2(file_dfc2, temp_in) + fc2_new = create_newfc2(nx, ny, nz, fc2, dfc2) + print_fc2(header, nx, ny, nz, nat, fc2_new)