diff --git a/.DS_Store b/.DS_Store index 65498023..6cbaa83d 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/.gitignore b/.gitignore index b6a4374c..8497b234 100644 --- a/.gitignore +++ b/.gitignore @@ -24,5 +24,7 @@ /include/ tags build*/ -cmake-build-debug/ +/installed/ +/cmake-build-debug/ compilation.log + diff --git a/CMakeLists.txt b/CMakeLists.txt index e26ee451..5d2431d0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,23 @@ if (POLICY CMP0135) endif () # extract project version from source + +if(NOT DEFINED torch_switch) + if(DEFINED ENV{TORCH_SWITCH}) + set(torch_switch $ENV{TORCH_SWITCH}) + else() + set(torch_switch OFF) + endif() +endif() + +option(torch_switch "Enable Torch library integration" ${TORCH_SWITCH}) + +if(torch_switch) + add_definitions(-DTORCH_SWITCH) +endif() + file(STRINGS "src/efp.h" _src_efp_h REGEX "LIBEFP_VERSION_STRING") + if (${_src_efp_h} MATCHES "^#define LIBEFP_VERSION_STRING \"(.*)\"$") set(_libefp_VERSION ${CMAKE_MATCH_1}) endif() @@ -13,9 +29,17 @@ project( libefp # someday when Makefile dropped, configure efp.h.in from cmake VERSION ${_libefp_VERSION} - LANGUAGES C + LANGUAGES C CXX ) -set(libefp_AUTHORS "Ilya A. Kaliman, Lori A. Burns, Dmitry Morozov, Carlos H. Borca, Yen (Terri) Bui, Yongbin Kim, Lyudmila V. Slipchenko") + +#set(CMAKE_INSTALL_PREFIX "${PROJECT_SOURCE_DIR}/installed" CACHE PATH "Installation directory" FORCE) +#set(CMAKE_INSTALL_PREFIX "${LIBEFP_DIR}" CACHE PATH "Installation directory") +set(CMAKE_INSTALL_LIBDIR "lib") + +### LVS needs this on MacOS silicon +set(CMAKE_CXX_STANDARD 17) + +set(libefp_AUTHORS "Ilya A. Kaliman, Lori A. Burns, Suranjan Paul, Dmitry Morozov, Carlos H. Borca, Yen (Terri) Bui, Yongbin Kim, Lyudmila V. Slipchenko") set(libefp_DESCRIPTION "Parallel implementation of the Effective Fragment Potential method") set(libefp_URL "https://github.com/libefp2/libefp") set(libefp_LICENSE "BSD 2-clause") @@ -24,6 +48,7 @@ list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) set(efp libefp) # Namespace + # TODO: Remove when requiring cmake >= 3.21 # from LecrisUT/CMake-Template if (NOT DEFINED ${efp}_IS_TOP_LEVEL) if (CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) @@ -54,7 +79,10 @@ option_with_default(BUILD_FPIC "Libraries will be compiled with position indepen if((${BUILD_SHARED_LIBS}) AND NOT ${BUILD_FPIC}) message(FATAL_ERROR "BUILD_SHARED_LIBS ON and BUILD_FPIC OFF are incompatible, as shared library requires position independent code") endif() -option_with_print(LIBEFP_ENABLE_OPENMP "Enable OpenMP parallelization. Psi4 wants OFF" OFF) + +### This option turns OPENMP ON and OFF! +option_with_print(LIBEFP_ENABLE_OPENMP "Enable OpenMP parallelization. Psi4 wants OFF" ON) + option_with_print(ENABLE_GENERIC "Enable mostly static linking in shared library" OFF) include(xhost) # defines: option(ENABLE_XHOST "Enable processor-specific optimization" ON) option_with_print(FRAGLIB_UNDERSCORE_L "DEPRECATED: Installed fragment library has names ending in _L. Psi4 wants OFF" ON) @@ -132,6 +160,7 @@ set(raw_sources_list util.c xr.c ) + set(src_prefix "src/") string(REGEX REPLACE "([^;]+)" "${src_prefix}\\1" sources_list "${raw_sources_list}") @@ -203,6 +232,9 @@ install(FILES fraglib/makefp.inp install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/fraglib DESTINATION ${CMAKE_INSTALL_DATADIR}/${efp}) +install(DIRECTORY ${PROJECT_SOURCE_DIR}/nnlib + DESTINATION ${CMAKE_INSTALL_DATADIR}/${efp}) + # headers NOT namespace protected install(FILES ${src_prefix}/efp.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 097841b6..4e90a249 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -1,10 +1,11 @@ Libefp was written by Ilya Kaliman. The following people contributed to libefp. Thanks! +Yen (Terri) Bui Lori A. Burns -Dmitry Morozov Carlos H. Borca -Yen (Terri) Bui Yongbin Kim +Dmitry Morozov +Suranjan Paul Lyudmila V. Slipchenko diff --git a/Makefile b/Makefile index 4ab02f33..538e5f2b 100644 --- a/Makefile +++ b/Makefile @@ -5,6 +5,7 @@ all: efpmd efpmd: libefp cd efpmd/libff && CC="$(CC)" CFLAGS="$(MYCFLAGS)" $(MAKE) cd efpmd/libopt && CC="$(CC)" CFLAGS="$(MYCFLAGS)" FC="$(FC)" FFLAGS="$(MYFFLAGS)" $(MAKE) + cd efpmd/torch && CC="$(CC)" CFLAGS="$(MYCFLAGS)" $(MAKE) cd efpmd/src && $(MAKE) libefp: @@ -15,6 +16,7 @@ clean: cd tests && $(MAKE) $@ cd efpmd/libff && $(MAKE) $@ cd efpmd/libopt && $(MAKE) $@ + cd efpmd/torch && $(MAKE) $@ cd efpmd/src && $(MAKE) $@ rm -rf doxygen_html diff --git a/README-torch.md b/README-torch.md new file mode 100644 index 00000000..926572b2 --- /dev/null +++ b/README-torch.md @@ -0,0 +1,56 @@ + +# Installation with LibTorch for ML/EFP models + +## Required libraries + +- cmake +- lapack math library +- C/C++ compiler (GCC 9 or newer) +- Fortran 77 compiler + +An example of working setup at Purdue supercomputers +can be foound in *module.sh* script. + +AppleClang 14 works on M2 MacOS Ventura. + +## LibTorch library + +For ML/EFP models, one needs to use LibTorch library. +Install LibTorch (C++ frontend) of PyTorch. Consult Libtorch/Pytorch +webpages for detail: https://pytorch.org/cppdocs/ + +You can opt out and configure with EFP-only installation - see the next section. + +## Setup environmental variables + +*setup.sh* or *setup.csh* are used to set up environmental +variables. The first two are mandatory: + +`TORCH_SWITCH` is the variable governing compilation +with or without LibTorch. + +`LIBEFP_DIR` is a path to LibEFP directory with source codes. + +`INSTALLATION_DIR` is the installation directory. + +`TORCH_INSTALLED_DIR` and `LIBTORCH_INCLUDE_DIRS` are paths to the LibTorch +installation and included directories. + +## Compilation + +Further tuning can be done in `CMakeLists.txt`. Otherwise, +run `./compile.sh` to compile. + +Executable `efpmd` will be in `build/efpmd/efpmd` and in + +## Running test jobs + +Test jobs are contained in `tests` directory.To check the complilation, +do + +`cd tests` + +`make check` + +This will run all the test jobs and report `SUCCESS/FAILURE`. Examine any failed jobs carefully. + diff --git a/README.md b/README.md index 67ba36ff..45c6b948 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,10 @@ The latest release can be downloaded ## Installation +**See [README-torch.md](README-torch.md) for the up-to-date installation instructions! +For additional CMake instructions, see [README-cmake.md](README-cmake.md). +The section below is outdated.** + To build LIBEFP from source you need the following: - C compiler (with C99 standard and OpenMP support) @@ -65,8 +69,6 @@ Finally, to install everything issue: make install -For CMake instructions, see [README-cmake.md](README-cmake.md). - ## Documentation For a detailed documentation, tutorials, and EFP bibliography check out @@ -85,7 +87,7 @@ Fortran bindings to LIBEFP are available in The EFPMD program is a molecular simulation package based on LIBEFP. It supports EFP-only molecular simulations such as geometry optimization and molecular dynamics. EFPMD is a part of the LIBEFP distribution. -See [this](efpmd/README.md) file for more information. +See [EFPMD manual](https://libefp2.github.io/efpmd.html) for more information. ## Parallel scaling @@ -142,36 +144,4 @@ More information can be found in [How to create EFP parameters](https://libefp2. ## References -1. Fragmentation Methods: A Route to Accurate Calculations on Large Systems. - M.S.Gordon, D.G.Fedorov, S.R.Pruitt, L.V.Slipchenko. Chem. Rev. 112, 632-672 - (2012). - -2. Effective fragment method for modeling intermolecular hydrogen bonding - effects on quantum mechanical calculations. J.H.Jensen, P.N.Day, M.S.Gordon, - H.Basch, D.Cohen, D.R.Garmer, M.Krauss, W.J.Stevens in "Modeling the - Hydrogen Bond" (D.A. Smith, ed.) ACS Symposium Series 569, 1994, pp - 139-151. - -3. An effective fragment method for modeling solvent effects in quantum - mechanical calculations. P.N.Day, J.H.Jensen, M.S.Gordon, S.P.Webb, - W.J.Stevens, M.Krauss, D.Garmer, H.Basch, D.Cohen. J.Chem.Phys. 105, - 1968-1986 (1996). - -4. Solvation of the Menshutkin Reaction: A Rigorous test of the Effective - Fragment Model. S.P.Webb, M.S.Gordon. J.Phys.Chem.A 103, 1265-73 (1999). - -5. The Effective Fragment Potential Method: a QM-based MM approach to modeling - environmental effects in chemistry. M.S.Gordon, M.A.Freitag, - P.Bandyopadhyay, J.H.Jensen, V.Kairys, W.J.Stevens. J.Phys.Chem.A 105, - 293-307 (2001). - -6. The Effective Fragment Potential: a general method for predicting - intermolecular interactions. M.S.Gordon, L.V.Slipchenko, H.Li, J.H.Jensen. - Annual Reports in Computational Chemistry, Volume 3, pp 177-193 (2007). - -7. Water-benzene interactions: An effective fragment potential and correlated - quantum chemistry study. L.V.Slipchenko, M.S.Gordon. J.Phys.Chem.A 113, - 2092-2102 (2009). - -8. Damping functions in the effective fragment potential method. L.V.Slipchenko, - M.S.Gordon. Mol.Phys. 107, 999-1016 (2009). +A complete list of references to the EFP method can be found [here](https://libefp2.github.io/papers.html#). \ No newline at end of file diff --git a/bin/cubegen.pl b/bin/cubegen.pl deleted file mode 100755 index 1d3d681f..00000000 --- a/bin/cubegen.pl +++ /dev/null @@ -1,77 +0,0 @@ -#! /usr/bin/perl - -# This script generates a rectangular box of fragments for EFPMD input - -use 5.008; -use strict; -use warnings; - -use Math::Trig; - -if (scalar(@ARGV) != 6) { - die < - - a colon separated list of fragment names - a colon separated list of fragment ratios - distance between the fragments - number of fragments in x direction - number of fragments in y direction - number of fragments in z direction - -example: cubegen.pl c2h5oh_l:h2o_l 40:60 4.0 20 20 20 > vodka.in -EOF -} - -my @name = split ':', $ARGV[0]; -my @ratio = split ':', $ARGV[1]; -my $space = $ARGV[2]; -my $nx = $ARGV[3]; -my $ny = $ARGV[4]; -my $nz = $ARGV[5]; - -die "ratios do not match names" unless scalar(@name) == scalar(@ratio); -die "positive number expected" unless $space > 0.0 && $nx > 0 && $ny > 0 && $nz > 0; - -foreach my $i (1 .. scalar(@ratio) - 1) { - $ratio[$i] += $ratio[$i - 1]; -} - -foreach my $x (0 .. $nx - 1) { - foreach my $y (0 .. $ny - 1) { - foreach my $z (0 .. $nz - 1) { - print_fragment($x, $y, $z); - } - } -} - -sub select_fragment { - my $n = int(rand($ratio[-1])); - - foreach my $i (0 .. scalar(@ratio) - 1) { - if ($ratio[$i] > $n) { - return $i; - } - } - - die; -} - -sub print_fragment { - my ($x, $y, $z) = @_; - my $idx = select_fragment(); - my @xyzabc = ($space * $x, - $space * $y, - $space * $z, - 2.0 * pi * rand, - pi * rand, - 2.0 * pi * rand); - - print "\n", "fragment ", $name[$idx], "\n"; - - foreach (@xyzabc) { - printf " %8.3f", $_; - } - - print "\n"; -} diff --git a/bin/trajectory.pl b/bin/trajectory.pl deleted file mode 100755 index 2dba2b50..00000000 --- a/bin/trajectory.pl +++ /dev/null @@ -1,31 +0,0 @@ -#! /usr/bin/perl - -# This script extracts trajectory data from EFPMD output - -use 5.008; -use strict; -use warnings; - -die "usage: trajectory.pl \n" if scalar(@ARGV) != 1; - -open(FH, "<", $ARGV[0]) || die "$!"; - -while () { - next unless /GEOMETRY/; - ; - - my @lines; - - while () { - last if /^$/; - push @lines, $_; - } - - print scalar(@lines), "\n"; - print "xyz", "\n"; - - foreach (@lines) { - $_ =~ s/A[0-9]+([a-zA-Z]+)[0-9]*/$1/; - print $_; - } -} diff --git a/compile.sh b/compile.sh new file mode 100755 index 00000000..daf8769e --- /dev/null +++ b/compile.sh @@ -0,0 +1,23 @@ +#!/bin/csh + +rm -rf build +mkdir build + +if ( "$TORCH_SWITCH" == "ON" ) then + echo "Building with Torch integration..." + echo "TORCH_DIR = ${TORCH_INSTALLED_DIR}" + cd build + setenv TORCH_CXX_FLAGS "-D_GLIBCXX_USE_CXX11_ABI=0" + cmake -DCMAKE_INSTALL_PREFIX=${INSTALLATION_DIR} -DCMAKE_PREFIX_PATH=${TORCH_INSTALLED_DIR} -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON .. + #cmake -DCMAKE_PREFIX_PATH=${TORCH_INSTALLED_DIR} -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON .. + make VERBOSE=1 + make install +else + echo "Building without Torch integration..." + cmake -H. -Bbuild -DCMAKE_INSTALL_PREFIX=${INSTALLATION_DIR} + cd build + make VERBOSE=1 + make install +endif + +echo "Compilation complete. You can now run test jobs as '${INSTALLATION_DIR}/bin/efpmd input.in' from the tests directory." diff --git a/efpmd/CMakeLists.txt b/efpmd/CMakeLists.txt index 539458da..d70ea295 100644 --- a/efpmd/CMakeLists.txt +++ b/efpmd/CMakeLists.txt @@ -1,4 +1,18 @@ +if(NOT DEFINED torch_switch) + if(DEFINED ENV{TORCH_SWITCH}) + set(torch_switch $ENV{TORCH_SWITCH}) + else() + set(torch_switch OFF) + endif() +endif() + +option(torch_switch "Enable Torch library integration" ${TORCH_SWITCH}) + +if(torch_switch) + add_definitions(-DTORCH_SWITCH) +endif() + add_library( libff OBJECT @@ -14,8 +28,15 @@ add_library( libopt/timer.f ) -add_executable( - efpmd +if(torch_switch) + find_package(Torch REQUIRED) + add_library(ctorch OBJECT torch/c_libtorch.cc) +endif() + +if(torch_switch) + message(STATUS "Torch integration enabled.") + add_executable( + efpmd src/cfg.c src/common.c src/efield.c @@ -30,15 +51,93 @@ add_executable( src/parse.c src/rand.c src/sp.c + src/torch.c ) -target_include_directories( +else() + message(STATUS "Torch integration disabled.") + add_executable( + efpmd + src/cfg.c + src/common.c + src/efield.c + src/energy.c + src/grad.c + src/gtest.c + src/hess.c + src/main.c + src/md.c + src/msg.c + src/opt.c + src/parse.c + src/rand.c + src/sp.c + ) +endif() + +#set(TORCH_INCLUDE_DIRS "/depot/lslipche/data/skp/libtorch/include/;/depot/lslipche/data/skp/libtorch/include/torch/csrc/api/include") + +set(TORCH_INCLUDE_DIRS "$ENV{LIBTORCH_INCLUDE_DIRS}" CACHE PATH "Torch include directories") + +if(torch_switch) + message("TORCH_INSTALL_PREFIX = ${TORCH_INSTALL_PREFIX}") + message("TORCH_LIBRARIES = ${TORCH_LIBRARIES}") + message("TORCH_INCLUDE_DIRS = ${TORCH_INCLUDE_DIRS}") +endif() + +set_target_properties(efpmd PROPERTIES + CXX_STANDARD 14 + CXX_STANDARD_REQUIRED YES +) + +if(torch_switch) + target_include_directories( + ctorch + PRIVATE + ${TORCH_INCLUDE_DIRS} + ) +endif() + +if(torch_switch) + target_include_directories( + efpmd + PRIVATE + libff/ + libopt/ + ../src/ + ctorch/ + ${TORCH_INCLUDE_DIRS} + ) +else() + target_include_directories( efpmd PRIVATE libff/ libopt/ ../src/ ) -target_link_libraries( +endif() + +if(torch_switch) + target_link_libraries( + ctorch + PUBLIC + "${TORCH_LIBRARIES}" + ) +endif() + +if(torch_switch) + target_link_libraries( + efpmd + PUBLIC + ${efp}::efp + ctorch + "${TORCH_LIBRARIES}" + PRIVATE + libff + libopt + ) +else() + target_link_libraries( efpmd PUBLIC ${efp}::efp @@ -46,11 +145,16 @@ target_link_libraries( libff libopt ) +endif() + + target_compile_definitions( efpmd PRIVATE $ $ + $ +# $ ) add_executable(${efp}::efpmd ALIAS efpmd) @@ -90,3 +194,4 @@ install( DESTINATION ${LIBEFP_CMAKECONFIG_INSTALL_DIR} ) + diff --git a/efpmd/libopt/opt.c b/efpmd/libopt/opt.c index d42775d8..d5e2bc06 100644 --- a/efpmd/libopt/opt.c +++ b/efpmd/libopt/opt.c @@ -28,7 +28,7 @@ #include #include #include - +#include #include "opt.h" struct opt_state { @@ -147,6 +147,7 @@ enum opt_result opt_init(struct opt_state *state, size_t n, const double *x) void opt_set_func(struct opt_state *state, opt_func_t func) { + // printf("Inside opt_set_func\n"); assert(state); state->func = func; } @@ -170,12 +171,16 @@ void opt_set_bound(struct opt_state *state, size_t n, const int *nbd, enum opt_result opt_step(struct opt_state *state) { + // this is where the compute_efp gets evoked again and again + // printf("marker for calling opt_step\n"); assert(state); next: call_routine(state); if (strncmp(state->task, "FG", strlen("FG")) == 0) { + // when this if block is traversed compute_efp is evoked + printf("\n L-BFGS-B optimizer direction search \n"); state->f = state->func(state->n, state->x, state->g, state->data); if (isnan(state->f)) @@ -184,20 +189,23 @@ enum opt_result opt_step(struct opt_state *state) goto next; } - if (strncmp(state->task, "NEW_X", strlen("NEW_X")) == 0) + if (strncmp(state->task, "NEW_X", strlen("NEW_X")) == 0){ + printf("\n L-BFGS-B optimizer new step \n"); return OPT_RESULT_SUCCESS; - + } return OPT_RESULT_ERROR; } double opt_get_fx(struct opt_state *state) { + // printf("marker for calling in opt_get_fx\n"); assert(state); return state->f; } void opt_get_x(struct opt_state *state, size_t size, double *out) { + // printf("marker for calling in opt_get_x\n"); assert(state); assert(size >= state->n); assert(out); @@ -207,6 +215,7 @@ void opt_get_x(struct opt_state *state, size_t size, double *out) void opt_get_gx(struct opt_state *state, size_t size, double *out) { + // printf("marker for calling in opt_get_gx\n"); assert(state); assert(size >= state->n); assert(out); diff --git a/efpmd/src/Makefile b/efpmd/src/Makefile index 69abadef..b327478e 100644 --- a/efpmd/src/Makefile +++ b/efpmd/src/Makefile @@ -1,8 +1,8 @@ include ../../config.inc -CFLAGS= -DFRAGLIB_PATH="\"$(FRAGLIB)\"" -I../../src -I../libopt -I../libff $(MYCFLAGS) -LDFLAGS= -L../../src -L../libopt -L../libff $(MYLDFLAGS) -LIBS= -lefp -lopt -lff $(MYLIBS) -lm +CFLAGS= -DFRAGLIB_PATH="\"$(FRAGLIB)\"" -I../../src -I../libopt -I../libff -I../torch $(MYCFLAGS) +LDFLAGS= -L../../src -L../libopt -L../libff -L../torch $(MYLDFLAGS) +LIBS= -lefp -lopt -lff -ltorch $(MYLIBS) -lm PROG= efpmd ALL_O= cfg.o common.o efield.o energy.o grad.o gtest.o hess.o main.o \ diff --git a/efpmd/src/cfg.c b/efpmd/src/cfg.c index be8db46f..5b86cbc2 100644 --- a/efpmd/src/cfg.c +++ b/efpmd/src/cfg.c @@ -560,3 +560,4 @@ void cfg_free(struct cfg *cfg) free(cfg); } } + diff --git a/efpmd/src/common.c b/efpmd/src/common.c index cfb2bb0e..defdc5bf 100644 --- a/efpmd/src/common.c +++ b/efpmd/src/common.c @@ -98,6 +98,7 @@ void print_vec(const double *vec) void print_geometry(struct efp *efp) { +// printf("Inside print_geometry\n"); size_t n_frags; check_fail(efp_get_frag_count(efp, &n_frags)); @@ -197,6 +198,7 @@ void print_geometry_pbc(struct efp *efp, int ligand) void print_energy(struct state *state) { +// printf("Inside print_energy\n"); struct efp_energy energy; check_fail(efp_get_energy(state->efp, &energy)); @@ -211,8 +213,18 @@ void print_energy(struct state *state) energy.electrostatic_point_charges); msg("%30s %16.10lf\n", "CHARGE PENETRATION ENERGY", energy.charge_penetration); + msg("%30s %16.10lf\n", "QQ ENERGY", energy.qq); + msg("%30s %16.10lf\n", "LJ ENERGY", energy.lj); + msg("\n"); +#ifdef TORCH_SWITCH + if (state->torch) { + msg("%30s %16.10lf\n", "ML ENERGY", state->torch_energy); + msg("\n"); + } +#endif + if (state->ff) { msg("%30s %16.10lf\n", "FORCE-FIELD ENERGY", ff_get_energy(state->ff)); diff --git a/efpmd/src/common.h b/efpmd/src/common.h index 0a182e01..047372ac 100644 --- a/efpmd/src/common.h +++ b/efpmd/src/common.h @@ -43,6 +43,7 @@ #include #include +//#include "../torch/c_libtorch.h" #include #include "cfg.h" @@ -60,6 +61,7 @@ enum run_type { RUN_TYPE_MD, RUN_TYPE_EFIELD, RUN_TYPE_ELPOT, + RUN_TYPE_FRAG_ELPOT, RUN_TYPE_GTEST, RUN_TYPE_ETEST }; @@ -70,18 +72,14 @@ enum ensemble_type { ENSEMBLE_TYPE_NPT }; -/* -struct atom { - char *name; - double x; - double y; - double z; +enum atom_gradient{ + ATOM_GRAD_MM, + ATOM_GRAD_FRAG }; -*/ struct frag { char *name; - double coord[12]; + double *coord; size_t n_atoms; struct efp_atom *atoms; double vel[6]; @@ -105,12 +103,16 @@ struct sys { struct state { struct efp *efp; struct ff *ff; + struct torch *torch; struct cfg *cfg; struct sys *sys; double energy; + double torch_energy; double *grad; + double *torch_grad; }; + void NORETURN die(const char *, ...); void NORETURN error(const char *, ...); diff --git a/efpmd/src/efield.c b/efpmd/src/efield.c index e42be6e7..54605ae9 100644 --- a/efpmd/src/efield.c +++ b/efpmd/src/efield.c @@ -25,6 +25,8 @@ */ #include "common.h" +#include "cfg.h" + void sim_efield(struct state *state); void sim_elpot(struct state *state); @@ -130,3 +132,64 @@ sim_elpot(struct state *state) msg("ELECTROSTATIC POTENTIAL JOB COMPLETED SUCCESSFULLY\n"); } + +/* +void get_frag_elpot(struct state *state) { + size_t spec_frag; + spec_frag = cfg_get_int(state->cfg, "special_fragment"); + + double elpot; + struct efp_atom *atoms; + size_t n_atoms; + + + check_fail(efp_get_frag_atom_count(state->efp, spec_frag, &n_atoms)); // SKP + atoms = xmalloc(n_atoms * sizeof(struct efp_atom)); + check_fail(efp_get_frag_atoms(state->efp, spec_frag, n_atoms, atoms)); + //state->spec_elpot = malloc(n_atoms * sizeof(double)); + state->spec_elpot = xcalloc(n_atoms, sizeof(double)); + + + for (size_t j = 0; j < n_atoms; j++) { + check_fail(efp_get_elec_potential(state->efp, spec_frag, &atoms[j].x, &elpot)); + state->spec_elpot[j] = elpot; + print_elpot(atoms + j, elpot); + } + + free(atoms); +} +*/ + +void sim_frag_elpot(struct state *state) { + + // size_t chosen_frag = cfg_get_int(state->cfg, "frag_num"); + size_t spec_frag; + spec_frag = cfg_get_int(state->cfg, "special_fragment"); + + msg("\n=============FRAG-ELECTROSTATIC POTENTIAL JOB======================\n\n"); + + + msg("\nCOORDINATES IN ANGSTROMS, ELECTROSTATIC POTENTIAL IN ATOMIC UNITS\n"); + msg(" ATOM X Y Z ELPOT \n\n"); + + double elpot; + struct efp_atom *atoms; + size_t n_atoms; + + + check_fail(efp_get_frag_atom_count(state->efp, spec_frag, &n_atoms)); // SKP + atoms = xmalloc(n_atoms * sizeof(struct efp_atom)); + check_fail(efp_get_frag_atoms(state->efp, spec_frag, n_atoms, atoms)); + + msg("ELECTROSTATIC POTENTIAL ON FRAGMENT %zu\n", spec_frag); + + for (size_t j = 0; j < n_atoms; j++) { + check_fail(efp_get_elec_potential(state->efp, spec_frag, &atoms[j].x, &elpot)); + print_elpot(atoms + j, elpot); + } + + msg("\n"); + free(atoms); + + msg("============FRAG-ELECTROSTATIC POTENTIAL JOB COMPLETED SUCCESSFULLY===========\n\n"); +} diff --git a/efpmd/src/energy.c b/efpmd/src/energy.c index b9c711b5..e61dcc89 100644 --- a/efpmd/src/energy.c +++ b/efpmd/src/energy.c @@ -25,6 +25,13 @@ */ #include "common.h" +#ifdef TORCH_SWITCH +#include "torch.h" +#endif +#include "time.h" +//#include "../torch/torch.h" + +// void get_frag_elpot(struct state *); /* current coordinates from efp struct are used */ void compute_energy(struct state *state, bool do_grad) @@ -32,10 +39,15 @@ void compute_energy(struct state *state, bool do_grad) struct efp_atom *atoms; struct efp_energy efp_energy; double xyz[3], xyzabc[6], *grad; - size_t ifrag, nfrag, iatom, natom; + size_t ifrag, nfrag, iatom, natom, spec_frag, n_special_atoms; int itotal; + if (cfg_get_int(state->cfg, "print")>0) { + print_geometry(state->efp); + } + /* EFP part */ + // print_geometry(state->efp); check_fail(efp_compute(state->efp, do_grad)); check_fail(efp_get_energy(state->efp, &efp_energy)); check_fail(efp_get_frag_count(state->efp, &nfrag)); @@ -44,10 +56,14 @@ void compute_energy(struct state *state, bool do_grad) check_fail(efp_get_gradient(state->efp, state->grad)); check_fail(efp_get_point_charge_gradient(state->efp, state->grad + 6 * nfrag)); + if (cfg_get_int(state->cfg, "print") > 0) + print_gradient(state); } state->energy = efp_energy.total; - + // print_energy(state); + // printf("\n State energy (state->energy) %lf \n", state->energy); + /* constraints */ for (ifrag = 0; ifrag < nfrag; ifrag++) { const struct frag *frag = state->sys->frags + ifrag; @@ -73,6 +89,100 @@ void compute_energy(struct state *state, bool do_grad) } } + /* Torch fragment part here */ +#ifdef TORCH_SWITCH + + if (cfg_get_bool(state->cfg, "enable_torch") && cfg_get_int(state->cfg, "opt_special_frag") > -1) { + + spec_frag = cfg_get_int(state->cfg, "special_fragment"); + check_fail(efp_get_frag_atom_count(state->efp, spec_frag, &n_special_atoms)); // SKP + + if (cfg_get_bool(state->cfg, "enable_elpot")) { + double *elpot; + struct efp_atom *atoms; + atoms = xmalloc(n_special_atoms * sizeof(struct efp_atom)); + check_fail(efp_get_frag_atoms(state->efp, spec_frag, n_special_atoms, atoms)); + elpot = xcalloc(n_special_atoms, sizeof(double)); + for (size_t j = 0; j < n_special_atoms; j++) { + check_fail(efp_get_elec_potential(state->efp, spec_frag, &atoms[j].x, elpot + j)); + } + free(atoms); + + if (cfg_get_int(state->cfg, "print") > 2) { + printf("\n ELECTROSTATIC POTENTIAL \n"); + for (iatom = 0; iatom < n_special_atoms; iatom++) { + printf("%12.6f\n", *(elpot + iatom)); + } + } + torch_set_elpot(state->torch, elpot); + free(elpot); + + //printf("\n\n=================CUSTOM MODEL=====================\n\n"); + clock_t start_time = clock(); + torch_custom_compute(state->torch, cfg_get_int(state->cfg, "print")); + clock_t end_time = clock(); + double time_taken = ((double)(end_time - start_time)) / CLOCKS_PER_SEC; + if (cfg_get_int(state->cfg, "print")>1) printf("WALL time to compute ML energy: %f seconds\n", time_taken); + //printf("=======================================================\n\n"); + } + else { + //printf("\n\n=================REGULAR ANI-MODEL=====================\n"); + clock_t start_time = clock(); + torch_compute(state->torch, cfg_get_string(state->cfg, "ml_path"), cfg_get_int(state->cfg, "print")); + clock_t end_time = clock(); + double time_taken = ((double)(end_time - start_time)) / CLOCKS_PER_SEC; + if (cfg_get_int(state->cfg, "print")>1) printf("WALL time to compute ML energy: %f seconds\n", time_taken); + //printf("\n\n========================================================\n"); + } + + state->torch_energy = torch_get_energy(state->torch); + state->energy += state->torch_energy; + + if (do_grad) { + torch_get_gradient(state->torch, state->torch_grad); + + if (cfg_get_int(state->cfg, "print") > 2) { + printf("\nTorch gradient in energy.c\n"); + for (size_t i = 0; i < 3*n_special_atoms; i++) + printf("%lf ", state->torch_grad[i]); + } + + // combine EFP and torch (atomic) gradients on special fragments + // do not add EFP contribution on a special fragment if it is the only fragment in the system + if (nfrag > 1) { + double *tmp_grad = xcalloc(n_special_atoms * 3, sizeof(double)); + + // get gradient from fragment atoms directly if QQ and LJ terms are computed + if (cfg_get_enum(state->cfg, "atom_gradient") == ATOM_GRAD_MM) { + check_fail(efp_get_atom_gradient(state->efp, spec_frag, tmp_grad)); + } else + check_fail(efp_get_frag_atomic_gradient(state->efp, spec_frag, tmp_grad)); + + if (cfg_get_int(state->cfg, "print") > 2) { + printf("\nEFP fragment atomic gradient\n"); + for (size_t i = 0; i < 3 * n_special_atoms; i++) + printf("%lf ", tmp_grad[i]); + printf("\n"); + } + + // adding EFP and TORCH gradients on special fragment + for (size_t i = 0; i < 3*n_special_atoms; i++) + state->torch_grad[i] += tmp_grad[i]; + + // print total EFP and torch gradients + if (cfg_get_int(state->cfg, "print") > 2) { + printf("\n TOTAL GRADIENTS on ML fragment atoms\n\n"); + for (size_t i = 0; i < n_special_atoms; i++) + printf("%s %12.6f %12.6f %12.6f\n", state->sys->frags[spec_frag].atoms[i].label, + state->torch_grad[i*3], state->torch_grad[i*3+1], state->torch_grad[i*3+2]); + printf("\n"); + } + free(tmp_grad); + } + } + } +#endif + /* MM force field part */ if (state->ff == NULL) return; diff --git a/efpmd/src/gtest.c b/efpmd/src/gtest.c index ea320d88..403b7246 100644 --- a/efpmd/src/gtest.c +++ b/efpmd/src/gtest.c @@ -26,13 +26,24 @@ #include "common.h" +#ifdef TORCH_SWITCH +#include "torch.h" +#endif + void sim_gtest(struct state *state); static void test_vec(char label, size_t idx, double tol, const double *agrad, const double *ngrad) { +// printf("Entering test_vec\n"); bool match = true; +// printf("\nAnalytical Gradients in test_vec:\n"); +// for (int j = 0; j < 3; ++j) { +// printf("%f\t", agrad[j]); +// } +// printf("\n\n"); + for (size_t i = 0; i < 3; i++) if (fabs(agrad[i] - ngrad[i]) > tol) match = false; @@ -47,6 +58,7 @@ static void test_vec(char label, size_t idx, double tol, const double *agrad, static void test_cgrad(struct state *state, const double *cgrad) { +// printf("Entering test_cgrad()\n"); double tol = cfg_get_double(state->cfg, "gtest_tol"); double dstep = cfg_get_double(state->cfg, "num_step_dist"); @@ -86,17 +98,23 @@ static void test_cgrad(struct state *state, const double *cgrad) static void test_fgrad(struct state *state, const double *fgrad) { +// printf("Entering test_fgrad()\n"); double tol = cfg_get_double(state->cfg, "gtest_tol"); double dstep = cfg_get_double(state->cfg, "num_step_dist"); double astep = cfg_get_double(state->cfg, "num_step_angle"); - size_t n_frags; + size_t n_frags, spec_frag; check_fail(efp_get_frag_count(state->efp, &n_frags)); + spec_frag = n_frags + 1; // make in inactive if torch model is off + if (cfg_get_bool(state->cfg, "enable_torch") ) + spec_frag = cfg_get_int(state->cfg, "special_fragment"); double xyzabc[6 * n_frags]; check_fail(efp_get_coordinates(state->efp, xyzabc)); - for (size_t i = 0; i < n_frags; i++) { + for (size_t i = 0, k=0; i < n_frags; i++) { + + if (i == spec_frag) continue; double deriv[3], ngrad[6]; for (size_t j = 0; j < 6; j++) { @@ -118,30 +136,222 @@ static void test_fgrad(struct state *state, const double *fgrad) ngrad[j] = (e2 - e1) / (2.0 * step); } - test_vec('F', i + 1, tol, fgrad + 6 * i, ngrad); - efp_torque_to_derivative(xyzabc + 6 * i + 3, fgrad + 6 * i + 3, deriv); + test_vec('F', i + 1, tol, fgrad + 6 * k, ngrad); + efp_torque_to_derivative(xyzabc + 6 * i + 3, fgrad + 6 * k + 3, deriv); test_vec('D', i + 1, tol, deriv, ngrad + 3); + + k++; } check_fail(efp_set_coordinates(state->efp, EFP_COORD_TYPE_XYZABC, xyzabc)); } +#ifdef TORCH_SWITCH +static void test_agrad(struct state *state, const double *agrad) +{ + //printf("\n\nSTARTING TEST_AGRAD()\n\n"); + double tol = cfg_get_double(state->cfg, "gtest_tol"); + double dstep = cfg_get_double(state->cfg, "num_step_dist"); + + size_t spec_frag, n_special_atoms; + + spec_frag = cfg_get_int(state->cfg, "special_fragment"); + check_fail(efp_get_frag_atom_count(state->efp, spec_frag, &n_special_atoms)); + + double atom_coord[3 * n_special_atoms]; // = (double*)malloc(3 * n_special_atoms * sizeof(double)); + check_fail(efp_get_frag_atom_coord(state->efp, spec_frag, atom_coord)); + + for (size_t i = 0; i < n_special_atoms; i++) { + double ngrad[3]; + for (size_t j = 0; j < 3; j++) { + + double e1, e2; + double coord = atom_coord[3 * i + j]; + + atom_coord[3 * i + j] = coord - dstep; + // propagate special fragment coordinates to EFP and update fragment parameters + check_fail(update_special_fragment(state->efp, atom_coord)); + // propagate special fragment coordinates to torch + torch_set_coord(state->torch, atom_coord); + compute_energy(state, 0); + e1 = state->energy; + + atom_coord[3 * i + j] = coord + dstep; + // propagate special fragment coordinates to EFP and update fragment parameters + check_fail(update_special_fragment(state->efp, atom_coord)); + // propagate special fragment coordinates to torch + torch_set_coord(state->torch, atom_coord); + compute_energy(state, 0); + e2 = state->energy; + + // return to the original coordinates? + atom_coord[3 * i + j] = coord; + // propagate special fragment coordinates to EFP and update fragment parameters + check_fail(update_special_fragment(state->efp, atom_coord)); + // propagate special fragment coordinates to torch + torch_set_coord(state->torch, atom_coord); + + if (cfg_get_int(state->cfg, "print") > 0) + printf("\nAtom %2zu, coord %2zu displacement, energies: %12.8f %12.8f\n",i,j,e1,e2); + + ngrad[j] = ((e2 - e1) / (2.0 * dstep)); + } + printf("\n"); + test_vec('A', i + 1, tol, agrad + 3 * i, ngrad); + } + + // propagate special fragment coordinates to EFP and update fragment parameters + check_fail(update_special_fragment(state->efp, atom_coord)); + // propagate special fragment coordinates to torch + torch_set_coord(state->torch, atom_coord); + +} +#endif + + +/* +// 5 point stencil +static void test_agrad(struct state *state, const double *agrad) +{ + double tol = cfg_get_double(state->cfg, "gtest_tol"); + double dstep = cfg_get_double(state->cfg, "num_step_dist"); + + size_t spec_frag, n_special_atoms; + + spec_frag = cfg_get_int(state->cfg, "special_fragment"); + check_fail(efp_get_frag_atom_count(state->efp, spec_frag, &n_special_atoms)); + + double atom_coord[3 * n_special_atoms]; // = (double*)malloc(3 * n_special_atoms * sizeof(double)); + check_fail(efp_get_frag_atom_coord(state->efp, spec_frag, atom_coord)); + + for (size_t i = 0; i < n_special_atoms; i++) { + double ngrad[3]; + double tmp_agrad[3]; + for (size_t j = 0; j < 3; j++) { + + double e1, e2, e3, e4; + double coord = atom_coord[3 * i + j]; + + // (x-2h) + atom_coord[3 * i + j] = coord - 2.0 * dstep; + check_fail(update_special_fragment(state->efp, atom_coord)); + torch_set_coord(state->torch, atom_coord); + compute_energy(state, 1); + e1 = state->energy; + + // (x-h) + atom_coord[3 * i + j] = coord - dstep; + check_fail(update_special_fragment(state->efp, atom_coord)); + torch_set_coord(state->torch, atom_coord); + compute_energy(state, 1); + e2 = state->energy; + + + // (x+h) + atom_coord[3 * i + j] = coord + dstep; + check_fail(update_special_fragment(state->efp, atom_coord)); + torch_set_coord(state->torch, atom_coord); + compute_energy(state, 1); + e3 = state->energy; + + // (x+2h) + atom_coord[3 * i + j] = coord + 2.0 * dstep; + check_fail(update_special_fragment(state->efp, atom_coord)); + torch_set_coord(state->torch, atom_coord); + compute_energy(state, 1); + e4 = state->energy; + + atom_coord[3 * i + j] = coord; + check_fail(update_special_fragment(state->efp, atom_coord)); + torch_set_coord(state->torch, atom_coord); + + //ngrad[j] = (e2 - e1) / (2.0 * dstep); + // 5 point stencil + ngrad[j] = (-e4 + (8.0 * e3) - (8.0 * e2) + e1) / (12.0 * dstep); + tmp_agrad[j] = agrad[i * 3 + j]; + + printf("\nNumerical Gradients:\n"); + for (int j = 0; j < 3; ++j) { + printf("%f\t", ngrad[j]); + } + } + printf("\nAnalytical Gradients before calling test_vec:\n"); + for (int j = 0; j < 3; ++j) { + printf("%f\t", tmp_agrad[j]); + } + printf("\n\n"); + + test_vec('A', i + 1, tol, agrad + 3 * i, ngrad); + } + + check_fail(update_special_fragment(state->efp, atom_coord)); + torch_set_coord(state->torch, atom_coord); + +} +*/ static void test_grad(struct state *state) { +// printf("Entering test_grad()\n"); size_t n_frags, n_charges; + size_t spec_frag, n_special_atoms; check_fail(efp_get_frag_count(state->efp, &n_frags)); check_fail(efp_get_point_charge_count(state->efp, &n_charges)); - double fgrad[6 * n_frags]; - memcpy(fgrad, state->grad, n_frags * 6 * sizeof(double)); - - if (n_charges > 0) { - double cgrad[3 * n_charges]; - check_fail(efp_get_point_charge_gradient(state->efp, cgrad)); - test_cgrad(state, cgrad); - } - - test_fgrad(state, fgrad); +#ifdef TORCH_SWITCH + // models with libtorch optimized fragment + if (cfg_get_bool(state->cfg, "enable_torch")) { + spec_frag = cfg_get_int(state->cfg, "special_fragment"); + check_fail(efp_get_frag_atom_count(state->efp, spec_frag, &n_special_atoms)); + + // check efp and charges gradient on non-special fragment + double fgrad[6 * (n_frags-1)]; + double agrad[3 * n_special_atoms]; + + // skips gradient of special fragment + for (size_t i=0, k=0; igrad+6*i, 6 * sizeof(double)); + k++; + } + // memcpy(fgrad, state->grad, n_frags * 6 * sizeof(double)); + + memcpy(agrad, state->torch_grad, (3 * n_special_atoms) * sizeof(double)); + + //printf("Torch->energy %12.6f\n\n",state->energy); + //printf("Analytical Gradients: in test_grad\n"); + //for (int i = 0; i < n_special_atoms; ++i) { + // for (int j = 0; j < 3; ++j) { + // printf("%f\t", agrad[i * 3 + j]); + // } + // printf("\n"); + //} + + if (n_charges > 0) { + double cgrad[3 * n_charges]; + check_fail(efp_get_point_charge_gradient(state->efp, cgrad)); + test_cgrad(state, cgrad); // test point charge gradient + } + + msg("\nTESTING GRADIENTS ON EFP FRAGMENTS\n"); + test_fgrad(state, fgrad); // test efp fragment gradient + msg("\nTESTING GRADIENTS ON SPECIAL FRAGMENT ATOMS\n"); + test_agrad(state, agrad); // test gradient on special fragment atoms + } +#endif + + // original "normal efp only" case + if (!cfg_get_bool(state->cfg, "enable_torch")) { + double fgrad[6 * n_frags]; + memcpy(fgrad, state->grad, n_frags * 6 * sizeof(double)); + + if (n_charges > 0) { + double cgrad[3 * n_charges]; + check_fail(efp_get_point_charge_gradient(state->efp, cgrad)); + test_cgrad(state, cgrad); + } + + test_fgrad(state, fgrad); + } } static void test_energy(struct state *state) diff --git a/efpmd/src/main.c b/efpmd/src/main.c index 8b9795e5..d08a10e0 100644 --- a/efpmd/src/main.c +++ b/efpmd/src/main.c @@ -28,6 +28,10 @@ #include "common.h" +#ifdef TORCH_SWITCH +#include "torch.h" +#endif + #include #include #include @@ -41,8 +45,10 @@ void sim_opt(struct state *); void sim_md(struct state *); void sim_efield(struct state *); void sim_elpot(struct state *); +void sim_frag_elpot(struct state *); void sim_gtest(struct state *); void sim_etest(struct state *); +// void test_nnp7(); #define USAGE_STRING \ "usage: efpmd [-d | -v | -h | input]\n" \ @@ -62,6 +68,7 @@ static struct cfg *make_cfg(void) "md\n" "efield\n" "elpot\n" + "frag_elpot\n" "gtest\n" "etest\n", (int []) { RUN_TYPE_SP, @@ -71,6 +78,7 @@ static struct cfg *make_cfg(void) RUN_TYPE_MD, RUN_TYPE_EFIELD, RUN_TYPE_ELPOT, + RUN_TYPE_FRAG_ELPOT, RUN_TYPE_GTEST, RUN_TYPE_ETEST}); @@ -84,7 +92,10 @@ static struct cfg *make_cfg(void) EFP_COORD_TYPE_ROTMAT, EFP_COORD_TYPE_ATOMS}); + // default terms - all efp terms cfg_add_string(cfg, "terms", "elec pol disp xr"); + // default special terms are the same as normal terms - redefined in parse_input + cfg_add_string(cfg, "special_terms", ""); cfg_add_enum(cfg, "elec_damp", EFP_ELEC_DAMP_SCREEN, "screen\n" @@ -129,7 +140,8 @@ static struct cfg *make_cfg(void) cfg_add_string(cfg, "userlib_path", "."); cfg_add_bool(cfg, "enable_pbc", false); cfg_add_string(cfg, "periodic_box", "30.0 30.0 30.0 90.0 90.0 90.0"); - cfg_add_double(cfg, "opt_tol", 1.0e-4); + cfg_add_double(cfg, "opt_tol", 3.0e-4); + cfg_add_double(cfg, "opt_energy_tol", 1.0e-6); cfg_add_double(cfg, "gtest_tol", 1.0e-6); cfg_add_double(cfg, "ref_energy", 0.0); cfg_add_bool(cfg, "hess_central", false); @@ -157,6 +169,27 @@ static struct cfg *make_cfg(void) cfg_add_bool(cfg, "print_pbc", false); cfg_add_bool(cfg, "symmetry", false); + cfg_add_int(cfg, "special_fragment", -100); + + ///// LIBTORCH-related options + cfg_add_bool(cfg, "enable_torch", false); + cfg_add_bool(cfg, "enable_elpot", false); + cfg_add_int(cfg, "opt_special_frag", 0); + cfg_add_string(cfg, "torch_nn", "ani.pt"); + cfg_add_string(cfg, "ml_path", ML_PATH); + cfg_add_string(cfg, "userml_path", "."); + cfg_add_string(cfg, "custom_nn", "custom_model_script.pt"); + cfg_add_string(cfg, "aev_nn", "aev_scripted.pt"); + ///// + + // gradient on atoms computed by distributing the COM force/torque gradient (ATOM_GRAD_FRAG) + // or using direct atomic gradients from MM model + cfg_add_enum(cfg, "atom_gradient", ATOM_GRAD_FRAG, + "mm\n" + "frag\n", + (int []) { ATOM_GRAD_MM, + ATOM_GRAD_FRAG }); + cfg_add_enum(cfg, "symm_frag", EFP_SYMM_FRAG_FRAG, "frag\n" "list\n", @@ -186,8 +219,10 @@ static sim_fn_t get_sim_fn(enum run_type run_type) return sim_md; case RUN_TYPE_EFIELD: return sim_efield; - case RUN_TYPE_ELPOT: + case RUN_TYPE_ELPOT: return sim_elpot; + case RUN_TYPE_FRAG_ELPOT: + return sim_frag_elpot; case RUN_TYPE_GTEST: return sim_gtest; case RUN_TYPE_ETEST: @@ -239,6 +274,8 @@ static void add_potentials(struct efp *efp, const struct cfg *cfg, const struct } } + + static unsigned get_terms(const char *str) { static const struct { @@ -248,8 +285,11 @@ static unsigned get_terms(const char *str) { "elec", EFP_TERM_ELEC }, { "pol", EFP_TERM_POL }, { "disp", EFP_TERM_DISP }, - { "xr", EFP_TERM_XR } - }; + { "xr", EFP_TERM_XR }, + { "qq", EFP_TERM_QQ }, + { "lj", EFP_TERM_LJ } + + }; unsigned terms = 0; @@ -270,21 +310,56 @@ static unsigned get_terms(const char *str) return terms; } +static unsigned get_special_terms(const char *str) +{ + static const struct { + const char *name; + enum efp_special_term value; + } list[] = { + { "elec", EFP_SPEC_TERM_ELEC }, + { "pol", EFP_SPEC_TERM_POL }, + { "disp", EFP_SPEC_TERM_DISP }, + { "xr", EFP_SPEC_TERM_XR }, + { "qq", EFP_SPEC_TERM_QQ }, + { "lj", EFP_SPEC_TERM_LJ } + }; + + unsigned terms = 0; + + while (*str) { + for (size_t i = 0; i < ARRAY_SIZE(list); i++) { + if (efp_strncasecmp(list[i].name, str, strlen(list[i].name)) == 0) { + str += strlen(list[i].name); + terms |= list[i].value; + goto next; + } + } + error("unknown energy term specified"); + next: + while (*str && isspace(*str)) + str++; + } + + return terms; +} + static struct efp *create_efp(const struct cfg *cfg, const struct sys *sys) { struct efp_opts opts = { .terms = get_terms(cfg_get_string(cfg, "terms")), + .special_terms = get_special_terms(cfg_get_string(cfg, "special_terms")), .elec_damp = cfg_get_enum(cfg, "elec_damp"), .disp_damp = cfg_get_enum(cfg, "disp_damp"), .pol_damp = cfg_get_enum(cfg, "pol_damp"), .pol_driver = cfg_get_enum(cfg, "pol_driver"), .enable_pbc = cfg_get_bool(cfg, "enable_pbc"), + .enable_elpot = cfg_get_bool(cfg, "enable_elpot"), .enable_cutoff = cfg_get_bool(cfg, "enable_cutoff"), .swf_cutoff = cfg_get_double(cfg, "swf_cutoff"), .xr_cutoff = cfg_get_double(cfg, "xr_cutoff"), .enable_pairwise = cfg_get_bool(cfg, "enable_pairwise"), .ligand = cfg_get_int(cfg, "ligand"), - .print_pbc = cfg_get_bool(cfg, "print_pbc"), + .special_fragment = cfg_get_int(cfg, "special_fragment"), .symmetry = cfg_get_bool(cfg, "symmetry"), .symm_frag = cfg_get_enum(cfg, "symm_frag"), .update_params = cfg_get_int(cfg, "update_params"), @@ -292,10 +367,8 @@ static struct efp *create_efp(const struct cfg *cfg, const struct sys *sys) .print = cfg_get_int(cfg, "print") }; - if (opts.xr_cutoff == 0.0) { - opts.xr_cutoff = opts.swf_cutoff; - printf("xr_cutoff is set to %lf \n\n", opts.xr_cutoff*0.52917721092); - } + // adjustoing special terms + if (opts.special_terms == 0) opts.special_terms = opts.terms; enum efp_coord_type coord_type = cfg_get_enum(cfg, "coord"); struct efp *efp = efp_create(); @@ -363,14 +436,15 @@ static struct efp *create_efp(const struct cfg *cfg, const struct sys *sys) static void state_init(struct state *state, const struct cfg *cfg, const struct sys *sys) { - size_t ntotal, ifrag, nfrag, natom; + size_t ntotal, ifrag, nfrag, natom, spec_frag, n_special_atoms, iatom; state->efp = create_efp(cfg, sys); state->energy = 0; state->grad = xcalloc(sys->n_frags * 6 + sys->n_charges * 3, sizeof(double)); state->ff = NULL; - - + state->torch = NULL; + state->torch_grad = NULL; + if (cfg_get_bool(cfg, "enable_ff")) { if ((state->ff = ff_create()) == NULL) error("cannot create ff object"); @@ -391,12 +465,76 @@ static void state_init(struct state *state, const struct cfg *cfg, const struct if (ff_get_atom_count(state->ff) != (int)ntotal) error("total fragment number of atoms does not match .xyz file"); } + + // initiate torch state +#ifdef TORCH_SWITCH + if (cfg_get_bool(cfg, "enable_torch")) { + if (cfg_get_int(cfg, "special_fragment") < 0 || cfg_get_int(cfg, "special_fragment") > nfrag-1) + error("do not know for which fragment to compute torch: set special_fragment"); + + // create torch state + if ((state->torch = torch_create()) == NULL) + error("cannot create torch object"); + +// Default is ../nnlib/aev_scripted.pt and ../nnlib/custom_model_script.pt +// custom_nn and aev_nn has been initiated as such. +// If the user wants to use some other model/aev, they should name it along +// custom_nn and aev_nn rems +// Similarly ml_path is set to ../nnlib/ +// Any user given path has to be named along userml_path rem. + + if (cfg_get_bool(cfg, "enable_elpot")) { + state->torch->nn_type = 3; + state->torch->custom_model = cfg_get_string(state->cfg, "custom_nn"); + state->torch->aev = cfg_get_string(state->cfg, "aev_nn"); + printf("Chosen nn_type: Custom model using AEV + electrostatic potential\n"); + } + else { + get_torch_type(state->torch, cfg_get_string(cfg, "torch_nn")); + } + + const char* ml_location; + const char* userml_path = cfg_get_string(state->cfg, "userml_path"); + const char* ml_path = cfg_get_string(state->cfg, "ml_path"); + + if (strcmp(userml_path, "./") == 0) { + ml_location = userml_path; + } else { + ml_location = ml_path; + } + + printf("The location of NN potential is: %s\n", ml_location); + + state->torch->ani_model = ANIModel_new(); + if (state->torch->nn_type != 3) load_ani_model(state->torch->ani_model, state->torch->nn_type, cfg_get_string(state->cfg, "ml_path")); + if (state->torch->nn_type == 3) load_custom_ani_model(state->torch->ani_model, state->torch->aev, state->torch->custom_model, ml_location); + + spec_frag = cfg_get_int(cfg, "special_fragment"); + + check_fail(efp_get_frag_atom_count(state->efp, spec_frag, &n_special_atoms)); + torch_init(state->torch, n_special_atoms); + state->torch_grad = xcalloc(n_special_atoms * 3, sizeof(double)); + + // special fragment atomic coordinates + double *atom_coord = (double*)malloc(3 * n_special_atoms * sizeof(double)); + check_fail(efp_get_frag_atom_coord(state->efp, spec_frag, atom_coord)); + + int *atom_znuc = (int*)malloc(3 * n_special_atoms * sizeof(int)); + check_fail(efp_get_frag_atom_znuc(state->efp, spec_frag, atom_znuc)); + + torch_set_coord(state->torch, atom_coord); + torch_set_atom_species(state->torch, atom_znuc); + + free(atom_coord); + free(atom_znuc); + } +#endif } static void print_banner(void) { msg("EFPMD ver. " LIBEFP_VERSION_STRING "\n"); - msg("Copyright (c) 2012-2017 Ilya Kaliman\n\n"); + msg("Copyright (c) 2012-2017 Ilya Kaliman, 2017-2024 Lyudmila Slipchenko\n\n"); msg("%s", efp_banner()); } @@ -459,9 +597,13 @@ static void convert_units(struct cfg *cfg, struct sys *sys) for (size_t i = 0; i < sys->n_frags; i++) { vec_scale(&sys->frags[i].constraint_xyz, 1.0 / BOHR_RADIUS); - for (size_t j = 0; j < n_convert; j++) - sys->frags[i].coord[j] /= BOHR_RADIUS; - } + if (cfg_get_enum(cfg, "coord") == EFP_COORD_TYPE_ATOMS) + for (size_t j = 0; j < 3 * sys->frags[i].n_atoms; j++) + sys->frags[i].coord[j] /= BOHR_RADIUS; + else + for (size_t j = 0; j < n_convert; j++) + sys->frags[i].coord[j] /= BOHR_RADIUS; + } for (size_t i = 0; i < sys->n_charges; i++) vec_scale(&sys->charges[i].pos, 1.0 / BOHR_RADIUS); @@ -472,6 +614,7 @@ static void sys_free(struct sys *sys) for (size_t i = 0; i < sys->n_frags; i++) { free(sys->frags[i].name); free(sys->frags[i].atoms); + free(sys->frags[i].coord); // for (size_t j = 0; j < sys->frags[i].n_atoms; j++) // free(sys->frags[i].atoms[j]) } @@ -517,11 +660,20 @@ int main(int argc, char **argv) print_time(&start_time); msg("\n"); state.cfg = make_cfg(); - state.sys = parse_input(state.cfg, argv[1]); - msg("SIMULATION SETTINGS\n\n"); + state.sys = parse_input(state.cfg, argv[1]); + + msg("SIMULATION SETTINGS\n\n"); print_config(state.cfg); msg("\n\n"); - convert_units(state.cfg, state.sys); + convert_units(state.cfg, state.sys); + +#ifndef TORCH_SWITCH + if (cfg_get_bool(state.cfg, "enable_torch")) { + printf("\n\nJOB TERMINATED\n"); + printf("PLEASE COMPILE WITH LIBTORCH FOR RUNNING ENABLE_TORCH FUNCTION\n"); + goto exit; + } +#endif state_init(&state, state.cfg, state.sys); sim_fn_t sim_fn = get_sim_fn(cfg_get_enum(state.cfg, "run_type")); sim_fn(&state); @@ -530,6 +682,10 @@ int main(int argc, char **argv) msg("TOTAL RUN TIME IS %d SECONDS\n", (int)(difftime(end_time, start_time))); efp_shutdown(state.efp); ff_free(state.ff); +#ifdef TORCH_SWITCH + torch_free(state.torch); + if (state.torch_grad) free(state.torch_grad); +#endif sys_free(state.sys); cfg_free(state.cfg); free(state.grad); diff --git a/efpmd/src/opt.c b/efpmd/src/opt.c index ee59a107..ad4704ad 100644 --- a/efpmd/src/opt.c +++ b/efpmd/src/opt.c @@ -27,34 +27,133 @@ #include "common.h" #include "opt.h" +#ifdef TORCH_SWITCH +#include "torch.h" +#endif + void sim_opt(struct state *state); static double compute_efp(size_t n, const double *x, double *gx, void *data) { - size_t n_frags, n_charge; - struct state *state = (struct state *)data; - - check_fail(efp_get_frag_count(state->efp, &n_frags)); - check_fail(efp_get_point_charge_count(state->efp, &n_charge)); - - assert(n == (6 * n_frags + 3 * n_charge)); - - check_fail(efp_set_coordinates(state->efp, EFP_COORD_TYPE_XYZABC, x)); - check_fail(efp_set_point_charge_coordinates(state->efp, x + 6 * n_frags)); - - compute_energy(state, true); - memcpy(gx, state->grad, (6 * n_frags + 3 * n_charge) * sizeof(double)); - - for (size_t i = 0; i < n_frags; i++) { - const double *euler = x + 6 * i + 3; - double *gradptr = gx + 6 * i + 3; - efp_torque_to_derivative(euler, gradptr, gradptr); - } + // printf("marker call for entry in compute_efp\n"); + int static opt_switch = 0; + size_t n_frags, n_charge, spec_frag, n_special_atoms; + struct state *state = (struct state *)data; + + check_fail(efp_get_frag_count(state->efp, &n_frags)); + check_fail(efp_get_point_charge_count(state->efp, &n_charge)); + +#ifdef TORCH_SWITCH + if (cfg_get_bool(state->cfg, "enable_torch") && cfg_get_int(state->cfg, "opt_special_frag") > -1) { + // prepare for optimization of atom coordinates of a special fragment + // through forces provided externally + spec_frag = cfg_get_int(state->cfg, "special_fragment"); + check_fail(efp_get_frag_atom_count(state->efp, spec_frag, &n_special_atoms)); + + switch(cfg_get_int(state->cfg, "opt_special_frag")) { + // optimize only special fragment atoms + case 0: + assert(n == (3 * n_special_atoms)); + + // propagate special fragment coordinates to EFP and update fragment parameters + check_fail(update_special_fragment(state->efp, x)); + // propagate special fragment coordinates to torch + torch_set_coord(state->torch, x); + // compute EFP and torch energies and gradients + compute_energy(state, true); + + memcpy(gx, state->torch_grad, (3 * n_special_atoms) * sizeof(double)); + break; + + // optimize special fragment atoms and all fragments - the most general case + case 1: + assert(n == (6 * (n_frags-1) + 3 * n_charge + 3 * n_special_atoms)); + + // skips coordinates of special fragment + for (size_t i = 0, k=0; i < n_frags; i++) { + if (i==spec_frag) continue; + // note that xyzabc coordiantes are used for optimization, i.e. initial fragment coordinates + // will be changed if atom cooridnates were used in input + check_fail(efp_set_frag_coordinates(state->efp, i, EFP_COORD_TYPE_XYZABC, x+6*k)); + k++; + } + check_fail(efp_set_point_charge_coordinates(state->efp, x + 6 * (n_frags-1))); + + check_fail(update_special_fragment(state->efp, x + 6 * (n_frags-1) + 3 * n_charge)); + // propagate special fragment coordinates to torch + torch_set_coord(state->torch, x + 6 * (n_frags-1) + 3 * n_charge); + + // compute EFP and torch energies and gradients + compute_energy(state, true); + + // skips gradient of special fragment + for (size_t i=0, k=0; igrad+6*i, 6 * sizeof(double)); + k++; + } + + // add gradient of point charges if any + memcpy(gx + 6*(n_frags-1), state->grad + 6*(n_frags-1), (3 * n_charge) * sizeof(double)); + + // memcpy(gx, state->grad, (6 * n_frags + 3 * n_charge) * sizeof(double)); + memcpy(gx + 6 * (n_frags-1) + 3 * n_charge, state->torch_grad, (3 * n_special_atoms) * sizeof(double)); + + for (size_t i = 0, k=0 ; i < n_frags; i++) { + if (i==spec_frag) + continue; + const double *euler = x + 6 * k + 3; + double *gradptr = gx + 6 * k + 3; + + efp_torque_to_derivative(euler, gradptr, gradptr); + k++; + } + break; + + // optimize intermittently special fragment atoms or all fragments + case 2: + if (opt_switch == 1) + assert(n == (6 * n_frags + 3 * n_charge)); + if (opt_switch == 2) + assert(n == (3 * n_special_atoms)); + // need to develop this case + break; + + default: + error("do not know what to do for this opt_special_frag input"); + break; + } + } +#endif + + if (!cfg_get_bool(state->cfg, "enable_torch")) { + // normal case - no special fragment to optimize + assert(n == (6 * n_frags + 3 * n_charge)); + + check_fail(efp_set_coordinates(state->efp, EFP_COORD_TYPE_XYZABC, x)); + check_fail(efp_set_point_charge_coordinates(state->efp, x + 6 * n_frags)); + + compute_energy(state, true); + memcpy(gx, state->grad, (6 * n_frags + 3 * n_charge) * sizeof(double)); + + for (size_t i = 0; i < n_frags; i++) { + const double *euler = x + 6 * i + 3; + double *gradptr = gx + 6 * i + 3; + + efp_torque_to_derivative(euler, gradptr, gradptr); + } + } + + if (cfg_get_int(state->cfg, "print")>0) { + // print_geometry(state->efp); + print_energy(state); + } return (state->energy); } + static void print_restart(struct efp *efp) { size_t n_frags; @@ -98,9 +197,11 @@ static void print_restart(struct efp *efp) msg("\n"); } -static int check_conv(double rms_grad, double max_grad, double opt_tol) +static int check_conv(double delta_e, double rms_grad, double max_grad, double opt_tol, double ene_tol) { - return max_grad < opt_tol && rms_grad < opt_tol / 3.0; + // return max_grad < opt_tol && rms_grad < opt_tol / 3.0; + // printf("\n delta_e %lf, ene_tol %lf \n", delta_e, ene_tol); + return (max_grad < opt_tol && fabs(delta_e) < ene_tol); } static void get_grad_info(size_t n_coord, const double *grad, double *rms_grad_out, @@ -124,7 +225,7 @@ static void get_grad_info(size_t n_coord, const double *grad, double *rms_grad_o static void print_status(struct state *state, double e_diff, double rms_grad, double max_grad) { print_geometry(state->efp); - print_restart(state->efp); + // print_restart(state->efp); print_energy(state); msg("%30s %16.10lf\n", "ENERGY CHANGE", e_diff); @@ -137,59 +238,156 @@ static void print_status(struct state *state, double e_diff, double rms_grad, do void sim_opt(struct state *state) { - msg("ENERGY MINIMIZATION JOB\n\n\n"); - - size_t n_frags, n_charge, n_coord; - double rms_grad, max_grad; - - check_fail(efp_get_frag_count(state->efp, &n_frags)); - check_fail(efp_get_point_charge_count(state->efp, &n_charge)); - - n_coord = 6 * n_frags + 3 * n_charge; - - struct opt_state *opt_state = opt_create(n_coord); - if (!opt_state) - error("unable to create an optimizer"); - - opt_set_func(opt_state, compute_efp); - opt_set_user_data(opt_state, state); - - double coord[n_coord], grad[n_coord]; - check_fail(efp_get_coordinates(state->efp, coord)); - check_fail(efp_get_point_charge_coordinates(state->efp, coord + 6 * n_frags)); - - if (opt_init(opt_state, n_coord, coord)) - error("unable to initialize an optimizer"); - - double e_old = opt_get_fx(opt_state); - opt_get_gx(opt_state, n_coord, grad); - get_grad_info(n_coord, grad, &rms_grad, &max_grad); - - msg(" INITIAL STATE\n\n"); - print_status(state, 0.0, rms_grad, max_grad); - - for (int step = 1; step <= cfg_get_int(state->cfg, "max_steps"); step++) { - if (opt_step(opt_state)) - error("unable to make an optimization step"); - - double e_new = opt_get_fx(opt_state); - opt_get_gx(opt_state, n_coord, grad); - get_grad_info(n_coord, grad, &rms_grad, &max_grad); - - if (check_conv(rms_grad, max_grad, cfg_get_double(state->cfg, "opt_tol"))) { - msg(" FINAL STATE\n\n"); - print_status(state, e_new - e_old, rms_grad, max_grad); - msg("OPTIMIZATION CONVERGED\n"); - break; - } - - msg(" STATE AFTER %d STEPS\n\n", step); - print_status(state, e_new - e_old, rms_grad, max_grad); - - e_old = e_new; - } - - opt_shutdown(opt_state); - - msg("ENERGY MINIMIZATION JOB COMPLETED SUCCESSFULLY\n"); + size_t n_frags, n_charge, n_coord, n_special_atoms, spec_frag; + double rms_grad, max_grad; + + int static algorithm_switch; + +#ifdef TORCH_SWITCH + if (cfg_get_bool(state->cfg, "enable_torch") && cfg_get_int(state->cfg, "opt_special_frag") > -1) + switch (cfg_get_int(state->cfg, "opt_special_frag")) { + case 0: + msg("SPECIAL FRAGMENT ENERGY MINIMIZATION JOB\n\n\n"); + algorithm_switch = 0; + break; + case 1: + msg("SPECIAL FRAGMENT ATOMS AND ALL FRAGMENTS ENERGY MINIMIZATION JOB\n\n\n"); + algorithm_switch = 1; + break; + case 2: + msg("CONSEQUENT OPTIMIZATION OF SPECIAL FRAGMENT ATOMS AND EFP FRAGMENTS\n\n\n"); + algorithm_switch = 2; + break; + default: + error("do not know what to do for this opt_special_frag input"); + break; + } +#endif + + if (!cfg_get_bool(state->cfg, "enable_torch")) { + msg("ENERGY MINIMIZATION JOB\n\n\n"); + algorithm_switch = -1; + } + + check_fail(efp_get_frag_count(state->efp, &n_frags)); + check_fail(efp_get_point_charge_count(state->efp, &n_charge)); + + +#ifdef TORCH_SWITCH + if (cfg_get_bool(state->cfg, "enable_torch") && cfg_get_int(state->cfg, "opt_special_frag") > -1) { + spec_frag = cfg_get_int(state->cfg, "special_fragment"); + check_fail(efp_get_frag_atom_count(state->efp, spec_frag, &n_special_atoms)); + + if (cfg_get_int(state->cfg, "opt_special_frag") == 0) + n_coord = 3 * n_special_atoms; + if (cfg_get_int(state->cfg, "opt_special_frag") == 1) + n_coord = 6 * (n_frags-1) + 3 * n_charge + 3 * n_special_atoms; + } +#endif + // normal minimization job + if (!cfg_get_bool(state->cfg, "enable_torch")) n_coord = 6 * n_frags + 3 * n_charge; + + + struct opt_state *opt_state = opt_create(n_coord); + if (!opt_state) + error("unable to create an optimizer"); + + opt_set_func(opt_state, compute_efp); + opt_set_user_data(opt_state, state); + + double coord[n_coord], grad[n_coord]; + +#ifdef TORCH_SWITCH + if (cfg_get_bool(state->cfg, "enable_torch")) { + if (cfg_get_int(state->cfg, "opt_special_frag") == 0) + torch_get_coord(state->torch, coord); + + if (cfg_get_int(state->cfg, "opt_special_frag") == 1) { + // getting efp coordinates of all but special fragment + for (size_t i=0, k=0; iefp, i, coord + 6*k)); + k++; + } + check_fail(efp_get_point_charge_coordinates(state->efp, coord + 6 * (n_frags-1))); + torch_get_coord(state->torch, coord + 6 * (n_frags-1) + 3 * n_charge); + } + } +#endif + // normal case + if (!cfg_get_bool(state->cfg, "enable_torch")) { + check_fail(efp_get_coordinates(state->efp, coord)); + check_fail(efp_get_point_charge_coordinates(state->efp, coord + 6 * n_frags)); + } + +////////////////////// + bool if_converged = false; + + if (opt_init(opt_state, n_coord, coord)) + error("unable to initialize an optimizer"); + + double e_old = opt_get_fx(opt_state); + opt_get_gx(opt_state, n_coord, grad); + get_grad_info(n_coord, grad, &rms_grad, &max_grad); + + msg(" INITIAL STATE\n\n"); + print_status(state, 0.0, rms_grad, max_grad); + + if (cfg_get_int(state->cfg, "print")>2) { + printf("\n GRADIENTS in opt.c\n"); + for (size_t i=0; icfg, "max_steps"); step++) { + if (opt_step(opt_state)) { + msg("\nL-BFGS-B is unable to make an optimization step\n"); + break; + // error("unable to make an optimization step"); + } + + double e_new = opt_get_fx(opt_state); + // just checking coordinates + opt_get_x(opt_state, n_coord, coord); + opt_get_gx(opt_state, n_coord, grad); + get_grad_info(n_coord, grad, &rms_grad, &max_grad); + + if (check_conv(e_new - e_old, rms_grad, max_grad, cfg_get_double(state->cfg, "opt_tol"), cfg_get_double(state->cfg, "opt_energy_tol"))) { + msg(" FINAL STATE\n\n"); + print_status(state, e_new - e_old, rms_grad, max_grad); + + if (cfg_get_int(state->cfg, "print")>2) { + printf("\n GRADIENTS \n"); + for (size_t i=0; icfg, "print")>2) { + printf("\n GRADIENTS \n"); + for (size_t i=0; icoord[counter*3] = atom_i.x; - frag->coord[counter*3+1] = atom_i.y; - frag->coord[counter*3+2] = atom_i.z; - } + error("incorrect fragment coordinates format: reading efp atom coordinates"); frag->n_atoms++; frag->atoms = xrealloc(frag->atoms, frag->n_atoms * sizeof(struct efp_atom)); frag->atoms[frag->n_atoms - 1] = atom_i; - counter++; + + frag->coord = xrealloc(frag->coord, frag->n_atoms * 3* sizeof(double)); + frag->coord[(frag->n_atoms-1)*3] = atom_i.x; + frag->coord[(frag->n_atoms-1)*3+1] = atom_i.y; + frag->coord[(frag->n_atoms-1)*3+2] = atom_i.z; + //printf("n_atoms = %d",frag->n_atoms); efp_stream_next_line(stream); @@ -130,9 +127,11 @@ static void parse_frag(struct stream *stream, enum efp_coord_type coord_type, } } else { + frag->coord = (double*)malloc(n_rows * n_cols * sizeof(double)); for (int i = 0, idx = 0; i < n_rows; i++) { for (int j = 0; j < n_cols; j++, idx++) { if (!efp_stream_parse_double(stream, frag->coord + idx)) +// printf("We are at line 140\n"); error("incorrect fragment coordinates format"); } @@ -257,7 +256,30 @@ struct sys *parse_input(struct cfg *cfg, const char *path) if (cfg_get_int(cfg, "ligand") == -100 && cfg_get_bool(cfg, "enable_pairwise") == true) error("Specify ligand for pairwise calculations"); - check_cfg(cfg); + + if (cfg_get_bool(cfg, "enable_torch")) { + if (cfg_get_int(cfg, "special_fragment") < 0) + error("Specify special fragment for calculations with TORCH models"); + } + else { + cfg_set_bool(cfg, "enable_elpot", false); + cfg_set_int(cfg, "opt_special_frag", -1); + cfg_set_string(cfg, "torch_nn", "none"); + cfg_set_string(cfg, "ml_path", "none"); + cfg_set_string(cfg, "userml_path", "none"); + cfg_set_string(cfg, "custom_nn", "none"); + cfg_set_string(cfg, "aev_nn", "none"); + } + + // set xr cutoff distance if it is not set + if (cfg_get_double(cfg, "xr_cutoff") == 0.0) + cfg_set_double(cfg, "xr_cutoff", cfg_get_double(cfg, "swf_cutoff")); + + // set special terms to terms if not given + if (strcmp(cfg_get_string(cfg,"special_terms"),"") == 0) + cfg_set_string(cfg, "special_terms", cfg_get_string(cfg, "terms")); + + check_cfg(cfg); efp_stream_close(stream); return sys; diff --git a/efpmd/src/torch.c b/efpmd/src/torch.c new file mode 100644 index 00000000..2fe3b6e6 --- /dev/null +++ b/efpmd/src/torch.c @@ -0,0 +1,344 @@ +/*- + * Copyright (c) 2012-2015 Ilya Kaliman + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "torch.h" +#include "common.h" +//#include "cfg.h" +#include + + +struct torch *torch_create(void) { + struct torch *torch; + torch = calloc(1, sizeof(*torch)); + return (torch); +} + +void get_torch_type(struct torch *torch, const char *str) { + int file_type; + if (strcmp(str, "ani1.pt") == 0) { + file_type = 1; + printf("Chosen nn_type: %s\n", str); + } else if (strcmp(str, "ani2.pt") == 0) { + file_type = 2; + printf("Chosen nn_type: %s\n", str); + } else { + file_type = -1; // or any other default/error value + fprintf(stderr, "Unknown nn_type: %s\n", str); + } + torch->nn_type = file_type; +} + +void torch_init(struct torch *torch, size_t natom) { + torch->natoms = natom; + torch->atom_coords = malloc(3*natom*sizeof(double)); + torch->atom_types = malloc(natom*sizeof(int)); + torch->grad = malloc(3*natom*sizeof(double)); + torch->elpot = malloc(natom*sizeof(double)); +} + +void torch_get_atom_count(struct torch *torch , size_t natom) { + natom = torch->natoms; +} + +void torch_set_atom_count(struct torch *torch, size_t *natom) { + torch->natoms = *natom; +} + +void torch_get_atom_coord(struct torch *torch, size_t atom, double *coord) { + assert(atom < torch->natoms); + memcpy(coord, torch->atom_coords + (atom * 3), 3*sizeof(double)); +} + +void torch_set_atom_coord(struct torch *torch, size_t atom, const double *coord) { + assert(atom < torch->natoms); + memcpy(torch->atom_coords + (atom * 3), coord, 3*sizeof(double)); +} + +void torch_get_coord(struct torch *torch, double *coords) { + memcpy(coords, torch->atom_coords, (3 * torch->natoms) * sizeof(double)); +} + +void torch_set_coord(struct torch *torch, const double *coords) { + memcpy(torch->atom_coords, coords, (3 * torch->natoms) * sizeof(double)); +} + +void torch_set_elpot(struct torch *torch, const double *spec_elpot) { + memcpy(torch->elpot, spec_elpot, torch->natoms * sizeof(double)); +} + + +void torch_set_atom_species(struct torch *torch, const int *atom_z) { + memcpy(torch->atom_types, atom_z, (torch->natoms) * sizeof(int)); +} + +void torch_custom_compute(struct torch *torch, int print) { + + size_t n_atoms = torch->natoms; + float *gradients, *forces; + float *frag_coord; + float *elecpots_data; + //float custom_energy; + double custom_energy; + + elecpots_data = malloc(n_atoms * sizeof(float)); + gradients = malloc(n_atoms * 3 * sizeof(float)); + forces = malloc(n_atoms * 3 * sizeof(float)); + + frag_coord = malloc(n_atoms*3* sizeof(float)); + + for (size_t i=0; iatom_coords[i*3] * BOHR_RADIUS); + frag_coord[i*3+1] = (float)(torch->atom_coords[i*3+1] * BOHR_RADIUS); + frag_coord[i*3+2] = (float)(torch->atom_coords[i*3+2] * BOHR_RADIUS); + + elecpots_data[i] = (float) torch->elpot[i]; + } + + int atomic_num[n_atoms]; + for (size_t i=0; iatom_types[i]; + } + + int64_t frag_species[n_atoms]; + atomic_number_to_species(atomic_num, frag_species, n_atoms); + + if (print > 2) { + printf("=============TORCH ELPOT=============\n"); + for (size_t j = 0; j < n_atoms; j++) { + printf("%2d %12.6f\n",torch->atom_types[j], elecpots_data[j]); + } + printf("====================================\n"); + } + + // Hardcoded custom model routine + // engrad_custom_model_wrapper(frag_coord, frag_species, elecpots_data, n_atoms, &custom_energy, gradients, forces); + + get_custom_energy_grad_wrapper(torch->ani_model, frag_coord, frag_species, elecpots_data, n_atoms, &custom_energy, gradients, forces, print); + + torch->energy = custom_energy; + + if (print > 2) { + printf("Gradients:\n"); + for (int i = 0; i < n_atoms; ++i) { + for (int j = 0; j < 3; ++j) { + printf("%f\t", gradients[i * 3 + j]); + } + printf("\n"); + } + + printf("Forces:\n"); + for (int i = 0; i < n_atoms; ++i) { + for (int j = 0; j < 3; ++j) { + printf("%f\t", forces[i * 3 + j]); + } + printf("\n"); + } + } + + double *tG_double = xcalloc(3 * n_atoms, sizeof(double)); + + for (int i = 0; i < 3 * n_atoms; i++) { + tG_double[i] = (double)(gradients[i] * BOHR_RADIUS); + } + + memcpy(torch->grad, tG_double, (3 * n_atoms) * sizeof(double)); // Atomistic gradient for the EFP-ML fragment + + if (print > 0) + torch_print(torch); + + free(gradients); + free(forces); + free(frag_coord); + free(tG_double); + free(elecpots_data); + +} + + +void atomic_number_to_species(const int* atomic_num, int64_t* frag_species, size_t n_atoms) { + + for (size_t i = 0; i < n_atoms; i++) { + switch (atomic_num[i]) { + case 1: + frag_species[i] = 0; + break; + case 6: + frag_species[i] = 1; + break; + case 7: + frag_species[i] = 2; + break; + case 8: + frag_species[i] = 3; + break; + default: + + frag_species[i] = -1; + printf("Warning: Unknown atomic number %d\n", atomic_num[i]); + break; + } + } +} + +// SKP's torch version +void torch_compute(struct torch *torch, const char* nn_path, int print) { + + size_t n_atoms = torch->natoms; + float *gradients, *forces, *frag_coord; + double ani_energy; + + gradients = malloc(n_atoms * 3 * sizeof(float)); + forces = malloc(n_atoms * 3 * sizeof(float)); + + frag_coord = malloc(n_atoms*3* sizeof(float)); + for (size_t i=0; iatom_coords[i*3] * BOHR_RADIUS); + frag_coord[i*3+1] = (float)(torch->atom_coords[i*3+1] * BOHR_RADIUS); + frag_coord[i*3+2] = (float)(torch->atom_coords[i*3+2] * BOHR_RADIUS); + } + + int frag_species[n_atoms]; + for (size_t i=0; iatom_types[i]; + //printf("atom_types in torch_compute %4d\n",torch->atom_types[i]); + } + + get_ani_energy_grad(torch->ani_model, frag_coord, frag_species, &ani_energy, gradients, forces, n_atoms, print); + // printf("Torch_energy %12.8f\n",ani_energy); + torch->energy = ani_energy; + + if (print > 2) { + printf("Coordinates:\n"); + for (int i = 0; i < n_atoms; ++i) { + for (int j = 0; j < 3; ++j) { + printf("%12.8f\t", frag_coord[i * 3 + j]); + } + printf("\n"); + } + printf("Gradients:\n"); + for (int i = 0; i < n_atoms; ++i) { + for (int j = 0; j < 3; ++j) { + printf("%12.8f\t", gradients[i * 3 + j]); + } + printf("\n"); + } + + printf("Forces:\n"); + for (int i = 0; i < n_atoms; ++i) { + for (int j = 0; j < 3; ++j) { + printf("%12.8f\t", forces[i * 3 + j]); + } + printf("\n"); + } + } + + // save data in energy and grad + double *tG_double = xcalloc(3 * n_atoms, sizeof(double)); + for (int i = 0; i < 3 * n_atoms; i++) { + tG_double[i] = (double)(gradients[i] * BOHR_RADIUS); + } + + if (print > 2) { + printf("tG_double Gradients:\n"); + for (int i = 0; i < n_atoms; ++i) { + for (int j = 0; j < 3; ++j) { + printf("%12.8f\t", tG_double[i * 3 + j]); + } + printf("\n"); + } + } + + memcpy(torch->grad, tG_double, (3 * n_atoms) * sizeof(double)); + if (print > 0) + torch_print(torch); + + free(gradients); + free(forces); + free(frag_coord); + free(tG_double); +} + +// LS's version +/* +void torch_compute(struct torch *torch, int do_grad) { + static int iter = 0; + + if (iter == 0) { + for (size_t g=0; gnatoms*3; g++) { + torch->grad[g] = 0.1; + } + torch->energy = -55.0; + } + else { + for (size_t g = 0; gnatoms * 3; g++) { + torch->grad[g] = -torch->grad[g] * 0.5; + } + torch->energy = torch->energy - 0.1 / (iter+1); + } + iter++; +} +*/ + +double torch_get_energy(struct torch *torch) { + return torch->energy; +} +void torch_get_gradient(struct torch *torch, double *grad) { + memcpy(grad, torch->grad, (3 * torch->natoms) * sizeof(double)); +} + +void torch_free(struct torch *torch) { + if (torch) { + free(torch->grad); + free(torch->atom_coords); + free(torch->atom_types); + ANIModel_delete(torch->ani_model); + free(torch); + } +} + +void torch_print(struct torch *torch) { + if (torch) { + printf("\n TORCH INFO \n"); + printf("-----------\n"); + printf("\n Special fragment coordinates (Angstroms) \n"); + printf("-----------------------------------------------------------\n"); + printf(" Atom X Y Z\n"); + for (size_t i=0; i< torch->natoms; i++) { + printf("%4d %12.6f %12.6f %12.6f\n", torch->atom_types[i], torch->atom_coords[i*3] * BOHR_RADIUS, + torch->atom_coords[i*3+1] * BOHR_RADIUS, torch->atom_coords[i*3+2] * BOHR_RADIUS); + } + printf("-----------------------------------------------------------\n"); + printf("\n Special fragment atom gradients \n"); + printf("-----------------------------------------------------------\n"); + printf(" Atom X Y Z\n"); + for (size_t i=0; i< torch->natoms; i++) { + printf("%4d %12.6f %12.6f %12.6f\n",torch->atom_types[i],torch->grad[i*3], + torch->grad[i*3+1], torch->grad[i*3+2]); + } + printf("------------------------------------------------------------\n"); + printf("\n Torch energy %lf \n\n", torch->energy); + } +} diff --git a/efpmd/src/torch.h b/efpmd/src/torch.h new file mode 100644 index 00000000..18703f1b --- /dev/null +++ b/efpmd/src/torch.h @@ -0,0 +1,73 @@ +/*- + * Copyright (c) 2012-2015 Ilya Kaliman + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include "../torch/c_libtorch.h" + +/* calculations with torch ani */ + +struct torch { + double energy; + double *grad; + size_t natoms; + int *atom_types; + double *atom_coords; + double *elpot; + int nn_type; + const char* custom_model; + const char* aev; + ANIModel* ani_model; +}; + + + +struct torch *torch_create(void); +void torch_init(struct torch *, size_t); +int torch_load_nn(struct torch *, const char *); +void torch_get_atom_count(struct torch *, size_t natom); +void torch_set_atom_count(struct torch *, size_t *natom); +void torch_get_atom_coord(struct torch *, size_t, double *); +void torch_set_atom_coord(struct torch *, size_t, const double *); +void torch_get_coord(struct torch *, double *); + +void torch_set_coord(struct torch *, const double *); +void torch_set_elpot(struct torch *, const double *); + +void torch_set_atom_species(struct torch *torch, const int *); +void torch_compute(struct torch *torch, const char* nn_path, int print); +double torch_get_energy(struct torch *torch); +void torch_get_gradient(struct torch *, double *); +void torch_free(struct torch *); +void torch_print(struct torch *); + +//void torch_custom(); +void torch_custom_compute(struct torch *torch, int print); +void atomic_number_to_species(const int* atomic_num, int64_t* frag_species, size_t n_atoms); + +void get_torch_type(struct torch *, const char *); diff --git a/efpmd/torch/ANIModel.h b/efpmd/torch/ANIModel.h new file mode 100644 index 00000000..8b52fca1 --- /dev/null +++ b/efpmd/torch/ANIModel.h @@ -0,0 +1,26 @@ +#ifndef ANIMODEL_H +#define ANIMODEL_H + +#include +#include +#include + +//===== class ANIModel ==== // + +class ANIModel { +public: + //ANIModel() = default; + ANIModel() {} // {printf("\nANIModel() Constructor\n");} + ~ANIModel() {} // {printf("\nANIModel() Destructor\n");} + void load_model(int model_type, const std::string &nn_path); + void load_custom_model(const std::string &aev_name, const std::string &model_name, const std::string &nn_path); + //void get_energy_grad(const torch::Tensor& coordinates, const torch::Tensor& species, float* atomic_energies, float* gradients, float* forces, int num_atoms); + void get_energy_grad(const torch::Tensor& coordinates, const torch::Tensor& species, double* total_energy, float* gradients, float* forces, int num_atoms, int print); + void get_custom_energy_grad(float* coordinates_data, int64_t* species_data, float* elecpots_data, int num_atoms, double* custom_energy, float* cus_grads, float* cus_forces, int print); + //void get_custom_energy_grad(float* coordinates_data, int64_t* species_data, float* elecpots_data, int num_atoms, float* custom_energy, float* cus_grads, float* cus_forces); +private: + torch::jit::Module module; + torch::jit::Module aev_computer; +}; + +#endif // ANIMODEL_H diff --git a/efpmd/torch/CMakeLists.txt b/efpmd/torch/CMakeLists.txt new file mode 100644 index 00000000..b249dac0 --- /dev/null +++ b/efpmd/torch/CMakeLists.txt @@ -0,0 +1,24 @@ + +cmake_minimum_required(VERSION 3.13) +project(ctorch C CXX) + +find_package(Torch REQUIRED) + +add_library(ctorch SHARED c_libtorch.cc) + +# integrate GPU compilation + +message("TORCH_INSTALL_PREFIX = " ${TORCH_INSTALL_PREFIX}) +message("TORCH_LIBRARIES = " ${TORCH_LIBRARIES}) +message("TORCH_INCLUDE_DIRS = " ${TORCH_INCLUDE_DIRS}) + +target_include_directories(ctorch PRIVATE ${TORCH_INCLUDE_DIRS}) +#target_link_directories(ctorch PRIVATE ${TORCH_INSTALL_PREFIX}/lib) +target_link_libraries(ctorch PUBLIC "${TORCH_LIBRARIES}") + +set_target_properties(ctorch PROPERTIES + CXX_STANDARD 14 + CXX_STANDARD_REQUIRED YES +) + + diff --git a/efpmd/torch/c_libtorch.cc b/efpmd/torch/c_libtorch.cc new file mode 100644 index 00000000..af42def4 --- /dev/null +++ b/efpmd/torch/c_libtorch.cc @@ -0,0 +1,702 @@ +#include +#include +#include +#include +#include +#include +#include "c_libtorch.h" +#include "ANIModel.h" +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace torch::autograd; + + +struct Atom { + std::string species; + std::vector coordinates; +}; + + +void ANIModel::load_model(int model_type, const std::string &nn_path) { + if (model_type == 1) { + module = torch::jit::load(nn_path + "ANI1x_saved2.pt"); + std::cout << "Model loaded from: " << nn_path + "ANI1x_saved2.pt\n" << std::endl; + } else if (model_type == 2) { + module = torch::jit::load(nn_path + "ANI2x_saved.pt"); + std::cout << "Model loaded from: " << nn_path + "ANI2x_saved.pt\n" << std::endl; + } else { + std::cerr << "Invalid model type!\n" << std::endl; + } +} + +void ANIModel::load_custom_model(const std::string &aev_name, const std::string &model_name, const std::string &nn_path) { + aev_computer = torch::jit::load(nn_path + aev_name); + module = torch::jit::load(nn_path + model_name); + std::cout << "AEV loaded from: " << nn_path + aev_name << std::endl; + std::cout << "Custom model loaded from: " << nn_path + model_name << "\n" << std::endl; +} + + +// using back propagation double energy +void ANIModel::get_energy_grad(const torch::Tensor& coordinates, + const torch::Tensor& species, + double* total_energy, + float* gradients, + float* forces, + int num_atoms, + int print) { + + std::vector inputs = {std::make_tuple(species, coordinates)}; + auto output = module.forward(inputs).toTuple(); + at::Tensor energy_tensor = output->elements()[1].toTensor(); + auto energy = energy_tensor.item(); + energy_tensor.backward(torch::ones_like(energy_tensor)); + + auto gradient = coordinates.grad(); + + if (!gradient.defined() || gradient.numel() == 0) { + std::cerr << "Error: Gradient is not defined or empty." << std::endl; + return; + } + + auto force = -gradient; + + if (print > 2) { + std::cout << "=========TESTING FOR OBJECT BASED MODEL LOADING ===============" << std::endl; + std::cout << std::fixed << std::setprecision(12) << "C++ (LibTorch) Energy: " << energy << std::endl; + std::cout << " Force: " << force << std::endl; + + } + + memcpy(total_energy, energy_tensor.data_ptr(), sizeof(double)); + memcpy(gradients, gradient.data_ptr(), gradient.numel() * sizeof(float)); + memcpy(forces, force.data_ptr(), force.numel() * sizeof(float)); + coordinates.grad().zero_(); +} + +/* +// using back propagation float energy +void ANIModel::get_energy_grad(const torch::Tensor& coordinates, + const torch::Tensor& species, + float* atomic_energies, + float* gradients, + float* forces, + int num_atoms) { + std::vector inputs; + inputs.push_back(std::make_tuple(species, coordinates)); + + auto output = module.forward(inputs).toTuple(); + at::Tensor energy_tensor = output->elements()[1].toTensor(); + + auto energy = energy_tensor.item(); + energy_tensor.backward(torch::ones_like(energy_tensor)); + + auto gradient = coordinates.grad(); + + if (!gradient.defined() || gradient.numel() == 0) { + std::cerr << "Error: Gradient is not defined or empty." << std::endl; + return; + } + + auto force = -gradient; + auto atomic_energies_tensor = module.get_method("atomic_energies")(inputs).toTuple()->elements()[1].toTensor(); + + std::cout << "=========TESTING FOR OBJECT BASED MODEL LOADING ===============" << std::endl; + std::cout << " Energy: " << energy << std::endl; + std::cout << " Force: " << force << std::endl; + + memcpy(atomic_energies, atomic_energies_tensor.data_ptr(), atomic_energies_tensor.numel() * sizeof(float)); + memcpy(gradients, gradient.data_ptr(), gradient.numel() * sizeof(float)); + memcpy(forces, force.data_ptr(), force.numel() * sizeof(float)); + coordinates.grad().zero_(); +} +*/ + +// using autograd +/* +void ANIModel::get_energy_grad(const torch::Tensor& coordinates, + const torch::Tensor& species, + float* atomic_energies, + float* gradients, + float* forces, + int num_atoms) { + + std::vector inputs; + inputs.push_back(std::make_tuple(species, coordinates)); + + auto output = module.forward(inputs).toTuple(); + at::Tensor energy_tensor = output->elements()[1].toTensor(); + + auto gradients_vec = torch::autograd::grad({energy_tensor}, {coordinates}, {}, true, false); + torch::Tensor gradient = gradients_vec[0]; + + if (!gradient.defined() || gradient.numel() == 0) { + std::cerr << "Error: Gradient is not defined or empty." << std::endl; + return; + } + +// Force calcn + torch::Tensor force = -gradient; + + auto atomic_energies_tensor = module.get_method("atomic_energies")(inputs).toTuple()->elements()[1].toTensor(); + + std::cout << "=========TESTING FOR OBJECT BASED MODEL LOADING ===============" << std::endl; + std::cout << " Energy: " << energy_tensor.item() << std::endl; + std::cout << " Force: " << force << std::endl; + std::cout << "=========================================" << std::endl; + + memcpy(atomic_energies, atomic_energies_tensor.data_ptr(), atomic_energies_tensor.numel() * sizeof(float)); + memcpy(gradients, gradient.data_ptr(), gradient.numel() * sizeof(float)); + memcpy(forces, force.data_ptr(), force.numel() * sizeof(float)); +} +*/ + +void ANIModel::get_custom_energy_grad(float* coordinates_data, int64_t* species_data, float* elecpots_data, int num_atoms, double* custom_energy, float* cus_grads, float* cus_forces, int print) { + + torch::Tensor coordinates = torch::from_blob(coordinates_data, {1, num_atoms, 3}, torch::kFloat32).clone().set_requires_grad(true); + torch::Tensor species = torch::from_blob(species_data, {1, num_atoms}, torch::kInt64).clone(); + torch::Tensor elecpots = torch::from_blob(elecpots_data, {1, num_atoms}, torch::kFloat32).clone(); + + coordinates = coordinates.contiguous(); + + std::map ani1x_sae_dict_byIdx = { + {0, -0.60095298}, // H + {1, -38.08316124}, // C + {2, -54.7077577}, // N + {3, -75.19446356} // O + }; + + + double shift = 0.0; + for (int i = 0; i < species.size(1); ++i) { + int atom_type = species[0][i].item(); + shift += ani1x_sae_dict_byIdx[atom_type]; + } + + auto aev_input = std::make_tuple(species, coordinates); + auto aev_output = aev_computer.forward({aev_input}).toTuple(); + torch::Tensor aevs = aev_output->elements()[1].toTensor(); // Get AEV output + + torch::Tensor aep = torch::cat({aevs, elecpots.unsqueeze(-1)}, -1); + + auto model_input = std::make_tuple(species, aep); + auto energy_output = module.forward({model_input}).toTuple(); + + torch::Tensor energy_unshifted = energy_output->elements()[1].toTensor(); //c + torch::Tensor energy_shifted = energy_unshifted + shift; //c + + if (print > 2) { + std::cout << "Energy (unshifted): " << energy_unshifted.item() << std::endl; //c + std::cout << std::fixed << std::setprecision(12) << "Energy (shifted): " << energy_shifted.item() << std::endl; //c + } + + std::vector gradients = torch::autograd::grad({energy_shifted}, {coordinates}); + torch::Tensor derivative = gradients[0]; + + torch::Tensor force = -derivative; + + if (print > 2) { + std::cout << "Force: " << force << std::endl; //c + } + + memcpy(cus_grads, derivative.data_ptr(), derivative.numel() * sizeof(float)); + memcpy(cus_forces, force.data_ptr(), force.numel() * sizeof(float)); + *custom_energy = static_cast(energy_shifted.item()); +} + + +// Hardcoded custom model routine +void engrad_custom_model(float* coordinates_data, int64_t* species_data, float* elecpots_data, int num_atoms, float* custom_energy, float* cus_grads, float* cus_forces) { + + torch::jit::script::Module aev_computer = torch::jit::load("/depot/lslipche/data/skp/torch_skp_branch/libefp/nnlib/aev_scripted.pt"); + torch::jit::script::Module model = torch::jit::load("/depot/lslipche/data/skp/torch_skp_branch/libefp/nnlib/custom_model_script.pt"); + + torch::Tensor coordinates = torch::from_blob(coordinates_data, {1, num_atoms, 3}, torch::kFloat32).clone().set_requires_grad(true); + torch::Tensor species = torch::from_blob(species_data, {1, num_atoms}, torch::kInt64).clone(); + torch::Tensor elecpots = torch::from_blob(elecpots_data, {1, num_atoms}, torch::kFloat32).clone(); + + coordinates = coordinates.contiguous(); + + auto aev_input = std::make_tuple(species, coordinates); + auto aev_output = aev_computer.forward({aev_input}).toTuple(); + torch::Tensor aevs = aev_output->elements()[1].toTensor(); // Get AEV output + + torch::Tensor aep = torch::cat({aevs, elecpots.unsqueeze(-1)}, -1); + + auto model_input = std::make_tuple(species, aep); + auto energy_output = model.forward({model_input}).toTuple(); + torch::Tensor energy = energy_output->elements()[1].toTensor(); + + std::vector gradients = torch::autograd::grad({energy}, {coordinates}); + torch::Tensor derivative = gradients[0]; + + torch::Tensor force = -derivative; + + memcpy(cus_grads, derivative.data_ptr(), derivative.numel() * sizeof(float)); + memcpy(cus_forces, force.data_ptr(), force.numel() * sizeof(float)); + memcpy(custom_energy, energy.data_ptr(), sizeof(float)); + +} + + +torch::jit::script::Module loadModel(const std::string& modelPath) { + try { + + // Load the model from file + torch::jit::script::Module model; + model = torch::jit::load(modelPath); + model.to(torch::kCPU); + model.eval(); + return model; + } catch (const c10::Error& e) { + std::cerr << "Error loading the model: " << e.what() << std::endl; + exit(1); + } +} + +void generateEnergyForces(torch::jit::script::Module& model, const std::vector>& coordinates, + float& energy, std::vector>& forces) { + try { + std::vector> coordCopy(coordinates); + torch::Tensor inputTensor = torch::from_blob(coordCopy.data(), {1, static_cast(coordCopy.size()), 3}); + std::vector energyInputs = {inputTensor}; + torch::Tensor energyTensor = model.forward(energyInputs).toTensor(); + + // Calculate forces using autograd + std::vector forceInputs = {energyTensor}; + std::vector forcesTensor = torch::autograd::grad(forceInputs, {inputTensor}, {torch::ones_like(energyTensor)}, true, true); + + // Extract energy and forces from tensors + energy = energyTensor.item(); + forces.resize(coordinates.size()); + for (size_t i = 0; i < coordinates.size(); ++i) { + forces[i].resize(3); + for (size_t j = 0; j < 3; ++j) { + forces[i][j] = forcesTensor[0][i][j].item(); + } + } + } catch (const c10::Error& e) { + std::cerr << "Error generating energy and forces: " << e.what() << std::endl; + exit(1); + } +} + +void generateSpeciesEnergyForces(torch::jit::script::Module& model, + const torch::Tensor& species, + const torch::Tensor& coordinates, + float& energy, + torch::Tensor& forces) { + try { + torch::IValue species_coordinates = std::make_tuple(species, coordinates); + auto result = model.forward({species_coordinates}).toTuple(); + energy = result->elements()[0].toTensor().index({0}).item(); // Extract the scalar value + forces = result->elements()[1].toTensor().clone(); // Make a clone to avoid modifying the original tensor + + + } catch (const c10::Error& e) { + std::cerr << "Error generating energy and forces: " << e.what() << std::endl; + exit(1); + } +} + + +int64_t mapSpeciesToInteger(const std::string& species) { + if (species == "H") + return 1; + else if (species == "O") + return 2; + else if (species == "C") + return 3; + else + return 0; +} + +struct Net : torch::nn::Module { + Net() { + fc1 = register_module("fc1", torch::nn::Linear(3, 16)); + fc2 = register_module("fc2", torch::nn::Linear(16, 3)); + } + + torch::Tensor forward(torch::Tensor x) { + x = torch::relu(fc1->forward(x)); + x = fc2->forward(x); + return x; + } + + torch::nn::Linear fc1{nullptr}, fc2{nullptr}; +}; + +void trainModel(Net &model, const std::vector> &input_data, const std::vector &target_data, int num_epochs, float learning_rate) { + torch::optim::SGD optimizer(model.parameters(), torch::optim::SGDOptions(learning_rate)); + + for (int epoch = 0; epoch < num_epochs; ++epoch) { + std::vector> non_const_input_data = input_data; + torch::Tensor inputs = torch::from_blob(non_const_input_data.data(), {static_cast(non_const_input_data.size()), static_cast(non_const_input_data[0].size())}); + + std::vector target_data_nonconst(target_data.begin(), target_data.end()); + torch::TensorOptions options = torch::TensorOptions().dtype(torch::kFloat32); + torch::Tensor targets = torch::from_blob(target_data_nonconst.data(), {static_cast(target_data_nonconst.size())}, options); + optimizer.zero_grad(); + torch::Tensor output = model.forward(inputs); + torch::Tensor loss = torch::mse_loss(output, targets); + loss.backward(); + optimizer.step(); + if (epoch % 10 == 0) { + std::cout << "Epoch: " << epoch << ", Loss: " << loss.item() << std::endl; + } + } +} + + +void generateEnergy(Net &model, const std::vector> &input_data) { + torch::NoGradGuard no_grad; + + int batch_size = input_data.size(); // del later + int input_size = input_data[0].size(); // del later + + std::vector> non_const_input_data = input_data; + + std::vector flattened_input_data; + flattened_input_data.reserve(batch_size * input_size); + for (const auto &sample : non_const_input_data) { + flattened_input_data.insert(flattened_input_data.end(), sample.begin(), sample.end()); + } + + + torch::Tensor inputs = torch::from_blob(flattened_input_data.data(), {batch_size, input_size}); // de later + + + + torch::Tensor output = model.forward(inputs); + + std::cout << "Energy: "; + std::vector energy_values(output.data_ptr(), output.data_ptr() + output.numel()); + + for (const auto &value : energy_values) { + std::cout << value << " "; + } + std::cout << std::endl; +} + + +torch::Tensor compute_gradient(const torch::Tensor& input) { + // Enable gradient computation + torch::autograd::GradMode::set_enabled(true); + // Create a variable from the input tensor + torch::Tensor variable = input.clone().detach().requires_grad_(true); + // Compute the output tensor + torch::Tensor output = variable * variable/* your computation using the variable */; + // Compute gradients of the output tensor with respect to the variable + torch::autograd::variable_list grad_outputs = {torch::ones_like(output)}; + torch::autograd::variable_list gradients = torch::autograd::grad({output}, {variable}, grad_outputs, /* retain_graph */ true); + torch::Tensor gradient = gradients[0]; + + return gradient; +} + + +// Hardcoded ANI1 routine +void get_ANI1_energy_grad(const torch::Tensor& coordinates, const torch::Tensor& species, float *atomic_energies, float *gradients, float *forces) { + + //const char* model_path_env = std::getenv("TORCHANI_DIR"); + //std::string model_path = std::string(model_path_env) + "ANI1x_saved2.pt"; + //std::cout << "Model loaded successfully from " << model_path << std::endl; + +// torch::jit::Module module = torch::jit::load(model_path); + torch::jit::Module module = torch::jit::load("/depot/lslipche/data/skp/torch_skp_branch/libefp/nnlib/ANI1x_saved2.pt"); + std::vector inputs; + inputs.push_back(std::make_tuple(species, coordinates)); + + auto output = module.forward(inputs).toTuple(); + at::Tensor energy_tensor = output->elements()[1].toTensor(); + + auto energy = energy_tensor.item(); + energy_tensor.backward(torch::ones_like(energy_tensor)); + + auto gradient = coordinates.grad(); + + if (!gradient.defined() || gradient.numel() == 0) { + std::cerr << "Error: Gradient is not defined or empty." << std::endl; + return; + } + + auto force = -gradient; + auto atomic_energies_tensor = module.get_method("atomic_energies")(inputs).toTuple()->elements()[1].toTensor(); + + memcpy(atomic_energies, atomic_energies_tensor.data_ptr(), atomic_energies_tensor.numel() * sizeof(float)); + memcpy(gradients, gradient.data_ptr(), gradient.numel() * sizeof(float)); + memcpy(forces, force.data_ptr(), force.numel() * sizeof(float)); + coordinates.grad().zero_(); + +} + +// Hardcoded ANI2 routine +void get_ANI2_energy_grad(const torch::Tensor& coordinates, const torch::Tensor& species, float *atomic_energies, float *gradients, float *forces) { + + torch::jit::Module module = torch::jit::load("/depot/lslipche/data/skp/torch_skp_branch/libefp/nnlib/ANI2x_saved.pt"); + std::vector inputs; + inputs.push_back(std::make_tuple(species, coordinates)); + + auto output = module.forward(inputs).toTuple(); + at::Tensor energy_tensor = output->elements()[1].toTensor(); + + auto energy = energy_tensor.item(); + energy_tensor.backward(torch::ones_like(energy_tensor)); + + auto gradient = coordinates.grad(); + + if (!gradient.defined() || gradient.numel() == 0) { + std::cerr << "Error: Gradient is not defined or empty." << std::endl; + return; + } + + auto force = -gradient; + auto atomic_energies_tensor = module.get_method("atomic_energies")(inputs).toTuple()->elements()[1].toTensor(); + + memcpy(atomic_energies, atomic_energies_tensor.data_ptr(), atomic_energies_tensor.numel() * sizeof(float)); + memcpy(gradients, gradient.data_ptr(), gradient.numel() * sizeof(float)); + memcpy(forces, force.data_ptr(), force.numel() * sizeof(float)); + coordinates.grad().zero_(); + +} + + +//================================= END OF C++ routines ==================================// + + +extern "C" { + +struct TensorData +{ + at::Tensor tensor; +}; + +// SKP wrappers + +void *compute_gradient_c(float* data, int64_t* sizes, int ndim) { + + torch::TensorOptions options; + options = options.dtype(torch::kFloat32); + torch::Tensor input_tensor = torch::from_blob(data, torch::IntArrayRef(sizes, ndim), options).clone(); + + torch::Tensor gradient_tensor = compute_gradient(input_tensor); + + size_t tensor_size = gradient_tensor.numel(); + float* gradient_data = new float[tensor_size]; + std::memcpy(gradient_data, gradient_tensor.data_ptr(), tensor_size * sizeof(float)); + + int64_t* gradient_sizes = new int64_t[gradient_tensor.dim()]; + std::memcpy(gradient_sizes, gradient_tensor.sizes().data(), gradient_tensor.dim() * sizeof(int64_t)); + + struct Tensor { + void* data; + int64_t* sizes; + int ndim; + int type_id; + int is_variable; + }; + + Tensor* gradient = new Tensor(); + gradient->data = gradient_data; + gradient->sizes = gradient_sizes; + gradient->ndim = gradient_tensor.dim(); + gradient->type_id = static_cast(gradient_tensor.scalar_type()); + gradient->is_variable = 0; + + return gradient; +} + +void destroy_tensor(struct Tensor *tensor) { + //delete[] tensor->data; + delete[] static_cast(tensor->data); + delete[] tensor->sizes; + delete tensor; +} + +// SKP started on June 5th=========================// + +Net *createNet() { + return new Net(); +} + +void destroyNet(Net *model) { + delete model; +} + +void forward(Net *model, const float *inputs, float *output, int input_size, int output_size) { + torch::Tensor input_tensor = torch::from_blob(const_cast(inputs), {input_size}); + torch::Tensor output_tensor = torch::from_blob(output, {output_size}); + torch::Tensor result = model->forward(input_tensor); + + std::memcpy(output, result.data_ptr(), output_size * sizeof(float)); +} + +void trainModelWrapper(Net *model, const float **input_data, const float *target_data,int num_samples, int num_epochs, float learning_rate) { + + std::vector> input_vec; + for (int i = 0; i < num_samples; ++i) { + std::vector data; + for (int j = 0; j < 3; ++j) { + data.push_back(input_data[i][j]); + } + input_vec.push_back(data); + } + + trainModel(*model, input_vec, std::vector(target_data, target_data + num_samples), num_epochs, learning_rate); + +} + +void generateEnergyWrapper(Net* model, const float **input_data, int batch_size, int input_size) { + std::vector> input_vec(batch_size, std::vector(input_size)); + + for (int i = 0; i < batch_size; ++i) { + for (int j = 0; j < input_size; ++j) { + input_vec[i][j] = input_data[i][j]; + } + } + + generateEnergy(*model, input_vec); +} + +// June6th + +void *loadModelWrapper(const char *modelPath) { + std::string path(modelPath); + torch::jit::script::Module *model = new torch::jit::script::Module(loadModel(path)); + return static_cast(model); +} + +void generateEnergyForcesWrapper(const void* model, const float* const* coordinates, + int num_atoms, float* energy, float* const* forces) { + + const torch::jit::script::Module* torchModel = static_cast(model); + + std::vector> coordVec(num_atoms, std::vector(3)); + for (int i = 0; i < num_atoms; ++i) { + for (int j = 0; j < 3; ++j) { + coordVec[i][j] = coordinates[i][j]; + } + } + + std::vector> forcesVec; + generateEnergyForces(const_cast(*torchModel), coordVec, *energy, forcesVec); + + for (int i = 0; i < num_atoms; ++i) { + for (int j = 0; j < 3; ++j) { + forces[i][j] = forcesVec[i][j]; + } + } +} + +void generateSpeciesEnergyForcesWrapper(const void* model, + const float* const* coordinates, + const int* species, + int num_atoms, + float* energy, + float* const* forces) { + const torch::jit::script::Module* torchModel = static_cast(model); + + // Convert the species and coordinates to Torch tensors +// torch::Tensor speciesTensor = torch::from_blob(species, {1, num_atoms}, torch::kInt32).clone(); +// torch::Tensor coordinatesTensor = torch::from_blob(coordinates, {1, num_atoms, 3}).clone(); + + torch::Tensor speciesTensor = torch::from_blob(const_cast(species), {1, num_atoms}, torch::kInt32).clone(); + torch::Tensor coordinatesTensor = torch::from_blob(const_cast(coordinates), {1, num_atoms, 3}).clone(); + + torch::jit::script::Module& nonConstModel = const_cast(*torchModel); + + // Generate energy and forces + torch::Tensor forcesTensor; + generateSpeciesEnergyForces(nonConstModel, speciesTensor, coordinatesTensor, *energy, forcesTensor); + + // Copy the forces to the output array + for (int i = 0; i < num_atoms; ++i) { + for (int j = 0; j < 3; ++j) { +// forces[i][j] = forcesTensor[0][i][j].item(); + forces[i][j] = forcesTensor[i][j].item(); + } + } +} + +//======== SKP June 29 =================================// + +// previously nnp_test7_wrapper +// this routine should have module in argument rather than model type +// and probably get_ANI1_energy_grad and get_ANI2_energy_grad will boil down to just get_ANI_energy_grad(.., .., ..., module) +// load NNP and its wrapper.. call that wrapper in opt.c/main.c... + +void get_torch_energy_grad(float* coordinates_data, int* species_data, int num_atoms, + float *atomic_energies, float *gradients, float *forces, + int model_type) { + + torch::Tensor speciesTensor = torch::from_blob(const_cast(species_data), + {1, num_atoms}, torch::kInt32); + torch::Tensor coordinatesTensor = torch::from_blob(const_cast(coordinates_data), + {1, num_atoms, 3}, torch::requires_grad(true)); + + if(model_type == 1) get_ANI1_energy_grad(coordinatesTensor, speciesTensor, atomic_energies, gradients, forces); + if(model_type == 2) get_ANI2_energy_grad(coordinatesTensor, speciesTensor, atomic_energies, gradients, forces); + +} + +void engrad_custom_model_wrapper(float* coordinates_data, int64_t* species_data, + float* elecpots_data, int num_atoms, float* custom_energy, + float* gradients, float* forces) { + + engrad_custom_model(coordinates_data, species_data, elecpots_data, + num_atoms, custom_energy, gradients, forces); +// std::cout << "Custom energy in wrapper " << *custom_energy << std::endl; +} + +//================================================= + + +ANIModel* ANIModel_new() { + return new ANIModel(); +} + + +void load_ani_model(ANIModel* model, int model_type, const char* nn_path) { + std::string path_str(nn_path); + model->load_model(model_type, path_str); +} + +void load_custom_ani_model(ANIModel* model, const char* aev_name, const char* model_name, + const char* nn_path) { + std::string path_str(nn_path); + std::string mod_str(model_name); + std::string aev_str(aev_name); + + model->load_custom_model(aev_str, mod_str, path_str); +} + +void get_ani_energy_grad(ANIModel* model, float* coordinates, int* species, double* ani_energy, + float* gradients, float* forces, int num_atoms, int print) { + auto coordinates_tensor = torch::from_blob((float*)coordinates, {1, num_atoms, 3}, + torch::kFloat32).clone().set_requires_grad(true); + auto species_tensor = torch::from_blob((int*)species, {1, num_atoms}, torch::kInt32); + + model->get_energy_grad(coordinates_tensor, species_tensor, ani_energy, gradients, + forces, num_atoms, print); +} + +void get_custom_energy_grad_wrapper(ANIModel* model, float* coordinates, int64_t* species, + float* elecpots, int num_atoms, double* custom_energy, + float* gradients, float* forces, int print) { + model->get_custom_energy_grad(coordinates, species, elecpots, num_atoms, custom_energy, + gradients, forces, print); +} + +void ANIModel_delete(ANIModel* model) { + model->~ANIModel(); +} + +//=====================================// +} // extern "C" diff --git a/efpmd/torch/c_libtorch.h b/efpmd/torch/c_libtorch.h new file mode 100644 index 00000000..1b6c5d0d --- /dev/null +++ b/efpmd/torch/c_libtorch.h @@ -0,0 +1,66 @@ +#ifndef C_LIBTORCH_H_ +#define C_LIBTORCH_H_ + +#include + + +#ifdef __cplusplus +extern "C" { +#endif + +struct TensorData; // Opaque + +struct Tensor{ + void* data; + int64_t* sizes; + int ndim; + int type_id; + int is_variable; +}; + + +void *compute_gradient_c(float* data, int64_t* sizes, int ndim); +void destroy_tensor(struct Tensor *tensor); + +typedef struct Net Net; +Net *createNet(); +void destroyNet(Net *model); +void forward(Net* model, const float *inputs, float *output, int input_size, int output_size); +void trainModelWrapper(Net *model, const float **input_data, const float *target_data, int num_samples, int num_epochs, float learning_rate); +void generateEnergyWrapper(Net *model, const float **input_data, int batch_size, int input_size); + + +// June-6th + +void *loadModelWrapper(const char *modelPath); +void generateEnergyForcesWrapper(const void* model, const float* const* coordinates, int num_atoms, float* energy, float* const* forces); +void generateSpeciesEnergyForcesWrapper(const void* model, const float* const* coordinates, const int* species, int num_atoms, float* energy, float* const* forces); + +//void get_torch_energy_grad(float* coordinates_data, int* species_data, int num_atoms, float *atomic_energies, float *gradients, float *forces, int model_type); +//void get_custom_energy_grad(float* coordinates_data, int* species_data); +void engrad_custom_model_wrapper(float* coordinates_data, int64_t* species_data, float* elecpots_data, int num_atoms, float *custom_energy, float *gradients, float *forces); + +// ================== // +// ==== Wrappers ==== // + +typedef struct ANIModel ANIModel; + +ANIModel* ANIModel_new(); +void load_ani_model(ANIModel* model, int model_type, const char* nn_path); +void load_custom_ani_model(ANIModel* model, const char* aev_name, const char* model_name, const char* nn_path); +void get_ani_energy_grad(ANIModel* model, float* coordinates, int* species, double* ani_energy, float* gradients, float* forces, int num_atoms, int print); +//void get_ani_energy_grad(ANIModel* model, float* coordinates, int* species, float* atomic_energies, float* gradients, float* forces, int num_atoms); +//void get_custom_energy_grad_wrapper(ANIModel* model, float* coordinates, int64_t* species, float* elecpots, int num_atoms, float* custom_energy, float* gradients, float* forces); +void get_custom_energy_grad_wrapper(ANIModel* model, float* coordinates, int64_t* species, float* elecpots, int num_atoms, double* custom_energy, float* gradients, float* forces, int print); + +void ANIModel_delete(ANIModel* model); + +//================// + + +#ifdef __cplusplus +} +#endif + + +#endif // C_LIBTORCH_H_ diff --git a/efpmd/torch/tst_torch.sh b/efpmd/torch/tst_torch.sh new file mode 100755 index 00000000..48a8c487 --- /dev/null +++ b/efpmd/torch/tst_torch.sh @@ -0,0 +1,19 @@ +rm -rf build +mkdir build + +cd build + +TORCH_INSTALLED_DIR=~/libtorch/share/cmake/Torch ## Address for the location of your LibTorch installation + +echo "TORCH_DIR = " ${TORCH_INSTALLED_DIR} + +# Specify _GLIBCXX_USE_CXX11_ABI=0 when you compile c-libtorch using clang with precompiled libtorch which is built with pre-C++11 ABI + TORCH_CXX_FLAGS="-D_GLIBCXX_USE_CXX11_ABI=0" + +# (optional) Enable Address Sanitizer +# -DSANITIZE_ADDRESS=1 + +Torch_DIR=${TORCH_INSTALLED_DIR} \ +cmake .. + +make diff --git a/fraglib/ch2o_lj.efp b/fraglib/ch2o_lj.efp new file mode 100644 index 00000000..222fec74 --- /dev/null +++ b/fraglib/ch2o_lj.efp @@ -0,0 +1,22 @@ + $ch2o_lj_l +EFP DATA FOR FRAGNAME SCFTYP=RHF ... GENERATED WITH BASIS SET=6-311++G(3df,2p) + COORDINATES (BOHR) + C 0.524512 0.000804 0.000092 12.0 6.0 + O -0.666413 0.000723 -0.000022 16.0 8.0 + H 1.085163 -0.934036 -0.000186 1.0 1.0 + H 1.099066 0.923427 -0.000188 1.0 1.0 +STOP +MM_CHARGE + C 0.0 + O -0.4 + H 0.2 + H 0.2 +STOP +MM_LJ + C 2.1 0.7 + O 1.8 0.8 + H 1.3 0.5 + H 1.3 0.5 +STOP + $end + diff --git a/fraglib/h2o-mm.efp b/fraglib/h2o-mm.efp new file mode 100644 index 00000000..29490b69 --- /dev/null +++ b/fraglib/h2o-mm.efp @@ -0,0 +1,1287 @@ + RUNTYP=MAKEFP EFFECTIVE FRAGMENT POTENTIAL DATA FOLLOWS... + FRAGNAMEEFP GENERATED AT Tue Mar 27 16:14:27 2012 + $H2O-MM_L +EFP DATA FOR FRAGNAME SCFTYP=RHF ... GENERATED WITH BASIS SET=6-311++G(3df,2p) + COORDINATES (BOHR) +A01O1 0.0000000000 0.1191094785 0.0000000000 15.9949100 8.0 +A02H2 -1.4223059670 -0.9451766865 0.0000000000 1.0078250 1.0 +A03H3 1.4223059670 -0.9451766865 0.0000000000 1.0078250 1.0 +BO21 -0.7111529835 -0.4130336040 0.0000000000 0.0000000 0.0 +BO31 0.7111529835 -0.4130336040 0.0000000000 0.0000000 0.0 + STOP + MONOPOLES +A01O1 -8.4173680991 8.00000 +A02H2 -0.3512187169 1.00000 +A03H3 -0.3512187169 1.00000 +BO21 -0.4400972335 0.00000 +BO31 -0.4400972335 0.00000 + STOP + DIPOLES +A01O1 0.0000000000 -0.4127062480 0.0000000000 +A02H2 -0.0027268078 -0.0014022974 0.0000000000 +A03H3 0.0027268078 -0.0014022974 0.0000000000 +BO21 0.2657818726 0.2358863756 0.0000000000 +BO31 -0.2657818726 0.2358863756 0.0000000000 + STOP + QUADRUPOLES +A01O1 -3.7495006512 -4.1291495807 -4.6378678881 0.0000000000 > + 0.0000000000 0.0000000000 +A02H2 -0.1692608571 -0.1690206886 -0.1691689065 0.0000353147 > + 0.0000000000 0.0000000000 +A03H3 -0.1692608571 -0.1690206886 -0.1691689065 -0.0000353147 > + 0.0000000000 0.0000000000 +BO21 -0.1924885465 -0.1846098691 -0.1848031216 -0.0092326484 > + 0.0000000000 0.0000000000 +BO31 -0.1924885465 -0.1846098691 -0.1848031216 0.0092326484 > + 0.0000000000 0.0000000000 + STOP + OCTUPOLES +A01O1 0.0000000000 -1.0017712994 0.0000000000 -0.3012532793 > + 0.0000000000 0.0000000000 0.0000000000 0.0000000000 > + -0.3304258976 0.0000000000 +A02H2 -0.0011623499 -0.0005685770 0.0000000000 -0.0001715688 > + 0.0000000000 -0.0003501195 0.0000000000 -0.0003998870 > + -0.0002082332 0.0000000000 +A03H3 0.0011623499 -0.0005685770 0.0000000000 -0.0001715688 > + 0.0000000000 0.0003501195 0.0000000000 0.0003998870 > + -0.0002082332 0.0000000000 +BO21 0.6405629452 0.5638506515 0.0000000000 0.2088443825 > + 0.0000000000 0.2236371522 0.0000000000 0.2011226630 > + 0.1831196699 0.0000000000 +BO31 -0.6405629452 0.5638506515 0.0000000000 0.2088443825 > + 0.0000000000 -0.2236371522 0.0000000000 -0.2011226630 > + 0.1831196699 0.0000000000 + STOP + POLARIZABLE POINTS +CT1 -0.7491370634 -0.4890369778 0.0000000020 + 2.6629294234 1.7670590537 0.7812922107 1.2832534969 > + -0.0000000037 -0.0000000033 1.1482095947 -0.0000000144 > + -0.0000000132 +CT2 0.7491370628 -0.4890369781 0.0000000040 + 2.6629294254 1.7670590567 0.7812922113 -1.2832535009 > + 0.0000000076 -0.0000000067 -1.1482095971 0.0000000195 > + -0.0000000177 +CT3 0.0000000011 0.3892153728 -0.4957986131 + 1.4502428775 1.8574126776 2.7113709049 0.0000000046 > + -0.0000000029 -0.9972382204 0.0000000048 -0.0000000034 > + -1.0913249895 +CT4 -0.0000000005 0.3892153799 0.4957986071 + 1.4502428978 1.8574127185 2.7113708742 -0.0000000023 > + -0.0000000009 0.9972382303 -0.0000000024 -0.0000000017 > + 1.0913250020 + STOP + DYNAMIC POLARIZABLE POINTS +CT 1 -0.7491370634 -0.4890369778 0.0000000020 -- FOR W= 0.002792I A.U. + 2.6628308299 1.7669791294 0.7812438048 1.2832888412 > + -0.0000000037 -0.0000000033 1.1481267309 -0.0000000048 > + -0.0000000043 +CT 2 0.7491370628 -0.4890369781 0.0000000040 + 2.6628308302 1.7669791324 0.7812438054 -1.2832888436 > + 0.0000000076 -0.0000000067 -1.1481267333 0.0000000100 > + -0.0000000088 +CT 3 0.0000000011 0.3892153728 -0.4957986131 + 1.4502961928 1.8573844595 2.7113515087 0.0000000047 > + -0.0000000026 -0.9971988742 0.0000000048 -0.0000000034 > + -1.0912918146 +CT 4 -0.0000000005 0.3892153799 0.4957986071 + 1.4502962132 1.8573845004 2.7113514703 -0.0000000023 > + -0.0000000013 0.9971988842 -0.0000000024 -0.0000000017 > + 1.0912918276 +CT 1 -0.7491370634 -0.4890369778 0.0000000020 -- FOR W= 0.015107I A.U. + 2.6615305226 1.7661313020 0.7811281985 1.2823685943 > + -0.0000000037 -0.0000000033 1.1470482318 -0.0000000048 > + -0.0000000043 +CT 2 0.7491370628 -0.4890369781 0.0000000040 + 2.6615305229 1.7661313050 0.7811281990 -1.2823685966 > + 0.0000000076 -0.0000000067 -1.1470482342 0.0000000099 > + -0.0000000087 +CT 3 0.0000000011 0.3892153728 -0.4957986131 + 1.4497970009 1.8563505236 2.7090832596 0.0000000046 > + -0.0000000026 -0.9962755135 0.0000000048 -0.0000000034 > + -1.0896271361 +CT 4 -0.0000000005 0.3892153799 0.4957986071 + 1.4497970213 1.8563505645 2.7090832212 -0.0000000023 > + -0.0000000013 0.9962755234 -0.0000000024 -0.0000000017 > + 1.0896271491 +CT 1 -0.7491370634 -0.4890369778 0.0000000020 -- FOR W= 0.039002I A.U. + 2.6539362778 1.7611880323 0.7804535156 1.2769976670 > + -0.0000000037 -0.0000000032 1.1407711978 -0.0000000048 > + -0.0000000042 +CT 2 0.7491370628 -0.4890369781 0.0000000040 + 2.6539362781 1.7611880353 0.7804535162 -1.2769976693 > + 0.0000000075 -0.0000000066 -1.1407712002 0.0000000098 > + -0.0000000087 +CT 3 0.0000000011 0.3892153728 -0.4957986131 + 1.4468795665 1.8503295646 2.6959157269 0.0000000046 > + -0.0000000026 -0.9909029890 0.0000000047 -0.0000000034 > + -1.0799936502 +CT 4 -0.0000000005 0.3892153799 0.4957986071 + 1.4468795867 1.8503296052 2.6959156888 -0.0000000023 > + -0.0000000013 0.9909029989 -0.0000000024 -0.0000000017 > + 1.0799936631 +CT 1 -0.7491370634 -0.4890369778 0.0000000020 -- FOR W= 0.077996I A.U. + 2.6275817573 1.7441406649 0.7781169114 1.2584071663 > + -0.0000000036 -0.0000000032 1.1192712871 -0.0000000046 > + -0.0000000041 +CT 2 0.7491370628 -0.4890369781 0.0000000040 + 2.6275817576 1.7441406678 0.7781169120 -1.2584071686 > + 0.0000000075 -0.0000000065 -1.1192712894 0.0000000095 > + -0.0000000084 +CT 3 0.0000000011 0.3892153728 -0.4957986131 + 1.4367285195 1.8296625938 2.6512372720 0.0000000046 > + -0.0000000026 -0.9725215870 0.0000000046 -0.0000000032 > + -1.0476939757 +CT 4 -0.0000000005 0.3892153799 0.4957986071 + 1.4367285394 1.8296626336 2.6512372348 -0.0000000023 > + -0.0000000013 0.9725215968 -0.0000000023 -0.0000000016 > + 1.0476939882 +CT 1 -0.7491370634 -0.4890369778 0.0000000020 -- FOR W= 0.138651I A.U. + 2.5553079411 1.6981769397 0.7717066853 1.2078163989 > + -0.0000000035 -0.0000000031 1.0624555191 -0.0000000042 > + -0.0000000038 +CT 2 0.7491370628 -0.4890369781 0.0000000040 + 2.5553079414 1.6981769425 0.7717066858 -1.2078164010 > + 0.0000000073 -0.0000000063 -1.0624555213 0.0000000086 > + -0.0000000077 +CT 3 0.0000000011 0.3892153728 -0.4957986131 + 1.4086698540 1.7746812981 2.5359560680 0.0000000044 > + -0.0000000025 -0.9240984533 0.0000000044 -0.0000000029 > + -0.9671757611 +CT 4 -0.0000000005 0.3892153799 0.4957986071 + 1.4086698728 1.7746813358 2.5359560333 -0.0000000022 > + -0.0000000012 0.9240984627 -0.0000000022 -0.0000000015 > + 0.9671757726 +CT 1 -0.7491370634 -0.4890369778 0.0000000020 -- FOR W= 0.233223I A.U. + 2.3846090081 1.5932828107 0.7560609134 1.0906983270 > + -0.0000000033 -0.0000000028 0.9392812055 -0.0000000034 > + -0.0000000032 +CT 2 0.7491370628 -0.4890369781 0.0000000040 + 2.3846090083 1.5932828131 0.7560609140 -1.0906983290 > + 0.0000000068 -0.0000000057 -0.9392812074 0.0000000070 > + -0.0000000065 +CT 3 0.0000000011 0.3892153728 -0.4957986131 + 1.3409822403 1.6531124061 2.2961184044 0.0000000040 > + -0.0000000023 -0.8198553708 0.0000000038 -0.0000000024 > + -0.8131114788 +CT 4 -0.0000000005 0.3892153799 0.4957986071 + 1.3409822569 1.6531124392 2.2961183746 -0.0000000020 > + -0.0000000012 0.8198553792 -0.0000000019 -0.0000000012 > + 0.8131114885 +CT 1 -0.7491370634 -0.4890369778 0.0000000020 -- FOR W= 0.385897I A.U. + 2.0400182409 1.3904465854 0.7188935711 0.8654212717 > + -0.0000000028 -0.0000000023 0.7274286833 -0.0000000025 > + -0.0000000023 +CT 2 0.7491370628 -0.4890369781 0.0000000040 + 2.0400182410 1.3904465874 0.7188935716 -0.8654212733 > + 0.0000000058 -0.0000000046 -0.7274286847 0.0000000051 > + -0.0000000048 +CT 3 0.0000000011 0.3892153728 -0.4957986131 + 1.1969753812 1.4313263542 1.8965965364 0.0000000031 > + -0.0000000020 -0.6425515837 0.0000000029 -0.0000000018 > + -0.5966225133 +CT 4 -0.0000000005 0.3892153799 0.4957986071 + 1.1969753935 1.4313263798 1.8965965143 -0.0000000016 > + -0.0000000010 0.6425515906 -0.0000000015 -0.0000000009 > + 0.5966225205 +CT 1 -0.7491370634 -0.4890369778 0.0000000020 -- FOR W= 0.649114I A.U. + 1.4855378731 1.0648209020 0.6294652875 0.5406348664 > + -0.0000000021 -0.0000000016 0.4572294577 -0.0000000017 > + -0.0000000015 +CT 2 0.7491370628 -0.4890369781 0.0000000040 + 1.4855378731 1.0648209034 0.6294652880 -0.5406348674 > + 0.0000000043 -0.0000000033 -0.4572294587 0.0000000036 > + -0.0000000031 +CT 3 0.0000000011 0.3892153728 -0.4957986131 + 0.9375153996 1.0967796799 1.3638653801 0.0000000020 > + -0.0000000015 -0.4171575929 0.0000000018 -0.0000000012 > + -0.3749219228 +CT 4 -0.0000000005 0.3892153799 0.4957986071 + 0.9375154063 1.0967796963 1.3638653672 -0.0000000010 > + -0.0000000007 0.4171575978 -0.0000000009 -0.0000000006 > + 0.3749219274 +CT 1 -0.7491370634 -0.4890369778 0.0000000020 -- FOR W= 1.153904I A.U. + 0.8310946525 0.6448294095 0.4433225848 0.2347751215 > + -0.0000000012 -0.0000000009 0.2135922210 -0.0000000011 > + -0.0000000008 +CT 2 0.7491370628 -0.4890369781 0.0000000040 + 0.8310946525 0.6448294103 0.4433225850 -0.2347751219 > + 0.0000000024 -0.0000000018 -0.2135922215 0.0000000023 > + -0.0000000017 +CT 3 0.0000000011 0.3892153728 -0.4957986131 + 0.5720612668 0.6675071517 0.7867028267 0.0000000009 > + -0.0000000008 -0.2067797188 0.0000000009 -0.0000000008 > + -0.1924478532 +CT 4 -0.0000000005 0.3892153799 0.4957986071 + 0.5720612691 0.6675071599 0.7867028210 -0.0000000004 > + -0.0000000004 0.2067797214 -0.0000000004 -0.0000000004 > + 0.1924478558 +CT 1 -0.7491370634 -0.4890369778 0.0000000020 -- FOR W= 2.307592I A.U. + 0.3063042207 0.2574225216 0.1982295724 0.0639106585 > + -0.0000000004 -0.0000000003 0.0644133169 -0.0000000005 > + -0.0000000003 +CT 2 0.7491370628 -0.4890369781 0.0000000040 + 0.3063042207 0.2574225219 0.1982295725 -0.0639106586 > + 0.0000000008 -0.0000000006 -0.0644133171 0.0000000010 > + -0.0000000007 +CT 3 0.0000000011 0.3892153728 -0.4957986131 + 0.2269669328 0.2635846160 0.3064056585 0.0000000003 > + -0.0000000003 -0.0683987525 0.0000000003 -0.0000000003 > + -0.0670996294 +CT 4 -0.0000000005 0.3892153799 0.4957986071 + 0.2269669333 0.2635846188 0.3064056567 -0.0000000001 > + -0.0000000001 0.0683987534 -0.0000000001 -0.0000000002 > + 0.0670996305 +CT 1 -0.7491370634 -0.4890369778 0.0000000020 -- FOR W= 5.957643I A.U. + 0.0571198024 0.0507131811 0.0417294990 0.0090376652 > + -0.0000000001 -0.0000000001 0.0096158579 -0.0000000001 > + -0.0000000001 +CT 2 0.7491370628 -0.4890369781 0.0000000040 + 0.0571198024 0.0507131811 0.0417294990 -0.0090376653 > + 0.0000000001 -0.0000000001 -0.0096158580 0.0000000002 > + -0.0000000001 +CT 3 0.0000000011 0.3892153728 -0.4957986131 + 0.0454708004 0.0521174139 0.0607803826 0.0000000000 > + -0.0000000001 -0.0119427874 0.0000000001 -0.0000000001 > + -0.0118954262 +CT 4 -0.0000000005 0.3892153799 0.4957986071 + 0.0454708005 0.0521174144 0.0607803822 0.0000000000 > + 0.0000000000 0.0119427876 0.0000000000 0.0000000000 > + 0.0118954264 +CT 1 -0.7491370634 -0.4890369778 0.0000000020 -- FOR W=32.239080I A.U. + 0.0021417139 0.0019347819 0.0016331619 0.0002997813 > + 0.0000000000 0.0000000000 0.0003226353 0.0000000000 > + 0.0000000000 +CT 2 0.7491370628 -0.4890369781 0.0000000040 + 0.0021417139 0.0019347819 0.0016331619 -0.0002997813 > + 0.0000000000 0.0000000000 -0.0003226353 0.0000000000 > + 0.0000000000 +CT 3 0.0000000011 0.3892153728 -0.4957986131 + 0.0017902720 0.0020432992 0.0023747519 0.0000000000 > + 0.0000000000 -0.0004422681 0.0000000000 0.0000000000 > + -0.0004420475 +CT 4 -0.0000000005 0.3892153799 0.4957986071 + 0.0017902720 0.0020432992 0.0023747519 0.0000000000 > + 0.0000000000 0.0004422681 0.0000000000 0.0000000000 > + 0.0004420475 + STOP + PROJECTION BASIS SET +A01O1 0.0000000000 0.1191094785 0.0000000000 6.0 + S 6 + 1 8588.5000000000 1.20501289 + 2 1297.2300000000 2.21620477 + 3 299.2960000000 3.62745250 + 4 87.3771000000 4.88845231 + 5 25.6789000000 4.83572052 + 6 3.7400400000 0.53822949 + L 3 + 7 42.1175000000 1.34195780 5.58401753 + 8 9.6283700000 3.58711431 5.73336569 + 9 2.8533200000 -0.00512347 4.33295474 + L 1 + 10 0.9056610000 0.66165918 1.25935210 + L 1 + 11 0.2556110000 0.25620922 0.25906844 + L 1 + 12 0.0845000000 0.11169986 0.06493980 + D 1 + 13 5.1680000000 29.15572464 + D 1 + 14 1.2920000000 2.57702633 + D 1 + 15 0.3230000000 0.22777910 + F 1 + 16 1.4000000000 3.13864741 + +A02H2 -1.4223059670 -0.9451766865 0.0000000000 1.0 + S 3 + 17 33.8650000000 0.25506932 + 18 5.0947900000 0.46010866 + 19 1.1587900000 0.67832145 + S 1 + 20 0.3258400000 0.30737135 + S 1 + 21 0.1027410000 0.12933556 + S 1 + 22 0.0360000000 0.05890294 + P 1 + 23 1.5000000000 2.36621477 + P 1 + 24 0.3750000000 0.41829163 + +A03H3 1.4223059670 -0.9451766865 0.0000000000 1.0 + S 3 + 25 33.8650000000 0.25506932 + 26 5.0947900000 0.46010866 + 27 1.1587900000 0.67832145 + S 1 + 28 0.3258400000 0.30737135 + S 1 + 29 0.1027410000 0.12933556 + S 1 + 30 0.0360000000 0.05890294 + P 1 + 31 1.5000000000 2.36621477 + P 1 + 32 0.3750000000 0.41829163 + + STOP + MULTIPLICITY 1 + STOP + PROJECTION WAVEFUNCTION 4 65 + 1 1-5.05028060E-02-8.96007592E-02-1.64436933E-01-1.25432643E-01 9.01096238E-10 + 1 2 2.38840429E-01-2.44752246E-01-1.90392291E-01 1.34642888E-09 1.16480804E-01 + 1 3-1.11251074E-01-1.20577903E-01 1.27933818E-09-1.95806755E-02-7.04029141E-03 + 1 4-1.78887586E-02 2.39862309E-10-3.65025450E-03-3.53828179E-03-4.95391577E-03 + 1 5 2.26173348E-03 0.00000000E+00-3.31913265E-12-8.02974463E-03-4.28815901E-03 + 1 6-2.10687637E-02 1.92649506E-02 0.00000000E+00-4.11201623E-11-3.37543102E-02 + 1 7-1.26128911E-02-2.30393466E-02-6.58581935E-03 0.00000000E+00-7.36703284E-11 + 1 8-6.29053161E-03-3.48327085E-03 4.43128321E-12-3.98317166E-03 2.84620798E-11 + 1 9-1.45518639E-03 1.78139485E-11 1.35760624E-03 1.12938441E-03 0.00000000E+00 + 1 10 1.93015410E-01 2.99444779E-01 6.61631627E-02-1.09251953E-03 1.46234603E-02 + 1 11 1.01069903E-02 3.76705059E-11 4.45010740E-02 3.16758830E-02 6.51568662E-11 + 1 12-1.61847713E-02-5.85492715E-02-1.88699889E-02 6.06526658E-04-4.65363673E-03 + 1 13-5.02423910E-03 3.76705059E-11 1.60223811E-03-1.43807194E-02 6.51568662E-11 + 2 1 5.05028059E-02 8.96007591E-02-1.64436933E-01 1.25432643E-01-1.85007287E-09 + 2 2-2.38840429E-01-2.44752246E-01 1.90392291E-01-2.76440123E-09-1.16480803E-01 + 2 3-1.11251074E-01 1.20577903E-01-2.62665491E-09 1.95806756E-02-7.04029141E-03 + 2 4 1.78887586E-02-4.92469874E-10 3.65025449E-03 3.53828178E-03 4.95391577E-03 + 2 5 2.26173348E-03 0.00000000E+00 6.81462978E-12 8.02974461E-03 4.28815897E-03 + 2 6 2.10687637E-02 1.92649506E-02 0.00000000E+00 8.44252738E-11 3.37543101E-02 + 2 7 1.26128911E-02 2.30393465E-02-6.58581934E-03 0.00000000E+00 1.51255182E-10 + 2 8-6.29053161E-03 3.48327086E-03-9.09802582E-12 3.98317167E-03-5.84365126E-11 + 2 9-1.45518639E-03-3.65744540E-11 1.35760624E-03-1.12938441E-03 0.00000000E+00 + 2 10 1.61847712E-02 5.85492712E-02 1.88699888E-02-6.06526660E-04-4.65363674E-03 + 2 11 5.02423910E-03-7.73426611E-11 1.60223805E-03 1.43807194E-02-1.33775889E-10 + 2 12-1.93015410E-01-2.99444780E-01-6.61631627E-02 1.09251953E-03 1.46234603E-02 + 2 13-1.01069903E-02-7.73426611E-11 4.45010740E-02-3.16758830E-02-1.33775889E-10 + 3 1 6.62153318E-02 1.22074202E-01-5.10009005E-10-1.34345378E-01 2.04679123E-01 + 3 2-3.35198358E-01-7.59110786E-10-1.93873371E-01 3.05834018E-01-4.87774285E-01 + 3 3-3.45050523E-10-1.44841302E-01 2.90594729E-01-6.88772451E-02-2.18358002E-11 + 3 4-2.31502718E-02 5.44834226E-02 6.82923370E-03 7.30106249E-03 6.05234724E-03 + 3 5 7.01487445E-12 0.00000000E+00-7.53922978E-04 1.79601088E-02 2.91806393E-02 + 3 6 1.92801504E-02 5.97511648E-11 0.00000000E+00-9.34022183E-03 2.25167256E-02 + 3 7 4.91504905E-02 3.94697753E-02-2.04262334E-11 0.00000000E+00-1.67338155E-02 + 3 8-1.95103844E-11-4.04086307E-03 1.00654195E-03-1.08470720E-03 6.46500705E-03 + 3 9-4.51333012E-12 4.04634179E-03 4.21068061E-12 1.83510168E-04 0.00000000E+00 + 3 10 1.21565635E-02 8.11644374E-02 3.66828070E-02 1.22433872E-03 7.63402733E-04 + 3 11-4.93039362E-03 8.55665110E-03 1.94960866E-02 5.04822337E-03 1.48000288E-02 + 3 12 1.21565629E-02 8.11644363E-02 3.66828068E-02 1.22433873E-03-7.63402703E-04 + 3 13-4.93039367E-03 8.55665110E-03-1.94960865E-02 5.04822323E-03 1.48000288E-02 + 4 1 6.62153319E-02 1.22074202E-01 2.52388278E-10-1.34345381E-01-2.04679121E-01 + 4 2-3.35198358E-01 3.75661335E-10-1.93873376E-01-3.05834015E-01-4.87774289E-01 + 4 3 1.70755234E-10-1.44841305E-01-2.90594726E-01-6.88772461E-02 1.08058876E-11 + 4 4-2.31502723E-02-5.44834220E-02 6.82923373E-03 7.30106253E-03 6.05234724E-03 + 4 5-3.47145259E-12 0.00000000E+00 7.53922970E-04 1.79601088E-02 2.91806396E-02 + 4 6 1.92801504E-02-2.95690731E-11 0.00000000E+00 9.34022173E-03 2.25167254E-02 + 4 7 4.91504909E-02 3.94697755E-02 1.01083350E-11 0.00000000E+00 1.67338153E-02 + 4 8 9.65510855E-12-4.04086316E-03-1.00654193E-03-1.08470726E-03-6.46500698E-03 + 4 9 2.23351275E-12-4.04634175E-03-2.08374051E-12 1.83510185E-04 0.00000000E+00 + 4 10 1.21565643E-02 8.11644391E-02 3.66828076E-02 1.22433874E-03 7.63402849E-04 + 4 11-4.93039368E-03-8.55665101E-03 1.94960870E-02 5.04822344E-03-1.48000286E-02 + 4 12 1.21565647E-02 8.11644397E-02 3.66828077E-02 1.22433873E-03-7.63402864E-04 + 4 13-4.93039365E-03-8.55665101E-03-1.94960871E-02 5.04822351E-03-1.48000286E-02 + FOCK MATRIX ELEMENTS + -0.9202084588 0.1883945642 -0.9202084584 0.1819831225 > + -0.1819831230 -0.6746177047 0.1819831210 -0.1819831205 > + -0.1633796667 -0.6746177035 + LMO CENTROIDS +CT1 -0.7491370634 -0.4890369778 0.0000000020 +CT2 0.7491370628 -0.4890369781 0.0000000040 +CT3 0.0000000011 0.3892153728 -0.4957986131 +CT4 -0.0000000005 0.3892153799 0.4957986071 + STOP + CANONVEC 5 65 + 1 1 5.51327534E-01 4.72641007E-01 0.00000000E+00-3.13721980E-03 0.00000000E+00 + 1 2 1.01298044E-03 0.00000000E+00 6.45269584E-03 0.00000000E+00-5.98944215E-03 + 1 3-1.19325319E-11 2.61448007E-04 0.00000000E+00-6.80879546E-04 0.00000000E+00 + 1 4 1.87003338E-04 0.00000000E+00 1.22789884E-03 1.17086931E-03 1.08132804E-03 + 1 5 0.00000000E+00 0.00000000E+00 0.00000000E+00 2.02303142E-03 2.11284523E-03 + 1 6 2.21994718E-03 0.00000000E+00 0.00000000E+00 0.00000000E+00 1.05419518E-03 + 1 7 1.21514961E-03 1.49941156E-03 0.00000000E+00 0.00000000E+00 0.00000000E+00 + 1 8 0.00000000E+00-3.14844626E-03 0.00000000E+00-1.52841717E-03 0.00000000E+00 + 1 9 0.00000000E+00 0.00000000E+00 0.00000000E+00-1.39307513E-03 0.00000000E+00 + 1 10 1.62043454E-04 1.07545096E-03 2.27975352E-04 5.52398860E-05 6.35518219E-06 + 1 11-2.30555814E-05 0.00000000E+00 4.31833039E-04 3.07093637E-04 0.00000000E+00 + 1 12 1.62043454E-04 1.07545099E-03 2.27975352E-04 5.52398845E-05-6.35518209E-06 + 1 13-2.30555816E-05 0.00000000E+00-4.31833045E-04 3.07093643E-04 0.00000000E+00 + 2 1-1.12093429E-01-2.02583627E-01 0.00000000E+00-3.72137647E-02 0.00000000E+00 + 2 2 5.47915981E-01 0.00000000E+00-6.45963635E-02-3.63272738E-11 5.28986168E-01 + 2 3-7.63766142E-11-2.31041269E-02 0.00000000E+00 3.28592808E-02 0.00000000E+00 + 2 4-2.08628357E-03 0.00000000E+00-9.75124855E-03-1.00020774E-02-1.06380015E-02 + 2 5 0.00000000E+00 0.00000000E+00 0.00000000E+00-2.38215382E-02-2.85337864E-02 + 2 6-4.00283177E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00-5.73716380E-02 + 2 7-5.43201119E-02-5.86134338E-02 2.84830284E-11 0.00000000E+00 0.00000000E+00 + 2 8 0.00000000E+00-7.83131144E-04 1.97398715E-11-3.74980284E-03 0.00000000E+00 + 2 9 0.00000000E+00 0.00000000E+00 0.00000000E+00 1.16334418E-03 0.00000000E+00 + 2 10 9.28576017E-02 7.43521947E-02-2.15087195E-03-1.27044546E-03 1.05763308E-02 + 2 11 6.93086781E-03 0.00000000E+00 9.17063088E-03 5.96693801E-03 0.00000000E+00 + 2 12 9.28576017E-02 7.43521948E-02-2.15087195E-03-1.27044548E-03-1.05763308E-02 + 2 13 6.93086780E-03 0.00000000E+00-9.17063092E-03 5.96693805E-03 0.00000000E+00 + 3 1 0.00000000E+00 1.04833719E-11-2.32548941E-01 0.00000000E+00 0.00000000E+00 + 3 2-3.71589080E-11-3.46131946E-01 0.00000000E+00 0.00000000E+00-1.63311472E-10 + 3 3-1.57332778E-01 5.52846589E-11 0.00000000E+00-1.17944078E-11-9.95647560E-03 + 3 4 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 + 3 5 3.19857416E-03 0.00000000E+00 0.00000000E+00 2.28034473E-11 2.37181262E-11 + 3 6 2.29901718E-11 2.72447544E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00 + 3 7 0.00000000E+00 2.81349983E-11-9.31375504E-03 0.00000000E+00 0.00000000E+00 + 3 8-8.89615512E-03 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 + 3 9-2.05794433E-03 0.00000000E+00 1.91994515E-03 0.00000000E+00 0.00000000E+00 + 3 10 1.47926867E-01 2.53140021E-01 6.01275181E-02-1.20140708E-03 7.04972985E-03 + 3 11 1.06993949E-02 0.00000000E+00 3.25999646E-02 3.25669358E-02 0.00000000E+00 + 3 12-1.47926867E-01-2.53140021E-01-6.01275181E-02 1.20140708E-03 7.04972985E-03 + 3 13-1.06993949E-02 0.00000000E+00 3.25999646E-02-3.25669358E-02 0.00000000E+00 + 4 1 3.61257564E-02 6.94311723E-02 0.00000000E+00-2.57253170E-01 4.11661012E-11 + 4 2-1.96452175E-01 0.00000000E+00-3.78813317E-01-1.56214007E-10-4.72394645E-01 + 4 3-1.80419853E-11-2.65522630E-01 0.00000000E+00-9.57873859E-02 0.00000000E+00 + 4 4-4.13223061E-02 0.00000000E+00 4.98384730E-03 5.62213054E-03 3.02940623E-03 + 4 5 0.00000000E+00 0.00000000E+00 0.00000000E+00 1.43742454E-02 3.04239886E-02 + 4 6 5.38217348E-03 0.00000000E+00 0.00000000E+00 0.00000000E+00-1.09904959E-03 + 4 7 4.68938903E-02 2.72362753E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00 + 4 8 0.00000000E+00-7.50401271E-03 8.48850246E-11-4.47475935E-03 3.79535767E-11 + 4 9 0.00000000E+00 3.79567890E-11 0.00000000E+00 1.12472245E-03 0.00000000E+00 + 4 10 8.54843105E-02 1.91474296E-01 6.16842978E-02 1.22559108E-03 8.66660427E-03 + 4 11-3.67393717E-03 0.00000000E+00 3.99530899E-02 1.28423561E-02 0.00000000E+00 + 4 12 8.54843105E-02 1.91474296E-01 6.16842978E-02 1.22559108E-03-8.66660427E-03 + 4 13-3.67393717E-03 0.00000000E+00-3.99530899E-02 1.28423561E-02 0.00000000E+00 + 5 1 0.00000000E+00 0.00000000E+00 0.00000000E+00-4.33548747E-11-2.89459990E-01 + 5 2 0.00000000E+00 0.00000000E+00 1.65027908E-10-4.32514614E-01 0.00000000E+00 + 5 3 0.00000000E+00 0.00000000E+00-4.10963005E-01 0.00000000E+00 0.00000000E+00 + 5 4 0.00000000E+00-7.70511947E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00 + 5 5 0.00000000E+00 0.00000000E+00 1.06620809E-03 0.00000000E+00 0.00000000E+00 + 5 6 0.00000000E+00 0.00000000E+00 0.00000000E+00 1.32090683E-02 0.00000000E+00 + 5 7 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 2.36651887E-02 + 5 8 0.00000000E+00-8.99507519E-11-1.42346526E-03-4.19178715E-11-9.14290060E-03 + 5 9 0.00000000E+00-5.72239141E-03 0.00000000E+00-3.98300051E-11 0.00000000E+00 + 5 10 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 + 5 11 0.00000000E+00-1.21009320E-02 0.00000000E+00 0.00000000E+00-2.09304013E-02 + 5 12 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 + 5 13 0.00000000E+00-1.21009320E-02 0.00000000E+00 0.00000000E+00-2.09304013E-02 + 6 1-1.46865376E-02-3.75569003E-02 0.00000000E+00-3.16686716E-02 0.00000000E+00 + 6 2 4.44855243E-02 0.00000000E+00-4.59438395E-02-1.30054203E-11 6.21162941E-02 + 6 3 1.21851023E-11-9.72588611E-04 0.00000000E+00 1.25340110E+00 0.00000000E+00 + 6 4-1.20260374E-01 0.00000000E+00-7.56202151E-03-7.30848053E-03-7.27232001E-03 + 6 5 0.00000000E+00 0.00000000E+00 0.00000000E+00-2.81066253E-02-2.65342728E-02 + 6 6-3.04405502E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00-1.37667172E-01 + 6 7-1.25530011E-01-1.15408923E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 + 6 8 0.00000000E+00-1.23041808E-03 0.00000000E+00-2.61719053E-03 0.00000000E+00 + 6 9 0.00000000E+00 0.00000000E+00 0.00000000E+00 2.97763701E-04 0.00000000E+00 + 6 10-3.50532087E-03 3.48018364E-02-8.84623242E-02-8.70792938E-01 8.97965540E-04 + 6 11-8.15988073E-04 0.00000000E+00 3.71997973E-02 2.79849506E-02 0.00000000E+00 + 6 12-3.50532087E-03 3.48018364E-02-8.84623242E-02-8.70792938E-01-8.97965540E-04 + 6 13-8.15988073E-04 0.00000000E+00-3.71997973E-02 2.79849506E-02 0.00000000E+00 + 7 1 0.00000000E+00 0.00000000E+00 3.77887943E-02 0.00000000E+00 0.00000000E+00 + 7 2 0.00000000E+00 5.74724021E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00 + 7 3-3.17875256E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 5.03087988E-01 + 7 4 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 + 7 5-2.08548109E-04 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 + 7 6 0.00000000E+00-2.18307401E-03 0.00000000E+00 0.00000000E+00 0.00000000E+00 + 7 7 0.00000000E+00 0.00000000E+00 9.17939480E-02 0.00000000E+00 0.00000000E+00 + 7 8 1.96912351E-03 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 + 7 9 4.81567854E-04 0.00000000E+00 7.58815869E-04 0.00000000E+00 0.00000000E+00 + 7 10-6.07028157E-03-2.46356341E-01-1.20285244E-01 2.61058315E+00 2.26903333E-03 + 7 11-2.10414018E-04 0.00000000E+00-9.92827376E-02-7.62985966E-02 0.00000000E+00 + 7 12 6.07028157E-03 2.46356341E-01 1.20285244E-01-2.61058315E+00 2.26903333E-03 + 7 13 2.10414018E-04 0.00000000E+00-9.92827376E-02 7.62985966E-02 0.00000000E+00 + 8 1-7.70924660E-03-3.69209042E-03 0.00000000E+00 9.54194440E-02 0.00000000E+00 + 8 2 7.76448485E-02 0.00000000E+00 1.20638775E-01 3.12313126E-11-1.43645329E+00 + 8 3 0.00000000E+00 1.20951768E+00 0.00000000E+00 1.56460547E+00 0.00000000E+00 + 8 4-1.82175331E+00 0.00000000E+00 6.07611101E-03 5.87348653E-03 5.46368590E-03 + 8 5 0.00000000E+00 0.00000000E+00 0.00000000E+00 1.71814038E-02 1.66527571E-02 + 8 6 3.37546544E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00-1.03758992E-01 + 8 7-2.04529370E-02 1.75222207E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 + 8 8 0.00000000E+00-4.61363217E-03-1.69812041E-11 5.34713810E-03 0.00000000E+00 + 8 9 0.00000000E+00 0.00000000E+00 0.00000000E+00-6.71736506E-03 0.00000000E+00 + 8 10-2.45359701E-02 7.75832310E-01-8.00231316E-01-1.74411472E-01-4.77903847E-03 + 8 11-6.88443861E-03 0.00000000E+00 2.80352172E-01 1.56514823E-01 0.00000000E+00 + 8 12-2.45359701E-02 7.75832310E-01-8.00231316E-01-1.74411472E-01 4.77903847E-03 + 8 13-6.88443861E-03 0.00000000E+00-2.80352172E-01 1.56514823E-01 0.00000000E+00 + 9 1-3.75963084E-02-4.33958912E-02 0.00000000E+00-6.13645471E-02 0.00000000E+00 + 9 2 3.32224837E-01 0.00000000E+00-1.09100155E-01-2.35971067E-11 9.45168416E-01 + 9 3 1.75360305E-11-4.68618035E-01 0.00000000E+00 2.05618920E+00 0.00000000E+00 + 9 4-1.18342772E+00 1.16065124E-11 1.26021459E-02 1.32424734E-02 1.23747190E-02 + 9 5 0.00000000E+00 0.00000000E+00 0.00000000E+00 4.39462937E-02 5.60972032E-02 + 9 6 6.43559510E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00 3.84874156E-01 + 9 7 3.71765642E-01 2.63781670E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 + 9 8 0.00000000E+00 7.19571305E-04 1.13370143E-11 5.69909451E-03 0.00000000E+00 + 9 9 0.00000000E+00 0.00000000E+00 0.00000000E+00 6.42744121E-05 0.00000000E+00 + 9 10-3.91542767E-02-2.85951310E-01-2.92521098E+00 8.19216496E-01 2.32474360E-02 + 9 11 1.29645369E-02 0.00000000E+00-1.27150645E-01-7.92173703E-02 0.00000000E+00 + 9 12-3.91542767E-02-2.85951310E-01-2.92521098E+00 8.19216496E-01-2.32474360E-02 + 9 13 1.29645369E-02 0.00000000E+00 1.27150645E-01-7.92173703E-02 0.00000000E+00 +10 1 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 1.09829793E-01 +10 2 0.00000000E+00 0.00000000E+00-3.55814161E-11 1.18969550E-01 0.00000000E+00 +10 3 0.00000000E+00 0.00000000E+00 5.92334573E-01 0.00000000E+00 0.00000000E+00 +10 4 0.00000000E+00-1.27913160E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +10 5 0.00000000E+00 0.00000000E+00 1.40768682E-04 0.00000000E+00 0.00000000E+00 +10 6 0.00000000E+00 0.00000000E+00 0.00000000E+00-6.76744593E-03 0.00000000E+00 +10 7 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 3.96268896E-03 +10 8 0.00000000E+00 1.91913820E-11-1.67375371E-02 0.00000000E+00-3.32566619E-03 +10 9 0.00000000E+00-5.20654922E-03 0.00000000E+00 0.00000000E+00 0.00000000E+00 +10 10 0.00000000E+00 0.00000000E+00-1.27502413E-11 0.00000000E+00 0.00000000E+00 +10 11 0.00000000E+00-2.33727711E-03 0.00000000E+00 0.00000000E+00-9.18113316E-03 +10 12 0.00000000E+00 0.00000000E+00-1.29278111E-11 0.00000000E+00 0.00000000E+00 +10 13 0.00000000E+00-2.33727711E-03 0.00000000E+00 0.00000000E+00-9.18113316E-03 +11 1 0.00000000E+00 0.00000000E+00-5.72061417E-02 0.00000000E+00 0.00000000E+00 +11 2 0.00000000E+00-9.81796723E-02 0.00000000E+00 0.00000000E+00 1.91020184E-11 +11 3-3.65129039E-03 0.00000000E+00 0.00000000E+00 0.00000000E+00-2.82252212E+00 +11 4 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +11 5 3.51241586E-04 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +11 6 0.00000000E+00-2.28468770E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00 +11 7 0.00000000E+00 0.00000000E+00-1.79785554E-02 0.00000000E+00 0.00000000E+00 +11 8 1.70661742E-03 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +11 9 4.80544914E-03 0.00000000E+00-2.29647907E-03 0.00000000E+00 0.00000000E+00 +11 10-5.89467400E-02 1.99852021E-01-3.88560109E+00 3.07425791E-01 1.15218149E-02 +11 11 1.28883502E-02 0.00000000E+00-2.98285255E-02 1.14126001E-02 0.00000000E+00 +11 12 5.89467400E-02-1.99852021E-01 3.88560109E+00-3.07425791E-01 1.15218149E-02 +11 13-1.28883502E-02 0.00000000E+00-2.98285255E-02-1.14126001E-02 0.00000000E+00 +12 1 2.27001556E-02-5.38640263E-04 0.00000000E+00-1.55549511E-02 0.00000000E+00 +12 2-2.78341618E-01 0.00000000E+00-1.58380947E-02 0.00000000E+00 1.90439516E-01 +12 3 0.00000000E+00-2.35329771E-01 0.00000000E+00 1.00861065E+01 0.00000000E+00 +12 4-2.57942709E+00 0.00000000E+00-2.37283994E-02-2.29812845E-02-2.37890751E-02 +12 5 0.00000000E+00 0.00000000E+00 0.00000000E+00-1.10470194E-01-9.80932712E-02 +12 6-7.94240444E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00-4.11801266E-01 +12 7-4.12997434E-01-5.21812657E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 +12 8 0.00000000E+00-3.62756010E-04 0.00000000E+00-3.75963175E-04 0.00000000E+00 +12 9 0.00000000E+00 0.00000000E+00 0.00000000E+00 3.84050344E-05 0.00000000E+00 +12 10-3.35411830E-02-3.77193862E-04-4.65326156E+00-4.45657708E-01 3.94341213E-03 +12 11-3.32397730E-03 0.00000000E+00-9.16680001E-02-4.99505660E-02 0.00000000E+00 +12 12-3.35411830E-02-3.77193845E-04-4.65326156E+00-4.45657708E-01-3.94341213E-03 +12 13-3.32397730E-03 0.00000000E+00 9.16680001E-02-4.99505660E-02 0.00000000E+00 +13 1 0.00000000E+00 0.00000000E+00 1.15340197E-01 0.00000000E+00 0.00000000E+00 +13 2 0.00000000E+00 1.66842052E-01 0.00000000E+00 0.00000000E+00-2.76568658E-11 +13 3 1.89166559E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00-1.95575643E+00 +13 4 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +13 5-5.38752416E-04 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +13 6 0.00000000E+00-9.18768729E-03 0.00000000E+00 0.00000000E+00 0.00000000E+00 +13 7 0.00000000E+00 0.00000000E+00-4.06332917E-01 0.00000000E+00 0.00000000E+00 +13 8-8.13822152E-04 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +13 9-1.21767285E-03 0.00000000E+00-9.16778464E-03 0.00000000E+00 0.00000000E+00 +13 10-1.38488532E-02 1.07904021E+00 3.47646023E-01-2.20386685E+00-1.82811499E-02 +13 11-1.11244638E-02 0.00000000E+00 3.15164803E-01 2.67321225E-01 0.00000000E+00 +13 12 1.38488532E-02-1.07904021E+00-3.47646023E-01 2.20386685E+00-1.82811499E-02 +13 13 1.11244638E-02 0.00000000E+00 3.15164803E-01-2.67321225E-01 0.00000000E+00 +14 1 0.00000000E+00 0.00000000E+00 1.51416741E-01 0.00000000E+00 0.00000000E+00 +14 2 0.00000000E+00 1.96413712E-01 0.00000000E+00 0.00000000E+00-3.55235904E-11 +14 3 9.51142219E-02 1.18883568E-11 0.00000000E+00 0.00000000E+00-1.52892669E+00 +14 4 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +14 5 7.76912129E-03 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +14 6 0.00000000E+00 1.65325924E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00 +14 7 0.00000000E+00 0.00000000E+00 2.49123864E-01 0.00000000E+00 0.00000000E+00 +14 8 1.23929388E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +14 9 3.77855159E-03 0.00000000E+00-4.00713116E-03 0.00000000E+00 0.00000000E+00 +14 10 1.10228592E-01 8.19265790E-01-3.25534080E+00 6.41724825E-01 2.34413098E-02 +14 11 1.40518129E-02 0.00000000E+00-3.03184905E-01-3.37350875E-01 0.00000000E+00 +14 12-1.10228592E-01-8.19265790E-01 3.25534080E+00-6.41724825E-01 2.34413098E-02 +14 13-1.40518129E-02 0.00000000E+00-3.03184905E-01 3.37350875E-01 0.00000000E+00 +15 1 3.30437727E-02 7.87327688E-02 0.00000000E+00 9.79469336E-02 0.00000000E+00 +15 2-8.05218098E-02 0.00000000E+00 1.22493651E-01 1.27628271E-11 1.34105802E+00 +15 3 0.00000000E+00-8.84797877E-01 0.00000000E+00 3.83630123E+00 0.00000000E+00 +15 4-1.36032595E+00 0.00000000E+00 1.93761431E-02 9.47495266E-03 8.29457413E-03 +15 5 0.00000000E+00 0.00000000E+00 0.00000000E+00 7.09002280E-02 3.66479653E-02 +15 6 4.29234692E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00 6.29389932E-01 +15 7 3.93482951E-01 2.99836049E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00 +15 8 0.00000000E+00 2.99124338E-03 0.00000000E+00 5.87355516E-03 0.00000000E+00 +15 9 0.00000000E+00 0.00000000E+00 0.00000000E+00 1.64530693E-03 0.00000000E+00 +15 10 1.18960940E-01-7.98254862E-02-3.45638942E+00 3.66577574E-01 2.77902319E-02 +15 11 8.89614261E-03 0.00000000E+00-7.65828869E-01-1.54135547E-01 0.00000000E+00 +15 12 1.18960940E-01-7.98254862E-02-3.45638942E+00 3.66577574E-01-2.77902319E-02 +15 13 8.89614261E-03 0.00000000E+00 7.65828869E-01-1.54135547E-01 0.00000000E+00 +16 1 1.50215201E-02 3.94446530E-02 0.00000000E+00 1.01379658E-01 0.00000000E+00 +16 2-5.64730421E-03 0.00000000E+00 1.68241890E-01 2.19835550E-11 5.24648879E-01 +16 3 0.00000000E+00 1.62457984E-01 0.00000000E+00 1.16382102E-02 0.00000000E+00 +16 4 7.13078998E-02 0.00000000E+00 4.32662589E-03 1.71180076E-02 1.87519959E-03 +16 5 0.00000000E+00 0.00000000E+00 0.00000000E+00 2.19599589E-02 3.67300140E-02 +16 6 3.68074955E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00 3.69373353E-01 +16 7 4.13046588E-01-1.02738277E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 +16 8 0.00000000E+00 2.15290654E-03-1.19219785E-11 9.58299419E-03 0.00000000E+00 +16 9 0.00000000E+00 0.00000000E+00 0.00000000E+00 6.93881871E-04 0.00000000E+00 +16 10 2.74068281E-02 9.39944111E-02-7.31418538E-01 2.20355902E-01-9.45158979E-03 +16 11 4.06763493E-02 0.00000000E+00 1.13810300E-01-7.16241957E-01 0.00000000E+00 +16 12 2.74068281E-02 9.39944111E-02-7.31418538E-01 2.20355902E-01 9.45158979E-03 +16 13 4.06763493E-02 0.00000000E+00-1.13810300E-01-7.16241957E-01 0.00000000E+00 +17 1 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +17 2 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +17 3 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +17 4 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +17 5 0.00000000E+00-1.18737302E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00 +17 6 0.00000000E+00 0.00000000E+00-3.91923261E-03 0.00000000E+00 0.00000000E+00 +17 7 0.00000000E+00 0.00000000E+00 0.00000000E+00-3.74637701E-01 0.00000000E+00 +17 8 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +17 9 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 1.12117629E-03 +17 10 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +17 11 0.00000000E+00-3.47853405E-02 0.00000000E+00 0.00000000E+00 5.60154195E-01 +17 12 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +17 13 0.00000000E+00 3.47853405E-02 0.00000000E+00 0.00000000E+00-5.60154195E-01 +18 1 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 5.78294824E-02 +18 2 0.00000000E+00 0.00000000E+00 0.00000000E+00 1.18210740E-01 0.00000000E+00 +18 3 0.00000000E+00 0.00000000E+00 3.71080134E-01 0.00000000E+00 0.00000000E+00 +18 4 0.00000000E+00 1.54003291E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 +18 5 0.00000000E+00 0.00000000E+00 1.34337301E-02 0.00000000E+00 0.00000000E+00 +18 6 0.00000000E+00 0.00000000E+00 0.00000000E+00-6.84805667E-03 0.00000000E+00 +18 7 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 5.54651312E-01 +18 8 0.00000000E+00 0.00000000E+00 3.63522140E-03 0.00000000E+00 6.53377112E-03 +18 9 0.00000000E+00-4.37356125E-03 0.00000000E+00 0.00000000E+00 0.00000000E+00 +18 10 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +18 11 0.00000000E+00 3.55329272E-02 0.00000000E+00 0.00000000E+00-5.19873020E-01 +18 12 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +18 13 0.00000000E+00 3.55329272E-02 0.00000000E+00 0.00000000E+00-5.19873020E-01 +19 1-3.01532843E-02-1.71673022E-01 0.00000000E+00-4.87268056E-02 0.00000000E+00 +19 2-3.16230740E-01 0.00000000E+00-1.00909805E-01 0.00000000E+00-9.30932189E-01 +19 3 1.44938665E-11 1.97397057E+00 0.00000000E+00 5.32001121E+00 0.00000000E+00 +19 4-1.36611819E+00 0.00000000E+00-6.29879608E-02-6.50115571E-02-7.97632600E-02 +19 5 0.00000000E+00 0.00000000E+00 0.00000000E+00-2.72556747E-01-2.84392243E-01 +19 6-2.97812877E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00-1.55984730E+00 +19 7-1.53291659E+00-1.93841122E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +19 8 0.00000000E+00-2.49687583E-02 0.00000000E+00-2.28567042E-02 0.00000000E+00 +19 9 0.00000000E+00 0.00000000E+00 0.00000000E+00-5.15908629E-03 0.00000000E+00 +19 10-5.64662698E-03 1.96036826E+00-1.63187005E+00-4.11115569E-01-2.13996433E-02 +19 11-1.51563583E-02 0.00000000E+00 5.71017263E-01 3.41887197E-01 0.00000000E+00 +19 12-5.64662698E-03 1.96036826E+00-1.63187005E+00-4.11115569E-01 2.13996433E-02 +19 13-1.51563583E-02 0.00000000E+00-5.71017263E-01 3.41887197E-01 0.00000000E+00 +20 1 0.00000000E+00 0.00000000E+00 1.74590246E-01 0.00000000E+00 0.00000000E+00 +20 2-1.15416120E-11 3.18989740E-01 0.00000000E+00 0.00000000E+00-4.51735992E-11 +20 3-6.33119076E+00 1.55698436E-11 0.00000000E+00 0.00000000E+00 1.67203539E+00 +20 4 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +20 5-5.52010848E-03 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +20 6 0.00000000E+00-2.57760006E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00 +20 7 0.00000000E+00 0.00000000E+00 1.65990754E+00 0.00000000E+00 0.00000000E+00 +20 8 1.56599053E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +20 9 1.28678254E-03 0.00000000E+00 2.15432998E-02 0.00000000E+00 0.00000000E+00 +20 10 2.57853058E-03-4.88357653E+00-1.10564710E-01 1.14345263E+00 3.57867266E-02 +20 11-3.91734531E-03 0.00000000E+00-1.75481484E+00-9.09536198E-01 0.00000000E+00 +20 12-2.57853058E-03 4.88357653E+00 1.10564710E-01-1.14345263E+00 3.57867266E-02 +20 13 3.91734531E-03 0.00000000E+00-1.75481484E+00 9.09536198E-01 0.00000000E+00 +21 1 2.88792512E-02 1.83157980E-01 0.00000000E+00-1.63777470E-01 0.00000000E+00 +21 2 3.05898301E-01 0.00000000E+00-3.33861434E-01 0.00000000E+00-7.97846314E+00 +21 3 0.00000000E+00 3.60729415E+00 0.00000000E+00-1.66216936E+00 0.00000000E+00 +21 4-5.46370348E-01 0.00000000E+00 8.17913348E-02 8.06070174E-02 6.97982046E-02 +21 5 0.00000000E+00 0.00000000E+00 0.00000000E+00 2.89411656E-01 3.22306796E-01 +21 6 3.26094886E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 8.72480435E-01 +21 7 1.22906938E+00 1.61980011E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +21 8 0.00000000E+00-1.74399426E-02 0.00000000E+00 1.30755790E-02 0.00000000E+00 +21 9 0.00000000E+00 0.00000000E+00 0.00000000E+00-1.18585114E-02 0.00000000E+00 +21 10 7.48799278E-03 3.04599369E+00 4.36484800E-01 1.11863052E-01-3.30746178E-03 +21 11-9.90463925E-03 0.00000000E+00 1.29895123E+00 8.20025969E-01 0.00000000E+00 +21 12 7.48799278E-03 3.04599369E+00 4.36484800E-01 1.11863052E-01 3.30746178E-03 +21 13-9.90463925E-03 0.00000000E+00-1.29895123E+00 8.20025969E-01 0.00000000E+00 +22 1 0.00000000E+00 0.00000000E+00-3.36544859E-02 0.00000000E+00 0.00000000E+00 +22 2 0.00000000E+00-6.73983351E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00 +22 3 4.58329412E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00-5.69379383E-01 +22 4 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +22 5 4.51272174E-03 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +22 6 0.00000000E+00 4.13369124E-03 0.00000000E+00 0.00000000E+00 0.00000000E+00 +22 7 0.00000000E+00 0.00000000E+00-7.39712328E-01 0.00000000E+00 0.00000000E+00 +22 8 1.29864896E-03 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +22 9-7.96237624E-03 0.00000000E+00-1.46606600E-02 0.00000000E+00 0.00000000E+00 +22 10 3.51284597E-03 3.23786496E+00-4.42190963E-02-3.35937606E-01 3.13725894E-02 +22 11-5.70707999E-02 0.00000000E+00 1.34924348E-01 1.58391431E+00 0.00000000E+00 +22 12-3.51284597E-03-3.23786496E+00 4.42190963E-02 3.35937606E-01 3.13725894E-02 +22 13 5.70707999E-02 0.00000000E+00 1.34924348E-01-1.58391431E+00 0.00000000E+00 +23 1 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 2.46326817E-01 +23 2 0.00000000E+00 0.00000000E+00 0.00000000E+00 6.09510992E-01 0.00000000E+00 +23 3 0.00000000E+00 0.00000000E+00-7.85659593E-01 0.00000000E+00 0.00000000E+00 +23 4 0.00000000E+00 6.72224233E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 +23 5 0.00000000E+00 0.00000000E+00-8.66936153E-03 0.00000000E+00 0.00000000E+00 +23 6 0.00000000E+00 0.00000000E+00 0.00000000E+00 4.18728165E-03 0.00000000E+00 +23 7 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00-6.85702941E-01 +23 8 0.00000000E+00 0.00000000E+00 7.30146308E-02 0.00000000E+00 3.85005520E-02 +23 9 0.00000000E+00 4.08827938E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00 +23 10 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +23 11 0.00000000E+00 3.63125358E-02 0.00000000E+00 0.00000000E+00-5.54189663E-01 +23 12 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +23 13 0.00000000E+00 3.63125358E-02 0.00000000E+00 0.00000000E+00-5.54189663E-01 +24 1-6.52208746E-03-5.30727075E-02 0.00000000E+00-8.37045283E-02 0.00000000E+00 +24 2-6.49375063E-02 0.00000000E+00-2.38027693E-01-1.07908738E-11-5.87102912E+00 +24 3 1.09957191E-11 4.75340809E+00 0.00000000E+00 1.14975551E+00 0.00000000E+00 +24 4-5.89749349E-01 0.00000000E+00-3.30991942E-02-2.50783016E-02-1.46959392E-02 +24 5 0.00000000E+00 0.00000000E+00 0.00000000E+00-8.24796202E-02-8.38744269E-02 +24 6-1.17584440E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00-2.72348559E+00 +24 7-1.29450025E+00 8.33570013E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 +24 8 0.00000000E+00-3.21303487E-02 0.00000000E+00 3.54928418E-02 0.00000000E+00 +24 9 0.00000000E+00 0.00000000E+00 0.00000000E+00-3.04617513E-02 0.00000000E+00 +24 10-1.94172435E-02 5.54749892E+00-6.41529041E-01-4.86326716E-02 2.16483695E-02 +24 11 1.79999547E-02 0.00000000E+00 9.24567713E-01 5.57608580E-01 0.00000000E+00 +24 12-1.94172435E-02 5.54749892E+00-6.41529041E-01-4.86326716E-02-2.16483695E-02 +24 13 1.79999547E-02 0.00000000E+00-9.24567713E-01 5.57608580E-01 0.00000000E+00 +25 1 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +25 2 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +25 3 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +25 4 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +25 5 0.00000000E+00-1.44434107E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00 +25 6 0.00000000E+00 0.00000000E+00 3.29595093E-02 0.00000000E+00 0.00000000E+00 +25 7 0.00000000E+00 0.00000000E+00 0.00000000E+00-1.64775065E+00 0.00000000E+00 +25 8 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +25 9 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 1.45833636E-02 +25 10 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +25 11 0.00000000E+00 5.23593215E-02 0.00000000E+00 0.00000000E+00-1.26604921E+00 +25 12 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +25 13 0.00000000E+00-5.23593215E-02 0.00000000E+00 0.00000000E+00 1.26604921E+00 +26 1 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 1.33756532E-01 +26 2 0.00000000E+00 0.00000000E+00-1.70245851E-11 3.61816762E-01 0.00000000E+00 +26 3 0.00000000E+00 0.00000000E+00-2.25580988E+00 0.00000000E+00 0.00000000E+00 +26 4 0.00000000E+00 2.71290733E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 +26 5 0.00000000E+00 0.00000000E+00 9.50006724E-03 0.00000000E+00 0.00000000E+00 +26 6 0.00000000E+00 0.00000000E+00 0.00000000E+00-3.05237808E-02 0.00000000E+00 +26 7 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 1.20928002E+00 +26 8 0.00000000E+00 0.00000000E+00 7.77473397E-02 0.00000000E+00 2.53666646E-02 +26 9 0.00000000E+00 2.29309915E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00 +26 10 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +26 11 0.00000000E+00-4.91655755E-02 0.00000000E+00 0.00000000E+00 1.30520497E+00 +26 12 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +26 13 0.00000000E+00-4.91655755E-02 0.00000000E+00 0.00000000E+00 1.30520497E+00 +27 1 0.00000000E+00 0.00000000E+00 6.00762882E-02 0.00000000E+00 0.00000000E+00 +27 2 0.00000000E+00 2.03521714E-01 0.00000000E+00 0.00000000E+00-1.93666231E-11 +27 3-7.18280727E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 8.02156154E-01 +27 4 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +27 5 1.30181841E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +27 6 0.00000000E+00-1.19878116E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00 +27 7 0.00000000E+00 0.00000000E+00 3.62964479E+00 0.00000000E+00 0.00000000E+00 +27 8-1.09633475E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +27 9-4.50255527E-02 0.00000000E+00 3.55681505E-02 0.00000000E+00 0.00000000E+00 +27 10 5.51170262E-02-7.01316305E+00 1.23240614E+00-3.94813766E-02-5.04938325E-02 +27 11-2.49599730E-02 0.00000000E+00-7.53865161E-01-7.85147289E-01 0.00000000E+00 +27 12-5.51170262E-02 7.01316305E+00-1.23240614E+00 3.94813766E-02-5.04938325E-02 +27 13 2.49599730E-02 0.00000000E+00-7.53865161E-01 7.85147289E-01 0.00000000E+00 +28 1 1.89542899E-03-6.61647462E-04 0.00000000E+00-1.77703017E-02 0.00000000E+00 +28 2-3.52648409E-02 0.00000000E+00-6.00341102E-02 1.28004926E-11-3.24817709E+00 +28 3 0.00000000E+00 3.82892939E+00 0.00000000E+00-6.67692917E-01 0.00000000E+00 +28 4 1.63131130E-01 0.00000000E+00 1.05473723E-02-1.87666882E-02 1.23866796E-03 +28 5 0.00000000E+00 0.00000000E+00 0.00000000E+00-3.31738713E-02 1.69877180E-02 +28 6-1.60206826E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00 1.33399771E+00 +28 7-2.70206536E+00 5.00379837E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 +28 8 0.00000000E+00-1.03167209E-02 0.00000000E+00-1.43240445E-02 0.00000000E+00 +28 9 0.00000000E+00 0.00000000E+00 0.00000000E+00-1.61071571E-02 0.00000000E+00 +28 10 5.76560925E-03 2.42378857E+00 4.30519519E-01-1.80429461E-02-4.46167685E-02 +28 11 5.25857600E-02 0.00000000E+00 1.75855679E+00-1.16680390E+00 0.00000000E+00 +28 12 5.76560925E-03 2.42378857E+00 4.30519519E-01-1.80429461E-02 4.46167685E-02 +28 13 5.25857600E-02 0.00000000E+00-1.75855679E+00-1.16680390E+00 0.00000000E+00 +29 1-2.69743584E-02-5.12740738E-02 0.00000000E+00-2.36651785E-01 0.00000000E+00 +29 2 2.75748141E-01 0.00000000E+00-6.72732840E-01 1.93361741E-11 1.36182992E+01 +29 3-1.39248475E-11-5.86777680E+00 0.00000000E+00 1.35559940E+00 0.00000000E+00 +29 4-3.00819688E-01 0.00000000E+00-8.97973316E-05 1.08260505E-03-4.89788274E-03 +29 5 0.00000000E+00 0.00000000E+00 0.00000000E+00-4.80331468E-02 1.52171249E-02 +29 6 5.60678227E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00 2.19661740E+00 +29 7 8.55602459E-01-1.39401282E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +29 8 0.00000000E+00-1.07478469E-01-1.04928014E-11-2.09093785E-02 0.00000000E+00 +29 9 0.00000000E+00 0.00000000E+00 0.00000000E+00-5.33173948E-02 0.00000000E+00 +29 10-1.81453579E-01-7.88329354E+00-1.68337608E+00 2.24105151E-01 9.23900224E-02 +29 11 5.45813335E-02 0.00000000E+00-3.00496874E+00-2.06915138E+00 0.00000000E+00 +29 12-1.81453579E-01-7.88329354E+00-1.68337608E+00 2.24105151E-01-9.23900224E-02 +29 13 5.45813335E-02 0.00000000E+00 3.00496874E+00-2.06915138E+00 0.00000000E+00 +30 1 0.00000000E+00 0.00000000E+00 2.74439070E-01 0.00000000E+00 0.00000000E+00 +30 2 0.00000000E+00 7.73362284E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 +30 3 8.80705302E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00-4.40631686E-02 +30 4 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +30 5-7.74971028E-03 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +30 6 0.00000000E+00 8.40434463E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00 +30 7 0.00000000E+00 0.00000000E+00-3.66831512E+00 0.00000000E+00 0.00000000E+00 +30 8 1.04925328E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +30 9 3.92212473E-02 0.00000000E+00 6.14948908E-02 0.00000000E+00 0.00000000E+00 +30 10 1.95719904E-01 8.72182806E+00 1.34475590E+00-5.54213957E-01-7.14251674E-02 +30 11-6.78189246E-02 0.00000000E+00 2.84676482E+00 2.24670572E+00 0.00000000E+00 +30 12-1.95719904E-01-8.72182806E+00-1.34475590E+00 5.54213957E-01-7.14251674E-02 +30 13 6.78189246E-02 0.00000000E+00 2.84676482E+00-2.24670572E+00 0.00000000E+00 +31 1 1.22176528E-01-7.82023067E-02 0.00000000E+00-9.79073310E-02 0.00000000E+00 +31 2-3.04574160E+00 0.00000000E+00-2.23424391E-01 0.00000000E+00 1.92640601E+01 +31 3 0.00000000E+00-4.93204905E+00 0.00000000E+00 4.60691015E-01 0.00000000E+00 +31 4 4.09806143E-01 0.00000000E+00-1.89672324E-01-1.78089938E-01-1.68185224E-01 +31 5 0.00000000E+00 0.00000000E+00 0.00000000E+00-6.90203349E-01-7.55890995E-01 +31 6-9.39166910E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00-1.65244269E+00 +31 7-2.18370042E+00-3.84275184E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +31 8 0.00000000E+00-1.11690829E-01 0.00000000E+00-1.89427137E-01 0.00000000E+00 +31 9 0.00000000E+00 0.00000000E+00 0.00000000E+00-2.99840653E-02 0.00000000E+00 +31 10 5.86640781E-01-7.13760276E+00 5.49309477E-01-2.02816454E-01-1.05117574E-01 +31 11-8.15176018E-02 0.00000000E+00-2.14812791E+00-1.27325064E+00 0.00000000E+00 +31 12 5.86640781E-01-7.13760276E+00 5.49309477E-01-2.02816454E-01 1.05117574E-01 +31 13-8.15176018E-02 0.00000000E+00 2.14812791E+00-1.27325064E+00 0.00000000E+00 +32 1 0.00000000E+00 0.00000000E+00 4.02041495E-02 0.00000000E+00 0.00000000E+00 +32 2 0.00000000E+00 2.75005961E-01 0.00000000E+00 0.00000000E+00 1.68452450E-11 +32 3 6.34511527E+00-1.05797290E-11 0.00000000E+00 0.00000000E+00-1.12285903E+00 +32 4 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +32 5 1.43780544E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +32 6 0.00000000E+00-4.89069055E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 +32 7 0.00000000E+00 0.00000000E+00-1.68912530E+00 0.00000000E+00 0.00000000E+00 +32 8 1.73745265E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +32 9 1.63076425E-01 0.00000000E+00 3.32284175E-03 0.00000000E+00 0.00000000E+00 +32 10-1.03853460E+00 7.43574299E+00-1.11536263E+00-1.30782642E-01-1.99247355E-02 +32 11 7.15174756E-02 0.00000000E+00 2.03920058E+00 1.55080743E+00 0.00000000E+00 +32 12 1.03853460E+00-7.43574299E+00 1.11536263E+00 1.30782642E-01-1.99247355E-02 +32 13-7.15174756E-02 0.00000000E+00 2.03920058E+00-1.55080743E+00 0.00000000E+00 +33 1 8.90672050E-02-1.35749505E-01 0.00000000E+00 3.48902359E-03 0.00000000E+00 +33 2-2.11453958E+00 0.00000000E+00 1.24767702E-01 1.30759220E-11-2.09606650E+00 +33 3 0.00000000E+00 4.55660057E+00 0.00000000E+00 3.56790168E+00 0.00000000E+00 +33 4-9.75800059E-01 0.00000000E+00-1.66499188E-01-1.74917045E-01-1.80735582E-01 +33 5 0.00000000E+00 0.00000000E+00 0.00000000E+00-1.15409115E+00-7.78748982E-01 +33 6-3.84858842E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00-3.24753683E+00 +33 7-3.14594531E+00-1.79302030E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +33 8 0.00000000E+00 2.28237643E-02 0.00000000E+00 1.71604092E-01 0.00000000E+00 +33 9 0.00000000E+00 0.00000000E+00 0.00000000E+00-1.14050282E-03 0.00000000E+00 +33 10-9.30771369E-01 6.66796350E+00-1.51183877E+00-1.44835686E-01 6.98838669E-02 +33 11-4.44270118E-02 0.00000000E+00 1.77556023E+00 9.97578038E-01 0.00000000E+00 +33 12-9.30771369E-01 6.66796350E+00-1.51183877E+00-1.44835686E-01-6.98838669E-02 +33 13-4.44270118E-02 0.00000000E+00-1.77556023E+00 9.97578038E-01 0.00000000E+00 +34 1 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +34 2 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +34 3 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +34 4 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +34 5 0.00000000E+00 5.36026314E-03 0.00000000E+00 0.00000000E+00 0.00000000E+00 +34 6 0.00000000E+00 0.00000000E+00-8.20642559E-01 0.00000000E+00 0.00000000E+00 +34 7 0.00000000E+00 0.00000000E+00 0.00000000E+00 3.98556860E-01 0.00000000E+00 +34 8 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +34 9 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 9.62440825E-02 +34 10 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +34 11 0.00000000E+00 4.76557457E-01 0.00000000E+00 0.00000000E+00-2.48781226E-01 +34 12 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +34 13 0.00000000E+00-4.76557457E-01 0.00000000E+00 0.00000000E+00 2.48781226E-01 +35 1 2.29777528E-02-3.34876291E-02 0.00000000E+00-6.92102595E-02 0.00000000E+00 +35 2-3.60888482E-01 0.00000000E+00-5.18319112E-02-1.23315705E-11 1.12940012E+00 +35 3 0.00000000E+00-9.53307278E-02 0.00000000E+00 7.42730864E-02 0.00000000E+00 +35 4 1.03153832E-01 0.00000000E+00-4.49855709E-02-3.79729018E-02-5.02742415E-02 +35 5 0.00000000E+00 0.00000000E+00 0.00000000E+00 4.14167340E-01-9.54657709E-01 +35 6-1.03988667E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00-1.05850289E+00 +35 7 1.86954612E-01-4.71095278E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 +35 8 0.00000000E+00 1.49293019E-01 0.00000000E+00 6.65823073E-02 0.00000000E+00 +35 9 0.00000000E+00 0.00000000E+00 0.00000000E+00-3.35686821E-02 0.00000000E+00 +35 10-1.73800049E-01 4.07325967E-01-6.62159031E-02 1.03024460E-02-1.72520381E-01 +35 11 4.43977009E-01 0.00000000E+00-2.50227851E-02-9.90651501E-03 0.00000000E+00 +35 12-1.73800049E-01 4.07325967E-01-6.62159031E-02 1.03024460E-02 1.72520381E-01 +35 13 4.43977009E-01 0.00000000E+00 2.50227851E-02-9.90651501E-03 0.00000000E+00 +36 1 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00-7.77282228E-02 +36 2 0.00000000E+00 0.00000000E+00-2.78211262E-11-4.64450907E-02 0.00000000E+00 +36 3 0.00000000E+00 0.00000000E+00 4.82903506E-02 0.00000000E+00 0.00000000E+00 +36 4 0.00000000E+00 7.84584451E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00 +36 5 0.00000000E+00 0.00000000E+00 4.95794738E-03 0.00000000E+00 0.00000000E+00 +36 6 0.00000000E+00 0.00000000E+00 0.00000000E+00-8.85305890E-01 0.00000000E+00 +36 7 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 4.00627364E-01 +36 8 0.00000000E+00 1.51539214E-11-2.49387019E-02 0.00000000E+00 8.44943629E-02 +36 9 0.00000000E+00 7.33976133E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00 +36 10 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +36 11 0.00000000E+00 4.39284219E-01 0.00000000E+00 0.00000000E+00-2.50194459E-01 +36 12 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +36 13 0.00000000E+00 4.39284219E-01 0.00000000E+00 0.00000000E+00-2.50194459E-01 +37 1 0.00000000E+00 0.00000000E+00 3.99317741E-02 0.00000000E+00 0.00000000E+00 +37 2 0.00000000E+00-7.71782996E-03 0.00000000E+00 0.00000000E+00 0.00000000E+00 +37 3 2.59931669E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00-1.29865597E-01 +37 4 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +37 5 2.92461785E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +37 6 0.00000000E+00 5.04469868E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 +37 7 0.00000000E+00 0.00000000E+00-1.35146510E+00 0.00000000E+00 0.00000000E+00 +37 8 3.81220574E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +37 9 1.57985590E-01 0.00000000E+00-2.06194700E-02 0.00000000E+00 0.00000000E+00 +37 10-4.49837968E-01 3.29222283E+00-7.37059359E-01 2.60671643E-01 6.18994810E-01 +37 11 5.56811756E-02 0.00000000E+00 1.78062375E-01 5.40795236E-01 0.00000000E+00 +37 12 4.49837968E-01-3.29222283E+00 7.37059359E-01-2.60671643E-01 6.18994810E-01 +37 13-5.56811756E-02 0.00000000E+00 1.78062375E-01-5.40795236E-01 0.00000000E+00 +38 1 4.16264325E-02-4.99730349E-02 0.00000000E+00 3.38020843E-02 0.00000000E+00 +38 2-3.92506541E-01 0.00000000E+00-5.61004975E-03 0.00000000E+00-8.24201660E-01 +38 3 0.00000000E+00 1.52936012E+00 0.00000000E+00 3.53681705E-01 0.00000000E+00 +38 4-5.28374475E-02 0.00000000E+00-6.13458060E-02-7.48952915E-02-8.82195562E-02 +38 5 0.00000000E+00 0.00000000E+00 0.00000000E+00 9.97093598E-02 1.51608673E-01 +38 6-1.13209026E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00-1.23178799E+00 +38 7-1.12031847E+00 1.95518343E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 +38 8 0.00000000E+00 3.84988068E-02 0.00000000E+00 2.82145389E-01 0.00000000E+00 +38 9 0.00000000E+00 0.00000000E+00 0.00000000E+00 1.72233115E-02 0.00000000E+00 +38 10-3.51018052E-01 2.42915634E+00-3.74436866E-01 3.76561550E-02 3.60528763E-01 +38 11 2.48476687E-01 0.00000000E+00 3.30812191E-01 7.33832364E-02 0.00000000E+00 +38 12-3.51018052E-01 2.42915634E+00-3.74436866E-01 3.76561550E-02-3.60528763E-01 +38 13 2.48476687E-01 0.00000000E+00-3.30812191E-01 7.33832364E-02 0.00000000E+00 +39 1 0.00000000E+00 0.00000000E+00 1.10310442E-01 0.00000000E+00 0.00000000E+00 +39 2 0.00000000E+00 2.20516480E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00 +39 3-5.20425082E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00-2.10275691E-01 +39 4 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +39 5 1.27587337E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +39 6 0.00000000E+00 2.89979957E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 +39 7 0.00000000E+00 0.00000000E+00-1.75749863E-01 0.00000000E+00 0.00000000E+00 +39 8-1.81788887E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +39 9 2.69302637E-01 0.00000000E+00-1.10198660E-02 0.00000000E+00 0.00000000E+00 +39 10-3.70482111E-02-1.40736756E-01-3.91162544E-01 3.38818352E-02-2.39840760E-01 +39 11 7.28098594E-01 0.00000000E+00 1.47226821E-01-6.99670801E-01 0.00000000E+00 +39 12 3.70482111E-02 1.40736756E-01 3.91162544E-01-3.38818352E-02-2.39840760E-01 +39 13-7.28098594E-01 0.00000000E+00 1.47226821E-01 6.99670801E-01 0.00000000E+00 +40 1 0.00000000E+00 0.00000000E+00 0.00000000E+00 1.08543562E-11-1.87940573E-01 +40 2 0.00000000E+00 0.00000000E+00-5.18249297E-11-1.19045043E-01-1.73776074E-11 +40 3 0.00000000E+00 0.00000000E+00 3.13611393E-01 0.00000000E+00 0.00000000E+00 +40 4 0.00000000E+00 1.62201745E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 +40 5 0.00000000E+00 0.00000000E+00 5.85208786E-03 0.00000000E+00 0.00000000E+00 +40 6 0.00000000E+00 0.00000000E+00 0.00000000E+00 7.08488888E-01 0.00000000E+00 +40 7 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00-5.27665974E-01 +40 8 0.00000000E+00 3.15702112E-11 3.04140723E-02 1.46635878E-11 2.98732448E-01 +40 9 0.00000000E+00 1.23330074E-01 0.00000000E+00 1.38587194E-11 0.00000000E+00 +40 10 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +40 11 0.00000000E+00 6.74294206E-01 0.00000000E+00 0.00000000E+00-6.60824828E-01 +40 12 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +40 13 0.00000000E+00 6.74294206E-01 0.00000000E+00 0.00000000E+00-6.60824828E-01 +41 1 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +41 2 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +41 3 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +41 4 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +41 5 0.00000000E+00-7.02333067E-03 0.00000000E+00 0.00000000E+00 0.00000000E+00 +41 6 0.00000000E+00 0.00000000E+00-8.00046032E-01 0.00000000E+00 0.00000000E+00 +41 7 0.00000000E+00 0.00000000E+00 0.00000000E+00 6.29989136E-01 0.00000000E+00 +41 8 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +41 9 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00-2.40715825E-01 +41 10 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +41 11 0.00000000E+00-6.53538767E-01 0.00000000E+00 0.00000000E+00 6.41431918E-01 +41 12 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +41 13 0.00000000E+00 6.53538767E-01 0.00000000E+00 0.00000000E+00-6.41431918E-01 +42 1 8.02671995E-03 2.78142332E-02 0.00000000E+00 2.04551511E-01 0.00000000E+00 +42 2-9.02236460E-02 0.00000000E+00 1.11236322E-01 0.00000000E+00 2.63384399E+00 +42 3 0.00000000E+00-1.55610039E+00 0.00000000E+00 7.21880011E-01 0.00000000E+00 +42 4-3.02648662E-01 0.00000000E+00 1.85769475E-02-4.95778445E-03 5.44028870E-03 +42 5 0.00000000E+00 0.00000000E+00 0.00000000E+00 5.84461222E-01-7.14008717E-01 +42 6 2.27072170E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00-2.16779129E-01 +42 7 8.81460960E-01-3.32437040E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 +42 8 0.00000000E+00-3.96332496E-01 0.00000000E+00 2.85061944E-02 0.00000000E+00 +42 9 0.00000000E+00 0.00000000E+00 0.00000000E+00-5.31581339E-02 0.00000000E+00 +42 10 1.16713536E-01-1.66851766E+00-5.11985750E-01 1.55236005E-02 5.44417110E-01 +42 11-4.57146471E-01 0.00000000E+00-1.05946177E+00 1.83389748E-01 0.00000000E+00 +42 12 1.16713536E-01-1.66851766E+00-5.11985750E-01 1.55236005E-02-5.44417110E-01 +42 13-4.57146471E-01 0.00000000E+00 1.05946177E+00 1.83389748E-01 0.00000000E+00 +43 1 2.45608395E-02 1.07367638E-01 0.00000000E+00 4.46842806E-01 1.83543132E-11 +43 2 1.09658785E-02 0.00000000E+00 3.87181774E-01-5.83800446E-11 3.45538217E+00 +43 3 0.00000000E+00-1.58188944E+00 0.00000000E+00 5.21206473E-01 0.00000000E+00 +43 4-1.98406604E-01 0.00000000E+00 3.90689800E-02 3.27439294E-02 2.36928633E-02 +43 5 0.00000000E+00 0.00000000E+00 0.00000000E+00-4.17142882E-01 2.60568641E-01 +43 6 6.48661005E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 1.35463551E+00 +43 7 4.50467633E-01-1.45444312E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 +43 8 0.00000000E+00-4.54699791E-01 2.09368318E-11-3.87522816E-01 1.83798514E-11 +43 9 0.00000000E+00 1.83834069E-11 0.00000000E+00-3.36947484E-01 0.00000000E+00 +43 10 2.40282881E-01-2.65230572E+00-7.20069226E-01 9.88214538E-02 4.40123739E-01 +43 11 5.52418416E-01 0.00000000E+00-1.00675662E+00-9.95809772E-01 0.00000000E+00 +43 12 2.40282881E-01-2.65230572E+00-7.20069226E-01 9.88214538E-02-4.40123739E-01 +43 13 5.52418416E-01 0.00000000E+00 1.00675662E+00-9.95809772E-01 0.00000000E+00 +44 1 0.00000000E+00 0.00000000E+00-5.74572904E-01 0.00000000E+00 0.00000000E+00 +44 2 0.00000000E+00-5.09013228E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 +44 3 3.24785907E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 1.45069635E-01 +44 4 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +44 5-4.81206473E-03 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +44 6 0.00000000E+00 6.05576903E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 +44 7 0.00000000E+00 0.00000000E+00-1.50745368E+00 0.00000000E+00 0.00000000E+00 +44 8 8.10939550E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +44 9 4.65799929E-01 0.00000000E+00 4.86467811E-01 0.00000000E+00 0.00000000E+00 +44 10-2.68505047E-01 3.76083332E+00 5.57800701E-01-1.13932921E-01-4.32626277E-01 +44 11-2.52101216E-01 0.00000000E+00 1.37281072E+00 9.79308732E-01 0.00000000E+00 +44 12 2.68505047E-01-3.76083332E+00-5.57800701E-01 1.13932921E-01-4.32626277E-01 +44 13 2.52101216E-01 0.00000000E+00 1.37281072E+00-9.79308732E-01 0.00000000E+00 +45 1 0.00000000E+00 0.00000000E+00 0.00000000E+00-1.48984079E-11 6.73829015E-01 +45 2 0.00000000E+00 0.00000000E+00 3.91975131E-11 6.76350170E-01-3.31834291E-11 +45 3 0.00000000E+00 1.24516073E-11 8.74857511E-01 0.00000000E+00 0.00000000E+00 +45 4 0.00000000E+00-2.19956090E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 +45 5 0.00000000E+00 0.00000000E+00-1.76445236E-03 0.00000000E+00 0.00000000E+00 +45 6 0.00000000E+00 0.00000000E+00 0.00000000E+00 9.70280646E-02 0.00000000E+00 +45 7 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00-1.53846617E-01 +45 8 0.00000000E+00-1.14704085E-11-1.32490079E+00-1.17208178E-11-3.30946718E-01 +45 9 0.00000000E+00-4.92289204E-01 0.00000000E+00-1.14266923E-11 0.00000000E+00 +45 10 0.00000000E+00 2.39290809E-11 0.00000000E+00 0.00000000E+00 0.00000000E+00 +45 11 0.00000000E+00 1.92314284E-01 0.00000000E+00 0.00000000E+00-2.53765703E-01 +45 12 0.00000000E+00 2.39235871E-11 0.00000000E+00 0.00000000E+00 0.00000000E+00 +45 13 0.00000000E+00 1.92314284E-01 0.00000000E+00 0.00000000E+00-2.53765703E-01 +46 1 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00-1.91138251E-02 +46 2 0.00000000E+00 0.00000000E+00 1.08658175E-11-2.32912511E-02 0.00000000E+00 +46 3 0.00000000E+00-1.24220321E-11-3.11972264E-02 0.00000000E+00 0.00000000E+00 +46 4 0.00000000E+00 2.65708549E-03 0.00000000E+00 0.00000000E+00 0.00000000E+00 +46 5 0.00000000E+00 0.00000000E+00-1.79909031E-03 0.00000000E+00 0.00000000E+00 +46 6 0.00000000E+00 0.00000000E+00 0.00000000E+00-4.87543998E-02 0.00000000E+00 +46 7 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 1.78111556E-02 +46 8 0.00000000E+00 0.00000000E+00 3.61976904E-01-1.06075577E-11 6.16237387E-01 +46 9 0.00000000E+00-1.01887692E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +46 10 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +46 11 0.00000000E+00-3.22499017E-02 0.00000000E+00 0.00000000E+00 2.27498765E-02 +46 12 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +46 13 0.00000000E+00-3.22499017E-02 0.00000000E+00 0.00000000E+00 2.27498765E-02 +47 1 1.06465650E-02 2.36526550E-02 0.00000000E+00-3.41924199E-01 0.00000000E+00 +47 2 3.06375171E-01 0.00000000E+00-3.72029841E-01 3.45393637E-11-8.36725758E-01 +47 3 0.00000000E+00-7.71863468E-01 0.00000000E+00 2.10848779E-01 0.00000000E+00 +47 4 2.39461846E-02 0.00000000E+00 5.55619859E-03 1.56139052E-03-3.39347145E-03 +47 5 0.00000000E+00 0.00000000E+00 0.00000000E+00-1.83910917E-01-7.11988957E-02 +47 6 3.44390613E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 4.10243314E-01 +47 7 6.18329145E-01 2.16142484E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 +47 8 0.00000000E+00 5.20051723E-01-2.57515454E-11 1.01516413E-02-1.24538827E-11 +47 9 0.00000000E+00 0.00000000E+00 0.00000000E+00 1.09635251E+00 0.00000000E+00 +47 10 2.51096888E-02-1.27267369E-01-2.84473548E-01 5.17180562E-02 3.65696296E-01 +47 11 1.76225113E-01 0.00000000E+00-1.81969707E-01 1.02782763E-01 0.00000000E+00 +47 12 2.51096888E-02-1.27267369E-01-2.84473548E-01 5.17180562E-02-3.65696296E-01 +47 13 1.76225113E-01 0.00000000E+00 1.81969707E-01 1.02782763E-01 0.00000000E+00 +48 1 0.00000000E+00 0.00000000E+00-1.60563229E-01 0.00000000E+00 0.00000000E+00 +48 2 0.00000000E+00-1.87991244E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 +48 3-2.48862968E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 2.23381108E-01 +48 4 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +48 5 6.63727701E-03 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +48 6 0.00000000E+00-4.72699133E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 +48 7 0.00000000E+00 0.00000000E+00 1.05478601E+00 0.00000000E+00 0.00000000E+00 +48 8-5.57427071E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +48 9 7.45374332E-03 0.00000000E+00 1.14306978E+00 0.00000000E+00 0.00000000E+00 +48 10 1.85862627E-02-1.98432312E+00-1.72126423E-01 2.28695421E-01 3.32756003E-01 +48 11 2.11271202E-01 0.00000000E+00-4.85359327E-01-4.51111720E-01 0.00000000E+00 +48 12-1.85862627E-02 1.98432312E+00 1.72126423E-01-2.28695421E-01 3.32756003E-01 +48 13-2.11271202E-01 0.00000000E+00-4.85359327E-01 4.51111720E-01 0.00000000E+00 +49 1-5.77322082E-03-4.96123869E-03 0.00000000E+00 2.41673607E-01 0.00000000E+00 +49 2-2.17899827E-01 0.00000000E+00 3.03170053E-01 3.02065426E-11 2.62493400E+00 +49 3 0.00000000E+00-8.31711955E-01 0.00000000E+00-2.51600111E-01 0.00000000E+00 +49 4 8.25586041E-02 0.00000000E+00-3.11597199E-03 5.85909805E-03 8.27837049E-03 +49 5 0.00000000E+00 0.00000000E+00 0.00000000E+00 5.08975109E-02 8.00661849E-02 +49 6-1.29195373E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00-1.66612979E-01 +49 7 1.21201696E-01-3.53854265E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 +49 8 0.00000000E+00-1.48400795E+00-2.90027968E-11 1.42798996E-01 0.00000000E+00 +49 9 0.00000000E+00 0.00000000E+00 0.00000000E+00 4.55773824E-01 0.00000000E+00 +49 10 4.77593178E-02-1.36904882E+00 1.93752161E-01-1.45286177E-02-3.79335463E-01 +49 11 1.36115357E-01 0.00000000E+00-4.04335827E-01-2.15037887E-01 0.00000000E+00 +49 12 4.77593178E-02-1.36904882E+00 1.93752161E-01-1.45286177E-02 3.79335463E-01 +49 13 1.36115357E-01 0.00000000E+00 4.04335827E-01-2.15037887E-01 0.00000000E+00 +50 1 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00-7.80102920E-02 +50 2 0.00000000E+00 0.00000000E+00-5.02114850E-11-1.54827667E-01-3.04674016E-11 +50 3 0.00000000E+00 1.94695386E-11 4.59439943E-02 0.00000000E+00 0.00000000E+00 +50 4 0.00000000E+00-2.43893976E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00 +50 5 0.00000000E+00 0.00000000E+00-6.19006913E-03 0.00000000E+00 0.00000000E+00 +50 6 0.00000000E+00 0.00000000E+00 0.00000000E+00-9.97207994E-02 0.00000000E+00 +50 7 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00-8.99893092E-02 +50 8 0.00000000E+00 3.83420733E-11-7.66015141E-01 1.12956197E-11 1.01530733E+00 +50 9 0.00000000E+00 4.58662857E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 +50 10 0.00000000E+00 2.53571556E-11 0.00000000E+00 0.00000000E+00 0.00000000E+00 +50 11 0.00000000E+00-4.31605207E-01 0.00000000E+00 0.00000000E+00 6.42269808E-02 +50 12 0.00000000E+00 2.53571852E-11 0.00000000E+00 0.00000000E+00 0.00000000E+00 +50 13 0.00000000E+00-4.31605207E-01 0.00000000E+00 0.00000000E+00 6.42269808E-02 +51 1 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +51 2 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +51 3 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +51 4 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +51 5 0.00000000E+00-1.03109969E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00 +51 6 0.00000000E+00 0.00000000E+00-1.32574638E-01 0.00000000E+00 0.00000000E+00 +51 7 0.00000000E+00 0.00000000E+00 0.00000000E+00-1.40588574E-01 0.00000000E+00 +51 8 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +51 9 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 1.04325829E+00 +51 10 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +51 11 0.00000000E+00-4.72024242E-01 0.00000000E+00 0.00000000E+00 6.56818584E-02 +51 12 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +51 13 0.00000000E+00 4.72024242E-01 0.00000000E+00 0.00000000E+00-6.56818584E-02 +52 1 0.00000000E+00 0.00000000E+00 1.29831236E-01 0.00000000E+00 0.00000000E+00 +52 2 0.00000000E+00 2.11628753E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 +52 3-2.85769267E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00 1.05442016E-01 +52 4 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +52 5-4.47075991E-03 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +52 6 0.00000000E+00 2.12894821E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 +52 7 0.00000000E+00 0.00000000E+00-5.32105552E-02 0.00000000E+00 0.00000000E+00 +52 8-1.36749637E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +52 9 7.71018505E-01 0.00000000E+00 3.70037202E-02 0.00000000E+00 0.00000000E+00 +52 10-2.65106897E-02-2.65142263E-01 1.73813369E-01-1.91284875E-02 1.22023515E-01 +52 11-5.46373391E-01 0.00000000E+00-1.61040028E-01 8.79845296E-02 0.00000000E+00 +52 12 2.65106897E-02 2.65142263E-01-1.73813369E-01 1.91284875E-02 1.22023515E-01 +52 13 5.46373391E-01 0.00000000E+00-1.61040028E-01-8.79845296E-02 0.00000000E+00 +53 1 1.79029432E-02 1.27327435E+00 0.00000000E+00-1.40122428E-01 0.00000000E+00 +53 2-2.50493578E+00 0.00000000E+00-1.99230971E-01 2.53644189E-11-1.07879217E+01 +53 3 0.00000000E+00 4.95754635E-01 0.00000000E+00-1.30730627E+00 0.00000000E+00 +53 4 1.32384292E-01 0.00000000E+00 6.46062963E-01 6.73319066E-01 6.95105180E-01 +53 5 0.00000000E+00 0.00000000E+00 0.00000000E+00 2.69632991E+00 2.98179524E+00 +53 6 3.30849429E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 2.54454862E+00 +53 7 2.79636981E+00 3.05783101E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +53 8 0.00000000E+00 1.89451376E-01-1.46939435E-11 1.04323804E+00 0.00000000E+00 +53 9 0.00000000E+00 0.00000000E+00 0.00000000E+00-1.01605558E-01 0.00000000E+00 +53 10 5.64801962E-01 6.39717042E-01 2.17515791E-01 1.35172945E-01 2.92632431E-01 +53 11 2.86145425E-01 0.00000000E+00 1.95034161E-01 1.34458169E-01 0.00000000E+00 +53 12 5.64801962E-01 6.39717042E-01 2.17515791E-01 1.35172945E-01-2.92632431E-01 +53 13 2.86145425E-01 0.00000000E+00-1.95034161E-01 1.34458169E-01 0.00000000E+00 +54 1 0.00000000E+00 0.00000000E+00-2.52064441E-01 0.00000000E+00 0.00000000E+00 +54 2 0.00000000E+00-3.58432026E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 +54 3 3.26100067E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00-1.42544377E-02 +54 4 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +54 5-5.57422811E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +54 6 0.00000000E+00-1.02181676E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +54 7 0.00000000E+00 0.00000000E+00-4.35950291E-01 0.00000000E+00 0.00000000E+00 +54 8 1.11288253E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +54 9 1.22516604E+00 0.00000000E+00-3.08120909E-01 0.00000000E+00 0.00000000E+00 +54 10 8.66967486E-01 3.93378685E-01-3.28085497E-01 1.29737867E-01 8.82620698E-01 +54 11 5.18459328E-01 0.00000000E+00-2.73107441E-01-1.28275885E-01 0.00000000E+00 +54 12-8.66967486E-01-3.93378685E-01 3.28085497E-01-1.29737867E-01 8.82620698E-01 +54 13-5.18459328E-01 0.00000000E+00-2.73107441E-01 1.28275885E-01 0.00000000E+00 +55 1-1.19831709E-02-1.07796330E+00 0.00000000E+00-1.33433875E-01 0.00000000E+00 +55 2 4.04275576E+00 0.00000000E+00-1.79778229E-01 1.97729678E-11 3.98990236E+00 +55 3 0.00000000E+00-1.47754741E-01 0.00000000E+00 6.67283222E-01 0.00000000E+00 +55 4-9.08933923E-02 0.00000000E+00-6.05697544E-01-5.62539715E-01-5.21060530E-01 +55 5 0.00000000E+00 0.00000000E+00 0.00000000E+00-3.04038112E+00-2.56967070E+00 +55 6-1.99001171E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00-1.13429191E+00 +55 7-9.73853293E-01-9.06950602E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 +55 8 0.00000000E+00 1.86267556E-01-1.13061243E-11 1.34678869E+00 0.00000000E+00 +55 9 0.00000000E+00 0.00000000E+00 0.00000000E+00-1.71769662E-01 0.00000000E+00 +55 10 7.82337086E-01-1.64248408E-01-3.44422406E-01-1.54681387E-02 7.22454868E-01 +55 11 6.07932747E-01 0.00000000E+00-3.44733110E-01-2.45967738E-01 0.00000000E+00 +55 12 7.82337086E-01-1.64248408E-01-3.44422406E-01-1.54681387E-02-7.22454868E-01 +55 13 6.07932747E-01 0.00000000E+00 3.44733110E-01-2.45967738E-01 0.00000000E+00 +56 1 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 3.68857716E-02 +56 2 0.00000000E+00 0.00000000E+00-1.62862924E-11-1.35939905E-01 0.00000000E+00 +56 3 0.00000000E+00 0.00000000E+00-8.03362504E-02 0.00000000E+00 0.00000000E+00 +56 4 0.00000000E+00-1.24810470E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00 +56 5 0.00000000E+00 0.00000000E+00 1.14529639E+00 0.00000000E+00 0.00000000E+00 +56 6 0.00000000E+00 0.00000000E+00 0.00000000E+00-6.31424255E-01 0.00000000E+00 +56 7 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 2.35731652E-01 +56 8 0.00000000E+00 0.00000000E+00 6.96345235E-02 0.00000000E+00 4.87907707E-02 +56 9 0.00000000E+00 3.92354554E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00 +56 10 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +56 11 0.00000000E+00-6.76059031E-02 0.00000000E+00 0.00000000E+00 9.79197775E-02 +56 12 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +56 13 0.00000000E+00-6.76059031E-02 0.00000000E+00 0.00000000E+00 9.79197775E-02 +57 1 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +57 2 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +57 3 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +57 4 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +57 5 0.00000000E+00 1.14733607E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +57 6 0.00000000E+00 0.00000000E+00-6.44072630E-01 0.00000000E+00 0.00000000E+00 +57 7 0.00000000E+00 0.00000000E+00 0.00000000E+00 2.59418473E-01 0.00000000E+00 +57 8 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +57 9 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 2.29258643E-02 +57 10 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +57 11 0.00000000E+00-8.91359049E-02 0.00000000E+00 0.00000000E+00 1.13366333E-01 +57 12 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +57 13 0.00000000E+00 8.91359049E-02 0.00000000E+00 0.00000000E+00-1.13366333E-01 +58 1 4.40095221E-03-1.33006633E-02 0.00000000E+00-3.09630940E-03 0.00000000E+00 +58 2 3.01835414E-02 0.00000000E+00 2.34239035E-02 0.00000000E+00-4.51161122E-01 +58 3 0.00000000E+00 4.52122775E-01 0.00000000E+00-1.77963877E-01 0.00000000E+00 +58 4 5.90125563E-02 0.00000000E+00 4.93201426E-01-1.16257870E+00 6.23186265E-01 +58 5 0.00000000E+00 0.00000000E+00 0.00000000E+00-3.10235427E-01 6.40204132E-01 +58 6-3.87006907E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 1.07044957E-01 +58 7-4.33410366E-01 1.40754649E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 +58 8 0.00000000E+00-2.39162468E-02 0.00000000E+00-3.08855391E-02 0.00000000E+00 +58 9 0.00000000E+00 0.00000000E+00 0.00000000E+00-7.65993926E-03 0.00000000E+00 +58 10-4.42130817E-02 3.91386529E-01 1.12102920E-01-2.49499710E-03-7.90088174E-02 +58 11 5.11198318E-02 0.00000000E+00 2.27058570E-01-8.62200272E-02 0.00000000E+00 +58 12-4.42130817E-02 3.91386529E-01 1.12102920E-01-2.49499710E-03 7.90088174E-02 +58 13 5.11198318E-02 0.00000000E+00-2.27058570E-01-8.62200272E-02 0.00000000E+00 +59 1-3.50058779E-02 1.13114902E-01 0.00000000E+00-2.11457580E-01 1.47057114E-11 +59 2-1.76161189E-01 0.00000000E+00 6.66078917E-01-5.39484951E-11-1.06109900E+00 +59 3 0.00000000E+00 3.62752818E-02 0.00000000E+00 2.84717336E-01 0.00000000E+00 +59 4-1.16312082E-01 0.00000000E+00 1.17027418E+00 4.85162710E-02-8.41010796E-01 +59 5 0.00000000E+00 0.00000000E+00 0.00000000E+00-5.65991494E-01 2.23419231E-01 +59 6 8.60252073E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 5.53211948E-01 +59 7 2.43017345E-01 1.82189324E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 +59 8 0.00000000E+00-3.06453292E-01 2.92857154E-11 1.51873299E-01 1.30037048E-11 +59 9 0.00000000E+00 1.25592889E-11 0.00000000E+00-1.94629846E-01 0.00000000E+00 +59 10 2.62056949E-01-1.86931411E-02-2.42196387E-01 1.97186499E-02 1.86007422E-01 +59 11 2.14877360E-01 0.00000000E+00 2.05959952E-02-9.95219630E-02 0.00000000E+00 +59 12 2.62056949E-01-1.86931411E-02-2.42196387E-01 1.97186499E-02-1.86007422E-01 +59 13 2.14877360E-01 0.00000000E+00-2.05959952E-02-9.95219630E-02 0.00000000E+00 +60 1 0.00000000E+00 0.00000000E+00 5.18901078E-01 0.00000000E+00 0.00000000E+00 +60 2 0.00000000E+00-1.73588165E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +60 3 6.13585240E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 5.96799445E-02 +60 4 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +60 5-1.17529357E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +60 6 0.00000000E+00 9.80597875E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 +60 7 0.00000000E+00 0.00000000E+00-3.61705909E-01 0.00000000E+00 0.00000000E+00 +60 8 6.83063314E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +60 9 1.58829407E-01 0.00000000E+00 4.74724458E-01 0.00000000E+00 0.00000000E+00 +60 10-3.33912975E-01 5.60448648E-01 1.81893557E-01-4.22832762E-02-3.03907638E-01 +60 11-1.81824846E-01 0.00000000E+00 2.01602368E-01 1.24750878E-01 0.00000000E+00 +60 12 3.33912975E-01-5.60448648E-01-1.81893557E-01 4.22832762E-02-3.03907638E-01 +60 13 1.81824846E-01 0.00000000E+00 2.01602368E-01-1.24750878E-01 0.00000000E+00 +61 1 0.00000000E+00 0.00000000E+00 0.00000000E+00 1.90423119E-11 3.46462792E+00 +61 2 0.00000000E+00 0.00000000E+00-6.50239897E-11-1.28115055E+01 1.98720547E-11 +61 3 0.00000000E+00 0.00000000E+00 7.61141437E-01 0.00000000E+00 0.00000000E+00 +61 4 0.00000000E+00-1.82275407E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 +61 5 0.00000000E+00 0.00000000E+00-1.31594004E-02 0.00000000E+00 0.00000000E+00 +61 6 0.00000000E+00 0.00000000E+00 0.00000000E+00 1.11946469E-02 0.00000000E+00 +61 7 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00-1.13020371E-02 +61 8 0.00000000E+00 3.68283502E-11 6.91693869E+00 1.18827252E-11 3.08693468E+00 +61 9 0.00000000E+00 3.08978158E+00 0.00000000E+00 1.18578455E-11 0.00000000E+00 +61 10 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +61 11 0.00000000E+00 1.64789802E-02 0.00000000E+00 0.00000000E+00-1.93421170E-02 +61 12 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +61 13 0.00000000E+00 1.64789802E-02 0.00000000E+00 0.00000000E+00-1.93421170E-02 +62 1-4.61978675E-02 1.79685680E-01 0.00000000E+00 3.47868962E+00-1.82058178E-11 +62 2-8.88341935E-01 0.00000000E+00-1.28842815E+01 6.17800291E-11 1.53000253E+00 +62 3 0.00000000E+00 2.91921358E-03 0.00000000E+00 1.27495590E-01 0.00000000E+00 +62 4-1.70489655E-01 0.00000000E+00 2.49547511E-01 1.78763021E-01 1.23359403E-01 +62 5 0.00000000E+00 0.00000000E+00 0.00000000E+00 1.82234993E-01 2.67932901E-01 +62 6 3.52118504E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 2.51227245E-01 +62 7 1.19527185E-01-1.24274158E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 +62 8 0.00000000E+00 6.92321010E+00-3.62456441E-11 3.17552016E+00-1.16705977E-11 +62 9 0.00000000E+00-1.11917293E-11 0.00000000E+00 3.08712434E+00 0.00000000E+00 +62 10 7.81916176E-02-9.55023383E-01-1.58783845E-01 1.16671211E-02 9.76317332E-02 +62 11 9.57984462E-02 0.00000000E+00-3.83678362E-01-2.71626825E-01 0.00000000E+00 +62 12 7.81916176E-02-9.55023383E-01-1.58783845E-01 1.16671211E-02-9.76317332E-02 +62 13 9.57984462E-02 0.00000000E+00 3.83678362E-01-2.71626825E-01 0.00000000E+00 +63 1 0.00000000E+00 0.00000000E+00-3.47516599E+00 0.00000000E+00 0.00000000E+00 +63 2 0.00000000E+00 1.29082343E+01 0.00000000E+00 0.00000000E+00 0.00000000E+00 +63 3 4.32488192E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 1.95988605E-01 +63 4 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +63 5-1.97560800E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +63 6 0.00000000E+00 2.71284535E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 +63 7 0.00000000E+00 0.00000000E+00-4.37780840E-01 0.00000000E+00 0.00000000E+00 +63 8-7.01151988E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +63 9-3.20277668E+00 0.00000000E+00-3.07046928E+00 0.00000000E+00 0.00000000E+00 +63 10-1.36064542E-01 1.17645447E+00 1.71227509E-01 5.83862358E-02-1.91092750E-01 +63 11-1.20719139E-01 0.00000000E+00 4.52501045E-01 3.40706447E-01 0.00000000E+00 +63 12 1.36064542E-01-1.17645447E+00-1.71227509E-01-5.83862358E-02-1.91092750E-01 +63 13 1.20719139E-01 0.00000000E+00 4.52501045E-01-3.40706447E-01 0.00000000E+00 +64 1 8.02830336E-01-3.68410206E+00 0.00000000E+00 2.62498199E-01 0.00000000E+00 +64 2 1.66872030E+01 0.00000000E+00-1.01178912E+00 0.00000000E+00 6.58022696E+00 +64 3 0.00000000E+00-2.29112527E-01 0.00000000E+00 9.57979938E-01 0.00000000E+00 +64 4-1.13833113E-01 0.00000000E+00-3.32301024E+00-3.38643246E+00-3.46332398E+00 +64 5 0.00000000E+00 0.00000000E+00 0.00000000E+00-6.59171353E+00-6.48358789E+00 +64 6-6.34919849E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00-1.69036039E+00 +64 7-1.74117990E+00-1.83618311E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +64 8 0.00000000E+00 5.49998385E-01 0.00000000E+00 3.85810154E-01 0.00000000E+00 +64 9 0.00000000E+00 0.00000000E+00 0.00000000E+00 2.16932713E-01 0.00000000E+00 +64 10 9.88396599E-02-3.61370415E-01-2.35874437E-01-8.39153247E-02 1.52734157E-01 +64 11 1.21961668E-01 0.00000000E+00-2.19933915E-01-1.58336639E-01 0.00000000E+00 +64 12 9.88396599E-02-3.61370415E-01-2.35874437E-01-8.39153247E-02-1.52734157E-01 +64 13 1.21961668E-01 0.00000000E+00 2.19933915E-01-1.58336639E-01 0.00000000E+00 +65 1 2.20892250E+00-1.61336276E+00 0.00000000E+00-3.59328398E-03 0.00000000E+00 +65 2-5.26277858E+00 0.00000000E+00 1.60758821E-02 0.00000000E+00-2.65914498E-01 +65 3 0.00000000E+00 2.17238600E-02 0.00000000E+00-4.13629994E-02 0.00000000E+00 +65 4 1.62143078E-03 0.00000000E+00 1.19772252E+00 1.19891189E+00 1.20055066E+00 +65 5 0.00000000E+00 0.00000000E+00 0.00000000E+00 1.56157120E+00 1.55818379E+00 +65 6 1.55339634E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 7.58875409E-02 +65 7 7.76201046E-02 8.51746816E-02 0.00000000E+00 0.00000000E+00 0.00000000E+00 +65 8 0.00000000E+00-8.20709688E-03 0.00000000E+00-1.00323090E-02 0.00000000E+00 +65 9 0.00000000E+00 0.00000000E+00 0.00000000E+00-2.43995758E-03 0.00000000E+00 +65 10-8.13573905E-03 3.26887136E-02 2.35200572E-03 5.32988393E-03-5.39665247E-03 +65 11-4.30579792E-03 0.00000000E+00 1.26629153E-02 7.88446024E-03 0.00000000E+00 +65 12-8.13573905E-03 3.26887136E-02 2.35200572E-03 5.32988393E-03 5.39665247E-03 +65 13-4.30579792E-03 0.00000000E+00-1.26629153E-02 7.88446024E-03 0.00000000E+00 + CANONFOK + -20.5617458625 -1.3616019881 -0.7318138944 -0.5849984055 > + -0.5112380373 0.0432554964 0.0717547303 0.2345793808 > + 0.2454943112 0.2455797573 0.2635407974 0.3021661939 > + 0.3097472857 0.6863465193 0.7114696427 0.8003689475 > + 0.8165373144 0.8749390523 1.0511254087 1.0615426340 > + 1.0778733536 1.1915950433 1.2241343223 1.2669419338 > + 1.3295289533 1.3583064629 1.3802104417 1.5421837637 > + 1.8323327538 1.8854097375 2.7903389878 2.9104985875 > + 3.1389643487 3.3867546667 3.4133437052 3.5152920438 > + 3.7438217719 3.8044785244 4.0173772245 4.3366580836 > + 4.4359912089 4.6571041385 5.0907212219 5.1814450301 > + 5.2156256286 5.4412068194 5.5152166347 5.6524675546 > + 5.7047667165 5.9551368249 6.0948217887 6.2373672777 > + 7.3039036079 7.4231589163 7.9774361290 15.0274792188 > + 15.0582409825 15.1002803194 15.4743099268 15.8478809567 > + 17.2180503404 17.3694129799 17.5068818824 19.3589157111 > + 62.9269162019 + STOP +SCREEN2 (FROM VDWSCL= 0.700) + A01O1 1.000000000 1.995300393 + A02H2 1.000000000 2.343164888 + A03H3 1.000000000 2.344880701 + BO21 1.000000000 3.225057762 + BO31 1.000000000 3.216505597 +STOP +SCREEN (FROM VDWSCL= 0.700) + A01O1 1.000000000 1.020021626 + A02H2 1.000000000 0.893183530 + A03H3 1.000000000 0.893183174 + BO21 1.000000000 10.000000000 + BO31 1.000000000 10.000000000 +STOP +MM_CHARGE + A01O1 -0.6 + A02H2 0.3 + A03H3 0.3 +STOP +MM_LJ + A01O1 2.1 0.7 + A02H2 1.3 0.5 + A03H3 1.3 0.5 +STOP +MM_ATOMTYPE + A01O1 OO + A02H2 HA + A03H3 HA +STOP + $END diff --git a/fraglib/nh3-mm.efp b/fraglib/nh3-mm.efp new file mode 100644 index 00000000..b1b2c75b --- /dev/null +++ b/fraglib/nh3-mm.efp @@ -0,0 +1,1616 @@ + RUNTYP=MAKEFP EFFECTIVE FRAGMENT POTENTIAL DATA FOLLOWS... + FRAGNAMEEFP GENERATED AT Tue Mar 27 16:16:45 2012 + $NH3-MM_L +EFP DATA FOR FRAGNAME SCFTYP=RHF ... GENERATED WITH BASIS SET=6-311++G(3df,2p) + COORDINATES (BOHR) +A01N1 0.0000000000 0.0000000000 -0.1193880985 14.0030700 7.0 +A02H2 -0.8821076766 -1.5278551402 0.5529398549 1.0078250 1.0 +A03H3 -0.8821076644 1.5278551472 0.5529398549 1.0078250 1.0 +A04H4 1.7642151525 0.0000000000 0.5529399267 1.0078250 1.0 +BO21 -0.4410538383 -0.7639275701 0.2167758782 0.0000000 0.0 +BO31 -0.4410538322 0.7639275736 0.2167758782 0.0000000 0.0 +BO41 0.8821075762 0.0000000000 0.2167759141 0.0000000 0.0 + STOP + MONOPOLES +A01N1 -6.6449324364 7.00000 +A02H2 -0.6086717606 1.00000 +A03H3 -0.6086717614 1.00000 +A04H4 -0.6086717517 1.00000 +BO21 -0.5096840942 0.00000 +BO31 -0.5096840935 0.00000 +BO41 -0.5096841021 0.00000 + STOP + DIPOLES +A01N1 -0.0000000307 0.0000000005 0.8238262734 +A02H2 -0.0354570447 -0.0614133945 0.0085447729 +A03H3 -0.0354570442 0.0614133949 0.0085447730 +A04H4 0.0709140813 0.0000000001 0.0085447745 +BO21 0.1491195192 0.2582825851 -0.1701222687 +BO31 0.1491195189 -0.2582825864 -0.1701222683 +BO41 -0.2982390205 0.0000000012 -0.1701222947 + STOP + QUADRUPOLES +A01N1 -3.5655228692 -3.5655228921 -4.6990856666 0.0000000007 > + 0.0000000259 0.0000000009 +A02H2 -0.3615717478 -0.3623324771 -0.3644565695 -0.0006588110 > + -0.0032104756 -0.0055607072 +A03H3 -0.3615717485 -0.3623324778 -0.3644565702 0.0006588110 > + -0.0032104756 0.0055607072 +A04H4 -0.3627128297 -0.3611913697 -0.3644565553 0.0000000000 > + 0.0064209516 0.0000000000 +BO21 -0.2621192678 -0.2327947160 -0.3137355944 0.0253958115 > + -0.0095309739 -0.0165081327 +BO31 -0.2621192673 -0.2327947148 -0.3137355936 -0.0253958114 > + -0.0095309739 0.0165081329 +BO41 -0.2181324437 -0.2767815519 -0.3137355960 0.0000000000 > + 0.0190619546 -0.0000000001 + STOP + OCTUPOLES +A01N1 -0.0441347524 0.0000000009 2.5095104451 0.0000000008 > + 0.9039995065 0.0441346142 0.9039995000 -0.0000000311 > + 0.0000000009 0.0000000002 +A02H2 -0.0586056886 -0.1005168638 -0.0088276318 -0.0335056212 > + -0.0040551505 -0.0187722391 -0.0055830635 -0.0194887561 > + -0.0337555112 -0.0013232116 +A03H3 -0.0586056877 0.1005168644 -0.0088276317 0.0335056214 > + -0.0040551505 -0.0187722388 -0.0055830635 -0.0194887558 > + 0.0337555114 0.0013232116 +A04H4 0.1154946370 0.0000000001 -0.0088276307 0.0000000000 > + -0.0063470197 0.0392612025 -0.0032911935 0.0389775074 > + 0.0000000000 0.0000000000 +BO21 0.4494657036 0.7938380938 -0.5248487871 0.2646126991 > + -0.1747825688 0.1616311276 -0.1805281162 0.1494813753 > + 0.2589093442 -0.0049757905 +BO31 0.4494657037 -0.7938380979 -0.5248487838 -0.2646127003 > + -0.1747825676 0.1616311277 -0.1805281151 0.1494813753 > + -0.2589093455 0.0049757904 +BO41 -0.9255021073 0.0000000043 -0.5248488855 0.0000000015 > + -0.1834009247 -0.2966914772 -0.1719098276 -0.2989627322 > + 0.0000000014 0.0000000000 + STOP + POLARIZABLE POINTS +CT1 -0.5251394459 -0.9095681227 0.3261862484 + 2.1998617706 3.6186399671 1.6907027672 1.2286117581 > + -0.5999455800 -1.0390957328 1.2286810814 -0.5197672535 > + -0.9002568524 +CT2 1.0502787886 -0.0000000012 0.3261863008 + 4.3279192391 1.4905404427 1.6907028567 0.0000023009 > + 1.1999151563 0.0000399911 0.0000997249 1.0395289942 > + -0.0000031988 +CT3 -0.5251394379 0.9095681275 0.3261862452 + 2.1998587983 3.6185729021 1.6907027645 -1.2286021977 > + -0.5999429308 1.0390557848 -1.2285980104 -0.5197617151 > + 0.9002600542 +CT4 0.0000000197 -0.0000000007 -0.7552424478 + 2.9058878661 2.9056968381 7.2806674938 -0.0000069845 > + -0.0000030096 0.0000000072 -0.0000095214 -0.0000001528 > + 0.0000000113 + STOP + DYNAMIC POLARIZABLE POINTS +CT 1 -0.5251394459 -0.9095681227 0.3261862484 -- FOR W= 0.002792I A.U. + 2.1998155676 3.6184649029 1.6905179834 1.2285865379 > + -0.5999616348 -1.0391640017 1.2285865671 -0.5196106589 > + -0.8999920288 +CT 2 1.0502787886 -0.0000000012 0.3261863008 + 4.3277894329 1.4904907042 1.6905180732 -0.0000000030 > + 1.1999233129 -0.0000000020 -0.0000000059 1.0392213645 > + -0.0000000042 +CT 3 -0.5251394379 0.9095681275 0.3261862452 + 2.1998155522 3.6184649460 1.6905179807 -1.2285865295 > + -0.5999616265 1.0391640022 -1.2285865558 -0.5196106552 > + 0.8999920334 +CT 4 0.0000000197 -0.0000000007 -0.7552424478 + 2.9059548818 2.9059548413 7.2807465492 0.0000000000 > + -0.0000001426 0.0000000121 0.0000000001 -0.0000001417 > + 0.0000000102 +CT 1 -0.5251394459 -0.9095681227 0.3261862484 -- FOR W= 0.015107I A.U. + 2.1989870609 3.6162889662 1.6896114342 1.2274196294 > + -0.5994111168 -1.0382104766 1.2274196585 -0.5187254496 > + -0.8984588020 +CT 2 1.0502787886 -0.0000000012 0.3261863008 + 4.3249397819 1.4903359125 1.6896115238 -0.0000000029 > + 1.1988222769 -0.0000000021 -0.0000000059 1.0374509464 > + -0.0000000039 +CT 3 -0.5251394379 0.9095681275 0.3261862452 + 2.1989870457 3.6162890093 1.6896114315 -1.2274196210 > + -0.5994111086 1.0382104771 -1.2274196471 -0.5187254464 > + 0.8984588063 +CT 4 0.0000000197 -0.0000000007 -0.7552424478 + 2.9038722734 2.9038722333 7.2692231864 -0.0000000002 > + -0.0000001423 0.0000000120 -0.0000000001 -0.0000001413 > + 0.0000000101 +CT 1 -0.5251394459 -0.9095681227 0.3261862484 -- FOR W= 0.039002I A.U. + 2.1941406521 3.6035945746 1.6843532526 1.2206230761 > + -0.5962035944 -1.0326548853 1.2206231050 -0.5136234258 > + -0.8896218379 +CT 2 1.0502787886 -0.0000000012 0.3261863008 + 4.3083214003 1.4894134962 1.6843533413 -0.0000000029 > + 1.1924072324 -0.0000000020 -0.0000000058 1.0272468986 > + -0.0000000038 +CT 3 -0.5251394379 0.9095681275 0.3261862452 + 2.1941406369 3.6035946174 1.6843532499 -1.2206230677 > + -0.5962035863 1.0326548858 -1.2206230936 -0.5136234228 > + 0.8896218422 +CT 4 0.0000000197 -0.0000000007 -0.7552424478 + 2.8917483548 2.8917483147 7.2027405439 -0.0000000002 > + -0.0000001405 0.0000000118 -0.0000000002 -0.0000001392 > + 0.0000000098 +CT 1 -0.5251394459 -0.9095681227 0.3261862484 -- FOR W= 0.077996I A.U. + 2.1772221024 3.5597211759 1.6665558711 1.1972794896 > + -0.5851727691 -1.0135489361 1.1972795175 -0.4967637222 > + -0.8604199757 +CT 2 1.0502787886 -0.0000000012 0.3261863008 + 4.2509705827 1.4859723743 1.6665559566 -0.0000000029 > + 1.1703455822 -0.0000000021 -0.0000000059 0.9935274905 > + -0.0000000036 +CT 3 -0.5251394379 0.9095681275 0.3261862452 + 2.1772220875 3.5597212183 1.6665558686 -1.1972794814 > + -0.5851727612 1.0135489366 -1.1972795064 -0.4967637194 > + 0.8604199800 +CT 4 0.0000000197 -0.0000000007 -0.7552424478 + 2.8501808060 2.8501807664 6.9822256251 -0.0000000002 > + -0.0000001349 0.0000000111 -0.0000000001 -0.0000001321 > + 0.0000000090 +CT 1 -0.5251394459 -0.9095681227 0.3261862484 -- FOR W= 0.138651I A.U. + 2.1300572815 3.4407746587 1.6206973318 1.1351147105 > + -0.5556866625 -0.9624775034 1.1351147358 -0.4561931784 > + -0.7901497352 +CT 2 1.0502787886 -0.0000000012 0.3261863008 + 4.0961332311 1.4746984101 1.6206974096 -0.0000000027 > + 1.1113733697 -0.0000000020 -0.0000000054 0.9123864008 > + -0.0000000030 +CT 3 -0.5251394379 0.9095681275 0.3261862452 + 2.1300572673 3.4407746992 1.6206973297 -1.1351147025 > + -0.5556866549 0.9624775038 -1.1351147252 -0.4561931761 > + 0.7901497392 +CT 4 0.0000000197 -0.0000000007 -0.7552424478 + 2.7399265614 2.7399265242 6.4460836989 -0.0000000002 > + -0.0000001217 0.0000000095 -0.0000000001 -0.0000001160 > + 0.0000000070 +CT 1 -0.5251394459 -0.9095681227 0.3261862484 -- FOR W= 0.233223I A.U. + 2.0145238016 3.1669821706 1.5231859444 0.9980583746 > + -0.4900751227 -0.8488349873 0.9980583940 -0.3827285471 > + -0.6629052660 +CT 2 1.0502787886 -0.0000000012 0.3261863008 + 3.7432112665 1.4382944527 1.5231860073 -0.0000000024 > + 0.9801502903 -0.0000000017 -0.0000000045 0.7654571344 > + -0.0000000022 +CT 3 -0.5251394379 0.9095681275 0.3261862452 + 2.0145237888 3.1669822070 1.5231859430 -0.9980583672 > + -0.4900751160 0.8488349874 -0.9980583846 -0.3827285452 > + 0.6629052696 +CT 4 0.0000000197 -0.0000000007 -0.7552424478 + 2.4976170213 2.4976169901 5.4537423340 -0.0000000001 > + -0.0000000995 0.0000000068 -0.0000000001 -0.0000000902 > + 0.0000000040 +CT 1 -0.5251394459 -0.9095681227 0.3261862484 -- FOR W= 0.385897I A.U. + 1.7655110334 2.6390213780 1.3432067127 0.7564822699 > + -0.3722996911 -0.6448419629 0.7564822807 -0.2826156138 > + -0.4895045864 +CT 2 1.0502787886 -0.0000000012 0.3261863008 + 3.0757765004 1.3287557312 1.3432067548 -0.0000000019 > + 0.7445994238 -0.0000000012 -0.0000000032 0.5652312631 > + -0.0000000014 +CT 3 -0.5251394379 0.9095681275 0.3261862452 + 1.7655110237 2.6390214073 1.3432067123 -0.7564822642 > + -0.3722996858 0.6448419629 -0.7564822736 -0.2826156121 > + 0.4895045889 +CT 4 0.0000000197 -0.0000000007 -0.7552424478 + 2.0615238071 2.0615237871 4.0609669856 -0.0000000001 > + -0.0000000723 0.0000000038 -0.0000000001 -0.0000000628 > + 0.0000000015 +CT 1 -0.5251394459 -0.9095681227 0.3261862484 -- FOR W= 0.649114I A.U. + 1.3254123359 1.8407948667 1.0441197615 0.4463344395 > + -0.2177799930 -0.3772060037 0.4463344432 -0.1744039087 > + -0.3020764231 +CT 2 1.0502787886 -0.0000000012 0.3261863008 + 2.0984861150 1.0677209901 1.0441197828 -0.0000000013 > + 0.4355600178 -0.0000000007 -0.0000000017 0.3488078457 > + -0.0000000008 +CT 3 -0.5251394379 0.9095681275 0.3261862452 + 1.3254123303 1.8407948861 1.0441197618 -0.4463344360 > + -0.2177799897 0.3772060036 -0.4463344392 -0.1744039070 > + 0.3020764241 +CT 4 0.0000000197 -0.0000000007 -0.7552424478 + 1.4373127196 1.4373127122 2.5401152520 -0.0000000001 > + -0.0000000449 0.0000000016 -0.0000000001 -0.0000000400 > + 0.0000000006 +CT 1 -0.5251394459 -0.9095681227 0.3261862484 -- FOR W= 1.153904I A.U. + 0.7544371676 0.9664705377 0.6304831230 0.1836263153 > + -0.0875332056 -0.1516119569 0.1836263166 -0.0809326041 > + -0.1401793796 +CT 2 1.0502787886 -0.0000000012 0.3261863008 + 1.0724872198 0.6484204496 0.6304831314 -0.0000000006 > + 0.1750664281 -0.0000000004 -0.0000000007 0.1618652244 > + -0.0000000004 +CT 3 -0.5251394379 0.9095681275 0.3261862452 + 0.7544371654 0.9664705473 0.6304831234 -0.1836263138 > + -0.0875332040 0.1516119567 -0.1836263151 -0.0809326027 > + 0.1401793796 +CT 4 0.0000000197 -0.0000000007 -0.7552424478 + 0.7592675915 0.7592675904 1.2337002467 -0.0000000001 > + -0.0000000206 0.0000000005 -0.0000000001 -0.0000000198 > + 0.0000000004 +CT 1 -0.5251394459 -0.9095681227 0.3261862484 -- FOR W= 2.307592I A.U. + 0.2772777989 0.3315208426 0.2449573669 0.0469758609 > + -0.0224857973 -0.0389465433 0.0469758616 -0.0239937193 > + -0.0415583404 +CT 2 1.0502787886 -0.0000000012 0.3261863008 + 0.3586423643 0.2501562694 0.2449573698 -0.0000000002 > + 0.0449716000 -0.0000000001 -0.0000000002 0.0479874440 > + -0.0000000001 +CT 3 -0.5251394379 0.9095681275 0.3261862452 + 0.2772777984 0.3315208457 0.2449573670 -0.0469758605 > + -0.0224857968 0.0389465432 -0.0469758612 -0.0239937187 > + 0.0415583402 +CT 4 0.0000000197 -0.0000000007 -0.7552424478 + 0.2648813705 0.2648813706 0.4101197216 0.0000000000 > + -0.0000000060 0.0000000001 0.0000000000 -0.0000000062 > + 0.0000000002 +CT 1 -0.5251394459 -0.9095681227 0.3261862484 -- FOR W= 5.957643I A.U. + 0.0512660552 0.0584841771 0.0468424444 0.0062510777 > + -0.0031161605 -0.0053973484 0.0062510779 -0.0035567807 > + -0.0061605248 +CT 2 1.0502787886 -0.0000000012 0.3261863008 + 0.0620932380 0.0476569934 0.0468424450 0.0000000000 > + 0.0062323218 0.0000000000 0.0000000000 0.0071135622 > + 0.0000000000 +CT 3 -0.5251394379 0.9095681275 0.3261862452 + 0.0512660551 0.0584841776 0.0468424444 -0.0062510777 > + -0.0031161604 0.0053973483 -0.0062510779 -0.0035567806 > + 0.0061605248 +CT 4 0.0000000197 -0.0000000007 -0.7552424478 + 0.0486518312 0.0486518312 0.0733814565 0.0000000000 > + -0.0000000009 0.0000000000 0.0000000000 -0.0000000010 > + 0.0000000000 +CT 1 -0.5251394459 -0.9095681227 0.3261862484 -- FOR W=32.239080I A.U. + 0.0018921152 0.0021263995 0.0017447398 0.0002028961 > + -0.0001026324 -0.0001777645 0.0002028961 -0.0001191342 > + -0.0002063465 +CT 2 1.0502787886 -0.0000000012 0.3261863008 + 0.0022435416 0.0017749731 0.0017447398 0.0000000000 > + 0.0002052648 0.0000000000 0.0000000000 0.0002382684 > + 0.0000000000 +CT 3 -0.5251394379 0.9095681275 0.3261862452 + 0.0018921152 0.0021263995 0.0017447398 -0.0002028961 > + -0.0001026324 0.0001777645 -0.0002028961 -0.0001191342 > + 0.0002063465 +CT 4 0.0000000197 -0.0000000007 -0.7552424478 + 0.0018214181 0.0018214181 0.0027182560 0.0000000000 > + 0.0000000000 0.0000000000 0.0000000000 0.0000000000 > + 0.0000000000 + STOP + PROJECTION BASIS SET +A01N1 0.0000000000 0.0000000000 -0.1193880985 5.0 + S 6 + 1 6293.4800000000 0.99196821 + 2 949.0440000000 1.82323973 + 3 218.7760000000 2.97989064 + 4 63.6916000000 4.00000703 + 5 18.8282000000 3.88100769 + 6 2.7202300000 0.38676433 + L 3 + 7 30.6331000000 1.03850116 3.93561562 + 8 7.0261400000 2.83479441 3.87099402 + 9 2.1120500000 -0.00320800 2.96727076 + L 1 + 10 0.6840090000 0.53605142 0.88668091 + L 1 + 11 0.2008780000 0.21385006 0.19169269 + L 1 + 12 0.0639000000 0.09058071 0.04579480 + D 1 + 13 3.6520000000 15.87955404 + D 1 + 14 0.9130000000 1.40356754 + D 1 + 15 0.2282500000 0.12405902 + F 1 + 16 1.0000000000 1.47215809 + +A02H2 -0.8821076766 -1.5278551402 0.5529398549 1.0 + S 3 + 17 33.8650000000 0.25506932 + 18 5.0947900000 0.46010866 + 19 1.1587900000 0.67832145 + S 1 + 20 0.3258400000 0.30737135 + S 1 + 21 0.1027410000 0.12933556 + S 1 + 22 0.0360000000 0.05890294 + P 1 + 23 1.5000000000 2.36621477 + P 1 + 24 0.3750000000 0.41829163 + +A03H3 -0.8821076644 1.5278551472 0.5529398549 1.0 + S 3 + 25 33.8650000000 0.25506932 + 26 5.0947900000 0.46010866 + 27 1.1587900000 0.67832145 + S 1 + 28 0.3258400000 0.30737135 + S 1 + 29 0.1027410000 0.12933556 + S 1 + 30 0.0360000000 0.05890294 + P 1 + 31 1.5000000000 2.36621477 + P 1 + 32 0.3750000000 0.41829163 + +A04H4 1.7642151525 0.0000000000 0.5529399267 1.0 + S 3 + 33 33.8650000000 0.25506932 + 34 5.0947900000 0.46010866 + 35 1.1587900000 0.67832145 + S 1 + 36 0.3258400000 0.30737135 + S 1 + 37 0.1027410000 0.12933556 + S 1 + 38 0.0360000000 0.05890294 + P 1 + 39 1.5000000000 2.36621477 + P 1 + 40 0.3750000000 0.41829163 + + STOP + MULTIPLICITY 1 + STOP + PROJECTION WAVEFUNCTION 4 75 + 1 1-5.16168414E-02-9.03966786E-02-8.62686461E-02-1.49421671E-01 6.73654870E-02 + 1 2 2.32640095E-01-1.30186262E-01-2.25489209E-01 1.05149038E-01 1.58041223E-01 + 1 3-8.02681828E-02-1.39028571E-01 8.08305120E-02 1.54846723E-02-3.97290324E-03 + 1 4-6.88126985E-03 1.97781192E-02-5.00384927E-03-2.69599511E-03-4.32747062E-03 + 1 5 2.30785458E-03-1.29371713E-03-2.24078354E-03-1.46271805E-02-2.20873954E-03 + 1 6-1.09368266E-02 1.24184443E-02-9.50762790E-03-1.64676929E-02-2.01100216E-02 + 1 7-1.98947632E-02-1.14082295E-02 2.15258801E-04-5.25569009E-03-9.10312207E-03 + 1 8-1.29773656E-03-4.56476227E-03-9.11659992E-04-2.04142421E-03 2.46945207E-03 + 1 9-2.97337020E-03 3.18784017E-03 6.00681447E-04 1.04041030E-03 7.18388606E-04 + 1 10 1.92913270E-01 2.68419337E-01 7.51818153E-02 3.84816634E-04 6.90542221E-03 + 1 11 1.19605403E-02-4.57009292E-03 1.33154826E-02 2.30630900E-02-8.22492813E-03 + 1 12-1.25262144E-02-3.75683524E-02-2.70695842E-02-2.82363073E-03-2.75999035E-03 + 1 13-4.07496680E-03 2.25477362E-03-7.06884302E-03-3.30744943E-03 6.70329016E-03 + 1 14-1.25262163E-02-3.75683536E-02-2.70695812E-02-2.82363050E-03-2.14902922E-03 + 1 15-4.42770513E-03 2.25477383E-03 6.70086638E-04-7.77552154E-03 6.70329036E-03 + 2 1 5.16168425E-02 9.03966807E-02-1.72537282E-01 4.81512760E-10-6.73654980E-02 + 2 2-2.32640101E-01-2.60372508E-01 7.12314383E-10-1.05149055E-01-1.58041231E-01 + 2 3-1.60536356E-01 6.78464419E-10-8.08305250E-02-1.54846747E-02-7.94580406E-03 + 2 4 3.92141902E-11-1.97781209E-02 1.54206808E-03 6.15777691E-03 4.32747060E-03 + 2 5 6.67366921E-12-2.58743426E-03 4.93100538E-12-4.00048085E-03 2.08364041E-02 + 2 6 1.09368255E-02-1.81175621E-11-1.90152549E-02 2.29431658E-11 1.97871362E-02 + 2 7 2.02176520E-02 1.14082287E-02 1.76217307E-11-1.05113789E-02 4.61425144E-11 + 2 8-6.60866348E-03 3.01731213E-11 9.11659977E-04 4.21003246E-12-3.54703508E-03 + 2 9-5.62478847E-04-2.11025767E-03 1.20136246E-03 1.68764307E-12-1.80274409E-11 + 2 10 1.25262170E-02 3.75683550E-02 2.70695824E-02 2.82363074E-03-4.90901937E-03 + 2 11 3.52738777E-04-2.25477414E-03-6.39875495E-03 4.46807366E-03-6.70329063E-03 + 2 12 1.25262170E-02 3.75683551E-02 2.70695827E-02 2.82363077E-03-4.90901938E-03 + 2 13-3.52738725E-04-2.25477414E-03-6.39875503E-03-4.46807363E-03-6.70329065E-03 + 2 14-1.92913272E-01-2.68419334E-01-7.51818098E-02-3.84816609E-04 1.38108431E-02 + 2 15 2.23597342E-11 4.57009349E-03 2.66309616E-02 3.61810897E-12 8.22492900E-03 + 3 1-5.16168411E-02-9.03966781E-02-8.62686447E-02 1.49421673E-01 6.73654860E-02 + 3 2 2.32640094E-01-1.30186260E-01 2.25489212E-01 1.05149037E-01 1.58041222E-01 + 3 3-8.02681819E-02 1.39028572E-01 8.08305105E-02 1.54846721E-02-3.97290324E-03 + 3 4 6.88126995E-03 1.97781188E-02-5.00384927E-03-2.69599506E-03-4.32747061E-03 + 3 5-2.30785459E-03-1.29371711E-03 2.24078355E-03-1.46271806E-02-2.20873932E-03 + 3 6-1.09368266E-02-1.24184443E-02-9.50762773E-03 1.64676931E-02-2.01100214E-02 + 3 7-1.98947630E-02-1.14082295E-02-2.15258809E-04-5.25569005E-03 9.10312215E-03 + 3 8-1.29773657E-03 4.56476235E-03-9.11660001E-04 2.04142418E-03 2.46945202E-03 + 3 9-2.97337015E-03 3.18784015E-03 6.00681424E-04-1.04041031E-03-7.18388592E-04 + 3 10-1.25262156E-02-3.75683542E-02-2.70695848E-02-2.82363071E-03-2.75999037E-03 + 3 11 4.07496675E-03 2.25477362E-03-7.06884309E-03 3.30744933E-03 6.70329019E-03 + 3 12 1.92913271E-01 2.68419337E-01 7.51818157E-02 3.84816655E-04 6.90542211E-03 + 3 13-1.19605403E-02-4.57009295E-03 1.33154825E-02-2.30630901E-02-8.22492821E-03 + 3 14-1.25262160E-02-3.75683532E-02-2.70695812E-02-2.82363050E-03-2.14902924E-03 + 3 15 4.42770518E-03 2.25477378E-03 6.70086573E-04 7.77552164E-03 6.70329028E-03 + 4 1-6.58395641E-02-1.17915197E-01 7.65222435E-09-3.02027805E-10-2.25392567E-01 + 4 2 3.09874245E-01 1.11766732E-08-4.51260586E-10-3.27935060E-01 4.82772486E-01 + 4 3 9.21922700E-09-5.99072332E-11-3.29997506E-01 4.92674001E-02 3.73483812E-09 + 4 4-5.96070775E-11-9.03797431E-02-4.90901023E-03-4.90901020E-03-5.81235189E-03 + 4 5 6.63315141E-12 6.62159163E-11-6.44037842E-12-7.73328910E-03-7.73328968E-03 + 4 6-3.09624753E-02 3.21248982E-11 1.01695287E-09-3.51568995E-11-2.43817200E-02 + 4 7-2.43817219E-02-5.82135142E-02 3.93366148E-11 1.31143227E-09 1.17173353E-11 + 4 8 2.45863895E-03 3.60166601E-11-4.92927415E-03-1.63254212E-11-6.10849561E-03 + 4 9-3.29860992E-03-6.10849541E-03-3.82013956E-11 2.99030934E-12-1.47008396E-11 + 4 10-6.28754927E-03-5.53684768E-02-1.38240969E-02-3.54556692E-03-4.94923502E-04 + 4 11-8.57232960E-04-8.14357410E-03-7.14544561E-03-1.23762763E-02-1.44751110E-02 + 4 12-6.28754965E-03-5.53684775E-02-1.38240971E-02-3.54556679E-03-4.94923515E-04 + 4 13 8.57232985E-04-8.14357408E-03-7.14544566E-03 1.23762765E-02-1.44751110E-02 + 4 14-6.28754820E-03-5.53684767E-02-1.38240972E-02-3.54556837E-03 9.89847607E-04 + 4 15-1.27259490E-11-8.14357427E-03 1.42908929E-02-9.28680553E-11-1.44751102E-02 + FOCK MATRIX ELEMENTS + -0.7788656494 0.1422818701 -0.7788656580 -0.1422818783 > + 0.1422818701 -0.7788656479 -0.1333910398 0.1333910427 > + -0.1333910386 -0.5099993592 + LMO CENTROIDS +CT1 -0.5251394459 -0.9095681227 0.3261862484 +CT2 1.0502787886 -0.0000000012 0.3261863008 +CT3 -0.5251394379 0.9095681275 0.3261862452 +CT4 0.0000000197 -0.0000000007 -0.7552424478 + STOP + CANONVEC 5 75 + 1 1 5.57492668E-01 4.69366134E-01-1.36809268E-10 0.00000000E+00 3.00040169E-03 + 1 2-6.40311700E-04 2.62461541E-10 0.00000000E+00-5.44813122E-03-3.06922692E-03 + 1 3 0.00000000E+00-2.00322977E-11 2.54676147E-04-3.24590938E-04 0.00000000E+00 + 1 4 0.00000000E+00-2.95636693E-06 1.46232633E-03 1.46232632E-03 1.34926082E-03 + 1 5 0.00000000E+00 0.00000000E+00 0.00000000E+00 2.23858280E-03 2.23858278E-03 + 1 6 2.33181638E-03 0.00000000E+00 0.00000000E+00 0.00000000E+00 1.00875092E-03 + 1 7 1.00875091E-03 1.00692173E-03 0.00000000E+00 0.00000000E+00 0.00000000E+00 + 1 8 1.73547516E-04 0.00000000E+00 2.65557106E-03 0.00000000E+00 1.32870464E-03 + 1 9-2.32838673E-04 1.32870460E-03-4.80852059E-11 0.00000000E+00 0.00000000E+00 + 1 10 1.36358001E-04 1.00540711E-04-2.02100922E-04 8.14069279E-05-2.73869555E-07 + 1 11-4.74371412E-07 9.60437187E-06 1.10877692E-05 1.92046098E-05 2.90922651E-06 + 1 12 1.36358003E-04 1.00540731E-04-2.02100917E-04 8.14069256E-05-2.73885365E-07 + 1 13 4.74365094E-07 9.60436811E-06 1.10878025E-05-1.92045976E-05 2.90922420E-06 + 1 14 1.36357999E-04 1.00540692E-04-2.02100928E-04 8.14069400E-05 5.47753828E-07 + 1 15 0.00000000E+00 9.60437015E-06-2.21755581E-05 0.00000000E+00 2.90922992E-06 + 2 1-1.06491428E-01-1.87388406E-01-1.54242977E-09 1.28042425E-10 3.28628696E-02 + 2 2 4.84439182E-01-2.72154595E-09 2.05493312E-10 5.94328526E-02 4.21904306E-01 + 2 3-8.63237591E-10 5.13821098E-11 1.91315089E-02 4.20077782E-02-1.22126142E-11 + 2 4 0.00000000E+00 1.39731623E-03-7.94223671E-03-7.94223696E-03-9.02776012E-03 + 2 5 0.00000000E+00 4.14547144E-11 0.00000000E+00-1.63431717E-02-1.63431735E-02 + 2 6-2.83628284E-02 6.24570497E-11 4.22220928E-11 4.03543968E-11-4.08812780E-02 + 2 7-4.08812781E-02-3.84194923E-02 0.00000000E+00-1.68183184E-10 0.00000000E+00 + 2 8 3.01632818E-03 2.27064075E-11-3.16471627E-03-2.74634101E-11 2.52373363E-03 + 2 9-4.04682964E-03 2.52373305E-03 2.05312999E-10 0.00000000E+00 1.04201333E-11 + 2 10 8.89670845E-02 8.60351145E-02 6.70915642E-03-4.06489115E-03 4.74580655E-03 + 2 11 8.21997722E-03-2.80876473E-03 4.42790806E-03 7.66936112E-03-2.12167433E-03 + 2 12 8.89670846E-02 8.60351145E-02 6.70915644E-03-4.06489113E-03 4.74580649E-03 + 2 13-8.21997726E-03-2.80876473E-03 4.42790802E-03-7.66936116E-03-2.12167433E-03 + 2 14 8.89670862E-02 8.60351149E-02 6.70915614E-03-4.06489141E-03-9.49161240E-03 + 2 15 0.00000000E+00-2.80876520E-03-8.85581528E-03 0.00000000E+00-2.12167467E-03 + 3 1 1.08371345E-09 2.10515859E-09-2.11240913E-01-5.56316329E-03-6.26799028E-09 + 3 2-5.78192370E-09-3.18779372E-01-8.39525673E-03-9.58372009E-09-1.00878870E-08 + 3 3-1.96547935E-01-5.17621445E-03-6.88977124E-09-2.38713481E-09-9.72821077E-03 + 3 4-2.56198604E-04-3.57979822E-10-2.82555282E-03 2.82555335E-03 0.00000000E+00 + 3 5 8.59244459E-05-3.16784846E-03-8.34272919E-05-1.52041502E-02 1.52041529E-02 + 3 6-7.22558107E-10 4.62354918E-04-2.32807643E-02-6.13113660E-04-2.63543413E-04 + 3 7 2.63546313E-04-1.89568773E-10 8.01437865E-06-1.28692959E-02-3.38921075E-04 + 3 8-6.45331110E-03-1.69952017E-04 2.39572924E-11-7.60049036E-05-8.79537808E-04 + 3 9-2.88600798E-03 8.79537556E-04 1.47085270E-03 3.87358362E-05 2.67465379E-05 + 3 10 8.76656416E-02 1.30571817E-01 4.36329657E-02 1.36911654E-03-2.13510138E-03 + 3 11 6.97890466E-03-2.91232407E-03-2.29398701E-03 1.47766630E-02-6.37020600E-03 + 3 12 8.00168613E-02 1.19179496E-01 3.98260129E-02 1.24966187E-03-2.49495737E-03 + 3 13-6.68531444E-03-2.65822538E-03-3.05292219E-03-1.40411347E-02-5.81440897E-03 + 3 14-1.67682500E-01-2.49751305E-01-8.34589738E-02-2.61877809E-03 9.51853074E-03 + 3 15-1.64849216E-04 5.57054946E-03 2.22834861E-02-2.89492798E-04 1.21846155E-02 + 4 1 1.28474130E-10 2.38824891E-10-5.56316334E-03 2.11240913E-01-1.09520581E-10 + 4 2-6.31265119E-10-8.39525680E-03 3.18779371E-01-1.93492164E-10-1.20168449E-09 + 4 3-5.17621471E-03 1.96547943E-01-2.02523382E-10-1.94461636E-10-2.56198639E-04 + 4 4 9.72821223E-03 0.00000000E+00-7.44127429E-05 7.44127781E-05 0.00000000E+00 + 4 5-3.26266801E-03-8.34272936E-05 3.16784811E-03-4.00411081E-04 4.00411207E-04 + 4 6 0.00000000E+00-1.75562452E-02-6.13113666E-04 2.32807628E-02-6.94050330E-06 + 4 7 6.94077110E-06 5.95458571E-11-3.04316407E-04-3.38921098E-04 1.28692967E-02 + 4 8-1.69952074E-04 6.45331126E-03 1.21478098E-11 2.88600914E-03-2.31632006E-05 + 4 9-7.60048245E-05 2.31632013E-05 3.87358288E-05-1.47085238E-03-1.01560277E-03 + 4 10-1.43009290E-01-2.13002298E-01-7.11786253E-02-2.23344493E-03-6.89307769E-03 + 4 11-5.39408189E-03 4.75088476E-03-1.44793061E-02-1.35850381E-02 1.03917410E-02 + 4 12 1.47425316E-01 2.19579658E-01 7.33765708E-02 2.30241216E-03 6.77114208E-03 + 4 13-5.75393785E-03-4.89758873E-03 1.43384918E-02-1.43439733E-02-1.07126305E-02 + 4 14-4.41602522E-03-6.57735938E-03-2.19794528E-03-6.89671926E-05 2.50676549E-04 + 4 15 6.25955035E-03 1.46703957E-04 5.86849718E-04 1.09924368E-02 3.20889611E-04 + 5 1-3.14216310E-02-5.74826754E-02 6.38513997E-09 8.96801860E-11-2.51666781E-01 + 5 2 1.53964184E-01 9.38372451E-09 1.32254242E-10-3.70375625E-01 3.60551129E-01 + 5 3 7.96662503E-09 3.43162013E-10-3.57956780E-01 3.71745690E-02 3.87063768E-09 + 5 4-4.20825936E-11-9.66440247E-02-2.34199929E-03-2.34199910E-03-2.90929328E-03 + 5 5 0.00000000E+00 2.07045252E-11 0.00000000E+00-2.30014236E-03-2.30014199E-03 + 5 6-2.26509900E-02-3.37956636E-11 8.11421317E-10 0.00000000E+00-1.11120009E-02 + 5 7-1.11120029E-02-4.79916548E-02 4.30123356E-11 1.31498978E-09 4.04077363E-11 + 5 8 1.52158972E-03 3.67797697E-11-4.09581327E-03 0.00000000E+00-7.41270589E-03 + 5 9-2.04142629E-03-7.41270545E-03-9.89690201E-11 0.00000000E+00-2.19133354E-11 + 5 10-3.89462631E-02-9.00907977E-02-1.71374019E-02-2.29756679E-03-2.24721281E-03 + 5 11-3.89228665E-03-7.64394283E-03-9.20614063E-03-1.59455044E-02-1.46279588E-02 + 5 12-3.89462629E-02-9.00907976E-02-1.71374018E-02-2.29756665E-03-2.24721277E-03 + 5 13 3.89228667E-03-7.64394283E-03-9.20614060E-03 1.59455045E-02-1.46279589E-02 + 5 14-3.89462650E-02-9.00908015E-02-1.71374033E-02-2.29756828E-03 4.49442603E-03 + 5 15 0.00000000E+00-7.64394277E-03 1.84122828E-02-7.61477253E-11-1.46279577E-02 + 6 1 1.61265197E-02 4.55362898E-02 1.86122829E-09-4.45752318E-11-2.04403406E-02 + 6 2-4.26463842E-02 2.79324524E-09-7.23804925E-11-3.29946156E-02-2.62658242E-01 + 6 3 3.24374857E-09-2.95085310E-10-6.03221328E-02-2.75404862E+00 3.20630958E-08 + 6 4-1.58269528E-09-2.68470045E-01 1.11282763E-02 1.11282763E-02 1.12266809E-02 + 6 5 0.00000000E+00 1.30781660E-11 0.00000000E+00 4.23294431E-02 4.23294433E-02 + 6 6 4.04281437E-02 0.00000000E+00 8.23100875E-11 0.00000000E+00 1.61698626E-01 + 6 7 1.61698630E-01 1.83563187E-01-6.45418333E-11 3.34398787E-10-1.26739545E-10 + 6 8-7.50937790E-04-2.08927819E-11-8.10914231E-04 0.00000000E+00-1.50884001E-03 + 6 9 1.00748912E-03-1.50883985E-03 0.00000000E+00 0.00000000E+00 0.00000000E+00 + 6 10 1.91724215E-03 8.55831066E-03 3.05988184E-01 8.86506858E-01-1.76934676E-03 + 6 11-3.06459830E-03 4.71170663E-04 1.48945721E-03 2.57981636E-03-1.87066599E-03 + 6 12 1.91724211E-03 8.55831075E-03 3.05988185E-01 8.86506860E-01-1.76934674E-03 + 6 13 3.06459832E-03 4.71170665E-04 1.48945726E-03-2.57981637E-03-1.87066597E-03 + 6 14 1.91724222E-03 8.55831382E-03 3.05988181E-01 8.86506838E-01 3.53869343E-03 + 6 15 0.00000000E+00 4.71170804E-04-2.97891629E-03 5.37547728E-11-1.87066727E-03 + 7 1 2.09647973E-10 9.51566935E-10-3.63121495E-02-1.19088613E-03-1.33801011E-09 + 7 2 1.35108657E-09-4.93266051E-02-1.61770566E-03-1.82440820E-09-1.49772748E-08 + 7 3 3.00945495E-01 9.86974869E-03 4.81887392E-09-5.51900216E-09-7.38696834E-01 + 7 4-2.42261559E-02-1.41998935E-08-8.39189280E-04 8.39190100E-04 2.84424255E-10 + 7 5 3.17795610E-05-8.15216493E-04-2.67356758E-05 4.95986561E-03-4.95986327E-03 + 7 6 1.89824489E-09-1.87826788E-04 2.56338047E-03 8.40681001E-05 3.70291551E-02 + 7 7-3.70291497E-02 9.28666170E-09-1.40226956E-03 6.15278463E-02 2.01785494E-03 + 7 8-1.14922151E-03-3.76896719E-05-1.01173695E-10-1.68553289E-05 3.26804968E-04 + 7 9-5.13947159E-04-3.26805671E-04-4.58239483E-04-1.50283448E-05-1.23758970E-05 + 7 10 3.54123445E-03 1.07708362E-01 1.53732722E-01-1.80427837E+00-4.85231665E-04 + 7 11-1.70946313E-04-3.43257547E-04 6.27701448E-03 4.94385116E-02-1.55987904E-02 + 7 12 3.16054645E-03 9.61295544E-02 1.37206224E-01-1.61031576E+00-4.75423676E-04 + 7 13 1.28115558E-04-3.06356856E-04 3.16236466E-03-4.55324530E-02-1.39218974E-02 + 7 14-6.70178118E-03-2.03837898E-01-2.90938984E-01 3.41459417E+00-7.39323142E-04 + 7 15-1.29214178E-05 6.49614333E-04 8.69669496E-02-7.44335810E-04 2.95206891E-02 + 8 1-2.13708281E-11-7.90847208E-11 1.19088612E-03-3.63121503E-02 7.32591457E-11 + 8 2-1.33613785E-10 1.61770565E-03-4.93266064E-02 1.06736598E-10 1.87484137E-09 + 8 3-9.86974847E-03 3.00945472E-01 1.68326808E-10-1.19800000E-09 2.42261549E-02 + 8 4-7.38696799E-01-1.33447233E-10 2.75218768E-05-2.75219361E-05-2.00526319E-11 + 8 5 9.69012811E-04 2.67356764E-05-8.15216333E-04-1.62662855E-04 1.62662686E-04 + 8 6-1.46438914E-10-5.72715803E-03-8.40680967E-05 2.56337936E-03-1.21440162E-03 + 8 7 1.21440091E-03-6.82043818E-10-4.27575915E-02-2.01785490E-03 6.15278375E-02 + 8 8 3.76896916E-05-1.14922277E-03 2.20531987E-11-5.13947948E-04-1.07178011E-05 + 8 9 1.68553102E-05 1.07178818E-05 1.50283473E-05-4.58240106E-04-3.77362142E-04 + 8 10 5.69401763E-03 1.73186272E-01 2.47189788E-01-2.90113316E+00-1.33778519E-04 + 8 11-6.48087771E-04-5.51929932E-04 4.73306973E-02 5.79938700E-02-2.50815871E-02 + 8 12-5.91380794E-03-1.79871302E-01-2.56731364E-01 3.01311753E+00 1.65283986E-04 + 8 13-6.57895734E-04 5.73234556E-04-4.76402691E-02 6.11085198E-02 2.60497419E-02 + 8 14 2.19790323E-04 6.68502700E-03 9.54158083E-03-1.11984371E-01 2.42467261E-05 + 8 15-3.93996097E-04-2.13046120E-05-2.85215103E-03-2.26960666E-02-9.68154790E-04 + 9 1-5.22092762E-03 4.40123028E-03 3.30470529E-09-6.08916190E-11-8.85096572E-02 + 9 2 1.02626336E-01 4.38736960E-09-9.40252645E-11-1.33405163E-01-4.85255874E-01 + 9 3 2.01741816E-08-5.37369797E-10-5.80264391E-01 4.56181498E+00-1.11336463E-07 + 9 4 4.79344948E-09 2.03538883E+00 9.23287961E-03 9.23287937E-03 6.83230916E-03 + 9 5 0.00000000E+00 0.00000000E+00 0.00000000E+00 2.56386033E-02 2.56386073E-02 + 9 6 4.61622644E-02-1.23443282E-10 0.00000000E+00-7.96121214E-11 1.86163274E-01 + 9 7 1.86163267E-01 1.45132101E-01 2.60875947E-10-1.25284054E-10-2.34759692E-11 + 9 8-5.72143880E-03-1.28697903E-10 1.64101397E-02 2.95611754E-11-3.46875693E-03 + 9 9 7.67611731E-03-3.46875559E-03-6.61147179E-10-3.37522399E-11-2.98576560E-11 + 9 10-2.19299768E-02 2.43629452E-01-1.55049743E+00-4.39120147E-01 1.25188595E-03 + 9 11 2.16832993E-03-1.76980553E-03 3.22077013E-02 5.57853652E-02 6.35800276E-03 + 9 12-2.19299767E-02 2.43629453E-01-1.55049743E+00-4.39120150E-01 1.25188594E-03 + 9 13-2.16832994E-03-1.76980553E-03 3.22077007E-02-5.57853655E-02 6.35800264E-03 + 9 14-2.19299783E-02 2.43629453E-01-1.55049745E+00-4.39120136E-01-2.50377188E-03 + 9 15 0.00000000E+00-1.76980593E-03-6.44153974E-02-1.35568396E-10 6.35800162E-03 +10 1 5.20082458E-10 3.48999294E-10 3.35524260E-05-1.35379775E-03-2.71475106E-10 +10 2-4.41528853E-09-7.57504213E-05 3.05643224E-03-4.68688717E-10-3.28201803E-09 +10 3-7.10628648E-03 2.86729565E-01 3.71228664E-10 7.05419187E-08-8.27361741E-02 +10 4 3.33829873E+00 3.71481199E-09 1.34514052E-05-1.34520569E-05-3.43773120E-10 +10 5 6.26725157E-04-6.03922245E-06 2.43674940E-04 4.34555266E-04-4.34558022E-04 +10 6-1.26701043E-09 2.02462872E-02 4.36079052E-04-1.75952304E-02-2.87465574E-03 +10 7 2.87464397E-03-7.15314579E-09-1.33931879E-01-3.78203520E-03 1.52600273E-01 +10 8-3.94568626E-04 1.59203390E-02-4.75886460E-11 7.11979159E-03 1.36373578E-06 +10 9-1.76456466E-04-1.36375577E-06-1.90716752E-04 7.69517661E-03 6.35375990E-05 +10 10 4.16429531E-02 1.62096680E-01 2.56258730E+00 1.92463996E+00-6.13525808E-03 +10 11-5.10942192E-03 3.18241355E-03 4.41154452E-02 8.47325782E-02-1.57085112E-02 +10 12-4.28519921E-02-1.66802907E-01-2.63698810E+00-1.98051895E+00 6.04736176E-03 +10 13-5.41135512E-03-3.27481001E-03-4.57975554E-02 8.69609774E-02 1.61645839E-02 +10 14 1.20903934E-03 4.70622888E-03 7.44007822E-02 5.58789565E-02 2.17533837E-04 +10 15 5.29006917E-03 9.23965180E-05-2.77090355E-03 7.97984819E-03-4.56072567E-04 +11 1-1.41626753E-09-1.39046937E-09-1.35380280E-03-3.35525448E-05 2.00427618E-09 +11 2 9.52222923E-09 3.05642434E-03 7.57502518E-05 3.51575743E-09 5.53417217E-08 +11 3 2.86729603E-01 7.10628852E-03 2.13923717E-08-1.42572651E-07 3.33829897E+00 +11 4 8.27361824E-02 6.98934038E-08-5.42759285E-04 5.42760443E-04 7.62125573E-10 +11 5 1.55327195E-05 2.43674893E-04 6.03922249E-06-1.75337939E-02 1.75338002E-02 +11 6 1.15503504E-09 5.01782747E-04-1.75952327E-02-4.36079046E-04 1.15988401E-01 +11 7-1.15988388E-01 2.02885408E-08-3.31935983E-03 1.52600303E-01 3.78203596E-03 +11 8 1.59203387E-02 3.94568658E-04 9.29802820E-10 1.76456430E-04-5.50244179E-05 +11 9 7.11979179E-03 5.50252709E-05 7.69517705E-03 1.90716763E-04 1.57469095E-06 +11 10 2.54386460E-02 9.90208412E-02 1.56542118E+00 1.17571499E+00 1.62228364E-03 +11 11-6.22168231E-03 1.94405764E-03 3.50496877E-02 4.70841188E-02-9.59593600E-03 +11 12 2.33445288E-02 9.08694132E-02 1.43655522E+00 1.07892977E+00 1.92421695E-03 +11 13 5.96093606E-03 1.78402222E-03 3.28212886E-02-4.28288766E-02-8.80599540E-03 +11 14-4.87831769E-02-1.89890290E-01-3.00197637E+00-2.25464468E+00-8.77720753E-03 +11 15 1.31108759E-04-3.72808012E-03 1.11802432E-01 1.97771907E-04 1.84019413E-02 +12 1 4.60380443E-02 2.49422155E-02 2.89896280E-09-4.98937965E-11-1.05349252E-02 +12 2-4.32708645E-01 5.29211225E-09-1.41097435E-10-2.07083824E-02 1.22524342E-01 +12 3 7.60368148E-09-1.70922891E-09 1.89507606E-01 7.12957839E+00 6.60975048E-09 +12 4-2.91880329E-08 5.41359420E-01-3.27258184E-02-3.27258183E-02-3.30231589E-02 +12 5 0.00000000E+00 0.00000000E+00 0.00000000E+00-1.36332729E-01-1.36332728E-01 +12 6-1.32496746E-01-2.02676020E-10-1.38232086E-10 1.60066680E-10-6.18856875E-01 +12 7-6.18856895E-01-7.16467595E-01 1.65811803E-09 2.31571788E-09-9.39529724E-10 +12 8 1.34397877E-03-1.07801249E-10 3.93045285E-04-6.39350942E-11 1.72623544E-03 +12 9-1.80313638E-03 1.72623541E-03 1.35005998E-10-5.26890629E-11 0.00000000E+00 +12 10 1.97036535E-03-4.71213362E-02-8.06643916E-01-1.11869531E+00-1.36610906E-03 +12 11-2.36617019E-03 1.57614734E-03-5.00844229E-02-8.67487608E-02 2.90186470E-02 +12 12 1.97036615E-03-4.71213340E-02-8.06643867E-01-1.11869527E+00-1.36610917E-03 +12 13 2.36617033E-03 1.57614741E-03-5.00844216E-02 8.67487596E-02 2.90186466E-02 +12 14 1.97036408E-03-4.71213525E-02-8.06644004E-01-1.11869536E+00 2.73221688E-03 +12 15-4.94741244E-11 1.57614704E-03 1.00168848E-01-2.91411020E-10 2.90186555E-02 +13 1 2.47100891E-09 1.94924680E-09-1.28030778E-01-2.03646050E-02-9.10645084E-09 +13 2-2.15129742E-08-2.19698722E-01-3.49453288E-02-1.57841607E-08-1.72656346E-07 +13 3-1.90905991E+00-3.03655483E-01-1.26504348E-07-7.02067023E-07 4.64719427E-01 +13 4 7.39184039E-02-9.98018142E-08 1.92955607E-03-1.92955891E-03-1.47945182E-09 +13 5-3.54395930E-04 1.50052528E-03 2.38673838E-04-1.12914151E-02 1.12914063E-02 +13 6-8.25984260E-09 2.07385897E-03-1.96864089E-02-3.13132432E-03-2.10840641E-01 +13 7 2.10840598E-01-4.13844994E-08 3.87244544E-02-2.86507052E-01-4.55718682E-02 +13 8-2.99066197E-03-4.75694507E-04 1.34734743E-09-2.12737254E-04-1.80820916E-03 +13 9-1.33746475E-03 1.80821074E-03 6.47499570E-03 1.02991463E-03 3.32108253E-04 +13 10 4.29060857E-03-5.13482295E-01-1.81887629E+00 1.58635480E+00 2.97805435E-03 +13 11 1.53848967E-02-5.16218033E-03-4.02069682E-02-1.86678321E-01 6.04198259E-02 +13 12 2.43711913E-03-2.91664144E-01-1.03314354E+00 9.01068625E-01-1.11698785E-03 +13 13-1.03603280E-02-2.93218066E-03 9.30387394E-03 1.24592680E-01 3.43191889E-02 +13 14-6.72772053E-03 8.05146479E-01 2.85202083E+00-2.48742337E+00 2.32265557E-02 +13 15-1.03412585E-03 8.09436186E-03-2.85020167E-01 1.18348200E-02-9.47390341E-02 +14 1 7.04444334E-10 6.56048479E-10-2.03646047E-02 1.28030780E-01-2.29967900E-09 +14 2-5.56715831E-09-3.49453287E-02 2.19698723E-01-3.93187330E-09-5.64075583E-08 +14 3-3.03655499E-01 1.90905976E+00-3.28592078E-08-2.39803242E-07 7.39183826E-02 +14 4-4.64719624E-01-3.57358708E-08 3.06915533E-04-3.06916205E-04-3.81298058E-10 +14 5 2.22806116E-03 2.38673884E-04-1.50052488E-03-1.79601552E-03 1.79601338E-03 +14 6-2.00467294E-09-1.30381989E-02-3.13132461E-03 1.96864063E-02-3.35363660E-02 +14 7 3.35363521E-02-9.02622005E-09-2.43457799E-01-4.55718754E-02 2.86506988E-01 +14 8-4.75695220E-04 2.99065585E-03 4.00966953E-10 1.33746293E-03-2.87614063E-04 +14 9-2.12737374E-04 2.87614516E-04 1.02991435E-03-6.47499820E-03-2.08794011E-03 +14 10-5.29131839E-03 6.33243825E-01 2.24310063E+00-1.95634691E+00-1.27246040E-02 +14 11-1.37470270E-02 6.36617678E-03 1.53177784E-01 1.70408516E-01-7.45117914E-02 +14 12 6.36143304E-03-7.61310594E-01-2.69674345E+00 2.35199707E+00 1.30206253E-02 +14 13-1.78420681E-02-7.65366768E-03-1.58093233E-01 2.19919349E-01 8.95809998E-02 +14 14-1.07011228E-03 1.28066785E-01 4.53643141E-01-3.95650133E-01 3.69442158E-03 +14 15 6.50147328E-03 1.28749108E-03-4.53353753E-02-7.44046444E-02-1.50692132E-02 +15 1-2.16006583E-02-2.54537123E-02-1.37844285E-08 1.69428594E-09 6.07087232E-02 +15 2 1.21796312E-01-2.41375172E-08 2.97567782E-09 1.06228121E-01 2.76003346E+00 +15 3-2.68960312E-07 3.10854408E-08 1.12107856E+00 1.08518691E+01-2.42523691E-07 +15 4 1.19432603E-08 1.71485528E+00 6.26199445E-03 6.26199452E-03 1.00125531E-02 +15 5 1.30503612E-11 1.46925656E-10-3.25237427E-11 2.36939344E-02 2.36939367E-02 +15 6 3.95077177E-02-1.92609463E-10-2.18909255E-09 2.68980768E-10 2.58022523E-01 +15 7 2.58022543E-01 1.17118179E-01-2.81600955E-09-4.16785259E-08 5.49872268E-09 +15 8 3.35368997E-04 1.46995129E-10-1.11076982E-02 6.08526791E-11-1.42057069E-03 +15 9-4.49946137E-04-1.42057023E-03 6.62805741E-10-3.12773417E-11-2.97138555E-11 +15 10-2.62425122E-02-4.01919745E-01-4.60794152E+00-4.87366596E-01 1.00027597E-02 +15 11 1.73252877E-02-1.59262855E-03-1.25513365E-01-2.17395535E-01 5.89690843E-02 +15 12-2.62425119E-02-4.01919767E-01-4.60794160E+00-4.87366554E-01 1.00027599E-02 +15 13-1.73252882E-02-1.59262875E-03-1.25513369E-01 2.17395542E-01 5.89690863E-02 +15 14-2.62425132E-02-4.01919632E-01-4.60794106E+00-4.87366763E-01-2.00055165E-02 +15 15 9.45772235E-11-1.59262809E-03 2.51026695E-01-1.74358235E-09 5.89690879E-02 +16 1-8.51699057E-11-1.58569694E-10 1.28955119E-03-5.37211092E-02 2.16416106E-10 +16 2 1.31392777E-09 1.34183352E-03-5.58991261E-02 2.06691189E-10-2.65531531E-08 +16 3-8.73584505E-03 3.63924446E-01-6.93682122E-09-4.18683033E-08-3.34177033E-02 +16 4 1.39214030E+00-8.31597727E-09-2.80906313E-04 2.80906337E-04-5.07447571E-11 +16 5-1.35125453E-02 9.96341108E-05-4.15063556E-03-4.30782914E-04 4.30782652E-04 +16 6 3.12727062E-10-2.07221082E-02-5.78541332E-04 2.41013165E-02-2.01922724E-02 +16 7 2.01922716E-02 8.16329507E-10-9.71316628E-01 3.88512114E-03-1.61849479E-01 +16 8-7.67008508E-04 3.19526245E-02-2.03110619E-10 1.42896485E-02-2.22695269E-04 +16 9-3.43016565E-04 2.22694825E-04-1.33297143E-04 5.55299178E-03-1.07123854E-02 +16 10-8.37732866E-02-4.14029626E-02 2.16641216E+00 1.96341818E-01 8.34434675E-04 +16 11-1.15347791E-02 7.21292351E-03 1.24276748E-01 2.08261895E-01-1.31177107E-01 +16 12 8.61279531E-02 4.25667110E-02-2.22730481E+00-2.01860515E-01-2.51194343E-04 +16 13-1.15087190E-02-7.41566147E-03-1.27443070E-01 2.14304313E-01 1.34864180E-01 +16 14-2.35466797E-03-1.16373130E-03 6.08927013E-02 5.51870206E-03 2.69051575E-04 +16 15-1.24619334E-02 2.02738131E-04-6.81605702E-03-6.71261719E-03-3.68707732E-03 +17 1 4.77907065E-10 6.60093116E-11-5.37210814E-02-1.28955032E-03-2.92418097E-09 +17 2-1.42541851E-08-5.58990932E-02-1.34183251E-03-2.51009228E-09 2.92767369E-07 +17 3 3.63924016E-01 8.73583049E-03 7.53485325E-08 4.40295378E-07 1.39214007E+00 +17 4 3.34176959E-02 1.12834305E-07 1.17022081E-02-1.17022093E-02-7.73526295E-11 +17 5-3.24362717E-04-4.15063786E-03-9.96342272E-05 1.79458544E-02-1.79458569E-02 +17 6-4.59873881E-09-4.97424558E-04 2.41013123E-02 5.78541115E-04 8.41184826E-01 +17 7-8.41184839E-01-2.60692863E-08-2.33160253E-02-1.61849755E-01-3.88513339E-03 +17 8 3.19526151E-02 7.67008085E-04 2.72255547E-09 3.43016465E-04 9.27720005E-03 +17 9 1.42896435E-02-9.27719426E-03 5.55298600E-03 1.33296866E-04-2.57146055E-04 +17 10-5.10854394E-02-2.52479730E-02 1.32109085E+00 1.19730479E-01-1.21355082E-02 +17 11 2.66244233E-04 4.39848423E-03 6.89738253E-02 1.30931531E-01-7.99925612E-02 +17 12-4.70070380E-02-2.32323064E-02 1.21562168E+00 1.10171806E-01-1.21615684E-02 +17 13-8.19392846E-04 4.04733157E-03 6.29314075E-02-1.20788024E-01-7.36063619E-02 +17 14 9.80924901E-02 4.84800764E-02-2.53671307E+00-2.29902358E-01-1.12083495E-02 +17 15-2.99143202E-04-8.44581853E-03 2.83948226E-01-1.61131558E-04 1.53598976E-01 +18 1 1.49136534E-10 4.68752002E-10-9.74235796E-04 8.64366174E-02 1.23513654E-10 +18 2 1.52044658E-10-1.16349080E-03 1.03227786E-01 3.69765141E-10-6.08612237E-09 +18 3 1.64888430E-02-1.46293125E+00-2.75600068E-09 1.69758183E-08 1.19180661E-02 +18 4-1.05740084E+00 4.89704470E-09-2.43672401E-05 2.43676111E-05 2.85453015E-11 +18 5-2.49638307E-03 1.43403358E-04-1.27230948E-02 4.61333480E-04-4.61332597E-04 +18 6 6.18720698E-10 4.72625605E-02 1.86043490E-04-1.65062519E-02 2.36834713E-03 +18 7-2.36833906E-03-2.30397686E-09 2.42631989E-01 1.38932913E-02-1.23264695E+00 +18 8 3.75260685E-04-3.32940729E-02 1.04540922E-10-1.48895636E-02 7.52774137E-05 +18 9 1.67821695E-04-7.52774976E-05 2.81077411E-04-2.49378831E-02 7.71201453E-03 +18 10 9.68590626E-02-6.64040053E-01-2.21311694E+00 6.21899062E-02 7.76153989E-03 +18 11 6.86611316E-03 1.27040061E-03-2.79795208E-01-3.01241409E-01 1.79391300E-01 +18 12-9.81279150E-02 6.72738984E-01 2.24210873E+00-6.30045962E-02-7.71683620E-03 +18 13 7.04057153E-03-1.28704301E-03 2.79379372E-01-3.07543924E-01-1.81741325E-01 +18 14 1.26885355E-03-8.69891616E-03-2.89918258E-02 8.14689265E-04-1.28733723E-04 +18 15-6.45132395E-03 1.66421930E-05 5.25021993E-03 1.79866678E-01 2.35002559E-03 +19 1-1.06020784E-09-2.93543341E-09 8.64366347E-02 9.74236649E-04-2.87214730E-10 +19 2-2.18831866E-09 1.03227803E-01 1.16349166E-03-3.11731111E-09 5.55646581E-08 +19 3-1.46293161E+00-1.64888625E-02-7.23750239E-10-1.67473759E-07-1.05740138E+00 +19 4-1.19180902E-02-7.21425217E-08 2.16192768E-03-2.16192975E-03-1.86877648E-11 +19 5-2.81369155E-05-1.27230929E-02-1.43403274E-04-4.09305841E-02 4.09305814E-02 +19 6-5.00938028E-09 5.32701797E-04-1.65062670E-02-1.86044055E-04-2.10125645E-01 +19 7 2.10125650E-01-8.74032794E-09 2.73474015E-03-1.23264700E+00-1.38932936E-02 +19 8-3.32940895E-02-3.75261396E-04-3.64657077E-09-1.67822076E-04-6.67880302E-03 +19 9-1.48895701E-02 6.67880298E-03-2.49378891E-02-2.81077613E-04 8.69230771E-05 +19 10 5.73867642E-02-3.93428502E-01-1.31122092E+00 3.68460184E-02-1.89587000E-03 +19 11 7.81755854E-03 7.52682962E-04 1.52956041E-02-2.83018178E-01 1.06285220E-01 +19 12 5.51890436E-02-3.78361513E-01-1.26100556E+00 3.54349435E-02-2.07032848E-03 +19 13-7.66081471E-03 7.23857788E-04 2.15981272E-02 2.76156489E-01 1.02214854E-01 +19 14-1.12575817E-01 7.71789864E-01 2.57222671E+00-7.22809370E-02 1.14215665E-02 +19 15-7.27134893E-05-1.47653906E-03-4.65812575E-01 2.02729709E-03-2.08500084E-01 +20 1-2.45870159E-02-8.06653330E-02-7.81506772E-09 5.92524762E-10-3.44452292E-02 +20 2 7.86278662E-02-8.92441534E-09 7.08464535E-10-7.89097025E-02-1.93011148E+00 +20 3 1.81538918E-07-1.20597483E-08-3.94598740E-01-7.33636228E+00 2.31729395E-07 +20 4-1.53854817E-08-1.54943067E+00-3.04942021E-02-3.04942015E-02-8.77076207E-03 +20 5-1.41460522E-11 9.34351335E-11-6.98684272E-11-9.20678572E-02-9.20678584E-02 +20 6-7.75562776E-02 1.08668543E-10 2.07256760E-09-1.91374376E-10-9.93529513E-01 +20 7-9.93529482E-01 6.37325291E-01-5.44671494E-11 5.50850065E-08-8.10662942E-09 +20 8-1.03517523E-02-3.52706050E-10-2.79211325E-02-1.09744399E-11-2.63336938E-02 +20 9 1.38883399E-02-2.63336933E-02 9.64849425E-10-1.41404045E-10 1.85363152E-11 +20 10-7.76102239E-02 1.07795178E-01 3.54983165E+00 2.94089226E-01-1.81576600E-03 +20 11-3.14499990E-03 9.14887245E-03 1.46577245E-01 2.53879248E-01-1.12808564E-01 +20 12-7.76102249E-02 1.07795187E-01 3.54983168E+00 2.94089231E-01-1.81576608E-03 +20 13 3.14499999E-03 9.14887242E-03 1.46577247E-01-2.53879253E-01-1.12808566E-01 +20 14-7.76102137E-02 1.07795092E-01 3.54983134E+00 2.94089205E-01 3.63153035E-03 +20 15-4.81977327E-11 9.14887352E-03-2.93154436E-01 1.50676377E-09-1.12808560E-01 +21 1-5.04022031E-02-2.52757048E-01-4.09686266E-09 1.83998178E-10 5.50837477E-02 +21 2-2.56676454E-01-5.53698913E-09 2.40307038E-10 9.69136676E-02 1.76703396E+00 +21 3 4.58218929E-08-2.77975550E-09-2.85985024E-01 2.98009437E+00-1.33104273E-08 +21 4-1.68812633E-09 5.22415374E-02-9.80051630E-02-9.80051628E-02-1.04636935E-01 +21 5 0.00000000E+00-1.30098654E-10 1.00661099E-11-3.98276964E-01-3.98276966E-01 +21 6-3.92870154E-01 8.80713332E-11 1.63403353E-10-3.68149954E-11-1.75664594E+00 +21 7-1.75664596E+00-2.36056486E+00 1.71366307E-09 9.11108888E-09-2.68005616E-10 +21 8 1.07438706E-02 1.14299105E-10 2.45213655E-02-1.04553056E-10 2.07102700E-02 +21 9-1.44144196E-02 2.07102684E-02-4.94333780E-10 0.00000000E+00 5.05828676E-11 +21 10-5.45606517E-02-2.35029842E-01 8.10758872E-01-5.97440408E-01-1.16616450E-03 +21 11-2.01985578E-03-1.44129276E-03 4.25256396E-02 7.36565672E-02 1.70944084E-02 +21 12-5.45606518E-02-2.35029839E-01 8.10758877E-01-5.97440406E-01-1.16616447E-03 +21 13 2.01985579E-03-1.44129275E-03 4.25256398E-02-7.36565684E-02 1.70944081E-02 +21 14-5.45606520E-02-2.35029882E-01 8.10758909E-01-5.97440425E-01 2.33232819E-03 +21 15 1.44782977E-11-1.44129322E-03-8.50512715E-02 2.93158456E-10 1.70944086E-02 +22 1-5.05199616E-03 9.30901935E-02-2.66440842E-08 1.33484021E-09 2.26668644E-01 +22 2 5.50015648E-01-4.00681292E-08 1.80107324E-09 3.47268453E-01-6.79040903E+00 +22 3 5.36477823E-07-3.83316610E-08-2.25557423E+00-5.07750771E+00-3.82391036E-08 +22 4 2.13726101E-09-1.15114263E-01 6.39505721E-02 6.39505723E-02 5.48273555E-02 +22 5-1.29986463E-11-1.01583062E-09 9.57435771E-11 2.12181042E-01 2.12181044E-01 +22 6 3.44796512E-01 4.90892511E-11 1.90027730E-09-5.21736743E-10 1.46208685E+00 +22 7 1.46208677E+00 1.32237828E+00 6.02884135E-09 8.46218301E-08-7.94389646E-09 +22 8-1.26831410E-02-3.92189312E-10 5.65662914E-02 0.00000000E+00 6.27406779E-03 +22 9 1.70162188E-02 6.27406722E-03-3.63078203E-09-3.37482566E-11 1.00837362E-10 +22 10-6.36925851E-02 8.31663732E-01 1.86842323E+00 2.78447910E-01-9.84670179E-03 +22 11-1.70549871E-02 4.23040009E-03 4.80817193E-01 8.32799788E-01-1.50957493E-01 +22 12-6.36925858E-02 8.31663772E-01 1.86842326E+00 2.78447893E-01-9.84670166E-03 +22 13 1.70549871E-02 4.23040002E-03 4.80817194E-01-8.32799801E-01-1.50957496E-01 +22 14-6.36925784E-02 8.31663416E-01 1.86842298E+00 2.78448135E-01 1.96934030E-02 +22 15-3.81565493E-11 4.23040101E-03-9.61634254E-01 2.53437798E-09-1.50957499E-01 +23 1-1.11302635E-09 2.64234798E-09 2.33678176E-01 7.15232550E-03 2.77771261E-08 +23 2 2.16773278E-08 3.37849520E-01 1.03407592E-02 4.26687033E-08-2.68267210E-07 +23 3-4.64469254E+00-1.42162834E-01-2.36164083E-07-3.82511590E-07 1.19178833E+00 +23 4 3.64777671E-02 1.93060336E-08 9.01108106E-03-9.01107623E-03 3.25280249E-09 +23 5-3.18475035E-04 1.16467455E-02 3.56478774E-04-5.69755437E-02 5.69755644E-02 +23 6 1.40458046E-08 2.01366468E-03-4.39123538E-02-1.34405109E-03-5.17845660E-01 +23 7 5.17845904E-01 2.48862762E-08 1.83020188E-02-6.55518179E-01-2.00638284E-02 +23 8 4.34413136E-02 1.32963407E-03 8.32923987E-09 5.94630282E-04-8.28011628E-03 +23 9 1.94275442E-02 8.28012540E-03 3.05424486E-02 9.34830789E-04 2.92641000E-04 +23 10 2.84331813E-02-1.42279291E+00-8.90690099E-01 9.69050011E-01 3.31277482E-04 +23 11 9.25300386E-03 5.04277349E-04-1.26468789E-01-5.88887552E-01 1.60188828E-01 +23 12 2.55702483E-02-1.27953213E+00-8.01006639E-01 8.71476519E-01-2.15707054E-04 +23 13-8.61786338E-03 4.53501811E-04-9.18480298E-02 5.42228806E-01 1.44059441E-01 +23 14-5.40034419E-02 2.70232491E+00 1.69169721E+00-1.84052648E+00 1.55344160E-02 +23 15-1.56132077E-04-9.57776698E-04-1.08873402E+00 6.65307285E-03-3.04248332E-01 +24 1 1.05290479E-10-5.67651137E-10-7.15232563E-03 2.33678184E-01-1.71408536E-09 +24 2-1.55578321E-09-1.03407595E-02 3.37849539E-01-2.73763299E-09-1.10713905E-08 +24 3 1.42162830E-01-4.64469222E+00-1.54332864E-09 3.97651182E-08-3.64777661E-02 +24 4 1.19178833E+00 2.15694364E-09-2.75807901E-04 2.75807036E-04-4.61794253E-10 +24 5-1.04050983E-02-3.56478758E-04 1.16467438E-02 1.74388306E-03-1.74388651E-03 +24 6-2.02709023E-09 6.57897051E-02 1.34405107E-03-4.39123432E-02 1.58499991E-02 +24 7-1.58500340E-02-1.82758655E-09 5.97956845E-01 2.00638281E-02-6.55518043E-01 +24 8-1.32963460E-03 4.34413333E-02-4.42434120E-10 1.94275525E-02 2.53434036E-04 +24 9-5.94630133E-04-2.53435122E-04-9.34830898E-04 3.05424576E-02 9.56105785E-03 +24 10 4.59418899E-02-2.29892598E+00-1.43916322E+00 1.56577568E+00 8.93366930E-03 +24 11 1.01020493E-02 8.14800821E-04-5.62217174E-01-7.44898367E-01 2.58830586E-01 +24 12-4.75948042E-02 2.38163768E+00 1.49094196E+00-1.62210977E+00-8.93720634E-03 +24 13 1.06490330E-02-8.44116257E-04 5.68899321E-01-7.79519116E-01-2.68142895E-01 +24 14 1.65291550E-03-8.27116315E-02-5.17787840E-02 5.63340806E-02-4.75471454E-04 +24 15-5.10108977E-03 2.93150983E-05 3.33235252E-02 2.17366763E-01 9.31230853E-03 +25 1-3.97026488E-03 2.57055209E-02 1.06672216E-09 1.53283770E-09-1.19174699E-01 +25 2-1.22749053E-01 5.65531137E-09 2.21446430E-09-2.09899283E-01 5.57257416E+00 +25 3-1.26458634E-07-2.16176372E-08 2.74594426E+00-9.13641760E-01 2.28676520E-08 +25 4 5.71113241E-09-4.80502334E-01 1.85868623E-02 1.85868637E-02 1.99310241E-02 +25 5-9.21543470E-11 0.00000000E+00 4.72758119E-11 8.78540007E-02 8.78539918E-02 +25 6 4.49162594E-02 5.85084787E-10 1.86619921E-09-1.77721046E-10 1.11374573E+00 +25 7 1.11374556E+00-4.53026376E-01 9.93198515E-09 2.99663254E-08-1.94294435E-09 +25 8 4.05333928E-02 8.54155648E-10-8.10927073E-02-1.93923064E-10 5.59604331E-03 +25 9-5.43812542E-02 5.59603573E-03 3.64330066E-09 2.87001726E-10 1.98261841E-10 +25 10-4.79545357E-03-2.73178971E+00-2.44222085E-01 1.84622209E-01-1.13824169E-02 +25 11-1.97149237E-02 7.18431991E-03-2.12621267E-01-3.68270794E-01 1.63529457E-01 +25 12-4.79545405E-03-2.73178968E+00-2.44222065E-01 1.84622190E-01-1.13824169E-02 +25 13 1.97149239E-02 7.18431993E-03-2.12621258E-01 3.68270786E-01 1.63529453E-01 +25 14-4.79545521E-03-2.73178977E+00-2.44222145E-01 1.84622223E-01 2.27648350E-02 +25 15-7.74630924E-11 7.18432211E-03 4.25242498E-01 1.11013977E-09 1.63529484E-01 +26 1-1.16804827E-11-3.26270050E-11 1.24723732E-03-4.45498413E-02 1.46211575E-10 +26 2-5.72138781E-10 1.63452493E-03-5.83832898E-02 2.09820228E-10 7.57789579E-09 +26 3 1.22720470E-01-4.38343078E+00 7.23097973E-09 3.75555256E-09 4.20350550E-03 +26 4-1.50144229E-01 3.75564847E-10-3.18297582E-05 3.18297286E-05 1.07510000E-11 +26 5-1.31280310E-03-3.10766835E-05 1.11002262E-03 5.97962597E-04-5.97962618E-04 +26 6-1.31148736E-10 2.46626890E-02 6.09600884E-04-2.17742242E-02 6.42823361E-02 +26 7-6.42823418E-02 2.95268570E-09 2.65129504E+00 4.88464975E-02-1.74473922E+00 +26 8 1.73610834E-03-6.20117397E-02 1.49954650E-10-2.77325068E-02 1.33435277E-03 +26 9 7.76411377E-04-1.33435247E-03 3.88539490E-04-1.38781659E-02 5.50347467E-02 +26 10 1.05812851E-02-4.24057137E+00-6.47241216E-01 2.84563493E-02-2.20926610E-02 +26 11-2.51436648E-02 1.53418725E-02 2.04359411E-02-3.44066852E-01-2.48433617E-03 +26 12-1.09289716E-02 4.37991073E+00 6.68508673E-01-2.93913850E-02 2.21063279E-02 +26 13-2.63810792E-02-1.58459852E-02-5.09942627E-04-3.43480442E-01 2.56596690E-03 +26 14 3.47686481E-04-1.39339370E-01-2.12674607E-02 9.35034855E-04 1.07846580E-03 +26 15 1.25150543E-02 5.04113101E-04 9.45515756E-03-3.61913065E-01-8.16332084E-05 +27 1 2.51466598E-10 2.96648993E-10-4.45498483E-02-1.24723718E-03-4.86767229E-09 +27 2 2.43491202E-09-5.83833058E-02-1.63452467E-03-9.50933288E-09-1.21243302E-07 +27 3-4.38343103E+00-1.22720485E-01-1.63766744E-07-1.89944602E-08-1.50144246E-01 +27 4-4.20350447E-03-8.33047634E-09 1.13692090E-03-1.13692073E-03-1.96095038E-10 +27 5-3.67538316E-05 1.11002307E-03 3.10766979E-05-2.13585130E-02 2.13585114E-02 +27 6-7.50240836E-10 6.90467717E-04-2.17742285E-02-6.09600922E-04-2.29608869E+00 +27 7 2.29608879E+00-9.09992375E-08 7.42268534E-02-1.74473945E+00-4.88464969E-02 +27 8-6.20117496E-02-1.73610788E-03-3.53349538E-09-7.76412127E-04-4.76614916E-02 +27 9-2.77324998E-02 4.76614847E-02-1.38781745E-02-3.88539327E-04 1.54077758E-03 +27 10 6.51058197E-03-2.60919030E+00-3.98242438E-01 1.75089641E-02-8.62791483E-04 +27 11-2.28207441E-02 9.43973233E-03-3.55573481E-01 8.48487067E-04-1.52858684E-03 +27 12 5.90837113E-03-2.36784742E+00-3.61406114E-01 1.58894322E-02 3.74624016E-04 +27 13 2.13782347E-02 8.56658322E-03-3.56159903E-01-2.00973727E-02-1.38719749E-03 +27 14-1.24189506E-02 4.97703785E+00 7.59648580E-01-3.33983914E-02-3.85215250E-02 +27 15 3.50376789E-04-1.80063204E-02-3.37727056E-01-1.01322767E-02 2.91578569E-03 +28 1 0.00000000E+00 0.00000000E+00 4.84000214E-10 7.02488538E-09 0.00000000E+00 +28 2 0.00000000E+00 6.14343491E-10 8.41608300E-09 0.00000000E+00-4.05968733E-11 +28 3 2.19003659E-08 4.57663379E-07-3.54903504E-11-6.32955215E-11 5.19956297E-09 +28 4 7.71367492E-08 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +28 5 3.59506742E-10 0.00000000E+00 0.00000000E+00 1.26074289E-10-1.27666972E-10 +28 6 0.00000000E+00-3.37037681E-09 1.00608258E-10 2.02827298E-09 2.18780723E-08 +28 7-2.18744864E-08 0.00000000E+00-4.24734504E-07 1.91947474E-08 3.30298814E-07 +28 8 2.64351822E-10 2.25485334E-02 0.00000000E+00-3.02520194E-02 5.70975624E-10 +28 9 4.38560060E-10-5.66777276E-10 4.27906860E-10 6.24488323E-09-1.15309821E-08 +28 10-1.72972990E-09 5.76732167E-07 1.19796331E-07 3.06148902E-08-4.18269774E-02 +28 11 2.41488208E-02-9.94114743E-09 7.32423331E-01-4.22864746E-01 1.55023941E-07 +28 12 1.63288767E-09-5.41733295E-07-1.12669761E-07-2.77247680E-08 4.18269771E-02 +28 13 2.41488201E-02 9.30022911E-09-7.32423318E-01-4.22864737E-01-1.44686710E-07 +28 14 9.74174814E-11-3.49755265E-08-7.04941388E-09-2.87875461E-09 9.49620384E-11 +28 15-4.82976424E-02 6.41789237E-10 5.43561011E-09 8.45729765E-01-1.03408375E-08 +29 1-2.48322719E-11 4.68069334E-10-1.36575281E-02-6.60361452E-04-5.87212748E-10 +29 2 6.66755932E-09-2.38067485E-02-1.15109103E-03-1.02247611E-09-1.61857582E-07 +29 3-2.32641932E+00-1.12485783E-01-1.46399033E-07-8.37665725E-08 2.04241339E-01 +29 4 9.87536713E-03-5.32427585E-09 1.72497211E-03-1.72497126E-03 1.49330967E-10 +29 5-9.63077101E-05 1.36801341E-03 6.61454564E-05-4.63077540E-03 4.63077662E-03 +29 6 2.34506662E-09 2.58543093E-04-1.62025987E-02-7.83419396E-04-8.57248095E-01 +29 7 8.57248109E-01 8.70769928E-09 4.78614264E-02 3.63207505E-01 1.75616167E-02 +29 8-2.73899647E-02-1.32434498E-03 2.22879735E-09-5.92264818E-04 2.09416694E-03 +29 9-1.22491634E-02-2.09417160E-03 2.64323939E-02 1.27804496E-03-1.16920637E-04 +29 10 5.80710830E-04-9.40038870E-01-8.27440900E-02 1.10028879E-01-2.31376199E-02 +29 11-1.00429346E-02-3.40735972E-02 2.45745300E-01 8.41319877E-02 7.26524935E-01 +29 12 4.90961175E-04-7.94754751E-01-6.99558860E-02 9.30237878E-02-2.23184461E-02 +29 13 6.89916409E-03-2.88074832E-02 2.39113330E-01-5.30303734E-02 6.14239661E-01 +29 14-1.07167357E-03 1.73479376E+00 1.52700093E-01-2.03052655E-01-3.74003243E-02 +29 15-8.62457195E-04 6.28810730E-02 3.61215413E-01 9.80730256E-03-1.34076450E+00 +30 1 0.00000000E+00-1.86036034E-11 6.60361599E-04-1.36575295E-02 9.14627761E-11 +30 2-5.63995252E-10 1.15109133E-03-2.38067484E-02 1.30101171E-10 1.06042696E-08 +30 3 1.12485786E-01-2.32641944E+00 9.02863911E-09 8.61780624E-09-9.87536612E-03 +30 4 2.04241287E-01 9.74570632E-10-8.34049555E-05 8.34049036E-05 0.00000000E+00 +30 5-1.99182600E-03-6.61454526E-05 1.36801351E-03 2.23904851E-04-2.23904925E-04 +30 6-1.99052211E-10 5.34716187E-03 7.83419427E-04-1.62026000E-02 4.14492148E-02 +30 7-4.14492166E-02 1.03930637E-10 9.89865089E-01-1.75616122E-02 3.63207486E-01 +30 8 1.32434502E-03-2.73899663E-02-6.17872133E-11-1.22491631E-02-1.01255916E-04 +30 9 5.92265010E-04 1.01256259E-04-1.27804489E-03 2.64323921E-02-2.41813818E-03 +30 10 9.02188102E-04-1.46043572E+00-1.28550562E-01 1.70939798E-01-7.37211011E-03 +30 11-3.20999766E-02-5.29364143E-02 5.68592245E-02 3.18304081E-01 1.12872221E+00 +30 12-9.54004954E-04 1.54431554E+00 1.35933828E-01-1.80757692E-01 9.56997738E-03 +30 13-3.29191521E-02 5.59768069E-02-8.03028475E-02 3.24936085E-01-1.19355015E+00 +30 14 5.18170319E-05-8.38798328E-02-7.38327790E-03 9.81789278E-03 1.80836064E-03 +30 15-1.78372611E-02-3.04039215E-03-1.74652946E-02 2.02833789E-01 6.48279315E-02 +31 1 2.70033284E-03-7.31137084E-03 1.08984751E-08-6.06973935E-10-4.72683455E-02 +31 2-4.20964205E-02 1.76488422E-08-9.85248738E-10-8.62052496E-02-2.69832061E-01 +31 3 9.68818712E-07-5.70110843E-08-2.45108679E+00 1.17379803E+00-6.77214075E-08 +31 4 3.35369705E-09 3.42729670E-01-7.76178616E-03-7.76178580E-03-5.52400260E-03 +31 5 0.00000000E+00-3.96007340E-10 3.35239031E-11-3.57783924E-02-3.57784039E-02 +31 6-2.22412622E-02 4.40698105E-10-1.63609584E-09 7.04145483E-11 4.65286675E-01 +31 7 4.65286592E-01-1.54173064E+00 3.03151297E-09 4.88478701E-07-2.82201960E-08 +31 8 6.14978964E-03-3.05456696E-10 4.08602398E-03-2.24809322E-10-6.05244917E-03 +31 9-8.25079721E-03-6.05245070E-03 2.53940714E-09-2.19599244E-10 6.11378333E-11 +31 10-7.09863464E-03 4.69385506E-01-3.99414984E-01-8.43195810E-02-9.38221548E-03 +31 11-1.62504988E-02-6.42290611E-02 2.35276390E-01 4.07511236E-01 1.32827633E+00 +31 12-7.09863503E-03 4.69385585E-01-3.99414976E-01-8.43195866E-02-9.38221584E-03 +31 13 1.62504981E-02-6.42290615E-02 2.35276407E-01-4.07511235E-01 1.32827634E+00 +31 14-7.09862912E-03 4.69384502E-01-3.99415081E-01-8.43195071E-02 1.87644608E-02 +31 15-7.91314321E-10-6.42290570E-02-4.70553249E-01 1.91027329E-08 1.32827625E+00 +32 1 1.68981900E-11 1.60108221E-09 9.87495689E-03 2.95163898E-04 2.05015048E-09 +32 2 4.00565355E-08-2.02210687E-02-6.04411033E-04-5.55721453E-11-8.52082873E-07 +32 3 3.94420454E+00 1.17892872E-01 2.70787567E-07-4.78193239E-07-4.22168709E-01 +32 4-1.26186875E-02-1.16880414E-07 1.74965683E-03-1.74965409E-03 2.50744592E-11 +32 5-6.03879427E-05-1.08860551E-03-3.25385842E-05 4.30667299E-02-4.30667190E-02 +32 6 5.22164817E-09-1.48641281E-03-2.87471572E-02-8.59256992E-04-9.79056080E-01 +32 7 9.79055611E-01 4.76557835E-07 3.37913106E-02 2.06565363E+00 6.17427024E-02 +32 8-2.52886620E-02-7.55881961E-04-7.87005628E-09-3.38040587E-04 1.58142692E-03 +32 9-1.13094288E-02-1.58143902E-03-8.80943883E-03-2.63315497E-04-5.45818635E-05 +32 10-1.53789280E-02 1.21351689E+00-3.03779432E-02-1.61215214E-01 6.63263024E-02 +32 11-3.14415850E-02-1.32915709E-02-1.61342233E+00 1.04996342E+00 3.95207907E-01 +32 12-1.38649360E-02 1.09405120E+00-2.73873359E-02-1.45344241E-01 6.82594127E-02 +32 13 3.32322096E-02-1.19830694E-02-1.67693700E+00-1.07497236E+00 3.56301291E-01 +32 14 2.92438625E-02-2.30756718E+00 5.77659240E-02 3.06559529E-01 1.12836979E-02 +32 15 2.56943434E-03 2.52746746E-02 1.95068608E-01-6.75097742E-02-7.51510067E-01 +33 1-1.04846946E-11-1.93748207E-10-2.95163694E-04 9.87494636E-03 1.18601035E-11 +33 2-3.87263393E-09 6.04411279E-04-2.02210925E-02 5.23300807E-10 8.77143862E-08 +33 3-1.17892853E-01 3.94420388E+00-1.62334295E-08 4.53247780E-08 1.26186871E-02 +33 4-4.22168747E-01 1.02346391E-08-5.22976318E-05 5.22973357E-05-2.34604926E-11 +33 5-2.02032859E-03 3.25385721E-05-1.08860515E-03-1.28727160E-03 1.28727062E-03 +33 6-6.37873302E-10-4.97291629E-02 8.59256875E-04-2.87471598E-02 2.92641539E-02 +33 7-2.92641165E-02-3.86377962E-08 1.13051621E+00-6.17426913E-02 2.06565338E+00 +33 8 7.55882396E-04-2.52886691E-02 8.64570388E-10-1.13094350E-02-4.72686475E-05 +33 9 3.38040403E-04 4.72699485E-05 2.63315590E-04-8.80944371E-03-1.82608193E-03 +33 10-2.48888809E-02 1.96392466E+00-4.91634496E-02-2.60906747E-01-3.43482941E-02 +33 11 3.09199790E-02-2.15107699E-02 1.11164242E+00-4.50104971E-01 6.39595241E-01 +33 12 2.57629846E-02-2.03289825E+00 5.08900379E-02 2.70069852E-01 3.03255061E-02 +33 13 2.89868695E-02 2.22662315E-02-1.01329308E+00-3.86590307E-01-6.62057933E-01 +33 14-8.74103593E-04 6.89734976E-02-1.72665087E-03-9.16311257E-03-3.37271114E-04 +33 15 8.59625738E-02-7.55464513E-04-5.83062774E-03-2.25859573E+00 2.24627674E-02 +34 1 1.93998209E-10 3.55090196E-10-6.64482265E-03 2.96177193E-01-1.61223253E-09 +34 2 1.22535811E-09-1.89377520E-02 8.44105327E-01-4.42481466E-09-7.56415563E-08 +34 3-9.08187564E-02 4.04803060E+00-1.93541078E-08-1.46067531E-08-1.17287596E-02 +34 4 5.22781604E-01-1.75517394E-09 1.78753199E-04-1.78753173E-04-6.88646983E-11 +34 5 9.20007195E-03 1.45814637E-04-6.49934083E-03 1.10163939E-03-1.10163912E-03 +34 6-9.08880305E-11 5.66991833E-02 9.82936504E-04-4.38120577E-02-1.69243461E-02 +34 7 1.69243619E-02 4.69018840E-09-8.71062949E-01-2.84219790E-02 1.26684225E+00 +34 8-5.92167656E-03 2.63944670E-01-1.63503929E-09 1.18039642E-01 2.76528159E-04 +34 9-2.64825420E-03-2.76529574E-04-2.51295659E-03 1.12009073E-01 1.42323906E-02 +34 10 1.80529952E-01 3.28296259E+00 2.31851409E+00-3.91700307E-01-4.15387974E-02 +34 11-4.26574606E-02 2.52160686E-02 1.15991521E+00 1.47175023E+00-6.03343666E-01 +34 12-1.85268142E-01-3.36912724E+00-2.37936583E+00 4.01980879E-01 4.13473304E-02 +34 13-4.45170351E-02-2.58778901E-02-1.16684743E+00 1.52395182E+00 6.19179033E-01 +34 14 4.73819267E-03 8.61647036E-02 6.08517670E-02-1.02805722E-02 1.51470640E-03 +34 15 2.81942419E-02 6.61821286E-04-4.86740539E-02-5.17184371E-01-1.58353706E-02 +35 1 3.25345243E-11 1.48279076E-09-2.96177206E-01-6.64482307E-03-1.57307607E-08 +35 2 9.30186428E-09-8.44105370E-01-1.89377532E-02-4.40606160E-08-3.13572545E-07 +35 3-4.04803081E+00-9.08187703E-02-1.81648897E-07-1.58255719E-08-5.22781658E-01 +35 4-1.17287608E-02-8.52680051E-09 7.96749606E-03-7.96749473E-03 8.78431510E-10 +35 5-2.06406387E-04 6.49934187E-03 1.45814645E-04 4.91029323E-02-4.91029246E-02 +35 6 5.08746677E-09-1.27206316E-03 4.38120648E-02 9.82936538E-04-7.54362422E-01 +35 7 7.54362663E-01-4.79647962E-08 1.95425592E-02-1.26684235E+00-2.84219825E-02 +35 8-2.63944685E-01-5.92167699E-03-1.54751955E-08-2.64825426E-03 1.23256032E-02 +35 9-1.18039652E-01-1.23256161E-02-1.12009079E-01-2.51295675E-03-3.19307905E-04 +35 10-1.09700205E-01-1.99491378E+00-1.40886031E+00 2.38019243E-01-3.33728859E-03 +35 11 4.24209501E-02-1.53227129E-02-1.80594994E-01-1.19698592E+00 3.66625786E-01 +35 12-1.01493416E-01-1.84567216E+00-1.30346197E+00 2.20212771E-01-5.19686360E-03 +35 13-4.04651645E-02-1.41764046E-02-1.28393372E-01 1.12977645E+00 3.39198125E-01 +35 14 2.11193631E-01 3.84058608E+00 2.71232229E+00-4.58232011E-01 6.75144082E-02 +35 15-6.32546221E-04 2.94991143E-02-2.16952959E+00 1.16031848E-02-7.05823921E-01 +36 1-4.54124393E-02-4.96044136E-02-2.01349917E-08 2.25977066E-09 2.33722406E-01 +36 2-1.15750499E-01-5.44883952E-08 6.48225207E-09 6.83283238E-01 1.51848168E+01 +36 3-3.33360984E-07 3.14847913E-08 3.05642972E+00 3.98617235E+00-5.69637444E-08 +36 4 5.04839073E-09 5.45187254E-01 1.52832660E-02 1.52832676E-02 3.43352175E-02 +36 5-1.16430587E-11-1.57609367E-10-6.53996791E-11 6.19078934E-02 6.19079012E-02 +36 6 1.16155362E-01-3.22115255E-11-1.62327303E-09-1.72193592E-10-3.17418206E-01 +36 7-3.17418258E-01-1.70256030E+00-1.85027484E-09-1.92127058E-08 8.54374642E-09 +36 8 1.36929206E-02 2.38251782E-09 2.39223363E-01 8.69914032E-10 1.11466565E-01 +36 9-1.83710134E-02 1.11466565E-01-6.92286101E-09 9.50630756E-10 3.40888780E-11 +36 10-1.07079868E-01-4.26890474E+00-2.50561913E+00-5.66152362E-02 2.69758326E-02 +36 11 4.67235014E-02-5.79530107E-03-1.18171733E+00-2.04679419E+00 7.18431189E-01 +36 12-1.07079869E-01-4.26890478E+00-2.50561915E+00-5.66152324E-02 2.69758322E-02 +36 13-4.67235019E-02-5.79530149E-03-1.18171732E+00 2.04679422E+00 7.18431198E-01 +36 14-1.07079871E-01-4.26890468E+00-2.50561907E+00-5.66152557E-02-5.39516557E-02 +36 15-1.84034303E-10-5.79530017E-03 2.36343437E+00 3.87337965E-10 7.18431258E-01 +37 1 1.46156906E-01-1.73319633E-01-9.88538366E-09 4.63830329E-10 1.09235169E-01 +37 2-3.43833963E+00-2.17189716E-08 1.21881785E-09 2.48081380E-01 1.55155151E+01 +37 3-1.69039691E-07 7.80852713E-09 1.17083966E+00 2.70892634E+00 1.75669451E-08 +37 4-1.54765984E-09-3.55340971E-02-2.70540735E-01-2.70540734E-01-2.56946090E-01 +37 5-3.67813363E-11-1.33353023E-10-2.39021339E-11-1.20633277E+00-1.20633276E+00 +37 6-1.10133151E+00-5.90169923E-10 1.92872698E-09-2.11271803E-10-3.61095726E+00 +37 7-3.61095726E+00-4.12950845E+00 6.09787539E-10-1.88189442E-08 1.87682262E-09 +37 8 4.20708683E-02 9.53826626E-10 1.18089781E-01-1.71125580E-10 8.01219465E-02 +37 9-5.64440138E-02 8.01219408E-02-2.19813261E-09 2.34176960E-10 8.16266673E-11 +37 10 5.07639075E-02-2.15054288E+00 1.46071113E-01-3.63453361E-01-8.69465415E-03 +37 11-1.50595849E-02 2.24415742E-02-4.28760972E-01-7.42635698E-01 2.22997291E-01 +37 12 5.07639080E-02-2.15054289E+00 1.46071112E-01-3.63453357E-01-8.69465426E-03 +37 13 1.50595849E-02 2.24415740E-02-4.28760966E-01 7.42635703E-01 2.22997293E-01 +37 14 5.07639025E-02-2.15054280E+00 1.46071156E-01-3.63453417E-01 1.73893078E-02 +37 15-1.99390564E-10 2.24415780E-02 8.57521829E-01 7.17527842E-10 2.22997305E-01 +38 1-6.89915015E-10 3.72033231E-09-4.17730027E-02-9.63764327E-04 1.95132394E-09 +38 2 1.53884339E-08-1.59666257E-01-3.68373436E-03 1.99952139E-10-1.15521987E-07 +38 3-2.66667187E-01-6.15240141E-03-1.74638714E-08-1.53717846E-07 1.26123660E-01 +38 4 2.90985764E-03-2.31441834E-08 6.72910578E-03-6.72910078E-03 3.63595202E-09 +38 5-1.79267629E-04-2.74247219E-03-6.32728547E-05-7.01764366E-01 7.01764463E-01 +38 6-5.71949173E-08 1.86954539E-02 6.97203976E-01 1.60855173E-02-1.94169542E-01 +38 7 1.94169519E-01 8.24033462E-08 5.17280124E-03-8.73417529E-02-2.01510099E-03 +38 8-2.28589909E-02-5.27390417E-04-8.11964394E-09-2.35856630E-04-2.16211257E-02 +38 9-1.02228616E-02 2.16211328E-02 1.24197155E-02 2.86541052E-04 5.76000709E-04 +38 10 7.78785020E-02-4.36222980E-01-8.83558367E-05 5.65122988E-02 1.00299438E-01 +38 11-8.81297542E-02-6.65896022E-02-4.39659498E-01 1.07914640E-01 2.28995695E-01 +38 12 7.18934719E-02-4.02698864E-01-8.15620131E-05 5.21692803E-02 1.04366594E-01 +38 13 8.81553523E-02-6.14721336E-02-4.44968442E-01-1.22194060E-01 2.11397175E-01 +38 14-1.49771923E-01 8.38921841E-01 1.70092312E-04-1.08681550E-01-5.03343448E-02 +38 15 3.53506002E-03 1.28061711E-01-2.43033999E-01-1.17373939E-02-4.40392905E-01 +39 1-7.39645339E-11 3.94248224E-10-9.63764282E-04 4.17729987E-02 2.69294211E-10 +39 2 1.52069557E-09-3.68373369E-03 1.59666225E-01 4.40241832E-10-5.61296099E-09 +39 3-6.15240108E-03 2.66667075E-01-7.70446077E-10-1.38308843E-08 2.90985620E-03 +39 4-1.26123606E-01-2.27230293E-09 1.55250560E-04-1.55250035E-04 3.81678773E-10 +39 5 7.77009796E-03-6.32728818E-05 2.74247376E-03-1.61907309E-02 1.61907424E-02 +39 6-7.20408017E-09-8.10327640E-01 1.60855194E-02-6.97204107E-01-4.47977754E-03 +39 7 4.47977567E-03 6.79074497E-09-2.24207657E-01-2.01510392E-03 8.73417787E-02 +39 8-5.27389685E-04 2.28589853E-02-7.41776428E-10 1.02228568E-02-4.98830638E-04 +39 9-2.35856779E-04 4.98831691E-04 2.86541257E-04-1.24197265E-02-2.49659213E-02 +39 10-1.27978544E-01 7.16849921E-01 1.45326271E-04-9.28672419E-02 9.05035049E-02 +39 11-2.58835523E-03 1.09427428E-01-1.25259150E-01 3.12115090E-01-3.76311161E-01 +39 12 1.31434005E-01-7.36205080E-01-1.49240364E-04 9.53746862E-02-8.57815602E-02 +39 13 1.47880200E-03-1.12382001E-01 1.04849490E-01 3.06806144E-01 3.86471671E-01 +39 14-3.45545553E-03 1.93551526E-02 3.92932999E-06-2.50744158E-03-1.16128669E-03 +39 15-1.53222135E-01 2.95457123E-03-5.60714903E-03 5.08740607E-01-1.01605092E-02 +40 1-1.42844622E-02 5.99601007E-03 1.38768956E-08-1.53463648E-09-1.80876766E-01 +40 2 6.97954799E-01 5.04540436E-08-6.78603271E-09-5.28116029E-01-9.43069511E+00 +40 3 3.58585628E-07-4.37404976E-08-1.57405582E+00 1.12926191E+00-9.27178076E-08 +40 4 9.52839367E-09 4.49979812E-01 2.63527257E-02 2.63527243E-02 1.02844814E-02 +40 5 0.00000000E+00 2.22437870E-10 7.36772405E-11-4.67609642E-01-4.67609553E-01 +40 6 1.18675491E+00 2.67025724E-11 5.96991721E-08-1.18330638E-08 8.66459063E-01 +40 7 8.66459149E-01 1.01493995E+00 9.99097873E-10 5.65690032E-08-7.56023819E-09 +40 8-2.05773490E-02 6.85365643E-10 1.44955863E-01 5.99316017E-10 2.16842591E-02 +40 9 2.76073893E-02 2.16842635E-02-6.81735714E-09 0.00000000E+00 3.33673891E-10 +40 10-2.37827193E-01 2.99055889E+00-3.31996416E-01-9.96960407E-02 9.20611207E-03 +40 11 1.59454436E-02 1.12654914E-01 5.53317311E-01 9.58373724E-01-5.56735072E-01 +40 12-2.37827199E-01 2.99055896E+00-3.31996411E-01-9.96960562E-02 9.20611083E-03 +40 13-1.59454421E-02 1.12654911E-01 5.53317319E-01-9.58373745E-01-5.56735074E-01 +40 14-2.37827179E-01 2.99055870E+00-3.31996426E-01-9.96959519E-02-1.84122410E-02 +40 15-2.23956937E-10 1.12654933E-01-1.10663454E+00 5.93676628E-09-5.56735166E-01 +41 1-2.32346057E-10-2.69592304E-09-1.78297147E-01-4.67232030E-03-2.54312723E-08 +41 2 5.17785709E-08-8.02152702E-01-2.10206075E-02-8.88522776E-08-1.14549371E-06 +41 3-4.31431369E+00-1.13057645E-01-3.41788398E-07 3.01396622E-08 7.90646387E-01 +41 4 2.07190821E-02 5.65258647E-08 6.43099060E-03-6.43099161E-03-2.06048295E-09 +41 5-1.94596755E-04 5.34770232E-03 1.40137828E-04-6.05686040E-01 6.05686017E-01 +41 6 6.01044806E-09 1.83275874E-02-8.47094821E-01-2.21983264E-02-5.82611156E-01 +41 7 5.82611368E-01 9.25808307E-08 1.76293619E-02-7.07233352E-01-1.85332217E-02 +41 8 1.33163173E-01 3.48957410E-03 1.74288024E-08 1.56058462E-03-4.06356977E-02 +41 9 5.95523892E-02 4.06356988E-02 1.49205865E-02 3.90997745E-04 1.22960441E-03 +41 10 2.53488818E-01-2.54878885E+00-2.88451708E-01 4.67714795E-01 8.27485997E-02 +41 11 1.72590330E-02 2.80754132E-02-3.13849384E-01-8.86070574E-01 2.66765293E-01 +41 12 2.31476799E-01-2.32746157E+00-2.63403645E-01 4.27100199E-01 8.19804113E-02 +41 13-1.20552424E-02 2.56374504E-02-2.69162521E-01 8.19192675E-01 2.43600394E-01 +41 14-4.84965715E-01 4.87625153E+00 5.51855385E-01-8.94815014E-01 1.07751395E-01 +41 15 1.93662562E-03-5.37128387E-02-1.76830763E+00 5.26099580E-03-5.10365915E-01 +42 1-2.34068212E-10 4.58979379E-10-4.67232057E-03 1.78297151E-01-2.63149218E-09 +42 2 9.20863709E-09-2.10206086E-02 8.02152707E-01-7.65282893E-09-1.14836638E-07 +42 3-1.13057642E-01 4.31431346E+00-1.98788049E-08 1.47727001E-09 2.07190808E-02 +42 4-7.90646338E-01 4.34678959E-09 1.68526343E-04-1.68525190E-04 4.48911807E-10 +42 5 7.42586917E-03 1.40137833E-04-5.34770100E-03-1.58721603E-02 1.58721552E-02 +42 6 1.20766584E-08-6.99386120E-01-2.21983250E-02 8.47094712E-01-1.52674635E-02 +42 7 1.52674941E-02 1.41855689E-08-6.72741683E-01-1.85332213E-02 7.07233228E-01 +42 8 3.48957474E-03-1.33163200E-01 2.25164398E-09-5.95523874E-02-1.06486801E-03 +42 9 1.56058394E-03 1.06486983E-03 3.90997848E-04-1.49205987E-02-4.69220667E-02 +42 10-4.13638290E-01 4.15906565E+00 4.70690075E-01-7.63208102E-01-1.24987566E-02 +42 11-9.89050165E-02-4.58128930E-02 8.44992843E-01 1.25369694E+00-4.35302669E-01 +42 12 4.26346934E-01-4.28684896E+00-4.85151583E-01 7.86656951E-01 1.68155202E-02 +42 13-9.96732036E-02 4.72204541E-02-8.60270798E-01 1.29838377E+00 4.48676921E-01 +42 14-1.27086477E-02 1.27783400E-01 1.44615095E-02-2.34488496E-02 2.82365229E-03 +42 15-7.39022111E-02-1.40755632E-03-4.63389516E-02-2.00761119E-01-1.33742727E-02 +43 1-2.89954862E-02 1.76022369E-01-7.96650887E-09-4.15831718E-10 4.90521741E-02 +43 2-7.16081285E-02-2.32422463E-08-1.70480689E-09 2.67714006E-01 7.57694538E+00 +43 3-3.07921934E-07 3.38230735E-11 2.47388989E+00-1.63742134E+00 5.97534317E-08 +43 4-2.77276019E-10-3.63943985E-01 1.20517712E-01 1.20517716E-01 1.47592213E-01 +43 5-1.35837062E-10-5.92404950E-10-3.44728532E-11 5.26322745E-01 5.26322727E-01 +43 6 6.92134397E-01 3.26053503E-09-2.86140717E-08-1.30385605E-09 7.95544116E-01 +43 7 7.95544047E-01-3.10770528E-01 4.78192471E-09-2.04849147E-08 1.18703174E-09 +43 8 3.48549577E-01 4.26053528E-09-1.78634596E-02-3.05020202E-09 2.44284061E-01 +43 9-4.67628357E-01 2.44284001E-01 1.45548993E-08 3.44315041E-10 1.13116270E-09 +43 10 7.83070129E-01-4.41486608E+00 2.72061467E-01 1.57986584E-01-9.39085769E-02 +43 11-1.62654430E-01 1.06127527E-01-5.74176935E-01-9.94503520E-01 2.92493768E-01 +43 12 7.83070127E-01-4.41486606E+00 2.72061471E-01 1.57986582E-01-9.39085764E-02 +43 13 1.62654431E-01 1.06127526E-01-5.74176922E-01 9.94503518E-01 2.92493766E-01 +43 14 7.83070087E-01-4.41486592E+00 2.72061452E-01 1.57986543E-01 1.87817171E-01 +43 15-4.95925094E-10 1.06127545E-01 1.14835372E+00 7.37313935E-10 2.92493803E-01 +44 1 2.69400680E-11-2.52390369E-10-2.49596836E-04 1.14193877E-02-3.75467928E-11 +44 2 1.23040757E-09-4.13797542E-03 1.89317778E-01-2.14379698E-10-1.41697353E-09 +44 3-1.05600306E-01 4.83135196E+00-3.59103004E-09 2.05009265E-09 5.99341900E-03 +44 4-2.74206765E-01 7.84074749E-10 7.11687591E-04-7.11687935E-04-1.63010267E-10 +44 5 3.75977781E-02 6.12894870E-04-2.80407370E-02 1.93021503E-03-1.93021751E-03 +44 6 3.56845869E-10 1.01971474E-01-2.20271877E-04 1.00777496E-02-2.79137820E-02 +44 7 2.79137901E-02-2.63830736E-09-1.47465845E+00-3.19965709E-02 1.46388483E+00 +44 8-1.44484459E-02 6.61035191E-01 6.43885566E-10 2.95624097E-01-8.48047218E-03 +44 9-6.46154239E-03 8.48046928E-03-1.81311965E-03 8.29525306E-02-4.48015052E-01 +44 10-9.60468570E-01 5.48539647E+00 2.10206491E-01-2.07099114E-01 1.48977251E-01 +44 11 2.82953506E-01-1.14591898E-01 6.92567588E-01 8.44263259E-01-3.66079272E-01 +44 12 9.85019304E-01-5.62560981E+00-2.15579624E-01 2.12392816E-01-1.53848224E-01 +44 13 2.89572453E-01 1.17521004E-01-6.95113977E-01 8.74594237E-01 3.75436702E-01 +44 14-2.45507325E-02 1.40213338E-01 5.37313008E-03-5.29370239E-03-8.16766295E-03 +44 15 2.40086228E-02-2.92910870E-03-2.75405933E-02-3.42338787E-01-9.35742691E-03 +45 1 2.20906763E-11-3.83565478E-09-1.14193765E-02-2.49596871E-04 1.96960754E-09 +45 2 3.09728561E-09-1.89317799E-01-4.13797634E-03-8.24149209E-09-3.98098106E-08 +45 3-4.83135250E+00-1.05600331E-01-1.46887172E-07-1.66477018E-09 2.74206778E-01 +45 4 5.99342058E-03 9.43465875E-09 3.25606250E-02-3.25606295E-02-6.94358419E-10 +45 5-8.21786134E-04 2.80407406E-02 6.12894843E-04 8.83098900E-02-8.83099247E-02 +45 6-4.40896891E-09-2.22882272E-03-1.00777650E-02-2.20273237E-04-1.27709147E+00 +45 7 1.27709162E+00-8.44903955E-08 3.22320624E-02-1.46388508E+00-3.19965763E-02 +45 8-6.61035312E-01-1.44484407E-02 2.20334758E-09-6.46155261E-03-3.87992433E-01 +45 9-2.95624002E-01 3.87992369E-01-8.29525633E-02-1.81311782E-03 9.79240195E-03 +45 10 5.82875556E-01-3.32889977E+00-1.27567170E-01 1.25681386E-01-1.14736207E-01 +45 11-1.57669604E-01 6.95418702E-02-7.34159133E-02-7.12625611E-01 2.22161039E-01 +45 12 5.40352436E-01-3.08604312E+00-1.18260631E-01 1.16512422E-01-1.08117252E-01 +45 13 1.45155735E-01 6.44685106E-02-4.30849328E-02 6.75056018E-01 2.05953497E-01 +45 14-1.12322795E+00 6.41494285E+00 2.45827806E-01-2.42193808E-01-3.73681185E-01 +45 15-5.24767605E-04-1.34010434E-01-1.26001794E+00 7.48260771E-03-4.28114524E-01 +46 1 0.00000000E+00 0.00000000E+00-6.80537244E-11-2.58631070E-09 0.00000000E+00 +46 2 0.00000000E+00 4.37227005E-10 4.07152181E-09 0.00000000E+00 1.31004277E-10 +46 3 3.88907093E-08 6.19660227E-07 1.83211981E-11 4.29653563E-11-1.79972690E-09 +46 4-2.31315748E-08 0.00000000E+00-3.20754079E-10 3.11445199E-10 0.00000000E+00 +46 5 5.22518986E-09-2.75932521E-10-4.48246958E-09-7.66732292E-10 7.38597577E-10 +46 6-2.43036034E-11 1.26006200E-08-4.32612690E-10-5.19724809E-09 1.28045156E-08 +46 7-1.28624533E-08-2.33349792E-11-2.35791440E-07 1.38301504E-08 2.16893764E-07 +46 8 2.09733842E-09 4.83523145E-01 1.07174892E-11-6.48714190E-01 6.30505589E-09 +46 9 7.81492399E-09-6.29843826E-09 2.26432641E-09 3.58056256E-08-1.29385899E-07 +46 10-1.25504964E-07 7.63134624E-07 2.76957248E-08-1.75518320E-08-3.94858175E-01 +46 11 2.27971540E-01-6.23099329E-08 4.41644985E-01-2.54983700E-01-7.66118133E-10 +46 12 1.16776137E-07-7.10107473E-07-2.61394163E-08 1.61224411E-08 3.94858177E-01 +46 13 2.27971534E-01 5.84803629E-08-4.41644984E-01-2.54983707E-01 2.88999131E-10 +46 14 8.72769038E-09-5.30797639E-08-1.58962046E-09 1.41749022E-09 2.82043333E-09 +46 15-4.55942985E-01 3.84334588E-09 1.02687907E-08 5.09967594E-01 4.71825360E-10 +47 1-1.17245067E-10 2.47793107E-09 7.56331780E-02 1.31717660E-02-2.01866692E-09 +47 2-1.10268572E-08-1.73949587E-02-3.02938612E-03-5.84392832E-09 6.87111197E-08 +47 3-1.72924927E+00-3.01154441E-01-1.65356330E-08-1.48749869E-08 5.87149708E-02 +47 4 1.02254048E-02-1.44847738E-09 1.01653111E-03-1.01652834E-03 1.90178643E-09 +47 5-2.04419470E-04-7.50524991E-04-1.30706137E-04-9.15640854E-02 9.15641161E-02 +47 6-1.22205033E-08 1.84130749E-02-2.31199074E-01-4.02640721E-02-2.46586349E-01 +47 7 2.46586379E-01-8.86798335E-10 4.95872817E-02-7.69238430E-02-1.33965501E-02 +47 8-5.74478492E-01-1.00047315E-01 4.37126130E-08-4.47425044E-02 3.01593054E-01 +47 9-2.56914544E-01-3.01593106E-01 4.51323371E-01 7.85994274E-02-6.06488248E-02 +47 10 1.39705798E-01-1.12517115E+00-1.76212035E-01 7.98416683E-02-2.53831601E-01 +47 11 5.57544127E-03-3.36589114E-01 1.96506469E-01-3.37457919E-01 5.34676211E-01 +47 12 7.49550051E-02-6.03677250E-01-9.45413537E-02 4.28366860E-02-2.68641635E-01 +47 13-7.94647381E-02-1.80586942E-01 3.07082559E-01 2.97477373E-01 2.86864712E-01 +47 14-2.14660778E-01 1.72884826E+00 2.70753395E-01-1.22678350E-01-1.87589706E-01 +47 15-4.97704889E-02 5.17176046E-01-2.98075473E-01 7.57713892E-02-8.21540920E-01 +48 1-2.63415422E-11 5.92718629E-10 1.31717649E-02-7.56331876E-02-6.76388741E-10 +48 2-2.73997445E-09-3.02938837E-03 1.73949408E-02-1.35267705E-09 2.47931597E-08 +48 3-3.01154410E-01 1.72924956E+00 9.60830636E-10-2.17507451E-09 1.02254039E-02 +48 4-5.87149788E-02-2.29315342E-10 1.77032407E-04-1.77031740E-04 4.29110264E-10 +48 5 1.17379125E-03-1.30706292E-04 7.50523143E-04-1.59461844E-02 1.59461912E-02 +48 6-2.34168835E-09-1.05729139E-01-4.02640729E-02 2.31199071E-01-4.29438244E-02 +48 7 4.29438298E-02-7.16484504E-10-2.84733604E-01-1.33965415E-02 7.69239310E-02 +48 8-1.00047307E-01 5.74478564E-01 8.37307891E-09 2.56914559E-01 5.25234160E-02 +48 9-4.47425049E-02-5.25234236E-02 7.85994361E-02-4.51323310E-01 3.48249697E-01 +48 10-1.67209820E-01 1.34668465E+00 2.10903040E-01-9.55601580E-02-8.80153096E-02 +48 11 2.19543725E-01 4.02853642E-01 3.61318573E-01 5.94975045E-02-6.39938312E-01 +48 12 2.04593703E-01-1.64776927E+00-2.58055628E-01 1.16924994E-01-2.97510922E-03 +48 13 2.04733700E-01-4.92921539E-01-2.73616901E-01 1.70073567E-01 7.83012346E-01 +48 14-3.73838772E-02 3.01084578E-01 4.71525878E-02-2.13648353E-02-3.26693609E-02 +48 15 2.85785580E-01 9.00678971E-02-5.19108183E-02-4.35084540E-01-1.43074035E-01 +49 1 6.20175440E-03 1.07033011E-01 1.62354577E-08 8.88787412E-10-3.69617797E-01 +49 2-8.37794617E-01 2.52748276E-08 1.67513022E-09-6.06336830E-01 8.12367043E+00 +49 3-3.32243310E-07 1.22407078E-08 1.70481410E+00 3.09946869E-01 1.77449595E-08 +49 4-1.79832109E-09 4.06778199E-02 5.68407732E-02 5.68407717E-02 4.58595603E-02 +49 5 8.39598137E-11 1.67502119E-09-7.10694067E-11 3.89786238E-01 3.89786213E-01 +49 6-1.50915683E-01 1.60456117E-09 2.23304386E-08-5.22711440E-10-6.34141727E-01 +49 7-6.34141773E-01-5.53295442E-01 2.14938948E-09-1.32411554E-07 6.13472671E-09 +49 8-2.65565094E-01-4.46920447E-09 1.04875479E+00 1.78274643E-09 6.97596456E-01 +49 9 3.56292858E-01 6.97596472E-01-5.59042619E-08 1.03391727E-09-6.45591000E-10 +49 10 2.22545931E-01-2.71799536E+00-2.86612914E-01 6.75540268E-03 5.63182383E-02 +49 11 9.75461099E-02 2.75012336E-01-6.48476664E-01-1.12319457E+00-7.89277993E-02 +49 12 2.22545932E-01-2.71799537E+00-2.86612911E-01 6.75540478E-03 5.63182381E-02 +49 13-9.75461089E-02 2.75012338E-01-6.48476656E-01 1.12319457E+00-7.89278045E-02 +49 14 2.22545885E-01-2.71799509E+00-2.86612905E-01 6.75537613E-03-1.12636542E-01 +49 15 1.19875734E-09 2.75012298E-01 1.29695332E+00-3.00646295E-09-7.89276998E-02 +50 1 3.65068183E-03 4.78977184E-02 3.46499520E-08-1.25091036E-09-2.17689766E-01 +50 2-3.58420066E-01 6.75689734E-08-2.37649567E-09-4.56512031E-01 2.49021237E+00 +50 3 1.05027491E-07-6.98187146E-09-4.34822839E-01 1.56745440E-01-2.19425404E-08 +50 4 6.78428676E-10 1.11568863E-01 2.56255109E-02 2.56255116E-02 1.80695207E-02 +50 5-1.39241683E-11 7.90075093E-11 0.00000000E+00 1.35768455E-01 1.35768456E-01 +50 6-9.91418618E-03 1.16383225E-10-2.83267705E-09 5.14915901E-10-7.75209588E-02 +50 7-7.75210381E-02-6.62152204E-01 2.94716627E-09 5.50215985E-08-3.34024117E-09 +50 8 3.06552554E-01 5.68774844E-09 1.53086365E+00-1.80992330E-09-2.12762220E-01 +50 9-4.11283507E-01-2.12762312E-01-1.49735448E-07 3.30340925E-09 2.48526683E-09 +50 10 4.69237705E-02-7.21247485E-01-8.18467553E-02-1.15596141E-02-1.28687254E-02 +50 11-2.22892908E-02-1.06931493E-01-1.25261204E-01-2.16958706E-01 4.58386998E-01 +50 12 4.69237702E-02-7.21247475E-01-8.18467536E-02-1.15596158E-02-1.28687252E-02 +50 13 2.22892908E-02-1.06931494E-01-1.25261202E-01 2.16958708E-01 4.58387000E-01 +50 14 4.69237707E-02-7.21247575E-01-8.18467563E-02-1.15595872E-02 2.57374706E-02 +50 15-3.49460583E-11-1.06931488E-01 2.50522287E-01 1.14402484E-09 4.58387000E-01 +51 1 7.35631741E-11 2.30588682E-10-8.68296588E-03 3.76099454E-01-2.37980026E-09 +51 2-3.03384997E-09-1.19544837E-02 5.17804042E-01-4.95014689E-09 1.40163506E-08 +51 3 5.70028387E-02-2.46905697E+00-4.44774843E-09-1.45864946E-09 2.77912077E-03 +51 4-1.20376581E-01 2.95522052E-10 9.21985626E-05-9.21983906E-05 0.00000000E+00 +51 5 4.61134410E-03-5.73141362E-05 2.48254047E-03 5.39264813E-03-5.39264822E-03 +51 6 3.35585919E-10 2.69715490E-01 2.61719757E-03-1.13362930E-01 2.71316192E-03 +51 7-2.71317261E-03-3.19618010E-09 1.35700206E-01 2.21652503E-02-9.60079645E-01 +51 8 2.41494896E-02-1.04602611E+00 1.05864366E-08-4.67797092E-01-5.04047718E-03 +51 9 1.07999765E-02 5.04048080E-03 2.61114637E-02-1.13100840E+00-2.52101581E-01 +51 10 2.63281504E-01-2.79325174E+00-6.28077792E-01 7.89700486E-02 1.55602258E-01 +51 11 2.07210592E-02 4.28711399E-02-9.21171441E-01-8.94381308E-01 1.76062028E-01 +51 12-2.70394998E-01 2.86872144E+00 6.45047564E-01-8.11037071E-02-1.48611314E-01 +51 13 2.77444064E-02-4.40294611E-02 9.14510408E-01-9.36761496E-01-1.80818970E-01 +51 14 7.11349222E-03-7.54696992E-02-1.69697702E-02 2.13365852E-03-2.58692351E-03 +51 15-2.39223944E-01 1.15831544E-03 3.33718051E-02 6.74175634E-01 4.75695067E-03 +52 1-6.93316741E-10-5.86222575E-09 3.76099435E-01 8.68296563E-03 4.87577091E-08 +52 2 6.19361260E-08 5.17803988E-01 1.19544829E-02 8.65836034E-08-5.70872546E-07 +52 3-2.46905737E+00-5.70028538E-02-7.13867538E-08 2.08611047E-10-1.20376554E-01 +52 4-2.77911993E-03-6.00578561E-09-3.99354255E-03 3.99353662E-03-1.56307024E-09 +52 5 1.06461573E-04 2.48254122E-03 5.73141478E-05-2.33580462E-01 2.33580435E-01 +52 6 5.50738304E-10 6.22689265E-03-1.13362960E-01-2.61719766E-03-1.17519596E-01 +52 7 1.17519827E-01 4.20965757E-08 3.13289431E-03-9.60079797E-01-2.21652557E-02 +52 8-1.04602612E+00-2.41494872E-02-2.35773270E-07-1.07999791E-02 2.18326430E-01 +52 9-4.67797061E-01-2.18326497E-01-1.13100838E+00-2.61114642E-02-5.82024453E-03 +52 10 1.60219616E-01-1.69982959E+00-3.82215896E-01 4.80571319E-02-1.47893388E-01 +52 11 1.52666247E-01 2.60891836E-02 1.23069906E-01-9.38978576E-01 1.07142281E-01 +52 12 1.47898684E-01-1.56911222E+00-3.52823389E-01 4.43615251E-02-1.54916735E-01 +52 13-1.51547329E-01 2.40829189E-02 1.65450102E-01 8.96703182E-01 9.89030089E-02 +52 14-3.08118305E-01 3.26894219E+00 7.35039286E-01-9.24186562E-02 1.12051603E-01 +52 15-5.52293697E-03-5.01720734E-02-1.44548721E+00 1.55646218E-02-2.06045428E-01 +53 1-9.63325456E-11-7.08187929E-10 4.50661960E-04 2.89541724E-01 1.64837911E-09 +53 2 5.98357488E-09 6.64084735E-04 4.26661952E-01 2.87833967E-09-3.80009851E-08 +53 3 2.76239950E-05 1.77476957E-02-3.48150448E-09-4.27437493E-09-5.26467892E-04 +53 4-3.38245411E-01-4.54786660E-10-4.47066742E-05 4.47060289E-05-2.49953814E-10 +53 5 3.31667155E-02-4.01670840E-05-2.58065912E-02 1.81531587E-04-1.81533966E-04 +53 6-7.91306975E-10-1.34675607E-01 1.39392593E-05 8.95613341E-03-8.78878139E-04 +53 7 8.78886529E-04 5.44308540E-09 6.52023037E-01 1.68620004E-04 1.08334767E-01 +53 8-1.28078222E-03-8.22878813E-01-3.97343028E-09-3.68002597E-01-6.17573543E-04 +53 9-5.72783515E-04 6.17565419E-04 3.21118943E-04 2.06314795E-01 4.58160521E-01 +53 10-3.43897576E-01-6.44190265E-02-7.77870081E-01 1.93211562E-02 6.92773654E-02 +53 11 4.43229639E-01-1.39745566E-01 5.21732677E-02-4.73408530E-01 2.91876206E-01 +53 12 3.43280061E-01 6.43033716E-02 7.76473316E-01-1.92864627E-02-6.81449383E-02 +53 13 4.43015748E-01 1.39494636E-01-5.38377367E-02-4.73573541E-01-2.91352107E-01 +53 14 6.17514473E-04 1.15681920E-04 1.39677297E-03-3.46931781E-05 7.51448440E-04 +53 15 3.24111444E-01 2.50934714E-04-6.89345594E-04-5.65299286E-01-5.24106398E-04 +54 1 4.18757816E-09 2.30425951E-08 2.89541751E-01-4.50660834E-04-2.26614882E-08 +54 2-1.29597515E-07 4.26661998E-01-6.64083584E-04-2.92460687E-08 6.47986932E-07 +54 3 1.77477102E-02-2.76233468E-05 7.49560306E-08 1.45344499E-07-3.38245441E-01 +54 4 5.26466015E-04 1.13093767E-08-2.87232051E-02 2.87232247E-02 5.35502677E-09 +54 5-5.16226403E-05-2.58065954E-02 4.01670014E-05 1.16632506E-01-1.16632441E-01 +54 6 4.70173281E-08 2.09617389E-04 8.95611719E-03-1.39405170E-05-5.64668568E-01 +54 7 5.64668477E-01-8.09930655E-08-1.01484500E-03 1.08334758E-01-1.68618393E-04 +54 8-8.22878823E-01 1.28078008E-03 5.64903910E-08 5.72783506E-04-3.96778643E-01 +54 9-3.68002640E-01 3.96778740E-01 2.06314641E-01-3.21124066E-04-7.13106029E-04 +54 10-1.97836333E-01-3.70589319E-02-4.47490762E-01 1.11150047E-02 3.63674931E-01 +54 11 6.80214574E-02-8.03924420E-02-5.34779123E-01 5.37424009E-02 1.67909684E-01 +54 12-1.98905898E-01-3.72592836E-02-4.49910036E-01 1.11750967E-02 3.63888826E-01 +54 13-6.94008669E-02-8.08270667E-02-5.34614122E-01-5.22684577E-02 1.68817454E-01 +54 14 3.96742189E-01 7.43177747E-02 8.97400515E-01-2.22901054E-02 4.82793042E-01 +54 15-5.04469507E-04 1.61219419E-01-4.42888207E-01 8.79866566E-04-3.36727031E-01 +55 1-3.46434654E-02-2.25567993E-01 1.00314032E-08 8.01440585E-11 1.94481255E-01 +55 2 1.03330044E+00 2.76126315E-08-2.75863344E-10 3.14365755E-01-3.22355323E+00 +55 3 1.17155658E-07-9.10651374E-09-1.35095329E-01-1.31888143E+00-1.41749756E-08 +55 4 4.36467627E-10-2.27707712E-01-9.74530340E-02-9.74530218E-02-8.09113812E-02 +55 5-2.96421754E-10-1.81692375E-09 1.07842717E-11-2.37821744E-01-2.37821776E-01 +55 6-6.00210977E-01 1.23753831E-09 3.87856853E-08-1.79025332E-09-1.18969459E-01 +55 7-1.18969296E-01 6.00566040E-01-4.67153288E-09 1.37431452E-08-2.77552067E-09 +55 8-8.06788579E-02-5.13026615E-10-1.07708860E-01 9.10722100E-10-5.13490997E-01 +55 9 1.08241990E-01-5.13490885E-01 5.91356051E-08-5.04642631E-09-3.46560344E-09 +55 10 1.39973706E-01 7.31218692E-01 8.26950254E-01 2.07876092E-02-9.33853442E-02 +55 11-1.61748144E-01 5.77875651E-01 2.48208232E-01 4.29909334E-01-5.72686518E-01 +55 12 1.39973702E-01 7.31218705E-01 8.26950252E-01 2.07876085E-02-9.33853408E-02 +55 13 1.61748140E-01 5.77875652E-01 2.48208233E-01-4.29909337E-01-5.72686518E-01 +55 14 1.39973774E-01 7.31218587E-01 8.26950356E-01 2.07876160E-02 1.86770750E-01 +55 15-3.18248391E-10 5.77875629E-01-4.96416509E-01 4.01750234E-09-5.72686557E-01 +56 1-3.84915561E-02-2.36772111E-01-2.83558071E-08 3.00147957E-09-4.33627838E-02 +56 2 5.31128284E-01-2.16801624E-07 1.99828877E-08-3.05826290E-01 2.10311088E+00 +56 3-1.32309560E-06 1.06611129E-07-3.44394874E-01-1.29259628E+00-5.21646173E-09 +56 4 1.38085076E-10-2.50971012E-01-1.09219404E-01-1.09219335E-01-6.47789536E-02 +56 5-2.96119879E-09 2.38931324E-09-4.80873834E-10-3.82137262E-01-3.82136969E-01 +56 6-4.26632411E-01-1.42351086E-08 3.76533610E-07-2.95062324E-08-4.41760137E-01 +56 7-4.41760770E-01-6.68143419E-01 2.91850056E-08-6.90423655E-07 5.54343597E-08 +56 8-2.65036746E-01-2.51990531E-08 4.38293320E-01-7.50683492E-09 3.61473066E-01 +56 9 3.55584566E-01 3.61473534E-01 5.01371610E-07-4.02866740E-08-1.90282086E-08 +56 10 1.35834897E-01-7.43385306E-01 8.19135219E-01 1.94668765E-02-3.11772460E-01 +56 11-5.40003883E-01-3.00336924E-01 6.09208008E-02 1.05516098E-01 2.86971344E-01 +56 12 1.35834895E-01-7.43385362E-01 8.19135166E-01 1.94668947E-02-3.11772356E-01 +56 13 5.40003873E-01-3.00336869E-01 6.09207178E-02-1.05516117E-01 2.86971286E-01 +56 14 1.35834930E-01-7.43384774E-01 8.19135825E-01 1.94666921E-02 6.23543982E-01 +56 15 8.00149806E-08-3.00337448E-01-1.21840301E-01-8.03085166E-08 2.86971936E-01 +57 1-5.15236308E-09-3.86480321E-08 1.13302653E-03-2.98444723E-02-5.55963906E-09 +57 2 8.54788754E-08 8.28440784E-03-2.18215349E-01-3.87414917E-08 3.16650357E-07 +57 3 4.31625434E-02-1.13692244E+00-3.94464951E-08-1.65147020E-07 1.05964589E-03 +57 4-2.79115665E-02-3.41068163E-08 1.08093271E-03-1.08096961E-03-1.28085698E-08 +57 5 3.28775249E-02-2.41140899E-04 6.35177202E-03 5.89795485E-03-5.89808748E-03 +57 6-7.72007715E-08 1.79390474E-01-1.32994247E-02 3.50313327E-01-9.92407221E-03 +57 7 9.92391634E-03-9.52525201E-08-3.01841911E-01 2.28070232E-02-6.00748118E-01 +57 8-8.96102910E-03 2.36036902E-01 5.44161079E-08 1.05558886E-01 6.98389974E-03 +57 9-4.00742911E-03-6.98380329E-03-1.87596294E-02 4.94137804E-01 2.12416356E-01 +57 10-1.32344756E-02-2.83953327E-01-3.02320327E-01 8.87904990E-02 5.87138985E-01 +57 11 5.72360863E-02 3.27218263E-01-4.69071896E-01 1.10517768E-01-3.16546588E-01 +57 12 1.38276760E-02 2.96679890E-01 3.15870514E-01-9.27700746E-02-5.43548114E-01 +57 13 1.00162061E-01-3.41884215E-01 4.22865685E-01 7.66558872E-02 3.30734230E-01 +57 14-5.93152730E-04-1.27268401E-02-1.35498553E-02 3.97958026E-03-1.53793004E-02 +57 15-9.00504680E-01 1.46658462E-02 6.22209569E-03 8.66027432E-01-1.41875478E-02 +58 1-4.41045305E-08-3.38111669E-07 2.98444622E-02 1.13302628E-03-4.62194574E-08 +58 2 7.48986493E-07 2.18215321E-01 8.28440780E-03-3.24661739E-07 2.68450103E-06 +58 3 1.13692255E+00 4.31625505E-02-3.13455395E-07-1.41196329E-06 2.79115979E-02 +58 4 1.05964541E-03-2.92947147E-07 2.84726126E-02-2.84729360E-02-1.14154620E-07 +58 5-1.24817482E-03-6.35177019E-03-2.41141083E-04 1.55356168E-01-1.55357324E-01 +58 6-6.95816524E-07-6.81044913E-03-3.50313320E-01-1.32994249E-02-2.61403457E-01 +58 7 2.61402068E-01-7.89532476E-07 1.14592395E-02 6.00748145E-01 2.28070261E-02 +58 8-2.36037173E-01-8.96098977E-03 4.37424383E-07-4.00747637E-03 1.83958435E-01 +58 9-1.05558468E-01-1.83957609E-01-4.94137774E-01-1.87596307E-02-8.06425541E-03 +58 10 8.32599549E-03 1.78635393E-01 1.90191918E-01-5.58584222E-02 5.52640146E-01 +58 11-5.68331942E-01-2.05854542E-01-5.91616189E-01 4.42415974E-01 1.99140908E-01 +58 12 7.29859945E-03 1.56592002E-01 1.66722688E-01-4.89655888E-02 5.95565976E-01 +58 13 5.62356415E-01-1.80452485E-01-6.25478045E-01-4.49521896E-01 1.74567298E-01 +58 14-1.56241904E-02-3.35229691E-01-3.56911755E-01 1.04824047E-01-4.05099677E-01 +58 15 3.41870965E-02 3.86306164E-01 1.63893320E-01-3.28781879E-02-3.73707458E-01 +59 1-1.34716952E-10-4.64454142E-09 8.41646449E-04-3.85677868E-02-5.60526168E-10 +59 2 8.55764745E-09 3.80354563E-03-1.74294489E-01-1.50375162E-09 4.38944545E-08 +59 3-8.12229465E-03 3.72197649E-01 8.90019823E-11 6.39169694E-10 3.09474735E-03 +59 4-1.41814343E-01-7.83822226E-10 2.49915147E-04-2.49920160E-04-2.42554985E-09 +59 5 1.32239484E-02 5.14710775E-04-2.35862104E-02-4.08777494E-03 4.08775380E-03 +59 6-1.11171007E-08-2.16296713E-01-5.37986727E-04 2.46528227E-02-1.54594178E-03 +59 7 1.54592289E-03-1.16833623E-08-8.18002757E-02-2.53255183E-03 1.16052143E-01 +59 8-2.07624784E-02 9.51424288E-01 2.13482397E-09 4.25489326E-01 1.05735660E-02 +59 9-9.28525882E-03-1.05735618E-02 1.04819947E-02-4.80329010E-01 5.59481323E-01 +59 10-8.36008350E-02 8.31898205E-01-1.30377578E-01-5.31691778E-02 1.66307059E-01 +59 11-9.75765909E-02-7.28423871E-01 1.15171046E-01 3.16833438E-01 1.42269361E-01 +59 12 8.57343293E-02-8.53128277E-01 1.33704821E-01 5.45260553E-02-1.54126502E-01 +59 13-9.05839262E-02 7.47013261E-01-1.23108444E-01 3.22033307E-01-1.45900075E-01 +59 14-2.13349583E-03 2.12300552E-02-3.32723570E-03-1.35687904E-03 3.44617105E-05 +59 15-3.71583079E-01-1.85893945E-02-8.47191465E-03 1.13077020E-01 3.63071880E-03 +60 1 1.49860350E-09 6.39008465E-08-3.85677903E-02-8.41646830E-04 8.81377107E-09 +60 2-1.05261066E-07-1.74294477E-01-3.80354674E-03 2.54494364E-08-6.27867361E-07 +60 3 3.72197733E-01 8.12229421E-03 1.16786527E-08-3.34343142E-08-1.41814360E-01 +60 4-3.09474789E-03 3.43284522E-09-1.14522388E-02 1.14523087E-02 3.31979784E-08 +60 5 2.88580086E-04-2.35862115E-02-5.14710713E-04 1.87318565E-01-1.87318259E-01 +60 6 1.50177216E-07-4.72014087E-03 2.46528159E-02 5.37986937E-04 7.08412472E-02 +60 7-7.08409864E-02 1.74841279E-07-1.78508997E-03 1.16052170E-01 2.53255099E-03 +60 8 9.51424073E-01 2.07625014E-02-5.32085035E-08 9.28523001E-03-4.84524978E-01 +60 9 4.25489719E-01 4.84524959E-01-4.80329116E-01-1.04819940E-02 1.22093007E-02 +60 10-5.07304890E-02 5.04811098E-01-7.91155087E-02-3.22640314E-02-2.75585895E-01 +60 11 1.58163491E-01-4.42020882E-01 1.84462449E-01 1.26110679E-01 8.63316153E-02 +60 12-4.70351688E-02 4.68039558E-01-7.33525632E-02-2.99138480E-02-2.82578594E-01 +60 13-1.62269644E-01-4.09823111E-01 1.79262597E-01-1.12168986E-01 8.00430299E-02 +60 14 9.77656818E-02-9.72850441E-01 1.52467992E-01 6.21779053E-02-1.57914430E-03 +60 15-8.10886981E-03 8.51844070E-01 3.88218733E-01 2.46762204E-03-1.66374710E-01 +61 1 1.50348585E-02 1.41870877E+00-3.24318298E-09 1.07612719E-10 9.38301828E-02 +61 2-2.90029228E+00 1.19199611E-08-7.83988448E-10 7.13878836E-02-1.16615854E+01 +61 3 1.21871492E-07-6.17645946E-09-4.40100527E-01-1.89142820E+00 1.58522352E-09 +61 4 1.22944321E-10-3.85476927E-02 7.73086107E-01 7.73086107E-01 8.08503800E-01 +61 5 3.48334791E-11-7.43285366E-10-2.19846366E-11 3.27912113E+00 3.27912115E+00 +61 6 3.56939563E+00-6.50132816E-10-1.91115325E-08 7.37053789E-10 2.78972873E+00 +61 7 2.78972877E+00 3.00821621E+00-1.86378582E-09 3.57249680E-08-2.55774192E-09 +61 8-3.89367117E-01-2.03994331E-09-4.19817367E-02 4.75255699E-09-3.34226542E-01 +61 9 5.22390792E-01-3.34226547E-01-1.55093275E-08 2.21123330E-10 7.93513008E-10 +61 10 2.45117743E-01 7.98886513E-01 1.15343445E-02 2.31043913E-01-1.90874046E-02 +61 11-3.30604841E-02-6.77658086E-02 1.94465020E-01 3.36823360E-01-9.32749701E-02 +61 12 2.45117742E-01 7.98886515E-01 1.15343471E-02 2.31043911E-01-1.90874090E-02 +61 13 3.30604838E-02-6.77658080E-02 1.94465021E-01-3.36823360E-01-9.32749690E-02 +61 14 2.45117747E-01 7.98886486E-01 1.15342950E-02 2.31043946E-01 3.81749094E-02 +61 15-4.43616348E-09-6.77658288E-02-3.88930086E-01 3.41402341E-09-9.32749955E-02 +62 1 0.00000000E+00-1.39822614E-10-1.19659164E-09-2.03567452E-08 0.00000000E+00 +62 2 2.81380699E-10-3.71047001E-09-7.06350254E-08 0.00000000E+00 1.13130332E-09 +62 3 1.02625657E-08 1.59816150E-07 4.59708243E-11 1.66127166E-10-2.81479816E-09 +62 4-4.80290561E-08 0.00000000E+00-2.71007244E-10 1.21290877E-10-7.81160519E-11 +62 5 4.65225930E-09-4.86258089E-10-8.15298946E-09 2.27952311E-09-2.91510392E-09 +62 6-3.50172623E-10-4.53919483E-08-5.90620235E-10 5.60516716E-09 1.94250837E-09 +62 7-2.48935554E-09-2.90497612E-10-5.17065168E-08 3.31082837E-09 4.69330626E-08 +62 8 2.70903613E-08-8.04293526E-01 0.00000000E+00 1.07907366E+00-1.15792576E-08 +62 9 6.24537117E-10 1.16397805E-08-1.25398402E-08-1.95984315E-07 2.69277569E-07 +62 10-1.32757950E-09 3.04798904E-07-1.82037685E-08-3.03759456E-08-5.70387111E-01 +62 11 3.29313150E-01-3.13949054E-07 1.96683852E-01-1.13555331E-01 5.98699518E-08 +62 12 1.35514087E-09-2.85733682E-07 1.75735167E-08 2.81221916E-08 5.70387099E-01 +62 13 3.29313140E-01 2.93904760E-07-1.96683845E-01-1.13555335E-01-5.57462846E-08 +62 14-9.02170736E-11-1.93166682E-08 6.59081801E-10 2.18941373E-09-2.79083749E-09 +62 15-6.58626553E-01 2.00789993E-08 8.79818609E-09 2.27110956E-01-4.10935277E-09 +63 1-2.02439983E-09 1.29686746E-07 5.22040477E-02 4.55877644E-03-6.80946348E-09 +63 2-5.37802729E-07 2.76606233E-01 2.41549465E-02-1.77750611E-08 1.17703202E-08 +63 3-3.40449144E-01-2.97300782E-02 6.69375431E-08-1.00142610E-07-3.11915574E-02 +63 4-2.72383815E-03-1.51630930E-08-7.24294421E-02 7.24296017E-02 5.92314991E-08 +63 5 7.30346821E-03-5.09158629E-02-4.44628342E-03-9.74081475E-01 9.74082262E-01 +63 6 1.86688595E-07 9.82220415E-02-8.25959601E-01-7.21278199E-02-1.86127875E-01 +63 7 1.86128039E-01 2.37447464E-08 1.87683050E-02-2.31646072E-01-2.02287421E-02 +63 8-1.31805792E+00-1.15100857E-01-2.97371757E-08-5.14746926E-02-7.38177341E-01 +63 9-5.89453735E-01 7.38177521E-01-3.11518987E-01-2.72037282E-02 7.44344945E-02 +63 10-6.66532418E-01-4.33677158E-01 2.04373076E-01-1.05266139E-01-5.56785069E-01 +63 11-5.81569814E-01 2.36475360E-01 1.77883035E-01 7.04387287E-02-3.82613852E-02 +63 12-4.91392541E-01-3.19723017E-01 1.50671443E-01-7.76061112E-02-4.71640804E-01 +63 13 3.93445298E-01 1.74338457E-01 1.69111367E-01-3.00084087E-02-2.82077153E-02 +63 14 1.15792464E+00 7.53399755E-01-3.55044431E-01 1.82872272E-01-1.35860042E+00 +63 15-2.03251746E-02-4.10813681E-01 2.60487022E-01 1.26186727E-02 6.64690931E-02 +64 1 2.78529753E-10-1.49889667E-08-4.55877596E-03 5.22040545E-02 7.76571979E-10 +64 2 6.19214276E-08-2.41549433E-02 2.76606263E-01 1.80117299E-09-1.12123972E-08 +64 3 2.97300873E-02-3.40448843E-01-1.02490996E-08 1.13852953E-08 2.72383773E-03 +64 4-3.11915773E-02 1.82965168E-09 6.32497935E-03-6.32499779E-03-6.99273841E-09 +64 5 8.36344220E-02 4.44628383E-03-5.09158603E-02 8.50627350E-02-8.50628261E-02 +64 6-2.26973882E-08 1.12477295E+00 7.21278294E-02-8.25959460E-01 1.62538202E-02 +64 7-1.62538386E-02-2.15682712E-09 2.14922028E-01 2.02287456E-02-2.31645976E-01 +64 8 1.15100851E-01-1.31805794E+00 2.51494344E-09-5.89453606E-01 6.44621525E-02 +64 9 5.14747011E-02-6.44621754E-02 2.72037372E-02-3.11518861E-01 8.52373915E-01 +64 10-9.52233720E-01-6.19567368E-01 2.91975241E-01-1.50387298E-01-4.42603298E-01 +64 11-1.03456581E+00 3.37837699E-01 3.50728212E-02 2.27104665E-01-5.46617087E-02 +64 12 1.05335080E+00 6.85358874E-01-3.22979897E-01 1.66356819E-01 5.32411716E-01 +64 13-1.11971009E+00-3.73712473E-01-6.53744868E-02 2.35876323E-01 6.04661968E-02 +64 14-1.01117045E-01-6.57914461E-02 3.10046474E-02-1.59695242E-02 1.18641276E-01 +64 15-2.32750276E-01 3.58747555E-02-2.27473215E-02 1.44500577E-01-5.80448783E-03 +65 1-1.71607615E-02 8.29171266E-01-1.48796434E-09 1.41862064E-10-4.44711073E-02 +65 2-3.33087390E+00-1.20898032E-08 1.00369603E-09-9.29180788E-02-7.72432016E-01 +65 3-3.65652460E-08 5.73256932E-09 2.80338953E-01-6.69092951E-01 2.19030921E-08 +65 4-1.08265552E-09-7.79632934E-02 5.05242556E-01 5.05242518E-01 3.80788531E-01 +65 5 8.99065553E-10 1.25266596E-08-2.27447252E-10 2.56212537E+00 2.56212492E+00 +65 6 1.50966394E+00 8.67025898E-09 1.57555002E-07-1.86923600E-09 5.07593289E-01 +65 7 5.07593215E-01 3.11588437E-01 1.09318788E-09 1.57756715E-08 1.26534599E-09 +65 8 9.97183188E-01 5.62029732E-09-1.07143435E-01-1.16552683E-08 8.23657127E-01 +65 9-1.33786143E+00 8.23656735E-01 9.38209830E-08-6.85264818E-10 6.35997592E-09 +65 10-9.53571123E-01-5.90494711E-01 2.23857007E-01 4.29322886E-02-4.58628856E-01 +65 11-7.94368409E-01 4.61271294E-01 1.72211459E-02 2.98278945E-02-7.86582967E-02 +65 12-9.53571113E-01-5.90494718E-01 2.23857003E-01 4.29322912E-02-4.58628844E-01 +65 13 7.94368404E-01 4.61271291E-01 1.72211421E-02-2.98278901E-02-7.86582953E-02 +65 14-9.53571474E-01-5.90494780E-01 2.23857083E-01 4.29322379E-02 9.17257954E-01 +65 15 3.62713772E-10 4.61271435E-01-3.44423641E-02-8.32599240E-10-7.86583175E-02 +66 1-5.92297372E-11 1.57008853E-10 1.30007034E-03-4.02822353E-02-2.13496800E-10 +66 2-5.73028976E-10-4.46219844E-03 1.38259694E-01 7.10018382E-10 2.08085167E-09 +66 3-2.62508515E-03 8.13373732E-02 4.46476169E-10 2.78451405E-10 7.97692462E-04 +66 4-2.47162280E-02-1.19361544E-11-1.82157171E-02 1.82157258E-02-8.04313517E-09 +66 5-6.51721838E-01 3.05412973E-02-9.46311624E-01 1.03380508E-02-1.03380553E-02 +66 6 4.84051654E-09 3.69874723E-01-1.75511812E-02 5.43817330E-01-3.28894916E-03 +66 7 3.28895106E-03-1.42762330E-09-1.17672016E-01 4.28727928E-03-1.32839876E-01 +66 8 2.41379226E-03-7.47905532E-02-4.35195854E-10-3.34473489E-02-2.80682381E-05 +66 9 1.07948230E-03 2.80679580E-05-5.61349616E-04 1.73932203E-02-1.00422156E-03 +66 10-2.97641477E-03 8.43980404E-02 4.73055167E-03-2.18149290E-02 6.24059424E-02 +66 11 6.59089515E-03 8.09220049E-02-4.17528066E-04 2.32324967E-02-4.01916110E-02 +66 12 3.08944345E-03-8.76030111E-02-4.91019233E-03 2.26433388E-02-5.84532198E-02 +66 13 1.04915098E-02-8.39949750E-02-1.05885337E-03 2.32531949E-02 4.17178660E-02 +66 14-1.13027215E-04 3.20496755E-03 1.79639736E-04-8.28409798E-04-1.40166947E-03 +66 15-9.61259130E-02 3.07296762E-03-7.56115146E-04 2.26874467E-02-1.52625381E-03 +67 1 7.14947001E-10-1.86248857E-09-4.02822367E-02-1.30007062E-03-4.96136996E-10 +67 2 5.71294243E-09 1.38259699E-01 4.46219938E-03 1.43476571E-09-3.72353125E-09 +67 3 8.13373952E-02 2.62508674E-03 1.01762143E-09-3.92792062E-09-2.47162313E-02 +67 4-7.97692677E-04-1.12466042E-09 5.64407733E-01-5.64407794E-01 5.34179367E-08 +67 5-2.10337031E-02-9.46311548E-01-3.05412975E-02-3.20320949E-01 3.20320978E-01 +67 6-3.32597180E-08 1.19373553E-02 5.43817292E-01 1.75511815E-02 1.01906958E-01 +67 7-1.01906978E-01 8.84351602E-09-3.79775244E-03-1.32839855E-01-4.28727882E-03 +67 8-7.47905464E-02-2.41379349E-03 2.59384763E-09-1.07948115E-03 8.69673189E-04 +67 9-3.34473659E-02-8.69673941E-04 1.73932251E-02 5.61349479E-04-3.24100493E-05 +67 10-1.84895430E-03 5.24280280E-02 2.93862054E-03-1.35514223E-02-5.92865709E-02 +67 11 6.07052513E-02 5.02687074E-02 2.28829301E-02 1.07080340E-03-2.49670075E-02 +67 12-1.65318435E-03 4.68768570E-02 2.62747457E-03-1.21165741E-02-6.31871851E-02 +67 13-6.01539326E-02 4.49461699E-02 2.28622315E-02 4.29477888E-04-2.23234576E-02 +67 14 3.50212203E-03-9.93048677E-02-5.56608443E-03 2.56679960E-02 4.34302448E-02 +67 15-3.10237219E-03-9.52148539E-02 2.34279821E-02 7.32215483E-04 4.72904535E-02 +68 1 3.99169808E-02-9.76212917E-02 9.89309972E-08-4.93077972E-09-4.24794934E-01 +68 2 7.11688609E-02-3.12424604E-07 1.59789692E-08 1.36822095E+00 2.82211102E+00 +68 3-8.53187777E-08 4.89369646E-09 3.99729267E-01-4.09748426E-01 3.67477603E-08 +68 4-2.06691687E-09-1.44583133E-01-7.09063139E-01-7.09063134E-01 1.01901489E+00 +68 5-5.49078446E-10 6.68307119E-08-7.47555593E-09 3.60469216E-01 3.60469206E-01 +68 6-9.11422573E-01 3.11008248E-10-4.73490290E-08 5.65417564E-09-4.61887609E-01 +68 7-4.61887611E-01-3.14249805E-01-1.00812188E-10-7.90792812E-09 2.12833678E-10 +68 8 2.45864163E-01-4.22894656E-09-6.85291908E-01-5.38140446E-09-1.12252287E-01 +68 9-3.29861166E-01-1.12252296E-01 7.49378048E-08-3.06920515E-09-3.47559485E-10 +68 10-2.15076080E-01-7.36083587E-01 2.13717193E-01 1.88817932E-02-8.58887310E-02 +68 11-1.48763618E-01 1.59082056E-01-1.35043229E-01-2.33901729E-01 3.82646301E-02 +68 12-2.15076082E-01-7.36083595E-01 2.13717195E-01 1.88817956E-02-8.58887310E-02 +68 13 1.48763621E-01 1.59082056E-01-1.35043228E-01 2.33901732E-01 3.82646310E-02 +68 14-2.15076065E-01-7.36083505E-01 2.13717173E-01 1.88817628E-02 1.71777394E-01 +68 15 2.06270225E-10 1.59082070E-01 2.70086437E-01-5.58703081E-10 3.82646327E-02 +69 1-7.74394576E-09 2.13172777E-08 1.67696009E+00 6.40005394E-02 1.57969246E-07 +69 2-5.90283295E-08-5.47110866E+00-2.08802766E-01-5.19852705E-07-3.38545113E-07 +69 3-4.17036494E-01-1.59160372E-02-5.26492727E-08 1.57945151E-08 1.73684601E-01 +69 4 6.62860613E-03 1.59357306E-08 7.26068439E-01-7.26068344E-01-1.41876920E-08 +69 5-3.19969009E-02 5.68028767E-01 2.16785978E-02-7.13340117E-01 7.13340104E-01 +69 6 5.59130707E-08 3.14359816E-02-5.69630620E-01-2.17397317E-02 1.06703979E-02 +69 7-1.06702854E-02 4.76193949E-08-4.70228176E-04-5.83468691E-02-2.22678576E-03 +69 8 2.56545055E+00 9.79094406E-02 2.67918679E-07 4.37864292E-02-2.13942168E-01 +69 9 1.14730441E+00 2.13942337E-01 1.22435106E+00 4.67268905E-02 9.42815939E-03 +69 10-1.94956737E-01-3.45247370E-01 8.05683967E-02 5.78998690E-02-1.87489857E-01 +69 11-1.19348406E-01 5.36440429E-02 3.77211510E-02-9.90536160E-02 3.19914996E-02 +69 12-1.70780390E-01-3.02433664E-01 7.05772079E-02 5.07197782E-02-1.79276251E-01 +69 13 9.58666662E-02 4.69917087E-02 4.50782248E-02 9.37184064E-02 2.80242734E-02 +69 14 3.65737248E-01 6.47681275E-01-1.51145646E-01-1.08619647E-01-3.69764861E-01 +69 15-4.62768206E-03-1.00635832E-01-1.25545863E-01 3.70380671E-03-6.00157865E-02 +70 1 7.43004363E-10-2.16793427E-09-6.40005447E-02 1.67696024E+00-1.22516662E-08 +70 2 5.70329629E-09 2.08802784E-01-5.47110915E+00 4.01359576E-08 3.17756240E-08 +70 3 1.59160348E-02-4.17036387E-01 4.12829029E-09-1.15685973E-09-6.62860551E-03 +70 4 1.73684578E-01-1.20634538E-09-2.77101331E-02 2.77101223E-02 2.81394777E-09 +70 5-8.38391602E-01-2.16785981E-02 5.68028649E-01 2.72243590E-02-2.72243578E-02 +70 6-7.29298158E-09 8.23694263E-01 2.17397328E-02-5.69630511E-01-4.07234937E-04 +70 7 4.07224091E-04-4.80476146E-09-1.23210462E-02 2.22678547E-03-5.83468538E-02 +70 8-9.79094461E-02 2.56545088E+00-2.09237842E-08 1.14730447E+00 8.16501968E-03 +70 9-4.37864398E-02-8.16503278E-03-4.67268939E-02 1.22435122E+00 2.47039240E-01 +70 10-3.09758603E-01-5.48549035E-01 1.28011755E-01 9.19946436E-02-1.00608841E-01 +70 11-3.03530767E-01 8.52328032E-02-9.79660295E-02-6.62187730E-02 5.08299378E-02 +70 12 3.23716818E-01 5.73267525E-01-1.33780168E-01-9.61400707E-02 1.14606326E-01 +70 13-3.11744367E-01-8.90735266E-02 9.48060206E-02-7.35758408E-02-5.31204162E-02 +70 14-1.39582251E-02-2.47185108E-02 5.76841696E-03 4.14542689E-03 1.41119367E-02 +70 15-1.21255805E-01 3.84072960E-03 4.79141096E-03 9.70481726E-02 2.29047957E-03 +71 1-1.77690578E-02 5.00518250E-02 1.89039140E-07-5.67027453E-09-3.21001913E+00 +71 2 2.19544435E-02-6.30743624E-07 1.87224979E-08 1.06464661E+01-2.29329899E+00 +71 3 5.25861490E-08-3.44974009E-09-5.39451417E-01-2.42552926E-01-2.63033335E-09 +71 4 1.84981653E-10 2.42262153E-02 1.48939928E-01 1.48939891E-01-9.98879520E-02 +71 5 1.26734817E-09 3.58020490E-09 4.34322796E-10-6.29751190E-02-6.29750696E-02 +71 6 2.40733471E-01-1.52947635E-09-6.46014955E-09-5.30358916E-10 2.42768682E-01 +71 7 2.42768696E-01 3.65362890E-01-3.24588756E-10 5.66019223E-09-8.62079151E-10 +71 8-1.20745803E-01-1.16996779E-08-5.82381717E+00-3.51695235E-09-2.72288280E+00 +71 9 1.61998126E-01-2.72288277E+00 1.46963889E-07-4.77485356E-09-4.77667791E-10 +71 10 1.13709053E-01 5.77510582E-01 9.54379703E-02 1.23296863E-02 5.19256108E-02 +71 11 8.99377895E-02-2.78086199E-02 1.19819086E-01 2.07532730E-01-8.81235217E-02 +71 12 1.13709053E-01 5.77510585E-01 9.54379714E-02 1.23296855E-02 5.19256101E-02 +71 13-8.99377897E-02-2.78086198E-02 1.19819085E-01-2.07532731E-01-8.81235218E-02 +71 14 1.13709065E-01 5.77510582E-01 9.54379652E-02 1.23296929E-02-1.03851218E-01 +71 15 8.14766765E-11-2.78086261E-02-2.39638157E-01 3.65396835E-10-8.81235351E-02 +72 1-4.86522005E-09 1.69155701E-08-2.79731058E+00-9.76653450E-02-1.37177402E-07 +72 2-6.73332954E-08 9.34137944E+00 3.26145068E-01 4.52821351E-07-1.55975012E-07 +72 3-1.12828299E+00-3.93928884E-02-5.05293496E-08-7.40499372E-09 1.18342023E-01 +72 4 4.13179519E-03 5.97852369E-09 4.75574741E-01-4.75574711E-01 2.61443893E-08 +72 5-1.91729109E-02 3.99133330E-01 1.39353460E-02-6.55708019E-01 6.55708059E-01 +72 6 9.40443308E-09 2.64350289E-02-5.59387487E-01-1.95304613E-02-1.49058259E-01 +72 7 1.49058324E-01 1.76787096E-08 6.00932117E-03-1.99208551E-01-6.95516978E-03 +72 8-5.63558056E+00-1.96760744E-01-2.60270358E-07-8.79940850E-02-2.41624405E-01 +72 9-2.52030824E+00 2.41624133E-01-2.40521591E+00-8.39757444E-02 9.74114042E-03 +72 10-2.42420389E-01-5.90792440E-01-9.09481109E-02 8.20230169E-02-1.61398779E-01 +72 11-1.71156838E-01 7.67373714E-02-3.03183232E-02-1.94863244E-01 7.06369210E-02 +72 12-2.14772621E-01-5.23413243E-01-8.05755847E-02 7.26683869E-02-1.50275591E-01 +72 13 1.47431087E-01 6.79855618E-02-1.72945004E-02 1.78162278E-01 6.25808618E-02 +72 14 4.57193078E-01 1.11420577E+00 1.71523696E-01-1.54691401E-01-4.31742449E-01 +72 15-2.22991527E-03-1.44722973E-01-3.46856018E-01 2.92847553E-03-1.33217806E-01 +73 1 5.40794525E-10-2.02733895E-09 9.76653414E-02-2.79731048E+00 8.21521478E-09 +73 2 7.84910147E-09-3.26145056E-01 9.34137916E+00-2.73113675E-08 9.36347099E-09 +73 3 3.93928869E-02-1.12828287E+00 1.72430312E-09-3.61460978E-10-4.13179523E-03 +73 4 1.18342023E-01-4.81100975E-10-1.66042317E-02 1.66042270E-02-1.75568146E-09 +73 5-5.49146488E-01-1.39353475E-02 3.99133299E-01 2.28934067E-02-2.28934115E-02 +73 6-3.28784034E-09 7.57146555E-01 1.95304639E-02-5.59387441E-01 5.20422231E-03 +73 7-5.20422770E-03-1.80223182E-09 1.72117705E-01 6.95516954E-03-1.99208508E-01 +73 8 1.96760742E-01-5.63558038E+00 1.53295654E-08-2.52030822E+00 8.43608470E-03 +73 9 8.79940777E-02-8.43606867E-03 8.39757428E-02-2.40521580E+00 2.79003705E-01 +73 10-3.87959604E-01-9.45479699E-01-1.45549549E-01 1.31266224E-01-1.53853106E-01 +73 11-3.34212451E-01 1.22807334E-01-1.85681592E-01-2.32660866E-01 1.13044395E-01 +73 12 4.03922049E-01 9.84381095E-01 1.51538131E-01-1.36667122E-01 1.64734908E-01 +73 13-3.45335636E-01-1.27860193E-01 1.87343945E-01-2.45684687E-01-1.17695563E-01 +73 14-1.59624499E-02-3.89013990E-02-5.98857980E-03 5.40089815E-03 1.50738656E-02 +73 15-6.38687684E-02 5.05286134E-03 1.21101368E-02 8.38767829E-02 4.65116886E-03 +74 1-7.68098099E-01 3.64007769E+00-2.09806172E-09-3.98225937E-10 1.06441208E-01 +74 2-1.53310482E+01 1.32834370E-08 1.43893591E-09-3.78802013E-01-6.57498114E+00 +74 3 1.07327028E-08 4.99324940E-10 7.68435175E-02-9.90430458E-01-6.22570342E-09 +74 4 4.91139537E-10 1.81201362E-02 3.37886756E+00 3.37886759E+00 3.52770655E+00 +74 5-1.04516403E-09-7.60391222E-09 1.33455400E-10 6.42642075E+00 6.42642069E+00 +74 6 6.14360191E+00 1.97474758E-09 1.69037915E-08-1.91487850E-10 1.95151744E+00 +74 7 1.95151743E+00 1.93117830E+00 7.51052765E-11 2.23063490E-09 2.29499861E-10 +74 8 1.81029188E-01 5.61164633E-10 1.66947370E-01-2.31936293E-09 2.33459750E-01 +74 9-2.42876156E-01 2.33459708E-01 9.40537655E-09-3.69309309E-10 9.19369805E-10 +74 10-2.14440134E-01-7.44196789E-03-2.01404454E-01 1.58386977E-01-9.48979572E-02 +74 11-1.64368064E-01 9.37446819E-02 9.58189373E-03 1.65963236E-02-1.78315079E-02 +74 12-2.14440133E-01-7.44196850E-03-2.01404454E-01 1.58386977E-01-9.48979554E-02 +74 13 1.64368064E-01 9.37446815E-02 9.58189329E-03-1.65963233E-02-1.78315078E-02 +74 14-2.14440164E-01-7.44199057E-03-2.01404468E-01 1.58386997E-01 1.89795907E-01 +74 15 0.00000000E+00 9.37446959E-02-1.91637730E-02-1.10838711E-10-1.78315041E-02 +75 1-2.11839566E+00 1.66548742E+00 6.27244299E-11 0.00000000E+00 2.08050810E-03 +75 2 4.13276756E+00 1.79152955E-10 0.00000000E+00-6.47052554E-03 3.83019031E-01 +75 3-5.82249775E-10 9.72623279E-11 3.14066820E-03-1.96796204E-02 1.27629754E-09 +75 4-7.78551417E-11-1.03535704E-02-1.07570532E+00-1.07570532E+00-1.07179219E+00 +75 5-1.97156184E-11-2.74236946E-10 0.00000000E+00-1.18924713E+00-1.18924714E+00 +75 6-1.20724933E+00 8.67665197E-11 1.43656861E-09 2.16501981E-11-9.79501690E-02 +75 7-9.79501697E-02-9.80199410E-02 0.00000000E+00-1.29927012E-10 3.13725198E-11 +75 8 1.13619711E-02 1.22408052E-10 3.69306824E-03-1.04975573E-10 1.20590499E-02 +75 9-1.52436833E-02 1.20590465E-02 8.26125995E-10 0.00000000E+00 4.22801725E-11 +75 10-4.09014414E-03-2.38167013E-02 3.59176141E-02-3.21282645E-03-9.82158548E-03 +75 11-1.70114832E-02 8.39899834E-03 2.80903678E-03 4.86539340E-03-3.53130182E-03 +75 12-4.09014410E-03-2.38167014E-02 3.59176141E-02-3.21282637E-03-9.82158533E-03 +75 13 1.70114833E-02 8.39899833E-03 2.80903670E-03-4.86539341E-03-3.53130182E-03 +75 14-4.09014698E-03-2.38167019E-02 3.59176147E-02-3.21282740E-03 1.96431716E-02 +75 15 0.00000000E+00 8.39900016E-03-5.61807295E-03-2.41837944E-11-3.53130210E-03 + CANONFOK + -15.5352312987 -1.1472011475 -0.6365837875 -0.6365837703 > + -0.4262276092 0.0423504511 0.0731485222 0.0731485231 > + 0.1788397864 0.2174075480 0.2174075504 0.2209750959 > + 0.3019386700 0.3019386702 0.3097721358 0.6010998289 > + 0.6010998341 0.6341737618 0.6341737649 0.7097883337 > + 0.7469021020 0.8855808163 0.9302924117 0.9302924242 > + 0.9581213602 1.0383784002 1.0383784100 1.1038097693 > + 1.1813575083 1.1813575147 1.3402143529 1.4676088747 > + 1.4676088771 1.6562756487 1.6562756688 1.7402204536 > + 2.0609996307 2.6022378834 2.6022378907 2.7809726006 > + 2.8241572941 2.8241573182 2.9544020446 3.3814014735 > + 3.3814014860 3.6429023684 3.8031622536 3.8031622543 > + 3.9772839785 4.0118198225 4.1305555926 4.1305556145 > + 4.3852942435 4.3852942600 4.6475250798 4.7712528188 > + 4.8030319965 4.8030320480 5.0807588971 5.0807589353 > + 5.1831976637 5.2146327128 6.6072593434 6.6072593688 > + 6.9319799610 10.7958837036 10.7958837136 11.0624750219 > + 11.4634688871 11.4634689351 12.0163482520 12.2933372872 > + 12.2933373201 13.5907079237 44.4597693073 + STOP +SCREEN2 (FROM VDWSCL= 0.700) + A01N1 1.000000000 1.638453384 + A02H2 1.000000000 2.361046226 + A03H3 1.000000000 2.361038049 + A04H4 1.000000000 2.188921079 + BO21 1.000000000 10.000000000 + BO31 1.000000000 10.000000000 + BO41 1.000000000 10.000000000 +STOP +SCREEN (FROM VDWSCL= 0.700) + A01N1 1.000000000 0.776311595 + A02H2 1.000000000 0.941878819 + A03H3 1.000000000 0.941873841 + A04H4 1.000000000 0.900139845 + BO21 1.000000000 10.000000000 + BO31 1.000000000 10.000000000 + BO41 1.000000000 10.000000000 +STOP +MM_CHARGE +A01N1 -0.3 +A02H2 0.1 +A03H3 0.1 +A04H4 0.1 +STOP +MM_LJ +A01N1 0.8 2.2 +A02H2 0.4 1.1 +A03H3 0.4 1.1 +A04H4 0.4 1.1 +STOP +MM_ATOMTYPE +A01N1 N +A02H2 HB +A03H3 HB +A04H4 HB +STOP + $END diff --git a/fraglib/tba_mm.efp b/fraglib/tba_mm.efp new file mode 100644 index 00000000..86e7f5db --- /dev/null +++ b/fraglib/tba_mm.efp @@ -0,0 +1,101 @@ + RUNTYP=MAKEFP EFFECTIVE FRAGMENT POTENTIAL DATA FOLLOWS... + FRAGNAMEEFP GENERATED AT Sat Jan 27 14:04:55 2024 + $tba_mm_l +EFP DATA FOR FRAGNAME SCFTYP=RHF ... GENERATED WITH BASIS SET=XXX + COORDINATES (BOHR) +A01C -0.0131034704 0.0078181102 -0.0712417301 12.0000000 6.0 +A02O 0.2354279153 -0.0121749812 2.6448070450 15.9949100 8.0 +A03H 1.9115852302 -0.7107992903 2.9741372235 1.0078250 1.0 +A04C 2.0969654717 1.6316133970 -1.1708369614 12.0000000 6.0 +A05H 3.9454320187 0.8622310514 -0.6363794848 1.0078250 1.0 +A06H 1.9658064526 3.5666278876 -0.4531701644 1.0078250 1.0 +A07H 2.0099735649 1.6849453308 -3.2386436529 1.0078250 1.0 +A08C -2.6005700881 1.1284068059 -0.6290768316 12.0000000 6.0 +A09H -4.0644312057 0.0167851320 0.3228007373 1.0078250 1.0 +A10H -2.9701390099 1.0898280927 -2.6631063936 1.0078250 1.0 +A11H -2.7265741319 3.0865278189 0.0308591072 1.0078250 1.0 +A12C 0.1512419014 -2.7041901622 -1.0279685098 12.0000000 6.0 +A13H 1.9923418821 -3.5371392630 -0.5583697761 1.0078250 1.0 +A14H -0.1065180399 -2.7881928668 -3.0776873971 1.0078250 1.0 +A15H -1.3423442650 -3.8354358092 -0.1560622137 1.0078250 1.0 +BO21 0.1111622225 -0.0021784355 1.2867826574 0.0000000 0.0 +BO32 1.0735065728 -0.3614871358 2.8094721342 0.0000000 0.0 +BO41 1.0419310007 0.8197157536 -0.6210393457 0.0000000 0.0 +BO54 3.0211987452 1.2469222242 -0.9036082231 0.0000000 0.0 +BO64 2.0313859621 2.5991206423 -0.8120035629 0.0000000 0.0 +BO74 2.0534695183 1.6582793639 -2.2047403071 0.0000000 0.0 +BO81 -1.3068367793 0.5681124580 -0.3501592809 0.0000000 0.0 +BO98 -3.3325006469 0.5725959689 -0.1531380472 0.0000000 0.0 +BO108 -2.7853545490 1.1091174493 -1.6460916126 0.0000000 0.0 +BO118 -2.6635721100 2.1074673124 -0.2991088622 0.0000000 0.0 +BO121 0.0690692155 -1.3481860260 -0.5496051199 0.0000000 0.0 +BO1312 1.0717918917 -3.1206647126 -0.7931691429 0.0000000 0.0 +BO1412 0.0223619307 -2.7461915145 -2.0528279534 0.0000000 0.0 +BO1512 -0.5955511818 -3.2698129857 -0.5920153617 0.0000000 0.0 + STOP + MONOPOLES +A01C -5.6140956580 6.00000 +A02O -8.5434863233 8.00000 +A03H -0.4257243767 1.00000 +A04C -5.8495075384 6.00000 +A05H -0.8250724253 1.00000 +A06H -0.7877604837 1.00000 +A07H -0.8062004935 1.00000 +A08C -5.8078132612 6.00000 +A09H -0.7885078036 1.00000 +A10H -0.8203242914 1.00000 +A11H -0.7885095294 1.00000 +A12C -5.8518177702 6.00000 +A13H -0.8195970394 1.00000 +A14H -0.8073546063 1.00000 +A15H -0.7892765561 1.00000 +BO21 0.0775232408 0.00000 +BO32 -0.4151759636 0.00000 +BO41 0.2525712683 0.00000 +BO54 -0.2771694679 0.00000 +BO64 -0.3473574025 0.00000 +BO74 -0.2951540243 0.00000 +BO81 0.0476688318 0.00000 +BO98 -0.3161140750 0.00000 +BO108 -0.3349942724 0.00000 +BO118 -0.2920637603 0.00000 +BO121 0.1469605629 0.00000 +BO1312 -0.2824884940 0.00000 +BO1412 -0.2928943238 0.00000 +BO1512 -0.3462639634 0.00000 + STOP +MM_CHARGE +A01C 0.23 +A02O -0.65 +A03H 0.42 +A04C -0.27 +A05H 0.09 +A06H 0.09 +A07H 0.09 +A08C -0.27 +A09H 0.09 +A10H 0.09 +A11H 0.09 +A12C -0.27 +A13H 0.09 +A14H 0.09 +A15H 0.09 +STOP +MM_LJ +A01C 0.356359487256 0.1338880 +A02O 0.314487247504 0.8037464 +A03H 0.040001352445 0.1924640 +A04C 0.365268474438 0.3263520 +A05H 0.238760856462 0.1004160 +A06H 0.238760856462 0.1004160 +A07H 0.238760856462 0.1004160 +A08C 0.365268474438 0.3263520 +A09H 0.238760856462 0.1004160 +A10H 0.238760856462 0.1004160 +A11H 0.238760856462 0.1004160 +A12C 0.365268474438 0.3263520 +A13H 0.238760856462 0.1004160 +A14H 0.238760856462 0.1004160 +A15H 0.238760856462 0.1004160 +STOP + $end diff --git a/fraglib/tip3p_mm.efp b/fraglib/tip3p_mm.efp new file mode 100644 index 00000000..88b95075 --- /dev/null +++ b/fraglib/tip3p_mm.efp @@ -0,0 +1,83 @@ + RUNTYP=MAKEFP EFFECTIVE FRAGMENT POTENTIAL DATA FOLLOWS... + FRAGNAMEEFP GENERATED AT Sat Jan 27 14:39:17 2024 + $tip3p_mm_l +EFP DATA FOR FRAGNAME SCFTYP=RHF ... GENERATED WITH BASIS SET=XXX + COORDINATES (BOHR) +A01O 0.0011031519 0.1243154459 0.0000000000 15.9949100 8.0 +A02H -1.4430013168 -0.9797081446 0.0000000000 1.0078250 1.0 +A03H 1.4254935009 -0.9932676886 0.0000000000 1.0078250 1.0 +BO21 -0.7209490825 -0.4276963494 0.0000000000 0.0000000 0.0 +BO31 0.7132983264 -0.4344761213 0.0000000000 0.0000000 0.0 + STOP + MONOPOLES +A01O -8.3429914359 8.00000 +A02H -0.4098748992 1.00000 +A03H -0.4099955787 1.00000 +BO21 -0.4065678175 0.00000 +BO31 -0.4305702687 0.00000 + STOP + DIPOLES +A01O -0.0012074703 -0.6233968167 0.0000000000 +A02H -0.0017818633 -0.0013187832 0.0000000000 +A03H 0.0017359761 -0.0013238004 0.0000000000 +BO21 0.2837175677 0.2103214936 0.0000000000 +BO31 -0.2647452386 0.2261819414 0.0000000000 + STOP + QUADRUPOLES +A01O -3.5937912464 -4.0851193343 -4.6112545030 -0.0040429631 > + 0.0000000000 0.0000000000 +A02H -0.2049436390 -0.2049777444 -0.2050419907 0.0000405762 > + 0.0000000000 0.0000000000 +A03H -0.2040439094 -0.2040791993 -0.2041468527 -0.0000443406 > + 0.0000000000 0.0000000000 +BO21 -0.1525148805 -0.1480012289 -0.1565627785 -0.0139653685 > + 0.0000000000 0.0000000000 +BO31 -0.1927403571 -0.1840503932 -0.1848749096 0.0048782916 > + 0.0000000000 0.0000000000 + STOP + OCTUPOLES +A01O -0.001553499 -1.254700144 0.000000000 -0.408678620 > + 0.000000000 -0.000674684 0.000000000 -0.000610757 > + -0.420427973 0.000000000 +A02H -0.000769156 -0.000596026 -0.000000000 -0.000176038 > + 0.000000000 -0.000252139 0.000000000 -0.000279940 > + -0.000206814 0.000000000 +A03H 0.000747268 -0.000596675 -0.000000000 -0.000176175 > + 0.000000000 0.000243972 0.000000000 0.000272484 > + -0.000207428 0.000000000 +BO21 0.722153938 0.499299465 0.000000000 0.185674109 > + 0.000000000 0.254010572 0.000000000 0.225355414 > + 0.162375522 0.000000000 +BO31 -0.641397469 0.559128411 0.000000000 0.210386348 > + 0.000000000 -0.225477727 0.000000000 -0.201716330 > + 0.180710945 0.000000000 + STOP + POLARIZABLE POINTS +CT1 0.7688639118 -0.4944737221 0.0000010277 + 2.5417905662 1.4266085171 0.0380464320 -1.7317132249 > + 0.0000006872 -0.0000004568 -1.5503157819 0.0000012109 > + -0.0000009371 +CT2 -0.7761570345 -0.4861205562 0.0000005278 + 2.6099452283 1.4037544650 0.0387676583 1.7394616423 > + -0.0000003550 -0.0000002327 1.5589278085 -0.0000006295 > + -0.0000004775 +CT3 0.0027184516 0.4425268785 -0.5113925831 + 0.7736274581 0.8009268104 0.6562549185 0.0028634886 > + -0.0038793613 -0.4632577987 0.0024324004 -0.0036944486 > + -0.4639019184 +CT4 0.0027180938 0.4425296378 0.5113910276 + 0.7736386695 0.8009378276 0.6562493965 0.0028612492 > + 0.0038790290 0.4632584882 0.0024300168 0.0036938672 > + 0.4639033331 + STOP +MM_CHARGE +A01O -0.834 +A02H 0.417 +A03H 0.417 +STOP +MM_LJ +A01O 0.315057422683 0.6363864 +A02H 0.040001352445 0.1924640 +A03H 0.040001352445 0.1924640 +STOP + $END diff --git a/module.sh b/module.sh new file mode 100755 index 00000000..bfcfb789 --- /dev/null +++ b/module.sh @@ -0,0 +1,4 @@ +module load cmake/3.18.2 +module load openblas/0.3.8 +module load netlib-lapack/3.8.0 +module load gcc/10.2.0 diff --git a/nnlib/ANI1x_saved2.pt b/nnlib/ANI1x_saved2.pt new file mode 100644 index 00000000..6d4597c0 Binary files /dev/null and b/nnlib/ANI1x_saved2.pt differ diff --git a/nnlib/ANI2x_saved.pt b/nnlib/ANI2x_saved.pt new file mode 100644 index 00000000..daf219ac Binary files /dev/null and b/nnlib/ANI2x_saved.pt differ diff --git a/nnlib/aev_scripted.pt b/nnlib/aev_scripted.pt new file mode 100644 index 00000000..aed60f07 Binary files /dev/null and b/nnlib/aev_scripted.pt differ diff --git a/nnlib/custom_model_script.pt b/nnlib/custom_model_script.pt new file mode 100644 index 00000000..63079a79 Binary files /dev/null and b/nnlib/custom_model_script.pt differ diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index 97525d64..1ec61b55 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -78,10 +78,13 @@ if (APPLE) else() set(base "$ORIGIN") endif() + +set(CMAKE_INSTALL_LIBDIR "lib") file(RELATIVE_PATH relDir ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}${PYMOD_INSTALL_LIBDIR}/pylibefp ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}) set(CMAKE_INSTALL_RPATH ${base} ${base}/${relDir} ${_dloc}) + message(STATUS "pylibefp rpath: ${CMAKE_INSTALL_RPATH}") pybind11_add_module( diff --git a/setup.csh b/setup.csh new file mode 100644 index 00000000..4f9a78c4 --- /dev/null +++ b/setup.csh @@ -0,0 +1,31 @@ +#!/bin/csh + +setenv TORCH_SWITCH ON + +setenv LIBEFP_DIR "./" +setenv INSTALLATION_DIR "$LIBEFP_DIR" + +if ("$TORCH_SWITCH" == "ON") then + # Set the installation directory for LibTorch + setenv TORCH_INSTALLED_DIR "" + setenv LIBTORCH_INCLUDE_DIRS "$TORCH_INSTALLED_DIR/include/;$TORCH_INSTALLED_DIR/include/torch/csrc/api/include" + setenv TORCHANI_DIR "$LIBEFP_DIR/efpmd/torch" + + echo "Environment variables set for Torch integration:" + echo "LIBEFP_DIR=$LIBEFP_DIR" + echo "INSTALLATION_DIR=$INSTALLATION_DIR" + echo "TORCH_INSTALLED_DIR=$TORCH_INSTALLED_DIR" + echo "LIBTORCH_INCLUDE_DIRS=$LIBTORCH_INCLUDE_DIRS" + echo "TORCHANI_DIR=$TORCHANI_DIR" +else + unsetenv LIBTORCH_INCLUDE_DIRS + unsetenv TORCH_INSTALLED_DIR + unsetenv TORCHANI_DIR + + echo "Torch integration is disabled. Only basic environment variables are set:" + echo "LIBEFP_DIR=$LIBEFP_DIR" + echo "INSTALLATION_DIR=$INSTALLATION_DIR" +endif + +echo "TORCH_SWITCH=$TORCH_SWITCH" + diff --git a/setup.sh b/setup.sh new file mode 100644 index 00000000..34557c61 --- /dev/null +++ b/setup.sh @@ -0,0 +1,30 @@ +#!/bin/zsh + +export TORCH_SWITCH=ON + +export LIBEFP_DIR="./" +export INSTALLATION_DIR="$LIBEFP_DIR" + +if [[ "$TORCH_SWITCH" == "ON" ]] then + # Set the installation directory for LibTorch + export TORCH_INSTALLED_DIR="" + export LIBTORCH_INCLUDE_DIRS="$TORCH_INSTALLED_DIR/include/;$TORCH_INSTALLED_DIR/include/torch/csrc/api/include" + export TORCHANI_DIR="$LIBEFP_DIR/efpmd/torch" + + echo "Environment variables set for Torch integration:" + echo "LIBEFP_DIR=$LIBEFP_DIR" + echo "INSTALLATION_DIR=$INSTALLATION_DIR" + echo "TORCH_INSTALLED_DIR=$TORCH_INSTALLED_DIR" + echo "LIBTORCH_INCLUDE_DIRS=$LIBTORCH_INCLUDE_DIRS" + echo "TORCHANI_DIR=$TORCHANI_DIR" +else + unset LIBTORCH_INCLUDE_DIRS + unset TORCH_INSTALLED_DIR + unset TORCHANI_DIR + + echo "Torch integration is disabled. Only basic environment variables are set:" + echo "LIBEFP_DIR=$LIBEFP_DIR" + echo "INSTALLATION_DIR=$INSTALLATION_DIR" +fi + +echo "TORCH_SWITCH=$TORCH_SWITCH" diff --git a/src/efp.c b/src/efp.c index 9d8bf09f..84f661a3 100644 --- a/src/efp.c +++ b/src/efp.c @@ -35,6 +35,7 @@ #include "stream.h" #include "util.h" +#define DEBUG_GRAD 0 static void update_fragment(struct frag *frag) @@ -107,42 +108,64 @@ set_coord_points(struct frag *frag, const double *coord) static enum efp_result set_coord_atoms(struct frag *frag, const double *coord) { - /* allow fragments with less than 3 atoms by using multipole points of - * ghost atoms; multipole points have the same coordinates as atoms */ - if (frag->n_multipole_pts < 3) { - efp_log("fragment must contain at least three atoms"); - return EFP_RESULT_FATAL; - } + int natoms = frag->n_atoms; - int natoms = frag->lib->n_atoms; + // printf("\nCOORDINATES IN set_coord_atoms\n"); + // for (size_t i=0; ilib->multipole_pts[0].x, - frag->lib->multipole_pts[0].y, - frag->lib->multipole_pts[0].z, - frag->lib->multipole_pts[1].x, - frag->lib->multipole_pts[1].y, - frag->lib->multipole_pts[1].z, - frag->lib->multipole_pts[2].x, - frag->lib->multipole_pts[2].y, - frag->lib->multipole_pts[2].z - }; + double current_coord[3*natoms]; + for (size_t i=0; i<3*natoms; i++) { + current_coord[i] = coord[i]; + } + + double ref_coord[3*natoms]; + for (size_t i=0; ilib->atoms[i].x; + ref_coord[3*i+1] = frag->lib->atoms[i].y; + ref_coord[3*i+2] = frag->lib->atoms[i].z; + } vec_t p1; mat_t rot1, rot2; - efp_points_to_matrix(coord, &rot1); - efp_points_to_matrix(ref, &rot2); + /* compute new rotation matrix */ + /* might need to change to a smarter algorithm later */ + efp_points_to_matrix(current_coord, &rot1); + efp_points_to_matrix(ref_coord, &rot2); rot2 = mat_transpose(&rot2); frag->rotmat = mat_mat(&rot1, &rot2); - p1 = mat_vec(&frag->rotmat, VEC(frag->lib->multipole_pts[0].x)); - /* center of mass */ - frag->x = coord[0] - p1.x; - frag->y = coord[1] - p1.y; - frag->z = coord[2] - p1.z; + double mass = 0.0; + vec_t com = {0.0, 0.0, 0.0}; + for (size_t i=0; iatoms[i].mass; + com.x += current_coord[3*i] * frag->atoms[i].mass; + com.y += current_coord[3*i+1] * frag->atoms[i].mass; + com.z += current_coord[3*i+2] * frag->atoms[i].mass; + } + com.x /= mass; + com.y /= mass; + com.z /= mass; + + /* update center of mass */ + frag->x = com.x; + frag->y = com.y; + frag->z = com.z; + + /* update atom positions */ + for (size_t i=0; iatoms[i].x = current_coord[3*i]; + frag->atoms[i].y = current_coord[3*i + 1]; + frag->atoms[i].z = current_coord[3*i + 2]; + } - update_fragment(frag); + /* update positions of other parameters */ + efp_update_elec_special(frag); + efp_update_pol(frag); + efp_update_disp(frag); + efp_update_xr(frag); return EFP_RESULT_SUCCESS; } @@ -370,6 +393,18 @@ clean_frag_atoms(struct frag *frag) return EFP_RESULT_SUCCESS; } +static enum efp_result zero_atomic_gradient(struct efp *efp) +{ + for (size_t i=0; in_frag; i++) { + for (size_t j=0; jfrags[i].n_atoms; j++) { + efp->frags[i].atoms[j].gx = 0.0; + efp->frags[i].atoms[j].gy = 0.0; + efp->frags[i].atoms[j].gz = 0.0; + } + } + return EFP_RESULT_SUCCESS; +} + static enum efp_result check_opts(const struct efp_opts *opts) { @@ -494,11 +529,24 @@ do_xr(const struct efp_opts *opts) return xr || cp || dd; } +static int +do_lj(const struct efp_opts *opts) +{ + return opts->terms & EFP_TERM_LJ; +} + +static int +do_qq(const struct efp_opts *opts) +{ + return opts->terms & EFP_TERM_QQ; +} + static void compute_two_body_range(struct efp *efp, size_t frag_from, size_t frag_to, void *data) { double e_elec = 0.0, e_disp = 0.0, e_xr = 0.0, e_cp = 0.0, e_elec_tmp = 0.0, e_disp_tmp = 0.0; + double e_lj = 0.0, e_qq = 0.0, e_qq_tmp = 0.0; (void)data; @@ -506,7 +554,7 @@ compute_two_body_range(struct efp *efp, size_t frag_from, size_t frag_to, bool if_pairwise = efp->opts.enable_pairwise && efp->opts.ligand > -1; #ifdef _OPENMP -#pragma omp parallel for schedule(dynamic) reduction(+:e_elec,e_disp,e_xr,e_cp) +#pragma omp parallel for schedule(dynamic) reduction(+:e_elec,e_disp,e_xr,e_cp,e_qq,e_lj) #endif for (size_t i = frag_from; i < frag_to; i++) { size_t cnt = efp->n_frag % 2 ? (efp->n_frag - 1) / 2 : @@ -516,6 +564,14 @@ compute_two_body_range(struct efp *efp, size_t frag_from, size_t frag_to, for (size_t j = i + 1; j < i + 1 + cnt; j++) { size_t fr_j = j % efp->n_frag; + // special fragment - additional check on special terms + bool if_special_fragment = efp->opts.special_fragment == i || efp->opts.special_fragment == fr_j; + bool special_xr = if_special_fragment && (efp->opts.special_terms & EFP_SPEC_TERM_XR); + bool special_elec = if_special_fragment && (efp->opts.special_terms & EFP_SPEC_TERM_ELEC); + bool special_disp = if_special_fragment && (efp->opts.special_terms & EFP_SPEC_TERM_DISP); + bool special_qq = (!if_special_fragment) || (if_special_fragment && (efp->opts.special_terms & EFP_SPEC_TERM_QQ)); + bool special_lj = if_special_fragment && (efp->opts.special_terms & EFP_SPEC_TERM_LJ); + if (!efp_skip_frag_pair(efp, i, fr_j)) { double *s; six_t *ds; @@ -527,7 +583,7 @@ compute_two_body_range(struct efp *efp, size_t frag_from, size_t frag_to, s = (double *) calloc(n_lmo_ij, sizeof(double)); ds = (six_t *) calloc(n_lmo_ij, sizeof(six_t)); - if (do_xr(&efp->opts)) { + if (do_xr(&efp->opts) || special_xr) { double exr, ecp; efp_frag_frag_xr(efp, i, fr_j, @@ -548,9 +604,12 @@ compute_two_body_range(struct efp *efp, size_t frag_from, size_t frag_to, } } } - if (do_elec(&efp->opts) && efp->frags[i].n_multipole_pts > 0 && + if ((do_elec(&efp->opts) || special_elec) && efp->frags[i].n_multipole_pts > 0 && efp->frags[fr_j].n_multipole_pts > 0) { e_elec_tmp = efp_frag_frag_elec(efp, i, fr_j); + // zeroing the energy contribution on the special fragment in torch custom models + if (efp->opts.enable_elpot && if_special_fragment) e_elec_tmp = 0.0; + //e_elec_tmp = efp_frag_frag_elec(efp, i, fr_j); e_elec += e_elec_tmp; /* */ if (if_pairwise) { @@ -560,7 +619,7 @@ compute_two_body_range(struct efp *efp, size_t frag_from, size_t frag_to, efp->pair_energies[i].electrostatic = e_elec_tmp; } } - if (do_disp(&efp->opts) && efp->frags[i].n_dynamic_polarizable_pts > 0 && + if ((do_disp(&efp->opts) || special_disp) && efp->frags[i].n_dynamic_polarizable_pts > 0 && efp->frags[fr_j].n_dynamic_polarizable_pts > 0) { e_disp_tmp = efp_frag_frag_disp(efp, i, fr_j, s, ds); @@ -573,6 +632,19 @@ compute_two_body_range(struct efp *efp, size_t frag_from, size_t frag_to, efp->pair_energies[i].dispersion = e_disp_tmp; } } + // LJ terms + if (do_lj(&efp->opts) || special_lj) { + e_lj += efp_frag_frag_lj(efp, i, fr_j); + } + // MM-like charge-charge interactions + if (do_qq(&efp->opts) && special_qq) { + e_qq_tmp = efp_frag_frag_qq(efp, i, fr_j); + + // zeroing the energy contribution on the special fragment in torch custom models + if (efp->opts.enable_elpot && if_special_fragment) e_qq_tmp = 0.0; + e_qq += e_qq_tmp; + } + if (n_lmo_ij > 0) { free(s); free(ds); @@ -584,11 +656,14 @@ compute_two_body_range(struct efp *efp, size_t frag_from, size_t frag_to, efp->energy.dispersion += e_disp; efp->energy.exchange_repulsion += e_xr; efp->energy.charge_penetration += e_cp; + efp->energy.qq += e_qq; + efp->energy.lj += e_lj; - if (efp->opts.print > 0) { + if (efp->opts.print > 1) { printf(" In compute_two_body_range() \n"); print_ene(&efp->energy); - print_energies(efp); + if (efp->opts.enable_pairwise) + print_energies(efp); } } @@ -648,6 +723,12 @@ compute_two_body_crystal(struct efp *efp) } if (do_elec(&efp->opts) && efp->frags[i].n_multipole_pts > 0 && efp->frags[fr_j].n_multipole_pts > 0) { + + // switch off frag-frag e_elec for torch custom models + //if (efp->opts.enable_elpot) e_elec_tmp = 0.0; + //else e_elec_tmp = efp_frag_frag_elec(efp, i, fr_j); + + e_elec_tmp = efp_frag_frag_elec(efp, i, fr_j); e_elec += e_elec_tmp * factor; @@ -875,6 +956,218 @@ efp_get_atomic_gradient(struct efp *efp, double *grad) return res; } +EFP_EXPORT enum efp_result +efp_get_frag_atomic_gradient(struct efp *efp, size_t frag_id, double *grad) +{ + six_t *efpgrad = NULL; /* Calculated EFP gradient */ + vec_t *pgrad; /* Conversion of grad to vec_t type */ + size_t i, j, k, l; + size_t nr; /* Number of atoms in the current fragment */ + vec_t *r = NULL; /* Radius-vector of each atom inside current fragment + with respect to CoM of that fragment */ + double mm, *m = NULL; /* Total Mass of fragments and individual atoms */ + double I, *Ia = NULL; /* Inertia along axis and contribution of each + individual atom */ + mat_t Id; /* Total inertia tensor of a fragment */ + vec_t v, g; /* Principal axis and Inertia along that axis */ + vec_t rbuf, rbuf2, tq, ri, rt; + double dist, sina, ft, norm; + enum efp_result res; + + assert(efp); + assert(grad); + assert(frag_id < efp->n_frag); + + if (!efp->do_gradient) { + efp_log("gradient calculation was not requested"); + return EFP_RESULT_FATAL; + } + pgrad = (vec_t *)grad; + + /* size of a fragment */ + nr = efp->frags[frag_id].n_atoms; + + res = EFP_RESULT_NO_MEMORY; + /* Create and initialize some arrays for work */ + if ((r = (vec_t *)malloc(nr * sizeof(*r))) == NULL) + goto error; + if ((m = (double *)malloc(nr * sizeof(*m))) == NULL) + goto error; + if ((Ia = (double *)malloc(nr * sizeof(*Ia))) == NULL) + goto error; + + //for (size_t i=0; in_frag; i++) { + // printf(" %12.6lf %12.6lf %12.6lf \n", efp->grad[i].x, efp->grad[i].y, efp->grad[i].z); + //} + + + /* Copy computed efp->grad */ + if ((efpgrad = (six_t *)malloc(sizeof(*efpgrad))) == NULL) + goto error; + memcpy(efpgrad, efp->grad + frag_id, sizeof(*efpgrad)); + + if (DEBUG_GRAD) { + printf("\nGradient in efp_get_frag_atomic_gradient 0\n"); + for (size_t i = 0; i < nr; i++) { + printf(" %12.6lf %12.6lf %12.6lf \n", pgrad[i].x, pgrad[i].y, pgrad[i].z); + } + printf(" efpgrad %12.6lf %12.6lf %12.6lf \n", efpgrad->x, efpgrad->y, efpgrad->z); + } + + memset(r, 0, nr * sizeof(*r)); + memset(m, 0, nr * sizeof(*m)); + memset(Ia, 0, nr * sizeof(*Ia)); + mm = 0.0; + Id = mat_zero; + v = vec_zero; + g = vec_zero; + + for (i = 0; i < nr ; i++) { + r[i].x = efp->frags[frag_id].atoms[i].x - efp->frags[frag_id].x; + r[i].y = efp->frags[frag_id].atoms[i].y - efp->frags[frag_id].y; + r[i].z = efp->frags[frag_id].atoms[i].z - efp->frags[frag_id].z; + m[i] = efp->frags[frag_id].atoms[i].mass; + mm += m[i]; + + /* Inertia tensor contribution calculations */ + Id.xx += m[i] * (r[i].y*r[i].y + r[i].z*r[i].z); + Id.yy += m[i] * (r[i].x*r[i].x + r[i].z*r[i].z); + Id.zz += m[i] * (r[i].x*r[i].x + r[i].y*r[i].y); + Id.xy -= m[i] * r[i].x * r[i].y; + Id.yx -= m[i] * r[i].x * r[i].y; + Id.xz -= m[i] * r[i].x * r[i].z; + Id.zx -= m[i] * r[i].x * r[i].z; + Id.yz -= m[i] * r[i].y * r[i].z; + Id.zy -= m[i] * r[i].y * r[i].z; + } + + /* Try to diagonalize Id and get principal axis */ + if (efp_dsyev('V', 'U', 3, (double *)&Id, 3, (double *)&g)) { + efp_log("inertia tensor diagonalization failed"); + res = EFP_RESULT_FATAL; + goto error; + } + + /* Add any additional forces from grad array to efpgrad array */ + for (i = 0; i < nr; i++) { + efpgrad->x += pgrad[i].x; + efpgrad->y += pgrad[i].y; + efpgrad->z += pgrad[i].z; + rbuf = vec_cross(&r[i], &pgrad[i]); + efpgrad->a += rbuf.x; + efpgrad->b += rbuf.y; + efpgrad->c += rbuf.z; + pgrad[i] = vec_zero; + } + + /* Now we are ready to redistribute efpgrad over the atoms */ + + /* Redistribute total translation grad[i]=m[i]/mm*efpgrad[j] */ + for (i = 0; i < nr; i++) { + pgrad[i].x = efpgrad->x; + pgrad[i].y = efpgrad->y; + pgrad[i].z = efpgrad->z; + vec_scale(&pgrad[i], m[i] / mm); + } + + if (DEBUG_GRAD) { + printf("\nGradient in efp_get_frag_atomic_gradient 1\n"); + for (size_t i = 0; i < nr; i++) { + printf(" %12.6lf %12.6lf %12.6lf \n", pgrad[i].x, pgrad[i].y, pgrad[i].z); + } + printf(" efpgrad %12.6lf %12.6lf %12.6lf \n", efpgrad->x, efpgrad->y, efpgrad->z); + } + + /* Redistribution of torque should be done over 3 principal + axes computed previously */ + for (l = 0; l < 3; l++) { + v = ((vec_t *)&Id)[l]; + tq.x = efpgrad->a; + tq.y = efpgrad->b; + tq.z = efpgrad->c; + + /* Calculate contribution of each atom to moment of + inertia with respect to current axis */ + I = 0.0; + for (i = 0; i < nr; i++) { + rbuf = vec_cross(&v, &r[i]); + dist = vec_len(&rbuf); + Ia[i] = m[i] * dist * dist; + I += Ia[i]; + } + + /* Project torque onto v axis */ + norm = vec_dot(&tq, &v); + tq = v; + vec_scale(&tq, norm); + + /* Now distribute torque using Ia[i]/I as a scale */ + for (i = 0; i < nr; i++) { + if (eq(Ia[i], 0.0)) + continue; + /* If atom is not on the current axis */ + rbuf = tq; + vec_scale(&rbuf, Ia[i]/I); + ft = vec_len(&rbuf); + ri = r[i]; + vec_normalize(&ri); + rt = tq; + vec_normalize(&rt); + rbuf2 = vec_cross(&rt, &ri); + sina = vec_len(&rbuf2); + vec_normalize(&rbuf2); + vec_scale(&rbuf2, ft/sina/vec_len(&r[i])); + /* Update grad with torque contribution of + atom i over axis v */ + pgrad[i] = vec_add(&pgrad[i], &rbuf2); + } + } + + if (DEBUG_GRAD) { + printf("\nGradient in efp_get_frag_atomic_gradient 2\n"); + for (size_t i = 0; i < nr; i++) { + printf(" %12.6lf %12.6lf %12.6lf \n", pgrad[i].x, pgrad[i].y, pgrad[i].z); + } + printf(" efpgrad %12.6lf %12.6lf %12.6lf \n", efpgrad->x, efpgrad->y, efpgrad->z); + } + + // these gradients should match only for qq & lj atoms + //if (efp->opts.print > 1) { + if (DEBUG_GRAD) { + printf("\n Atomic gradient: efp atoms vs distributed\n"); + for (i = 0; i < nr; i++) { + printf(" %12.6lf %12.6lf %12.6lf %12.6lf %12.6lf %12.6lf\n", + efp->frags[frag_id].atoms[i].gx, efp->frags[frag_id].atoms[i].gy, efp->frags[frag_id].atoms[i].gz, + pgrad[i].x, pgrad[i].y, pgrad[i].z); + } + } + + res = EFP_RESULT_SUCCESS; + error: + free(r); + free(m); + free(Ia); + free(efpgrad); + return res; +} + +EFP_EXPORT enum efp_result +efp_get_atom_gradient(struct efp *efp, size_t frag_id, double *grad) +{ + assert(efp); + assert(frag_id < efp->n_frag); + assert(grad); + + for (size_t i=0; ifrags[frag_id].n_atoms; i++) { + grad[3*i] = efp->frags[frag_id].atoms[i].gx; + grad[3*i+1] = efp->frags[frag_id].atoms[i].gy; + grad[3*i+2] = efp->frags[frag_id].atoms[i].gz; + } + + return EFP_RESULT_SUCCESS; +} + + EFP_EXPORT enum efp_result efp_set_point_charges(struct efp *efp, size_t n_ptc, const double *ptc, const double *xyz) @@ -906,6 +1199,50 @@ efp_set_point_charges(struct efp *efp, size_t n_ptc, const double *ptc, return EFP_RESULT_SUCCESS; } +EFP_EXPORT enum efp_result +update_special_fragment(struct efp *efp, const double *coord) +{ + assert(efp); + assert(coord); + //printf("Inside update_special_fragment\n"); + size_t fr_i = efp->opts.special_fragment; + struct frag *spec_frag = efp->frags + fr_i; + + if (set_coord_atoms(spec_frag, coord)) { + efp_log("set_coord_atoms() failure"); + return EFP_RESULT_FATAL; + } + + return EFP_RESULT_SUCCESS; +} + +EFP_EXPORT enum efp_result +update_gradient_special_fragment(struct efp *efp) +{ + assert(efp); + if (efp->opts.special_fragment < 0) { + efp_log("special fragment not set, continue"); + return EFP_RESULT_SUCCESS; + } + + size_t fr_i = efp->opts.special_fragment; + struct frag *spec_frag = efp->frags + fr_i; + + for (size_t i=0; in_atoms; i++) { + // update ptc gradients + efp->ptc_grad[i].x += spec_frag->atoms[i].gx; + efp->ptc_grad[i].y += spec_frag->atoms[i].gy; + efp->ptc_grad[i].z += spec_frag->atoms[i].gz; + + // update special fragment gradients + spec_frag->atoms[i].gx = efp->ptc_grad[i].x; + spec_frag->atoms[i].gy = efp->ptc_grad[i].y; + spec_frag->atoms[i].gz = efp->ptc_grad[i].z; + } + + return EFP_RESULT_SUCCESS; +} + EFP_EXPORT enum efp_result efp_get_point_charge_count(struct efp *efp, size_t *n_ptc) { @@ -1077,6 +1414,64 @@ efp_get_frag_xyzabc(struct efp *efp, size_t frag_idx, double *xyzabc) return EFP_RESULT_SUCCESS; } +EFP_EXPORT enum efp_result +efp_get_frag_atom_coord(struct efp *efp, size_t frag_idx, double *coord) { + + struct frag *frag; + + assert(efp); + assert(frag_idx < efp->n_frag); + assert(coord); + + frag = efp->frags + frag_idx; + + for (size_t i=0; in_atoms; i++) { + coord[3*i] = frag->atoms[i].x; + coord[3*i + 1] = frag->atoms[i].y; + coord[3*i + 2] = frag->atoms[i].z; + } + + return EFP_RESULT_SUCCESS; +} + +EFP_EXPORT enum efp_result +efp_set_frag_atom_coord(struct efp *efp, size_t frag_idx, const double *coord) { + + struct frag *frag; + + assert(efp); + assert(frag_idx < efp->n_frag); + assert(coord); + + frag = efp->frags + frag_idx; + + for (size_t i=0; in_atoms; i++) { + frag->atoms[i].x = coord[3*i]; + frag->atoms[i].y = coord[3*i + 1]; + frag->atoms[i].z = coord[3*i + 2]; + } + + return EFP_RESULT_SUCCESS; +} + +EFP_EXPORT enum efp_result +efp_get_frag_atom_znuc(struct efp *efp, size_t frag_idx, int *charges) { + + struct frag *frag; + + assert(efp); + assert(frag_idx < efp->n_frag); + assert(charges); + + frag = efp->frags + frag_idx; + + for (size_t i=0; in_atoms; i++) { + charges[i] = frag->atoms[i].znuc; + } + + return EFP_RESULT_SUCCESS; +} + EFP_EXPORT enum efp_result efp_set_periodic_box(struct efp *efp, double x, double y, double z, double alpha, double beta, double gamma) { @@ -1309,7 +1704,9 @@ efp_compute(struct efp *efp, int do_gradient) return EFP_RESULT_FATAL; } - efp->do_gradient = do_gradient; + // WARNING!!! Lyuda!!! + //efp->do_gradient = do_gradient; + efp->do_gradient = 1; if (efp_counter == 0) if ((res = check_params(efp))) { @@ -1323,6 +1720,11 @@ efp_compute(struct efp *efp, int do_gradient) memset(efp->ptc_grad, 0, efp->n_ptc * sizeof(vec_t)); memset(efp->pair_energies, 0, efp->n_frag * sizeof(efp->energy)); + if ((res = zero_atomic_gradient(efp))) { + efp_log("zero_atomic_gradient(efp) failure"); + return res; + } + if (efp->opts.symmetry == 0) { // standard case efp_balance_work(efp, compute_two_body_range, NULL); } @@ -1345,12 +1747,18 @@ efp_compute(struct efp *efp, int do_gradient) efp_log("efp_compute_ai_disp() failure"); return res; } + if ((res = efp_compute_ai_qq(efp))){ + efp_log("efp_compute_ai_mm() failure"); + return res; + } #ifdef EFP_USE_MPI efp_allreduce(&efp->energy.electrostatic, 1); efp_allreduce(&efp->energy.dispersion, 1); efp_allreduce(&efp->energy.exchange_repulsion, 1); efp_allreduce(&efp->energy.charge_penetration, 1); + efp_allreduce(&efp->energy.lj, 1); + efp_allreduce(&efp->energy.qq, 1); if (efp->do_gradient) { efp_allreduce((double *)efp->grad, 6 * efp->n_frag); @@ -1361,10 +1769,12 @@ efp_compute(struct efp *efp, int do_gradient) efp->energy.total = efp->energy.electrostatic + efp->energy.charge_penetration + efp->energy.electrostatic_point_charges + + efp->energy.qq + efp->energy.polarization + efp->energy.dispersion + efp->energy.ai_dispersion + - efp->energy.exchange_repulsion; + efp->energy.exchange_repulsion + + efp->energy.lj; efp_counter++; @@ -1722,6 +2132,7 @@ efp_get_old_induced_dipole_values(struct efp *efp, double *dip) *dip++ = pt->indip_old.z; } } + return EFP_RESULT_SUCCESS; } EFP_EXPORT enum efp_result @@ -1741,6 +2152,7 @@ efp_get_old_induced_dipole_conj_values(struct efp *efp, double *dip) *dip++ = pt->indipconj_old.z; } } + return EFP_RESULT_SUCCESS; } EFP_EXPORT enum efp_result @@ -1861,6 +2273,7 @@ efp_opts_default(struct efp_opts *opts) memset(opts, 0, sizeof(*opts)); opts->terms = EFP_TERM_ELEC | EFP_TERM_POL | EFP_TERM_DISP | EFP_TERM_XR | EFP_TERM_AI_ELEC | EFP_TERM_AI_POL; + opts->special_terms = EFP_SPEC_TERM_DISP | EFP_SPEC_TERM_XR ; } EFP_EXPORT void @@ -2127,6 +2540,28 @@ efp_set_frag_atoms(struct efp *efp, size_t frag_idx, size_t n_atoms, return EFP_RESULT_SUCCESS; } +EFP_EXPORT enum efp_result efp_get_atom_mm_info(struct efp *efp, double *charges, double *coords) { + + assert(coords); + assert(charges); + + int natom = 0; + for (size_t fr_i = 0; fr_i < efp->n_frag; fr_i++) { + // assume that this function is always used in QM/MM like models with QM fragment + if (efp->opts.special_fragment == fr_i) continue; + struct frag *frag = efp->frags + fr_i; + for (size_t j = 0; j < frag->n_atoms; j++) { + struct efp_atom *atom = frag->atoms + j; + + *coords++ = atom->x; + *coords++ = atom->y; + *coords++ = atom->z; + *charges++ = atom->mm_charge; + } + } + return EFP_RESULT_SUCCESS; +} + EFP_EXPORT enum efp_result efp_get_frag_mult_pt(struct efp *efp, size_t frag_idx, size_t pt_idx, struct efp_mult_pt *mult_pt) @@ -2463,6 +2898,7 @@ print_atoms(struct efp *efp, size_t frag_index, size_t atom_index) { struct efp_atom *atom = efp->frags[frag_index].atoms + atom_index; printf(" Atom %s %lf %lf %lf\n", atom->label, atom->x, atom->y, atom->z); printf(" znuc, mass %lf %lf\n", atom->znuc, atom->mass); + printf(" mm_charge, sigma, epsilon, atom_type %lf %lf %lf %s\n", atom->mm_charge, atom->sigma, atom->epsilon, atom->ff_label); printf("\n"); } @@ -2559,9 +2995,14 @@ void print_ene(struct efp_energy *energy) { printf(" DISPERSION ENERGY %lf \n", energy->dispersion); printf(" AI DISPERSION ENERGY %lf \n", energy->ai_dispersion); printf(" EXCHANGE-REPULSION ENERGY %lf \n", energy->exchange_repulsion); + + printf(" COULOMB MM ENERGY %lf \n", energy->qq); + printf(" LENNARD-JONES MM ENERGY %lf \n", energy->lj); + double ene_sum = energy->electrostatic + energy->charge_penetration + energy->electrostatic_point_charges + energy->polarization + - energy->dispersion + energy->exchange_repulsion; + energy->dispersion + energy->exchange_repulsion + + energy->qq + energy->lj; printf(" SUM ENERGY %lf \n", ene_sum); printf(" TOTAL ENERGY %lf \n", energy->total); printf("\n"); diff --git a/src/efp.h b/src/efp.h index b1ecc193..4064cdb8 100644 --- a/src/efp.h +++ b/src/efp.h @@ -41,7 +41,7 @@ extern "C" { #endif /** Version string. */ -#define LIBEFP_VERSION_STRING "1.8.0" +#define LIBEFP_VERSION_STRING "2.0.0" /** Result of an operation. */ enum efp_result { @@ -82,7 +82,31 @@ enum efp_term { /** Ab initio/EFP exchange repulsion, reserved for future use. */ EFP_TERM_AI_XR = 1 << 8, /** Ab initio/EFP charge transfer, reserved for future use. */ - EFP_TERM_AI_CHTR = 1 << 9 + EFP_TERM_AI_CHTR = 1 << 9, + /** MM-like charge-charge coulomb interaction */ + EFP_TERM_QQ = 1 << 10, + /** MM-like Lennard-Jones interaction */ + EFP_TERM_LJ = 1 << 11, + /** QM/MM coulomb interaction with MM charges */ + EFP_TERM_AI_QQ = 1 << 12 +}; + +/** Flags to specify EFP energy terms for a special fragment. */ +enum efp_special_term { + /** EFP/EFP electrostatics. */ + EFP_SPEC_TERM_ELEC = 1 << 0, + /** EFP/EFP polarization. */ + EFP_SPEC_TERM_POL = 1 << 1, + /** EFP/EFP dispersion. */ + EFP_SPEC_TERM_DISP = 1 << 2, + /** EFP/EFP exchange repulsion. */ + EFP_SPEC_TERM_XR = 1 << 3, + /** EFP/EFP charge transfer, reserved for future use. */ + EFP_SPEC_TERM_CHTR = 1 << 4, + /** MM-like charge-charge coulomb interaction */ + EFP_SPEC_TERM_QQ = 1 << 5, + /** MM-like Lennard-Jones interaction */ + EFP_SPEC_TERM_LJ = 1 << 6 }; /** Fragment-fragment dispersion damping type. */ @@ -144,7 +168,9 @@ struct efp_opts { * set to 0). To enable the term, use bitwise OR with the corresponding * efp_term constant (e.g., terms |= EFP_TERM_ELEC). To disable the * term, use bitwise AND NOT (e.g., terms &= ~EFP_TERM_POL). */ - unsigned terms; + unsigned terms; + /** Terms for a special fragment - typically QM or ML fragment*/ + unsigned special_terms; /** Dispersion damping type (see #efp_disp_damp). */ enum efp_disp_damp disp_damp; /** Electrostatic damping type (see #efp_elec_damp). */ @@ -155,6 +181,8 @@ struct efp_opts { enum efp_pol_driver pol_driver; /** Enable periodic boundary conditions if nonzero. */ int enable_pbc; + /** Enable switching off elpot contribution for custom torch gradient*/ + int enable_elpot; /** Enable fragment-fragment interaction cutoff if nonzero. */ int enable_cutoff; /** Cutoff distance for fragment-fragment interactions. */ @@ -166,8 +194,8 @@ struct efp_opts { /** Index of ligand for enable_pairwise. * default = 0 (ie the first fragment); -1 defines the ligand to be a QM region. */ int ligand; - /** Prints fragment coordinates rearranged around ligand. Applicable for periodic simulations only. */ - int print_pbc; + /** Index of a special (QM or ML) fragment */ + int special_fragment; /** Is 1 for periodic symmetric system (ctystal lattice). Default is 0 */ int symmetry; /** Specifies symmetric elements of the crystal lattice. Default each unique fragment. @@ -195,9 +223,16 @@ struct efp_energy { * damping. Zero if overlap-based damping is turned off. */ double charge_penetration; /** - * Interaction energy of EFP electrostatics with point charges. */ + * Interaction energy of EFP electrostatics with point charges. + * This is obsolete parameter; not tested properly*/ double electrostatic_point_charges; - /** + /** + * MM-like charge-charge interaction energy. */ + double qq; + /** + * MM-like Lennard-Jones interaction energy. */ + double lj; + /** * All polarization energy goes here. Polarization is computed * self-consistently so it can't be separated into EFP/EFP and AI/EFP * parts. */ @@ -231,8 +266,15 @@ struct efp_atom { double x; /**< X coordinate of atom position. */ double y; /**< Y coordinate of atom position. */ double z; /**< Z coordinate of atom position. */ + double gx; /**< X component of gradient. */ + double gy; /**< Y component of gradient. */ + double gz; /**< Z component of gradient. */ double mass; /**< Atom mass. */ double znuc; /**< Nuclear charge. */ + double mm_charge; /**< Classical charge. */ + double sigma; /**< vdW parameter. */ + double epsilon; /**< vdW parameter. */ + char ff_label[32]; /**< Force field atom type. */ }; /** Multipole point for working with external programs */ @@ -614,6 +656,19 @@ enum efp_result efp_set_frag_coordinates(struct efp *efp, size_t frag_idx, */ enum efp_result efp_get_coordinates(struct efp *efp, double *xyzabc); +/** + * Update coordinates of a special fragment following QM geom optimization + * @param[in] efp The efp structure. + * @param[in] coord Coordinates of the QM region -> become new coordiantes of a special fragment + * @return ::EFP_RESULT_SUCCESS on success or error code otherwise. + */ +enum efp_result update_special_fragment(struct efp *efp, const double *coord); + +/** + * Update gradient on special fragment and on ptc (QM nuclei) points + */ +enum efp_result update_gradient_special_fragment(struct efp *efp); + /** * Get center of mass position and Euler angles of a fragment. * @@ -631,6 +686,36 @@ enum efp_result efp_get_coordinates(struct efp *efp, double *xyzabc); enum efp_result efp_get_frag_xyzabc(struct efp *efp, size_t frag_idx, double *xyzabc); +/** + * Get coordinates of all fragment atoms + * @param efp The efp structure. + * @param frag_idx ndex of a fragment. Must be a value between zero and + * the total number of fragments minus one. + * @param coord Upon return the coordinates of fragment atoms + * @return ::EFP_RESULT_SUCCESS on success or error code otherwise. + */ +enum efp_result efp_get_frag_atom_coord(struct efp *efp, size_t frag_idx, double *coord); + +/** + * + * @param efp The efp structure. + * @param frag_idx Index of a fragment. Must be a value between zero and + * the total number of fragments minus one. + * @param charges Values of the atomic charges znuc + * @return + */ +enum efp_result efp_get_frag_atom_znuc(struct efp *efp, size_t frag_idx, int *charges); + +/** + * Set coordinates of all fragment atoms + * @param efp The efp structure. + * @param frag_idx ndex of a fragment. Must be a value between zero and + * the total number of fragments minus one. + * @param coord Values of the atoms coordinates + * @return ::EFP_RESULT_SUCCESS on success or error code otherwise. + */ +enum efp_result efp_set_frag_atom_coord(struct efp *efp, size_t frag_idx, const double *coord); + /** * Setup periodic box size. * @@ -1137,6 +1222,31 @@ enum efp_result efp_get_gradient(struct efp *efp, double *grad); */ enum efp_result efp_get_atomic_gradient(struct efp *efp, double *grad); +/** + * Get computed EFP energy gradient on individual atoms of fragment frag_id. The function is + * adapted from efp_get_atomic_gradient(struct efp *efp, double *grad) + * It distributes gradients on atoms from the gradient and torque on fragment COM + * @param efp The efp structure. + * @param frag_id The index of fragment which atoms are analyzed here + * @param[out] grad For each atom, \a x \a y \a z components of negative force + * will be added to this array. The size of this array must be + * [3 * \a n] elements, where \a n is the number of atoms in fragment frag_id. + * An atom is a point with non-zero mass inside a fragment. + * Any initial gradient from this array will be gathered on fragments at the + * beginning and then redistributed back to the atoms. This can be used to + * account for other interactions, e.g., bonded forces from MM forcefield. + * @return ::EFP_RESULT_SUCCESS on success or error code otherwise. + */ +enum efp_result efp_get_frag_atomic_gradient(struct efp *efp, size_t frag_id, double *grad); + +/** + * Get gradient on fragment atoms obtained during calculation of QQ and LJ terms. + * @param efp The efp structure. + * @param frag_id The index of fragment which atoms are analyzed here + * @param[out] grad For each atom, \a x \a y \a z components of negative force + */ +enum efp_result efp_get_atom_gradient(struct efp *efp, size_t frag_id, double *grad); + /** * Get the number of fragments in this computation. * @@ -1247,6 +1357,15 @@ enum efp_result efp_get_frag_atoms(struct efp *efp, size_t frag_idx, enum efp_result efp_set_frag_atoms(struct efp *efp, size_t frag_idx, size_t n_atoms, struct efp_atom *atoms); +/** + * Get coordinates and mm charges of all efp atoms + * \param [in] efp he efp structure. + * \param [out] charges - array of atom mm charges + * \param [out] coords - array of atom xyz positions + * \return ::EFP_RESULT_SUCCESS on success or error code otherwise. + */ +enum efp_result efp_get_atom_mm_info(struct efp *efp, double *charges, double *coords); + /** Copies information about multipole point pt_idx at fragment frag_idx into * efp_mult_pt structure mult_pt * diff --git a/src/elec.c b/src/elec.c index 44c5d923..288a2b5a 100644 --- a/src/elec.c +++ b/src/elec.c @@ -321,11 +321,21 @@ mult_mult_grad(struct efp *efp, size_t fr_i_idx, size_t fr_j_idx, vec_scale(&torque_i, swf->swf); vec_scale(&torque_j, swf->swf); - efp_add_force(efp->grad + fr_i_idx, CVEC(fr_i->x), CVEC(pt_i->x), - &force, &torque_i); - efp_sub_force(efp->grad + fr_j_idx, CVEC(fr_j->x), CVEC(pt_j->x), - &force, &torque_j); - efp_add_stress(&swf->dr, &force, &efp->stress); + efp_add_stress(&swf->dr, &force, &efp->stress); + + // a check for torch special model with elpot on special fragment + // gradient is not added to the special fragment in this case + // this assumes that we use ml/efp fragment that induces field to other fragments due to its efp nature (multipoles and ind dipoles) + // this might need to be changed if ml fragment uses ml-predicted charges instead + + if (!efp->opts.enable_elpot || (efp->opts.special_fragment != fr_i_idx && efp->opts.special_fragment != fr_j_idx)) { + efp_add_force(efp->grad + fr_i_idx, CVEC(fr_i->x), CVEC(pt_i->x), &force, &torque_i); + efp_sub_force(efp->grad + fr_j_idx, CVEC(fr_j->x), CVEC(pt_j->x), &force, &torque_j); + } + else if (efp->opts.enable_elpot && efp->opts.special_fragment == fr_i_idx) + efp_sub_force(efp->grad + fr_j_idx, CVEC(fr_j->x), CVEC(pt_j->x), &force, &torque_j); + else if (efp->opts.enable_elpot && efp->opts.special_fragment == fr_j_idx) + efp_add_force(efp->grad + fr_i_idx, CVEC(fr_i->x), CVEC(pt_i->x), &force, &torque_i); } double @@ -359,10 +369,17 @@ efp_frag_frag_elec(struct efp *efp, size_t fr_i_idx, size_t fr_j_idx) swf.dswf.z * energy }; - six_atomic_add_xyz(efp->grad + fr_i_idx, &force); - six_atomic_sub_xyz(efp->grad + fr_j_idx, &force); efp_add_stress(&swf.dr, &force, &efp->stress); + // a check for torch special model with elpot on special fragment + // gradient is not added to the special fragment in this case + if (!efp->opts.enable_elpot || (efp->opts.special_fragment != fr_i_idx && efp->opts.special_fragment != fr_j_idx)) { + six_atomic_add_xyz(efp->grad + fr_i_idx, &force); + six_atomic_sub_xyz(efp->grad + fr_j_idx, &force); + } + else if (efp->opts.enable_elpot && efp->opts.special_fragment == fr_i_idx) six_atomic_sub_xyz(efp->grad + fr_j_idx, &force); + else if (efp->opts.enable_elpot && efp->opts.special_fragment == fr_j_idx) six_atomic_add_xyz(efp->grad + fr_i_idx, &force); + return energy * swf.swf; } } @@ -470,6 +487,102 @@ efp_update_elec(struct frag *frag) } } +void efp_update_elec_special(struct frag *frag) +{ + size_t natom = frag->n_atoms; + + for (size_t i = 0; i < frag->n_multipole_pts; i++) { + const struct multipole_pt *in = frag->lib->multipole_pts + i; + struct multipole_pt *out = frag->multipole_pts + i; + + /* copy atom coordinates into multipole points */ + if (i < natom) { + out->x = frag->atoms[i].x; + out->y = frag->atoms[i].y; + out->z = frag->atoms[i].z; + } + /* recomputing positions of mid-points using atom positions */ + else { + if (out->label[0] == 'B' && out->label[1] == 'O') { + int length = strlen(out->label) - 2; + // printf(" Analyzing label %s, length is %d\n", out->label, length); + size_t m1, m2; + if (length == 2) { + m1 = out->label[2] - 48; // converting to char to size_t 1-digit number + m2 = out->label[3] - 48; + } + else if (length == 3) { + m1 = (out->label[2] - 48)*10 + out->label[3] - 48; // converting to char to size_t 2-digit number + m2 = out->label[4] - 48; + } + else if (length == 4) { + m1 = (out->label[2] - 48)*10 + out->label[3] - 48; // converting to char to size_t 2-digit number + m2 = (out->label[4] - 48)*10 + out->label[5] - 48; + } + else printf("WARNING! Reading BO point %s but do not know what to do with it!\n", out->label); + if (m1 > natom || m2 > natom) + printf("WARNING! Reading BO point %s; bad atom numbers %zu and %zu\n", out->label, m1, m2); + // printf("m1, m2 are %zu %zu\n", m1, m2); + out->x = (frag->atoms[m1-1].x + frag->atoms[m2-1].x)/2; + out->y = (frag->atoms[m1-1].y + frag->atoms[m2-1].y)/2; + out->z = (frag->atoms[m1-1].z + frag->atoms[m2-1].z)/2; + } + } + + /* rotate dipole */ + if (out->if_dip) + out->dipole = mat_vec(&frag->rotmat, &in->dipole); + + /* rotate quadrupole */ + if (out->if_quad) { + rotate_quadrupole(&frag->rotmat, in->quadrupole, out->quadrupole); + + /* correction for Buckingham quadrupoles */ + double *quad = out->quadrupole; + + double qtr = quad[quad_idx(0, 0)] + + quad[quad_idx(1, 1)] + + quad[quad_idx(2, 2)]; + + quad[0] = 1.5 * quad[0] - 0.5 * qtr; + quad[1] = 1.5 * quad[1] - 0.5 * qtr; + quad[2] = 1.5 * quad[2] - 0.5 * qtr; + quad[3] = 1.5 * quad[3]; + quad[4] = 1.5 * quad[4]; + quad[5] = 1.5 * quad[5]; + } + + /* rotate octupole */ + if (out->if_oct) { + rotate_octupole(&frag->rotmat, in->octupole, out->octupole); + + /* correction for Buckingham octupoles */ + double *oct = out->octupole; + + double otrx = oct[oct_idx(0, 0, 0)] + + oct[oct_idx(0, 1, 1)] + + oct[oct_idx(0, 2, 2)]; + double otry = oct[oct_idx(0, 0, 1)] + + oct[oct_idx(1, 1, 1)] + + oct[oct_idx(1, 2, 2)]; + double otrz = oct[oct_idx(0, 0, 2)] + + oct[oct_idx(1, 1, 2)] + + oct[oct_idx(2, 2, 2)]; + + oct[0] = 2.5 * oct[0] - 1.5 * otrx; + oct[1] = 2.5 * oct[1] - 1.5 * otry; + oct[2] = 2.5 * oct[2] - 1.5 * otrz; + oct[3] = 2.5 * oct[3] - 0.5 * otry; + oct[4] = 2.5 * oct[4] - 0.5 * otrz; + oct[5] = 2.5 * oct[5] - 0.5 * otrx; + oct[6] = 2.5 * oct[6] - 0.5 * otrz; + oct[7] = 2.5 * oct[7] - 0.5 * otrx; + oct[8] = 2.5 * oct[8] - 0.5 * otry; + oct[9] = 2.5 * oct[9]; + } + } +} + static double compute_ai_elec_frag(struct efp *efp, size_t frag_idx) { @@ -599,6 +712,10 @@ compute_ai_elec_range(struct efp *efp, size_t from, size_t to, void *data) #pragma omp parallel for schedule(dynamic) reduction(+:energy) #endif for (size_t i = from; i < to; i++) { + // skip special fragment + if (i == efp->opts.special_fragment) + continue; + energy_tmp = compute_ai_elec_frag(efp, i); energy += energy_tmp; if (efp->opts.enable_pairwise && efp->opts.ligand == -1) { @@ -621,3 +738,351 @@ efp_compute_ai_elec(struct efp *efp) return EFP_RESULT_SUCCESS; } + +static double +qq_energy(struct efp *efp, size_t fr_i_idx, size_t fr_j_idx, + size_t pt_i_idx, size_t pt_j_idx, const struct swf *swf) +{ + struct frag *fr_i = efp->frags + fr_i_idx; + struct frag *fr_j = efp->frags + fr_j_idx; + struct efp_atom *pt_i = fr_i->atoms + pt_i_idx; + struct efp_atom *pt_j = fr_j->atoms + pt_j_idx; + + vec_t dr = { + pt_j->x - pt_i->x - swf->cell.x, + pt_j->y - pt_i->y - swf->cell.y, + pt_j->z - pt_i->z - swf->cell.z + }; + + double energy = 0.0; + + // charge - charge + energy += efp_charge_charge_energy(pt_i->mm_charge, pt_j->mm_charge, &dr); + + //if (efp->opts.print > 2) { + // printf("\n Atomic gradient in qq_energy BEFORE\n"); + // printf("%zu %zu %12.6lf %12.6lf %12.6lf \n", fr_i_idx, pt_i_idx, pt_i->gx, pt_i->gy, pt_i->gz); + // printf("%zu %zu %12.6lf %12.6lf %12.6lf \n", fr_j_idx, pt_j_idx, pt_j->gx, pt_j->gy, pt_j->gz); + //} + + // gradient + if (efp->do_gradient) { + vec_t add_i, add_j; + vec_t force = vec_zero; + + // charge-charge + efp_charge_charge_grad(pt_i->mm_charge, pt_j->mm_charge, &dr, + &force, &add_i, &add_j); + vec_scale(&force, swf->swf); + + efp_add_force(efp->grad + fr_i_idx, CVEC(fr_i->x), CVEC(pt_i->x), + &force, &vec_zero); + efp_sub_force(efp->grad + fr_j_idx, CVEC(fr_j->x), CVEC(pt_j->x), + &force, &vec_zero); + efp_add_stress(&swf->dr, &force, &efp->stress); + + // adding forces to atoms as well - clean this place later + vec_t force2 = { + swf->dswf.x * energy, + swf->dswf.y * energy, + swf->dswf.z * energy + }; + + pt_i->gx += force.x + force2.x; + pt_i->gy += force.y + force2.y; + pt_i->gz += force.z + force2.z; + + pt_j->gx -= force.x + force2.x; + pt_j->gy -= force.y + force2.y; + pt_j->gz -= force.z + force2.z; + } + + //if (efp->opts.print > 2) { + // printf("\n Atomic gradient in qq_energy AFTER\n"); + // printf("%zu %zu %12.6lf %12.6lf %12.6lf \n", fr_i_idx, pt_i_idx, pt_i->gx, pt_i->gy, pt_i->gz); + // printf("%zu %zu %12.6lf %12.6lf %12.6lf \n", fr_j_idx, pt_j_idx, pt_j->gx, pt_j->gy, pt_j->gz); + //} + + return energy; +} + + +static double +lj_energy(struct efp *efp, size_t fr_i_idx, size_t fr_j_idx, + size_t pt_i_idx, size_t pt_j_idx, const struct swf *swf) +{ + int combination_rule = 2; // need to add keyword! + + struct frag *fr_i = efp->frags + fr_i_idx; + struct frag *fr_j = efp->frags + fr_j_idx; + struct efp_atom *pt_i = fr_i->atoms + pt_i_idx; + struct efp_atom *pt_j = fr_j->atoms + pt_j_idx; + + vec_t dr = { + pt_j->x - pt_i->x - swf->cell.x, + pt_j->y - pt_i->y - swf->cell.y, + pt_j->z - pt_i->z - swf->cell.z + }; + double r = vec_len(&dr); + + double energy = 0.0; + double g = 0.0, g1 = 0.0, g2 = 0.0; + double r2, sr6 = 0.0; + + if (combination_rule == 1) { + // E_lj = (C_12/r^12 - C_6/r^6) + // sigma_ij = sqrt(C_6_i*C_6_j) + // eps_ij = sqrt(C_12_i * C_12_j) + double C6 = sqrt(pt_i->sigma * pt_j->sigma); // C_6 + double C12 = sqrt(pt_i->epsilon * pt_j->epsilon); //C_12 + r2 = r*r; + sr6 = 1/(r2*r2*r2); + energy += (C12*sr6 * sr6 - C6*sr6); + + if (efp->do_gradient) { + r2 = r * r; + g1 = 6.0 * C6 * sr6 / r2; + g2 = -12.0 * C12 * sr6 * sr6 / r2; + g = -(g1 + g2); + } + } + else if (combination_rule == 2) { + // E_lj = 4*epsilon*((sigma/r)^12 - (sigma/r)^6) + // sigma_ij = 0.5 * (sigma_i + sigma_j) + // eps_ij = sqrt(eps_i * eps_j) + double sigma_ij = 0.5*(pt_i->sigma + pt_j->sigma); + sr6 = pow(sigma_ij / r, 6); + double epsilon_ij = sqrt(pt_i->epsilon * pt_j->epsilon); + energy += 4 * epsilon_ij * (sr6 * sr6 - sr6); + + if (efp->do_gradient) { + r2 = r * r; + g1 = 6.0 * sr6 / r2; + g2 = -12.0 * sr6 * sr6 / r2; + // force is opposite of gradient! + g = -4 * epsilon_ij * (g1 + g2); + } + } + else if (combination_rule == 3) { + // used in OPLS + // E_lj = 4*epsilon*((sigma/r)^12 - (sigma/r)^6) + // sigma_ij = sqrt(sigma_i * sigma_j) + // eps_ij = sqrt(eps_i * eps_j) + double sigma_ij = sqrt(pt_i->sigma * pt_j->sigma); + sr6 = pow(sigma_ij / r, 6); + double epsilon_ij = sqrt(pt_i->epsilon * pt_j->epsilon); + energy += 4 * epsilon_ij * (sr6 * sr6 - sr6); + + if (efp->do_gradient) { + r2 = r*r; + g1 = 6.0 * sr6 / r2; + g2 = -12.0 * sr6*sr6 / r2; + g = -4*epsilon_ij * (g1+g2); + } + } + else { + printf("WARNING: Unknown combination rule for LJ; LJ energy is not computed!"); + } + + if (efp->do_gradient) { + vec_t force = { + g * dr.x * swf->swf, + g * dr.y * swf->swf, + g * dr.z * swf->swf + }; + + // careful: adding force both to atoms and fragments... + // clean this place later + + // this force contribution is added only to atoms here + // it is added to fragments in frag_frag routine + vec_t force2 = { + swf->dswf.x * energy, + swf->dswf.y * energy, + swf->dswf.z * energy + }; + + pt_i->gx += force.x + force2.x; + pt_i->gy += force.y + force2.y; + pt_i->gz += force.z + force2.z; + + pt_j->gx -= force.x + force2.x; + pt_j->gy -= force.y + force2.y; + pt_j->gz -= force.z + force2.z; + + // adding force to fragments + efp_add_force(efp->grad + fr_i_idx, CVEC(fr_i->x), CVEC(pt_i->x), + &force, &vec_zero); + efp_sub_force(efp->grad + fr_j_idx, CVEC(fr_j->x), CVEC(pt_j->x), + &force, &vec_zero); + efp_add_stress(&swf->dr, &force, &efp->stress); + } + + return energy; +} + +double +efp_frag_frag_qq(struct efp *efp, size_t fr_i_idx, size_t fr_j_idx) +{ + struct frag *fr_i = efp->frags + fr_i_idx; + struct frag *fr_j = efp->frags + fr_j_idx; + // might need to change this switching function treatment + struct swf swf = efp_make_swf(efp, fr_i, fr_j, 0); + double energy = 0.0; + + // skip calculations if distance between fragments is too big... + if (swf.swf == 0.0) { + return 0.0; + } + else { + for (size_t ii = 0; ii < fr_i->n_atoms; ii++) { + for (size_t jj = 0; jj < fr_j->n_atoms; jj++) { + energy += qq_energy(efp, fr_i_idx, fr_j_idx, ii, jj, &swf); + } + } + + if (efp->do_gradient) { + vec_t force = { + swf.dswf.x * energy, + swf.dswf.y * energy, + swf.dswf.z * energy + }; + + efp_add_stress(&swf.dr, &force, &efp->stress); + + // a check for torch special model with elpot on special fragment + // gradient is not added to the special fragment in this case + if (!efp->opts.enable_elpot || (efp->opts.special_fragment != fr_i_idx && efp->opts.special_fragment != fr_j_idx)) { + six_atomic_add_xyz(efp->grad + fr_i_idx, &force); + six_atomic_sub_xyz(efp->grad + fr_j_idx, &force); + } + else if (efp->opts.enable_elpot && efp->opts.special_fragment == fr_i_idx) six_atomic_sub_xyz(efp->grad + fr_j_idx, &force); + else if (efp->opts.enable_elpot && efp->opts.special_fragment == fr_j_idx) six_atomic_add_xyz(efp->grad + fr_i_idx, &force); + } + + return energy * swf.swf; + } +} + +double +efp_frag_frag_lj(struct efp *efp, size_t fr_i_idx, size_t fr_j_idx) +{ + struct frag *fr_i = efp->frags + fr_i_idx; + struct frag *fr_j = efp->frags + fr_j_idx; + // might need to change this switching function treatment + struct swf swf = efp_make_swf(efp, fr_i, fr_j, 0); + double energy = 0.0; + + // skip calculations if distance between fragments is too big... + if (swf.swf == 0.0) { + return 0.0; + } + else { + for (size_t ii = 0; ii < fr_i->n_atoms; ii++) { + for (size_t jj = 0; jj < fr_j->n_atoms; jj++) { + energy += lj_energy(efp, fr_i_idx, fr_j_idx, ii, jj, &swf); + } + } + + if (efp->do_gradient) { + vec_t force = { + swf.dswf.x * energy, + swf.dswf.y * energy, + swf.dswf.z * energy + }; + + six_atomic_add_xyz(efp->grad + fr_i_idx, &force); + six_atomic_sub_xyz(efp->grad + fr_j_idx, &force); + efp_add_stress(&swf.dr, &force, &efp->stress); + } + return energy * swf.swf; + } +} + +static double +compute_ai_qq_frag(struct efp *efp, size_t frag_idx) +{ + struct frag *fr_i = efp->frags + frag_idx; + double energy = 0.0; + + for (size_t i = 0; i < fr_i->n_atoms; i++) { + for (size_t j = 0; j < efp->n_ptc; j++) { + struct efp_atom *at_i = fr_i->atoms + i; + vec_t dr = vec_sub(CVEC(at_i->x), efp->ptc_xyz + j); + + energy += efp_charge_charge_energy(at_i->mm_charge, + efp->ptc[j], &dr); + } + } + return energy; +} + +static void +compute_ai_qq_frag_grad(struct efp *efp, size_t frag_idx) +{ + struct frag *fr_i = efp->frags + frag_idx; + + for (size_t i = 0; i < fr_i->n_atoms; i++) { + for (size_t j = 0; j < efp->n_ptc; j++) { + struct efp_atom *at_i = fr_i->atoms + i; + + vec_t force, add1, add2; + vec_t dr = vec_sub(CVEC(at_i->x), efp->ptc_xyz + j); + + efp_charge_charge_grad(efp->ptc[j], at_i->mm_charge, &dr, + &force, &add1, &add2); + vec_atomic_add(efp->ptc_grad + j, &force); + efp_sub_force(efp->grad + frag_idx, CVEC(fr_i->x), + CVEC(at_i->x), &force, &vec_zero); + + // add forces to atoms as well - clean this later + at_i->gx -= force.x; + at_i->gy -= force.y; + at_i->gz -= force.z; + } + } +} + +static void +compute_ai_qq_range(struct efp *efp, size_t from, size_t to, void *data) +{ + double energy = 0.0; + double energy_tmp = 0.0; + + (void)data; + +#ifdef _OPENMP +#pragma omp parallel for schedule(dynamic) reduction(+:energy) +#endif + for (size_t i = from; i < to; i++) { + // skip special fragment + if (i == efp->opts.special_fragment) + continue; + + // where are switching functions??? + + energy_tmp = compute_ai_qq_frag(efp, i); + energy += energy_tmp; + // no pairwise interactions so far + //if (efp->opts.enable_pairwise && efp->opts.ligand == -1) { + // efp->pair_energies[i].electrostatic += energy_tmp; + //} + if (efp->do_gradient) { + compute_ai_qq_frag_grad(efp, i); + } + } + // ??? where to store this energy? + efp->energy.electrostatic_point_charges += energy; +} + +enum efp_result +efp_compute_ai_qq(struct efp *efp) +{ + if (!(efp->opts.terms & EFP_TERM_AI_QQ)) + return EFP_RESULT_SUCCESS; + + efp_balance_work(efp, compute_ai_qq_range, NULL); + efp_allreduce(&efp->energy.electrostatic_point_charges, 1); + + return EFP_RESULT_SUCCESS; +} diff --git a/src/parse.c b/src/parse.c index bb97fe55..80b8946c 100644 --- a/src/parse.c +++ b/src/parse.c @@ -151,7 +151,7 @@ parse_coordinates(struct frag *frag, struct stream *stream) while (!efp_stream_eof(stream)) { if (tok_stop(stream)) { if (frag->n_atoms < 1) { - efp_log("parse_coordinates(): n_atoms < 1"); + efp_log("parse_coordinates() for fragment %s: n_atoms < 1", frag->name); return EFP_RESULT_SYNTAX_ERROR; } @@ -167,7 +167,7 @@ parse_coordinates(struct frag *frag, struct stream *stream) !tok_double(stream, &atom.z) || !tok_double(stream, &atom.mass) || !tok_double(stream, &atom.znuc)) { - efp_log("parse_coordinates(): reading atom info failure"); + efp_log("parse_coordinates(): reading atom info failure for fragment %s", frag->name); return EFP_RESULT_SYNTAX_ERROR; } @@ -196,8 +196,9 @@ parse_coordinates(struct frag *frag, struct stream *stream) last_pt->x = atom.x; last_pt->y = atom.y; last_pt->z = atom.z; - last_pt->znuc = atom.znuc; - last_pt->if_znuc = true; + // LVS: let's not use znuc from coordiante section; read it from monopole section instead! + //last_pt->znuc = atom.znuc; + //last_pt->if_znuc = true; efp_stream_next_line(stream); } @@ -208,7 +209,7 @@ static enum efp_result parse_monopoles(struct frag *frag, struct stream *stream) { if (!frag->multipole_pts){ - efp_log("parse_monopoles() failure: no multipole_pts"); + efp_log("parse_monopoles() failure for fragment %s: no multipole_pts", frag->name); return EFP_RESULT_SYNTAX_ERROR; } @@ -226,7 +227,7 @@ parse_monopoles(struct frag *frag, struct stream *stream) if (!tok_label(stream, sizeof(tmp_pt.label), tmp_pt.label) || !tok_double(stream, &tmp_pt.monopole) || !tok_double(stream, &tmp_pt.znuc)){ - efp_log("parse_monopoles() failure"); + efp_log("parse_monopoles() failure for fragment %s", frag->name); return EFP_RESULT_SYNTAX_ERROR; } for (size_t j = 0; j < frag->n_multipole_pts; j++) { @@ -234,6 +235,9 @@ parse_monopoles(struct frag *frag, struct stream *stream) // found a match frag->multipole_pts[j].monopole = tmp_pt.monopole; frag->multipole_pts[j].if_mon = true; + // LVS: use znuc from monopole section now! + frag->multipole_pts[j].znuc = tmp_pt.znuc; + frag->multipole_pts[j].if_znuc = true; counter++; break; } @@ -242,7 +246,7 @@ parse_monopoles(struct frag *frag, struct stream *stream) } if (!tok_stop(stream)){ - efp_log("parse_monopoles() failure"); + efp_log("parse_monopoles() failure for fragment %s", frag->name); return EFP_RESULT_SYNTAX_ERROR; } @@ -253,7 +257,7 @@ static enum efp_result parse_dipoles(struct frag *frag, struct stream *stream) { if (!frag->multipole_pts){ - efp_log("parse_dipoles() failure: no multipole_pts"); + efp_log("parse_dipoles() failure for fragment %s: no multipole_pts", frag->name); return EFP_RESULT_SYNTAX_ERROR; } @@ -273,7 +277,7 @@ parse_dipoles(struct frag *frag, struct stream *stream) !tok_double(stream, &tmp_pt.dipole.x) || !tok_double(stream, &tmp_pt.dipole.y) || !tok_double(stream, &tmp_pt.dipole.z)){ - efp_log("parse_dipoles() failure"); + efp_log("parse_dipoles() failure for fragment %s", frag->name); return EFP_RESULT_SYNTAX_ERROR; } for (size_t j = 0; j < frag->n_multipole_pts; j++) { @@ -303,7 +307,7 @@ parse_dipoles(struct frag *frag, struct stream *stream) } */ if (!tok_stop(stream)){ - efp_log("parse_dipoles() failure"); + efp_log("parse_dipoles() failure for fragment %s", frag->name); return EFP_RESULT_SYNTAX_ERROR; } @@ -314,7 +318,7 @@ static enum efp_result parse_quadrupoles(struct frag *frag, struct stream *stream) { if (!frag->multipole_pts){ - efp_log("quadrupoles() failure: no multipole_pts"); + efp_log("quadrupoles() failure: no multipole_pts for fragment %s", frag->name); return EFP_RESULT_SYNTAX_ERROR; } @@ -337,7 +341,7 @@ parse_quadrupoles(struct frag *frag, struct stream *stream) !tok_double(stream, &tmp_pt.quadrupole[3]) || !tok_double(stream, &tmp_pt.quadrupole[4]) || !tok_double(stream, &tmp_pt.quadrupole[5]) ){ - efp_log("parse_quadrupoles() failure"); + efp_log("parse_quadrupoles() failure for fragment %s", frag->name); return EFP_RESULT_SYNTAX_ERROR; } for (size_t j = 0; j < frag->n_multipole_pts; j++) { @@ -372,7 +376,7 @@ parse_quadrupoles(struct frag *frag, struct stream *stream) } */ if (!tok_stop(stream)){ - efp_log("quadrupoles() failure"); + efp_log("quadrupoles() failure for fragment %s", frag->name); return EFP_RESULT_SYNTAX_ERROR; } @@ -383,7 +387,7 @@ static enum efp_result parse_octupoles(struct frag *frag, struct stream *stream) { if (!frag->multipole_pts){ - efp_log("parse_octupoles() failure: no multipole_pts"); + efp_log("parse_octupoles() failure: no multipole_pts for fragment %s", frag->name); return EFP_RESULT_SYNTAX_ERROR; } @@ -401,13 +405,13 @@ parse_octupoles(struct frag *frag, struct stream *stream) memset(&tmp_pt, 0, sizeof(tmp_pt)); if (!tok_label(stream, sizeof(tmp_pt.label), tmp_pt.label)){ - efp_log("parse_octupoles() failure"); + efp_log("parse_octupoles() failure for fragment %s", frag->name); return EFP_RESULT_SYNTAX_ERROR; } for (size_t k = 0; k < 10; k++) if (!tok_double(stream, &tmp_pt.octupole[k])){ - efp_log("parse_octupoles() failure"); + efp_log("parse_octupoles() failure for fragment %s", frag->name); return EFP_RESULT_SYNTAX_ERROR; } @@ -443,7 +447,7 @@ parse_octupoles(struct frag *frag, struct stream *stream) } */ if (!tok_stop(stream)){ - efp_log("parse_octupoles() failure"); + efp_log("parse_octupoles() failure for fragment %s", frag->name); return EFP_RESULT_SYNTAX_ERROR; } @@ -472,14 +476,14 @@ parse_polarizable_pts(struct frag *frag, struct stream *stream) init_pol_pt(pt); if (!efp_stream_advance(stream, 4)){ - efp_log("parse_polarizable_pts() failure"); + efp_log("parse_polarizable_pts() failure for fragment %s", frag->name); return EFP_RESULT_SYNTAX_ERROR; } if (!tok_double(stream, &pt->x) || !tok_double(stream, &pt->y) || !tok_double(stream, &pt->z)){ - efp_log("parse_polarizable_pts() failure"); + efp_log("parse_polarizable_pts() coordinate reading failure for fragment %s", frag->name); return EFP_RESULT_SYNTAX_ERROR; } @@ -488,7 +492,7 @@ parse_polarizable_pts(struct frag *frag, struct stream *stream) for (size_t i = 0; i < 9; i++) if (!tok_double(stream, m + i)){ - efp_log("parse_polarizable_pts() failure"); + efp_log("parse_polarizable_pts() polarizability reading failure for fragment %s", frag->name); return EFP_RESULT_SYNTAX_ERROR; } @@ -505,7 +509,7 @@ parse_polarizable_pts(struct frag *frag, struct stream *stream) efp_stream_next_line(stream); } - efp_log("parse_polarizable_pts() failure"); + efp_log("parse_polarizable_pts() failure for fragment %s", frag->name); return EFP_RESULT_SYNTAX_ERROR; } @@ -532,14 +536,14 @@ parse_dynamic_polarizable_pts(struct frag *frag, struct stream *stream) frag->n_dynamic_polarizable_pts - 1; if (!efp_stream_advance(stream, 5)){ - efp_log("parse_dynamic_polarizable_pts() failure"); + efp_log("parse_dynamic_polarizable_pts() failure for fragment %s", frag->name); return EFP_RESULT_SYNTAX_ERROR; } if (!tok_double(stream, &pt->x) || !tok_double(stream, &pt->y) || !tok_double(stream, &pt->z)){ - efp_log("parse_dynamic_polarizable_pts() failure"); + efp_log("parse_dynamic_polarizable_pts() coordinates reading failure for fragment %s", frag->name); return EFP_RESULT_SYNTAX_ERROR; } @@ -547,7 +551,7 @@ parse_dynamic_polarizable_pts(struct frag *frag, struct stream *stream) for (size_t j = 0; j < 9; j++) if (!tok_double(stream, m + j)){ - efp_log("parse_dynamic_polarizable_pts() failure"); + efp_log("parse_dynamic_polarizable_pts() polarizability reading failure for fragment %s", frag->name); return EFP_RESULT_SYNTAX_ERROR; } @@ -564,7 +568,7 @@ parse_dynamic_polarizable_pts(struct frag *frag, struct stream *stream) efp_stream_next_line(stream); if (efp_stream_eof(stream)){ - efp_log("parse_dynamic_polarizable_pts() failure"); + efp_log("parse_dynamic_polarizable_pts() failure for fragment %s", frag->name); return EFP_RESULT_SYNTAX_ERROR; } @@ -573,7 +577,7 @@ parse_dynamic_polarizable_pts(struct frag *frag, struct stream *stream) } if (efp_stream_eof(stream)){ - efp_log("parse_dynamic_polarizable_pts() failure"); + efp_log("parse_dynamic_polarizable_pts() failure for fragment %s", frag->name); return EFP_RESULT_SYNTAX_ERROR; } @@ -583,14 +587,14 @@ parse_dynamic_polarizable_pts(struct frag *frag, struct stream *stream) frag->dynamic_polarizable_pts + i; if (!efp_stream_advance(stream, 5)){ - efp_log("parse_dynamic_polarizable_pts() failure"); + efp_log("parse_dynamic_polarizable_pts() failure for fragment %s", frag->name); return EFP_RESULT_SYNTAX_ERROR; } if (!tok_double(stream, &pt->x) || !tok_double(stream, &pt->y) || !tok_double(stream, &pt->z)){ - efp_log("parse_dynamic_polarizable_pts() failure"); + efp_log("parse_dynamic_polarizable_pts() coordinate reading failure for fragment %s", frag->name); return EFP_RESULT_SYNTAX_ERROR; } @@ -598,7 +602,7 @@ parse_dynamic_polarizable_pts(struct frag *frag, struct stream *stream) for (size_t j = 0; j < 9; j++) if (!tok_double(stream, m + j)){ - efp_log("parse_dynamic_polarizable_pts() failure"); + efp_log("parse_dynamic_polarizable_pts() polarizability reading failure for fragment %s", frag->name); return EFP_RESULT_SYNTAX_ERROR; } @@ -617,7 +621,7 @@ parse_dynamic_polarizable_pts(struct frag *frag, struct stream *stream) } if (!tok_stop(stream)){ - efp_log("parse_dynamic_polarizable_pts() failure"); + efp_log("parse_dynamic_polarizable_pts() failure for fragment %s", frag->name); return EFP_RESULT_SYNTAX_ERROR; } @@ -634,6 +638,7 @@ parse_projection_basis(struct frag *frag, struct stream *stream) return EFP_RESULT_SUCCESS; if (!efp_stream_advance(stream, 8)){ + printf("problem with fragment %s", frag->name); efp_log("parse_projection_basis() failure"); return EFP_RESULT_SYNTAX_ERROR; } @@ -651,6 +656,7 @@ parse_projection_basis(struct frag *frag, struct stream *stream) !tok_double(stream, &atom->y) || !tok_double(stream, &atom->z) || !tok_double(stream, &atom->znuc)){ + printf("problem with fragment %s, xr atom %zu", frag->name, frag->n_xr_atoms); efp_log("parse_projection_basis() failure: cannot read atom coordinates"); return EFP_RESULT_SYNTAX_ERROR; } @@ -658,6 +664,7 @@ parse_projection_basis(struct frag *frag, struct stream *stream) efp_stream_next_line(stream); shell: if (efp_stream_eof(stream)){ + printf("problem with fragment %s", frag->name); efp_log("parse_projection_basis() failure"); return EFP_RESULT_SYNTAX_ERROR; } @@ -682,11 +689,13 @@ parse_projection_basis(struct frag *frag, struct stream *stream) //printf("\n shell->type %c", shell->type); if (!strchr("SLPDF", shell->type)){ + printf("problem with fragment %s", frag->name); efp_log("parse_projection_basis() failure: error in basis function names"); return EFP_RESULT_SYNTAX_ERROR; } if (!tok_uint(stream, &shell->n_funcs)){ + printf("problem with fragment %s", frag->name); efp_log("parse_projection_basis() failure: error in the number of basis functions"); return EFP_RESULT_SYNTAX_ERROR; } @@ -703,12 +712,14 @@ parse_projection_basis(struct frag *frag, struct stream *stream) if (!tok_int(stream, NULL) || !tok_double(stream, ptr++) || !tok_double(stream, ptr++)){ + printf("problem with fragment %s", frag->name); efp_log("parse_projection_basis() failure: error in reading basis exponents"); return EFP_RESULT_SYNTAX_ERROR; } if (shell->type == 'L') if (!tok_double(stream, ptr++)){ + printf("problem with fragment %s", frag->name); efp_log("parse_projection_basis() failure: error in reading basis exponent for L function"); return EFP_RESULT_SYNTAX_ERROR; } @@ -717,6 +728,7 @@ parse_projection_basis(struct frag *frag, struct stream *stream) } goto shell; } + printf("problem with fragment %s", frag->name); efp_log("parse_projection_basis() failure"); return EFP_RESULT_SYNTAX_ERROR; } @@ -725,6 +737,7 @@ static enum efp_result parse_multiplicity(struct frag *frag, struct stream *stream) { if (!tok_int(stream, &frag->multiplicity)){ + printf("problem with fragment %s", frag->name); efp_log("parse_multiplicity() failure"); return EFP_RESULT_SYNTAX_ERROR; } @@ -732,6 +745,7 @@ parse_multiplicity(struct frag *frag, struct stream *stream) efp_stream_next_line(stream); if (!tok_stop(stream)){ + printf("problem with fragment %s", frag->name); efp_log("parse_multiplicity() failure"); return EFP_RESULT_SYNTAX_ERROR; } @@ -744,6 +758,7 @@ parse_projection_wf(struct frag *frag, struct stream *stream) { if (!tok_uint(stream, &frag->n_lmo) || !tok_uint(stream, &frag->xr_wf_size)){ + printf("problem with fragment %s, reading n_lmo and wf_size", frag->name); efp_log("parse_projection_wf() failure"); return EFP_RESULT_SYNTAX_ERROR; } @@ -759,12 +774,14 @@ parse_projection_wf(struct frag *frag, struct stream *stream) for (size_t j = 0; j < frag->n_lmo; j++) { for (size_t i = 0; i < frag->xr_wf_size / 5; i++) { if (!efp_stream_advance(stream, 5)){ + printf("problem with fragment %s, reading wf coefficients", frag->name); efp_log("parse_projection_wf() failure"); return EFP_RESULT_SYNTAX_ERROR; } for (size_t k = 0; k < 5; k++) if (!tok_double(stream, ptr++)){ + printf("problem with fragment %s, reading wf coefficients", frag->name); efp_log("parse_projection_wf() failure"); return EFP_RESULT_SYNTAX_ERROR; } @@ -776,12 +793,14 @@ parse_projection_wf(struct frag *frag, struct stream *stream) continue; if (!efp_stream_advance(stream, 5)){ + printf("problem with fragment %s", frag->name); efp_log("parse_projection_wf() failure"); return EFP_RESULT_SYNTAX_ERROR; } for (size_t k = 0; k < frag->xr_wf_size % 5; k++) if (!tok_double(stream, ptr++)){ + printf("problem with fragment %s", frag->name); efp_log("parse_projection_wf() failure"); return EFP_RESULT_SYNTAX_ERROR; } @@ -804,6 +823,7 @@ parse_fock_mat(struct frag *frag, struct stream *stream) for (size_t i = 0; i < size; i++) if (!tok_double(stream, frag->xr_fock_mat + i)){ + printf("problem with fragment %s", frag->name); efp_log("parse_fock_mat() failure"); return EFP_RESULT_SYNTAX_ERROR; } @@ -826,7 +846,8 @@ parse_lmo_centroids(struct frag *frag, struct stream *stream) efp_stream_next_line(stream); if (frag->n_lmo == 0) { - efp_log("number of LMO centroids is zero"); + printf("problem with fragment %s", frag->name); + efp_log("number of LMO centroids is zero"); return EFP_RESULT_SYNTAX_ERROR; } frag->lmo_centroids = (vec_t *)malloc(frag->n_lmo * sizeof(vec_t)); @@ -840,6 +861,7 @@ parse_lmo_centroids(struct frag *frag, struct stream *stream) !tok_double(stream, &ct->x) || !tok_double(stream, &ct->y) || !tok_double(stream, &ct->z)){ + printf("problem with fragment %s, coordinates of lmo %zu", frag->name, i+1); efp_log("parse_lmo_centroids() failure"); return EFP_RESULT_SYNTAX_ERROR; } @@ -848,6 +870,7 @@ parse_lmo_centroids(struct frag *frag, struct stream *stream) } if (!tok_stop(stream)){ + printf("problem with fragment %s", frag->name); efp_log("parse_lmo_centroids() failure"); return EFP_RESULT_SYNTAX_ERROR; } @@ -864,6 +887,7 @@ skip_canonvec(struct frag *frag, struct stream *stream) if (!tok_uint(stream, NULL) || !tok_uint(stream, &wf_size)){ + printf("problem with fragment %s", frag->name); efp_log("skip_canonvec() failure"); return EFP_RESULT_SYNTAX_ERROR; } @@ -905,6 +929,7 @@ skip_ctvec(struct frag *frag, struct stream *stream) if (!tok_uint(stream, NULL) || !tok_uint(stream, &wf_size)){ + printf("problem with fragment %s", frag->name); efp_log("skip_ctvec() failure"); return EFP_RESULT_SYNTAX_ERROR; } @@ -959,6 +984,7 @@ parse_dipquad_polarizable_pts(struct frag *frag, struct stream *stream) frag->n_dynamic_polarizable_pts - 1; if (!efp_stream_advance(stream, 5)){ + printf("problem with fragment %s", frag->name); efp_log("parse_dipquad_polarizable_pts() failure"); return EFP_RESULT_SYNTAX_ERROR; } @@ -966,6 +992,7 @@ parse_dipquad_polarizable_pts(struct frag *frag, struct stream *stream) if (!tok_double(stream, &pt->x) || !tok_double(stream, &pt->y) || !tok_double(stream, &pt->z)){ + printf("problem with fragment %s", frag->name); efp_log("parse_dipquad_polarizable_pts() failure"); return EFP_RESULT_SYNTAX_ERROR; } @@ -974,6 +1001,7 @@ parse_dipquad_polarizable_pts(struct frag *frag, struct stream *stream) for (size_t j = 0; j < 27; j++) if (!tok_double(stream, m + j)){ + printf("problem with fragment %s", frag->name); efp_log("parse_dipquad_polarizable_pts() failure"); return EFP_RESULT_SYNTAX_ERROR; } @@ -1010,6 +1038,7 @@ parse_dipquad_polarizable_pts(struct frag *frag, struct stream *stream) efp_stream_next_line(stream); if (efp_stream_eof(stream)){ + printf("problem with fragment %s", frag->name); efp_log("parse_dipquad_polarizable_pts() failure"); return EFP_RESULT_SYNTAX_ERROR; } @@ -1018,6 +1047,7 @@ parse_dipquad_polarizable_pts(struct frag *frag, struct stream *stream) break; } if (efp_stream_eof(stream)){ + printf("problem with fragment %s", frag->name); efp_log("parse_dipquad_polarizable_pts() failure"); return EFP_RESULT_SYNTAX_ERROR; } @@ -1028,6 +1058,7 @@ parse_dipquad_polarizable_pts(struct frag *frag, struct stream *stream) frag->dipquad_polarizable_pts + i; if (!efp_stream_advance(stream, 5)){ + printf("problem with fragment %s", frag->name); efp_log("parse_dipquad_polarizable_pts() failure"); return EFP_RESULT_SYNTAX_ERROR; } @@ -1035,6 +1066,7 @@ parse_dipquad_polarizable_pts(struct frag *frag, struct stream *stream) if (!tok_double(stream, &pt->x) || !tok_double(stream, &pt->y) || !tok_double(stream, &pt->z)){ + printf("problem with fragment %s", frag->name); efp_log("parse_dipquad_polarizable_pts() failure"); return EFP_RESULT_SYNTAX_ERROR; } @@ -1043,6 +1075,7 @@ parse_dipquad_polarizable_pts(struct frag *frag, struct stream *stream) //printf("\n in dipquad 9"); for (size_t j = 0; j < 27; j++) if (!tok_double(stream, m + j)){ + printf("problem with fragment %s", frag->name); efp_log("parse_dipquad_polarizable_pts() failure"); return EFP_RESULT_SYNTAX_ERROR; } @@ -1079,6 +1112,7 @@ parse_dipquad_polarizable_pts(struct frag *frag, struct stream *stream) } } if (!tok_stop(stream)){ + printf("problem with fragment %s", frag->name); efp_log("parse_dipquad_polarizable_pts() failure"); return EFP_RESULT_SYNTAX_ERROR; } @@ -1140,6 +1174,7 @@ static enum efp_result parse_screen(struct frag *frag, struct stream *stream) { if (!frag->multipole_pts){ + printf("problem with fragment %s", frag->name); efp_log("parse_screen() failure: no multipole_pts"); return EFP_RESULT_SYNTAX_ERROR; } @@ -1153,8 +1188,13 @@ parse_screen(struct frag *frag, struct stream *stream) else if (type == '2') { screen_type = 2; } + else if (type == '3') { + screen_type = 3; + } else { printf(" Unknown SCREEN type found for fragment %s \n", frag->name); + efp_log("parse_screen() failure"); + return EFP_RESULT_SYNTAX_ERROR; } efp_stream_next_line(stream); @@ -1173,6 +1213,7 @@ parse_screen(struct frag *frag, struct stream *stream) if (!tok_label(stream, sizeof(tmp_pt.label), tmp_pt.label) || !tok_double(stream, NULL) || !tok_double(stream, &tmp_screen)){ + printf("problem with fragment %s", frag->name); efp_log("parse_screen() failure"); return EFP_RESULT_SYNTAX_ERROR; } @@ -1190,6 +1231,10 @@ parse_screen(struct frag *frag, struct stream *stream) frag->multipole_pts[j].if_scr0 = true; //printf(" SCREEN0 param %lf \n", frag->multipole_pts[j].screen0); } + if (screen_type == 3) { + // do nothing with screen3 + continue; + } counter++; break; } @@ -1198,6 +1243,7 @@ parse_screen(struct frag *frag, struct stream *stream) } if (!tok_stop(stream)){ + printf("problem with fragment %s", frag->name); efp_log("parse_screen() failure"); return EFP_RESULT_SYNTAX_ERROR; } @@ -1209,7 +1255,8 @@ static enum efp_result parse_xrfit(struct frag *frag, struct stream *stream) { if (frag->n_lmo == 0) { - efp_log("no LMO centroids found before XRFIT group"); + printf("problem with fragment %s", frag->name); + efp_log("no LMO centroids found before XRFIT group"); return EFP_RESULT_SYNTAX_ERROR; } @@ -1221,7 +1268,8 @@ parse_xrfit(struct frag *frag, struct stream *stream) for (size_t i = 0; i < frag->n_lmo; i++) { for (int k = 0; k < 4; k++) { if (!tok_double(stream, frag->xrfit + 4 * i + k)) { - efp_log("four parameters are expected for " + printf("problem with fragment %s", frag->name); + efp_log("four parameters are expected for " "each LMO in XRFIT group"); return EFP_RESULT_SYNTAX_ERROR; } @@ -1230,6 +1278,7 @@ parse_xrfit(struct frag *frag, struct stream *stream) } if (!tok_stop(stream)) { + printf("problem with fragment %s", frag->name); efp_log("parse_xrfit() failure"); return EFP_RESULT_SYNTAX_ERROR; } @@ -1241,7 +1290,8 @@ static enum efp_result parse_polab(struct frag *frag, struct stream *stream) { if (!tok_double(stream, &frag->pol_damp)) { - efp_log("error parsing fragment polarization damping " + printf("problem with fragment %s", frag->name); + efp_log("error parsing fragment polarization damping " "parameters"); return EFP_RESULT_SYNTAX_ERROR; } @@ -1249,6 +1299,7 @@ parse_polab(struct frag *frag, struct stream *stream) efp_stream_next_line(stream); if (!tok_stop(stream)) { + printf("problem with fragment %s", frag->name); efp_log("parse_polab() failure"); return EFP_RESULT_SYNTAX_ERROR; } @@ -1256,6 +1307,154 @@ parse_polab(struct frag *frag, struct stream *stream) return EFP_RESULT_SUCCESS; } +static enum efp_result +parse_mm_atom_charge(struct frag *frag, struct stream *stream) +{ + if (!frag->atoms){ + printf("problem with fragment %s", frag->name); + efp_log("parse_mm_atom_charge() failure: no atoms"); + return EFP_RESULT_SYNTAX_ERROR; + } + + efp_stream_next_line(stream); + int counter = 0; + for (size_t i = 0; i < frag->n_atoms; i++) { + + if (tok_stop(stream)) { + printf(" Found %d mm_atoms of %zu expected in fragment %s \n", + counter, frag->n_atoms, frag->name); + return EFP_RESULT_SUCCESS; + } + struct efp_atom atom; + memset(&atom, 0, sizeof(atom)); + if (!tok_label(stream, sizeof(atom.label), atom.label) || + !tok_double(stream, &atom.mm_charge)){ + printf("problem with fragment %s", frag->name); + efp_log("parse_mm_atom_charge() failure"); + return EFP_RESULT_SYNTAX_ERROR; + } + for (size_t j = 0; j < frag->n_atoms; j++) { + if (!strcmp(atom.label, frag->atoms[j].label)) { + // found a match + frag->atoms[j].mm_charge = atom.mm_charge; + counter++; + break; + } + } + efp_stream_next_line(stream); + } + + if (!tok_stop(stream)){ + printf("problem with fragment %s", frag->name); + efp_log("parse_mm_atom_charge() failure"); + return EFP_RESULT_SYNTAX_ERROR; + } + + return EFP_RESULT_SUCCESS; +} + +static enum efp_result +parse_mm_lj(struct frag *frag, struct stream *stream) +{ + if (!frag->atoms){ + printf("problem with fragment %s", frag->name); + efp_log("parse_mm_lj() failure: no atoms"); + return EFP_RESULT_SYNTAX_ERROR; + } + + // conversion of LJ params to a.u. + // assuming sigma-epsilon form (combination rules 2 and 3) + // epsilon has dimension of energy; sigma has dimension of length + // in Gromacs energies are in kJ/mol, lengths are in nm + double nm2bohr = 10.0/0.52917721092; + double kJmol2H = 1.0/2625.5002; + + efp_stream_next_line(stream); + int counter = 0; + for (size_t i = 0; i < frag->n_atoms; i++) { + + if (tok_stop(stream)) { + printf(" Found %d mm_atoms of %zu expected in fragment %s \n", + counter, frag->n_atoms, frag->name); + return EFP_RESULT_SUCCESS; + } + struct efp_atom atom; + memset(&atom, 0, sizeof(atom)); + if (!tok_label(stream, sizeof(atom.label), atom.label) || + !tok_double(stream, &atom.sigma) || + !tok_double(stream, &atom.epsilon)){ + printf("problem with fragment %s", frag->name); + efp_log("parse_mm_lj() failure"); + return EFP_RESULT_SYNTAX_ERROR; + } + for (size_t j = 0; j < frag->n_atoms; j++) { + if (!strcmp(atom.label, frag->atoms[j].label)) { + // found a match + // convert to a.u. + frag->atoms[j].sigma = atom.sigma * nm2bohr; + frag->atoms[j].epsilon = atom.epsilon * kJmol2H; + counter++; + break; + } + } + efp_stream_next_line(stream); + } + + if (!tok_stop(stream)){ + printf("problem with fragment %s", frag->name); + efp_log("parse_mm_lj() failure"); + return EFP_RESULT_SYNTAX_ERROR; + } + + return EFP_RESULT_SUCCESS; +} + +static enum efp_result +parse_mm_atomtype(struct frag *frag, struct stream *stream) +{ + if (!frag->atoms){ + printf("problem with fragment %s", frag->name); + efp_log("parse_mm_atomtype() failure: no atoms"); + return EFP_RESULT_SYNTAX_ERROR; + } + + efp_stream_next_line(stream); + int counter = 0; + for (size_t i = 0; i < frag->n_atoms; i++) { + + if (tok_stop(stream)) { + printf(" Found %d mm_atoms of %zu expected in fragment %s \n", + counter, frag->n_atoms, frag->name); + return EFP_RESULT_SUCCESS; + } + struct efp_atom atom; + memset(&atom, 0, sizeof(atom)); + if (!tok_label(stream, sizeof(atom.label), atom.label) || + !tok_label(stream, sizeof(atom.ff_label), atom.ff_label)){ + printf("problem with fragment %s", frag->name); + efp_log("parse_mm_atomtype() failure"); + return EFP_RESULT_SYNTAX_ERROR; + } + for (size_t j = 0; j < frag->n_atoms; j++) { + if (!strcmp(atom.label, frag->atoms[j].label)) { + // found a match + strcpy(frag->atoms[j].ff_label,atom.ff_label); + counter++; + break; + } + } + efp_stream_next_line(stream); + } + + if (!tok_stop(stream)){ + printf("problem with fragment %s", frag->name); + efp_log("parse_mm_atomtype() failure"); + return EFP_RESULT_SYNTAX_ERROR; + } + + return EFP_RESULT_SUCCESS; +} + typedef enum efp_result (*parse_fn)(struct frag *, struct stream *); static parse_fn @@ -1285,6 +1484,9 @@ get_parse_fn(struct stream *stream) { "SCREEN", parse_screen }, { "XRFIT", parse_xrfit }, { "POLAB", parse_polab }, + { "MM_CHARGE", parse_mm_atom_charge }, + { "MM_LJ", parse_mm_lj }, + { "MM_ATOMTYPE", parse_mm_atomtype }, }; for (size_t i = 0; i < ARRAY_SIZE(funcs); i++) @@ -1306,7 +1508,8 @@ parse_fragment(struct frag *frag, struct stream *stream) if (tok_end(stream)) return EFP_RESULT_SUCCESS; - efp_log("unexpected string \"%s\" in .efp file", + printf("problem with fragment %s", frag->name); + efp_log("unexpected string \"%s\" in .efp file", efp_stream_get_ptr(stream)); return EFP_RESULT_SYNTAX_ERROR; } @@ -1315,7 +1518,8 @@ parse_fragment(struct frag *frag, struct stream *stream) return res; } - efp_log("unexpected end of EFP potential data file"); + printf("problem with fragment %s", frag->name); + efp_log("unexpected end of EFP potential data file"); return EFP_RESULT_SYNTAX_ERROR; } @@ -1369,7 +1573,7 @@ parse_file(struct efp *efp, struct stream *stream) if ((res = parse_fragment(frag, stream))) return res; if (frag->n_lmo > 0 && frag->lmo_centroids == NULL) { - efp_log("LMO centroids are missing"); + efp_log("LMO centroids are missing for fragment \"%s\"", name); return EFP_RESULT_FATAL; } } diff --git a/src/pol.c b/src/pol.c index 2fac7fe4..d1661195 100644 --- a/src/pol.c +++ b/src/pol.c @@ -133,7 +133,7 @@ get_multipole_elec_potential(const vec_t *xyz, const struct multipole_pt *mult_p double r7 = r5 * r * r; /* charge */ - if (mult_pt->if_mon || mult_pt->if_dip) + if (mult_pt->if_mon || mult_pt->if_znuc) elpot += swf->swf * (mult_pt->monopole + mult_pt->znuc) / r; /* dipole */ @@ -151,6 +151,26 @@ get_multipole_elec_potential(const vec_t *xyz, const struct multipole_pt *mult_p return elpot; } +static double +get_mm_elec_potential(const vec_t *xyz, const struct efp_atom *atom, + const struct swf *swf) +{ + double elpot = 0.0; + + vec_t dr = { + xyz->x - atom->x - swf->cell.x, + xyz->y - atom->y - swf->cell.y, + xyz->z - atom->z - swf->cell.z + }; + + double r = vec_len(&dr); + + /* mm charge */ + elpot += swf->swf * atom->mm_charge / r; + + return elpot; +} + static vec_t get_elec_field(const struct efp *efp, size_t frag_idx, size_t pt_idx) { @@ -163,6 +183,10 @@ get_elec_field(const struct efp *efp, size_t frag_idx, size_t pt_idx) continue; // do not use skip list if symmetry is 1 if (efp->opts.symmetry == 0 && efp_skip_frag_pair(efp, i, frag_idx)) + continue; + // this might need to be changed to a more careful separation of + // elec and pol contributions to the field + if (i == efp->opts.special_fragment && !(efp->opts.special_terms & EFP_SPEC_TERM_POL)) continue; const struct frag *fr_i = efp->frags + i; struct swf swf = efp_make_swf(efp, fr_i, fr_j, 0); @@ -325,6 +349,9 @@ compute_elec_field_range(struct efp *efp, size_t from, size_t to, void *data) #pragma omp parallel for schedule(dynamic) #endif for (size_t i = from; i < to; i++) { + if (i == efp->opts.special_fragment && + !(efp->opts.special_terms & EFP_SPEC_TERM_POL)) + continue; // const struct frag *frag = efp->frags + i; struct frag *frag = efp->frags + i; @@ -461,7 +488,11 @@ get_induced_dipole_field(struct efp *efp, size_t frag_idx, if (efp->opts.symmetry == 0 && efp_skip_frag_pair(efp, frag_idx, j)) continue; - struct frag *fr_j = efp->frags + j; + if (j == efp->opts.special_fragment && + !(efp->opts.special_terms & EFP_SPEC_TERM_POL)) + continue; + + struct frag *fr_j = efp->frags + j; struct swf swf = efp_make_swf(efp, fr_i, fr_j, 0); if (swf.swf == 0) continue; @@ -584,7 +615,12 @@ compute_id_range(struct efp *efp, size_t from, size_t to, void *data) #pragma omp parallel for schedule(dynamic) reduction(+:conv) #endif for (size_t i = from; i < to; i++) { - struct frag *frag = efp->frags + i; + + if (i == efp->opts.special_fragment && + !(efp->opts.special_terms & EFP_SPEC_TERM_POL)) + continue; + + struct frag *frag = efp->frags + i; for (size_t j = 0; j < frag->n_polarizable_pts; j++) { struct polarizable_pt *pt = frag->polarizable_pts + j; @@ -739,6 +775,12 @@ compute_energy_range(struct efp *efp, size_t from, size_t to, void *data) #pragma omp parallel for schedule(dynamic) reduction(+:energy) #endif for (size_t i = from; i < to; i++) { + + // skip energy contribution for a special fragment in case of torch model with elpot + // this assumes that we use ml/efp fragment that induces field to other fragments due to its efp nature (multipoles and ind dipoles) + // this needs to be changed if ml fragment uses ml-predicted charges instead + if (efp->opts.enable_elpot && efp->opts.special_fragment == i) continue; + struct frag *frag = efp->frags + i; // zeroing out polarization pair energies is a must @@ -1041,7 +1083,18 @@ compute_grad_point(struct efp *efp, size_t frag_idx, size_t pt_idx) if (j == frag_idx || efp_skip_frag_pair(efp, frag_idx, j)) continue; - struct frag *fr_j = efp->frags + j; + // the code below skips gradient contributions to a special (ml) fragment in case of torch model with elpot + // this assumes that we use ml/efp fragment that induces field to other fragments due to its efp nature (multipoles and ind dipoles) + // this needs to be changed if ml fragment uses ml-predicted charges instead + + // this is true for normal cases not related to torch model with elpot + bool not_torch_elpot = !efp->opts.enable_elpot || (efp->opts.special_fragment != frag_idx && efp->opts.special_fragment != j); + // true when torch with elpot is invoked and fr_idx is the ml fragment + bool torch_elpot_i = efp->opts.enable_elpot && (efp->opts.special_fragment == frag_idx); + // true when torch with elpot is invoked and j is the ml fragment + bool torch_elpot_j = efp->opts.enable_elpot && (efp->opts.special_fragment == j); + + struct frag *fr_j = efp->frags + j; struct swf swf = efp_make_swf(efp, fr_i, fr_j, 0); if (swf.swf == 0.0) continue; @@ -1097,7 +1150,7 @@ compute_grad_point(struct efp *efp, size_t frag_idx, size_t pt_idx) } /* induced dipole - quadrupole */ - if (pt_j->if_dip) { + if (pt_j->if_quad) { e += efp_dipole_quadrupole_energy(&dipole_i, pt_j->quadrupole, &dr); efp_dipole_quadrupole_grad(&dipole_i, pt_j->quadrupole, @@ -1120,13 +1173,18 @@ compute_grad_point(struct efp *efp, size_t frag_idx, size_t pt_idx) vec_scale(&add_i, swf.swf); vec_scale(&add_j, swf.swf); - efp_add_force(efp->grad + frag_idx, CVEC(fr_i->x), - CVEC(pt_i->x), &force, &add_i); - efp_sub_force(efp->grad + j, CVEC(fr_j->x), - CVEC(pt_j->x), &force, &add_j); - efp_add_stress(&swf.dr, &force, &efp->stress); + efp_add_stress(&swf.dr, &force, &efp->stress); - energy += p1 * e; + // normal case + if (not_torch_elpot) { + efp_add_force(efp->grad + frag_idx, CVEC(fr_i->x), CVEC(pt_i->x), &force, &add_i); + efp_sub_force(efp->grad + j, CVEC(fr_j->x), CVEC(pt_j->x), &force, &add_j); + energy += p1 * e; + } + + // adding gradients to non-ML fragment only in torch elpot model + if (torch_elpot_i) efp_sub_force(efp->grad + j, CVEC(fr_j->x), CVEC(pt_j->x), &force, &add_j); + if (torch_elpot_j) efp_add_force(efp->grad + frag_idx, CVEC(fr_i->x), CVEC(pt_i->x), &force, &add_i); } /* induced dipole - induced dipoles */ @@ -1173,12 +1231,18 @@ compute_grad_point(struct efp *efp, size_t frag_idx, size_t pt_idx) vec_scale(&add_i, swf.swf); vec_scale(&add_j, swf.swf); - efp_add_force(efp->grad + frag_idx, CVEC(fr_i->x), - CVEC(pt_i->x), &force, &add_i); - efp_sub_force(efp->grad + j, CVEC(fr_j->x), - CVEC(pt_j->x), &force, &add_j); - efp_add_stress(&swf.dr, &force, &efp->stress); - energy += p1 * e; + efp_add_stress(&swf.dr, &force, &efp->stress); + + // normal case + if (not_torch_elpot) { + efp_add_force(efp->grad + frag_idx, CVEC(fr_i->x), CVEC(pt_i->x), &force, &add_i); + efp_sub_force(efp->grad + j, CVEC(fr_j->x), CVEC(pt_j->x), &force, &add_j); + energy += p1 * e; + } + + // adding gradients to non-ML fragment only in torch elpot model + if (torch_elpot_i) efp_sub_force(efp->grad + j, CVEC(fr_j->x), CVEC(pt_j->x), &force, &add_j); + if (torch_elpot_j) efp_add_force(efp->grad + frag_idx, CVEC(fr_i->x), CVEC(pt_i->x), &force, &add_i); } force.x = swf.dswf.x * energy; @@ -1357,26 +1421,42 @@ efp_get_elec_potential(struct efp *efp, size_t frag_idx, const double *xyz, continue; /* potential due to multipoles */ - for (size_t j = 0; j < fr_i->n_multipole_pts; j++) { - const struct multipole_pt *mpt = fr_i->multipole_pts+j; - elpot += get_multipole_elec_potential((const vec_t *)xyz, mpt, &swf); - } + if (efp->opts.terms & EFP_TERM_ELEC) + for (size_t j = 0; j < fr_i->n_multipole_pts; j++) { + const struct multipole_pt *mpt = fr_i->multipole_pts+j; + elpot += get_multipole_elec_potential((const vec_t *)xyz, mpt, &swf); + } + + /* potential due to MM atoms */ + if (efp->opts.terms & EFP_TERM_QQ) + for (size_t j = 0; j < fr_i->n_atoms; j++) { + const struct efp_atom *atom = fr_i->atoms + j; + elpot += get_mm_elec_potential((const vec_t *) xyz, atom, &swf); + } /* potential due to induced dipoles */ - for (size_t j = 0; j < fr_i->n_polarizable_pts; j++) { - struct polarizable_pt *pt_i = fr_i->polarizable_pts + j; - //size_t idx = fr_i->polarizable_offset + j; - - vec_t dr = { - xyz[0] - pt_i->x - swf.cell.x, - xyz[1] - pt_i->y - swf.cell.y, - xyz[2] - pt_i->z - swf.cell.z - }; - - double r = vec_len(&dr); - double r3 = r * r * r; - - elpot += swf.swf * 0.5 * (vec_dot(&pt_i->indip, &dr) + vec_dot(&pt_i->indipconj, &dr)) / r3; + if (efp->opts.terms & EFP_TERM_POL) { + for (size_t j = 0; j < fr_i->n_polarizable_pts; j++) { + struct polarizable_pt *pt_i = fr_i->polarizable_pts + j; + //size_t idx = fr_i->polarizable_offset + j; + + vec_t dr = { + xyz[0] - pt_i->x - swf.cell.x, + xyz[1] - pt_i->y - swf.cell.y, + xyz[2] - pt_i->z - swf.cell.z + }; + + double r = vec_len(&dr); + double r3 = r * r * r; + + // LVS: I think the polarization potential should be 0.5*indip*Ta + // this is different from what enters QM Hamiltonian (0.5*(indip+indipconj)*Ta) + // However, the classical potential is not supposed to spend work (energy) on inducing dipoles on other fragments, + // that's why no need to double the induce dipole + // this is changed on Oct 25 2024 (after the first ANI/EFP paper is published) + //elpot += swf.swf * 0.5 * (vec_dot(&pt_i->indip, &dr) + vec_dot(&pt_i->indipconj, &dr)) / r3; + elpot += swf.swf * 0.5 * vec_dot(&pt_i->indip, &dr) / r3; + } } } diff --git a/src/private.h b/src/private.h index 3e5ffb37..a5a42dd8 100644 --- a/src/private.h +++ b/src/private.h @@ -248,16 +248,16 @@ struct efp { /* force and torque on fragments */ six_t *grad; - /* number of point charges */ + /* number of point charges or QM atoms */ size_t n_ptc; - /* coordinates of point charges */ + /* coordinates of point charges or QM atoms */ vec_t *ptc_xyz; - /* point charges */ + /* point charges or QM atoms */ double *ptc; - /* gradient on point charges */ + /* gradient on point charges or QM atoms */ vec_t *ptc_grad; /* total number of polarizable points */ diff --git a/src/terms.h b/src/terms.h index f8f41667..9d97c5de 100644 --- a/src/terms.h +++ b/src/terms.h @@ -37,12 +37,18 @@ double efp_frag_frag_disp(struct efp *, size_t, size_t, const double *, const six_t *); void efp_frag_frag_xr(struct efp *, size_t, size_t, double *, six_t *, double *, double *); +double efp_frag_frag_qq(struct efp *, size_t, size_t); +double efp_frag_frag_lj(struct efp *, size_t, size_t); + enum efp_result efp_compute_pol(struct efp *); enum efp_result efp_compute_ai_elec(struct efp *); enum efp_result efp_compute_ai_disp(struct efp *); enum efp_result efp_compute_pol_energy(struct efp *, double *); enum efp_result efp_compute_pol_correction(struct efp *, double *); +enum efp_result efp_compute_ai_qq(struct efp *); void efp_update_elec(struct frag *); +/* Updates multipoles based on new positions of atoms */ +void efp_update_elec_special(struct frag *); void efp_update_pol(struct frag *); void efp_update_disp(struct frag *); void efp_update_xr(struct frag *); diff --git a/src/util.c b/src/util.c index df59a96d..5fa5799f 100644 --- a/src/util.c +++ b/src/util.c @@ -358,4 +358,4 @@ double calc_rmsd(const struct frag *frag1, const struct frag *frag2){ double rmsd = 0.0; return rmsd; -} \ No newline at end of file +} diff --git a/tests/Makefile b/tests/Makefile index 3ab0651e..53383ed9 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -1,16 +1,16 @@ check: - @EFPMD=../efpmd/src/efpmd ./run.sh + @EFPMD=../build/efpmd/efpmd ./run.sh checkomp: @for thr in 1 2 3; do \ echo "Testing for $$thr thread(s)..."; \ - OMP_NUM_THREADS=$$thr EFPMD=../efpmd/src/efpmd ./run.sh; \ + OMP_NUM_THREADS=$$thr EFPMD=../build/efpmd/efpmd ./run.sh; \ done checkmpi: @for prc in 1 2 3; do \ echo "Testing for $$prc process(es)..."; \ - EFPMD="mpirun -np $$prc ../efpmd/src/efpmd" ./run.sh; \ + EFPMD="mpirun -np $$prc ../build/efpmd/efpmd" ./run.sh; \ done clean: diff --git a/tests/elpot_frag.in b/tests/elpot_frag.in new file mode 100644 index 00000000..6f8bf9d3 --- /dev/null +++ b/tests/elpot_frag.in @@ -0,0 +1,10 @@ +run_type frag_elpot +coord xyzabc +fraglib_path ../fraglib +special_fragment 0 + +fragment h2o_l + 0.0 0.0 0.0 1.0 2.0 3.0 + +fragment nh3_l + 5.0 0.0 0.0 5.0 2.0 8.0 diff --git a/tests/lj_1.in b/tests/lj_1.in new file mode 100644 index 00000000..28e7453e --- /dev/null +++ b/tests/lj_1.in @@ -0,0 +1,22 @@ +run_type gtest +ref_energy -0.0053421148 +gtest_tol 5.0e-6 +coord atoms +terms qq lj +special_terms qq lj +fraglib_path ../fraglib +print 0 + +fragment tip3p_mm_l +A01O -1.815220 2.663988 0.000000 +A02H -1.616905 1.722730 0.001942 +A03H -2.465495 2.770431 -0.695494 + +fragment tip3p_mm_l +A01O -1.815220 5.663988 0.000000 +A02H -1.616905 4.722730 0.001942 +A03H -2.465495 5.770431 -0.695494 + + + + diff --git a/tests/opt_1.in b/tests/opt_1.in index 1e42049d..df55c7da 100644 --- a/tests/opt_1.in +++ b/tests/opt_1.in @@ -1,7 +1,7 @@ # water tetramer run_type opt -max_steps 10 +max_steps 100 coord points fraglib_path ../fraglib diff --git a/tests/opt_2.in b/tests/opt_2.in new file mode 100644 index 00000000..9f2044f4 --- /dev/null +++ b/tests/opt_2.in @@ -0,0 +1,17 @@ +# this job crashes due to a polarization collapse +# geometry optimizer does a weird step when searching for a direction... + +run_type opt +coord xyzabc +fraglib_path ../fraglib +enable_torch false +max_steps 200 +print 1 + +fragment h2o_l + 0.000 0.000 0.000 0.000 0.000 0.000 +fragment h2o_l + 5.000 0.000 0.000 2.000 0.000 2.000 +fragment nh3_l + 0.000 5.000 0.000 5.000 0.000 -3.000 + diff --git a/tests/opt_3.in b/tests/opt_3.in new file mode 100644 index 00000000..57d147d8 --- /dev/null +++ b/tests/opt_3.in @@ -0,0 +1,24 @@ +# the starting geometry is the last "normal" geometry from opt_2 optimization +# this job converges normally + +run_type opt +coord atoms +fraglib_path ../fraglib +enable_torch false +max_steps 200 +print 1 + +fragment h2o_l +A01O1 0.601572 0.104050 0.096435 +A02H2 -0.317017 0.239412 -0.050350 +A03H3 0.803251 -0.745809 -0.251042 +fragment h2o_l +A01O1 4.188583 0.118985 -0.018670 +A02H2 4.919659 0.709567 -0.039049 +A03H3 3.416304 0.650481 -0.087761 +fragment nh3_l +A01N1 0.235191 4.772273 -0.103166 +A02H2 -0.523189 4.322511 0.366654 +A03H3 0.517310 5.557741 0.446020 +A04H4 0.999952 4.130518 -0.141193 + diff --git a/tests/run.sh b/tests/run.sh index 8e1bb927..3f9e08d9 100755 --- a/tests/run.sh +++ b/tests/run.sh @@ -19,7 +19,7 @@ print_failure() for TEST in *.in; do TEST=`basename ${TEST} .in` - ${EFPMD} ${TEST}.in > ${TEST}.out + ../bin/efpmd ${TEST}.in > ${TEST}.out if grep -q "${OUTPUT_COMPLETED}" ${TEST}.out; then if grep -q "${OUTPUT_MATCH}" ${TEST}.out; then diff --git a/tests/spec_frag_0.in b/tests/spec_frag_0.in new file mode 100644 index 00000000..9ad9244e --- /dev/null +++ b/tests/spec_frag_0.in @@ -0,0 +1,12 @@ +run_type sp +coord xyzabc +terms elec pol disp xr +disp_damp off +fraglib_path ../fraglib + +fragment h2o_l + 0.000 0.000 0.000 0.000 0.000 0.000 +fragment h2o_l + 5.000 0.000 0.000 2.000 0.000 2.000 +fragment nh3_l + 0.000 5.000 0.000 5.000 0.000 -3.000 diff --git a/tests/spec_frag_1.in b/tests/spec_frag_1.in new file mode 100644 index 00000000..c8917f9f --- /dev/null +++ b/tests/spec_frag_1.in @@ -0,0 +1,14 @@ +run_type sp +coord xyzabc +terms elec pol disp xr +disp_damp off +fraglib_path ../fraglib +special_fragment 0 +special_terms elec pol + +fragment h2o_l + 0.000 0.000 0.000 0.000 0.000 0.000 +fragment h2o_l + 5.000 0.000 0.000 2.000 0.000 2.000 +fragment nh3_l + 0.000 5.000 0.000 5.000 0.000 -3.000 diff --git a/tests/spec_frag_2.in b/tests/spec_frag_2.in new file mode 100644 index 00000000..2e0dd0fe --- /dev/null +++ b/tests/spec_frag_2.in @@ -0,0 +1,14 @@ +run_type sp +coord xyzabc +terms elec pol disp xr +disp_damp off +fraglib_path ../fraglib +special_fragment 0 +special_terms disp xr + +fragment h2o_l + 0.000 0.000 0.000 0.000 0.000 0.000 +fragment h2o_l + 5.000 0.000 0.000 2.000 0.000 2.000 +fragment nh3_l + 0.000 5.000 0.000 5.000 0.000 -3.000 diff --git a/tests/spec_frag_base.in b/tests/spec_frag_base.in new file mode 100644 index 00000000..03db67fb --- /dev/null +++ b/tests/spec_frag_base.in @@ -0,0 +1,14 @@ +run_type sp +coord xyzabc +terms elec pol disp xr +disp_damp off +fraglib_path ../fraglib +special_fragment 0 +special_terms elec pol disp xr + +fragment h2o_l + 0.000 0.000 0.000 0.000 0.000 0.000 +fragment h2o_l + 5.000 0.000 0.000 2.000 0.000 2.000 +fragment nh3_l + 0.000 5.000 0.000 5.000 0.000 -3.000 diff --git a/tests/spec_frag_ref.in b/tests/spec_frag_ref.in new file mode 100644 index 00000000..ee1f41e0 --- /dev/null +++ b/tests/spec_frag_ref.in @@ -0,0 +1,14 @@ +run_type sp +coord xyzabc +terms elec pol disp xr +disp_damp overlap +fraglib_path ../fraglib +enable_pairwise true +ligand 0 + +fragment h2o_l + 0.000 0.000 0.000 0.000 0.000 0.000 +fragment h2o_l + 5.000 0.000 0.000 2.000 0.000 2.000 +fragment nh3_l + 0.000 5.000 0.000 5.000 0.000 -3.000 diff --git a/tests/torch_efp_1.in b/tests/torch_efp_1.in new file mode 100644 index 00000000..d2e49e57 --- /dev/null +++ b/tests/torch_efp_1.in @@ -0,0 +1,38 @@ +# TOTAL ENERGY -115.6773809671 +# OPTIMIZATION CONVERGED IN 44 STEPS + +run_type opt +coord atoms +terms elec pol disp xr +elec_damp overlap +disp_damp tt +pol_damp tt +fraglib_path ../fraglib +special_fragment 0 +enable_torch true +torch_nn ani1.pt +opt_special_frag 0 +atom_gradient frag +max_steps 50 +opt_tol 5.0e-4 +print 0 + + +fragment ch3oh_l +A01C1 -0.71711940 0.01344585 -0.00000058 +A02O2 0.67863452 -0.06304260 -0.00000071 +A03H3 -1.09413433 0.52039587 0.88322717 +A04H4 -1.09499323 -0.99859297 -0.00004768 +A05H5 -1.09415579 0.52048981 -0.88316298 +A06H6 1.05148208 0.79814142 0.1 +fragment h2o_l +A01O1 3.394000 -0.900000 -0.700000 +A02H2 3.517419 -0.130057 -0.174996 +A03H3 3.580284 -1.281411 -0.424198 +fragment h2o_l +A01O1 4.394000 -3.900000 -0.700000 +A02H2 4.517419 -3.130057 -0.174996 +A03H3 3.580284 -4.281411 -0.424198 + + + diff --git a/tests/torch_efp_2.in b/tests/torch_efp_2.in new file mode 100644 index 00000000..019e08d7 --- /dev/null +++ b/tests/torch_efp_2.in @@ -0,0 +1,65 @@ +# TOTAL ENERGY -56.5371197028 +# OPTIMIZATION CONVERGED IN 124 STEPS + + +run_type opt +coord atoms +elec_damp screen +disp_damp tt +pol_damp tt +fraglib_path ../fraglib +special_fragment 2 +enable_torch true +torch_nn ani2.pt +opt_special_frag 0 +atom_gradient frag +max_steps 200 +opt_tol 5.0e-4 + + +fragment h2o_l +A01O1 -3.394000 -1.900000 -3.700000 +A02H2 -3.517419 -1.130057 -3.174996 +A03H3 -2.580284 -2.281411 -3.424198 +fragment nh3_l +A01N1 -5.515000 1.083000 0.968000 +A02H2 -5.171084 0.157148 0.817415 +A03H3 -4.838165 1.726200 0.612549 +A04H4 -6.354118 1.191679 0.436750 +fragment nh3_l +A01N1 1.848000 0.114000 0.130000 +A02H2 1.962492 0.657352 -0.700552 +A03H3 0.930650 0.284298 0.487246 +A04H4 1.908198 -0.851198 -0.120847 +fragment nh3_l +A01N1 -1.111000 -0.084000 -4.017000 +A02H2 -1.917299 0.471666 -3.818825 +A03H3 -0.331561 0.530751 -4.129749 +A04H4 -0.933938 -0.666145 -3.224591 +fragment ch3oh_l +A01C1 -2.056000 0.767000 -0.301000 +A02O2 -2.979940 -0.252959 -0.545947 +A03H3 -1.192965 0.406624 0.250842 +A04H4 -2.554557 1.516350 0.296433 +A05H5 -1.714730 1.232706 -1.220716 +A06H6 -2.587630 -0.929369 -1.064807 +fragment h2o_l +A01O1 -0.126000 -2.228000 -0.815000 +A02H2 0.288547 -2.463797 -0.004923 +A03H3 0.070751 -1.320158 -0.959173 +fragment h2o_l +A01O1 -1.850000 1.697000 3.172000 +A02H2 -1.090083 1.597261 2.627709 +A03H3 -2.594572 1.639020 2.601101 +fragment ch3oh_l +A01C1 1.275000 -2.447000 -4.673000 +A02O2 0.721395 -3.174708 -3.615672 +A03H3 2.206088 -1.965869 -4.388715 +A04H4 0.563481 -1.680500 -4.943610 +A05H5 1.454294 -3.071336 -5.543221 +A06H6 1.308836 -3.855273 -3.346606 +fragment h2o_l +A01O1 -5.773000 -1.738000 -0.926000 +A02H2 -5.053659 -1.949235 -1.493100 +A03H3 -5.438927 -1.776829 -0.048183 + diff --git a/tests/torch_efp_3.in b/tests/torch_efp_3.in new file mode 100644 index 00000000..6615ccd5 --- /dev/null +++ b/tests/torch_efp_3.in @@ -0,0 +1,41 @@ +# TOTAL ENERGY -115.6944688266 +# L-BFGS-B is unable to make an optimization step +# OPTIMIZATION HAS NOT CONVERGED + + + +run_type opt +coord atoms +terms elec pol disp xr +elec_damp overlap +disp_damp tt +pol_damp tt +fraglib_path ../fraglib +special_fragment 0 +enable_torch true +torch_nn ani1.pt +opt_special_frag 1 +atom_gradient frag +max_steps 100 +opt_tol 5.0e-4 +print 0 + + +fragment ch3oh_l +A01C1 -0.71711940 0.01344585 -0.00000058 +A02O2 0.67863452 -0.06304260 -0.00000071 +A03H3 -1.09413433 0.52039587 0.88322717 +A04H4 -1.09499323 -0.99859297 -0.00004768 +A05H5 -1.09415579 0.52048981 -0.88316298 +A06H6 1.05148208 0.79814142 0.1 +fragment h2o_l +A01O1 3.394000 -0.900000 -0.700000 +A02H2 3.517419 -0.130057 -0.174996 +A03H3 3.580284 -1.281411 -0.424198 +fragment h2o_l +A01O1 4.394000 -3.900000 -0.700000 +A02H2 4.517419 -3.130057 -0.174996 +A03H3 3.580284 -4.281411 -0.424198 + + + diff --git a/tests/torch_efp_4.in b/tests/torch_efp_4.in new file mode 100644 index 00000000..5fe920f6 --- /dev/null +++ b/tests/torch_efp_4.in @@ -0,0 +1,40 @@ +# TOTAL ENERGY -115.6886056095 +# OPTIMIZATION CONVERGED IN 38 STEPS + + + +run_type opt +coord atoms +terms elec pol disp xr +elec_damp overlap +disp_damp tt +pol_damp tt +fraglib_path ../fraglib +special_fragment 0 +enable_torch true +enable_elpot true +opt_special_frag 0 +atom_gradient frag +max_steps 50 +opt_tol 5.0e-4 +print 0 + + +fragment ch3oh_l +A01C1 -0.71711940 0.01344585 -0.00000058 +A02O2 0.67863452 -0.06304260 -0.00000071 +A03H3 -1.09413433 0.52039587 0.88322717 +A04H4 -1.09499323 -0.99859297 -0.00004768 +A05H5 -1.09415579 0.52048981 -0.88316298 +A06H6 1.05148208 0.79814142 0.1 +fragment h2o_l +A01O1 3.394000 -0.900000 -0.700000 +A02H2 3.517419 -0.130057 -0.174996 +A03H3 3.580284 -1.281411 -0.424198 +fragment h2o_l +A01O1 4.394000 -3.900000 -0.700000 +A02H2 4.517419 -3.130057 -0.174996 +A03H3 3.580284 -4.281411 -0.424198 + + + diff --git a/tests/torch_efp_5.in b/tests/torch_efp_5.in new file mode 100644 index 00000000..669b0a07 --- /dev/null +++ b/tests/torch_efp_5.in @@ -0,0 +1,40 @@ +# TOTAL ENERGY -115.6884424223 +# L-BFGS-B is unable to make an optimization step +# OPTIMIZATION HAS NOT CONVERGED + + +run_type opt +coord atoms +terms elec pol disp xr +elec_damp overlap +disp_damp tt +pol_damp tt +fraglib_path ../fraglib +special_fragment 0 +enable_torch true +enable_elpot true +opt_special_frag 1 +atom_gradient frag +max_steps 50 +opt_tol 5.0e-4 +print 0 + + +fragment ch3oh_l +A01C1 -0.71711940 0.01344585 -0.00000058 +A02O2 0.67863452 -0.06304260 -0.00000071 +A03H3 -1.09413433 0.52039587 0.88322717 +A04H4 -1.09499323 -0.99859297 -0.00004768 +A05H5 -1.09415579 0.52048981 -0.88316298 +A06H6 1.05148208 0.79814142 0.1 +fragment h2o_l +A01O1 3.394000 -0.900000 -0.700000 +A02H2 3.517419 -0.130057 -0.174996 +A03H3 3.580284 -1.281411 -0.424198 +fragment h2o_l +A01O1 4.394000 -3.900000 -0.700000 +A02H2 4.517419 -3.130057 -0.174996 +A03H3 3.580284 -4.281411 -0.424198 + + + diff --git a/tests/torch_gas_gtest.in b/tests/torch_gas_gtest.in new file mode 100644 index 00000000..835c32de --- /dev/null +++ b/tests/torch_gas_gtest.in @@ -0,0 +1,24 @@ +# single fragment job is effectively a pure ML calculation of water molecule + +run_type gtest +ref_energy -76.3884295676 +gtest_tol 5.0e-6 +num_step_dist 0.001 +coord atoms +terms qq lj +special_terms qq lj +elec_damp off +disp_damp off +fraglib_path ../fraglib +special_fragment 0 +enable_torch true +torch_nn ani1.pt +opt_special_frag 0 +atom_gradient mm +print 0 + +fragment tip3p_mm_l +A01O -1.815220 2.663988 0.000000 +A02H -1.616905 1.722730 0.001942 +A03H -2.465495 2.770431 -0.695494 + diff --git a/tests/torch_gas_opt.in b/tests/torch_gas_opt.in new file mode 100644 index 00000000..8045c4d2 --- /dev/null +++ b/tests/torch_gas_opt.in @@ -0,0 +1,19 @@ +# single fragment job is effectively a pure ML calculation of water molecule + +run_type opt +coord atoms +terms qq lj +special_terms qq lj +fraglib_path ../fraglib +special_fragment 0 +enable_torch true +torch_nn ani1.pt +opt_special_frag 0 +atom_gradient mm +print 0 + +fragment tip3p_mm_l +A01O -1.815220 2.663988 0.000000 +A02H -1.616905 1.722730 0.001942 +A03H -2.465495 2.770431 -0.695494 + diff --git a/tests/torch_mm_gtest_1.in b/tests/torch_mm_gtest_1.in new file mode 100644 index 00000000..ef58675d --- /dev/null +++ b/tests/torch_mm_gtest_1.in @@ -0,0 +1,26 @@ +run_type gtest +ref_energy -76.3937716824 +gtest_tol 5.0e-6 +coord atoms +terms qq lj +fraglib_path ../fraglib +special_fragment 0 +enable_torch true +torch_nn ani1.pt +opt_special_frag 0 +atom_gradient mm +print 1 + +fragment tip3p_mm_l +A01O -1.815220 2.663988 0.000000 +A02H -1.616905 1.722730 0.001942 +A03H -2.465495 2.770431 -0.695494 + +fragment tip3p_mm_l +A01O -1.815220 5.663988 0.000000 +A02H -1.616905 4.722730 0.001942 +A03H -2.465495 5.770431 -0.695494 + + + + diff --git a/tests/torch_mm_gtest_2.in b/tests/torch_mm_gtest_2.in new file mode 100644 index 00000000..dcf160ef --- /dev/null +++ b/tests/torch_mm_gtest_2.in @@ -0,0 +1,28 @@ +# this test fails; gradients are not exact + +run_type gtest +ref_energy -76.3761028857 +gtest_tol 5.0e-6 +coord atoms +terms qq lj +special_terms qq lj +fraglib_path ../fraglib +special_fragment 0 +enable_torch true +enable_elpot true +atom_gradient mm +print 0 + +fragment tip3p_mm_l +A01O -1.815220 2.663988 0.000000 +A02H -1.616905 1.722730 0.001942 +A03H -2.465495 2.770431 -0.695494 + +fragment tip3p_mm_l +A01O -1.815220 5.663988 0.000000 +A02H -1.616905 4.722730 0.001942 +A03H -2.465495 5.770431 -0.695494 + + + + diff --git a/tests/torch_mm_gtest_3.in b/tests/torch_mm_gtest_3.in new file mode 100644 index 00000000..5eee986a --- /dev/null +++ b/tests/torch_mm_gtest_3.in @@ -0,0 +1,29 @@ +# this tests fails: gradaients are not exact with atom_gradient=frag + +run_type gtest +ref_energy -76.3937716824 +gtest_tol 5.0e-6 +coord atoms +terms qq lj +special_terms qq lj +fraglib_path ../fraglib +special_fragment 0 +enable_torch true +torch_nn ani1.pt +opt_special_frag 0 +atom_gradient frag +print 0 + +fragment tip3p_mm_l +A01O -1.815220 2.663988 0.000000 +A02H -1.616905 1.722730 0.001942 +A03H -2.465495 2.770431 -0.695494 + +fragment tip3p_mm_l +A01O -1.815220 5.663988 0.000000 +A02H -1.616905 4.722730 0.001942 +A03H -2.465495 5.770431 -0.695494 + + + + diff --git a/tests/torch_mm_opt_1.in b/tests/torch_mm_opt_1.in new file mode 100644 index 00000000..a4009f4c --- /dev/null +++ b/tests/torch_mm_opt_1.in @@ -0,0 +1,29 @@ +run_type opt +coord atoms +terms qq lj +special_terms qq lj +elec_damp off +disp_damp off +fraglib_path ../fraglib +special_fragment 1 +enable_torch true +torch_nn ani1.pt +opt_special_frag 0 +opt_tol 5.0e-4 +atom_gradient mm +max_steps 200 +print 0 + + +fragment tip3p_mm_l +A01O -1.815220 2.663988 -0.0 +A02H -1.617480 1.725461 0.001936 +A03H -2.476026 2.736906 -0.714908 + +fragment tip3p_mm_l +A01O -1.815220 5.663988 -0.0 +A02H -1.617480 4.725461 0.001936 +A03H -2.476026 5.736906 -0.714908 + + + diff --git a/tests/torch_mm_opt_2.in b/tests/torch_mm_opt_2.in new file mode 100644 index 00000000..e47cc56f --- /dev/null +++ b/tests/torch_mm_opt_2.in @@ -0,0 +1,29 @@ +run_type opt +coord atoms +terms qq lj +special_terms qq lj +elec_damp off +disp_damp off +fraglib_path ../fraglib +special_fragment 0 +enable_torch true +torch_nn ani2.pt +opt_special_frag 1 +atom_gradient frag +max_steps 200 +opt_tol 5.0e-4 +print 0 + + +fragment tip3p_mm_l +A01O -1.815220 2.863988 -0.3 +A02H -1.617480 1.725461 0.001936 +A03H -2.476026 2.736906 -0.714908 + +fragment tip3p_mm_l +A01O -1.815220 5.663988 -0.0 +A02H -1.617480 4.725461 0.001936 +A03H -2.476026 5.736906 -0.714908 + + + diff --git a/tests/torch_mm_opt_3.in b/tests/torch_mm_opt_3.in new file mode 100644 index 00000000..5e1851dd --- /dev/null +++ b/tests/torch_mm_opt_3.in @@ -0,0 +1,27 @@ +run_type opt +coord atoms +terms qq lj +special_terms qq lj +fraglib_path ../fraglib +special_fragment 0 +enable_torch true +enable_elpot true +opt_special_frag 1 +atom_gradient mm +max_steps 100 +opt_tol 5.0e-4 +print 0 + + +fragment tip3p_mm_l +A01O -1.815220 2.863988 -0.3 +A02H -1.617480 1.725461 0.001936 +A03H -2.476026 2.736906 -0.714908 + +fragment tip3p_mm_l +A01O -1.815220 5.663988 -0.0 +A02H -1.617480 4.725461 0.001936 +A03H -2.476026 5.736906 -0.714908 + + + diff --git a/tests/torch_mm_opt_4.in b/tests/torch_mm_opt_4.in new file mode 100644 index 00000000..1a31a622 --- /dev/null +++ b/tests/torch_mm_opt_4.in @@ -0,0 +1,27 @@ +run_type opt +coord atoms +terms qq lj +special_terms qq lj +fraglib_path ../fraglib +special_fragment 0 +enable_torch true +enable_elpot true +opt_special_frag 0 +atom_gradient mm +max_steps 200 +opt_tol 5.0e-4 +print 1 + + +fragment tip3p_mm_l +A01O -1.815220 2.863988 -0.3 +A02H -1.617480 1.725461 0.001936 +A03H -2.476026 2.736906 -0.714908 + +fragment tip3p_mm_l +A01O -1.815220 5.663988 -0.0 +A02H -1.617480 4.725461 0.001936 +A03H -2.476026 5.736906 -0.714908 + + + diff --git a/tools/opt2xyz.py b/tools/opt2xyz.py new file mode 100644 index 00000000..5b0439ec --- /dev/null +++ b/tools/opt2xyz.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Created on Thu Jan 2 11:52:04 2025 + +@author: lyuda + +Usage: python out2xyz.py libefp_output_file_name +Output libefp_output_file_name.xyz +""" + +import sys + +# total arguments +if len(sys.argv) != 2: + sys.exit("Please provide libefp output file name!") + + +output = sys.argv[1] +xyz = output + ".xyz" +with open (output,'r') as f, open (xyz, 'w') as geom: + print(f"Will work with {output} file") + while True: + line=f.readline() + if not line: break + if "GEOMETRY (ANGSTROMS)" in line: # start reading geometry + f.readline() # skip one line + tmp = [] + natoms = 0 + while True: + l = f.readline() + l = l.strip() # Remove leading/trailing whitespace; stop reading when empty line is found + if not l: break + sline = l.rsplit() + if len(sline) != 4: + print(f"read {l} and got confused, exit") + break + atom_name = sline[0][3:] + tmp.append([str(atom_name),float(sline[1]),float(sline[2]),float(sline[3])]) + natoms += 1 + # saving new geometrry into xyz file + print(f"{natoms}", file=geom) + print("", file=geom) + for t in tmp: + print(f"{t[0]} {t[1]:16.8f} {t[2]:16.8f} {t[3]:16.8f}", file=geom) + + + + + + + + \ No newline at end of file